@promr-acorda/core 0.1.1 → 0.3.0

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.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("pdf-lib"),m=e=>typeof e=="object"&&e!==null&&"type"in e&&e.type==="signature",z=e=>typeof e!="object",E=e=>Object.prototype.toString.call(e)==="[object Uint8Array]",g=e=>!m(e)||!E(e.image)?e:{...e,image:Uint8Array.from(e.image)},k=new Set(["image/png","image/jpeg","image/jpg"]),j=e=>{const t=e==null?void 0:e.trim().toLowerCase();if(t&&k.has(t))return t==="image/jpg"?"image/jpeg":t},U=e=>{if(e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10)return"image/png";if(e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255)return"image/jpeg"},D=e=>{const t=U(e.image),r=j(e.mimeType);if(!(r&&t&&r!==t))return r??t},G=.005,H=0,F=1,T=(e,t)=>Math.max(0,Math.min(t-1,Math.floor(e))),M=e=>Math.max(H,Math.min(F,e)),p=e=>Math.max(G,e),w=(e,t)=>{const r=T(e.page,t),s=M(e.x),i=M(e.y),n=p(e.width),o=p(e.height),a=Math.min(n,F-s),d=Math.min(o,F-i);return{page:r,x:s,y:i,width:p(a),height:p(d)}},x=(e,t,r)=>({x:e.x*t,y:e.y*r,width:e.width*t,height:e.height*r}),q=(e,t,r)=>({page:e.page,x:e.x/t,y:e.y/r,width:e.width/t,height:e.height/r}),Y=(e,t)=>e.find(r=>r.sharedKey===t&&r.sharedMode==="source"),W=(e,t)=>e.filter(r=>r.sharedKey===t&&r.sharedMode==="mirror"),u=(e,t,r)=>{if(e.sharedKey){const n=r[e.sharedKey];if(n!==void 0)return g(n)}const s=t[e.id];if(s!==void 0)return g(s);const i=e.defaultValue;return i!==void 0?g(i):void 0},P=(e,t,r,s)=>{if(!e.some(n=>n.sharedKey===r&&n.sharedMode==="source"))throw new Error(`Cannot set shared value: no source field exists for key "${r}".`);return{...t,[r]:g(s)}},X=(e,t,r)=>{const s=Object.fromEntries(Object.entries(t).map(([i,n])=>[i,g(n)]));for(const i of e){const n=u(i,t,r);n!==void 0&&(s[i.id]=n)}return s},v=5*1024*1024,l=(e,t,r)=>{var s;return{fieldId:e.id,fieldName:e.name,message:((s=e.validation)==null?void 0:s.customMessage)??t,code:r}},B=(e,t)=>{const r=[],{validation:s}=e;if(!s)return r;if(s.minLength!==void 0&&t.length<s.minLength&&r.push(l(e,`Must be at least ${s.minLength} characters.`,"MIN_LENGTH")),s.maxLength!==void 0&&t.length>s.maxLength&&r.push(l(e,`Must be at most ${s.maxLength} characters.`,"MAX_LENGTH")),s.pattern!==void 0)try{new RegExp(s.pattern).test(t)||r.push(l(e,"The value does not match the required format.","PATTERN_MISMATCH"))}catch{r.push(l(e,"The field validation pattern is invalid.","PATTERN_MISMATCH"))}return r},J=(e,t)=>{const r=[],s=e;return s.min!==void 0&&t<s.min&&r.push(l(e,`Minimum value is ${s.min}.`,"MIN_VALUE")),s.max!==void 0&&t>s.max&&r.push(l(e,`Maximum value is ${s.max}.`,"MAX_VALUE")),r},S=(e,t)=>{if(e.sharedMode==="mirror")return{valid:!0,errors:[]};const r=[],s=t===void 0||t===""||t===null||typeof t=="boolean"&&!t&&e.type!=="checkbox";if(e.required&&s)return r.push(l(e,"This field is required.","REQUIRED")),{valid:!1,errors:r};if(t===void 0||t==="")return{valid:!0,errors:[]};if(e.type==="checkbox"&&typeof t!="boolean"||e.type==="number"&&(typeof t!="number"||!Number.isFinite(t))||e.type==="signature"&&!m(t)||e.type!=="checkbox"&&e.type!=="number"&&e.type!=="signature"&&typeof t!="string")return r.push(l(e,"The value type is invalid for this field.","INVALID_TYPE")),{valid:!1,errors:r};if(typeof t=="string")r.push(...B(e,t));else if(typeof t=="number")r.push(...J(e,t));else if(m(t)){if(!E(t.image)||t.image.length===0)return r.push(l(e,"Image data is invalid.","INVALID_TYPE")),{valid:!1,errors:r};t.image.length>v&&r.push(l(e,`Image data must be ${Math.floor(v/(1024*1024))} MB or smaller.`,"INVALID_TYPE")),D(t)===void 0&&r.push(l(e,"Only PNG and JPEG signature images are allowed, and MIME type must match the image data.","INVALID_TYPE"))}return{valid:r.length===0,errors:r}},O=(e,t,r,s)=>{const n=e.filter(a=>a.sharedKey===s).find(a=>a.sharedMode==="source");if(!n)return{valid:!1,errors:[{fieldId:s,fieldName:s,message:`No source field found for shared key "${s}".`,code:"SHARED_SOURCE_NOT_FOUND"}]};const o=u(n,t,r);return S(n,o)},Q=e=>{const{fields:t,fieldValues:r,sharedValues:s}=e,i=new Set,n=[];for(const o of t)if(o.sharedMode!=="mirror")if(o.sharedKey){if(i.has(o.sharedKey))continue;i.add(o.sharedKey);const a=O(t,r,s,o.sharedKey);n.push(...a.errors)}else{const a=u(o,r,s),d=S(o,a);n.push(...d.errors)}return{valid:n.length===0,errors:n}},Z=new Set(["y","Y","M","m","d","D","h","H","s","S"]),ee=new Set(["\\","^","$",".","*","+","?","(",")","[","]","{","}","|"]),te=e=>ee.has(e)?`\\${e}`:e,_=e=>{let t="";for(let r=0;r<e.length;){const s=e[r];if(s===void 0)break;if(Z.has(s)){let i=1;for(;e[r+i]===s;)i+=1;t+=`\\d{${i}}`,r+=i;continue}t+=te(s),r+=1}return t},re=(e,t)=>{const r=e.trim();return r?new RegExp(`^(?:${_(r)})$`).test(t):!0},R=/^(\d{4})-(\d{2})-(\d{2})$/,se=e=>R.test(e),N=(e,t)=>{const r=R.exec(e),s=t==null?void 0:t.trim();if(!r||!s)return e;const[,i="",n="",o=""]=r;let a="";for(let d=0;d<s.length;){const h=s[d];if(h===void 0)break;let c=1;for(;s[d+c]===h;)c+=1;if(h==="y"||h==="Y"){a+=c===2?i.slice(-2):i.padStart(c,"0"),d+=c;continue}if(h==="M"||h==="m"){a+=c===1?String(Number(n)):n.padStart(c,"0"),d+=c;continue}if(h==="d"||h==="D"){a+=c===1?String(Number(o)):o.padStart(c,"0"),d+=c;continue}a+=h,d+=1}return a},$=e=>{const t=new Map;for(const r of e){if(!r.sharedKey||r.sharedMode!=="source")continue;const s=t.get(r.sharedKey);if(s!==void 0)throw new Error(`Shared key "${r.sharedKey}" allows only one source field. (Conflict: "${s}" vs "${r.id}")`);t.set(r.sharedKey,r.id)}},ne=(e,t)=>{if(e.some(r=>r.id===t))throw new Error(`Field ID "${t}" already exists.`)},ie=(e,t)=>{switch(e.type){case"checkbox":return typeof t=="boolean";case"number":return typeof t=="number"&&Number.isFinite(t);case"signature":return m(t)&&E(t.image);case"text":case"date":case"email":case"phone":case"textarea":return typeof t=="string";default:return!1}},oe=(e,t)=>!(t.page!==void 0&&e.page!==t.page||t.type!==void 0&&e.type!==t.type||t.required!==void 0&&(e.required??!1)!==t.required||t.hidden!==void 0&&(e.hidden??!1)!==t.hidden||t.readonly!==void 0&&(e.readonly??!1)!==t.readonly||t.sharedKey!==void 0&&e.sharedKey!==t.sharedKey||t.sharedMode!==void 0&&e.sharedMode!==t.sharedMode),C=(e,t)=>{const r=w(e,t.pageCount);if(e.type!=="checkbox")return r;const s=t.pages.find(n=>n.index===r.page);if(!s||s.width<=0||s.height<=0){const n=Math.min(r.width,r.height);return w({...r,width:n,height:n},t.pageCount)}const i=Math.min(r.width*s.width,r.height*s.height);return w({...r,width:i/s.width,height:i/s.height},t.pageCount)},K=e=>({...e,fields:[],fieldValues:{},sharedValues:{},createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()}),L=async e=>(await f.PDFDocument.load(e)).getPages().map((r,s)=>({index:s,width:r.getWidth(),height:r.getHeight()})),ae=async e=>{const t=await L(e.pdfData);return K({...e,pageCount:t.length,pages:t})},de=(e,t)=>{ne(e.fields,t.id);const r=C(t,e),s={...t,...r},i=[...e.fields,s];return $(i),{...e,fields:i,updatedAt:new Date().toISOString()}},V=(e,t,r)=>{const s=e.fields.map(i=>{if(i.id!==t)return i;const n={...i,...r},o=C(n,e);return{...n,...o}});return $(s),{...e,fields:s,updatedAt:new Date().toISOString()}},ce=(e,t)=>{const r=e.fields.find(o=>o.id===t),s=e.fields.filter(o=>o.id!==t),i=Object.fromEntries(Object.entries(e.fieldValues).filter(([o])=>o!==t));let{sharedValues:n}=e;return r!=null&&r.sharedKey&&r.sharedMode==="source"&&(s.some(a=>a.sharedKey===r.sharedKey&&a.sharedMode==="source")||(n=Object.fromEntries(Object.entries(n).filter(([a])=>a!==r.sharedKey)))),{...e,fields:s,fieldValues:i,sharedValues:n,updatedAt:new Date().toISOString()}},he=(e,t,r)=>{const{page:s,x:i,y:n}=r;return V(e,t,s!==void 0?{page:s,x:i,y:n}:{x:i,y:n})},le=(e,t,r)=>V(e,t,{width:r.width,height:r.height}),ue=(e,t,r)=>{const s=e.fields.find(i=>i.id===t);if(!s)throw new Error(`Field ID "${t}" was not found.`);if(s.sharedMode==="mirror")throw new Error(`Cannot set value on mirror field "${t}". Set the value on the source field instead.`);if(s.readonly)throw new Error(`Cannot set value on read-only field "${t}".`);if(!ie(s,r))throw new Error(`Value for field "${t}" is incompatible with field type "${s.type}".`);if(s.sharedKey&&s.sharedMode==="source"){const i=P(e.fields,e.sharedValues,s.sharedKey,r);return{...e,sharedValues:i,updatedAt:new Date().toISOString()}}return{...e,fieldValues:{...e.fieldValues,[t]:g(r)},updatedAt:new Date().toISOString()}},ge=(e,t)=>{const r=e.fields.find(n=>n.id===t);if(!r)throw new Error(`Field ID "${t}" was not found.`);if(r.sharedMode==="mirror")throw new Error(`Cannot clear value on mirror field "${t}". Clear the source field instead.`);if(r.readonly)throw new Error(`Cannot clear value on read-only field "${t}".`);if(r.sharedKey&&r.sharedMode==="source"){const{[r.sharedKey]:n,...o}=e.sharedValues;return{...e,sharedValues:o,updatedAt:new Date().toISOString()}}const{[t]:s,...i}=e.fieldValues;return{...e,fieldValues:i,updatedAt:new Date().toISOString()}},fe=(e,t)=>{const r=e.fields.find(s=>s.id===t);return r?{...r}:void 0},me=(e,t={})=>e.fields.filter(r=>oe(r,t)).map(r=>({...r})),pe=(e,t)=>{const r=e.fields.find(s=>s.id===t);if(r)return u(r,e.fieldValues,e.sharedValues)};function ye(e,t={}){const r={};for(const s of e.fields){const i=u(s,e.fieldValues,e.sharedValues);(i!==void 0||t.includeEmpty)&&(r[s.id]=i)}return r}const we=(e,t,r,s,i,n)=>{const a=Math.max(0,n-4),d=Math.min(r.widthOfTextAtSize(t,s),a);switch(e.textAlign){case"center":return i+(n-d)/2;case"right":return i+n-2-d;case"left":default:return i+2}},xe=e=>({width:e.getWidth(),height:e.getHeight()}),I=(e,t,r,s,i)=>{const n=x(t,i.width,i.height),o=t.textSize??10,a=i.height-n.y-n.height/2-o/2,d=we(t,r,s,o,n.x,n.width);e.drawText(r,{x:d,y:Math.max(0,a),size:o,font:s,color:f.rgb(0,0,0),maxWidth:n.width-4})},Se=(e,t,r,s)=>{if(!r)return;const i=x(t,s.width,s.height),n=Math.min(i.width,i.height),o={...i,x:i.x+(i.width-n)/2,y:i.y+(i.height-n)/2},a=s.height-o.y-n,d=Math.max(1.2,n*.11);e.drawLine({start:{x:o.x+n*.22,y:a+n*.49},end:{x:o.x+n*.42,y:a+n*.31},thickness:d,color:f.rgb(0,0,0)}),e.drawLine({start:{x:o.x+n*.42,y:a+n*.31},end:{x:o.x+n*.78,y:a+n*.68},thickness:d,color:f.rgb(0,0,0)})},Fe=async(e,t,r,s,i,n)=>{const o=x(r,n.width,n.height),a=n.height-o.y-o.height,d=D(i!==void 0?{image:s,mimeType:i}:{image:s});if(d===void 0)throw new Error(`Field "${r.id}" contains an unsupported signature image format for PDF export.`);const c=d==="image/jpeg"?await t.embedJpg(s):await t.embedPng(s);e.drawImage(c,{x:o.x,y:Math.max(0,a),width:o.width,height:o.height})},Me=async(e,t,r,s,i,n)=>{if(!(s===void 0||r.hidden)){if(m(s)){await Fe(e,t,r,s.image,s.mimeType,n);return}if(typeof s=="boolean"){r.type==="checkbox"&&Se(e,r,s,n);return}if(typeof s=="string"&&s.trim()!==""){I(e,r,r.type==="date"?N(s,r.dateFormat):s,i,n);return}typeof s=="number"&&I(e,r,String(s),i,n)}},Ee=e=>{if(!(e.byteLength>0))throw new Error("exportToPdf requires a non-empty source PDF in document.pdfData.")},Ve=async(e,t={})=>{var o;Ee(e.pdfData);const r=await f.PDFDocument.load(e.pdfData),s=await r.embedFont(f.StandardFonts.Helvetica),i=r.getPages(),n=new Map;for(const a of e.fields){const d=n.get(a.page)??[];n.set(a.page,[...d,a])}for(const[a,d]of n){const h=i[a];if(!h)continue;const c=xe(h);for(const y of d){const b=u(y,e.fieldValues,e.sharedValues),A=S(y,b);if(!A.valid)throw new Error(`Field "${y.id}" is invalid for PDF export: ${((o=A.errors[0])==null?void 0:o.message)??"Unknown validation error."}`);await Me(h,r,y,b,s,c)}}return r.save()};exports.clampCoord=M;exports.clampToPage=T;exports.clearFieldValue=ge;exports.createDocument=K;exports.createDocumentFromPdfData=ae;exports.createField=de;exports.dateFormatToRegexPattern=_;exports.ensureMinSize=p;exports.exportToPdf=Ve;exports.formatDateValue=N;exports.getField=fe;exports.getFields=me;exports.getMirrorFields=W;exports.getPdfPageInfo=L;exports.getResolvedFieldValue=pe;exports.getResolvedValues=ye;exports.getSourceField=Y;exports.isIsoDateString=se;exports.isPrimitiveValue=z;exports.isSignatureValue=m;exports.matchesDateFormat=re;exports.moveField=he;exports.normalizeRect=w;exports.removeField=ce;exports.resizeField=le;exports.resolveAllSharedValues=X;exports.resolveFieldValue=u;exports.setFieldValue=ue;exports.setSharedFieldValue=P;exports.toAbsoluteRect=x;exports.toNormalizedRect=q;exports.updateField=V;exports.validateDocument=Q;exports.validateField=S;exports.validateSharedFieldGroup=O;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("pdf-lib"),m=e=>typeof e=="object"&&e!==null&&"type"in e&&e.type==="signature",z=e=>typeof e!="object",b=e=>Object.prototype.toString.call(e)==="[object Uint8Array]",g=e=>!m(e)||!b(e.image)?e:{...e,image:Uint8Array.from(e.image)},k=new Set(["image/png","image/jpeg","image/jpg"]),j=e=>{const t=e==null?void 0:e.trim().toLowerCase();if(t&&k.has(t))return t==="image/jpg"?"image/jpeg":t},U=e=>{if(e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10)return"image/png";if(e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255)return"image/jpeg"},D=e=>{const t=U(e.image),r=j(e.mimeType);if(!(r&&t&&r!==t))return r??t},G=.005,H=0,F=1,T=(e,t)=>Math.max(0,Math.min(t-1,Math.floor(e))),M=e=>Math.max(H,Math.min(F,e)),p=e=>Math.max(G,e),w=(e,t)=>{const r=T(e.page,t),s=M(e.x),i=M(e.y),n=p(e.width),o=p(e.height),a=Math.min(n,F-s),d=Math.min(o,F-i);return{page:r,x:s,y:i,width:p(a),height:p(d)}},x=(e,t,r)=>({x:e.x*t,y:e.y*r,width:e.width*t,height:e.height*r}),q=(e,t,r)=>({page:e.page,x:e.x/t,y:e.y/r,width:e.width/t,height:e.height/r}),Y=(e,t)=>e.find(r=>r.sharedKey===t&&r.sharedMode==="source"),W=(e,t)=>e.filter(r=>r.sharedKey===t&&r.sharedMode==="mirror"),u=(e,t,r)=>{if(e.sharedKey){const n=r[e.sharedKey];if(n!==void 0)return g(n)}const s=t[e.id];if(s!==void 0)return g(s);const i=e.defaultValue;return i!==void 0?g(i):void 0},P=(e,t,r,s)=>{if(!e.some(n=>n.sharedKey===r&&n.sharedMode==="source"))throw new Error(`Cannot set shared value: no source field exists for key "${r}".`);return{...t,[r]:g(s)}},X=(e,t,r)=>{const s=Object.fromEntries(Object.entries(t).map(([i,n])=>[i,g(n)]));for(const i of e){const n=u(i,t,r);n!==void 0&&(s[i.id]=n)}return s},A=5*1024*1024,l=(e,t,r)=>{var s;return{fieldId:e.id,fieldName:e.name,message:((s=e.validation)==null?void 0:s.customMessage)??t,code:r}},B=(e,t)=>{const r=[],{validation:s}=e;if(!s)return r;if(s.minLength!==void 0&&t.length<s.minLength&&r.push(l(e,`Must be at least ${s.minLength} characters.`,"MIN_LENGTH")),s.maxLength!==void 0&&t.length>s.maxLength&&r.push(l(e,`Must be at most ${s.maxLength} characters.`,"MAX_LENGTH")),s.pattern!==void 0)try{new RegExp(s.pattern).test(t)||r.push(l(e,"The value does not match the required format.","PATTERN_MISMATCH"))}catch{r.push(l(e,"The field validation pattern is invalid.","PATTERN_MISMATCH"))}return r},J=(e,t)=>{const r=[],s=e;return s.min!==void 0&&t<s.min&&r.push(l(e,`Minimum value is ${s.min}.`,"MIN_VALUE")),s.max!==void 0&&t>s.max&&r.push(l(e,`Maximum value is ${s.max}.`,"MAX_VALUE")),r},S=(e,t)=>{if(e.sharedMode==="mirror")return{valid:!0,errors:[]};const r=[],s=t===void 0||t===""||t===null||typeof t=="boolean"&&!t&&e.type!=="checkbox";if(e.required&&s)return r.push(l(e,"This field is required.","REQUIRED")),{valid:!1,errors:r};if(t===void 0||t==="")return{valid:!0,errors:[]};if(e.type==="checkbox"&&typeof t!="boolean"||e.type==="number"&&(typeof t!="number"||!Number.isFinite(t))||e.type==="signature"&&!m(t)||e.type!=="checkbox"&&e.type!=="number"&&e.type!=="signature"&&typeof t!="string")return r.push(l(e,"The value type is invalid for this field.","INVALID_TYPE")),{valid:!1,errors:r};if(typeof t=="string")r.push(...B(e,t));else if(typeof t=="number")r.push(...J(e,t));else if(m(t)){if(!b(t.image)||t.image.length===0)return r.push(l(e,"Image data is invalid.","INVALID_TYPE")),{valid:!1,errors:r};t.image.length>A&&r.push(l(e,`Image data must be ${Math.floor(A/(1024*1024))} MB or smaller.`,"INVALID_TYPE")),D(t)===void 0&&r.push(l(e,"Only PNG and JPEG signature images are allowed, and MIME type must match the image data.","INVALID_TYPE"))}return{valid:r.length===0,errors:r}},O=(e,t,r,s)=>{const n=e.filter(a=>a.sharedKey===s).find(a=>a.sharedMode==="source");if(!n)return{valid:!1,errors:[{fieldId:s,fieldName:s,message:`No source field found for shared key "${s}".`,code:"SHARED_SOURCE_NOT_FOUND"}]};const o=u(n,t,r);return S(n,o)},Q=e=>{const{fields:t,fieldValues:r,sharedValues:s}=e,i=new Set,n=[];for(const o of t)if(o.sharedMode!=="mirror")if(o.sharedKey){if(i.has(o.sharedKey))continue;i.add(o.sharedKey);const a=O(t,r,s,o.sharedKey);n.push(...a.errors)}else{const a=u(o,r,s),d=S(o,a);n.push(...d.errors)}return{valid:n.length===0,errors:n}},Z=new Set(["y","Y","M","m","d","D","h","H","s","S"]),ee=new Set(["\\","^","$",".","*","+","?","(",")","[","]","{","}","|"]),te=e=>ee.has(e)?`\\${e}`:e,_=e=>{let t="";for(let r=0;r<e.length;){const s=e[r];if(s===void 0)break;if(Z.has(s)){let i=1;for(;e[r+i]===s;)i+=1;t+=`\\d{${i}}`,r+=i;continue}t+=te(s),r+=1}return t},re=(e,t)=>{const r=e.trim();return r?new RegExp(`^(?:${_(r)})$`).test(t):!0},R=/^(\d{4})-(\d{2})-(\d{2})$/,se=e=>R.test(e),N=(e,t)=>{const r=R.exec(e),s=t==null?void 0:t.trim();if(!r||!s)return e;const[,i="",n="",o=""]=r;let a="";for(let d=0;d<s.length;){const h=s[d];if(h===void 0)break;let c=1;for(;s[d+c]===h;)c+=1;if(h==="y"||h==="Y"){a+=c===2?i.slice(-2):i.padStart(c,"0"),d+=c;continue}if(h==="M"||h==="m"){a+=c===1?String(Number(n)):n.padStart(c,"0"),d+=c;continue}if(h==="d"||h==="D"){a+=c===1?String(Number(o)):o.padStart(c,"0"),d+=c;continue}a+=h,d+=1}return a},$=e=>{const t=new Map;for(const r of e){if(!r.sharedKey||r.sharedMode!=="source")continue;const s=t.get(r.sharedKey);if(s!==void 0)throw new Error(`Shared key "${r.sharedKey}" allows only one source field. (Conflict: "${s}" vs "${r.id}")`);t.set(r.sharedKey,r.id)}},ne=(e,t)=>{if(e.some(r=>r.id===t))throw new Error(`Field ID "${t}" already exists.`)},ie=(e,t)=>{switch(e.type){case"checkbox":return typeof t=="boolean";case"number":return typeof t=="number"&&Number.isFinite(t);case"signature":return m(t)&&b(t.image);case"text":case"date":case"email":case"phone":case"textarea":return typeof t=="string";default:return!1}},oe=(e,t)=>!(t.page!==void 0&&e.page!==t.page||t.type!==void 0&&e.type!==t.type||t.required!==void 0&&(e.required??!1)!==t.required||t.hidden!==void 0&&(e.hidden??!1)!==t.hidden||t.readonly!==void 0&&(e.readonly??!1)!==t.readonly||t.disabled!==void 0&&(e.disabled??!1)!==t.disabled||t.sharedKey!==void 0&&e.sharedKey!==t.sharedKey||t.sharedMode!==void 0&&e.sharedMode!==t.sharedMode),C=(e,t)=>{const r=w(e,t.pageCount);if(e.type!=="checkbox")return r;const s=t.pages.find(n=>n.index===r.page);if(!s||s.width<=0||s.height<=0){const n=Math.min(r.width,r.height);return w({...r,width:n,height:n},t.pageCount)}const i=Math.min(r.width*s.width,r.height*s.height);return w({...r,width:i/s.width,height:i/s.height},t.pageCount)},K=e=>({...e,fields:[],fieldValues:{},sharedValues:{},createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()}),L=async e=>(await f.PDFDocument.load(e)).getPages().map((r,s)=>({index:s,width:r.getWidth(),height:r.getHeight()})),ae=async e=>{const t=await L(e.pdfData);return K({...e,pageCount:t.length,pages:t})},de=(e,t)=>{ne(e.fields,t.id);const r=C(t,e),s={...t,...r},i=[...e.fields,s];return $(i),{...e,fields:i,updatedAt:new Date().toISOString()}},E=(e,t,r)=>{const s=e.fields.map(i=>{if(i.id!==t)return i;const n={...i,...r},o=C(n,e);return{...n,...o}});return $(s),{...e,fields:s,updatedAt:new Date().toISOString()}},ce=(e,t)=>{const r=e.fields.find(o=>o.id===t),s=e.fields.filter(o=>o.id!==t),i=Object.fromEntries(Object.entries(e.fieldValues).filter(([o])=>o!==t));let{sharedValues:n}=e;return r!=null&&r.sharedKey&&r.sharedMode==="source"&&(s.some(a=>a.sharedKey===r.sharedKey&&a.sharedMode==="source")||(n=Object.fromEntries(Object.entries(n).filter(([a])=>a!==r.sharedKey)))),{...e,fields:s,fieldValues:i,sharedValues:n,updatedAt:new Date().toISOString()}},he=(e,t,r)=>{const{page:s,x:i,y:n}=r;return E(e,t,s!==void 0?{page:s,x:i,y:n}:{x:i,y:n})},le=(e,t,r)=>E(e,t,{width:r.width,height:r.height}),ue=(e,t,r)=>{const s=e.fields.find(i=>i.id===t);if(!s)throw new Error(`Field ID "${t}" was not found.`);if(s.sharedMode==="mirror")throw new Error(`Cannot set value on mirror field "${t}". Set the value on the source field instead.`);if(s.readonly)throw new Error(`Cannot set value on read-only field "${t}".`);if(!ie(s,r))throw new Error(`Value for field "${t}" is incompatible with field type "${s.type}".`);if(s.sharedKey&&s.sharedMode==="source"){const i=P(e.fields,e.sharedValues,s.sharedKey,r);return{...e,sharedValues:i,updatedAt:new Date().toISOString()}}return{...e,fieldValues:{...e.fieldValues,[t]:g(r)},updatedAt:new Date().toISOString()}},ge=(e,t)=>{const r=e.fields.find(n=>n.id===t);if(!r)throw new Error(`Field ID "${t}" was not found.`);if(r.sharedMode==="mirror")throw new Error(`Cannot clear value on mirror field "${t}". Clear the source field instead.`);if(r.readonly)throw new Error(`Cannot clear value on read-only field "${t}".`);if(r.sharedKey&&r.sharedMode==="source"){const{[r.sharedKey]:n,...o}=e.sharedValues;return{...e,sharedValues:o,updatedAt:new Date().toISOString()}}const{[t]:s,...i}=e.fieldValues;return{...e,fieldValues:i,updatedAt:new Date().toISOString()}},fe=(e,t)=>{const r=e.fields.find(s=>s.id===t);return r?{...r}:void 0},me=(e,t={})=>e.fields.filter(r=>oe(r,t)).map(r=>({...r})),pe=(e,t)=>{const r=e.fields.find(s=>s.id===t);if(r)return u(r,e.fieldValues,e.sharedValues)};function ye(e,t={}){const r={};for(const s of e.fields){const i=u(s,e.fieldValues,e.sharedValues);(i!==void 0||t.includeEmpty)&&(r[s.id]=i)}return r}const we=(e,t,r,s,i,n)=>{const a=Math.max(0,n-4),d=Math.min(r.widthOfTextAtSize(t,s),a);switch(e.textAlign){case"center":return i+(n-d)/2;case"right":return i+n-2-d;case"left":default:return i+2}},xe=e=>({width:e.getWidth(),height:e.getHeight()}),I=(e,t,r,s,i)=>{const n=x(t,i.width,i.height),o=t.textSize??10,a=i.height-n.y-n.height/2-o/2,d=we(t,r,s,o,n.x,n.width);e.drawText(r,{x:d,y:Math.max(0,a),size:o,font:s,color:f.rgb(0,0,0),maxWidth:n.width-4})},Se=(e,t,r,s)=>{if(!r)return;const i=x(t,s.width,s.height),n=Math.min(i.width,i.height),o={...i,x:i.x+(i.width-n)/2,y:i.y+(i.height-n)/2},a=s.height-o.y-n,d=Math.max(1.2,n*.11);e.drawLine({start:{x:o.x+n*.22,y:a+n*.49},end:{x:o.x+n*.42,y:a+n*.31},thickness:d,color:f.rgb(0,0,0)}),e.drawLine({start:{x:o.x+n*.42,y:a+n*.31},end:{x:o.x+n*.78,y:a+n*.68},thickness:d,color:f.rgb(0,0,0)})},Fe=async(e,t,r,s,i,n)=>{const o=x(r,n.width,n.height),a=n.height-o.y-o.height,d=D(i!==void 0?{image:s,mimeType:i}:{image:s});if(d===void 0)throw new Error(`Field "${r.id}" contains an unsupported signature image format for PDF export.`);const c=d==="image/jpeg"?await t.embedJpg(s):await t.embedPng(s);e.drawImage(c,{x:o.x,y:Math.max(0,a),width:o.width,height:o.height})},Me=async(e,t,r,s,i,n)=>{if(!(s===void 0||r.hidden)){if(m(s)){await Fe(e,t,r,s.image,s.mimeType,n);return}if(typeof s=="boolean"){r.type==="checkbox"&&Se(e,r,s,n);return}if(typeof s=="string"&&s.trim()!==""){I(e,r,r.type==="date"?N(s,r.dateFormat):s,i,n);return}typeof s=="number"&&I(e,r,String(s),i,n)}},be=e=>{if(!(e.byteLength>0))throw new Error("exportToPdf requires a non-empty source PDF in document.pdfData.")},Ee=async(e,t={})=>{var o;be(e.pdfData);const r=await f.PDFDocument.load(e.pdfData),s=await r.embedFont(f.StandardFonts.Helvetica),i=r.getPages(),n=new Map;for(const a of e.fields){const d=n.get(a.page)??[];n.set(a.page,[...d,a])}for(const[a,d]of n){const h=i[a];if(!h)continue;const c=xe(h);for(const y of d){const V=u(y,e.fieldValues,e.sharedValues),v=S(y,V);if(!v.valid)throw new Error(`Field "${y.id}" is invalid for PDF export: ${((o=v.errors[0])==null?void 0:o.message)??"Unknown validation error."}`);await Me(h,r,y,V,s,c)}}return r.save()};exports.clampCoord=M;exports.clampToPage=T;exports.clearFieldValue=ge;exports.createDocument=K;exports.createDocumentFromPdfData=ae;exports.createField=de;exports.dateFormatToRegexPattern=_;exports.ensureMinSize=p;exports.exportToPdf=Ee;exports.formatDateValue=N;exports.getField=fe;exports.getFields=me;exports.getMirrorFields=W;exports.getPdfPageInfo=L;exports.getResolvedFieldValue=pe;exports.getResolvedValues=ye;exports.getSourceField=Y;exports.isIsoDateString=se;exports.isPrimitiveValue=z;exports.isSignatureValue=m;exports.matchesDateFormat=re;exports.moveField=he;exports.normalizeRect=w;exports.removeField=ce;exports.resizeField=le;exports.resolveAllSharedValues=X;exports.resolveFieldValue=u;exports.setFieldValue=ue;exports.setSharedFieldValue=P;exports.toAbsoluteRect=x;exports.toNormalizedRect=q;exports.updateField=E;exports.validateDocument=Q;exports.validateField=S;exports.validateSharedFieldGroup=O;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","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 =>\n typeof v === 'object' && v !== null && 'type' in v && v.type === 'signature';\n\nexport const isPrimitiveValue = (\n v: ContractFieldValue\n): v is string | number | boolean => typeof v !== 'object';\n\nexport const isUint8Array = (value: unknown): value is Uint8Array =>\n Object.prototype.toString.call(value) === '[object Uint8Array]';\n\nexport const cloneContractFieldValue = (\n value: ContractFieldValue\n): ContractFieldValue => {\n if (!isSignatureValue(value) || !isUint8Array(value.image)) return value;\n\n return {\n ...value,\n image: Uint8Array.from(value.image),\n };\n};\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 = (\n image: Uint8Array\n): string | undefined => {\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 {\n ContractFieldValue,\n FieldValueMap,\n SharedValueMap,\n} from '../types/value';\nimport { cloneContractFieldValue } from '../types/value';\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) {\n const sharedValue = sharedValues[field.sharedKey];\n if (sharedValue !== undefined) return cloneContractFieldValue(sharedValue);\n }\n\n const directValue = fieldValues[field.id];\n if (directValue !== undefined) return cloneContractFieldValue(directValue);\n\n const defaultValue = field.defaultValue as ContractFieldValue | undefined;\n return defaultValue !== undefined\n ? cloneContractFieldValue(defaultValue)\n : undefined;\n};\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\n return { ...sharedValues, [sharedKey]: cloneContractFieldValue(value) };\n};\n\r\nexport const resolveAllSharedValues = (\n fields: readonly ContractField[],\n fieldValues: FieldValueMap,\n sharedValues: SharedValueMap\n): FieldValueMap => {\n const resolved: Record<string, ContractFieldValue> = Object.fromEntries(\n Object.entries(fieldValues).map(([fieldId, value]) => [\n fieldId,\n cloneContractFieldValue(value),\n ])\n );\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 {\n getNormalizedSignatureImageMimeType,\n isSignatureValue,\n isUint8Array,\n} from '../types/value';\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)) {\n if (!isUint8Array(value.image) || value.image.length === 0) {\n errors.push(makeError(field, 'Image data is invalid.', 'INVALID_TYPE'));\n return { valid: false, errors };\n }\n if (value.image.length > MAX_SIGNATURE_IMAGE_BYTES) {\n errors.push(\n makeError(\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 {\n ContractField,\n ContractFieldType,\n SharedMode,\n} from '../types/field';\nimport type {\n ContractFieldValue,\n FieldValueMap,\n SharedValueMap,\n} from '../types/value';\nimport {\n cloneContractFieldValue,\n isSignatureValue,\n isUint8Array,\n} from '../types/value';\nimport { PDFDocument } from 'pdf-lib';\nimport type {\n ContractDocument,\n CreateDocumentFromPdfDataInput,\n CreateDocumentInput,\n PageInfo,\n} from '../types/document';\nimport { normalizeRect } from '../coordinates';\nimport { resolveFieldValue, setSharedFieldValue } from '../shared';\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 = (\n field: ContractField,\n value: ContractFieldValue\n): boolean => {\n switch (field.type) {\r\n case 'checkbox':\r\n return typeof value === 'boolean';\r\n case 'number':\n return typeof value === 'number' && Number.isFinite(value);\n case 'signature':\n return isSignatureValue(value) && isUint8Array(value.image);\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 }\n};\n\nexport interface GetFieldsOptions {\n readonly page?: number;\n readonly type?: ContractFieldType;\n readonly required?: boolean;\n readonly hidden?: boolean;\n readonly readonly?: boolean;\n readonly sharedKey?: string;\n readonly sharedMode?: SharedMode;\n}\n\nexport interface GetResolvedValuesOptions {\n readonly includeEmpty?: boolean;\n}\n\nexport type ResolvedFieldValueMap = Record<\n string,\n ContractFieldValue | undefined\n>;\n\nconst matchesFieldOptions = (\n field: ContractField,\n options: GetFieldsOptions\n): boolean => {\n if (options.page !== undefined && field.page !== options.page) return false;\n if (options.type !== undefined && field.type !== options.type) return false;\n if (\n options.required !== undefined &&\n (field.required ?? false) !== options.required\n ) {\n return false;\n }\n if (\n options.hidden !== undefined &&\n (field.hidden ?? false) !== options.hidden\n ) {\n return false;\n }\n if (\n options.readonly !== undefined &&\n (field.readonly ?? false) !== options.readonly\n ) {\n return false;\n }\n if (\n options.sharedKey !== undefined &&\n field.sharedKey !== options.sharedKey\n ) {\n return false;\n }\n if (\n options.sharedMode !== undefined &&\n field.sharedMode !== options.sharedMode\n ) {\n return false;\n }\n\n return true;\n};\n\nconst normalizeFieldRect = (\n field: ContractField,\n document: ContractDocument\n): ReturnType<typeof normalizeRect> => {\n const normalized = normalizeRect(field, document.pageCount);\n if (field.type !== 'checkbox') 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);\n return normalizeRect({ ...normalized, width: side, height: side }, document.pageCount);\n }\n\n const side = Math.min(\n normalized.width * page.width,\n normalized.height * page.height\n );\n\n return normalizeRect(\n {\n ...normalized,\n width: side / page.width,\n height: side / page.height,\n },\n document.pageCount\n );\n};\n\nexport const createDocument = (input: CreateDocumentInput): ContractDocument => ({\n ...input,\n fields: [],\n fieldValues: {},\n sharedValues: {},\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n});\n\nexport const getPdfPageInfo = async (\n pdfData: Uint8Array\n): Promise<readonly PageInfo[]> => {\n const pdf = await PDFDocument.load(pdfData);\n return pdf.getPages().map((page, index) => ({\n index,\n width: page.getWidth(),\n height: page.getHeight(),\n }));\n};\n\nexport const createDocumentFromPdfData = async (\n input: CreateDocumentFromPdfDataInput\n): Promise<ContractDocument> => {\n const pages = await getPdfPageInfo(input.pdfData);\n return createDocument({\n ...input,\n pageCount: pages.length,\n pages,\n });\n};\n\nexport const createField = (\n document: ContractDocument,\n field: ContractField\n): ContractDocument => {\n assertUniqueFieldId(document.fields, field.id);\n const normalized = normalizeFieldRect(field, document);\n const newField: ContractField = { ...field, ...normalized };\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;\n\n const merged = { ...f, ...patch };\n const normalized = normalizeFieldRect(merged, document);\n return { ...merged, ...normalized } as ContractField;\n });\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') {\n const sharedValues = setSharedFieldValue(\n document.fields,\n document.sharedValues,\n field.sharedKey,\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\n return {\n ...document,\n fieldValues: {\n ...document.fieldValues,\n [fieldId]: cloneContractFieldValue(value),\n },\n updatedAt: new Date().toISOString(),\n };\n};\n\r\nexport const clearFieldValue = (\n document: ContractDocument,\n fieldId: string\n): ContractDocument => {\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 };\n};\n\nexport const getField = (\n document: ContractDocument,\n fieldId: string\n): ContractField | undefined => {\n const field = document.fields.find((f) => f.id === fieldId);\n return field ? { ...field } : undefined;\n};\n\nexport const getFields = (\n document: ContractDocument,\n options: GetFieldsOptions = {}\n): readonly ContractField[] =>\n document.fields\n .filter((field) => matchesFieldOptions(field, options))\n .map((field) => ({ ...field }));\n\nexport const getResolvedFieldValue = (\n document: ContractDocument,\n fieldId: string\n): ContractFieldValue | undefined => {\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;\nexport function getResolvedValues(\n document: ContractDocument,\n options: GetResolvedValuesOptions & { readonly includeEmpty: true }\n): ResolvedFieldValueMap;\nexport function getResolvedValues(\n document: ContractDocument,\n options: GetResolvedValuesOptions\n): FieldValueMap | ResolvedFieldValueMap;\nexport function getResolvedValues(\n document: ContractDocument,\n options: GetResolvedValuesOptions = {}\n): FieldValueMap | ResolvedFieldValueMap {\n const resolved: ResolvedFieldValueMap = {};\n\n for (const field of document.fields) {\n const value = resolveFieldValue(\n field,\r\n document.fieldValues,\r\n document.sharedValues\n );\n if (value !== undefined || options.includeEmpty) {\n resolved[field.id] = value;\n }\n }\n\n return resolved;\n}\n\nexport type { ContractDocument, FieldValueMap, SharedValueMap };\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 {\n readonly width: number;\n readonly height: number;\n}\n\nconst getAlignedTextX = (\n field: ContractField,\n value: string,\n font: PDFFont,\n fontSize: number,\n x: number,\n width: number\n): number => {\n const padding = 2;\n const maxTextWidth = Math.max(0, width - padding * 2);\n const textWidth = Math.min(font.widthOfTextAtSize(value, fontSize), maxTextWidth);\n\n switch (field.textAlign) {\n case 'center':\n return x + (width - textWidth) / 2;\n case 'right':\n return x + width - padding - textWidth;\n case 'left':\n default:\n return x + padding;\n }\n};\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);\n const fontSize = field.textSize ?? 10;\n const textY = pageDim.height - abs.y - abs.height / 2 - fontSize / 2;\n const textX = getAlignedTextX(field, value, font, fontSize, abs.x, abs.width);\n\n page.drawText(value, {\n x: textX,\n y: Math.max(0, textY),\n size: fontSize,\n font,\r\n color: rgb(0, 0, 0),\r\n maxWidth: abs.width - 4,\r\n });\r\n};\r\n\r\nconst drawCheckboxField = (\n page: PDFPage,\n field: ContractField,\n value: boolean,\n pageDim: PageDimension\n): void => {\n if (!value) return;\n\n const rawAbs = toAbsoluteRect(field, pageDim.width, pageDim.height);\n const side = Math.min(rawAbs.width, rawAbs.height);\n const abs = {\n ...rawAbs,\n x: rawAbs.x + (rawAbs.width - side) / 2,\n y: rawAbs.y + (rawAbs.height - side) / 2,\n width: side,\n height: side,\n };\n const bottom = pageDim.height - abs.y - side;\n const strokeWidth = Math.max(1.2, side * 0.11);\n\n page.drawLine({\n start: { x: abs.x + side * 0.22, y: bottom + side * 0.49 },\n end: { x: abs.x + side * 0.42, y: bottom + side * 0.31 },\n thickness: strokeWidth,\n color: rgb(0, 0, 0),\n });\n page.drawLine({\n start: { x: abs.x + side * 0.42, y: bottom + side * 0.31 },\n end: { x: abs.x + side * 0.78, y: bottom + side * 0.68 },\n thickness: strokeWidth,\n color: rgb(0, 0, 0),\n });\n};\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.cjs","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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"}
package/dist/index.d.ts CHANGED
@@ -16,7 +16,7 @@
16
16
  *
17
17
  * **Export:** {@link exportToPdf}
18
18
  */
19
- export type { ContractFieldType, SharedMode, SignatureInputMode, TextAlign, BaseField, TextField, DateField, CheckboxField, SignatureField, EmailField, PhoneField, NumberField, TextareaField, ContractField, } from './types/field';
19
+ export type { ContractFieldType, SharedMode, SignatureActions, SignatureInputMode, TextAlign, BaseField, TextField, DateField, CheckboxField, SignatureField, EmailField, PhoneField, NumberField, TextareaField, ContractField, } from './types/field';
20
20
  export type { SignatureValue, ContractFieldValue, FieldValueMap, SharedValueMap, } from './types/value';
21
21
  export { isSignatureValue, isPrimitiveValue } from './types/value';
22
22
  export type { FieldValidation, FieldValidationError, ValidationErrorCode, ValidationResult, } from './types/validation';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,YAAY,EACV,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,aAAa,EACb,cAAc,EACd,UAAU,EACV,UAAU,EACV,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,cAAc,GACf,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEnE,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,cAAc,EACd,yBAAyB,EACzB,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,SAAS,EACT,WAAW,EACX,aAAa,EACb,eAAe,EACf,QAAQ,EACR,SAAS,EACT,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,YAAY,EACV,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,aAAa,EACb,cAAc,EACd,UAAU,EACV,UAAU,EACV,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,cAAc,GACf,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEnE,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,cAAc,EACd,yBAAyB,EACzB,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,SAAS,EACT,WAAW,EACX,aAAa,EACb,eAAe,EACf,QAAQ,EACR,SAAS,EACT,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { PDFDocument as T, StandardFonts as N, rgb as w } from "pdf-lib";
1
+ import { PDFDocument as v, StandardFonts as N, rgb as w } from "pdf-lib";
2
2
  const g = (e) => typeof e == "object" && e !== null && "type" in e && e.type === "signature", de = (e) => typeof e != "object", M = (e) => Object.prototype.toString.call(e) === "[object Uint8Array]", u = (e) => !g(e) || !M(e.image) ? e : {
3
3
  ...e,
4
4
  image: Uint8Array.from(e.image)
@@ -15,18 +15,18 @@ const g = (e) => typeof e == "object" && e !== null && "type" in e && e.type ===
15
15
  return "image/png";
16
16
  if (e.length >= 3 && e[0] === 255 && e[1] === 216 && e[2] === 255)
17
17
  return "image/jpeg";
18
- }, v = (e) => {
18
+ }, T = (e) => {
19
19
  const t = R(e.image), r = C(e.mimeType);
20
20
  if (!(r && t && r !== t))
21
21
  return r ?? t;
22
- }, K = 5e-3, L = 0, x = 1, k = (e, t) => Math.max(0, Math.min(t - 1, Math.floor(e))), A = (e) => Math.max(L, Math.min(x, e)), m = (e) => Math.max(K, e), y = (e, t) => {
23
- const r = k(e.page, t), n = A(e.x), i = A(e.y), s = m(e.width), o = m(e.height), a = Math.min(s, x - n), d = Math.min(o, x - i);
22
+ }, K = 5e-3, L = 0, x = 1, k = (e, t) => Math.max(0, Math.min(t - 1, Math.floor(e))), A = (e) => Math.max(L, Math.min(x, e)), p = (e) => Math.max(K, e), y = (e, t) => {
23
+ const r = k(e.page, t), n = A(e.x), i = A(e.y), s = p(e.width), o = p(e.height), a = Math.min(s, x - n), d = Math.min(o, x - i);
24
24
  return {
25
25
  page: r,
26
26
  x: n,
27
27
  y: i,
28
- width: m(a),
29
- height: m(d)
28
+ width: p(a),
29
+ height: p(d)
30
30
  };
31
31
  }, S = (e, t, r) => ({
32
32
  x: e.x * t,
@@ -140,7 +140,7 @@ const g = (e) => typeof e == "object" && e !== null && "type" in e && e.type ===
140
140
  `Image data must be ${Math.floor(V / (1024 * 1024))} MB or smaller.`,
141
141
  "INVALID_TYPE"
142
142
  )
143
- ), v(t) === void 0 && r.push(
143
+ ), T(t) === void 0 && r.push(
144
144
  l(
145
145
  e,
146
146
  "Only PNG and JPEG signature images are allowed, and MIME type must match the image data.",
@@ -202,7 +202,7 @@ const g = (e) => typeof e == "object" && e !== null && "type" in e && e.type ===
202
202
  }, ge = (e, t) => {
203
203
  const r = e.trim();
204
204
  return r ? new RegExp(`^(?:${W(r)})$`).test(t) : !0;
205
- }, O = /^(\d{4})-(\d{2})-(\d{2})$/, pe = (e) => O.test(e), X = (e, t) => {
205
+ }, O = /^(\d{4})-(\d{2})-(\d{2})$/, me = (e) => O.test(e), X = (e, t) => {
206
206
  const r = O.exec(e), n = t == null ? void 0 : t.trim();
207
207
  if (!r || !n) return e;
208
208
  const [, i = "", s = "", o = ""] = r;
@@ -259,7 +259,7 @@ const g = (e) => typeof e == "object" && e !== null && "type" in e && e.type ===
259
259
  default:
260
260
  return !1;
261
261
  }
262
- }, Q = (e, t) => !(t.page !== void 0 && e.page !== t.page || t.type !== void 0 && e.type !== t.type || t.required !== void 0 && (e.required ?? !1) !== t.required || t.hidden !== void 0 && (e.hidden ?? !1) !== t.hidden || t.readonly !== void 0 && (e.readonly ?? !1) !== t.readonly || t.sharedKey !== void 0 && e.sharedKey !== t.sharedKey || t.sharedMode !== void 0 && e.sharedMode !== t.sharedMode), D = (e, t) => {
262
+ }, Q = (e, t) => !(t.page !== void 0 && e.page !== t.page || t.type !== void 0 && e.type !== t.type || t.required !== void 0 && (e.required ?? !1) !== t.required || t.hidden !== void 0 && (e.hidden ?? !1) !== t.hidden || t.readonly !== void 0 && (e.readonly ?? !1) !== t.readonly || t.disabled !== void 0 && (e.disabled ?? !1) !== t.disabled || t.sharedKey !== void 0 && e.sharedKey !== t.sharedKey || t.sharedMode !== void 0 && e.sharedMode !== t.sharedMode), D = (e, t) => {
263
263
  const r = y(e, t.pageCount);
264
264
  if (e.type !== "checkbox") return r;
265
265
  const n = t.pages.find((s) => s.index === r.page);
@@ -286,11 +286,11 @@ const g = (e) => typeof e == "object" && e !== null && "type" in e && e.type ===
286
286
  sharedValues: {},
287
287
  createdAt: (/* @__PURE__ */ new Date()).toISOString(),
288
288
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
289
- }), ee = async (e) => (await T.load(e)).getPages().map((r, n) => ({
289
+ }), ee = async (e) => (await v.load(e)).getPages().map((r, n) => ({
290
290
  index: n,
291
291
  width: r.getWidth(),
292
292
  height: r.getHeight()
293
- })), me = async (e) => {
293
+ })), pe = async (e) => {
294
294
  const t = await ee(e.pdfData);
295
295
  return Z({
296
296
  ...e,
@@ -464,7 +464,7 @@ const te = (e, t, r, n, i, s) => {
464
464
  color: w(0, 0, 0)
465
465
  });
466
466
  }, se = async (e, t, r, n, i, s) => {
467
- const o = S(r, s.width, s.height), a = s.height - o.y - o.height, d = v(
467
+ const o = S(r, s.width, s.height), a = s.height - o.y - o.height, d = T(
468
468
  i !== void 0 ? {
469
469
  image: n,
470
470
  mimeType: i
@@ -520,7 +520,7 @@ const te = (e, t, r, n, i, s) => {
520
520
  }, Ie = async (e, t = {}) => {
521
521
  var o;
522
522
  oe(e.pdfData);
523
- const r = await T.load(e.pdfData), n = await r.embedFont(N.Helvetica), i = r.getPages(), s = /* @__PURE__ */ new Map();
523
+ const r = await v.load(e.pdfData), n = await r.embedFont(N.Helvetica), i = r.getPages(), s = /* @__PURE__ */ new Map();
524
524
  for (const a of e.fields) {
525
525
  const d = s.get(a.page) ?? [];
526
526
  s.set(a.page, [...d, a]);
@@ -529,17 +529,17 @@ const te = (e, t, r, n, i, s) => {
529
529
  const c = i[a];
530
530
  if (!c) continue;
531
531
  const h = re(c);
532
- for (const p of d) {
532
+ for (const m of d) {
533
533
  const F = f(
534
- p,
534
+ m,
535
535
  e.fieldValues,
536
536
  e.sharedValues
537
- ), b = E(p, F);
537
+ ), b = E(m, F);
538
538
  if (!b.valid)
539
539
  throw new Error(
540
- `Field "${p.id}" is invalid for PDF export: ${((o = b.errors[0]) == null ? void 0 : o.message) ?? "Unknown validation error."}`
540
+ `Field "${m.id}" is invalid for PDF export: ${((o = b.errors[0]) == null ? void 0 : o.message) ?? "Unknown validation error."}`
541
541
  );
542
- await ie(c, r, p, F, n, h);
542
+ await ie(c, r, m, F, n, h);
543
543
  }
544
544
  }
545
545
  return r.save();
@@ -549,10 +549,10 @@ export {
549
549
  k as clampToPage,
550
550
  Ee as clearFieldValue,
551
551
  Z as createDocument,
552
- me as createDocumentFromPdfData,
552
+ pe as createDocumentFromPdfData,
553
553
  ye as createField,
554
554
  W as dateFormatToRegexPattern,
555
- m as ensureMinSize,
555
+ p as ensureMinSize,
556
556
  Ie as exportToPdf,
557
557
  X as formatDateValue,
558
558
  Fe as getField,
@@ -562,7 +562,7 @@ export {
562
562
  Ae as getResolvedFieldValue,
563
563
  Ve as getResolvedValues,
564
564
  ce as getSourceField,
565
- pe as isIsoDateString,
565
+ me as isIsoDateString,
566
566
  de as isPrimitiveValue,
567
567
  g as isSignatureValue,
568
568
  ge as matchesDateFormat,
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 =>\n typeof v === 'object' && v !== null && 'type' in v && v.type === 'signature';\n\nexport const isPrimitiveValue = (\n v: ContractFieldValue\n): v is string | number | boolean => typeof v !== 'object';\n\nexport const isUint8Array = (value: unknown): value is Uint8Array =>\n Object.prototype.toString.call(value) === '[object Uint8Array]';\n\nexport const cloneContractFieldValue = (\n value: ContractFieldValue\n): ContractFieldValue => {\n if (!isSignatureValue(value) || !isUint8Array(value.image)) return value;\n\n return {\n ...value,\n image: Uint8Array.from(value.image),\n };\n};\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 = (\n image: Uint8Array\n): string | undefined => {\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 {\n ContractFieldValue,\n FieldValueMap,\n SharedValueMap,\n} from '../types/value';\nimport { cloneContractFieldValue } from '../types/value';\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) {\n const sharedValue = sharedValues[field.sharedKey];\n if (sharedValue !== undefined) return cloneContractFieldValue(sharedValue);\n }\n\n const directValue = fieldValues[field.id];\n if (directValue !== undefined) return cloneContractFieldValue(directValue);\n\n const defaultValue = field.defaultValue as ContractFieldValue | undefined;\n return defaultValue !== undefined\n ? cloneContractFieldValue(defaultValue)\n : undefined;\n};\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\n return { ...sharedValues, [sharedKey]: cloneContractFieldValue(value) };\n};\n\r\nexport const resolveAllSharedValues = (\n fields: readonly ContractField[],\n fieldValues: FieldValueMap,\n sharedValues: SharedValueMap\n): FieldValueMap => {\n const resolved: Record<string, ContractFieldValue> = Object.fromEntries(\n Object.entries(fieldValues).map(([fieldId, value]) => [\n fieldId,\n cloneContractFieldValue(value),\n ])\n );\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 {\n getNormalizedSignatureImageMimeType,\n isSignatureValue,\n isUint8Array,\n} from '../types/value';\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)) {\n if (!isUint8Array(value.image) || value.image.length === 0) {\n errors.push(makeError(field, 'Image data is invalid.', 'INVALID_TYPE'));\n return { valid: false, errors };\n }\n if (value.image.length > MAX_SIGNATURE_IMAGE_BYTES) {\n errors.push(\n makeError(\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 {\n ContractField,\n ContractFieldType,\n SharedMode,\n} from '../types/field';\nimport type {\n ContractFieldValue,\n FieldValueMap,\n SharedValueMap,\n} from '../types/value';\nimport {\n cloneContractFieldValue,\n isSignatureValue,\n isUint8Array,\n} from '../types/value';\nimport { PDFDocument } from 'pdf-lib';\nimport type {\n ContractDocument,\n CreateDocumentFromPdfDataInput,\n CreateDocumentInput,\n PageInfo,\n} from '../types/document';\nimport { normalizeRect } from '../coordinates';\nimport { resolveFieldValue, setSharedFieldValue } from '../shared';\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 = (\n field: ContractField,\n value: ContractFieldValue\n): boolean => {\n switch (field.type) {\r\n case 'checkbox':\r\n return typeof value === 'boolean';\r\n case 'number':\n return typeof value === 'number' && Number.isFinite(value);\n case 'signature':\n return isSignatureValue(value) && isUint8Array(value.image);\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 }\n};\n\nexport interface GetFieldsOptions {\n readonly page?: number;\n readonly type?: ContractFieldType;\n readonly required?: boolean;\n readonly hidden?: boolean;\n readonly readonly?: boolean;\n readonly sharedKey?: string;\n readonly sharedMode?: SharedMode;\n}\n\nexport interface GetResolvedValuesOptions {\n readonly includeEmpty?: boolean;\n}\n\nexport type ResolvedFieldValueMap = Record<\n string,\n ContractFieldValue | undefined\n>;\n\nconst matchesFieldOptions = (\n field: ContractField,\n options: GetFieldsOptions\n): boolean => {\n if (options.page !== undefined && field.page !== options.page) return false;\n if (options.type !== undefined && field.type !== options.type) return false;\n if (\n options.required !== undefined &&\n (field.required ?? false) !== options.required\n ) {\n return false;\n }\n if (\n options.hidden !== undefined &&\n (field.hidden ?? false) !== options.hidden\n ) {\n return false;\n }\n if (\n options.readonly !== undefined &&\n (field.readonly ?? false) !== options.readonly\n ) {\n return false;\n }\n if (\n options.sharedKey !== undefined &&\n field.sharedKey !== options.sharedKey\n ) {\n return false;\n }\n if (\n options.sharedMode !== undefined &&\n field.sharedMode !== options.sharedMode\n ) {\n return false;\n }\n\n return true;\n};\n\nconst normalizeFieldRect = (\n field: ContractField,\n document: ContractDocument\n): ReturnType<typeof normalizeRect> => {\n const normalized = normalizeRect(field, document.pageCount);\n if (field.type !== 'checkbox') 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);\n return normalizeRect({ ...normalized, width: side, height: side }, document.pageCount);\n }\n\n const side = Math.min(\n normalized.width * page.width,\n normalized.height * page.height\n );\n\n return normalizeRect(\n {\n ...normalized,\n width: side / page.width,\n height: side / page.height,\n },\n document.pageCount\n );\n};\n\nexport const createDocument = (input: CreateDocumentInput): ContractDocument => ({\n ...input,\n fields: [],\n fieldValues: {},\n sharedValues: {},\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n});\n\nexport const getPdfPageInfo = async (\n pdfData: Uint8Array\n): Promise<readonly PageInfo[]> => {\n const pdf = await PDFDocument.load(pdfData);\n return pdf.getPages().map((page, index) => ({\n index,\n width: page.getWidth(),\n height: page.getHeight(),\n }));\n};\n\nexport const createDocumentFromPdfData = async (\n input: CreateDocumentFromPdfDataInput\n): Promise<ContractDocument> => {\n const pages = await getPdfPageInfo(input.pdfData);\n return createDocument({\n ...input,\n pageCount: pages.length,\n pages,\n });\n};\n\nexport const createField = (\n document: ContractDocument,\n field: ContractField\n): ContractDocument => {\n assertUniqueFieldId(document.fields, field.id);\n const normalized = normalizeFieldRect(field, document);\n const newField: ContractField = { ...field, ...normalized };\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;\n\n const merged = { ...f, ...patch };\n const normalized = normalizeFieldRect(merged, document);\n return { ...merged, ...normalized } as ContractField;\n });\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') {\n const sharedValues = setSharedFieldValue(\n document.fields,\n document.sharedValues,\n field.sharedKey,\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\n return {\n ...document,\n fieldValues: {\n ...document.fieldValues,\n [fieldId]: cloneContractFieldValue(value),\n },\n updatedAt: new Date().toISOString(),\n };\n};\n\r\nexport const clearFieldValue = (\n document: ContractDocument,\n fieldId: string\n): ContractDocument => {\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 };\n};\n\nexport const getField = (\n document: ContractDocument,\n fieldId: string\n): ContractField | undefined => {\n const field = document.fields.find((f) => f.id === fieldId);\n return field ? { ...field } : undefined;\n};\n\nexport const getFields = (\n document: ContractDocument,\n options: GetFieldsOptions = {}\n): readonly ContractField[] =>\n document.fields\n .filter((field) => matchesFieldOptions(field, options))\n .map((field) => ({ ...field }));\n\nexport const getResolvedFieldValue = (\n document: ContractDocument,\n fieldId: string\n): ContractFieldValue | undefined => {\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;\nexport function getResolvedValues(\n document: ContractDocument,\n options: GetResolvedValuesOptions & { readonly includeEmpty: true }\n): ResolvedFieldValueMap;\nexport function getResolvedValues(\n document: ContractDocument,\n options: GetResolvedValuesOptions\n): FieldValueMap | ResolvedFieldValueMap;\nexport function getResolvedValues(\n document: ContractDocument,\n options: GetResolvedValuesOptions = {}\n): FieldValueMap | ResolvedFieldValueMap {\n const resolved: ResolvedFieldValueMap = {};\n\n for (const field of document.fields) {\n const value = resolveFieldValue(\n field,\r\n document.fieldValues,\r\n document.sharedValues\n );\n if (value !== undefined || options.includeEmpty) {\n resolved[field.id] = value;\n }\n }\n\n return resolved;\n}\n\nexport type { ContractDocument, FieldValueMap, SharedValueMap };\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 {\n readonly width: number;\n readonly height: number;\n}\n\nconst getAlignedTextX = (\n field: ContractField,\n value: string,\n font: PDFFont,\n fontSize: number,\n x: number,\n width: number\n): number => {\n const padding = 2;\n const maxTextWidth = Math.max(0, width - padding * 2);\n const textWidth = Math.min(font.widthOfTextAtSize(value, fontSize), maxTextWidth);\n\n switch (field.textAlign) {\n case 'center':\n return x + (width - textWidth) / 2;\n case 'right':\n return x + width - padding - textWidth;\n case 'left':\n default:\n return x + padding;\n }\n};\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);\n const fontSize = field.textSize ?? 10;\n const textY = pageDim.height - abs.y - abs.height / 2 - fontSize / 2;\n const textX = getAlignedTextX(field, value, font, fontSize, abs.x, abs.width);\n\n page.drawText(value, {\n x: textX,\n y: Math.max(0, textY),\n size: fontSize,\n font,\r\n color: rgb(0, 0, 0),\r\n maxWidth: abs.width - 4,\r\n });\r\n};\r\n\r\nconst drawCheckboxField = (\n page: PDFPage,\n field: ContractField,\n value: boolean,\n pageDim: PageDimension\n): void => {\n if (!value) return;\n\n const rawAbs = toAbsoluteRect(field, pageDim.width, pageDim.height);\n const side = Math.min(rawAbs.width, rawAbs.height);\n const abs = {\n ...rawAbs,\n x: rawAbs.x + (rawAbs.width - side) / 2,\n y: rawAbs.y + (rawAbs.height - side) / 2,\n width: side,\n height: side,\n };\n const bottom = pageDim.height - abs.y - side;\n const strokeWidth = Math.max(1.2, side * 0.11);\n\n page.drawLine({\n start: { x: abs.x + side * 0.22, y: bottom + side * 0.49 },\n end: { x: abs.x + side * 0.42, y: bottom + side * 0.31 },\n thickness: strokeWidth,\n color: rgb(0, 0, 0),\n });\n page.drawLine({\n start: { x: abs.x + side * 0.42, y: bottom + side * 0.31 },\n end: { x: abs.x + side * 0.78, y: bottom + side * 0.68 },\n thickness: strokeWidth,\n color: rgb(0, 0, 0),\n });\n};\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":";AAmBO,MAAMA,IAAmB,CAACC,MAC/B,OAAOA,KAAM,YAAYA,MAAM,QAAQ,UAAUA,KAAKA,EAAE,SAAS,aAEtDC,KAAmB,CAC9BD,MACmC,OAAOA,KAAM,UAErCE,IAAe,CAACC,MAC3B,OAAO,UAAU,SAAS,KAAKA,CAAK,MAAM,uBAE/BC,IAA0B,CACrCD,MAEI,CAACJ,EAAiBI,CAAK,KAAK,CAACD,EAAaC,EAAM,KAAK,IAAUA,IAE5D;AAAA,EACL,GAAGA;AAAA,EACH,OAAO,WAAW,KAAKA,EAAM,KAAK;AAAA,GAIzBE,wBAAyC,IAAI;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AACF,CAAC,GAEYC,IAAkC,CAC7CC,MACuB;AACvB,QAAMC,IAAaD,KAAA,gBAAAA,EAAU,OAAO;AACpC,MAAKC,KACAH,EAAmC,IAAIG,CAAU;AACtD,WAAOA,MAAe,cAAc,eAAeA;AACrD,GAEaC,IAA+B,CAC1CC,MACuB;AACvB,MACEA,EAAM,UAAU,KAChBA,EAAM,CAAC,MAAM,OACbA,EAAM,CAAC,MAAM,MACbA,EAAM,CAAC,MAAM,MACbA,EAAM,CAAC,MAAM,MACbA,EAAM,CAAC,MAAM,MACbA,EAAM,CAAC,MAAM,MACbA,EAAM,CAAC,MAAM,MACbA,EAAM,CAAC,MAAM;AAEb,WAAO;AAGT,MACEA,EAAM,UAAU,KAChBA,EAAM,CAAC,MAAM,OACbA,EAAM,CAAC,MAAM,OACbA,EAAM,CAAC,MAAM;AAEb,WAAO;AAIX,GAEaC,IAAsC,CACjDR,MACuB;AACvB,QAAMS,IAAWH,EAA6BN,EAAM,KAAK,GACnDK,IAAaF,EAAgCH,EAAM,QAAQ;AAEjE,MAAI,EAAAK,KAAcI,KAAYJ,MAAeI;AAI7C,WAAOJ,KAAcI;AACvB,GC7FMC,IAAW,MACXC,IAAY,GACZC,IAAY,GAELC,IAAc,CAACb,GAAec,MACzC,KAAK,IAAI,GAAG,KAAK,IAAIA,IAAY,GAAG,KAAK,MAAMd,CAAK,CAAC,CAAC,GAE3Ce,IAAa,CAACf,MACzB,KAAK,IAAIW,GAAW,KAAK,IAAIC,GAAWZ,CAAK,CAAC,GAEnCgB,IAAgB,CAACC,MAC5B,KAAK,IAAIP,GAAUO,CAAI,GAEZC,IAAgB,CAC3BC,GACAL,MACmB;AACnB,QAAMM,IAAOP,EAAYM,EAAK,MAAML,CAAS,GAEvCO,IAAIN,EAAWI,EAAK,CAAC,GACrBG,IAAIP,EAAWI,EAAK,CAAC,GACrBI,IAAQP,EAAcG,EAAK,KAAK,GAChCK,IAASR,EAAcG,EAAK,MAAM,GAElCM,IAAe,KAAK,IAAIF,GAAOX,IAAYS,CAAC,GAC5CK,IAAgB,KAAK,IAAIF,GAAQZ,IAAYU,CAAC;AAEpD,SAAO;AAAA,IACL,MAAAF;AAAA,IACA,GAAAC;AAAA,IACA,GAAAC;AAAA,IACA,OAAON,EAAcS,CAAY;AAAA,IACjC,QAAQT,EAAcU,CAAa;AAAA,EAAA;AAEvC,GAEaC,IAAiB,CAC5BR,GACAS,GACAC,OAC6D;AAAA,EAC7D,GAAGV,EAAK,IAAIS;AAAA,EACZ,GAAGT,EAAK,IAAIU;AAAA,EACZ,OAAOV,EAAK,QAAQS;AAAA,EACpB,QAAQT,EAAK,SAASU;AACxB,IAEaC,KAAmB,CAC9BC,GACAH,GACAC,OACoB;AAAA,EACpB,MAAME,EAAI;AAAA,EACV,GAAGA,EAAI,IAAIH;AAAA,EACX,GAAGG,EAAI,IAAIF;AAAA,EACX,OAAOE,EAAI,QAAQH;AAAA,EACnB,QAAQG,EAAI,SAASF;AACvB,ICnDaG,KAAiB,CAC5BC,GACAC,MAEAD,EAAO,KAAK,CAACE,MAAMA,EAAE,cAAcD,KAAaC,EAAE,eAAe,QAAQ,GAE9DC,KAAkB,CAC7BH,GACAC,MAEAD,EAAO,OAAO,CAACE,MAAMA,EAAE,cAAcD,KAAaC,EAAE,eAAe,QAAQ,GAEhEE,IAAoB,CAC/BC,GACAC,GACAC,MACmC;AACnC,MAAIF,EAAM,WAAW;AACnB,UAAMG,IAAcD,EAAaF,EAAM,SAAS;AAChD,QAAIG,MAAgB,OAAW,QAAOxC,EAAwBwC,CAAW;AAAA,EAC3E;AAEA,QAAMC,IAAcH,EAAYD,EAAM,EAAE;AACxC,MAAII,MAAgB,OAAW,QAAOzC,EAAwByC,CAAW;AAEzE,QAAMC,IAAeL,EAAM;AAC3B,SAAOK,MAAiB,SACpB1C,EAAwB0C,CAAY,IACpC;AACN,GAEaC,IAAsB,CACjCX,GACAO,GACAN,GACAlC,MACmB;AAKnB,MAAI,CAJiBiC,EAAO;AAAA,IAC1B,CAACE,MAAMA,EAAE,cAAcD,KAAaC,EAAE,eAAe;AAAA,EAAA;AAIrD,UAAM,IAAI;AAAA,MACR,4DAA4DD,CAAS;AAAA,IAAA;AAIzE,SAAO,EAAE,GAAGM,GAAc,CAACN,CAAS,GAAGjC,EAAwBD,CAAK,EAAA;AACtE,GAEa6C,KAAyB,CACpCZ,GACAM,GACAC,MACkB;AAClB,QAAMM,IAA+C,OAAO;AAAA,IAC1D,OAAO,QAAQP,CAAW,EAAE,IAAI,CAAC,CAACQ,GAAS/C,CAAK,MAAM;AAAA,MACpD+C;AAAA,MACA9C,EAAwBD,CAAK;AAAA,IAAA,CAC9B;AAAA,EAAA;AAGH,aAAWsC,KAASL,GAAQ;AAC1B,UAAMjC,IAAQqC,EAAkBC,GAAOC,GAAaC,CAAY;AAChE,IAAIxC,MAAU,WACZ8C,EAASR,EAAM,EAAE,IAAItC;AAAA,EAEzB;AAEA,SAAO8C;AACT,GC5DME,IAA4B,IAAI,OAAO,MAEvCC,IAAY,CAChBX,GACAY,GACAC,MAAA;;AAC0B;AAAA,IAC1B,SAASb,EAAM;AAAA,IACf,WAAWA,EAAM;AAAA,IACjB,WAASc,IAAAd,EAAM,eAAN,gBAAAc,EAAkB,kBAAiBF;AAAA,IAC5C,MAAAC;AAAA,EACF;AAAA,GAEME,IAAsB,CAC1Bf,GACAtC,MAC2B;AAC3B,QAAMsD,IAAiC,CAAA,GACjC,EAAE,YAAAC,MAAejB;AACvB,MAAI,CAACiB,EAAY,QAAOD;AAsBxB,MApBIC,EAAW,cAAc,UAAavD,EAAM,SAASuD,EAAW,aAClED,EAAO;AAAA,IACLL;AAAA,MACEX;AAAA,MACA,oBAAoBiB,EAAW,SAAS;AAAA,MACxC;AAAA,IAAA;AAAA,EACF,GAIAA,EAAW,cAAc,UAAavD,EAAM,SAASuD,EAAW,aAClED,EAAO;AAAA,IACLL;AAAA,MACEX;AAAA,MACA,mBAAmBiB,EAAW,SAAS;AAAA,MACvC;AAAA,IAAA;AAAA,EACF,GAIAA,EAAW,YAAY;AACzB,QAAI;AAEF,MADc,IAAI,OAAOA,EAAW,OAAO,EAChC,KAAKvD,CAAK,KACnBsD,EAAO;AAAA,QACLL;AAAA,UACEX;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,IAGN,QAAQ;AACN,MAAAgB,EAAO;AAAA,QACLL;AAAA,UACEX;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,IAEJ;AAGF,SAAOgB;AACT,GAEME,IAAsB,CAC1BlB,GACAtC,MAC2B;AAC3B,QAAMsD,IAAiC,CAAA,GACjCG,IAAWnB;AAEjB,SAAImB,EAAS,QAAQ,UAAazD,IAAQyD,EAAS,OACjDH,EAAO;AAAA,IACLL,EAAUX,GAAO,oBAAoBmB,EAAS,GAAG,KAAK,WAAW;AAAA,EAAA,GAIjEA,EAAS,QAAQ,UAAazD,IAAQyD,EAAS,OACjDH,EAAO;AAAA,IACLL,EAAUX,GAAO,oBAAoBmB,EAAS,GAAG,KAAK,WAAW;AAAA,EAAA,GAI9DH;AACT,GAEaI,IAAgB,CAC3BpB,GACAtC,MACqB;AACrB,MAAIsC,EAAM,eAAe;AACvB,WAAO,EAAE,OAAO,IAAM,QAAQ,CAAA,EAAC;AAGjC,QAAMgB,IAAiC,CAAA,GAEjCK,IACJ3D,MAAU,UACVA,MAAU,MACVA,MAAU,QACT,OAAOA,KAAU,aAAa,CAACA,KAASsC,EAAM,SAAS;AAE1D,MAAIA,EAAM,YAAYqB;AACpB,WAAAL,EAAO,KAAKL,EAAUX,GAAO,2BAA2B,UAAU,CAAC,GAC5D,EAAE,OAAO,IAAO,QAAAgB,EAAA;AAGzB,MAAItD,MAAU,UAAaA,MAAU;AACnC,WAAO,EAAE,OAAO,IAAM,QAAQ,CAAA,EAAC;AAGjC,MACGsC,EAAM,SAAS,cAAc,OAAOtC,KAAU,aAC9CsC,EAAM,SAAS,aACb,OAAOtC,KAAU,YAAY,CAAC,OAAO,SAASA,CAAK,MACrDsC,EAAM,SAAS,eAAe,CAAC1C,EAAiBI,CAAK,KACrDsC,EAAM,SAAS,cACdA,EAAM,SAAS,YACfA,EAAM,SAAS,eACf,OAAOtC,KAAU;AAEnB,WAAAsD,EAAO,KAAKL,EAAUX,GAAO,6CAA6C,cAAc,CAAC,GAClF,EAAE,OAAO,IAAO,QAAAgB,EAAA;AAGzB,MAAI,OAAOtD,KAAU;AACnB,IAAAsD,EAAO,KAAK,GAAGD,EAAoBf,GAAOtC,CAAK,CAAC;AAAA,WACvC,OAAOA,KAAU;AAC1B,IAAAsD,EAAO,KAAK,GAAGE,EAAoBlB,GAAOtC,CAAK,CAAC;AAAA,WACvCJ,EAAiBI,CAAK,GAAG;AAClC,QAAI,CAACD,EAAaC,EAAM,KAAK,KAAKA,EAAM,MAAM,WAAW;AACvD,aAAAsD,EAAO,KAAKL,EAAUX,GAAO,0BAA0B,cAAc,CAAC,GAC/D,EAAE,OAAO,IAAO,QAAAgB,EAAA;AAEzB,IAAItD,EAAM,MAAM,SAASgD,KACvBM,EAAO;AAAA,MACLL;AAAA,QACEX;AAAA,QACA,sBAAsB,KAAK,MAAMU,KAA6B,OAAO,KAAK,CAAC;AAAA,QAC3E;AAAA,MAAA;AAAA,IACF,GAGAxC,EAAoCR,CAAK,MAAM,UACjDsD,EAAO;AAAA,MACLL;AAAA,QACEX;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EAGN;AAEA,SAAO,EAAE,OAAOgB,EAAO,WAAW,GAAG,QAAAA,EAAA;AACvC,GAEaM,IAA2B,CACtC3B,GACAM,GACAC,GACAN,MACqB;AAErB,QAAM2B,IADc5B,EAAO,OAAO,CAACE,MAAMA,EAAE,cAAcD,CAAS,EAClC,KAAK,CAACC,MAAMA,EAAE,eAAe,QAAQ;AAErE,MAAI,CAAC0B;AACH,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,QACN;AAAA,UACE,SAAS3B;AAAA,UACT,WAAWA;AAAA,UACX,SAAS,yCAAyCA,CAAS;AAAA,UAC3D,MAAM;AAAA,QAAA;AAAA,MACR;AAAA,IACF;AAIJ,QAAMlC,IAAQqC,EAAkBwB,GAAatB,GAAaC,CAAY;AACtE,SAAOkB,EAAcG,GAAa7D,CAAK;AACzC,GAEa8D,KAAmB,CAC9BC,MACqB;AACrB,QAAM,EAAE,QAAA9B,GAAQ,aAAAM,GAAa,cAAAC,EAAA,IAAiBuB,GAExCC,wBAA0B,IAAA,GAC1BC,IAAoC,CAAA;AAE1C,aAAW3B,KAASL;AAClB,QAAIK,EAAM,eAAe;AAEzB,UAAIA,EAAM,WAAW;AACnB,YAAI0B,EAAoB,IAAI1B,EAAM,SAAS,EAAG;AAC9C,QAAA0B,EAAoB,IAAI1B,EAAM,SAAS;AAEvC,cAAM4B,IAASN;AAAA,UACb3B;AAAA,UACAM;AAAA,UACAC;AAAA,UACAF,EAAM;AAAA,QAAA;AAER,QAAA2B,EAAU,KAAK,GAAGC,EAAO,MAAM;AAAA,MACjC,OAAO;AACL,cAAMlE,IAAQqC,EAAkBC,GAAOC,GAAaC,CAAY,GAC1D0B,IAASR,EAAcpB,GAAOtC,CAAK;AACzC,QAAAiE,EAAU,KAAK,GAAGC,EAAO,MAAM;AAAA,MACjC;AAGF,SAAO,EAAE,OAAOD,EAAU,WAAW,GAAG,QAAQA,EAAA;AAClD,GC3OME,IAAqB,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC,GAC/EC,IAAsB,oBAAI,IAAI,CAAC,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC,GAErGC,IAAkB,CAACC,MACvBF,EAAoB,IAAIE,CAAI,IAAI,KAAKA,CAAI,KAAKA,GAEnCC,IAA2B,CAACC,MAA2B;AAClE,MAAIC,IAAU;AAEd,WAASC,IAAQ,GAAGA,IAAQF,EAAO,UAAS;AAC1C,UAAMF,IAAOE,EAAOE,CAAK;AACzB,QAAIJ,MAAS,OAAW;AAExB,QAAIH,EAAmB,IAAIG,CAAI,GAAG;AAChC,UAAIK,IAAc;AAClB,aAAOH,EAAOE,IAAQC,CAAW,MAAML;AACrC,QAAAK,KAAe;AAEjB,MAAAF,KAAW,OAAOE,CAAW,KAC7BD,KAASC;AACT;AAAA,IACF;AAEA,IAAAF,KAAWJ,EAAgBC,CAAI,GAC/BI,KAAS;AAAA,EACX;AAEA,SAAOD;AACT,GAEaG,KAAoB,CAACJ,GAAgBxE,MAA2B;AAC3E,QAAM6E,IAAgBL,EAAO,KAAA;AAC7B,SAAKK,IAEE,IAAI,OAAO,OAAON,EAAyBM,CAAa,CAAC,IAAI,EAAE,KAAK7E,CAAK,IAFrD;AAG7B,GAEM8E,IAAmB,6BAEZC,KAAkB,CAAC/E,MAC9B8E,EAAiB,KAAK9E,CAAK,GAEhBgF,IAAkB,CAC7BhF,GACAwE,MACW;AACX,QAAMS,IAAQH,EAAiB,KAAK9E,CAAK,GACnC6E,IAAgBL,KAAA,gBAAAA,EAAQ;AAC9B,MAAI,CAACS,KAAS,CAACJ,EAAe,QAAO7E;AAErC,QAAM,CAAA,EAAGkF,IAAO,IAAIC,IAAQ,IAAIC,IAAM,EAAE,IAAIH;AAE5C,MAAII,IAAY;AAChB,WAASX,IAAQ,GAAGA,IAAQG,EAAc,UAAS;AACjD,UAAMP,IAAOO,EAAcH,CAAK;AAChC,QAAIJ,MAAS,OAAW;AAExB,QAAIK,IAAc;AAClB,WAAOE,EAAcH,IAAQC,CAAW,MAAML;AAC5C,MAAAK,KAAe;AAGjB,QAAIL,MAAS,OAAOA,MAAS,KAAK;AAChC,MAAAe,KAAaV,MAAgB,IAAIO,EAAK,MAAM,EAAE,IAAIA,EAAK,SAASP,GAAa,GAAG,GAChFD,KAASC;AACT;AAAA,IACF;AAEA,QAAIL,MAAS,OAAOA,MAAS,KAAK;AAChC,MAAAe,KAAaV,MAAgB,IAAI,OAAO,OAAOQ,CAAK,CAAC,IAAIA,EAAM,SAASR,GAAa,GAAG,GACxFD,KAASC;AACT;AAAA,IACF;AAEA,QAAIL,MAAS,OAAOA,MAAS,KAAK;AAChC,MAAAe,KAAaV,MAAgB,IAAI,OAAO,OAAOS,CAAG,CAAC,IAAIA,EAAI,SAAST,GAAa,GAAG,GACpFD,KAASC;AACT;AAAA,IACF;AAEA,IAAAU,KAAaf,GACbI,KAAS;AAAA,EACX;AAEA,SAAOW;AACT,GC5DMC,IAAoC,CACxCrD,MACS;AACT,QAAMsD,wBAAoB,IAAA;AAC1B,aAAWpD,KAAKF,GAAQ;AACtB,QAAI,CAACE,EAAE,aAAaA,EAAE,eAAe,SAAU;AAC/C,UAAMqD,IAAOD,EAAc,IAAIpD,EAAE,SAAS;AAC1C,QAAIqD,MAAS;AACX,YAAM,IAAI;AAAA,QACR,eAAerD,EAAE,SAAS,+CAA+CqD,CAAI,SAASrD,EAAE,EAAE;AAAA,MAAA;AAG9F,IAAAoD,EAAc,IAAIpD,EAAE,WAAWA,EAAE,EAAE;AAAA,EACrC;AACF,GAEMsD,IAAsB,CAC1BxD,GACAc,MACS;AACT,MAAKd,EAAO,KAAK,CAACK,MAAUA,EAAM,OAAOS,CAAO;AAEhD,UAAM,IAAI,MAAM,aAAaA,CAAO,mBAAmB;AACzD,GAEM2C,IAA6B,CACjCpD,GACAtC,MACY;AACZ,UAAQsC,EAAM,MAAA;AAAA,IACZ,KAAK;AACH,aAAO,OAAOtC,KAAU;AAAA,IAC1B,KAAK;AACH,aAAO,OAAOA,KAAU,YAAY,OAAO,SAASA,CAAK;AAAA,IAC3D,KAAK;AACH,aAAOJ,EAAiBI,CAAK,KAAKD,EAAaC,EAAM,KAAK;AAAA,IAC5D,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAOA,KAAU;AAAA,IAC1B;AACE,aAAO;AAAA,EAAA;AAEb,GAqBM2F,IAAsB,CAC1BrD,GACAsD,MAEI,EAAAA,EAAQ,SAAS,UAAatD,EAAM,SAASsD,EAAQ,QACrDA,EAAQ,SAAS,UAAatD,EAAM,SAASsD,EAAQ,QAEvDA,EAAQ,aAAa,WACpBtD,EAAM,YAAY,QAAWsD,EAAQ,YAKtCA,EAAQ,WAAW,WAClBtD,EAAM,UAAU,QAAWsD,EAAQ,UAKpCA,EAAQ,aAAa,WACpBtD,EAAM,YAAY,QAAWsD,EAAQ,YAKtCA,EAAQ,cAAc,UACtBtD,EAAM,cAAcsD,EAAQ,aAK5BA,EAAQ,eAAe,UACvBtD,EAAM,eAAesD,EAAQ,aAQ3BC,IAAqB,CACzBvD,GACAyB,MACqC;AACrC,QAAM1D,IAAaa,EAAcoB,GAAOyB,EAAS,SAAS;AAC1D,MAAIzB,EAAM,SAAS,WAAY,QAAOjC;AAEtC,QAAMe,IAAO2C,EAAS,MAAM,KAAK,CAAC+B,MAAcA,EAAU,UAAUzF,EAAW,IAAI;AACnF,MAAI,CAACe,KAAQA,EAAK,SAAS,KAAKA,EAAK,UAAU,GAAG;AAChD,UAAM2E,IAAO,KAAK,IAAI1F,EAAW,OAAOA,EAAW,MAAM;AACzD,WAAOa,EAAc,EAAE,GAAGb,GAAY,OAAO0F,GAAM,QAAQA,EAAAA,GAAQhC,EAAS,SAAS;AAAA,EACvF;AAEA,QAAMgC,IAAO,KAAK;AAAA,IAChB1F,EAAW,QAAQe,EAAK;AAAA,IACxBf,EAAW,SAASe,EAAK;AAAA,EAAA;AAG3B,SAAOF;AAAA,IACL;AAAA,MACE,GAAGb;AAAA,MACH,OAAO0F,IAAO3E,EAAK;AAAA,MACnB,QAAQ2E,IAAO3E,EAAK;AAAA,IAAA;AAAA,IAEtB2C,EAAS;AAAA,EAAA;AAEb,GAEaiC,IAAiB,CAACC,OAAkD;AAAA,EAC/E,GAAGA;AAAA,EACH,QAAQ,CAAA;AAAA,EACR,aAAa,CAAA;AAAA,EACb,cAAc,CAAA;AAAA,EACd,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,EACtB,YAAW,oBAAI,KAAA,GAAO,YAAA;AACxB,IAEaC,KAAiB,OAC5BC,OAEY,MAAMC,EAAY,KAAKD,CAAO,GAC/B,SAAA,EAAW,IAAI,CAAC/E,GAAMsD,OAAW;AAAA,EAC1C,OAAAA;AAAA,EACA,OAAOtD,EAAK,SAAA;AAAA,EACZ,QAAQA,EAAK,UAAA;AAAU,EACvB,GAGSiF,KAA4B,OACvCJ,MAC8B;AAC9B,QAAMK,IAAQ,MAAMJ,GAAeD,EAAM,OAAO;AAChD,SAAOD,EAAe;AAAA,IACpB,GAAGC;AAAA,IACH,WAAWK,EAAM;AAAA,IACjB,OAAAA;AAAA,EAAA,CACD;AACH,GAEaC,KAAc,CACzBxC,GACAzB,MACqB;AACrB,EAAAmD,EAAoB1B,EAAS,QAAQzB,EAAM,EAAE;AAC7C,QAAMjC,IAAawF,EAAmBvD,GAAOyB,CAAQ,GAC/CyC,IAA0B,EAAE,GAAGlE,GAAO,GAAGjC,EAAA,GAEzC4B,IAAS,CAAC,GAAG8B,EAAS,QAAQyC,CAAQ;AAC5C,SAAAlB,EAAkCrD,CAAM,GAEjC;AAAA,IACL,GAAG8B;AAAA,IACH,QAAA9B;AAAA,IACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,EAAY;AAEtC,GAEawE,IAAc,CACzB1C,GACAhB,GACA2D,MACqB;AACrB,QAAMzE,IAAS8B,EAAS,OAAO,IAAI,CAAC5B,MAAM;AACxC,QAAIA,EAAE,OAAOY,EAAS,QAAOZ;AAE7B,UAAMwE,IAAS,EAAE,GAAGxE,GAAG,GAAGuE,EAAA,GACpBrG,IAAawF,EAAmBc,GAAQ5C,CAAQ;AACtD,WAAO,EAAE,GAAG4C,GAAQ,GAAGtG,EAAA;AAAA,EACzB,CAAC;AAED,SAAAiF,EAAkCrD,CAAM,GAEjC;AAAA,IACL,GAAG8B;AAAA,IACH,QAAA9B;AAAA,IACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,EAAY;AAEtC,GAEa2E,KAAc,CACzB7C,GACAhB,MACqB;AACrB,QAAMT,IAAQyB,EAAS,OAAO,KAAK,CAAC5B,MAAMA,EAAE,OAAOY,CAAO,GAEpDd,IAAS8B,EAAS,OAAO,OAAO,CAAC5B,MAAMA,EAAE,OAAOY,CAAO,GAEvDR,IAAc,OAAO;AAAA,IACzB,OAAO,QAAQwB,EAAS,WAAW,EAAE,OAAO,CAAC,CAAC8C,CAAE,MAAMA,MAAO9D,CAAO;AAAA,EAAA;AAGtE,MAAI,EAAE,cAAAP,MAAiBuB;AAEvB,SAAIzB,KAAA,QAAAA,EAAO,aAAaA,EAAM,eAAe,aACpBL,EAAO;AAAA,IAC5B,CAACE,MAAMA,EAAE,cAAcG,EAAM,aAAaH,EAAE,eAAe;AAAA,EAAA,MAG3DK,IAAe,OAAO;AAAA,IACpB,OAAO,QAAQA,CAAY,EAAE,OAAO,CAAC,CAACsE,CAAG,MAAMA,MAAQxE,EAAM,SAAS;AAAA,EAAA,KAKrE;AAAA,IACL,GAAGyB;AAAA,IACH,QAAA9B;AAAA,IACA,aAAAM;AAAA,IACA,cAAAC;AAAA,IACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,EAAY;AAEtC,GAEauE,KAAY,CACvBhD,GACAhB,GACAiE,MACqB;AACrB,QAAM,EAAE,MAAA5F,GAAM,GAAAC,GAAG,GAAAC,EAAA,IAAM0F;AACvB,SAAOP;AAAA,IACL1C;AAAA,IACAhB;AAAA,IACA3B,MAAS,SAAY,EAAE,MAAAA,GAAM,GAAAC,GAAG,GAAAC,EAAA,IAAM,EAAE,GAAAD,GAAG,GAAAC,EAAA;AAAA,EAAE;AAEjD,GAEa2F,KAAc,CACzBlD,GACAhB,GACA9B,MAEAwF,EAAY1C,GAAUhB,GAAS;AAAA,EAC7B,OAAO9B,EAAK;AAAA,EACZ,QAAQA,EAAK;AACf,CAAC,GAEUiG,KAAgB,CAC3BnD,GACAhB,GACA/C,MACqB;AACrB,QAAMsC,IAAQyB,EAAS,OAAO,KAAK,CAAC5B,MAAMA,EAAE,OAAOY,CAAO;AAE1D,MAAI,CAACT;AACH,UAAM,IAAI,MAAM,aAAaS,CAAO,kBAAkB;AAGxD,MAAIT,EAAM,eAAe;AACvB,UAAM,IAAI;AAAA,MACR,qCAAqCS,CAAO;AAAA,IAAA;AAIhD,MAAIT,EAAM;AACR,UAAM,IAAI,MAAM,wCAAwCS,CAAO,IAAI;AAGrE,MAAI,CAAC2C,EAA2BpD,GAAOtC,CAAK;AAC1C,UAAM,IAAI;AAAA,MACR,oBAAoB+C,CAAO,sCAAsCT,EAAM,IAAI;AAAA,IAAA;AAI/E,MAAIA,EAAM,aAAaA,EAAM,eAAe,UAAU;AACpD,UAAME,IAAeI;AAAA,MACnBmB,EAAS;AAAA,MACTA,EAAS;AAAA,MACTzB,EAAM;AAAA,MACNtC;AAAA,IAAA;AAEF,WAAO;AAAA,MACL,GAAG+D;AAAA,MACH,cAAAvB;AAAA,MACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,IAAY;AAAA,EAEtC;AAEA,SAAO;AAAA,IACL,GAAGuB;AAAA,IACH,aAAa;AAAA,MACX,GAAGA,EAAS;AAAA,MACZ,CAAChB,CAAO,GAAG9C,EAAwBD,CAAK;AAAA,IAAA;AAAA,IAE1C,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,EAAY;AAEtC,GAEamH,KAAkB,CAC7BpD,GACAhB,MACqB;AACrB,QAAMT,IAAQyB,EAAS,OAAO,KAAK,CAAC5B,MAAMA,EAAE,OAAOY,CAAO;AAE1D,MAAI,CAACT;AACH,UAAM,IAAI,MAAM,aAAaS,CAAO,kBAAkB;AAGxD,MAAIT,EAAM,eAAe;AACvB,UAAM,IAAI;AAAA,MACR,uCAAuCS,CAAO;AAAA,IAAA;AAIlD,MAAIT,EAAM;AACR,UAAM,IAAI,MAAM,0CAA0CS,CAAO,IAAI;AAGvE,MAAIT,EAAM,aAAaA,EAAM,eAAe,UAAU;AACpD,UAAM,EAAE,CAACA,EAAM,SAAS,GAAG8E,GAAU,GAAG5E,EAAA,IAAiBuB,EAAS;AAClE,WAAO;AAAA,MACL,GAAGA;AAAA,MACH,cAAAvB;AAAA,MACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,IAAY;AAAA,EAEtC;AAEA,QAAM,EAAE,CAACO,CAAO,GAAGqE,GAAU,GAAG7E,EAAA,IAAgBwB,EAAS;AACzD,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,aAAAxB;AAAA,IACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,EAAY;AAEtC,GAEa8E,KAAW,CACtBtD,GACAhB,MAC8B;AAC9B,QAAMT,IAAQyB,EAAS,OAAO,KAAK,CAAC5B,MAAMA,EAAE,OAAOY,CAAO;AAC1D,SAAOT,IAAQ,EAAE,GAAGA,EAAA,IAAU;AAChC,GAEagF,KAAY,CACvBvD,GACA6B,IAA4B,CAAA,MAE5B7B,EAAS,OACN,OAAO,CAACzB,MAAUqD,EAAoBrD,GAAOsD,CAAO,CAAC,EACrD,IAAI,CAACtD,OAAW,EAAE,GAAGA,IAAQ,GAErBiF,KAAwB,CACnCxD,GACAhB,MACmC;AACnC,QAAMT,IAAQyB,EAAS,OAAO,KAAK,CAAC5B,MAAMA,EAAE,OAAOY,CAAO;AAC1D,MAAKT;AAEL,WAAOD,EAAkBC,GAAOyB,EAAS,aAAaA,EAAS,YAAY;AAC7E;AAWO,SAASyD,GACdzD,GACA6B,IAAoC,IACG;AACvC,QAAM9C,IAAkC,CAAA;AAExC,aAAWR,KAASyB,EAAS,QAAQ;AACnC,UAAM/D,IAAQqC;AAAA,MACZC;AAAA,MACAyB,EAAS;AAAA,MACTA,EAAS;AAAA,IAAA;AAEX,KAAI/D,MAAU,UAAa4F,EAAQ,kBACjC9C,EAASR,EAAM,EAAE,IAAItC;AAAA,EAEzB;AAEA,SAAO8C;AACT;ACpZA,MAAM2E,KAAkB,CACtBnF,GACAtC,GACA0H,GACAC,GACAtG,GACAE,MACW;AAEX,QAAMqG,IAAe,KAAK,IAAI,GAAGrG,IAAQ,CAAW,GAC9CsG,IAAY,KAAK,IAAIH,EAAK,kBAAkB1H,GAAO2H,CAAQ,GAAGC,CAAY;AAEhF,UAAQtF,EAAM,WAAA;AAAA,IACZ,KAAK;AACH,aAAOjB,KAAKE,IAAQsG,KAAa;AAAA,IACnC,KAAK;AACH,aAAOxG,IAAIE,IAAQ,IAAUsG;AAAA,IAC/B,KAAK;AAAA,IACL;AACE,aAAOxG,IAAI;AAAA,EAAA;AAEjB,GAEMyG,KAAmB,CAAC1G,OAAkC;AAAA,EAC1D,OAAOA,EAAK,SAAA;AAAA,EACZ,QAAQA,EAAK,UAAA;AACf,IAEM2G,IAAgB,CACpB3G,GACAkB,GACAtC,GACA0H,GACAM,MACS;AACT,QAAMjG,IAAMJ,EAAeW,GAAO0F,EAAQ,OAAOA,EAAQ,MAAM,GACzDL,IAAWrF,EAAM,YAAY,IAC7B2F,IAAQD,EAAQ,SAASjG,EAAI,IAAIA,EAAI,SAAS,IAAI4F,IAAW,GAC7DO,IAAQT,GAAgBnF,GAAOtC,GAAO0H,GAAMC,GAAU5F,EAAI,GAAGA,EAAI,KAAK;AAE5E,EAAAX,EAAK,SAASpB,GAAO;AAAA,IACnB,GAAGkI;AAAA,IACH,GAAG,KAAK,IAAI,GAAGD,CAAK;AAAA,IACpB,MAAMN;AAAA,IACN,MAAAD;AAAA,IACA,OAAOS,EAAI,GAAG,GAAG,CAAC;AAAA,IAClB,UAAUpG,EAAI,QAAQ;AAAA,EAAA,CACvB;AACH,GAEMqG,KAAoB,CACxBhH,GACAkB,GACAtC,GACAgI,MACS;AACT,MAAI,CAAChI,EAAO;AAEZ,QAAMqI,IAAS1G,EAAeW,GAAO0F,EAAQ,OAAOA,EAAQ,MAAM,GAC5DjC,IAAO,KAAK,IAAIsC,EAAO,OAAOA,EAAO,MAAM,GAC3CtG,IAAM;AAAA,IACV,GAAGsG;AAAA,IACH,GAAGA,EAAO,KAAKA,EAAO,QAAQtC,KAAQ;AAAA,IACtC,GAAGsC,EAAO,KAAKA,EAAO,SAAStC,KAAQ;AAAA,EAGzC,GACMuC,IAASN,EAAQ,SAASjG,EAAI,IAAIgE,GAClCwC,IAAc,KAAK,IAAI,KAAKxC,IAAO,IAAI;AAE7C,EAAA3E,EAAK,SAAS;AAAA,IACZ,OAAO,EAAE,GAAGW,EAAI,IAAIgE,IAAO,MAAM,GAAGuC,IAASvC,IAAO,KAAA;AAAA,IACpD,KAAK,EAAE,GAAGhE,EAAI,IAAIgE,IAAO,MAAM,GAAGuC,IAASvC,IAAO,KAAA;AAAA,IAClD,WAAWwC;AAAA,IACX,OAAOJ,EAAI,GAAG,GAAG,CAAC;AAAA,EAAA,CACnB,GACD/G,EAAK,SAAS;AAAA,IACZ,OAAO,EAAE,GAAGW,EAAI,IAAIgE,IAAO,MAAM,GAAGuC,IAASvC,IAAO,KAAA;AAAA,IACpD,KAAK,EAAE,GAAGhE,EAAI,IAAIgE,IAAO,MAAM,GAAGuC,IAASvC,IAAO,KAAA;AAAA,IAClD,WAAWwC;AAAA,IACX,OAAOJ,EAAI,GAAG,GAAG,CAAC;AAAA,EAAA,CACnB;AACH,GAEMK,KAAiB,OACrBpH,GACAqH,GACAnG,GACAoG,GACAtI,GACA4H,MACkB;AAClB,QAAMjG,IAAMJ,EAAeW,GAAO0F,EAAQ,OAAOA,EAAQ,MAAM,GACzD1G,IAAI0G,EAAQ,SAASjG,EAAI,IAAIA,EAAI,QACjC4G,IAAqBnI;AAAA,IACzBJ,MAAa,SACT;AAAA,MAEE,OAAOsI;AAAA,MACP,UAAAtI;AAAA,IAAA,IAEF;AAAA,MAEE,OAAOsI;AAAA,IAAA;AAAA,EACT;AAGN,MAAIC,MAAuB;AACzB,UAAM,IAAI;AAAA,MACR,UAAUrG,EAAM,EAAE;AAAA,IAAA;AAOtB,QAAMsG,IAFJD,MAAuB,eAGrB,MAAMF,EAAO,SAASC,CAAS,IAC/B,MAAMD,EAAO,SAASC,CAAS;AAEnC,EAAAtH,EAAK,UAAUwH,GAAe;AAAA,IAC5B,GAAG7G,EAAI;AAAA,IACP,GAAG,KAAK,IAAI,GAAGT,CAAC;AAAA,IAChB,OAAOS,EAAI;AAAA,IACX,QAAQA,EAAI;AAAA,EAAA,CACb;AACH,GAEM8G,KAAc,OAClBzH,GACAqH,GACAnG,GACAtC,GACA0H,GACAM,MACkB;AAClB,MAAI,EAAAhI,MAAU,UAAasC,EAAM,SAEjC;AAAA,QAAI1C,EAAiBI,CAAK,GAAG;AAC3B,YAAMwI;AAAA,QACJpH;AAAA,QACAqH;AAAA,QACAnG;AAAA,QACAtC,EAAM;AAAA,QACNA,EAAM;AAAA,QACNgI;AAAA,MAAA;AAEF;AAAA,IACF;AAEA,QAAI,OAAOhI,KAAU,WAAW;AAC9B,MAAIsC,EAAM,SAAS,cACjB8F,GAAkBhH,GAAMkB,GAAOtC,GAAOgI,CAAO;AAE/C;AAAA,IACF;AAEA,QAAI,OAAOhI,KAAU,YAAYA,EAAM,KAAA,MAAW,IAAI;AACpD,MAAA+H;AAAA,QACE3G;AAAA,QACAkB;AAAA,QACAA,EAAM,SAAS,SAAS0C,EAAgBhF,GAAOsC,EAAM,UAAU,IAAItC;AAAA,QACnE0H;AAAA,QACAM;AAAA,MAAA;AAEF;AAAA,IACF;AAEA,IAAI,OAAOhI,KAAU,YACnB+H,EAAc3G,GAAMkB,GAAO,OAAOtC,CAAK,GAAG0H,GAAMM,CAAO;AAAA;AAE3D,GAKMc,KAAkB,CAAC3C,MAA8B;AACrD,MAAI,EAAAA,EAAQ,aAAa;AAEzB,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAEJ,GAEa4C,KAAc,OACzBhF,GACAiF,IAA0B,OACF;;AACxB,EAAAF,GAAgB/E,EAAS,OAAO;AAChC,QAAM0E,IAAS,MAAMrC,EAAY,KAAKrC,EAAS,OAAO,GAChD2D,IAAO,MAAMe,EAAO,UAAUQ,EAAc,SAAS,GAErD3C,IAAQmC,EAAO,SAAA,GAEfS,wBAAmB,IAAA;AACzB,aAAW5G,KAASyB,EAAS,QAAQ;AACnC,UAAMoF,IAAaD,EAAa,IAAI5G,EAAM,IAAI,KAAK,CAAA;AACnD,IAAA4G,EAAa,IAAI5G,EAAM,MAAM,CAAC,GAAG6G,GAAY7G,CAAK,CAAC;AAAA,EACrD;AAEA,aAAW,CAAC8G,GAAWD,CAAU,KAAKD,GAAc;AAClD,UAAM9H,IAAOkF,EAAM8C,CAAS;AAC5B,QAAI,CAAChI,EAAM;AAEX,UAAM4G,IAAUF,GAAiB1G,CAAI;AAErC,eAAWkB,KAAS6G,GAAY;AAC9B,YAAMnJ,IAAQqC;AAAA,QACZC;AAAA,QACAyB,EAAS;AAAA,QACTA,EAAS;AAAA,MAAA,GAELG,IAASR,EAAcpB,GAAOtC,CAAK;AACzC,UAAI,CAACkE,EAAO;AACV,cAAM,IAAI;AAAA,UACR,UAAU5B,EAAM,EAAE,kCAAgCc,IAAAc,EAAO,OAAO,CAAC,MAAf,gBAAAd,EAAkB,YAAW,2BAA2B;AAAA,QAAA;AAG9G,YAAMyF,GAAYzH,GAAMqH,GAAQnG,GAAOtC,GAAO0H,GAAMM,CAAO;AAAA,IAC7D;AAAA,EACF;AAEA,SAAOS,EAAO,KAAA;AAChB;"}
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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"}
@@ -8,6 +8,7 @@ export interface GetFieldsOptions {
8
8
  readonly required?: boolean;
9
9
  readonly hidden?: boolean;
10
10
  readonly readonly?: boolean;
11
+ readonly disabled?: boolean;
11
12
  readonly sharedKey?: string;
12
13
  readonly sharedMode?: SharedMode;
13
14
  }
@@ -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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"}
@@ -2,6 +2,10 @@ import { FieldValidation } from './validation';
2
2
 
3
3
  export type ContractFieldType = 'text' | 'date' | 'checkbox' | 'signature' | 'email' | 'phone' | 'number' | 'textarea';
4
4
  export type SignatureInputMode = 'all' | 'sign-only' | 'stamp-only';
5
+ export interface SignatureActions {
6
+ readonly edit?: boolean;
7
+ readonly remove?: boolean;
8
+ }
5
9
  export type SharedMode = 'source' | 'mirror';
6
10
  export type TextAlign = 'left' | 'center' | 'right';
7
11
  export interface BaseField {
@@ -20,6 +24,7 @@ export interface BaseField {
20
24
  readonly required?: boolean;
21
25
  readonly placeholder?: string;
22
26
  readonly readonly?: boolean;
27
+ readonly disabled?: boolean;
23
28
  readonly hidden?: boolean;
24
29
  readonly defaultValue?: unknown;
25
30
  readonly validation?: FieldValidation;
@@ -40,6 +45,7 @@ export interface CheckboxField extends BaseField {
40
45
  export interface SignatureField extends BaseField {
41
46
  readonly type: 'signature';
42
47
  readonly signatureMode?: SignatureInputMode;
48
+ readonly signatureActions?: SignatureActions;
43
49
  }
44
50
  export interface EmailField extends BaseField {
45
51
  readonly type: 'email';
@@ -1 +1 @@
1
- {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/types/field.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/types/field.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.1.1",
3
+ "version": "0.3.0",
4
4
  "description": "Framework-agnostic electronic contract document engine",
5
5
  "license": "MIT",
6
6
  "keywords": [