@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,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the TypeScript adapter's module-level depends_on edge
|
|
3
|
+
* emission. Phase 4 Task 4.2 of opensip's substrate consolidation
|
|
4
|
+
* (opensip DEC-498).
|
|
5
|
+
*
|
|
6
|
+
* Exercises the full adapter contract surface (discoverFiles →
|
|
7
|
+
* parseProject → walkProject → resolveCallSites) against a small
|
|
8
|
+
* fixture with internal + external imports, then asserts:
|
|
9
|
+
*
|
|
10
|
+
* 1. walkProject returns dependencySites populated with the right
|
|
11
|
+
* specifier + line + owner module-init bodyHash.
|
|
12
|
+
* 2. resolveCallSites returns dependenciesByOwner with a resolved
|
|
13
|
+
* target bodyHash for internal imports.
|
|
14
|
+
* 3. External package imports resolve to `to: []` (unresolved).
|
|
15
|
+
* 4. The specifier is preserved on every edge regardless of
|
|
16
|
+
* resolution.
|
|
17
|
+
*/
|
|
18
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
19
|
+
import { tmpdir } from 'node:os';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
import { ownerEdgeKey } from '@opensip-cli/graph';
|
|
22
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
23
|
+
import { typescriptGraphAdapter } from '../index.js';
|
|
24
|
+
const FIXTURE_TSCONFIG = JSON.stringify({
|
|
25
|
+
compilerOptions: {
|
|
26
|
+
target: 'ES2022',
|
|
27
|
+
module: 'Node16',
|
|
28
|
+
moduleResolution: 'Node16',
|
|
29
|
+
strict: true,
|
|
30
|
+
esModuleInterop: true,
|
|
31
|
+
skipLibCheck: true,
|
|
32
|
+
},
|
|
33
|
+
include: ['**/*.ts'],
|
|
34
|
+
});
|
|
35
|
+
let fixtureRoot;
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
fixtureRoot = mkdtempSync(join(tmpdir(), 'graph-ts-depends-on-'));
|
|
38
|
+
mkdirSync(join(fixtureRoot, 'src'), { recursive: true });
|
|
39
|
+
writeFileSync(join(fixtureRoot, 'tsconfig.json'), FIXTURE_TSCONFIG, 'utf8');
|
|
40
|
+
});
|
|
41
|
+
afterEach(() => {
|
|
42
|
+
rmSync(fixtureRoot, { recursive: true, force: true });
|
|
43
|
+
});
|
|
44
|
+
function writeFile(rel, content) {
|
|
45
|
+
writeFileSync(join(fixtureRoot, rel), content, 'utf8');
|
|
46
|
+
}
|
|
47
|
+
function findModuleInit(catalog, filePath) {
|
|
48
|
+
for (const occs of Object.values(catalog.functions)) {
|
|
49
|
+
for (const o of occs) {
|
|
50
|
+
if (o.kind === 'module-init' && o.filePath === filePath)
|
|
51
|
+
return o;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
async function runAdapter() {
|
|
57
|
+
const discovery = typescriptGraphAdapter.discoverFiles({
|
|
58
|
+
cwd: fixtureRoot,
|
|
59
|
+
});
|
|
60
|
+
const parsed = typescriptGraphAdapter.parseProject({
|
|
61
|
+
projectDirAbs: discovery.projectDirAbs,
|
|
62
|
+
files: discovery.files,
|
|
63
|
+
compilerOptions: discovery.compilerOptions,
|
|
64
|
+
resolutionMode: 'exact',
|
|
65
|
+
});
|
|
66
|
+
const walked = typescriptGraphAdapter.walkProject({
|
|
67
|
+
project: parsed.project,
|
|
68
|
+
projectDirAbs: discovery.projectDirAbs,
|
|
69
|
+
files: discovery.files,
|
|
70
|
+
});
|
|
71
|
+
// Build a minimal catalog from walked occurrences for the resolver
|
|
72
|
+
// to query against (matches the engine's pipeline: stage 1 inventory
|
|
73
|
+
// → stage 2 resolve).
|
|
74
|
+
const initialCatalog = {
|
|
75
|
+
version: '3.0',
|
|
76
|
+
tool: 'graph',
|
|
77
|
+
language: 'typescript',
|
|
78
|
+
builtAt: new Date().toISOString(),
|
|
79
|
+
cacheKey: 'test',
|
|
80
|
+
functions: walked.occurrences,
|
|
81
|
+
};
|
|
82
|
+
const resolved = await typescriptGraphAdapter.resolveCallSites({
|
|
83
|
+
project: parsed.project,
|
|
84
|
+
catalog: initialCatalog,
|
|
85
|
+
callSites: walked.callSites,
|
|
86
|
+
dependencySites: walked.dependencySites,
|
|
87
|
+
projectDirAbs: discovery.projectDirAbs,
|
|
88
|
+
resolutionMode: 'exact',
|
|
89
|
+
});
|
|
90
|
+
return { catalog: initialCatalog, dependenciesByOwner: resolved.dependenciesByOwner };
|
|
91
|
+
}
|
|
92
|
+
describe('TypeScript adapter — depends_on emission (Phase 4)', () => {
|
|
93
|
+
it('walks an ImportDeclaration as a dependency site on the importing file', async () => {
|
|
94
|
+
writeFile('src/greet.ts', `import { formatName } from './format.js';\nexport function greet(name: string): string { return formatName(name); }\n`);
|
|
95
|
+
writeFile('src/format.ts', `export function formatName(raw: string): string { return raw.trim(); }\n`);
|
|
96
|
+
const { catalog, dependenciesByOwner } = await runAdapter();
|
|
97
|
+
const greetModuleInit = findModuleInit(catalog, 'src/greet.ts');
|
|
98
|
+
const formatModuleInit = findModuleInit(catalog, 'src/format.ts');
|
|
99
|
+
expect(greetModuleInit, 'greet module-init').toBeDefined();
|
|
100
|
+
expect(formatModuleInit, 'format module-init').toBeDefined();
|
|
101
|
+
expect(dependenciesByOwner, 'dependenciesByOwner').toBeDefined();
|
|
102
|
+
const greetDeps = dependenciesByOwner.get(ownerEdgeKey(greetModuleInit.bodyHash, greetModuleInit.filePath));
|
|
103
|
+
expect(greetDeps, 'greet has dependency edges').toHaveLength(1);
|
|
104
|
+
expect(greetDeps[0].specifier).toBe('./format.js');
|
|
105
|
+
expect(greetDeps[0].to).toEqual([formatModuleInit.bodyHash]);
|
|
106
|
+
expect(greetDeps[0].line).toBe(1);
|
|
107
|
+
});
|
|
108
|
+
it('emits an unresolved edge for external package imports', async () => {
|
|
109
|
+
writeFile('src/greet.ts', `import { something } from '@opensip-cli/nonexistent-pkg';\nexport function greet(): string { return String(something); }\n`);
|
|
110
|
+
const { catalog, dependenciesByOwner } = await runAdapter();
|
|
111
|
+
const greetModuleInit = findModuleInit(catalog, 'src/greet.ts');
|
|
112
|
+
expect(greetModuleInit).toBeDefined();
|
|
113
|
+
const greetDeps = dependenciesByOwner.get(ownerEdgeKey(greetModuleInit.bodyHash, greetModuleInit.filePath));
|
|
114
|
+
expect(greetDeps).toHaveLength(1);
|
|
115
|
+
expect(greetDeps[0].specifier).toBe('@opensip-cli/nonexistent-pkg');
|
|
116
|
+
expect(greetDeps[0].to).toEqual([]);
|
|
117
|
+
});
|
|
118
|
+
it('preserves multiple imports as separate dependency edges', async () => {
|
|
119
|
+
writeFile('src/main.ts', [
|
|
120
|
+
`import { a } from './a.js';`,
|
|
121
|
+
`import { b } from './b.js';`,
|
|
122
|
+
`import { c } from '@external/pkg';`,
|
|
123
|
+
`export function main(): string { return a() + b() + String(c); }`,
|
|
124
|
+
'',
|
|
125
|
+
].join('\n'));
|
|
126
|
+
writeFile('src/a.ts', `export function a(): string { return 'a'; }\n`);
|
|
127
|
+
writeFile('src/b.ts', `export function b(): string { return 'b'; }\n`);
|
|
128
|
+
const { catalog, dependenciesByOwner } = await runAdapter();
|
|
129
|
+
const mainModuleInit = findModuleInit(catalog, 'src/main.ts');
|
|
130
|
+
expect(mainModuleInit).toBeDefined();
|
|
131
|
+
const deps = dependenciesByOwner.get(ownerEdgeKey(mainModuleInit.bodyHash, mainModuleInit.filePath));
|
|
132
|
+
expect(deps).toHaveLength(3);
|
|
133
|
+
const specifiers = deps.map((d) => d.specifier).sort();
|
|
134
|
+
expect(specifiers).toEqual(['./a.js', './b.js', '@external/pkg']);
|
|
135
|
+
const externalEdge = deps.find((d) => d.specifier === '@external/pkg');
|
|
136
|
+
expect(externalEdge.to).toEqual([]);
|
|
137
|
+
const aEdge = deps.find((d) => d.specifier === './a.js');
|
|
138
|
+
expect(aEdge.to).toHaveLength(1);
|
|
139
|
+
});
|
|
140
|
+
it('produces no dependency edges for a file with no imports', async () => {
|
|
141
|
+
writeFile('src/standalone.ts', `export function standalone(): number { return 42; }\n`);
|
|
142
|
+
const { catalog, dependenciesByOwner } = await runAdapter();
|
|
143
|
+
const standaloneModuleInit = findModuleInit(catalog, 'src/standalone.ts');
|
|
144
|
+
expect(standaloneModuleInit).toBeDefined();
|
|
145
|
+
// No dependency edges → owner not in the map at all.
|
|
146
|
+
const deps = dependenciesByOwner?.get(ownerEdgeKey(standaloneModuleInit.bodyHash, standaloneModuleInit.filePath));
|
|
147
|
+
expect(deps).toBeUndefined();
|
|
148
|
+
});
|
|
149
|
+
it('captures import line numbers (1-based) for source attribution', async () => {
|
|
150
|
+
writeFile('src/multiline.ts', [
|
|
151
|
+
`// header comment`,
|
|
152
|
+
`// second comment`,
|
|
153
|
+
`import { x } from './other.js';`,
|
|
154
|
+
`export function fn(): unknown { return x; }`,
|
|
155
|
+
'',
|
|
156
|
+
].join('\n'));
|
|
157
|
+
writeFile('src/other.ts', `export const x = 1;\n`);
|
|
158
|
+
const { catalog, dependenciesByOwner } = await runAdapter();
|
|
159
|
+
const moduleInit = findModuleInit(catalog, 'src/multiline.ts');
|
|
160
|
+
const deps = dependenciesByOwner.get(ownerEdgeKey(moduleInit.bodyHash, moduleInit.filePath));
|
|
161
|
+
expect(deps).toHaveLength(1);
|
|
162
|
+
expect(deps[0].line).toBe(3);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=depends-on-emission.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"depends-on-emission.test.js","sourceRoot":"","sources":["../../src/__tests__/depends-on-emission.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 0 discovery (discover.ts).
|
|
3
|
+
*
|
|
4
|
+
* Covers tsconfig resolution (default path, explicit relative override,
|
|
5
|
+
* explicit ABSOLUTE override), the missing-config error, and the
|
|
6
|
+
* source-file filter (drops non-.ts/.tsx and .d.ts, dedups, sorts).
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=discover.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/discover.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 0 discovery (discover.ts).
|
|
3
|
+
*
|
|
4
|
+
* Covers tsconfig resolution (default path, explicit relative override,
|
|
5
|
+
* explicit ABSOLUTE override), the missing-config error, and the
|
|
6
|
+
* source-file filter (drops non-.ts/.tsx and .d.ts, dedups, sorts).
|
|
7
|
+
*/
|
|
8
|
+
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { tmpdir } from 'node:os';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { ConfigurationError } from '@opensip-cli/core';
|
|
12
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
13
|
+
import { discoverFiles } from '../discover.js';
|
|
14
|
+
const TSCONFIG = JSON.stringify({
|
|
15
|
+
compilerOptions: {
|
|
16
|
+
target: 'ES2022',
|
|
17
|
+
module: 'Node16',
|
|
18
|
+
moduleResolution: 'Node16',
|
|
19
|
+
strict: true,
|
|
20
|
+
rootDir: '.',
|
|
21
|
+
},
|
|
22
|
+
include: ['**/*.ts', '**/*.tsx'],
|
|
23
|
+
});
|
|
24
|
+
describe('discoverFiles', () => {
|
|
25
|
+
let dir;
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
dir = mkdtempSync(join(tmpdir(), 'graph-ts-discover-'));
|
|
28
|
+
});
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
rmSync(dir, { recursive: true, force: true });
|
|
31
|
+
});
|
|
32
|
+
it('resolves the default tsconfig.json and returns project source files', () => {
|
|
33
|
+
writeFileSync(join(dir, 'tsconfig.json'), TSCONFIG, 'utf8');
|
|
34
|
+
writeFileSync(join(dir, 'a.ts'), 'export const a = 1;\n', 'utf8');
|
|
35
|
+
writeFileSync(join(dir, 'b.tsx'), 'export const b = 2;\n', 'utf8');
|
|
36
|
+
const out = discoverFiles({ projectDir: dir });
|
|
37
|
+
expect(out.tsConfigPathAbs.endsWith('tsconfig.json')).toBe(true);
|
|
38
|
+
expect(out.files.some((f) => f.endsWith('a.ts'))).toBe(true);
|
|
39
|
+
expect(out.files.some((f) => f.endsWith('b.tsx'))).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
it('drops .d.ts files and non-TypeScript files from the source set', () => {
|
|
42
|
+
writeFileSync(join(dir, 'tsconfig.json'), TSCONFIG, 'utf8');
|
|
43
|
+
writeFileSync(join(dir, 'keep.ts'), 'export const k = 1;\n', 'utf8');
|
|
44
|
+
writeFileSync(join(dir, 'types.d.ts'), 'export declare const t: number;\n', 'utf8');
|
|
45
|
+
writeFileSync(join(dir, 'readme.md'), '# not a source file\n', 'utf8');
|
|
46
|
+
writeFileSync(join(dir, 'data.json'), '{}\n', 'utf8');
|
|
47
|
+
const out = discoverFiles({ projectDir: dir });
|
|
48
|
+
expect(out.files.some((f) => f.endsWith('keep.ts'))).toBe(true);
|
|
49
|
+
expect(out.files.some((f) => f.endsWith('.d.ts'))).toBe(false);
|
|
50
|
+
expect(out.files.some((f) => f.endsWith('.md'))).toBe(false);
|
|
51
|
+
expect(out.files.some((f) => f.endsWith('.json'))).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
it('accepts an explicit RELATIVE tsConfigPath override', () => {
|
|
54
|
+
writeFileSync(join(dir, 'custom.tsconfig.json'), TSCONFIG, 'utf8');
|
|
55
|
+
writeFileSync(join(dir, 'a.ts'), 'export const a = 1;\n', 'utf8');
|
|
56
|
+
const out = discoverFiles({ projectDir: dir, tsConfigPath: 'custom.tsconfig.json' });
|
|
57
|
+
expect(out.tsConfigPathAbs.endsWith('custom.tsconfig.json')).toBe(true);
|
|
58
|
+
expect(out.files.some((f) => f.endsWith('a.ts'))).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it('accepts an explicit ABSOLUTE tsConfigPath override', () => {
|
|
61
|
+
const absConfig = join(dir, 'abs.tsconfig.json');
|
|
62
|
+
writeFileSync(absConfig, TSCONFIG, 'utf8');
|
|
63
|
+
writeFileSync(join(dir, 'a.ts'), 'export const a = 1;\n', 'utf8');
|
|
64
|
+
const out = discoverFiles({ projectDir: dir, tsConfigPath: absConfig });
|
|
65
|
+
expect(out.tsConfigPathAbs.endsWith('abs.tsconfig.json')).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
it('throws ConfigurationError when the tsconfig does not exist', () => {
|
|
68
|
+
// No tsconfig.json written into `dir`.
|
|
69
|
+
expect(() => discoverFiles({ projectDir: dir })).toThrow(ConfigurationError);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=discover.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.test.js","sourceRoot":"","sources":["../../src/__tests__/discover.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for methodTargetFile — the type-attested cross-package method
|
|
3
|
+
* target resolver. Builds a REAL `ts.Program` over temp fixtures so the checker
|
|
4
|
+
* resolves a method call's callee to a `dist/*.d.ts` declaration (the cross-
|
|
5
|
+
* package boundary case) vs a source / non-dist declaration (decline).
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=method-target.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"method-target.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/edge-helpers/method-target.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for methodTargetFile — the type-attested cross-package method
|
|
3
|
+
* target resolver. Builds a REAL `ts.Program` over temp fixtures so the checker
|
|
4
|
+
* resolves a method call's callee to a `dist/*.d.ts` declaration (the cross-
|
|
5
|
+
* package boundary case) vs a source / non-dist declaration (decline).
|
|
6
|
+
*/
|
|
7
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
8
|
+
import { tmpdir } from 'node:os';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import ts from 'typescript';
|
|
11
|
+
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
|
12
|
+
import { methodTargetFile } from '../../edge-helpers/method-target.js';
|
|
13
|
+
describe('methodTargetFile', () => {
|
|
14
|
+
let root;
|
|
15
|
+
let checker;
|
|
16
|
+
const calls = new Map();
|
|
17
|
+
beforeAll(() => {
|
|
18
|
+
root = mkdtempSync(join(tmpdir(), 'method-target-'));
|
|
19
|
+
mkdirSync(join(root, 'packages', 'lib', 'dist'), { recursive: true });
|
|
20
|
+
mkdirSync(join(root, 'packages', 'lib', 'types'), { recursive: true });
|
|
21
|
+
mkdirSync(join(root, 'packages', 'app', 'src'), { recursive: true });
|
|
22
|
+
// A workspace package's BUILT dist `.d.ts` (the cross-package boundary case).
|
|
23
|
+
// `Ctx` is an INTERFACE: its member has no body, so the linker's occurrence
|
|
24
|
+
// pin will find no concrete target — the polymorphic-dispatch decline class.
|
|
25
|
+
writeFileSync(join(root, 'packages', 'lib', 'dist', 'registry.d.ts'), [
|
|
26
|
+
'export declare class R { getAll(): void; }',
|
|
27
|
+
'export interface Ctx { setExitCode(code: number): void; }',
|
|
28
|
+
'',
|
|
29
|
+
].join('\n'));
|
|
30
|
+
// A `.d.ts` NOT under /dist/ (e.g. a hand-authored ambient) → must decline.
|
|
31
|
+
writeFileSync(join(root, 'packages', 'lib', 'types', 'amb.d.ts'), 'export declare class A { ambient(): void; }\n');
|
|
32
|
+
const callerPath = join(root, 'packages', 'app', 'src', 'caller.ts');
|
|
33
|
+
writeFileSync(callerPath, [
|
|
34
|
+
`import type { Ctx, R } from '../../lib/dist/registry.js';`,
|
|
35
|
+
`import type { A } from '../../lib/types/amb.js';`,
|
|
36
|
+
`declare const r: R;`,
|
|
37
|
+
`declare const ctx: Ctx;`,
|
|
38
|
+
`declare const a: A;`,
|
|
39
|
+
`class Local { foo(): void {} }`,
|
|
40
|
+
`function caller(): void {`,
|
|
41
|
+
` r.getAll();`, // cross-package dist method → maps to source
|
|
42
|
+
` ctx.setExitCode(0);`, // INTERFACE-attested → maps to source; linker declines
|
|
43
|
+
` a.ambient();`, // .d.ts but not /dist/ → decline
|
|
44
|
+
` new Local().foo();`, // SOURCE decl → decline (in-shard handles it)
|
|
45
|
+
` plain();`, // not a property access → decline
|
|
46
|
+
`}`,
|
|
47
|
+
`function plain(): void {}`,
|
|
48
|
+
`caller();`,
|
|
49
|
+
].join('\n'));
|
|
50
|
+
const program = ts.createProgram([callerPath], {
|
|
51
|
+
module: ts.ModuleKind.NodeNext,
|
|
52
|
+
moduleResolution: ts.ModuleResolutionKind.NodeNext,
|
|
53
|
+
target: ts.ScriptTarget.ES2022,
|
|
54
|
+
strict: true,
|
|
55
|
+
});
|
|
56
|
+
checker = program.getTypeChecker();
|
|
57
|
+
const sf = program.getSourceFile(callerPath);
|
|
58
|
+
if (sf === undefined)
|
|
59
|
+
throw new Error('fixture program produced no caller source file');
|
|
60
|
+
const calleeKey = (expr) => {
|
|
61
|
+
if (ts.isPropertyAccessExpression(expr))
|
|
62
|
+
return expr.name.text;
|
|
63
|
+
if (ts.isIdentifier(expr))
|
|
64
|
+
return expr.text;
|
|
65
|
+
return '?';
|
|
66
|
+
};
|
|
67
|
+
const visit = (n) => {
|
|
68
|
+
if (ts.isCallExpression(n))
|
|
69
|
+
calls.set(calleeKey(n.expression), n);
|
|
70
|
+
ts.forEachChild(n, visit);
|
|
71
|
+
};
|
|
72
|
+
visit(sf);
|
|
73
|
+
});
|
|
74
|
+
afterAll(() => rmSync(root, { recursive: true, force: true }));
|
|
75
|
+
it('maps a cross-package dist/*.d.ts method decl to its SOURCE file', () => {
|
|
76
|
+
expect(methodTargetFile(calls.get('getAll'), checker, root)).toBe('packages/lib/src/registry.ts');
|
|
77
|
+
});
|
|
78
|
+
it('maps an INTERFACE-attested method to its source file (the decline happens at the linker, not here)', () => {
|
|
79
|
+
// The polymorphic-dispatch class (ADR-0033 amendment #3/#4): the checker
|
|
80
|
+
// attests `ctx.setExitCode()` to an interface SIGNATURE in dist/*.d.ts.
|
|
81
|
+
// methodTargetFile still maps decl→source (it resolves FILES, not bodies);
|
|
82
|
+
// soundness is downstream — the cross-shard linker's file-scoped occurrence
|
|
83
|
+
// pin finds no concrete body for the name and DECLINES (never fabricates).
|
|
84
|
+
expect(methodTargetFile(calls.get('setExitCode'), checker, root)).toBe('packages/lib/src/registry.ts');
|
|
85
|
+
});
|
|
86
|
+
it('declines a `.d.ts` decl NOT under /dist/', () => {
|
|
87
|
+
expect(methodTargetFile(calls.get('ambient'), checker, root)).toBeNull();
|
|
88
|
+
});
|
|
89
|
+
it('declines a SOURCE-declared method (the in-shard/inline pass handles it)', () => {
|
|
90
|
+
expect(methodTargetFile(calls.get('foo'), checker, root)).toBeNull();
|
|
91
|
+
});
|
|
92
|
+
it('declines a plain (non-property-access) call', () => {
|
|
93
|
+
expect(methodTargetFile(calls.get('plain'), checker, root)).toBeNull();
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=method-target.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"method-target.test.js","sourceRoot":"","sources":["../../../src/__tests__/edge-helpers/method-target.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for resolveDeclToHash — the seam that maps a type-checker-resolved
|
|
3
|
+
* declaration to a catalog bodyHash, unifying in-project source hashing with the
|
|
4
|
+
* cross-package (`.d.ts` boundary) export-index resolution.
|
|
5
|
+
*
|
|
6
|
+
* The boundary branch is the heart of the exact↔sharded convergence fix: when
|
|
7
|
+
* the type checker leads a `@scope/pkg` call into the package's bodiless
|
|
8
|
+
* `dist/*.d.ts`, resolution re-routes through the SAME (import specifier + callee
|
|
9
|
+
* name) → unique exported SOURCE occurrence model the sharded linker uses —
|
|
10
|
+
* binding-required, so a name with no workspace import never resolves.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=resolve-decl.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-decl.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/edge-helpers/resolve-decl.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for resolveDeclToHash — the seam that maps a type-checker-resolved
|
|
3
|
+
* declaration to a catalog bodyHash, unifying in-project source hashing with the
|
|
4
|
+
* cross-package (`.d.ts` boundary) export-index resolution.
|
|
5
|
+
*
|
|
6
|
+
* The boundary branch is the heart of the exact↔sharded convergence fix: when
|
|
7
|
+
* the type checker leads a `@scope/pkg` call into the package's bodiless
|
|
8
|
+
* `dist/*.d.ts`, resolution re-routes through the SAME (import specifier + callee
|
|
9
|
+
* name) → unique exported SOURCE occurrence model the sharded linker uses —
|
|
10
|
+
* binding-required, so a name with no workspace import never resolves.
|
|
11
|
+
*/
|
|
12
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
13
|
+
import { tmpdir } from 'node:os';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
import { buildExportIndex, buildPackageManifestIndexFromRoots } from '@opensip-cli/graph';
|
|
16
|
+
import ts from 'typescript';
|
|
17
|
+
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
|
18
|
+
import { resolveDeclToHash } from '../../edge-helpers/resolve-decl.js';
|
|
19
|
+
const EXPORTED_HASH = 'aaaaaaaaaaaaaaaa';
|
|
20
|
+
function occ(simpleName, filePath, bodyHash) {
|
|
21
|
+
return {
|
|
22
|
+
bodyHash,
|
|
23
|
+
simpleName,
|
|
24
|
+
qualifiedName: `${filePath}.${simpleName}`,
|
|
25
|
+
filePath,
|
|
26
|
+
line: 1,
|
|
27
|
+
column: 0,
|
|
28
|
+
endLine: 1,
|
|
29
|
+
kind: 'function-declaration',
|
|
30
|
+
params: [],
|
|
31
|
+
returnType: null,
|
|
32
|
+
enclosingClass: null,
|
|
33
|
+
decorators: [],
|
|
34
|
+
visibility: 'exported',
|
|
35
|
+
inTestFile: false,
|
|
36
|
+
definedInGenerated: false,
|
|
37
|
+
calls: [],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** A bodiless `.d.ts` declaration node (the type checker's alias target). */
|
|
41
|
+
function dtsDecl() {
|
|
42
|
+
const sf = ts.createSourceFile('helper.d.ts', 'export declare function helper(): void;', ts.ScriptTarget.ES2022, true);
|
|
43
|
+
const [node] = sf.statements;
|
|
44
|
+
if (node === undefined)
|
|
45
|
+
throw new Error('fixture parse produced no statement');
|
|
46
|
+
return { node, sf };
|
|
47
|
+
}
|
|
48
|
+
describe('resolveDeclToHash — cross-package (.d.ts) boundary resolution', () => {
|
|
49
|
+
// A two-package workspace: `@scope/lib` exports `helper` (the target the
|
|
50
|
+
// catalog holds as SOURCE), `@scope/app` is the caller package.
|
|
51
|
+
const root = mkdtempSync(join(tmpdir(), 'resolve-decl-'));
|
|
52
|
+
const libDir = join(root, 'packages', 'lib');
|
|
53
|
+
const appDir = join(root, 'packages', 'app');
|
|
54
|
+
let crossPackage;
|
|
55
|
+
let catalog;
|
|
56
|
+
beforeAll(() => {
|
|
57
|
+
mkdirSync(libDir, { recursive: true });
|
|
58
|
+
mkdirSync(appDir, { recursive: true });
|
|
59
|
+
writeFileSync(join(libDir, 'package.json'), JSON.stringify({ name: '@scope/lib' }));
|
|
60
|
+
writeFileSync(join(appDir, 'package.json'), JSON.stringify({ name: '@scope/app' }));
|
|
61
|
+
catalog = {
|
|
62
|
+
version: '3.0',
|
|
63
|
+
tool: 'graph',
|
|
64
|
+
language: 'typescript',
|
|
65
|
+
builtAt: 'x',
|
|
66
|
+
cacheKey: 'k',
|
|
67
|
+
functions: {
|
|
68
|
+
helper: [occ('helper', 'packages/lib/src/helper.ts', EXPORTED_HASH)],
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
crossPackage = {
|
|
72
|
+
exportIndex: buildExportIndex(catalog),
|
|
73
|
+
manifestIndex: buildPackageManifestIndexFromRoots([libDir, appDir], root),
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
afterAll(() => {
|
|
77
|
+
rmSync(root, { recursive: true, force: true });
|
|
78
|
+
});
|
|
79
|
+
function ctxWith(importSpecifiers) {
|
|
80
|
+
return {
|
|
81
|
+
catalog,
|
|
82
|
+
// The program/checker/sourceFile are unused by the boundary branch.
|
|
83
|
+
program: undefined,
|
|
84
|
+
typeChecker: undefined,
|
|
85
|
+
sourceFile: undefined,
|
|
86
|
+
projectDirAbs: root,
|
|
87
|
+
crossPackage,
|
|
88
|
+
importSpecifiers,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
it('resolves a `.d.ts` decl to the SOURCE occurrence when the name is a workspace import', () => {
|
|
92
|
+
const { node, sf } = dtsDecl();
|
|
93
|
+
const ctx = ctxWith(new Map([['helper', '@scope/lib']]));
|
|
94
|
+
expect(resolveDeclToHash(node, sf, ['helper'], ctx)).toBe(EXPORTED_HASH);
|
|
95
|
+
});
|
|
96
|
+
it('declines a `.d.ts` decl with NO import binding (eliminates name-collision phantoms)', () => {
|
|
97
|
+
const { node, sf } = dtsDecl();
|
|
98
|
+
const ctx = ctxWith(new Map()); // `helper` not imported here
|
|
99
|
+
expect(resolveDeclToHash(node, sf, ['helper'], ctx)).toBeNull();
|
|
100
|
+
});
|
|
101
|
+
it('declines a `.d.ts` decl bound to an EXTERNAL package (not a workspace pkg)', () => {
|
|
102
|
+
const { node, sf } = dtsDecl();
|
|
103
|
+
const ctx = ctxWith(new Map([['helper', 'some-external-pkg']]));
|
|
104
|
+
expect(resolveDeclToHash(node, sf, ['helper'], ctx)).toBeNull();
|
|
105
|
+
});
|
|
106
|
+
it('uses a distinct binding name (namespace receiver) while looking up the callee name', () => {
|
|
107
|
+
const { node, sf } = dtsDecl();
|
|
108
|
+
// `ns` carries the workspace specifier; the exported callee name is `helper`.
|
|
109
|
+
const ctx = ctxWith(new Map([['ns', '@scope/lib']]));
|
|
110
|
+
expect(resolveDeclToHash(node, sf, ['helper'], ctx, ['helper', 'ns'])).toBe(EXPORTED_HASH);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe('resolveDeclToHash — intra-package .d.ts→source method pin', () => {
|
|
114
|
+
// A method call `recv.m()` whose receiver type flows through the OWNER
|
|
115
|
+
// package's OWN published `dist/*.d.ts` (so the checker attests the decl in the
|
|
116
|
+
// `.d.ts`, with NO import binding for the method name). The intra-package pin
|
|
117
|
+
// maps that dist decl back to its SOURCE occurrence — resolving in BOTH engines
|
|
118
|
+
// (the target is in-shard) — while a CROSS-package method target declines
|
|
119
|
+
// (symmetry: it lives in another shard the in-shard pass can't reach).
|
|
120
|
+
const root = mkdtempSync(join(tmpdir(), 'resolve-decl-dts-'));
|
|
121
|
+
const libDir = join(root, 'packages', 'lib');
|
|
122
|
+
const appDir = join(root, 'packages', 'app');
|
|
123
|
+
const GETALL_HASH = 'cccccccccccccccc';
|
|
124
|
+
let catalog;
|
|
125
|
+
let crossPackage;
|
|
126
|
+
beforeAll(() => {
|
|
127
|
+
mkdirSync(libDir, { recursive: true });
|
|
128
|
+
mkdirSync(appDir, { recursive: true });
|
|
129
|
+
writeFileSync(join(libDir, 'package.json'), JSON.stringify({ name: '@scope/lib' }));
|
|
130
|
+
writeFileSync(join(appDir, 'package.json'), JSON.stringify({ name: '@scope/app' }));
|
|
131
|
+
catalog = {
|
|
132
|
+
version: '3.0',
|
|
133
|
+
tool: 'graph',
|
|
134
|
+
language: 'typescript',
|
|
135
|
+
builtAt: 'x',
|
|
136
|
+
cacheKey: 'k',
|
|
137
|
+
functions: { getAll: [occ('getAll', 'packages/lib/src/registry.ts', GETALL_HASH)] },
|
|
138
|
+
};
|
|
139
|
+
crossPackage = {
|
|
140
|
+
exportIndex: buildExportIndex(catalog),
|
|
141
|
+
manifestIndex: buildPackageManifestIndexFromRoots([libDir, appDir], root),
|
|
142
|
+
};
|
|
143
|
+
});
|
|
144
|
+
afterAll(() => rmSync(root, { recursive: true, force: true }));
|
|
145
|
+
/** A bodiless `dist/*.d.ts` decl at `lib`'s built output. */
|
|
146
|
+
function libDistDecl() {
|
|
147
|
+
const sf = ts.createSourceFile(join(libDir, 'dist', 'registry.d.ts'), 'export declare class R { getAll(): void; }', ts.ScriptTarget.ES2022, true);
|
|
148
|
+
const [node] = sf.statements;
|
|
149
|
+
if (node === undefined)
|
|
150
|
+
throw new Error('fixture parse produced no statement');
|
|
151
|
+
return { node, sf };
|
|
152
|
+
}
|
|
153
|
+
/** ctx whose OWNER file is `ownerAbs` (no import binding → boundary path declines). */
|
|
154
|
+
function ctxOwnedBy(ownerAbs) {
|
|
155
|
+
return {
|
|
156
|
+
catalog,
|
|
157
|
+
program: undefined,
|
|
158
|
+
typeChecker: undefined,
|
|
159
|
+
sourceFile: { fileName: ownerAbs },
|
|
160
|
+
projectDirAbs: root,
|
|
161
|
+
crossPackage,
|
|
162
|
+
importSpecifiers: new Map(),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
it('resolves when the OWNER is in the SAME package as the dist decl', () => {
|
|
166
|
+
const { node, sf } = libDistDecl();
|
|
167
|
+
const ctx = ctxOwnedBy(join(libDir, 'src', 'caller.ts'));
|
|
168
|
+
expect(resolveDeclToHash(node, sf, ['getAll'], ctx)).toBe(GETALL_HASH);
|
|
169
|
+
});
|
|
170
|
+
it('declines when the OWNER is in a DIFFERENT package (cross-shard, left to the completeness floor)', () => {
|
|
171
|
+
const { node, sf } = libDistDecl();
|
|
172
|
+
const ctx = ctxOwnedBy(join(appDir, 'src', 'caller.ts'));
|
|
173
|
+
expect(resolveDeclToHash(node, sf, ['getAll'], ctx)).toBeNull();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
//# sourceMappingURL=resolve-decl.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-decl.test.js","sourceRoot":"","sources":["../../../src/__tests__/edge-helpers/resolve-decl.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branch-coverage tests for edge resolvers.
|
|
3
|
+
*
|
|
4
|
+
* Exercises the many `if (!narrowingX) return UNRESOLVED;` short-
|
|
5
|
+
* circuit branches in each resolver by running the full pipeline
|
|
6
|
+
* over targeted source-code fixtures. The acceptance tests cover the
|
|
7
|
+
* happy paths; this file covers the unresolvable / fallback paths
|
|
8
|
+
* that the contract test alone can't hit.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=branches.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branches.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/edge-resolvers/branches.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|