@opensip-cli/graph-typescript 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +31 -0
- package/dist/__tests__/_pipeline.d.ts +40 -0
- package/dist/__tests__/_pipeline.d.ts.map +1 -0
- package/dist/__tests__/_pipeline.js +67 -0
- package/dist/__tests__/_pipeline.js.map +1 -0
- package/dist/__tests__/acceptance/_fixture-runner.d.ts +13 -0
- package/dist/__tests__/acceptance/_fixture-runner.d.ts.map +1 -0
- package/dist/__tests__/acceptance/_fixture-runner.js +55 -0
- package/dist/__tests__/acceptance/_fixture-runner.js.map +1 -0
- package/dist/__tests__/acceptance/alias-resolution.test.d.ts +8 -0
- package/dist/__tests__/acceptance/alias-resolution.test.d.ts.map +1 -0
- package/dist/__tests__/acceptance/alias-resolution.test.js +39 -0
- package/dist/__tests__/acceptance/alias-resolution.test.js.map +1 -0
- package/dist/__tests__/acceptance/arrow-callback-resolution.test.d.ts +8 -0
- package/dist/__tests__/acceptance/arrow-callback-resolution.test.d.ts.map +1 -0
- package/dist/__tests__/acceptance/arrow-callback-resolution.test.js +33 -0
- package/dist/__tests__/acceptance/arrow-callback-resolution.test.js.map +1 -0
- package/dist/__tests__/acceptance/constructor-calls.test.d.ts +7 -0
- package/dist/__tests__/acceptance/constructor-calls.test.d.ts.map +1 -0
- package/dist/__tests__/acceptance/constructor-calls.test.js +36 -0
- package/dist/__tests__/acceptance/constructor-calls.test.js.map +1 -0
- package/dist/__tests__/acceptance/interface-dispatch.test.d.ts +8 -0
- package/dist/__tests__/acceptance/interface-dispatch.test.d.ts.map +1 -0
- package/dist/__tests__/acceptance/interface-dispatch.test.js +44 -0
- package/dist/__tests__/acceptance/interface-dispatch.test.js.map +1 -0
- package/dist/__tests__/acceptance/inventory-completeness.test.d.ts +9 -0
- package/dist/__tests__/acceptance/inventory-completeness.test.d.ts.map +1 -0
- package/dist/__tests__/acceptance/inventory-completeness.test.js +72 -0
- package/dist/__tests__/acceptance/inventory-completeness.test.js.map +1 -0
- package/dist/__tests__/acceptance/jsx-resolution.test.d.ts +7 -0
- package/dist/__tests__/acceptance/jsx-resolution.test.d.ts.map +1 -0
- package/dist/__tests__/acceptance/jsx-resolution.test.js +46 -0
- package/dist/__tests__/acceptance/jsx-resolution.test.js.map +1 -0
- package/dist/__tests__/acceptance/module-init.test.d.ts +10 -0
- package/dist/__tests__/acceptance/module-init.test.d.ts.map +1 -0
- package/dist/__tests__/acceptance/module-init.test.js +40 -0
- package/dist/__tests__/acceptance/module-init.test.js.map +1 -0
- package/dist/__tests__/acceptance/projectdir-normalization.test.d.ts +7 -0
- package/dist/__tests__/acceptance/projectdir-normalization.test.d.ts.map +1 -0
- package/dist/__tests__/acceptance/projectdir-normalization.test.js +51 -0
- package/dist/__tests__/acceptance/projectdir-normalization.test.js.map +1 -0
- package/dist/__tests__/body-twin-edges.test.d.ts +12 -0
- package/dist/__tests__/body-twin-edges.test.d.ts.map +1 -0
- package/dist/__tests__/body-twin-edges.test.js +85 -0
- package/dist/__tests__/body-twin-edges.test.js.map +1 -0
- package/dist/__tests__/cache-key.test.d.ts +8 -0
- package/dist/__tests__/cache-key.test.d.ts.map +1 -0
- package/dist/__tests__/cache-key.test.js +86 -0
- package/dist/__tests__/cache-key.test.js.map +1 -0
- package/dist/__tests__/depends-on-emission.test.d.ts +19 -0
- package/dist/__tests__/depends-on-emission.test.d.ts.map +1 -0
- package/dist/__tests__/depends-on-emission.test.js +165 -0
- package/dist/__tests__/depends-on-emission.test.js.map +1 -0
- package/dist/__tests__/discover.test.d.ts +9 -0
- package/dist/__tests__/discover.test.d.ts.map +1 -0
- package/dist/__tests__/discover.test.js +72 -0
- package/dist/__tests__/discover.test.js.map +1 -0
- package/dist/__tests__/edge-helpers/method-target.test.d.ts +8 -0
- package/dist/__tests__/edge-helpers/method-target.test.d.ts.map +1 -0
- package/dist/__tests__/edge-helpers/method-target.test.js +96 -0
- package/dist/__tests__/edge-helpers/method-target.test.js.map +1 -0
- package/dist/__tests__/edge-helpers/resolve-decl.test.d.ts +13 -0
- package/dist/__tests__/edge-helpers/resolve-decl.test.d.ts.map +1 -0
- package/dist/__tests__/edge-helpers/resolve-decl.test.js +176 -0
- package/dist/__tests__/edge-helpers/resolve-decl.test.js.map +1 -0
- package/dist/__tests__/edge-resolvers/branches.test.d.ts +11 -0
- package/dist/__tests__/edge-resolvers/branches.test.d.ts.map +1 -0
- package/dist/__tests__/edge-resolvers/branches.test.js +305 -0
- package/dist/__tests__/edge-resolvers/branches.test.js.map +1 -0
- package/dist/__tests__/edge-resolvers/contract.test.d.ts +8 -0
- package/dist/__tests__/edge-resolvers/contract.test.d.ts.map +1 -0
- package/dist/__tests__/edge-resolvers/contract.test.js +30 -0
- package/dist/__tests__/edge-resolvers/contract.test.js.map +1 -0
- package/dist/__tests__/edge-resolvers/resolver-units.test.d.ts +17 -0
- package/dist/__tests__/edge-resolvers/resolver-units.test.d.ts.map +1 -0
- package/dist/__tests__/edge-resolvers/resolver-units.test.js +286 -0
- package/dist/__tests__/edge-resolvers/resolver-units.test.js.map +1 -0
- package/dist/__tests__/fast-vs-exact.test.d.ts +16 -0
- package/dist/__tests__/fast-vs-exact.test.d.ts.map +1 -0
- package/dist/__tests__/fast-vs-exact.test.js +116 -0
- package/dist/__tests__/fast-vs-exact.test.js.map +1 -0
- package/dist/__tests__/graph-cli.test.d.ts +9 -0
- package/dist/__tests__/graph-cli.test.d.ts.map +1 -0
- package/dist/__tests__/graph-cli.test.js +417 -0
- package/dist/__tests__/graph-cli.test.js.map +1 -0
- package/dist/__tests__/heap-preflight.test.d.ts +10 -0
- package/dist/__tests__/heap-preflight.test.d.ts.map +1 -0
- package/dist/__tests__/heap-preflight.test.js +166 -0
- package/dist/__tests__/heap-preflight.test.js.map +1 -0
- package/dist/__tests__/inventory-differential.test.d.ts +15 -0
- package/dist/__tests__/inventory-differential.test.d.ts.map +1 -0
- package/dist/__tests__/inventory-differential.test.js +319 -0
- package/dist/__tests__/inventory-differential.test.js.map +1 -0
- package/dist/__tests__/inventory-helpers/hash-body.test.d.ts +11 -0
- package/dist/__tests__/inventory-helpers/hash-body.test.d.ts.map +1 -0
- package/dist/__tests__/inventory-helpers/hash-body.test.js +34 -0
- package/dist/__tests__/inventory-helpers/hash-body.test.js.map +1 -0
- package/dist/__tests__/inventory-helpers/synthesize-name.test.d.ts +9 -0
- package/dist/__tests__/inventory-helpers/synthesize-name.test.d.ts.map +1 -0
- package/dist/__tests__/inventory-helpers/synthesize-name.test.js +30 -0
- package/dist/__tests__/inventory-helpers/synthesize-name.test.js.map +1 -0
- package/dist/__tests__/inventory-property-tests.test.d.ts +24 -0
- package/dist/__tests__/inventory-property-tests.test.d.ts.map +1 -0
- package/dist/__tests__/inventory-property-tests.test.js +521 -0
- package/dist/__tests__/inventory-property-tests.test.js.map +1 -0
- package/dist/__tests__/inventory-shape-coverage.test.d.ts +16 -0
- package/dist/__tests__/inventory-shape-coverage.test.d.ts.map +1 -0
- package/dist/__tests__/inventory-shape-coverage.test.js +586 -0
- package/dist/__tests__/inventory-shape-coverage.test.js.map +1 -0
- package/dist/__tests__/inventory-visitors/contract.test.d.ts +9 -0
- package/dist/__tests__/inventory-visitors/contract.test.d.ts.map +1 -0
- package/dist/__tests__/inventory-visitors/contract.test.js +33 -0
- package/dist/__tests__/inventory-visitors/contract.test.js.map +1 -0
- package/dist/__tests__/lang-adapter-contract.test.d.ts +19 -0
- package/dist/__tests__/lang-adapter-contract.test.d.ts.map +1 -0
- package/dist/__tests__/lang-adapter-contract.test.js +880 -0
- package/dist/__tests__/lang-adapter-contract.test.js.map +1 -0
- package/dist/__tests__/lang-adapter-registry.test.d.ts +10 -0
- package/dist/__tests__/lang-adapter-registry.test.d.ts.map +1 -0
- package/dist/__tests__/lang-adapter-registry.test.js +151 -0
- package/dist/__tests__/lang-adapter-registry.test.js.map +1 -0
- package/dist/__tests__/normalize-project-dir.test.d.ts +5 -0
- package/dist/__tests__/normalize-project-dir.test.d.ts.map +1 -0
- package/dist/__tests__/normalize-project-dir.test.js +47 -0
- package/dist/__tests__/normalize-project-dir.test.js.map +1 -0
- package/dist/__tests__/orchestrate.test.d.ts +8 -0
- package/dist/__tests__/orchestrate.test.d.ts.map +1 -0
- package/dist/__tests__/orchestrate.test.js +213 -0
- package/dist/__tests__/orchestrate.test.js.map +1 -0
- package/dist/__tests__/parse-fast.test.d.ts +9 -0
- package/dist/__tests__/parse-fast.test.d.ts.map +1 -0
- package/dist/__tests__/parse-fast.test.js +114 -0
- package/dist/__tests__/parse-fast.test.js.map +1 -0
- package/dist/__tests__/rules/_helpers.d.ts +18 -0
- package/dist/__tests__/rules/_helpers.d.ts.map +1 -0
- package/dist/__tests__/rules/_helpers.js +62 -0
- package/dist/__tests__/rules/_helpers.js.map +1 -0
- package/dist/__tests__/rules/duplicated-function-body.test.d.ts +5 -0
- package/dist/__tests__/rules/duplicated-function-body.test.d.ts.map +1 -0
- package/dist/__tests__/rules/duplicated-function-body.test.js +39 -0
- package/dist/__tests__/rules/duplicated-function-body.test.js.map +1 -0
- package/dist/__tests__/rules/orphan-subtree.test.d.ts +5 -0
- package/dist/__tests__/rules/orphan-subtree.test.d.ts.map +1 -0
- package/dist/__tests__/rules/orphan-subtree.test.js +75 -0
- package/dist/__tests__/rules/orphan-subtree.test.js.map +1 -0
- package/dist/__tests__/rules/rule-hints-integration.test.d.ts +20 -0
- package/dist/__tests__/rules/rule-hints-integration.test.d.ts.map +1 -0
- package/dist/__tests__/rules/rule-hints-integration.test.js +279 -0
- package/dist/__tests__/rules/rule-hints-integration.test.js.map +1 -0
- package/dist/__tests__/tool-register.test.d.ts +16 -0
- package/dist/__tests__/tool-register.test.d.ts.map +1 -0
- package/dist/__tests__/tool-register.test.js +210 -0
- package/dist/__tests__/tool-register.test.js.map +1 -0
- package/dist/__tests__/value-reference-unit.test.d.ts +13 -0
- package/dist/__tests__/value-reference-unit.test.d.ts.map +1 -0
- package/dist/__tests__/value-reference-unit.test.js +226 -0
- package/dist/__tests__/value-reference-unit.test.js.map +1 -0
- package/dist/__tests__/value-reference.test.d.ts +15 -0
- package/dist/__tests__/value-reference.test.d.ts.map +1 -0
- package/dist/__tests__/value-reference.test.js +115 -0
- package/dist/__tests__/value-reference.test.js.map +1 -0
- package/dist/__tests__/walk-fast.test.d.ts +8 -0
- package/dist/__tests__/walk-fast.test.d.ts.map +1 -0
- package/dist/__tests__/walk-fast.test.js +51 -0
- package/dist/__tests__/walk-fast.test.js.map +1 -0
- package/dist/__tests__/walk-reexports.test.d.ts +7 -0
- package/dist/__tests__/walk-reexports.test.d.ts.map +1 -0
- package/dist/__tests__/walk-reexports.test.js +79 -0
- package/dist/__tests__/walk-reexports.test.js.map +1 -0
- package/dist/cache-key.d.ts +41 -0
- package/dist/cache-key.d.ts.map +1 -0
- package/dist/cache-key.js +94 -0
- package/dist/cache-key.js.map +1 -0
- package/dist/discover.d.ts +25 -0
- package/dist/discover.d.ts.map +1 -0
- package/dist/discover.js +124 -0
- package/dist/discover.js.map +1 -0
- package/dist/edge-helpers/cross-package-context.d.ts +34 -0
- package/dist/edge-helpers/cross-package-context.d.ts.map +1 -0
- package/dist/edge-helpers/cross-package-context.js +97 -0
- package/dist/edge-helpers/cross-package-context.js.map +1 -0
- package/dist/edge-helpers/declaration-to-node.d.ts +58 -0
- package/dist/edge-helpers/declaration-to-node.d.ts.map +1 -0
- package/dist/edge-helpers/declaration-to-node.js +93 -0
- package/dist/edge-helpers/declaration-to-node.js.map +1 -0
- package/dist/edge-helpers/find-catalog-entry.d.ts +24 -0
- package/dist/edge-helpers/find-catalog-entry.d.ts.map +1 -0
- package/dist/edge-helpers/find-catalog-entry.js +45 -0
- package/dist/edge-helpers/find-catalog-entry.js.map +1 -0
- package/dist/edge-helpers/method-target.d.ts +22 -0
- package/dist/edge-helpers/method-target.d.ts.map +1 -0
- package/dist/edge-helpers/method-target.js +46 -0
- package/dist/edge-helpers/method-target.js.map +1 -0
- package/dist/edge-helpers/resolution-trace.d.ts +24 -0
- package/dist/edge-helpers/resolution-trace.d.ts.map +1 -0
- package/dist/edge-helpers/resolution-trace.js +38 -0
- package/dist/edge-helpers/resolution-trace.js.map +1 -0
- package/dist/edge-helpers/resolve-decl.d.ts +44 -0
- package/dist/edge-helpers/resolve-decl.d.ts.map +1 -0
- package/dist/edge-helpers/resolve-decl.js +170 -0
- package/dist/edge-helpers/resolve-decl.js.map +1 -0
- package/dist/edge-helpers/unalias-symbol.d.ts +10 -0
- package/dist/edge-helpers/unalias-symbol.d.ts.map +1 -0
- package/dist/edge-helpers/unalias-symbol.js +29 -0
- package/dist/edge-helpers/unalias-symbol.js.map +1 -0
- package/dist/edge-resolvers/__tests__/boundary.test.d.ts +15 -0
- package/dist/edge-resolvers/__tests__/boundary.test.d.ts.map +1 -0
- package/dist/edge-resolvers/__tests__/boundary.test.js +227 -0
- package/dist/edge-resolvers/__tests__/boundary.test.js.map +1 -0
- package/dist/edge-resolvers/__tests__/callee-anchor.test.d.ts +10 -0
- package/dist/edge-resolvers/__tests__/callee-anchor.test.d.ts.map +1 -0
- package/dist/edge-resolvers/__tests__/callee-anchor.test.js +63 -0
- package/dist/edge-resolvers/__tests__/callee-anchor.test.js.map +1 -0
- package/dist/edge-resolvers/__tests__/syntactic.test.d.ts +12 -0
- package/dist/edge-resolvers/__tests__/syntactic.test.d.ts.map +1 -0
- package/dist/edge-resolvers/__tests__/syntactic.test.js +215 -0
- package/dist/edge-resolvers/__tests__/syntactic.test.js.map +1 -0
- package/dist/edge-resolvers/boundary.d.ts +41 -0
- package/dist/edge-resolvers/boundary.d.ts.map +1 -0
- package/dist/edge-resolvers/boundary.js +130 -0
- package/dist/edge-resolvers/boundary.js.map +1 -0
- package/dist/edge-resolvers/catalog-fallback.d.ts +13 -0
- package/dist/edge-resolvers/catalog-fallback.d.ts.map +1 -0
- package/dist/edge-resolvers/catalog-fallback.js +30 -0
- package/dist/edge-resolvers/catalog-fallback.js.map +1 -0
- package/dist/edge-resolvers/direct-call.d.ts +10 -0
- package/dist/edge-resolvers/direct-call.d.ts.map +1 -0
- package/dist/edge-resolvers/direct-call.js +45 -0
- package/dist/edge-resolvers/direct-call.js.map +1 -0
- package/dist/edge-resolvers/jsx-element.d.ts +16 -0
- package/dist/edge-resolvers/jsx-element.d.ts.map +1 -0
- package/dist/edge-resolvers/jsx-element.js +67 -0
- package/dist/edge-resolvers/jsx-element.js.map +1 -0
- package/dist/edge-resolvers/new-expression.d.ts +11 -0
- package/dist/edge-resolvers/new-expression.d.ts.map +1 -0
- package/dist/edge-resolvers/new-expression.js +56 -0
- package/dist/edge-resolvers/new-expression.js.map +1 -0
- package/dist/edge-resolvers/polymorphic.d.ts +8 -0
- package/dist/edge-resolvers/polymorphic.d.ts.map +1 -0
- package/dist/edge-resolvers/polymorphic.js +57 -0
- package/dist/edge-resolvers/polymorphic.js.map +1 -0
- package/dist/edge-resolvers/property-access.d.ts +10 -0
- package/dist/edge-resolvers/property-access.d.ts.map +1 -0
- package/dist/edge-resolvers/property-access.js +56 -0
- package/dist/edge-resolvers/property-access.js.map +1 -0
- package/dist/edge-resolvers/syntactic.d.ts +105 -0
- package/dist/edge-resolvers/syntactic.d.ts.map +1 -0
- package/dist/edge-resolvers/syntactic.js +294 -0
- package/dist/edge-resolvers/syntactic.js.map +1 -0
- package/dist/edge-resolvers/types.d.ts +37 -0
- package/dist/edge-resolvers/types.d.ts.map +1 -0
- package/dist/edge-resolvers/types.js +10 -0
- package/dist/edge-resolvers/types.js.map +1 -0
- package/dist/edges-value-reference.d.ts +26 -0
- package/dist/edges-value-reference.d.ts.map +1 -0
- package/dist/edges-value-reference.js +138 -0
- package/dist/edges-value-reference.js.map +1 -0
- package/dist/edges.d.ts +65 -0
- package/dist/edges.d.ts.map +1 -0
- package/dist/edges.js +392 -0
- package/dist/edges.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +346 -0
- package/dist/index.js.map +1 -0
- package/dist/inventory-helpers/classify-visibility.d.ts +13 -0
- package/dist/inventory-helpers/classify-visibility.d.ts.map +1 -0
- package/dist/inventory-helpers/classify-visibility.js +56 -0
- package/dist/inventory-helpers/classify-visibility.js.map +1 -0
- package/dist/inventory-helpers/extract-decorators.d.ts +6 -0
- package/dist/inventory-helpers/extract-decorators.d.ts.map +1 -0
- package/dist/inventory-helpers/extract-decorators.js +33 -0
- package/dist/inventory-helpers/extract-decorators.js.map +1 -0
- package/dist/inventory-helpers/extract-params.d.ts +7 -0
- package/dist/inventory-helpers/extract-params.d.ts.map +1 -0
- package/dist/inventory-helpers/extract-params.js +28 -0
- package/dist/inventory-helpers/extract-params.js.map +1 -0
- package/dist/inventory-helpers/hash-body.d.ts +43 -0
- package/dist/inventory-helpers/hash-body.d.ts.map +1 -0
- package/dist/inventory-helpers/hash-body.js +52 -0
- package/dist/inventory-helpers/hash-body.js.map +1 -0
- package/dist/inventory-helpers/synthesize-name.d.ts +16 -0
- package/dist/inventory-helpers/synthesize-name.d.ts.map +1 -0
- package/dist/inventory-helpers/synthesize-name.js +17 -0
- package/dist/inventory-helpers/synthesize-name.js.map +1 -0
- package/dist/inventory-visitors/arrow-function.d.ts +8 -0
- package/dist/inventory-visitors/arrow-function.d.ts.map +1 -0
- package/dist/inventory-visitors/arrow-function.js +55 -0
- package/dist/inventory-visitors/arrow-function.js.map +1 -0
- package/dist/inventory-visitors/class-static-init.d.ts +17 -0
- package/dist/inventory-visitors/class-static-init.d.ts.map +1 -0
- package/dist/inventory-visitors/class-static-init.js +45 -0
- package/dist/inventory-visitors/class-static-init.js.map +1 -0
- package/dist/inventory-visitors/constructor-declaration.d.ts +7 -0
- package/dist/inventory-visitors/constructor-declaration.d.ts.map +1 -0
- package/dist/inventory-visitors/constructor-declaration.js +47 -0
- package/dist/inventory-visitors/constructor-declaration.js.map +1 -0
- package/dist/inventory-visitors/function-declaration.d.ts +7 -0
- package/dist/inventory-visitors/function-declaration.d.ts.map +1 -0
- package/dist/inventory-visitors/function-declaration.js +59 -0
- package/dist/inventory-visitors/function-declaration.js.map +1 -0
- package/dist/inventory-visitors/function-expression.d.ts +7 -0
- package/dist/inventory-visitors/function-expression.d.ts.map +1 -0
- package/dist/inventory-visitors/function-expression.js +56 -0
- package/dist/inventory-visitors/function-expression.js.map +1 -0
- package/dist/inventory-visitors/getter-setter.d.ts +7 -0
- package/dist/inventory-visitors/getter-setter.d.ts.map +1 -0
- package/dist/inventory-visitors/getter-setter.js +63 -0
- package/dist/inventory-visitors/getter-setter.js.map +1 -0
- package/dist/inventory-visitors/method-declaration.d.ts +7 -0
- package/dist/inventory-visitors/method-declaration.d.ts.map +1 -0
- package/dist/inventory-visitors/method-declaration.js +75 -0
- package/dist/inventory-visitors/method-declaration.js.map +1 -0
- package/dist/inventory-visitors/module-init.d.ts +15 -0
- package/dist/inventory-visitors/module-init.d.ts.map +1 -0
- package/dist/inventory-visitors/module-init.js +40 -0
- package/dist/inventory-visitors/module-init.js.map +1 -0
- package/dist/inventory-visitors/types.d.ts +26 -0
- package/dist/inventory-visitors/types.d.ts.map +1 -0
- package/dist/inventory-visitors/types.js +14 -0
- package/dist/inventory-visitors/types.js.map +1 -0
- package/dist/normalize-project-dir.d.ts +14 -0
- package/dist/normalize-project-dir.d.ts.map +1 -0
- package/dist/normalize-project-dir.js +36 -0
- package/dist/normalize-project-dir.js.map +1 -0
- package/dist/parse-fast.d.ts +41 -0
- package/dist/parse-fast.d.ts.map +1 -0
- package/dist/parse-fast.js +91 -0
- package/dist/parse-fast.js.map +1 -0
- package/dist/parse.d.ts +42 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +75 -0
- package/dist/parse.js.map +1 -0
- package/dist/test-file.d.ts +7 -0
- package/dist/test-file.d.ts.map +1 -0
- package/dist/test-file.js +42 -0
- package/dist/test-file.js.map +1 -0
- package/dist/walk.d.ts +125 -0
- package/dist/walk.d.ts.map +1 -0
- package/dist/walk.js +393 -0
- package/dist/walk.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the executeGraph CLI handler.
|
|
3
|
+
*
|
|
4
|
+
* The handler is a façade that wires runGraph to one of three modes
|
|
5
|
+
* (table, JSON, gate, report) plus error mapping. We exercise stdout
|
|
6
|
+
* capture and the various flag combinations against fixture projects.
|
|
7
|
+
*/
|
|
8
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { tmpdir } from 'node:os';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { LanguageRegistry, RunScope, runWithScope, runWithScopeSync } from '@opensip-cli/core';
|
|
12
|
+
import { BaselineRepo, DataStoreFactory } from '@opensip-cli/datastore';
|
|
13
|
+
import { currentAdapterRegistry, graphTool } from '@opensip-cli/graph';
|
|
14
|
+
import { executeGraph } from '@opensip-cli/graph/internal';
|
|
15
|
+
import { typescriptAdapter } from '@opensip-cli/lang-typescript';
|
|
16
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
17
|
+
import { typescriptGraphAdapter } from '../index.js';
|
|
18
|
+
const FIXTURE_TSCONFIG = JSON.stringify({
|
|
19
|
+
compilerOptions: {
|
|
20
|
+
target: 'ES2022',
|
|
21
|
+
module: 'Node16',
|
|
22
|
+
moduleResolution: 'Node16',
|
|
23
|
+
strict: true,
|
|
24
|
+
esModuleInterop: true,
|
|
25
|
+
skipLibCheck: true,
|
|
26
|
+
rootDir: '.',
|
|
27
|
+
},
|
|
28
|
+
include: ['**/*.ts'],
|
|
29
|
+
});
|
|
30
|
+
function setupFixture(dir, files) {
|
|
31
|
+
mkdirSync(dir, { recursive: true });
|
|
32
|
+
writeFileSync(join(dir, 'tsconfig.json'), FIXTURE_TSCONFIG, 'utf8');
|
|
33
|
+
for (const [rel, content] of Object.entries(files)) {
|
|
34
|
+
const p = join(dir, rel);
|
|
35
|
+
mkdirSync(p.slice(0, Math.max(0, p.lastIndexOf('/'))), { recursive: true });
|
|
36
|
+
writeFileSync(p, content, 'utf8');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function makeGraphScope(input) {
|
|
40
|
+
const scope = new RunScope({
|
|
41
|
+
projectContext: input.project,
|
|
42
|
+
...(input.datastore ? { datastore: () => input.datastore } : {}),
|
|
43
|
+
...(input.languages ? { languages: input.languages } : {}),
|
|
44
|
+
});
|
|
45
|
+
Object.assign(scope, graphTool.contributeScope?.() ?? {});
|
|
46
|
+
runWithScopeSync(scope, () => currentAdapterRegistry().register(typescriptGraphAdapter));
|
|
47
|
+
return scope;
|
|
48
|
+
}
|
|
49
|
+
function makeCli() {
|
|
50
|
+
const exitCodes = [];
|
|
51
|
+
const render = vi.fn(() => Promise.resolve());
|
|
52
|
+
const datastore = DataStoreFactory.open({ backend: 'memory' });
|
|
53
|
+
const project = {
|
|
54
|
+
cwd: '/test',
|
|
55
|
+
cwdExplicit: false,
|
|
56
|
+
projectRoot: '/test',
|
|
57
|
+
configPath: undefined,
|
|
58
|
+
walkedUp: 0,
|
|
59
|
+
scope: 'none',
|
|
60
|
+
};
|
|
61
|
+
const languages = new LanguageRegistry();
|
|
62
|
+
// Register the real TS adapter so workspace detection (Phase 2)
|
|
63
|
+
// matches `tsconfig.json` markers and workspace fan-out (Phase 3)
|
|
64
|
+
// can call `discoverWorkspaceUnits`.
|
|
65
|
+
languages.register(typescriptAdapter);
|
|
66
|
+
const scope = makeGraphScope({ project, datastore, languages });
|
|
67
|
+
const cli = {
|
|
68
|
+
scope,
|
|
69
|
+
render,
|
|
70
|
+
registerLiveView: vi.fn(),
|
|
71
|
+
renderLive: vi.fn(() => Promise.resolve()),
|
|
72
|
+
maybeOpenReport: vi.fn(() => Promise.resolve()),
|
|
73
|
+
logger: {
|
|
74
|
+
info: vi.fn(),
|
|
75
|
+
warn: vi.fn(),
|
|
76
|
+
error: vi.fn(),
|
|
77
|
+
debug: vi.fn(),
|
|
78
|
+
},
|
|
79
|
+
setExitCode: (c) => {
|
|
80
|
+
exitCodes.push(c);
|
|
81
|
+
},
|
|
82
|
+
// Mirror the composition root's `emitJson` seam (cli-context.ts):
|
|
83
|
+
// JSON.stringify(_, null, 2) + '\n' to stdout, so the `--workspace --json`
|
|
84
|
+
// integration test can parse the emitted document (ADR-0011).
|
|
85
|
+
emitJson: vi.fn((value) => {
|
|
86
|
+
process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
87
|
+
}),
|
|
88
|
+
// Mirror the composition root's `emitEnvelope` seam: write the envelope as
|
|
89
|
+
// JSON to stdout so the `--json` integration test can parse it.
|
|
90
|
+
emitError: vi.fn(),
|
|
91
|
+
emitRaw: vi.fn(),
|
|
92
|
+
emitEnvelope: vi.fn((envelope) => {
|
|
93
|
+
process.stdout.write(`${JSON.stringify(envelope, null, 2)}\n`);
|
|
94
|
+
}),
|
|
95
|
+
// ADR-0036: the host owns the baseline seams + the gate exit. Mirror the real
|
|
96
|
+
// host seams against the test datastore, and map the deliverSignals runFailed
|
|
97
|
+
// override to setExitCode exactly as the host's deliver-envelope does.
|
|
98
|
+
deliverSignals: vi.fn((_e, opts) => {
|
|
99
|
+
exitCodes.push(opts?.runFailed === true ? 1 : 0);
|
|
100
|
+
return Promise.resolve({ cloudAccepted: 0 });
|
|
101
|
+
}),
|
|
102
|
+
writeSarif: vi.fn(() => Promise.resolve()),
|
|
103
|
+
saveBaseline: vi.fn((tool, env) => {
|
|
104
|
+
const signals = env.signals;
|
|
105
|
+
new BaselineRepo(datastore).save(tool, signals.map((s) => ({ fingerprint: s.fingerprint ?? '', payload: s })));
|
|
106
|
+
return Promise.resolve();
|
|
107
|
+
}),
|
|
108
|
+
compareBaseline: vi.fn((tool, env) => {
|
|
109
|
+
const baseFps = new Set(new BaselineRepo(datastore).load(tool).map((r) => r.fingerprint));
|
|
110
|
+
const added = env.signals.filter((s) => !baseFps.has(s.fingerprint ?? ''));
|
|
111
|
+
return Promise.resolve({ added, resolved: [], unchanged: [], degraded: added.length > 0 });
|
|
112
|
+
}),
|
|
113
|
+
exportBaselineSarif: vi.fn(() => Promise.resolve()),
|
|
114
|
+
exportBaselineFingerprints: vi.fn(() => Promise.resolve()),
|
|
115
|
+
toolState: {
|
|
116
|
+
get: () => Promise.resolve(undefined),
|
|
117
|
+
put: () => Promise.resolve(),
|
|
118
|
+
delete: () => Promise.resolve(),
|
|
119
|
+
list: () => Promise.resolve([]),
|
|
120
|
+
},
|
|
121
|
+
runSession: {
|
|
122
|
+
timing: {
|
|
123
|
+
startedAt: new Date().toISOString(),
|
|
124
|
+
startedAtEpochMs: Date.now(),
|
|
125
|
+
elapsedMs: () => 0,
|
|
126
|
+
snapshot: () => ({
|
|
127
|
+
startedAt: new Date().toISOString(),
|
|
128
|
+
completedAt: new Date().toISOString(),
|
|
129
|
+
durationMs: 0,
|
|
130
|
+
}),
|
|
131
|
+
complete: () => ({
|
|
132
|
+
startedAt: new Date().toISOString(),
|
|
133
|
+
completedAt: new Date().toISOString(),
|
|
134
|
+
durationMs: 0,
|
|
135
|
+
}),
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
return { cli, exitCodes, datastore, render };
|
|
140
|
+
}
|
|
141
|
+
async function runExecuteGraph(options, cli) {
|
|
142
|
+
return runWithScope(cli.scope, () => executeGraph(options, cli));
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Concatenated text of every `gate-done` / `graph-status` result handed to
|
|
146
|
+
* cli.render() — gate, report, and workspace human output flow through the
|
|
147
|
+
* render seam rather than direct stdout writes.
|
|
148
|
+
*/
|
|
149
|
+
function renderedLines(render) {
|
|
150
|
+
return render.mock.calls
|
|
151
|
+
.map((c) => c[0].lines?.join('\n') ?? '')
|
|
152
|
+
.join('\n');
|
|
153
|
+
}
|
|
154
|
+
describe('executeGraph', () => {
|
|
155
|
+
let dir;
|
|
156
|
+
let stdoutSpy;
|
|
157
|
+
let stderrSpy;
|
|
158
|
+
let stdout;
|
|
159
|
+
let stderr;
|
|
160
|
+
beforeEach(() => {
|
|
161
|
+
dir = mkdtempSync(join(tmpdir(), 'graph-cli-'));
|
|
162
|
+
stdout = '';
|
|
163
|
+
stderr = '';
|
|
164
|
+
stdoutSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
165
|
+
stdout += typeof chunk === 'string' ? chunk : String(chunk);
|
|
166
|
+
return true;
|
|
167
|
+
});
|
|
168
|
+
stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation((chunk) => {
|
|
169
|
+
stderr += typeof chunk === 'string' ? chunk : String(chunk);
|
|
170
|
+
return true;
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
afterEach(() => {
|
|
174
|
+
stdoutSpy.mockRestore();
|
|
175
|
+
stderrSpy.mockRestore();
|
|
176
|
+
rmSync(dir, { recursive: true, force: true });
|
|
177
|
+
});
|
|
178
|
+
it('default mode produces a graph-done result with summary + footer hint (no detailed body)', async () => {
|
|
179
|
+
setupFixture(dir, {
|
|
180
|
+
'index.ts': `function unused(): number { return 1; }\nexport function main(): void {}\n`,
|
|
181
|
+
});
|
|
182
|
+
const { cli, exitCodes, render } = makeCli();
|
|
183
|
+
await runExecuteGraph({ cwd: dir }, cli);
|
|
184
|
+
// executeGraph hands a structured result to the render seam; the
|
|
185
|
+
// Ink-vs-plain-text rendering is the CLI's concern (covered there).
|
|
186
|
+
const done = render.mock.calls[0]?.[0];
|
|
187
|
+
expect(done.type).toBe('graph-done');
|
|
188
|
+
expect(typeof done.summary.passed).toBe('number');
|
|
189
|
+
// Non-verbose: no verbose body; the "Use --verbose…" footer is emitted by
|
|
190
|
+
// the shared resultToView seam (ADR-0021), not carried on the result.
|
|
191
|
+
expect(done.verboseDetail).toBeUndefined();
|
|
192
|
+
expect(exitCodes).toContain(0);
|
|
193
|
+
});
|
|
194
|
+
it('--verbose mode produces a graph-done result with the detailed report body', async () => {
|
|
195
|
+
setupFixture(dir, {
|
|
196
|
+
'index.ts': `function unused(): number { return 1; }\nexport function main(): void {}\n`,
|
|
197
|
+
});
|
|
198
|
+
const { cli, exitCodes, render } = makeCli();
|
|
199
|
+
await runExecuteGraph({ cwd: dir, verbose: true }, cli);
|
|
200
|
+
const done = render.mock.calls[0]?.[0];
|
|
201
|
+
expect(done.type).toBe('graph-done');
|
|
202
|
+
const body = done.verboseDetail?.kind === 'lines' ? done.verboseDetail.lines.join('\n') : '';
|
|
203
|
+
expect(body).toContain('== Catalog ==');
|
|
204
|
+
expect(body).toContain('== Findings');
|
|
205
|
+
expect(body).toContain('== Entry points');
|
|
206
|
+
// The trailing "== Summary ==" block is suppressed (includeSummary: false).
|
|
207
|
+
expect(body).not.toContain('== Summary ==');
|
|
208
|
+
expect(exitCodes).toContain(0);
|
|
209
|
+
});
|
|
210
|
+
it('JSON mode emits the signal envelope', async () => {
|
|
211
|
+
setupFixture(dir, { 'index.ts': `export function x(): number { return 1; }\n` });
|
|
212
|
+
const { cli, exitCodes } = makeCli();
|
|
213
|
+
await runExecuteGraph({ cwd: dir, json: true }, cli);
|
|
214
|
+
const parsed = JSON.parse(stdout);
|
|
215
|
+
expect(parsed.tool).toBe('graph');
|
|
216
|
+
expect(parsed.schemaVersion).toBe(2);
|
|
217
|
+
expect(Array.isArray(parsed.signals)).toBe(true);
|
|
218
|
+
expect(typeof parsed.verdict.passed).toBe('boolean');
|
|
219
|
+
expect(exitCodes).toContain(0);
|
|
220
|
+
});
|
|
221
|
+
it('--gate-save writes a baseline to the SQLite store', async () => {
|
|
222
|
+
setupFixture(dir, {
|
|
223
|
+
'index.ts': `function unused(): number { return 1; }\nexport function main(): void {}\n`,
|
|
224
|
+
});
|
|
225
|
+
const { cli, exitCodes, render } = makeCli();
|
|
226
|
+
await runExecuteGraph({ cwd: dir, gateSave: true }, cli);
|
|
227
|
+
expect(renderedLines(render)).toContain(`Graph baseline saved`);
|
|
228
|
+
expect(exitCodes).toContain(0);
|
|
229
|
+
});
|
|
230
|
+
it('--gate-compare returns PASS when current matches baseline (shared DataStore)', async () => {
|
|
231
|
+
setupFixture(dir, {
|
|
232
|
+
'index.ts': `function unused(): number { return 1; }\nexport function main(): void {}\n`,
|
|
233
|
+
});
|
|
234
|
+
const shared = makeCli();
|
|
235
|
+
await runExecuteGraph({ cwd: dir, gateSave: true }, shared.cli);
|
|
236
|
+
shared.render.mockClear();
|
|
237
|
+
await runExecuteGraph({ cwd: dir, gateCompare: true }, shared.cli);
|
|
238
|
+
expect(renderedLines(shared.render)).toContain('Graph gate PASS');
|
|
239
|
+
expect(shared.exitCodes).toContain(0);
|
|
240
|
+
});
|
|
241
|
+
it('--gate-compare reports FAIL when there are new findings (shared DataStore)', async () => {
|
|
242
|
+
setupFixture(dir, {
|
|
243
|
+
'index.ts': `export function main(): void {}\n`,
|
|
244
|
+
});
|
|
245
|
+
const shared = makeCli();
|
|
246
|
+
await runExecuteGraph({ cwd: dir, gateSave: true }, shared.cli);
|
|
247
|
+
// Mutate fixture to add an orphan
|
|
248
|
+
writeFileSync(join(dir, 'index.ts'), `function unused(): number { return 1; }\nexport function main(): void {}\n`, 'utf8');
|
|
249
|
+
shared.render.mockClear();
|
|
250
|
+
await runExecuteGraph({ cwd: dir, gateCompare: true, noCache: true }, shared.cli);
|
|
251
|
+
expect(renderedLines(shared.render)).toContain('Graph gate FAILED');
|
|
252
|
+
expect(shared.exitCodes).toContain(1);
|
|
253
|
+
});
|
|
254
|
+
it('errors when --gate-save and --gate-compare are passed together', async () => {
|
|
255
|
+
setupFixture(dir, { 'index.ts': `export function x(): number { return 1; }\n` });
|
|
256
|
+
const { cli, exitCodes } = makeCli();
|
|
257
|
+
await runExecuteGraph({ cwd: dir, gateSave: true, gateCompare: true }, cli);
|
|
258
|
+
expect(stderr).toContain('mutually exclusive');
|
|
259
|
+
expect(exitCodes).toContain(2);
|
|
260
|
+
});
|
|
261
|
+
it('maps a missing tsconfig.json to a configuration-error exit code', async () => {
|
|
262
|
+
// No tsconfig.json -> ConfigurationError surfaces
|
|
263
|
+
mkdirSync(dir, { recursive: true });
|
|
264
|
+
const { cli, exitCodes } = makeCli();
|
|
265
|
+
await runExecuteGraph({ cwd: dir }, cli);
|
|
266
|
+
expect(stderr).toContain('graph:');
|
|
267
|
+
expect(exitCodes).toContain(2);
|
|
268
|
+
});
|
|
269
|
+
it('--report-to returns the envelope for the root to deliver (ADR-0011)', async () => {
|
|
270
|
+
// Egress moved off executeGraph to the composition root (ADR-0011 Phase 5):
|
|
271
|
+
// executeGraph renders the report and RETURNS the envelope; the root's
|
|
272
|
+
// `cli.deliverSignals` owns cloud egress + the `--report-to` upload (and
|
|
273
|
+
// exit code 4). That exit-4 behaviour is covered in the CLI's
|
|
274
|
+
// envelope-routing tests — here we just assert the envelope is returned so
|
|
275
|
+
// the root has something to deliver.
|
|
276
|
+
setupFixture(dir, {
|
|
277
|
+
'index.ts': `function unused(): number { return 1; }\nexport function main(): void {}\n`,
|
|
278
|
+
});
|
|
279
|
+
const { cli, exitCodes } = makeCli();
|
|
280
|
+
// host-owned-run-timing Phase 3: executeGraph now returns a GraphRunOutcome
|
|
281
|
+
// ({ envelope?, session? }); the deliverable envelope is on `.envelope`.
|
|
282
|
+
const outcome = await runExecuteGraph({ cwd: dir, reportTo: 'http://127.0.0.1:1' }, cli);
|
|
283
|
+
expect(outcome?.envelope?.tool).toBe('graph');
|
|
284
|
+
expect(outcome?.envelope?.schemaVersion).toBe(2);
|
|
285
|
+
expect(exitCodes).toContain(0);
|
|
286
|
+
});
|
|
287
|
+
it('errors when --workspace and positional paths are passed together', async () => {
|
|
288
|
+
setupFixture(dir, { 'index.ts': `export function x(): number { return 1; }\n` });
|
|
289
|
+
const { cli, exitCodes } = makeCli();
|
|
290
|
+
await runExecuteGraph({ cwd: dir, paths: ['foo'], workspace: true }, cli);
|
|
291
|
+
expect(stderr).toContain('mutually exclusive');
|
|
292
|
+
expect(exitCodes).toContain(2);
|
|
293
|
+
});
|
|
294
|
+
it('errors when --workspace is passed but cliScript is empty', async () => {
|
|
295
|
+
setupFixture(dir, { 'index.ts': `export function x(): number { return 1; }\n` });
|
|
296
|
+
const { cli, exitCodes } = makeCli();
|
|
297
|
+
await runExecuteGraph({ cwd: dir, workspace: true, cliScript: '' }, cli);
|
|
298
|
+
expect(stderr).toContain('CLI entry script');
|
|
299
|
+
expect(exitCodes).toContain(2);
|
|
300
|
+
});
|
|
301
|
+
it('errors when --workspace is passed but no workspace units exist', async () => {
|
|
302
|
+
setupFixture(dir, { 'index.ts': `export function x(): number { return 1; }\n` });
|
|
303
|
+
const { cli, exitCodes } = makeCli();
|
|
304
|
+
// No packages/** dir exists — discoverWorkspaceUnits returns [].
|
|
305
|
+
await runExecuteGraph({ cwd: dir, workspace: true, cliScript: '/usr/bin/node' }, cli);
|
|
306
|
+
expect(stderr).toContain('no workspace units');
|
|
307
|
+
expect(exitCodes).toContain(2);
|
|
308
|
+
});
|
|
309
|
+
it('positional <relative dir> scopes to a sub-package directory', async () => {
|
|
310
|
+
// Create a nested package layout: cwd has its own tsconfig and the
|
|
311
|
+
// sub-package has its own. Pass a positional path.
|
|
312
|
+
setupFixture(dir, { 'index.ts': `export function x(): number { return 1; }\n` });
|
|
313
|
+
mkdirSync(join(dir, 'packages', 'inner'), { recursive: true });
|
|
314
|
+
writeFileSync(join(dir, 'packages', 'inner', 'tsconfig.json'), FIXTURE_TSCONFIG, 'utf8');
|
|
315
|
+
writeFileSync(join(dir, 'packages', 'inner', 'main.ts'), `export function fromInner(): number { return 1; }\n`, 'utf8');
|
|
316
|
+
const { cli, exitCodes } = makeCli();
|
|
317
|
+
await runExecuteGraph({ cwd: dir, paths: [join(dir, 'packages', 'inner')], json: true }, cli);
|
|
318
|
+
const parsed = JSON.parse(stdout);
|
|
319
|
+
expect(parsed.tool).toBe('graph');
|
|
320
|
+
expect(exitCodes).toContain(0);
|
|
321
|
+
});
|
|
322
|
+
it('--report-to with no findings renders the report and returns the envelope', async () => {
|
|
323
|
+
// A clean run still returns an envelope (the root may still cloud-emit it);
|
|
324
|
+
// executeGraph renders the normal graph report rather than a bespoke
|
|
325
|
+
// "report sent" status line now that delivery lives at the root.
|
|
326
|
+
setupFixture(dir, { 'index.ts': `export function x(): number { return 1; }\n` });
|
|
327
|
+
const { cli, exitCodes, render } = makeCli();
|
|
328
|
+
const outcome = await runExecuteGraph({ cwd: dir, reportTo: 'http://127.0.0.1:1' }, cli);
|
|
329
|
+
const done = render.mock.calls[0]?.[0];
|
|
330
|
+
expect(done.type).toBe('graph-done');
|
|
331
|
+
expect(outcome?.envelope?.tool).toBe('graph');
|
|
332
|
+
expect(outcome?.envelope?.verdict.passed).toBe(true);
|
|
333
|
+
expect(exitCodes).toContain(0);
|
|
334
|
+
});
|
|
335
|
+
it('--workspace runs successfully across discovered workspace units', async () => {
|
|
336
|
+
// Set up a packages/** layout and run --packages. Use a CLI script
|
|
337
|
+
// that prints a known JSON shape so the parent's parsing path is
|
|
338
|
+
// exercised. We use `node -e ...` indirectly by pointing cliScript
|
|
339
|
+
// at a tiny helper script written into the fixture.
|
|
340
|
+
setupFixture(dir, { 'index.ts': `export function x(): number { return 1; }\n` });
|
|
341
|
+
// Two packages with tsconfigs.
|
|
342
|
+
mkdirSync(join(dir, 'packages', 'a'), { recursive: true });
|
|
343
|
+
mkdirSync(join(dir, 'packages', 'b'), { recursive: true });
|
|
344
|
+
writeFileSync(join(dir, 'packages', 'a', 'tsconfig.json'), FIXTURE_TSCONFIG, 'utf8');
|
|
345
|
+
writeFileSync(join(dir, 'packages', 'a', 'main.ts'), `export function a(): number { return 1; }\n`, 'utf8');
|
|
346
|
+
writeFileSync(join(dir, 'packages', 'b', 'tsconfig.json'), FIXTURE_TSCONFIG, 'utf8');
|
|
347
|
+
writeFileSync(join(dir, 'packages', 'b', 'main.ts'), `export function b(): number { return 1; }\n`, 'utf8');
|
|
348
|
+
// Helper script that pretends to be the CLI for child invocations:
|
|
349
|
+
// takes the graph subcommand args, ignores them, and emits an empty
|
|
350
|
+
// SignalEnvelope JSON document (ADR-0011 — the parent parses .signals).
|
|
351
|
+
const helper = join(dir, 'fake-cli.cjs');
|
|
352
|
+
writeFileSync(helper, `process.stdout.write(JSON.stringify({\n` +
|
|
353
|
+
` schemaVersion: 2, tool: 'graph', recipe: 'graph',\n` +
|
|
354
|
+
` runId: 'r', createdAt: new Date().toISOString(),\n` +
|
|
355
|
+
` verdict: { score: 100, passed: true, summary: { total: 0, passed: 0, failed: 0, errors: 0, warnings: 0 } },\n` +
|
|
356
|
+
` units: [], signals: []\n` +
|
|
357
|
+
`}));\n` +
|
|
358
|
+
`process.exit(0);\n`, 'utf8');
|
|
359
|
+
const { cli, exitCodes } = makeCli();
|
|
360
|
+
await runExecuteGraph({
|
|
361
|
+
cwd: dir,
|
|
362
|
+
workspace: true,
|
|
363
|
+
cliScript: helper,
|
|
364
|
+
json: true,
|
|
365
|
+
concurrency: 1,
|
|
366
|
+
}, cli);
|
|
367
|
+
const parsed = JSON.parse(stdout);
|
|
368
|
+
expect(parsed.tool).toBe('graph');
|
|
369
|
+
expect(parsed.mode).toBe('workspace');
|
|
370
|
+
expect(parsed.units.length).toBeGreaterThanOrEqual(2);
|
|
371
|
+
expect(exitCodes).toContain(0);
|
|
372
|
+
});
|
|
373
|
+
it('--workspace text report renders status + findings sections', async () => {
|
|
374
|
+
setupFixture(dir, { 'index.ts': `export function x(): number { return 1; }\n` });
|
|
375
|
+
mkdirSync(join(dir, 'packages', 'a'), { recursive: true });
|
|
376
|
+
writeFileSync(join(dir, 'packages', 'a', 'tsconfig.json'), FIXTURE_TSCONFIG, 'utf8');
|
|
377
|
+
writeFileSync(join(dir, 'packages', 'a', 'main.ts'), `export function a(): number { return 1; }\n`, 'utf8');
|
|
378
|
+
// Helper that emits one signal so the findings section renders (ADR-0011 —
|
|
379
|
+
// the parent parses .signals off the child's SignalEnvelope stdout).
|
|
380
|
+
const helper = join(dir, 'fake-cli.cjs');
|
|
381
|
+
writeFileSync(helper, `process.stdout.write(JSON.stringify({\n` +
|
|
382
|
+
` schemaVersion: 2, tool: 'graph', recipe: 'graph',\n` +
|
|
383
|
+
` runId: 'r', createdAt: new Date().toISOString(),\n` +
|
|
384
|
+
` verdict: { score: 50, passed: false, summary: { total: 1, passed: 0, failed: 1, errors: 0, warnings: 1 } },\n` +
|
|
385
|
+
` units: [{ slug: 'graph.dead-code.orphan-subtree', passed: true, durationMs: 0 }],\n` +
|
|
386
|
+
` signals: [{ id: 's1', source: 'graph.dead-code.orphan-subtree', provider: 'opensip-cli', severity: 'low', category: 'quality', ruleId: 'graph.dead-code.orphan-subtree', message: 'orphan x', filePath: 'main.ts', line: 1, column: 1, metadata: {}, createdAt: new Date().toISOString() }]\n` +
|
|
387
|
+
`}));\n` +
|
|
388
|
+
`process.exit(0);\n`, 'utf8');
|
|
389
|
+
const { cli, exitCodes, render } = makeCli();
|
|
390
|
+
await runExecuteGraph({ cwd: dir, workspace: true, cliScript: helper, concurrency: 1 }, cli);
|
|
391
|
+
const out = renderedLines(render);
|
|
392
|
+
expect(out).toContain('opensip graph --workspace');
|
|
393
|
+
expect(out).toContain('== Units');
|
|
394
|
+
expect(out).toContain('== Findings ==');
|
|
395
|
+
expect(out).toContain('orphan x');
|
|
396
|
+
expect(exitCodes).toContain(0);
|
|
397
|
+
});
|
|
398
|
+
// NOTE: the "gate mode without a DataStore" guard moved to the host seam
|
|
399
|
+
// (getOrOpenDatastore / the BaselineRepo construction) in ADR-0036 — graph's
|
|
400
|
+
// runGateMode no longer resolves the datastore itself. That missing-store
|
|
401
|
+
// behavior is now covered host-side, so the former graph-typescript test for it
|
|
402
|
+
// was removed here.
|
|
403
|
+
it('--workspace surfaces child failure as a runtime-error exit code', async () => {
|
|
404
|
+
setupFixture(dir, { 'index.ts': `export function x(): number { return 1; }\n` });
|
|
405
|
+
mkdirSync(join(dir, 'packages', 'a'), { recursive: true });
|
|
406
|
+
writeFileSync(join(dir, 'packages', 'a', 'tsconfig.json'), FIXTURE_TSCONFIG, 'utf8');
|
|
407
|
+
writeFileSync(join(dir, 'packages', 'a', 'main.ts'), `export function a(): number { return 1; }\n`, 'utf8');
|
|
408
|
+
// Failing helper: writes some stderr + exits 1.
|
|
409
|
+
const helper = join(dir, 'failing-cli.cjs');
|
|
410
|
+
writeFileSync(helper, `process.stderr.write('boom\\n');\nprocess.exit(1);\n`, 'utf8');
|
|
411
|
+
const { cli, exitCodes } = makeCli();
|
|
412
|
+
await runExecuteGraph({ cwd: dir, workspace: true, cliScript: helper, concurrency: 1 }, cli);
|
|
413
|
+
expect(exitCodes).toContain(1);
|
|
414
|
+
expect(stderr).toContain('at least one unit run failed');
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
//# sourceMappingURL=graph-cli.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-cli.test.js","sourceRoot":"","sources":["../../src/__tests__/graph-cli.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for heap-preflight decision logic.
|
|
3
|
+
*
|
|
4
|
+
* The re-exec path is not exercised here — that requires spawning a
|
|
5
|
+
* real child process and is covered by manual smoke testing. These
|
|
6
|
+
* tests pin the pure decision functions so the policy thresholds
|
|
7
|
+
* (1000 → 8192, 2500 → 12288) can't drift silently.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=heap-preflight.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heap-preflight.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/heap-preflight.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for heap-preflight decision logic.
|
|
3
|
+
*
|
|
4
|
+
* The re-exec path is not exercised here — that requires spawning a
|
|
5
|
+
* real child process and is covered by manual smoke testing. These
|
|
6
|
+
* tests pin the pure decision functions so the policy thresholds
|
|
7
|
+
* (1000 → 8192, 2500 → 12288) can't drift silently.
|
|
8
|
+
*/
|
|
9
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
10
|
+
import { tmpdir } from 'node:os';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { RunScope, runWithScope, runWithScopeSync } from '@opensip-cli/core';
|
|
13
|
+
import { currentAdapterRegistry, graphTool } from '@opensip-cli/graph';
|
|
14
|
+
import { HEAP_TARGETS, decideHeapTargetMb, runHeapPreflight, systemHasMemoryFor, totalSystemMemoryMb, } from '@opensip-cli/graph/internal';
|
|
15
|
+
import { pythonGraphAdapter } from '@opensip-cli/graph-python';
|
|
16
|
+
import { rustGraphAdapter } from '@opensip-cli/graph-rust';
|
|
17
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
18
|
+
import { typescriptGraphAdapter } from '../index.js';
|
|
19
|
+
describe('decideHeapTargetMb', () => {
|
|
20
|
+
it('returns null below the lowest threshold', () => {
|
|
21
|
+
expect(decideHeapTargetMb(0)).toBeNull();
|
|
22
|
+
expect(decideHeapTargetMb(999)).toBeNull();
|
|
23
|
+
expect(decideHeapTargetMb(1000)).toBeNull();
|
|
24
|
+
});
|
|
25
|
+
it('returns 8192 between the two thresholds (exclusive 1000, inclusive 2500)', () => {
|
|
26
|
+
expect(decideHeapTargetMb(1001)).toBe(8192);
|
|
27
|
+
expect(decideHeapTargetMb(2000)).toBe(8192);
|
|
28
|
+
expect(decideHeapTargetMb(2500)).toBe(8192);
|
|
29
|
+
});
|
|
30
|
+
it('returns 12288 above the upper threshold', () => {
|
|
31
|
+
expect(decideHeapTargetMb(2501)).toBe(12_288);
|
|
32
|
+
expect(decideHeapTargetMb(10_000)).toBe(12_288);
|
|
33
|
+
});
|
|
34
|
+
it('exposes thresholds in descending order so future additions stay correct', () => {
|
|
35
|
+
const thresholds = HEAP_TARGETS.map((t) => t.fileThreshold);
|
|
36
|
+
const sorted = [...thresholds].sort((a, b) => b - a);
|
|
37
|
+
expect(thresholds).toEqual(sorted);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe('systemHasMemoryFor', () => {
|
|
41
|
+
it('reports true for a tiny ask the system can clearly satisfy', () => {
|
|
42
|
+
expect(systemHasMemoryFor(64)).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
it('reports false for an impossibly large ask', () => {
|
|
45
|
+
const huge = totalSystemMemoryMb() + 1_000_000;
|
|
46
|
+
expect(systemHasMemoryFor(huge)).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
it('keeps a 2 GB OS headroom — denying asks that would consume all RAM', () => {
|
|
49
|
+
const totalMb = totalSystemMemoryMb();
|
|
50
|
+
// Ask for exactly total - 1 GB. The 2 GB headroom should refuse.
|
|
51
|
+
expect(systemHasMemoryFor(totalMb - 1024)).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe('runHeapPreflight', () => {
|
|
55
|
+
let dir;
|
|
56
|
+
let originalSentinel;
|
|
57
|
+
let scope;
|
|
58
|
+
beforeEach(() => {
|
|
59
|
+
dir = mkdtempSync(join(tmpdir(), 'graph-preflight-'));
|
|
60
|
+
mkdirSync(dir, { recursive: true });
|
|
61
|
+
// Empty tsconfig — discoverFiles must succeed without errors.
|
|
62
|
+
writeFileSync(join(dir, 'tsconfig.json'), JSON.stringify({ compilerOptions: { target: 'ES2022' }, include: ['**/*.ts'] }), 'utf8');
|
|
63
|
+
// Ensure at least one .ts file exists so the tsconfig is not empty.
|
|
64
|
+
writeFileSync(join(dir, 'index.ts'), 'export const x = 1;\n', 'utf8');
|
|
65
|
+
originalSentinel = process.env.OPENSIP_HEAP_ELEVATED;
|
|
66
|
+
// Item 1: adapter registry is per-RunScope. Construct a fresh
|
|
67
|
+
// scope, attach graph subscope, and register the adapters this test imports
|
|
68
|
+
// so runHeapPreflight()'s pickAdapter() resolves them.
|
|
69
|
+
scope = new RunScope();
|
|
70
|
+
Object.assign(scope, graphTool.contributeScope?.() ?? {});
|
|
71
|
+
runWithScopeSync(scope, () => {
|
|
72
|
+
currentAdapterRegistry().register(typescriptGraphAdapter);
|
|
73
|
+
currentAdapterRegistry().register(pythonGraphAdapter);
|
|
74
|
+
currentAdapterRegistry().register(rustGraphAdapter);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
afterEach(() => {
|
|
78
|
+
runWithScopeSync(scope, () => currentAdapterRegistry().clear());
|
|
79
|
+
rmSync(dir, { recursive: true, force: true });
|
|
80
|
+
if (originalSentinel === undefined) {
|
|
81
|
+
delete process.env.OPENSIP_HEAP_ELEVATED;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
process.env.OPENSIP_HEAP_ELEVATED = originalSentinel;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
function runScopedHeapPreflight(options) {
|
|
88
|
+
return runWithScope(scope, () => runHeapPreflight(options));
|
|
89
|
+
}
|
|
90
|
+
it('returns false (no-op) when SENTINEL is set (we are the elevated child)', async () => {
|
|
91
|
+
process.env.OPENSIP_HEAP_ELEVATED = '1';
|
|
92
|
+
const out = await runScopedHeapPreflight({ cwd: dir });
|
|
93
|
+
expect(out).toBe(false);
|
|
94
|
+
});
|
|
95
|
+
it('returns false when file count is below the lowest threshold', async () => {
|
|
96
|
+
delete process.env.OPENSIP_HEAP_ELEVATED;
|
|
97
|
+
// Fixture has zero .ts files so file count is 0.
|
|
98
|
+
const out = await runScopedHeapPreflight({ cwd: dir });
|
|
99
|
+
expect(out).toBe(false);
|
|
100
|
+
});
|
|
101
|
+
it('returns false when current heap already meets target', async () => {
|
|
102
|
+
delete process.env.OPENSIP_HEAP_ELEVATED;
|
|
103
|
+
// Mock decideHeapTargetMb indirectly by mocking pickAdapter to
|
|
104
|
+
// return more files than the threshold. Easiest: actually create
|
|
105
|
+
// many files. We use 1100 small files to exceed the 1000 threshold.
|
|
106
|
+
// To avoid a slow test, mock the discover stage by temporarily
|
|
107
|
+
// shimming pickAdapter via a test util — but we don't have that.
|
|
108
|
+
// Instead, write 1001 small files; small enough to be quick.
|
|
109
|
+
for (let i = 0; i < 1001; i++) {
|
|
110
|
+
writeFileSync(join(dir, `f${String(i)}.ts`), `export const x${String(i)} = ${String(i)};\n`, 'utf8');
|
|
111
|
+
}
|
|
112
|
+
// Default Node test heap is ~4096MB which exceeds the 8192 target
|
|
113
|
+
// ONLY if we crank it high. To force the "already elevated" branch,
|
|
114
|
+
// mock currentHeapLimitMb via vi: spy on v8.getHeapStatistics.
|
|
115
|
+
const v8 = await import('node:v8');
|
|
116
|
+
const spy = vi.spyOn(v8.default, 'getHeapStatistics').mockReturnValue({
|
|
117
|
+
total_heap_size: 0,
|
|
118
|
+
total_heap_size_executable: 0,
|
|
119
|
+
total_physical_size: 0,
|
|
120
|
+
total_available_size: 0,
|
|
121
|
+
used_heap_size: 0,
|
|
122
|
+
heap_size_limit: 64 * 1024 * 1024 * 1024, // 64 GB cap → already over 8192MB
|
|
123
|
+
malloced_memory: 0,
|
|
124
|
+
peak_malloced_memory: 0,
|
|
125
|
+
does_zap_garbage: 0,
|
|
126
|
+
number_of_native_contexts: 0,
|
|
127
|
+
number_of_detached_contexts: 0,
|
|
128
|
+
total_global_handles_size: 0,
|
|
129
|
+
used_global_handles_size: 0,
|
|
130
|
+
external_memory: 0,
|
|
131
|
+
});
|
|
132
|
+
try {
|
|
133
|
+
const out = await runScopedHeapPreflight({ cwd: dir });
|
|
134
|
+
expect(out).toBe(false); // already-elevated path
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
spy.mockRestore();
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
it('returns false when system has insufficient memory for elevated heap', async () => {
|
|
141
|
+
delete process.env.OPENSIP_HEAP_ELEVATED;
|
|
142
|
+
// Same setup: 1001 files crosses the 1000 threshold so a target of
|
|
143
|
+
// 8192MB is decided. To force the "insufficient memory" branch,
|
|
144
|
+
// mock os.totalmem to return very little.
|
|
145
|
+
for (let i = 0; i < 1001; i++) {
|
|
146
|
+
writeFileSync(join(dir, `f${String(i)}.ts`), `export const x${String(i)} = ${String(i)};\n`, 'utf8');
|
|
147
|
+
}
|
|
148
|
+
const os = await import('node:os');
|
|
149
|
+
const spy = vi.spyOn(os.default, 'totalmem').mockReturnValue(512 * 1024 * 1024); // 512 MB
|
|
150
|
+
let stderr = '';
|
|
151
|
+
const errSpy = vi.spyOn(process.stderr, 'write').mockImplementation((chunk) => {
|
|
152
|
+
stderr += typeof chunk === 'string' ? chunk : String(chunk);
|
|
153
|
+
return true;
|
|
154
|
+
});
|
|
155
|
+
try {
|
|
156
|
+
const out = await runScopedHeapPreflight({ cwd: dir });
|
|
157
|
+
expect(out).toBe(false);
|
|
158
|
+
expect(stderr).toContain('Continuing with current heap');
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
spy.mockRestore();
|
|
162
|
+
errSpy.mockRestore();
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
//# sourceMappingURL=heap-preflight.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heap-preflight.test.js","sourceRoot":"","sources":["../../src/__tests__/heap-preflight.test.ts"],"names":[],"mappings":"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"}
|