@noego/forge 0.0.6 → 0.0.8

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 (37) hide show
  1. package/README.md +5 -1
  2. package/dist/client.cjs +1 -1
  3. package/dist/client.cjs.map +1 -1
  4. package/dist/client.d.ts +5 -0
  5. package/dist/client.mjs +32 -32
  6. package/dist/client.mjs.map +1 -1
  7. package/dist/index.plugins.cjs +9 -0
  8. package/dist/index.plugins.cjs.map +1 -0
  9. package/dist/index.plugins.d.ts +2 -0
  10. package/dist/index.plugins.js +2 -0
  11. package/dist/index.plugins.js.map +1 -0
  12. package/dist/page.mjs +1 -1
  13. package/dist/{page.svelte-C4chAYK2.js → page.svelte-Bq1Q01H0.js} +2 -7
  14. package/dist/{page.svelte-C4chAYK2.js.map → page.svelte-Bq1Q01H0.js.map} +1 -1
  15. package/dist/page.svelte-Dvj7306U.cjs.map +1 -1
  16. package/dist/plugins/serverOnlyStub.cjs +226 -0
  17. package/dist/plugins/serverOnlyStub.cjs.map +1 -0
  18. package/dist/plugins/serverOnlyStub.js +200 -0
  19. package/dist/plugins/serverOnlyStub.js.map +1 -0
  20. package/dist/shared.mjs +1 -1
  21. package/dist/stubs/server-only.d.ts +3 -0
  22. package/dist/stubs/server-only.js +7 -0
  23. package/dist/stubs/server-only.js.map +1 -0
  24. package/dist-ssr/{path-ODk1FhWY.js → path-9twSsimy.js} +5 -2
  25. package/dist-ssr/{path-ODk1FhWY.js.map → path-9twSsimy.js.map} +1 -1
  26. package/dist-ssr/{path-CyGuWUeq.cjs → path-Dm_4PXDW.cjs} +5 -2
  27. package/dist-ssr/{path-CyGuWUeq.cjs.map → path-Dm_4PXDW.cjs.map} +1 -1
  28. package/dist-ssr/server.cjs +250 -74
  29. package/dist-ssr/server.cjs.map +1 -1
  30. package/dist-ssr/server.d.ts +6 -1
  31. package/dist-ssr/server.js +245 -69
  32. package/dist-ssr/server.js.map +1 -1
  33. package/dist-ssr/shared.cjs +2 -7
  34. package/dist-ssr/shared.cjs.map +1 -1
  35. package/dist-ssr/shared.js +2 -7
  36. package/dist-ssr/shared.js.map +1 -1
  37. package/package.json +12 -4
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ // src/plugins/serverOnlyStub.ts
27
+ const fs = __importStar(require("node:fs"));
28
+ const path = __importStar(require("node:path"));
29
+ const es_module_lexer_1 = require("es-module-lexer");
30
+ const DEFAULT_STUB = `export const __server_only__ = true;
31
+
32
+ const __serverOnlyThrow = (name) => {
33
+ throw new Error('[server-only] Client tried to access: ' + name);
34
+ };
35
+
36
+ const __serverOnlyProxy = new Proxy(() => {
37
+ __serverOnlyThrow('default export');
38
+ }, {
39
+ get(_t, prop) {
40
+ if (prop === Symbol.toStringTag) return 'ServerOnlyStub';
41
+ if (prop === 'toString') return () => 'ServerOnlyStub';
42
+ __serverOnlyThrow('default export.' + String(prop));
43
+ },
44
+ apply() {
45
+ __serverOnlyThrow('default export');
46
+ },
47
+ construct() {
48
+ __serverOnlyThrow('default export');
49
+ }
50
+ });
51
+
52
+ export default __serverOnlyProxy;
53
+ `;
54
+ const stubCache = new Map();
55
+ function toArray(value) {
56
+ return Array.isArray(value) ? value : [value];
57
+ }
58
+ function resolvePath(root, input) {
59
+ return path.isAbsolute(input) ? input : path.resolve(root, input);
60
+ }
61
+ function normalise(realPathCandidate) {
62
+ return fs.realpathSync(realPathCandidate);
63
+ }
64
+ function categoriseTargets(root, include) {
65
+ const files = new Set();
66
+ const dirs = [];
67
+ for (const entry of toArray(include)) {
68
+ const abs = resolvePath(root, entry);
69
+ if (!fs.existsSync(abs)) {
70
+ throw new Error(`[serverOnlyStub] include path not found: ${entry}`);
71
+ }
72
+ const stat = fs.statSync(abs);
73
+ const real = normalise(abs);
74
+ if (stat.isDirectory()) {
75
+ dirs.push(real);
76
+ }
77
+ else if (stat.isFile()) {
78
+ files.add(real);
79
+ }
80
+ else {
81
+ throw new Error(`[serverOnlyStub] include must be a file or directory: ${entry}`);
82
+ }
83
+ }
84
+ return { files, dirs };
85
+ }
86
+ function pickStub(root, stubFile) {
87
+ if (!stubFile)
88
+ return null;
89
+ const abs = resolvePath(root, stubFile);
90
+ if (!fs.existsSync(abs)) {
91
+ throw new Error(`[serverOnlyStub] stubFile not found: ${stubFile}`);
92
+ }
93
+ return fs.readFileSync(abs, 'utf8');
94
+ }
95
+ function normaliseLoadedId(root, id) {
96
+ const base = id.split('?')[0];
97
+ const withoutFsPrefix = base.startsWith('/@fs/') ? base.slice(4) : base;
98
+ const candidate = path.isAbsolute(withoutFsPrefix) ? withoutFsPrefix : path.resolve(root, withoutFsPrefix);
99
+ try {
100
+ return normalise(candidate);
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ }
106
+ function toDisplayPath(root, filePath) {
107
+ const rel = path.relative(root, filePath);
108
+ if (rel && !rel.startsWith('..') && !path.isAbsolute(rel)) {
109
+ return rel.split(path.sep).join('/');
110
+ }
111
+ return filePath.split(path.sep).join('/');
112
+ }
113
+ function extractExportInfo(code, id) {
114
+ const [, exportEntries] = (0, es_module_lexer_1.parse)(code, id);
115
+ let hasDefault = false;
116
+ let hasStar = false;
117
+ const named = new Set();
118
+ for (const entry of exportEntries) {
119
+ const exportedName = entry.n;
120
+ if (exportedName === 'default') {
121
+ hasDefault = true;
122
+ continue;
123
+ }
124
+ if (exportedName === '*') {
125
+ hasStar = true;
126
+ continue;
127
+ }
128
+ if (exportedName) {
129
+ named.add(exportedName);
130
+ }
131
+ }
132
+ return { hasDefault, named: Array.from(named).sort(), hasStar };
133
+ }
134
+ function buildDynamicStub(moduleDisplay, info) {
135
+ if (info.hasStar) {
136
+ return DEFAULT_STUB;
137
+ }
138
+ const lines = [];
139
+ lines.push('export const __server_only__ = true;');
140
+ lines.push(`const __serverOnlyModuleId = ${JSON.stringify(moduleDisplay)};`);
141
+ lines.push(`function __serverOnlyFailure(name) { throw new Error('[server-only] Client tried to access: ' + __serverOnlyModuleId + (name ? ' -> ' + name : '')); }`);
142
+ lines.push('function __createServerOnlyStub(name) {');
143
+ lines.push(' const label = name ?? "default export";');
144
+ lines.push(' const fn = function () { __serverOnlyFailure(label); };');
145
+ lines.push(' return new Proxy(fn, {');
146
+ lines.push(' get(_target, prop) {');
147
+ lines.push(' if (prop === Symbol.toStringTag) return "ServerOnlyStub";');
148
+ lines.push(' if (prop === "toString") return () => "ServerOnlyStub";');
149
+ lines.push(' __serverOnlyFailure(label + "." + String(prop));');
150
+ lines.push(' },');
151
+ lines.push(' apply() { __serverOnlyFailure(label); },');
152
+ lines.push(' construct() { __serverOnlyFailure(label); }');
153
+ lines.push(' });');
154
+ lines.push('}');
155
+ for (const name of info.named) {
156
+ lines.push(`export const ${name} = __createServerOnlyStub(${JSON.stringify(name)});`);
157
+ }
158
+ if (info.hasDefault) {
159
+ lines.push('const __defaultExport = __createServerOnlyStub("default export");');
160
+ lines.push('export default __defaultExport;');
161
+ }
162
+ return lines.join('\n');
163
+ }
164
+ function generateStubForFile(root, filePath) {
165
+ try {
166
+ const stat = fs.statSync(filePath);
167
+ const cached = stubCache.get(filePath);
168
+ if (cached && cached.mtimeMs === stat.mtimeMs) {
169
+ return cached.code;
170
+ }
171
+ const source = fs.readFileSync(filePath, 'utf8');
172
+ let code;
173
+ try {
174
+ const info = extractExportInfo(source, filePath);
175
+ code = buildDynamicStub(toDisplayPath(root, filePath), info);
176
+ }
177
+ catch {
178
+ code = DEFAULT_STUB;
179
+ }
180
+ stubCache.set(filePath, { mtimeMs: stat.mtimeMs, code });
181
+ return code;
182
+ }
183
+ catch {
184
+ return DEFAULT_STUB;
185
+ }
186
+ }
187
+ function serverOnlyStub(options) {
188
+ if (!options?.include) {
189
+ throw new TypeError('[serverOnlyStub] include is required.');
190
+ }
191
+ let rootDir = process.cwd();
192
+ let targets = { files: new Set(), dirs: [] };
193
+ let customStub = null;
194
+ let parserReady = false;
195
+ return {
196
+ name: 'server-only-stub',
197
+ enforce: 'pre',
198
+ async configResolved(config) {
199
+ rootDir = config.root ?? rootDir;
200
+ targets = categoriseTargets(rootDir, options.include);
201
+ customStub = pickStub(rootDir, options.stubFile);
202
+ if (!options.stubFile && !parserReady) {
203
+ await es_module_lexer_1.init;
204
+ parserReady = true;
205
+ }
206
+ },
207
+ async load(id, loadOptions) {
208
+ if (loadOptions?.ssr)
209
+ return null;
210
+ const realId = normaliseLoadedId(rootDir, id);
211
+ if (!realId)
212
+ return null;
213
+ if (targets.files.has(realId)) {
214
+ return customStub ?? generateStubForFile(rootDir, realId);
215
+ }
216
+ for (const dir of targets.dirs) {
217
+ if (realId === dir || realId.startsWith(dir + path.sep)) {
218
+ return customStub ?? generateStubForFile(rootDir, realId);
219
+ }
220
+ }
221
+ return null;
222
+ },
223
+ };
224
+ }
225
+ exports.default = serverOnlyStub;
226
+ //# sourceMappingURL=serverOnlyStub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverOnlyStub.js","sourceRoot":"","sources":["../../../src/plugins/serverOnlyStub.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,200 @@
1
+ // src/plugins/serverOnlyStub.ts
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import { init, parse } from 'es-module-lexer';
5
+ const DEFAULT_STUB = `export const __server_only__ = true;
6
+
7
+ const __serverOnlyThrow = (name) => {
8
+ throw new Error('[server-only] Client tried to access: ' + name);
9
+ };
10
+
11
+ const __serverOnlyProxy = new Proxy(() => {
12
+ __serverOnlyThrow('default export');
13
+ }, {
14
+ get(_t, prop) {
15
+ if (prop === Symbol.toStringTag) return 'ServerOnlyStub';
16
+ if (prop === 'toString') return () => 'ServerOnlyStub';
17
+ __serverOnlyThrow('default export.' + String(prop));
18
+ },
19
+ apply() {
20
+ __serverOnlyThrow('default export');
21
+ },
22
+ construct() {
23
+ __serverOnlyThrow('default export');
24
+ }
25
+ });
26
+
27
+ export default __serverOnlyProxy;
28
+ `;
29
+ const stubCache = new Map();
30
+ function toArray(value) {
31
+ return Array.isArray(value) ? value : [value];
32
+ }
33
+ function resolvePath(root, input) {
34
+ return path.isAbsolute(input) ? input : path.resolve(root, input);
35
+ }
36
+ function normalise(realPathCandidate) {
37
+ return fs.realpathSync(realPathCandidate);
38
+ }
39
+ function categoriseTargets(root, include) {
40
+ const files = new Set();
41
+ const dirs = [];
42
+ for (const entry of toArray(include)) {
43
+ const abs = resolvePath(root, entry);
44
+ if (!fs.existsSync(abs)) {
45
+ throw new Error(`[serverOnlyStub] include path not found: ${entry}`);
46
+ }
47
+ const stat = fs.statSync(abs);
48
+ const real = normalise(abs);
49
+ if (stat.isDirectory()) {
50
+ dirs.push(real);
51
+ }
52
+ else if (stat.isFile()) {
53
+ files.add(real);
54
+ }
55
+ else {
56
+ throw new Error(`[serverOnlyStub] include must be a file or directory: ${entry}`);
57
+ }
58
+ }
59
+ return { files, dirs };
60
+ }
61
+ function pickStub(root, stubFile) {
62
+ if (!stubFile)
63
+ return null;
64
+ const abs = resolvePath(root, stubFile);
65
+ if (!fs.existsSync(abs)) {
66
+ throw new Error(`[serverOnlyStub] stubFile not found: ${stubFile}`);
67
+ }
68
+ return fs.readFileSync(abs, 'utf8');
69
+ }
70
+ function normaliseLoadedId(root, id) {
71
+ const base = id.split('?')[0];
72
+ const withoutFsPrefix = base.startsWith('/@fs/') ? base.slice(4) : base;
73
+ const candidate = path.isAbsolute(withoutFsPrefix) ? withoutFsPrefix : path.resolve(root, withoutFsPrefix);
74
+ try {
75
+ return normalise(candidate);
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ function toDisplayPath(root, filePath) {
82
+ const rel = path.relative(root, filePath);
83
+ if (rel && !rel.startsWith('..') && !path.isAbsolute(rel)) {
84
+ return rel.split(path.sep).join('/');
85
+ }
86
+ return filePath.split(path.sep).join('/');
87
+ }
88
+ function extractExportInfo(code, id) {
89
+ const [, exportEntries] = parse(code, id);
90
+ let hasDefault = false;
91
+ let hasStar = false;
92
+ const named = new Set();
93
+ for (const entry of exportEntries) {
94
+ const exportedName = entry.n;
95
+ if (exportedName === 'default') {
96
+ hasDefault = true;
97
+ continue;
98
+ }
99
+ if (exportedName === '*') {
100
+ hasStar = true;
101
+ continue;
102
+ }
103
+ if (exportedName) {
104
+ named.add(exportedName);
105
+ }
106
+ }
107
+ return { hasDefault, named: Array.from(named).sort(), hasStar };
108
+ }
109
+ function buildDynamicStub(moduleDisplay, info) {
110
+ if (info.hasStar) {
111
+ return DEFAULT_STUB;
112
+ }
113
+ const lines = [];
114
+ lines.push('export const __server_only__ = true;');
115
+ lines.push(`const __serverOnlyModuleId = ${JSON.stringify(moduleDisplay)};`);
116
+ lines.push(`function __serverOnlyFailure(name) { throw new Error('[server-only] Client tried to access: ' + __serverOnlyModuleId + (name ? ' -> ' + name : '')); }`);
117
+ lines.push('function __createServerOnlyStub(name) {');
118
+ lines.push(' const label = name ?? "default export";');
119
+ lines.push(' const fn = function () { __serverOnlyFailure(label); };');
120
+ lines.push(' return new Proxy(fn, {');
121
+ lines.push(' get(_target, prop) {');
122
+ lines.push(' if (prop === Symbol.toStringTag) return "ServerOnlyStub";');
123
+ lines.push(' if (prop === "toString") return () => "ServerOnlyStub";');
124
+ lines.push(' __serverOnlyFailure(label + "." + String(prop));');
125
+ lines.push(' },');
126
+ lines.push(' apply() { __serverOnlyFailure(label); },');
127
+ lines.push(' construct() { __serverOnlyFailure(label); }');
128
+ lines.push(' });');
129
+ lines.push('}');
130
+ for (const name of info.named) {
131
+ lines.push(`export const ${name} = __createServerOnlyStub(${JSON.stringify(name)});`);
132
+ }
133
+ if (info.hasDefault) {
134
+ lines.push('const __defaultExport = __createServerOnlyStub("default export");');
135
+ lines.push('export default __defaultExport;');
136
+ }
137
+ return lines.join('\n');
138
+ }
139
+ function generateStubForFile(root, filePath) {
140
+ try {
141
+ const stat = fs.statSync(filePath);
142
+ const cached = stubCache.get(filePath);
143
+ if (cached && cached.mtimeMs === stat.mtimeMs) {
144
+ return cached.code;
145
+ }
146
+ const source = fs.readFileSync(filePath, 'utf8');
147
+ let code;
148
+ try {
149
+ const info = extractExportInfo(source, filePath);
150
+ code = buildDynamicStub(toDisplayPath(root, filePath), info);
151
+ }
152
+ catch {
153
+ code = DEFAULT_STUB;
154
+ }
155
+ stubCache.set(filePath, { mtimeMs: stat.mtimeMs, code });
156
+ return code;
157
+ }
158
+ catch {
159
+ return DEFAULT_STUB;
160
+ }
161
+ }
162
+ export default function serverOnlyStub(options) {
163
+ if (!options?.include) {
164
+ throw new TypeError('[serverOnlyStub] include is required.');
165
+ }
166
+ let rootDir = process.cwd();
167
+ let targets = { files: new Set(), dirs: [] };
168
+ let customStub = null;
169
+ let parserReady = false;
170
+ return {
171
+ name: 'server-only-stub',
172
+ enforce: 'pre',
173
+ async configResolved(config) {
174
+ rootDir = config.root ?? rootDir;
175
+ targets = categoriseTargets(rootDir, options.include);
176
+ customStub = pickStub(rootDir, options.stubFile);
177
+ if (!options.stubFile && !parserReady) {
178
+ await init;
179
+ parserReady = true;
180
+ }
181
+ },
182
+ async load(id, loadOptions) {
183
+ if (loadOptions?.ssr)
184
+ return null;
185
+ const realId = normaliseLoadedId(rootDir, id);
186
+ if (!realId)
187
+ return null;
188
+ if (targets.files.has(realId)) {
189
+ return customStub ?? generateStubForFile(rootDir, realId);
190
+ }
191
+ for (const dir of targets.dirs) {
192
+ if (realId === dir || realId.startsWith(dir + path.sep)) {
193
+ return customStub ?? generateStubForFile(rootDir, realId);
194
+ }
195
+ }
196
+ return null;
197
+ },
198
+ };
199
+ }
200
+ //# sourceMappingURL=serverOnlyStub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverOnlyStub.js","sourceRoot":"","sources":["../../../src/plugins/serverOnlyStub.ts"],"names":[],"mappings":"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"}
package/dist/shared.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { s } from "./page.svelte-C4chAYK2.js";
1
+ import { s } from "./page.svelte-Bq1Q01H0.js";
2
2
  export {
3
3
  s as shadowUrl
4
4
  };
@@ -0,0 +1,3 @@
1
+ export declare const __server_only__ = true;
2
+ declare const _default: {};
3
+ export default _default;
@@ -0,0 +1,7 @@
1
+ export const __server_only__ = true;
2
+ export default new Proxy({}, {
3
+ get(_t, prop) {
4
+ throw new Error(`[server-only] Client tried to access: ${String(prop)}`);
5
+ }
6
+ });
7
+ //# sourceMappingURL=server-only.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-only.js","sourceRoot":"","sources":["../../../src/stubs/server-only.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,eAAe,IAAI,KAAK,CAAC,EAAE,EAAE;IAC3B,GAAG,CAAC,EAAE,EAAE,IAAI;QACV,MAAM,IAAI,KAAK,CAAC,yCAAyC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;CACF,CAAC,CAAC"}
@@ -42,7 +42,7 @@ function convertBraces(path) {
42
42
  }
43
43
  return out;
44
44
  }
45
- function parsePathConfig(path, method, path_config) {
45
+ function parsePathConfig(path, method, path_config, inheritedMiddleware = []) {
46
46
  const layout = path_config["x-layout"];
47
47
  const view = path_config["x-view"];
48
48
  const summary = path_config.summary;
@@ -50,11 +50,14 @@ function parsePathConfig(path, method, path_config) {
50
50
  const body = path_config.body;
51
51
  const parameters = path_config.parameters;
52
52
  const responses = path_config.responses;
53
+ const routeMiddleware = Array.isArray(path_config["x-middleware"]) ? path_config["x-middleware"] : [];
54
+ const middleware = [...inheritedMiddleware, ...routeMiddleware];
53
55
  return {
54
56
  summary,
55
57
  path: convertBraces(path),
56
58
  method,
57
59
  layout,
60
+ middleware,
58
61
  view,
59
62
  responses,
60
63
  parameters,
@@ -66,4 +69,4 @@ export {
66
69
  convertBraces as c,
67
70
  parsePathConfig as p
68
71
  };
69
- //# sourceMappingURL=path-ODk1FhWY.js.map
72
+ //# sourceMappingURL=path-9twSsimy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"path-ODk1FhWY.js","sources":["../src/parser/path.ts"],"sourcesContent":["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(path:string,method:string,path_config:any):IRoute {\n const layout = path_config['x-layout']\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\n return {\n summary,\n path: convertBraces(path),\n method,\n layout,\n view,\n responses,\n parameters,\n query,\n body\n }\n}\n"],"names":[],"mappings":"AAOO,SAAS,cAAc,MAAsB;AAClD,MAAI,MAAM;AACV,MAAI,IAAI;AAED,SAAA,IAAI,KAAK,QAAQ;AAClB,QAAA,KAAK,CAAC,MAAM,KAAK;AAEnB,UAAI,QAAQ;AACZ;AAEA,UAAI,QAAQ;AACZ,aAAO,IAAI,KAAK,UAAU,QAAQ,GAAG;AAC/B,YAAA,KAAK,CAAC,MAAM,MAAM;AAEf,eAAA;AAAA,QAAA,OACA;AACD,cAAA,KAAK,CAAC,MAAM,IAAK;AAAA,mBACZ,KAAK,CAAC,MAAM,IAAK;AAC1B;AAAA,QAAA;AAAA,MACF;AAEF,UAAI,UAAU,GAAG;AACf,cAAM,IAAI,MAAM,0BAA0B,IAAI,EAAE;AAAA,MAAA;AAElD,YAAM,UAAU,KAAK,MAAM,QAAQ,GAAG,IAAI,CAAC;AAarC,YAAA,WAAW,QAAQ,QAAQ,GAAG;AAChC,UAAA;AACA,UAAA;AACA,UAAA;AAEJ,UAAI,aAAa,IAAI;AAEb,cAAA,IAAI,QAAQ,MAAM,qBAAqB;AAC7C,YAAI,CAAC,GAAG;AACN,gBAAM,IAAI,MAAM,+BAA+B,OAAO,GAAG;AAAA,QAAA;AAE1D,WAAE,MAAM,QAAQ,IAAI;AAAA,MAAA,OAChB;AAEK,eAAA,QAAQ,MAAM,GAAG,QAAQ;AACzB,kBAAA,QAAQ,MAAM,WAAW,CAAC;AAAA,MAAA;AAItC,aAAO,IAAI,IAAI;AACX,UAAA,QAAiB,QAAA,IAAI,OAAO;AAChC,UAAI,SAAiB,QAAA;AAAA,IAAA,OAChB;AAEL,aAAO,KAAK,GAAG;AAAA,IAAA;AAAA,EACjB;AAGK,SAAA;AACT;AAGgB,SAAA,gBAAgB,MAAY,QAAc,aAAwB;AACxE,QAAA,SAAS,YAAY,UAAU;AAC/B,QAAA,OAAO,YAAY,QAAQ;AACjC,QAAM,UAAU,YAAY;AAC5B,QAAM,QAAQ,YAAY;AAC1B,QAAM,OAAO,YAAY;AACzB,QAAM,aAAa,YAAY;AAC/B,QAAM,YAAY,YAAY;AAEvB,SAAA;AAAA,IACH;AAAA,IACA,MAAM,cAAc,IAAI;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;"}
1
+ {"version":3,"file":"path-9twSsimy.js","sources":["../src/parser/path.ts"],"sourcesContent":["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 layout = path_config['x-layout']\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"],"names":[],"mappings":"AAOO,SAAS,cAAc,MAAsB;AAClD,MAAI,MAAM;AACV,MAAI,IAAI;AAED,SAAA,IAAI,KAAK,QAAQ;AAClB,QAAA,KAAK,CAAC,MAAM,KAAK;AAEnB,UAAI,QAAQ;AACZ;AAEA,UAAI,QAAQ;AACZ,aAAO,IAAI,KAAK,UAAU,QAAQ,GAAG;AAC/B,YAAA,KAAK,CAAC,MAAM,MAAM;AAEf,eAAA;AAAA,QAAA,OACA;AACD,cAAA,KAAK,CAAC,MAAM,IAAK;AAAA,mBACZ,KAAK,CAAC,MAAM,IAAK;AAC1B;AAAA,QAAA;AAAA,MACF;AAEF,UAAI,UAAU,GAAG;AACf,cAAM,IAAI,MAAM,0BAA0B,IAAI,EAAE;AAAA,MAAA;AAElD,YAAM,UAAU,KAAK,MAAM,QAAQ,GAAG,IAAI,CAAC;AAarC,YAAA,WAAW,QAAQ,QAAQ,GAAG;AAChC,UAAA;AACA,UAAA;AACA,UAAA;AAEJ,UAAI,aAAa,IAAI;AAEb,cAAA,IAAI,QAAQ,MAAM,qBAAqB;AAC7C,YAAI,CAAC,GAAG;AACN,gBAAM,IAAI,MAAM,+BAA+B,OAAO,GAAG;AAAA,QAAA;AAE1D,WAAE,MAAM,QAAQ,IAAI;AAAA,MAAA,OAChB;AAEK,eAAA,QAAQ,MAAM,GAAG,QAAQ;AACzB,kBAAA,QAAQ,MAAM,WAAW,CAAC;AAAA,MAAA;AAItC,aAAO,IAAI,IAAI;AACX,UAAA,QAAiB,QAAA,IAAI,OAAO;AAChC,UAAI,SAAiB,QAAA;AAAA,IAAA,OAChB;AAEL,aAAO,KAAK,GAAG;AAAA,IAAA;AAAA,EACjB;AAGK,SAAA;AACT;AAGO,SAAS,gBACZ,MACA,QACA,aACA,sBAAgC,CAAA,GAC3B;AACC,QAAA,SAAS,YAAY,UAAU;AAC/B,QAAA,OAAO,YAAY,QAAQ;AACjC,QAAM,UAAU,YAAY;AAC5B,QAAM,QAAQ,YAAY;AAC1B,QAAM,OAAO,YAAY;AACzB,QAAM,aAAa,YAAY;AAC/B,QAAM,YAAY,YAAY;AACxB,QAAA,kBAAkB,MAAM,QAAQ,YAAY,cAAc,CAAC,IAAI,YAAY,cAAc,IAAI,CAAC;AACpG,QAAM,aAAa,CAAC,GAAG,qBAAqB,GAAG,eAAe;AAEvD,SAAA;AAAA,IACH;AAAA,IACA,MAAM,cAAc,IAAI;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;"}
@@ -43,7 +43,7 @@ function convertBraces(path) {
43
43
  }
44
44
  return out;
45
45
  }
46
- function parsePathConfig(path, method, path_config) {
46
+ function parsePathConfig(path, method, path_config, inheritedMiddleware = []) {
47
47
  const layout = path_config["x-layout"];
48
48
  const view = path_config["x-view"];
49
49
  const summary = path_config.summary;
@@ -51,11 +51,14 @@ function parsePathConfig(path, method, path_config) {
51
51
  const body = path_config.body;
52
52
  const parameters = path_config.parameters;
53
53
  const responses = path_config.responses;
54
+ const routeMiddleware = Array.isArray(path_config["x-middleware"]) ? path_config["x-middleware"] : [];
55
+ const middleware = [...inheritedMiddleware, ...routeMiddleware];
54
56
  return {
55
57
  summary,
56
58
  path: convertBraces(path),
57
59
  method,
58
60
  layout,
61
+ middleware,
59
62
  view,
60
63
  responses,
61
64
  parameters,
@@ -65,4 +68,4 @@ function parsePathConfig(path, method, path_config) {
65
68
  }
66
69
  exports.convertBraces = convertBraces;
67
70
  exports.parsePathConfig = parsePathConfig;
68
- //# sourceMappingURL=path-CyGuWUeq.cjs.map
71
+ //# sourceMappingURL=path-Dm_4PXDW.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"path-CyGuWUeq.cjs","sources":["../src/parser/path.ts"],"sourcesContent":["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(path:string,method:string,path_config:any):IRoute {\n const layout = path_config['x-layout']\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\n return {\n summary,\n path: convertBraces(path),\n method,\n layout,\n view,\n responses,\n parameters,\n query,\n body\n }\n}\n"],"names":[],"mappings":";AAOO,SAAS,cAAc,MAAsB;AAClD,MAAI,MAAM;AACV,MAAI,IAAI;AAED,SAAA,IAAI,KAAK,QAAQ;AAClB,QAAA,KAAK,CAAC,MAAM,KAAK;AAEnB,UAAI,QAAQ;AACZ;AAEA,UAAI,QAAQ;AACZ,aAAO,IAAI,KAAK,UAAU,QAAQ,GAAG;AAC/B,YAAA,KAAK,CAAC,MAAM,MAAM;AAEf,eAAA;AAAA,QAAA,OACA;AACD,cAAA,KAAK,CAAC,MAAM,IAAK;AAAA,mBACZ,KAAK,CAAC,MAAM,IAAK;AAC1B;AAAA,QAAA;AAAA,MACF;AAEF,UAAI,UAAU,GAAG;AACf,cAAM,IAAI,MAAM,0BAA0B,IAAI,EAAE;AAAA,MAAA;AAElD,YAAM,UAAU,KAAK,MAAM,QAAQ,GAAG,IAAI,CAAC;AAarC,YAAA,WAAW,QAAQ,QAAQ,GAAG;AAChC,UAAA;AACA,UAAA;AACA,UAAA;AAEJ,UAAI,aAAa,IAAI;AAEb,cAAA,IAAI,QAAQ,MAAM,qBAAqB;AAC7C,YAAI,CAAC,GAAG;AACN,gBAAM,IAAI,MAAM,+BAA+B,OAAO,GAAG;AAAA,QAAA;AAE1D,WAAE,MAAM,QAAQ,IAAI;AAAA,MAAA,OAChB;AAEK,eAAA,QAAQ,MAAM,GAAG,QAAQ;AACzB,kBAAA,QAAQ,MAAM,WAAW,CAAC;AAAA,MAAA;AAItC,aAAO,IAAI,IAAI;AACX,UAAA,QAAiB,QAAA,IAAI,OAAO;AAChC,UAAI,SAAiB,QAAA;AAAA,IAAA,OAChB;AAEL,aAAO,KAAK,GAAG;AAAA,IAAA;AAAA,EACjB;AAGK,SAAA;AACT;AAGgB,SAAA,gBAAgB,MAAY,QAAc,aAAwB;AACxE,QAAA,SAAS,YAAY,UAAU;AAC/B,QAAA,OAAO,YAAY,QAAQ;AACjC,QAAM,UAAU,YAAY;AAC5B,QAAM,QAAQ,YAAY;AAC1B,QAAM,OAAO,YAAY;AACzB,QAAM,aAAa,YAAY;AAC/B,QAAM,YAAY,YAAY;AAEvB,SAAA;AAAA,IACH;AAAA,IACA,MAAM,cAAc,IAAI;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;;;"}
1
+ {"version":3,"file":"path-Dm_4PXDW.cjs","sources":["../src/parser/path.ts"],"sourcesContent":["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 layout = path_config['x-layout']\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"],"names":[],"mappings":";AAOO,SAAS,cAAc,MAAsB;AAClD,MAAI,MAAM;AACV,MAAI,IAAI;AAED,SAAA,IAAI,KAAK,QAAQ;AAClB,QAAA,KAAK,CAAC,MAAM,KAAK;AAEnB,UAAI,QAAQ;AACZ;AAEA,UAAI,QAAQ;AACZ,aAAO,IAAI,KAAK,UAAU,QAAQ,GAAG;AAC/B,YAAA,KAAK,CAAC,MAAM,MAAM;AAEf,eAAA;AAAA,QAAA,OACA;AACD,cAAA,KAAK,CAAC,MAAM,IAAK;AAAA,mBACZ,KAAK,CAAC,MAAM,IAAK;AAC1B;AAAA,QAAA;AAAA,MACF;AAEF,UAAI,UAAU,GAAG;AACf,cAAM,IAAI,MAAM,0BAA0B,IAAI,EAAE;AAAA,MAAA;AAElD,YAAM,UAAU,KAAK,MAAM,QAAQ,GAAG,IAAI,CAAC;AAarC,YAAA,WAAW,QAAQ,QAAQ,GAAG;AAChC,UAAA;AACA,UAAA;AACA,UAAA;AAEJ,UAAI,aAAa,IAAI;AAEb,cAAA,IAAI,QAAQ,MAAM,qBAAqB;AAC7C,YAAI,CAAC,GAAG;AACN,gBAAM,IAAI,MAAM,+BAA+B,OAAO,GAAG;AAAA,QAAA;AAE1D,WAAE,MAAM,QAAQ,IAAI;AAAA,MAAA,OAChB;AAEK,eAAA,QAAQ,MAAM,GAAG,QAAQ;AACzB,kBAAA,QAAQ,MAAM,WAAW,CAAC;AAAA,MAAA;AAItC,aAAO,IAAI,IAAI;AACX,UAAA,QAAiB,QAAA,IAAI,OAAO;AAChC,UAAI,SAAiB,QAAA;AAAA,IAAA,OAChB;AAEL,aAAO,KAAK,GAAG;AAAA,IAAA;AAAA,EACjB;AAGK,SAAA;AACT;AAGO,SAAS,gBACZ,MACA,QACA,aACA,sBAAgC,CAAA,GAC3B;AACC,QAAA,SAAS,YAAY,UAAU;AAC/B,QAAA,OAAO,YAAY,QAAQ;AACjC,QAAM,UAAU,YAAY;AAC5B,QAAM,QAAQ,YAAY;AAC1B,QAAM,OAAO,YAAY;AACzB,QAAM,aAAa,YAAY;AAC/B,QAAM,YAAY,YAAY;AACxB,QAAA,kBAAkB,MAAM,QAAQ,YAAY,cAAc,CAAC,IAAI,YAAY,cAAc,IAAI,CAAC;AACpG,QAAM,aAAa,CAAC,GAAG,qBAAqB,GAAG,eAAe;AAEvD,SAAA;AAAA,IACH;AAAA,IACA,MAAM,cAAc,IAAI;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;;;"}