@promr-acorda/core 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/types/value.ts","../src/coordinates/index.ts","../src/shared/index.ts","../src/validation/index.ts","../src/format/date.ts","../src/operations/index.ts","../src/export/index.ts"],"sourcesContent":["export interface SignatureValue {\r\n readonly type: 'signature';\r\n readonly source?: 'draw' | 'stamp';\r\n readonly image: Uint8Array;\r\n readonly mimeType?: string;\r\n readonly width?: number;\r\n readonly height?: number;\r\n}\r\n\r\nexport type ContractFieldValue =\r\n | string\r\n | number\r\n | boolean\r\n | SignatureValue;\r\n\r\nexport type FieldValueMap = Record<string, ContractFieldValue>;\r\n\r\nexport type SharedValueMap = Record<string, ContractFieldValue>;\r\n\r\nexport const isSignatureValue = (v: unknown): v is SignatureValue =>\r\n typeof v === 'object' && v !== null && 'type' in v && v.type === 'signature';\r\n\r\nexport const isPrimitiveValue = (\r\n v: ContractFieldValue\r\n): v is string | number | boolean => typeof v !== 'object';\r\n\r\nexport const isUint8Array = (value: unknown): value is Uint8Array =>\r\n Object.prototype.toString.call(value) === '[object Uint8Array]';\r\n\r\nexport const cloneContractFieldValue = (\r\n value: ContractFieldValue\r\n): ContractFieldValue => {\r\n if (!isSignatureValue(value) || !isUint8Array(value.image)) return value;\r\n\r\n return {\r\n ...value,\r\n image: Uint8Array.from(value.image),\r\n };\r\n};\r\n\r\nexport const ALLOWED_SIGNATURE_IMAGE_MIME_TYPES = new Set([\r\n 'image/png',\r\n 'image/jpeg',\r\n 'image/jpg',\r\n]);\r\n\r\nexport const normalizeSignatureImageMimeType = (\r\n mimeType: string | undefined\r\n): string | undefined => {\r\n const normalized = mimeType?.trim().toLowerCase();\r\n if (!normalized) return undefined;\r\n if (!ALLOWED_SIGNATURE_IMAGE_MIME_TYPES.has(normalized)) return undefined;\r\n return normalized === 'image/jpg' ? 'image/jpeg' : normalized;\r\n};\r\n\r\nexport const detectSignatureImageMimeType = (\r\n image: Uint8Array\r\n): string | undefined => {\r\n if (\r\n image.length >= 8 &&\r\n image[0] === 0x89 &&\r\n image[1] === 0x50 &&\r\n image[2] === 0x4e &&\r\n image[3] === 0x47 &&\r\n image[4] === 0x0d &&\r\n image[5] === 0x0a &&\r\n image[6] === 0x1a &&\r\n image[7] === 0x0a\r\n ) {\r\n return 'image/png';\r\n }\r\n\r\n if (\r\n image.length >= 3 &&\r\n image[0] === 0xff &&\r\n image[1] === 0xd8 &&\r\n image[2] === 0xff\r\n ) {\r\n return 'image/jpeg';\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nexport const getNormalizedSignatureImageMimeType = (\r\n value: SignatureValue\r\n): string | undefined => {\r\n const detected = detectSignatureImageMimeType(value.image);\r\n const normalized = normalizeSignatureImageMimeType(value.mimeType);\r\n\r\n if (normalized && detected && normalized !== detected) {\r\n return undefined;\r\n }\r\n\r\n return normalized ?? detected;\r\n};\r\n","import type { NormalizedRect } from '../types';\r\n\r\nconst MIN_SIZE = 0.005;\r\nconst COORD_MIN = 0;\r\nconst COORD_MAX = 1;\r\n\r\nexport const clampToPage = (value: number, pageCount: number): number =>\r\n Math.max(0, Math.min(pageCount - 1, Math.floor(value)));\r\n\r\nexport const clampCoord = (value: number): number =>\r\n Math.max(COORD_MIN, Math.min(COORD_MAX, value));\r\n\r\nexport const ensureMinSize = (size: number): number =>\r\n Math.max(MIN_SIZE, size);\r\n\r\nexport const normalizeRect = (\r\n rect: NormalizedRect,\r\n pageCount: number\r\n): NormalizedRect => {\r\n const page = clampToPage(rect.page, pageCount);\r\n\r\n const x = clampCoord(rect.x);\r\n const y = clampCoord(rect.y);\r\n const width = ensureMinSize(rect.width);\r\n const height = ensureMinSize(rect.height);\r\n\r\n const clampedWidth = Math.min(width, COORD_MAX - x);\r\n const clampedHeight = Math.min(height, COORD_MAX - y);\r\n\r\n return {\r\n page,\r\n x,\r\n y,\r\n width: ensureMinSize(clampedWidth),\r\n height: ensureMinSize(clampedHeight),\r\n };\r\n};\r\n\r\nexport const toAbsoluteRect = (\r\n rect: NormalizedRect,\r\n pageWidth: number,\r\n pageHeight: number\r\n): { x: number; y: number; width: number; height: number } => ({\r\n x: rect.x * pageWidth,\r\n y: rect.y * pageHeight,\r\n width: rect.width * pageWidth,\r\n height: rect.height * pageHeight,\r\n});\r\n\r\nexport const toNormalizedRect = (\r\n abs: { page: number; x: number; y: number; width: number; height: number },\r\n pageWidth: number,\r\n pageHeight: number\r\n): NormalizedRect => ({\r\n page: abs.page,\r\n x: abs.x / pageWidth,\r\n y: abs.y / pageHeight,\r\n width: abs.width / pageWidth,\r\n height: abs.height / pageHeight,\r\n});\r\n","import type { ContractField } from '../types/field';\r\nimport type {\r\n ContractFieldValue,\r\n FieldValueMap,\r\n SharedValueMap,\r\n} from '../types/value';\r\nimport { cloneContractFieldValue } from '../types/value';\r\n\r\nexport const getSourceField = (\r\n fields: readonly ContractField[],\r\n sharedKey: string\r\n): ContractField | undefined =>\r\n fields.find((f) => f.sharedKey === sharedKey && f.sharedMode === 'source');\r\n\r\nexport const getMirrorFields = (\r\n fields: readonly ContractField[],\r\n sharedKey: string\r\n): readonly ContractField[] =>\r\n fields.filter((f) => f.sharedKey === sharedKey && f.sharedMode === 'mirror');\r\n\r\nexport const resolveFieldValue = (\r\n field: ContractField,\r\n fieldValues: FieldValueMap,\r\n sharedValues: SharedValueMap\r\n): ContractFieldValue | undefined => {\r\n if (field.sharedKey) {\r\n const sharedValue = sharedValues[field.sharedKey];\r\n if (sharedValue !== undefined) return cloneContractFieldValue(sharedValue);\r\n }\r\n\r\n const directValue = fieldValues[field.id];\r\n if (directValue !== undefined) return cloneContractFieldValue(directValue);\r\n\r\n const defaultValue = field.defaultValue as ContractFieldValue | undefined;\r\n return defaultValue !== undefined\r\n ? cloneContractFieldValue(defaultValue)\r\n : undefined;\r\n};\r\n\r\nexport const setSharedFieldValue = (\r\n fields: readonly ContractField[],\r\n sharedValues: SharedValueMap,\r\n sharedKey: string,\r\n value: ContractFieldValue\r\n): SharedValueMap => {\r\n const sourceExists = fields.some(\r\n (f) => f.sharedKey === sharedKey && f.sharedMode === 'source'\r\n );\r\n\r\n if (!sourceExists) {\r\n throw new Error(\r\n `Cannot set shared value: no source field exists for key \"${sharedKey}\".`\r\n );\r\n }\r\n\r\n return { ...sharedValues, [sharedKey]: cloneContractFieldValue(value) };\r\n};\r\n\r\nexport const resolveAllSharedValues = (\r\n fields: readonly ContractField[],\r\n fieldValues: FieldValueMap,\r\n sharedValues: SharedValueMap\r\n): FieldValueMap => {\r\n const resolved: Record<string, ContractFieldValue> = Object.fromEntries(\r\n Object.entries(fieldValues).map(([fieldId, value]) => [\r\n fieldId,\r\n cloneContractFieldValue(value),\r\n ])\r\n );\r\n\r\n for (const field of fields) {\r\n const value = resolveFieldValue(field, fieldValues, sharedValues);\r\n if (value !== undefined) {\r\n resolved[field.id] = value;\r\n }\r\n }\r\n\r\n return resolved;\r\n};\r\n","import type { ContractField, NumberField } from '../types/field';\r\nimport type {\r\n ContractFieldValue,\r\n FieldValueMap,\r\n SharedValueMap,\r\n} from '../types/value';\r\nimport type {\r\n FieldValidationError,\r\n ValidationResult,\r\n} from '../types/validation';\r\nimport type { ContractDocument } from '../types/document';\r\nimport {\r\n getNormalizedSignatureImageMimeType,\r\n isSignatureValue,\r\n isUint8Array,\r\n} from '../types/value';\r\nimport { resolveFieldValue } from '../shared';\r\n\r\nconst MAX_SIGNATURE_IMAGE_BYTES = 5 * 1024 * 1024;\r\n\r\nconst makeError = (\r\n field: ContractField,\r\n message: string,\r\n code: FieldValidationError['code']\r\n): FieldValidationError => ({\r\n fieldId: field.id,\r\n fieldName: field.name,\r\n message: field.validation?.customMessage ?? message,\r\n code,\r\n});\r\n\r\nconst validateStringValue = (\r\n field: ContractField,\r\n value: string\r\n): FieldValidationError[] => {\r\n const errors: FieldValidationError[] = [];\r\n const { validation } = field;\r\n if (!validation) return errors;\r\n\r\n if (validation.minLength !== undefined && value.length < validation.minLength) {\r\n errors.push(\r\n makeError(\r\n field,\r\n `Must be at least ${validation.minLength} characters.`,\r\n 'MIN_LENGTH'\r\n )\r\n );\r\n }\r\n\r\n if (validation.maxLength !== undefined && value.length > validation.maxLength) {\r\n errors.push(\r\n makeError(\r\n field,\r\n `Must be at most ${validation.maxLength} characters.`,\r\n 'MAX_LENGTH'\r\n )\r\n );\r\n }\r\n\r\n if (validation.pattern !== undefined) {\r\n try {\r\n const regex = new RegExp(validation.pattern);\r\n if (!regex.test(value)) {\r\n errors.push(\r\n makeError(\r\n field,\r\n 'The value does not match the required format.',\r\n 'PATTERN_MISMATCH'\r\n )\r\n );\r\n }\r\n } catch {\r\n errors.push(\r\n makeError(\r\n field,\r\n 'The field validation pattern is invalid.',\r\n 'PATTERN_MISMATCH'\r\n )\r\n );\r\n }\r\n }\r\n\r\n return errors;\r\n};\r\n\r\nconst validateNumberValue = (\r\n field: ContractField,\r\n value: number\r\n): FieldValidationError[] => {\r\n const errors: FieldValidationError[] = [];\r\n const numField = field as NumberField;\r\n\r\n if (numField.min !== undefined && value < numField.min) {\r\n errors.push(\r\n makeError(field, `Minimum value is ${numField.min}.`, 'MIN_VALUE')\r\n );\r\n }\r\n\r\n if (numField.max !== undefined && value > numField.max) {\r\n errors.push(\r\n makeError(field, `Maximum value is ${numField.max}.`, 'MAX_VALUE')\r\n );\r\n }\r\n\r\n return errors;\r\n};\r\n\r\nexport const validateField = (\r\n field: ContractField,\r\n value: ContractFieldValue | undefined\r\n): ValidationResult => {\r\n if (field.sharedMode === 'mirror') {\r\n return { valid: true, errors: [] };\r\n }\r\n\r\n const errors: FieldValidationError[] = [];\r\n\r\n const isEmpty =\r\n value === undefined ||\r\n value === '' ||\r\n value === null ||\r\n (typeof value === 'boolean' && !value && field.type !== 'checkbox');\r\n\r\n if (field.required && isEmpty) {\r\n errors.push(makeError(field, 'This field is required.', 'REQUIRED'));\r\n return { valid: false, errors };\r\n }\r\n\r\n if (value === undefined || value === '') {\r\n return { valid: true, errors: [] };\r\n }\r\n\r\n if (\r\n (field.type === 'checkbox' && typeof value !== 'boolean') ||\r\n (field.type === 'number' &&\r\n (typeof value !== 'number' || !Number.isFinite(value))) ||\r\n (field.type === 'signature' && !isSignatureValue(value)) ||\r\n (field.type !== 'checkbox' &&\r\n field.type !== 'number' &&\r\n field.type !== 'signature' &&\r\n typeof value !== 'string')\r\n ) {\r\n errors.push(makeError(field, 'The value type is invalid for this field.', 'INVALID_TYPE'));\r\n return { valid: false, errors };\r\n }\r\n\r\n if (typeof value === 'string') {\r\n errors.push(...validateStringValue(field, value));\r\n } else if (typeof value === 'number') {\r\n errors.push(...validateNumberValue(field, value));\r\n } else if (isSignatureValue(value)) {\r\n if (!isUint8Array(value.image) || value.image.length === 0) {\r\n errors.push(makeError(field, 'Image data is invalid.', 'INVALID_TYPE'));\r\n return { valid: false, errors };\r\n }\r\n if (value.image.length > MAX_SIGNATURE_IMAGE_BYTES) {\r\n errors.push(\r\n makeError(\r\n field,\r\n `Image data must be ${Math.floor(MAX_SIGNATURE_IMAGE_BYTES / (1024 * 1024))} MB or smaller.`,\r\n 'INVALID_TYPE'\r\n )\r\n );\r\n }\r\n if (getNormalizedSignatureImageMimeType(value) === undefined) {\r\n errors.push(\r\n makeError(\r\n field,\r\n 'Only PNG and JPEG signature images are allowed, and MIME type must match the image data.',\r\n 'INVALID_TYPE'\r\n )\r\n );\r\n }\r\n }\r\n\r\n return { valid: errors.length === 0, errors };\r\n};\r\n\r\nexport const validateSharedFieldGroup = (\r\n fields: readonly ContractField[],\r\n fieldValues: FieldValueMap,\r\n sharedValues: SharedValueMap,\r\n sharedKey: string\r\n): ValidationResult => {\r\n const groupFields = fields.filter((f) => f.sharedKey === sharedKey);\r\n const sourceField = groupFields.find((f) => f.sharedMode === 'source');\r\n\r\n if (!sourceField) {\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n fieldId: sharedKey,\r\n fieldName: sharedKey,\r\n message: `No source field found for shared key \"${sharedKey}\".`,\r\n code: 'SHARED_SOURCE_NOT_FOUND',\r\n },\r\n ],\r\n };\r\n }\r\n\r\n const value = resolveFieldValue(sourceField, fieldValues, sharedValues);\r\n return validateField(sourceField, value);\r\n};\r\n\r\nexport const validateDocument = (\r\n document: ContractDocument\r\n): ValidationResult => {\r\n const { fields, fieldValues, sharedValues } = document;\r\n\r\n const processedSharedKeys = new Set<string>();\r\n const allErrors: FieldValidationError[] = [];\r\n\r\n for (const field of fields) {\r\n if (field.sharedMode === 'mirror') continue;\r\n\r\n if (field.sharedKey) {\r\n if (processedSharedKeys.has(field.sharedKey)) continue;\r\n processedSharedKeys.add(field.sharedKey);\r\n\r\n const result = validateSharedFieldGroup(\r\n fields,\r\n fieldValues,\r\n sharedValues,\r\n field.sharedKey\r\n );\r\n allErrors.push(...result.errors);\r\n } else {\r\n const value = resolveFieldValue(field, fieldValues, sharedValues);\r\n const result = validateField(field, value);\r\n allErrors.push(...result.errors);\r\n }\r\n }\r\n\r\n return { valid: allErrors.length === 0, errors: allErrors };\r\n};\r\n","const FORMAT_TOKEN_CHARS = new Set(['y', 'Y', 'M', 'm', 'd', 'D', 'h', 'H', 's', 'S']);\r\nconst REGEX_SPECIAL_CHARS = new Set(['\\\\', '^', '$', '.', '*', '+', '?', '(', ')', '[', ']', '{', '}', '|']);\r\n\r\nconst escapeRegexChar = (char: string): string =>\r\n REGEX_SPECIAL_CHARS.has(char) ? `\\\\${char}` : char;\r\n\r\nexport const dateFormatToRegexPattern = (format: string): string => {\r\n let pattern = '';\r\n\r\n for (let index = 0; index < format.length;) {\r\n const char = format[index];\r\n if (char === undefined) break;\r\n\r\n if (FORMAT_TOKEN_CHARS.has(char)) {\r\n let tokenLength = 1;\r\n while (format[index + tokenLength] === char) {\r\n tokenLength += 1;\r\n }\r\n pattern += `\\\\d{${tokenLength}}`;\r\n index += tokenLength;\r\n continue;\r\n }\r\n\r\n pattern += escapeRegexChar(char);\r\n index += 1;\r\n }\r\n\r\n return pattern;\r\n};\r\n\r\nexport const matchesDateFormat = (format: string, value: string): boolean => {\r\n const trimmedFormat = format.trim();\r\n if (!trimmedFormat) return true;\r\n\r\n return new RegExp(`^(?:${dateFormatToRegexPattern(trimmedFormat)})$`).test(value);\r\n};\r\n\r\nconst ISO_DATE_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\r\n\r\nexport const isIsoDateString = (value: string): boolean =>\r\n ISO_DATE_PATTERN.test(value);\r\n\r\nexport const formatDateValue = (\r\n value: string,\r\n format: string | undefined\r\n): string => {\r\n const match = ISO_DATE_PATTERN.exec(value);\r\n const trimmedFormat = format?.trim();\r\n if (!match || !trimmedFormat) return value;\r\n\r\n const [, year = '', month = '', day = ''] = match;\r\n\r\n let formatted = '';\r\n for (let index = 0; index < trimmedFormat.length;) {\r\n const char = trimmedFormat[index];\r\n if (char === undefined) break;\r\n\r\n let tokenLength = 1;\r\n while (trimmedFormat[index + tokenLength] === char) {\r\n tokenLength += 1;\r\n }\r\n\r\n if (char === 'y' || char === 'Y') {\r\n formatted += tokenLength === 2 ? year.slice(-2) : year.padStart(tokenLength, '0');\r\n index += tokenLength;\r\n continue;\r\n }\r\n\r\n if (char === 'M' || char === 'm') {\r\n formatted += tokenLength === 1 ? String(Number(month)) : month.padStart(tokenLength, '0');\r\n index += tokenLength;\r\n continue;\r\n }\r\n\r\n if (char === 'd' || char === 'D') {\r\n formatted += tokenLength === 1 ? String(Number(day)) : day.padStart(tokenLength, '0');\r\n index += tokenLength;\r\n continue;\r\n }\r\n\r\n formatted += char;\r\n index += 1;\r\n }\r\n\r\n return formatted;\r\n};\r\n","import type {\r\n ContractField,\r\n ContractFieldType,\r\n SharedMode,\r\n} from '../types/field';\r\nimport type {\r\n ContractFieldValue,\r\n FieldValueMap,\r\n SharedValueMap,\r\n} from '../types/value';\r\nimport {\r\n cloneContractFieldValue,\r\n isSignatureValue,\r\n isUint8Array,\r\n} from '../types/value';\r\nimport { PDFDocument } from 'pdf-lib';\r\nimport type {\r\n ContractDocument,\r\n CreateDocumentFromPdfDataInput,\r\n CreateDocumentInput,\r\n PageInfo,\r\n} from '../types/document';\r\nimport { normalizeRect } from '../coordinates';\r\nimport { resolveFieldValue, setSharedFieldValue } from '../shared';\r\n\r\nconst assertAtMostOneSourcePerSharedKey = (\r\n fields: readonly ContractField[]\r\n): void => {\r\n const sourceIdByKey = new Map<string, string>();\r\n for (const f of fields) {\r\n if (!f.sharedKey || f.sharedMode !== 'source') continue;\r\n const prev = sourceIdByKey.get(f.sharedKey);\r\n if (prev !== undefined) {\r\n throw new Error(\r\n `Shared key \"${f.sharedKey}\" allows only one source field. (Conflict: \"${prev}\" vs \"${f.id}\")`\r\n );\r\n }\r\n sourceIdByKey.set(f.sharedKey, f.id);\r\n }\r\n};\r\n\r\nconst assertUniqueFieldId = (\r\n fields: readonly ContractField[],\r\n fieldId: string\r\n): void => {\r\n if (!fields.some((field) => field.id === fieldId)) return;\r\n\r\n throw new Error(`Field ID \"${fieldId}\" already exists.`);\r\n};\r\n\r\nconst isValueCompatibleWithField = (\r\n field: ContractField,\r\n value: ContractFieldValue\r\n): boolean => {\r\n switch (field.type) {\r\n case 'checkbox':\r\n return typeof value === 'boolean';\r\n case 'number':\r\n return typeof value === 'number' && Number.isFinite(value);\r\n case 'signature':\r\n return isSignatureValue(value) && isUint8Array(value.image);\r\n case 'text':\r\n case 'date':\r\n case 'email':\r\n case 'phone':\r\n case 'textarea':\r\n return typeof value === 'string';\r\n default:\r\n return false;\r\n }\r\n};\r\n\r\nexport interface GetFieldsOptions {\r\n readonly page?: number;\r\n readonly type?: ContractFieldType;\r\n readonly required?: boolean;\r\n readonly hidden?: boolean;\r\n readonly readonly?: boolean;\r\n readonly disabled?: boolean;\r\n readonly sharedKey?: string;\r\n readonly sharedMode?: SharedMode;\r\n}\r\n\r\nexport interface GetResolvedValuesOptions {\r\n readonly includeEmpty?: boolean;\r\n}\r\n\r\nexport type ResolvedFieldValueMap = Record<\r\n string,\r\n ContractFieldValue | undefined\r\n>;\r\n\r\nconst matchesFieldOptions = (\r\n field: ContractField,\r\n options: GetFieldsOptions\r\n): boolean => {\r\n if (options.page !== undefined && field.page !== options.page) return false;\r\n if (options.type !== undefined && field.type !== options.type) return false;\r\n if (\r\n options.required !== undefined &&\r\n (field.required ?? false) !== options.required\r\n ) {\r\n return false;\r\n }\r\n if (\r\n options.hidden !== undefined &&\r\n (field.hidden ?? false) !== options.hidden\r\n ) {\r\n return false;\r\n }\r\n if (\r\n options.readonly !== undefined &&\r\n (field.readonly ?? false) !== options.readonly\r\n ) {\r\n return false;\r\n }\r\n if (\r\n options.disabled !== undefined &&\r\n (field.disabled ?? false) !== options.disabled\r\n ) {\r\n return false;\r\n }\r\n if (\r\n options.sharedKey !== undefined &&\r\n field.sharedKey !== options.sharedKey\r\n ) {\r\n return false;\r\n }\r\n if (\r\n options.sharedMode !== undefined &&\r\n field.sharedMode !== options.sharedMode\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst normalizeFieldRect = (\r\n field: ContractField,\r\n document: ContractDocument\r\n): ReturnType<typeof normalizeRect> => {\r\n const normalized = normalizeRect(field, document.pageCount);\r\n if (field.type !== 'checkbox') return normalized;\r\n\r\n const page = document.pages.find((candidate) => candidate.index === normalized.page);\r\n if (!page || page.width <= 0 || page.height <= 0) {\r\n const side = Math.min(normalized.width, normalized.height);\r\n return normalizeRect({ ...normalized, width: side, height: side }, document.pageCount);\r\n }\r\n\r\n const side = Math.min(\r\n normalized.width * page.width,\r\n normalized.height * page.height\r\n );\r\n\r\n return normalizeRect(\r\n {\r\n ...normalized,\r\n width: side / page.width,\r\n height: side / page.height,\r\n },\r\n document.pageCount\r\n );\r\n};\r\n\r\nexport const createDocument = (input: CreateDocumentInput): ContractDocument => ({\r\n ...input,\r\n fields: [],\r\n fieldValues: {},\r\n sharedValues: {},\r\n createdAt: new Date().toISOString(),\r\n updatedAt: new Date().toISOString(),\r\n});\r\n\r\nexport const getPdfPageInfo = async (\r\n pdfData: Uint8Array\r\n): Promise<readonly PageInfo[]> => {\r\n const pdf = await PDFDocument.load(pdfData);\r\n return pdf.getPages().map((page, index) => ({\r\n index,\r\n width: page.getWidth(),\r\n height: page.getHeight(),\r\n }));\r\n};\r\n\r\nexport const createDocumentFromPdfData = async (\r\n input: CreateDocumentFromPdfDataInput\r\n): Promise<ContractDocument> => {\r\n const pages = await getPdfPageInfo(input.pdfData);\r\n return createDocument({\r\n ...input,\r\n pageCount: pages.length,\r\n pages,\r\n });\r\n};\r\n\r\nexport const createField = (\r\n document: ContractDocument,\r\n field: ContractField\r\n): ContractDocument => {\r\n assertUniqueFieldId(document.fields, field.id);\r\n const normalized = normalizeFieldRect(field, document);\r\n const newField: ContractField = { ...field, ...normalized };\r\n\r\n const fields = [...document.fields, newField];\r\n assertAtMostOneSourcePerSharedKey(fields);\r\n\r\n return {\r\n ...document,\r\n fields,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n};\r\n\r\nexport const updateField = (\r\n document: ContractDocument,\r\n fieldId: string,\r\n patch: Partial<Omit<ContractField, 'id' | 'type'>>\r\n): ContractDocument => {\r\n const fields = document.fields.map((f) => {\r\n if (f.id !== fieldId) return f;\r\n\r\n const merged = { ...f, ...patch };\r\n const normalized = normalizeFieldRect(merged, document);\r\n return { ...merged, ...normalized } as ContractField;\r\n });\r\n\r\n assertAtMostOneSourcePerSharedKey(fields);\r\n\r\n return {\r\n ...document,\r\n fields,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n};\r\n\r\nexport const removeField = (\r\n document: ContractDocument,\r\n fieldId: string\r\n): ContractDocument => {\r\n const field = document.fields.find((f) => f.id === fieldId);\r\n\r\n const fields = document.fields.filter((f) => f.id !== fieldId);\r\n\r\n const fieldValues = Object.fromEntries(\r\n Object.entries(document.fieldValues).filter(([id]) => id !== fieldId)\r\n );\r\n\r\n let { sharedValues } = document;\r\n\r\n if (field?.sharedKey && field.sharedMode === 'source') {\r\n const hasOtherSource = fields.some(\r\n (f) => f.sharedKey === field.sharedKey && f.sharedMode === 'source'\r\n );\r\n if (!hasOtherSource) {\r\n sharedValues = Object.fromEntries(\r\n Object.entries(sharedValues).filter(([key]) => key !== field.sharedKey)\r\n );\r\n }\r\n }\r\n\r\n return {\r\n ...document,\r\n fields,\r\n fieldValues,\r\n sharedValues,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n};\r\n\r\nexport const moveField = (\r\n document: ContractDocument,\r\n fieldId: string,\r\n position: { page?: number; x: number; y: number }\r\n): ContractDocument => {\r\n const { page, x, y } = position;\r\n return updateField(\r\n document,\r\n fieldId,\r\n page !== undefined ? { page, x, y } : { x, y }\r\n );\r\n};\r\n\r\nexport const resizeField = (\r\n document: ContractDocument,\r\n fieldId: string,\r\n size: { width: number; height: number }\r\n): ContractDocument =>\r\n updateField(document, fieldId, {\r\n width: size.width,\r\n height: size.height,\r\n });\r\n\r\nexport const setFieldValue = (\r\n document: ContractDocument,\r\n fieldId: string,\r\n value: ContractFieldValue\r\n): ContractDocument => {\r\n const field = document.fields.find((f) => f.id === fieldId);\r\n\r\n if (!field) {\r\n throw new Error(`Field ID \"${fieldId}\" was not found.`);\r\n }\r\n\r\n if (field.sharedMode === 'mirror') {\r\n throw new Error(\r\n `Cannot set value on mirror field \"${fieldId}\". Set the value on the source field instead.`\r\n );\r\n }\r\n\r\n if (field.readonly) {\r\n throw new Error(`Cannot set value on read-only field \"${fieldId}\".`);\r\n }\r\n\r\n if (!isValueCompatibleWithField(field, value)) {\r\n throw new Error(\r\n `Value for field \"${fieldId}\" is incompatible with field type \"${field.type}\".`\r\n );\r\n }\r\n\r\n if (field.sharedKey && field.sharedMode === 'source') {\r\n const sharedValues = setSharedFieldValue(\r\n document.fields,\r\n document.sharedValues,\r\n field.sharedKey,\r\n value\r\n );\r\n return {\r\n ...document,\r\n sharedValues,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n }\r\n\r\n return {\r\n ...document,\r\n fieldValues: {\r\n ...document.fieldValues,\r\n [fieldId]: cloneContractFieldValue(value),\r\n },\r\n updatedAt: new Date().toISOString(),\r\n };\r\n};\r\n\r\nexport const clearFieldValue = (\r\n document: ContractDocument,\r\n fieldId: string\r\n): ContractDocument => {\r\n const field = document.fields.find((f) => f.id === fieldId);\r\n\r\n if (!field) {\r\n throw new Error(`Field ID \"${fieldId}\" was not found.`);\r\n }\r\n\r\n if (field.sharedMode === 'mirror') {\r\n throw new Error(\r\n `Cannot clear value on mirror field \"${fieldId}\". Clear the source field instead.`\r\n );\r\n }\r\n\r\n if (field.readonly) {\r\n throw new Error(`Cannot clear value on read-only field \"${fieldId}\".`);\r\n }\r\n\r\n if (field.sharedKey && field.sharedMode === 'source') {\r\n const { [field.sharedKey]: _removed, ...sharedValues } = document.sharedValues;\r\n return {\r\n ...document,\r\n sharedValues,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n }\r\n\r\n const { [fieldId]: _removed, ...fieldValues } = document.fieldValues;\r\n return {\r\n ...document,\r\n fieldValues,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n};\r\n\r\nexport const getField = (\r\n document: ContractDocument,\r\n fieldId: string\r\n): ContractField | undefined => {\r\n const field = document.fields.find((f) => f.id === fieldId);\r\n return field ? { ...field } : undefined;\r\n};\r\n\r\nexport const getFields = (\r\n document: ContractDocument,\r\n options: GetFieldsOptions = {}\r\n): readonly ContractField[] =>\r\n document.fields\r\n .filter((field) => matchesFieldOptions(field, options))\r\n .map((field) => ({ ...field }));\r\n\r\nexport const getResolvedFieldValue = (\r\n document: ContractDocument,\r\n fieldId: string\r\n): ContractFieldValue | undefined => {\r\n const field = document.fields.find((f) => f.id === fieldId);\r\n if (!field) return undefined;\r\n\r\n return resolveFieldValue(field, document.fieldValues, document.sharedValues);\r\n};\r\n\r\nexport function getResolvedValues(document: ContractDocument): FieldValueMap;\r\nexport function getResolvedValues(\r\n document: ContractDocument,\r\n options: GetResolvedValuesOptions & { readonly includeEmpty: true }\r\n): ResolvedFieldValueMap;\r\nexport function getResolvedValues(\r\n document: ContractDocument,\r\n options: GetResolvedValuesOptions\r\n): FieldValueMap | ResolvedFieldValueMap;\r\nexport function getResolvedValues(\r\n document: ContractDocument,\r\n options: GetResolvedValuesOptions = {}\r\n): FieldValueMap | ResolvedFieldValueMap {\r\n const resolved: ResolvedFieldValueMap = {};\r\n\r\n for (const field of document.fields) {\r\n const value = resolveFieldValue(\r\n field,\r\n document.fieldValues,\r\n document.sharedValues\r\n );\r\n if (value !== undefined || options.includeEmpty) {\r\n resolved[field.id] = value;\r\n }\r\n }\r\n\r\n return resolved;\r\n}\r\n\r\nexport type { ContractDocument, FieldValueMap, SharedValueMap };\r\n","import {\r\n PDFDocument,\r\n PDFPage,\r\n StandardFonts,\r\n rgb,\r\n type PDFFont,\r\n} from 'pdf-lib';\r\nimport type { ContractDocument } from '../types/document';\r\nimport type { ContractField } from '../types/field';\r\nimport type { ContractFieldValue } from '../types/value';\r\nimport {\r\n getNormalizedSignatureImageMimeType,\r\n isSignatureValue,\r\n} from '../types/value';\r\nimport { resolveFieldValue } from '../shared';\r\nimport { toAbsoluteRect } from '../coordinates';\r\nimport { formatDateValue } from '../format';\r\nimport { validateField } from '../validation';\r\n\r\ninterface PageDimension {\r\n readonly width: number;\r\n readonly height: number;\r\n}\r\n\r\nconst getAlignedTextX = (\r\n field: ContractField,\r\n value: string,\r\n font: PDFFont,\r\n fontSize: number,\r\n x: number,\r\n width: number\r\n): number => {\r\n const padding = 2;\r\n const maxTextWidth = Math.max(0, width - padding * 2);\r\n const textWidth = Math.min(font.widthOfTextAtSize(value, fontSize), maxTextWidth);\r\n\r\n switch (field.textAlign) {\r\n case 'center':\r\n return x + (width - textWidth) / 2;\r\n case 'right':\r\n return x + width - padding - textWidth;\r\n case 'left':\r\n default:\r\n return x + padding;\r\n }\r\n};\r\n\r\nconst getPageDimension = (page: PDFPage): PageDimension => ({\r\n width: page.getWidth(),\r\n height: page.getHeight(),\r\n});\r\n\r\nconst drawTextField = (\r\n page: PDFPage,\r\n field: ContractField,\r\n value: string,\r\n font: PDFFont,\r\n pageDim: PageDimension\r\n): void => {\r\n const abs = toAbsoluteRect(field, pageDim.width, pageDim.height);\r\n const fontSize = field.textSize ?? 10;\r\n const textY = pageDim.height - abs.y - abs.height / 2 - fontSize / 2;\r\n const textX = getAlignedTextX(field, value, font, fontSize, abs.x, abs.width);\r\n\r\n page.drawText(value, {\r\n x: textX,\r\n y: Math.max(0, textY),\r\n size: fontSize,\r\n font,\r\n color: rgb(0, 0, 0),\r\n maxWidth: abs.width - 4,\r\n });\r\n};\r\n\r\nconst drawCheckboxField = (\r\n page: PDFPage,\r\n field: ContractField,\r\n value: boolean,\r\n pageDim: PageDimension\r\n): void => {\r\n if (!value) return;\r\n\r\n const rawAbs = toAbsoluteRect(field, pageDim.width, pageDim.height);\r\n const side = Math.min(rawAbs.width, rawAbs.height);\r\n const abs = {\r\n ...rawAbs,\r\n x: rawAbs.x + (rawAbs.width - side) / 2,\r\n y: rawAbs.y + (rawAbs.height - side) / 2,\r\n width: side,\r\n height: side,\r\n };\r\n const bottom = pageDim.height - abs.y - side;\r\n const strokeWidth = Math.max(1.2, side * 0.11);\r\n\r\n page.drawLine({\r\n start: { x: abs.x + side * 0.22, y: bottom + side * 0.49 },\r\n end: { x: abs.x + side * 0.42, y: bottom + side * 0.31 },\r\n thickness: strokeWidth,\r\n color: rgb(0, 0, 0),\r\n });\r\n page.drawLine({\r\n start: { x: abs.x + side * 0.42, y: bottom + side * 0.31 },\r\n end: { x: abs.x + side * 0.78, y: bottom + side * 0.68 },\r\n thickness: strokeWidth,\r\n color: rgb(0, 0, 0),\r\n });\r\n};\r\n\r\nconst drawImageField = async (\r\n page: PDFPage,\r\n pdfDoc: PDFDocument,\r\n field: ContractField,\r\n imageData: Uint8Array,\r\n mimeType: string | undefined,\r\n pageDim: PageDimension\r\n): Promise<void> => {\r\n const abs = toAbsoluteRect(field, pageDim.width, pageDim.height);\r\n const y = pageDim.height - abs.y - abs.height;\r\n const normalizedMimeType = getNormalizedSignatureImageMimeType(\r\n mimeType !== undefined\r\n ? {\r\n type: 'signature',\r\n image: imageData,\r\n mimeType,\r\n }\r\n : {\r\n type: 'signature',\r\n image: imageData,\r\n }\r\n );\r\n\r\n if (normalizedMimeType === undefined) {\r\n throw new Error(\r\n `Field \"${field.id}\" contains an unsupported signature image format for PDF export.`\r\n );\r\n }\r\n\r\n const isJpeg =\r\n normalizedMimeType === 'image/jpeg';\r\n\r\n const embeddedImage = isJpeg\r\n ? await pdfDoc.embedJpg(imageData)\r\n : await pdfDoc.embedPng(imageData);\r\n\r\n page.drawImage(embeddedImage, {\r\n x: abs.x,\r\n y: Math.max(0, y),\r\n width: abs.width,\r\n height: abs.height,\r\n });\r\n};\r\n\r\nconst renderField = async (\r\n page: PDFPage,\r\n pdfDoc: PDFDocument,\r\n field: ContractField,\r\n value: ContractFieldValue | undefined,\r\n font: PDFFont,\r\n pageDim: PageDimension\r\n): Promise<void> => {\r\n if (value === undefined || field.hidden) return;\r\n\r\n if (isSignatureValue(value)) {\r\n await drawImageField(\r\n page,\r\n pdfDoc,\r\n field,\r\n value.image,\r\n value.mimeType,\r\n pageDim\r\n );\r\n return;\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n if (field.type === 'checkbox') {\r\n drawCheckboxField(page, field, value, pageDim);\r\n }\r\n return;\r\n }\r\n\r\n if (typeof value === 'string' && value.trim() !== '') {\r\n drawTextField(\r\n page,\r\n field,\r\n field.type === 'date' ? formatDateValue(value, field.dateFormat) : value,\r\n font,\r\n pageDim\r\n );\r\n return;\r\n }\r\n\r\n if (typeof value === 'number') {\r\n drawTextField(page, field, String(value), font, pageDim);\r\n }\r\n};\r\n\r\n/** Reserved for future export options (e.g. custom fonts). Field text currently uses embedded Helvetica. */\r\nexport type ExportOptions = Record<string, never>;\r\n\r\nconst assertSourcePdf = (pdfData: Uint8Array): void => {\r\n if (pdfData.byteLength > 0) return;\r\n\r\n throw new Error(\r\n 'exportToPdf requires a non-empty source PDF in document.pdfData.'\r\n );\r\n};\r\n\r\nexport const exportToPdf = async (\r\n document: ContractDocument,\r\n _options: ExportOptions = {}\r\n): Promise<Uint8Array> => {\r\n assertSourcePdf(document.pdfData);\r\n const pdfDoc = await PDFDocument.load(document.pdfData);\r\n const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\r\n\r\n const pages = pdfDoc.getPages();\r\n\r\n const fieldsByPage = new Map<number, ContractField[]>();\r\n for (const field of document.fields) {\r\n const pageFields = fieldsByPage.get(field.page) ?? [];\r\n fieldsByPage.set(field.page, [...pageFields, field]);\r\n }\r\n\r\n for (const [pageIndex, pageFields] of fieldsByPage) {\r\n const page = pages[pageIndex];\r\n if (!page) continue;\r\n\r\n const pageDim = getPageDimension(page);\r\n\r\n for (const field of pageFields) {\r\n const value = resolveFieldValue(\r\n field,\r\n document.fieldValues,\r\n document.sharedValues\r\n );\r\n const result = validateField(field, value);\r\n if (!result.valid) {\r\n throw new Error(\r\n `Field \"${field.id}\" is invalid for PDF export: ${result.errors[0]?.message ?? 'Unknown validation error.'}`\r\n );\r\n }\r\n await renderField(page, pdfDoc, field, value, font, pageDim);\r\n }\r\n }\r\n\r\n return pdfDoc.save();\r\n};\r\n"],"names":["isSignatureValue","v","isPrimitiveValue","isUint8Array","value","cloneContractFieldValue","ALLOWED_SIGNATURE_IMAGE_MIME_TYPES","normalizeSignatureImageMimeType","mimeType","normalized","detectSignatureImageMimeType","image","getNormalizedSignatureImageMimeType","detected","MIN_SIZE","COORD_MIN","COORD_MAX","clampToPage","pageCount","clampCoord","ensureMinSize","size","normalizeRect","rect","page","x","y","width","height","clampedWidth","clampedHeight","toAbsoluteRect","pageWidth","pageHeight","toNormalizedRect","abs","getSourceField","fields","sharedKey","f","getMirrorFields","resolveFieldValue","field","fieldValues","sharedValues","sharedValue","directValue","defaultValue","setSharedFieldValue","resolveAllSharedValues","resolved","fieldId","MAX_SIGNATURE_IMAGE_BYTES","makeError","message","code","_a","validateStringValue","errors","validation","validateNumberValue","numField","validateField","isEmpty","validateSharedFieldGroup","sourceField","validateDocument","document","processedSharedKeys","allErrors","result","FORMAT_TOKEN_CHARS","REGEX_SPECIAL_CHARS","escapeRegexChar","char","dateFormatToRegexPattern","format","pattern","index","tokenLength","matchesDateFormat","trimmedFormat","ISO_DATE_PATTERN","isIsoDateString","formatDateValue","match","year","month","day","formatted","assertAtMostOneSourcePerSharedKey","sourceIdByKey","prev","assertUniqueFieldId","isValueCompatibleWithField","matchesFieldOptions","options","normalizeFieldRect","candidate","side","createDocument","input","getPdfPageInfo","pdfData","PDFDocument","createDocumentFromPdfData","pages","createField","newField","updateField","patch","merged","removeField","id","key","moveField","position","resizeField","setFieldValue","clearFieldValue","_removed","getField","getFields","getResolvedFieldValue","getResolvedValues","getAlignedTextX","font","fontSize","maxTextWidth","textWidth","getPageDimension","drawTextField","pageDim","textY","textX","rgb","drawCheckboxField","rawAbs","bottom","strokeWidth","drawImageField","pdfDoc","imageData","normalizedMimeType","embeddedImage","renderField","assertSourcePdf","exportToPdf","_options","StandardFonts","fieldsByPage","pageFields","pageIndex"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/types/value.ts","../src/coordinates/index.ts","../src/shared/index.ts","../src/validation/index.ts","../src/format/date.ts","../src/operations/index.ts","../src/export/index.ts"],"sourcesContent":["export interface SignatureValue {\r\n readonly type: 'signature';\r\n readonly source?: 'draw' | 'stamp';\r\n readonly image: Uint8Array;\r\n readonly mimeType?: string;\r\n readonly width?: number;\r\n readonly height?: number;\r\n}\r\n\r\nexport type ContractFieldValue =\r\n | string\r\n | number\r\n | boolean\r\n | SignatureValue;\r\n\r\nexport type FieldValueMap = Record<string, ContractFieldValue>;\r\n\r\nexport type SharedValueMap = Record<string, ContractFieldValue>;\r\n\r\nexport const isSignatureValue = (v: unknown): v is SignatureValue =>\r\n typeof v === 'object' && v !== null && 'type' in v && v.type === 'signature';\r\n\r\nexport const isPrimitiveValue = (\r\n v: ContractFieldValue\r\n): v is string | number | boolean => typeof v !== 'object';\r\n\r\nexport const isUint8Array = (value: unknown): value is Uint8Array =>\r\n Object.prototype.toString.call(value) === '[object Uint8Array]';\r\n\r\nexport const cloneContractFieldValue = (\r\n value: ContractFieldValue\r\n): ContractFieldValue => {\r\n if (!isSignatureValue(value) || !isUint8Array(value.image)) return value;\r\n\r\n return {\r\n ...value,\r\n image: Uint8Array.from(value.image),\r\n };\r\n};\r\n\r\nexport const ALLOWED_SIGNATURE_IMAGE_MIME_TYPES = new Set([\r\n 'image/png',\r\n 'image/jpeg',\r\n 'image/jpg',\r\n]);\r\n\r\nexport const normalizeSignatureImageMimeType = (\r\n mimeType: string | undefined\r\n): string | undefined => {\r\n const normalized = mimeType?.trim().toLowerCase();\r\n if (!normalized) return undefined;\r\n if (!ALLOWED_SIGNATURE_IMAGE_MIME_TYPES.has(normalized)) return undefined;\r\n return normalized === 'image/jpg' ? 'image/jpeg' : normalized;\r\n};\r\n\r\nexport const detectSignatureImageMimeType = (\r\n image: Uint8Array\r\n): string | undefined => {\r\n if (\r\n image.length >= 8 &&\r\n image[0] === 0x89 &&\r\n image[1] === 0x50 &&\r\n image[2] === 0x4e &&\r\n image[3] === 0x47 &&\r\n image[4] === 0x0d &&\r\n image[5] === 0x0a &&\r\n image[6] === 0x1a &&\r\n image[7] === 0x0a\r\n ) {\r\n return 'image/png';\r\n }\r\n\r\n if (\r\n image.length >= 3 &&\r\n image[0] === 0xff &&\r\n image[1] === 0xd8 &&\r\n image[2] === 0xff\r\n ) {\r\n return 'image/jpeg';\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nexport const getNormalizedSignatureImageMimeType = (\r\n value: SignatureValue\r\n): string | undefined => {\r\n const detected = detectSignatureImageMimeType(value.image);\r\n const normalized = normalizeSignatureImageMimeType(value.mimeType);\r\n\r\n if (normalized && detected && normalized !== detected) {\r\n return undefined;\r\n }\r\n\r\n return normalized ?? detected;\r\n};\r\n","import type { NormalizedRect } from '../types';\r\n\r\nconst MIN_SIZE = 0.005;\r\nconst COORD_MIN = 0;\r\nconst COORD_MAX = 1;\r\n\r\nexport const clampToPage = (value: number, pageCount: number): number =>\r\n Math.max(0, Math.min(pageCount - 1, Math.floor(value)));\r\n\r\nexport const clampCoord = (value: number): number =>\r\n Math.max(COORD_MIN, Math.min(COORD_MAX, value));\r\n\r\nexport const ensureMinSize = (size: number): number =>\r\n Math.max(MIN_SIZE, size);\r\n\r\nexport const normalizeRect = (\r\n rect: NormalizedRect,\r\n pageCount: number\r\n): NormalizedRect => {\r\n const page = clampToPage(rect.page, pageCount);\r\n\r\n const x = clampCoord(rect.x);\r\n const y = clampCoord(rect.y);\r\n const width = ensureMinSize(rect.width);\r\n const height = ensureMinSize(rect.height);\r\n\r\n const clampedWidth = Math.min(width, COORD_MAX - x);\r\n const clampedHeight = Math.min(height, COORD_MAX - y);\r\n\r\n return {\r\n page,\r\n x,\r\n y,\r\n width: ensureMinSize(clampedWidth),\r\n height: ensureMinSize(clampedHeight),\r\n };\r\n};\r\n\r\nexport const toAbsoluteRect = (\r\n rect: NormalizedRect,\r\n pageWidth: number,\r\n pageHeight: number\r\n): { x: number; y: number; width: number; height: number } => ({\r\n x: rect.x * pageWidth,\r\n y: rect.y * pageHeight,\r\n width: rect.width * pageWidth,\r\n height: rect.height * pageHeight,\r\n});\r\n\r\nexport const toNormalizedRect = (\r\n abs: { page: number; x: number; y: number; width: number; height: number },\r\n pageWidth: number,\r\n pageHeight: number\r\n): NormalizedRect => ({\r\n page: abs.page,\r\n x: abs.x / pageWidth,\r\n y: abs.y / pageHeight,\r\n width: abs.width / pageWidth,\r\n height: abs.height / pageHeight,\r\n});\r\n","import type { ContractField } from '../types/field';\r\nimport type {\r\n ContractFieldValue,\r\n FieldValueMap,\r\n SharedValueMap,\r\n} from '../types/value';\r\nimport { cloneContractFieldValue } from '../types/value';\r\n\r\nexport const getSourceField = (\r\n fields: readonly ContractField[],\r\n sharedKey: string\r\n): ContractField | undefined =>\r\n fields.find((f) => f.sharedKey === sharedKey && f.sharedMode === 'source');\r\n\r\nexport const getMirrorFields = (\r\n fields: readonly ContractField[],\r\n sharedKey: string\r\n): readonly ContractField[] =>\r\n fields.filter((f) => f.sharedKey === sharedKey && f.sharedMode === 'mirror');\r\n\r\nexport const resolveFieldValue = (\r\n field: ContractField,\r\n fieldValues: FieldValueMap,\r\n sharedValues: SharedValueMap\r\n): ContractFieldValue | undefined => {\r\n if (field.sharedKey) {\r\n const sharedValue = sharedValues[field.sharedKey];\r\n if (sharedValue !== undefined) return cloneContractFieldValue(sharedValue);\r\n }\r\n\r\n const directValue = fieldValues[field.id];\r\n if (directValue !== undefined) return cloneContractFieldValue(directValue);\r\n\r\n const defaultValue = field.defaultValue as ContractFieldValue | undefined;\r\n return defaultValue !== undefined\r\n ? cloneContractFieldValue(defaultValue)\r\n : undefined;\r\n};\r\n\r\nexport const setSharedFieldValue = (\r\n fields: readonly ContractField[],\r\n sharedValues: SharedValueMap,\r\n sharedKey: string,\r\n value: ContractFieldValue\r\n): SharedValueMap => {\r\n const sourceExists = fields.some(\r\n (f) => f.sharedKey === sharedKey && f.sharedMode === 'source'\r\n );\r\n\r\n if (!sourceExists) {\r\n throw new Error(\r\n `Cannot set shared value: no source field exists for key \"${sharedKey}\".`\r\n );\r\n }\r\n\r\n return { ...sharedValues, [sharedKey]: cloneContractFieldValue(value) };\r\n};\r\n\r\nexport const resolveAllSharedValues = (\r\n fields: readonly ContractField[],\r\n fieldValues: FieldValueMap,\r\n sharedValues: SharedValueMap\r\n): FieldValueMap => {\r\n const resolved: Record<string, ContractFieldValue> = Object.fromEntries(\r\n Object.entries(fieldValues).map(([fieldId, value]) => [\r\n fieldId,\r\n cloneContractFieldValue(value),\r\n ])\r\n );\r\n\r\n for (const field of fields) {\r\n const value = resolveFieldValue(field, fieldValues, sharedValues);\r\n if (value !== undefined) {\r\n resolved[field.id] = value;\r\n }\r\n }\r\n\r\n return resolved;\r\n};\r\n","import type { ContractField, NumberField } from '../types/field';\r\nimport type {\r\n ContractFieldValue,\r\n FieldValueMap,\r\n SharedValueMap,\r\n} from '../types/value';\r\nimport type {\r\n FieldValidationError,\r\n ValidationResult,\r\n} from '../types/validation';\r\nimport type { ContractDocument } from '../types/document';\r\nimport {\r\n getNormalizedSignatureImageMimeType,\r\n isSignatureValue,\r\n isUint8Array,\r\n} from '../types/value';\r\nimport { resolveFieldValue } from '../shared';\r\n\r\nconst MAX_SIGNATURE_IMAGE_BYTES = 5 * 1024 * 1024;\r\n\r\nconst makeError = (\r\n field: ContractField,\r\n message: string,\r\n code: FieldValidationError['code']\r\n): FieldValidationError => ({\r\n fieldId: field.id,\r\n fieldName: field.name,\r\n message: field.validation?.customMessage ?? message,\r\n code,\r\n});\r\n\r\nconst validateStringValue = (\r\n field: ContractField,\r\n value: string\r\n): FieldValidationError[] => {\r\n const errors: FieldValidationError[] = [];\r\n const { validation } = field;\r\n if (!validation) return errors;\r\n\r\n if (validation.minLength !== undefined && value.length < validation.minLength) {\r\n errors.push(\r\n makeError(\r\n field,\r\n `Must be at least ${validation.minLength} characters.`,\r\n 'MIN_LENGTH'\r\n )\r\n );\r\n }\r\n\r\n if (validation.maxLength !== undefined && value.length > validation.maxLength) {\r\n errors.push(\r\n makeError(\r\n field,\r\n `Must be at most ${validation.maxLength} characters.`,\r\n 'MAX_LENGTH'\r\n )\r\n );\r\n }\r\n\r\n if (validation.pattern !== undefined) {\r\n try {\r\n const regex = new RegExp(validation.pattern);\r\n if (!regex.test(value)) {\r\n errors.push(\r\n makeError(\r\n field,\r\n 'The value does not match the required format.',\r\n 'PATTERN_MISMATCH'\r\n )\r\n );\r\n }\r\n } catch {\r\n errors.push(\r\n makeError(\r\n field,\r\n 'The field validation pattern is invalid.',\r\n 'PATTERN_MISMATCH'\r\n )\r\n );\r\n }\r\n }\r\n\r\n return errors;\r\n};\r\n\r\nconst validateNumberValue = (\r\n field: ContractField,\r\n value: number\r\n): FieldValidationError[] => {\r\n const errors: FieldValidationError[] = [];\r\n const numField = field as NumberField;\r\n\r\n if (numField.min !== undefined && value < numField.min) {\r\n errors.push(\r\n makeError(field, `Minimum value is ${numField.min}.`, 'MIN_VALUE')\r\n );\r\n }\r\n\r\n if (numField.max !== undefined && value > numField.max) {\r\n errors.push(\r\n makeError(field, `Maximum value is ${numField.max}.`, 'MAX_VALUE')\r\n );\r\n }\r\n\r\n return errors;\r\n};\r\n\r\nexport const validateField = (\r\n field: ContractField,\r\n value: ContractFieldValue | undefined\r\n): ValidationResult => {\r\n if (field.sharedMode === 'mirror') {\r\n return { valid: true, errors: [] };\r\n }\r\n\r\n const errors: FieldValidationError[] = [];\r\n\r\n const isEmpty =\r\n value === undefined ||\r\n value === '' ||\r\n value === null ||\r\n (typeof value === 'boolean' && !value && field.type !== 'checkbox');\r\n\r\n if (field.required && isEmpty) {\r\n errors.push(makeError(field, 'This field is required.', 'REQUIRED'));\r\n return { valid: false, errors };\r\n }\r\n\r\n if (value === undefined || value === '') {\r\n return { valid: true, errors: [] };\r\n }\r\n\r\n if (\r\n (field.type === 'checkbox' && typeof value !== 'boolean') ||\r\n (field.type === 'number' &&\r\n (typeof value !== 'number' || !Number.isFinite(value))) ||\r\n (field.type === 'signature' && !isSignatureValue(value)) ||\r\n (field.type !== 'checkbox' &&\r\n field.type !== 'number' &&\r\n field.type !== 'signature' &&\r\n typeof value !== 'string')\r\n ) {\r\n errors.push(makeError(field, 'The value type is invalid for this field.', 'INVALID_TYPE'));\r\n return { valid: false, errors };\r\n }\r\n\r\n if (typeof value === 'string') {\r\n errors.push(...validateStringValue(field, value));\r\n } else if (typeof value === 'number') {\r\n errors.push(...validateNumberValue(field, value));\r\n } else if (isSignatureValue(value)) {\r\n if (!isUint8Array(value.image) || value.image.length === 0) {\r\n errors.push(makeError(field, 'Image data is invalid.', 'INVALID_TYPE'));\r\n return { valid: false, errors };\r\n }\r\n if (value.image.length > MAX_SIGNATURE_IMAGE_BYTES) {\r\n errors.push(\r\n makeError(\r\n field,\r\n `Image data must be ${Math.floor(MAX_SIGNATURE_IMAGE_BYTES / (1024 * 1024))} MB or smaller.`,\r\n 'INVALID_TYPE'\r\n )\r\n );\r\n }\r\n if (getNormalizedSignatureImageMimeType(value) === undefined) {\r\n errors.push(\r\n makeError(\r\n field,\r\n 'Only PNG and JPEG signature images are allowed, and MIME type must match the image data.',\r\n 'INVALID_TYPE'\r\n )\r\n );\r\n }\r\n }\r\n\r\n return { valid: errors.length === 0, errors };\r\n};\r\n\r\nexport const validateSharedFieldGroup = (\r\n fields: readonly ContractField[],\r\n fieldValues: FieldValueMap,\r\n sharedValues: SharedValueMap,\r\n sharedKey: string\r\n): ValidationResult => {\r\n const groupFields = fields.filter((f) => f.sharedKey === sharedKey);\r\n const sourceField = groupFields.find((f) => f.sharedMode === 'source');\r\n\r\n if (!sourceField) {\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n fieldId: sharedKey,\r\n fieldName: sharedKey,\r\n message: `No source field found for shared key \"${sharedKey}\".`,\r\n code: 'SHARED_SOURCE_NOT_FOUND',\r\n },\r\n ],\r\n };\r\n }\r\n\r\n const value = resolveFieldValue(sourceField, fieldValues, sharedValues);\r\n return validateField(sourceField, value);\r\n};\r\n\r\nexport const validateDocument = (\r\n document: ContractDocument\r\n): ValidationResult => {\r\n const { fields, fieldValues, sharedValues } = document;\r\n\r\n const processedSharedKeys = new Set<string>();\r\n const allErrors: FieldValidationError[] = [];\r\n\r\n for (const field of fields) {\r\n if (field.sharedMode === 'mirror') continue;\r\n\r\n if (field.sharedKey) {\r\n if (processedSharedKeys.has(field.sharedKey)) continue;\r\n processedSharedKeys.add(field.sharedKey);\r\n\r\n const result = validateSharedFieldGroup(\r\n fields,\r\n fieldValues,\r\n sharedValues,\r\n field.sharedKey\r\n );\r\n allErrors.push(...result.errors);\r\n } else {\r\n const value = resolveFieldValue(field, fieldValues, sharedValues);\r\n const result = validateField(field, value);\r\n allErrors.push(...result.errors);\r\n }\r\n }\r\n\r\n return { valid: allErrors.length === 0, errors: allErrors };\r\n};\r\n","const FORMAT_TOKEN_CHARS = new Set(['y', 'Y', 'M', 'm', 'd', 'D', 'h', 'H', 's', 'S']);\r\nconst REGEX_SPECIAL_CHARS = new Set(['\\\\', '^', '$', '.', '*', '+', '?', '(', ')', '[', ']', '{', '}', '|']);\r\n\r\nconst escapeRegexChar = (char: string): string =>\r\n REGEX_SPECIAL_CHARS.has(char) ? `\\\\${char}` : char;\r\n\r\nexport const dateFormatToRegexPattern = (format: string): string => {\r\n let pattern = '';\r\n\r\n for (let index = 0; index < format.length;) {\r\n const char = format[index];\r\n if (char === undefined) break;\r\n\r\n if (FORMAT_TOKEN_CHARS.has(char)) {\r\n let tokenLength = 1;\r\n while (format[index + tokenLength] === char) {\r\n tokenLength += 1;\r\n }\r\n pattern += `\\\\d{${tokenLength}}`;\r\n index += tokenLength;\r\n continue;\r\n }\r\n\r\n pattern += escapeRegexChar(char);\r\n index += 1;\r\n }\r\n\r\n return pattern;\r\n};\r\n\r\nexport const matchesDateFormat = (format: string, value: string): boolean => {\r\n const trimmedFormat = format.trim();\r\n if (!trimmedFormat) return true;\r\n\r\n return new RegExp(`^(?:${dateFormatToRegexPattern(trimmedFormat)})$`).test(value);\r\n};\r\n\r\nconst ISO_DATE_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\r\n\r\nexport const isIsoDateString = (value: string): boolean =>\r\n ISO_DATE_PATTERN.test(value);\r\n\r\nexport const formatDateValue = (\r\n value: string,\r\n format: string | undefined\r\n): string => {\r\n const match = ISO_DATE_PATTERN.exec(value);\r\n const trimmedFormat = format?.trim();\r\n if (!match || !trimmedFormat) return value;\r\n\r\n const [, year = '', month = '', day = ''] = match;\r\n\r\n let formatted = '';\r\n for (let index = 0; index < trimmedFormat.length;) {\r\n const char = trimmedFormat[index];\r\n if (char === undefined) break;\r\n\r\n let tokenLength = 1;\r\n while (trimmedFormat[index + tokenLength] === char) {\r\n tokenLength += 1;\r\n }\r\n\r\n if (char === 'y' || char === 'Y') {\r\n formatted += tokenLength === 2 ? year.slice(-2) : year.padStart(tokenLength, '0');\r\n index += tokenLength;\r\n continue;\r\n }\r\n\r\n if (char === 'M' || char === 'm') {\r\n formatted += tokenLength === 1 ? String(Number(month)) : month.padStart(tokenLength, '0');\r\n index += tokenLength;\r\n continue;\r\n }\r\n\r\n if (char === 'd' || char === 'D') {\r\n formatted += tokenLength === 1 ? String(Number(day)) : day.padStart(tokenLength, '0');\r\n index += tokenLength;\r\n continue;\r\n }\r\n\r\n formatted += char;\r\n index += 1;\r\n }\r\n\r\n return formatted;\r\n};\r\n","import type {\r\n ContractField,\r\n ContractFieldType,\r\n SharedMode,\r\n} from '../types/field';\r\nimport type {\r\n ContractFieldValue,\r\n FieldValueMap,\r\n SharedValueMap,\r\n} from '../types/value';\r\nimport {\r\n cloneContractFieldValue,\r\n isSignatureValue,\r\n isUint8Array,\r\n} from '../types/value';\r\nimport { PDFDocument } from 'pdf-lib';\r\nimport type {\r\n ContractDocument,\r\n CreateDocumentFromPdfDataInput,\r\n CreateDocumentInput,\r\n PageInfo,\r\n} from '../types/document';\r\nimport { normalizeRect } from '../coordinates';\r\nimport { resolveFieldValue, setSharedFieldValue } from '../shared';\r\n\r\nconst assertAtMostOneSourcePerSharedKey = (\r\n fields: readonly ContractField[]\r\n): void => {\r\n const sourceIdByKey = new Map<string, string>();\r\n for (const f of fields) {\r\n if (!f.sharedKey || f.sharedMode !== 'source') continue;\r\n const prev = sourceIdByKey.get(f.sharedKey);\r\n if (prev !== undefined) {\r\n throw new Error(\r\n `Shared key \"${f.sharedKey}\" allows only one source field. (Conflict: \"${prev}\" vs \"${f.id}\")`\r\n );\r\n }\r\n sourceIdByKey.set(f.sharedKey, f.id);\r\n }\r\n};\r\n\r\nconst assertUniqueFieldId = (\r\n fields: readonly ContractField[],\r\n fieldId: string\r\n): void => {\r\n if (!fields.some((field) => field.id === fieldId)) return;\r\n\r\n throw new Error(`Field ID \"${fieldId}\" already exists.`);\r\n};\r\n\r\nconst isValueCompatibleWithField = (\r\n field: ContractField,\r\n value: ContractFieldValue\r\n): boolean => {\r\n switch (field.type) {\r\n case 'checkbox':\r\n return typeof value === 'boolean';\r\n case 'number':\r\n return typeof value === 'number' && Number.isFinite(value);\r\n case 'signature':\r\n return isSignatureValue(value) && isUint8Array(value.image);\r\n case 'text':\r\n case 'date':\r\n case 'email':\r\n case 'phone':\r\n case 'textarea':\r\n return typeof value === 'string';\r\n default:\r\n return false;\r\n }\r\n};\r\n\r\nexport interface GetFieldsOptions {\r\n readonly page?: number;\r\n readonly type?: ContractFieldType;\r\n readonly required?: boolean;\r\n readonly hidden?: boolean;\r\n readonly readonly?: boolean;\r\n readonly disabled?: boolean;\r\n readonly sharedKey?: string;\r\n readonly sharedMode?: SharedMode;\r\n}\r\n\r\nexport interface GetResolvedValuesOptions {\r\n readonly includeEmpty?: boolean;\r\n}\r\n\r\nexport type ResolvedFieldValueMap = Record<\r\n string,\r\n ContractFieldValue | undefined\r\n>;\r\n\r\nconst matchesFieldOptions = (\r\n field: ContractField,\r\n options: GetFieldsOptions\r\n): boolean => {\r\n if (options.page !== undefined && field.page !== options.page) return false;\r\n if (options.type !== undefined && field.type !== options.type) return false;\r\n if (\r\n options.required !== undefined &&\r\n (field.required ?? false) !== options.required\r\n ) {\r\n return false;\r\n }\r\n if (\r\n options.hidden !== undefined &&\r\n (field.hidden ?? false) !== options.hidden\r\n ) {\r\n return false;\r\n }\r\n if (\r\n options.readonly !== undefined &&\r\n (field.readonly ?? false) !== options.readonly\r\n ) {\r\n return false;\r\n }\r\n if (\r\n options.disabled !== undefined &&\r\n (field.disabled ?? false) !== options.disabled\r\n ) {\r\n return false;\r\n }\r\n if (\r\n options.sharedKey !== undefined &&\r\n field.sharedKey !== options.sharedKey\r\n ) {\r\n return false;\r\n }\r\n if (\r\n options.sharedMode !== undefined &&\r\n field.sharedMode !== options.sharedMode\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst normalizeFieldRect = (\n field: ContractField,\n document: ContractDocument\n): ReturnType<typeof normalizeRect> => {\n const normalized = normalizeRect(field, document.pageCount);\n const shouldKeepSquare =\n field.type === 'checkbox' ||\n (field.type === 'signature' && field.signatureMode === 'stamp-only');\n if (!shouldKeepSquare) return normalized;\n\n const page = document.pages.find((candidate) => candidate.index === normalized.page);\n if (!page || page.width <= 0 || page.height <= 0) {\n const side = Math.min(normalized.width, normalized.height);\r\n return normalizeRect({ ...normalized, width: side, height: side }, document.pageCount);\r\n }\r\n\r\n const side = Math.min(\r\n normalized.width * page.width,\r\n normalized.height * page.height\r\n );\r\n\r\n return normalizeRect(\r\n {\r\n ...normalized,\r\n width: side / page.width,\r\n height: side / page.height,\r\n },\r\n document.pageCount\r\n );\r\n};\r\n\r\nexport const createDocument = (input: CreateDocumentInput): ContractDocument => ({\r\n ...input,\r\n fields: [],\r\n fieldValues: {},\r\n sharedValues: {},\r\n createdAt: new Date().toISOString(),\r\n updatedAt: new Date().toISOString(),\r\n});\r\n\r\nexport const getPdfPageInfo = async (\r\n pdfData: Uint8Array\r\n): Promise<readonly PageInfo[]> => {\r\n const pdf = await PDFDocument.load(pdfData);\r\n return pdf.getPages().map((page, index) => ({\r\n index,\r\n width: page.getWidth(),\r\n height: page.getHeight(),\r\n }));\r\n};\r\n\r\nexport const createDocumentFromPdfData = async (\r\n input: CreateDocumentFromPdfDataInput\r\n): Promise<ContractDocument> => {\r\n const pages = await getPdfPageInfo(input.pdfData);\r\n return createDocument({\r\n ...input,\r\n pageCount: pages.length,\r\n pages,\r\n });\r\n};\r\n\r\nexport const createField = (\r\n document: ContractDocument,\r\n field: ContractField\r\n): ContractDocument => {\r\n assertUniqueFieldId(document.fields, field.id);\r\n const normalized = normalizeFieldRect(field, document);\r\n const newField: ContractField = { ...field, ...normalized };\r\n\r\n const fields = [...document.fields, newField];\r\n assertAtMostOneSourcePerSharedKey(fields);\r\n\r\n return {\r\n ...document,\r\n fields,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n};\r\n\r\nexport const updateField = (\r\n document: ContractDocument,\r\n fieldId: string,\r\n patch: Partial<Omit<ContractField, 'id' | 'type'>>\r\n): ContractDocument => {\r\n const fields = document.fields.map((f) => {\r\n if (f.id !== fieldId) return f;\r\n\r\n const merged = { ...f, ...patch };\r\n const normalized = normalizeFieldRect(merged, document);\r\n return { ...merged, ...normalized } as ContractField;\r\n });\r\n\r\n assertAtMostOneSourcePerSharedKey(fields);\r\n\r\n return {\r\n ...document,\r\n fields,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n};\r\n\r\nexport const removeField = (\r\n document: ContractDocument,\r\n fieldId: string\r\n): ContractDocument => {\r\n const field = document.fields.find((f) => f.id === fieldId);\r\n\r\n const fields = document.fields.filter((f) => f.id !== fieldId);\r\n\r\n const fieldValues = Object.fromEntries(\r\n Object.entries(document.fieldValues).filter(([id]) => id !== fieldId)\r\n );\r\n\r\n let { sharedValues } = document;\r\n\r\n if (field?.sharedKey && field.sharedMode === 'source') {\r\n const hasOtherSource = fields.some(\r\n (f) => f.sharedKey === field.sharedKey && f.sharedMode === 'source'\r\n );\r\n if (!hasOtherSource) {\r\n sharedValues = Object.fromEntries(\r\n Object.entries(sharedValues).filter(([key]) => key !== field.sharedKey)\r\n );\r\n }\r\n }\r\n\r\n return {\r\n ...document,\r\n fields,\r\n fieldValues,\r\n sharedValues,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n};\r\n\r\nexport const moveField = (\r\n document: ContractDocument,\r\n fieldId: string,\r\n position: { page?: number; x: number; y: number }\r\n): ContractDocument => {\r\n const { page, x, y } = position;\r\n return updateField(\r\n document,\r\n fieldId,\r\n page !== undefined ? { page, x, y } : { x, y }\r\n );\r\n};\r\n\r\nexport const resizeField = (\r\n document: ContractDocument,\r\n fieldId: string,\r\n size: { width: number; height: number }\r\n): ContractDocument =>\r\n updateField(document, fieldId, {\r\n width: size.width,\r\n height: size.height,\r\n });\r\n\r\nexport const setFieldValue = (\r\n document: ContractDocument,\r\n fieldId: string,\r\n value: ContractFieldValue\r\n): ContractDocument => {\r\n const field = document.fields.find((f) => f.id === fieldId);\r\n\r\n if (!field) {\r\n throw new Error(`Field ID \"${fieldId}\" was not found.`);\r\n }\r\n\r\n if (field.sharedMode === 'mirror') {\r\n throw new Error(\r\n `Cannot set value on mirror field \"${fieldId}\". Set the value on the source field instead.`\r\n );\r\n }\r\n\r\n if (field.readonly) {\r\n throw new Error(`Cannot set value on read-only field \"${fieldId}\".`);\r\n }\r\n\r\n if (!isValueCompatibleWithField(field, value)) {\r\n throw new Error(\r\n `Value for field \"${fieldId}\" is incompatible with field type \"${field.type}\".`\r\n );\r\n }\r\n\r\n if (field.sharedKey && field.sharedMode === 'source') {\r\n const sharedValues = setSharedFieldValue(\r\n document.fields,\r\n document.sharedValues,\r\n field.sharedKey,\r\n value\r\n );\r\n return {\r\n ...document,\r\n sharedValues,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n }\r\n\r\n return {\r\n ...document,\r\n fieldValues: {\r\n ...document.fieldValues,\r\n [fieldId]: cloneContractFieldValue(value),\r\n },\r\n updatedAt: new Date().toISOString(),\r\n };\r\n};\r\n\r\nexport const clearFieldValue = (\r\n document: ContractDocument,\r\n fieldId: string\r\n): ContractDocument => {\r\n const field = document.fields.find((f) => f.id === fieldId);\r\n\r\n if (!field) {\r\n throw new Error(`Field ID \"${fieldId}\" was not found.`);\r\n }\r\n\r\n if (field.sharedMode === 'mirror') {\r\n throw new Error(\r\n `Cannot clear value on mirror field \"${fieldId}\". Clear the source field instead.`\r\n );\r\n }\r\n\r\n if (field.readonly) {\r\n throw new Error(`Cannot clear value on read-only field \"${fieldId}\".`);\r\n }\r\n\r\n if (field.sharedKey && field.sharedMode === 'source') {\r\n const { [field.sharedKey]: _removed, ...sharedValues } = document.sharedValues;\r\n return {\r\n ...document,\r\n sharedValues,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n }\r\n\r\n const { [fieldId]: _removed, ...fieldValues } = document.fieldValues;\r\n return {\r\n ...document,\r\n fieldValues,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n};\r\n\r\nexport const getField = (\r\n document: ContractDocument,\r\n fieldId: string\r\n): ContractField | undefined => {\r\n const field = document.fields.find((f) => f.id === fieldId);\r\n return field ? { ...field } : undefined;\r\n};\r\n\r\nexport const getFields = (\r\n document: ContractDocument,\r\n options: GetFieldsOptions = {}\r\n): readonly ContractField[] =>\r\n document.fields\r\n .filter((field) => matchesFieldOptions(field, options))\r\n .map((field) => ({ ...field }));\r\n\r\nexport const getResolvedFieldValue = (\r\n document: ContractDocument,\r\n fieldId: string\r\n): ContractFieldValue | undefined => {\r\n const field = document.fields.find((f) => f.id === fieldId);\r\n if (!field) return undefined;\r\n\r\n return resolveFieldValue(field, document.fieldValues, document.sharedValues);\r\n};\r\n\r\nexport function getResolvedValues(document: ContractDocument): FieldValueMap;\r\nexport function getResolvedValues(\r\n document: ContractDocument,\r\n options: GetResolvedValuesOptions & { readonly includeEmpty: true }\r\n): ResolvedFieldValueMap;\r\nexport function getResolvedValues(\r\n document: ContractDocument,\r\n options: GetResolvedValuesOptions\r\n): FieldValueMap | ResolvedFieldValueMap;\r\nexport function getResolvedValues(\r\n document: ContractDocument,\r\n options: GetResolvedValuesOptions = {}\r\n): FieldValueMap | ResolvedFieldValueMap {\r\n const resolved: ResolvedFieldValueMap = {};\r\n\r\n for (const field of document.fields) {\r\n const value = resolveFieldValue(\r\n field,\r\n document.fieldValues,\r\n document.sharedValues\r\n );\r\n if (value !== undefined || options.includeEmpty) {\r\n resolved[field.id] = value;\r\n }\r\n }\r\n\r\n return resolved;\r\n}\r\n\r\nexport type { ContractDocument, FieldValueMap, SharedValueMap };\r\n","import {\r\n PDFDocument,\r\n PDFPage,\r\n StandardFonts,\r\n rgb,\r\n type PDFFont,\r\n} from 'pdf-lib';\r\nimport type { ContractDocument } from '../types/document';\r\nimport type { ContractField } from '../types/field';\r\nimport type { ContractFieldValue } from '../types/value';\r\nimport {\r\n getNormalizedSignatureImageMimeType,\r\n isSignatureValue,\r\n} from '../types/value';\r\nimport { resolveFieldValue } from '../shared';\r\nimport { toAbsoluteRect } from '../coordinates';\r\nimport { formatDateValue } from '../format';\r\nimport { validateField } from '../validation';\r\n\r\ninterface PageDimension {\r\n readonly width: number;\r\n readonly height: number;\r\n}\r\n\r\nconst getAlignedTextX = (\r\n field: ContractField,\r\n value: string,\r\n font: PDFFont,\r\n fontSize: number,\r\n x: number,\r\n width: number\r\n): number => {\r\n const padding = 2;\r\n const maxTextWidth = Math.max(0, width - padding * 2);\r\n const textWidth = Math.min(font.widthOfTextAtSize(value, fontSize), maxTextWidth);\r\n\r\n switch (field.textAlign) {\r\n case 'center':\r\n return x + (width - textWidth) / 2;\r\n case 'right':\r\n return x + width - padding - textWidth;\r\n case 'left':\r\n default:\r\n return x + padding;\r\n }\r\n};\r\n\r\nconst getPageDimension = (page: PDFPage): PageDimension => ({\r\n width: page.getWidth(),\r\n height: page.getHeight(),\r\n});\r\n\r\nconst drawTextField = (\r\n page: PDFPage,\r\n field: ContractField,\r\n value: string,\r\n font: PDFFont,\r\n pageDim: PageDimension\r\n): void => {\r\n const abs = toAbsoluteRect(field, pageDim.width, pageDim.height);\r\n const fontSize = field.textSize ?? 10;\r\n const textY = pageDim.height - abs.y - abs.height / 2 - fontSize / 2;\r\n const textX = getAlignedTextX(field, value, font, fontSize, abs.x, abs.width);\r\n\r\n page.drawText(value, {\r\n x: textX,\r\n y: Math.max(0, textY),\r\n size: fontSize,\r\n font,\r\n color: rgb(0, 0, 0),\r\n maxWidth: abs.width - 4,\r\n });\r\n};\r\n\r\nconst drawCheckboxField = (\r\n page: PDFPage,\r\n field: ContractField,\r\n value: boolean,\r\n pageDim: PageDimension\r\n): void => {\r\n if (!value) return;\r\n\r\n const rawAbs = toAbsoluteRect(field, pageDim.width, pageDim.height);\r\n const side = Math.min(rawAbs.width, rawAbs.height);\r\n const abs = {\r\n ...rawAbs,\r\n x: rawAbs.x + (rawAbs.width - side) / 2,\r\n y: rawAbs.y + (rawAbs.height - side) / 2,\r\n width: side,\r\n height: side,\r\n };\r\n const bottom = pageDim.height - abs.y - side;\r\n const strokeWidth = Math.max(1.2, side * 0.11);\r\n\r\n page.drawLine({\r\n start: { x: abs.x + side * 0.22, y: bottom + side * 0.49 },\r\n end: { x: abs.x + side * 0.42, y: bottom + side * 0.31 },\r\n thickness: strokeWidth,\r\n color: rgb(0, 0, 0),\r\n });\r\n page.drawLine({\r\n start: { x: abs.x + side * 0.42, y: bottom + side * 0.31 },\r\n end: { x: abs.x + side * 0.78, y: bottom + side * 0.68 },\r\n thickness: strokeWidth,\r\n color: rgb(0, 0, 0),\r\n });\r\n};\r\n\r\nconst drawImageField = async (\r\n page: PDFPage,\r\n pdfDoc: PDFDocument,\r\n field: ContractField,\r\n imageData: Uint8Array,\r\n mimeType: string | undefined,\r\n pageDim: PageDimension\r\n): Promise<void> => {\r\n const abs = toAbsoluteRect(field, pageDim.width, pageDim.height);\r\n const y = pageDim.height - abs.y - abs.height;\r\n const normalizedMimeType = getNormalizedSignatureImageMimeType(\r\n mimeType !== undefined\r\n ? {\r\n type: 'signature',\r\n image: imageData,\r\n mimeType,\r\n }\r\n : {\r\n type: 'signature',\r\n image: imageData,\r\n }\r\n );\r\n\r\n if (normalizedMimeType === undefined) {\r\n throw new Error(\r\n `Field \"${field.id}\" contains an unsupported signature image format for PDF export.`\r\n );\r\n }\r\n\r\n const isJpeg =\r\n normalizedMimeType === 'image/jpeg';\r\n\r\n const embeddedImage = isJpeg\r\n ? await pdfDoc.embedJpg(imageData)\r\n : await pdfDoc.embedPng(imageData);\r\n\r\n page.drawImage(embeddedImage, {\r\n x: abs.x,\r\n y: Math.max(0, y),\r\n width: abs.width,\r\n height: abs.height,\r\n });\r\n};\r\n\r\nconst renderField = async (\r\n page: PDFPage,\r\n pdfDoc: PDFDocument,\r\n field: ContractField,\r\n value: ContractFieldValue | undefined,\r\n font: PDFFont,\r\n pageDim: PageDimension\r\n): Promise<void> => {\r\n if (value === undefined || field.hidden) return;\r\n\r\n if (isSignatureValue(value)) {\r\n await drawImageField(\r\n page,\r\n pdfDoc,\r\n field,\r\n value.image,\r\n value.mimeType,\r\n pageDim\r\n );\r\n return;\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n if (field.type === 'checkbox') {\r\n drawCheckboxField(page, field, value, pageDim);\r\n }\r\n return;\r\n }\r\n\r\n if (typeof value === 'string' && value.trim() !== '') {\r\n drawTextField(\r\n page,\r\n field,\r\n field.type === 'date' ? formatDateValue(value, field.dateFormat) : value,\r\n font,\r\n pageDim\r\n );\r\n return;\r\n }\r\n\r\n if (typeof value === 'number') {\r\n drawTextField(page, field, String(value), font, pageDim);\r\n }\r\n};\r\n\r\n/** Reserved for future export options (e.g. custom fonts). Field text currently uses embedded Helvetica. */\r\nexport type ExportOptions = Record<string, never>;\r\n\r\nconst assertSourcePdf = (pdfData: Uint8Array): void => {\r\n if (pdfData.byteLength > 0) return;\r\n\r\n throw new Error(\r\n 'exportToPdf requires a non-empty source PDF in document.pdfData.'\r\n );\r\n};\r\n\r\nexport const exportToPdf = async (\r\n document: ContractDocument,\r\n _options: ExportOptions = {}\r\n): Promise<Uint8Array> => {\r\n assertSourcePdf(document.pdfData);\r\n const pdfDoc = await PDFDocument.load(document.pdfData);\r\n const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\r\n\r\n const pages = pdfDoc.getPages();\r\n\r\n const fieldsByPage = new Map<number, ContractField[]>();\r\n for (const field of document.fields) {\r\n const pageFields = fieldsByPage.get(field.page) ?? [];\r\n fieldsByPage.set(field.page, [...pageFields, field]);\r\n }\r\n\r\n for (const [pageIndex, pageFields] of fieldsByPage) {\r\n const page = pages[pageIndex];\r\n if (!page) continue;\r\n\r\n const pageDim = getPageDimension(page);\r\n\r\n for (const field of pageFields) {\r\n const value = resolveFieldValue(\r\n field,\r\n document.fieldValues,\r\n document.sharedValues\r\n );\r\n const result = validateField(field, value);\r\n if (!result.valid) {\r\n throw new Error(\r\n `Field \"${field.id}\" is invalid for PDF export: ${result.errors[0]?.message ?? 'Unknown validation error.'}`\r\n );\r\n }\r\n await renderField(page, pdfDoc, field, value, font, pageDim);\r\n }\r\n }\r\n\r\n return pdfDoc.save();\r\n};\r\n"],"names":["isSignatureValue","v","isPrimitiveValue","isUint8Array","value","cloneContractFieldValue","ALLOWED_SIGNATURE_IMAGE_MIME_TYPES","normalizeSignatureImageMimeType","mimeType","normalized","detectSignatureImageMimeType","image","getNormalizedSignatureImageMimeType","detected","MIN_SIZE","COORD_MIN","COORD_MAX","clampToPage","pageCount","clampCoord","ensureMinSize","size","normalizeRect","rect","page","x","y","width","height","clampedWidth","clampedHeight","toAbsoluteRect","pageWidth","pageHeight","toNormalizedRect","abs","getSourceField","fields","sharedKey","f","getMirrorFields","resolveFieldValue","field","fieldValues","sharedValues","sharedValue","directValue","defaultValue","setSharedFieldValue","resolveAllSharedValues","resolved","fieldId","MAX_SIGNATURE_IMAGE_BYTES","makeError","message","code","_a","validateStringValue","errors","validation","validateNumberValue","numField","validateField","isEmpty","validateSharedFieldGroup","sourceField","validateDocument","document","processedSharedKeys","allErrors","result","FORMAT_TOKEN_CHARS","REGEX_SPECIAL_CHARS","escapeRegexChar","char","dateFormatToRegexPattern","format","pattern","index","tokenLength","matchesDateFormat","trimmedFormat","ISO_DATE_PATTERN","isIsoDateString","formatDateValue","match","year","month","day","formatted","assertAtMostOneSourcePerSharedKey","sourceIdByKey","prev","assertUniqueFieldId","isValueCompatibleWithField","matchesFieldOptions","options","normalizeFieldRect","candidate","side","createDocument","input","getPdfPageInfo","pdfData","PDFDocument","createDocumentFromPdfData","pages","createField","newField","updateField","patch","merged","removeField","id","key","moveField","position","resizeField","setFieldValue","clearFieldValue","_removed","getField","getFields","getResolvedFieldValue","getResolvedValues","getAlignedTextX","font","fontSize","maxTextWidth","textWidth","getPageDimension","drawTextField","pageDim","textY","textX","rgb","drawCheckboxField","rawAbs","bottom","strokeWidth","drawImageField","pdfDoc","imageData","normalizedMimeType","embeddedImage","renderField","assertSourcePdf","exportToPdf","_options","StandardFonts","fieldsByPage","pageFields","pageIndex"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/operations/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/operations/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promr-acorda/core",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Framework-agnostic electronic contract document engine",
5
5
  "license": "MIT",
6
6
  "keywords": [