@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.
Files changed (52) hide show
  1. package/bin/forge.js +18 -2
  2. package/dist/client.cjs +3 -3
  3. package/dist/client.cjs.map +1 -1
  4. package/dist/client.mjs +696 -645
  5. package/dist/client.mjs.map +1 -1
  6. package/dist/lint/cli.d.ts +9 -0
  7. package/dist/lint/cli.js +254 -0
  8. package/dist/lint/cli.js.map +1 -0
  9. package/dist/lint/config.d.ts +6 -0
  10. package/dist/lint/config.js +66 -0
  11. package/dist/lint/config.js.map +1 -0
  12. package/dist/lint/dependency_collector.d.ts +39 -0
  13. package/dist/lint/dependency_collector.js +205 -0
  14. package/dist/lint/dependency_collector.js.map +1 -0
  15. package/dist/lint/errors.d.ts +4 -0
  16. package/dist/lint/errors.js +10 -0
  17. package/dist/lint/errors.js.map +1 -0
  18. package/dist/lint/eslint_loader.d.ts +3 -0
  19. package/dist/lint/eslint_loader.js +11 -0
  20. package/dist/lint/eslint_loader.js.map +1 -0
  21. package/dist/lint/route_parser.d.ts +2 -0
  22. package/dist/lint/route_parser.js +214 -0
  23. package/dist/lint/route_parser.js.map +1 -0
  24. package/dist/lint/rules/no_invalid_html_nesting.d.ts +3 -0
  25. package/dist/lint/rules/no_invalid_html_nesting.js +123 -0
  26. package/dist/lint/rules/no_invalid_html_nesting.js.map +1 -0
  27. package/dist/lint/tests/dependency_collector.test.d.ts +1 -0
  28. package/dist/lint/tests/dependency_collector.test.js +220 -0
  29. package/dist/lint/tests/dependency_collector.test.js.map +1 -0
  30. package/dist/lint/tests/fixtures/svelte/mixed/utils/format.d.ts +2 -0
  31. package/dist/lint/tests/fixtures/svelte/mixed/utils/format.js +7 -0
  32. package/dist/lint/tests/fixtures/svelte/mixed/utils/format.js.map +1 -0
  33. package/dist/lint/tests/fixtures/svelte/typescript/helper.d.ts +7 -0
  34. package/dist/lint/tests/fixtures/svelte/typescript/helper.js +7 -0
  35. package/dist/lint/tests/fixtures/svelte/typescript/helper.js.map +1 -0
  36. package/dist/lint/tests/no_invalid_html_nesting.test.d.ts +1 -0
  37. package/dist/lint/tests/no_invalid_html_nesting.test.js +61 -0
  38. package/dist/lint/tests/no_invalid_html_nesting.test.js.map +1 -0
  39. package/dist-ssr/server.cjs +17 -1
  40. package/dist-ssr/server.cjs.map +1 -1
  41. package/dist-ssr/server.js +17 -1
  42. package/dist-ssr/server.js.map +1 -1
  43. package/dist-ssr/static.cjs +1 -1
  44. package/dist-ssr/static.d.ts +3 -0
  45. package/dist-ssr/static.js +1 -1
  46. package/dist-ssr/test.d.ts +3 -0
  47. package/dist-ssr/{url_parser-DHQiBy_-.js → url_parser-BX00zzMP.js} +35 -2
  48. package/dist-ssr/{url_parser-DHQiBy_-.js.map → url_parser-BX00zzMP.js.map} +1 -1
  49. package/dist-ssr/{url_parser-BGkQselu.cjs → url_parser-Dipo_fiS.cjs} +35 -2
  50. package/dist-ssr/{url_parser-BGkQselu.cjs.map → url_parser-Dipo_fiS.cjs.map} +1 -1
  51. package/package.json +16 -3
  52. 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,3 @@
1
+ import type { Rule } from 'eslint';
2
+ declare const rule: Rule.RuleModule;
3
+ export default rule;
@@ -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":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function format(text: string): string;
2
+ export declare function truncate(text: string, length: number): string;
@@ -0,0 +1,7 @@
1
+ export function format(text) {
2
+ return text.toUpperCase();
3
+ }
4
+ export function truncate(text, length) {
5
+ return text.length > length ? text.slice(0, length) + '...' : text;
6
+ }
7
+ //# sourceMappingURL=format.js.map
@@ -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,7 @@
1
+ export declare function formatDate(date: Date): string;
2
+ export declare function formatTime(date: Date): string;
3
+ export type DateFormat = 'iso' | 'locale';
4
+ export interface DateOptions {
5
+ format: DateFormat;
6
+ timezone?: string;
7
+ }
@@ -0,0 +1,7 @@
1
+ export function formatDate(date) {
2
+ return date.toISOString();
3
+ }
4
+ export function formatTime(date) {
5
+ return date.toLocaleTimeString();
6
+ }
7
+ //# sourceMappingURL=helper.js.map
@@ -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 {};