@platformos/platformos-graph 0.0.19 → 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.
Files changed (141) hide show
  1. package/CHANGELOG.md +516 -0
  2. package/bin/platformos-graph +21 -81
  3. package/dist/cache-probes.spec.d.ts +1 -0
  4. package/dist/cache-probes.spec.js +62 -0
  5. package/dist/cache-probes.spec.js.map +1 -0
  6. package/dist/cli.d.ts +46 -0
  7. package/dist/cli.js +131 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/cli.spec.d.ts +1 -0
  10. package/dist/cli.spec.js +235 -0
  11. package/dist/cli.spec.js.map +1 -0
  12. package/dist/graph/app-index-resolution.spec.d.ts +1 -0
  13. package/dist/graph/app-index-resolution.spec.js +167 -0
  14. package/dist/graph/app-index-resolution.spec.js.map +1 -0
  15. package/dist/graph/asset-resolution.spec.d.ts +1 -0
  16. package/dist/graph/asset-resolution.spec.js +64 -0
  17. package/dist/graph/asset-resolution.spec.js.map +1 -0
  18. package/dist/graph/augment.js +3 -1
  19. package/dist/graph/augment.js.map +1 -1
  20. package/dist/graph/build.d.ts +15 -2
  21. package/dist/graph/build.js +54 -12
  22. package/dist/graph/build.js.map +1 -1
  23. package/dist/graph/build.spec.d.ts +1 -0
  24. package/dist/graph/build.spec.js +138 -0
  25. package/dist/graph/build.spec.js.map +1 -0
  26. package/dist/graph/edge-sources.d.ts +28 -0
  27. package/dist/graph/edge-sources.js +43 -0
  28. package/dist/graph/edge-sources.js.map +1 -0
  29. package/dist/graph/edge-sources.spec.d.ts +1 -0
  30. package/dist/graph/edge-sources.spec.js +125 -0
  31. package/dist/graph/edge-sources.spec.js.map +1 -0
  32. package/dist/graph/extract.spec.d.ts +1 -0
  33. package/dist/graph/extract.spec.js +163 -0
  34. package/dist/graph/extract.spec.js.map +1 -0
  35. package/dist/graph/module.d.ts +70 -2
  36. package/dist/graph/module.js +164 -29
  37. package/dist/graph/module.js.map +1 -1
  38. package/dist/graph/module.spec.d.ts +1 -0
  39. package/dist/graph/module.spec.js +74 -0
  40. package/dist/graph/module.spec.js.map +1 -0
  41. package/dist/graph/query.d.ts +72 -0
  42. package/dist/graph/query.js +140 -0
  43. package/dist/graph/query.js.map +1 -0
  44. package/dist/graph/query.spec.d.ts +1 -0
  45. package/dist/graph/query.spec.js +209 -0
  46. package/dist/graph/query.spec.js.map +1 -0
  47. package/dist/graph/serialize.spec.d.ts +1 -0
  48. package/dist/graph/serialize.spec.js +50 -0
  49. package/dist/graph/serialize.spec.js.map +1 -0
  50. package/dist/graph/structural.spec.d.ts +1 -0
  51. package/dist/graph/structural.spec.js +146 -0
  52. package/dist/graph/structural.spec.js.map +1 -0
  53. package/dist/graph/test-helpers.d.ts +2 -3
  54. package/dist/graph/test-helpers.js +5 -9
  55. package/dist/graph/test-helpers.js.map +1 -1
  56. package/dist/graph/traverse-edges.spec.d.ts +1 -0
  57. package/dist/graph/traverse-edges.spec.js +337 -0
  58. package/dist/graph/traverse-edges.spec.js.map +1 -0
  59. package/dist/graph/traverse.d.ts +63 -4
  60. package/dist/graph/traverse.js +364 -49
  61. package/dist/graph/traverse.js.map +1 -1
  62. package/dist/index.d.ts +5 -1
  63. package/dist/index.js +21 -4
  64. package/dist/index.js.map +1 -1
  65. package/dist/parsers.d.ts +35 -0
  66. package/dist/parsers.js +72 -0
  67. package/dist/parsers.js.map +1 -0
  68. package/dist/parsers.spec.d.ts +1 -0
  69. package/dist/parsers.spec.js +70 -0
  70. package/dist/parsers.spec.js.map +1 -0
  71. package/dist/toSourceCode.d.ts +14 -2
  72. package/dist/toSourceCode.js +23 -19
  73. package/dist/toSourceCode.js.map +1 -1
  74. package/dist/tsconfig.tsbuildinfo +1 -1
  75. package/dist/types.d.ts +114 -20
  76. package/dist/types.js.map +1 -1
  77. package/dist/utils/index.d.ts +1 -1
  78. package/fixtures/asset-edges/app/assets/logo.css +1 -0
  79. package/fixtures/asset-edges/app/assets/site/app.js +1 -0
  80. package/fixtures/asset-edges/app/views/pages/index.liquid +3 -0
  81. package/fixtures/background-edges/app/views/pages/broken.liquid +3 -0
  82. package/fixtures/background-edges/app/views/pages/index.liquid +3 -0
  83. package/fixtures/background-edges/app/views/partials/jobs/notify.liquid +3 -0
  84. package/fixtures/function-edges/app/lib/queries/list.liquid +3 -0
  85. package/fixtures/function-edges/app/views/pages/broken.liquid +3 -0
  86. package/fixtures/function-edges/app/views/pages/index.liquid +3 -0
  87. package/fixtures/graphql-edges/app/graphql/blog_posts/find.graphql +10 -0
  88. package/fixtures/graphql-edges/app/views/pages/broken.liquid +3 -0
  89. package/fixtures/graphql-edges/app/views/pages/index.liquid +3 -0
  90. package/fixtures/graphql-table/app/graphql/with_table.graphql +5 -0
  91. package/fixtures/graphql-table/app/graphql/without_table.graphql +3 -0
  92. package/fixtures/graphql-table/app/views/pages/index.liquid +4 -0
  93. package/fixtures/include-edges/app/views/pages/index.liquid +1 -0
  94. package/fixtures/include-edges/app/views/partials/shared/header.liquid +1 -0
  95. package/fixtures/layout-edges/app/views/layouts/theme.liquid +4 -0
  96. package/fixtures/layout-edges/app/views/pages/broken.liquid +5 -0
  97. package/fixtures/layout-edges/app/views/pages/index.liquid +5 -0
  98. package/fixtures/module-edges/app/views/pages/index.liquid +4 -0
  99. package/fixtures/module-edges/modules/my_module/public/lib/queries/get.liquid +3 -0
  100. package/fixtures/module-edges/modules/my_module/public/views/partials/card.liquid +1 -0
  101. package/fixtures/schema-nodes/app/schema/blog_post.yml +6 -0
  102. package/fixtures/schema-nodes/app/schema/no_name.yml +3 -0
  103. package/fixtures/schema-nodes/app/views/pages/index.liquid +1 -0
  104. package/fixtures/skeleton/app/assets/app.js +1 -0
  105. package/fixtures/skeleton/app/views/partials/child.liquid +2 -4
  106. package/fixtures/skeleton/app/views/partials/parent.liquid +2 -4
  107. package/fixtures/structural/app/views/pages/about.liquid +1 -0
  108. package/fixtures/structural/app/views/pages/blog/show.liquid +4 -0
  109. package/fixtures/structural/app/views/pages/index.liquid +6 -0
  110. package/fixtures/structural/app/views/pages/rich.liquid +8 -0
  111. package/fixtures/structural/app/views/partials/card.liquid +1 -0
  112. package/fixtures/structural/app/views/partials/documented.liquid +5 -0
  113. package/package.json +7 -5
  114. package/src/cli.spec.ts +271 -0
  115. package/src/cli.ts +167 -0
  116. package/src/graph/augment.ts +4 -2
  117. package/src/graph/build.spec.ts +888 -9
  118. package/src/graph/build.ts +68 -17
  119. package/src/graph/edge-sources.spec.ts +125 -0
  120. package/src/graph/edge-sources.ts +49 -0
  121. package/src/graph/module.spec.ts +168 -0
  122. package/src/graph/module.ts +167 -33
  123. package/src/graph/query.spec.ts +260 -0
  124. package/src/graph/query.ts +154 -0
  125. package/src/graph/serialize.spec.ts +4 -4
  126. package/src/graph/test-helpers.ts +5 -12
  127. package/src/graph/traverse.spec.ts +278 -0
  128. package/src/graph/traverse.ts +423 -54
  129. package/src/index.ts +16 -1
  130. package/src/parsers.spec.ts +85 -0
  131. package/src/parsers.ts +75 -0
  132. package/src/toSourceCode.ts +26 -26
  133. package/src/types.ts +120 -23
  134. package/src/utils/index.ts +1 -1
  135. package/bin/jsconfig.json +0 -18
  136. package/dist/getWebComponentMap.d.ts +0 -10
  137. package/dist/getWebComponentMap.js +0 -66
  138. package/dist/getWebComponentMap.js.map +0 -1
  139. package/fixtures/skeleton/assets/app.js +0 -7
  140. package/src/getWebComponentMap.ts +0 -81
  141. /package/fixtures/skeleton/{assets → app/assets}/app.css +0 -0
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const platformos_check_common_1 = require("@platformos/platformos-check-common");
4
+ const vitest_1 = require("vitest");
5
+ const vscode_uri_1 = require("vscode-uri");
6
+ const index_1 = require("../index");
7
+ const test_helpers_1 = require("./test-helpers");
8
+ /**
9
+ * TASK-9.3 (+ code-review F1): a Liquid file's own structural declarations.
10
+ *
11
+ * `extractStructural` is the per-file primitive (sibling to
12
+ * `extractFileReferences`). A full `buildAppGraph` populates
13
+ * `LiquidModule.structural` from it ONLY when `{ includeStructural: true }` is
14
+ * passed — the opt-in that keeps a full build (e.g. the LSP's) from computing a
15
+ * fact nothing reads.
16
+ */
17
+ (0, vitest_1.describe)('Self-structural: page routing + AST usage facts', () => {
18
+ const rootUri = platformos_check_common_1.path.join(test_helpers_1.fixturesRoot, 'structural');
19
+ const p = (part) => platformos_check_common_1.path.join(rootUri, ...part.split('/'));
20
+ let graph;
21
+ const structuralOf = (uri) => {
22
+ const module = graph.modules[uri];
23
+ (0, vitest_1.assert)(module);
24
+ (0, vitest_1.assert)(module.type === "Liquid" /* ModuleType.Liquid */);
25
+ return module.structural;
26
+ };
27
+ /** The empty usage arrays — spread into expectations so each asserts the whole object. */
28
+ const NO_USAGE = {
29
+ renders_used: [],
30
+ graphql_queries_used: [],
31
+ filters_used: [],
32
+ tags_used: [],
33
+ translation_keys: [],
34
+ doc_params: [],
35
+ };
36
+ (0, vitest_1.beforeAll)(async () => {
37
+ graph = await (0, index_1.buildAppGraph)(rootUri, (0, test_helpers_1.getDependencies)(), undefined, { includeStructural: true });
38
+ }, 15000);
39
+ (0, vitest_1.it)('derives slug from the page path and carries declared layout + method + its renders', () => {
40
+ (0, vitest_1.expect)(structuralOf(p('app/views/pages/index.liquid'))).toEqual({
41
+ ...NO_USAGE,
42
+ renders_used: ['card', 'documented'],
43
+ tags_used: ['render'],
44
+ slug: '/',
45
+ layout: 'application',
46
+ method: 'get',
47
+ });
48
+ });
49
+ (0, vitest_1.it)('collects `{% doc %}` @param names in declaration order', () => {
50
+ // `{% doc %}` is a raw tag (not a LiquidTag), so it does not appear in
51
+ // tags_used; its @param names are surfaced via doc_params, in source order.
52
+ (0, vitest_1.expect)(structuralOf(p('app/views/partials/documented.liquid'))).toEqual({
53
+ ...NO_USAGE,
54
+ doc_params: ['title', 'count'],
55
+ });
56
+ });
57
+ (0, vitest_1.it)('derives the slug from the path for a page with no frontmatter and no usage', () => {
58
+ (0, vitest_1.expect)(structuralOf(p('app/views/pages/about.liquid'))).toEqual({
59
+ ...NO_USAGE,
60
+ slug: 'about',
61
+ });
62
+ });
63
+ (0, vitest_1.it)('uses the frontmatter slug override verbatim (not the path)', () => {
64
+ (0, vitest_1.expect)(structuralOf(p('app/views/pages/blog/show.liquid'))).toEqual({
65
+ ...NO_USAGE,
66
+ slug: 'blog/custom',
67
+ });
68
+ });
69
+ (0, vitest_1.it)('gives a partial all-empty usage arrays and no routing facts', () => {
70
+ (0, vitest_1.expect)(structuralOf(p('app/views/partials/card.liquid'))).toEqual({ ...NO_USAGE });
71
+ });
72
+ (0, vitest_1.it)('collects every AST usage fact (renders/graphql/filters/tags/translation) sorted + de-duplicated', () => {
73
+ (0, vitest_1.expect)(structuralOf(p('app/views/pages/rich.liquid'))).toEqual({
74
+ renders_used: ['card'],
75
+ graphql_queries_used: ['blog/find'],
76
+ filters_used: ['t', 'upcase'],
77
+ tags_used: ['assign', 'graphql', 'if', 'render'],
78
+ translation_keys: ['greeting.hello'],
79
+ doc_params: [],
80
+ slug: 'rich',
81
+ layout: 'application',
82
+ });
83
+ });
84
+ });
85
+ (0, vitest_1.describe)('Self-structural: the includeStructural opt-in', () => {
86
+ const rootUri = platformos_check_common_1.path.join(test_helpers_1.fixturesRoot, 'structural');
87
+ const p = (part) => platformos_check_common_1.path.join(rootUri, ...part.split('/'));
88
+ const liquidModule = (graph, uri) => {
89
+ const module = graph.modules[uri];
90
+ (0, vitest_1.assert)(module);
91
+ (0, vitest_1.assert)(module.type === "Liquid" /* ModuleType.Liquid */);
92
+ return module;
93
+ };
94
+ (0, vitest_1.it)('does NOT populate `structural` on a default build (the LSP opt-out)', async () => {
95
+ const graph = await (0, index_1.buildAppGraph)(rootUri, (0, test_helpers_1.getDependencies)());
96
+ (0, vitest_1.expect)(liquidModule(graph, p('app/views/pages/index.liquid')).structural).toBeUndefined();
97
+ });
98
+ (0, vitest_1.it)('populates `structural` only when opted in', async () => {
99
+ const graph = await (0, index_1.buildAppGraph)(rootUri, (0, test_helpers_1.getDependencies)(), undefined, {
100
+ includeStructural: true,
101
+ });
102
+ (0, vitest_1.expect)(liquidModule(graph, p('app/views/pages/index.liquid')).structural).toEqual({
103
+ renders_used: ['card', 'documented'],
104
+ graphql_queries_used: [],
105
+ filters_used: [],
106
+ tags_used: ['render'],
107
+ translation_keys: [],
108
+ doc_params: [],
109
+ slug: '/',
110
+ layout: 'application',
111
+ method: 'get',
112
+ });
113
+ });
114
+ });
115
+ (0, vitest_1.describe)('extractStructural: the per-file primitive', () => {
116
+ const rootUri = platformos_check_common_1.path.join(test_helpers_1.fixturesRoot, 'structural');
117
+ const uriOf = (part) => vscode_uri_1.URI.file(platformos_check_common_1.path.join(rootUri, ...part.split('/'))).toString();
118
+ const run = async (part, content) => {
119
+ const uri = uriOf(part);
120
+ return (0, index_1.extractStructural)(await (0, index_1.toSourceCode)(uri, content), uri);
121
+ };
122
+ (0, vitest_1.it)('extracts usage + routing facts from an in-flight buffer (no graph build)', async () => {
123
+ const content = `---
124
+ layout: theme
125
+ method: post
126
+ ---
127
+ {% render 'card' %}
128
+ {{ 'greeting.hi' | t }}
129
+ {{ title | upcase }}`;
130
+ (0, vitest_1.expect)(await run('app/views/pages/contact.liquid', content)).toEqual({
131
+ renders_used: ['card'],
132
+ graphql_queries_used: [],
133
+ filters_used: ['t', 'upcase'],
134
+ tags_used: ['render'],
135
+ translation_keys: ['greeting.hi'],
136
+ doc_params: [],
137
+ slug: 'contact',
138
+ layout: 'theme',
139
+ method: 'post',
140
+ });
141
+ });
142
+ (0, vitest_1.it)('returns undefined for a non-Liquid (.graphql) buffer', async () => {
143
+ (0, vitest_1.expect)(await run('app/graphql/find.graphql', 'query find { records { id } }')).toBeUndefined();
144
+ });
145
+ });
146
+ //# sourceMappingURL=structural.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural.spec.js","sourceRoot":"","sources":["../../src/graph/structural.spec.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ export declare function makeGetSourceCode(fs: AbstractFileSystem): {
7
7
  };
8
8
  export declare const fixturesRoot: string;
9
9
  export declare const skeleton: string;
10
- export declare function getDependencies(rootUri: string, fs?: AbstractFileSystem): Promise<{
10
+ export declare function getDependencies(fs?: AbstractFileSystem): {
11
11
  fs: AbstractFileSystem;
12
12
  getSourceCode: {
13
13
  (x: string): Promise<import("..").FileSourceCode>;
@@ -15,8 +15,7 @@ export declare function getDependencies(rootUri: string, fs?: AbstractFileSystem
15
15
  invalidate(x: string): void;
16
16
  clearCache(): void;
17
17
  };
18
- getWebComponentDefinitionReference: (customElementName: string) => import("..").WebComponentDefinition | undefined;
19
- }>;
18
+ };
20
19
  export declare function mockImpl(obj: any, method: any, callback: any): import("vitest").MockInstance<any> & (new (...args: unknown[]) => any) & {
21
20
  [x: string]: any;
22
21
  };
@@ -5,29 +5,25 @@ exports.makeGetSourceCode = makeGetSourceCode;
5
5
  exports.getDependencies = getDependencies;
6
6
  exports.mockImpl = mockImpl;
7
7
  const platformos_check_common_1 = require("@platformos/platformos-check-common");
8
+ const platformos_common_1 = require("@platformos/platformos-common");
8
9
  const platformos_check_node_1 = require("@platformos/platformos-check-node");
9
10
  const vitest_1 = require("vitest");
10
- const vscode_uri_1 = require("vscode-uri");
11
- const getWebComponentMap_1 = require("../getWebComponentMap");
12
11
  const toSourceCode_1 = require("../toSourceCode");
13
12
  const utils_1 = require("../utils");
14
13
  function makeGetSourceCode(fs) {
15
14
  return (0, platformos_check_common_1.memoize)(async function getSourceCode(uri) {
16
15
  const source = await fs.readFile(uri);
17
- return (0, toSourceCode_1.toSourceCode)(vscode_uri_1.URI.file(uri).toString(), source);
16
+ return (0, toSourceCode_1.toSourceCode)(platformos_check_common_1.path.toUri(uri), source);
18
17
  }, utils_1.identity);
19
18
  }
20
- exports.fixturesRoot = platformos_check_common_1.path.join(vscode_uri_1.URI.file(__dirname), ...'../../fixtures'.split('/'));
19
+ exports.fixturesRoot = platformos_check_common_1.path.join((0, platformos_common_1.uriFromPath)(__dirname), ...'../../fixtures'.split('/'));
21
20
  exports.skeleton = platformos_check_common_1.path.join(exports.fixturesRoot, 'skeleton');
22
- async function getDependencies(rootUri, fs = platformos_check_node_1.NodeFileSystem) {
21
+ function getDependencies(fs = platformos_check_node_1.NodeFileSystem) {
23
22
  const getSourceCode = makeGetSourceCode(fs);
24
- const deps = {
23
+ return {
25
24
  fs,
26
25
  getSourceCode,
27
- getWebComponentDefinitionReference: (customElementName) => webComponentDefs.get(customElementName),
28
26
  };
29
- const webComponentDefs = await (0, getWebComponentMap_1.getWebComponentMap)(rootUri, deps);
30
- return deps;
31
27
  }
32
28
  // This thing is way too hard to type.
33
29
  function mockImpl(obj, method, callback) {
@@ -1 +1 @@
1
- {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../src/graph/test-helpers.ts"],"names":[],"mappings":";;;AASA,8CAKC;AAKD,0CAYC;AAGD,4BAKC;AAvCD,iFAAiF;AAEjF,6EAAmE;AACnE,mCAA4B;AAC5B,2CAAiC;AACjC,8DAA2D;AAC3D,kDAA+C;AAC/C,oCAAoC;AAEpC,SAAgB,iBAAiB,CAAC,EAAsB;IACtD,OAAO,IAAA,iCAAO,EAAC,KAAK,UAAU,aAAa,CAAC,GAAW;QACrD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,IAAA,2BAAY,EAAC,gBAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC,EAAE,gBAAQ,CAAC,CAAC;AACf,CAAC;AAEY,QAAA,YAAY,GAAG,8BAAS,CAAC,IAAI,CAAC,gBAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACnF,QAAA,QAAQ,GAAG,8BAAS,CAAC,IAAI,CAAC,oBAAY,EAAE,UAAU,CAAC,CAAC;AAE1D,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,KAAyB,sCAAc;IAC5F,MAAM,aAAa,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG;QACX,EAAE;QACF,aAAa;QACb,kCAAkC,EAAE,CAAC,iBAAyB,EAAE,EAAE,CAChE,gBAAgB,CAAC,GAAG,CAAC,iBAAiB,CAAC;KAC1C,CAAC;IAEF,MAAM,gBAAgB,GAAG,MAAM,IAAA,uCAAkB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAEjE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sCAAsC;AACtC,SAAgB,QAAQ,CAAC,GAAQ,EAAE,MAAW,EAAE,QAAa;IAC3D,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,WAAE,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC;QAC9C,OAAO,QAAQ,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../src/graph/test-helpers.ts"],"names":[],"mappings":";;;AAQA,8CAKC;AAKD,0CAMC;AAGD,4BAKC;AAhCD,iFAAiF;AACjF,qEAAgF;AAChF,6EAAmE;AACnE,mCAA4B;AAE5B,kDAA+C;AAC/C,oCAAoC;AAEpC,SAAgB,iBAAiB,CAAC,EAAsB;IACtD,OAAO,IAAA,iCAAO,EAAC,KAAK,UAAU,aAAa,CAAC,GAAW;QACrD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,IAAA,2BAAY,EAAC,8BAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC,EAAE,gBAAQ,CAAC,CAAC;AACf,CAAC;AAEY,QAAA,YAAY,GAAG,8BAAS,CAAC,IAAI,CAAC,IAAA,+BAAW,EAAC,SAAS,CAAC,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACtF,QAAA,QAAQ,GAAG,8BAAS,CAAC,IAAI,CAAC,oBAAY,EAAE,UAAU,CAAC,CAAC;AAEjE,SAAgB,eAAe,CAAC,KAAyB,sCAAc;IACrE,MAAM,aAAa,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC5C,OAAO;QACL,EAAE;QACF,aAAa;KACd,CAAC;AACJ,CAAC;AAED,sCAAsC;AACtC,SAAgB,QAAQ,CAAC,GAAQ,EAAE,MAAW,EAAE,QAAa;IAC3D,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,WAAE,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC;QAC9C,OAAO,QAAQ,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,337 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const platformos_check_common_1 = require("@platformos/platformos-check-common");
4
+ const vitest_1 = require("vitest");
5
+ const index_1 = require("../index");
6
+ const module_1 = require("./module");
7
+ const test_helpers_1 = require("./test-helpers");
8
+ /**
9
+ * A module compared for its EDGE identity. Self-structural (`LiquidModule.structural`,
10
+ * TASK-9.3) is a separate concern, pinned exhaustively in `structural.spec.ts`;
11
+ * stripping it here keeps these edge tests focused and stable as structural grows.
12
+ */
13
+ function edgeIdentity(module) {
14
+ if (module && module.type === "Liquid" /* ModuleType.Liquid */) {
15
+ const copy = { ...module };
16
+ delete copy.structural;
17
+ return copy;
18
+ }
19
+ return module;
20
+ }
21
+ /**
22
+ * The exact source range of `snippet` within `source`. Derived from the fixture
23
+ * text (rather than hard-coded offsets) so the assertion is self-documenting
24
+ * and survives edits to unrelated lines.
25
+ */
26
+ function rangeOf(source, snippet) {
27
+ const start = source.indexOf(snippet);
28
+ if (start < 0)
29
+ throw new Error(`snippet not found in fixture: ${snippet}`);
30
+ return [start, start + snippet.length];
31
+ }
32
+ /** A `direct` dependency Reference with no target range (the common case here). */
33
+ function directRef(sourceUri, sourceRange, targetUri, kind, args) {
34
+ return {
35
+ source: { uri: sourceUri, range: sourceRange },
36
+ target: { uri: targetUri },
37
+ type: 'direct',
38
+ kind,
39
+ ...(args ? { args } : {}),
40
+ };
41
+ }
42
+ const partialNode = (uri, exists, references) => ({
43
+ type: "Liquid" /* ModuleType.Liquid */,
44
+ kind: "partial" /* LiquidModuleKind.Partial */,
45
+ uri,
46
+ exists,
47
+ dependencies: [],
48
+ references,
49
+ });
50
+ (0, vitest_1.describe)('URI normalization in graph node factories', () => {
51
+ const emptyGraph = () => ({
52
+ rootUri: 'file:///app',
53
+ entryPoints: [],
54
+ modules: {},
55
+ });
56
+ (0, vitest_1.it)('getPartialModuleByUri returns a Partial node with a forward-slash URI', () => {
57
+ const mod = (0, module_1.getPartialModuleByUri)(emptyGraph(), 'file:///d:/a/repo\\app\\lib\\queries\\list.liquid');
58
+ (0, vitest_1.expect)(mod).toEqual({
59
+ type: "Liquid" /* ModuleType.Liquid */,
60
+ kind: "partial" /* LiquidModuleKind.Partial */,
61
+ uri: 'file:///d:/a/repo/app/lib/queries/list.liquid',
62
+ dependencies: [],
63
+ references: [],
64
+ });
65
+ });
66
+ (0, vitest_1.it)('getGraphQLModuleByUri returns a GraphQL node with a forward-slash URI', () => {
67
+ const mod = (0, module_1.getGraphQLModuleByUri)(emptyGraph(), 'file:///d:/a/repo\\app\\graphql\\find.graphql');
68
+ (0, vitest_1.expect)(mod).toEqual({
69
+ type: "GraphQL" /* ModuleType.GraphQL */,
70
+ kind: 'graphql',
71
+ uri: 'file:///d:/a/repo/app/graphql/find.graphql',
72
+ dependencies: [],
73
+ references: [],
74
+ tables: [],
75
+ });
76
+ });
77
+ });
78
+ (0, vitest_1.describe)('Graph traversal: {% function %} edges', () => {
79
+ const rootUri = platformos_check_common_1.path.join(test_helpers_1.fixturesRoot, 'function-edges');
80
+ const p = (part) => platformos_check_common_1.path.join(rootUri, ...part.split('/'));
81
+ let graph;
82
+ let indexSource;
83
+ let brokenSource;
84
+ (0, vitest_1.beforeAll)(async () => {
85
+ const dependencies = (0, test_helpers_1.getDependencies)();
86
+ graph = await (0, index_1.buildAppGraph)(rootUri, dependencies);
87
+ indexSource = (await dependencies.getSourceCode(p('app/views/pages/index.liquid'))).source;
88
+ brokenSource = (await dependencies.getSourceCode(p('app/views/pages/broken.liquid'))).source;
89
+ }, 15000);
90
+ (0, vitest_1.it)('links a page to the resolved lib query via a single function edge', () => {
91
+ const edge = directRef(p('app/views/pages/index.liquid'), rangeOf(indexSource, "function items = 'queries/list'"), p('app/lib/queries/list.liquid'), 'function');
92
+ (0, vitest_1.expect)(graph.modules[p('app/views/pages/index.liquid')].dependencies).toEqual([edge]);
93
+ (0, vitest_1.expect)(edgeIdentity(graph.modules[p('app/lib/queries/list.liquid')])).toEqual(partialNode(p('app/lib/queries/list.liquid'), true, [edge]));
94
+ });
95
+ (0, vitest_1.it)('records a missing function target as an exists:false node', () => {
96
+ const edge = directRef(p('app/views/pages/broken.liquid'), rangeOf(brokenSource, "function ghost = 'queries/missing'"), p('app/lib/queries/missing.liquid'), 'function');
97
+ (0, vitest_1.expect)(graph.modules[p('app/lib/queries/missing.liquid')]).toEqual(partialNode(p('app/lib/queries/missing.liquid'), false, [edge]));
98
+ });
99
+ });
100
+ (0, vitest_1.describe)('Graph traversal: {% graphql %} edges', () => {
101
+ const rootUri = platformos_check_common_1.path.join(test_helpers_1.fixturesRoot, 'graphql-edges');
102
+ const p = (part) => platformos_check_common_1.path.join(rootUri, ...part.split('/'));
103
+ let graph;
104
+ let indexSource;
105
+ let brokenSource;
106
+ const graphqlNode = (uri, exists, references, tables = []) => ({
107
+ type: "GraphQL" /* ModuleType.GraphQL */,
108
+ kind: 'graphql',
109
+ uri,
110
+ exists,
111
+ dependencies: [],
112
+ references,
113
+ tables,
114
+ });
115
+ (0, vitest_1.beforeAll)(async () => {
116
+ const dependencies = (0, test_helpers_1.getDependencies)();
117
+ graph = await (0, index_1.buildAppGraph)(rootUri, dependencies);
118
+ indexSource = (await dependencies.getSourceCode(p('app/views/pages/index.liquid'))).source;
119
+ brokenSource = (await dependencies.getSourceCode(p('app/views/pages/broken.liquid'))).source;
120
+ }, 15000);
121
+ (0, vitest_1.it)('links a page to the resolved .graphql operation via a single graphql edge', () => {
122
+ const edge = directRef(p('app/views/pages/index.liquid'), rangeOf(indexSource, "graphql posts = 'blog_posts/find', id: '1'"), p('app/graphql/blog_posts/find.graphql'), 'graphql', ['id']);
123
+ (0, vitest_1.expect)(graph.modules[p('app/views/pages/index.liquid')].dependencies).toEqual([edge]);
124
+ // The resolved GraphQL node carries the model `table` it targets (the fixture
125
+ // operation filters on `table: { value: "blog_post" }`).
126
+ (0, vitest_1.expect)(graph.modules[p('app/graphql/blog_posts/find.graphql')]).toEqual(graphqlNode(p('app/graphql/blog_posts/find.graphql'), true, [edge], ['blog_post']));
127
+ });
128
+ (0, vitest_1.it)('records a missing graphql target as an exists:false GraphQL node', () => {
129
+ const edge = directRef(p('app/views/pages/broken.liquid'), rangeOf(brokenSource, "graphql ghost = 'blog_posts/missing'"), p('app/graphql/blog_posts/missing.graphql'), 'graphql');
130
+ (0, vitest_1.expect)(graph.modules[p('app/graphql/blog_posts/missing.graphql')]).toEqual(graphqlNode(p('app/graphql/blog_posts/missing.graphql'), false, [edge]));
131
+ });
132
+ });
133
+ (0, vitest_1.describe)('Graph traversal: GraphQL node `tables` (build-time, both shapes)', () => {
134
+ const rootUri = platformos_check_common_1.path.join(test_helpers_1.fixturesRoot, 'graphql-table');
135
+ const p = (part) => platformos_check_common_1.path.join(rootUri, ...part.split('/'));
136
+ let graph;
137
+ (0, vitest_1.beforeAll)(async () => {
138
+ graph = await (0, index_1.buildAppGraph)(rootUri, (0, test_helpers_1.getDependencies)());
139
+ }, 15000);
140
+ (0, vitest_1.it)('records the tables for an operation that filters on one', () => {
141
+ const node = graph.modules[p('app/graphql/with_table.graphql')];
142
+ (0, vitest_1.assert)(node);
143
+ (0, vitest_1.assert)(node.type === "GraphQL" /* ModuleType.GraphQL */);
144
+ (0, vitest_1.expect)(node.tables).toEqual(['blog_post']);
145
+ });
146
+ (0, vitest_1.it)('leaves tables empty for an operation with no table filter', () => {
147
+ const node = graph.modules[p('app/graphql/without_table.graphql')];
148
+ (0, vitest_1.assert)(node);
149
+ (0, vitest_1.assert)(node.type === "GraphQL" /* ModuleType.GraphQL */);
150
+ (0, vitest_1.expect)(node.tables).toEqual([]);
151
+ });
152
+ });
153
+ (0, vitest_1.describe)('Graph traversal: {% include %} edges', () => {
154
+ const rootUri = platformos_check_common_1.path.join(test_helpers_1.fixturesRoot, 'include-edges');
155
+ const p = (part) => platformos_check_common_1.path.join(rootUri, ...part.split('/'));
156
+ let graph;
157
+ let indexSource;
158
+ (0, vitest_1.beforeAll)(async () => {
159
+ const dependencies = (0, test_helpers_1.getDependencies)();
160
+ graph = await (0, index_1.buildAppGraph)(rootUri, dependencies);
161
+ indexSource = (await dependencies.getSourceCode(p('app/views/pages/index.liquid'))).source;
162
+ }, 15000);
163
+ (0, vitest_1.it)('tags an include edge with kind "include" (distinct from render)', () => {
164
+ const edge = directRef(p('app/views/pages/index.liquid'), rangeOf(indexSource, "{% include 'shared/header' %}"), p('app/views/partials/shared/header.liquid'), 'include');
165
+ (0, vitest_1.expect)(graph.modules[p('app/views/pages/index.liquid')].dependencies).toEqual([edge]);
166
+ (0, vitest_1.expect)(edgeIdentity(graph.modules[p('app/views/partials/shared/header.liquid')])).toEqual(partialNode(p('app/views/partials/shared/header.liquid'), true, [edge]));
167
+ });
168
+ });
169
+ (0, vitest_1.describe)('Graph traversal: {% background %} edges', () => {
170
+ const rootUri = platformos_check_common_1.path.join(test_helpers_1.fixturesRoot, 'background-edges');
171
+ const p = (part) => platformos_check_common_1.path.join(rootUri, ...part.split('/'));
172
+ let graph;
173
+ let indexSource;
174
+ let brokenSource;
175
+ (0, vitest_1.beforeAll)(async () => {
176
+ const dependencies = (0, test_helpers_1.getDependencies)();
177
+ graph = await (0, index_1.buildAppGraph)(rootUri, dependencies);
178
+ indexSource = (await dependencies.getSourceCode(p('app/views/pages/index.liquid'))).source;
179
+ brokenSource = (await dependencies.getSourceCode(p('app/views/pages/broken.liquid'))).source;
180
+ }, 15000);
181
+ (0, vitest_1.it)('links a page to the background partial via a single background edge', () => {
182
+ const edge = directRef(p('app/views/pages/index.liquid'), rangeOf(indexSource, "background job_id = 'jobs/notify', data: 'x'"), p('app/views/partials/jobs/notify.liquid'), 'background', ['data']);
183
+ (0, vitest_1.expect)(graph.modules[p('app/views/pages/index.liquid')].dependencies).toEqual([edge]);
184
+ (0, vitest_1.expect)(edgeIdentity(graph.modules[p('app/views/partials/jobs/notify.liquid')])).toEqual(partialNode(p('app/views/partials/jobs/notify.liquid'), true, [edge]));
185
+ });
186
+ (0, vitest_1.it)('records a missing background target as an exists:false node', () => {
187
+ const edge = directRef(p('app/views/pages/broken.liquid'), rangeOf(brokenSource, "background job_id = 'jobs/missing'"), p('app/lib/jobs/missing.liquid'), 'background');
188
+ (0, vitest_1.expect)(graph.modules[p('app/lib/jobs/missing.liquid')]).toEqual(partialNode(p('app/lib/jobs/missing.liquid'), false, [edge]));
189
+ });
190
+ });
191
+ (0, vitest_1.describe)('Graph traversal: module-namespaced targets (modules/<name>/public/...)', () => {
192
+ const rootUri = platformos_check_common_1.path.join(test_helpers_1.fixturesRoot, 'module-edges');
193
+ const p = (part) => platformos_check_common_1.path.join(rootUri, ...part.split('/'));
194
+ let graph;
195
+ let indexSource;
196
+ (0, vitest_1.beforeAll)(async () => {
197
+ const dependencies = (0, test_helpers_1.getDependencies)();
198
+ graph = await (0, index_1.buildAppGraph)(rootUri, dependencies);
199
+ indexSource = (await dependencies.getSourceCode(p('app/views/pages/index.liquid'))).source;
200
+ }, 15000);
201
+ (0, vitest_1.it)('resolves function + render targets into modules/<name>/public/{lib,views/partials}', () => {
202
+ const functionEdge = directRef(p('app/views/pages/index.liquid'), rangeOf(indexSource, "function items = 'modules/my_module/queries/get'"), p('modules/my_module/public/lib/queries/get.liquid'), 'function');
203
+ const renderEdge = directRef(p('app/views/pages/index.liquid'), rangeOf(indexSource, "{% render 'modules/my_module/card' %}"), p('modules/my_module/public/views/partials/card.liquid'), 'render');
204
+ (0, vitest_1.expect)(graph.modules[p('app/views/pages/index.liquid')].dependencies).toEqual([
205
+ functionEdge,
206
+ renderEdge,
207
+ ]);
208
+ (0, vitest_1.expect)(edgeIdentity(graph.modules[p('modules/my_module/public/lib/queries/get.liquid')])).toEqual(partialNode(p('modules/my_module/public/lib/queries/get.liquid'), true, [functionEdge]));
209
+ (0, vitest_1.expect)(edgeIdentity(graph.modules[p('modules/my_module/public/views/partials/card.liquid')])).toEqual(partialNode(p('modules/my_module/public/views/partials/card.liquid'), true, [renderEdge]));
210
+ });
211
+ });
212
+ (0, vitest_1.describe)('Graph traversal: layout-association edges (frontmatter `layout:`)', () => {
213
+ const rootUri = platformos_check_common_1.path.join(test_helpers_1.fixturesRoot, 'layout-edges');
214
+ const p = (part) => platformos_check_common_1.path.join(rootUri, ...part.split('/'));
215
+ let graph;
216
+ let indexSource;
217
+ let brokenSource;
218
+ const layoutNode = (uri, exists, references) => ({
219
+ type: "Liquid" /* ModuleType.Liquid */,
220
+ kind: "layout" /* LiquidModuleKind.Layout */,
221
+ uri,
222
+ exists,
223
+ dependencies: [],
224
+ references,
225
+ });
226
+ /**
227
+ * The source range the layout edge carries — the whole `YAMLFrontmatter`
228
+ * block, from the opening fence through the closing `---` line (incl. its
229
+ * trailing newline). Derived from the fixture text so it survives edits.
230
+ */
231
+ const frontmatterRange = (source) => [
232
+ 0,
233
+ source.indexOf('\n', source.indexOf('---', 3)) + 1,
234
+ ];
235
+ (0, vitest_1.beforeAll)(async () => {
236
+ const dependencies = (0, test_helpers_1.getDependencies)();
237
+ graph = await (0, index_1.buildAppGraph)(rootUri, dependencies);
238
+ indexSource = (await dependencies.getSourceCode(p('app/views/pages/index.liquid'))).source;
239
+ brokenSource = (await dependencies.getSourceCode(p('app/views/pages/broken.liquid'))).source;
240
+ }, 15000);
241
+ (0, vitest_1.it)('links a page to its resolved layout via a single layout edge', () => {
242
+ const edge = directRef(p('app/views/pages/index.liquid'), frontmatterRange(indexSource), p('app/views/layouts/theme.liquid'), 'layout');
243
+ (0, vitest_1.expect)(graph.modules[p('app/views/pages/index.liquid')].dependencies).toEqual([edge]);
244
+ (0, vitest_1.expect)(edgeIdentity(graph.modules[p('app/views/layouts/theme.liquid')])).toEqual(layoutNode(p('app/views/layouts/theme.liquid'), true, [edge]));
245
+ });
246
+ (0, vitest_1.it)('records a missing layout target as an exists:false Layout node', () => {
247
+ const edge = directRef(p('app/views/pages/broken.liquid'), frontmatterRange(brokenSource), p('app/views/layouts/ghost.liquid'), 'layout');
248
+ (0, vitest_1.expect)(graph.modules[p('app/views/pages/broken.liquid')].dependencies).toEqual([edge]);
249
+ (0, vitest_1.expect)(graph.modules[p('app/views/layouts/ghost.liquid')]).toEqual(layoutNode(p('app/views/layouts/ghost.liquid'), false, [edge]));
250
+ });
251
+ });
252
+ (0, vitest_1.describe)('Graph traversal: asset edges (asset_url resolves under app/assets)', () => {
253
+ const rootUri = platformos_check_common_1.path.join(test_helpers_1.fixturesRoot, 'asset-edges');
254
+ const p = (part) => platformos_check_common_1.path.join(rootUri, ...part.split('/'));
255
+ let graph;
256
+ let indexSource;
257
+ const assetNode = (uri, exists, references) => ({
258
+ type: "Asset" /* ModuleType.Asset */,
259
+ kind: 'unused',
260
+ uri,
261
+ exists,
262
+ dependencies: [],
263
+ references,
264
+ });
265
+ // The asset edge carries the `{{ … }}` output's LiquidVariable range: from the
266
+ // first char after `{{ ` up to the `}}` (the parser includes the trailing
267
+ // space). Derived from the fixture text around the given literal so it stays
268
+ // correct as the fixture changes.
269
+ const outputRange = (literal) => {
270
+ const at = indexSource.indexOf(literal);
271
+ if (at < 0)
272
+ throw new Error(`literal not found in fixture: ${literal}`);
273
+ return [indexSource.lastIndexOf('{{', at) + '{{ '.length, indexSource.indexOf('}}', at)];
274
+ };
275
+ const assetEdge = (literal, targetPart) => directRef(p('app/views/pages/index.liquid'), outputRange(literal), p(targetPart), 'asset');
276
+ (0, vitest_1.beforeAll)(async () => {
277
+ const dependencies = (0, test_helpers_1.getDependencies)();
278
+ graph = await (0, index_1.buildAppGraph)(rootUri, dependencies);
279
+ indexSource = (await dependencies.getSourceCode(p('app/views/pages/index.liquid'))).source;
280
+ }, 15000);
281
+ (0, vitest_1.it)('resolves an asset (relative to app/assets) to an exists:true Asset node', () => {
282
+ const edge = assetEdge("'site/app.js'", 'app/assets/site/app.js');
283
+ (0, vitest_1.expect)(graph.modules[p('app/views/pages/index.liquid')].dependencies).toContainEqual(edge);
284
+ (0, vitest_1.expect)(graph.modules[p('app/assets/site/app.js')]).toEqual(assetNode(p('app/assets/site/app.js'), true, [edge]));
285
+ });
286
+ (0, vitest_1.it)('resolves a top-level asset under app/assets', () => {
287
+ const edge = assetEdge("'logo.css'", 'app/assets/logo.css');
288
+ (0, vitest_1.expect)(graph.modules[p('app/assets/logo.css')]).toEqual(assetNode(p('app/assets/logo.css'), true, [edge]));
289
+ });
290
+ (0, vitest_1.it)('records a missing asset as an exists:false Asset node at its canonical app/assets path', () => {
291
+ const edge = assetEdge("'images/missing.png'", 'app/assets/images/missing.png');
292
+ (0, vitest_1.expect)(graph.modules[p('app/assets/images/missing.png')]).toEqual(assetNode(p('app/assets/images/missing.png'), false, [edge]));
293
+ });
294
+ (0, vitest_1.it)('emits exactly the three asset edges for the page, in source order', () => {
295
+ (0, vitest_1.expect)(graph.modules[p('app/views/pages/index.liquid')].dependencies.map((d) => ({
296
+ kind: d.kind,
297
+ target: d.target.uri,
298
+ }))).toEqual([
299
+ { kind: 'asset', target: p('app/assets/site/app.js') },
300
+ { kind: 'asset', target: p('app/assets/logo.css') },
301
+ { kind: 'asset', target: p('app/assets/images/missing.png') },
302
+ ]);
303
+ });
304
+ });
305
+ (0, vitest_1.describe)('Graph traversal: schema/Table nodes (full-build discovery)', () => {
306
+ const rootUri = platformos_check_common_1.path.join(test_helpers_1.fixturesRoot, 'schema-nodes');
307
+ const p = (part) => platformos_check_common_1.path.join(rootUri, ...part.split('/'));
308
+ let graph;
309
+ (0, vitest_1.beforeAll)(async () => {
310
+ graph = await (0, index_1.buildAppGraph)(rootUri, (0, test_helpers_1.getDependencies)());
311
+ }, 15000);
312
+ (0, vitest_1.it)('discovers a schema file as a leaf Schema node carrying its table (the YAML name)', () => {
313
+ (0, vitest_1.expect)(graph.modules[p('app/schema/blog_post.yml')]).toEqual({
314
+ type: "Schema" /* ModuleType.Schema */,
315
+ kind: 'schema',
316
+ uri: p('app/schema/blog_post.yml'),
317
+ exists: true,
318
+ dependencies: [],
319
+ references: [],
320
+ table: 'blog_post',
321
+ });
322
+ });
323
+ (0, vitest_1.it)('leaves table undefined for a schema file with no `name:`', () => {
324
+ (0, vitest_1.expect)(graph.modules[p('app/schema/no_name.yml')]).toEqual({
325
+ type: "Schema" /* ModuleType.Schema */,
326
+ kind: 'schema',
327
+ uri: p('app/schema/no_name.yml'),
328
+ exists: true,
329
+ dependencies: [],
330
+ references: [],
331
+ });
332
+ });
333
+ (0, vitest_1.it)('does not make schema files entry points', () => {
334
+ (0, vitest_1.expect)(graph.entryPoints.map((m) => m.uri)).toEqual([p('app/views/pages/index.liquid')]);
335
+ });
336
+ });
337
+ //# sourceMappingURL=traverse-edges.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverse-edges.spec.js","sourceRoot":"","sources":["../../src/graph/traverse-edges.spec.ts"],"names":[],"mappings":"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"}