opkg 0.9.2 → 0.9.4
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/.claude/agents/code-reviewer.md +171 -0
- package/.claude/commands/commit-push-pr.md +20 -0
- package/.claude/commands/{specs/read.md → read-specs.md} +1 -1
- package/.claude/commands/{specs/update.md → update-specs.md} +4 -0
- package/.claude/skills/code-review-excellence/SKILL.md +538 -0
- package/README.md +2 -2
- package/package.json +3 -1
- package/packages/cli/dist/add-IJAPFHIX.js +624 -0
- package/packages/cli/dist/add-IJAPFHIX.js.map +7 -0
- package/packages/cli/dist/add-LLUNFLJI.js +624 -0
- package/packages/cli/dist/add-LLUNFLJI.js.map +7 -0
- package/packages/cli/dist/add-U44SL3OR.js +624 -0
- package/packages/cli/dist/add-U44SL3OR.js.map +7 -0
- package/packages/cli/dist/chunk-23VBP5L6.js +371 -0
- package/packages/cli/dist/chunk-23VBP5L6.js.map +7 -0
- package/packages/cli/dist/chunk-2SVHLF5C.js +1419 -0
- package/packages/cli/dist/chunk-2SVHLF5C.js.map +7 -0
- package/packages/cli/dist/chunk-37256POU.js +99 -0
- package/packages/cli/dist/chunk-37256POU.js.map +7 -0
- package/packages/cli/dist/chunk-3PZRVA6O.js +196 -0
- package/packages/cli/dist/chunk-3PZRVA6O.js.map +7 -0
- package/packages/cli/dist/chunk-427DCURL.js +155 -0
- package/packages/cli/dist/chunk-427DCURL.js.map +7 -0
- package/packages/cli/dist/chunk-4B5HJLP2.js +48 -0
- package/packages/cli/dist/chunk-4B5HJLP2.js.map +7 -0
- package/packages/cli/dist/chunk-4OWT3YEG.js +413 -0
- package/packages/cli/dist/chunk-4OWT3YEG.js.map +7 -0
- package/packages/cli/dist/chunk-4RIBTBXI.js +568 -0
- package/packages/cli/dist/chunk-4RIBTBXI.js.map +7 -0
- package/packages/cli/dist/chunk-4X2EJHJN.js +63 -0
- package/packages/cli/dist/chunk-4X2EJHJN.js.map +7 -0
- package/packages/cli/dist/chunk-6CYW66HD.js +1136 -0
- package/packages/cli/dist/chunk-6CYW66HD.js.map +7 -0
- package/packages/cli/dist/chunk-6DITYAFA.js +172 -0
- package/packages/cli/dist/chunk-6DITYAFA.js.map +7 -0
- package/packages/cli/dist/chunk-7KEAKEVZ.js +568 -0
- package/packages/cli/dist/chunk-7KEAKEVZ.js.map +7 -0
- package/packages/cli/dist/chunk-ABFUD25D.js +61 -0
- package/packages/cli/dist/chunk-ABFUD25D.js.map +7 -0
- package/packages/cli/dist/chunk-AR7GJCG6.js +274 -0
- package/packages/cli/dist/chunk-AR7GJCG6.js.map +7 -0
- package/packages/cli/dist/chunk-AYTGQCXH.js +86 -0
- package/packages/cli/dist/chunk-AYTGQCXH.js.map +7 -0
- package/packages/cli/dist/chunk-BROJ6OUT.js +631 -0
- package/packages/cli/dist/chunk-BROJ6OUT.js.map +7 -0
- package/packages/cli/dist/chunk-BVVSU7QD.js +23 -0
- package/packages/cli/dist/chunk-BVVSU7QD.js.map +7 -0
- package/packages/cli/dist/chunk-C6FY55UP.js +108 -0
- package/packages/cli/dist/chunk-C6FY55UP.js.map +7 -0
- package/packages/cli/dist/chunk-CVA64SXK.js +1136 -0
- package/packages/cli/dist/chunk-CVA64SXK.js.map +7 -0
- package/packages/cli/dist/chunk-D3O7LY2Q.js +1151 -0
- package/packages/cli/dist/chunk-D3O7LY2Q.js.map +7 -0
- package/packages/cli/dist/chunk-D6LEPODL.js +413 -0
- package/packages/cli/dist/chunk-D6LEPODL.js.map +7 -0
- package/packages/cli/dist/chunk-DEC24S7E.js +186 -0
- package/packages/cli/dist/chunk-DEC24S7E.js.map +7 -0
- package/packages/cli/dist/chunk-FMVVJH5M.js +371 -0
- package/packages/cli/dist/chunk-FMVVJH5M.js.map +7 -0
- package/packages/cli/dist/chunk-GDVFS3YP.js +130 -0
- package/packages/cli/dist/chunk-GDVFS3YP.js.map +7 -0
- package/packages/cli/dist/chunk-GEP2G5HF.js +31 -0
- package/packages/cli/dist/chunk-GEP2G5HF.js.map +7 -0
- package/packages/cli/dist/chunk-GSWHZBT2.js +62 -0
- package/packages/cli/dist/chunk-GSWHZBT2.js.map +7 -0
- package/packages/cli/dist/chunk-HTYHJA3B.js +61 -0
- package/packages/cli/dist/chunk-HTYHJA3B.js.map +7 -0
- package/packages/cli/dist/chunk-HYKYECAE.js +222 -0
- package/packages/cli/dist/chunk-HYKYECAE.js.map +7 -0
- package/packages/cli/dist/chunk-I7FEAHB4.js +100 -0
- package/packages/cli/dist/chunk-I7FEAHB4.js.map +7 -0
- package/packages/cli/dist/chunk-IHVZ5AUJ.js +107 -0
- package/packages/cli/dist/chunk-IHVZ5AUJ.js.map +7 -0
- package/packages/cli/dist/chunk-KI7FDU3H.js +99 -0
- package/packages/cli/dist/chunk-KI7FDU3H.js.map +7 -0
- package/packages/cli/dist/chunk-L5GRJQBS.js +32 -0
- package/packages/cli/dist/chunk-L5GRJQBS.js.map +7 -0
- package/packages/cli/dist/chunk-LHEAUDJL.js +302 -0
- package/packages/cli/dist/chunk-LHEAUDJL.js.map +7 -0
- package/packages/cli/dist/chunk-MIURCESJ.js +48 -0
- package/packages/cli/dist/chunk-MIURCESJ.js.map +7 -0
- package/packages/cli/dist/chunk-N43IXOND.js +732 -0
- package/packages/cli/dist/chunk-N43IXOND.js.map +7 -0
- package/packages/cli/dist/chunk-OUZRMGPV.js +274 -0
- package/packages/cli/dist/chunk-OUZRMGPV.js.map +7 -0
- package/packages/cli/dist/chunk-PSQXKAL4.js +371 -0
- package/packages/cli/dist/chunk-PSQXKAL4.js.map +7 -0
- package/packages/cli/dist/chunk-PUDRKDVZ.js +1419 -0
- package/packages/cli/dist/chunk-PUDRKDVZ.js.map +7 -0
- package/packages/cli/dist/chunk-RAKMX654.js +631 -0
- package/packages/cli/dist/chunk-RAKMX654.js.map +7 -0
- package/packages/cli/dist/chunk-RSFLK2TP.js +195 -0
- package/packages/cli/dist/chunk-RSFLK2TP.js.map +7 -0
- package/packages/cli/dist/chunk-S26PR2BS.js +99 -0
- package/packages/cli/dist/chunk-S26PR2BS.js.map +7 -0
- package/packages/cli/dist/chunk-U7FW7SXX.js +568 -0
- package/packages/cli/dist/chunk-U7FW7SXX.js.map +7 -0
- package/packages/cli/dist/chunk-VKM6K5TN.js +413 -0
- package/packages/cli/dist/chunk-VKM6K5TN.js.map +7 -0
- package/packages/cli/dist/chunk-VKNJG4JN.js +253 -0
- package/packages/cli/dist/chunk-VKNJG4JN.js.map +7 -0
- package/packages/cli/dist/chunk-VQ2KY6CK.js +113 -0
- package/packages/cli/dist/chunk-VQ2KY6CK.js.map +7 -0
- package/packages/cli/dist/chunk-VQDTXLOX.js +1312 -0
- package/packages/cli/dist/chunk-VQDTXLOX.js.map +7 -0
- package/packages/cli/dist/chunk-VXNS3X5O.js +60 -0
- package/packages/cli/dist/chunk-VXNS3X5O.js.map +7 -0
- package/packages/cli/dist/chunk-WF7H2YDU.js +376 -0
- package/packages/cli/dist/chunk-WF7H2YDU.js.map +7 -0
- package/packages/cli/dist/chunk-WNRXZLWW.js +266 -0
- package/packages/cli/dist/chunk-WNRXZLWW.js.map +7 -0
- package/packages/cli/dist/chunk-WT4VVCXM.js +1121 -0
- package/packages/cli/dist/chunk-WT4VVCXM.js.map +7 -0
- package/packages/cli/dist/configure-3AZUMDJZ.js +107 -0
- package/packages/cli/dist/configure-3AZUMDJZ.js.map +7 -0
- package/packages/cli/dist/configure-D722JQOD.js +107 -0
- package/packages/cli/dist/configure-D722JQOD.js.map +7 -0
- package/packages/cli/dist/configure-IU5H7XD6.js +107 -0
- package/packages/cli/dist/configure-IU5H7XD6.js.map +7 -0
- package/packages/cli/dist/file-format-detector-PXCIAKTK.js +22 -0
- package/packages/cli/dist/file-format-detector-PXCIAKTK.js.map +7 -0
- package/packages/cli/dist/index.js +17 -17
- package/packages/cli/dist/install-EZNWMLJR.js +7581 -0
- package/packages/cli/dist/install-EZNWMLJR.js.map +7 -0
- package/packages/cli/dist/install-F5ANFUBX.js +7577 -0
- package/packages/cli/dist/install-F5ANFUBX.js.map +7 -0
- package/packages/cli/dist/install-JSXEPPC2.js +7104 -0
- package/packages/cli/dist/install-JSXEPPC2.js.map +7 -0
- package/packages/cli/dist/install-QHEBX7JH.js +7101 -0
- package/packages/cli/dist/install-QHEBX7JH.js.map +7 -0
- package/packages/cli/dist/list-DMOUATYI.js +327 -0
- package/packages/cli/dist/list-DMOUATYI.js.map +7 -0
- package/packages/cli/dist/list-UESSCB7Y.js +327 -0
- package/packages/cli/dist/list-UESSCB7Y.js.map +7 -0
- package/packages/cli/dist/list-XR7RSJFS.js +327 -0
- package/packages/cli/dist/list-XR7RSJFS.js.map +7 -0
- package/packages/cli/dist/login-EYZ2SOYZ.js +150 -0
- package/packages/cli/dist/login-EYZ2SOYZ.js.map +7 -0
- package/packages/cli/dist/login-JWCSTAEU.js +150 -0
- package/packages/cli/dist/login-JWCSTAEU.js.map +7 -0
- package/packages/cli/dist/login-NRKHXZKM.js +150 -0
- package/packages/cli/dist/login-NRKHXZKM.js.map +7 -0
- package/packages/cli/dist/logout-HDMYRXIE.js +40 -0
- package/packages/cli/dist/logout-HDMYRXIE.js.map +7 -0
- package/packages/cli/dist/logout-SYHXCVCQ.js +40 -0
- package/packages/cli/dist/logout-SYHXCVCQ.js.map +7 -0
- package/packages/cli/dist/logout-X3XUUOH5.js +40 -0
- package/packages/cli/dist/logout-X3XUUOH5.js.map +7 -0
- package/packages/cli/dist/new-3LTFKDTQ.js +277 -0
- package/packages/cli/dist/new-3LTFKDTQ.js.map +7 -0
- package/packages/cli/dist/new-F46OSD72.js +277 -0
- package/packages/cli/dist/new-F46OSD72.js.map +7 -0
- package/packages/cli/dist/new-OPCCLNL2.js +277 -0
- package/packages/cli/dist/new-OPCCLNL2.js.map +7 -0
- package/packages/cli/dist/package-marker-detector-T5O5YD2E.js +80 -0
- package/packages/cli/dist/package-marker-detector-T5O5YD2E.js.map +7 -0
- package/packages/cli/dist/package-yml-QWZIJDYU.js +16 -0
- package/packages/cli/dist/package-yml-QWZIJDYU.js.map +7 -0
- package/packages/cli/dist/plugin-naming-YP2I4NPA.js +29 -0
- package/packages/cli/dist/plugin-naming-YP2I4NPA.js.map +7 -0
- package/packages/cli/dist/publish-4H43PCSG.js +619 -0
- package/packages/cli/dist/publish-4H43PCSG.js.map +7 -0
- package/packages/cli/dist/publish-RULKLNUX.js +619 -0
- package/packages/cli/dist/publish-RULKLNUX.js.map +7 -0
- package/packages/cli/dist/publish-URWY2P3E.js +619 -0
- package/packages/cli/dist/publish-URWY2P3E.js.map +7 -0
- package/packages/cli/dist/remove-BD52BHR2.js +542 -0
- package/packages/cli/dist/remove-BD52BHR2.js.map +7 -0
- package/packages/cli/dist/remove-G5NRC7LD.js +542 -0
- package/packages/cli/dist/remove-G5NRC7LD.js.map +7 -0
- package/packages/cli/dist/remove-TC3FQUYQ.js +542 -0
- package/packages/cli/dist/remove-TC3FQUYQ.js.map +7 -0
- package/packages/cli/dist/resource-discoverer-4X4RY43E.js +17 -0
- package/packages/cli/dist/resource-discoverer-4X4RY43E.js.map +7 -0
- package/packages/cli/dist/save-24TESYKI.js +1728 -0
- package/packages/cli/dist/save-24TESYKI.js.map +7 -0
- package/packages/cli/dist/save-N3QWF2WN.js +1728 -0
- package/packages/cli/dist/save-N3QWF2WN.js.map +7 -0
- package/packages/cli/dist/save-P2U67DTV.js +1728 -0
- package/packages/cli/dist/save-P2U67DTV.js.map +7 -0
- package/packages/cli/dist/search-ABROK3UO.js +157 -0
- package/packages/cli/dist/search-ABROK3UO.js.map +7 -0
- package/packages/cli/dist/search-WVFXFNAV.js +157 -0
- package/packages/cli/dist/search-WVFXFNAV.js.map +7 -0
- package/packages/cli/dist/search-YQN2Q2SO.js +157 -0
- package/packages/cli/dist/search-YQN2Q2SO.js.map +7 -0
- package/packages/cli/dist/set-DCWF73F6.js +251 -0
- package/packages/cli/dist/set-DCWF73F6.js.map +7 -0
- package/packages/cli/dist/set-GJEG2F6Y.js +251 -0
- package/packages/cli/dist/set-GJEG2F6Y.js.map +7 -0
- package/packages/cli/dist/set-NGM2FIKF.js +251 -0
- package/packages/cli/dist/set-NGM2FIKF.js.map +7 -0
- package/packages/cli/dist/uninstall-3CJQMTYH.js +539 -0
- package/packages/cli/dist/uninstall-3CJQMTYH.js.map +7 -0
- package/packages/cli/dist/uninstall-Q3CP4UN5.js +539 -0
- package/packages/cli/dist/uninstall-Q3CP4UN5.js.map +7 -0
- package/packages/cli/dist/uninstall-QU5OMEEC.js +539 -0
- package/packages/cli/dist/uninstall-QU5OMEEC.js.map +7 -0
- package/packages/cli/dist/unpublish-GHJQYC4S.js +245 -0
- package/packages/cli/dist/unpublish-GHJQYC4S.js.map +7 -0
- package/packages/cli/dist/unpublish-L2CYMK4B.js +245 -0
- package/packages/cli/dist/unpublish-L2CYMK4B.js.map +7 -0
- package/packages/cli/dist/unpublish-VBTNTMS5.js +245 -0
- package/packages/cli/dist/unpublish-VBTNTMS5.js.map +7 -0
- package/packages/cli/dist/view-MXRBMXOG.js +488 -0
- package/packages/cli/dist/view-MXRBMXOG.js.map +7 -0
- package/packages/cli/dist/view-NMND7SAW.js +488 -0
- package/packages/cli/dist/view-NMND7SAW.js.map +7 -0
- package/packages/cli/dist/view-RPQRDSYB.js +488 -0
- package/packages/cli/dist/view-RPQRDSYB.js.map +7 -0
- package/packages/cli/package.json +2 -0
- package/packages/core/dist/constants/index.d.ts +9 -0
- package/packages/core/dist/constants/index.d.ts.map +1 -1
- package/packages/core/dist/constants/index.js +12 -0
- package/packages/core/dist/constants/index.js.map +1 -1
- package/packages/core/dist/core/dependency-resolver/index.d.ts +2 -10
- package/packages/core/dist/core/dependency-resolver/index.d.ts.map +1 -1
- package/packages/core/dist/core/dependency-resolver/index.js +3 -14
- package/packages/core/dist/core/dependency-resolver/index.js.map +1 -1
- package/packages/core/dist/core/install/base-detector.d.ts +2 -1
- package/packages/core/dist/core/install/base-detector.d.ts.map +1 -1
- package/packages/core/dist/core/install/base-detector.js +54 -1
- package/packages/core/dist/core/install/base-detector.js.map +1 -1
- package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts +7 -5
- package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts.map +1 -1
- package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js +25 -9
- package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js.map +1 -1
- package/packages/core/dist/core/install/flow-index-installer.d.ts +2 -1
- package/packages/core/dist/core/install/flow-index-installer.d.ts.map +1 -1
- package/packages/core/dist/core/install/flow-index-installer.js +19 -4
- package/packages/core/dist/core/install/flow-index-installer.js.map +1 -1
- package/packages/core/dist/core/install/input-classifier-base.js +3 -3
- package/packages/core/dist/core/install/input-classifier-base.js.map +1 -1
- package/packages/core/dist/core/install/install-reporting.d.ts.map +1 -1
- package/packages/core/dist/core/install/install-reporting.js +7 -9
- package/packages/core/dist/core/install/install-reporting.js.map +1 -1
- package/packages/core/dist/core/install/list-handler.d.ts.map +1 -1
- package/packages/core/dist/core/install/list-handler.js +3 -0
- package/packages/core/dist/core/install/list-handler.js.map +1 -1
- package/packages/core/dist/core/install/marketplace-handler.d.ts.map +1 -1
- package/packages/core/dist/core/install/marketplace-handler.js.map +1 -1
- package/packages/core/dist/core/install/operations/conflict-handler.d.ts +2 -1
- package/packages/core/dist/core/install/operations/conflict-handler.d.ts.map +1 -1
- package/packages/core/dist/core/install/operations/conflict-handler.js +2 -2
- package/packages/core/dist/core/install/operations/conflict-handler.js.map +1 -1
- package/packages/core/dist/core/install/operations/installation-executor.d.ts +3 -0
- package/packages/core/dist/core/install/operations/installation-executor.d.ts.map +1 -1
- package/packages/core/dist/core/install/operations/installation-executor.js +39 -22
- package/packages/core/dist/core/install/operations/installation-executor.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/orchestrator.d.ts +7 -3
- package/packages/core/dist/core/install/orchestrator/orchestrator.d.ts.map +1 -1
- package/packages/core/dist/core/install/orchestrator/orchestrator.js +193 -93
- package/packages/core/dist/core/install/orchestrator/orchestrator.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts +1 -0
- package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js +11 -24
- package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts +2 -0
- package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js +14 -14
- package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts +7 -0
- package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js +28 -0
- package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/types.d.ts +2 -0
- package/packages/core/dist/core/install/orchestrator/types.d.ts.map +1 -1
- package/packages/core/dist/core/install/path-package-loader.d.ts.map +1 -1
- package/packages/core/dist/core/install/path-package-loader.js +20 -1
- package/packages/core/dist/core/install/path-package-loader.js.map +1 -1
- package/packages/core/dist/core/install/platform-resolution.d.ts +3 -0
- package/packages/core/dist/core/install/platform-resolution.d.ts.map +1 -1
- package/packages/core/dist/core/install/platform-resolution.js +5 -2
- package/packages/core/dist/core/install/platform-resolution.js.map +1 -1
- package/packages/core/dist/core/install/preprocessing/context-population.d.ts +18 -0
- package/packages/core/dist/core/install/preprocessing/context-population.d.ts.map +1 -0
- package/packages/core/dist/core/install/preprocessing/context-population.js +36 -0
- package/packages/core/dist/core/install/preprocessing/context-population.js.map +1 -0
- package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts +23 -0
- package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts.map +1 -1
- package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js +44 -0
- package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js.map +1 -1
- package/packages/core/dist/core/install/sources/git-source.d.ts.map +1 -1
- package/packages/core/dist/core/install/sources/git-source.js +67 -4
- package/packages/core/dist/core/install/sources/git-source.js.map +1 -1
- package/packages/core/dist/core/install/sources/path-source.d.ts.map +1 -1
- package/packages/core/dist/core/install/sources/path-source.js +8 -0
- package/packages/core/dist/core/install/sources/path-source.js.map +1 -1
- package/packages/core/dist/core/install/strategies/flow-based-strategy.d.ts.map +1 -1
- package/packages/core/dist/core/install/strategies/flow-based-strategy.js +12 -5
- package/packages/core/dist/core/install/strategies/flow-based-strategy.js.map +1 -1
- package/packages/core/dist/core/install/strategies/types.d.ts +11 -1
- package/packages/core/dist/core/install/strategies/types.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/context-builders.d.ts +5 -0
- package/packages/core/dist/core/install/unified/context-builders.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/context-builders.js +12 -0
- package/packages/core/dist/core/install/unified/context-builders.js.map +1 -1
- package/packages/core/dist/core/install/unified/context-helpers.d.ts +0 -4
- package/packages/core/dist/core/install/unified/context-helpers.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/context-helpers.js +0 -24
- package/packages/core/dist/core/install/unified/context-helpers.js.map +1 -1
- package/packages/core/dist/core/install/unified/index.d.ts +1 -1
- package/packages/core/dist/core/install/unified/index.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/index.js +1 -1
- package/packages/core/dist/core/install/unified/index.js.map +1 -1
- package/packages/core/dist/core/install/unified/multi-context-pipeline.d.ts +6 -0
- package/packages/core/dist/core/install/unified/multi-context-pipeline.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/multi-context-pipeline.js +11 -4
- package/packages/core/dist/core/install/unified/multi-context-pipeline.js.map +1 -1
- package/packages/core/dist/core/install/unified/phases/conflicts.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/phases/conflicts.js +1 -1
- package/packages/core/dist/core/install/unified/phases/conflicts.js.map +1 -1
- package/packages/core/dist/core/install/unified/phases/execute.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/phases/execute.js +5 -5
- package/packages/core/dist/core/install/unified/phases/execute.js.map +1 -1
- package/packages/core/dist/core/install/unified/phases/load-package.js +3 -3
- package/packages/core/dist/core/install/unified/phases/load-package.js.map +1 -1
- package/packages/core/dist/core/install/unified/phases/report.js +1 -1
- package/packages/core/dist/core/install/unified/phases/report.js.map +1 -1
- package/packages/core/dist/core/install/unified/pipeline.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/pipeline.js +7 -10
- package/packages/core/dist/core/install/unified/pipeline.js.map +1 -1
- package/packages/core/dist/core/install/wave-resolver/content-root-cache.d.ts +24 -0
- package/packages/core/dist/core/install/wave-resolver/content-root-cache.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/content-root-cache.js +71 -0
- package/packages/core/dist/core/install/wave-resolver/content-root-cache.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/context-builder.d.ts +39 -0
- package/packages/core/dist/core/install/wave-resolver/context-builder.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/context-builder.js +148 -0
- package/packages/core/dist/core/install/wave-resolver/context-builder.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/fetcher.d.ts +49 -0
- package/packages/core/dist/core/install/wave-resolver/fetcher.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/fetcher.js +221 -0
- package/packages/core/dist/core/install/wave-resolver/fetcher.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index-updater.d.ts +23 -0
- package/packages/core/dist/core/install/wave-resolver/index-updater.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index-updater.js +87 -0
- package/packages/core/dist/core/install/wave-resolver/index-updater.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index-write-collector.d.ts +101 -0
- package/packages/core/dist/core/install/wave-resolver/index-write-collector.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index-write-collector.js +194 -0
- package/packages/core/dist/core/install/wave-resolver/index-write-collector.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index.d.ts +17 -0
- package/packages/core/dist/core/install/wave-resolver/index.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index.js +16 -0
- package/packages/core/dist/core/install/wave-resolver/index.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/manifest-reader.d.ts +34 -0
- package/packages/core/dist/core/install/wave-resolver/manifest-reader.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/manifest-reader.js +112 -0
- package/packages/core/dist/core/install/wave-resolver/manifest-reader.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/types.d.ts +210 -0
- package/packages/core/dist/core/install/wave-resolver/types.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/types.js +6 -0
- package/packages/core/dist/core/install/wave-resolver/types.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/version-solver.d.ts +65 -0
- package/packages/core/dist/core/install/wave-resolver/version-solver.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/version-solver.js +166 -0
- package/packages/core/dist/core/install/wave-resolver/version-solver.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/wave-engine.d.ts +16 -0
- package/packages/core/dist/core/install/wave-resolver/wave-engine.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/wave-engine.js +337 -0
- package/packages/core/dist/core/install/wave-resolver/wave-engine.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/wave-installer.d.ts +50 -0
- package/packages/core/dist/core/install/wave-resolver/wave-installer.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/wave-installer.js +246 -0
- package/packages/core/dist/core/install/wave-resolver/wave-installer.js.map +1 -0
- package/packages/core/dist/core/ports/buffered-output.d.ts +36 -0
- package/packages/core/dist/core/ports/buffered-output.d.ts.map +1 -0
- package/packages/core/dist/core/ports/buffered-output.js +89 -0
- package/packages/core/dist/core/ports/buffered-output.js.map +1 -0
- package/packages/core/dist/core/ports/resolve.d.ts +0 -13
- package/packages/core/dist/core/ports/resolve.d.ts.map +1 -1
- package/packages/core/dist/core/ports/resolve.js +0 -28
- package/packages/core/dist/core/ports/resolve.js.map +1 -1
- package/packages/core/dist/core/remove/removal-confirmation.d.ts +4 -1
- package/packages/core/dist/core/remove/removal-confirmation.d.ts.map +1 -1
- package/packages/core/dist/core/remove/removal-confirmation.js +5 -4
- package/packages/core/dist/core/remove/removal-confirmation.js.map +1 -1
- package/packages/core/dist/core/remove/remove-from-source-pipeline.d.ts.map +1 -1
- package/packages/core/dist/core/remove/remove-from-source-pipeline.js +1 -10
- package/packages/core/dist/core/remove/remove-from-source-pipeline.js.map +1 -1
- package/packages/core/dist/core/uninstall/uninstall-executor.js +1 -1
- package/packages/core/dist/core/uninstall/uninstall-executor.js.map +1 -1
- package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts +2 -2
- package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts.map +1 -1
- package/packages/core/dist/core/uninstall/uninstall-reporter.js +4 -4
- package/packages/core/dist/core/uninstall/uninstall-reporter.js.map +1 -1
- package/packages/core/dist/index.d.ts +1 -1
- package/packages/core/dist/index.d.ts.map +1 -1
- package/packages/core/dist/types/execution-context.d.ts +40 -10
- package/packages/core/dist/types/execution-context.d.ts.map +1 -1
- package/packages/core/dist/utils/concurrency-pool.d.ts +34 -0
- package/packages/core/dist/utils/concurrency-pool.d.ts.map +1 -0
- package/packages/core/dist/utils/concurrency-pool.js +58 -0
- package/packages/core/dist/utils/concurrency-pool.js.map +1 -0
- package/packages/core/dist/utils/plugin-naming.d.ts +11 -3
- package/packages/core/dist/utils/plugin-naming.d.ts.map +1 -1
- package/packages/core/dist/utils/plugin-naming.js +27 -7
- package/packages/core/dist/utils/plugin-naming.js.map +1 -1
- package/plans/wave-resolver.md +254 -0
- package/.claude/agents/essentials/code-simplifier.md +0 -52
- package/.claude/commands/essentials/cleanup.md +0 -1
- package/.claude/commands/essentials/review.md +0 -8
- package/.claude/commands/git/commit.md +0 -5
|
@@ -0,0 +1,1121 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
applyMapPipeline,
|
|
4
|
+
createMapContext,
|
|
5
|
+
defaultTransformRegistry,
|
|
6
|
+
parseMarkdownDocument,
|
|
7
|
+
serializeMarkdownDocument,
|
|
8
|
+
splitMapPipeline,
|
|
9
|
+
validateMapPipeline
|
|
10
|
+
} from "./chunk-IXOEIRDT.js";
|
|
11
|
+
import {
|
|
12
|
+
CLOSE_MARKER,
|
|
13
|
+
CLOSE_MARKER_REGEX,
|
|
14
|
+
buildOpenMarker,
|
|
15
|
+
buildOpenMarkerRegex,
|
|
16
|
+
extractAllKeys
|
|
17
|
+
} from "./chunk-QURLGVA4.js";
|
|
18
|
+
import {
|
|
19
|
+
stripPlatformSuffixFromFilename
|
|
20
|
+
} from "./chunk-4X2EJHJN.js";
|
|
21
|
+
import {
|
|
22
|
+
composeMarkdown,
|
|
23
|
+
deepEqualYaml,
|
|
24
|
+
deepMerge,
|
|
25
|
+
extractInlinePlatformOverrides,
|
|
26
|
+
splitFrontmatter
|
|
27
|
+
} from "./chunk-VQ2KY6CK.js";
|
|
28
|
+
import {
|
|
29
|
+
resolveSwitchExpression,
|
|
30
|
+
smartEquals,
|
|
31
|
+
smartNotEquals,
|
|
32
|
+
validateSwitchExpression
|
|
33
|
+
} from "./chunk-N43IXOND.js";
|
|
34
|
+
import {
|
|
35
|
+
FILE_PATTERNS
|
|
36
|
+
} from "./chunk-IHVZ5AUJ.js";
|
|
37
|
+
import {
|
|
38
|
+
ensureDir,
|
|
39
|
+
exists,
|
|
40
|
+
readTextFile,
|
|
41
|
+
writeTextFile
|
|
42
|
+
} from "./chunk-S47F4OG4.js";
|
|
43
|
+
import {
|
|
44
|
+
logger
|
|
45
|
+
} from "./chunk-5EFWGD33.js";
|
|
46
|
+
|
|
47
|
+
// ../core/src/utils/hash-utils.ts
|
|
48
|
+
import { xxhash3 } from "hash-wasm";
|
|
49
|
+
async function calculateFileHash(content) {
|
|
50
|
+
try {
|
|
51
|
+
return await xxhash3(content);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
return logger.warn(`Failed to calculate hash for content: ${error}`), `${content.length}-${content.charAt(0)}-${content.charAt(content.length - 1)}`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ../core/src/core/flows/flow-executor.ts
|
|
58
|
+
import { promises as fs2 } from "fs";
|
|
59
|
+
import fsSync from "fs";
|
|
60
|
+
import path2 from "path";
|
|
61
|
+
import yaml from "js-yaml";
|
|
62
|
+
import * as TOML from "smol-toml";
|
|
63
|
+
import { parse as parseJsonc } from "jsonc-parser";
|
|
64
|
+
import { JSONPath } from "jsonpath-plus";
|
|
65
|
+
|
|
66
|
+
// ../core/src/utils/root-file-merger.ts
|
|
67
|
+
function mergePackageContentIntoRootFile(existingContent, packageName, newContent) {
|
|
68
|
+
if (!packageName)
|
|
69
|
+
throw new Error("Package name is required for merging");
|
|
70
|
+
let openMarker = buildOpenMarker(packageName), closeMarker = CLOSE_MARKER, openRe = buildOpenMarkerRegex(packageName), closeRe = CLOSE_MARKER_REGEX, openMatch = openRe.exec(existingContent);
|
|
71
|
+
if (!openMatch) {
|
|
72
|
+
let separator = existingContent.trim() ? `
|
|
73
|
+
|
|
74
|
+
` : "";
|
|
75
|
+
return existingContent.trim() + separator + openMarker + `
|
|
76
|
+
` + newContent.trim() + `
|
|
77
|
+
` + closeMarker + `
|
|
78
|
+
`;
|
|
79
|
+
}
|
|
80
|
+
let beforeSection = existingContent.substring(0, openMatch.index), afterMarkerIndex = openMatch.index + openMatch[0].length, restContent = existingContent.substring(afterMarkerIndex), closeMatch = closeRe.exec(restContent);
|
|
81
|
+
if (!closeMatch) {
|
|
82
|
+
let separator = existingContent.trim() ? `
|
|
83
|
+
|
|
84
|
+
` : "";
|
|
85
|
+
return existingContent.trim() + separator + openMarker + `
|
|
86
|
+
` + newContent.trim() + `
|
|
87
|
+
` + closeMarker + `
|
|
88
|
+
`;
|
|
89
|
+
}
|
|
90
|
+
let existingSectionBody = restContent.substring(0, closeMatch.index).trim(), afterCloseMarkerIndex = closeMatch.index + closeMatch[0].length, afterSection = restContent.substring(afterCloseMarkerIndex), hasCorrectMarker = openMatch[0] === openMarker, hasCorrectContent = existingSectionBody === newContent.trim();
|
|
91
|
+
return hasCorrectMarker && hasCorrectContent && !0 ? existingContent : beforeSection + openMarker + `
|
|
92
|
+
` + newContent.trim() + `
|
|
93
|
+
` + closeMarker + afterSection;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ../core/src/core/glob-target-mapping.ts
|
|
97
|
+
import { extname } from "path";
|
|
98
|
+
function normalizeSlashPath(input) {
|
|
99
|
+
return input.replace(/\\/g, "/");
|
|
100
|
+
}
|
|
101
|
+
function splitSegments(input) {
|
|
102
|
+
return normalizeSlashPath(input).split("/").filter(Boolean);
|
|
103
|
+
}
|
|
104
|
+
function stripOverlappingDestBaseFromSource(destBase, sourceRelFromPackage) {
|
|
105
|
+
let destSegments = splitSegments(destBase), sourceSegments = splitSegments(sourceRelFromPackage), maxOverlap = Math.min(destSegments.length, sourceSegments.length), overlapLen = 0;
|
|
106
|
+
for (let k = maxOverlap; k >= 1; k--) {
|
|
107
|
+
let destSuffix = destSegments.slice(-k).join("/"), sourcePrefix = sourceSegments.slice(0, k).join("/");
|
|
108
|
+
if (destSuffix === sourcePrefix) {
|
|
109
|
+
overlapLen = k;
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return sourceSegments.slice(overlapLen).join("/");
|
|
114
|
+
}
|
|
115
|
+
function extractTargetExtensionFromRecursiveSuffix(toSuffix) {
|
|
116
|
+
return normalizeSlashPath(toSuffix).match(/(\.[^/]+)$/)?.[1] ?? null;
|
|
117
|
+
}
|
|
118
|
+
function resolveRecursiveGlobTargetRelativePath(sourceRelFromPackage, fromPattern, toPattern) {
|
|
119
|
+
let toParts = normalizeSlashPath(toPattern).split("**"), toBase = toParts[0].replace(/\/$/, ""), toSuffix = toParts[1] || "", relativeSubpath = sourceRelFromPackage;
|
|
120
|
+
if (fromPattern.includes("**")) {
|
|
121
|
+
let fromParts = normalizeSlashPath(fromPattern).split("**"), fromBase = fromParts[0].replace(/\/$/, ""), fromSuffix = fromParts[1] || "";
|
|
122
|
+
if (fromBase) {
|
|
123
|
+
let normalizedSource = normalizeSlashPath(sourceRelFromPackage);
|
|
124
|
+
relativeSubpath = normalizedSource.startsWith(fromBase + "/") ? normalizedSource.slice(fromBase.length + 1) : normalizedSource;
|
|
125
|
+
}
|
|
126
|
+
if (fromSuffix && toSuffix) {
|
|
127
|
+
let fromExt = fromSuffix.replace(/^\/?\*+/, ""), toExt = toSuffix.replace(/^\/?\*+/, "");
|
|
128
|
+
fromExt && toExt && fromExt !== toExt && (relativeSubpath = relativeSubpath.replace(
|
|
129
|
+
new RegExp(fromExt.replace(".", "\\.") + "$"),
|
|
130
|
+
toExt
|
|
131
|
+
));
|
|
132
|
+
}
|
|
133
|
+
} else {
|
|
134
|
+
relativeSubpath = toBase ? stripOverlappingDestBaseFromSource(toBase, sourceRelFromPackage) : normalizeSlashPath(sourceRelFromPackage);
|
|
135
|
+
let toExt = extractTargetExtensionFromRecursiveSuffix(toSuffix);
|
|
136
|
+
if (toExt && toExt.startsWith(".")) {
|
|
137
|
+
let currentExt = extname(relativeSubpath);
|
|
138
|
+
currentExt && currentExt !== toExt && (relativeSubpath = relativeSubpath.slice(0, -currentExt.length) + toExt);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return relativeSubpath = stripPlatformSuffixFromFilename(relativeSubpath), normalizeSlashPath(toBase ? `${toBase}/${relativeSubpath}` : relativeSubpath);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// ../core/src/core/platform-yaml-merge.ts
|
|
145
|
+
function mergeInlinePlatformOverride(universalContent, targetPlatform, cwd) {
|
|
146
|
+
try {
|
|
147
|
+
let trimmed = universalContent.trim();
|
|
148
|
+
if (!trimmed.endsWith(FILE_PATTERNS.MD_FILES) && !trimmed.startsWith("---"))
|
|
149
|
+
return universalContent;
|
|
150
|
+
let { frontmatter, body, rawFrontmatter } = splitFrontmatter(universalContent), { common, overridesByPlatform } = extractInlinePlatformOverrides(frontmatter, cwd), override = overridesByPlatform.get(targetPlatform) ?? {}, mergedData = deepMerge(common, override);
|
|
151
|
+
return rawFrontmatter !== void 0 && deepEqualYaml(frontmatter, mergedData) || rawFrontmatter === void 0 && Object.keys(mergedData).length === 0 ? universalContent : composeMarkdown(mergedData, body);
|
|
152
|
+
} catch {
|
|
153
|
+
return universalContent;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// ../core/src/core/flows/flow-key-mapper.ts
|
|
158
|
+
function getNestedValue(obj, path3) {
|
|
159
|
+
if (!path3)
|
|
160
|
+
return obj;
|
|
161
|
+
let keys = path3.split("."), current = obj;
|
|
162
|
+
for (let key of keys)
|
|
163
|
+
if (current && typeof current == "object" && key in current)
|
|
164
|
+
current = current[key];
|
|
165
|
+
else
|
|
166
|
+
return;
|
|
167
|
+
return current;
|
|
168
|
+
}
|
|
169
|
+
function setNestedValue(obj, path3, value) {
|
|
170
|
+
if (!path3)
|
|
171
|
+
return;
|
|
172
|
+
let keys = path3.split("."), current = obj;
|
|
173
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
174
|
+
let key = keys[i];
|
|
175
|
+
(!(key in current) || typeof current[key] != "object") && (current[key] = {}), current = current[key];
|
|
176
|
+
}
|
|
177
|
+
let finalKey = keys[keys.length - 1];
|
|
178
|
+
current[finalKey] = value;
|
|
179
|
+
}
|
|
180
|
+
function deleteNestedValue(obj, path3) {
|
|
181
|
+
if (!path3)
|
|
182
|
+
return;
|
|
183
|
+
let keys = path3.split("."), current = obj;
|
|
184
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
185
|
+
let key = keys[i];
|
|
186
|
+
if (!(key in current) || typeof current[key] != "object")
|
|
187
|
+
return;
|
|
188
|
+
current = current[key];
|
|
189
|
+
}
|
|
190
|
+
let finalKey = keys[keys.length - 1];
|
|
191
|
+
delete current[finalKey];
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// ../core/src/core/flows/source-resolver.ts
|
|
195
|
+
import { promises as fs } from "fs";
|
|
196
|
+
import path from "path";
|
|
197
|
+
import { minimatch } from "minimatch";
|
|
198
|
+
var SourcePatternResolver = class {
|
|
199
|
+
/**
|
|
200
|
+
* Resolve source pattern(s) to file paths
|
|
201
|
+
*
|
|
202
|
+
* For single patterns: returns all matching files
|
|
203
|
+
* For array patterns: returns files from first matching pattern only (priority order)
|
|
204
|
+
*
|
|
205
|
+
* @param pattern - Single pattern or array of patterns with priority
|
|
206
|
+
* @param options - Resolution options
|
|
207
|
+
* @returns Resolution result with paths and warnings
|
|
208
|
+
*/
|
|
209
|
+
async resolve(pattern, options) {
|
|
210
|
+
return Array.isArray(pattern) ? this.resolveWithPriority(pattern, options) : {
|
|
211
|
+
paths: await this.resolveSinglePattern(pattern, options.baseDir),
|
|
212
|
+
warnings: []
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Resolve array of patterns with priority (first match wins)
|
|
217
|
+
*
|
|
218
|
+
* Iterates through patterns in order, returning files from first matching pattern.
|
|
219
|
+
* Logs warnings if lower-priority patterns also match.
|
|
220
|
+
*
|
|
221
|
+
* @param patterns - Array of patterns in priority order
|
|
222
|
+
* @param options - Resolution options
|
|
223
|
+
* @returns Resolution result
|
|
224
|
+
*/
|
|
225
|
+
async resolveWithPriority(patterns, options) {
|
|
226
|
+
if (patterns.length === 0)
|
|
227
|
+
return { paths: [], warnings: ["Empty pattern array provided"] };
|
|
228
|
+
let warnings = [], skippedPatterns = [];
|
|
229
|
+
for (let i = 0; i < patterns.length; i++) {
|
|
230
|
+
let currentPattern = patterns[i], matches = await this.resolveSinglePattern(currentPattern, options.baseDir);
|
|
231
|
+
if (matches.length > 0) {
|
|
232
|
+
for (let j = i + 1; j < patterns.length; j++) {
|
|
233
|
+
let lowerPriorityPattern = patterns[j], lowerMatches = await this.resolveSinglePattern(
|
|
234
|
+
lowerPriorityPattern,
|
|
235
|
+
options.baseDir
|
|
236
|
+
);
|
|
237
|
+
if (lowerMatches.length > 0) {
|
|
238
|
+
let warning = `Pattern "${currentPattern}" matched (priority ${i + 1}). Ignoring lower-priority pattern "${lowerPriorityPattern}" (priority ${j + 1}) which also matched ${lowerMatches.length} file(s).`;
|
|
239
|
+
warnings.push(warning), skippedPatterns.push(lowerPriorityPattern), options.logWarnings !== !1 && logger.debug(warning);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
paths: matches,
|
|
244
|
+
warnings,
|
|
245
|
+
matchedPattern: currentPattern,
|
|
246
|
+
skippedPatterns: skippedPatterns.length > 0 ? skippedPatterns : void 0
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
paths: [],
|
|
252
|
+
warnings: [`No files matched any of the ${patterns.length} pattern(s): ${patterns.join(", ")}`]
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Resolve a single pattern to file paths
|
|
257
|
+
*
|
|
258
|
+
* Handles both glob patterns and literal file paths.
|
|
259
|
+
*
|
|
260
|
+
* @param pattern - File pattern (may contain globs)
|
|
261
|
+
* @param baseDir - Base directory for resolution
|
|
262
|
+
* @returns Array of resolved file paths
|
|
263
|
+
*/
|
|
264
|
+
async resolveSinglePattern(pattern, baseDir) {
|
|
265
|
+
if (this.isGlobPattern(pattern))
|
|
266
|
+
return this.resolveGlobPattern(pattern, baseDir);
|
|
267
|
+
let resolved = path.join(baseDir, pattern);
|
|
268
|
+
return await exists(resolved) ? [resolved] : [];
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Check if pattern contains glob wildcards
|
|
272
|
+
*
|
|
273
|
+
* @param pattern - Pattern to check
|
|
274
|
+
* @returns True if pattern contains glob syntax
|
|
275
|
+
*/
|
|
276
|
+
isGlobPattern(pattern) {
|
|
277
|
+
return pattern.includes("*") || pattern.includes("?") || pattern.includes("[");
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Resolve glob pattern to matching files
|
|
281
|
+
*
|
|
282
|
+
* @param pattern - Glob pattern
|
|
283
|
+
* @param baseDir - Base directory
|
|
284
|
+
* @returns Array of matching file paths
|
|
285
|
+
*/
|
|
286
|
+
async resolveGlobPattern(pattern, baseDir) {
|
|
287
|
+
let matches = [], parts = pattern.split("/"), globPart = parts.findIndex((p) => this.isGlobPattern(p));
|
|
288
|
+
if (globPart === -1)
|
|
289
|
+
return [path.join(baseDir, pattern)];
|
|
290
|
+
let dirPath = path.join(baseDir, ...parts.slice(0, globPart)), filePattern = parts.slice(globPart).join("/");
|
|
291
|
+
return await exists(dirPath) ? (await this.findMatchingFiles(dirPath, filePattern, baseDir, matches), matches) : [];
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Recursively find files matching glob pattern
|
|
295
|
+
*
|
|
296
|
+
* Supports ** for recursive directory matching.
|
|
297
|
+
*
|
|
298
|
+
* @param dir - Current directory
|
|
299
|
+
* @param pattern - Pattern to match
|
|
300
|
+
* @param baseDir - Base directory for relative paths
|
|
301
|
+
* @param matches - Array to accumulate matches
|
|
302
|
+
*/
|
|
303
|
+
async findMatchingFiles(dir, pattern, baseDir, matches) {
|
|
304
|
+
try {
|
|
305
|
+
let entries = await fs.readdir(dir, { withFileTypes: !0 });
|
|
306
|
+
for (let entry of entries) {
|
|
307
|
+
let fullPath = path.join(dir, entry.name), relativePath = path.relative(baseDir, fullPath);
|
|
308
|
+
entry.isDirectory() ? pattern.startsWith("**") || pattern.includes("/**/") ? await this.findMatchingFiles(fullPath, pattern, baseDir, matches) : pattern.includes("/") && await this.findMatchingFiles(fullPath, pattern, baseDir, matches) : entry.isFile() && minimatch(relativePath, pattern, { dot: !1 }) && matches.push(fullPath);
|
|
309
|
+
}
|
|
310
|
+
} catch (error) {
|
|
311
|
+
logger.debug(`Error reading directory ${dir}: ${error}`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
// ../core/src/core/flows/flow-executor.ts
|
|
317
|
+
var DefaultFlowExecutor = class {
|
|
318
|
+
constructor(transformRegistry) {
|
|
319
|
+
this.transformRegistry = transformRegistry || defaultTransformRegistry, this.sourceResolver = new SourcePatternResolver();
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Execute a single flow (now supports glob patterns and switch expressions)
|
|
323
|
+
*/
|
|
324
|
+
async executeFlow(flow, context) {
|
|
325
|
+
let startTime = Date.now();
|
|
326
|
+
try {
|
|
327
|
+
let resolvedFrom = flow.from;
|
|
328
|
+
if (this.isSwitchExpression(flow.from))
|
|
329
|
+
try {
|
|
330
|
+
resolvedFrom = resolveSwitchExpression(flow.from, context);
|
|
331
|
+
} catch (error) {
|
|
332
|
+
return {
|
|
333
|
+
source: "<switch expression>",
|
|
334
|
+
target: this.normalizeToPattern(flow.to),
|
|
335
|
+
success: !1,
|
|
336
|
+
transformed: !1,
|
|
337
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
338
|
+
executionTime: Date.now() - startTime
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
let resolvedTo = flow.to;
|
|
342
|
+
if (this.isSwitchExpression(flow.to))
|
|
343
|
+
try {
|
|
344
|
+
resolvedTo = resolveSwitchExpression(flow.to, context);
|
|
345
|
+
} catch (error) {
|
|
346
|
+
return {
|
|
347
|
+
source: this.normalizeFromPattern(resolvedFrom),
|
|
348
|
+
target: "<switch expression>",
|
|
349
|
+
success: !1,
|
|
350
|
+
transformed: !1,
|
|
351
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
352
|
+
executionTime: Date.now() - startTime
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
if (typeof resolvedTo != "string") {
|
|
356
|
+
let results2 = await this.executeMultiTarget({ ...flow, from: resolvedFrom, to: resolvedTo }, context);
|
|
357
|
+
return this.aggregateResults(results2, startTime);
|
|
358
|
+
}
|
|
359
|
+
let validation = this.validateFlow({ ...flow, from: resolvedFrom, to: resolvedTo });
|
|
360
|
+
if (!validation.valid)
|
|
361
|
+
return {
|
|
362
|
+
source: this.normalizeFromPattern(resolvedFrom),
|
|
363
|
+
target: resolvedTo,
|
|
364
|
+
success: !1,
|
|
365
|
+
transformed: !1,
|
|
366
|
+
error: new Error(`Invalid flow: ${validation.errors.map((e) => e.message).join(", ")}`),
|
|
367
|
+
executionTime: Date.now() - startTime
|
|
368
|
+
};
|
|
369
|
+
if (flow.when && !this.evaluateCondition(flow.when, context)) {
|
|
370
|
+
let normalized = this.normalizeFromPattern(resolvedFrom);
|
|
371
|
+
return logger.debug(`Flow skipped due to condition: ${normalized} -> ${resolvedTo}`), {
|
|
372
|
+
source: normalized,
|
|
373
|
+
target: resolvedTo,
|
|
374
|
+
success: !0,
|
|
375
|
+
transformed: !1,
|
|
376
|
+
warnings: ["Flow skipped due to condition"],
|
|
377
|
+
executionTime: Date.now() - startTime
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
let resolution = await this.resolveSourcePattern(resolvedFrom, context), sourcePaths = resolution.paths, resolutionWarnings = resolution.warnings;
|
|
381
|
+
if (sourcePaths.length === 0)
|
|
382
|
+
return {
|
|
383
|
+
source: this.normalizeFromPattern(resolvedFrom),
|
|
384
|
+
target: resolvedTo,
|
|
385
|
+
success: !0,
|
|
386
|
+
transformed: !1,
|
|
387
|
+
warnings: resolutionWarnings.length > 0 ? resolutionWarnings : ["No files matched pattern"],
|
|
388
|
+
executionTime: Date.now() - startTime
|
|
389
|
+
};
|
|
390
|
+
let results = [], firstFromPattern = this.getFirstPattern(resolvedFrom);
|
|
391
|
+
for (let sourcePath of sourcePaths) {
|
|
392
|
+
let targetPath = this.resolveTargetFromGlob(sourcePath, firstFromPattern, resolvedTo, context), result = await this.executePipeline(flow, sourcePath, targetPath, context);
|
|
393
|
+
results.push({
|
|
394
|
+
...result,
|
|
395
|
+
executionTime: Date.now() - startTime
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
return resolutionWarnings.length > 0 && results.length > 0 && (results[0].warnings = [
|
|
399
|
+
...results[0].warnings || [],
|
|
400
|
+
...resolutionWarnings
|
|
401
|
+
]), results.length === 1 ? results[0] : this.aggregateResults(results, startTime);
|
|
402
|
+
} catch (error) {
|
|
403
|
+
return {
|
|
404
|
+
source: this.isSwitchExpression(flow.from) ? "<switch>" : this.normalizeFromPattern(flow.from),
|
|
405
|
+
target: this.normalizeToPattern(flow.to),
|
|
406
|
+
success: !1,
|
|
407
|
+
transformed: !1,
|
|
408
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
409
|
+
executionTime: Date.now() - startTime
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Execute multiple flows
|
|
415
|
+
*/
|
|
416
|
+
async executeFlows(flows, context) {
|
|
417
|
+
let results = [];
|
|
418
|
+
for (let flow of flows) {
|
|
419
|
+
let result = await this.executeFlow(flow, context);
|
|
420
|
+
results.push(result);
|
|
421
|
+
}
|
|
422
|
+
return results;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Execute a multi-target flow
|
|
426
|
+
*/
|
|
427
|
+
async executeMultiTarget(flow, context) {
|
|
428
|
+
if (typeof flow.to == "string")
|
|
429
|
+
throw new Error("Flow is not a multi-target flow");
|
|
430
|
+
let multiTarget = flow.to, normalizedFrom = this.normalizeFromPattern(flow.from), resolution = await this.resolveSourcePattern(flow.from, context), sourcePaths = resolution.paths;
|
|
431
|
+
if (sourcePaths.length === 0)
|
|
432
|
+
return Object.keys(multiTarget).map((target) => ({
|
|
433
|
+
source: normalizedFrom,
|
|
434
|
+
target,
|
|
435
|
+
success: !0,
|
|
436
|
+
transformed: !1,
|
|
437
|
+
warnings: resolution.warnings.length > 0 ? resolution.warnings : ["No files matched pattern"]
|
|
438
|
+
}));
|
|
439
|
+
let allResults = [], firstFromPattern = this.getFirstPattern(flow.from);
|
|
440
|
+
for (let sourcePath of sourcePaths) {
|
|
441
|
+
let sourceContent = await this.loadSourceFile(sourcePath, context);
|
|
442
|
+
for (let [targetPath, targetFlow] of Object.entries(multiTarget)) {
|
|
443
|
+
let startTime = Date.now();
|
|
444
|
+
try {
|
|
445
|
+
let mergedFlow = {
|
|
446
|
+
...flow,
|
|
447
|
+
...targetFlow,
|
|
448
|
+
from: flow.from,
|
|
449
|
+
to: targetPath
|
|
450
|
+
};
|
|
451
|
+
if (mergedFlow.when && !this.evaluateCondition(mergedFlow.when, context)) {
|
|
452
|
+
logger.debug(`Multi-target flow skipped due to condition: ${normalizedFrom} -> ${targetPath}`), allResults.push({
|
|
453
|
+
source: normalizedFrom,
|
|
454
|
+
target: targetPath,
|
|
455
|
+
success: !0,
|
|
456
|
+
transformed: !1,
|
|
457
|
+
warnings: ["Flow skipped due to condition"],
|
|
458
|
+
executionTime: Date.now() - startTime
|
|
459
|
+
});
|
|
460
|
+
continue;
|
|
461
|
+
}
|
|
462
|
+
let resolvedTargetPath = this.resolveTargetFromGlob(sourcePath, firstFromPattern, targetPath, context), result = await this.executePipelineWithContent(
|
|
463
|
+
mergedFlow,
|
|
464
|
+
sourceContent,
|
|
465
|
+
sourcePath,
|
|
466
|
+
resolvedTargetPath,
|
|
467
|
+
context
|
|
468
|
+
);
|
|
469
|
+
allResults.push({
|
|
470
|
+
...result,
|
|
471
|
+
executionTime: Date.now() - startTime
|
|
472
|
+
});
|
|
473
|
+
} catch (error) {
|
|
474
|
+
allResults.push({
|
|
475
|
+
source: normalizedFrom,
|
|
476
|
+
target: targetPath,
|
|
477
|
+
success: !1,
|
|
478
|
+
transformed: !1,
|
|
479
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
480
|
+
executionTime: Date.now() - startTime
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
return allResults;
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Validate a flow configuration
|
|
489
|
+
*/
|
|
490
|
+
validateFlow(flow) {
|
|
491
|
+
let errors = [];
|
|
492
|
+
if (flow.from || errors.push({ message: 'Flow missing required field "from"', code: "MISSING_FROM" }), flow.to || errors.push({ message: 'Flow missing required field "to"', code: "MISSING_TO" }), flow.to && this.isSwitchExpression(flow.to)) {
|
|
493
|
+
let switchValidation = validateSwitchExpression(flow.to);
|
|
494
|
+
if (!switchValidation.valid)
|
|
495
|
+
for (let error of switchValidation.errors)
|
|
496
|
+
errors.push({
|
|
497
|
+
message: error,
|
|
498
|
+
code: "INVALID_SWITCH_EXPRESSION"
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
if (flow.pick && flow.omit && errors.push({ message: 'Flow cannot have both "pick" and "omit"', code: "CONFLICTING_FILTERS" }), flow.merge && !["deep", "shallow", "replace", "composite"].includes(flow.merge) && errors.push({
|
|
502
|
+
message: `Invalid merge strategy: ${flow.merge}. Must be one of: deep, shallow, replace, composite`,
|
|
503
|
+
code: "INVALID_MERGE"
|
|
504
|
+
}), flow.path)
|
|
505
|
+
try {
|
|
506
|
+
JSONPath({ path: flow.path, json: {} });
|
|
507
|
+
} catch {
|
|
508
|
+
errors.push({
|
|
509
|
+
message: `Invalid JSONPath expression: ${flow.path}`,
|
|
510
|
+
code: "INVALID_JSONPATH"
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
if (flow.map) {
|
|
514
|
+
let mapPipelineValidation = validateMapPipeline(flow.map);
|
|
515
|
+
if (!mapPipelineValidation.valid)
|
|
516
|
+
for (let error of mapPipelineValidation.errors)
|
|
517
|
+
errors.push({
|
|
518
|
+
message: error,
|
|
519
|
+
code: "INVALID_MAP_PIPELINE"
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
return {
|
|
523
|
+
valid: errors.length === 0,
|
|
524
|
+
errors,
|
|
525
|
+
warnings: []
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Check if a value is a switch expression
|
|
530
|
+
*/
|
|
531
|
+
isSwitchExpression(value) {
|
|
532
|
+
return typeof value == "object" && value !== null && "$switch" in value;
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Execute the transformation pipeline
|
|
536
|
+
*/
|
|
537
|
+
async executePipeline(flow, sourcePath, targetPath, context) {
|
|
538
|
+
if (!this.needsParsing(flow, sourcePath, targetPath, context))
|
|
539
|
+
return await this.executePassThroughCopy(flow, sourcePath, targetPath, context);
|
|
540
|
+
let sourceContent = await this.loadSourceFile(sourcePath, context);
|
|
541
|
+
return this.executePipelineWithContent(flow, sourceContent, sourcePath, targetPath, context);
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Execute pipeline with pre-loaded content (for multi-target flows)
|
|
545
|
+
*/
|
|
546
|
+
async executePipelineWithContent(flow, sourceContent, sourcePath, targetPath, context) {
|
|
547
|
+
let warnings = [], conflicts = [], data = sourceContent.data, transformed = !1;
|
|
548
|
+
try {
|
|
549
|
+
flow.path && (data = this.extractJSONPath(data, flow.path), transformed = !0), flow.pick ? (data = this.pickKeys(data, flow.pick), transformed = !0) : flow.omit && (data = this.omitKeys(data, flow.omit), transformed = !0);
|
|
550
|
+
let contributedKeys, schemaOps = [], pipeOps = [];
|
|
551
|
+
if (flow.map) {
|
|
552
|
+
let split = splitMapPipeline(flow.map);
|
|
553
|
+
if (schemaOps = split.schemaOps, pipeOps = split.pipeOps, schemaOps.length > 0) {
|
|
554
|
+
let mapContext = createMapContext({
|
|
555
|
+
filename: path2.basename(sourcePath, path2.extname(sourcePath)),
|
|
556
|
+
dirname: path2.basename(path2.dirname(sourcePath)),
|
|
557
|
+
path: path2.relative(context.packageRoot, sourcePath),
|
|
558
|
+
ext: path2.extname(sourcePath)
|
|
559
|
+
});
|
|
560
|
+
data && typeof data == "object" && "frontmatter" in data ? data.frontmatter = applyMapPipeline(
|
|
561
|
+
data.frontmatter,
|
|
562
|
+
schemaOps,
|
|
563
|
+
mapContext,
|
|
564
|
+
this.transformRegistry
|
|
565
|
+
) : data = applyMapPipeline(
|
|
566
|
+
data,
|
|
567
|
+
schemaOps,
|
|
568
|
+
mapContext,
|
|
569
|
+
this.transformRegistry
|
|
570
|
+
), transformed = !0;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
if (!!flow.merge && flow.merge !== "replace" && flow.merge !== "composite" && typeof data == "object" && data !== null) {
|
|
574
|
+
let dataToExtract = data && "frontmatter" in data ? data.frontmatter : data;
|
|
575
|
+
typeof dataToExtract == "object" && dataToExtract !== null && (contributedKeys = extractAllKeys(dataToExtract));
|
|
576
|
+
}
|
|
577
|
+
let targetExists = await exists(targetPath);
|
|
578
|
+
if (flow.embed && (data = this.embedContent(data, flow.embed), transformed = !0), targetExists) {
|
|
579
|
+
let targetContent = await this.loadSourceFile(targetPath, context);
|
|
580
|
+
if (flow.merge === "composite") {
|
|
581
|
+
let sourceRaw = sourceContent.raw, targetRaw = targetContent.raw;
|
|
582
|
+
data = mergePackageContentIntoRootFile(targetRaw, context.packageName, sourceRaw), transformed = !0;
|
|
583
|
+
} else {
|
|
584
|
+
let mergeResult = this.mergeContent(
|
|
585
|
+
data,
|
|
586
|
+
targetContent.data,
|
|
587
|
+
flow.merge || "replace",
|
|
588
|
+
context
|
|
589
|
+
);
|
|
590
|
+
data = mergeResult.data, conflicts.push(...mergeResult.conflicts), mergeResult.conflicts.length > 0 && (transformed = !0);
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
if (pipeOps.length > 0) {
|
|
594
|
+
let mapContext = createMapContext({
|
|
595
|
+
filename: path2.basename(sourcePath, path2.extname(sourcePath)),
|
|
596
|
+
dirname: path2.basename(path2.dirname(sourcePath)),
|
|
597
|
+
path: path2.relative(context.packageRoot, sourcePath),
|
|
598
|
+
ext: path2.extname(sourcePath)
|
|
599
|
+
});
|
|
600
|
+
data && typeof data == "object" && "frontmatter" in data ? data.frontmatter = applyMapPipeline(
|
|
601
|
+
data.frontmatter,
|
|
602
|
+
pipeOps,
|
|
603
|
+
mapContext,
|
|
604
|
+
this.transformRegistry
|
|
605
|
+
) : data = applyMapPipeline(
|
|
606
|
+
data,
|
|
607
|
+
pipeOps,
|
|
608
|
+
mapContext,
|
|
609
|
+
this.transformRegistry
|
|
610
|
+
), transformed = !0;
|
|
611
|
+
}
|
|
612
|
+
return context.dryRun || await this.writeTargetFile(targetPath, data, sourceContent.format), {
|
|
613
|
+
source: sourcePath,
|
|
614
|
+
target: targetPath,
|
|
615
|
+
success: !0,
|
|
616
|
+
transformed,
|
|
617
|
+
keys: contributedKeys,
|
|
618
|
+
merge: flow.merge,
|
|
619
|
+
warnings: warnings.length > 0 ? warnings : void 0,
|
|
620
|
+
conflicts: conflicts.length > 0 ? conflicts : void 0,
|
|
621
|
+
pipeline: this.getPipeline(flow)
|
|
622
|
+
};
|
|
623
|
+
} catch (error) {
|
|
624
|
+
return {
|
|
625
|
+
source: sourcePath,
|
|
626
|
+
target: targetPath,
|
|
627
|
+
success: !1,
|
|
628
|
+
transformed,
|
|
629
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
630
|
+
warnings: warnings.length > 0 ? warnings : void 0
|
|
631
|
+
};
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
/**
|
|
635
|
+
* Load and parse source file
|
|
636
|
+
*/
|
|
637
|
+
async loadSourceFile(filePath, context) {
|
|
638
|
+
let raw = await readTextFile(filePath), format = this.detectFormat(filePath, raw);
|
|
639
|
+
return (format === "markdown" || format === "md") && context?.platform && context?.direction === "install" && (raw = mergeInlinePlatformOverride(raw, context.platform, context.workspaceRoot)), { data: this.parseSourceContent(raw, format), format, raw };
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Write transformed content to target file
|
|
643
|
+
*/
|
|
644
|
+
async writeTargetFile(filePath, content, sourceFormat) {
|
|
645
|
+
await ensureDir(path2.dirname(filePath));
|
|
646
|
+
let targetFormat = this.detectFormat(filePath, ""), serialized = this.serializeTargetContent(content, targetFormat);
|
|
647
|
+
await writeTextFile(filePath, serialized);
|
|
648
|
+
}
|
|
649
|
+
/**
|
|
650
|
+
* Determine if parsing is needed for this flow
|
|
651
|
+
* Returns false for simple pass-through copies with no transformations
|
|
652
|
+
*/
|
|
653
|
+
needsParsing(flow, sourcePath, targetPath, context) {
|
|
654
|
+
if (flow.map || flow.pick || flow.omit || flow.path || flow.embed || flow.merge && (flow.merge === "deep" || flow.merge === "shallow"))
|
|
655
|
+
return !0;
|
|
656
|
+
let sourceExt = path2.extname(sourcePath).toLowerCase(), targetExt = path2.extname(targetPath).toLowerCase();
|
|
657
|
+
return !!(sourceExt !== targetExt && [".json", ".jsonc", ".yaml", ".yml", ".toml"].includes(sourceExt) || (sourceExt === ".md" || sourceExt === ".mdc" || sourceExt === ".markdown") && context.platform && context.direction === "install");
|
|
658
|
+
}
|
|
659
|
+
/**
|
|
660
|
+
* Execute a pass-through copy without parsing
|
|
661
|
+
* Used for simple file copies with no transformations
|
|
662
|
+
*/
|
|
663
|
+
async executePassThroughCopy(flow, sourcePath, targetPath, context) {
|
|
664
|
+
let warnings = [];
|
|
665
|
+
try {
|
|
666
|
+
if (await exists(targetPath) && flow.merge && flow.merge !== "replace") {
|
|
667
|
+
logger.warn(`Pass-through copy attempted with merge strategy '${flow.merge}' - falling back to parsed pipeline`);
|
|
668
|
+
let sourceContent = await this.loadSourceFile(sourcePath, context);
|
|
669
|
+
return this.executePipelineWithContent(flow, sourceContent, sourcePath, targetPath, context);
|
|
670
|
+
}
|
|
671
|
+
if (!context.dryRun) {
|
|
672
|
+
await ensureDir(path2.dirname(targetPath));
|
|
673
|
+
let content = await fs2.readFile(sourcePath);
|
|
674
|
+
await fs2.writeFile(targetPath, content);
|
|
675
|
+
}
|
|
676
|
+
return {
|
|
677
|
+
source: sourcePath,
|
|
678
|
+
target: targetPath,
|
|
679
|
+
success: !0,
|
|
680
|
+
transformed: !1,
|
|
681
|
+
warnings: warnings.length > 0 ? warnings : void 0
|
|
682
|
+
};
|
|
683
|
+
} catch (error) {
|
|
684
|
+
return {
|
|
685
|
+
source: sourcePath,
|
|
686
|
+
target: targetPath,
|
|
687
|
+
success: !1,
|
|
688
|
+
transformed: !1,
|
|
689
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
690
|
+
warnings: warnings.length > 0 ? warnings : void 0
|
|
691
|
+
};
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* Parse source content based on format
|
|
696
|
+
*/
|
|
697
|
+
parseSourceContent(content, format) {
|
|
698
|
+
if (!content.trim())
|
|
699
|
+
switch (format) {
|
|
700
|
+
case "json":
|
|
701
|
+
case "jsonc":
|
|
702
|
+
case "yaml":
|
|
703
|
+
case "yml":
|
|
704
|
+
case "toml":
|
|
705
|
+
return {};
|
|
706
|
+
case "markdown":
|
|
707
|
+
case "md":
|
|
708
|
+
return { body: "" };
|
|
709
|
+
case "text":
|
|
710
|
+
case "txt":
|
|
711
|
+
default:
|
|
712
|
+
return content;
|
|
713
|
+
}
|
|
714
|
+
try {
|
|
715
|
+
switch (format) {
|
|
716
|
+
case "json":
|
|
717
|
+
case "jsonc":
|
|
718
|
+
let cleaned = content;
|
|
719
|
+
if (format === "jsonc") {
|
|
720
|
+
let parsed = parseJsonc(cleaned);
|
|
721
|
+
if (parsed === void 0)
|
|
722
|
+
throw new Error("jsonc-parser returned undefined");
|
|
723
|
+
return parsed;
|
|
724
|
+
}
|
|
725
|
+
return JSON.parse(cleaned);
|
|
726
|
+
case "yaml":
|
|
727
|
+
case "yml":
|
|
728
|
+
return yaml.load(content);
|
|
729
|
+
case "toml":
|
|
730
|
+
try {
|
|
731
|
+
return TOML.parse(content);
|
|
732
|
+
} catch (error) {
|
|
733
|
+
throw new Error(`TOML parse error: ${error instanceof Error ? error.message : String(error)}`);
|
|
734
|
+
}
|
|
735
|
+
case "markdown":
|
|
736
|
+
case "md":
|
|
737
|
+
return this.parseMarkdown(content);
|
|
738
|
+
case "text":
|
|
739
|
+
case "txt":
|
|
740
|
+
default:
|
|
741
|
+
return content;
|
|
742
|
+
}
|
|
743
|
+
} catch (error) {
|
|
744
|
+
throw new Error(`Failed to parse ${format} content: ${error instanceof Error ? error.message : String(error)}`);
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
/**
|
|
748
|
+
* Serialize content to target format
|
|
749
|
+
*/
|
|
750
|
+
serializeTargetContent(content, format) {
|
|
751
|
+
try {
|
|
752
|
+
switch (format) {
|
|
753
|
+
case "json":
|
|
754
|
+
case "jsonc":
|
|
755
|
+
return JSON.stringify(content, null, 2);
|
|
756
|
+
case "yaml":
|
|
757
|
+
case "yml":
|
|
758
|
+
return yaml.dump(content, { indent: 2, flowLevel: -1, lineWidth: -1 });
|
|
759
|
+
case "toml":
|
|
760
|
+
if (typeof content == "string")
|
|
761
|
+
return content;
|
|
762
|
+
try {
|
|
763
|
+
let toml = TOML.stringify(content);
|
|
764
|
+
return content && typeof content == "object" && content.mcp_servers && (toml = this.applyCodexTomlFormatting(toml)), toml;
|
|
765
|
+
} catch (error) {
|
|
766
|
+
throw new Error(`TOML stringify error: ${error instanceof Error ? error.message : String(error)}`);
|
|
767
|
+
}
|
|
768
|
+
case "markdown":
|
|
769
|
+
case "md":
|
|
770
|
+
return this.serializeMarkdown(content);
|
|
771
|
+
case "text":
|
|
772
|
+
case "txt":
|
|
773
|
+
default:
|
|
774
|
+
return typeof content == "string" ? content : JSON.stringify(content, null, 2);
|
|
775
|
+
}
|
|
776
|
+
} catch (error) {
|
|
777
|
+
throw new Error(`Failed to serialize ${format} content: ${error instanceof Error ? error.message : String(error)}`);
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
/**
|
|
781
|
+
* Detect format from file extension or content
|
|
782
|
+
*/
|
|
783
|
+
detectFormat(filePath, content) {
|
|
784
|
+
let ext = path2.extname(filePath).toLowerCase(), extMap = {
|
|
785
|
+
".json": "json",
|
|
786
|
+
".jsonc": "jsonc",
|
|
787
|
+
".yaml": "yaml",
|
|
788
|
+
".yml": "yml",
|
|
789
|
+
".toml": "toml",
|
|
790
|
+
".md": "markdown",
|
|
791
|
+
".mdc": "markdown",
|
|
792
|
+
".markdown": "markdown",
|
|
793
|
+
".txt": "text"
|
|
794
|
+
};
|
|
795
|
+
return extMap[ext] ? extMap[ext] : content.trim().startsWith("{") || content.trim().startsWith("[") ? content.includes("//") || content.includes("/*") ? "jsonc" : "json" : content.includes(`---
|
|
796
|
+
`) || content.includes(`
|
|
797
|
+
---
|
|
798
|
+
`) ? "markdown" : "text";
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* Extract data using JSONPath
|
|
802
|
+
*/
|
|
803
|
+
extractJSONPath(data, jsonPath) {
|
|
804
|
+
try {
|
|
805
|
+
let result = JSONPath({ path: jsonPath, json: data });
|
|
806
|
+
return result.length === 1 ? result[0] : result;
|
|
807
|
+
} catch (error) {
|
|
808
|
+
throw new Error(`JSONPath extraction failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
/**
|
|
812
|
+
* Pick specified keys
|
|
813
|
+
*/
|
|
814
|
+
pickKeys(data, keys) {
|
|
815
|
+
if (typeof data != "object" || data === null)
|
|
816
|
+
return data;
|
|
817
|
+
let result = Array.isArray(data) ? [] : {};
|
|
818
|
+
for (let key of keys)
|
|
819
|
+
key.includes(".") ? this.setNestedValue(result, key, this.getNestedValue(data, key)) : key in data && (result[key] = data[key]);
|
|
820
|
+
return result;
|
|
821
|
+
}
|
|
822
|
+
/**
|
|
823
|
+
* Omit specified keys
|
|
824
|
+
*/
|
|
825
|
+
omitKeys(data, keys) {
|
|
826
|
+
if (typeof data != "object" || data === null)
|
|
827
|
+
return data;
|
|
828
|
+
let result = Array.isArray(data) ? [...data] : { ...data };
|
|
829
|
+
for (let key of keys)
|
|
830
|
+
key.includes(".") ? this.deleteNestedValue(result, key) : delete result[key];
|
|
831
|
+
return result;
|
|
832
|
+
}
|
|
833
|
+
/**
|
|
834
|
+
* Apply pipe transforms
|
|
835
|
+
*/
|
|
836
|
+
async applyPipeTransforms(data, transforms, context) {
|
|
837
|
+
let result = data;
|
|
838
|
+
for (let transformSpec of transforms)
|
|
839
|
+
try {
|
|
840
|
+
let { name, options } = this.parseTransformSpec(transformSpec);
|
|
841
|
+
logger.debug(`Applying transform: ${name}`, options), result = this.transformRegistry.execute(name, result, options);
|
|
842
|
+
} catch (error) {
|
|
843
|
+
throw new Error(`Transform '${transformSpec}' failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
844
|
+
}
|
|
845
|
+
return result;
|
|
846
|
+
}
|
|
847
|
+
/**
|
|
848
|
+
* Parse transform specification
|
|
849
|
+
* Examples: "trim", "number", "pick-keys(keys=[a,b,c])"
|
|
850
|
+
*/
|
|
851
|
+
parseTransformSpec(spec) {
|
|
852
|
+
let match = spec.match(/^([a-z-]+)(?:\((.+)\))?$/);
|
|
853
|
+
if (!match)
|
|
854
|
+
throw new Error(`Invalid transform specification: ${spec}`);
|
|
855
|
+
let [, name, optionsStr] = match;
|
|
856
|
+
if (!optionsStr)
|
|
857
|
+
return { name };
|
|
858
|
+
let options = {}, pairs = optionsStr.split(",").map((s) => s.trim());
|
|
859
|
+
for (let pair of pairs) {
|
|
860
|
+
let [key, value] = pair.split("=").map((s) => s.trim());
|
|
861
|
+
value.startsWith("[") && value.endsWith("]") ? options[key] = value.slice(1, -1).split(",").map((s) => s.trim()) : value === "true" || value === "false" ? options[key] = value === "true" : isNaN(Number(value)) ? options[key] = value : options[key] = Number(value);
|
|
862
|
+
}
|
|
863
|
+
return { name, options };
|
|
864
|
+
}
|
|
865
|
+
/**
|
|
866
|
+
* Embed content under a key
|
|
867
|
+
*/
|
|
868
|
+
embedContent(data, key) {
|
|
869
|
+
return { [key]: data };
|
|
870
|
+
}
|
|
871
|
+
/**
|
|
872
|
+
* Merge content with priority-based conflict resolution
|
|
873
|
+
*/
|
|
874
|
+
mergeContent(source, target, strategy, context) {
|
|
875
|
+
let conflicts = [], merged;
|
|
876
|
+
switch (strategy) {
|
|
877
|
+
case "replace":
|
|
878
|
+
merged = source;
|
|
879
|
+
break;
|
|
880
|
+
case "shallow":
|
|
881
|
+
merged = { ...target, ...source };
|
|
882
|
+
break;
|
|
883
|
+
case "deep":
|
|
884
|
+
merged = this.deepMerge(target, source, conflicts, context);
|
|
885
|
+
break;
|
|
886
|
+
case "composite":
|
|
887
|
+
merged = source;
|
|
888
|
+
break;
|
|
889
|
+
default:
|
|
890
|
+
merged = source;
|
|
891
|
+
}
|
|
892
|
+
return { data: merged, conflicts };
|
|
893
|
+
}
|
|
894
|
+
/**
|
|
895
|
+
* Deep merge two objects
|
|
896
|
+
*/
|
|
897
|
+
deepMerge(target, source, conflicts, context, keyPath = "") {
|
|
898
|
+
if (typeof source != "object" || source === null || typeof target != "object" || target === null)
|
|
899
|
+
return source;
|
|
900
|
+
if (Array.isArray(source) && Array.isArray(target))
|
|
901
|
+
return [...target, ...source];
|
|
902
|
+
let result = { ...target };
|
|
903
|
+
for (let key of Object.keys(source)) {
|
|
904
|
+
let currentPath = keyPath ? `${keyPath}.${key}` : key;
|
|
905
|
+
key in target ? typeof source[key] == "object" && typeof target[key] == "object" ? result[key] = this.deepMerge(target[key], source[key], conflicts, context, currentPath) : source[key] !== target[key] && (conflicts.push({
|
|
906
|
+
path: currentPath,
|
|
907
|
+
winner: context.packageName,
|
|
908
|
+
losers: ["existing"],
|
|
909
|
+
type: "value",
|
|
910
|
+
resolution: "last-writer-wins"
|
|
911
|
+
}), result[key] = source[key]) : result[key] = source[key];
|
|
912
|
+
}
|
|
913
|
+
return result;
|
|
914
|
+
}
|
|
915
|
+
/**
|
|
916
|
+
* Evaluate condition
|
|
917
|
+
*/
|
|
918
|
+
evaluateCondition(condition, context) {
|
|
919
|
+
if (condition.and)
|
|
920
|
+
return condition.and.every((c) => this.evaluateCondition(c, context));
|
|
921
|
+
if (condition.or)
|
|
922
|
+
return condition.or.some((c) => this.evaluateCondition(c, context));
|
|
923
|
+
if (condition.not)
|
|
924
|
+
return !this.evaluateCondition(condition.not, context);
|
|
925
|
+
if (condition.$eq) {
|
|
926
|
+
let [left, right] = condition.$eq, leftVal = this.resolveValue(left, context), rightVal = this.resolveValue(right, context);
|
|
927
|
+
return smartEquals(leftVal, rightVal);
|
|
928
|
+
}
|
|
929
|
+
if (condition.$ne) {
|
|
930
|
+
let [left, right] = condition.$ne, leftVal = this.resolveValue(left, context), rightVal = this.resolveValue(right, context);
|
|
931
|
+
return smartNotEquals(leftVal, rightVal);
|
|
932
|
+
}
|
|
933
|
+
if (condition.exists) {
|
|
934
|
+
let testPath = path2.join(context.workspaceRoot, condition.exists);
|
|
935
|
+
return fsSync.existsSync(testPath);
|
|
936
|
+
}
|
|
937
|
+
return condition.platform ? context.platform === condition.platform : !0;
|
|
938
|
+
}
|
|
939
|
+
/**
|
|
940
|
+
* Resolve a value, handling $$variable references
|
|
941
|
+
*/
|
|
942
|
+
resolveValue(value, context) {
|
|
943
|
+
if (value.startsWith("$$")) {
|
|
944
|
+
let varName = value.slice(2);
|
|
945
|
+
return context.variables[varName];
|
|
946
|
+
}
|
|
947
|
+
return value;
|
|
948
|
+
}
|
|
949
|
+
/**
|
|
950
|
+
* Resolve pattern with glob support and priority-based array matching
|
|
951
|
+
* Returns resolved file paths (glob patterns return multiple files)
|
|
952
|
+
*/
|
|
953
|
+
async resolveSourcePattern(pattern, context) {
|
|
954
|
+
if (this.isSwitchExpression(pattern))
|
|
955
|
+
throw new Error("Cannot resolve SwitchExpression - expression must be resolved first");
|
|
956
|
+
let narrowedPattern = pattern, result = await this.sourceResolver.resolve(narrowedPattern, {
|
|
957
|
+
baseDir: context.packageRoot,
|
|
958
|
+
logWarnings: !0
|
|
959
|
+
});
|
|
960
|
+
return {
|
|
961
|
+
paths: result.paths,
|
|
962
|
+
warnings: result.warnings
|
|
963
|
+
};
|
|
964
|
+
}
|
|
965
|
+
/**
|
|
966
|
+
* Resolve target path from source path and patterns
|
|
967
|
+
* Handles single-level (*) and recursive (**) globs
|
|
968
|
+
* Strips platform suffixes from filenames (e.g. read-specs.claude.md -> read-specs.md)
|
|
969
|
+
*/
|
|
970
|
+
resolveTargetFromGlob(sourcePath, fromPattern, toPattern, context) {
|
|
971
|
+
let relativePath = path2.relative(context.packageRoot, sourcePath);
|
|
972
|
+
if (toPattern.includes("*")) {
|
|
973
|
+
if (toPattern.includes("**")) {
|
|
974
|
+
let targetRel = resolveRecursiveGlobTargetRelativePath(
|
|
975
|
+
relativePath,
|
|
976
|
+
fromPattern,
|
|
977
|
+
toPattern
|
|
978
|
+
);
|
|
979
|
+
return path2.join(context.workspaceRoot, targetRel);
|
|
980
|
+
}
|
|
981
|
+
let sourceFileName = path2.basename(sourcePath), sourceExt = path2.extname(sourcePath), sourceBase = path2.basename(sourcePath, sourceExt), toParts = toPattern.split("*"), toPrefix = toParts[0], toSuffix = toParts[1] || "", targetExt = toSuffix.startsWith(".") ? toSuffix : sourceExt + toSuffix, targetFileName = sourceBase + targetExt, strippedTargetFileName = stripPlatformSuffixFromFilename(targetFileName), resolvedTo = toPrefix + strippedTargetFileName;
|
|
982
|
+
return path2.join(context.workspaceRoot, resolvedTo);
|
|
983
|
+
}
|
|
984
|
+
return path2.join(context.workspaceRoot, toPattern);
|
|
985
|
+
}
|
|
986
|
+
/**
|
|
987
|
+
* Get pipeline description
|
|
988
|
+
*/
|
|
989
|
+
getPipeline(flow) {
|
|
990
|
+
let pipeline = ["load"];
|
|
991
|
+
return flow.path && pipeline.push("extract"), flow.pick && pipeline.push("pick"), flow.omit && pipeline.push("omit"), flow.map && pipeline.push("map"), flow.embed && pipeline.push("embed"), flow.merge && pipeline.push(`merge:${flow.merge}`), pipeline.push("write"), pipeline;
|
|
992
|
+
}
|
|
993
|
+
/**
|
|
994
|
+
* Normalize from pattern for display in results
|
|
995
|
+
* Converts array to comma-separated string
|
|
996
|
+
*/
|
|
997
|
+
normalizeFromPattern(pattern) {
|
|
998
|
+
if (this.isSwitchExpression(pattern))
|
|
999
|
+
return "<switch>";
|
|
1000
|
+
let narrowedPattern = pattern;
|
|
1001
|
+
return Array.isArray(narrowedPattern) ? narrowedPattern.join(", ") : narrowedPattern;
|
|
1002
|
+
}
|
|
1003
|
+
/**
|
|
1004
|
+
* Normalize to pattern for display in results
|
|
1005
|
+
* Handles string, multi-target, and switch expressions
|
|
1006
|
+
*/
|
|
1007
|
+
normalizeToPattern(pattern) {
|
|
1008
|
+
return typeof pattern == "string" ? pattern : this.isSwitchExpression(pattern) ? "<switch>" : Object.keys(pattern).join(", ");
|
|
1009
|
+
}
|
|
1010
|
+
/**
|
|
1011
|
+
* Get the first pattern from a pattern or array of patterns
|
|
1012
|
+
* Used for path resolution when multiple sources are specified
|
|
1013
|
+
*/
|
|
1014
|
+
getFirstPattern(pattern) {
|
|
1015
|
+
if (this.isSwitchExpression(pattern))
|
|
1016
|
+
throw new Error("Cannot get first pattern from SwitchExpression - expression must be resolved first");
|
|
1017
|
+
let narrowedPattern = pattern;
|
|
1018
|
+
return Array.isArray(narrowedPattern) ? narrowedPattern[0] : narrowedPattern;
|
|
1019
|
+
}
|
|
1020
|
+
/**
|
|
1021
|
+
* Aggregate multi-target results
|
|
1022
|
+
*/
|
|
1023
|
+
aggregateResults(results, startTime) {
|
|
1024
|
+
let successful = results.filter((r) => r.success), failed = results.filter((r) => !r.success);
|
|
1025
|
+
return failed.length > 0 ? {
|
|
1026
|
+
source: results[0]?.source || "",
|
|
1027
|
+
target: results.map((r) => r.target).join(", "),
|
|
1028
|
+
success: !1,
|
|
1029
|
+
transformed: results.some((r) => r.transformed),
|
|
1030
|
+
error: failed[0]?.error,
|
|
1031
|
+
warnings: results.flatMap((r) => r.warnings || []),
|
|
1032
|
+
executionTime: Date.now() - startTime
|
|
1033
|
+
} : {
|
|
1034
|
+
source: results[0]?.source || "",
|
|
1035
|
+
target: results.flatMap((r) => typeof r.target == "string" ? [r.target] : r.target),
|
|
1036
|
+
success: !0,
|
|
1037
|
+
transformed: results.some((r) => r.transformed),
|
|
1038
|
+
warnings: results.flatMap((r) => r.warnings || []),
|
|
1039
|
+
conflicts: results.flatMap((r) => r.conflicts || []),
|
|
1040
|
+
executionTime: Date.now() - startTime
|
|
1041
|
+
};
|
|
1042
|
+
}
|
|
1043
|
+
/**
|
|
1044
|
+
* Parse markdown with frontmatter
|
|
1045
|
+
*/
|
|
1046
|
+
parseMarkdown(content) {
|
|
1047
|
+
return parseMarkdownDocument(content);
|
|
1048
|
+
}
|
|
1049
|
+
/**
|
|
1050
|
+
* Serialize markdown with frontmatter
|
|
1051
|
+
*/
|
|
1052
|
+
serializeMarkdown(content) {
|
|
1053
|
+
return serializeMarkdownDocument(content);
|
|
1054
|
+
}
|
|
1055
|
+
/**
|
|
1056
|
+
* Strip JSON comments
|
|
1057
|
+
*/
|
|
1058
|
+
stripJSONComments(content) {
|
|
1059
|
+
let result = content.replace(/\/\/.*$/gm, "");
|
|
1060
|
+
return result = result.replace(/\/\*[\s\S]*?\*\//g, ""), result;
|
|
1061
|
+
}
|
|
1062
|
+
/**
|
|
1063
|
+
* Get nested value using dot notation (delegates to key mapper)
|
|
1064
|
+
*/
|
|
1065
|
+
getNestedValue(obj, path3) {
|
|
1066
|
+
return getNestedValue(obj, path3);
|
|
1067
|
+
}
|
|
1068
|
+
/**
|
|
1069
|
+
* Set nested value using dot notation (delegates to key mapper)
|
|
1070
|
+
*/
|
|
1071
|
+
setNestedValue(obj, path3, value) {
|
|
1072
|
+
setNestedValue(obj, path3, value);
|
|
1073
|
+
}
|
|
1074
|
+
/**
|
|
1075
|
+
* Delete nested value using dot notation (delegates to key mapper)
|
|
1076
|
+
*/
|
|
1077
|
+
deleteNestedValue(obj, path3) {
|
|
1078
|
+
deleteNestedValue(obj, path3);
|
|
1079
|
+
}
|
|
1080
|
+
/**
|
|
1081
|
+
* Apply Codex-specific TOML formatting
|
|
1082
|
+
* Converts nested table sections to inline format for http_headers and env_http_headers
|
|
1083
|
+
*/
|
|
1084
|
+
applyCodexTomlFormatting(toml) {
|
|
1085
|
+
let inlineKeys = ["http_headers", "env_http_headers"], result = toml;
|
|
1086
|
+
for (let key of inlineKeys) {
|
|
1087
|
+
let pattern = new RegExp(
|
|
1088
|
+
`\\[([\\w-]+(?:\\.[\\w-]+|\\."[^"]+")*)?\\.${key}\\]\\s*\\n([\\s\\S]*?)(?=\\n\\[|\\n*$)`,
|
|
1089
|
+
"g"
|
|
1090
|
+
);
|
|
1091
|
+
result = result.replace(pattern, (match, parentPath, content) => {
|
|
1092
|
+
let pairs = [], lines = content.trim().split(`
|
|
1093
|
+
`);
|
|
1094
|
+
for (let line of lines) {
|
|
1095
|
+
let trimmed = line.trim();
|
|
1096
|
+
if (!trimmed || trimmed.startsWith("#")) continue;
|
|
1097
|
+
let kvMatch = trimmed.match(/^([\w-]+)\s*=\s*(.+)$/);
|
|
1098
|
+
if (kvMatch) {
|
|
1099
|
+
let [, k, v] = kvMatch;
|
|
1100
|
+
pairs.push(`"${k}" = ${v}`);
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
if (pairs.length === 0) return match;
|
|
1104
|
+
let inlineTable = `{ ${pairs.join(", ")} }`;
|
|
1105
|
+
return `${key} = ${inlineTable}`;
|
|
1106
|
+
});
|
|
1107
|
+
}
|
|
1108
|
+
return result;
|
|
1109
|
+
}
|
|
1110
|
+
};
|
|
1111
|
+
function createFlowExecutor() {
|
|
1112
|
+
return new DefaultFlowExecutor();
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
export {
|
|
1116
|
+
calculateFileHash,
|
|
1117
|
+
mergePackageContentIntoRootFile,
|
|
1118
|
+
resolveRecursiveGlobTargetRelativePath,
|
|
1119
|
+
createFlowExecutor
|
|
1120
|
+
};
|
|
1121
|
+
//# sourceMappingURL=chunk-WT4VVCXM.js.map
|