@noego/forge 0.1.24 → 0.1.27
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/README.md +2 -0
- package/dist/client.cjs +3 -3
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.ts +25 -0
- package/dist/client.mjs +895 -824
- package/dist/client.mjs.map +1 -1
- package/dist/lint/cli.js +28 -2
- package/dist/lint/cli.js.map +1 -1
- package/dist/lint/config.js +19 -2
- package/dist/lint/config.js.map +1 -1
- package/dist/lint/route_parser.js +8 -30
- package/dist/lint/route_parser.js.map +1 -1
- 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/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/page.svelte-4uv4nQ2i.js.map +1 -1
- package/dist/page.svelte-CW8PJDdH.cjs.map +1 -1
- package/dist-ssr/{path-BqcF5dbs.js → path-2bYzpvRB.js} +3 -1
- package/dist-ssr/{path-BqcF5dbs.js.map → path-2bYzpvRB.js.map} +1 -1
- package/dist-ssr/{path-sxXxpB6R.cjs → path-DCxJMpj7.cjs} +3 -1
- package/dist-ssr/{path-sxXxpB6R.cjs.map → path-DCxJMpj7.cjs.map} +1 -1
- package/dist-ssr/server.cjs +20 -3
- package/dist-ssr/server.cjs.map +1 -1
- package/dist-ssr/server.js +20 -3
- package/dist-ssr/server.js.map +1 -1
- package/dist-ssr/shared.cjs +1 -1
- package/dist-ssr/shared.js +1 -1
- package/dist-ssr/static.cjs +1 -1
- package/dist-ssr/static.d.ts +4 -0
- package/dist-ssr/static.js +1 -1
- package/dist-ssr/test.d.ts +4 -0
- package/dist-ssr/{url_parser-DHQiBy_-.js → url_parser-B6dvK0DX.js} +36 -3
- package/dist-ssr/{url_parser-DHQiBy_-.js.map → url_parser-B6dvK0DX.js.map} +1 -1
- package/dist-ssr/{url_parser-BGkQselu.cjs → url_parser-D7ZqJUTw.cjs} +36 -3
- package/dist-ssr/{url_parser-BGkQselu.cjs.map → url_parser-D7ZqJUTw.cjs.map} +1 -1
- package/package.json +2 -2
- package/src/components/RecursiveRender.svelte +39 -18
package/dist/lint/cli.js
CHANGED
|
@@ -78,8 +78,34 @@ export async function runLint(args) {
|
|
|
78
78
|
console.log('Discovering files from route configuration...\n');
|
|
79
79
|
const routeFiles = await getSvelteFilesFromRoutes(cwd);
|
|
80
80
|
if (routeFiles.length > 0) {
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
console.log(`Found ${routeFiles.length} component(s) from route configuration\n`);
|
|
82
|
+
if (options.deps) {
|
|
83
|
+
// Collect dependencies for all route files
|
|
84
|
+
const seen = new Set();
|
|
85
|
+
const collector = new DependencyCollector({
|
|
86
|
+
recursive: true,
|
|
87
|
+
projectRoot: cwd,
|
|
88
|
+
});
|
|
89
|
+
for (const file of routeFiles) {
|
|
90
|
+
const result = await collector.collect(file);
|
|
91
|
+
for (const dep of result.dependencies) {
|
|
92
|
+
if (!seen.has(dep.file)) {
|
|
93
|
+
seen.add(dep.file);
|
|
94
|
+
filesToLint.push(dep.file);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (result.circular.length > 0) {
|
|
98
|
+
console.warn(`⚠️ Warning: Detected ${result.circular.length} circular dependencies:`);
|
|
99
|
+
for (const circ of result.circular) {
|
|
100
|
+
console.warn(` ${path.basename(circ.from)} ⟷ ${path.basename(circ.to)}`);
|
|
101
|
+
}
|
|
102
|
+
console.warn('');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
filesToLint = routeFiles;
|
|
108
|
+
}
|
|
83
109
|
}
|
|
84
110
|
else {
|
|
85
111
|
// Fallback: No route config found, use glob patterns
|
package/dist/lint/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/lint/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,IAAI,MAAM,MAAM,CAAC;AAUxB,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Bb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,OAAO,GAAgB;QAC3B,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,KAAK;KAChB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACtB,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACpE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC1B,CAAC;aAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAEhC,qBAAqB;IACrB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,CAAC;QACH,0BAA0B;QAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;QAEtC,IAAI,WAAW,GAAa,EAAE,CAAC;QAE/B,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,6DAA6D;YAC7D,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,MAAM,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAEvD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/lint/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/lint/config.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import noInvalidHtmlNesting from './rules/no_invalid_html_nesting.js';
|
|
1
2
|
/**
|
|
2
3
|
* Dynamically loads the lint configuration for zero-setup linting.
|
|
3
4
|
* Supports TypeScript in Svelte files out of the box.
|
|
@@ -10,11 +11,20 @@ export async function loadLintConfig() {
|
|
|
10
11
|
import('eslint-plugin-svelte').then((m) => m.default),
|
|
11
12
|
import('globals').then((m) => m.default),
|
|
12
13
|
]);
|
|
14
|
+
// Custom forge ESLint plugin with HTML validation rules
|
|
15
|
+
const forgePlugin = {
|
|
16
|
+
rules: {
|
|
17
|
+
'no-invalid-html-nesting': noInvalidHtmlNesting,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
13
20
|
return [
|
|
14
21
|
js.configs.recommended,
|
|
15
22
|
...tseslint.configs.recommended,
|
|
16
23
|
...sveltePlugin.configs['flat/recommended'],
|
|
17
24
|
{
|
|
25
|
+
plugins: {
|
|
26
|
+
forge: forgePlugin,
|
|
27
|
+
},
|
|
18
28
|
languageOptions: {
|
|
19
29
|
ecmaVersion: 2022,
|
|
20
30
|
sourceType: 'module',
|
|
@@ -25,12 +35,15 @@ export async function loadLintConfig() {
|
|
|
25
35
|
},
|
|
26
36
|
rules: {
|
|
27
37
|
// Svelte 5 specific rules
|
|
28
|
-
'svelte/valid-compile': '
|
|
38
|
+
'svelte/valid-compile': 'warn',
|
|
29
39
|
// Disable rules that TypeScript handles
|
|
30
40
|
'no-unused-vars': 'off',
|
|
31
41
|
'no-undef': 'off',
|
|
32
|
-
//
|
|
42
|
+
// Style rules - warn, not error (these don't cause crashes)
|
|
33
43
|
'@typescript-eslint/no-unused-vars': 'warn',
|
|
44
|
+
'@typescript-eslint/no-explicit-any': 'warn',
|
|
45
|
+
'svelte/require-each-key': 'warn',
|
|
46
|
+
'svelte/no-useless-mustaches': 'warn',
|
|
34
47
|
},
|
|
35
48
|
},
|
|
36
49
|
{
|
|
@@ -40,6 +53,10 @@ export async function loadLintConfig() {
|
|
|
40
53
|
parser: tseslint.parser,
|
|
41
54
|
},
|
|
42
55
|
},
|
|
56
|
+
rules: {
|
|
57
|
+
// HTML nesting validation for Svelte templates
|
|
58
|
+
'forge/no-invalid-html-nesting': 'error',
|
|
59
|
+
},
|
|
43
60
|
},
|
|
44
61
|
{
|
|
45
62
|
ignores: ['node_modules', 'dist', 'dist-ssr', '.svelte-kit'],
|
package/dist/lint/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lint/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lint/config.ts"],"names":[],"mappings":"AACA,OAAO,oBAAoB,MAAM,oCAAoC,CAAC;AAEtE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,qCAAqC;IACrC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9D,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3C,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAClD,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;KACzC,CAAC,CAAC;IAEH,wDAAwD;IACxD,MAAM,WAAW,GAAG;QAClB,KAAK,EAAE;YACL,yBAAyB,EAAE,oBAAoB;SAChD;KACF,CAAC;IAEF,OAAO;QACL,EAAE,CAAC,OAAO,CAAC,WAAW;QACtB,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW;QAC/B,GAAG,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAC3C;YACE,OAAO,EAAE;gBACP,KAAK,EAAE,WAAW;aACnB;YACD,eAAe,EAAE;gBACf,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,QAAQ;gBACpB,OAAO,EAAE;oBACP,GAAG,OAAO,CAAC,OAAO;oBAClB,GAAG,OAAO,CAAC,IAAI;iBAChB;aACF;YACD,KAAK,EAAE;gBACL,0BAA0B;gBAC1B,sBAAsB,EAAE,MAAM;gBAE9B,wCAAwC;gBACxC,gBAAgB,EAAE,KAAK;gBACvB,UAAU,EAAE,KAAK;gBAEjB,4DAA4D;gBAC5D,mCAAmC,EAAE,MAAM;gBAC3C,oCAAoC,EAAE,MAAM;gBAC5C,yBAAyB,EAAE,MAAM;gBACjC,6BAA6B,EAAE,MAAM;aACtC;SACF;QACD;YACE,KAAK,EAAE,CAAC,aAAa,CAAC;YACtB,eAAe,EAAE;gBACf,aAAa,EAAE;oBACb,MAAM,EAAE,QAAQ,CAAC,MAAM;iBACxB;aACF;YACD,KAAK,EAAE;gBACL,+CAA+C;gBAC/C,+BAA+B,EAAE,OAAO;aACzC;SACF;QACD;YACE,OAAO,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC;SAC7D;KACiB,CAAC;AACvB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from 'fs/promises';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import yaml from 'js-yaml';
|
|
4
|
+
import { ConfigParser, YamlMerger } from '@noego/stitch';
|
|
4
5
|
const NOEGO_CONFIG_FILENAMES = [
|
|
5
6
|
'noego.yaml',
|
|
6
7
|
'noego.yml',
|
|
@@ -115,39 +116,16 @@ function extractComponentsFromRoute(route, svelteFiles) {
|
|
|
115
116
|
}
|
|
116
117
|
}
|
|
117
118
|
}
|
|
118
|
-
async function parseYamlFile(filePath
|
|
119
|
-
// Avoid circular references
|
|
120
|
-
if (processedFiles.has(filePath)) {
|
|
121
|
-
return {};
|
|
122
|
-
}
|
|
123
|
-
processedFiles.add(filePath);
|
|
119
|
+
async function parseYamlFile(filePath) {
|
|
124
120
|
const content = await fs.readFile(filePath, 'utf-8');
|
|
125
121
|
const config = yaml.load(content);
|
|
126
|
-
// Handle stitch files
|
|
122
|
+
// Handle stitch files using @noego/stitch (same code path as runtime)
|
|
127
123
|
if (config?.stitch && Array.isArray(config.stitch)) {
|
|
128
|
-
const
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const resolvedPattern = path.resolve(baseDir, stitchPattern);
|
|
134
|
-
const files = await glob(resolvedPattern);
|
|
135
|
-
for (const file of files) {
|
|
136
|
-
const subConfig = await parseYamlFile(file, processedFiles);
|
|
137
|
-
// Merge paths
|
|
138
|
-
if (subConfig.paths) {
|
|
139
|
-
mergedConfig.paths = { ...mergedConfig.paths, ...subConfig.paths };
|
|
140
|
-
}
|
|
141
|
-
// Merge x-fallback values
|
|
142
|
-
if (subConfig['x-fallback-view'] && !mergedConfig['x-fallback-view']) {
|
|
143
|
-
mergedConfig['x-fallback-view'] = subConfig['x-fallback-view'];
|
|
144
|
-
}
|
|
145
|
-
if (subConfig['x-fallback-layout'] && !mergedConfig['x-fallback-layout']) {
|
|
146
|
-
mergedConfig['x-fallback-layout'] = subConfig['x-fallback-layout'];
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return mergedConfig;
|
|
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);
|
|
151
129
|
}
|
|
152
130
|
return config;
|
|
153
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route_parser.js","sourceRoot":"","sources":["../../src/lint/route_parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,IAAI,MAAM,SAAS,CAAC;
|
|
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,61 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { describe, it, expect } from 'vitest';
|
|
4
|
+
import { loadLintConfig } from '../config';
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = path.dirname(__filename);
|
|
7
|
+
const FIXTURES = path.join(__dirname, 'fixtures/svelte/errors');
|
|
8
|
+
describe('forge/no-invalid-html-nesting', () => {
|
|
9
|
+
it('should detect invalid HTML nesting in Svelte files', async () => {
|
|
10
|
+
const { ESLint } = await import('eslint');
|
|
11
|
+
const config = await loadLintConfig();
|
|
12
|
+
const eslint = new ESLint({
|
|
13
|
+
overrideConfigFile: true,
|
|
14
|
+
overrideConfig: config,
|
|
15
|
+
});
|
|
16
|
+
const results = await eslint.lintFiles([
|
|
17
|
+
path.join(FIXTURES, 'InvalidNesting.svelte'),
|
|
18
|
+
]);
|
|
19
|
+
const messages = results[0].messages.filter((m) => m.ruleId === 'forge/no-invalid-html-nesting');
|
|
20
|
+
// Should find: <a> in <a>, <button> in <a>, <a> in <button>, <form> in <form>
|
|
21
|
+
expect(messages.length).toBeGreaterThanOrEqual(4);
|
|
22
|
+
const messageTexts = messages.map((m) => m.message);
|
|
23
|
+
// <a> inside <a>
|
|
24
|
+
expect(messageTexts.some((m) => m.includes('<a>') && m.includes('descendant of <a>'))).toBe(true);
|
|
25
|
+
// <button> inside <a>
|
|
26
|
+
expect(messageTexts.some((m) => m.includes('<button>') && m.includes('descendant of <a>'))).toBe(true);
|
|
27
|
+
// <a> inside <button>
|
|
28
|
+
expect(messageTexts.some((m) => m.includes('<a>') && m.includes('descendant of <button>'))).toBe(true);
|
|
29
|
+
// <form> inside <form>
|
|
30
|
+
expect(messageTexts.some((m) => m.includes('<form>') && m.includes('descendant of <form>'))).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
it('should not report errors for valid HTML nesting', async () => {
|
|
33
|
+
const { ESLint } = await import('eslint');
|
|
34
|
+
const config = await loadLintConfig();
|
|
35
|
+
const eslint = new ESLint({
|
|
36
|
+
overrideConfigFile: true,
|
|
37
|
+
overrideConfig: config,
|
|
38
|
+
});
|
|
39
|
+
const results = await eslint.lintFiles([
|
|
40
|
+
path.join(FIXTURES, 'ValidNesting.svelte'),
|
|
41
|
+
]);
|
|
42
|
+
const messages = results[0].messages.filter((m) => m.ruleId === 'forge/no-invalid-html-nesting');
|
|
43
|
+
expect(messages).toHaveLength(0);
|
|
44
|
+
});
|
|
45
|
+
it('should report errors as severity 2 (error)', async () => {
|
|
46
|
+
const { ESLint } = await import('eslint');
|
|
47
|
+
const config = await loadLintConfig();
|
|
48
|
+
const eslint = new ESLint({
|
|
49
|
+
overrideConfigFile: true,
|
|
50
|
+
overrideConfig: config,
|
|
51
|
+
});
|
|
52
|
+
const results = await eslint.lintFiles([
|
|
53
|
+
path.join(FIXTURES, 'InvalidNesting.svelte'),
|
|
54
|
+
]);
|
|
55
|
+
const messages = results[0].messages.filter((m) => m.ruleId === 'forge/no-invalid-html-nesting');
|
|
56
|
+
for (const msg of messages) {
|
|
57
|
+
expect(msg.severity).toBe(2);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=no_invalid_html_nesting.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no_invalid_html_nesting.test.js","sourceRoot":"","sources":["../../../src/lint/tests/no_invalid_html_nesting.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,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,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,wBAAwB,CAAC,CAAC;AAEhE,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QAEtC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,kBAAkB,EAAE,IAAI;YACxB,cAAc,EAAE,MAAM;SACvB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SAC7C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,+BAA+B,CACpD,CAAC;QAEF,8EAA8E;QAC9E,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAElD,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAEpD,iBAAiB;QACjB,MAAM,CACJ,YAAY,CAAC,IAAI,CACf,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAC5D,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,sBAAsB;QACtB,MAAM,CACJ,YAAY,CAAC,IAAI,CACf,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CACjE,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,sBAAsB;QACtB,MAAM,CACJ,YAAY,CAAC,IAAI,CACf,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CACjE,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,uBAAuB;QACvB,MAAM,CACJ,YAAY,CAAC,IAAI,CACf,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAClE,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QAEtC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,kBAAkB,EAAE,IAAI;YACxB,cAAc,EAAE,MAAM;SACvB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,+BAA+B,CACpD,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QAEtC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,kBAAkB,EAAE,IAAI;YACxB,cAAc,EAAE,MAAM;SACvB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SAC7C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,+BAA+B,CACpD,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.svelte-4uv4nQ2i.js","sources":["../node_modules/path-to-regex/index.js","../src/parser/path.ts","../src/client/page.svelte.ts"],"sourcesContent":["module.exports = Regex;\n\nif (typeof window !== 'undefined') {\n\twindow.pathToRegex = Regex;\n}\n\nconst escapeRe = /([$.+*?=!:[\\]{}(|)/\\\\])/g;\n\n/**\n * defaultParam - simplistic polyfill for default function parament\n * @param {any} [obj]\n * @param {any} defaultValue\n * @return {any}\n */\nfunction defaultParam(obj, defaultValue) {\n\treturn typeof obj !== 'undefined' ? obj : defaultValue;\n}\n\n/**\n * Класс Regex [description].\n * @constructor\n * @param {Object} options [description].\n */\nfunction Regex(path, options) {\n\tthis.init(path, options);\n\treturn this;\n}\n\nRegex.prototype.init = function (\n\tpath = \"/\",\n\toptions = {}\n) {\n\tthis.options = {\n\t\tcase: typeof options.case === \"boolean\" ? options.case : true,\n\t\tseparators: typeof options.separators === \"string\" ? options.separators : \"/\",\n\t\tfromStart: typeof options.fromStart === \"boolean\" ? options.fromStart : true,\n\t\ttoEnd: typeof options.toEnd === \"boolean\" ? options.toEnd : true\n\t};\n\tthis.options.separator = \"[\" + this.escape(this.options.separators) + \"]\";\n\n\tif (path instanceof RegExp) {\n\t\tthis.restructureRegExp(path);\n\t} else if (typeof path === \"string\") {\n\t\tthis.restructurePath(path);\n\t}\n};\n\n/**\n * Метод преобразует строку с шаблоном пути, включающим в себя строковое представление регулярных выражений\n * и указадели на идентификаторы ключей в стиле Express.js в регулярное выражение\n * @param {string} path Строка содержащая шаблон пути. Может содержать в себе регулярные выражения и объявление ключей типа :id. Поведение имитирует аналогичный функционал библиотеки Express.js v.5.x\n */\nRegex.prototype.restructureRegExp = function (regexp) {\n\tregexp = defaultParam(regexp, /.*/);\n\tthis.keys = [];\n\tthis.path = undefined;\n\tthis.regstr = (\"\" + regexp);\n\tthis.regstr = this.regstr.substr(1, this.regstr.length - 2);\n\tthis.regexp = new RegExp(\n\t\tthis.regstr,\n\t\tthis.options.case ? \"\" : \"i\"\n\t);\n\n}\n\n/**\n * Метод преобразует строку с шаблоном пути, включающим в себя строковое представление регулярных выражений\n * и указадели на идентификаторы ключей в стиле Express.js в регулярное выражение\n * @param {string} path Строка содержащая шаблон пути. Может содержать в себе регулярные выражения и объявление ключей типа :id. Поведение имитирует аналогичный функционал библиотеки Express.js v.5.x\n */\nRegex.prototype.restructurePath = function (path) {\n\tpath = defaultParam(path, '/');\n\tthis.keys = [];\n\tthis.path = path;\n\tthis.regstr = \"\";\n\n\tconst separator = this.options.separator;\n\tconst notseparator = \"[^\" + this.escape(this.options.separators) + \"]\";\n\n\tlet offset = 0;\n\tlet count = 0;\n\t// 11. REGEXP toEnd[true]: /^[\\/]?foo\\/(.*?)[\\/]?$/\n\t// 11. REGEXP toEnd[false]: /^[\\/]?foo\\/(.*?)([\\/]|[\\/]?$)/i\n\n\tpath = path.replace(new RegExp(\"^\" + separator + \"*(.*?)\" + separator + \"*$\"), \"$1\");\n\t//path += this.options.separators[0];\n\n\tpath.replace(/:([a-z]\\w*)(\\((.*?)\\))?([\\?\\*\\+])?/gi, (str, key, a, pat, quant, index, string) => {\n\t\t// console.log(\"-----------------------------\");\n\t\t// console.log(\"str:\", str);\n\t\t// console.log(\"key:\", key);\n\t\t// console.log(\"a:\", a);\n\t\t// console.log(\"pat:\", pat);\n\t\t// console.log(\"quant:\", quant);\n\t\t// console.log(\"index:\", index);\n\t\t// console.log(\"string:\", string);\n\t\tcount++;\n\n\n\n\t\tconst isMultiple = (quant === \"*\" || quant === \"+\") ? true : false;\n\t\tconst isExtrude = /^(\\[[^\\[\\]]+\\]|\\([^\\(\\)]+\\)|\\.|\\\\.)[\\+\\*]$/.test(pat) ? true : false;\n\n\t\tlet isRequired = (quant !== \"*\" && quant !== \"?\") ? true : false;\n\t\tif (!quant && pat && /^(\\[[^\\[\\]]+\\]|\\([^\\(\\)]+\\)|\\.|\\\\.)[\\*\\?]?$/.test(pat)) isRequired = false;\n\n\t\tconst quantifier = quant ? quant : \"\";\n\t\t// console.log(\"isMultiple\", isMultiple);\n\t\t// console.log(\"isRequired\", isRequired);\n\n\t\t// const startChar = path.charAt(index-1);\n\t\tconst isStarted = (!index) ? true : this.separator(path.charAt(index - 1));\n\t\tconst isStoped = (index + str.length >= path.length) ? true : this.separator(path.charAt(index + str.length));\n\t\tconst isToken = isStarted && isStoped;\n\n\t\tif (index > offset) {\n\t\t\tconst text = path.substring(offset, index);\n\t\t\tconst regstr = this.escape(text);\n\t\t\tthis.regstr += regstr;\n\t\t}\n\n\t\tif (isToken && index) {\n\t\t\tif (!isMultiple || !isRequired) {\n\t\t\t\tif (pat && !isExtrude) {\n\t\t\t\t\tthis.regstr += \"?\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//console.log(\"isStarted\", isStarted);\n\t\t//console.log(\"isStoped\", isStoped);\n\t\t//console.log(\"isToken\", isToken);\n\t\t//console.log(\"this.regstr 1:\", this.regstr);\n\n\t\tconst pattern = (pat ? pat : notseparator + \"+\");\n\n\t\tconst regstr =\n\t\t\tisMultiple ?\n\t\t\t\tisToken ?\n\t\t\t\t\tisExtrude ?\n\t\t\t\t\t\t\"((?:\" + separator + \"?\" + pattern + \")\" + quantifier + \")\" :\n\t\t\t\t\t\t\"((?:\" + separator + \"\" + pattern + \")\" + quantifier + \")\" :\n\t\t\t\t\t\"((?:\" + notseparator + \"*\" + pattern + \")\" + quantifier + \")\" :\n\t\t\t\tisToken ?\n\t\t\t\t\tisExtrude ?\n\t\t\t\t\t\t\"(\" + pattern + \"?)\" + quantifier :\n\t\t\t\t\t\t\"(\" + pattern + \")\" + quantifier :\n\t\t\t\t\t\"(\" + pattern + \")\" + quantifier;\n\n\t\tthis.regstr += regstr;\n\n\t\tconst data = {\n\t\t\tkey: key,\n\t\t\tmultiple: isMultiple,\n\t\t\trequired: isRequired,\n\t\t\tindex: count,\n\t\t\tpattern: pattern\n\t\t};\n\t\tif (isMultiple)\n\t\t\tdata.regexp = new RegExp(pattern, this.options.case ? \"g\" : \"gi\");\n\n\t\tthis.keys.push(data);\n\n\t\toffset = index + str.length;\n\t\treturn str;\n\t});\n\n\tif (offset < path.length - 1) {\n\t\tconst text = path.substring(offset);\n\t\tconst regstr = this.escape(text);\n\t\tthis.regstr += regstr;\n\t}\n\n\tthis.regexp = new RegExp(\n\t\t(this.options.fromStart ? \"^\" : \"\") +\n\t\tseparator + \"?\" +\n\t\tthis.regstr +\n\t\t(this.options.toEnd\n\t\t\t?\n\t\t\tseparator + \"?\" + \"$\"\n\t\t\t:\n\t\t\t\"(\" + separator + \"|\" + separator + \"?\" + \"$\" + \")\"\n\t\t),\n\t\tthis.options.case ? \"\" : \"i\"\n\t);\n}\n\n\n\n/**\n * Метод экранирует все спец символы указанные в глобальной для модуля, переменной escapeRe\n * @param {string} text Любая строка\n * @return {string} Строка text, в которой все символы указанные в переменной escapeRe заэкранированы\n */\nRegex.prototype.escape = function (text) {\n\treturn text.replace(escapeRe, s => {\n\t\treturn \"\\\\\" + s\n\t});\n}\n\n/**\n * Метод проверяет является ли char одним из разделителей указанных в this.options.separators\n * @param {string} char Cтрока содержащая в себе проверяемый символ (длинна строки должна быть равна 1)\n * @return {boolean} Если проверяемый символ является одним из символов указанных в this.options.separators то true иначе false\n */\nRegex.prototype.separator = function (char) {\n\treturn !!(this.options.separators.indexOf(char) + 1);\n}\n\n\n\nRegex.prototype.match = function (path) {\n\t// console.log(\"match 01\");\n\n\tif (typeof path !== \"string\") return;\n\n\tconst reseparator = this.options.separator;\n\tconst separator = this.options.separators[0];\n\tpath = path.replace(new RegExp(\"^\" + reseparator + \"*(.*?)\" + reseparator + \"*$\"), separator + \"$1\" + separator);\n\n\t// console.log(\"match 02\");\n\tconst result = path.match(this.regexp);\n\t// console.log(\"match 03\");\n\n\tif (!result) return;\n\n\t// console.log(\"match 04\");\n\tconst data = {};\n\n\t// console.log(\"match 05\");\n\tthis.keys.forEach(item => {\n\t\t// console.log(\"match foreach 01\");\n\t\tlet isMultiple = false;\n\n\t\tif (data[item.key])\n\t\t\tisMultiple = true;\n\n\n\t\tif (data[item.key] && !Array.isArray(data[item.key])) {\n\t\t\tisMultiple = true;\n\t\t\tdata[item.key] = [data[item.key]];\n\t\t}\n\n\t\tif (item.multiple && !data[item.key]) {\n\t\t\tisMultiple = true;\n\t\t\tdata[item.key] = [];\n\t\t}\n\n\t\tlet value = result[item.index] ? result[item.index] : undefined;\n\n\t\tif (!isMultiple && !item.multiple) {\n\t\t\tdata[item.key] = value;\n\t\t\treturn;\n\t\t}\n\n\t\tif (isMultiple && !item.multiple && result[item.index]) {\n\t\t\tdata[item.key].push(value);\n\t\t\treturn;\n\t\t}\n\n\t\tif (result[item.index])\n\t\t\tresult[item.index].replace(item.regexp, str => {\n\t\t\t\tif (str) data[item.key].push(\n\t\t\t\t\tstr.replace(new RegExp(reseparator + \"*$\"), \"\")\n\t\t\t\t);\n\t\t\t});\n\n\t});\n\t// console.log(\"match 06\");\n\treturn data;\n};\n","import type {IRoute} from \"./IRoute\"\n\n/**\n * Convert OpenAPI‐style `{name[:pattern][modifier]}` into\n * path-to-regexp’s `:name(pattern)?*+` syntax, while\n * allowing literal `{` or `}` inside the regex.\n */\nexport function convertBraces(path: string): string {\n let out = '';\n let i = 0;\n\n while (i < path.length) {\n if (path[i] === '{') {\n // start of a parameter spec\n let start = i;\n i++;\n // find the matching closing '}' that balances this one\n let depth = 1;\n while (i < path.length && depth > 0) {\n if (path[i] === '\\\\') {\n // skip escaped chars\n i += 2;\n } else {\n if (path[i] === '{') depth++;\n else if (path[i] === '}') depth--;\n i++;\n }\n }\n if (depth !== 0) {\n throw new Error(`Unmatched '{' in path: ${path}`);\n }\n const segment = path.slice(start + 1, i - 1);\n // A segment is one of the following forms:\n // 1. \"name\" – simple param, no pattern, no modifier\n // 2. \"name+\" / \"name*\" / \"name?\" – param with modifier only\n // 3. \"name:regex\" – explicit pattern (may itself contain +, *, ?)\n // In the third case we must **not** interpret a trailing +, * or ? as a\n // modifier because it belongs to the user-supplied regex. The original\n // implementation used a single regexp with an optional modifier group,\n // which incorrectly split patterns such as `.*` or `.+` into two parts\n // (`.` as the pattern and `*` or `+` as the modifier). Instead we now\n // split on the first ':'; if a pattern is present we treat the rest of\n // the segment verbatim.\n\n const colonIdx = segment.indexOf(':');\n let name: string;\n let pattern: string | undefined;\n let modifier: string | undefined;\n\n if (colonIdx === -1) {\n // Forms 1 & 2 – no explicit pattern, so a trailing modifier is allowed.\n const m = segment.match(/^([^?*+]+)([?*+])?$/);\n if (!m) {\n throw new Error(`Invalid parameter segment: {${segment}}`);\n }\n [, name, modifier] = m as RegExpMatchArray & [string, string, string?];\n } else {\n // Form 3 – everything after the first ':' is the pattern.\n name = segment.slice(0, colonIdx);\n pattern = segment.slice(colonIdx + 1);\n // No modifier allowed when an explicit pattern is used.\n }\n\n out += `:${name}`;\n if (pattern) out += `(${pattern})`;\n if (modifier) out += modifier;\n } else {\n // ordinary char, copy (also handles escaped chars)\n out += path[i++];\n }\n }\n\n return out;\n}\n\n\nexport function parsePathConfig(\n path:string,\n method:string,\n path_config:any,\n inheritedMiddleware: string[] = []\n):IRoute {\n const rawLayout = path_config?.['x-layout'];\n const layout = (typeof rawLayout === 'string') ? [rawLayout]\n : (Array.isArray(rawLayout) ? rawLayout : undefined);\n const view = path_config['x-view']\n const summary = path_config.summary\n const query = path_config.query\n const body = path_config.body\n const parameters = path_config.parameters\n const responses = path_config.responses\n const routeMiddleware = Array.isArray(path_config['x-middleware']) ? path_config['x-middleware'] : []\n const middleware = [...inheritedMiddleware, ...routeMiddleware]\n\n return {\n summary,\n path: convertBraces(path),\n method,\n layout,\n middleware,\n view,\n responses,\n parameters,\n query,\n body\n }\n}\n","import type { IPage } from \"../routing/page\";\nimport path_to_regex from \"path-to-regex\"\nimport {convertBraces} from \"../parser/path\";\nimport { writable } from 'svelte/store';\n\nexport const page = writable<IPage>({\n url: '',\n pathname:'',\n params: {},\n query:{},\n poll: async () => false, // Placeholder - will be set by navigation.svelte.ts\n});\n\n\nif(typeof window !== 'undefined') {\n page.update(p => {\n p.url = window.location.href;\n p.pathname = window.location.pathname;\n Object.assign(p.query, Object.fromEntries(new URLSearchParams(window.location.search)));\n p.params = {};\n return p;\n });\n}\n\n\nconst patterns:Record<string,any> = {}\nexport function shadowUrl(pattern:string, url: string){\n if(!patterns[pattern]) {\n patterns[pattern] = new path_to_regex(convertBraces(pattern))\n }\n const match = patterns[pattern].match(url)\n if(match) {\n return match\n }else{\n return {}\n }\n}\n"],"names":["pathToRegex","Regex","escapeRe","defaultParam","obj","defaultValue","path","options","regexp","separator","notseparator","offset","count","str","key","a","pat","quant","index","string","isMultiple","isExtrude","isRequired","quantifier","isStarted","isStoped","isToken","text","regstr","pattern","data","s","char","reseparator","result","item","value","convertBraces","out","i","start","depth","segment","colonIdx","name","modifier","m","page","writable","p","patterns","shadowUrl","url","path_to_regex","match"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"page.svelte-4uv4nQ2i.js","sources":["../node_modules/path-to-regex/index.js","../src/parser/path.ts","../src/client/page.svelte.ts"],"sourcesContent":["module.exports = Regex;\n\nif (typeof window !== 'undefined') {\n\twindow.pathToRegex = Regex;\n}\n\nconst escapeRe = /([$.+*?=!:[\\]{}(|)/\\\\])/g;\n\n/**\n * defaultParam - simplistic polyfill for default function parament\n * @param {any} [obj]\n * @param {any} defaultValue\n * @return {any}\n */\nfunction defaultParam(obj, defaultValue) {\n\treturn typeof obj !== 'undefined' ? obj : defaultValue;\n}\n\n/**\n * Класс Regex [description].\n * @constructor\n * @param {Object} options [description].\n */\nfunction Regex(path, options) {\n\tthis.init(path, options);\n\treturn this;\n}\n\nRegex.prototype.init = function (\n\tpath = \"/\",\n\toptions = {}\n) {\n\tthis.options = {\n\t\tcase: typeof options.case === \"boolean\" ? options.case : true,\n\t\tseparators: typeof options.separators === \"string\" ? options.separators : \"/\",\n\t\tfromStart: typeof options.fromStart === \"boolean\" ? options.fromStart : true,\n\t\ttoEnd: typeof options.toEnd === \"boolean\" ? options.toEnd : true\n\t};\n\tthis.options.separator = \"[\" + this.escape(this.options.separators) + \"]\";\n\n\tif (path instanceof RegExp) {\n\t\tthis.restructureRegExp(path);\n\t} else if (typeof path === \"string\") {\n\t\tthis.restructurePath(path);\n\t}\n};\n\n/**\n * Метод преобразует строку с шаблоном пути, включающим в себя строковое представление регулярных выражений\n * и указадели на идентификаторы ключей в стиле Express.js в регулярное выражение\n * @param {string} path Строка содержащая шаблон пути. Может содержать в себе регулярные выражения и объявление ключей типа :id. Поведение имитирует аналогичный функционал библиотеки Express.js v.5.x\n */\nRegex.prototype.restructureRegExp = function (regexp) {\n\tregexp = defaultParam(regexp, /.*/);\n\tthis.keys = [];\n\tthis.path = undefined;\n\tthis.regstr = (\"\" + regexp);\n\tthis.regstr = this.regstr.substr(1, this.regstr.length - 2);\n\tthis.regexp = new RegExp(\n\t\tthis.regstr,\n\t\tthis.options.case ? \"\" : \"i\"\n\t);\n\n}\n\n/**\n * Метод преобразует строку с шаблоном пути, включающим в себя строковое представление регулярных выражений\n * и указадели на идентификаторы ключей в стиле Express.js в регулярное выражение\n * @param {string} path Строка содержащая шаблон пути. Может содержать в себе регулярные выражения и объявление ключей типа :id. Поведение имитирует аналогичный функционал библиотеки Express.js v.5.x\n */\nRegex.prototype.restructurePath = function (path) {\n\tpath = defaultParam(path, '/');\n\tthis.keys = [];\n\tthis.path = path;\n\tthis.regstr = \"\";\n\n\tconst separator = this.options.separator;\n\tconst notseparator = \"[^\" + this.escape(this.options.separators) + \"]\";\n\n\tlet offset = 0;\n\tlet count = 0;\n\t// 11. REGEXP toEnd[true]: /^[\\/]?foo\\/(.*?)[\\/]?$/\n\t// 11. REGEXP toEnd[false]: /^[\\/]?foo\\/(.*?)([\\/]|[\\/]?$)/i\n\n\tpath = path.replace(new RegExp(\"^\" + separator + \"*(.*?)\" + separator + \"*$\"), \"$1\");\n\t//path += this.options.separators[0];\n\n\tpath.replace(/:([a-z]\\w*)(\\((.*?)\\))?([\\?\\*\\+])?/gi, (str, key, a, pat, quant, index, string) => {\n\t\t// console.log(\"-----------------------------\");\n\t\t// console.log(\"str:\", str);\n\t\t// console.log(\"key:\", key);\n\t\t// console.log(\"a:\", a);\n\t\t// console.log(\"pat:\", pat);\n\t\t// console.log(\"quant:\", quant);\n\t\t// console.log(\"index:\", index);\n\t\t// console.log(\"string:\", string);\n\t\tcount++;\n\n\n\n\t\tconst isMultiple = (quant === \"*\" || quant === \"+\") ? true : false;\n\t\tconst isExtrude = /^(\\[[^\\[\\]]+\\]|\\([^\\(\\)]+\\)|\\.|\\\\.)[\\+\\*]$/.test(pat) ? true : false;\n\n\t\tlet isRequired = (quant !== \"*\" && quant !== \"?\") ? true : false;\n\t\tif (!quant && pat && /^(\\[[^\\[\\]]+\\]|\\([^\\(\\)]+\\)|\\.|\\\\.)[\\*\\?]?$/.test(pat)) isRequired = false;\n\n\t\tconst quantifier = quant ? quant : \"\";\n\t\t// console.log(\"isMultiple\", isMultiple);\n\t\t// console.log(\"isRequired\", isRequired);\n\n\t\t// const startChar = path.charAt(index-1);\n\t\tconst isStarted = (!index) ? true : this.separator(path.charAt(index - 1));\n\t\tconst isStoped = (index + str.length >= path.length) ? true : this.separator(path.charAt(index + str.length));\n\t\tconst isToken = isStarted && isStoped;\n\n\t\tif (index > offset) {\n\t\t\tconst text = path.substring(offset, index);\n\t\t\tconst regstr = this.escape(text);\n\t\t\tthis.regstr += regstr;\n\t\t}\n\n\t\tif (isToken && index) {\n\t\t\tif (!isMultiple || !isRequired) {\n\t\t\t\tif (pat && !isExtrude) {\n\t\t\t\t\tthis.regstr += \"?\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//console.log(\"isStarted\", isStarted);\n\t\t//console.log(\"isStoped\", isStoped);\n\t\t//console.log(\"isToken\", isToken);\n\t\t//console.log(\"this.regstr 1:\", this.regstr);\n\n\t\tconst pattern = (pat ? pat : notseparator + \"+\");\n\n\t\tconst regstr =\n\t\t\tisMultiple ?\n\t\t\t\tisToken ?\n\t\t\t\t\tisExtrude ?\n\t\t\t\t\t\t\"((?:\" + separator + \"?\" + pattern + \")\" + quantifier + \")\" :\n\t\t\t\t\t\t\"((?:\" + separator + \"\" + pattern + \")\" + quantifier + \")\" :\n\t\t\t\t\t\"((?:\" + notseparator + \"*\" + pattern + \")\" + quantifier + \")\" :\n\t\t\t\tisToken ?\n\t\t\t\t\tisExtrude ?\n\t\t\t\t\t\t\"(\" + pattern + \"?)\" + quantifier :\n\t\t\t\t\t\t\"(\" + pattern + \")\" + quantifier :\n\t\t\t\t\t\"(\" + pattern + \")\" + quantifier;\n\n\t\tthis.regstr += regstr;\n\n\t\tconst data = {\n\t\t\tkey: key,\n\t\t\tmultiple: isMultiple,\n\t\t\trequired: isRequired,\n\t\t\tindex: count,\n\t\t\tpattern: pattern\n\t\t};\n\t\tif (isMultiple)\n\t\t\tdata.regexp = new RegExp(pattern, this.options.case ? \"g\" : \"gi\");\n\n\t\tthis.keys.push(data);\n\n\t\toffset = index + str.length;\n\t\treturn str;\n\t});\n\n\tif (offset < path.length - 1) {\n\t\tconst text = path.substring(offset);\n\t\tconst regstr = this.escape(text);\n\t\tthis.regstr += regstr;\n\t}\n\n\tthis.regexp = new RegExp(\n\t\t(this.options.fromStart ? \"^\" : \"\") +\n\t\tseparator + \"?\" +\n\t\tthis.regstr +\n\t\t(this.options.toEnd\n\t\t\t?\n\t\t\tseparator + \"?\" + \"$\"\n\t\t\t:\n\t\t\t\"(\" + separator + \"|\" + separator + \"?\" + \"$\" + \")\"\n\t\t),\n\t\tthis.options.case ? \"\" : \"i\"\n\t);\n}\n\n\n\n/**\n * Метод экранирует все спец символы указанные в глобальной для модуля, переменной escapeRe\n * @param {string} text Любая строка\n * @return {string} Строка text, в которой все символы указанные в переменной escapeRe заэкранированы\n */\nRegex.prototype.escape = function (text) {\n\treturn text.replace(escapeRe, s => {\n\t\treturn \"\\\\\" + s\n\t});\n}\n\n/**\n * Метод проверяет является ли char одним из разделителей указанных в this.options.separators\n * @param {string} char Cтрока содержащая в себе проверяемый символ (длинна строки должна быть равна 1)\n * @return {boolean} Если проверяемый символ является одним из символов указанных в this.options.separators то true иначе false\n */\nRegex.prototype.separator = function (char) {\n\treturn !!(this.options.separators.indexOf(char) + 1);\n}\n\n\n\nRegex.prototype.match = function (path) {\n\t// console.log(\"match 01\");\n\n\tif (typeof path !== \"string\") return;\n\n\tconst reseparator = this.options.separator;\n\tconst separator = this.options.separators[0];\n\tpath = path.replace(new RegExp(\"^\" + reseparator + \"*(.*?)\" + reseparator + \"*$\"), separator + \"$1\" + separator);\n\n\t// console.log(\"match 02\");\n\tconst result = path.match(this.regexp);\n\t// console.log(\"match 03\");\n\n\tif (!result) return;\n\n\t// console.log(\"match 04\");\n\tconst data = {};\n\n\t// console.log(\"match 05\");\n\tthis.keys.forEach(item => {\n\t\t// console.log(\"match foreach 01\");\n\t\tlet isMultiple = false;\n\n\t\tif (data[item.key])\n\t\t\tisMultiple = true;\n\n\n\t\tif (data[item.key] && !Array.isArray(data[item.key])) {\n\t\t\tisMultiple = true;\n\t\t\tdata[item.key] = [data[item.key]];\n\t\t}\n\n\t\tif (item.multiple && !data[item.key]) {\n\t\t\tisMultiple = true;\n\t\t\tdata[item.key] = [];\n\t\t}\n\n\t\tlet value = result[item.index] ? result[item.index] : undefined;\n\n\t\tif (!isMultiple && !item.multiple) {\n\t\t\tdata[item.key] = value;\n\t\t\treturn;\n\t\t}\n\n\t\tif (isMultiple && !item.multiple && result[item.index]) {\n\t\t\tdata[item.key].push(value);\n\t\t\treturn;\n\t\t}\n\n\t\tif (result[item.index])\n\t\t\tresult[item.index].replace(item.regexp, str => {\n\t\t\t\tif (str) data[item.key].push(\n\t\t\t\t\tstr.replace(new RegExp(reseparator + \"*$\"), \"\")\n\t\t\t\t);\n\t\t\t});\n\n\t});\n\t// console.log(\"match 06\");\n\treturn data;\n};\n","import type {IRoute} from \"./IRoute\"\n\n/**\n * Convert OpenAPI‐style `{name[:pattern][modifier]}` into\n * path-to-regexp’s `:name(pattern)?*+` syntax, while\n * allowing literal `{` or `}` inside the regex.\n */\nexport function convertBraces(path: string): string {\n let out = '';\n let i = 0;\n\n while (i < path.length) {\n if (path[i] === '{') {\n // start of a parameter spec\n let start = i;\n i++;\n // find the matching closing '}' that balances this one\n let depth = 1;\n while (i < path.length && depth > 0) {\n if (path[i] === '\\\\') {\n // skip escaped chars\n i += 2;\n } else {\n if (path[i] === '{') depth++;\n else if (path[i] === '}') depth--;\n i++;\n }\n }\n if (depth !== 0) {\n throw new Error(`Unmatched '{' in path: ${path}`);\n }\n const segment = path.slice(start + 1, i - 1);\n // A segment is one of the following forms:\n // 1. \"name\" – simple param, no pattern, no modifier\n // 2. \"name+\" / \"name*\" / \"name?\" – param with modifier only\n // 3. \"name:regex\" – explicit pattern (may itself contain +, *, ?)\n // In the third case we must **not** interpret a trailing +, * or ? as a\n // modifier because it belongs to the user-supplied regex. The original\n // implementation used a single regexp with an optional modifier group,\n // which incorrectly split patterns such as `.*` or `.+` into two parts\n // (`.` as the pattern and `*` or `+` as the modifier). Instead we now\n // split on the first ':'; if a pattern is present we treat the rest of\n // the segment verbatim.\n\n const colonIdx = segment.indexOf(':');\n let name: string;\n let pattern: string | undefined;\n let modifier: string | undefined;\n\n if (colonIdx === -1) {\n // Forms 1 & 2 – no explicit pattern, so a trailing modifier is allowed.\n const m = segment.match(/^([^?*+]+)([?*+])?$/);\n if (!m) {\n throw new Error(`Invalid parameter segment: {${segment}}`);\n }\n [, name, modifier] = m as RegExpMatchArray & [string, string, string?];\n } else {\n // Form 3 – everything after the first ':' is the pattern.\n name = segment.slice(0, colonIdx);\n pattern = segment.slice(colonIdx + 1);\n // No modifier allowed when an explicit pattern is used.\n }\n\n out += `:${name}`;\n if (pattern) out += `(${pattern})`;\n if (modifier) out += modifier;\n } else {\n // ordinary char, copy (also handles escaped chars)\n out += path[i++];\n }\n }\n\n return out;\n}\n\n\nexport function parsePathConfig(\n path:string,\n method:string,\n path_config:any,\n inheritedMiddleware: string[] = []\n):IRoute {\n const rawLayout = path_config?.['x-layout'];\n const layout = (typeof rawLayout === 'string') ? [rawLayout]\n : (Array.isArray(rawLayout) ? rawLayout : undefined);\n const view = path_config['x-view']\n const controller = path_config['x-controller'] || undefined\n const summary = path_config.summary\n const query = path_config.query\n const body = path_config.body\n const parameters = path_config.parameters\n const responses = path_config.responses\n const routeMiddleware = Array.isArray(path_config['x-middleware']) ? path_config['x-middleware'] : []\n const middleware = [...inheritedMiddleware, ...routeMiddleware]\n\n return {\n summary,\n path: convertBraces(path),\n method,\n layout,\n middleware,\n view,\n controller,\n responses,\n parameters,\n query,\n body\n }\n}\n","import type { IPage } from \"../routing/page\";\nimport path_to_regex from \"path-to-regex\"\nimport {convertBraces} from \"../parser/path\";\nimport { writable } from 'svelte/store';\n\nexport const page = writable<IPage>({\n url: '',\n pathname:'',\n params: {},\n query:{},\n poll: async () => false, // Placeholder - will be set by navigation.svelte.ts\n});\n\n\nif(typeof window !== 'undefined') {\n page.update(p => {\n p.url = window.location.href;\n p.pathname = window.location.pathname;\n Object.assign(p.query, Object.fromEntries(new URLSearchParams(window.location.search)));\n p.params = {};\n return p;\n });\n}\n\n\nconst patterns:Record<string,any> = {}\nexport function shadowUrl(pattern:string, url: string){\n if(!patterns[pattern]) {\n patterns[pattern] = new path_to_regex(convertBraces(pattern))\n }\n const match = patterns[pattern].match(url)\n if(match) {\n return match\n }else{\n return {}\n }\n}\n"],"names":["pathToRegex","Regex","escapeRe","defaultParam","obj","defaultValue","path","options","regexp","separator","notseparator","offset","count","str","key","a","pat","quant","index","string","isMultiple","isExtrude","isRequired","quantifier","isStarted","isStoped","isToken","text","regstr","pattern","data","s","char","reseparator","result","item","value","convertBraces","out","i","start","depth","segment","colonIdx","name","modifier","m","page","writable","p","patterns","shadowUrl","url","path_to_regex","match"],"mappings":"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","x_google_ignoreList":[0]}
|