@noego/forge 0.1.23 → 0.1.25
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/bin/forge.js +18 -2
- package/dist/client.cjs +3 -3
- package/dist/client.cjs.map +1 -1
- package/dist/client.mjs +696 -645
- package/dist/client.mjs.map +1 -1
- package/dist/lint/cli.d.ts +9 -0
- package/dist/lint/cli.js +254 -0
- package/dist/lint/cli.js.map +1 -0
- package/dist/lint/config.d.ts +6 -0
- package/dist/lint/config.js +66 -0
- package/dist/lint/config.js.map +1 -0
- package/dist/lint/dependency_collector.d.ts +39 -0
- package/dist/lint/dependency_collector.js +205 -0
- package/dist/lint/dependency_collector.js.map +1 -0
- package/dist/lint/errors.d.ts +4 -0
- package/dist/lint/errors.js +10 -0
- package/dist/lint/errors.js.map +1 -0
- package/dist/lint/eslint_loader.d.ts +3 -0
- package/dist/lint/eslint_loader.js +11 -0
- package/dist/lint/eslint_loader.js.map +1 -0
- package/dist/lint/route_parser.d.ts +2 -0
- package/dist/lint/route_parser.js +214 -0
- package/dist/lint/route_parser.js.map +1 -0
- package/dist/lint/rules/no_invalid_html_nesting.d.ts +3 -0
- package/dist/lint/rules/no_invalid_html_nesting.js +123 -0
- package/dist/lint/rules/no_invalid_html_nesting.js.map +1 -0
- package/dist/lint/tests/dependency_collector.test.d.ts +1 -0
- package/dist/lint/tests/dependency_collector.test.js +220 -0
- package/dist/lint/tests/dependency_collector.test.js.map +1 -0
- package/dist/lint/tests/fixtures/svelte/mixed/utils/format.d.ts +2 -0
- package/dist/lint/tests/fixtures/svelte/mixed/utils/format.js +7 -0
- package/dist/lint/tests/fixtures/svelte/mixed/utils/format.js.map +1 -0
- package/dist/lint/tests/fixtures/svelte/typescript/helper.d.ts +7 -0
- package/dist/lint/tests/fixtures/svelte/typescript/helper.js +7 -0
- package/dist/lint/tests/fixtures/svelte/typescript/helper.js.map +1 -0
- package/dist/lint/tests/no_invalid_html_nesting.test.d.ts +1 -0
- package/dist/lint/tests/no_invalid_html_nesting.test.js +61 -0
- package/dist/lint/tests/no_invalid_html_nesting.test.js.map +1 -0
- package/dist-ssr/server.cjs +17 -1
- package/dist-ssr/server.cjs.map +1 -1
- package/dist-ssr/server.js +17 -1
- package/dist-ssr/server.js.map +1 -1
- package/dist-ssr/static.cjs +1 -1
- package/dist-ssr/static.d.ts +3 -0
- package/dist-ssr/static.js +1 -1
- package/dist-ssr/test.d.ts +3 -0
- package/dist-ssr/{url_parser-DHQiBy_-.js → url_parser-BX00zzMP.js} +35 -2
- package/dist-ssr/{url_parser-DHQiBy_-.js.map → url_parser-BX00zzMP.js.map} +1 -1
- package/dist-ssr/{url_parser-BGkQselu.cjs → url_parser-Dipo_fiS.cjs} +35 -2
- package/dist-ssr/{url_parser-BGkQselu.cjs.map → url_parser-Dipo_fiS.cjs.map} +1 -1
- package/package.json +16 -3
- package/src/components/RecursiveRender.svelte +2 -2
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import yaml from 'js-yaml';
|
|
4
|
+
import { ConfigParser, YamlMerger } from '@noego/stitch';
|
|
5
|
+
const NOEGO_CONFIG_FILENAMES = [
|
|
6
|
+
'noego.yaml',
|
|
7
|
+
'noego.yml',
|
|
8
|
+
'noego.config.yaml',
|
|
9
|
+
'noego.config.yml',
|
|
10
|
+
'app.yaml',
|
|
11
|
+
'app.yml',
|
|
12
|
+
'app.config.yaml',
|
|
13
|
+
'app.config.yml',
|
|
14
|
+
'hammer.yaml',
|
|
15
|
+
'hammer.yml',
|
|
16
|
+
'hammer.config.yaml',
|
|
17
|
+
'hammer.config.yml',
|
|
18
|
+
];
|
|
19
|
+
const ROUTE_CONFIG_FILENAMES = [
|
|
20
|
+
'routes.yaml',
|
|
21
|
+
'routes.yml',
|
|
22
|
+
'api.yaml',
|
|
23
|
+
'api.yml',
|
|
24
|
+
'openapi.yaml',
|
|
25
|
+
'openapi.yml',
|
|
26
|
+
'stitch.yaml',
|
|
27
|
+
'stitch.yml',
|
|
28
|
+
];
|
|
29
|
+
async function findNoegoConfig(rootDir) {
|
|
30
|
+
for (const fileName of NOEGO_CONFIG_FILENAMES) {
|
|
31
|
+
const candidate = path.join(rootDir, fileName);
|
|
32
|
+
try {
|
|
33
|
+
await fs.access(candidate);
|
|
34
|
+
return candidate;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
export async function findRouteConfig(rootDir) {
|
|
43
|
+
// First, check if there's a noego.config.yml that points to the routes
|
|
44
|
+
const noegoConfigPath = await findNoegoConfig(rootDir);
|
|
45
|
+
if (process.env.DEBUG) {
|
|
46
|
+
console.log('[DEBUG] Looking for config in:', rootDir);
|
|
47
|
+
console.log('[DEBUG] Found noego config:', noegoConfigPath);
|
|
48
|
+
}
|
|
49
|
+
if (noegoConfigPath) {
|
|
50
|
+
try {
|
|
51
|
+
const content = await fs.readFile(noegoConfigPath, 'utf-8');
|
|
52
|
+
const config = yaml.load(content);
|
|
53
|
+
// Check for client.openapi path
|
|
54
|
+
if (config?.client?.openapi) {
|
|
55
|
+
const openapiPath = path.isAbsolute(config.client.openapi)
|
|
56
|
+
? config.client.openapi
|
|
57
|
+
: path.resolve(rootDir, config.client.openapi);
|
|
58
|
+
if (process.env.DEBUG) {
|
|
59
|
+
console.log('[DEBUG] Checking client.openapi:', openapiPath);
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
await fs.access(openapiPath);
|
|
63
|
+
if (process.env.DEBUG) {
|
|
64
|
+
console.log('[DEBUG] Found routes at:', openapiPath);
|
|
65
|
+
}
|
|
66
|
+
return openapiPath;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Path in config doesn't exist, continue to fallback
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Check for server.openapi as fallback
|
|
73
|
+
if (config?.server?.openapi) {
|
|
74
|
+
const openapiPath = path.isAbsolute(config.server.openapi)
|
|
75
|
+
? config.server.openapi
|
|
76
|
+
: path.resolve(rootDir, config.server.openapi);
|
|
77
|
+
try {
|
|
78
|
+
await fs.access(openapiPath);
|
|
79
|
+
return openapiPath;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Path in config doesn't exist, continue to fallback
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
// Config file couldn't be parsed, continue to fallback
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Fallback: Look for common route file names in the root
|
|
91
|
+
for (const fileName of ROUTE_CONFIG_FILENAMES) {
|
|
92
|
+
const candidate = path.join(rootDir, fileName);
|
|
93
|
+
try {
|
|
94
|
+
await fs.access(candidate);
|
|
95
|
+
return candidate;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
function extractComponentsFromRoute(route, svelteFiles) {
|
|
104
|
+
if (route.view || route['x-view']) {
|
|
105
|
+
svelteFiles.add(route.view || route['x-view']);
|
|
106
|
+
}
|
|
107
|
+
if (route.layout || route['x-layout']) {
|
|
108
|
+
const layouts = route.layout || route['x-layout'];
|
|
109
|
+
if (Array.isArray(layouts)) {
|
|
110
|
+
for (const layout of layouts) {
|
|
111
|
+
svelteFiles.add(layout);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else if (layouts) {
|
|
115
|
+
svelteFiles.add(layouts);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function parseYamlFile(filePath) {
|
|
120
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
121
|
+
const config = yaml.load(content);
|
|
122
|
+
// Handle stitch files using @noego/stitch (same code path as runtime)
|
|
123
|
+
if (config?.stitch && Array.isArray(config.stitch)) {
|
|
124
|
+
const configParser = new ConfigParser();
|
|
125
|
+
const yamlMerger = new YamlMerger();
|
|
126
|
+
const baseDir = configParser.getConfigDir(filePath);
|
|
127
|
+
const filePaths = await configParser.resolveFilePaths(config.stitch, baseDir);
|
|
128
|
+
return yamlMerger.mergeFiles(filePaths);
|
|
129
|
+
}
|
|
130
|
+
return config;
|
|
131
|
+
}
|
|
132
|
+
export async function getSvelteFilesFromRoutes(cwd) {
|
|
133
|
+
// Find the route configuration file
|
|
134
|
+
const routeConfigPath = await findRouteConfig(cwd);
|
|
135
|
+
if (!routeConfigPath) {
|
|
136
|
+
// No route config found, return empty array (will fall back to manual patterns)
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
// Get componentDir from noego.config.yml
|
|
140
|
+
let componentDir = cwd;
|
|
141
|
+
const noegoConfigPath = await findNoegoConfig(cwd);
|
|
142
|
+
if (noegoConfigPath) {
|
|
143
|
+
try {
|
|
144
|
+
const noegoContent = await fs.readFile(noegoConfigPath, 'utf-8');
|
|
145
|
+
const noegoConfig = yaml.load(noegoContent);
|
|
146
|
+
if (noegoConfig?.client?.componentDir) {
|
|
147
|
+
componentDir = path.resolve(cwd, noegoConfig.client.componentDir);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Ignore errors, use cwd as fallback
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Read and parse the YAML file (handles stitch files)
|
|
155
|
+
const config = await parseYamlFile(routeConfigPath);
|
|
156
|
+
const svelteFiles = new Set();
|
|
157
|
+
// Add fallback view and layouts (x-fallback-view, x-fallback-layout)
|
|
158
|
+
if (config['x-fallback-view']) {
|
|
159
|
+
svelteFiles.add(config['x-fallback-view']);
|
|
160
|
+
}
|
|
161
|
+
if (config['x-fallback-layout']) {
|
|
162
|
+
const layouts = config['x-fallback-layout'];
|
|
163
|
+
if (Array.isArray(layouts)) {
|
|
164
|
+
for (const layout of layouts) {
|
|
165
|
+
svelteFiles.add(layout);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
svelteFiles.add(layouts);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Extract components from paths
|
|
173
|
+
if (config.paths) {
|
|
174
|
+
for (const [pathName, pathConfig] of Object.entries(config.paths)) {
|
|
175
|
+
if (typeof pathConfig === 'object') {
|
|
176
|
+
// Check each HTTP method
|
|
177
|
+
for (const [method, methodConfig] of Object.entries(pathConfig)) {
|
|
178
|
+
if (typeof methodConfig === 'object') {
|
|
179
|
+
extractComponentsFromRoute(methodConfig, svelteFiles);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Extract components from modules
|
|
186
|
+
if (config.modules) {
|
|
187
|
+
const modules = Array.isArray(config.modules)
|
|
188
|
+
? config.modules
|
|
189
|
+
: Object.values(config.modules);
|
|
190
|
+
for (const module of modules) {
|
|
191
|
+
if (module.paths) {
|
|
192
|
+
for (const [pathName, pathConfig] of Object.entries(module.paths)) {
|
|
193
|
+
if (typeof pathConfig === 'object') {
|
|
194
|
+
for (const [method, methodConfig] of Object.entries(pathConfig)) {
|
|
195
|
+
if (typeof methodConfig === 'object') {
|
|
196
|
+
extractComponentsFromRoute(methodConfig, svelteFiles);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Convert relative paths to absolute paths using componentDir as base
|
|
205
|
+
const absolutePaths = [];
|
|
206
|
+
for (const file of svelteFiles) {
|
|
207
|
+
const absolutePath = path.isAbsolute(file)
|
|
208
|
+
? file
|
|
209
|
+
: path.resolve(componentDir, file);
|
|
210
|
+
absolutePaths.push(absolutePath);
|
|
211
|
+
}
|
|
212
|
+
return absolutePaths;
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=route_parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route_parser.js","sourceRoot":"","sources":["../../src/lint/route_parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML elements that are considered "interactive content".
|
|
3
|
+
* Per the HTML spec, interactive content cannot be nested inside other interactive content.
|
|
4
|
+
* https://html.spec.whatwg.org/multipage/dom.html#interactive-content
|
|
5
|
+
*/
|
|
6
|
+
const INTERACTIVE_ELEMENTS = new Set([
|
|
7
|
+
'a',
|
|
8
|
+
'button',
|
|
9
|
+
'details',
|
|
10
|
+
'embed',
|
|
11
|
+
'iframe',
|
|
12
|
+
'label',
|
|
13
|
+
'select',
|
|
14
|
+
'textarea',
|
|
15
|
+
]);
|
|
16
|
+
/**
|
|
17
|
+
* Elements that only accept phrasing content (cannot contain block-level elements).
|
|
18
|
+
* When a block element is placed inside these, the browser will "repair" the DOM.
|
|
19
|
+
*/
|
|
20
|
+
const NON_PHRASING_ELEMENTS = new Set([
|
|
21
|
+
'address',
|
|
22
|
+
'article',
|
|
23
|
+
'aside',
|
|
24
|
+
'blockquote',
|
|
25
|
+
'details',
|
|
26
|
+
'dialog',
|
|
27
|
+
'dd',
|
|
28
|
+
'div',
|
|
29
|
+
'dl',
|
|
30
|
+
'dt',
|
|
31
|
+
'fieldset',
|
|
32
|
+
'figcaption',
|
|
33
|
+
'figure',
|
|
34
|
+
'footer',
|
|
35
|
+
'form',
|
|
36
|
+
'h1',
|
|
37
|
+
'h2',
|
|
38
|
+
'h3',
|
|
39
|
+
'h4',
|
|
40
|
+
'h5',
|
|
41
|
+
'h6',
|
|
42
|
+
'header',
|
|
43
|
+
'hgroup',
|
|
44
|
+
'hr',
|
|
45
|
+
'li',
|
|
46
|
+
'main',
|
|
47
|
+
'nav',
|
|
48
|
+
'ol',
|
|
49
|
+
'p',
|
|
50
|
+
'pre',
|
|
51
|
+
'section',
|
|
52
|
+
'table',
|
|
53
|
+
'ul',
|
|
54
|
+
]);
|
|
55
|
+
/**
|
|
56
|
+
* Map of ancestor element -> set of elements that cannot appear as descendants.
|
|
57
|
+
* Based on the HTML content model specification.
|
|
58
|
+
*/
|
|
59
|
+
const INVALID_ANCESTOR_DESCENDANTS = {
|
|
60
|
+
// <a> cannot contain interactive content
|
|
61
|
+
a: INTERACTIVE_ELEMENTS,
|
|
62
|
+
// <button> cannot contain interactive content
|
|
63
|
+
button: INTERACTIVE_ELEMENTS,
|
|
64
|
+
// <p> cannot contain block/non-phrasing elements
|
|
65
|
+
p: NON_PHRASING_ELEMENTS,
|
|
66
|
+
// <form> cannot be nested
|
|
67
|
+
form: new Set(['form']),
|
|
68
|
+
};
|
|
69
|
+
function getTagName(node) {
|
|
70
|
+
if (node.kind !== 'html')
|
|
71
|
+
return null;
|
|
72
|
+
// SvelteElement name can be a SvelteName object or a string
|
|
73
|
+
if (typeof node.name === 'string')
|
|
74
|
+
return node.name;
|
|
75
|
+
if (node.name && typeof node.name.name === 'string')
|
|
76
|
+
return node.name.name;
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const rule = {
|
|
80
|
+
meta: {
|
|
81
|
+
type: 'problem',
|
|
82
|
+
docs: {
|
|
83
|
+
description: 'Disallow invalid HTML element nesting that causes browser DOM repair and breaks Svelte component structure',
|
|
84
|
+
},
|
|
85
|
+
schema: [],
|
|
86
|
+
messages: {
|
|
87
|
+
invalidNesting: '<{{child}}> cannot be a descendant of <{{ancestor}}>. The browser will repair the HTML, which breaks Svelte\'s assumptions about component structure. https://svelte.dev/e/node_invalid_placement',
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
create(context) {
|
|
91
|
+
return {
|
|
92
|
+
SvelteElement(node) {
|
|
93
|
+
const childTag = getTagName(node);
|
|
94
|
+
if (!childTag)
|
|
95
|
+
return;
|
|
96
|
+
// Walk up all ancestors looking for invalid nesting
|
|
97
|
+
const ancestors = context.sourceCode.getAncestors(node);
|
|
98
|
+
for (let i = ancestors.length - 1; i >= 0; i--) {
|
|
99
|
+
const ancestor = ancestors[i];
|
|
100
|
+
if (ancestor.type !== 'SvelteElement')
|
|
101
|
+
continue;
|
|
102
|
+
const ancestorTag = getTagName(ancestor);
|
|
103
|
+
if (!ancestorTag)
|
|
104
|
+
continue;
|
|
105
|
+
const forbidden = INVALID_ANCESTOR_DESCENDANTS[ancestorTag];
|
|
106
|
+
if (forbidden && forbidden.has(childTag)) {
|
|
107
|
+
context.report({
|
|
108
|
+
node,
|
|
109
|
+
messageId: 'invalidNesting',
|
|
110
|
+
data: {
|
|
111
|
+
child: childTag,
|
|
112
|
+
ancestor: ancestorTag,
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
break; // Report only the nearest invalid ancestor
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
export default rule;
|
|
123
|
+
//# sourceMappingURL=no_invalid_html_nesting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no_invalid_html_nesting.js","sourceRoot":"","sources":["../../../src/lint/rules/no_invalid_html_nesting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
4
|
+
import { DependencyCollector } from '../dependency_collector';
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = path.dirname(__filename);
|
|
7
|
+
const FIXTURES = path.join(__dirname, 'fixtures/svelte');
|
|
8
|
+
describe('DependencyCollector', () => {
|
|
9
|
+
let collector;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
collector = new DependencyCollector();
|
|
12
|
+
});
|
|
13
|
+
describe('Simple Imports', () => {
|
|
14
|
+
it('should collect direct imports from a component', async () => {
|
|
15
|
+
const result = await collector.collect(path.join(FIXTURES, 'simple/Card.svelte'));
|
|
16
|
+
// With recursive=true (default), collects Card and Button
|
|
17
|
+
expect(result.dependencies).toHaveLength(2);
|
|
18
|
+
// Find Card component
|
|
19
|
+
const cardDep = result.dependencies.find((d) => d.file.includes('Card.svelte'));
|
|
20
|
+
expect(cardDep).toBeDefined();
|
|
21
|
+
expect(cardDep.imports).toHaveLength(1);
|
|
22
|
+
expect(cardDep.imports[0]).toContain('Button.svelte');
|
|
23
|
+
});
|
|
24
|
+
it('should return empty imports for component with no imports', async () => {
|
|
25
|
+
const result = await collector.collect(path.join(FIXTURES, 'simple/Button.svelte'));
|
|
26
|
+
expect(result.dependencies).toHaveLength(1);
|
|
27
|
+
expect(result.dependencies[0].imports).toHaveLength(0);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe('Nested Imports', () => {
|
|
31
|
+
it('should recursively collect all nested dependencies', async () => {
|
|
32
|
+
const result = await collector.collect(path.join(FIXTURES, 'nested/Parent.svelte'));
|
|
33
|
+
// Should have Parent, Child, and Grandchild
|
|
34
|
+
expect(result.dependencies.length).toBeGreaterThanOrEqual(3);
|
|
35
|
+
const files = result.dependencies.map((d) => path.basename(d.file));
|
|
36
|
+
expect(files).toContain('Parent.svelte');
|
|
37
|
+
expect(files).toContain('Child.svelte');
|
|
38
|
+
expect(files).toContain('Grandchild.svelte');
|
|
39
|
+
});
|
|
40
|
+
it('should maintain correct dependency relationships', async () => {
|
|
41
|
+
const result = await collector.collect(path.join(FIXTURES, 'nested/Parent.svelte'));
|
|
42
|
+
// Find Parent component
|
|
43
|
+
const parent = result.dependencies.find((d) => d.file.includes('Parent.svelte'));
|
|
44
|
+
expect(parent).toBeDefined();
|
|
45
|
+
expect(parent.imports[0]).toContain('Child.svelte');
|
|
46
|
+
// Find Child component
|
|
47
|
+
const child = result.dependencies.find((d) => d.file.includes('Child.svelte'));
|
|
48
|
+
expect(child).toBeDefined();
|
|
49
|
+
expect(child.imports[0]).toContain('Grandchild.svelte');
|
|
50
|
+
// Grandchild has no imports
|
|
51
|
+
const grandchild = result.dependencies.find((d) => d.file.includes('Grandchild.svelte'));
|
|
52
|
+
expect(grandchild).toBeDefined();
|
|
53
|
+
expect(grandchild.imports).toHaveLength(0);
|
|
54
|
+
});
|
|
55
|
+
it('should not collect dependencies when recursive is false', async () => {
|
|
56
|
+
const nonRecursiveCollector = new DependencyCollector({
|
|
57
|
+
recursive: false,
|
|
58
|
+
});
|
|
59
|
+
const result = await nonRecursiveCollector.collect(path.join(FIXTURES, 'nested/Parent.svelte'));
|
|
60
|
+
// Should only have Parent
|
|
61
|
+
expect(result.dependencies).toHaveLength(1);
|
|
62
|
+
expect(result.dependencies[0].file).toContain('Parent.svelte');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('Circular Dependencies', () => {
|
|
66
|
+
it('should detect circular dependencies', async () => {
|
|
67
|
+
const result = await collector.collect(path.join(FIXTURES, 'circular/A.svelte'));
|
|
68
|
+
expect(result.circular).toHaveLength(1);
|
|
69
|
+
// Circular can be detected in either direction (A→B or B→A)
|
|
70
|
+
const circular = result.circular[0];
|
|
71
|
+
const hasA = circular.from.includes('A.svelte') || circular.to.includes('A.svelte');
|
|
72
|
+
const hasB = circular.from.includes('B.svelte') || circular.to.includes('B.svelte');
|
|
73
|
+
expect(hasA).toBe(true);
|
|
74
|
+
expect(hasB).toBe(true);
|
|
75
|
+
});
|
|
76
|
+
it('should not infinitely recurse on circular deps', async () => {
|
|
77
|
+
// This test passes if it completes without hanging
|
|
78
|
+
const startTime = Date.now();
|
|
79
|
+
const result = await collector.collect(path.join(FIXTURES, 'circular/A.svelte'));
|
|
80
|
+
const duration = Date.now() - startTime;
|
|
81
|
+
expect(result).toBeDefined();
|
|
82
|
+
expect(result.dependencies).toBeDefined();
|
|
83
|
+
// Should complete in less than 1 second
|
|
84
|
+
expect(duration).toBeLessThan(1000);
|
|
85
|
+
});
|
|
86
|
+
it('should visit both components in circular dependency', async () => {
|
|
87
|
+
const result = await collector.collect(path.join(FIXTURES, 'circular/A.svelte'));
|
|
88
|
+
const files = result.dependencies.map((d) => path.basename(d.file));
|
|
89
|
+
expect(files).toContain('A.svelte');
|
|
90
|
+
expect(files).toContain('B.svelte');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('TypeScript Imports', () => {
|
|
94
|
+
it('should collect .ts file imports', async () => {
|
|
95
|
+
const result = await collector.collect(path.join(FIXTURES, 'typescript/Component.svelte'));
|
|
96
|
+
const files = result.dependencies.map((d) => d.file);
|
|
97
|
+
expect(files.some((f) => f.includes('helper.ts'))).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
it('should parse TypeScript files for their imports', async () => {
|
|
100
|
+
const result = await collector.collect(path.join(FIXTURES, 'typescript/Component.svelte'));
|
|
101
|
+
// Component imports helper.ts, which has no further imports
|
|
102
|
+
const helperDep = result.dependencies.find((d) => d.file.includes('helper.ts'));
|
|
103
|
+
expect(helperDep).toBeDefined();
|
|
104
|
+
expect(helperDep.imports).toHaveLength(0);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe('Mixed Imports', () => {
|
|
108
|
+
it('should handle both .svelte and .ts imports', async () => {
|
|
109
|
+
const result = await collector.collect(path.join(FIXTURES, 'mixed/App.svelte'));
|
|
110
|
+
const files = result.dependencies.map((d) => d.file);
|
|
111
|
+
expect(files.some((f) => f.includes('Button.svelte'))).toBe(true);
|
|
112
|
+
expect(files.some((f) => f.includes('format.ts'))).toBe(true);
|
|
113
|
+
});
|
|
114
|
+
it('should resolve imports in subdirectories', async () => {
|
|
115
|
+
const result = await collector.collect(path.join(FIXTURES, 'mixed/App.svelte'));
|
|
116
|
+
const appDep = result.dependencies.find((d) => d.file.includes('App.svelte'));
|
|
117
|
+
expect(appDep).toBeDefined();
|
|
118
|
+
expect(appDep.imports.length).toBeGreaterThanOrEqual(2);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe('External Package Imports', () => {
|
|
122
|
+
it('should exclude node_modules imports by default', async () => {
|
|
123
|
+
const result = await collector.collect(path.join(FIXTURES, 'external/WithExternals.svelte'));
|
|
124
|
+
const files = result.dependencies.map((d) => d.file);
|
|
125
|
+
// Should not include 'svelte' or 'svelte/store'
|
|
126
|
+
expect(files.every((f) => !f.includes('node_modules'))).toBe(true);
|
|
127
|
+
expect(files.every((f) => !f.includes('svelte/store'))).toBe(true);
|
|
128
|
+
});
|
|
129
|
+
it('should include local imports even when mixed with external', async () => {
|
|
130
|
+
const result = await collector.collect(path.join(FIXTURES, 'external/WithExternals.svelte'));
|
|
131
|
+
const files = result.dependencies.map((d) => d.file);
|
|
132
|
+
expect(files.some((f) => f.includes('Local.svelte'))).toBe(true);
|
|
133
|
+
});
|
|
134
|
+
it('should handle components that only have external imports', async () => {
|
|
135
|
+
const result = await collector.collect(path.join(FIXTURES, 'external/Local.svelte'));
|
|
136
|
+
// Local.svelte has no imports
|
|
137
|
+
expect(result.dependencies).toHaveLength(1);
|
|
138
|
+
expect(result.dependencies[0].imports).toHaveLength(0);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
describe('Svelte 5 Patterns', () => {
|
|
142
|
+
it('should parse components using $state rune', async () => {
|
|
143
|
+
const result = await collector.collect(path.join(FIXTURES, 'svelte5/WithRunes.svelte'));
|
|
144
|
+
expect(result.dependencies).toBeDefined();
|
|
145
|
+
expect(result.dependencies.length).toBeGreaterThanOrEqual(1);
|
|
146
|
+
const runesDep = result.dependencies.find((d) => d.file.includes('WithRunes.svelte'));
|
|
147
|
+
expect(runesDep).toBeDefined();
|
|
148
|
+
expect(runesDep.imports[0]).toContain('Counter.svelte');
|
|
149
|
+
});
|
|
150
|
+
it('should parse components with {#snippet} blocks', async () => {
|
|
151
|
+
const result = await collector.collect(path.join(FIXTURES, 'svelte5/WithSnippets.svelte'));
|
|
152
|
+
expect(result.dependencies).toBeDefined();
|
|
153
|
+
const snippetDep = result.dependencies.find((d) => d.file.includes('WithSnippets.svelte'));
|
|
154
|
+
expect(snippetDep).toBeDefined();
|
|
155
|
+
expect(snippetDep.imports[0]).toContain('Card.svelte');
|
|
156
|
+
});
|
|
157
|
+
it('should handle $props destructuring', async () => {
|
|
158
|
+
const result = await collector.collect(path.join(FIXTURES, 'svelte5/Card.svelte'));
|
|
159
|
+
expect(result.dependencies).toBeDefined();
|
|
160
|
+
const cardDep = result.dependencies.find((d) => d.file.includes('Card.svelte'));
|
|
161
|
+
expect(cardDep).toBeDefined();
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe('Error Handling', () => {
|
|
165
|
+
it('should throw error for non-existent file', async () => {
|
|
166
|
+
await expect(collector.collect('/path/to/nonexistent.svelte')).rejects.toThrow();
|
|
167
|
+
});
|
|
168
|
+
it('should report missing imports when reportMissing is true', async () => {
|
|
169
|
+
const reportingCollector = new DependencyCollector({
|
|
170
|
+
reportMissing: true,
|
|
171
|
+
});
|
|
172
|
+
const result = await reportingCollector.collect(path.join(FIXTURES, 'errors/MissingImport.svelte'));
|
|
173
|
+
expect(result.missing).toHaveLength(1);
|
|
174
|
+
expect(result.missing[0].file).toContain('MissingImport.svelte');
|
|
175
|
+
expect(result.missing[0].importPath).toBe('./DoesNotExist.svelte');
|
|
176
|
+
});
|
|
177
|
+
it('should continue processing when import is missing', async () => {
|
|
178
|
+
const reportingCollector = new DependencyCollector({
|
|
179
|
+
reportMissing: true,
|
|
180
|
+
});
|
|
181
|
+
const result = await reportingCollector.collect(path.join(FIXTURES, 'errors/MissingImport.svelte'));
|
|
182
|
+
// Should still have the MissingImport.svelte in dependencies
|
|
183
|
+
expect(result.dependencies).toHaveLength(1);
|
|
184
|
+
expect(result.dependencies[0].file).toContain('MissingImport.svelte');
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
describe('Path Resolution', () => {
|
|
188
|
+
it('should handle relative imports with ../', async () => {
|
|
189
|
+
// This is implicitly tested by nested imports,
|
|
190
|
+
// but we can be explicit
|
|
191
|
+
const result = await collector.collect(path.join(FIXTURES, 'simple/Card.svelte'));
|
|
192
|
+
const cardDep = result.dependencies.find((d) => d.file.includes('Card.svelte'));
|
|
193
|
+
expect(cardDep).toBeDefined();
|
|
194
|
+
expect(path.isAbsolute(cardDep.imports[0])).toBe(true);
|
|
195
|
+
});
|
|
196
|
+
it('should normalize paths consistently', async () => {
|
|
197
|
+
const result = await collector.collect(path.join(FIXTURES, 'nested/Parent.svelte'));
|
|
198
|
+
// All dependency file paths should be normalized
|
|
199
|
+
result.dependencies.forEach((dep) => {
|
|
200
|
+
expect(dep.file).toBe(path.normalize(dep.file));
|
|
201
|
+
dep.imports.forEach((imp) => {
|
|
202
|
+
expect(imp).toBe(path.normalize(imp));
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
describe('Collection Reset', () => {
|
|
208
|
+
it('should reset state between multiple collections', async () => {
|
|
209
|
+
// First collection
|
|
210
|
+
const result1 = await collector.collect(path.join(FIXTURES, 'circular/A.svelte'));
|
|
211
|
+
expect(result1.circular).toHaveLength(1);
|
|
212
|
+
// Second collection with different file
|
|
213
|
+
const result2 = await collector.collect(path.join(FIXTURES, 'simple/Button.svelte'));
|
|
214
|
+
// Should not have circular deps from previous run
|
|
215
|
+
expect(result2.circular).toHaveLength(0);
|
|
216
|
+
expect(result2.dependencies).toHaveLength(1);
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
//# sourceMappingURL=dependency_collector.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency_collector.test.js","sourceRoot":"","sources":["../../../src/lint/tests/dependency_collector.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAEzD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,SAA8B,CAAC;IAEnC,UAAU,CAAC,GAAG,EAAE;QACd,SAAS,GAAG,IAAI,mBAAmB,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAC1C,CAAC;YAEF,0DAA0D;YAC1D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAE5C,sBAAsB;YACtB,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAC/B,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAQ,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,OAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAC5C,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAC5C,CAAC;YAEF,4CAA4C;YAC5C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAE7D,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACpE,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAC5C,CAAC;YAEF,wBAAwB;YACxB,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CACjC,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAErD,uBAAuB;YACvB,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAChC,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAEzD,4BAA4B;YAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAChD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CACrC,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;YACjC,MAAM,CAAC,UAAW,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,qBAAqB,GAAG,IAAI,mBAAmB,CAAC;gBACpD,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAC5C,CAAC;YAEF,0BAA0B;YAC1B,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CACzC,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACxC,4DAA4D;YAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACpF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACpF,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,mDAAmD;YACnD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CACzC,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAExC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1C,wCAAwC;YACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CACzC,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACpE,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,6BAA6B,CAAC,CACnD,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,6BAA6B,CAAC,CACnD,CAAC;YAEF,4DAA4D;YAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC7B,CAAC;YACF,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YAChC,MAAM,CAAC,SAAU,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CACxC,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CACxC,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC9B,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,+BAA+B,CAAC,CACrD,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,gDAAgD;YAChD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,+BAA+B,CAAC,CACrD,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAC7C,CAAC;YAEF,8BAA8B;YAC9B,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CAChD,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAE7D,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CACpC,CAAC;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,QAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,6BAA6B,CAAC,CACnD,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;YAE1C,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAChD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CACvC,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;YACjC,MAAM,CAAC,UAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAC3C,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAC/B,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,MAAM,CACV,SAAS,CAAC,OAAO,CAAC,6BAA6B,CAAC,CACjD,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,kBAAkB,GAAG,IAAI,mBAAmB,CAAC;gBACjD,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAC7C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,6BAA6B,CAAC,CACnD,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,kBAAkB,GAAG,IAAI,mBAAmB,CAAC;gBACjD,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAC7C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,6BAA6B,CAAC,CACnD,CAAC;YAEF,6DAA6D;YAC7D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,+CAA+C;YAC/C,yBAAyB;YACzB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAC1C,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAC/B,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAC5C,CAAC;YAEF,iDAAiD;YACjD,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBAClC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,mBAAmB;YACnB,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CACzC,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAEzC,wCAAwC;YACxC,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAC5C,CAAC;YAEF,kDAAkD;YAClD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../../../../../src/lint/tests/fixtures/svelte/mixed/utils/format.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,MAAc;IACnD,OAAO,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../../../../src/lint/tests/fixtures/svelte/typescript/helper.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|