@open-agreements/open-agreements 0.2.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/LICENSE +21 -0
- package/README.md +359 -0
- package/bin/open-agreements.js +4 -0
- package/content/external/LICENSE +27 -0
- package/content/external/README.md +38 -0
- package/content/external/yc-safe-discount/README.md +16 -0
- package/content/external/yc-safe-discount/clean.json +4 -0
- package/content/external/yc-safe-discount/metadata.yaml +67 -0
- package/content/external/yc-safe-discount/replacements.json +13 -0
- package/content/external/yc-safe-discount/template.docx +0 -0
- package/content/external/yc-safe-mfn/README.md +16 -0
- package/content/external/yc-safe-mfn/clean.json +4 -0
- package/content/external/yc-safe-mfn/metadata.yaml +64 -0
- package/content/external/yc-safe-mfn/replacements.json +12 -0
- package/content/external/yc-safe-mfn/template.docx +0 -0
- package/content/external/yc-safe-pro-rata-side-letter/README.md +16 -0
- package/content/external/yc-safe-pro-rata-side-letter/clean.json +4 -0
- package/content/external/yc-safe-pro-rata-side-letter/metadata.yaml +49 -0
- package/content/external/yc-safe-pro-rata-side-letter/replacements.json +9 -0
- package/content/external/yc-safe-pro-rata-side-letter/template.docx +0 -0
- package/content/external/yc-safe-valuation-cap/README.md +16 -0
- package/content/external/yc-safe-valuation-cap/clean.json +4 -0
- package/content/external/yc-safe-valuation-cap/metadata.yaml +64 -0
- package/content/external/yc-safe-valuation-cap/replacements.json +12 -0
- package/content/external/yc-safe-valuation-cap/template.docx +0 -0
- package/content/recipes/nvca-certificate-of-incorporation/clean.json +8 -0
- package/content/recipes/nvca-certificate-of-incorporation/metadata.yaml +43 -0
- package/content/recipes/nvca-certificate-of-incorporation/replacements.json +9 -0
- package/content/recipes/nvca-indemnification-agreement/clean.json +17 -0
- package/content/recipes/nvca-indemnification-agreement/metadata.yaml +79 -0
- package/content/recipes/nvca-indemnification-agreement/replacements.json +17 -0
- package/content/recipes/nvca-investors-rights-agreement/clean.json +12 -0
- package/content/recipes/nvca-investors-rights-agreement/metadata.yaml +71 -0
- package/content/recipes/nvca-investors-rights-agreement/replacements.json +18 -0
- package/content/recipes/nvca-management-rights-letter/clean.json +7 -0
- package/content/recipes/nvca-management-rights-letter/metadata.yaml +47 -0
- package/content/recipes/nvca-management-rights-letter/replacements.json +11 -0
- package/content/recipes/nvca-rofr-co-sale-agreement/clean.json +7 -0
- package/content/recipes/nvca-rofr-co-sale-agreement/metadata.yaml +76 -0
- package/content/recipes/nvca-rofr-co-sale-agreement/replacements.json +17 -0
- package/content/recipes/nvca-stock-purchase-agreement/clean.json +13 -0
- package/content/recipes/nvca-stock-purchase-agreement/computed.json +103 -0
- package/content/recipes/nvca-stock-purchase-agreement/metadata.yaml +138 -0
- package/content/recipes/nvca-stock-purchase-agreement/normalize.json +83 -0
- package/content/recipes/nvca-stock-purchase-agreement/replacements.json +41 -0
- package/content/recipes/nvca-voting-agreement/README.md +53 -0
- package/content/recipes/nvca-voting-agreement/clean.json +7 -0
- package/content/recipes/nvca-voting-agreement/metadata.yaml +66 -0
- package/content/recipes/nvca-voting-agreement/replacements.json +18 -0
- package/content/templates/bonterms-mutual-nda/README.md +27 -0
- package/content/templates/bonterms-mutual-nda/metadata.yaml +58 -0
- package/content/templates/bonterms-mutual-nda/source.json +18 -0
- package/content/templates/bonterms-mutual-nda/template.docx +0 -0
- package/content/templates/bonterms-professional-services-agreement/README.md +24 -0
- package/content/templates/bonterms-professional-services-agreement/metadata.yaml +45 -0
- package/content/templates/bonterms-professional-services-agreement/selections.json +12 -0
- package/content/templates/bonterms-professional-services-agreement/source.json +18 -0
- package/content/templates/bonterms-professional-services-agreement/template.docx +0 -0
- package/content/templates/closing-checklist/metadata.yaml +39 -0
- package/content/templates/closing-checklist/template.docx +0 -0
- package/content/templates/common-paper-ai-addendum/README.md +23 -0
- package/content/templates/common-paper-ai-addendum/metadata.yaml +31 -0
- package/content/templates/common-paper-ai-addendum/template.docx +0 -0
- package/content/templates/common-paper-ai-addendum-in-app/README.md +21 -0
- package/content/templates/common-paper-ai-addendum-in-app/metadata.yaml +21 -0
- package/content/templates/common-paper-ai-addendum-in-app/template.docx +0 -0
- package/content/templates/common-paper-amendment/README.md +27 -0
- package/content/templates/common-paper-amendment/metadata.yaml +53 -0
- package/content/templates/common-paper-amendment/template.docx +0 -0
- package/content/templates/common-paper-business-associate-agreement/README.md +29 -0
- package/content/templates/common-paper-business-associate-agreement/metadata.yaml +56 -0
- package/content/templates/common-paper-business-associate-agreement/replacements.json +3 -0
- package/content/templates/common-paper-business-associate-agreement/template.docx +0 -0
- package/content/templates/common-paper-cloud-service-agreement/README.md +32 -0
- package/content/templates/common-paper-cloud-service-agreement/metadata.yaml +354 -0
- package/content/templates/common-paper-cloud-service-agreement/template.docx +0 -0
- package/content/templates/common-paper-csa-click-through/README.md +33 -0
- package/content/templates/common-paper-csa-click-through/metadata.yaml +73 -0
- package/content/templates/common-paper-csa-click-through/template.docx +0 -0
- package/content/templates/common-paper-csa-with-ai/README.md +49 -0
- package/content/templates/common-paper-csa-with-ai/metadata.yaml +143 -0
- package/content/templates/common-paper-csa-with-ai/replacements.json +7 -0
- package/content/templates/common-paper-csa-with-ai/template.docx +0 -0
- package/content/templates/common-paper-csa-with-sla/README.md +53 -0
- package/content/templates/common-paper-csa-with-sla/metadata.yaml +159 -0
- package/content/templates/common-paper-csa-with-sla/replacements.json +7 -0
- package/content/templates/common-paper-csa-with-sla/template.docx +0 -0
- package/content/templates/common-paper-csa-without-sla/README.md +47 -0
- package/content/templates/common-paper-csa-without-sla/metadata.yaml +135 -0
- package/content/templates/common-paper-csa-without-sla/replacements.json +7 -0
- package/content/templates/common-paper-csa-without-sla/template.docx +0 -0
- package/content/templates/common-paper-data-processing-agreement/README.md +46 -0
- package/content/templates/common-paper-data-processing-agreement/metadata.yaml +130 -0
- package/content/templates/common-paper-data-processing-agreement/replacements.json +3 -0
- package/content/templates/common-paper-data-processing-agreement/template.docx +0 -0
- package/content/templates/common-paper-design-partner-agreement/README.md +29 -0
- package/content/templates/common-paper-design-partner-agreement/metadata.yaml +59 -0
- package/content/templates/common-paper-design-partner-agreement/replacements.json +4 -0
- package/content/templates/common-paper-design-partner-agreement/template.docx +0 -0
- package/content/templates/common-paper-independent-contractor-agreement/README.md +27 -0
- package/content/templates/common-paper-independent-contractor-agreement/metadata.yaml +55 -0
- package/content/templates/common-paper-independent-contractor-agreement/template.docx +0 -0
- package/content/templates/common-paper-letter-of-intent/README.md +25 -0
- package/content/templates/common-paper-letter-of-intent/metadata.yaml +42 -0
- package/content/templates/common-paper-letter-of-intent/template.docx +0 -0
- package/content/templates/common-paper-mutual-nda/README.md +29 -0
- package/content/templates/common-paper-mutual-nda/metadata.yaml +59 -0
- package/content/templates/common-paper-mutual-nda/selections.json +38 -0
- package/content/templates/common-paper-mutual-nda/template.docx +0 -0
- package/content/templates/common-paper-one-way-nda/README.md +27 -0
- package/content/templates/common-paper-one-way-nda/metadata.yaml +59 -0
- package/content/templates/common-paper-one-way-nda/template.docx +0 -0
- package/content/templates/common-paper-order-form/README.md +36 -0
- package/content/templates/common-paper-order-form/metadata.yaml +87 -0
- package/content/templates/common-paper-order-form/replacements.json +5 -0
- package/content/templates/common-paper-order-form/template.docx +0 -0
- package/content/templates/common-paper-order-form-with-sla/README.md +42 -0
- package/content/templates/common-paper-order-form-with-sla/metadata.yaml +111 -0
- package/content/templates/common-paper-order-form-with-sla/replacements.json +5 -0
- package/content/templates/common-paper-order-form-with-sla/template.docx +0 -0
- package/content/templates/common-paper-partnership-agreement/README.md +34 -0
- package/content/templates/common-paper-partnership-agreement/metadata.yaml +78 -0
- package/content/templates/common-paper-partnership-agreement/replacements.json +7 -0
- package/content/templates/common-paper-partnership-agreement/template.docx +0 -0
- package/content/templates/common-paper-pilot-agreement/README.md +34 -0
- package/content/templates/common-paper-pilot-agreement/metadata.yaml +100 -0
- package/content/templates/common-paper-pilot-agreement/replacements.json +4 -0
- package/content/templates/common-paper-pilot-agreement/selections.json +37 -0
- package/content/templates/common-paper-pilot-agreement/template.docx +0 -0
- package/content/templates/common-paper-professional-services-agreement/README.md +44 -0
- package/content/templates/common-paper-professional-services-agreement/metadata.yaml +124 -0
- package/content/templates/common-paper-professional-services-agreement/replacements.json +8 -0
- package/content/templates/common-paper-professional-services-agreement/template.docx +0 -0
- package/content/templates/common-paper-software-license-agreement/README.md +18 -0
- package/content/templates/common-paper-software-license-agreement/metadata.yaml +13 -0
- package/content/templates/common-paper-software-license-agreement/template.docx +0 -0
- package/content/templates/common-paper-statement-of-work/README.md +32 -0
- package/content/templates/common-paper-statement-of-work/metadata.yaml +71 -0
- package/content/templates/common-paper-statement-of-work/replacements.json +3 -0
- package/content/templates/common-paper-statement-of-work/template.docx +0 -0
- package/content/templates/common-paper-term-sheet/README.md +22 -0
- package/content/templates/common-paper-term-sheet/metadata.yaml +28 -0
- package/content/templates/common-paper-term-sheet/template.docx +0 -0
- package/content/templates/openagreements-employee-ip-inventions-assignment/README.md +31 -0
- package/content/templates/openagreements-employee-ip-inventions-assignment/metadata.yaml +71 -0
- package/content/templates/openagreements-employee-ip-inventions-assignment/template.docx +0 -0
- package/content/templates/openagreements-employee-ip-inventions-assignment/template.md +80 -0
- package/content/templates/openagreements-employment-confidentiality-acknowledgement/README.md +30 -0
- package/content/templates/openagreements-employment-confidentiality-acknowledgement/metadata.yaml +60 -0
- package/content/templates/openagreements-employment-confidentiality-acknowledgement/template.docx +0 -0
- package/content/templates/openagreements-employment-confidentiality-acknowledgement/template.md +51 -0
- package/content/templates/openagreements-employment-offer-letter/README.md +33 -0
- package/content/templates/openagreements-employment-offer-letter/metadata.yaml +75 -0
- package/content/templates/openagreements-employment-offer-letter/template.docx +0 -0
- package/content/templates/openagreements-employment-offer-letter/template.md +90 -0
- package/content/templates/working-group-list/metadata.yaml +22 -0
- package/content/templates/working-group-list/template.docx +0 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +199 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/checklist.d.ts +22 -0
- package/dist/commands/checklist.d.ts.map +1 -0
- package/dist/commands/checklist.js +222 -0
- package/dist/commands/checklist.js.map +1 -0
- package/dist/commands/fill.d.ts +18 -0
- package/dist/commands/fill.d.ts.map +1 -0
- package/dist/commands/fill.js +119 -0
- package/dist/commands/fill.js.map +1 -0
- package/dist/commands/list.d.ts +7 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +247 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/recipe.d.ts +24 -0
- package/dist/commands/recipe.d.ts.map +1 -0
- package/dist/commands/recipe.js +96 -0
- package/dist/commands/recipe.js.map +1 -0
- package/dist/commands/scan.d.ts +28 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +138 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/validate.d.ts +6 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +158 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/core/checklist/index.d.ts +38 -0
- package/dist/core/checklist/index.d.ts.map +1 -0
- package/dist/core/checklist/index.js +229 -0
- package/dist/core/checklist/index.js.map +1 -0
- package/dist/core/checklist/patch-apply.d.ts +65 -0
- package/dist/core/checklist/patch-apply.d.ts.map +1 -0
- package/dist/core/checklist/patch-apply.js +274 -0
- package/dist/core/checklist/patch-apply.js.map +1 -0
- package/dist/core/checklist/patch-schemas.d.ts +86 -0
- package/dist/core/checklist/patch-schemas.d.ts.map +1 -0
- package/dist/core/checklist/patch-schemas.js +89 -0
- package/dist/core/checklist/patch-schemas.js.map +1 -0
- package/dist/core/checklist/patch-validator.d.ts +76 -0
- package/dist/core/checklist/patch-validator.d.ts.map +1 -0
- package/dist/core/checklist/patch-validator.js +404 -0
- package/dist/core/checklist/patch-validator.js.map +1 -0
- package/dist/core/checklist/schemas.d.ts +270 -0
- package/dist/core/checklist/schemas.d.ts.map +1 -0
- package/dist/core/checklist/schemas.js +229 -0
- package/dist/core/checklist/schemas.js.map +1 -0
- package/dist/core/checklist/test-utils.d.ts +7 -0
- package/dist/core/checklist/test-utils.d.ts.map +1 -0
- package/dist/core/checklist/test-utils.js +13 -0
- package/dist/core/checklist/test-utils.js.map +1 -0
- package/dist/core/command-generation/adapters/claude.d.ts +11 -0
- package/dist/core/command-generation/adapters/claude.d.ts.map +1 -0
- package/dist/core/command-generation/adapters/claude.js +91 -0
- package/dist/core/command-generation/adapters/claude.js.map +1 -0
- package/dist/core/command-generation/types.d.ts +14 -0
- package/dist/core/command-generation/types.d.ts.map +1 -0
- package/dist/core/command-generation/types.js +2 -0
- package/dist/core/command-generation/types.js.map +1 -0
- package/dist/core/employment/jurisdiction-rules.d.ts +20 -0
- package/dist/core/employment/jurisdiction-rules.d.ts.map +1 -0
- package/dist/core/employment/jurisdiction-rules.js +57 -0
- package/dist/core/employment/jurisdiction-rules.js.map +1 -0
- package/dist/core/employment/memo.d.ts +57 -0
- package/dist/core/employment/memo.d.ts.map +1 -0
- package/dist/core/employment/memo.js +589 -0
- package/dist/core/employment/memo.js.map +1 -0
- package/dist/core/engine.d.ts +13 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +182 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/external/index.d.ts +8 -0
- package/dist/core/external/index.d.ts.map +1 -0
- package/dist/core/external/index.js +50 -0
- package/dist/core/external/index.js.map +1 -0
- package/dist/core/external/types.d.ts +18 -0
- package/dist/core/external/types.d.ts.map +1 -0
- package/dist/core/external/types.js +2 -0
- package/dist/core/external/types.js.map +1 -0
- package/dist/core/fill-pipeline.d.ts +64 -0
- package/dist/core/fill-pipeline.d.ts.map +1 -0
- package/dist/core/fill-pipeline.js +350 -0
- package/dist/core/fill-pipeline.js.map +1 -0
- package/dist/core/fill-utils.d.ts +39 -0
- package/dist/core/fill-utils.d.ts.map +1 -0
- package/dist/core/fill-utils.js +127 -0
- package/dist/core/fill-utils.js.map +1 -0
- package/dist/core/metadata.d.ts +194 -0
- package/dist/core/metadata.d.ts.map +1 -0
- package/dist/core/metadata.js +197 -0
- package/dist/core/metadata.js.map +1 -0
- package/dist/core/recipe/bracket-normalizer.d.ts +46 -0
- package/dist/core/recipe/bracket-normalizer.d.ts.map +1 -0
- package/dist/core/recipe/bracket-normalizer.js +354 -0
- package/dist/core/recipe/bracket-normalizer.js.map +1 -0
- package/dist/core/recipe/cleaner.d.ts +27 -0
- package/dist/core/recipe/cleaner.d.ts.map +1 -0
- package/dist/core/recipe/cleaner.js +345 -0
- package/dist/core/recipe/cleaner.js.map +1 -0
- package/dist/core/recipe/computed.d.ts +136 -0
- package/dist/core/recipe/computed.d.ts.map +1 -0
- package/dist/core/recipe/computed.js +225 -0
- package/dist/core/recipe/computed.js.map +1 -0
- package/dist/core/recipe/downloader.d.ts +8 -0
- package/dist/core/recipe/downloader.d.ts.map +1 -0
- package/dist/core/recipe/downloader.js +58 -0
- package/dist/core/recipe/downloader.js.map +1 -0
- package/dist/core/recipe/index.d.ts +17 -0
- package/dist/core/recipe/index.d.ts.map +1 -0
- package/dist/core/recipe/index.js +90 -0
- package/dist/core/recipe/index.js.map +1 -0
- package/dist/core/recipe/ooxml-parts.d.ts +21 -0
- package/dist/core/recipe/ooxml-parts.d.ts.map +1 -0
- package/dist/core/recipe/ooxml-parts.js +33 -0
- package/dist/core/recipe/ooxml-parts.js.map +1 -0
- package/dist/core/recipe/patcher.d.ts +34 -0
- package/dist/core/recipe/patcher.d.ts.map +1 -0
- package/dist/core/recipe/patcher.js +423 -0
- package/dist/core/recipe/patcher.js.map +1 -0
- package/dist/core/recipe/replacement-keys.d.ts +33 -0
- package/dist/core/recipe/replacement-keys.d.ts.map +1 -0
- package/dist/core/recipe/replacement-keys.js +53 -0
- package/dist/core/recipe/replacement-keys.js.map +1 -0
- package/dist/core/recipe/source-drift.d.ts +33 -0
- package/dist/core/recipe/source-drift.d.ts.map +1 -0
- package/dist/core/recipe/source-drift.js +113 -0
- package/dist/core/recipe/source-drift.js.map +1 -0
- package/dist/core/recipe/types.d.ts +33 -0
- package/dist/core/recipe/types.d.ts.map +1 -0
- package/dist/core/recipe/types.js +2 -0
- package/dist/core/recipe/types.js.map +1 -0
- package/dist/core/recipe/verifier.d.ts +24 -0
- package/dist/core/recipe/verifier.d.ts.map +1 -0
- package/dist/core/recipe/verifier.js +158 -0
- package/dist/core/recipe/verifier.js.map +1 -0
- package/dist/core/selector.d.ts +41 -0
- package/dist/core/selector.d.ts.map +1 -0
- package/dist/core/selector.js +323 -0
- package/dist/core/selector.js.map +1 -0
- package/dist/core/unified-pipeline.d.ts +53 -0
- package/dist/core/unified-pipeline.d.ts.map +1 -0
- package/dist/core/unified-pipeline.js +107 -0
- package/dist/core/unified-pipeline.js.map +1 -0
- package/dist/core/validation/external.d.ts +16 -0
- package/dist/core/validation/external.d.ts.map +1 -0
- package/dist/core/validation/external.js +114 -0
- package/dist/core/validation/external.js.map +1 -0
- package/dist/core/validation/license.d.ts +15 -0
- package/dist/core/validation/license.d.ts.map +1 -0
- package/dist/core/validation/license.js +30 -0
- package/dist/core/validation/license.js.map +1 -0
- package/dist/core/validation/output.d.ts +12 -0
- package/dist/core/validation/output.d.ts.map +1 -0
- package/dist/core/validation/output.js +47 -0
- package/dist/core/validation/output.js.map +1 -0
- package/dist/core/validation/recipe.d.ts +19 -0
- package/dist/core/validation/recipe.d.ts.map +1 -0
- package/dist/core/validation/recipe.js +159 -0
- package/dist/core/validation/recipe.js.map +1 -0
- package/dist/core/validation/scan-metadata.d.ts +21 -0
- package/dist/core/validation/scan-metadata.d.ts.map +1 -0
- package/dist/core/validation/scan-metadata.js +70 -0
- package/dist/core/validation/scan-metadata.js.map +1 -0
- package/dist/core/validation/template.d.ts +11 -0
- package/dist/core/validation/template.d.ts.map +1 -0
- package/dist/core/validation/template.js +248 -0
- package/dist/core/validation/template.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/paths.d.ts +43 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +149 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +148 -0
- package/skills/cloud-service-agreement/CONNECTORS.md +19 -0
- package/skills/cloud-service-agreement/SKILL.md +172 -0
- package/skills/data-privacy-agreement/CONNECTORS.md +19 -0
- package/skills/data-privacy-agreement/SKILL.md +158 -0
- package/skills/delaware-franchise-tax/CONNECTORS.md +16 -0
- package/skills/delaware-franchise-tax/SKILL.md +206 -0
- package/skills/delaware-franchise-tax/reference/ecorp-portal-playwright-notes.md +136 -0
- package/skills/delaware-franchise-tax/reference/faq.md +101 -0
- package/skills/delaware-franchise-tax/reference/filing-instructions.md +111 -0
- package/skills/delaware-franchise-tax/reference/tax-calculation.md +167 -0
- package/skills/employment-contract/CONNECTORS.md +19 -0
- package/skills/employment-contract/SKILL.md +157 -0
- package/skills/nda/CONNECTORS.md +19 -0
- package/skills/nda/SKILL.md +153 -0
- package/skills/open-agreements/CONNECTORS.md +19 -0
- package/skills/open-agreements/SKILL.md +182 -0
- package/skills/safe/CONNECTORS.md +19 -0
- package/skills/safe/SKILL.md +161 -0
- package/skills/services-agreement/CONNECTORS.md +19 -0
- package/skills/services-agreement/SKILL.md +156 -0
- package/skills/unit-test-philosophy/SKILL.md +113 -0
- package/skills/unit-test-philosophy/references/allure-test-spec-writing-guide.md +164 -0
- package/skills/venture-financing/CONNECTORS.md +19 -0
- package/skills/venture-financing/SKILL.md +169 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declarative option selection for DOCX templates.
|
|
3
|
+
*
|
|
4
|
+
* Handles radio-button `( )` and checkbox `[ ]` option groups in table cells.
|
|
5
|
+
* A per-template `selections.json` config defines groups, and this module
|
|
6
|
+
* deletes unselected options + their sub-clauses from the DOCX XML before filling.
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import AdmZip from 'adm-zip';
|
|
11
|
+
import { DOMParser, XMLSerializer } from '@xmldom/xmldom';
|
|
12
|
+
import { enumerateTextParts, getGeneralTextPartNames } from './recipe/ooxml-parts.js';
|
|
13
|
+
const W_NS = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Schema
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
const TriggerSchema = z.union([
|
|
18
|
+
z.literal('default'),
|
|
19
|
+
z.object({ field: z.string(), equals: z.union([z.string(), z.boolean()]) }),
|
|
20
|
+
z.object({ field: z.string() }),
|
|
21
|
+
]);
|
|
22
|
+
const OptionSchema = z.object({
|
|
23
|
+
marker: z.string(),
|
|
24
|
+
trigger: TriggerSchema,
|
|
25
|
+
});
|
|
26
|
+
const GroupSchema = z.object({
|
|
27
|
+
id: z.string(),
|
|
28
|
+
type: z.enum(['radio', 'checkbox']),
|
|
29
|
+
options: z.array(OptionSchema).min(2),
|
|
30
|
+
});
|
|
31
|
+
export const SelectionsConfigSchema = z.object({
|
|
32
|
+
groups: z.array(GroupSchema).min(1),
|
|
33
|
+
});
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Loader
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
export function loadSelectionsConfig(path) {
|
|
38
|
+
const raw = readFileSync(path, 'utf-8');
|
|
39
|
+
return SelectionsConfigSchema.parse(JSON.parse(raw));
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Helpers
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
/** Extract paragraph text by concatenating all <w:t> elements. */
|
|
45
|
+
function extractParagraphText(para) {
|
|
46
|
+
if (!para.getElementsByTagNameNS)
|
|
47
|
+
return '';
|
|
48
|
+
const tElements = para.getElementsByTagNameNS(W_NS, 't');
|
|
49
|
+
const parts = [];
|
|
50
|
+
for (let i = 0; i < tElements.length; i++) {
|
|
51
|
+
parts.push(tElements[i].textContent ?? '');
|
|
52
|
+
}
|
|
53
|
+
return parts.join('').trim();
|
|
54
|
+
}
|
|
55
|
+
/** Check if a paragraph's text starts with a radio or checkbox marker. */
|
|
56
|
+
const MARKER_RE = /^\(\s*x?\s*\)|^\[\s*x?\s*\]|^[\u2610\u2611\u2612]/i;
|
|
57
|
+
function hasOptionPrefix(text) {
|
|
58
|
+
return MARKER_RE.test(text);
|
|
59
|
+
}
|
|
60
|
+
/** Update a paragraph's marker prefix to checked state. */
|
|
61
|
+
function setChecked(para, type) {
|
|
62
|
+
const tElements = para.getElementsByTagNameNS(W_NS, 't');
|
|
63
|
+
if (tElements.length === 0)
|
|
64
|
+
return;
|
|
65
|
+
// Reconstruct the full text from all <w:t> elements
|
|
66
|
+
const fullText = extractParagraphText(para);
|
|
67
|
+
if (!fullText)
|
|
68
|
+
return;
|
|
69
|
+
// Unicode ballot box: swap ☐/☒ → ☑
|
|
70
|
+
if (/^[\u2610\u2612]/.test(fullText)) {
|
|
71
|
+
for (let i = 0; i < tElements.length; i++) {
|
|
72
|
+
const content = tElements[i].textContent ?? '';
|
|
73
|
+
if (/[\u2610\u2612]/.test(content)) {
|
|
74
|
+
tElements[i].textContent = content.replace(/[\u2610\u2612]/, '\u2611');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Determine marker style from the paragraph text first. Some templates use
|
|
81
|
+
// square-bracket markers ([ ]) with radio semantics.
|
|
82
|
+
let openBracket = '[';
|
|
83
|
+
let closeBracket = ']';
|
|
84
|
+
if (/\(\s*[xX]?\s*\)/.test(fullText)) {
|
|
85
|
+
openBracket = '(';
|
|
86
|
+
closeBracket = ')';
|
|
87
|
+
}
|
|
88
|
+
else if (/\[\s*[xX]?\s*\]/.test(fullText)) {
|
|
89
|
+
openBracket = '[';
|
|
90
|
+
closeBracket = ']';
|
|
91
|
+
}
|
|
92
|
+
else if (type === 'radio') {
|
|
93
|
+
openBracket = '(';
|
|
94
|
+
closeBracket = ')';
|
|
95
|
+
}
|
|
96
|
+
const checkedPrefix = openBracket === '(' ? '( x )' : '[ x ]';
|
|
97
|
+
// Walk through <w:t> elements to find and replace the marker
|
|
98
|
+
let foundOpen = false;
|
|
99
|
+
let foundClose = false;
|
|
100
|
+
const tToBlank = [];
|
|
101
|
+
for (let i = 0; i < tElements.length; i++) {
|
|
102
|
+
const t = tElements[i];
|
|
103
|
+
const content = t.textContent ?? '';
|
|
104
|
+
if (!foundOpen) {
|
|
105
|
+
const openIdx = content.indexOf(openBracket);
|
|
106
|
+
if (openIdx >= 0) {
|
|
107
|
+
foundOpen = true;
|
|
108
|
+
// Check if close bracket is in the same <w:t>
|
|
109
|
+
const closeIdx = content.indexOf(closeBracket, openIdx + 1);
|
|
110
|
+
if (closeIdx >= 0) {
|
|
111
|
+
// Both brackets in same element — simple replacement
|
|
112
|
+
const before = content.substring(0, openIdx);
|
|
113
|
+
const after = content.substring(closeIdx + 1);
|
|
114
|
+
t.textContent = before + checkedPrefix + after;
|
|
115
|
+
foundClose = true;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// Open bracket found, close bracket in a later element
|
|
120
|
+
t.textContent = content.substring(0, openIdx) + checkedPrefix;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else if (!foundClose) {
|
|
125
|
+
const closeIdx = content.indexOf(closeBracket);
|
|
126
|
+
if (closeIdx >= 0) {
|
|
127
|
+
// Found the closing bracket — keep everything after it
|
|
128
|
+
t.textContent = content.substring(closeIdx + 1);
|
|
129
|
+
foundClose = true;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// Between open and close — blank out this text node
|
|
134
|
+
tToBlank.push(t);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Blank out intermediate text nodes (between open and close brackets)
|
|
139
|
+
for (const t of tToBlank) {
|
|
140
|
+
t.textContent = '';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/** Evaluate a trigger against fill data. */
|
|
144
|
+
function triggerFires(trigger, data) {
|
|
145
|
+
if (trigger === 'default')
|
|
146
|
+
return false; // default never "fires" — it's the fallback
|
|
147
|
+
if ('equals' in trigger) {
|
|
148
|
+
const val = data[trigger.field];
|
|
149
|
+
return val !== undefined && val !== '' && String(val) === String(trigger.equals);
|
|
150
|
+
}
|
|
151
|
+
// { field: "x" } — truthy check
|
|
152
|
+
const val = data[trigger.field];
|
|
153
|
+
return val !== undefined && val !== '' && val !== false && val !== 'false';
|
|
154
|
+
}
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
// Core algorithm
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
/**
|
|
159
|
+
* Apply option selections to a DOCX buffer and return the modified buffer.
|
|
160
|
+
*
|
|
161
|
+
* For each group in the config:
|
|
162
|
+
* 1. Find option paragraphs by marker text + radio/checkbox prefix
|
|
163
|
+
* 2. Verify they share the same table cell
|
|
164
|
+
* 3. Classify paragraphs as header, option, or sub-clause
|
|
165
|
+
* 4. Evaluate triggers to determine selected options
|
|
166
|
+
* 5. Remove unselected options + sub-clauses
|
|
167
|
+
* 6. Mark selected options as checked
|
|
168
|
+
*/
|
|
169
|
+
export async function applySelections(inputPath, outputPath, config, data) {
|
|
170
|
+
const inputBuf = readFileSync(inputPath);
|
|
171
|
+
const zip = new AdmZip(inputBuf);
|
|
172
|
+
const parser = new DOMParser();
|
|
173
|
+
const serializer = new XMLSerializer();
|
|
174
|
+
const parts = enumerateTextParts(zip);
|
|
175
|
+
const partNames = getGeneralTextPartNames(parts);
|
|
176
|
+
let modified = false;
|
|
177
|
+
for (const partName of partNames) {
|
|
178
|
+
const entry = zip.getEntry(partName);
|
|
179
|
+
if (!entry)
|
|
180
|
+
continue;
|
|
181
|
+
const xml = entry.getData().toString('utf-8');
|
|
182
|
+
const doc = parser.parseFromString(xml, 'text/xml');
|
|
183
|
+
for (const group of config.groups) {
|
|
184
|
+
const result = processGroup(doc, group, data);
|
|
185
|
+
if (result)
|
|
186
|
+
modified = true;
|
|
187
|
+
}
|
|
188
|
+
if (modified) {
|
|
189
|
+
const outXml = serializer.serializeToString(doc);
|
|
190
|
+
zip.updateFile(partName, Buffer.from(outXml, 'utf-8'));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Rebuild zip from scratch (adm-zip data descriptor workaround)
|
|
194
|
+
const outZip = new AdmZip();
|
|
195
|
+
for (const entry of zip.getEntries()) {
|
|
196
|
+
outZip.addFile(entry.entryName, entry.getData());
|
|
197
|
+
}
|
|
198
|
+
const outBuf = outZip.toBuffer();
|
|
199
|
+
writeFileSync(outputPath, outBuf);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Process a single option group within a parsed XML document.
|
|
203
|
+
* Returns true if any modifications were made.
|
|
204
|
+
*/
|
|
205
|
+
function processGroup(doc, group, data) {
|
|
206
|
+
// Step 1: Find paragraphs matching each option's marker
|
|
207
|
+
const allParagraphs = doc.getElementsByTagNameNS(W_NS, 'p');
|
|
208
|
+
const optionMatches = [];
|
|
209
|
+
for (let oi = 0; oi < group.options.length; oi++) {
|
|
210
|
+
const option = group.options[oi];
|
|
211
|
+
for (let pi = 0; pi < allParagraphs.length; pi++) {
|
|
212
|
+
const para = allParagraphs[pi];
|
|
213
|
+
const text = extractParagraphText(para);
|
|
214
|
+
if (text && hasOptionPrefix(text) && text.includes(option.marker)) {
|
|
215
|
+
optionMatches.push({ para, optionIndex: oi });
|
|
216
|
+
break; // first match per option
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// If we couldn't find all option markers, skip this group
|
|
221
|
+
if (optionMatches.length < 2)
|
|
222
|
+
return false;
|
|
223
|
+
// Step 2: Verify all matched paragraphs share the same parent <w:tc>
|
|
224
|
+
const cells = optionMatches.map((m) => findAncestor(m.para, 'tc'));
|
|
225
|
+
const cell = cells[0];
|
|
226
|
+
if (!cell || !cells.every((c) => c === cell))
|
|
227
|
+
return false;
|
|
228
|
+
// Step 3: Collect all <w:p> in this cell and classify them
|
|
229
|
+
const cellParas = cell.getElementsByTagNameNS(W_NS, 'p');
|
|
230
|
+
const classified = [];
|
|
231
|
+
let currentOwner = -1; // -1 = header
|
|
232
|
+
for (let i = 0; i < cellParas.length; i++) {
|
|
233
|
+
const p = cellParas[i];
|
|
234
|
+
const match = optionMatches.find((m) => m.para === p);
|
|
235
|
+
if (match) {
|
|
236
|
+
currentOwner = match.optionIndex;
|
|
237
|
+
classified.push({ para: p, ownerOptionIndex: currentOwner, isOption: true });
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
classified.push({ para: p, ownerOptionIndex: currentOwner, isOption: false });
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Step 4: Evaluate triggers to determine selected options
|
|
244
|
+
const selectedIndices = new Set();
|
|
245
|
+
if (group.type === 'radio') {
|
|
246
|
+
// Radio: first trigger that fires wins; if none, use default
|
|
247
|
+
let found = false;
|
|
248
|
+
for (let i = 0; i < group.options.length; i++) {
|
|
249
|
+
if (triggerFires(group.options[i].trigger, data)) {
|
|
250
|
+
selectedIndices.add(i);
|
|
251
|
+
found = true;
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (!found) {
|
|
256
|
+
// Find the default option
|
|
257
|
+
const defaultIdx = group.options.findIndex((o) => o.trigger === 'default');
|
|
258
|
+
if (defaultIdx >= 0)
|
|
259
|
+
selectedIndices.add(defaultIdx);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// Checkbox: select each option whose trigger fires
|
|
264
|
+
for (let i = 0; i < group.options.length; i++) {
|
|
265
|
+
if (group.options[i].trigger === 'default') {
|
|
266
|
+
// Default for checkbox: selected if no other option fires
|
|
267
|
+
// (evaluated after checking all others)
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
if (triggerFires(group.options[i].trigger, data)) {
|
|
271
|
+
selectedIndices.add(i);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Handle defaults for checkbox
|
|
275
|
+
if (selectedIndices.size === 0) {
|
|
276
|
+
for (let i = 0; i < group.options.length; i++) {
|
|
277
|
+
if (group.options[i].trigger === 'default') {
|
|
278
|
+
selectedIndices.add(i);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// Step 5 & 6: Remove unselected options + sub-clauses, mark selected as checked
|
|
284
|
+
let madeChanges = false;
|
|
285
|
+
for (const item of classified) {
|
|
286
|
+
if (item.ownerOptionIndex === -1)
|
|
287
|
+
continue; // header — always keep
|
|
288
|
+
if (selectedIndices.has(item.ownerOptionIndex)) {
|
|
289
|
+
// Selected: mark the option paragraph as checked
|
|
290
|
+
if (item.isOption) {
|
|
291
|
+
setChecked(item.para, group.type);
|
|
292
|
+
madeChanges = true;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
// Unselected: remove paragraph
|
|
297
|
+
item.para.parentNode?.removeChild(item.para);
|
|
298
|
+
madeChanges = true;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Ensure at least one <w:p> remains in the cell (OOXML requirement)
|
|
302
|
+
const remainingParas = cell.getElementsByTagNameNS(W_NS, 'p');
|
|
303
|
+
if (remainingParas.length === 0) {
|
|
304
|
+
const newP = doc.createElementNS(W_NS, 'w:p');
|
|
305
|
+
cell.appendChild(newP);
|
|
306
|
+
}
|
|
307
|
+
return madeChanges;
|
|
308
|
+
}
|
|
309
|
+
/** Walk up the DOM to find an ancestor with the given local name. */
|
|
310
|
+
function findAncestor(node, localName) {
|
|
311
|
+
let current = node.parentNode;
|
|
312
|
+
while (current) {
|
|
313
|
+
if (current.nodeType === 1) {
|
|
314
|
+
const element = current;
|
|
315
|
+
if (element.localName === localName && element.namespaceURI === W_NS) {
|
|
316
|
+
return element;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
current = current.parentNode;
|
|
320
|
+
}
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selector.js","sourceRoot":"","sources":["../../src/core/selector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified fill pipeline — shared orchestration for all three fill paths
|
|
3
|
+
* (bundled templates, external/vendored, and recipes).
|
|
4
|
+
*
|
|
5
|
+
* Each path is now a thin wrapper that builds PipelineOptions and calls
|
|
6
|
+
* runFillPipeline(). The data-prep and fill steps come from fill-pipeline.ts;
|
|
7
|
+
* this module handles the surrounding orchestration: temp dir, copy, clean→patch,
|
|
8
|
+
* selections, fill, verify, cleanup.
|
|
9
|
+
*/
|
|
10
|
+
import type { FieldDefinition, CleanConfig } from './metadata.js';
|
|
11
|
+
import type { SelectionsConfig } from './selector.js';
|
|
12
|
+
import type { VerifyResult } from './recipe/types.js';
|
|
13
|
+
export interface PipelineOptions {
|
|
14
|
+
inputPath: string;
|
|
15
|
+
outputPath: string;
|
|
16
|
+
values: Record<string, unknown>;
|
|
17
|
+
fields: FieldDefinition[];
|
|
18
|
+
requiredFieldNames?: string[];
|
|
19
|
+
cleanPatch?: {
|
|
20
|
+
cleanConfig: CleanConfig;
|
|
21
|
+
replacements: Record<string, string>;
|
|
22
|
+
};
|
|
23
|
+
selectionsConfig?: SelectionsConfig;
|
|
24
|
+
coerceBooleans?: boolean;
|
|
25
|
+
computeDisplayFields?: (data: Record<string, unknown>) => void;
|
|
26
|
+
fixSmartQuotes?: boolean;
|
|
27
|
+
verify: (outputPath: string) => VerifyResult | Promise<VerifyResult>;
|
|
28
|
+
postProcess?: (outputPath: string) => void | Promise<void>;
|
|
29
|
+
keepIntermediate?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface PipelineResult {
|
|
32
|
+
outputPath: string;
|
|
33
|
+
fieldsUsed: string[];
|
|
34
|
+
stages?: {
|
|
35
|
+
clean: string;
|
|
36
|
+
patch: string;
|
|
37
|
+
fill: string;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Run the unified fill pipeline:
|
|
42
|
+
* 1. Create temp dir
|
|
43
|
+
* 2. Copy inputPath → temp source.docx
|
|
44
|
+
* 3. If cleanPatch: clean → patch
|
|
45
|
+
* 4. prepareFillData (useBlankPlaceholder: true)
|
|
46
|
+
* 5. If selectionsConfig: apply selections
|
|
47
|
+
* 6. fillDocx → temp filled.docx
|
|
48
|
+
* 7. Copy filled.docx → outputPath
|
|
49
|
+
* 8. Run verify(outputPath), warn on failures
|
|
50
|
+
* 9. Cleanup temp dir (unless keepIntermediate)
|
|
51
|
+
*/
|
|
52
|
+
export declare function runFillPipeline(options: PipelineOptions): Promise<PipelineResult>;
|
|
53
|
+
//# sourceMappingURL=unified-pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-pipeline.d.ts","sourceRoot":"","sources":["../../src/core/unified-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG9B,UAAU,CAAC,EAAE;QACX,WAAW,EAAE,WAAW,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACtC,CAAC;IAGF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAGpC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAG/D,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACrE,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG3D,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAwGvF"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified fill pipeline — shared orchestration for all three fill paths
|
|
3
|
+
* (bundled templates, external/vendored, and recipes).
|
|
4
|
+
*
|
|
5
|
+
* Each path is now a thin wrapper that builds PipelineOptions and calls
|
|
6
|
+
* runFillPipeline(). The data-prep and fill steps come from fill-pipeline.ts;
|
|
7
|
+
* this module handles the surrounding orchestration: temp dir, copy, clean→patch,
|
|
8
|
+
* selections, fill, verify, cleanup.
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync, writeFileSync, copyFileSync, mkdtempSync, rmSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { tmpdir } from 'node:os';
|
|
13
|
+
import { prepareFillData, fillDocx } from './fill-pipeline.js';
|
|
14
|
+
import { cleanDocument } from './recipe/cleaner.js';
|
|
15
|
+
import { patchDocument } from './recipe/patcher.js';
|
|
16
|
+
import { applySelections } from './selector.js';
|
|
17
|
+
/**
|
|
18
|
+
* Run the unified fill pipeline:
|
|
19
|
+
* 1. Create temp dir
|
|
20
|
+
* 2. Copy inputPath → temp source.docx
|
|
21
|
+
* 3. If cleanPatch: clean → patch
|
|
22
|
+
* 4. prepareFillData (useBlankPlaceholder: true)
|
|
23
|
+
* 5. If selectionsConfig: apply selections
|
|
24
|
+
* 6. fillDocx → temp filled.docx
|
|
25
|
+
* 7. Copy filled.docx → outputPath
|
|
26
|
+
* 8. Run verify(outputPath), warn on failures
|
|
27
|
+
* 9. Cleanup temp dir (unless keepIntermediate)
|
|
28
|
+
*/
|
|
29
|
+
export async function runFillPipeline(options) {
|
|
30
|
+
const { inputPath, outputPath, values, fields, requiredFieldNames = [], cleanPatch, selectionsConfig, coerceBooleans = false, computeDisplayFields, fixSmartQuotes = false, verify, postProcess, keepIntermediate = false, } = options;
|
|
31
|
+
const tempDir = mkdtempSync(join(tmpdir(), 'fill-pipeline-'));
|
|
32
|
+
let stages;
|
|
33
|
+
try {
|
|
34
|
+
// Step 2: Copy source to temp dir
|
|
35
|
+
const sourcePath = join(tempDir, 'source.docx');
|
|
36
|
+
copyFileSync(inputPath, sourcePath);
|
|
37
|
+
// Step 3: Clean → Patch (if configured)
|
|
38
|
+
let currentPath = sourcePath;
|
|
39
|
+
if (cleanPatch) {
|
|
40
|
+
const cleanedPath = join(tempDir, 'cleaned.docx');
|
|
41
|
+
await cleanDocument(sourcePath, cleanedPath, cleanPatch.cleanConfig);
|
|
42
|
+
const patchedPath = join(tempDir, 'patched.docx');
|
|
43
|
+
await patchDocument(cleanedPath, patchedPath, cleanPatch.replacements);
|
|
44
|
+
currentPath = patchedPath;
|
|
45
|
+
stages = { clean: cleanedPath, patch: patchedPath, fill: '' };
|
|
46
|
+
}
|
|
47
|
+
// Step 4: Prepare fill data
|
|
48
|
+
const data = prepareFillData({
|
|
49
|
+
values,
|
|
50
|
+
fields,
|
|
51
|
+
requiredFieldNames,
|
|
52
|
+
useBlankPlaceholder: true,
|
|
53
|
+
coerceBooleans,
|
|
54
|
+
computeDisplayFields,
|
|
55
|
+
});
|
|
56
|
+
// Step 5: Read current buffer; apply selections if configured
|
|
57
|
+
let templateBuf = readFileSync(currentPath);
|
|
58
|
+
if (selectionsConfig) {
|
|
59
|
+
const preSelectPath = join(tempDir, 'pre-select.docx');
|
|
60
|
+
const postSelectPath = join(tempDir, 'post-select.docx');
|
|
61
|
+
writeFileSync(preSelectPath, templateBuf);
|
|
62
|
+
await applySelections(preSelectPath, postSelectPath, selectionsConfig, data);
|
|
63
|
+
templateBuf = readFileSync(postSelectPath);
|
|
64
|
+
}
|
|
65
|
+
// Step 6: Fill
|
|
66
|
+
const filledBuf = await fillDocx({
|
|
67
|
+
templateBuffer: templateBuf,
|
|
68
|
+
data,
|
|
69
|
+
fixSmartQuotes,
|
|
70
|
+
});
|
|
71
|
+
const filledPath = join(tempDir, 'filled.docx');
|
|
72
|
+
writeFileSync(filledPath, filledBuf);
|
|
73
|
+
if (stages) {
|
|
74
|
+
stages.fill = filledPath;
|
|
75
|
+
}
|
|
76
|
+
// Step 7: Copy to output
|
|
77
|
+
copyFileSync(filledPath, outputPath);
|
|
78
|
+
// Optional post-processing for recipe-specific normalization.
|
|
79
|
+
if (postProcess) {
|
|
80
|
+
await postProcess(outputPath);
|
|
81
|
+
}
|
|
82
|
+
// Step 8: Verify
|
|
83
|
+
const verifyResult = await verify(outputPath);
|
|
84
|
+
if (!verifyResult.passed) {
|
|
85
|
+
const failures = verifyResult.checks
|
|
86
|
+
.filter((c) => !c.passed)
|
|
87
|
+
.map((c) => `${c.name}: ${c.details ?? 'failed'}`)
|
|
88
|
+
.join('; ');
|
|
89
|
+
console.warn(`Warning: verification issues: ${failures}`);
|
|
90
|
+
}
|
|
91
|
+
if (keepIntermediate) {
|
|
92
|
+
console.log(`Intermediate files preserved at: ${tempDir}`);
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
outputPath,
|
|
96
|
+
fieldsUsed: Object.keys(data),
|
|
97
|
+
stages,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
// Step 9: Cleanup
|
|
102
|
+
if (!keepIntermediate) {
|
|
103
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=unified-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-pipeline.js","sourceRoot":"","sources":["../../src/core/unified-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ExternalValidationResult {
|
|
2
|
+
externalId: string;
|
|
3
|
+
valid: boolean;
|
|
4
|
+
errors: string[];
|
|
5
|
+
warnings: string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Validate an external template directory:
|
|
9
|
+
* - metadata.yaml validates against ExternalMetadataSchema
|
|
10
|
+
* - template.docx exists and SHA-256 matches source_sha256
|
|
11
|
+
* - replacements.json is present and valid
|
|
12
|
+
* - clean.json is valid if present
|
|
13
|
+
* - Replacement targets reference metadata fields
|
|
14
|
+
*/
|
|
15
|
+
export declare function validateExternal(externalDir: string, externalId: string): ExternalValidationResult;
|
|
16
|
+
//# sourceMappingURL=external.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external.d.ts","sourceRoot":"","sources":["../../../src/core/validation/external.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AASD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,wBAAwB,CA8G1B"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { validateExternalMetadata, loadExternalMetadata, CleanConfigSchema } from '../metadata.js';
|
|
5
|
+
import { parseReplacementKey } from '../recipe/replacement-keys.js';
|
|
6
|
+
/** Pattern for valid template tags within replacement values */
|
|
7
|
+
const TAG_RE = /\{[a-z_][a-z0-9_]*\}/g;
|
|
8
|
+
/** Pattern for any curly-brace token */
|
|
9
|
+
const ANY_BRACE_RE = /\{[^}]+\}/g;
|
|
10
|
+
/** Only simple identifiers inside braces are allowed */
|
|
11
|
+
const SAFE_TAG_RE = /^\{[a-z_][a-z0-9_]*\}$/;
|
|
12
|
+
/**
|
|
13
|
+
* Validate an external template directory:
|
|
14
|
+
* - metadata.yaml validates against ExternalMetadataSchema
|
|
15
|
+
* - template.docx exists and SHA-256 matches source_sha256
|
|
16
|
+
* - replacements.json is present and valid
|
|
17
|
+
* - clean.json is valid if present
|
|
18
|
+
* - Replacement targets reference metadata fields
|
|
19
|
+
*/
|
|
20
|
+
export function validateExternal(externalDir, externalId) {
|
|
21
|
+
const errors = [];
|
|
22
|
+
const warnings = [];
|
|
23
|
+
// Validate metadata
|
|
24
|
+
const metaResult = validateExternalMetadata(externalDir);
|
|
25
|
+
if (!metaResult.valid) {
|
|
26
|
+
errors.push(...metaResult.errors.map((e) => `metadata: ${e}`));
|
|
27
|
+
return { externalId, valid: false, errors, warnings };
|
|
28
|
+
}
|
|
29
|
+
const metadata = loadExternalMetadata(externalDir);
|
|
30
|
+
// Validate template.docx exists
|
|
31
|
+
const docxPath = join(externalDir, 'template.docx');
|
|
32
|
+
if (!existsSync(docxPath)) {
|
|
33
|
+
errors.push('template.docx not found');
|
|
34
|
+
return { externalId, valid: false, errors, warnings };
|
|
35
|
+
}
|
|
36
|
+
// SHA-256 integrity check
|
|
37
|
+
const docxBuf = readFileSync(docxPath);
|
|
38
|
+
const actualHash = createHash('sha256').update(docxBuf).digest('hex');
|
|
39
|
+
if (actualHash !== metadata.source_sha256) {
|
|
40
|
+
errors.push(`DOCX integrity check failed:\n` +
|
|
41
|
+
` Expected SHA-256: ${metadata.source_sha256}\n` +
|
|
42
|
+
` Actual SHA-256: ${actualHash}`);
|
|
43
|
+
}
|
|
44
|
+
// Validate replacements.json
|
|
45
|
+
const replacementsPath = join(externalDir, 'replacements.json');
|
|
46
|
+
if (!existsSync(replacementsPath)) {
|
|
47
|
+
errors.push('replacements.json not found (required for external templates)');
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
try {
|
|
51
|
+
const raw = readFileSync(replacementsPath, 'utf-8');
|
|
52
|
+
const replacements = JSON.parse(raw);
|
|
53
|
+
if (typeof replacements !== 'object' || replacements === null) {
|
|
54
|
+
errors.push('replacements.json must be a JSON object');
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const metadataFieldNames = new Set(metadata.fields.map((f) => f.name));
|
|
58
|
+
for (const [key, value] of Object.entries(replacements)) {
|
|
59
|
+
if (typeof value !== 'string') {
|
|
60
|
+
errors.push(`replacements.json: value for "${key}" must be a string`);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const tags = value.match(TAG_RE);
|
|
64
|
+
if (!tags || tags.length === 0) {
|
|
65
|
+
errors.push(`replacements.json: value for "${key}" must contain at least one {identifier} tag, got "${value}"`);
|
|
66
|
+
}
|
|
67
|
+
const allBraces = value.match(ANY_BRACE_RE);
|
|
68
|
+
if (allBraces) {
|
|
69
|
+
for (const token of allBraces) {
|
|
70
|
+
if (!SAFE_TAG_RE.test(token)) {
|
|
71
|
+
errors.push(`replacements.json: unsafe tag "${token}" in value for "${key}". Only {identifier} tags allowed.`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// For qualified keys, check against the searchText, not the full key.
|
|
76
|
+
// Nth keys use single-shot replacement so they can't loop — skip the check.
|
|
77
|
+
const parsed = parseReplacementKey(key, value);
|
|
78
|
+
if (parsed.type === 'simple' && value.includes(parsed.searchText)) {
|
|
79
|
+
errors.push(`replacements.json: value for "${key}" contains the key itself (would cause infinite loop)`);
|
|
80
|
+
}
|
|
81
|
+
else if (parsed.type === 'context' && value.includes(parsed.searchText)) {
|
|
82
|
+
errors.push(`replacements.json: value for "${key}" contains the search text "${parsed.searchText}" (would cause infinite loop)`);
|
|
83
|
+
}
|
|
84
|
+
// nth keys: no infinite-loop check needed (single-shot replacement)
|
|
85
|
+
// Check field coverage
|
|
86
|
+
if (tags) {
|
|
87
|
+
for (const tag of tags) {
|
|
88
|
+
const fieldName = tag.slice(1, -1);
|
|
89
|
+
if (!metadataFieldNames.has(fieldName)) {
|
|
90
|
+
warnings.push(`Replacement target {${fieldName}} not found in metadata fields`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
errors.push(`replacements.json: ${err.message}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Validate clean.json if present
|
|
102
|
+
const cleanPath = join(externalDir, 'clean.json');
|
|
103
|
+
if (existsSync(cleanPath)) {
|
|
104
|
+
try {
|
|
105
|
+
const raw = readFileSync(cleanPath, 'utf-8');
|
|
106
|
+
CleanConfigSchema.parse(JSON.parse(raw));
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
errors.push('clean.json: invalid format');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { externalId, valid: errors.length === 0, errors, warnings };
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=external.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external.js","sourceRoot":"","sources":["../../../src/core/validation/external.ts"],"names":[],"mappings":"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"}
|