@platformos/platformos-graph 0.0.20 → 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 (120) hide show
  1. package/CHANGELOG.md +511 -8
  2. package/dist/cache-probes.spec.d.ts +1 -0
  3. package/dist/cache-probes.spec.js +62 -0
  4. package/dist/cache-probes.spec.js.map +1 -0
  5. package/dist/cli.js +18 -13
  6. package/dist/cli.js.map +1 -1
  7. package/dist/cli.spec.d.ts +1 -0
  8. package/dist/cli.spec.js +235 -0
  9. package/dist/cli.spec.js.map +1 -0
  10. package/dist/graph/app-index-resolution.spec.d.ts +1 -0
  11. package/dist/graph/app-index-resolution.spec.js +167 -0
  12. package/dist/graph/app-index-resolution.spec.js.map +1 -0
  13. package/dist/graph/asset-resolution.spec.d.ts +1 -0
  14. package/dist/graph/asset-resolution.spec.js +64 -0
  15. package/dist/graph/asset-resolution.spec.js.map +1 -0
  16. package/dist/graph/augment.js +3 -0
  17. package/dist/graph/augment.js.map +1 -1
  18. package/dist/graph/build.d.ts +15 -2
  19. package/dist/graph/build.js +54 -12
  20. package/dist/graph/build.js.map +1 -1
  21. package/dist/graph/build.spec.d.ts +1 -0
  22. package/dist/graph/build.spec.js +138 -0
  23. package/dist/graph/build.spec.js.map +1 -0
  24. package/dist/graph/edge-sources.d.ts +28 -0
  25. package/dist/graph/edge-sources.js +43 -0
  26. package/dist/graph/edge-sources.js.map +1 -0
  27. package/dist/graph/edge-sources.spec.d.ts +1 -0
  28. package/dist/graph/edge-sources.spec.js +125 -0
  29. package/dist/graph/edge-sources.spec.js.map +1 -0
  30. package/dist/graph/extract.spec.d.ts +1 -0
  31. package/dist/graph/extract.spec.js +163 -0
  32. package/dist/graph/extract.spec.js.map +1 -0
  33. package/dist/graph/module.d.ts +60 -7
  34. package/dist/graph/module.js +137 -41
  35. package/dist/graph/module.js.map +1 -1
  36. package/dist/graph/module.spec.d.ts +1 -0
  37. package/dist/graph/module.spec.js +74 -0
  38. package/dist/graph/module.spec.js.map +1 -0
  39. package/dist/graph/query.d.ts +72 -0
  40. package/dist/graph/query.js +140 -0
  41. package/dist/graph/query.js.map +1 -0
  42. package/dist/graph/query.spec.d.ts +1 -0
  43. package/dist/graph/query.spec.js +209 -0
  44. package/dist/graph/query.spec.js.map +1 -0
  45. package/dist/graph/serialize.spec.d.ts +1 -0
  46. package/dist/graph/serialize.spec.js +50 -0
  47. package/dist/graph/serialize.spec.js.map +1 -0
  48. package/dist/graph/structural.spec.d.ts +1 -0
  49. package/dist/graph/structural.spec.js +146 -0
  50. package/dist/graph/structural.spec.js.map +1 -0
  51. package/dist/graph/test-helpers.js +3 -3
  52. package/dist/graph/test-helpers.js.map +1 -1
  53. package/dist/graph/traverse-edges.spec.d.ts +1 -0
  54. package/dist/graph/traverse-edges.spec.js +337 -0
  55. package/dist/graph/traverse-edges.spec.js.map +1 -0
  56. package/dist/graph/traverse.d.ts +51 -20
  57. package/dist/graph/traverse.js +239 -29
  58. package/dist/graph/traverse.js.map +1 -1
  59. package/dist/index.d.ts +5 -1
  60. package/dist/index.js +19 -1
  61. package/dist/index.js.map +1 -1
  62. package/dist/parsers.d.ts +35 -0
  63. package/dist/parsers.js +72 -0
  64. package/dist/parsers.js.map +1 -0
  65. package/dist/parsers.spec.d.ts +1 -0
  66. package/dist/parsers.spec.js +70 -0
  67. package/dist/parsers.spec.js.map +1 -0
  68. package/dist/toSourceCode.d.ts +14 -2
  69. package/dist/toSourceCode.js +23 -19
  70. package/dist/toSourceCode.js.map +1 -1
  71. package/dist/tsconfig.tsbuildinfo +1 -1
  72. package/dist/types.d.ts +102 -3
  73. package/dist/types.js.map +1 -1
  74. package/dist/utils/index.d.ts +1 -1
  75. package/fixtures/asset-edges/app/assets/logo.css +1 -0
  76. package/fixtures/asset-edges/app/assets/site/app.js +1 -0
  77. package/fixtures/asset-edges/app/views/pages/index.liquid +3 -0
  78. package/fixtures/graphql-table/app/graphql/with_table.graphql +5 -0
  79. package/fixtures/graphql-table/app/graphql/without_table.graphql +3 -0
  80. package/fixtures/graphql-table/app/views/pages/index.liquid +4 -0
  81. package/fixtures/layout-edges/app/views/layouts/theme.liquid +4 -0
  82. package/fixtures/layout-edges/app/views/pages/broken.liquid +5 -0
  83. package/fixtures/layout-edges/app/views/pages/index.liquid +5 -0
  84. package/fixtures/schema-nodes/app/schema/blog_post.yml +6 -0
  85. package/fixtures/schema-nodes/app/schema/no_name.yml +3 -0
  86. package/fixtures/schema-nodes/app/views/pages/index.liquid +1 -0
  87. package/fixtures/structural/app/views/pages/about.liquid +1 -0
  88. package/fixtures/structural/app/views/pages/blog/show.liquid +4 -0
  89. package/fixtures/structural/app/views/pages/index.liquid +6 -0
  90. package/fixtures/structural/app/views/pages/rich.liquid +8 -0
  91. package/fixtures/structural/app/views/partials/card.liquid +1 -0
  92. package/fixtures/structural/app/views/partials/documented.liquid +5 -0
  93. package/package.json +7 -5
  94. package/src/cli.spec.ts +37 -31
  95. package/src/cli.ts +31 -15
  96. package/src/graph/augment.ts +4 -0
  97. package/src/graph/build.spec.ts +871 -6
  98. package/src/graph/build.ts +68 -17
  99. package/src/graph/edge-sources.spec.ts +125 -0
  100. package/src/graph/edge-sources.ts +49 -0
  101. package/src/graph/module.spec.ts +168 -0
  102. package/src/graph/module.ts +139 -45
  103. package/src/graph/query.spec.ts +260 -0
  104. package/src/graph/query.ts +154 -0
  105. package/src/graph/serialize.spec.ts +4 -4
  106. package/src/graph/test-helpers.ts +3 -3
  107. package/src/graph/{extract.spec.ts → traverse.spec.ts} +125 -2
  108. package/src/graph/traverse.ts +278 -37
  109. package/src/index.ts +16 -1
  110. package/src/parsers.spec.ts +85 -0
  111. package/src/parsers.ts +75 -0
  112. package/src/toSourceCode.ts +26 -26
  113. package/src/types.ts +106 -7
  114. package/src/utils/index.ts +1 -1
  115. package/dist/getWebComponentMap.d.ts +0 -10
  116. package/dist/getWebComponentMap.js +0 -66
  117. package/dist/getWebComponentMap.js.map +0 -1
  118. package/src/graph/traverse-edges.spec.ts +0 -278
  119. /package/fixtures/skeleton/{assets → app/assets}/app.css +0 -0
  120. /package/fixtures/skeleton/{assets → app/assets}/app.js +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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"}
@@ -5,18 +5,18 @@ 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
11
  const toSourceCode_1 = require("../toSourceCode");
12
12
  const utils_1 = require("../utils");
13
13
  function makeGetSourceCode(fs) {
14
14
  return (0, platformos_check_common_1.memoize)(async function getSourceCode(uri) {
15
15
  const source = await fs.readFile(uri);
16
- 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);
17
17
  }, utils_1.identity);
18
18
  }
19
- 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('/'));
20
20
  exports.skeleton = platformos_check_common_1.path.join(exports.fixturesRoot, 'skeleton');
21
21
  function getDependencies(fs = platformos_check_node_1.NodeFileSystem) {
22
22
  const getSourceCode = makeGetSourceCode(fs);
@@ -1 +1 @@
1
- {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../src/graph/test-helpers.ts"],"names":[],"mappings":";;;AAQA,8CAKC;AAKD,0CAMC;AAGD,4BAKC;AAhCD,iFAAiF;AAEjF,6EAAmE;AACnE,mCAA4B;AAC5B,2CAAiC;AACjC,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;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"}
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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"}