@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.
- package/CHANGELOG.md +516 -0
- package/bin/platformos-graph +21 -81
- package/dist/cache-probes.spec.d.ts +1 -0
- package/dist/cache-probes.spec.js +62 -0
- package/dist/cache-probes.spec.js.map +1 -0
- package/dist/cli.d.ts +46 -0
- package/dist/cli.js +131 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.spec.d.ts +1 -0
- package/dist/cli.spec.js +235 -0
- package/dist/cli.spec.js.map +1 -0
- package/dist/graph/app-index-resolution.spec.d.ts +1 -0
- package/dist/graph/app-index-resolution.spec.js +167 -0
- package/dist/graph/app-index-resolution.spec.js.map +1 -0
- package/dist/graph/asset-resolution.spec.d.ts +1 -0
- package/dist/graph/asset-resolution.spec.js +64 -0
- package/dist/graph/asset-resolution.spec.js.map +1 -0
- package/dist/graph/augment.js +3 -1
- package/dist/graph/augment.js.map +1 -1
- package/dist/graph/build.d.ts +15 -2
- package/dist/graph/build.js +54 -12
- package/dist/graph/build.js.map +1 -1
- package/dist/graph/build.spec.d.ts +1 -0
- package/dist/graph/build.spec.js +138 -0
- package/dist/graph/build.spec.js.map +1 -0
- package/dist/graph/edge-sources.d.ts +28 -0
- package/dist/graph/edge-sources.js +43 -0
- package/dist/graph/edge-sources.js.map +1 -0
- package/dist/graph/edge-sources.spec.d.ts +1 -0
- package/dist/graph/edge-sources.spec.js +125 -0
- package/dist/graph/edge-sources.spec.js.map +1 -0
- package/dist/graph/extract.spec.d.ts +1 -0
- package/dist/graph/extract.spec.js +163 -0
- package/dist/graph/extract.spec.js.map +1 -0
- package/dist/graph/module.d.ts +70 -2
- package/dist/graph/module.js +164 -29
- package/dist/graph/module.js.map +1 -1
- package/dist/graph/module.spec.d.ts +1 -0
- package/dist/graph/module.spec.js +74 -0
- package/dist/graph/module.spec.js.map +1 -0
- package/dist/graph/query.d.ts +72 -0
- package/dist/graph/query.js +140 -0
- package/dist/graph/query.js.map +1 -0
- package/dist/graph/query.spec.d.ts +1 -0
- package/dist/graph/query.spec.js +209 -0
- package/dist/graph/query.spec.js.map +1 -0
- package/dist/graph/serialize.spec.d.ts +1 -0
- package/dist/graph/serialize.spec.js +50 -0
- package/dist/graph/serialize.spec.js.map +1 -0
- package/dist/graph/structural.spec.d.ts +1 -0
- package/dist/graph/structural.spec.js +146 -0
- package/dist/graph/structural.spec.js.map +1 -0
- package/dist/graph/test-helpers.d.ts +2 -3
- package/dist/graph/test-helpers.js +5 -9
- package/dist/graph/test-helpers.js.map +1 -1
- package/dist/graph/traverse-edges.spec.d.ts +1 -0
- package/dist/graph/traverse-edges.spec.js +337 -0
- package/dist/graph/traverse-edges.spec.js.map +1 -0
- package/dist/graph/traverse.d.ts +63 -4
- package/dist/graph/traverse.js +364 -49
- package/dist/graph/traverse.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +21 -4
- package/dist/index.js.map +1 -1
- package/dist/parsers.d.ts +35 -0
- package/dist/parsers.js +72 -0
- package/dist/parsers.js.map +1 -0
- package/dist/parsers.spec.d.ts +1 -0
- package/dist/parsers.spec.js +70 -0
- package/dist/parsers.spec.js.map +1 -0
- package/dist/toSourceCode.d.ts +14 -2
- package/dist/toSourceCode.js +23 -19
- package/dist/toSourceCode.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +114 -20
- package/dist/types.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/fixtures/asset-edges/app/assets/logo.css +1 -0
- package/fixtures/asset-edges/app/assets/site/app.js +1 -0
- package/fixtures/asset-edges/app/views/pages/index.liquid +3 -0
- package/fixtures/background-edges/app/views/pages/broken.liquid +3 -0
- package/fixtures/background-edges/app/views/pages/index.liquid +3 -0
- package/fixtures/background-edges/app/views/partials/jobs/notify.liquid +3 -0
- package/fixtures/function-edges/app/lib/queries/list.liquid +3 -0
- package/fixtures/function-edges/app/views/pages/broken.liquid +3 -0
- package/fixtures/function-edges/app/views/pages/index.liquid +3 -0
- package/fixtures/graphql-edges/app/graphql/blog_posts/find.graphql +10 -0
- package/fixtures/graphql-edges/app/views/pages/broken.liquid +3 -0
- package/fixtures/graphql-edges/app/views/pages/index.liquid +3 -0
- package/fixtures/graphql-table/app/graphql/with_table.graphql +5 -0
- package/fixtures/graphql-table/app/graphql/without_table.graphql +3 -0
- package/fixtures/graphql-table/app/views/pages/index.liquid +4 -0
- package/fixtures/include-edges/app/views/pages/index.liquid +1 -0
- package/fixtures/include-edges/app/views/partials/shared/header.liquid +1 -0
- package/fixtures/layout-edges/app/views/layouts/theme.liquid +4 -0
- package/fixtures/layout-edges/app/views/pages/broken.liquid +5 -0
- package/fixtures/layout-edges/app/views/pages/index.liquid +5 -0
- package/fixtures/module-edges/app/views/pages/index.liquid +4 -0
- package/fixtures/module-edges/modules/my_module/public/lib/queries/get.liquid +3 -0
- package/fixtures/module-edges/modules/my_module/public/views/partials/card.liquid +1 -0
- package/fixtures/schema-nodes/app/schema/blog_post.yml +6 -0
- package/fixtures/schema-nodes/app/schema/no_name.yml +3 -0
- package/fixtures/schema-nodes/app/views/pages/index.liquid +1 -0
- package/fixtures/skeleton/app/assets/app.js +1 -0
- package/fixtures/skeleton/app/views/partials/child.liquid +2 -4
- package/fixtures/skeleton/app/views/partials/parent.liquid +2 -4
- package/fixtures/structural/app/views/pages/about.liquid +1 -0
- package/fixtures/structural/app/views/pages/blog/show.liquid +4 -0
- package/fixtures/structural/app/views/pages/index.liquid +6 -0
- package/fixtures/structural/app/views/pages/rich.liquid +8 -0
- package/fixtures/structural/app/views/partials/card.liquid +1 -0
- package/fixtures/structural/app/views/partials/documented.liquid +5 -0
- package/package.json +7 -5
- package/src/cli.spec.ts +271 -0
- package/src/cli.ts +167 -0
- package/src/graph/augment.ts +4 -2
- package/src/graph/build.spec.ts +888 -9
- package/src/graph/build.ts +68 -17
- package/src/graph/edge-sources.spec.ts +125 -0
- package/src/graph/edge-sources.ts +49 -0
- package/src/graph/module.spec.ts +168 -0
- package/src/graph/module.ts +167 -33
- package/src/graph/query.spec.ts +260 -0
- package/src/graph/query.ts +154 -0
- package/src/graph/serialize.spec.ts +4 -4
- package/src/graph/test-helpers.ts +5 -12
- package/src/graph/traverse.spec.ts +278 -0
- package/src/graph/traverse.ts +423 -54
- package/src/index.ts +16 -1
- package/src/parsers.spec.ts +85 -0
- package/src/parsers.ts +75 -0
- package/src/toSourceCode.ts +26 -26
- package/src/types.ts +120 -23
- package/src/utils/index.ts +1 -1
- package/bin/jsconfig.json +0 -18
- package/dist/getWebComponentMap.d.ts +0 -10
- package/dist/getWebComponentMap.js +0 -66
- package/dist/getWebComponentMap.js.map +0 -1
- package/fixtures/skeleton/assets/app.js +0 -7
- package/src/getWebComponentMap.ts +0 -81
- /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(
|
|
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
|
-
|
|
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)(
|
|
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(
|
|
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
|
-
|
|
21
|
+
function getDependencies(fs = platformos_check_node_1.NodeFileSystem) {
|
|
23
22
|
const getSourceCode = makeGetSourceCode(fs);
|
|
24
|
-
|
|
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":";;;
|
|
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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"}
|