diff --git a/packages/placeholder-pdfkit/dist/index.d.ts b/packages/placeholder-pdfkit/dist/index.d.ts index a831c9e6..5b1d7a4f 100644 --- a/packages/placeholder-pdfkit/dist/index.d.ts +++ b/packages/placeholder-pdfkit/dist/index.d.ts @@ -1,3 +1,3 @@ export * from "./pdfkitAddPlaceholder"; -export { default as PDFObject } from "./pdfkit/pdfobject"; +export { PDFObject } from "@signpdf/utils"; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/placeholder-pdfkit/dist/index.js b/packages/placeholder-pdfkit/dist/index.js index 9913d9a0..72c1c498 100644 --- a/packages/placeholder-pdfkit/dist/index.js +++ b/packages/placeholder-pdfkit/dist/index.js @@ -9,7 +9,7 @@ var _exportNames = { Object.defineProperty(exports, "PDFObject", { enumerable: true, get: function () { - return _pdfobject.default; + return _utils.PDFObject; } }); var _pdfkitAddPlaceholder = require("./pdfkitAddPlaceholder"); @@ -24,5 +24,4 @@ Object.keys(_pdfkitAddPlaceholder).forEach(function (key) { } }); }); -var _pdfobject = _interopRequireDefault(require("./pdfkit/pdfobject")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file +var _utils = require("@signpdf/utils"); \ No newline at end of file diff --git a/packages/placeholder-pdfkit/dist/pdfkit/pdfobject.js b/packages/placeholder-pdfkit/dist/pdfkit/pdfobject.js index dc70f68d..3317c7dd 100644 --- a/packages/placeholder-pdfkit/dist/pdfkit/pdfobject.js +++ b/packages/placeholder-pdfkit/dist/pdfkit/pdfobject.js @@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; var _abstract_reference = _interopRequireDefault(require("./abstract_reference")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /* PDFObject by Devon Govett used below. The class is part of pdfkit. See https://github.com/foliojs/pdfkit diff --git a/packages/placeholder-pdfkit/src/index.js b/packages/placeholder-pdfkit/src/index.js index d1902932..c9fff69e 100644 --- a/packages/placeholder-pdfkit/src/index.js +++ b/packages/placeholder-pdfkit/src/index.js @@ -1,2 +1,2 @@ export * from './pdfkitAddPlaceholder'; -export {default as PDFObject} from './pdfkit/pdfobject'; +export {PDFObject} from '@signpdf/utils'; diff --git a/packages/placeholder-pdfkit010/dist/index.d.ts b/packages/placeholder-pdfkit010/dist/index.d.ts index 09d16c83..3077a301 100644 --- a/packages/placeholder-pdfkit010/dist/index.d.ts +++ b/packages/placeholder-pdfkit010/dist/index.d.ts @@ -1,4 +1,3 @@ export * from "./pdfkitAddPlaceholder"; -export * from "./pdfkitReferenceMock"; -export { default as PDFObject } from "./pdfkit/pdfobject"; +export { PDFKitReferenceMock, PDFObject } from "@signpdf/utils"; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/placeholder-pdfkit010/dist/index.js b/packages/placeholder-pdfkit010/dist/index.js index d10b5dc5..985acc34 100644 --- a/packages/placeholder-pdfkit010/dist/index.js +++ b/packages/placeholder-pdfkit010/dist/index.js @@ -4,12 +4,19 @@ Object.defineProperty(exports, "__esModule", { value: true }); var _exportNames = { + PDFKitReferenceMock: true, PDFObject: true }; +Object.defineProperty(exports, "PDFKitReferenceMock", { + enumerable: true, + get: function () { + return _utils.PDFKitReferenceMock; + } +}); Object.defineProperty(exports, "PDFObject", { enumerable: true, get: function () { - return _pdfobject.default; + return _utils.PDFObject; } }); var _pdfkitAddPlaceholder = require("./pdfkitAddPlaceholder"); @@ -24,17 +31,4 @@ Object.keys(_pdfkitAddPlaceholder).forEach(function (key) { } }); }); -var _pdfkitReferenceMock = require("./pdfkitReferenceMock"); -Object.keys(_pdfkitReferenceMock).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; - if (key in exports && exports[key] === _pdfkitReferenceMock[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _pdfkitReferenceMock[key]; - } - }); -}); -var _pdfobject = _interopRequireDefault(require("./pdfkit/pdfobject")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file +var _utils = require("@signpdf/utils"); \ No newline at end of file diff --git a/packages/placeholder-pdfkit010/dist/pdfkit/pdfobject.js b/packages/placeholder-pdfkit010/dist/pdfkit/pdfobject.js index dc70f68d..3317c7dd 100644 --- a/packages/placeholder-pdfkit010/dist/pdfkit/pdfobject.js +++ b/packages/placeholder-pdfkit010/dist/pdfkit/pdfobject.js @@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; var _abstract_reference = _interopRequireDefault(require("./abstract_reference")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /* PDFObject by Devon Govett used below. The class is part of pdfkit. See https://github.com/foliojs/pdfkit diff --git a/packages/placeholder-pdfkit010/dist/pdfkitAddPlaceholder.d.ts.map b/packages/placeholder-pdfkit010/dist/pdfkitAddPlaceholder.d.ts.map index 9c7b958a..87427a53 100644 --- a/packages/placeholder-pdfkit010/dist/pdfkitAddPlaceholder.d.ts.map +++ b/packages/placeholder-pdfkit010/dist/pdfkitAddPlaceholder.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"pdfkitAddPlaceholder.d.ts","sourceRoot":"","sources":["../src/pdfkitAddPlaceholder.js"],"names":[],"mappings":"AAwCO,mLAHI,SAAS,GACP,UAAU,CA4HtB;;;;;SAtJY,MAAM;eACN,MAAM;YACN,MAAM;iBACN,MAAM;UACN,MAAM;cACN,MAAM;kBACN,IAAI;sBACJ,MAAM;2BACN,MAAM;;;;gBACN,MAAM;;;;iBACN,MAAM,EAAE;;;;cACR,MAAM;;;eAKN,GAAG;UACH,GAAG;YACH,GAAG"} \ No newline at end of file +{"version":3,"file":"pdfkitAddPlaceholder.d.ts","sourceRoot":"","sources":["../src/pdfkitAddPlaceholder.js"],"names":[],"mappings":"AAuCO,mLAHI,SAAS,GACP,UAAU,CA4HtB;;;;;SAtJY,MAAM;eACN,MAAM;YACN,MAAM;iBACN,MAAM;UACN,MAAM;cACN,MAAM;kBACN,IAAI;sBACJ,MAAM;2BACN,MAAM;;;;gBACN,MAAM;;;;iBACN,MAAM,EAAE;;;;cACR,MAAM;;;eAKN,GAAG;UACH,GAAG;YACH,GAAG"} \ No newline at end of file diff --git a/packages/placeholder-pdfkit010/dist/pdfkitAddPlaceholder.js b/packages/placeholder-pdfkit010/dist/pdfkitAddPlaceholder.js index 0aa60cf7..dd843524 100644 --- a/packages/placeholder-pdfkit010/dist/pdfkitAddPlaceholder.js +++ b/packages/placeholder-pdfkit010/dist/pdfkitAddPlaceholder.js @@ -5,9 +5,6 @@ Object.defineProperty(exports, "__esModule", { }); exports.pdfkitAddPlaceholder = void 0; var _utils = require("@signpdf/utils"); -var _pdfkitReferenceMock = require("./pdfkitReferenceMock"); -// eslint-disable-next-line import/no-unresolved - /** * @typedef {object} InputType * @property {object} pdf PDFDocument @@ -113,7 +110,7 @@ const pdfkitAddPlaceholder = ({ const acroForm = pdfSlice.slice(0, pdfSlice.indexOf('endobj')).toString(); acroFormId = parseInt(pdf._root.data.AcroForm.toString()); const acroFormFields = acroForm.slice(acroForm.indexOf('/Fields [') + 9, acroForm.indexOf(']')); - fieldIds = acroFormFields.split(' ').filter(Boolean).filter((element, i) => i % 3 === 0).map(fieldId => new _pdfkitReferenceMock.PDFKitReferenceMock(fieldId)); + fieldIds = acroFormFields.split(' ').filter(Boolean).filter((element, i) => i % 3 === 0).map(fieldId => new _utils.PDFKitReferenceMock(fieldId)); } const signatureName = 'Signature'; diff --git a/packages/placeholder-pdfkit010/dist/pdfkitReferenceMock.js b/packages/placeholder-pdfkit010/dist/pdfkitReferenceMock.js index 925f3b29..2986ee79 100644 --- a/packages/placeholder-pdfkit010/dist/pdfkitReferenceMock.js +++ b/packages/placeholder-pdfkit010/dist/pdfkitReferenceMock.js @@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.PDFKitReferenceMock = void 0; var _abstract_reference = _interopRequireDefault(require("./pdfkit/abstract_reference")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } class PDFKitReferenceMock extends _abstract_reference.default { constructor(index, additionalData = undefined) { super(); diff --git a/packages/placeholder-pdfkit010/src/index.js b/packages/placeholder-pdfkit010/src/index.js index 96cecb43..7d14c2f8 100644 --- a/packages/placeholder-pdfkit010/src/index.js +++ b/packages/placeholder-pdfkit010/src/index.js @@ -1,3 +1,2 @@ export * from './pdfkitAddPlaceholder'; -export * from './pdfkitReferenceMock'; -export {default as PDFObject} from './pdfkit/pdfobject'; +export {PDFKitReferenceMock, PDFObject} from '@signpdf/utils'; diff --git a/packages/placeholder-pdfkit010/src/pdfkitAddPlaceholder.js b/packages/placeholder-pdfkit010/src/pdfkitAddPlaceholder.js index 6000c317..cc2074cc 100644 --- a/packages/placeholder-pdfkit010/src/pdfkitAddPlaceholder.js +++ b/packages/placeholder-pdfkit010/src/pdfkitAddPlaceholder.js @@ -4,9 +4,8 @@ import { SIG_FLAGS, SUBFILTER_ADOBE_PKCS7_DETACHED, ANNOTATION_FLAGS, + PDFKitReferenceMock, } from '@signpdf/utils'; -// eslint-disable-next-line import/no-unresolved -import {PDFKitReferenceMock} from './pdfkitReferenceMock'; /** * @typedef {object} InputType diff --git a/packages/placeholder-plain/dist/createBufferPageWithAnnotation.js b/packages/placeholder-plain/dist/createBufferPageWithAnnotation.js index 68283189..72fda1fe 100644 --- a/packages/placeholder-plain/dist/createBufferPageWithAnnotation.js +++ b/packages/placeholder-plain/dist/createBufferPageWithAnnotation.js @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { exports.default = void 0; var _findObject = _interopRequireDefault(require("./findObject")); var _getIndexFromRef = _interopRequireDefault(require("./getIndexFromRef")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const createBufferPageWithAnnotation = (pdf, info, pagesRef, widget) => { const pagesDictionary = (0, _findObject.default)(pdf, info.xref, pagesRef).toString(); diff --git a/packages/placeholder-plain/dist/createBufferRootWithAcroform.js b/packages/placeholder-plain/dist/createBufferRootWithAcroform.js index bdb180e0..20339fb8 100644 --- a/packages/placeholder-plain/dist/createBufferRootWithAcroform.js +++ b/packages/placeholder-plain/dist/createBufferRootWithAcroform.js @@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; var _getIndexFromRef = _interopRequireDefault(require("./getIndexFromRef")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const createBufferRootWithAcroform = (pdf, info, form) => { const rootIndex = (0, _getIndexFromRef.default)(info.xref, info.rootRef); return Buffer.concat([Buffer.from(`${rootIndex} 0 obj\n`), Buffer.from('<<\n'), Buffer.from(`${info.root}\n`), Buffer.from(`/AcroForm ${form}`), Buffer.from('\n>>\nendobj\n')]); diff --git a/packages/placeholder-plain/dist/findObject.js b/packages/placeholder-plain/dist/findObject.js index 0ec858d1..b5da512b 100644 --- a/packages/placeholder-plain/dist/findObject.js +++ b/packages/placeholder-plain/dist/findObject.js @@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; var _getIndexFromRef = _interopRequireDefault(require("./getIndexFromRef")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /** * @param {Buffer} pdf * @param {Map} refTable diff --git a/packages/placeholder-plain/dist/getPageRef.js b/packages/placeholder-plain/dist/getPageRef.js index 3402e976..74644487 100644 --- a/packages/placeholder-plain/dist/getPageRef.js +++ b/packages/placeholder-plain/dist/getPageRef.js @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { exports.default = getPageRef; var _getPagesDictionaryRef = _interopRequireDefault(require("./getPagesDictionaryRef")); var _findObject = _interopRequireDefault(require("./findObject")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /** * Finds the reference to a page. * diff --git a/packages/placeholder-plain/dist/plainAddPlaceholder.js b/packages/placeholder-plain/dist/plainAddPlaceholder.js index 4a7e13f8..d777796f 100644 --- a/packages/placeholder-plain/dist/plainAddPlaceholder.js +++ b/packages/placeholder-plain/dist/plainAddPlaceholder.js @@ -12,7 +12,7 @@ var _getPageRef = _interopRequireDefault(require("./getPageRef")); var _createBufferRootWithAcroform = _interopRequireDefault(require("./createBufferRootWithAcroform")); var _createBufferPageWithAnnotation = _interopRequireDefault(require("./createBufferPageWithAnnotation")); var _createBufferTrailer = _interopRequireDefault(require("./createBufferTrailer")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /* eslint-disable no-underscore-dangle */ /** @@ -77,11 +77,11 @@ const plainAddPlaceholder = ({ const index = knownIndex != null ? knownIndex : info.xref.maxIndex; addedReferences.set(index, pdf.length + 1); // + 1 new line - pdf = Buffer.concat([pdf, Buffer.from('\n'), Buffer.from(`${index} 0 obj\n`), Buffer.from(_placeholderPdfkit.PDFObject.convert(input)), Buffer.from('\nendobj\n')]); - return new _placeholderPdfkit.PDFKitReferenceMock(info.xref.maxIndex); + pdf = Buffer.concat([pdf, Buffer.from('\n'), Buffer.from(`${index} 0 obj\n`), Buffer.from(_utils.PDFObject.convert(input)), Buffer.from('\nendobj\n')]); + return new _utils.PDFKitReferenceMock(info.xref.maxIndex); }, page: { - dictionary: new _placeholderPdfkit.PDFKitReferenceMock(pageIndex, { + dictionary: new _utils.PDFKitReferenceMock(pageIndex, { data: { Annots: [] } diff --git a/packages/placeholder-plain/dist/readPdf.js b/packages/placeholder-plain/dist/readPdf.js index 1ecee0b1..c5dfb863 100644 --- a/packages/placeholder-plain/dist/readPdf.js +++ b/packages/placeholder-plain/dist/readPdf.js @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { exports.getValue = exports.default = void 0; var _readRefTable = _interopRequireDefault(require("./readRefTable")); var _findObject = _interopRequireDefault(require("./findObject")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /** * @param {Buffer} trailer * @param {string} key diff --git a/packages/placeholder-plain/dist/readRefTable.js b/packages/placeholder-plain/dist/readRefTable.js index 45008476..83746d52 100644 --- a/packages/placeholder-plain/dist/readRefTable.js +++ b/packages/placeholder-plain/dist/readRefTable.js @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { exports.getXref = exports.getLastTrailerPosition = exports.getFullXrefTable = exports.default = void 0; var _utils = require("@signpdf/utils"); var _xrefToRefMap = _interopRequireDefault(require("./xrefToRefMap")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const getLastTrailerPosition = pdf => { const trailerStart = pdf.lastIndexOf(Buffer.from('trailer', 'utf8')); const trailer = pdf.slice(trailerStart, pdf.length - 6); diff --git a/packages/placeholder-plain/src/plainAddPlaceholder.js b/packages/placeholder-plain/src/plainAddPlaceholder.js index f26759b2..cc0b4382 100644 --- a/packages/placeholder-plain/src/plainAddPlaceholder.js +++ b/packages/placeholder-plain/src/plainAddPlaceholder.js @@ -1,13 +1,13 @@ /* eslint-disable no-underscore-dangle */ import { pdfkitAddPlaceholder, - PDFKitReferenceMock, - PDFObject, } from '@signpdf/placeholder-pdfkit010'; import { removeTrailingNewLine, DEFAULT_SIGNATURE_LENGTH, SUBFILTER_ADOBE_PKCS7_DETACHED, + PDFKitReferenceMock, + PDFObject, } from '@signpdf/utils'; import getIndexFromRef from './getIndexFromRef'; diff --git a/packages/signer-p12/dist/P12Signer.js b/packages/signer-p12/dist/P12Signer.js index bd1fa688..cd38ef59 100644 --- a/packages/signer-p12/dist/P12Signer.js +++ b/packages/signer-p12/dist/P12Signer.js @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { exports.P12Signer = void 0; var _nodeForge = _interopRequireDefault(require("node-forge")); var _utils = require("@signpdf/utils"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /** * @typedef {object} SignerOptions * @prop {string} [passphrase] diff --git a/packages/utils/dist/PDFAbstractReference.d.ts b/packages/utils/dist/PDFAbstractReference.d.ts new file mode 100644 index 00000000..11f6db3d --- /dev/null +++ b/packages/utils/dist/PDFAbstractReference.d.ts @@ -0,0 +1,5 @@ +export class PDFAbstractReference { + toString(): void; + end(): void; +} +//# sourceMappingURL=PDFAbstractReference.d.ts.map \ No newline at end of file diff --git a/packages/utils/dist/PDFAbstractReference.d.ts.map b/packages/utils/dist/PDFAbstractReference.d.ts.map new file mode 100644 index 00000000..ee7450ff --- /dev/null +++ b/packages/utils/dist/PDFAbstractReference.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"PDFAbstractReference.d.ts","sourceRoot":"","sources":["../src/PDFAbstractReference.js"],"names":[],"mappings":"AAWA;IACI,iBAEC;IAED,YAEC;CACJ"} \ No newline at end of file diff --git a/packages/utils/dist/PDFAbstractReference.js b/packages/utils/dist/PDFAbstractReference.js new file mode 100644 index 00000000..918d4966 --- /dev/null +++ b/packages/utils/dist/PDFAbstractReference.js @@ -0,0 +1,26 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.PDFAbstractReference = void 0; +/* +PDFAbstractReference by Devon Govett used below. +The class is part of pdfkit. See https://github.com/foliojs/pdfkit +LICENSE: MIT. Included in this folder. +Modifications may have been applied for the purposes of node-signpdf. +*/ + +/* +PDFAbstractReference - abstract class for PDF reference +*/ + +class PDFAbstractReference { + toString() { + throw new Error('Must be implemented by subclasses'); + } + end() { + // noop + } +} +exports.PDFAbstractReference = PDFAbstractReference; \ No newline at end of file diff --git a/packages/utils/dist/PDFKitReferenceMock.d.ts b/packages/utils/dist/PDFKitReferenceMock.d.ts new file mode 100644 index 00000000..724b25a3 --- /dev/null +++ b/packages/utils/dist/PDFKitReferenceMock.d.ts @@ -0,0 +1,7 @@ +export class PDFKitReferenceMock extends PDFAbstractReference { + constructor(index: any, additionalData?: any); + index: any; + toString(): string; +} +import { PDFAbstractReference } from './PDFAbstractReference'; +//# sourceMappingURL=PDFKitReferenceMock.d.ts.map \ No newline at end of file diff --git a/packages/utils/dist/PDFKitReferenceMock.d.ts.map b/packages/utils/dist/PDFKitReferenceMock.d.ts.map new file mode 100644 index 00000000..478b0edd --- /dev/null +++ b/packages/utils/dist/PDFKitReferenceMock.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"PDFKitReferenceMock.d.ts","sourceRoot":"","sources":["../src/PDFKitReferenceMock.js"],"names":[],"mappings":"AAEA;IACI,8CAMC;IAJG,WAAkB;IAMtB,mBAEC;CACJ;qCAdkC,wBAAwB"} \ No newline at end of file diff --git a/packages/utils/dist/PDFKitReferenceMock.js b/packages/utils/dist/PDFKitReferenceMock.js new file mode 100644 index 00000000..6adefca2 --- /dev/null +++ b/packages/utils/dist/PDFKitReferenceMock.js @@ -0,0 +1,20 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.PDFKitReferenceMock = void 0; +var _PDFAbstractReference = require("./PDFAbstractReference"); +class PDFKitReferenceMock extends _PDFAbstractReference.PDFAbstractReference { + constructor(index, additionalData = undefined) { + super(); + this.index = index; + if (typeof additionalData !== 'undefined') { + Object.assign(this, additionalData); + } + } + toString() { + return `${this.index} 0 R`; + } +} +exports.PDFKitReferenceMock = PDFKitReferenceMock; \ No newline at end of file diff --git a/packages/utils/dist/PDFObject.d.ts b/packages/utils/dist/PDFObject.d.ts new file mode 100644 index 00000000..4b227c25 --- /dev/null +++ b/packages/utils/dist/PDFObject.d.ts @@ -0,0 +1,5 @@ +export class PDFObject { + static convert(object: any, encryptFn?: any): any; + static number(n: any): number; +} +//# sourceMappingURL=PDFObject.d.ts.map \ No newline at end of file diff --git a/packages/utils/dist/PDFObject.d.ts.map b/packages/utils/dist/PDFObject.d.ts.map new file mode 100644 index 00000000..11c7c11a --- /dev/null +++ b/packages/utils/dist/PDFObject.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"PDFObject.d.ts","sourceRoot":"","sources":["../src/PDFObject.js"],"names":[],"mappings":"AA8BA;IACI,kDAuFC;IAED,8BAMC;CACJ"} \ No newline at end of file diff --git a/packages/utils/dist/PDFObject.js b/packages/utils/dist/PDFObject.js new file mode 100644 index 00000000..683833b3 --- /dev/null +++ b/packages/utils/dist/PDFObject.js @@ -0,0 +1,133 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.PDFObject = void 0; +var _PDFAbstractReference = require("./PDFAbstractReference"); +/* +PDFObject by Devon Govett used below. +The class is part of pdfkit. See https://github.com/foliojs/pdfkit +LICENSE: MIT. Included in this folder. +Modifications may have been applied for the purposes of node-signpdf. +*/ + +/* +PDFObject - converts JavaScript types into their corresponding PDF types. +By Devon Govett +*/ + +const pad = (str, length) => (Array(length + 1).join('0') + str).slice(-length); +const escapableRe = /[\n\r\t\b\f()\\]/g; +const escapable = { + '\n': '\\n', + '\r': '\\r', + '\t': '\\t', + '\b': '\\b', + '\f': '\\f', + '\\': '\\\\', + '(': '\\(', + ')': '\\)' +}; + +// Convert little endian UTF-16 to big endian +const swapBytes = buff => buff.swap16(); +class PDFObject { + static convert(object, encryptFn = null) { + // String literals are converted to the PDF name type + if (typeof object === 'string') { + return `/${object}`; + + // String objects are converted to PDF strings (UTF-16) + } + if (object instanceof String) { + let string = object; + // Detect if this is a unicode string + let isUnicode = false; + for (let i = 0, end = string.length; i < end; i += 1) { + if (string.charCodeAt(i) > 0x7f) { + isUnicode = true; + break; + } + } + + // If so, encode it as big endian UTF-16 + let stringBuffer; + if (isUnicode) { + stringBuffer = swapBytes(Buffer.from(`\ufeff${string}`, 'utf16le')); + } else { + stringBuffer = Buffer.from(string, 'ascii'); + } + + // Encrypt the string when necessary + if (encryptFn) { + string = encryptFn(stringBuffer).toString('binary'); + } else { + string = stringBuffer.toString('binary'); + } + + // Escape characters as required by the spec + string = string.replace(escapableRe, c => escapable[c]); + return `(${string})`; + + // Buffers are converted to PDF hex strings + } + if (Buffer.isBuffer(object)) { + return `<${object.toString('hex')}>`; + } + if (object instanceof _PDFAbstractReference.PDFAbstractReference) { + return object.toString(); + } + if (object instanceof Date) { + let string = `D:${pad(object.getUTCFullYear(), 4)}${pad(object.getUTCMonth() + 1, 2)}${pad(object.getUTCDate(), 2)}${pad(object.getUTCHours(), 2)}${pad(object.getUTCMinutes(), 2)}${pad(object.getUTCSeconds(), 2)}Z`; + + // Encrypt the string when necessary + if (encryptFn) { + string = encryptFn(Buffer.from(string, 'ascii')).toString('binary'); + + // Escape characters as required by the spec + string = string.replace(escapableRe, c => escapable[c]); + } + return `(${string})`; + } + if (Array.isArray(object)) { + const items = object.map(e => PDFObject.convert(e, encryptFn)).join(' '); + return `[${items}]`; + } + if ({}.toString.call(object) === '[object Object]') { + const out = ['<<']; + let streamData; + + // @todo this can probably be refactored into a reduce + Object.entries(object).forEach(([key, val]) => { + let checkedValue = ''; + if (val.toString().indexOf('<<') !== -1) { + checkedValue = val; + } else { + checkedValue = PDFObject.convert(val, encryptFn); + } + if (key === 'stream') { + streamData = `${key}\n${val}\nendstream`; + } else { + out.push(`/${key} ${checkedValue}`); + } + }); + out.push('>>'); + if (streamData) { + out.push(streamData); + } + return out.join('\n'); + } + if (typeof object === 'number') { + return PDFObject.number(object); + } + return `${object}`; + } + static number(n) { + if (n > -1e21 && n < 1e21) { + return Math.round(n * 1e6) / 1e6; + } + throw new Error(`unsupported number: ${n}`); + } +} +exports.PDFObject = PDFObject; \ No newline at end of file diff --git a/packages/utils/dist/index.d.ts b/packages/utils/dist/index.d.ts index ac1e5be2..1d30c18a 100644 --- a/packages/utils/dist/index.d.ts +++ b/packages/utils/dist/index.d.ts @@ -5,4 +5,7 @@ export * from "./findByteRange"; export * from "./removeTrailingNewLine"; export * from "./SignPdfError"; export * from "./Signer"; +export * from "./PDFAbstractReference"; +export * from "./PDFKitReferenceMock"; +export { PDFObject } from "./PDFObject"; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/utils/dist/index.js b/packages/utils/dist/index.js index 247d5fc9..ef00959e 100644 --- a/packages/utils/dist/index.js +++ b/packages/utils/dist/index.js @@ -3,9 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _exportNames = { + PDFObject: true +}; +Object.defineProperty(exports, "PDFObject", { + enumerable: true, + get: function () { + return _PDFObject.PDFObject; + } +}); var _const = require("./const"); Object.keys(_const).forEach(function (key) { if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; if (key in exports && exports[key] === _const[key]) return; Object.defineProperty(exports, key, { enumerable: true, @@ -17,6 +27,7 @@ Object.keys(_const).forEach(function (key) { var _convertBuffer = require("./convertBuffer"); Object.keys(_convertBuffer).forEach(function (key) { if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; if (key in exports && exports[key] === _convertBuffer[key]) return; Object.defineProperty(exports, key, { enumerable: true, @@ -28,6 +39,7 @@ Object.keys(_convertBuffer).forEach(function (key) { var _extractSignature = require("./extractSignature"); Object.keys(_extractSignature).forEach(function (key) { if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; if (key in exports && exports[key] === _extractSignature[key]) return; Object.defineProperty(exports, key, { enumerable: true, @@ -39,6 +51,7 @@ Object.keys(_extractSignature).forEach(function (key) { var _findByteRange = require("./findByteRange"); Object.keys(_findByteRange).forEach(function (key) { if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; if (key in exports && exports[key] === _findByteRange[key]) return; Object.defineProperty(exports, key, { enumerable: true, @@ -50,6 +63,7 @@ Object.keys(_findByteRange).forEach(function (key) { var _removeTrailingNewLine = require("./removeTrailingNewLine"); Object.keys(_removeTrailingNewLine).forEach(function (key) { if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; if (key in exports && exports[key] === _removeTrailingNewLine[key]) return; Object.defineProperty(exports, key, { enumerable: true, @@ -61,6 +75,7 @@ Object.keys(_removeTrailingNewLine).forEach(function (key) { var _SignPdfError = require("./SignPdfError"); Object.keys(_SignPdfError).forEach(function (key) { if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; if (key in exports && exports[key] === _SignPdfError[key]) return; Object.defineProperty(exports, key, { enumerable: true, @@ -72,6 +87,7 @@ Object.keys(_SignPdfError).forEach(function (key) { var _Signer = require("./Signer"); Object.keys(_Signer).forEach(function (key) { if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; if (key in exports && exports[key] === _Signer[key]) return; Object.defineProperty(exports, key, { enumerable: true, @@ -79,4 +95,29 @@ Object.keys(_Signer).forEach(function (key) { return _Signer[key]; } }); +}); +var _PDFObject = require("./PDFObject"); +var _PDFAbstractReference = require("./PDFAbstractReference"); +Object.keys(_PDFAbstractReference).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _PDFAbstractReference[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _PDFAbstractReference[key]; + } + }); +}); +var _PDFKitReferenceMock = require("./PDFKitReferenceMock"); +Object.keys(_PDFKitReferenceMock).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _PDFKitReferenceMock[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _PDFKitReferenceMock[key]; + } + }); }); \ No newline at end of file diff --git a/packages/utils/src/PDFAbstractReference.js b/packages/utils/src/PDFAbstractReference.js new file mode 100644 index 00000000..c2356069 --- /dev/null +++ b/packages/utils/src/PDFAbstractReference.js @@ -0,0 +1,20 @@ +/* +PDFAbstractReference by Devon Govett used below. +The class is part of pdfkit. See https://github.com/foliojs/pdfkit +LICENSE: MIT. Included in this folder. +Modifications may have been applied for the purposes of node-signpdf. +*/ + +/* +PDFAbstractReference - abstract class for PDF reference +*/ + +export class PDFAbstractReference { + toString() { + throw new Error('Must be implemented by subclasses'); + } + + end() { + // noop + } +} diff --git a/packages/utils/src/PDFAbstractReference.test.js b/packages/utils/src/PDFAbstractReference.test.js new file mode 100644 index 00000000..5deb09d9 --- /dev/null +++ b/packages/utils/src/PDFAbstractReference.test.js @@ -0,0 +1,43 @@ +import {PDFAbstractReference} from './PDFAbstractReference'; + +// Factory function to create test references instead of using a class +const createTestReference = (id, generation) => { + const ref = Object.create(PDFAbstractReference.prototype); + ref.id = id; + ref.generation = generation; + ref.toString = function() { + return `${this.id} ${this.generation} R`; + }; + return ref; +}; + +describe('PDFAbstractReference', () => { + it('can be extended and implements toString', () => { + const ref = createTestReference(42, 0); + expect(ref).toBeInstanceOf(PDFAbstractReference); + expect(ref.toString()).toBe('42 0 R'); + }); + + it('throws error when toString is not implemented', () => { + // Create a class that doesn't implement toString inside the test + const IncompletePDFReference = class extends PDFAbstractReference { + // No toString implementation + }; + + const ref = new IncompletePDFReference(); + expect(() => ref.toString()).toThrow('Must be implemented by subclasses'); + }); + + it('can be used in instanceof checks', () => { + const ref = createTestReference(123, 1); + expect(ref instanceof PDFAbstractReference).toBe(true); + }); + + it('has an end() method that is a no-op', () => { + const ref = createTestReference(1, 0); + // Should not throw any error + expect(() => ref.end()).not.toThrow(); + // Should return undefined (no-op) + expect(ref.end()).toBeUndefined(); + }); +}); diff --git a/packages/utils/src/PDFKitReferenceMock.js b/packages/utils/src/PDFKitReferenceMock.js new file mode 100644 index 00000000..aed01990 --- /dev/null +++ b/packages/utils/src/PDFKitReferenceMock.js @@ -0,0 +1,15 @@ +import {PDFAbstractReference} from './PDFAbstractReference'; + +export class PDFKitReferenceMock extends PDFAbstractReference { + constructor(index, additionalData = undefined) { + super(); + this.index = index; + if (typeof additionalData !== 'undefined') { + Object.assign(this, additionalData); + } + } + + toString() { + return `${this.index} 0 R`; + } +} diff --git a/packages/utils/src/PDFKitReferenceMock.test.js b/packages/utils/src/PDFKitReferenceMock.test.js new file mode 100644 index 00000000..725c1f50 --- /dev/null +++ b/packages/utils/src/PDFKitReferenceMock.test.js @@ -0,0 +1,22 @@ +import {PDFKitReferenceMock} from './PDFKitReferenceMock'; + +describe(PDFKitReferenceMock, () => { + it('stores index', () => { + const index = 54321; + const instance = new PDFKitReferenceMock(index); + expect(instance.index).toBe(index); + }); + it('accepts and stores additional data', () => { + const index = 123; + const data = 'DATA'; + const instance = new PDFKitReferenceMock(index, {a: data, b: data}); + expect(instance.index).toBe(index); + expect(instance.a).toBe(data); + expect(instance.b).toBe(data); + }); + it('can be converted to string', () => { + const index = 123; + const instance = new PDFKitReferenceMock(index); + expect(instance.toString()).toBe('123 0 R'); + }); +}); diff --git a/packages/utils/src/PDFObject.js b/packages/utils/src/PDFObject.js new file mode 100644 index 00000000..a16cf647 --- /dev/null +++ b/packages/utils/src/PDFObject.js @@ -0,0 +1,128 @@ +/* +PDFObject by Devon Govett used below. +The class is part of pdfkit. See https://github.com/foliojs/pdfkit +LICENSE: MIT. Included in this folder. +Modifications may have been applied for the purposes of node-signpdf. +*/ + +import {PDFAbstractReference} from './PDFAbstractReference'; +/* +PDFObject - converts JavaScript types into their corresponding PDF types. +By Devon Govett +*/ + +const pad = (str, length) => (Array(length + 1).join('0') + str).slice(-length); + +const escapableRe = /[\n\r\t\b\f()\\]/g; +const escapable = { + '\n': '\\n', + '\r': '\\r', + '\t': '\\t', + '\b': '\\b', + '\f': '\\f', + '\\': '\\\\', + '(': '\\(', + ')': '\\)', +}; + +// Convert little endian UTF-16 to big endian +const swapBytes = (buff) => buff.swap16(); + +export class PDFObject { + static convert(object, encryptFn = null) { + // String literals are converted to the PDF name type + if (typeof object === 'string') { + return `/${object}`; + + // String objects are converted to PDF strings (UTF-16) + } if (object instanceof String) { + let string = object; + // Detect if this is a unicode string + let isUnicode = false; + for (let i = 0, end = string.length; i < end; i += 1) { + if (string.charCodeAt(i) > 0x7f) { + isUnicode = true; + break; + } + } + + // If so, encode it as big endian UTF-16 + let stringBuffer; + if (isUnicode) { + stringBuffer = swapBytes(Buffer.from(`\ufeff${string}`, 'utf16le')); + } else { + stringBuffer = Buffer.from(string, 'ascii'); + } + + // Encrypt the string when necessary + if (encryptFn) { + string = encryptFn(stringBuffer).toString('binary'); + } else { + string = stringBuffer.toString('binary'); + } + + // Escape characters as required by the spec + string = string.replace(escapableRe, (c) => escapable[c]); + + return `(${string})`; + + // Buffers are converted to PDF hex strings + } if (Buffer.isBuffer(object)) { + return `<${object.toString('hex')}>`; + } if (object instanceof PDFAbstractReference) { + return object.toString(); + } if (object instanceof Date) { + let string = `D:${pad(object.getUTCFullYear(), 4)}${pad(object.getUTCMonth() + 1, 2)}${pad(object.getUTCDate(), 2)}${pad(object.getUTCHours(), 2)}${pad(object.getUTCMinutes(), 2)}${pad(object.getUTCSeconds(), 2)}Z`; + + // Encrypt the string when necessary + if (encryptFn) { + string = encryptFn(Buffer.from(string, 'ascii')).toString('binary'); + + // Escape characters as required by the spec + string = string.replace(escapableRe, (c) => escapable[c]); + } + + return `(${string})`; + } if (Array.isArray(object)) { + const items = object.map((e) => PDFObject.convert(e, encryptFn)).join(' '); + return `[${items}]`; + } if ({}.toString.call(object) === '[object Object]') { + const out = ['<<']; + let streamData; + + // @todo this can probably be refactored into a reduce + Object.entries(object).forEach(([key, val]) => { + let checkedValue = ''; + + if (val.toString().indexOf('<<') !== -1) { + checkedValue = val; + } else { + checkedValue = PDFObject.convert(val, encryptFn); + } + + if (key === 'stream') { + streamData = `${key}\n${val}\nendstream`; + } else { + out.push(`/${key} ${checkedValue}`); + } + }); + out.push('>>'); + + if (streamData) { + out.push(streamData); + } + return out.join('\n'); + } if (typeof object === 'number') { + return PDFObject.number(object); + } + return `${object}`; + } + + static number(n) { + if (n > -1e21 && n < 1e21) { + return Math.round(n * 1e6) / 1e6; + } + + throw new Error(`unsupported number: ${n}`); + } +} diff --git a/packages/utils/src/PDFObject.test.js b/packages/utils/src/PDFObject.test.js new file mode 100644 index 00000000..e3405fad --- /dev/null +++ b/packages/utils/src/PDFObject.test.js @@ -0,0 +1,186 @@ +import {PDFObject} from './PDFObject'; +import {PDFKitReferenceMock} from './PDFKitReferenceMock'; + +describe('PDFObject', () => { + describe('convert', () => { + it('converts numbers correctly', () => { + expect(PDFObject.convert(42)).toBe(42); + expect(PDFObject.convert(3.14159)).toBe(3.14159); + expect(PDFObject.convert(0)).toBe(0); + expect(PDFObject.convert(-1)).toBe(-1); + }); + + it('converts booleans correctly', () => { + expect(PDFObject.convert(true)).toBe('true'); + expect(PDFObject.convert(false)).toBe('false'); + }); + + it('converts null correctly', () => { + expect(PDFObject.convert(null)).toBe('null'); + }); + + it('converts primitive strings to PDF names', () => { + expect(PDFObject.convert('hello')).toBe('/hello'); + expect(PDFObject.convert('')).toBe('/'); + expect(PDFObject.convert('test_string')).toBe('/test_string'); + }); + + it('converts String objects to PDF strings with escaping', () => { + expect(PDFObject.convert(Object('hello'))).toBe('(hello)'); + expect(PDFObject.convert(Object(''))).toBe('()'); + expect(PDFObject.convert(Object('line1\nline2'))).toBe('(line1\\nline2)'); + expect(PDFObject.convert(Object('tab\there'))).toBe('(tab\\there)'); + expect(PDFObject.convert(Object('return\rhere'))).toBe('(return\\rhere)'); + expect(PDFObject.convert(Object('backspace\bhere'))).toBe('(backspace\\bhere)'); + expect(PDFObject.convert(Object('formfeed\fhere'))).toBe('(formfeed\\fhere)'); + expect(PDFObject.convert(Object('paren(test)'))).toBe('(paren\\(test\\))'); + expect(PDFObject.convert(Object('backslash\\test'))).toBe('(backslash\\\\test)'); + }); + + it('converts Buffers to hex strings', () => { + const buffer = Buffer.from([0x48, 0x65, 0x6c, 0x6c, 0x6f]); + expect(PDFObject.convert(buffer)).toBe('<48656c6c6f>'); + + const emptyBuffer = Buffer.from([]); + expect(PDFObject.convert(emptyBuffer)).toBe('<>'); + }); + + it('converts PDFAbstractReference instances using toString', () => { + const mockRef = new PDFKitReferenceMock(42, 0); + expect(PDFObject.convert(mockRef)).toBe('42 0 R'); + }); + + it('converts Date objects correctly', () => { + const date = new Date('2023-01-15T10:30:45.000Z'); + expect(PDFObject.convert(date)).toBe('(D:20230115103045Z)'); + }); + + it('converts arrays correctly', () => { + expect(PDFObject.convert([1, 2, 3])).toBe('[1 2 3]'); + expect(PDFObject.convert(['hello', 'world'])).toBe('[/hello /world]'); + expect(PDFObject.convert([true, false, null])).toBe('[true false null]'); + expect(PDFObject.convert([])).toBe('[]'); + }); + + it('converts mixed arrays correctly', () => { + const mockRef = new PDFKitReferenceMock(123, 0); + expect(PDFObject.convert([1, 'hello', true, mockRef])).toBe('[1 /hello true 123 0 R]'); + }); + + it('converts objects/dictionaries correctly', () => { + expect(PDFObject.convert({Type: 'Catalog'})).toBe('<<\n/Type /Catalog\n>>'); + expect(PDFObject.convert({Count: 1, Kids: []})).toBe('<<\n/Count 1\n/Kids []\n>>'); + expect(PDFObject.convert({})).toBe('<<\n>>'); + }); + + it('converts complex nested objects correctly', () => { + const mockRef = new PDFKitReferenceMock(42, 0); + const complexObj = { + Type: 'Page', + Parent: mockRef, + Resources: { + Font: { + F1: 'Helvetica', + }, + }, + MediaBox: [0, 0, 612, 792], + Contents: Buffer.from([0x48, 0x69]), + }; + + const result = PDFObject.convert(complexObj); + expect(result).toContain('/Type /Page'); + expect(result).toContain('/Parent 42 0 R'); + expect(result).toContain('/MediaBox [0 0 612 792]'); + expect(result).toContain('/Contents <4869>'); + }); + + it('handles encryption function when provided with String objects', () => { + const encryptFn = jest.fn((buffer) => Buffer.from(buffer.toString().toUpperCase())); + + // Test with String object (not primitive string) + const result = PDFObject.convert(Object('hello'), encryptFn); + expect(encryptFn).toHaveBeenCalledWith(Buffer.from('hello', 'ascii')); + expect(result).toBe('(HELLO)'); + }); + + it('handles encryption function with dates', () => { + const encryptFn = jest.fn(() => Buffer.from('test\\with()chars\n')); // Return string with escapable chars + const date = new Date('2023-01-15T10:30:45.000Z'); + + const result = PDFObject.convert(date, encryptFn); + expect(encryptFn).toHaveBeenCalledWith(Buffer.from('D:20230115103045Z', 'ascii')); + expect(result).toBe('(test\\\\with\\(\\)chars\\n)'); // Escaped version + }); + + it('properly handles undefined values', () => { + expect(PDFObject.convert(undefined)).toBe('undefined'); + }); + + it('handles unicode strings in String objects', () => { + const unicodeString = Object('Hello 世界'); + const result = PDFObject.convert(unicodeString); + // Unicode strings should be wrapped in parentheses and contain BOM + expect(result.startsWith('(')).toBe(true); + expect(result.endsWith(')')).toBe(true); + expect(result.length).toBeGreaterThan(12); // Should be longer due to unicode encoding + }); + + it('handles objects with values containing << (nested objects)', () => { + const objWithNestedDict = { + Type: 'Catalog', + NestedDict: '<<\n/Type /Page\n>>', + }; + const result = PDFObject.convert(objWithNestedDict); + expect(result).toContain('/NestedDict <<\n/Type /Page\n>>'); + }); + + it('handles objects with stream key', () => { + const objWithStream = { + Length: 12, + stream: 'Hello World!', + }; + const result = PDFObject.convert(objWithStream); + expect(result).toContain('stream\nHello World!\nendstream'); + expect(result).toContain('/Length 12'); + }); + + it('handles all convert method branches properly', () => { + // Test the final fallback case with types that don't match other branches + expect(PDFObject.convert(() => {})).toBe('() => {}'); + // Symbol conversion will throw, but we want to test normal fallback + expect(PDFObject.convert('nonMatchingCase')).toBe('/nonMatchingCase'); + }); + + it('covers Date formatting with all pad function calls', () => { + // Test Date with single digits to ensure pad function is fully tested + const date = new Date('2001-02-03T04:05:06.000Z'); + const result = PDFObject.convert(date); + expect(result).toBe('(D:20010203040506Z)'); + }); + }); + + describe('number', () => { + it('handles normal numbers correctly', () => { + expect(PDFObject.number(42)).toBe(42); + expect(PDFObject.number(3.14159)).toBe(3.14159); + expect(PDFObject.number(0)).toBe(0); + expect(PDFObject.number(-1)).toBe(-1); + }); + + it('rounds numbers to 6 decimal places', () => { + expect(PDFObject.number(1.1234567)).toBe(1.123457); + expect(PDFObject.number(2.9999994)).toBe(2.999999); + }); + + it('handles boundary values', () => { + expect(PDFObject.number(9.999999999999e20)).toBe(9.999999999999e20); + expect(PDFObject.number(-9.999999999999e20)).toBe(-9.999999999999e20); + }); + + it('throws error for values outside supported range', () => { + expect(() => PDFObject.number(1e21)).toThrow('unsupported number: 1e+21'); + expect(() => PDFObject.number(-1e21)).toThrow('unsupported number: -1e+21'); + expect(() => PDFObject.number(Infinity)).toThrow('unsupported number: Infinity'); + }); + }); +}); diff --git a/packages/utils/src/index.js b/packages/utils/src/index.js index 35659068..6ed05c83 100644 --- a/packages/utils/src/index.js +++ b/packages/utils/src/index.js @@ -1,3 +1,4 @@ +// Export all utilities from various modules export * from './const'; export * from './convertBuffer'; export * from './extractSignature'; @@ -5,3 +6,6 @@ export * from './findByteRange'; export * from './removeTrailingNewLine'; export * from './SignPdfError'; export * from './Signer'; +export {PDFObject} from './PDFObject'; +export * from './PDFAbstractReference'; +export * from './PDFKitReferenceMock'; diff --git a/packages/utils/src/index.test.js b/packages/utils/src/index.test.js new file mode 100644 index 00000000..003aa3cb --- /dev/null +++ b/packages/utils/src/index.test.js @@ -0,0 +1,57 @@ +import * as utils from './index'; + +describe('index exports', () => { + it('exports all required utilities', () => { + // Check that all expected exports are present + expect(utils.convertBuffer).toBeDefined(); + expect(utils.extractSignature).toBeDefined(); + expect(utils.findByteRange).toBeDefined(); + expect(utils.removeTrailingNewLine).toBeDefined(); + expect(utils.SignPdfError).toBeDefined(); + expect(utils.Signer).toBeDefined(); + expect(utils.PDFObject).toBeDefined(); + expect(utils.PDFAbstractReference).toBeDefined(); + expect(utils.PDFKitReferenceMock).toBeDefined(); + + // Check that functions work as expected + expect(typeof utils.convertBuffer).toBe('function'); + expect(typeof utils.extractSignature).toBe('function'); + expect(typeof utils.findByteRange).toBe('function'); + expect(typeof utils.removeTrailingNewLine).toBe('function'); + expect(typeof utils.SignPdfError).toBe('function'); + expect(typeof utils.Signer).toBe('function'); + expect(typeof utils.PDFObject).toBe('function'); + expect(typeof utils.PDFAbstractReference).toBe('function'); + expect(typeof utils.PDFKitReferenceMock).toBe('function'); + + // Verify constants are exported + expect(utils.DEFAULT_BYTE_RANGE_PLACEHOLDER).toBeDefined(); + expect(utils.DEFAULT_SIGNATURE_LENGTH).toBeDefined(); + expect(typeof utils.DEFAULT_BYTE_RANGE_PLACEHOLDER).toBe('string'); + expect(typeof utils.DEFAULT_SIGNATURE_LENGTH).toBe('number'); + }); + + it('can instantiate and use exported classes', () => { + // Test that the classes can be instantiated + const signer = new utils.Signer(); + expect(signer).toBeInstanceOf(utils.Signer); + + const error = new utils.SignPdfError('test'); + expect(error).toBeInstanceOf(utils.SignPdfError); + expect(error.message).toBe('test'); + + const mock = new utils.PDFKitReferenceMock(1, 0); + expect(mock).toBeInstanceOf(utils.PDFKitReferenceMock); + expect(mock.toString()).toBe('1 0 R'); + }); + + it('can use exported utility functions', () => { + // Test the utility functions work + expect(utils.convertBuffer(Buffer.from('test'))).toEqual(Buffer.from('test')); + expect(utils.removeTrailingNewLine(Buffer.from('test\n%%EOF'))).toEqual(Buffer.from('test\n%%EOF')); + + // Test PDFObject convert method + expect(utils.PDFObject.convert(42)).toBe(42); + expect(utils.PDFObject.convert('hello')).toBe('/hello'); + }); +});