@yohakuforce/core 0.4.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/README.md +65 -0
- package/dist/adapters/dx-mcp/dx-mcp-source-adapter.d.ts +25 -0
- package/dist/adapters/dx-mcp/dx-mcp-source-adapter.d.ts.map +1 -0
- package/dist/adapters/dx-mcp/dx-mcp-source-adapter.js +45 -0
- package/dist/adapters/dx-mcp/dx-mcp-source-adapter.js.map +1 -0
- package/dist/adapters/dx-mcp/index.d.ts +3 -0
- package/dist/adapters/dx-mcp/index.d.ts.map +1 -0
- package/dist/adapters/dx-mcp/index.js +2 -0
- package/dist/adapters/dx-mcp/index.js.map +1 -0
- package/dist/adapters/local/index.d.ts +5 -0
- package/dist/adapters/local/index.d.ts.map +1 -0
- package/dist/adapters/local/index.js +3 -0
- package/dist/adapters/local/index.js.map +1 -0
- package/dist/adapters/local/local-source-adapter.d.ts +19 -0
- package/dist/adapters/local/local-source-adapter.d.ts.map +1 -0
- package/dist/adapters/local/local-source-adapter.js +214 -0
- package/dist/adapters/local/local-source-adapter.js.map +1 -0
- package/dist/adapters/local/sfdx-project.d.ts +14 -0
- package/dist/adapters/local/sfdx-project.d.ts.map +1 -0
- package/dist/adapters/local/sfdx-project.js +76 -0
- package/dist/adapters/local/sfdx-project.js.map +1 -0
- package/dist/change-summary/index.d.ts +4 -0
- package/dist/change-summary/index.d.ts.map +1 -0
- package/dist/change-summary/index.js +3 -0
- package/dist/change-summary/index.js.map +1 -0
- package/dist/change-summary/schema.json +152 -0
- package/dist/change-summary/types.d.ts +52 -0
- package/dist/change-summary/types.d.ts.map +1 -0
- package/dist/change-summary/types.js +18 -0
- package/dist/change-summary/types.js.map +1 -0
- package/dist/change-summary/validate.d.ts +8 -0
- package/dist/change-summary/validate.d.ts.map +1 -0
- package/dist/change-summary/validate.js +35 -0
- package/dist/change-summary/validate.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +945 -0
- package/dist/cli.js.map +1 -0
- package/dist/consistency/check.d.ts +4 -0
- package/dist/consistency/check.d.ts.map +1 -0
- package/dist/consistency/check.js +70 -0
- package/dist/consistency/check.js.map +1 -0
- package/dist/consistency/index.d.ts +4 -0
- package/dist/consistency/index.d.ts.map +1 -0
- package/dist/consistency/index.js +3 -0
- package/dist/consistency/index.js.map +1 -0
- package/dist/consistency/types.d.ts +29 -0
- package/dist/consistency/types.d.ts.map +1 -0
- package/dist/consistency/types.js +12 -0
- package/dist/consistency/types.js.map +1 -0
- package/dist/diff/classify-files.d.ts +9 -0
- package/dist/diff/classify-files.d.ts.map +1 -0
- package/dist/diff/classify-files.js +105 -0
- package/dist/diff/classify-files.js.map +1 -0
- package/dist/diff/diff.d.ts +11 -0
- package/dist/diff/diff.d.ts.map +1 -0
- package/dist/diff/diff.js +69 -0
- package/dist/diff/diff.js.map +1 -0
- package/dist/diff/git.d.ts +28 -0
- package/dist/diff/git.d.ts.map +1 -0
- package/dist/diff/git.js +115 -0
- package/dist/diff/git.js.map +1 -0
- package/dist/diff/index.d.ts +7 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +5 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/types.d.ts +28 -0
- package/dist/diff/types.d.ts.map +1 -0
- package/dist/diff/types.js +4 -0
- package/dist/diff/types.js.map +1 -0
- package/dist/explain/block-registry.d.ts +17 -0
- package/dist/explain/block-registry.d.ts.map +1 -0
- package/dist/explain/block-registry.js +73 -0
- package/dist/explain/block-registry.js.map +1 -0
- package/dist/explain/index.d.ts +22 -0
- package/dist/explain/index.d.ts.map +1 -0
- package/dist/explain/index.js +128 -0
- package/dist/explain/index.js.map +1 -0
- package/dist/graph/builder.d.ts +9 -0
- package/dist/graph/builder.d.ts.map +1 -0
- package/dist/graph/builder.js +276 -0
- package/dist/graph/builder.js.map +1 -0
- package/dist/graph/dependencies.d.ts +5 -0
- package/dist/graph/dependencies.d.ts.map +1 -0
- package/dist/graph/dependencies.js +38 -0
- package/dist/graph/dependencies.js.map +1 -0
- package/dist/graph/extractors/apex-body.d.ts +5 -0
- package/dist/graph/extractors/apex-body.d.ts.map +1 -0
- package/dist/graph/extractors/apex-body.js +289 -0
- package/dist/graph/extractors/apex-body.js.map +1 -0
- package/dist/graph/extractors/apex-class.d.ts +5 -0
- package/dist/graph/extractors/apex-class.d.ts.map +1 -0
- package/dist/graph/extractors/apex-class.js +43 -0
- package/dist/graph/extractors/apex-class.js.map +1 -0
- package/dist/graph/extractors/apex-control-flow.d.ts +33 -0
- package/dist/graph/extractors/apex-control-flow.d.ts.map +1 -0
- package/dist/graph/extractors/apex-control-flow.js +432 -0
- package/dist/graph/extractors/apex-control-flow.js.map +1 -0
- package/dist/graph/extractors/apex-trigger.d.ts +4 -0
- package/dist/graph/extractors/apex-trigger.d.ts.map +1 -0
- package/dist/graph/extractors/apex-trigger.js +40 -0
- package/dist/graph/extractors/apex-trigger.js.map +1 -0
- package/dist/graph/extractors/approval-process.d.ts +4 -0
- package/dist/graph/extractors/approval-process.d.ts.map +1 -0
- package/dist/graph/extractors/approval-process.js +103 -0
- package/dist/graph/extractors/approval-process.js.map +1 -0
- package/dist/graph/extractors/aura-bundle.d.ts +4 -0
- package/dist/graph/extractors/aura-bundle.d.ts.map +1 -0
- package/dist/graph/extractors/aura-bundle.js +77 -0
- package/dist/graph/extractors/aura-bundle.js.map +1 -0
- package/dist/graph/extractors/custom-application.d.ts +4 -0
- package/dist/graph/extractors/custom-application.d.ts.map +1 -0
- package/dist/graph/extractors/custom-application.js +55 -0
- package/dist/graph/extractors/custom-application.js.map +1 -0
- package/dist/graph/extractors/custom-metadata-record.d.ts +4 -0
- package/dist/graph/extractors/custom-metadata-record.d.ts.map +1 -0
- package/dist/graph/extractors/custom-metadata-record.js +53 -0
- package/dist/graph/extractors/custom-metadata-record.js.map +1 -0
- package/dist/graph/extractors/field.d.ts +4 -0
- package/dist/graph/extractors/field.d.ts.map +1 -0
- package/dist/graph/extractors/field.js +36 -0
- package/dist/graph/extractors/field.js.map +1 -0
- package/dist/graph/extractors/flexi-page.d.ts +4 -0
- package/dist/graph/extractors/flexi-page.d.ts.map +1 -0
- package/dist/graph/extractors/flexi-page.js +46 -0
- package/dist/graph/extractors/flexi-page.js.map +1 -0
- package/dist/graph/extractors/flow-body.d.ts +3 -0
- package/dist/graph/extractors/flow-body.d.ts.map +1 -0
- package/dist/graph/extractors/flow-body.js +144 -0
- package/dist/graph/extractors/flow-body.js.map +1 -0
- package/dist/graph/extractors/flow.d.ts +4 -0
- package/dist/graph/extractors/flow.d.ts.map +1 -0
- package/dist/graph/extractors/flow.js +20 -0
- package/dist/graph/extractors/flow.js.map +1 -0
- package/dist/graph/extractors/index.d.ts +24 -0
- package/dist/graph/extractors/index.d.ts.map +1 -0
- package/dist/graph/extractors/index.js +23 -0
- package/dist/graph/extractors/index.js.map +1 -0
- package/dist/graph/extractors/layout.d.ts +4 -0
- package/dist/graph/extractors/layout.d.ts.map +1 -0
- package/dist/graph/extractors/layout.js +89 -0
- package/dist/graph/extractors/layout.js.map +1 -0
- package/dist/graph/extractors/lwc.d.ts +4 -0
- package/dist/graph/extractors/lwc.d.ts.map +1 -0
- package/dist/graph/extractors/lwc.js +170 -0
- package/dist/graph/extractors/lwc.js.map +1 -0
- package/dist/graph/extractors/named-credential.d.ts +9 -0
- package/dist/graph/extractors/named-credential.d.ts.map +1 -0
- package/dist/graph/extractors/named-credential.js +38 -0
- package/dist/graph/extractors/named-credential.js.map +1 -0
- package/dist/graph/extractors/object.d.ts +4 -0
- package/dist/graph/extractors/object.d.ts.map +1 -0
- package/dist/graph/extractors/object.js +16 -0
- package/dist/graph/extractors/object.js.map +1 -0
- package/dist/graph/extractors/permission-set-body.d.ts +3 -0
- package/dist/graph/extractors/permission-set-body.d.ts.map +1 -0
- package/dist/graph/extractors/permission-set-body.js +80 -0
- package/dist/graph/extractors/permission-set-body.js.map +1 -0
- package/dist/graph/extractors/permission-set.d.ts +4 -0
- package/dist/graph/extractors/permission-set.d.ts.map +1 -0
- package/dist/graph/extractors/permission-set.js +17 -0
- package/dist/graph/extractors/permission-set.js.map +1 -0
- package/dist/graph/extractors/profile.d.ts +4 -0
- package/dist/graph/extractors/profile.d.ts.map +1 -0
- package/dist/graph/extractors/profile.js +15 -0
- package/dist/graph/extractors/profile.js.map +1 -0
- package/dist/graph/extractors/record-type.d.ts +4 -0
- package/dist/graph/extractors/record-type.d.ts.map +1 -0
- package/dist/graph/extractors/record-type.js +19 -0
- package/dist/graph/extractors/record-type.js.map +1 -0
- package/dist/graph/extractors/remote-site-setting.d.ts +4 -0
- package/dist/graph/extractors/remote-site-setting.d.ts.map +1 -0
- package/dist/graph/extractors/remote-site-setting.js +15 -0
- package/dist/graph/extractors/remote-site-setting.js.map +1 -0
- package/dist/graph/extractors/sharing-rules.d.ts +8 -0
- package/dist/graph/extractors/sharing-rules.d.ts.map +1 -0
- package/dist/graph/extractors/sharing-rules.js +122 -0
- package/dist/graph/extractors/sharing-rules.js.map +1 -0
- package/dist/graph/extractors/types.d.ts +8 -0
- package/dist/graph/extractors/types.d.ts.map +1 -0
- package/dist/graph/extractors/types.js +2 -0
- package/dist/graph/extractors/types.js.map +1 -0
- package/dist/graph/extractors/validation-rule.d.ts +4 -0
- package/dist/graph/extractors/validation-rule.d.ts.map +1 -0
- package/dist/graph/extractors/validation-rule.js +19 -0
- package/dist/graph/extractors/validation-rule.js.map +1 -0
- package/dist/graph/extractors/visualforce-component.d.ts +4 -0
- package/dist/graph/extractors/visualforce-component.d.ts.map +1 -0
- package/dist/graph/extractors/visualforce-component.js +90 -0
- package/dist/graph/extractors/visualforce-component.js.map +1 -0
- package/dist/graph/extractors/visualforce-page.d.ts +4 -0
- package/dist/graph/extractors/visualforce-page.d.ts.map +1 -0
- package/dist/graph/extractors/visualforce-page.js +92 -0
- package/dist/graph/extractors/visualforce-page.js.map +1 -0
- package/dist/graph/index.d.ts +8 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +5 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/parse-xml.d.ts +5 -0
- package/dist/graph/parse-xml.d.ts.map +1 -0
- package/dist/graph/parse-xml.js +39 -0
- package/dist/graph/parse-xml.js.map +1 -0
- package/dist/graph/sqlite-reader.d.ts +33 -0
- package/dist/graph/sqlite-reader.d.ts.map +1 -0
- package/dist/graph/sqlite-reader.js +445 -0
- package/dist/graph/sqlite-reader.js.map +1 -0
- package/dist/graph/sqlite-store.d.ts +78 -0
- package/dist/graph/sqlite-store.d.ts.map +1 -0
- package/dist/graph/sqlite-store.js +683 -0
- package/dist/graph/sqlite-store.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/init/index.d.ts +4 -0
- package/dist/init/index.d.ts.map +1 -0
- package/dist/init/index.js +3 -0
- package/dist/init/index.js.map +1 -0
- package/dist/init/init.d.ts +9 -0
- package/dist/init/init.d.ts.map +1 -0
- package/dist/init/init.js +92 -0
- package/dist/init/init.js.map +1 -0
- package/dist/init/types.d.ts +37 -0
- package/dist/init/types.d.ts.map +1 -0
- package/dist/init/types.js +59 -0
- package/dist/init/types.js.map +1 -0
- package/dist/merge/index.d.ts +6 -0
- package/dist/merge/index.d.ts.map +1 -0
- package/dist/merge/index.js +5 -0
- package/dist/merge/index.js.map +1 -0
- package/dist/merge/markers.d.ts +8 -0
- package/dist/merge/markers.d.ts.map +1 -0
- package/dist/merge/markers.js +30 -0
- package/dist/merge/markers.js.map +1 -0
- package/dist/merge/merge.d.ts +12 -0
- package/dist/merge/merge.d.ts.map +1 -0
- package/dist/merge/merge.js +116 -0
- package/dist/merge/merge.js.map +1 -0
- package/dist/merge/parser.d.ts +5 -0
- package/dist/merge/parser.d.ts.map +1 -0
- package/dist/merge/parser.js +63 -0
- package/dist/merge/parser.js.map +1 -0
- package/dist/merge/validator.d.ts +15 -0
- package/dist/merge/validator.d.ts.map +1 -0
- package/dist/merge/validator.js +64 -0
- package/dist/merge/validator.js.map +1 -0
- package/dist/metrics/aggregate.d.ts +11 -0
- package/dist/metrics/aggregate.d.ts.map +1 -0
- package/dist/metrics/aggregate.js +51 -0
- package/dist/metrics/aggregate.js.map +1 -0
- package/dist/metrics/index.d.ts +7 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +4 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/store.d.ts +19 -0
- package/dist/metrics/store.d.ts.map +1 -0
- package/dist/metrics/store.js +69 -0
- package/dist/metrics/store.js.map +1 -0
- package/dist/metrics/types.d.ts +32 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +38 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/onboarding/context-map.d.ts +15 -0
- package/dist/onboarding/context-map.d.ts.map +1 -0
- package/dist/onboarding/context-map.js +138 -0
- package/dist/onboarding/context-map.js.map +1 -0
- package/dist/onboarding/faq.d.ts +24 -0
- package/dist/onboarding/faq.d.ts.map +1 -0
- package/dist/onboarding/faq.js +127 -0
- package/dist/onboarding/faq.js.map +1 -0
- package/dist/onboarding/index.d.ts +9 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +5 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/onboarding/state.d.ts +15 -0
- package/dist/onboarding/state.d.ts.map +1 -0
- package/dist/onboarding/state.js +92 -0
- package/dist/onboarding/state.js.map +1 -0
- package/dist/onboarding/types.d.ts +38 -0
- package/dist/onboarding/types.d.ts.map +1 -0
- package/dist/onboarding/types.js +13 -0
- package/dist/onboarding/types.js.map +1 -0
- package/dist/release/extract-manual-steps.d.ts +16 -0
- package/dist/release/extract-manual-steps.d.ts.map +1 -0
- package/dist/release/extract-manual-steps.js +164 -0
- package/dist/release/extract-manual-steps.js.map +1 -0
- package/dist/release/index.d.ts +4 -0
- package/dist/release/index.d.ts.map +1 -0
- package/dist/release/index.js +3 -0
- package/dist/release/index.js.map +1 -0
- package/dist/release/schema.json +142 -0
- package/dist/release/types.d.ts +39 -0
- package/dist/release/types.d.ts.map +1 -0
- package/dist/release/types.js +4 -0
- package/dist/release/types.js.map +1 -0
- package/dist/release/validate.d.ts +8 -0
- package/dist/release/validate.d.ts.map +1 -0
- package/dist/release/validate.js +35 -0
- package/dist/release/validate.js.map +1 -0
- package/dist/render/approval-mermaid.d.ts +3 -0
- package/dist/render/approval-mermaid.d.ts.map +1 -0
- package/dist/render/approval-mermaid.js +69 -0
- package/dist/render/approval-mermaid.js.map +1 -0
- package/dist/render/archive.d.ts +2 -0
- package/dist/render/archive.d.ts.map +1 -0
- package/dist/render/archive.js +32 -0
- package/dist/render/archive.js.map +1 -0
- package/dist/render/concerns.d.ts +11 -0
- package/dist/render/concerns.d.ts.map +1 -0
- package/dist/render/concerns.js +83 -0
- package/dist/render/concerns.js.map +1 -0
- package/dist/render/er-diagram.d.ts +3 -0
- package/dist/render/er-diagram.d.ts.map +1 -0
- package/dist/render/er-diagram.js +79 -0
- package/dist/render/er-diagram.js.map +1 -0
- package/dist/render/eta-engine.d.ts +2 -0
- package/dist/render/eta-engine.d.ts.map +1 -0
- package/dist/render/eta-engine.js +39 -0
- package/dist/render/eta-engine.js.map +1 -0
- package/dist/render/flow-flowchart.d.ts +4 -0
- package/dist/render/flow-flowchart.d.ts.map +1 -0
- package/dist/render/flow-flowchart.js +59 -0
- package/dist/render/flow-flowchart.js.map +1 -0
- package/dist/render/flow-sequence-table.d.ts +11 -0
- package/dist/render/flow-sequence-table.d.ts.map +1 -0
- package/dist/render/flow-sequence-table.js +88 -0
- package/dist/render/flow-sequence-table.js.map +1 -0
- package/dist/render/formula.d.ts +33 -0
- package/dist/render/formula.d.ts.map +1 -0
- package/dist/render/formula.js +381 -0
- package/dist/render/formula.js.map +1 -0
- package/dist/render/index.d.ts +6 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +5 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/intra-class-call-graph.d.ts +3 -0
- package/dist/render/intra-class-call-graph.d.ts.map +1 -0
- package/dist/render/intra-class-call-graph.js +32 -0
- package/dist/render/intra-class-call-graph.js.map +1 -0
- package/dist/render/mermaid.d.ts +6 -0
- package/dist/render/mermaid.d.ts.map +1 -0
- package/dist/render/mermaid.js +99 -0
- package/dist/render/mermaid.js.map +1 -0
- package/dist/render/method-flowchart.d.ts +15 -0
- package/dist/render/method-flowchart.d.ts.map +1 -0
- package/dist/render/method-flowchart.js +232 -0
- package/dist/render/method-flowchart.js.map +1 -0
- package/dist/render/method-summary-table.d.ts +17 -0
- package/dist/render/method-summary-table.d.ts.map +1 -0
- package/dist/render/method-summary-table.js +189 -0
- package/dist/render/method-summary-table.js.map +1 -0
- package/dist/render/render.d.ts +37 -0
- package/dist/render/render.d.ts.map +1 -0
- package/dist/render/render.js +491 -0
- package/dist/render/render.js.map +1 -0
- package/dist/render/summary.d.ts +21 -0
- package/dist/render/summary.d.ts.map +1 -0
- package/dist/render/summary.js +542 -0
- package/dist/render/summary.js.map +1 -0
- package/dist/render/templates/apex-class.eta +204 -0
- package/dist/render/templates/apex-trigger.eta +143 -0
- package/dist/render/templates/approval-process.eta +118 -0
- package/dist/render/templates/aura-bundle.eta +47 -0
- package/dist/render/templates/custom-application.eta +44 -0
- package/dist/render/templates/custom-metadata-record.eta +37 -0
- package/dist/render/templates/executive-risks.eta +56 -0
- package/dist/render/templates/executive-summary.eta +68 -0
- package/dist/render/templates/flexi-page.eta +47 -0
- package/dist/render/templates/flow.eta +166 -0
- package/dist/render/templates/layout.eta +68 -0
- package/dist/render/templates/lwc.eta +118 -0
- package/dist/render/templates/named-credential.eta +30 -0
- package/dist/render/templates/object.eta +68 -0
- package/dist/render/templates/permission-set.eta +80 -0
- package/dist/render/templates/profile.eta +78 -0
- package/dist/render/templates/record-type.eta +23 -0
- package/dist/render/templates/remote-site-setting.eta +23 -0
- package/dist/render/templates/sharing-rule.eta +50 -0
- package/dist/render/templates/system-index.eta +52 -0
- package/dist/render/templates/system-overview.eta +37 -0
- package/dist/render/templates/validation-rule.eta +55 -0
- package/dist/render/templates/visualforce-component.eta +52 -0
- package/dist/render/templates/visualforce-page.eta +76 -0
- package/dist/render/trigger-processing-summary.d.ts +12 -0
- package/dist/render/trigger-processing-summary.d.ts.map +1 -0
- package/dist/render/trigger-processing-summary.js +94 -0
- package/dist/render/trigger-processing-summary.js.map +1 -0
- package/dist/sarif/index.d.ts +3 -0
- package/dist/sarif/index.d.ts.map +1 -0
- package/dist/sarif/index.js +2 -0
- package/dist/sarif/index.js.map +1 -0
- package/dist/sarif/parse.d.ts +7 -0
- package/dist/sarif/parse.d.ts.map +1 -0
- package/dist/sarif/parse.js +55 -0
- package/dist/sarif/parse.js.map +1 -0
- package/dist/sarif/types.d.ts +43 -0
- package/dist/sarif/types.d.ts.map +1 -0
- package/dist/sarif/types.js +4 -0
- package/dist/sarif/types.js.map +1 -0
- package/dist/scaffold/.agents/README.md +12 -0
- package/dist/scaffold/.agents/knowledge/INDEX.md +52 -0
- package/dist/scaffold/.agents/knowledge/README.md +29 -0
- package/dist/scaffold/.agents/knowledge/decisions/.gitkeep +0 -0
- package/dist/scaffold/.agents/knowledge/improvements/.gitkeep +0 -0
- package/dist/scaffold/.agents/knowledge/pitfalls/.gitkeep +0 -0
- package/dist/scaffold/.agents/knowledge/retrospectives/.gitkeep +0 -0
- package/dist/scaffold/.agents/knowledge/wins/.gitkeep +0 -0
- package/dist/scaffold/.agents/templates/.gitkeep +0 -0
- package/dist/scaffold/.agents/templates/README.md +19 -0
- package/dist/scaffold/.agents/templates/decision.md +39 -0
- package/dist/scaffold/.agents/templates/improvement.md +33 -0
- package/dist/scaffold/.agents/templates/pitfall.md +33 -0
- package/dist/scaffold/.agents/templates/retrospective.md +61 -0
- package/dist/scaffold/.agents/templates/win.md +28 -0
- package/dist/scaffold/.claude/README.md +11 -0
- package/dist/scaffold/.claude/agents/.gitkeep +0 -0
- package/dist/scaffold/.claude/agents/apex-query-tracer.md.eta +199 -0
- package/dist/scaffold/.claude/agents/automation-classifier.md.eta +39 -0
- package/dist/scaffold/.claude/agents/batch-calculator.md.eta +209 -0
- package/dist/scaffold/.claude/agents/cascade-tracer.md.eta +139 -0
- package/dist/scaffold/.claude/agents/customer-impact-explainer.md.eta +96 -0
- package/dist/scaffold/.claude/agents/data-model-classifier.md.eta +84 -0
- package/dist/scaffold/.claude/agents/explain-writer.md.eta +104 -0
- package/dist/scaffold/.claude/agents/flow-query-tracer.md.eta +211 -0
- package/dist/scaffold/.claude/agents/graph-querier.md.eta +47 -0
- package/dist/scaffold/.claude/agents/logic-classifier.md.eta +36 -0
- package/dist/scaffold/.claude/agents/manual-step-extractor.md.eta +72 -0
- package/dist/scaffold/.claude/agents/object-documenter.md.eta +66 -0
- package/dist/scaffold/.claude/agents/onboarding-guide.md.eta +77 -0
- package/dist/scaffold/.claude/agents/permission-classifier.md.eta +32 -0
- package/dist/scaffold/.claude/agents/release-advisor.md.eta +96 -0
- package/dist/scaffold/.claude/agents/release-composer.md.eta +106 -0
- package/dist/scaffold/.claude/agents/review-assistant.md.eta +72 -0
- package/dist/scaffold/.claude/agents/rollback-drafter.md.eta +95 -0
- package/dist/scaffold/.claude/agents/ui-classifier.md.eta +31 -0
- package/dist/scaffold/.claude/commands/.gitkeep +0 -0
- package/dist/scaffold/.claude/commands/analyze-batch-limits.md.eta +309 -0
- package/dist/scaffold/.claude/commands/change-summary.md.eta +79 -0
- package/dist/scaffold/.claude/commands/classify-diff.md.eta +107 -0
- package/dist/scaffold/.claude/commands/explain.md.eta +63 -0
- package/dist/scaffold/.claude/commands/impact.md.eta +67 -0
- package/dist/scaffold/.claude/commands/manual-steps.md.eta +62 -0
- package/dist/scaffold/.claude/commands/onboard.md.eta +107 -0
- package/dist/scaffold/.claude/commands/release-prep.md.eta +147 -0
- package/dist/scaffold/.claude/commands/yohaku-explain.md.eta +81 -0
- package/dist/scaffold/.claude/settings.json.eta +59 -0
- package/dist/scaffold/.yohaku/context-map.yaml.eta +56 -0
- package/dist/scaffold/.yohaku/secrets-rules.yaml.eta +44 -0
- package/dist/scaffold/AGENTS.md.eta +147 -0
- package/dist/scaffold/CLAUDE.md.eta +121 -0
- package/dist/scaffold/README.md +37 -0
- package/dist/schema/graph.schema.json +446 -0
- package/dist/schema/validate.d.ts +8 -0
- package/dist/schema/validate.d.ts.map +1 -0
- package/dist/schema/validate.js +49 -0
- package/dist/schema/validate.js.map +1 -0
- package/dist/secrets/apply.d.ts +17 -0
- package/dist/secrets/apply.d.ts.map +1 -0
- package/dist/secrets/apply.js +44 -0
- package/dist/secrets/apply.js.map +1 -0
- package/dist/secrets/index.d.ts +7 -0
- package/dist/secrets/index.d.ts.map +1 -0
- package/dist/secrets/index.js +4 -0
- package/dist/secrets/index.js.map +1 -0
- package/dist/secrets/load.d.ts +16 -0
- package/dist/secrets/load.d.ts.map +1 -0
- package/dist/secrets/load.js +136 -0
- package/dist/secrets/load.js.map +1 -0
- package/dist/secrets/mask.d.ts +15 -0
- package/dist/secrets/mask.d.ts.map +1 -0
- package/dist/secrets/mask.js +34 -0
- package/dist/secrets/mask.js.map +1 -0
- package/dist/secrets/rules.d.ts +10 -0
- package/dist/secrets/rules.d.ts.map +1 -0
- package/dist/secrets/rules.js +47 -0
- package/dist/secrets/rules.js.map +1 -0
- package/dist/types/graph.d.ts +508 -0
- package/dist/types/graph.d.ts.map +1 -0
- package/dist/types/graph.js +9 -0
- package/dist/types/graph.js.map +1 -0
- package/dist/types/render.d.ts +26 -0
- package/dist/types/render.d.ts.map +1 -0
- package/dist/types/render.js +10 -0
- package/dist/types/render.js.map +1 -0
- package/dist/types/source-adapter.d.ts +26 -0
- package/dist/types/source-adapter.d.ts.map +1 -0
- package/dist/types/source-adapter.js +11 -0
- package/dist/types/source-adapter.js.map +1 -0
- package/dist/util/build-lock.d.ts +35 -0
- package/dist/util/build-lock.d.ts.map +1 -0
- package/dist/util/build-lock.js +72 -0
- package/dist/util/build-lock.js.map +1 -0
- package/dist/util/hash.d.ts +3 -0
- package/dist/util/hash.d.ts.map +1 -0
- package/dist/util/hash.js +13 -0
- package/dist/util/hash.js.map +1 -0
- package/dist/util/path-guard.d.ts +16 -0
- package/dist/util/path-guard.d.ts.map +1 -0
- package/dist/util/path-guard.js +40 -0
- package/dist/util/path-guard.js.map +1 -0
- package/dist/util/timing-log.d.ts +28 -0
- package/dist/util/timing-log.d.ts.map +1 -0
- package/dist/util/timing-log.js +38 -0
- package/dist/util/timing-log.js.map +1 -0
- package/dist/util/walk.d.ts +10 -0
- package/dist/util/walk.d.ts.map +1 -0
- package/dist/util/walk.js +45 -0
- package/dist/util/walk.js.map +1 -0
- package/package.json +48 -0
- package/src/schema/graph.schema.json +446 -0
- package/src/schema/validate.ts +57 -0
|
@@ -0,0 +1,683 @@
|
|
|
1
|
+
import { mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import Database from "better-sqlite3";
|
|
4
|
+
const SCHEMA_DDL = `
|
|
5
|
+
CREATE TABLE IF NOT EXISTS meta (
|
|
6
|
+
key TEXT PRIMARY KEY,
|
|
7
|
+
value TEXT NOT NULL
|
|
8
|
+
);
|
|
9
|
+
CREATE TABLE IF NOT EXISTS objects (
|
|
10
|
+
fqn TEXT PRIMARY KEY,
|
|
11
|
+
label TEXT NOT NULL,
|
|
12
|
+
plural_label TEXT,
|
|
13
|
+
description TEXT,
|
|
14
|
+
is_custom INTEGER NOT NULL,
|
|
15
|
+
sharing_model TEXT,
|
|
16
|
+
source_path TEXT NOT NULL,
|
|
17
|
+
content_hash TEXT NOT NULL
|
|
18
|
+
);
|
|
19
|
+
CREATE TABLE IF NOT EXISTS fields (
|
|
20
|
+
fqn TEXT PRIMARY KEY,
|
|
21
|
+
object TEXT NOT NULL,
|
|
22
|
+
label TEXT,
|
|
23
|
+
description TEXT,
|
|
24
|
+
type TEXT NOT NULL,
|
|
25
|
+
required INTEGER,
|
|
26
|
+
is_unique INTEGER,
|
|
27
|
+
is_custom INTEGER NOT NULL,
|
|
28
|
+
reference_to_json TEXT,
|
|
29
|
+
picklist_values_json TEXT,
|
|
30
|
+
source_path TEXT NOT NULL,
|
|
31
|
+
content_hash TEXT NOT NULL,
|
|
32
|
+
FOREIGN KEY (object) REFERENCES objects(fqn) ON DELETE CASCADE
|
|
33
|
+
);
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_fields_object ON fields(object);
|
|
35
|
+
|
|
36
|
+
CREATE TABLE IF NOT EXISTS validation_rules (
|
|
37
|
+
fqn TEXT PRIMARY KEY,
|
|
38
|
+
object TEXT NOT NULL,
|
|
39
|
+
active INTEGER NOT NULL,
|
|
40
|
+
error_condition_formula TEXT,
|
|
41
|
+
error_message TEXT,
|
|
42
|
+
error_display_field TEXT,
|
|
43
|
+
source_path TEXT NOT NULL,
|
|
44
|
+
content_hash TEXT NOT NULL
|
|
45
|
+
);
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_vr_object ON validation_rules(object);
|
|
47
|
+
|
|
48
|
+
CREATE TABLE IF NOT EXISTS flows (
|
|
49
|
+
fqn TEXT PRIMARY KEY,
|
|
50
|
+
label TEXT,
|
|
51
|
+
description TEXT,
|
|
52
|
+
type TEXT NOT NULL,
|
|
53
|
+
status TEXT NOT NULL,
|
|
54
|
+
triggering_object TEXT,
|
|
55
|
+
source_path TEXT NOT NULL,
|
|
56
|
+
content_hash TEXT NOT NULL,
|
|
57
|
+
body_json TEXT
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
CREATE TABLE IF NOT EXISTS apex_classes (
|
|
61
|
+
fqn TEXT PRIMARY KEY,
|
|
62
|
+
api_version TEXT NOT NULL,
|
|
63
|
+
is_test INTEGER NOT NULL,
|
|
64
|
+
is_interface INTEGER,
|
|
65
|
+
is_abstract INTEGER,
|
|
66
|
+
lines_of_code INTEGER,
|
|
67
|
+
source_path TEXT NOT NULL,
|
|
68
|
+
content_hash TEXT NOT NULL,
|
|
69
|
+
body_json TEXT
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
CREATE TABLE IF NOT EXISTS apex_triggers (
|
|
73
|
+
fqn TEXT PRIMARY KEY,
|
|
74
|
+
object TEXT NOT NULL,
|
|
75
|
+
events_json TEXT NOT NULL,
|
|
76
|
+
api_version TEXT NOT NULL,
|
|
77
|
+
source_path TEXT NOT NULL,
|
|
78
|
+
content_hash TEXT NOT NULL,
|
|
79
|
+
body_json TEXT
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
CREATE TABLE IF NOT EXISTS permission_sets (
|
|
83
|
+
fqn TEXT PRIMARY KEY,
|
|
84
|
+
label TEXT NOT NULL,
|
|
85
|
+
description TEXT,
|
|
86
|
+
license TEXT,
|
|
87
|
+
source_path TEXT NOT NULL,
|
|
88
|
+
content_hash TEXT NOT NULL,
|
|
89
|
+
body_json TEXT
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
CREATE TABLE IF NOT EXISTS profiles (
|
|
93
|
+
fqn TEXT PRIMARY KEY,
|
|
94
|
+
user_license TEXT,
|
|
95
|
+
source_path TEXT NOT NULL,
|
|
96
|
+
content_hash TEXT NOT NULL,
|
|
97
|
+
body_json TEXT
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
CREATE TABLE IF NOT EXISTS record_types (
|
|
101
|
+
fqn TEXT PRIMARY KEY,
|
|
102
|
+
object TEXT NOT NULL,
|
|
103
|
+
label TEXT,
|
|
104
|
+
description TEXT,
|
|
105
|
+
active INTEGER NOT NULL,
|
|
106
|
+
source_path TEXT NOT NULL,
|
|
107
|
+
content_hash TEXT NOT NULL,
|
|
108
|
+
FOREIGN KEY (object) REFERENCES objects(fqn) ON DELETE CASCADE
|
|
109
|
+
);
|
|
110
|
+
CREATE INDEX IF NOT EXISTS idx_rt_object ON record_types(object);
|
|
111
|
+
|
|
112
|
+
CREATE TABLE IF NOT EXISTS approval_processes (
|
|
113
|
+
fqn TEXT PRIMARY KEY,
|
|
114
|
+
object TEXT NOT NULL,
|
|
115
|
+
label TEXT,
|
|
116
|
+
description TEXT,
|
|
117
|
+
active INTEGER NOT NULL,
|
|
118
|
+
body_json TEXT NOT NULL,
|
|
119
|
+
source_path TEXT NOT NULL,
|
|
120
|
+
content_hash TEXT NOT NULL,
|
|
121
|
+
FOREIGN KEY (object) REFERENCES objects(fqn) ON DELETE CASCADE
|
|
122
|
+
);
|
|
123
|
+
CREATE INDEX IF NOT EXISTS idx_ap_object ON approval_processes(object);
|
|
124
|
+
|
|
125
|
+
CREATE TABLE IF NOT EXISTS sharing_rules (
|
|
126
|
+
fqn TEXT PRIMARY KEY,
|
|
127
|
+
object TEXT NOT NULL,
|
|
128
|
+
kind TEXT NOT NULL,
|
|
129
|
+
label TEXT,
|
|
130
|
+
description TEXT,
|
|
131
|
+
access_level TEXT NOT NULL,
|
|
132
|
+
body_json TEXT NOT NULL,
|
|
133
|
+
source_path TEXT NOT NULL,
|
|
134
|
+
content_hash TEXT NOT NULL,
|
|
135
|
+
FOREIGN KEY (object) REFERENCES objects(fqn) ON DELETE CASCADE
|
|
136
|
+
);
|
|
137
|
+
CREATE INDEX IF NOT EXISTS idx_sr_object ON sharing_rules(object);
|
|
138
|
+
|
|
139
|
+
CREATE TABLE IF NOT EXISTS layouts (
|
|
140
|
+
fqn TEXT PRIMARY KEY,
|
|
141
|
+
object TEXT NOT NULL,
|
|
142
|
+
layout_name TEXT NOT NULL,
|
|
143
|
+
body_json TEXT NOT NULL,
|
|
144
|
+
source_path TEXT NOT NULL,
|
|
145
|
+
content_hash TEXT NOT NULL,
|
|
146
|
+
FOREIGN KEY (object) REFERENCES objects(fqn) ON DELETE CASCADE
|
|
147
|
+
);
|
|
148
|
+
CREATE INDEX IF NOT EXISTS idx_layout_object ON layouts(object);
|
|
149
|
+
|
|
150
|
+
CREATE TABLE IF NOT EXISTS custom_metadata_records (
|
|
151
|
+
fqn TEXT PRIMARY KEY,
|
|
152
|
+
type TEXT NOT NULL,
|
|
153
|
+
record_name TEXT NOT NULL,
|
|
154
|
+
label TEXT,
|
|
155
|
+
is_protected INTEGER,
|
|
156
|
+
body_json TEXT NOT NULL,
|
|
157
|
+
source_path TEXT NOT NULL,
|
|
158
|
+
content_hash TEXT NOT NULL
|
|
159
|
+
);
|
|
160
|
+
CREATE INDEX IF NOT EXISTS idx_cmr_type ON custom_metadata_records(type);
|
|
161
|
+
|
|
162
|
+
CREATE TABLE IF NOT EXISTS named_credentials (
|
|
163
|
+
fqn TEXT PRIMARY KEY,
|
|
164
|
+
label TEXT,
|
|
165
|
+
endpoint TEXT,
|
|
166
|
+
principal_type TEXT,
|
|
167
|
+
protocol TEXT,
|
|
168
|
+
has_secret INTEGER NOT NULL,
|
|
169
|
+
source_path TEXT NOT NULL,
|
|
170
|
+
content_hash TEXT NOT NULL
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
CREATE TABLE IF NOT EXISTS remote_site_settings (
|
|
174
|
+
fqn TEXT PRIMARY KEY,
|
|
175
|
+
url TEXT,
|
|
176
|
+
description TEXT,
|
|
177
|
+
active INTEGER NOT NULL,
|
|
178
|
+
disable_protocol_security INTEGER NOT NULL,
|
|
179
|
+
source_path TEXT NOT NULL,
|
|
180
|
+
content_hash TEXT NOT NULL
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
CREATE TABLE IF NOT EXISTS lwcs (
|
|
184
|
+
fqn TEXT PRIMARY KEY,
|
|
185
|
+
api_version TEXT,
|
|
186
|
+
master_label TEXT,
|
|
187
|
+
description TEXT,
|
|
188
|
+
is_exposed INTEGER NOT NULL,
|
|
189
|
+
body_json TEXT NOT NULL,
|
|
190
|
+
source_path TEXT NOT NULL,
|
|
191
|
+
content_hash TEXT NOT NULL
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
CREATE TABLE IF NOT EXISTS aura_bundles (
|
|
195
|
+
fqn TEXT PRIMARY KEY,
|
|
196
|
+
bundle_kind TEXT NOT NULL,
|
|
197
|
+
api_version TEXT,
|
|
198
|
+
description TEXT,
|
|
199
|
+
body_json TEXT NOT NULL,
|
|
200
|
+
source_path TEXT NOT NULL,
|
|
201
|
+
content_hash TEXT NOT NULL
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
CREATE TABLE IF NOT EXISTS flexi_pages (
|
|
205
|
+
fqn TEXT PRIMARY KEY,
|
|
206
|
+
type TEXT,
|
|
207
|
+
sobject_type TEXT,
|
|
208
|
+
page_template TEXT,
|
|
209
|
+
master_label TEXT,
|
|
210
|
+
description TEXT,
|
|
211
|
+
body_json TEXT NOT NULL,
|
|
212
|
+
source_path TEXT NOT NULL,
|
|
213
|
+
content_hash TEXT NOT NULL
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
CREATE TABLE IF NOT EXISTS visualforce_pages (
|
|
217
|
+
fqn TEXT PRIMARY KEY,
|
|
218
|
+
api_version TEXT,
|
|
219
|
+
label TEXT,
|
|
220
|
+
description TEXT,
|
|
221
|
+
controller TEXT,
|
|
222
|
+
standard_controller TEXT,
|
|
223
|
+
render_as TEXT,
|
|
224
|
+
body_json TEXT NOT NULL,
|
|
225
|
+
source_path TEXT NOT NULL,
|
|
226
|
+
content_hash TEXT NOT NULL
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
CREATE TABLE IF NOT EXISTS visualforce_components (
|
|
230
|
+
fqn TEXT PRIMARY KEY,
|
|
231
|
+
api_version TEXT,
|
|
232
|
+
label TEXT,
|
|
233
|
+
description TEXT,
|
|
234
|
+
controller TEXT,
|
|
235
|
+
body_json TEXT NOT NULL,
|
|
236
|
+
source_path TEXT NOT NULL,
|
|
237
|
+
content_hash TEXT NOT NULL
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
CREATE TABLE IF NOT EXISTS custom_applications (
|
|
241
|
+
fqn TEXT PRIMARY KEY,
|
|
242
|
+
label TEXT,
|
|
243
|
+
description TEXT,
|
|
244
|
+
nav_type TEXT,
|
|
245
|
+
body_json TEXT NOT NULL,
|
|
246
|
+
source_path TEXT NOT NULL,
|
|
247
|
+
content_hash TEXT NOT NULL
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
CREATE TABLE IF NOT EXISTS dependencies (
|
|
251
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
252
|
+
from_kind TEXT NOT NULL,
|
|
253
|
+
from_fqn TEXT NOT NULL,
|
|
254
|
+
to_kind TEXT NOT NULL,
|
|
255
|
+
to_fqn TEXT NOT NULL,
|
|
256
|
+
kind TEXT NOT NULL,
|
|
257
|
+
evidence_path TEXT
|
|
258
|
+
);
|
|
259
|
+
CREATE INDEX IF NOT EXISTS idx_deps_from ON dependencies(from_kind, from_fqn);
|
|
260
|
+
CREATE INDEX IF NOT EXISTS idx_deps_to ON dependencies(to_kind, to_fqn);
|
|
261
|
+
|
|
262
|
+
CREATE TABLE IF NOT EXISTS tags (
|
|
263
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
264
|
+
entity_kind TEXT NOT NULL,
|
|
265
|
+
entity_fqn TEXT NOT NULL,
|
|
266
|
+
namespace TEXT NOT NULL,
|
|
267
|
+
value TEXT NOT NULL
|
|
268
|
+
);
|
|
269
|
+
`;
|
|
270
|
+
const TRUNCATE_DDL = `
|
|
271
|
+
DELETE FROM dependencies;
|
|
272
|
+
DELETE FROM tags;
|
|
273
|
+
DELETE FROM custom_applications;
|
|
274
|
+
DELETE FROM visualforce_components;
|
|
275
|
+
DELETE FROM visualforce_pages;
|
|
276
|
+
DELETE FROM flexi_pages;
|
|
277
|
+
DELETE FROM aura_bundles;
|
|
278
|
+
DELETE FROM lwcs;
|
|
279
|
+
DELETE FROM remote_site_settings;
|
|
280
|
+
DELETE FROM named_credentials;
|
|
281
|
+
DELETE FROM custom_metadata_records;
|
|
282
|
+
DELETE FROM layouts;
|
|
283
|
+
DELETE FROM sharing_rules;
|
|
284
|
+
DELETE FROM approval_processes;
|
|
285
|
+
DELETE FROM record_types;
|
|
286
|
+
DELETE FROM fields;
|
|
287
|
+
DELETE FROM validation_rules;
|
|
288
|
+
DELETE FROM apex_triggers;
|
|
289
|
+
DELETE FROM apex_classes;
|
|
290
|
+
DELETE FROM flows;
|
|
291
|
+
DELETE FROM permission_sets;
|
|
292
|
+
DELETE FROM profiles;
|
|
293
|
+
DELETE FROM objects;
|
|
294
|
+
DELETE FROM meta;
|
|
295
|
+
`;
|
|
296
|
+
const ALLOWED_TABLES_FOR_MIGRATE = new Set([
|
|
297
|
+
"flows",
|
|
298
|
+
"apex_classes",
|
|
299
|
+
"apex_triggers",
|
|
300
|
+
"permission_sets",
|
|
301
|
+
"profiles",
|
|
302
|
+
]);
|
|
303
|
+
const SAFE_IDENTIFIER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
304
|
+
function assertSafeIdentifier(name, kind) {
|
|
305
|
+
if (!SAFE_IDENTIFIER_PATTERN.test(name)) {
|
|
306
|
+
throw new Error(`Unsafe ${kind} identifier rejected: ${name}`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
function addColumnIfMissing(db, table, column, type) {
|
|
310
|
+
// 防御的バリデーション (現在の呼び出しはハードコード文字列だが、将来の事故を防ぐため)
|
|
311
|
+
if (!ALLOWED_TABLES_FOR_MIGRATE.has(table)) {
|
|
312
|
+
throw new Error(`Table not allowed for migrate: ${table}`);
|
|
313
|
+
}
|
|
314
|
+
assertSafeIdentifier(table, "table");
|
|
315
|
+
assertSafeIdentifier(column, "column");
|
|
316
|
+
// type は SQLite の型 (TEXT/INTEGER/REAL/BLOB) のみ許可
|
|
317
|
+
const upperType = type.trim().toUpperCase();
|
|
318
|
+
if (!["TEXT", "INTEGER", "REAL", "BLOB", "NUMERIC"].includes(upperType)) {
|
|
319
|
+
throw new Error(`Unsafe column type rejected: ${type}`);
|
|
320
|
+
}
|
|
321
|
+
const rows = db.prepare(`PRAGMA table_info(${table})`).all();
|
|
322
|
+
if (rows.some((r) => r.name === column))
|
|
323
|
+
return;
|
|
324
|
+
db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${upperType}`);
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* 外部入力 (CLI 引数, AI 経由) の SQL を実行する前に、
|
|
328
|
+
* SELECT / WITH (CTE) 以外の構文を拒否する。
|
|
329
|
+
* better-sqlite3 の `readonly: true` と併せた多層防御。
|
|
330
|
+
*/
|
|
331
|
+
export function isSafeReadOnlyQuery(sql) {
|
|
332
|
+
// コメントを除去 (-- 行末コメント / / * ... * / ブロックコメント)
|
|
333
|
+
const stripped = sql
|
|
334
|
+
.replace(/--.*$/gm, "")
|
|
335
|
+
.replace(/\/\*[\s\S]*?\*\//g, "")
|
|
336
|
+
.trim();
|
|
337
|
+
if (stripped.length === 0)
|
|
338
|
+
return false;
|
|
339
|
+
// 末尾以外のセミコロンを禁止 (multi-statement の防止)
|
|
340
|
+
const semiIndex = stripped.indexOf(";");
|
|
341
|
+
if (semiIndex !== -1 && semiIndex !== stripped.length - 1)
|
|
342
|
+
return false;
|
|
343
|
+
const body = semiIndex === stripped.length - 1 ? stripped.slice(0, -1).trim() : stripped;
|
|
344
|
+
// 先頭トークンが SELECT または WITH のみ許可
|
|
345
|
+
const firstToken = body.split(/\s+/)[0]?.toLowerCase() ?? "";
|
|
346
|
+
if (firstToken !== "select" && firstToken !== "with")
|
|
347
|
+
return false;
|
|
348
|
+
// 危険キーワードを単語境界で検出
|
|
349
|
+
const dangerous = /\b(attach|detach|insert|update|delete|drop|alter|create|replace|pragma|vacuum|reindex|savepoint|begin|commit|rollback)\b/i;
|
|
350
|
+
if (dangerous.test(body))
|
|
351
|
+
return false;
|
|
352
|
+
return true;
|
|
353
|
+
}
|
|
354
|
+
export class SqliteGraphStore {
|
|
355
|
+
#db;
|
|
356
|
+
#readonly;
|
|
357
|
+
constructor(options) {
|
|
358
|
+
this.#readonly = options.readonly === true;
|
|
359
|
+
if (!this.#readonly) {
|
|
360
|
+
mkdirSync(dirname(options.dbPath), { recursive: true });
|
|
361
|
+
}
|
|
362
|
+
this.#db = new Database(options.dbPath, this.#readonly ? { readonly: true } : {});
|
|
363
|
+
this.#db.pragma("foreign_keys = ON");
|
|
364
|
+
if (!this.#readonly) {
|
|
365
|
+
this.#db.pragma("journal_mode = WAL");
|
|
366
|
+
this.#db.exec(SCHEMA_DDL);
|
|
367
|
+
this.#migrate();
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
#migrate() {
|
|
371
|
+
addColumnIfMissing(this.#db, "flows", "body_json", "TEXT");
|
|
372
|
+
addColumnIfMissing(this.#db, "apex_classes", "body_json", "TEXT");
|
|
373
|
+
addColumnIfMissing(this.#db, "apex_triggers", "body_json", "TEXT");
|
|
374
|
+
addColumnIfMissing(this.#db, "permission_sets", "body_json", "TEXT");
|
|
375
|
+
addColumnIfMissing(this.#db, "profiles", "body_json", "TEXT");
|
|
376
|
+
}
|
|
377
|
+
close() {
|
|
378
|
+
this.#db.close();
|
|
379
|
+
}
|
|
380
|
+
query(sql, params = []) {
|
|
381
|
+
return this.#db.prepare(sql).all(...params);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* 外部入力由来の SQL を実行する。SELECT / WITH のみ許可、危険キーワードを拒否。
|
|
385
|
+
* `readonly: true` で開いた接続でのみ呼び出すことを推奨 (二重防御)。
|
|
386
|
+
*/
|
|
387
|
+
queryUntrusted(sql, params = []) {
|
|
388
|
+
if (!isSafeReadOnlyQuery(sql)) {
|
|
389
|
+
throw new Error("[sqlite-store] Untrusted query rejected: only single SELECT / WITH statements are allowed (no ATTACH, INSERT, UPDATE, DELETE, DROP, PRAGMA, multi-statements, etc.).");
|
|
390
|
+
}
|
|
391
|
+
return this.#db.prepare(sql).all(...params);
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* `.yohaku/graph.sqlite` の実テーブル定義を返す。
|
|
395
|
+
* `yohaku graph query` 経由では `PRAGMA` が拒否されるため、
|
|
396
|
+
* AI / 外部ツールがスキーマ確認に使える安全な経路を提供する。
|
|
397
|
+
*
|
|
398
|
+
* @param tableName 単一テーブルに絞る場合に指定 (sqlite_* システムテーブルは除外)
|
|
399
|
+
*/
|
|
400
|
+
getTableSchemas(tableName) {
|
|
401
|
+
const tableRows = this.#db
|
|
402
|
+
.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name")
|
|
403
|
+
.all();
|
|
404
|
+
const targets = tableName ? tableRows.filter((r) => r.name === tableName) : tableRows;
|
|
405
|
+
if (tableName && targets.length === 0) {
|
|
406
|
+
const available = tableRows.map((r) => r.name).join(", ");
|
|
407
|
+
throw new Error(`[sqlite-store] No such table: ${tableName}. Available tables: ${available}`);
|
|
408
|
+
}
|
|
409
|
+
return targets.map((t) => {
|
|
410
|
+
assertSafeIdentifier(t.name, "table");
|
|
411
|
+
const cols = this.#db.prepare(`PRAGMA table_info(${t.name})`).all();
|
|
412
|
+
return {
|
|
413
|
+
table: t.name,
|
|
414
|
+
columns: cols.map((c) => ({
|
|
415
|
+
name: c.name,
|
|
416
|
+
type: c.type,
|
|
417
|
+
notNull: c.notnull === 1,
|
|
418
|
+
defaultValue: c.dflt_value,
|
|
419
|
+
primaryKey: c.pk > 0,
|
|
420
|
+
})),
|
|
421
|
+
};
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* 全テーブルの全カラム名をフラットに返す。エラー時のサジェスト用。
|
|
426
|
+
*/
|
|
427
|
+
getAllColumnNames() {
|
|
428
|
+
const schemas = this.getTableSchemas();
|
|
429
|
+
const set = new Set();
|
|
430
|
+
for (const s of schemas) {
|
|
431
|
+
for (const c of s.columns)
|
|
432
|
+
set.add(c.name);
|
|
433
|
+
}
|
|
434
|
+
return Array.from(set).sort();
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* テーブル名一覧を返す。エラー時のサジェスト用。
|
|
438
|
+
*/
|
|
439
|
+
getAllTableNames() {
|
|
440
|
+
return this.#db
|
|
441
|
+
.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name")
|
|
442
|
+
.all().map((r) => r.name);
|
|
443
|
+
}
|
|
444
|
+
writeAll(graph, mode) {
|
|
445
|
+
const tx = this.#db.transaction(() => {
|
|
446
|
+
if (mode === "full")
|
|
447
|
+
this.#db.exec(TRUNCATE_DDL);
|
|
448
|
+
this.writeMeta(graph);
|
|
449
|
+
this.writeObjects(graph);
|
|
450
|
+
this.writeFields(graph);
|
|
451
|
+
this.writeValidationRules(graph);
|
|
452
|
+
this.writeFlows(graph);
|
|
453
|
+
this.writeApexClasses(graph);
|
|
454
|
+
this.writeApexTriggers(graph);
|
|
455
|
+
this.writePermissionSets(graph);
|
|
456
|
+
this.writeProfiles(graph);
|
|
457
|
+
this.writeRecordTypes(graph);
|
|
458
|
+
this.writeApprovalProcesses(graph);
|
|
459
|
+
this.writeSharingRules(graph);
|
|
460
|
+
this.writeLayouts(graph);
|
|
461
|
+
this.writeCustomMetadataRecords(graph);
|
|
462
|
+
this.writeNamedCredentials(graph);
|
|
463
|
+
this.writeRemoteSiteSettings(graph);
|
|
464
|
+
this.writeLwcs(graph);
|
|
465
|
+
this.writeAuraBundles(graph);
|
|
466
|
+
this.writeFlexiPages(graph);
|
|
467
|
+
this.writeVisualforcePages(graph);
|
|
468
|
+
this.writeVisualforceComponents(graph);
|
|
469
|
+
this.writeCustomApplications(graph);
|
|
470
|
+
this.writeDependencies(graph);
|
|
471
|
+
this.writeTags(graph);
|
|
472
|
+
});
|
|
473
|
+
tx();
|
|
474
|
+
}
|
|
475
|
+
writeMeta(graph) {
|
|
476
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO meta(key, value) VALUES (?, ?)");
|
|
477
|
+
stmt.run("yohaku_version", graph.meta.yohakuVersion);
|
|
478
|
+
stmt.run("built_at", graph.meta.builtAt);
|
|
479
|
+
stmt.run("source_adapter", graph.meta.sourceAdapter);
|
|
480
|
+
stmt.run("salesforce_api_version", graph.meta.salesforceApiVersion);
|
|
481
|
+
stmt.run("source_hash", graph.meta.sourceHash);
|
|
482
|
+
}
|
|
483
|
+
writeObjects(graph) {
|
|
484
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO objects(fqn, label, plural_label, description, is_custom, sharing_model, source_path, content_hash) VALUES (?,?,?,?,?,?,?,?)");
|
|
485
|
+
for (const o of graph.objects) {
|
|
486
|
+
stmt.run(o.fullyQualifiedName, o.label, o.pluralLabel ?? null, o.description ?? null, o.isCustom ? 1 : 0, o.sharingModel ?? null, o.sourcePath, o.contentHash);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
writeFields(graph) {
|
|
490
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO fields(fqn, object, label, description, type, required, is_unique, is_custom, reference_to_json, picklist_values_json, source_path, content_hash) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)");
|
|
491
|
+
for (const f of graph.fields) {
|
|
492
|
+
stmt.run(f.fullyQualifiedName, f.object, f.label ?? null, f.description ?? null, f.type, f.required === undefined ? null : f.required ? 1 : 0, f.unique === undefined ? null : f.unique ? 1 : 0, f.isCustom ? 1 : 0, f.referenceTo === undefined ? null : JSON.stringify(f.referenceTo), f.picklistValues === undefined ? null : JSON.stringify(f.picklistValues), f.sourcePath, f.contentHash);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
writeValidationRules(graph) {
|
|
496
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO validation_rules(fqn, object, active, error_condition_formula, error_message, error_display_field, source_path, content_hash) VALUES (?,?,?,?,?,?,?,?)");
|
|
497
|
+
for (const v of graph.validationRules) {
|
|
498
|
+
stmt.run(v.fullyQualifiedName, v.object, v.active ? 1 : 0, v.errorConditionFormula ?? null, v.errorMessage ?? null, v.errorDisplayField ?? null, v.sourcePath, v.contentHash);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
writeFlows(graph) {
|
|
502
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO flows(fqn, label, description, type, status, triggering_object, source_path, content_hash, body_json) VALUES (?,?,?,?,?,?,?,?,?)");
|
|
503
|
+
for (const f of graph.flows) {
|
|
504
|
+
stmt.run(f.fullyQualifiedName, f.label ?? null, f.description ?? null, f.type, f.status, f.triggeringObject ?? null, f.sourcePath, f.contentHash, f.body === undefined ? null : JSON.stringify(f.body));
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
writeApexClasses(graph) {
|
|
508
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO apex_classes(fqn, api_version, is_test, is_interface, is_abstract, lines_of_code, source_path, content_hash, body_json) VALUES (?,?,?,?,?,?,?,?,?)");
|
|
509
|
+
for (const c of graph.apexClasses) {
|
|
510
|
+
stmt.run(c.fullyQualifiedName, c.apiVersion, c.isTest ? 1 : 0, c.isInterface === undefined ? null : c.isInterface ? 1 : 0, c.isAbstract === undefined ? null : c.isAbstract ? 1 : 0, c.linesOfCode ?? null, c.sourcePath, c.contentHash, c.body === undefined ? null : JSON.stringify(c.body));
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
writeApexTriggers(graph) {
|
|
514
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO apex_triggers(fqn, object, events_json, api_version, source_path, content_hash, body_json) VALUES (?,?,?,?,?,?,?)");
|
|
515
|
+
for (const t of graph.apexTriggers) {
|
|
516
|
+
stmt.run(t.fullyQualifiedName, t.object, JSON.stringify(t.events), t.apiVersion, t.sourcePath, t.contentHash, t.body === undefined ? null : JSON.stringify(t.body));
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
writePermissionSets(graph) {
|
|
520
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO permission_sets(fqn, label, description, license, source_path, content_hash, body_json) VALUES (?,?,?,?,?,?,?)");
|
|
521
|
+
for (const p of graph.permissionSets) {
|
|
522
|
+
stmt.run(p.fullyQualifiedName, p.label, p.description ?? null, p.license ?? null, p.sourcePath, p.contentHash, p.body === undefined ? null : JSON.stringify(p.body));
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
writeProfiles(graph) {
|
|
526
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO profiles(fqn, user_license, source_path, content_hash, body_json) VALUES (?,?,?,?,?)");
|
|
527
|
+
for (const p of graph.profiles) {
|
|
528
|
+
stmt.run(p.fullyQualifiedName, p.userLicense ?? null, p.sourcePath, p.contentHash, p.body === undefined ? null : JSON.stringify(p.body));
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
writeRecordTypes(graph) {
|
|
532
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO record_types(fqn, object, label, description, active, source_path, content_hash) VALUES (?,?,?,?,?,?,?)");
|
|
533
|
+
for (const r of graph.recordTypes) {
|
|
534
|
+
stmt.run(r.fullyQualifiedName, r.object, r.label ?? null, r.description ?? null, r.active ? 1 : 0, r.sourcePath, r.contentHash);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
writeApprovalProcesses(graph) {
|
|
538
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO approval_processes(fqn, object, label, description, active, body_json, source_path, content_hash) VALUES (?,?,?,?,?,?,?,?)");
|
|
539
|
+
for (const a of graph.approvalProcesses) {
|
|
540
|
+
const body = {
|
|
541
|
+
entryCriteria: a.entryCriteria,
|
|
542
|
+
steps: a.steps,
|
|
543
|
+
initialSubmissionActions: a.initialSubmissionActions,
|
|
544
|
+
finalApprovalActions: a.finalApprovalActions,
|
|
545
|
+
finalRejectionActions: a.finalRejectionActions,
|
|
546
|
+
recallActions: a.recallActions,
|
|
547
|
+
recordEditability: a.recordEditability,
|
|
548
|
+
};
|
|
549
|
+
stmt.run(a.fullyQualifiedName, a.object, a.label ?? null, a.description ?? null, a.active ? 1 : 0, JSON.stringify(body), a.sourcePath, a.contentHash);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
writeLayouts(graph) {
|
|
553
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO layouts(fqn, object, layout_name, body_json, source_path, content_hash) VALUES (?,?,?,?,?,?)");
|
|
554
|
+
for (const l of graph.layouts) {
|
|
555
|
+
const body = {
|
|
556
|
+
sections: l.sections,
|
|
557
|
+
relatedLists: l.relatedLists,
|
|
558
|
+
quickActions: l.quickActions,
|
|
559
|
+
};
|
|
560
|
+
stmt.run(l.fullyQualifiedName, l.object, l.layoutName, JSON.stringify(body), l.sourcePath, l.contentHash);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
writeCustomMetadataRecords(graph) {
|
|
564
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO custom_metadata_records(fqn, type, record_name, label, is_protected, body_json, source_path, content_hash) VALUES (?,?,?,?,?,?,?,?)");
|
|
565
|
+
for (const r of graph.customMetadataRecords) {
|
|
566
|
+
stmt.run(r.fullyQualifiedName, r.type, r.recordName, r.label ?? null, r.protected === undefined ? null : r.protected ? 1 : 0, JSON.stringify({ values: r.values }), r.sourcePath, r.contentHash);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
writeNamedCredentials(graph) {
|
|
570
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO named_credentials(fqn, label, endpoint, principal_type, protocol, has_secret, source_path, content_hash) VALUES (?,?,?,?,?,?,?,?)");
|
|
571
|
+
for (const n of graph.namedCredentials) {
|
|
572
|
+
stmt.run(n.fullyQualifiedName, n.label ?? null, n.endpoint ?? null, n.principalType ?? null, n.protocol ?? null, n.hasSecret ? 1 : 0, n.sourcePath, n.contentHash);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
writeLwcs(graph) {
|
|
576
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO lwcs(fqn, api_version, master_label, description, is_exposed, body_json, source_path, content_hash) VALUES (?,?,?,?,?,?,?,?)");
|
|
577
|
+
for (const c of graph.lwcs) {
|
|
578
|
+
const body = {
|
|
579
|
+
targets: c.targets,
|
|
580
|
+
hasHtml: c.hasHtml,
|
|
581
|
+
hasCss: c.hasCss,
|
|
582
|
+
apexImports: c.apexImports,
|
|
583
|
+
labelImports: c.labelImports,
|
|
584
|
+
publicProperties: c.publicProperties,
|
|
585
|
+
wires: c.wires,
|
|
586
|
+
customEvents: c.customEvents,
|
|
587
|
+
childComponents: c.childComponents,
|
|
588
|
+
standardComponents: c.standardComponents,
|
|
589
|
+
directives: c.directives,
|
|
590
|
+
};
|
|
591
|
+
stmt.run(c.fullyQualifiedName, c.apiVersion ?? null, c.masterLabel ?? null, c.description ?? null, c.isExposed ? 1 : 0, JSON.stringify(body), c.sourcePath, c.contentHash);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
writeAuraBundles(graph) {
|
|
595
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO aura_bundles(fqn, bundle_kind, api_version, description, body_json, source_path, content_hash) VALUES (?,?,?,?,?,?,?)");
|
|
596
|
+
for (const a of graph.auraBundles) {
|
|
597
|
+
const body = {
|
|
598
|
+
hasController: a.hasController,
|
|
599
|
+
hasHelper: a.hasHelper,
|
|
600
|
+
hasRenderer: a.hasRenderer,
|
|
601
|
+
hasStyle: a.hasStyle,
|
|
602
|
+
attributes: a.attributes,
|
|
603
|
+
handlers: a.handlers,
|
|
604
|
+
};
|
|
605
|
+
stmt.run(a.fullyQualifiedName, a.bundleKind, a.apiVersion ?? null, a.description ?? null, JSON.stringify(body), a.sourcePath, a.contentHash);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
writeFlexiPages(graph) {
|
|
609
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO flexi_pages(fqn, type, sobject_type, page_template, master_label, description, body_json, source_path, content_hash) VALUES (?,?,?,?,?,?,?,?,?)");
|
|
610
|
+
for (const f of graph.flexiPages) {
|
|
611
|
+
stmt.run(f.fullyQualifiedName, f.type ?? null, f.sobjectType ?? null, f.pageTemplate ?? null, f.masterLabel ?? null, f.description ?? null, JSON.stringify({ regions: f.regions }), f.sourcePath, f.contentHash);
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
writeVisualforcePages(graph) {
|
|
615
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO visualforce_pages(fqn, api_version, label, description, controller, standard_controller, render_as, body_json, source_path, content_hash) VALUES (?,?,?,?,?,?,?,?,?,?)");
|
|
616
|
+
for (const p of graph.visualforcePages) {
|
|
617
|
+
const body = {
|
|
618
|
+
extensions: p.extensions,
|
|
619
|
+
availableInTouch: p.availableInTouch,
|
|
620
|
+
confirmationTokenRequired: p.confirmationTokenRequired,
|
|
621
|
+
hasMarkup: p.hasMarkup,
|
|
622
|
+
markupCounts: p.markupCounts,
|
|
623
|
+
methodReferences: p.methodReferences,
|
|
624
|
+
};
|
|
625
|
+
stmt.run(p.fullyQualifiedName, p.apiVersion ?? null, p.label ?? null, p.description ?? null, p.controller ?? null, p.standardController ?? null, p.renderAs ?? null, JSON.stringify(body), p.sourcePath, p.contentHash);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
writeVisualforceComponents(graph) {
|
|
629
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO visualforce_components(fqn, api_version, label, description, controller, body_json, source_path, content_hash) VALUES (?,?,?,?,?,?,?,?)");
|
|
630
|
+
for (const c of graph.visualforceComponents) {
|
|
631
|
+
const body = {
|
|
632
|
+
attributes: c.attributes,
|
|
633
|
+
hasMarkup: c.hasMarkup,
|
|
634
|
+
markupCounts: c.markupCounts,
|
|
635
|
+
};
|
|
636
|
+
stmt.run(c.fullyQualifiedName, c.apiVersion ?? null, c.label ?? null, c.description ?? null, c.controller ?? null, JSON.stringify(body), c.sourcePath, c.contentHash);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
writeCustomApplications(graph) {
|
|
640
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO custom_applications(fqn, label, description, nav_type, body_json, source_path, content_hash) VALUES (?,?,?,?,?,?,?)");
|
|
641
|
+
for (const a of graph.customApplications) {
|
|
642
|
+
const body = {
|
|
643
|
+
formFactors: a.formFactors,
|
|
644
|
+
tabs: a.tabs,
|
|
645
|
+
utilityBar: a.utilityBar,
|
|
646
|
+
brandColor: a.brandColor,
|
|
647
|
+
logo: a.logo,
|
|
648
|
+
};
|
|
649
|
+
stmt.run(a.fullyQualifiedName, a.label ?? null, a.description ?? null, a.navType ?? null, JSON.stringify(body), a.sourcePath, a.contentHash);
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
writeRemoteSiteSettings(graph) {
|
|
653
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO remote_site_settings(fqn, url, description, active, disable_protocol_security, source_path, content_hash) VALUES (?,?,?,?,?,?,?)");
|
|
654
|
+
for (const r of graph.remoteSiteSettings) {
|
|
655
|
+
stmt.run(r.fullyQualifiedName, r.url ?? null, r.description ?? null, r.active ? 1 : 0, r.disableProtocolSecurity ? 1 : 0, r.sourcePath, r.contentHash);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
writeSharingRules(graph) {
|
|
659
|
+
const stmt = this.#db.prepare("INSERT OR REPLACE INTO sharing_rules(fqn, object, kind, label, description, access_level, body_json, source_path, content_hash) VALUES (?,?,?,?,?,?,?,?,?)");
|
|
660
|
+
for (const r of graph.sharingRules) {
|
|
661
|
+
const body = {
|
|
662
|
+
sharedTo: r.sharedTo,
|
|
663
|
+
criteriaItems: r.criteriaItems,
|
|
664
|
+
criteriaBooleanFilter: r.criteriaBooleanFilter,
|
|
665
|
+
ownerSource: r.ownerSource,
|
|
666
|
+
};
|
|
667
|
+
stmt.run(r.fullyQualifiedName, r.object, r.kind, r.label ?? null, r.description ?? null, r.accessLevel, JSON.stringify(body), r.sourcePath, r.contentHash);
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
writeDependencies(graph) {
|
|
671
|
+
const stmt = this.#db.prepare("INSERT INTO dependencies(from_kind, from_fqn, to_kind, to_fqn, kind, evidence_path) VALUES (?,?,?,?,?,?)");
|
|
672
|
+
for (const d of graph.dependencies) {
|
|
673
|
+
stmt.run(d.from.kind, d.from.fullyQualifiedName, d.to.kind, d.to.fullyQualifiedName, d.kind, d.evidencePath ?? null);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
writeTags(graph) {
|
|
677
|
+
const stmt = this.#db.prepare("INSERT INTO tags(entity_kind, entity_fqn, namespace, value) VALUES (?,?,?,?)");
|
|
678
|
+
for (const t of graph.tags) {
|
|
679
|
+
stmt.run(t.entity.kind, t.entity.fullyQualifiedName, t.namespace, t.value);
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
//# sourceMappingURL=sqlite-store.js.map
|