@kosmojs/lib 0.0.27 → 0.0.28
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/package.json +4 -7
- package/pkg/ast.d.ts +1 -1
- package/pkg/generators.d.ts +2 -1
- package/pkg/index.d.ts +0 -2
- package/pkg/index.js +101 -130
- package/pkg/index.js.map +4 -4
- package/pkg/paths.d.ts +3 -3
- package/pkg/routes/base.d.ts +1 -1
- package/pkg/routes/index.d.ts +1 -1
- package/pkg/routes/resolve.d.ts +1 -1
- package/pkg/typebox.d.ts +1 -1
- package/pkg/defaults.d.ts +0 -14
- package/pkg/tsconfig.d.ts +0 -66
package/package.json
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@kosmojs/lib",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.28",
|
|
5
5
|
"author": "Slee Woo",
|
|
6
6
|
"license": "MIT",
|
|
7
|
-
"publishConfig": {
|
|
8
|
-
"access": "public"
|
|
9
|
-
},
|
|
10
7
|
"files": [
|
|
11
8
|
"pkg/*"
|
|
12
9
|
],
|
|
@@ -26,14 +23,14 @@
|
|
|
26
23
|
"mime-types": "^3.0.2",
|
|
27
24
|
"path-to-regexp": "^8.4.2",
|
|
28
25
|
"picomatch": "^4.0.4",
|
|
29
|
-
"tfusion": "^0.0.
|
|
26
|
+
"tfusion": "^0.0.24",
|
|
30
27
|
"tinyglobby": "^0.2.16",
|
|
31
|
-
"ts-morph": "^
|
|
28
|
+
"ts-morph": "^28.0.0"
|
|
32
29
|
},
|
|
33
30
|
"devDependencies": {
|
|
34
31
|
"@types/mime-types": "^3.0.1",
|
|
35
32
|
"@types/picomatch": "^4.0.3",
|
|
36
|
-
"@kosmojs/core": "^0.0.
|
|
33
|
+
"@kosmojs/core": "^0.0.28"
|
|
37
34
|
},
|
|
38
35
|
"scripts": {
|
|
39
36
|
"build": "esbuilder src/index.ts",
|
package/pkg/ast.d.ts
CHANGED
|
@@ -32,7 +32,7 @@ export declare const astFactory: () => {
|
|
|
32
32
|
validationDefinitions: ValidationDefinition[];
|
|
33
33
|
referencedFiles: string[] | undefined;
|
|
34
34
|
}>;
|
|
35
|
-
typeResolverFactory: ({ root }: SourceFolder) => {
|
|
35
|
+
typeResolverFactory: ({ root, name }: SourceFolder) => {
|
|
36
36
|
getSourceFile: (fileFullpath: string) => SourceFile;
|
|
37
37
|
refreshSourceFile: (fileFullpath: string) => Promise<void>;
|
|
38
38
|
literalTypesResolver: (literalTypes: string, options: Parameters<typeof flattener>[2]) => import("tfusion").ResolvedType[];
|
package/pkg/generators.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import type { DefineGenerator, DefineGeneratorFactory } from "@kosmojs/core";
|
|
1
|
+
import type { DefineGenerator, DefineGeneratorFactory, GeneratorCustomTemplates } from "@kosmojs/core";
|
|
2
2
|
export declare const defineGenerator: DefineGenerator;
|
|
3
3
|
export declare const defineGeneratorFactory: DefineGeneratorFactory;
|
|
4
|
+
export declare const createTemplateResolver: <T>(customTemplates: GeneratorCustomTemplates<T> | undefined, defaultTemplate: string) => (pattern: string, entry: T) => any;
|
package/pkg/index.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
export * from "./ast";
|
|
2
|
-
export * from "./defaults";
|
|
3
2
|
export * from "./generators";
|
|
4
3
|
export * from "./paths";
|
|
5
4
|
export * from "./render";
|
|
6
5
|
export * from "./routes";
|
|
7
6
|
export * from "./spinner";
|
|
8
|
-
export * from "./tsconfig";
|
|
9
7
|
export * from "./typebox";
|
|
10
8
|
export * from "./vite";
|
package/pkg/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/ast.ts
|
|
2
|
-
import { resolve } from "node:path";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
3
|
import { styleText } from "node:util";
|
|
4
4
|
import crc from "crc/crc32";
|
|
5
5
|
import { flattener } from "tfusion";
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
SyntaxKind
|
|
9
9
|
} from "ts-morph";
|
|
10
10
|
import {
|
|
11
|
+
defaults,
|
|
11
12
|
RequestValidationTargets
|
|
12
13
|
} from "@kosmojs/core";
|
|
13
14
|
import { HTTPMethods } from "@kosmojs/core/api";
|
|
@@ -272,6 +273,21 @@ var astFactory = () => {
|
|
|
272
273
|
referencedFiles.push(...getReferencedFiles(defaultImport));
|
|
273
274
|
}
|
|
274
275
|
}
|
|
276
|
+
const namespaceImport = typeOnlyDeclaration ? declaration.getNamespaceImport() : void 0;
|
|
277
|
+
if (namespaceImport) {
|
|
278
|
+
const name = namespaceImport.getText();
|
|
279
|
+
const text = `import type * as ${name} from "${path}";`;
|
|
280
|
+
declarations.push({
|
|
281
|
+
importDeclaration: {
|
|
282
|
+
name,
|
|
283
|
+
path
|
|
284
|
+
},
|
|
285
|
+
text
|
|
286
|
+
});
|
|
287
|
+
if (referencedFiles) {
|
|
288
|
+
referencedFiles.push(...getReferencedFiles(namespaceImport));
|
|
289
|
+
}
|
|
290
|
+
}
|
|
275
291
|
for (const namedImport of declaration.getNamedImports()) {
|
|
276
292
|
if (namedImport.isTypeOnly() || typeOnlyDeclaration) {
|
|
277
293
|
const nameNode = namedImport.getNameNode();
|
|
@@ -356,9 +372,12 @@ var astFactory = () => {
|
|
|
356
372
|
const extractGenerics = (callExpression) => {
|
|
357
373
|
return callExpression.getTypeArguments();
|
|
358
374
|
};
|
|
359
|
-
const typeResolverFactory = ({ root }) => {
|
|
375
|
+
const typeResolverFactory = ({ root, name }) => {
|
|
360
376
|
const project = createProject({
|
|
361
|
-
tsConfigFilePath: resolve(
|
|
377
|
+
tsConfigFilePath: resolve(
|
|
378
|
+
root,
|
|
379
|
+
join(defaults.srcDir, name, "tsconfig.json")
|
|
380
|
+
),
|
|
362
381
|
skipAddingFilesFromTsConfig: true
|
|
363
382
|
});
|
|
364
383
|
const literalTypesResolver = (literalTypes, options) => {
|
|
@@ -398,84 +417,88 @@ var astFactory = () => {
|
|
|
398
417
|
};
|
|
399
418
|
};
|
|
400
419
|
|
|
401
|
-
// src/defaults.ts
|
|
402
|
-
var defaults = {
|
|
403
|
-
appPrefix: "@",
|
|
404
|
-
srcPrefix: "~",
|
|
405
|
-
libPrefix: "_",
|
|
406
|
-
coreDir: "core",
|
|
407
|
-
srcDir: "src",
|
|
408
|
-
libDir: "lib",
|
|
409
|
-
configDir: "config",
|
|
410
|
-
apiDir: "api",
|
|
411
|
-
pagesDir: "pages",
|
|
412
|
-
entryDir: "entry",
|
|
413
|
-
fetchDir: "fetch",
|
|
414
|
-
refineTypeName: "VRefine"
|
|
415
|
-
};
|
|
416
|
-
|
|
417
420
|
// src/generators.ts
|
|
421
|
+
import picomatch from "picomatch";
|
|
418
422
|
var defineGenerator = (f) => f;
|
|
419
423
|
var defineGeneratorFactory = (f) => f;
|
|
424
|
+
var createTemplateResolver = (customTemplates, defaultTemplate) => {
|
|
425
|
+
const templates = Object.entries({
|
|
426
|
+
...customTemplates
|
|
427
|
+
}).map(([pattern, template]) => [picomatch(pattern), template]);
|
|
428
|
+
return (pattern, entry) => {
|
|
429
|
+
const match = templates.find(([isMatch]) => isMatch(pattern));
|
|
430
|
+
if (!match) {
|
|
431
|
+
return defaultTemplate;
|
|
432
|
+
}
|
|
433
|
+
return typeof match[1] === "function" ? match[1](entry) : match[1];
|
|
434
|
+
};
|
|
435
|
+
};
|
|
420
436
|
|
|
421
437
|
// src/paths.ts
|
|
422
438
|
import { access, constants } from "node:fs/promises";
|
|
423
|
-
import { join, resolve as resolve2 } from "node:path";
|
|
439
|
+
import { join as join2, resolve as resolve2 } from "node:path";
|
|
440
|
+
import { defaults as defaults2 } from "@kosmojs/core";
|
|
424
441
|
var pathResolver = (sourceFolder) => {
|
|
425
442
|
const createPath = (...a) => {
|
|
426
|
-
return sourceFolder.root ? resolve2(sourceFolder.root,
|
|
443
|
+
return sourceFolder.root ? resolve2(sourceFolder.root, join2(...a)) : join2(...a);
|
|
427
444
|
};
|
|
428
445
|
const createImport = {
|
|
429
446
|
src(a, { origin }) {
|
|
430
|
-
return origin === "src" ?
|
|
447
|
+
return origin === "src" ? join2(defaults2.srcPrefix, ...a) : join2(defaults2.appPrefix, defaults2.srcDir, sourceFolder.name, ...a);
|
|
431
448
|
},
|
|
432
449
|
config(a, o) {
|
|
433
|
-
return this.src([
|
|
450
|
+
return this.src([defaults2.configDir, ...a], o);
|
|
434
451
|
},
|
|
435
452
|
api(a, o) {
|
|
436
|
-
return this.src([
|
|
453
|
+
return this.src([defaults2.apiDir, ...a], o);
|
|
437
454
|
},
|
|
438
455
|
pages(a, o) {
|
|
439
|
-
return this.src([
|
|
456
|
+
return this.src([defaults2.pagesDir, ...a], o);
|
|
440
457
|
},
|
|
441
458
|
lib(a, { origin }) {
|
|
442
|
-
return origin === "src" ?
|
|
459
|
+
return origin === "src" ? join2(defaults2.libPrefix, ...a) : join2(defaults2.appPrefix, defaults2.libDir, sourceFolder.name, ...a);
|
|
460
|
+
},
|
|
461
|
+
libCore(a, o) {
|
|
462
|
+
return this.lib(["core", ...a], o);
|
|
443
463
|
},
|
|
444
464
|
libApi(a, o) {
|
|
445
|
-
return this.lib([
|
|
465
|
+
return this.lib([defaults2.apiDir, ...a], o);
|
|
446
466
|
},
|
|
447
467
|
libEntry(a, o) {
|
|
448
|
-
return this.lib([
|
|
468
|
+
return this.lib([defaults2.entryDir, ...a], o);
|
|
449
469
|
}
|
|
450
470
|
};
|
|
451
471
|
return {
|
|
452
472
|
createPath: {
|
|
453
473
|
src(...a) {
|
|
454
|
-
return createPath(
|
|
474
|
+
return createPath(defaults2.srcDir, sourceFolder.name, ...a);
|
|
455
475
|
},
|
|
456
476
|
api(...a) {
|
|
457
|
-
return this.src(
|
|
477
|
+
return this.src(defaults2.apiDir, ...a);
|
|
458
478
|
},
|
|
459
479
|
pages(...a) {
|
|
460
|
-
return this.src(
|
|
480
|
+
return this.src(defaults2.pagesDir, ...a);
|
|
461
481
|
},
|
|
462
482
|
config(...a) {
|
|
463
|
-
return this.src(
|
|
483
|
+
return this.src(defaults2.configDir, ...a);
|
|
464
484
|
},
|
|
465
485
|
entry(...a) {
|
|
466
|
-
return this.src(
|
|
486
|
+
return this.src(defaults2.entryDir, ...a);
|
|
467
487
|
},
|
|
468
488
|
lib(...a) {
|
|
469
|
-
return createPath(
|
|
489
|
+
return createPath(defaults2.libDir, sourceFolder.name, ...a);
|
|
490
|
+
},
|
|
491
|
+
libCore(...a) {
|
|
492
|
+
return this.lib("core", ...a);
|
|
470
493
|
},
|
|
471
494
|
libApi(...a) {
|
|
472
|
-
return this.lib(
|
|
495
|
+
return this.lib(defaults2.apiDir, ...a);
|
|
473
496
|
},
|
|
474
497
|
libEntry(...a) {
|
|
475
|
-
return this.lib(
|
|
498
|
+
return this.lib(defaults2.entryDir, ...a);
|
|
476
499
|
},
|
|
477
500
|
libPages(...a) {
|
|
478
|
-
return this.lib(
|
|
501
|
+
return this.lib(defaults2.pagesDir, ...a);
|
|
479
502
|
},
|
|
480
503
|
distDir(...a) {
|
|
481
504
|
return createPath(sourceFolder.distDir, sourceFolder.name, ...a);
|
|
@@ -507,7 +530,7 @@ var pathExists = async (path) => {
|
|
|
507
530
|
|
|
508
531
|
// src/render.ts
|
|
509
532
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
510
|
-
import { dirname, join as
|
|
533
|
+
import { dirname, join as join3 } from "node:path";
|
|
511
534
|
import crc2 from "crc/crc32";
|
|
512
535
|
import handlebars from "handlebars";
|
|
513
536
|
var render = (template, context, options) => {
|
|
@@ -555,7 +578,7 @@ var renderFactory = (options) => {
|
|
|
555
578
|
},
|
|
556
579
|
async renderToFile(file, template, context, selfOoptions) {
|
|
557
580
|
return renderToFile(
|
|
558
|
-
options?.outdir ?
|
|
581
|
+
options?.outdir ? join3(options.outdir, file) : file,
|
|
559
582
|
template,
|
|
560
583
|
context,
|
|
561
584
|
{
|
|
@@ -568,12 +591,20 @@ var renderFactory = (options) => {
|
|
|
568
591
|
};
|
|
569
592
|
};
|
|
570
593
|
|
|
594
|
+
// src/routes/index.ts
|
|
595
|
+
import {
|
|
596
|
+
defaults as defaults5
|
|
597
|
+
} from "@kosmojs/core";
|
|
598
|
+
|
|
571
599
|
// src/routes/base.ts
|
|
572
|
-
import { dirname as dirname2, join as
|
|
600
|
+
import { dirname as dirname2, join as join4, resolve as resolve3 } from "node:path";
|
|
573
601
|
import { styleText as styleText2 } from "node:util";
|
|
574
602
|
import crc4 from "crc/crc32";
|
|
575
|
-
import
|
|
603
|
+
import picomatch2 from "picomatch";
|
|
576
604
|
import { glob } from "tinyglobby";
|
|
605
|
+
import {
|
|
606
|
+
defaults as defaults3
|
|
607
|
+
} from "@kosmojs/core";
|
|
577
608
|
|
|
578
609
|
// src/routes/paths.ts
|
|
579
610
|
import crc3 from "crc/crc32";
|
|
@@ -667,7 +698,9 @@ var pathTokensFactory = (path, {
|
|
|
667
698
|
);
|
|
668
699
|
}
|
|
669
700
|
const pattern = patternTransforms.reduce((src, fn) => fn(src), orig);
|
|
670
|
-
const { tokens: tokens2 } = parse(
|
|
701
|
+
const { tokens: tokens2 } = parse(
|
|
702
|
+
pattern.replace(/\{[^}]*\}|(\+)/g, (m, p1) => p1 ? "\\+" : m)
|
|
703
|
+
);
|
|
671
704
|
const parts = extractParts(tokens2, (val) => {
|
|
672
705
|
return /\W/.test(val) || /^\d/.test(val) ? [val.replace(/^\d+|\W/g, "_"), crc3(orig)].join("_") : val;
|
|
673
706
|
});
|
|
@@ -757,13 +790,13 @@ var PAGE_LAYOUT_BASENAME = "layout";
|
|
|
757
790
|
var PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue,mdx}`;
|
|
758
791
|
var ROUTE_FILE_PATTERNS = [
|
|
759
792
|
// match index files in api dir
|
|
760
|
-
`${
|
|
793
|
+
`${defaults3.apiDir}/**/${API_INDEX_PATTERN}`,
|
|
761
794
|
// match use files in api dir
|
|
762
|
-
`${
|
|
795
|
+
`${defaults3.apiDir}/**/${API_USE_PATTERN}`,
|
|
763
796
|
// match index files in pages dir
|
|
764
|
-
`${
|
|
797
|
+
`${defaults3.pagesDir}/**/${PAGE_INDEX_PATTERN}`,
|
|
765
798
|
// match layout files in pages dir
|
|
766
|
-
`${
|
|
799
|
+
`${defaults3.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`
|
|
767
800
|
];
|
|
768
801
|
var scanRoutes = async (sourceFolder) => {
|
|
769
802
|
const { createPath } = pathResolver(sourceFolder);
|
|
@@ -774,10 +807,10 @@ var scanRoutes = async (sourceFolder) => {
|
|
|
774
807
|
followSymbolicLinks: false,
|
|
775
808
|
ignore: [
|
|
776
809
|
// ignore top-level matches, routes resides in folders, even index route
|
|
777
|
-
`${
|
|
778
|
-
`${
|
|
779
|
-
`${
|
|
780
|
-
`${
|
|
810
|
+
`${defaults3.apiDir}/${API_INDEX_PATTERN}`,
|
|
811
|
+
`${defaults3.apiDir}/${API_USE_PATTERN}`,
|
|
812
|
+
`${defaults3.pagesDir}/${PAGE_INDEX_PATTERN}`,
|
|
813
|
+
`${defaults3.pagesDir}/${PAGE_LAYOUT_PATTERN}`
|
|
781
814
|
]
|
|
782
815
|
});
|
|
783
816
|
};
|
|
@@ -788,23 +821,23 @@ var isRouteFile = (file, sourceFolder) => {
|
|
|
788
821
|
// route folder, api or pages
|
|
789
822
|
_folder,
|
|
790
823
|
...rest
|
|
791
|
-
] = resolve3(sourceFolder.root, file).replace(`${sourceFolder.root}/${
|
|
824
|
+
] = resolve3(sourceFolder.root, file).replace(`${sourceFolder.root}/${defaults3.srcDir}/`, "").split("/");
|
|
792
825
|
if (!_folder || _sourceFolder !== sourceFolder.name || rest.length < 2) {
|
|
793
826
|
return false;
|
|
794
827
|
}
|
|
795
|
-
return
|
|
828
|
+
return picomatch2.isMatch(join4(_folder, ...rest), ROUTE_FILE_PATTERNS) ? [_folder, rest.join("/")] : false;
|
|
796
829
|
};
|
|
797
830
|
var isApiRoute = (file) => {
|
|
798
|
-
return
|
|
831
|
+
return picomatch2.matchBase(file, `**/${API_INDEX_PATTERN}`);
|
|
799
832
|
};
|
|
800
833
|
var isApiUse = (file) => {
|
|
801
|
-
return
|
|
834
|
+
return picomatch2.matchBase(file, `**/${API_USE_PATTERN}`);
|
|
802
835
|
};
|
|
803
836
|
var isPageRoute = (file) => {
|
|
804
|
-
return
|
|
837
|
+
return picomatch2.matchBase(file, `**/${PAGE_INDEX_PATTERN}`);
|
|
805
838
|
};
|
|
806
839
|
var isPageLayout = (file) => {
|
|
807
|
-
return
|
|
840
|
+
return picomatch2.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`);
|
|
808
841
|
};
|
|
809
842
|
var createRouteEntry = (fileFullpath, sourceFolder) => {
|
|
810
843
|
const resolvedPaths = isRouteFile(fileFullpath, sourceFolder);
|
|
@@ -884,10 +917,13 @@ var sortRoutes = (a, b) => {
|
|
|
884
917
|
};
|
|
885
918
|
|
|
886
919
|
// src/routes/resolve.ts
|
|
887
|
-
import { dirname as dirname3, join as
|
|
920
|
+
import { dirname as dirname3, join as join5, resolve as resolve4 } from "node:path";
|
|
888
921
|
import { styleText as styleText3 } from "node:util";
|
|
889
922
|
import crc5 from "crc/crc32";
|
|
890
923
|
import mimeTypes from "mime-types";
|
|
924
|
+
import {
|
|
925
|
+
defaults as defaults4
|
|
926
|
+
} from "@kosmojs/core";
|
|
891
927
|
|
|
892
928
|
// src/templates/resolved-types.hbs
|
|
893
929
|
var resolved_types_default = "{{#each resolvedTypes}}\nexport type {{name}} = {{text}};\n{{/each}}\n";
|
|
@@ -900,7 +936,7 @@ var resolverFactory = (sourceFolder, cacheFactory) => {
|
|
|
900
936
|
const {
|
|
901
937
|
//
|
|
902
938
|
generators = [],
|
|
903
|
-
refineTypeName =
|
|
939
|
+
refineTypeName = defaults4.refineTypeName
|
|
904
940
|
} = sourceFolder.config;
|
|
905
941
|
const { typeResolverFactory, resolveRouteSignature } = astFactory();
|
|
906
942
|
const resolveTypes = generators.some(({ meta }) => meta.resolveTypes);
|
|
@@ -1005,9 +1041,9 @@ var resolverFactory = (sourceFolder, cacheFactory) => {
|
|
|
1005
1041
|
withReferencedFiles: true,
|
|
1006
1042
|
sourceFile: getSourceFile(fileFullpath),
|
|
1007
1043
|
relpathResolver(path) {
|
|
1008
|
-
return
|
|
1044
|
+
return join5(
|
|
1009
1045
|
sourceFolder.name,
|
|
1010
|
-
|
|
1046
|
+
defaults4.apiDir,
|
|
1011
1047
|
dirname3(file),
|
|
1012
1048
|
path
|
|
1013
1049
|
);
|
|
@@ -1291,13 +1327,13 @@ var routesFactory = async (sourceFolder, cacheFactory) => {
|
|
|
1291
1327
|
return entry ? [entry] : [];
|
|
1292
1328
|
});
|
|
1293
1329
|
for (const entry of entries) {
|
|
1294
|
-
if (entry.folder ===
|
|
1330
|
+
if (entry.folder === defaults5.apiDir) {
|
|
1295
1331
|
if (isApiRoute(entry.file)) {
|
|
1296
1332
|
resolvers.set(entry.fileFullpath, apiRouteResolver(entry));
|
|
1297
1333
|
} else if (isApiUse(entry.file)) {
|
|
1298
1334
|
resolvers.set(entry.fileFullpath, apiUseResolver(entry));
|
|
1299
1335
|
}
|
|
1300
|
-
} else if (entry.folder ===
|
|
1336
|
+
} else if (entry.folder === defaults5.pagesDir) {
|
|
1301
1337
|
if (isPageRoute(entry.file)) {
|
|
1302
1338
|
resolvers.set(entry.fileFullpath, pageRouteResolver(entry));
|
|
1303
1339
|
} else if (isPageLayout(entry.file)) {
|
|
@@ -1345,74 +1381,10 @@ var spinnerFactory = (startText) => {
|
|
|
1345
1381
|
};
|
|
1346
1382
|
var withSpinner = (text, pipe, spinner) => pipe(spinner || spinnerFactory(text));
|
|
1347
1383
|
|
|
1348
|
-
// src/tsconfig.ts
|
|
1349
|
-
var generateTsconfig = (sourceFolder) => {
|
|
1350
|
-
const rootDir = "${configDir}";
|
|
1351
|
-
const compilerOptions = {
|
|
1352
|
-
types: ["@types/node", "@types/deno", "@types/bun"],
|
|
1353
|
-
moduleResolution: "bundler",
|
|
1354
|
-
module: "ESNext",
|
|
1355
|
-
target: "ESNext",
|
|
1356
|
-
strict: true,
|
|
1357
|
-
exactOptionalPropertyTypes: true,
|
|
1358
|
-
noImplicitAny: true,
|
|
1359
|
-
noImplicitThis: true,
|
|
1360
|
-
noImplicitOverride: true,
|
|
1361
|
-
noImplicitReturns: true,
|
|
1362
|
-
noUnusedLocals: false,
|
|
1363
|
-
noUnusedParameters: false,
|
|
1364
|
-
allowArbitraryExtensions: true,
|
|
1365
|
-
allowImportingTsExtensions: true,
|
|
1366
|
-
allowUnreachableCode: false,
|
|
1367
|
-
allowUnusedLabels: false,
|
|
1368
|
-
useUnknownInCatchVariables: true,
|
|
1369
|
-
noFallthroughCasesInSwitch: true,
|
|
1370
|
-
noUncheckedSideEffectImports: true,
|
|
1371
|
-
resolveJsonModule: true,
|
|
1372
|
-
esModuleInterop: true,
|
|
1373
|
-
verbatimModuleSyntax: true,
|
|
1374
|
-
skipLibCheck: true,
|
|
1375
|
-
noEmit: true
|
|
1376
|
-
};
|
|
1377
|
-
if (sourceFolder) {
|
|
1378
|
-
return {
|
|
1379
|
-
include: [
|
|
1380
|
-
`${rootDir}/`,
|
|
1381
|
-
`${rootDir}/../../${defaults.libDir}/${sourceFolder}/`,
|
|
1382
|
-
`${rootDir}/../../${defaults.libDir}/env.d.ts`
|
|
1383
|
-
],
|
|
1384
|
-
compilerOptions: {
|
|
1385
|
-
...compilerOptions,
|
|
1386
|
-
jsx: "preserve",
|
|
1387
|
-
types: [...compilerOptions.types, "vite/client"],
|
|
1388
|
-
paths: {
|
|
1389
|
-
[`${defaults.appPrefix}/*`]: [`${rootDir}/../../*`],
|
|
1390
|
-
[`${defaults.srcPrefix}/*`]: [`${rootDir}/*`],
|
|
1391
|
-
[`${defaults.libPrefix}/*`]: [
|
|
1392
|
-
`${rootDir}/../../${defaults.libDir}/${sourceFolder}/*`
|
|
1393
|
-
]
|
|
1394
|
-
}
|
|
1395
|
-
}
|
|
1396
|
-
};
|
|
1397
|
-
}
|
|
1398
|
-
return {
|
|
1399
|
-
include: [`${rootDir}/`, `${rootDir}/${defaults.libDir}/env.d.ts`],
|
|
1400
|
-
exclude: [
|
|
1401
|
-
`${rootDir}/${defaults.srcDir}/`,
|
|
1402
|
-
`${rootDir}/${defaults.libDir}/`
|
|
1403
|
-
],
|
|
1404
|
-
compilerOptions: {
|
|
1405
|
-
...compilerOptions,
|
|
1406
|
-
paths: {
|
|
1407
|
-
[`${defaults.appPrefix}/*`]: [`${rootDir}/*`]
|
|
1408
|
-
}
|
|
1409
|
-
}
|
|
1410
|
-
};
|
|
1411
|
-
};
|
|
1412
|
-
|
|
1413
1384
|
// src/typebox.ts
|
|
1385
|
+
import { defaults as defaults6 } from "@kosmojs/core";
|
|
1414
1386
|
var typeboxLiteralText = (text, sourceFolder) => {
|
|
1415
|
-
const { refineTypeName =
|
|
1387
|
+
const { refineTypeName = defaults6.refineTypeName } = sourceFolder.config;
|
|
1416
1388
|
return [
|
|
1417
1389
|
// Escape backticks for safe use in template literals
|
|
1418
1390
|
[/(?<!\\)`/g, "\\`"],
|
|
@@ -1454,10 +1426,9 @@ export {
|
|
|
1454
1426
|
createHonoPattern,
|
|
1455
1427
|
createPathPattern,
|
|
1456
1428
|
createRouteEntry,
|
|
1457
|
-
|
|
1429
|
+
createTemplateResolver,
|
|
1458
1430
|
defineGenerator,
|
|
1459
1431
|
defineGeneratorFactory,
|
|
1460
|
-
generateTsconfig,
|
|
1461
1432
|
isApiRoute,
|
|
1462
1433
|
isApiUse,
|
|
1463
1434
|
isPageLayout,
|
package/pkg/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/ast.ts", "../src/
|
|
4
|
-
"sourcesContent": ["import { resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport crc from \"crc/crc32\";\nimport { flattener } from \"tfusion\";\nimport {\n type CallExpression,\n type Identifier,\n Project,\n type ProjectOptions,\n type SourceFile,\n SyntaxKind,\n type TypeNode,\n} from \"ts-morph\";\n\nimport {\n type ApiRoute,\n RequestValidationTargets,\n type SourceFolder,\n type TypeDeclaration,\n type ValidationDefinition,\n type ValidationTarget,\n} from \"@kosmojs/core\";\nimport { type HTTPMethod, HTTPMethods } from \"@kosmojs/core/api\";\n\ntype PathResolver = (path: string) => string;\n\nexport const astFactory = () => {\n const createProject = (opts?: ProjectOptions) => new Project(opts);\n\n const resolveRouteSignature = async (\n route: Pick<ApiRoute, \"id\" | \"name\" | \"fileFullpath\" | \"optionalParams\">,\n opts?: {\n relpathResolver?: PathResolver;\n sourceFile?: SourceFile;\n withReferencedFiles?: boolean;\n },\n ) => {\n const {\n sourceFile = createProject().addSourceFileAtPath(route.fileFullpath),\n } = { ...opts };\n\n const [typeDeclarations, referencedFiles] = extractTypeDeclarations(\n sourceFile,\n opts,\n );\n\n const defaultExport = extractDefaultExport(sourceFile);\n\n const paramsRefinements = defaultExport\n ? extractParamsRefinements(defaultExport)\n : undefined;\n\n const methods = defaultExport\n ? extractRouteMethods(route, defaultExport)\n : [];\n\n return {\n typeDeclarations,\n paramsRefinements,\n methods: methods.map((e) => e.method),\n validationDefinitions: methods.flatMap((e) => e.validationDefinitions),\n referencedFiles,\n };\n };\n\n const extractDefaultExport = (\n sourceFile: SourceFile,\n ): CallExpression | undefined => {\n const [defaultExport] = sourceFile\n .getExportAssignments()\n .flatMap((exportAssignment) => {\n if (exportAssignment.isExportEquals()) {\n return [];\n }\n const callExpression = exportAssignment.getExpression();\n return callExpression.isKind(SyntaxKind.CallExpression)\n ? [callExpression]\n : [];\n });\n return defaultExport;\n };\n\n const extractParamsRefinements = (\n callExpression: CallExpression,\n ): Array<{ index: number; text: string }> | undefined => {\n const [\n _routeName, // first generic - the route name\n paramsGeneric, // second generic - params refinements\n ] = extractGenerics(callExpression);\n\n if (!paramsGeneric?.isKind(SyntaxKind.TupleType)) {\n return;\n }\n\n return paramsGeneric.getElements().map((node, index) => {\n return {\n index,\n text: node.getText(),\n };\n });\n };\n\n const extractRouteMethods = (\n route: Pick<ApiRoute, \"id\" | \"name\">,\n callExpression: CallExpression,\n ): Array<{\n method: HTTPMethod;\n validationDefinitions: Array<ValidationDefinition>;\n }> => {\n const funcDeclaration =\n callExpression.getFirstChildByKind(SyntaxKind.ArrowFunction) ||\n callExpression.getFirstChildByKind(SyntaxKind.FunctionExpression);\n\n if (!funcDeclaration) {\n return [];\n }\n\n const arrayLiteralExpression = funcDeclaration.getFirstChildByKind(\n SyntaxKind.ArrayLiteralExpression,\n );\n\n if (!arrayLiteralExpression) {\n return [];\n }\n\n const callExpressions: Array<[CallExpression, HTTPMethod]> = [];\n\n for (const e of arrayLiteralExpression.getChildrenOfKind(\n SyntaxKind.CallExpression,\n )) {\n const name = e.getExpression().getText() as HTTPMethod;\n if (HTTPMethods[name]) {\n callExpressions.push([e, name]);\n }\n }\n\n const methods: ReturnType<typeof extractRouteMethods> = [];\n\n for (const [callExpression, method] of callExpressions) {\n const [vDefs, vOpts] = extractGenerics(callExpression);\n methods.push({\n method,\n validationDefinitions: extractValidationDefinitions(\n route,\n method,\n vDefs,\n vOpts,\n ),\n });\n }\n\n return methods;\n };\n\n /** Parse a boolean literal type node */\n const parseRuntimeValidation = (typeNode: TypeNode) => {\n if (typeNode.isKind(SyntaxKind.LiteralType)) {\n const literal = typeNode.getFirstChild();\n if (literal?.isKind(SyntaxKind.TrueKeyword)) {\n return true;\n } else if (literal?.isKind(SyntaxKind.FalseKeyword)) {\n return false;\n }\n }\n return undefined;\n };\n\n const extractResponseVariant = (\n typeNode: TypeNode,\n ):\n | {\n status: number;\n contentType?: string | undefined;\n body?: string | undefined;\n }\n | undefined => {\n if (!typeNode.isKind(SyntaxKind.TupleType)) {\n return;\n }\n\n let status = 200; // default\n let contentType: string | undefined;\n let body: string | undefined;\n\n const [statusNode, contentTypeNode, bodyNode] = typeNode.getElements();\n\n // Status (index 0) - should be a LiteralType with NumericLiteral\n if (statusNode?.isKind(SyntaxKind.LiteralType)) {\n const literal = statusNode.getFirstChildByKind(SyntaxKind.NumericLiteral);\n if (literal) {\n status = Number(literal.getText());\n }\n }\n\n // ContentType (index 1) - should be a LiteralType with StringLiteral\n if (contentTypeNode) {\n contentType = extractStringLiteral(contentTypeNode);\n }\n\n // Response type text (index 2)\n if (bodyNode) {\n body = bodyNode.getText();\n if ([\"object\"].includes(body)) {\n body = \"{}\";\n }\n }\n\n return { status, contentType, body };\n };\n\n /** Parse opts TypeLiteral into a map keyed by target */\n const parseValidationOptions = (typeNode: TypeNode | undefined) => {\n const opts: Partial<\n Record<\n ValidationTarget,\n {\n contentType: string | undefined;\n runtimeValidation: boolean | undefined;\n customErrors: Record<string, string> | undefined;\n }\n >\n > = {};\n\n if (!typeNode?.isKind(SyntaxKind.TypeLiteral)) {\n return opts;\n }\n\n for (const prop of typeNode.getMembers()) {\n if (!prop.isKind(SyntaxKind.PropertySignature)) {\n continue;\n }\n\n const target = prop.getName() as ValidationTarget;\n const typeNode = prop.getTypeNodeOrThrow();\n\n if (!typeNode.isKind(SyntaxKind.TypeLiteral)) {\n continue;\n }\n\n let contentType: string | undefined;\n let runtimeValidation: boolean | undefined;\n const customErrors: Record<string, string> = {};\n\n for (const member of typeNode.getMembers()) {\n if (!member.isKind(SyntaxKind.PropertySignature)) {\n continue;\n }\n\n const nameNode = member.getNameNode();\n const valueNode = member.getTypeNodeOrThrow();\n\n const name = nameNode.isKind(SyntaxKind.StringLiteral)\n ? nameNode.getLiteralText() // No quotes\n : nameNode.getText(); // Regular identifier\n\n if (name === \"contentType\") {\n contentType = extractStringLiteral(valueNode);\n } else if (name === \"runtimeValidation\") {\n runtimeValidation = parseRuntimeValidation(valueNode);\n } else if (name.startsWith(\"error\")) {\n const literal = extractStringLiteral(valueNode);\n if (literal) {\n customErrors[name] = literal;\n }\n }\n }\n\n opts[target] = {\n contentType,\n runtimeValidation,\n customErrors,\n };\n }\n\n return opts;\n };\n\n const extractStringLiteral = (typeNode: TypeNode) => {\n const literal = typeNode.isKind(SyntaxKind.LiteralType)\n ? typeNode.getFirstChildByKind(SyntaxKind.StringLiteral)\n : undefined;\n return literal ? literal.getLiteralText() : undefined;\n };\n\n /**\n * Extract validation definitions from route handler generics.\n * Merges defs (schemas) and opts (validation options) into a flat array.\n * */\n const extractValidationDefinitions = (\n route: Pick<ApiRoute, \"id\" | \"name\">,\n method: HTTPMethod,\n defsNode: TypeNode,\n optsNode: TypeNode | undefined,\n ) => {\n const definitions: Array<ValidationDefinition> = [];\n\n if (!defsNode?.isKind(SyntaxKind.TypeLiteral)) {\n return definitions;\n }\n\n const optsMap = parseValidationOptions(optsNode);\n\n const createId = (target: string, hash?: string) => {\n return [\n target.replace(/^./, (c) => c.toUpperCase()),\n \"T\",\n method,\n crc(route.id + hash),\n ].join(\"\");\n };\n\n for (const prop of defsNode.getMembers()) {\n if (!prop.isKind(SyntaxKind.PropertySignature)) {\n continue;\n }\n\n const target = prop.getName() as ValidationTarget;\n const typeNode = prop.getTypeNodeOrThrow();\n\n if (target === \"response\") {\n const variants = typeNode.isKind(SyntaxKind.UnionType)\n ? typeNode.getChildrenOfKind(SyntaxKind.TupleType)\n : [typeNode];\n definitions.push({\n ...optsMap[target],\n method,\n target,\n variants: variants.flatMap((e, i) => {\n const { status, contentType, body } =\n extractResponseVariant(e) || {};\n\n if (!status) {\n return [];\n }\n\n if (contentType && typeof contentType !== \"string\") {\n console.warn(\n styleText(\n [\"bold\", \"red\"],\n `\u2717 The second element of a response variant should specify the Response Content Type`,\n ),\n );\n console.warn(\n styleText([\"blue\"], ` Example: [200, \"json\", Schema]`),\n );\n console.warn(\n ` Route: ${route.name}; Method: ${method}; Response Variant: #${i}`,\n );\n console.warn();\n }\n\n return [\n {\n id: createId(\n target,\n JSON.stringify([status, contentType, body]),\n ),\n status,\n contentType,\n body,\n },\n ];\n }),\n });\n } else if (Object.keys(RequestValidationTargets).includes(target)) {\n definitions.push({\n ...optsMap[target],\n method,\n target,\n schema: {\n id: createId(target),\n text: typeNode.getText(),\n },\n });\n }\n }\n\n return definitions;\n };\n\n const extractTypeDeclarations = (\n sourceFile: SourceFile,\n opts?: {\n relpathResolver?: PathResolver;\n withReferencedFiles?: boolean;\n },\n ): [d: Array<TypeDeclaration>, f?: Array<string>] => {\n const declarations: Array<TypeDeclaration> = [];\n\n const referencedFiles: Array<string> | undefined = opts?.withReferencedFiles\n ? []\n : undefined;\n\n for (const declaration of sourceFile.getImportDeclarations()) {\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath;\n\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const defaultImport = typeOnlyDeclaration\n ? declaration.getDefaultImport()\n : undefined;\n\n if (defaultImport) {\n const name = defaultImport.getText();\n const text = `import type ${name} from \"${path}\";`;\n declarations.push({\n importDeclaration: {\n name,\n path,\n },\n text,\n });\n if (referencedFiles) {\n referencedFiles.push(...getReferencedFiles(defaultImport));\n }\n }\n\n for (const namedImport of declaration.getNamedImports()) {\n if (namedImport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedImport.getNameNode();\n const name = nameNode.getText();\n const alias = namedImport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n importDeclaration: {\n name,\n alias,\n path,\n },\n text: `import type { ${nameText} } from \"${path}\";`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n for (const declaration of sourceFile.getTypeAliases()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n typeAliasDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getInterfaces()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n interfaceDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getEnums()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n enumDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getExportDeclarations()) {\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = modulePath\n ? /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath\n : undefined;\n\n for (const namedExport of declaration.getNamedExports()) {\n if (namedExport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedExport.getNameNode();\n const name = nameNode.getText();\n const alias = namedExport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n exportDeclaration: {\n name,\n alias: alias ?? name,\n path,\n },\n text: path\n ? `export type { ${nameText} } from \"${path}\";`\n : `export type { ${nameText} };`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n return referencedFiles\n ? [declarations, [...new Set<string>(referencedFiles)]]\n : [declarations];\n };\n\n const getReferencedFiles = (importIdentifier: Identifier): Array<string> => {\n // ambient modules may have declarations in multiple files\n const declarations =\n importIdentifier //\n ?.getSymbol()\n ?.getAliasedSymbol()\n ?.getDeclarations() || [];\n\n return declarations.flatMap((e) => {\n const sourceFile = e.getSourceFile();\n return sourceFile //\n ? [sourceFile.getFilePath()]\n : [];\n });\n };\n\n const extractGenerics = (callExpression: CallExpression) => {\n return callExpression.getTypeArguments();\n };\n\n const typeResolverFactory = ({ root }: SourceFolder) => {\n const project = createProject({\n tsConfigFilePath: resolve(root, \"tsconfig.json\"),\n skipAddingFilesFromTsConfig: true,\n });\n\n const literalTypesResolver = (\n literalTypes: string,\n options: Parameters<typeof flattener>[2],\n ) => {\n const sourceFile = project.createSourceFile(\n `${crc(literalTypes)}-${Date.now()}.ts`,\n literalTypes,\n { overwrite: true },\n );\n\n const resolvedTypes = flattener(project, sourceFile, {\n ...options,\n stripComments: true,\n });\n\n project.removeSourceFile(sourceFile);\n\n return resolvedTypes;\n };\n\n return {\n getSourceFile: (fileFullpath: string) => {\n return (\n project.getSourceFile(fileFullpath) ||\n project.addSourceFileAtPath(fileFullpath)\n );\n },\n refreshSourceFile: async (fileFullpath: string) => {\n const sourceFile = project.getSourceFile(fileFullpath);\n if (sourceFile) {\n await sourceFile.refreshFromFileSystem();\n }\n },\n literalTypesResolver,\n };\n };\n\n return {\n createProject,\n extractDefaultExport,\n extractParamsRefinements,\n extractRouteMethods,\n extractTypeDeclarations,\n resolveRouteSignature,\n typeResolverFactory,\n };\n};\n", "export const defaults = {\n appPrefix: \"@\",\n srcPrefix: \"~\",\n libPrefix: \"_\",\n\n coreDir: \"core\",\n srcDir: \"src\",\n libDir: \"lib\",\n\n configDir: \"config\",\n apiDir: \"api\",\n pagesDir: \"pages\",\n entryDir: \"entry\",\n fetchDir: \"fetch\",\n\n refineTypeName: \"VRefine\",\n};\n", "import type { DefineGenerator, DefineGeneratorFactory } from \"@kosmojs/core\";\n\nexport const defineGenerator: DefineGenerator = (f) => f as never;\n\nexport const defineGeneratorFactory: DefineGeneratorFactory = (f) => f;\n", "import { access, constants } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\n\nimport type { SourceFolder } from \"@kosmojs/core\";\n\nimport { defaults } from \"./defaults\";\n\ntype Options = { origin: \"src\" | \"lib\" };\n\ntype CreateImport = Record<\n \"src\" | \"config\" | \"api\" | \"pages\" | \"lib\" | \"libApi\" | \"libEntry\",\n (a: Array<string>, o: Options) => string\n>;\n\nexport const pathResolver = (\n sourceFolder: Omit<SourceFolder, \"root\"> & { root?: string | undefined },\n): {\n createPath: Record<\n | \"src\"\n | \"config\"\n | \"api\"\n | \"pages\"\n | \"entry\"\n | \"lib\"\n | \"libApi\"\n | \"libEntry\"\n | \"libPages\"\n | \"distDir\",\n (...a: Array<string>) => string\n >;\n createImport: CreateImport;\n createImportHelpers: (o: Options) => {\n createImport: (k: keyof CreateImport, ...a: Array<string>) => string;\n };\n} => {\n const createPath = (...a: Array<string>) => {\n return sourceFolder.root\n ? resolve(sourceFolder.root, join(...a))\n : join(...a);\n };\n\n const createImport: CreateImport = {\n src(a, { origin }) {\n return origin === \"src\"\n ? join(defaults.srcPrefix, ...a)\n : join(defaults.appPrefix, defaults.srcDir, sourceFolder.name, ...a);\n },\n config(a, o) {\n return this.src([defaults.configDir, ...a], o);\n },\n api(a, o) {\n return this.src([defaults.apiDir, ...a], o);\n },\n pages(a, o) {\n return this.src([defaults.pagesDir, ...a], o);\n },\n lib(a, { origin }) {\n return origin === \"src\"\n ? join(defaults.libPrefix, ...a)\n : join(defaults.appPrefix, defaults.libDir, sourceFolder.name, ...a);\n },\n libApi(a, o) {\n return this.lib([defaults.apiDir, ...a], o);\n },\n libEntry(a, o) {\n return this.lib([defaults.entryDir, ...a], o);\n },\n };\n\n return {\n createPath: {\n src(...a) {\n return createPath(defaults.srcDir, sourceFolder.name, ...a);\n },\n api(...a) {\n return this.src(defaults.apiDir, ...a);\n },\n pages(...a) {\n return this.src(defaults.pagesDir, ...a);\n },\n config(...a) {\n return this.src(defaults.configDir, ...a);\n },\n entry(...a) {\n return this.src(defaults.entryDir, ...a);\n },\n lib(...a) {\n return createPath(defaults.libDir, sourceFolder.name, ...a);\n },\n libApi(...a) {\n return this.lib(defaults.apiDir, ...a);\n },\n libEntry(...a) {\n return this.lib(defaults.entryDir, ...a);\n },\n libPages(...a) {\n return this.lib(defaults.pagesDir, ...a);\n },\n distDir(...a) {\n return createPath(sourceFolder.distDir, sourceFolder.name, ...a);\n },\n },\n createImport,\n createImportHelpers(o) {\n if (![\"src\", \"lib\"].includes(o?.origin)) {\n throw new Error(\n `createImportHelpers: required exactly one argument of shape { origin: \"src|lib\" }`,\n );\n }\n return {\n createImport(key, ...a) {\n // Handlebars appends an options object as the last argument,\n // slice it off before passing args to createImport\n return createImport[key](a.slice(0, -1), o);\n },\n };\n },\n };\n};\n\nexport const pathExists = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n};\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport handlebars from \"handlebars\";\n\nimport { pathExists } from \"./paths\";\n\nexport type RenderOptions = {\n noEscape?: boolean;\n // handlebars instance\n renderer?: typeof handlebars;\n};\n\nexport type FactoryOptions = RenderOptions & {\n partials?: Record<string, string>;\n helpers?: Record<string, (...a: Array<never>) => unknown>;\n outdir?: string;\n /**\n * Controls whether to overwrite an existing file.\n * - `false`: skip writing if the file already exists\n * - `true` (default): always overwrite\n * - function: custom logic to decide whether to overwrite, based on current file content\n * */\n overwrite?: boolean | ((fileContent: string) => boolean);\n};\n\nexport const render = <Context = object>(\n template: string,\n context: Context,\n options?: RenderOptions,\n): string => {\n const { noEscape = true, renderer = handlebars } = { ...options };\n return renderer.compile(template, { noEscape })(context);\n};\n\nexport const renderToFile = async <Context = object>(\n file: string,\n template: string,\n context: Context,\n options?: RenderOptions & Pick<FactoryOptions, \"overwrite\">,\n): Promise<void> => {\n const content = render(template, context, options);\n\n /**\n * Two fs calls (exists + read) are worth it to avoid touching the file\n * and triggering watchers unnecessarily.\n * */\n if (await pathExists(file)) {\n const { overwrite = true } = { ...options };\n if (overwrite === false) {\n return;\n }\n const fileContent = await readFile(file, \"utf8\");\n if (typeof overwrite === \"function\" && !overwrite(fileContent)) {\n return;\n }\n if (crc(content) === crc(fileContent)) {\n return;\n }\n }\n\n await mkdir(dirname(file), { recursive: true });\n await writeFile(file, content, \"utf8\");\n};\n\nexport const renderFactory = (options?: FactoryOptions) => {\n const createRenderer = (selfOoptions?: FactoryOptions) => {\n const renderer = handlebars.create();\n\n renderer.registerPartial({\n ...options?.partials,\n ...selfOoptions?.partials,\n } as never);\n\n renderer.registerHelper({\n ...options?.helpers,\n ...selfOoptions?.helpers,\n } as never);\n\n return renderer;\n };\n\n return {\n render<Context = object>(\n template: string,\n context: Context,\n selfOoptions?: FactoryOptions,\n ) {\n return render(template, context, {\n ...options,\n ...selfOoptions,\n renderer: createRenderer(selfOoptions),\n });\n },\n async renderToFile<Context = object>(\n file: string,\n template: string,\n context: Context,\n selfOoptions?: FactoryOptions,\n ) {\n return renderToFile(\n options?.outdir ? join(options.outdir, file) : file,\n template,\n context,\n {\n ...options,\n ...selfOoptions,\n renderer: createRenderer(selfOoptions),\n },\n );\n },\n };\n};\n", "import { dirname, join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport crc from \"crc/crc32\";\nimport picomatch from \"picomatch\";\nimport { glob } from \"tinyglobby\";\n\nimport type {\n PathToken,\n PathTokenParamPart,\n ResolvedEntry,\n RouteEntry,\n SourceFolder,\n} from \"@kosmojs/core\";\n\nimport { defaults } from \"../defaults\";\nimport { pathResolver } from \"../paths\";\nimport {\n createHonoPattern,\n createPathPattern,\n pathTokensFactory,\n} from \"./paths\";\n\nexport type ResolverSignature = {\n name: string;\n handler: (updatedFile?: string) => Promise<ResolvedEntry>;\n};\n\nexport const API_INDEX_BASENAME = \"index\";\nexport const API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;\n\nexport const API_USE_BASENAME = \"use\";\nexport const API_USE_PATTERN = `${API_USE_BASENAME}.ts`;\n\nexport const PAGE_INDEX_BASENAME = \"index\";\nexport const PAGE_INDEX_PATTERN = `${PAGE_INDEX_BASENAME}.{tsx,vue,mdx,md}`;\n\nexport const PAGE_LAYOUT_BASENAME = \"layout\";\nexport const PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue,mdx}`;\n\nconst ROUTE_FILE_PATTERNS = [\n // match index files in api dir\n `${defaults.apiDir}/**/${API_INDEX_PATTERN}`,\n // match use files in api dir\n `${defaults.apiDir}/**/${API_USE_PATTERN}`,\n // match index files in pages dir\n `${defaults.pagesDir}/**/${PAGE_INDEX_PATTERN}`,\n // match layout files in pages dir\n `${defaults.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`,\n];\n\nexport const scanRoutes = async (sourceFolder: SourceFolder) => {\n const { createPath } = pathResolver(sourceFolder);\n return glob(ROUTE_FILE_PATTERNS, {\n cwd: createPath.src(),\n absolute: true,\n onlyFiles: true,\n followSymbolicLinks: false,\n ignore: [\n // ignore top-level matches, routes resides in folders, even index route\n `${defaults.apiDir}/${API_INDEX_PATTERN}`,\n `${defaults.apiDir}/${API_USE_PATTERN}`,\n `${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`,\n `${defaults.pagesDir}/${PAGE_LAYOUT_PATTERN}`,\n ],\n });\n};\n\nexport const isRouteFile = (\n file: string,\n sourceFolder: SourceFolder,\n):\n | [\n // Either `apiDir` or `pagesDir`\n folder: string,\n // Path to a file within the folder, nested at least one level deep\n file: string,\n ]\n | false => {\n const [\n // source folder name\n _sourceFolder,\n // route folder, api or pages\n _folder,\n ...rest\n ] = resolve(sourceFolder.root, file)\n .replace(`${sourceFolder.root}/${defaults.srcDir}/`, \"\")\n .split(\"/\");\n\n /**\n * Ensure the file:\n * - is under the correct source root\n * - belongs to a known route folder (`api/` or `pages/`)\n * - is nested at least one level deep (not a direct child of the folder)\n * */\n if (!_folder || _sourceFolder !== sourceFolder.name || rest.length < 2) {\n return false;\n }\n\n return picomatch.isMatch(join(_folder, ...rest), ROUTE_FILE_PATTERNS)\n ? [_folder, rest.join(\"/\")]\n : false;\n};\n\nexport const isApiRoute = (file: string) => {\n return picomatch.matchBase(file, `**/${API_INDEX_PATTERN}`);\n};\n\nexport const isApiUse = (file: string) => {\n return picomatch.matchBase(file, `**/${API_USE_PATTERN}`);\n};\n\nexport const isPageRoute = (file: string) => {\n return picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`);\n};\n\nexport const isPageLayout = (file: string) => {\n return picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`);\n};\n\nexport const createRouteEntry = (\n fileFullpath: string,\n sourceFolder: SourceFolder,\n): RouteEntry | undefined => {\n // scanner already is doing a great job on matching only relevant files\n // but doing a double check here to make sure only needed files added to stack\n const resolvedPaths = isRouteFile(fileFullpath, sourceFolder);\n\n if (!resolvedPaths) {\n return;\n }\n\n const [folder, file] = resolvedPaths;\n\n const id = `${file.replace(/\\W+/g, \"_\")}_${crc(file)}`;\n const name = dirname(file);\n\n try {\n const pathTokens = pathTokensFactory(dirname(file));\n return {\n id,\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n pathPattern: createPathPattern(pathTokens),\n honoPattern: createHonoPattern(pathTokens),\n };\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n console.error(\n `\u2757${styleText(\"red\", \"ERROR\")}: Failed parsing path for \"${styleText(\"cyan\", file)}\"`,\n );\n console.error(error);\n return;\n }\n};\n\n/**\n * Weight of a single path segment.\n *\n * Fixed values per kind prevent complex mixed segments\n * from outscoring multiple statics.\n *\n * static: 4 (exact match, most specific)\n * mixed: 3+ (static + param parts; more statics = slightly higher)\n * required: 2 (matches any single segment)\n * optional: 1 (may or may not match)\n * splat: 0 (matches anything, least specific)\n * */\nconst segmentWeight = (token: PathToken): number => {\n if (token.kind === \"static\") {\n return 4;\n }\n\n if (token.kind === \"mixed\") {\n let statics = 0;\n let optionals = 0;\n\n for (const part of token.parts) {\n if (part.type === \"static\") {\n statics += 1;\n } else if (part.kind === \"optional\" || part.kind === \"splat\") {\n optionals += 1;\n }\n }\n\n // unconditional statics contribute positively,\n // optionals penalize to avoid beating fully-static mixed routes\n return 3 + statics * 0.01 - optionals * 0.005;\n }\n\n const part = token.parts[0] as PathTokenParamPart;\n\n switch (part.kind) {\n case \"required\":\n return 2;\n case \"optional\":\n return 1;\n case \"splat\":\n return 0;\n }\n};\n\n/**\n * Compare two route entries for registration order.\n *\n * More specific routes sort first (higher priority).\n * Segments are compared left-to-right; first difference wins.\n *\n * When one route is a prefix of the other, the trailing segment\n * determines order: a trailing splat loses (shorter sibling first),\n * anything else wins (longer route is more specific).\n *\n * At equal weight and length, lexicographic tiebreak ensures\n * deterministic ordering across JS engines.\n * */\nexport const sortRoutes = (a: RouteEntry, b: RouteEntry): number => {\n const pairs = Array.from(\n { length: Math.max(a.pathTokens.length, b.pathTokens.length) },\n (_, i) => [a.pathTokens[i], b.pathTokens[i]] as const,\n );\n\n for (const [at, bt] of pairs) {\n if (!at || !bt) {\n // one route ran out of segments - check what the extra segment is\n const extra = at ?? bt;\n\n const isSplat =\n extra?.kind === \"param\"\n ? (extra.parts[0] as PathTokenParamPart).kind === \"splat\"\n : false;\n\n if (isSplat) {\n // trailing splat: shorter sibling registers first\n return at ? 1 : -1;\n }\n\n // trailing non-splat: longer route is more specific, registers first\n return at ? -1 : 1;\n }\n\n const aw = segmentWeight(at);\n const bw = segmentWeight(bt);\n\n if (aw !== bw) {\n return bw - aw;\n }\n }\n\n // same weight profile, same length: deterministic tiebreak\n return a.pathPattern.localeCompare(b.pathPattern);\n};\n", "import crc from \"crc/crc32\";\nimport { parse, type Token } from \"path-to-regexp\";\n\nimport type {\n PathToken,\n PathTokenParamPart,\n PathTokenStaticPart,\n} from \"@kosmojs/core\";\n\n/**\n * Parse a filesystem route path into structured PathToken array.\n *\n * Uses path-to-regexp v8 AST for parsing, with directory-friendly syntax:\n * - [param] => required param - :param\n * - {param} => optional param - {:param}\n * - {...param} => splat - {*param}\n *\n * Direct :param syntax is prohibited outside {} to avoid ambiguity.\n * Inside {} it is treated as path-to-regexp power syntax and used as-is.\n *\n * Examples:\n * Required: [id], [name]\n * Optional: {name}, {format}\n * Splat: {...path}\n * Mixed segments: shop/[id]-{name}\n * Power syntax: {-v:version{-:pre}}, :name{@:version{.:min}}.js\n * */\nexport const pathTokensFactory = (\n path: string,\n {\n transformStaticValue = normalizeStaticValue,\n }: {\n transformStaticValue?: (v: string) => string;\n } = {},\n): Array<PathToken> => {\n /**\n * Recursively extract parts from path-to-regexp AST tokens.\n * A param inside a group is optional; top-level params are required.\n * Wildcard tokens are always splat.\n * Slash-only text nodes (restored for parsing) are skipped.\n * */\n const extractParts = (\n tokens: Array<Token>,\n createConst: (value: string) => string,\n insideGroup = false,\n ): Array<PathTokenStaticPart | PathTokenParamPart> => {\n const parts: Array<PathTokenStaticPart | PathTokenParamPart> = [];\n\n for (const token of tokens) {\n switch (token.type) {\n case \"text\":\n // Skip slash-only text nodes (restored it via transformers for parsing)\n if (token.value !== \"/\") {\n parts.push({\n type: \"static\",\n value: transformStaticValue(token.value),\n });\n }\n break;\n case \"param\":\n parts.push({\n type: \"param\",\n kind: insideGroup ? \"optional\" : \"required\",\n name: token.name,\n const: createConst(token.name),\n });\n break;\n case \"wildcard\":\n parts.push({\n type: \"param\",\n kind: \"splat\",\n name: token.name,\n const: createConst(token.name),\n });\n break;\n case \"group\":\n parts.push(...extractParts(token.tokens, createConst, true));\n break;\n }\n }\n\n return parts;\n };\n\n const patternTransforms: Array<(s: string) => string> = [\n // Transform required params: [id] => :id\n // Only pure \\w param names,\n // [some-id] used as is, not treated as param,\n // use [some_id] instead.\n (s) => s.replace(/\\[(\\w+)\\]/g, \":$1\"),\n\n // Transform optional params: {id} => {:id}\n // Only pure \\w param names,\n // anything else treated as a path-to-regexp pattern and used as is.\n // {some-id} treated as an optional static segment.\n // use {some_id} for simple param syntax\n // or {:some-id} pattern where :some is the param name and -id is a static segment.\n (s) => s.replace(/\\{(\\w+)\\}/g, \"{:$1}\"),\n\n // Transform splat params: {...param} => {*param}\n (s) => s.replace(/\\{\\.\\.\\./g, \"{*\"),\n\n // Insert leading slash inside optional/splat groups.\n // {:name} => {/:name}\n // {*name} => {/*name}\n (s) => {\n return s.startsWith(\"{\") // keep this check for intention clarity\n ? s.replace(/^\\{/, \"{/\")\n : s;\n },\n ];\n\n // detect :param used outside {}\n const detectBareParams = (s: string): \":\" | string | undefined => {\n let depth = 0;\n for (const [i, ch] of [...s].entries()) {\n if (ch === \"{\") {\n depth += 1;\n } else if (ch === \"}\") {\n depth -= 1;\n } else if (ch === \":\" && depth === 0) {\n const match = s.slice(i + 1).match(/^\\w+/);\n return match?.[0] || \":\";\n }\n }\n return;\n };\n\n const tokens = path\n .replace(/^index\\/?/, \"\")\n .split(\"/\")\n .flatMap<PathToken>((orig) => {\n if (!orig.length) {\n return [];\n }\n\n const bareParam = detectBareParams(orig);\n\n if (bareParam === \":\") {\n throw new Error(\n `${path} contains colons outside braces, use : only within {}`,\n );\n } else if (bareParam) {\n throw new Error(\n `${path} contains bare params, use [${bareParam}] instead of :${bareParam}`,\n );\n }\n\n const pattern = patternTransforms.reduce((src, fn) => fn(src), orig);\n\n const { tokens } = parse(pattern);\n\n const parts = extractParts(tokens, (val) => {\n // Sanitize param name into a valid JS identifier\n return /\\W/.test(val) || /^\\d/.test(val)\n ? [val.replace(/^\\d+|\\W/g, \"_\"), crc(orig)].join(\"_\")\n : val;\n });\n\n const isStatic = parts.length === 1 ? parts[0].type === \"static\" : false;\n const isParam = parts.length === 1 ? parts[0].type === \"param\" : false;\n\n const kind: PathToken[\"kind\"] = isStatic\n ? \"static\"\n : isParam\n ? \"param\"\n : \"mixed\";\n\n return [\n {\n kind,\n orig,\n pattern,\n parts,\n },\n ];\n });\n\n return tokens;\n};\n\nexport const createPathPattern = (tokens: Array<PathToken>) => {\n return tokens\n .map(({ pattern }, i) => {\n const next = tokens[i + 1];\n\n if (!next || next.pattern.includes(\"/\")) {\n return pattern;\n }\n\n const slashRequired = tokens.slice(i + 1).some((e) => {\n return e.parts.some((e) => {\n return e.type === \"static\" || e.kind === \"required\";\n });\n });\n\n return slashRequired ? `${pattern}/` : pattern;\n })\n .join(\"\");\n};\n\nexport const createHonoPattern = (tokens: Array<PathToken>) => {\n const staticValue = ({ value }: PathTokenStaticPart) => {\n return normalizeStaticValue(value);\n };\n\n const paramValue = (p: PathTokenParamPart) => {\n if (p.kind === \"splat\") {\n return `*`;\n }\n if (p.kind === \"optional\") {\n return `:${p.name}?`;\n }\n return `:${p.name}`;\n };\n\n const escapeRegex = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n const tokensToRegex = (tokens: Array<Token>): string => {\n return tokens\n .flatMap((t) => {\n if (t.type === \"text\") {\n return t.value === \"/\" ? [] : [escapeRegex(t.value)];\n }\n if (t.type === \"wildcard\") {\n return [\".+\"];\n }\n if (t.type === \"param\") {\n return [\"[^/]+\"];\n }\n if (t.type === \"group\") {\n return [`(?:${tokensToRegex(t.tokens)})?`];\n }\n return [];\n })\n .join(\"\");\n };\n\n return tokens\n .flatMap((token, i) => {\n if (token.kind === \"static\") {\n return [staticValue(token.parts[0] as PathTokenStaticPart)];\n }\n\n if (token.kind === \"param\") {\n return [paramValue(token.parts[0] as PathTokenParamPart)];\n }\n\n // mixed \u2192 parse pattern, build regex, emit disposable param\n const { tokens } = parse(token.pattern.replace(/\\//g, \"\"));\n\n const regex = tokensToRegex(tokens);\n\n return [`:_${i}{${regex}}`];\n })\n .join(\"/\");\n};\n\nexport const normalizeStaticValue = (value: string) => {\n return value.replace(/\\+/g, \"\\\\\\\\+\");\n};\n", "import { dirname, join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport crc from \"crc/crc32\";\nimport mimeTypes from \"mime-types\";\n\nimport type {\n ApiRoute,\n PageRoute,\n PathTokenParamPart,\n RouteEntry,\n RouteResolverCacheFactory,\n SourceFolder,\n ValidationDefinition,\n} from \"@kosmojs/core\";\n\nimport { astFactory } from \"../ast\";\nimport { defaults } from \"../defaults\";\nimport { pathResolver } from \"../paths\";\nimport { render, renderToFile } from \"../render\";\nimport type { ResolverSignature } from \"./base\";\nimport * as templates from \"./templates\";\n\nexport const resolverFactory = (\n sourceFolder: SourceFolder,\n cacheFactory?: RouteResolverCacheFactory,\n): Record<\n | \"pageLayoutResolver\"\n | \"pageRouteResolver\"\n | \"apiUseResolver\"\n | \"apiRouteResolver\",\n (entry: RouteEntry) => ResolverSignature\n> => {\n const {\n //\n generators = [],\n refineTypeName = defaults.refineTypeName,\n } = sourceFolder.config;\n\n const { typeResolverFactory, resolveRouteSignature } = astFactory();\n\n const resolveTypes = generators.some(({ meta }) => meta.resolveTypes);\n\n const {\n //\n literalTypesResolver,\n getSourceFile,\n refreshSourceFile,\n } = typeResolverFactory(sourceFolder);\n\n return {\n pageLayoutResolver(entry) {\n const { name } = entry;\n\n const handler: ResolverSignature[\"handler\"] = async () => {\n return {\n kind: \"pageLayout\",\n entry,\n };\n };\n\n return { name, handler };\n },\n\n pageRouteResolver(entry) {\n const {\n id,\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n pathPattern,\n honoPattern,\n } = entry;\n\n const handler: ResolverSignature[\"handler\"] = async () => {\n const entry: PageRoute = {\n id,\n name,\n pathTokens,\n pathPattern,\n honoPattern,\n params: {\n schema: pathTokens.flatMap((e) => {\n return e.parts.filter((p) => p.type === \"param\");\n }),\n },\n folder,\n file,\n fileFullpath,\n };\n\n return {\n kind: \"pageRoute\",\n entry,\n };\n };\n\n return { name, handler };\n },\n\n apiUseResolver(entry) {\n const { name } = entry;\n\n const handler: ResolverSignature[\"handler\"] = async () => {\n return {\n kind: \"apiUse\",\n entry,\n };\n };\n\n return { name, handler };\n },\n\n apiRouteResolver(entry) {\n const {\n id,\n name,\n file,\n folder,\n fileFullpath,\n pathTokens,\n pathPattern,\n honoPattern,\n } = entry;\n\n const handler: ResolverSignature[\"handler\"] = async (updatedFile) => {\n const paramsSchema: Array<PathTokenParamPart> = pathTokens.flatMap(\n (e) => {\n return e.parts.flatMap((p) => {\n return p.type === \"param\" ? [p] : [];\n });\n },\n );\n\n const optionalParams = paramsSchema.length\n ? paramsSchema.filter((e) => e.kind === \"required\").length === 0\n : true;\n\n const cacheStore = cacheFactory\n ? cacheFactory({ id, file, fileFullpath }, sourceFolder, {\n resolveTypes,\n })\n : undefined;\n\n let cache = cacheStore\n ? await cacheStore.get({ validate: true })\n : undefined;\n\n if (!cache) {\n if (updatedFile === fileFullpath) {\n await refreshSourceFile(fileFullpath);\n }\n\n const {\n typeDeclarations,\n paramsRefinements,\n methods,\n validationDefinitions,\n referencedFiles = [],\n } = await resolveRouteSignature(\n { id, name, fileFullpath, optionalParams },\n {\n withReferencedFiles: true,\n sourceFile: getSourceFile(fileFullpath),\n relpathResolver(path) {\n return join(\n sourceFolder.name,\n defaults.apiDir,\n dirname(file),\n path,\n );\n },\n },\n );\n\n const validationTypes = validationDefinitions.flatMap<{\n id: string;\n text: string;\n }>((def) => {\n return def.target === \"response\"\n ? def.variants.flatMap(({ id, body }) => {\n return body ? [{ id, text: body }] : [];\n })\n : [def.schema];\n });\n\n const numericParams = paramsRefinements\n ? paramsRefinements.flatMap(({ text, index }) => {\n if (text === \"number\") {\n const param = paramsSchema.at(index);\n return param ? [param.name] : [];\n }\n return [];\n })\n : [];\n\n const typesFile = pathResolver(sourceFolder).createPath.libApi(\n dirname(file),\n \"types.ts\",\n );\n\n const params: ApiRoute[\"params\"] = {\n id: [\"ParamsT\", crc(name)].join(\"\"),\n schema: paramsSchema,\n resolvedType: undefined,\n };\n\n const typesFileContent = render(templates.typesFile, {\n params,\n paramsSchema: paramsSchema.map((param, index) => {\n return {\n ...param,\n isRequired: param.kind === \"required\",\n isSplat: param.kind === \"splat\",\n refinement: paramsRefinements?.at(index),\n };\n }),\n typeDeclarations,\n validationTypes,\n });\n\n const resolvedTypes = resolveTypes\n ? literalTypesResolver(typesFileContent, {\n stripComments: true,\n overrides: { [refineTypeName]: refineTypeName },\n withProperties: [\n params.id,\n ...validationTypes.flatMap(({ id }) => id),\n ],\n })\n : undefined;\n\n /**\n * Deploy types.ts file; required by core generators (like fetch).\n * If types resolved, write resolved types;\n * otherwise write original types extracted from API route.\n * */\n await renderToFile(\n typesFile,\n resolvedTypes ? templates.resolvedTypes : typesFileContent,\n { resolvedTypes },\n );\n\n params.resolvedType = resolvedTypes?.find(\n (e) => e.name === params.id,\n );\n\n cache = {\n // placeholder values, if cacheFactory given,\n // they will be replaced by persistCache\n hash: 0,\n referencedFiles: {},\n // real values\n params,\n methods,\n typeDeclarations,\n numericParams,\n validationDefinitions: validationDefinitions.map((def) => {\n return {\n ...def,\n ...(def.target === \"response\"\n ? {\n variants: def.variants.map((variant) => {\n return {\n ...variant,\n resolvedType: resolvedTypes?.find(\n (e) => e.name === variant.id,\n ),\n };\n }),\n }\n : {\n schema: {\n ...def.schema,\n resolvedType: resolvedTypes?.find(\n (e) => e.name === def.schema.id,\n ),\n },\n }),\n };\n }),\n };\n\n if (cacheStore) {\n const { referencedFiles: _void, ...rest } = cache;\n cache = await cacheStore.set({ ...rest, referencedFiles });\n }\n }\n\n const validationDefinitions = cache.validationDefinitions.flatMap(\n (def) => {\n let augmentedDef: ValidationDefinition | undefined = def;\n\n if (def.target === \"response\") {\n augmentedDef = {\n ...def,\n variants: def.variants.flatMap((variant, i) => {\n if (typeof variant.contentType !== \"string\") {\n return [variant];\n }\n\n if (variant.contentType.includes(\"/\")) {\n return [variant];\n }\n\n const contentType = mimeTypes.lookup(variant.contentType);\n\n if (contentType === false) {\n console.warn(\n styleText(\n [\"bold\", \"red\"],\n \"\u2717 Failed resolving Response Content Type\",\n ),\n );\n console.warn(\n ` Invalid value provided for mime-types lookup - ${variant.contentType}`,\n );\n console.warn(\n styleText(\n [\"cyan\"],\n ` Response variant #${i} excluded from route schemas`,\n ),\n );\n console.warn(` Route: ${name}; Method: ${def.method}`);\n console.warn();\n return [];\n }\n\n return [{ ...variant, contentType }];\n }),\n };\n } else if (def.contentType && !def.contentType.includes(\"/\")) {\n const contentType = mimeTypes.lookup(def.contentType);\n if (contentType === false) {\n console.warn(\n styleText(\n [\"bold\", \"red\"],\n \"\u2717 Failed resolving Response Content Type\",\n ),\n );\n console.warn(\n ` Invalid value provided for mime-types lookup - ${def.contentType}`,\n );\n console.warn(` Route: ${name}; Method: ${def.method}`);\n console.warn();\n } else {\n augmentedDef = { ...def, contentType };\n }\n }\n\n return augmentedDef ? [augmentedDef] : [];\n },\n );\n\n const entry: ApiRoute = {\n id,\n name,\n pathTokens,\n pathPattern,\n honoPattern,\n params: cache.params,\n numericParams: cache.numericParams,\n optionalParams,\n folder,\n file,\n fileFullpath,\n methods: cache.methods,\n typeDeclarations: cache.typeDeclarations,\n validationDefinitions,\n referencedFiles: Object.keys(cache.referencedFiles).map(\n // expand referenced files path,\n // they are stored as relative in cache\n (e) => resolve(sourceFolder.root, e),\n ),\n };\n\n return {\n kind: \"apiRoute\",\n entry,\n };\n };\n\n return { name, handler };\n },\n };\n};\n", "{{#each resolvedTypes}}\nexport type {{name}} = {{text}};\n{{/each}}\n", "{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n \"{{name}}\"{{#unless isRequired}}?{{/unless}}: {{#if refinement}}\n {{refinement.text}},\n {{else}}\n {{#if isSplat}}Array<string>{{else}}string{{/if}},\n {{/if}}\n {{/each}}\n};\n\n{{#each validationTypes}}export type {{id}} = {{text}};\n{{/each}}\n", "import { basename } from \"node:path\";\n\nimport type { NestedRouteEntry, RouteEntry } from \"@kosmojs/core\";\n\nimport { PAGE_INDEX_BASENAME, PAGE_LAYOUT_BASENAME, sortRoutes } from \"./base\";\n\nexport const nestedRoutesFactory = (routeEntries: Array<RouteEntry>) => {\n const entryStack = structuredClone(routeEntries).sort(sortRoutes);\n\n /**\n * Group entries by name (at the same level, both layout and index share same name).\n *\n * Handle 3 cases:\n * - both index and layout exists\n * - only index exists\n * - only layout exists\n *\n * */\n const transformEntries = (\n entries: Array<RouteEntry>,\n parent?: RouteEntry,\n ): Array<NestedRouteEntry> => {\n return [...new Set(entries.map((e) => e.name))].flatMap((name) => {\n const nameEntries = entryStack.flatMap(({ fileFullpath, ...entry }) => {\n return entry.name === name ? [entry] : [];\n });\n\n const index = nameEntries.find((e) =>\n basename(e.file).startsWith(PAGE_INDEX_BASENAME),\n ) as RouteEntry;\n\n const layout = nameEntries.find((e) =>\n basename(e.file).startsWith(PAGE_LAYOUT_BASENAME),\n ) as RouteEntry;\n\n if (index || layout) {\n return [\n {\n index: index\n ? {\n ...index,\n pathTokens: index.pathTokens.slice(\n parent?.pathTokens.length || 0,\n ),\n }\n : undefined,\n layout: layout\n ? {\n ...layout,\n pathTokens: layout.pathTokens.slice(\n parent?.pathTokens.length || 0,\n ),\n }\n : undefined,\n parent: parent?.name,\n children: transformEntries(\n findDescendantEntries(index || layout),\n index || layout,\n ),\n },\n ];\n }\n\n return [];\n });\n };\n\n /**\n * Recursively finds direct descendant routes.\n *\n * \"Direct\" means the next existing route in the path hierarchy,\n * skipping intermediate path segments that don't have index/layout files.\n *\n * Example: blog/post/[slug]/index.tsx is a direct child of blog/index.tsx\n * even though \"post\" segment exists (it has no index.tsx).\n * */\n const findDescendantEntries = ({\n name,\n pathTokens,\n }: RouteEntry): Array<RouteEntry> => {\n // Find all potential children - BOTH indexes AND layouts\n const potentialChildren = entryStack.filter((entry) => {\n // Must be deeper than current entry\n if (entry.pathTokens.length <= pathTokens.length) {\n return false;\n }\n // Must be a descendant path\n if (!entry.name.startsWith(`${name}/`)) {\n return false;\n }\n return true;\n });\n\n // Filter to direct children (no intermediate route between parent and child)\n return potentialChildren.filter((child) => {\n // Check if any route exists between parent and child\n const hasIntermediateRoute = potentialChildren.some((intermediate) => {\n if (intermediate === child) {\n return false;\n }\n // Intermediate must be between parent and child in depth\n if (intermediate.pathTokens.length <= pathTokens.length) {\n return false;\n }\n if (intermediate.pathTokens.length >= child.pathTokens.length) {\n return false;\n }\n // Child must be descendant of intermediate\n return child.name.startsWith(`${intermediate.name}/`);\n });\n\n return !hasIntermediateRoute;\n });\n };\n\n // Find root entries - entries that have no parent route\n const rootEntries = entryStack.filter((entry) => {\n // Check if any other entry could be its parent\n const hasParent = entryStack.some((potential) => {\n if (potential === entry) {\n return false;\n }\n if (potential.pathTokens.length >= entry.pathTokens.length) {\n return false;\n }\n return entry.name.startsWith(`${potential.name}/`);\n });\n\n return !hasParent;\n });\n\n return transformEntries(rootEntries);\n};\n", "import type {\n RouteEntry,\n RouteResolverCacheFactory,\n SourceFolder,\n} from \"@kosmojs/core\";\n\nimport { defaults } from \"../defaults\";\nimport {\n createRouteEntry,\n isApiRoute,\n isApiUse,\n isPageLayout,\n isPageRoute,\n type ResolverSignature,\n scanRoutes,\n} from \"./base\";\nimport { resolverFactory } from \"./resolve\";\n\nexport * from \"./base\";\nexport * from \"./nesting\";\nexport * from \"./paths\";\n\nexport const routesFactory = async (\n sourceFolder: SourceFolder,\n cacheFactory?: RouteResolverCacheFactory,\n) => {\n const {\n apiRouteResolver,\n apiUseResolver,\n pageRouteResolver,\n pageLayoutResolver,\n } = resolverFactory(sourceFolder, cacheFactory);\n\n const resolversFactory = (routeFiles: Array<string>) => {\n const resolvers = new Map<\n string, // fileFullpath\n ResolverSignature\n >();\n\n const entries: Array<RouteEntry> = routeFiles.flatMap((file) => {\n const entry = createRouteEntry(file, sourceFolder);\n return entry ? [entry] : [];\n });\n\n for (const entry of entries) {\n if (entry.folder === defaults.apiDir) {\n if (isApiRoute(entry.file)) {\n resolvers.set(entry.fileFullpath, apiRouteResolver(entry));\n } else if (isApiUse(entry.file)) {\n resolvers.set(entry.fileFullpath, apiUseResolver(entry));\n }\n } else if (entry.folder === defaults.pagesDir) {\n if (isPageRoute(entry.file)) {\n resolvers.set(entry.fileFullpath, pageRouteResolver(entry));\n } else if (isPageLayout(entry.file)) {\n resolvers.set(entry.fileFullpath, pageLayoutResolver(entry));\n }\n }\n }\n\n return resolvers;\n };\n\n const routeFiles = await scanRoutes(sourceFolder);\n\n return {\n resolvers: resolversFactory(routeFiles),\n resolversFactory,\n };\n};\n", "import { Spinner } from \"@topcli/spinner\";\n\nexport type SpinnerFactory = {\n text: (text: string) => void;\n append: (text: string) => void;\n succeed: (text?: string) => void;\n failed: (text?: string) => void;\n};\n\nexport const spinnerFactory = (startText: string): SpinnerFactory => {\n const spinner = new Spinner().start(startText);\n let _text = startText;\n return {\n text(text) {\n _text = text;\n spinner.text = text;\n },\n append(text) {\n spinner.text = `${_text} \u203A ${text}`;\n },\n succeed(text) {\n if (text) {\n this.append(text);\n } else {\n this.text(_text);\n }\n spinner.succeed();\n },\n failed(text) {\n if (text) {\n this.text([_text, text].join(\"\\n\"));\n }\n spinner.failed();\n },\n };\n};\n\nexport const withSpinner = (\n text: string,\n pipe: (spinner: SpinnerFactory) => void | Promise<void>,\n spinner?: SpinnerFactory,\n) => pipe(spinner || spinnerFactory(text));\n", "import { defaults } from \"./defaults\";\n\nexport const generateTsconfig = (sourceFolder?: string) => {\n // biome-ignore lint: noTemplateCurlyInString\n const rootDir = \"${configDir}\";\n\n const compilerOptions = {\n types: [\"@types/node\", \"@types/deno\", \"@types/bun\"],\n moduleResolution: \"bundler\",\n module: \"ESNext\",\n target: \"ESNext\",\n strict: true,\n exactOptionalPropertyTypes: true,\n noImplicitAny: true,\n noImplicitThis: true,\n noImplicitOverride: true,\n noImplicitReturns: true,\n noUnusedLocals: false,\n noUnusedParameters: false,\n allowArbitraryExtensions: true,\n allowImportingTsExtensions: true,\n allowUnreachableCode: false,\n allowUnusedLabels: false,\n useUnknownInCatchVariables: true,\n noFallthroughCasesInSwitch: true,\n noUncheckedSideEffectImports: true,\n resolveJsonModule: true,\n esModuleInterop: true,\n verbatimModuleSyntax: true,\n skipLibCheck: true,\n noEmit: true,\n };\n\n if (sourceFolder) {\n return {\n include: [\n `${rootDir}/`,\n `${rootDir}/../../${defaults.libDir}/${sourceFolder}/`,\n `${rootDir}/../../${defaults.libDir}/env.d.ts`,\n ],\n compilerOptions: {\n ...compilerOptions,\n jsx: \"preserve\",\n types: [...compilerOptions.types, \"vite/client\"],\n paths: {\n [`${defaults.appPrefix}/*`]: [`${rootDir}/../../*`],\n [`${defaults.srcPrefix}/*`]: [`${rootDir}/*`],\n [`${defaults.libPrefix}/*`]: [\n `${rootDir}/../../${defaults.libDir}/${sourceFolder}/*`,\n ],\n },\n },\n };\n }\n\n return {\n include: [`${rootDir}/`, `${rootDir}/${defaults.libDir}/env.d.ts`],\n exclude: [\n `${rootDir}/${defaults.srcDir}/`,\n `${rootDir}/${defaults.libDir}/`,\n ],\n compilerOptions: {\n ...compilerOptions,\n paths: {\n [`${defaults.appPrefix}/*`]: [`${rootDir}/*`],\n },\n },\n };\n};\n", "import type { SourceFolder } from \"@kosmojs/core\";\n\nimport { defaults } from \"./defaults\";\n\nexport const typeboxLiteralText = (\n text: string,\n sourceFolder: SourceFolder,\n) => {\n const { refineTypeName = defaults.refineTypeName } = sourceFolder.config;\n return [\n // Escape backticks for safe use in template literals\n [/(?<!\\\\)`/g, \"\\\\`\"],\n // Escape $ for safe use in template literals\n [/(?<!\\\\)\\$\\{/g, \"\\\\${\"],\n /**\n * TypeBox's built-in `Options` type is not configurable.\n * To allow a custom type name, exposing `refineTypeName` option,\n * defaulted to VRefine, then renaming it to `Options`.\n * */\n [new RegExp(`\\\\b${refineTypeName}\\\\s*<`, \"g\"), \"Options<\"],\n ].reduce((text, [a, b]) => text.replace(a, b as never), text);\n};\n", "import { builtinModules } from \"node:module\";\n\nimport type { Plugin } from \"vite\";\n\nconst nodePrefix = (): Plugin => {\n return {\n name: \"kosmojs:node-prefix\",\n enforce: \"pre\",\n resolveId(source) {\n return builtinModules.includes(source)\n ? { id: `node:${source}`, external: true }\n : undefined;\n },\n };\n};\n\nexport const vitePlugins = {\n nodePrefix,\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["callExpression", "typeNode", "
|
|
3
|
+
"sources": ["../src/ast.ts", "../src/generators.ts", "../src/paths.ts", "../src/render.ts", "../src/routes/index.ts", "../src/routes/base.ts", "../src/routes/paths.ts", "../src/routes/resolve.ts", "../src/templates/resolved-types.hbs", "../src/templates/types.hbs", "../src/routes/nesting.ts", "../src/spinner.ts", "../src/typebox.ts", "../src/vite.ts"],
|
|
4
|
+
"sourcesContent": ["import { join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport crc from \"crc/crc32\";\nimport { flattener } from \"tfusion\";\nimport {\n type CallExpression,\n type Identifier,\n Project,\n type ProjectOptions,\n type SourceFile,\n SyntaxKind,\n type TypeNode,\n} from \"ts-morph\";\n\nimport {\n type ApiRoute,\n defaults,\n RequestValidationTargets,\n type SourceFolder,\n type TypeDeclaration,\n type ValidationDefinition,\n type ValidationTarget,\n} from \"@kosmojs/core\";\nimport { type HTTPMethod, HTTPMethods } from \"@kosmojs/core/api\";\n\ntype PathResolver = (path: string) => string;\n\nexport const astFactory = () => {\n const createProject = (opts?: ProjectOptions) => new Project(opts);\n\n const resolveRouteSignature = async (\n route: Pick<ApiRoute, \"id\" | \"name\" | \"fileFullpath\" | \"optionalParams\">,\n opts?: {\n relpathResolver?: PathResolver;\n sourceFile?: SourceFile;\n withReferencedFiles?: boolean;\n },\n ) => {\n const {\n sourceFile = createProject().addSourceFileAtPath(route.fileFullpath),\n } = { ...opts };\n\n const [typeDeclarations, referencedFiles] = extractTypeDeclarations(\n sourceFile,\n opts,\n );\n\n const defaultExport = extractDefaultExport(sourceFile);\n\n const paramsRefinements = defaultExport\n ? extractParamsRefinements(defaultExport)\n : undefined;\n\n const methods = defaultExport\n ? extractRouteMethods(route, defaultExport)\n : [];\n\n return {\n typeDeclarations,\n paramsRefinements,\n methods: methods.map((e) => e.method),\n validationDefinitions: methods.flatMap((e) => e.validationDefinitions),\n referencedFiles,\n };\n };\n\n const extractDefaultExport = (\n sourceFile: SourceFile,\n ): CallExpression | undefined => {\n const [defaultExport] = sourceFile\n .getExportAssignments()\n .flatMap((exportAssignment) => {\n if (exportAssignment.isExportEquals()) {\n return [];\n }\n const callExpression = exportAssignment.getExpression();\n return callExpression.isKind(SyntaxKind.CallExpression)\n ? [callExpression]\n : [];\n });\n return defaultExport;\n };\n\n const extractParamsRefinements = (\n callExpression: CallExpression,\n ): Array<{ index: number; text: string }> | undefined => {\n const [\n _routeName, // first generic - the route name\n paramsGeneric, // second generic - params refinements\n ] = extractGenerics(callExpression);\n\n if (!paramsGeneric?.isKind(SyntaxKind.TupleType)) {\n return;\n }\n\n return paramsGeneric.getElements().map((node, index) => {\n return {\n index,\n text: node.getText(),\n };\n });\n };\n\n const extractRouteMethods = (\n route: Pick<ApiRoute, \"id\" | \"name\">,\n callExpression: CallExpression,\n ): Array<{\n method: HTTPMethod;\n validationDefinitions: Array<ValidationDefinition>;\n }> => {\n const funcDeclaration =\n callExpression.getFirstChildByKind(SyntaxKind.ArrowFunction) ||\n callExpression.getFirstChildByKind(SyntaxKind.FunctionExpression);\n\n if (!funcDeclaration) {\n return [];\n }\n\n const arrayLiteralExpression = funcDeclaration.getFirstChildByKind(\n SyntaxKind.ArrayLiteralExpression,\n );\n\n if (!arrayLiteralExpression) {\n return [];\n }\n\n const callExpressions: Array<[CallExpression, HTTPMethod]> = [];\n\n for (const e of arrayLiteralExpression.getChildrenOfKind(\n SyntaxKind.CallExpression,\n )) {\n const name = e.getExpression().getText() as HTTPMethod;\n if (HTTPMethods[name]) {\n callExpressions.push([e, name]);\n }\n }\n\n const methods: ReturnType<typeof extractRouteMethods> = [];\n\n for (const [callExpression, method] of callExpressions) {\n const [vDefs, vOpts] = extractGenerics(callExpression);\n methods.push({\n method,\n validationDefinitions: extractValidationDefinitions(\n route,\n method,\n vDefs,\n vOpts,\n ),\n });\n }\n\n return methods;\n };\n\n /** Parse a boolean literal type node */\n const parseRuntimeValidation = (typeNode: TypeNode) => {\n if (typeNode.isKind(SyntaxKind.LiteralType)) {\n const literal = typeNode.getFirstChild();\n if (literal?.isKind(SyntaxKind.TrueKeyword)) {\n return true;\n } else if (literal?.isKind(SyntaxKind.FalseKeyword)) {\n return false;\n }\n }\n return undefined;\n };\n\n const extractResponseVariant = (\n typeNode: TypeNode,\n ):\n | {\n status: number;\n contentType?: string | undefined;\n body?: string | undefined;\n }\n | undefined => {\n if (!typeNode.isKind(SyntaxKind.TupleType)) {\n return;\n }\n\n let status = 200; // default\n let contentType: string | undefined;\n let body: string | undefined;\n\n const [statusNode, contentTypeNode, bodyNode] = typeNode.getElements();\n\n // Status (index 0) - should be a LiteralType with NumericLiteral\n if (statusNode?.isKind(SyntaxKind.LiteralType)) {\n const literal = statusNode.getFirstChildByKind(SyntaxKind.NumericLiteral);\n if (literal) {\n status = Number(literal.getText());\n }\n }\n\n // ContentType (index 1) - should be a LiteralType with StringLiteral\n if (contentTypeNode) {\n contentType = extractStringLiteral(contentTypeNode);\n }\n\n // Response type text (index 2)\n if (bodyNode) {\n body = bodyNode.getText();\n if ([\"object\"].includes(body)) {\n body = \"{}\";\n }\n }\n\n return { status, contentType, body };\n };\n\n /** Parse opts TypeLiteral into a map keyed by target */\n const parseValidationOptions = (typeNode: TypeNode | undefined) => {\n const opts: Partial<\n Record<\n ValidationTarget,\n {\n contentType: string | undefined;\n runtimeValidation: boolean | undefined;\n customErrors: Record<string, string> | undefined;\n }\n >\n > = {};\n\n if (!typeNode?.isKind(SyntaxKind.TypeLiteral)) {\n return opts;\n }\n\n for (const prop of typeNode.getMembers()) {\n if (!prop.isKind(SyntaxKind.PropertySignature)) {\n continue;\n }\n\n const target = prop.getName() as ValidationTarget;\n const typeNode = prop.getTypeNodeOrThrow();\n\n if (!typeNode.isKind(SyntaxKind.TypeLiteral)) {\n continue;\n }\n\n let contentType: string | undefined;\n let runtimeValidation: boolean | undefined;\n const customErrors: Record<string, string> = {};\n\n for (const member of typeNode.getMembers()) {\n if (!member.isKind(SyntaxKind.PropertySignature)) {\n continue;\n }\n\n const nameNode = member.getNameNode();\n const valueNode = member.getTypeNodeOrThrow();\n\n const name = nameNode.isKind(SyntaxKind.StringLiteral)\n ? nameNode.getLiteralText() // No quotes\n : nameNode.getText(); // Regular identifier\n\n if (name === \"contentType\") {\n contentType = extractStringLiteral(valueNode);\n } else if (name === \"runtimeValidation\") {\n runtimeValidation = parseRuntimeValidation(valueNode);\n } else if (name.startsWith(\"error\")) {\n const literal = extractStringLiteral(valueNode);\n if (literal) {\n customErrors[name] = literal;\n }\n }\n }\n\n opts[target] = {\n contentType,\n runtimeValidation,\n customErrors,\n };\n }\n\n return opts;\n };\n\n const extractStringLiteral = (typeNode: TypeNode) => {\n const literal = typeNode.isKind(SyntaxKind.LiteralType)\n ? typeNode.getFirstChildByKind(SyntaxKind.StringLiteral)\n : undefined;\n return literal ? literal.getLiteralText() : undefined;\n };\n\n /**\n * Extract validation definitions from route handler generics.\n * Merges defs (schemas) and opts (validation options) into a flat array.\n * */\n const extractValidationDefinitions = (\n route: Pick<ApiRoute, \"id\" | \"name\">,\n method: HTTPMethod,\n defsNode: TypeNode,\n optsNode: TypeNode | undefined,\n ) => {\n const definitions: Array<ValidationDefinition> = [];\n\n if (!defsNode?.isKind(SyntaxKind.TypeLiteral)) {\n return definitions;\n }\n\n const optsMap = parseValidationOptions(optsNode);\n\n const createId = (target: string, hash?: string) => {\n return [\n target.replace(/^./, (c) => c.toUpperCase()),\n \"T\",\n method,\n crc(route.id + hash),\n ].join(\"\");\n };\n\n for (const prop of defsNode.getMembers()) {\n if (!prop.isKind(SyntaxKind.PropertySignature)) {\n continue;\n }\n\n const target = prop.getName() as ValidationTarget;\n const typeNode = prop.getTypeNodeOrThrow();\n\n if (target === \"response\") {\n const variants = typeNode.isKind(SyntaxKind.UnionType)\n ? typeNode.getChildrenOfKind(SyntaxKind.TupleType)\n : [typeNode];\n definitions.push({\n ...optsMap[target],\n method,\n target,\n variants: variants.flatMap((e, i) => {\n const { status, contentType, body } =\n extractResponseVariant(e) || {};\n\n if (!status) {\n return [];\n }\n\n if (contentType && typeof contentType !== \"string\") {\n console.warn(\n styleText(\n [\"bold\", \"red\"],\n `\u2717 The second element of a response variant should specify the Response Content Type`,\n ),\n );\n console.warn(\n styleText([\"blue\"], ` Example: [200, \"json\", Schema]`),\n );\n console.warn(\n ` Route: ${route.name}; Method: ${method}; Response Variant: #${i}`,\n );\n console.warn();\n }\n\n return [\n {\n id: createId(\n target,\n JSON.stringify([status, contentType, body]),\n ),\n status,\n contentType,\n body,\n },\n ];\n }),\n });\n } else if (Object.keys(RequestValidationTargets).includes(target)) {\n definitions.push({\n ...optsMap[target],\n method,\n target,\n schema: {\n id: createId(target),\n text: typeNode.getText(),\n },\n });\n }\n }\n\n return definitions;\n };\n\n const extractTypeDeclarations = (\n sourceFile: SourceFile,\n opts?: {\n relpathResolver?: PathResolver;\n withReferencedFiles?: boolean;\n },\n ): [d: Array<TypeDeclaration>, f?: Array<string>] => {\n const declarations: Array<TypeDeclaration> = [];\n\n const referencedFiles: Array<string> | undefined = opts?.withReferencedFiles\n ? []\n : undefined;\n\n for (const declaration of sourceFile.getImportDeclarations()) {\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath;\n\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const defaultImport = typeOnlyDeclaration\n ? declaration.getDefaultImport()\n : undefined;\n\n if (defaultImport) {\n const name = defaultImport.getText();\n const text = `import type ${name} from \"${path}\";`;\n declarations.push({\n importDeclaration: {\n name,\n path,\n },\n text,\n });\n if (referencedFiles) {\n referencedFiles.push(...getReferencedFiles(defaultImport));\n }\n }\n\n const namespaceImport = typeOnlyDeclaration\n ? declaration.getNamespaceImport()\n : undefined;\n\n if (namespaceImport) {\n const name = namespaceImport.getText();\n const text = `import type * as ${name} from \"${path}\";`;\n declarations.push({\n importDeclaration: {\n name,\n path,\n },\n text,\n });\n if (referencedFiles) {\n referencedFiles.push(...getReferencedFiles(namespaceImport));\n }\n }\n\n for (const namedImport of declaration.getNamedImports()) {\n if (namedImport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedImport.getNameNode();\n const name = nameNode.getText();\n const alias = namedImport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n importDeclaration: {\n name,\n alias,\n path,\n },\n text: `import type { ${nameText} } from \"${path}\";`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n for (const declaration of sourceFile.getTypeAliases()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n typeAliasDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getInterfaces()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n interfaceDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getEnums()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n enumDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getExportDeclarations()) {\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = modulePath\n ? /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath\n : undefined;\n\n for (const namedExport of declaration.getNamedExports()) {\n if (namedExport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedExport.getNameNode();\n const name = nameNode.getText();\n const alias = namedExport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n exportDeclaration: {\n name,\n alias: alias ?? name,\n path,\n },\n text: path\n ? `export type { ${nameText} } from \"${path}\";`\n : `export type { ${nameText} };`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n return referencedFiles\n ? [declarations, [...new Set<string>(referencedFiles)]]\n : [declarations];\n };\n\n const getReferencedFiles = (importIdentifier: Identifier): Array<string> => {\n // ambient modules may have declarations in multiple files\n const declarations =\n importIdentifier //\n ?.getSymbol()\n ?.getAliasedSymbol()\n ?.getDeclarations() || [];\n\n return declarations.flatMap((e) => {\n const sourceFile = e.getSourceFile();\n return sourceFile //\n ? [sourceFile.getFilePath()]\n : [];\n });\n };\n\n const extractGenerics = (callExpression: CallExpression) => {\n return callExpression.getTypeArguments();\n };\n\n const typeResolverFactory = ({ root, name }: SourceFolder) => {\n const project = createProject({\n tsConfigFilePath: resolve(\n root,\n join(defaults.srcDir, name, \"tsconfig.json\"),\n ),\n skipAddingFilesFromTsConfig: true,\n });\n\n const literalTypesResolver = (\n literalTypes: string,\n options: Parameters<typeof flattener>[2],\n ) => {\n const sourceFile = project.createSourceFile(\n `${crc(literalTypes)}-${Date.now()}.ts`,\n literalTypes,\n { overwrite: true },\n );\n\n const resolvedTypes = flattener(project, sourceFile, {\n ...options,\n stripComments: true,\n });\n\n project.removeSourceFile(sourceFile);\n\n return resolvedTypes;\n };\n\n return {\n getSourceFile: (fileFullpath: string) => {\n return (\n project.getSourceFile(fileFullpath) ||\n project.addSourceFileAtPath(fileFullpath)\n );\n },\n refreshSourceFile: async (fileFullpath: string) => {\n const sourceFile = project.getSourceFile(fileFullpath);\n if (sourceFile) {\n await sourceFile.refreshFromFileSystem();\n }\n },\n literalTypesResolver,\n };\n };\n\n return {\n createProject,\n extractDefaultExport,\n extractParamsRefinements,\n extractRouteMethods,\n extractTypeDeclarations,\n resolveRouteSignature,\n typeResolverFactory,\n };\n};\n", "import type { Matcher } from \"picomatch\";\nimport picomatch from \"picomatch\";\n\nimport type {\n DefineGenerator,\n DefineGeneratorFactory,\n GeneratorCustomTemplates,\n} from \"@kosmojs/core\";\n\nexport const defineGenerator: DefineGenerator = (f) => f as never;\n\nexport const defineGeneratorFactory: DefineGeneratorFactory = (f) => f;\n\nexport const createTemplateResolver = <T>(\n customTemplates: GeneratorCustomTemplates<T> | undefined,\n defaultTemplate: string,\n) => {\n const templates: Array<[Matcher, string | Function]> = Object.entries({\n ...customTemplates,\n }).map(([pattern, template]) => [picomatch(pattern), template]);\n return (pattern: string, entry: T) => {\n const match = templates.find(([isMatch]) => isMatch(pattern));\n if (!match) {\n return defaultTemplate;\n }\n return typeof match[1] === \"function\" //\n ? match[1](entry)\n : match[1];\n };\n};\n", "import { access, constants } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\n\nimport { defaults, type SourceFolder } from \"@kosmojs/core\";\n\ntype Options = { origin: \"src\" | \"lib\" };\n\ntype CreateImport = Record<\n | \"src\"\n | \"config\"\n | \"api\"\n | \"pages\"\n | \"lib\"\n | \"libCore\"\n | \"libApi\"\n | \"libEntry\",\n (a: Array<string>, o: Options) => string\n>;\n\nexport const pathResolver = (\n sourceFolder: Omit<SourceFolder, \"root\"> & { root?: string | undefined },\n): {\n createPath: Record<\n | \"src\"\n | \"config\"\n | \"api\"\n | \"pages\"\n | \"entry\"\n | \"lib\"\n | \"libCore\"\n | \"libApi\"\n | \"libEntry\"\n | \"libPages\"\n | \"distDir\",\n (...a: Array<string>) => string\n >;\n createImport: CreateImport;\n createImportHelpers: (o: Options) => {\n createImport: (k: keyof CreateImport, ...a: Array<string>) => string;\n };\n} => {\n const createPath = (...a: Array<string>) => {\n return sourceFolder.root\n ? resolve(sourceFolder.root, join(...a))\n : join(...a);\n };\n\n const createImport: CreateImport = {\n src(a, { origin }) {\n return origin === \"src\"\n ? join(defaults.srcPrefix, ...a)\n : join(defaults.appPrefix, defaults.srcDir, sourceFolder.name, ...a);\n },\n config(a, o) {\n return this.src([defaults.configDir, ...a], o);\n },\n api(a, o) {\n return this.src([defaults.apiDir, ...a], o);\n },\n pages(a, o) {\n return this.src([defaults.pagesDir, ...a], o);\n },\n lib(a, { origin }) {\n return origin === \"src\"\n ? join(defaults.libPrefix, ...a)\n : join(defaults.appPrefix, defaults.libDir, sourceFolder.name, ...a);\n },\n libCore(a, o) {\n return this.lib([\"core\", ...a], o);\n },\n libApi(a, o) {\n return this.lib([defaults.apiDir, ...a], o);\n },\n libEntry(a, o) {\n return this.lib([defaults.entryDir, ...a], o);\n },\n };\n\n return {\n createPath: {\n src(...a) {\n return createPath(defaults.srcDir, sourceFolder.name, ...a);\n },\n api(...a) {\n return this.src(defaults.apiDir, ...a);\n },\n pages(...a) {\n return this.src(defaults.pagesDir, ...a);\n },\n config(...a) {\n return this.src(defaults.configDir, ...a);\n },\n entry(...a) {\n return this.src(defaults.entryDir, ...a);\n },\n lib(...a) {\n return createPath(defaults.libDir, sourceFolder.name, ...a);\n },\n libCore(...a) {\n return this.lib(\"core\", ...a);\n },\n libApi(...a) {\n return this.lib(defaults.apiDir, ...a);\n },\n libEntry(...a) {\n return this.lib(defaults.entryDir, ...a);\n },\n libPages(...a) {\n return this.lib(defaults.pagesDir, ...a);\n },\n distDir(...a) {\n return createPath(sourceFolder.distDir, sourceFolder.name, ...a);\n },\n },\n createImport,\n createImportHelpers(o) {\n if (![\"src\", \"lib\"].includes(o?.origin)) {\n throw new Error(\n `createImportHelpers: required exactly one argument of shape { origin: \"src|lib\" }`,\n );\n }\n return {\n createImport(key, ...a) {\n // Handlebars appends an options object as the last argument,\n // slice it off before passing args to createImport\n return createImport[key](a.slice(0, -1), o);\n },\n };\n },\n };\n};\n\nexport const pathExists = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n};\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport handlebars from \"handlebars\";\n\nimport { pathExists } from \"./paths\";\n\nexport type RenderOptions = {\n noEscape?: boolean;\n // handlebars instance\n renderer?: typeof handlebars;\n};\n\nexport type FactoryOptions = RenderOptions & {\n partials?: Record<string, string>;\n helpers?: Record<string, (...a: Array<never>) => unknown>;\n outdir?: string;\n /**\n * Controls whether to overwrite an existing file.\n * - `false`: skip writing if the file already exists\n * - `true` (default): always overwrite\n * - function: custom logic to decide whether to overwrite, based on current file content\n * */\n overwrite?: boolean | ((fileContent: string) => boolean);\n};\n\nexport const render = <Context = object>(\n template: string,\n context: Context,\n options?: RenderOptions,\n): string => {\n const { noEscape = true, renderer = handlebars } = { ...options };\n return renderer.compile(template, { noEscape })(context);\n};\n\nexport const renderToFile = async <Context = object>(\n file: string,\n template: string,\n context: Context,\n options?: RenderOptions & Pick<FactoryOptions, \"overwrite\">,\n): Promise<void> => {\n const content = render(template, context, options);\n\n /**\n * Two fs calls (exists + read) are worth it to avoid touching the file\n * and triggering watchers unnecessarily.\n * */\n if (await pathExists(file)) {\n const { overwrite = true } = { ...options };\n if (overwrite === false) {\n return;\n }\n const fileContent = await readFile(file, \"utf8\");\n if (typeof overwrite === \"function\" && !overwrite(fileContent)) {\n return;\n }\n if (crc(content) === crc(fileContent)) {\n return;\n }\n }\n\n await mkdir(dirname(file), { recursive: true });\n await writeFile(file, content, \"utf8\");\n};\n\nexport const renderFactory = (options?: FactoryOptions) => {\n const createRenderer = (selfOoptions?: FactoryOptions) => {\n const renderer = handlebars.create();\n\n renderer.registerPartial({\n ...options?.partials,\n ...selfOoptions?.partials,\n } as never);\n\n renderer.registerHelper({\n ...options?.helpers,\n ...selfOoptions?.helpers,\n } as never);\n\n return renderer;\n };\n\n return {\n render<Context = object>(\n template: string,\n context: Context,\n selfOoptions?: FactoryOptions,\n ) {\n return render(template, context, {\n ...options,\n ...selfOoptions,\n renderer: createRenderer(selfOoptions),\n });\n },\n async renderToFile<Context = object>(\n file: string,\n template: string,\n context: Context,\n selfOoptions?: FactoryOptions,\n ) {\n return renderToFile(\n options?.outdir ? join(options.outdir, file) : file,\n template,\n context,\n {\n ...options,\n ...selfOoptions,\n renderer: createRenderer(selfOoptions),\n },\n );\n },\n };\n};\n", "import {\n defaults,\n type RouteEntry,\n type RouteResolverCacheFactory,\n type SourceFolder,\n} from \"@kosmojs/core\";\n\nimport {\n createRouteEntry,\n isApiRoute,\n isApiUse,\n isPageLayout,\n isPageRoute,\n type ResolverSignature,\n scanRoutes,\n} from \"./base\";\nimport { resolverFactory } from \"./resolve\";\n\nexport * from \"./base\";\nexport * from \"./nesting\";\nexport * from \"./paths\";\n\nexport const routesFactory = async (\n sourceFolder: SourceFolder,\n cacheFactory?: RouteResolverCacheFactory,\n) => {\n const {\n apiRouteResolver,\n apiUseResolver,\n pageRouteResolver,\n pageLayoutResolver,\n } = resolverFactory(sourceFolder, cacheFactory);\n\n const resolversFactory = (routeFiles: Array<string>) => {\n const resolvers = new Map<\n string, // fileFullpath\n ResolverSignature\n >();\n\n const entries: Array<RouteEntry> = routeFiles.flatMap((file) => {\n const entry = createRouteEntry(file, sourceFolder);\n return entry ? [entry] : [];\n });\n\n for (const entry of entries) {\n if (entry.folder === defaults.apiDir) {\n if (isApiRoute(entry.file)) {\n resolvers.set(entry.fileFullpath, apiRouteResolver(entry));\n } else if (isApiUse(entry.file)) {\n resolvers.set(entry.fileFullpath, apiUseResolver(entry));\n }\n } else if (entry.folder === defaults.pagesDir) {\n if (isPageRoute(entry.file)) {\n resolvers.set(entry.fileFullpath, pageRouteResolver(entry));\n } else if (isPageLayout(entry.file)) {\n resolvers.set(entry.fileFullpath, pageLayoutResolver(entry));\n }\n }\n }\n\n return resolvers;\n };\n\n const routeFiles = await scanRoutes(sourceFolder);\n\n return {\n resolvers: resolversFactory(routeFiles),\n resolversFactory,\n };\n};\n", "import { dirname, join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport crc from \"crc/crc32\";\nimport picomatch from \"picomatch\";\nimport { glob } from \"tinyglobby\";\n\nimport {\n defaults,\n type PathToken,\n type PathTokenParamPart,\n type ResolvedEntry,\n type RouteEntry,\n type SourceFolder,\n} from \"@kosmojs/core\";\n\nimport { pathResolver } from \"../paths\";\nimport {\n createHonoPattern,\n createPathPattern,\n pathTokensFactory,\n} from \"./paths\";\n\nexport type ResolverSignature = {\n name: string;\n handler: (updatedFile?: string) => Promise<ResolvedEntry>;\n};\n\nexport const API_INDEX_BASENAME = \"index\";\nexport const API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;\n\nexport const API_USE_BASENAME = \"use\";\nexport const API_USE_PATTERN = `${API_USE_BASENAME}.ts`;\n\nexport const PAGE_INDEX_BASENAME = \"index\";\nexport const PAGE_INDEX_PATTERN = `${PAGE_INDEX_BASENAME}.{tsx,vue,mdx,md}`;\n\nexport const PAGE_LAYOUT_BASENAME = \"layout\";\nexport const PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue,mdx}`;\n\nconst ROUTE_FILE_PATTERNS = [\n // match index files in api dir\n `${defaults.apiDir}/**/${API_INDEX_PATTERN}`,\n // match use files in api dir\n `${defaults.apiDir}/**/${API_USE_PATTERN}`,\n // match index files in pages dir\n `${defaults.pagesDir}/**/${PAGE_INDEX_PATTERN}`,\n // match layout files in pages dir\n `${defaults.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`,\n];\n\nexport const scanRoutes = async (sourceFolder: SourceFolder) => {\n const { createPath } = pathResolver(sourceFolder);\n return glob(ROUTE_FILE_PATTERNS, {\n cwd: createPath.src(),\n absolute: true,\n onlyFiles: true,\n followSymbolicLinks: false,\n ignore: [\n // ignore top-level matches, routes resides in folders, even index route\n `${defaults.apiDir}/${API_INDEX_PATTERN}`,\n `${defaults.apiDir}/${API_USE_PATTERN}`,\n `${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`,\n `${defaults.pagesDir}/${PAGE_LAYOUT_PATTERN}`,\n ],\n });\n};\n\nexport const isRouteFile = (\n file: string,\n sourceFolder: SourceFolder,\n):\n | [\n // Either `apiDir` or `pagesDir`\n folder: string,\n // Path to a file within the folder, nested at least one level deep\n file: string,\n ]\n | false => {\n const [\n // source folder name\n _sourceFolder,\n // route folder, api or pages\n _folder,\n ...rest\n ] = resolve(sourceFolder.root, file)\n .replace(`${sourceFolder.root}/${defaults.srcDir}/`, \"\")\n .split(\"/\");\n\n /**\n * Ensure the file:\n * - is under the correct source root\n * - belongs to a known route folder (`api/` or `pages/`)\n * - is nested at least one level deep (not a direct child of the folder)\n * */\n if (!_folder || _sourceFolder !== sourceFolder.name || rest.length < 2) {\n return false;\n }\n\n return picomatch.isMatch(join(_folder, ...rest), ROUTE_FILE_PATTERNS)\n ? [_folder, rest.join(\"/\")]\n : false;\n};\n\nexport const isApiRoute = (file: string) => {\n return picomatch.matchBase(file, `**/${API_INDEX_PATTERN}`);\n};\n\nexport const isApiUse = (file: string) => {\n return picomatch.matchBase(file, `**/${API_USE_PATTERN}`);\n};\n\nexport const isPageRoute = (file: string) => {\n return picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`);\n};\n\nexport const isPageLayout = (file: string) => {\n return picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`);\n};\n\nexport const createRouteEntry = (\n fileFullpath: string,\n sourceFolder: SourceFolder,\n): RouteEntry | undefined => {\n // scanner already is doing a great job on matching only relevant files\n // but doing a double check here to make sure only needed files added to stack\n const resolvedPaths = isRouteFile(fileFullpath, sourceFolder);\n\n if (!resolvedPaths) {\n return;\n }\n\n const [folder, file] = resolvedPaths;\n\n const id = `${file.replace(/\\W+/g, \"_\")}_${crc(file)}`;\n const name = dirname(file);\n\n try {\n const pathTokens = pathTokensFactory(dirname(file));\n return {\n id,\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n pathPattern: createPathPattern(pathTokens),\n honoPattern: createHonoPattern(pathTokens),\n };\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n console.error(\n `\u2757${styleText(\"red\", \"ERROR\")}: Failed parsing path for \"${styleText(\"cyan\", file)}\"`,\n );\n console.error(error);\n return;\n }\n};\n\n/**\n * Weight of a single path segment.\n *\n * Fixed values per kind prevent complex mixed segments\n * from outscoring multiple statics.\n *\n * static: 4 (exact match, most specific)\n * mixed: 3+ (static + param parts; more statics = slightly higher)\n * required: 2 (matches any single segment)\n * optional: 1 (may or may not match)\n * splat: 0 (matches anything, least specific)\n * */\nconst segmentWeight = (token: PathToken): number => {\n if (token.kind === \"static\") {\n return 4;\n }\n\n if (token.kind === \"mixed\") {\n let statics = 0;\n let optionals = 0;\n\n for (const part of token.parts) {\n if (part.type === \"static\") {\n statics += 1;\n } else if (part.kind === \"optional\" || part.kind === \"splat\") {\n optionals += 1;\n }\n }\n\n // unconditional statics contribute positively,\n // optionals penalize to avoid beating fully-static mixed routes\n return 3 + statics * 0.01 - optionals * 0.005;\n }\n\n const part = token.parts[0] as PathTokenParamPart;\n\n switch (part.kind) {\n case \"required\":\n return 2;\n case \"optional\":\n return 1;\n case \"splat\":\n return 0;\n }\n};\n\n/**\n * Compare two route entries for registration order.\n *\n * More specific routes sort first (higher priority).\n * Segments are compared left-to-right; first difference wins.\n *\n * When one route is a prefix of the other, the trailing segment\n * determines order: a trailing splat loses (shorter sibling first),\n * anything else wins (longer route is more specific).\n *\n * At equal weight and length, lexicographic tiebreak ensures\n * deterministic ordering across JS engines.\n * */\nexport const sortRoutes = (a: RouteEntry, b: RouteEntry): number => {\n const pairs = Array.from(\n { length: Math.max(a.pathTokens.length, b.pathTokens.length) },\n (_, i) => [a.pathTokens[i], b.pathTokens[i]] as const,\n );\n\n for (const [at, bt] of pairs) {\n if (!at || !bt) {\n // one route ran out of segments - check what the extra segment is\n const extra = at ?? bt;\n\n const isSplat =\n extra?.kind === \"param\"\n ? (extra.parts[0] as PathTokenParamPart).kind === \"splat\"\n : false;\n\n if (isSplat) {\n // trailing splat: shorter sibling registers first\n return at ? 1 : -1;\n }\n\n // trailing non-splat: longer route is more specific, registers first\n return at ? -1 : 1;\n }\n\n const aw = segmentWeight(at);\n const bw = segmentWeight(bt);\n\n if (aw !== bw) {\n return bw - aw;\n }\n }\n\n // same weight profile, same length: deterministic tiebreak\n return a.pathPattern.localeCompare(b.pathPattern);\n};\n", "import crc from \"crc/crc32\";\nimport { parse, type Token } from \"path-to-regexp\";\n\nimport type {\n PathToken,\n PathTokenParamPart,\n PathTokenStaticPart,\n} from \"@kosmojs/core\";\n\n/**\n * Parse a filesystem route path into structured PathToken array.\n *\n * Uses path-to-regexp v8 AST for parsing, with directory-friendly syntax:\n * - [param] => required param - :param\n * - {param} => optional param - {:param}\n * - {...param} => splat - {*param}\n *\n * Direct :param syntax is prohibited outside {} to avoid ambiguity.\n * Inside {} it is treated as path-to-regexp power syntax and used as-is.\n *\n * Examples:\n * Required: [id], [name]\n * Optional: {name}, {format}\n * Splat: {...path}\n * Mixed segments: shop/[id]-{name}\n * Power syntax: {-v:version{-:pre}}, :name{@:version{.:min}}.js\n * */\nexport const pathTokensFactory = (\n path: string,\n {\n transformStaticValue = normalizeStaticValue,\n }: {\n transformStaticValue?: (v: string) => string;\n } = {},\n): Array<PathToken> => {\n /**\n * Recursively extract parts from path-to-regexp AST tokens.\n * A param inside a group is optional; top-level params are required.\n * Wildcard tokens are always splat.\n * Slash-only text nodes (restored for parsing) are skipped.\n * */\n const extractParts = (\n tokens: Array<Token>,\n createConst: (value: string) => string,\n insideGroup = false,\n ): Array<PathTokenStaticPart | PathTokenParamPart> => {\n const parts: Array<PathTokenStaticPart | PathTokenParamPart> = [];\n\n for (const token of tokens) {\n switch (token.type) {\n case \"text\":\n // Skip slash-only text nodes (restored it via transformers for parsing)\n if (token.value !== \"/\") {\n parts.push({\n type: \"static\",\n value: transformStaticValue(token.value),\n });\n }\n break;\n case \"param\":\n parts.push({\n type: \"param\",\n kind: insideGroup ? \"optional\" : \"required\",\n name: token.name,\n const: createConst(token.name),\n });\n break;\n case \"wildcard\":\n parts.push({\n type: \"param\",\n kind: \"splat\",\n name: token.name,\n const: createConst(token.name),\n });\n break;\n case \"group\":\n parts.push(...extractParts(token.tokens, createConst, true));\n break;\n }\n }\n\n return parts;\n };\n\n const patternTransforms: Array<(s: string) => string> = [\n // Transform required params: [id] => :id\n // Only pure \\w param names,\n // [some-id] used as is, not treated as param,\n // use [some_id] instead.\n (s) => s.replace(/\\[(\\w+)\\]/g, \":$1\"),\n\n // Transform optional params: {id} => {:id}\n // Only pure \\w param names,\n // anything else treated as a path-to-regexp pattern and used as is.\n // {some-id} treated as an optional static segment.\n // use {some_id} for simple param syntax\n // or {:some-id} pattern where :some is the param name and -id is a static segment.\n (s) => s.replace(/\\{(\\w+)\\}/g, \"{:$1}\"),\n\n // Transform splat params: {...param} => {*param}\n (s) => s.replace(/\\{\\.\\.\\./g, \"{*\"),\n\n // Insert leading slash inside optional/splat groups.\n // {:name} => {/:name}\n // {*name} => {/*name}\n (s) => {\n return s.startsWith(\"{\") // keep this check for intention clarity\n ? s.replace(/^\\{/, \"{/\")\n : s;\n },\n ];\n\n // detect :param used outside {}\n const detectBareParams = (s: string): \":\" | string | undefined => {\n let depth = 0;\n for (const [i, ch] of [...s].entries()) {\n if (ch === \"{\") {\n depth += 1;\n } else if (ch === \"}\") {\n depth -= 1;\n } else if (ch === \":\" && depth === 0) {\n const match = s.slice(i + 1).match(/^\\w+/);\n return match?.[0] || \":\";\n }\n }\n return;\n };\n\n const tokens = path\n .replace(/^index\\/?/, \"\")\n .split(\"/\")\n .flatMap<PathToken>((orig) => {\n if (!orig.length) {\n return [];\n }\n\n const bareParam = detectBareParams(orig);\n\n if (bareParam === \":\") {\n throw new Error(\n `${path} contains colons outside braces, use : only within {}`,\n );\n } else if (bareParam) {\n throw new Error(\n `${path} contains bare params, use [${bareParam}] instead of :${bareParam}`,\n );\n }\n\n const pattern = patternTransforms.reduce((src, fn) => fn(src), orig);\n\n const { tokens } = parse(\n pattern.replace(/\\{[^}]*\\}|(\\+)/g, (m, p1) => (p1 ? \"\\\\+\" : m)),\n );\n\n const parts = extractParts(tokens, (val) => {\n // Sanitize param name into a valid JS identifier\n return /\\W/.test(val) || /^\\d/.test(val)\n ? [val.replace(/^\\d+|\\W/g, \"_\"), crc(orig)].join(\"_\")\n : val;\n });\n\n const isStatic = parts.length === 1 ? parts[0].type === \"static\" : false;\n const isParam = parts.length === 1 ? parts[0].type === \"param\" : false;\n\n const kind: PathToken[\"kind\"] = isStatic\n ? \"static\"\n : isParam\n ? \"param\"\n : \"mixed\";\n\n return [\n {\n kind,\n orig,\n pattern,\n parts,\n },\n ];\n });\n\n return tokens;\n};\n\nexport const createPathPattern = (tokens: Array<PathToken>) => {\n return tokens\n .map(({ pattern }, i) => {\n const next = tokens[i + 1];\n\n if (!next || next.pattern.includes(\"/\")) {\n return pattern;\n }\n\n const slashRequired = tokens.slice(i + 1).some((e) => {\n return e.parts.some((e) => {\n return e.type === \"static\" || e.kind === \"required\";\n });\n });\n\n return slashRequired ? `${pattern}/` : pattern;\n })\n .join(\"\");\n};\n\nexport const createHonoPattern = (tokens: Array<PathToken>) => {\n const staticValue = ({ value }: PathTokenStaticPart) => {\n return normalizeStaticValue(value);\n };\n\n const paramValue = (p: PathTokenParamPart) => {\n if (p.kind === \"splat\") {\n return `*`;\n }\n if (p.kind === \"optional\") {\n return `:${p.name}?`;\n }\n return `:${p.name}`;\n };\n\n const escapeRegex = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n const tokensToRegex = (tokens: Array<Token>): string => {\n return tokens\n .flatMap((t) => {\n if (t.type === \"text\") {\n return t.value === \"/\" ? [] : [escapeRegex(t.value)];\n }\n if (t.type === \"wildcard\") {\n return [\".+\"];\n }\n if (t.type === \"param\") {\n return [\"[^/]+\"];\n }\n if (t.type === \"group\") {\n return [`(?:${tokensToRegex(t.tokens)})?`];\n }\n return [];\n })\n .join(\"\");\n };\n\n return tokens\n .flatMap((token, i) => {\n if (token.kind === \"static\") {\n return [staticValue(token.parts[0] as PathTokenStaticPart)];\n }\n\n if (token.kind === \"param\") {\n return [paramValue(token.parts[0] as PathTokenParamPart)];\n }\n\n // mixed \u2192 parse pattern, build regex, emit disposable param\n const { tokens } = parse(token.pattern.replace(/\\//g, \"\"));\n\n const regex = tokensToRegex(tokens);\n\n return [`:_${i}{${regex}}`];\n })\n .join(\"/\");\n};\n\nexport const normalizeStaticValue = (value: string) => {\n return value.replace(/\\+/g, \"\\\\\\\\+\");\n};\n", "import { dirname, join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport crc from \"crc/crc32\";\nimport mimeTypes from \"mime-types\";\n\nimport {\n type ApiRoute,\n defaults,\n type PageRoute,\n type PathTokenParamPart,\n type RouteEntry,\n type RouteResolverCacheFactory,\n type SourceFolder,\n type ValidationDefinition,\n} from \"@kosmojs/core\";\n\nimport { astFactory } from \"../ast\";\nimport { pathResolver } from \"../paths\";\nimport { render, renderToFile } from \"../render\";\nimport type { ResolverSignature } from \"./base\";\nimport * as templates from \"./templates\";\n\nexport const resolverFactory = (\n sourceFolder: SourceFolder,\n cacheFactory?: RouteResolverCacheFactory,\n): Record<\n | \"pageLayoutResolver\"\n | \"pageRouteResolver\"\n | \"apiUseResolver\"\n | \"apiRouteResolver\",\n (entry: RouteEntry) => ResolverSignature\n> => {\n const {\n //\n generators = [],\n refineTypeName = defaults.refineTypeName,\n } = sourceFolder.config;\n\n const { typeResolverFactory, resolveRouteSignature } = astFactory();\n\n const resolveTypes = generators.some(({ meta }) => meta.resolveTypes);\n\n const {\n //\n literalTypesResolver,\n getSourceFile,\n refreshSourceFile,\n } = typeResolverFactory(sourceFolder);\n\n return {\n pageLayoutResolver(entry) {\n const { name } = entry;\n\n const handler: ResolverSignature[\"handler\"] = async () => {\n return {\n kind: \"pageLayout\",\n entry,\n };\n };\n\n return { name, handler };\n },\n\n pageRouteResolver(entry) {\n const {\n id,\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n pathPattern,\n honoPattern,\n } = entry;\n\n const handler: ResolverSignature[\"handler\"] = async () => {\n const entry: PageRoute = {\n id,\n name,\n pathTokens,\n pathPattern,\n honoPattern,\n params: {\n schema: pathTokens.flatMap((e) => {\n return e.parts.filter((p) => p.type === \"param\");\n }),\n },\n folder,\n file,\n fileFullpath,\n };\n\n return {\n kind: \"pageRoute\",\n entry,\n };\n };\n\n return { name, handler };\n },\n\n apiUseResolver(entry) {\n const { name } = entry;\n\n const handler: ResolverSignature[\"handler\"] = async () => {\n return {\n kind: \"apiUse\",\n entry,\n };\n };\n\n return { name, handler };\n },\n\n apiRouteResolver(entry) {\n const {\n id,\n name,\n file,\n folder,\n fileFullpath,\n pathTokens,\n pathPattern,\n honoPattern,\n } = entry;\n\n const handler: ResolverSignature[\"handler\"] = async (updatedFile) => {\n const paramsSchema: Array<PathTokenParamPart> = pathTokens.flatMap(\n (e) => {\n return e.parts.flatMap((p) => {\n return p.type === \"param\" ? [p] : [];\n });\n },\n );\n\n const optionalParams = paramsSchema.length\n ? paramsSchema.filter((e) => e.kind === \"required\").length === 0\n : true;\n\n const cacheStore = cacheFactory\n ? cacheFactory({ id, file, fileFullpath }, sourceFolder, {\n resolveTypes,\n })\n : undefined;\n\n let cache = cacheStore\n ? await cacheStore.get({ validate: true })\n : undefined;\n\n if (!cache) {\n if (updatedFile === fileFullpath) {\n await refreshSourceFile(fileFullpath);\n }\n\n const {\n typeDeclarations,\n paramsRefinements,\n methods,\n validationDefinitions,\n referencedFiles = [],\n } = await resolveRouteSignature(\n { id, name, fileFullpath, optionalParams },\n {\n withReferencedFiles: true,\n sourceFile: getSourceFile(fileFullpath),\n relpathResolver(path) {\n return join(\n sourceFolder.name,\n defaults.apiDir,\n dirname(file),\n path,\n );\n },\n },\n );\n\n const validationTypes = validationDefinitions.flatMap<{\n id: string;\n text: string;\n }>((def) => {\n return def.target === \"response\"\n ? def.variants.flatMap(({ id, body }) => {\n return body ? [{ id, text: body }] : [];\n })\n : [def.schema];\n });\n\n const numericParams = paramsRefinements\n ? paramsRefinements.flatMap(({ text, index }) => {\n if (text === \"number\") {\n const param = paramsSchema.at(index);\n return param ? [param.name] : [];\n }\n return [];\n })\n : [];\n\n const typesFile = pathResolver(sourceFolder).createPath.libApi(\n dirname(file),\n \"types.ts\",\n );\n\n const params: ApiRoute[\"params\"] = {\n id: [\"ParamsT\", crc(name)].join(\"\"),\n schema: paramsSchema,\n resolvedType: undefined,\n };\n\n const typesFileContent = render(templates.typesFile, {\n params,\n paramsSchema: paramsSchema.map((param, index) => {\n return {\n ...param,\n isRequired: param.kind === \"required\",\n isSplat: param.kind === \"splat\",\n refinement: paramsRefinements?.at(index),\n };\n }),\n typeDeclarations,\n validationTypes,\n });\n\n const resolvedTypes = resolveTypes\n ? literalTypesResolver(typesFileContent, {\n stripComments: true,\n overrides: { [refineTypeName]: refineTypeName },\n withProperties: [\n params.id,\n ...validationTypes.flatMap(({ id }) => id),\n ],\n })\n : undefined;\n\n /**\n * Deploy types.ts file; required by core generators (like fetch).\n * If types resolved, write resolved types;\n * otherwise write original types extracted from API route.\n * */\n await renderToFile(\n typesFile,\n resolvedTypes ? templates.resolvedTypes : typesFileContent,\n { resolvedTypes },\n );\n\n params.resolvedType = resolvedTypes?.find(\n (e) => e.name === params.id,\n );\n\n cache = {\n // placeholder values, if cacheFactory given,\n // they will be replaced by persistCache\n hash: 0,\n referencedFiles: {},\n // real values\n params,\n methods,\n typeDeclarations,\n numericParams,\n validationDefinitions: validationDefinitions.map((def) => {\n return {\n ...def,\n ...(def.target === \"response\"\n ? {\n variants: def.variants.map((variant) => {\n return {\n ...variant,\n resolvedType: resolvedTypes?.find(\n (e) => e.name === variant.id,\n ),\n };\n }),\n }\n : {\n schema: {\n ...def.schema,\n resolvedType: resolvedTypes?.find(\n (e) => e.name === def.schema.id,\n ),\n },\n }),\n };\n }),\n };\n\n if (cacheStore) {\n const { referencedFiles: _void, ...rest } = cache;\n cache = await cacheStore.set({ ...rest, referencedFiles });\n }\n }\n\n const validationDefinitions = cache.validationDefinitions.flatMap(\n (def) => {\n let augmentedDef: ValidationDefinition | undefined = def;\n\n if (def.target === \"response\") {\n augmentedDef = {\n ...def,\n variants: def.variants.flatMap((variant, i) => {\n if (typeof variant.contentType !== \"string\") {\n return [variant];\n }\n\n if (variant.contentType.includes(\"/\")) {\n return [variant];\n }\n\n const contentType = mimeTypes.lookup(variant.contentType);\n\n if (contentType === false) {\n console.warn(\n styleText(\n [\"bold\", \"red\"],\n \"\u2717 Failed resolving Response Content Type\",\n ),\n );\n console.warn(\n ` Invalid value provided for mime-types lookup - ${variant.contentType}`,\n );\n console.warn(\n styleText(\n [\"cyan\"],\n ` Response variant #${i} excluded from route schemas`,\n ),\n );\n console.warn(` Route: ${name}; Method: ${def.method}`);\n console.warn();\n return [];\n }\n\n return [{ ...variant, contentType }];\n }),\n };\n } else if (def.contentType && !def.contentType.includes(\"/\")) {\n const contentType = mimeTypes.lookup(def.contentType);\n if (contentType === false) {\n console.warn(\n styleText(\n [\"bold\", \"red\"],\n \"\u2717 Failed resolving Response Content Type\",\n ),\n );\n console.warn(\n ` Invalid value provided for mime-types lookup - ${def.contentType}`,\n );\n console.warn(` Route: ${name}; Method: ${def.method}`);\n console.warn();\n } else {\n augmentedDef = { ...def, contentType };\n }\n }\n\n return augmentedDef ? [augmentedDef] : [];\n },\n );\n\n const entry: ApiRoute = {\n id,\n name,\n pathTokens,\n pathPattern,\n honoPattern,\n params: cache.params,\n numericParams: cache.numericParams,\n optionalParams,\n folder,\n file,\n fileFullpath,\n methods: cache.methods,\n typeDeclarations: cache.typeDeclarations,\n validationDefinitions,\n referencedFiles: Object.keys(cache.referencedFiles).map(\n // expand referenced files path,\n // they are stored as relative in cache\n (e) => resolve(sourceFolder.root, e),\n ),\n };\n\n return {\n kind: \"apiRoute\",\n entry,\n };\n };\n\n return { name, handler };\n },\n };\n};\n", "{{#each resolvedTypes}}\nexport type {{name}} = {{text}};\n{{/each}}\n", "{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n \"{{name}}\"{{#unless isRequired}}?{{/unless}}: {{#if refinement}}\n {{refinement.text}},\n {{else}}\n {{#if isSplat}}Array<string>{{else}}string{{/if}},\n {{/if}}\n {{/each}}\n};\n\n{{#each validationTypes}}export type {{id}} = {{text}};\n{{/each}}\n", "import { basename } from \"node:path\";\n\nimport type { NestedRouteEntry, RouteEntry } from \"@kosmojs/core\";\n\nimport { PAGE_INDEX_BASENAME, PAGE_LAYOUT_BASENAME, sortRoutes } from \"./base\";\n\nexport const nestedRoutesFactory = (routeEntries: Array<RouteEntry>) => {\n const entryStack = structuredClone(routeEntries).sort(sortRoutes);\n\n /**\n * Group entries by name (at the same level, both layout and index share same name).\n *\n * Handle 3 cases:\n * - both index and layout exists\n * - only index exists\n * - only layout exists\n *\n * */\n const transformEntries = (\n entries: Array<RouteEntry>,\n parent?: RouteEntry,\n ): Array<NestedRouteEntry> => {\n return [...new Set(entries.map((e) => e.name))].flatMap((name) => {\n const nameEntries = entryStack.flatMap(({ fileFullpath, ...entry }) => {\n return entry.name === name ? [entry] : [];\n });\n\n const index = nameEntries.find((e) =>\n basename(e.file).startsWith(PAGE_INDEX_BASENAME),\n ) as RouteEntry;\n\n const layout = nameEntries.find((e) =>\n basename(e.file).startsWith(PAGE_LAYOUT_BASENAME),\n ) as RouteEntry;\n\n if (index || layout) {\n return [\n {\n index: index\n ? {\n ...index,\n pathTokens: index.pathTokens.slice(\n parent?.pathTokens.length || 0,\n ),\n }\n : undefined,\n layout: layout\n ? {\n ...layout,\n pathTokens: layout.pathTokens.slice(\n parent?.pathTokens.length || 0,\n ),\n }\n : undefined,\n parent: parent?.name,\n children: transformEntries(\n findDescendantEntries(index || layout),\n index || layout,\n ),\n },\n ];\n }\n\n return [];\n });\n };\n\n /**\n * Recursively finds direct descendant routes.\n *\n * \"Direct\" means the next existing route in the path hierarchy,\n * skipping intermediate path segments that don't have index/layout files.\n *\n * Example: blog/post/[slug]/index.tsx is a direct child of blog/index.tsx\n * even though \"post\" segment exists (it has no index.tsx).\n * */\n const findDescendantEntries = ({\n name,\n pathTokens,\n }: RouteEntry): Array<RouteEntry> => {\n // Find all potential children - BOTH indexes AND layouts\n const potentialChildren = entryStack.filter((entry) => {\n // Must be deeper than current entry\n if (entry.pathTokens.length <= pathTokens.length) {\n return false;\n }\n // Must be a descendant path\n if (!entry.name.startsWith(`${name}/`)) {\n return false;\n }\n return true;\n });\n\n // Filter to direct children (no intermediate route between parent and child)\n return potentialChildren.filter((child) => {\n // Check if any route exists between parent and child\n const hasIntermediateRoute = potentialChildren.some((intermediate) => {\n if (intermediate === child) {\n return false;\n }\n // Intermediate must be between parent and child in depth\n if (intermediate.pathTokens.length <= pathTokens.length) {\n return false;\n }\n if (intermediate.pathTokens.length >= child.pathTokens.length) {\n return false;\n }\n // Child must be descendant of intermediate\n return child.name.startsWith(`${intermediate.name}/`);\n });\n\n return !hasIntermediateRoute;\n });\n };\n\n // Find root entries - entries that have no parent route\n const rootEntries = entryStack.filter((entry) => {\n // Check if any other entry could be its parent\n const hasParent = entryStack.some((potential) => {\n if (potential === entry) {\n return false;\n }\n if (potential.pathTokens.length >= entry.pathTokens.length) {\n return false;\n }\n return entry.name.startsWith(`${potential.name}/`);\n });\n\n return !hasParent;\n });\n\n return transformEntries(rootEntries);\n};\n", "import { Spinner } from \"@topcli/spinner\";\n\nexport type SpinnerFactory = {\n text: (text: string) => void;\n append: (text: string) => void;\n succeed: (text?: string) => void;\n failed: (text?: string) => void;\n};\n\nexport const spinnerFactory = (startText: string): SpinnerFactory => {\n const spinner = new Spinner().start(startText);\n let _text = startText;\n return {\n text(text) {\n _text = text;\n spinner.text = text;\n },\n append(text) {\n spinner.text = `${_text} \u203A ${text}`;\n },\n succeed(text) {\n if (text) {\n this.append(text);\n } else {\n this.text(_text);\n }\n spinner.succeed();\n },\n failed(text) {\n if (text) {\n this.text([_text, text].join(\"\\n\"));\n }\n spinner.failed();\n },\n };\n};\n\nexport const withSpinner = (\n text: string,\n pipe: (spinner: SpinnerFactory) => void | Promise<void>,\n spinner?: SpinnerFactory,\n) => pipe(spinner || spinnerFactory(text));\n", "import { defaults, type SourceFolder } from \"@kosmojs/core\";\n\nexport const typeboxLiteralText = (\n text: string,\n sourceFolder: SourceFolder,\n) => {\n const { refineTypeName = defaults.refineTypeName } = sourceFolder.config;\n return [\n // Escape backticks for safe use in template literals\n [/(?<!\\\\)`/g, \"\\\\`\"],\n // Escape $ for safe use in template literals\n [/(?<!\\\\)\\$\\{/g, \"\\\\${\"],\n /**\n * TypeBox's built-in `Options` type is not configurable.\n * To allow a custom type name, exposing `refineTypeName` option,\n * defaulted to VRefine, then renaming it to `Options`.\n * */\n [new RegExp(`\\\\b${refineTypeName}\\\\s*<`, \"g\"), \"Options<\"],\n ].reduce((text, [a, b]) => text.replace(a, b as never), text);\n};\n", "import { builtinModules } from \"node:module\";\n\nimport type { Plugin } from \"vite\";\n\nconst nodePrefix = (): Plugin => {\n return {\n name: \"kosmojs:node-prefix\",\n enforce: \"pre\",\n resolveId(source) {\n return builtinModules.includes(source)\n ? { id: `node:${source}`, external: true }\n : undefined;\n },\n };\n};\n\nexport const vitePlugins = {\n nodePrefix,\n};\n"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,MAAM,eAAe;AAC9B,SAAS,iBAAiB;AAE1B,OAAO,SAAS;AAChB,SAAS,iBAAiB;AAC1B;AAAA,EAGE;AAAA,EAGA;AAAA,OAEK;AAEP;AAAA,EAEE;AAAA,EACA;AAAA,OAKK;AACP,SAA0B,mBAAmB;AAItC,IAAM,aAAa,MAAM;AAC9B,QAAM,gBAAgB,CAAC,SAA0B,IAAI,QAAQ,IAAI;AAEjE,QAAM,wBAAwB,OAC5B,OACA,SAKG;AACH,UAAM;AAAA,MACJ,aAAa,cAAc,EAAE,oBAAoB,MAAM,YAAY;AAAA,IACrE,IAAI,EAAE,GAAG,KAAK;AAEd,UAAM,CAAC,kBAAkB,eAAe,IAAI;AAAA,MAC1C;AAAA,MACA;AAAA,IACF;AAEA,UAAM,gBAAgB,qBAAqB,UAAU;AAErD,UAAM,oBAAoB,gBACtB,yBAAyB,aAAa,IACtC;AAEJ,UAAM,UAAU,gBACZ,oBAAoB,OAAO,aAAa,IACxC,CAAC;AAEL,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,MACpC,uBAAuB,QAAQ,QAAQ,CAAC,MAAM,EAAE,qBAAqB;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,uBAAuB,CAC3B,eAC+B;AAC/B,UAAM,CAAC,aAAa,IAAI,WACrB,qBAAqB,EACrB,QAAQ,CAAC,qBAAqB;AAC7B,UAAI,iBAAiB,eAAe,GAAG;AACrC,eAAO,CAAC;AAAA,MACV;AACA,YAAM,iBAAiB,iBAAiB,cAAc;AACtD,aAAO,eAAe,OAAO,WAAW,cAAc,IAClD,CAAC,cAAc,IACf,CAAC;AAAA,IACP,CAAC;AACH,WAAO;AAAA,EACT;AAEA,QAAM,2BAA2B,CAC/B,mBACuD;AACvD,UAAM;AAAA,MACJ;AAAA;AAAA,MACA;AAAA;AAAA,IACF,IAAI,gBAAgB,cAAc;AAElC,QAAI,CAAC,eAAe,OAAO,WAAW,SAAS,GAAG;AAChD;AAAA,IACF;AAEA,WAAO,cAAc,YAAY,EAAE,IAAI,CAAC,MAAM,UAAU;AACtD,aAAO;AAAA,QACL;AAAA,QACA,MAAM,KAAK,QAAQ;AAAA,MACrB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,sBAAsB,CAC1B,OACA,mBAII;AACJ,UAAM,kBACJ,eAAe,oBAAoB,WAAW,aAAa,KAC3D,eAAe,oBAAoB,WAAW,kBAAkB;AAElE,QAAI,CAAC,iBAAiB;AACpB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,yBAAyB,gBAAgB;AAAA,MAC7C,WAAW;AAAA,IACb;AAEA,QAAI,CAAC,wBAAwB;AAC3B,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,kBAAuD,CAAC;AAE9D,eAAW,KAAK,uBAAuB;AAAA,MACrC,WAAW;AAAA,IACb,GAAG;AACD,YAAM,OAAO,EAAE,cAAc,EAAE,QAAQ;AACvC,UAAI,YAAY,IAAI,GAAG;AACrB,wBAAgB,KAAK,CAAC,GAAG,IAAI,CAAC;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,UAAkD,CAAC;AAEzD,eAAW,CAACA,iBAAgB,MAAM,KAAK,iBAAiB;AACtD,YAAM,CAAC,OAAO,KAAK,IAAI,gBAAgBA,eAAc;AACrD,cAAQ,KAAK;AAAA,QACX;AAAA,QACA,uBAAuB;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAGA,QAAM,yBAAyB,CAAC,aAAuB;AACrD,QAAI,SAAS,OAAO,WAAW,WAAW,GAAG;AAC3C,YAAM,UAAU,SAAS,cAAc;AACvC,UAAI,SAAS,OAAO,WAAW,WAAW,GAAG;AAC3C,eAAO;AAAA,MACT,WAAW,SAAS,OAAO,WAAW,YAAY,GAAG;AACnD,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,yBAAyB,CAC7B,aAOe;AACf,QAAI,CAAC,SAAS,OAAO,WAAW,SAAS,GAAG;AAC1C;AAAA,IACF;AAEA,QAAI,SAAS;AACb,QAAI;AACJ,QAAI;AAEJ,UAAM,CAAC,YAAY,iBAAiB,QAAQ,IAAI,SAAS,YAAY;AAGrE,QAAI,YAAY,OAAO,WAAW,WAAW,GAAG;AAC9C,YAAM,UAAU,WAAW,oBAAoB,WAAW,cAAc;AACxE,UAAI,SAAS;AACX,iBAAS,OAAO,QAAQ,QAAQ,CAAC;AAAA,MACnC;AAAA,IACF;AAGA,QAAI,iBAAiB;AACnB,oBAAc,qBAAqB,eAAe;AAAA,IACpD;AAGA,QAAI,UAAU;AACZ,aAAO,SAAS,QAAQ;AACxB,UAAI,CAAC,QAAQ,EAAE,SAAS,IAAI,GAAG;AAC7B,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,aAAa,KAAK;AAAA,EACrC;AAGA,QAAM,yBAAyB,CAAC,aAAmC;AACjE,UAAM,OASF,CAAC;AAEL,QAAI,CAAC,UAAU,OAAO,WAAW,WAAW,GAAG;AAC7C,aAAO;AAAA,IACT;AAEA,eAAW,QAAQ,SAAS,WAAW,GAAG;AACxC,UAAI,CAAC,KAAK,OAAO,WAAW,iBAAiB,GAAG;AAC9C;AAAA,MACF;AAEA,YAAM,SAAS,KAAK,QAAQ;AAC5B,YAAMC,YAAW,KAAK,mBAAmB;AAEzC,UAAI,CAACA,UAAS,OAAO,WAAW,WAAW,GAAG;AAC5C;AAAA,MACF;AAEA,UAAI;AACJ,UAAI;AACJ,YAAM,eAAuC,CAAC;AAE9C,iBAAW,UAAUA,UAAS,WAAW,GAAG;AAC1C,YAAI,CAAC,OAAO,OAAO,WAAW,iBAAiB,GAAG;AAChD;AAAA,QACF;AAEA,cAAM,WAAW,OAAO,YAAY;AACpC,cAAM,YAAY,OAAO,mBAAmB;AAE5C,cAAM,OAAO,SAAS,OAAO,WAAW,aAAa,IACjD,SAAS,eAAe,IACxB,SAAS,QAAQ;AAErB,YAAI,SAAS,eAAe;AAC1B,wBAAc,qBAAqB,SAAS;AAAA,QAC9C,WAAW,SAAS,qBAAqB;AACvC,8BAAoB,uBAAuB,SAAS;AAAA,QACtD,WAAW,KAAK,WAAW,OAAO,GAAG;AACnC,gBAAM,UAAU,qBAAqB,SAAS;AAC9C,cAAI,SAAS;AACX,yBAAa,IAAI,IAAI;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAEA,WAAK,MAAM,IAAI;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,CAAC,aAAuB;AACnD,UAAM,UAAU,SAAS,OAAO,WAAW,WAAW,IAClD,SAAS,oBAAoB,WAAW,aAAa,IACrD;AACJ,WAAO,UAAU,QAAQ,eAAe,IAAI;AAAA,EAC9C;AAMA,QAAM,+BAA+B,CACnC,OACA,QACA,UACA,aACG;AACH,UAAM,cAA2C,CAAC;AAElD,QAAI,CAAC,UAAU,OAAO,WAAW,WAAW,GAAG;AAC7C,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,uBAAuB,QAAQ;AAE/C,UAAM,WAAW,CAAC,QAAgB,SAAkB;AAClD,aAAO;AAAA,QACL,OAAO,QAAQ,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;AAAA,QAC3C;AAAA,QACA;AAAA,QACA,IAAI,MAAM,KAAK,IAAI;AAAA,MACrB,EAAE,KAAK,EAAE;AAAA,IACX;AAEA,eAAW,QAAQ,SAAS,WAAW,GAAG;AACxC,UAAI,CAAC,KAAK,OAAO,WAAW,iBAAiB,GAAG;AAC9C;AAAA,MACF;AAEA,YAAM,SAAS,KAAK,QAAQ;AAC5B,YAAM,WAAW,KAAK,mBAAmB;AAEzC,UAAI,WAAW,YAAY;AACzB,cAAM,WAAW,SAAS,OAAO,WAAW,SAAS,IACjD,SAAS,kBAAkB,WAAW,SAAS,IAC/C,CAAC,QAAQ;AACb,oBAAY,KAAK;AAAA,UACf,GAAG,QAAQ,MAAM;AAAA,UACjB;AAAA,UACA;AAAA,UACA,UAAU,SAAS,QAAQ,CAAC,GAAG,MAAM;AACnC,kBAAM,EAAE,QAAQ,aAAa,KAAK,IAChC,uBAAuB,CAAC,KAAK,CAAC;AAEhC,gBAAI,CAAC,QAAQ;AACX,qBAAO,CAAC;AAAA,YACV;AAEA,gBAAI,eAAe,OAAO,gBAAgB,UAAU;AAClD,sBAAQ;AAAA,gBACN;AAAA,kBACE,CAAC,QAAQ,KAAK;AAAA,kBACd;AAAA,gBACF;AAAA,cACF;AACA,sBAAQ;AAAA,gBACN,UAAU,CAAC,MAAM,GAAG,kCAAkC;AAAA,cACxD;AACA,sBAAQ;AAAA,gBACN,YAAY,MAAM,IAAI,aAAa,MAAM,wBAAwB,CAAC;AAAA,cACpE;AACA,sBAAQ,KAAK;AAAA,YACf;AAEA,mBAAO;AAAA,cACL;AAAA,gBACE,IAAI;AAAA,kBACF;AAAA,kBACA,KAAK,UAAU,CAAC,QAAQ,aAAa,IAAI,CAAC;AAAA,gBAC5C;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH,WAAW,OAAO,KAAK,wBAAwB,EAAE,SAAS,MAAM,GAAG;AACjE,oBAAY,KAAK;AAAA,UACf,GAAG,QAAQ,MAAM;AAAA,UACjB;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,YACN,IAAI,SAAS,MAAM;AAAA,YACnB,MAAM,SAAS,QAAQ;AAAA,UACzB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,0BAA0B,CAC9B,YACA,SAImD;AACnD,UAAM,eAAuC,CAAC;AAE9C,UAAM,kBAA6C,MAAM,sBACrD,CAAC,IACD;AAEJ,eAAW,eAAe,WAAW,sBAAsB,GAAG;AAC5D,YAAM,aAAa,YAAY,wBAAwB;AAEvD,YAAM,OAAO,YAAY,KAAK,UAAU,IACpC,MAAM,kBACJ,KAAK,gBAAgB,UAAU,IAC/B,aACF;AAEJ,YAAM,sBAAsB,YAAY,WAAW;AAEnD,YAAM,gBAAgB,sBAClB,YAAY,iBAAiB,IAC7B;AAEJ,UAAI,eAAe;AACjB,cAAM,OAAO,cAAc,QAAQ;AACnC,cAAM,OAAO,eAAe,IAAI,UAAU,IAAI;AAC9C,qBAAa,KAAK;AAAA,UAChB,mBAAmB;AAAA,YACjB;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF,CAAC;AACD,YAAI,iBAAiB;AACnB,0BAAgB,KAAK,GAAG,mBAAmB,aAAa,CAAC;AAAA,QAC3D;AAAA,MACF;AAEA,YAAM,kBAAkB,sBACpB,YAAY,mBAAmB,IAC/B;AAEJ,UAAI,iBAAiB;AACnB,cAAM,OAAO,gBAAgB,QAAQ;AACrC,cAAM,OAAO,oBAAoB,IAAI,UAAU,IAAI;AACnD,qBAAa,KAAK;AAAA,UAChB,mBAAmB;AAAA,YACjB;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF,CAAC;AACD,YAAI,iBAAiB;AACnB,0BAAgB,KAAK,GAAG,mBAAmB,eAAe,CAAC;AAAA,QAC7D;AAAA,MACF;AAEA,iBAAW,eAAe,YAAY,gBAAgB,GAAG;AACvD,YAAI,YAAY,WAAW,KAAK,qBAAqB;AACnD,gBAAM,WAAW,YAAY,YAAY;AACzC,gBAAM,OAAO,SAAS,QAAQ;AAC9B,gBAAM,QAAQ,YAAY,aAAa,GAAG,QAAQ;AAClD,gBAAM,WAAW,QAAQ,GAAG,IAAI,OAAO,KAAK,KAAK;AAEjD,uBAAa,KAAK;AAAA,YAChB,mBAAmB;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA,MAAM,iBAAiB,QAAQ,YAAY,IAAI;AAAA,UACjD,CAAC;AAED,cAAI,iBAAiB;AACnB,gBAAI,SAAS,OAAO,WAAW,UAAU,GAAG;AAC1C,8BAAgB,KAAK,GAAG,mBAAmB,QAAQ,CAAC;AAAA,YACtD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,eAAW,eAAe,WAAW,eAAe,GAAG;AACrD,YAAM,OAAO,YAAY,QAAQ;AACjC,YAAM,OAAO,YAAY,YAAY,EAAE,KAAK;AAC5C,mBAAa,KAAK;AAAA,QAChB,sBAAsB,EAAE,KAAK;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,eAAW,eAAe,WAAW,cAAc,GAAG;AACpD,YAAM,OAAO,YAAY,QAAQ;AACjC,YAAM,OAAO,YAAY,YAAY,EAAE,KAAK;AAC5C,mBAAa,KAAK;AAAA,QAChB,sBAAsB,EAAE,KAAK;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,eAAW,eAAe,WAAW,SAAS,GAAG;AAC/C,YAAM,OAAO,YAAY,QAAQ;AACjC,YAAM,OAAO,YAAY,YAAY,EAAE,KAAK;AAC5C,mBAAa,KAAK;AAAA,QAChB,iBAAiB,EAAE,KAAK;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,eAAW,eAAe,WAAW,sBAAsB,GAAG;AAC5D,YAAM,sBAAsB,YAAY,WAAW;AAEnD,YAAM,aAAa,YAAY,wBAAwB;AAEvD,YAAM,OAAO,aACT,YAAY,KAAK,UAAU,IACzB,MAAM,kBACJ,KAAK,gBAAgB,UAAU,IAC/B,aACF,aACF;AAEJ,iBAAW,eAAe,YAAY,gBAAgB,GAAG;AACvD,YAAI,YAAY,WAAW,KAAK,qBAAqB;AACnD,gBAAM,WAAW,YAAY,YAAY;AACzC,gBAAM,OAAO,SAAS,QAAQ;AAC9B,gBAAM,QAAQ,YAAY,aAAa,GAAG,QAAQ;AAClD,gBAAM,WAAW,QAAQ,GAAG,IAAI,OAAO,KAAK,KAAK;AAEjD,uBAAa,KAAK;AAAA,YAChB,mBAAmB;AAAA,cACjB;AAAA,cACA,OAAO,SAAS;AAAA,cAChB;AAAA,YACF;AAAA,YACA,MAAM,OACF,iBAAiB,QAAQ,YAAY,IAAI,OACzC,iBAAiB,QAAQ;AAAA,UAC/B,CAAC;AAED,cAAI,iBAAiB;AACnB,gBAAI,SAAS,OAAO,WAAW,UAAU,GAAG;AAC1C,8BAAgB,KAAK,GAAG,mBAAmB,QAAQ,CAAC;AAAA,YACtD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,kBACH,CAAC,cAAc,CAAC,GAAG,IAAI,IAAY,eAAe,CAAC,CAAC,IACpD,CAAC,YAAY;AAAA,EACnB;AAEA,QAAM,qBAAqB,CAAC,qBAAgD;AAE1E,UAAM,eACJ,kBACI,UAAU,GACV,iBAAiB,GACjB,gBAAgB,KAAK,CAAC;AAE5B,WAAO,aAAa,QAAQ,CAAC,MAAM;AACjC,YAAM,aAAa,EAAE,cAAc;AACnC,aAAO,aACH,CAAC,WAAW,YAAY,CAAC,IACzB,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB,CAAC,mBAAmC;AAC1D,WAAO,eAAe,iBAAiB;AAAA,EACzC;AAEA,QAAM,sBAAsB,CAAC,EAAE,MAAM,KAAK,MAAoB;AAC5D,UAAM,UAAU,cAAc;AAAA,MAC5B,kBAAkB;AAAA,QAChB;AAAA,QACA,KAAK,SAAS,QAAQ,MAAM,eAAe;AAAA,MAC7C;AAAA,MACA,6BAA6B;AAAA,IAC/B,CAAC;AAED,UAAM,uBAAuB,CAC3B,cACA,YACG;AACH,YAAM,aAAa,QAAQ;AAAA,QACzB,GAAG,IAAI,YAAY,CAAC,IAAI,KAAK,IAAI,CAAC;AAAA,QAClC;AAAA,QACA,EAAE,WAAW,KAAK;AAAA,MACpB;AAEA,YAAM,gBAAgB,UAAU,SAAS,YAAY;AAAA,QACnD,GAAG;AAAA,QACH,eAAe;AAAA,MACjB,CAAC;AAED,cAAQ,iBAAiB,UAAU;AAEnC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,eAAe,CAAC,iBAAyB;AACvC,eACE,QAAQ,cAAc,YAAY,KAClC,QAAQ,oBAAoB,YAAY;AAAA,MAE5C;AAAA,MACA,mBAAmB,OAAO,iBAAyB;AACjD,cAAM,aAAa,QAAQ,cAAc,YAAY;AACrD,YAAI,YAAY;AACd,gBAAM,WAAW,sBAAsB;AAAA,QACzC;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACvmBA,OAAO,eAAe;AAQf,IAAM,kBAAmC,CAAC,MAAM;AAEhD,IAAM,yBAAiD,CAAC,MAAM;AAE9D,IAAM,yBAAyB,CACpC,iBACA,oBACG;AACH,QAAM,YAAiD,OAAO,QAAQ;AAAA,IACpE,GAAG;AAAA,EACL,CAAC,EAAE,IAAI,CAAC,CAAC,SAAS,QAAQ,MAAM,CAAC,UAAU,OAAO,GAAG,QAAQ,CAAC;AAC9D,SAAO,CAAC,SAAiB,UAAa;AACpC,UAAM,QAAQ,UAAU,KAAK,CAAC,CAAC,OAAO,MAAM,QAAQ,OAAO,CAAC;AAC5D,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AACA,WAAO,OAAO,MAAM,CAAC,MAAM,aACvB,MAAM,CAAC,EAAE,KAAK,IACd,MAAM,CAAC;AAAA,EACb;AACF;;;AC7BA,SAAS,QAAQ,iBAAiB;AAClC,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAE9B,SAAS,YAAAC,iBAAmC;AAgBrC,IAAM,eAAe,CAC1B,iBAoBG;AACH,QAAM,aAAa,IAAI,MAAqB;AAC1C,WAAO,aAAa,OAChBD,SAAQ,aAAa,MAAMD,MAAK,GAAG,CAAC,CAAC,IACrCA,MAAK,GAAG,CAAC;AAAA,EACf;AAEA,QAAM,eAA6B;AAAA,IACjC,IAAI,GAAG,EAAE,OAAO,GAAG;AACjB,aAAO,WAAW,QACdA,MAAKE,UAAS,WAAW,GAAG,CAAC,IAC7BF,MAAKE,UAAS,WAAWA,UAAS,QAAQ,aAAa,MAAM,GAAG,CAAC;AAAA,IACvE;AAAA,IACA,OAAO,GAAG,GAAG;AACX,aAAO,KAAK,IAAI,CAACA,UAAS,WAAW,GAAG,CAAC,GAAG,CAAC;AAAA,IAC/C;AAAA,IACA,IAAI,GAAG,GAAG;AACR,aAAO,KAAK,IAAI,CAACA,UAAS,QAAQ,GAAG,CAAC,GAAG,CAAC;AAAA,IAC5C;AAAA,IACA,MAAM,GAAG,GAAG;AACV,aAAO,KAAK,IAAI,CAACA,UAAS,UAAU,GAAG,CAAC,GAAG,CAAC;AAAA,IAC9C;AAAA,IACA,IAAI,GAAG,EAAE,OAAO,GAAG;AACjB,aAAO,WAAW,QACdF,MAAKE,UAAS,WAAW,GAAG,CAAC,IAC7BF,MAAKE,UAAS,WAAWA,UAAS,QAAQ,aAAa,MAAM,GAAG,CAAC;AAAA,IACvE;AAAA,IACA,QAAQ,GAAG,GAAG;AACZ,aAAO,KAAK,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC;AAAA,IACnC;AAAA,IACA,OAAO,GAAG,GAAG;AACX,aAAO,KAAK,IAAI,CAACA,UAAS,QAAQ,GAAG,CAAC,GAAG,CAAC;AAAA,IAC5C;AAAA,IACA,SAAS,GAAG,GAAG;AACb,aAAO,KAAK,IAAI,CAACA,UAAS,UAAU,GAAG,CAAC,GAAG,CAAC;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY;AAAA,MACV,OAAO,GAAG;AACR,eAAO,WAAWA,UAAS,QAAQ,aAAa,MAAM,GAAG,CAAC;AAAA,MAC5D;AAAA,MACA,OAAO,GAAG;AACR,eAAO,KAAK,IAAIA,UAAS,QAAQ,GAAG,CAAC;AAAA,MACvC;AAAA,MACA,SAAS,GAAG;AACV,eAAO,KAAK,IAAIA,UAAS,UAAU,GAAG,CAAC;AAAA,MACzC;AAAA,MACA,UAAU,GAAG;AACX,eAAO,KAAK,IAAIA,UAAS,WAAW,GAAG,CAAC;AAAA,MAC1C;AAAA,MACA,SAAS,GAAG;AACV,eAAO,KAAK,IAAIA,UAAS,UAAU,GAAG,CAAC;AAAA,MACzC;AAAA,MACA,OAAO,GAAG;AACR,eAAO,WAAWA,UAAS,QAAQ,aAAa,MAAM,GAAG,CAAC;AAAA,MAC5D;AAAA,MACA,WAAW,GAAG;AACZ,eAAO,KAAK,IAAI,QAAQ,GAAG,CAAC;AAAA,MAC9B;AAAA,MACA,UAAU,GAAG;AACX,eAAO,KAAK,IAAIA,UAAS,QAAQ,GAAG,CAAC;AAAA,MACvC;AAAA,MACA,YAAY,GAAG;AACb,eAAO,KAAK,IAAIA,UAAS,UAAU,GAAG,CAAC;AAAA,MACzC;AAAA,MACA,YAAY,GAAG;AACb,eAAO,KAAK,IAAIA,UAAS,UAAU,GAAG,CAAC;AAAA,MACzC;AAAA,MACA,WAAW,GAAG;AACZ,eAAO,WAAW,aAAa,SAAS,aAAa,MAAM,GAAG,CAAC;AAAA,MACjE;AAAA,IACF;AAAA,IACA;AAAA,IACA,oBAAoB,GAAG;AACrB,UAAI,CAAC,CAAC,OAAO,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG;AACvC,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,QACL,aAAa,QAAQ,GAAG;AAGtB,iBAAO,aAAa,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,GAAG,CAAC;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,aAAa,OAAO,SAAmC;AAClE,MAAI;AACF,UAAM,OAAO,MAAM,UAAU,IAAI;AACjC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC3IA,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,SAAS,QAAAC,aAAY;AAE9B,OAAOC,UAAS;AAChB,OAAO,gBAAgB;AAuBhB,IAAM,SAAS,CACpB,UACA,SACA,YACW;AACX,QAAM,EAAE,WAAW,MAAM,WAAW,WAAW,IAAI,EAAE,GAAG,QAAQ;AAChE,SAAO,SAAS,QAAQ,UAAU,EAAE,SAAS,CAAC,EAAE,OAAO;AACzD;AAEO,IAAM,eAAe,OAC1B,MACA,UACA,SACA,YACkB;AAClB,QAAM,UAAU,OAAO,UAAU,SAAS,OAAO;AAMjD,MAAI,MAAM,WAAW,IAAI,GAAG;AAC1B,UAAM,EAAE,YAAY,KAAK,IAAI,EAAE,GAAG,QAAQ;AAC1C,QAAI,cAAc,OAAO;AACvB;AAAA,IACF;AACA,UAAM,cAAc,MAAM,SAAS,MAAM,MAAM;AAC/C,QAAI,OAAO,cAAc,cAAc,CAAC,UAAU,WAAW,GAAG;AAC9D;AAAA,IACF;AACA,QAAIC,KAAI,OAAO,MAAMA,KAAI,WAAW,GAAG;AACrC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,UAAU,MAAM,SAAS,MAAM;AACvC;AAEO,IAAM,gBAAgB,CAAC,YAA6B;AACzD,QAAM,iBAAiB,CAAC,iBAAkC;AACxD,UAAM,WAAW,WAAW,OAAO;AAEnC,aAAS,gBAAgB;AAAA,MACvB,GAAG,SAAS;AAAA,MACZ,GAAG,cAAc;AAAA,IACnB,CAAU;AAEV,aAAS,eAAe;AAAA,MACtB,GAAG,SAAS;AAAA,MACZ,GAAG,cAAc;AAAA,IACnB,CAAU;AAEV,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OACE,UACA,SACA,cACA;AACA,aAAO,OAAO,UAAU,SAAS;AAAA,QAC/B,GAAG;AAAA,QACH,GAAG;AAAA,QACH,UAAU,eAAe,YAAY;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,IACA,MAAM,aACJ,MACA,UACA,SACA,cACA;AACA,aAAO;AAAA,QACL,SAAS,SAASC,MAAK,QAAQ,QAAQ,IAAI,IAAI;AAAA,QAC/C;AAAA,QACA;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,GAAG;AAAA,UACH,UAAU,eAAe,YAAY;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACjHA;AAAA,EACE,YAAAC;AAAA,OAIK;;;ACLP,SAAS,WAAAC,UAAS,QAAAC,OAAM,WAAAC,gBAAe;AACvC,SAAS,aAAAC,kBAAiB;AAE1B,OAAOC,UAAS;AAChB,OAAOC,gBAAe;AACtB,SAAS,YAAY;AAErB;AAAA,EACE,YAAAC;AAAA,OAMK;;;ACdP,OAAOC,UAAS;AAChB,SAAS,aAAyB;AA0B3B,IAAM,oBAAoB,CAC/B,MACA;AAAA,EACE,uBAAuB;AACzB,IAEI,CAAC,MACgB;AAOrB,QAAM,eAAe,CACnBC,SACA,aACA,cAAc,UACsC;AACpD,UAAM,QAAyD,CAAC;AAEhE,eAAW,SAASA,SAAQ;AAC1B,cAAQ,MAAM,MAAM;AAAA,QAClB,KAAK;AAEH,cAAI,MAAM,UAAU,KAAK;AACvB,kBAAM,KAAK;AAAA,cACT,MAAM;AAAA,cACN,OAAO,qBAAqB,MAAM,KAAK;AAAA,YACzC,CAAC;AAAA,UACH;AACA;AAAA,QACF,KAAK;AACH,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,MAAM,cAAc,aAAa;AAAA,YACjC,MAAM,MAAM;AAAA,YACZ,OAAO,YAAY,MAAM,IAAI;AAAA,UAC/B,CAAC;AACD;AAAA,QACF,KAAK;AACH,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,OAAO,YAAY,MAAM,IAAI;AAAA,UAC/B,CAAC;AACD;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,GAAG,aAAa,MAAM,QAAQ,aAAa,IAAI,CAAC;AAC3D;AAAA,MACJ;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,oBAAkD;AAAA;AAAA;AAAA;AAAA;AAAA,IAKtD,CAAC,MAAM,EAAE,QAAQ,cAAc,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQpC,CAAC,MAAM,EAAE,QAAQ,cAAc,OAAO;AAAA;AAAA,IAGtC,CAAC,MAAM,EAAE,QAAQ,aAAa,IAAI;AAAA;AAAA;AAAA;AAAA,IAKlC,CAAC,MAAM;AACL,aAAO,EAAE,WAAW,GAAG,IACnB,EAAE,QAAQ,OAAO,IAAI,IACrB;AAAA,IACN;AAAA,EACF;AAGA,QAAM,mBAAmB,CAAC,MAAwC;AAChE,QAAI,QAAQ;AACZ,eAAW,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,GAAG;AACtC,UAAI,OAAO,KAAK;AACd,iBAAS;AAAA,MACX,WAAW,OAAO,KAAK;AACrB,iBAAS;AAAA,MACX,WAAW,OAAO,OAAO,UAAU,GAAG;AACpC,cAAM,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,MAAM;AACzC,eAAO,QAAQ,CAAC,KAAK;AAAA,MACvB;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,SAAS,KACZ,QAAQ,aAAa,EAAE,EACvB,MAAM,GAAG,EACT,QAAmB,CAAC,SAAS;AAC5B,QAAI,CAAC,KAAK,QAAQ;AAChB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,YAAY,iBAAiB,IAAI;AAEvC,QAAI,cAAc,KAAK;AACrB,YAAM,IAAI;AAAA,QACR,GAAG,IAAI;AAAA,MACT;AAAA,IACF,WAAW,WAAW;AACpB,YAAM,IAAI;AAAA,QACR,GAAG,IAAI,+BAA+B,SAAS,iBAAiB,SAAS;AAAA,MAC3E;AAAA,IACF;AAEA,UAAM,UAAU,kBAAkB,OAAO,CAAC,KAAK,OAAO,GAAG,GAAG,GAAG,IAAI;AAEnE,UAAM,EAAE,QAAAA,QAAO,IAAI;AAAA,MACjB,QAAQ,QAAQ,mBAAmB,CAAC,GAAG,OAAQ,KAAK,QAAQ,CAAE;AAAA,IAChE;AAEA,UAAM,QAAQ,aAAaA,SAAQ,CAAC,QAAQ;AAE1C,aAAO,KAAK,KAAK,GAAG,KAAK,MAAM,KAAK,GAAG,IACnC,CAAC,IAAI,QAAQ,YAAY,GAAG,GAAGD,KAAI,IAAI,CAAC,EAAE,KAAK,GAAG,IAClD;AAAA,IACN,CAAC;AAED,UAAM,WAAW,MAAM,WAAW,IAAI,MAAM,CAAC,EAAE,SAAS,WAAW;AACnE,UAAM,UAAU,MAAM,WAAW,IAAI,MAAM,CAAC,EAAE,SAAS,UAAU;AAEjE,UAAM,OAA0B,WAC5B,WACA,UACE,UACA;AAEN,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEO,IAAM,oBAAoB,CAAC,WAA6B;AAC7D,SAAO,OACJ,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM;AACvB,UAAM,OAAO,OAAO,IAAI,CAAC;AAEzB,QAAI,CAAC,QAAQ,KAAK,QAAQ,SAAS,GAAG,GAAG;AACvC,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,OAAO,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM;AACpD,aAAO,EAAE,MAAM,KAAK,CAACE,OAAM;AACzB,eAAOA,GAAE,SAAS,YAAYA,GAAE,SAAS;AAAA,MAC3C,CAAC;AAAA,IACH,CAAC;AAED,WAAO,gBAAgB,GAAG,OAAO,MAAM;AAAA,EACzC,CAAC,EACA,KAAK,EAAE;AACZ;AAEO,IAAM,oBAAoB,CAAC,WAA6B;AAC7D,QAAM,cAAc,CAAC,EAAE,MAAM,MAA2B;AACtD,WAAO,qBAAqB,KAAK;AAAA,EACnC;AAEA,QAAM,aAAa,CAAC,MAA0B;AAC5C,QAAI,EAAE,SAAS,SAAS;AACtB,aAAO;AAAA,IACT;AACA,QAAI,EAAE,SAAS,YAAY;AACzB,aAAO,IAAI,EAAE,IAAI;AAAA,IACnB;AACA,WAAO,IAAI,EAAE,IAAI;AAAA,EACnB;AAEA,QAAM,cAAc,CAAC,MAAc,EAAE,QAAQ,uBAAuB,MAAM;AAE1E,QAAM,gBAAgB,CAACD,YAAiC;AACtD,WAAOA,QACJ,QAAQ,CAAC,MAAM;AACd,UAAI,EAAE,SAAS,QAAQ;AACrB,eAAO,EAAE,UAAU,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC;AAAA,MACrD;AACA,UAAI,EAAE,SAAS,YAAY;AACzB,eAAO,CAAC,IAAI;AAAA,MACd;AACA,UAAI,EAAE,SAAS,SAAS;AACtB,eAAO,CAAC,OAAO;AAAA,MACjB;AACA,UAAI,EAAE,SAAS,SAAS;AACtB,eAAO,CAAC,MAAM,cAAc,EAAE,MAAM,CAAC,IAAI;AAAA,MAC3C;AACA,aAAO,CAAC;AAAA,IACV,CAAC,EACA,KAAK,EAAE;AAAA,EACZ;AAEA,SAAO,OACJ,QAAQ,CAAC,OAAO,MAAM;AACrB,QAAI,MAAM,SAAS,UAAU;AAC3B,aAAO,CAAC,YAAY,MAAM,MAAM,CAAC,CAAwB,CAAC;AAAA,IAC5D;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,aAAO,CAAC,WAAW,MAAM,MAAM,CAAC,CAAuB,CAAC;AAAA,IAC1D;AAGA,UAAM,EAAE,QAAAA,QAAO,IAAI,MAAM,MAAM,QAAQ,QAAQ,OAAO,EAAE,CAAC;AAEzD,UAAM,QAAQ,cAAcA,OAAM;AAElC,WAAO,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG;AAAA,EAC5B,CAAC,EACA,KAAK,GAAG;AACb;AAEO,IAAM,uBAAuB,CAAC,UAAkB;AACrD,SAAO,MAAM,QAAQ,OAAO,OAAO;AACrC;;;AD1OO,IAAM,qBAAqB;AAC3B,IAAM,oBAAoB,GAAG,kBAAkB;AAE/C,IAAM,mBAAmB;AACzB,IAAM,kBAAkB,GAAG,gBAAgB;AAE3C,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB,GAAG,mBAAmB;AAEjD,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB,GAAG,oBAAoB;AAE1D,IAAM,sBAAsB;AAAA;AAAA,EAE1B,GAAGE,UAAS,MAAM,OAAO,iBAAiB;AAAA;AAAA,EAE1C,GAAGA,UAAS,MAAM,OAAO,eAAe;AAAA;AAAA,EAExC,GAAGA,UAAS,QAAQ,OAAO,kBAAkB;AAAA;AAAA,EAE7C,GAAGA,UAAS,QAAQ,OAAO,mBAAmB;AAChD;AAEO,IAAM,aAAa,OAAO,iBAA+B;AAC9D,QAAM,EAAE,WAAW,IAAI,aAAa,YAAY;AAChD,SAAO,KAAK,qBAAqB;AAAA,IAC/B,KAAK,WAAW,IAAI;AAAA,IACpB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,qBAAqB;AAAA,IACrB,QAAQ;AAAA;AAAA,MAEN,GAAGA,UAAS,MAAM,IAAI,iBAAiB;AAAA,MACvC,GAAGA,UAAS,MAAM,IAAI,eAAe;AAAA,MACrC,GAAGA,UAAS,QAAQ,IAAI,kBAAkB;AAAA,MAC1C,GAAGA,UAAS,QAAQ,IAAI,mBAAmB;AAAA,IAC7C;AAAA,EACF,CAAC;AACH;AAEO,IAAM,cAAc,CACzB,MACA,iBAQW;AACX,QAAM;AAAA;AAAA,IAEJ;AAAA;AAAA,IAEA;AAAA,IACA,GAAG;AAAA,EACL,IAAIC,SAAQ,aAAa,MAAM,IAAI,EAChC,QAAQ,GAAG,aAAa,IAAI,IAAID,UAAS,MAAM,KAAK,EAAE,EACtD,MAAM,GAAG;AAQZ,MAAI,CAAC,WAAW,kBAAkB,aAAa,QAAQ,KAAK,SAAS,GAAG;AACtE,WAAO;AAAA,EACT;AAEA,SAAOE,WAAU,QAAQC,MAAK,SAAS,GAAG,IAAI,GAAG,mBAAmB,IAChE,CAAC,SAAS,KAAK,KAAK,GAAG,CAAC,IACxB;AACN;AAEO,IAAM,aAAa,CAAC,SAAiB;AAC1C,SAAOD,WAAU,UAAU,MAAM,MAAM,iBAAiB,EAAE;AAC5D;AAEO,IAAM,WAAW,CAAC,SAAiB;AACxC,SAAOA,WAAU,UAAU,MAAM,MAAM,eAAe,EAAE;AAC1D;AAEO,IAAM,cAAc,CAAC,SAAiB;AAC3C,SAAOA,WAAU,UAAU,MAAM,MAAM,kBAAkB,EAAE;AAC7D;AAEO,IAAM,eAAe,CAAC,SAAiB;AAC5C,SAAOA,WAAU,UAAU,MAAM,MAAM,mBAAmB,EAAE;AAC9D;AAEO,IAAM,mBAAmB,CAC9B,cACA,iBAC2B;AAG3B,QAAM,gBAAgB,YAAY,cAAc,YAAY;AAE5D,MAAI,CAAC,eAAe;AAClB;AAAA,EACF;AAEA,QAAM,CAAC,QAAQ,IAAI,IAAI;AAEvB,QAAM,KAAK,GAAG,KAAK,QAAQ,QAAQ,GAAG,CAAC,IAAIE,KAAI,IAAI,CAAC;AACpD,QAAM,OAAOC,SAAQ,IAAI;AAEzB,MAAI;AACF,UAAM,aAAa,kBAAkBA,SAAQ,IAAI,CAAC;AAClD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,kBAAkB,UAAU;AAAA,MACzC,aAAa,kBAAkB,UAAU;AAAA,IAC3C;AAAA,EACF,SAEE,OACA;AACA,YAAQ;AAAA,MACN,SAAIC,WAAU,OAAO,OAAO,CAAC,8BAA8BA,WAAU,QAAQ,IAAI,CAAC;AAAA,IACpF;AACA,YAAQ,MAAM,KAAK;AACnB;AAAA,EACF;AACF;AAcA,IAAM,gBAAgB,CAAC,UAA6B;AAClD,MAAI,MAAM,SAAS,UAAU;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,SAAS;AAC1B,QAAI,UAAU;AACd,QAAI,YAAY;AAEhB,eAAWC,SAAQ,MAAM,OAAO;AAC9B,UAAIA,MAAK,SAAS,UAAU;AAC1B,mBAAW;AAAA,MACb,WAAWA,MAAK,SAAS,cAAcA,MAAK,SAAS,SAAS;AAC5D,qBAAa;AAAA,MACf;AAAA,IACF;AAIA,WAAO,IAAI,UAAU,OAAO,YAAY;AAAA,EAC1C;AAEA,QAAM,OAAO,MAAM,MAAM,CAAC;AAE1B,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAeO,IAAM,aAAa,CAAC,GAAe,MAA0B;AAClE,QAAM,QAAQ,MAAM;AAAA,IAClB,EAAE,QAAQ,KAAK,IAAI,EAAE,WAAW,QAAQ,EAAE,WAAW,MAAM,EAAE;AAAA,IAC7D,CAAC,GAAG,MAAM,CAAC,EAAE,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AAAA,EAC7C;AAEA,aAAW,CAAC,IAAI,EAAE,KAAK,OAAO;AAC5B,QAAI,CAAC,MAAM,CAAC,IAAI;AAEd,YAAM,QAAQ,MAAM;AAEpB,YAAM,UACJ,OAAO,SAAS,UACX,MAAM,MAAM,CAAC,EAAyB,SAAS,UAChD;AAEN,UAAI,SAAS;AAEX,eAAO,KAAK,IAAI;AAAA,MAClB;AAGA,aAAO,KAAK,KAAK;AAAA,IACnB;AAEA,UAAM,KAAK,cAAc,EAAE;AAC3B,UAAM,KAAK,cAAc,EAAE;AAE3B,QAAI,OAAO,IAAI;AACb,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAGA,SAAO,EAAE,YAAY,cAAc,EAAE,WAAW;AAClD;;;AE/PA,SAAS,WAAAC,UAAS,QAAAC,OAAM,WAAAC,gBAAe;AACvC,SAAS,aAAAC,kBAAiB;AAE1B,OAAOC,UAAS;AAChB,OAAO,eAAe;AAEtB;AAAA,EAEE,YAAAC;AAAA,OAOK;;;ACfP;;;ACAA;;;AFuBO,IAAM,kBAAkB,CAC7B,cACA,iBAOG;AACH,QAAM;AAAA;AAAA,IAEJ,aAAa,CAAC;AAAA,IACd,iBAAiBC,UAAS;AAAA,EAC5B,IAAI,aAAa;AAEjB,QAAM,EAAE,qBAAqB,sBAAsB,IAAI,WAAW;AAElE,QAAM,eAAe,WAAW,KAAK,CAAC,EAAE,KAAK,MAAM,KAAK,YAAY;AAEpE,QAAM;AAAA;AAAA,IAEJ;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,oBAAoB,YAAY;AAEpC,SAAO;AAAA,IACL,mBAAmB,OAAO;AACxB,YAAM,EAAE,KAAK,IAAI;AAEjB,YAAM,UAAwC,YAAY;AACxD,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,MAAM,QAAQ;AAAA,IACzB;AAAA,IAEA,kBAAkB,OAAO;AACvB,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI;AAEJ,YAAM,UAAwC,YAAY;AACxD,cAAMC,SAAmB;AAAA,UACvB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,YACN,QAAQ,WAAW,QAAQ,CAAC,MAAM;AAChC,qBAAO,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,YACjD,CAAC;AAAA,UACH;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAAA;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,MAAM,QAAQ;AAAA,IACzB;AAAA,IAEA,eAAe,OAAO;AACpB,YAAM,EAAE,KAAK,IAAI;AAEjB,YAAM,UAAwC,YAAY;AACxD,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,MAAM,QAAQ;AAAA,IACzB;AAAA,IAEA,iBAAiB,OAAO;AACtB,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI;AAEJ,YAAM,UAAwC,OAAO,gBAAgB;AACnE,cAAM,eAA0C,WAAW;AAAA,UACzD,CAAC,MAAM;AACL,mBAAO,EAAE,MAAM,QAAQ,CAAC,MAAM;AAC5B,qBAAO,EAAE,SAAS,UAAU,CAAC,CAAC,IAAI,CAAC;AAAA,YACrC,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,iBAAiB,aAAa,SAChC,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,WAAW,IAC7D;AAEJ,cAAM,aAAa,eACf,aAAa,EAAE,IAAI,MAAM,aAAa,GAAG,cAAc;AAAA,UACrD;AAAA,QACF,CAAC,IACD;AAEJ,YAAI,QAAQ,aACR,MAAM,WAAW,IAAI,EAAE,UAAU,KAAK,CAAC,IACvC;AAEJ,YAAI,CAAC,OAAO;AACV,cAAI,gBAAgB,cAAc;AAChC,kBAAM,kBAAkB,YAAY;AAAA,UACtC;AAEA,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA,uBAAAC;AAAA,YACA,kBAAkB,CAAC;AAAA,UACrB,IAAI,MAAM;AAAA,YACR,EAAE,IAAI,MAAM,cAAc,eAAe;AAAA,YACzC;AAAA,cACE,qBAAqB;AAAA,cACrB,YAAY,cAAc,YAAY;AAAA,cACtC,gBAAgB,MAAM;AACpB,uBAAOC;AAAA,kBACL,aAAa;AAAA,kBACbH,UAAS;AAAA,kBACTI,SAAQ,IAAI;AAAA,kBACZ;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,kBAAkBF,uBAAsB,QAG3C,CAAC,QAAQ;AACV,mBAAO,IAAI,WAAW,aAClB,IAAI,SAAS,QAAQ,CAAC,EAAE,IAAAG,KAAI,KAAK,MAAM;AACrC,qBAAO,OAAO,CAAC,EAAE,IAAAA,KAAI,MAAM,KAAK,CAAC,IAAI,CAAC;AAAA,YACxC,CAAC,IACD,CAAC,IAAI,MAAM;AAAA,UACjB,CAAC;AAED,gBAAM,gBAAgB,oBAClB,kBAAkB,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAM;AAC7C,gBAAI,SAAS,UAAU;AACrB,oBAAM,QAAQ,aAAa,GAAG,KAAK;AACnC,qBAAO,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC;AAAA,YACjC;AACA,mBAAO,CAAC;AAAA,UACV,CAAC,IACD,CAAC;AAEL,gBAAM,YAAY,aAAa,YAAY,EAAE,WAAW;AAAA,YACtDD,SAAQ,IAAI;AAAA,YACZ;AAAA,UACF;AAEA,gBAAM,SAA6B;AAAA,YACjC,IAAI,CAAC,WAAWE,KAAI,IAAI,CAAC,EAAE,KAAK,EAAE;AAAA,YAClC,QAAQ;AAAA,YACR,cAAc;AAAA,UAChB;AAEA,gBAAM,mBAAmB,OAAiB,eAAW;AAAA,YACnD;AAAA,YACA,cAAc,aAAa,IAAI,CAAC,OAAO,UAAU;AAC/C,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,YAAY,MAAM,SAAS;AAAA,gBAC3B,SAAS,MAAM,SAAS;AAAA,gBACxB,YAAY,mBAAmB,GAAG,KAAK;AAAA,cACzC;AAAA,YACF,CAAC;AAAA,YACD;AAAA,YACA;AAAA,UACF,CAAC;AAED,gBAAM,gBAAgB,eAClB,qBAAqB,kBAAkB;AAAA,YACrC,eAAe;AAAA,YACf,WAAW,EAAE,CAAC,cAAc,GAAG,eAAe;AAAA,YAC9C,gBAAgB;AAAA,cACd,OAAO;AAAA,cACP,GAAG,gBAAgB,QAAQ,CAAC,EAAE,IAAAD,IAAG,MAAMA,GAAE;AAAA,YAC3C;AAAA,UACF,CAAC,IACD;AAOJ,gBAAM;AAAA,YACJ;AAAA,YACA,gBAA0B,yBAAgB;AAAA,YAC1C,EAAE,cAAc;AAAA,UAClB;AAEA,iBAAO,eAAe,eAAe;AAAA,YACnC,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,UAC3B;AAEA,kBAAQ;AAAA;AAAA;AAAA,YAGN,MAAM;AAAA,YACN,iBAAiB,CAAC;AAAA;AAAA,YAElB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,uBAAuBH,uBAAsB,IAAI,CAAC,QAAQ;AACxD,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,GAAI,IAAI,WAAW,aACf;AAAA,kBACE,UAAU,IAAI,SAAS,IAAI,CAAC,YAAY;AACtC,2BAAO;AAAA,sBACL,GAAG;AAAA,sBACH,cAAc,eAAe;AAAA,wBAC3B,CAAC,MAAM,EAAE,SAAS,QAAQ;AAAA,sBAC5B;AAAA,oBACF;AAAA,kBACF,CAAC;AAAA,gBACH,IACA;AAAA,kBACE,QAAQ;AAAA,oBACN,GAAG,IAAI;AAAA,oBACP,cAAc,eAAe;AAAA,sBAC3B,CAAC,MAAM,EAAE,SAAS,IAAI,OAAO;AAAA,oBAC/B;AAAA,kBACF;AAAA,gBACF;AAAA,cACN;AAAA,YACF,CAAC;AAAA,UACH;AAEA,cAAI,YAAY;AACd,kBAAM,EAAE,iBAAiB,OAAO,GAAG,KAAK,IAAI;AAC5C,oBAAQ,MAAM,WAAW,IAAI,EAAE,GAAG,MAAM,gBAAgB,CAAC;AAAA,UAC3D;AAAA,QACF;AAEA,cAAM,wBAAwB,MAAM,sBAAsB;AAAA,UACxD,CAAC,QAAQ;AACP,gBAAI,eAAiD;AAErD,gBAAI,IAAI,WAAW,YAAY;AAC7B,6BAAe;AAAA,gBACb,GAAG;AAAA,gBACH,UAAU,IAAI,SAAS,QAAQ,CAAC,SAAS,MAAM;AAC7C,sBAAI,OAAO,QAAQ,gBAAgB,UAAU;AAC3C,2BAAO,CAAC,OAAO;AAAA,kBACjB;AAEA,sBAAI,QAAQ,YAAY,SAAS,GAAG,GAAG;AACrC,2BAAO,CAAC,OAAO;AAAA,kBACjB;AAEA,wBAAM,cAAc,UAAU,OAAO,QAAQ,WAAW;AAExD,sBAAI,gBAAgB,OAAO;AACzB,4BAAQ;AAAA,sBACNK;AAAA,wBACE,CAAC,QAAQ,KAAK;AAAA,wBACd;AAAA,sBACF;AAAA,oBACF;AACA,4BAAQ;AAAA,sBACN,oDAAoD,QAAQ,WAAW;AAAA,oBACzE;AACA,4BAAQ;AAAA,sBACNA;AAAA,wBACE,CAAC,MAAM;AAAA,wBACP,uBAAuB,CAAC;AAAA,sBAC1B;AAAA,oBACF;AACA,4BAAQ,KAAK,YAAY,IAAI,aAAa,IAAI,MAAM,EAAE;AACtD,4BAAQ,KAAK;AACb,2BAAO,CAAC;AAAA,kBACV;AAEA,yBAAO,CAAC,EAAE,GAAG,SAAS,YAAY,CAAC;AAAA,gBACrC,CAAC;AAAA,cACH;AAAA,YACF,WAAW,IAAI,eAAe,CAAC,IAAI,YAAY,SAAS,GAAG,GAAG;AAC5D,oBAAM,cAAc,UAAU,OAAO,IAAI,WAAW;AACpD,kBAAI,gBAAgB,OAAO;AACzB,wBAAQ;AAAA,kBACNA;AAAA,oBACE,CAAC,QAAQ,KAAK;AAAA,oBACd;AAAA,kBACF;AAAA,gBACF;AACA,wBAAQ;AAAA,kBACN,oDAAoD,IAAI,WAAW;AAAA,gBACrE;AACA,wBAAQ,KAAK,YAAY,IAAI,aAAa,IAAI,MAAM,EAAE;AACtD,wBAAQ,KAAK;AAAA,cACf,OAAO;AACL,+BAAe,EAAE,GAAG,KAAK,YAAY;AAAA,cACvC;AAAA,YACF;AAEA,mBAAO,eAAe,CAAC,YAAY,IAAI,CAAC;AAAA,UAC1C;AAAA,QACF;AAEA,cAAMN,SAAkB;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ,MAAM;AAAA,UACd,eAAe,MAAM;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,MAAM;AAAA,UACf,kBAAkB,MAAM;AAAA,UACxB;AAAA,UACA,iBAAiB,OAAO,KAAK,MAAM,eAAe,EAAE;AAAA;AAAA;AAAA,YAGlD,CAAC,MAAMO,SAAQ,aAAa,MAAM,CAAC;AAAA,UACrC;AAAA,QACF;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAAP;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,MAAM,QAAQ;AAAA,IACzB;AAAA,EACF;AACF;;;AGnYA,SAAS,gBAAgB;AAMlB,IAAM,sBAAsB,CAAC,iBAAoC;AACtE,QAAM,aAAa,gBAAgB,YAAY,EAAE,KAAK,UAAU;AAWhE,QAAM,mBAAmB,CACvB,SACA,WAC4B;AAC5B,WAAO,CAAC,GAAG,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS;AAChE,YAAM,cAAc,WAAW,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,MAAM;AACrE,eAAO,MAAM,SAAS,OAAO,CAAC,KAAK,IAAI,CAAC;AAAA,MAC1C,CAAC;AAED,YAAM,QAAQ,YAAY;AAAA,QAAK,CAAC,MAC9B,SAAS,EAAE,IAAI,EAAE,WAAW,mBAAmB;AAAA,MACjD;AAEA,YAAM,SAAS,YAAY;AAAA,QAAK,CAAC,MAC/B,SAAS,EAAE,IAAI,EAAE,WAAW,oBAAoB;AAAA,MAClD;AAEA,UAAI,SAAS,QAAQ;AACnB,eAAO;AAAA,UACL;AAAA,YACE,OAAO,QACH;AAAA,cACE,GAAG;AAAA,cACH,YAAY,MAAM,WAAW;AAAA,gBAC3B,QAAQ,WAAW,UAAU;AAAA,cAC/B;AAAA,YACF,IACA;AAAA,YACJ,QAAQ,SACJ;AAAA,cACE,GAAG;AAAA,cACH,YAAY,OAAO,WAAW;AAAA,gBAC5B,QAAQ,WAAW,UAAU;AAAA,cAC/B;AAAA,YACF,IACA;AAAA,YACJ,QAAQ,QAAQ;AAAA,YAChB,UAAU;AAAA,cACR,sBAAsB,SAAS,MAAM;AAAA,cACrC,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO,CAAC;AAAA,IACV,CAAC;AAAA,EACH;AAWA,QAAM,wBAAwB,CAAC;AAAA,IAC7B;AAAA,IACA;AAAA,EACF,MAAqC;AAEnC,UAAM,oBAAoB,WAAW,OAAO,CAAC,UAAU;AAErD,UAAI,MAAM,WAAW,UAAU,WAAW,QAAQ;AAChD,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,MAAM,KAAK,WAAW,GAAG,IAAI,GAAG,GAAG;AACtC,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAGD,WAAO,kBAAkB,OAAO,CAAC,UAAU;AAEzC,YAAM,uBAAuB,kBAAkB,KAAK,CAAC,iBAAiB;AACpE,YAAI,iBAAiB,OAAO;AAC1B,iBAAO;AAAA,QACT;AAEA,YAAI,aAAa,WAAW,UAAU,WAAW,QAAQ;AACvD,iBAAO;AAAA,QACT;AACA,YAAI,aAAa,WAAW,UAAU,MAAM,WAAW,QAAQ;AAC7D,iBAAO;AAAA,QACT;AAEA,eAAO,MAAM,KAAK,WAAW,GAAG,aAAa,IAAI,GAAG;AAAA,MACtD,CAAC;AAED,aAAO,CAAC;AAAA,IACV,CAAC;AAAA,EACH;AAGA,QAAM,cAAc,WAAW,OAAO,CAAC,UAAU;AAE/C,UAAM,YAAY,WAAW,KAAK,CAAC,cAAc;AAC/C,UAAI,cAAc,OAAO;AACvB,eAAO;AAAA,MACT;AACA,UAAI,UAAU,WAAW,UAAU,MAAM,WAAW,QAAQ;AAC1D,eAAO;AAAA,MACT;AACA,aAAO,MAAM,KAAK,WAAW,GAAG,UAAU,IAAI,GAAG;AAAA,IACnD,CAAC;AAED,WAAO,CAAC;AAAA,EACV,CAAC;AAED,SAAO,iBAAiB,WAAW;AACrC;;;AN9GO,IAAM,gBAAgB,OAC3B,cACA,iBACG;AACH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,gBAAgB,cAAc,YAAY;AAE9C,QAAM,mBAAmB,CAACQ,gBAA8B;AACtD,UAAM,YAAY,oBAAI,IAGpB;AAEF,UAAM,UAA6BA,YAAW,QAAQ,CAAC,SAAS;AAC9D,YAAM,QAAQ,iBAAiB,MAAM,YAAY;AACjD,aAAO,QAAQ,CAAC,KAAK,IAAI,CAAC;AAAA,IAC5B,CAAC;AAED,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,WAAWC,UAAS,QAAQ;AACpC,YAAI,WAAW,MAAM,IAAI,GAAG;AAC1B,oBAAU,IAAI,MAAM,cAAc,iBAAiB,KAAK,CAAC;AAAA,QAC3D,WAAW,SAAS,MAAM,IAAI,GAAG;AAC/B,oBAAU,IAAI,MAAM,cAAc,eAAe,KAAK,CAAC;AAAA,QACzD;AAAA,MACF,WAAW,MAAM,WAAWA,UAAS,UAAU;AAC7C,YAAI,YAAY,MAAM,IAAI,GAAG;AAC3B,oBAAU,IAAI,MAAM,cAAc,kBAAkB,KAAK,CAAC;AAAA,QAC5D,WAAW,aAAa,MAAM,IAAI,GAAG;AACnC,oBAAU,IAAI,MAAM,cAAc,mBAAmB,KAAK,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,WAAW,YAAY;AAEhD,SAAO;AAAA,IACL,WAAW,iBAAiB,UAAU;AAAA,IACtC;AAAA,EACF;AACF;;;AOrEA,SAAS,eAAe;AASjB,IAAM,iBAAiB,CAAC,cAAsC;AACnE,QAAM,UAAU,IAAI,QAAQ,EAAE,MAAM,SAAS;AAC7C,MAAI,QAAQ;AACZ,SAAO;AAAA,IACL,KAAK,MAAM;AACT,cAAQ;AACR,cAAQ,OAAO;AAAA,IACjB;AAAA,IACA,OAAO,MAAM;AACX,cAAQ,OAAO,GAAG,KAAK,WAAM,IAAI;AAAA,IACnC;AAAA,IACA,QAAQ,MAAM;AACZ,UAAI,MAAM;AACR,aAAK,OAAO,IAAI;AAAA,MAClB,OAAO;AACL,aAAK,KAAK,KAAK;AAAA,MACjB;AACA,cAAQ,QAAQ;AAAA,IAClB;AAAA,IACA,OAAO,MAAM;AACX,UAAI,MAAM;AACR,aAAK,KAAK,CAAC,OAAO,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,MACpC;AACA,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF;AACF;AAEO,IAAM,cAAc,CACzB,MACA,MACA,YACG,KAAK,WAAW,eAAe,IAAI,CAAC;;;ACzCzC,SAAS,YAAAC,iBAAmC;AAErC,IAAM,qBAAqB,CAChC,MACA,iBACG;AACH,QAAM,EAAE,iBAAiBA,UAAS,eAAe,IAAI,aAAa;AAClE,SAAO;AAAA;AAAA,IAEL,CAAC,aAAa,KAAK;AAAA;AAAA,IAEnB,CAAC,gBAAgB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMvB,CAAC,IAAI,OAAO,MAAM,cAAc,SAAS,GAAG,GAAG,UAAU;AAAA,EAC3D,EAAE,OAAO,CAACC,OAAM,CAAC,GAAG,CAAC,MAAMA,MAAK,QAAQ,GAAG,CAAU,GAAG,IAAI;AAC9D;;;ACnBA,SAAS,sBAAsB;AAI/B,IAAM,aAAa,MAAc;AAC/B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU,QAAQ;AAChB,aAAO,eAAe,SAAS,MAAM,IACjC,EAAE,IAAI,QAAQ,MAAM,IAAI,UAAU,KAAK,IACvC;AAAA,IACN;AAAA,EACF;AACF;AAEO,IAAM,cAAc;AAAA,EACzB;AACF;",
|
|
6
|
+
"names": ["callExpression", "typeNode", "join", "resolve", "defaults", "join", "crc", "crc", "join", "defaults", "dirname", "join", "resolve", "styleText", "crc", "picomatch", "defaults", "crc", "tokens", "e", "defaults", "resolve", "picomatch", "join", "crc", "dirname", "styleText", "part", "dirname", "join", "resolve", "styleText", "crc", "defaults", "defaults", "entry", "validationDefinitions", "join", "dirname", "id", "crc", "styleText", "resolve", "routeFiles", "defaults", "defaults", "text"]
|
|
7
7
|
}
|
package/pkg/paths.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type SourceFolder } from "@kosmojs/core";
|
|
2
2
|
type Options = {
|
|
3
3
|
origin: "src" | "lib";
|
|
4
4
|
};
|
|
5
|
-
type CreateImport = Record<"src" | "config" | "api" | "pages" | "lib" | "libApi" | "libEntry", (a: Array<string>, o: Options) => string>;
|
|
5
|
+
type CreateImport = Record<"src" | "config" | "api" | "pages" | "lib" | "libCore" | "libApi" | "libEntry", (a: Array<string>, o: Options) => string>;
|
|
6
6
|
export declare const pathResolver: (sourceFolder: Omit<SourceFolder, "root"> & {
|
|
7
7
|
root?: string | undefined;
|
|
8
8
|
}) => {
|
|
9
|
-
createPath: Record<"src" | "config" | "api" | "pages" | "entry" | "lib" | "libApi" | "libEntry" | "libPages" | "distDir", (...a: Array<string>) => string>;
|
|
9
|
+
createPath: Record<"src" | "config" | "api" | "pages" | "entry" | "lib" | "libCore" | "libApi" | "libEntry" | "libPages" | "distDir", (...a: Array<string>) => string>;
|
|
10
10
|
createImport: CreateImport;
|
|
11
11
|
createImportHelpers: (o: Options) => {
|
|
12
12
|
createImport: (k: keyof CreateImport, ...a: Array<string>) => string;
|
package/pkg/routes/base.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ResolvedEntry, type RouteEntry, type SourceFolder } from "@kosmojs/core";
|
|
2
2
|
export type ResolverSignature = {
|
|
3
3
|
name: string;
|
|
4
4
|
handler: (updatedFile?: string) => Promise<ResolvedEntry>;
|
package/pkg/routes/index.d.ts
CHANGED
package/pkg/routes/resolve.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type RouteEntry, type RouteResolverCacheFactory, type SourceFolder } from "@kosmojs/core";
|
|
2
2
|
import type { ResolverSignature } from "./base";
|
|
3
3
|
export declare const resolverFactory: (sourceFolder: SourceFolder, cacheFactory?: RouteResolverCacheFactory) => Record<"pageLayoutResolver" | "pageRouteResolver" | "apiUseResolver" | "apiRouteResolver", (entry: RouteEntry) => ResolverSignature>;
|
package/pkg/typebox.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type SourceFolder } from "@kosmojs/core";
|
|
2
2
|
export declare const typeboxLiteralText: (text: string, sourceFolder: SourceFolder) => string;
|
package/pkg/defaults.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export declare const defaults: {
|
|
2
|
-
appPrefix: string;
|
|
3
|
-
srcPrefix: string;
|
|
4
|
-
libPrefix: string;
|
|
5
|
-
coreDir: string;
|
|
6
|
-
srcDir: string;
|
|
7
|
-
libDir: string;
|
|
8
|
-
configDir: string;
|
|
9
|
-
apiDir: string;
|
|
10
|
-
pagesDir: string;
|
|
11
|
-
entryDir: string;
|
|
12
|
-
fetchDir: string;
|
|
13
|
-
refineTypeName: string;
|
|
14
|
-
};
|
package/pkg/tsconfig.d.ts
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
export declare const generateTsconfig: (sourceFolder?: string) => {
|
|
2
|
-
include: string[];
|
|
3
|
-
compilerOptions: {
|
|
4
|
-
jsx: string;
|
|
5
|
-
types: string[];
|
|
6
|
-
paths: {
|
|
7
|
-
[x: string]: string[];
|
|
8
|
-
};
|
|
9
|
-
moduleResolution: string;
|
|
10
|
-
module: string;
|
|
11
|
-
target: string;
|
|
12
|
-
strict: boolean;
|
|
13
|
-
exactOptionalPropertyTypes: boolean;
|
|
14
|
-
noImplicitAny: boolean;
|
|
15
|
-
noImplicitThis: boolean;
|
|
16
|
-
noImplicitOverride: boolean;
|
|
17
|
-
noImplicitReturns: boolean;
|
|
18
|
-
noUnusedLocals: boolean;
|
|
19
|
-
noUnusedParameters: boolean;
|
|
20
|
-
allowArbitraryExtensions: boolean;
|
|
21
|
-
allowImportingTsExtensions: boolean;
|
|
22
|
-
allowUnreachableCode: boolean;
|
|
23
|
-
allowUnusedLabels: boolean;
|
|
24
|
-
useUnknownInCatchVariables: boolean;
|
|
25
|
-
noFallthroughCasesInSwitch: boolean;
|
|
26
|
-
noUncheckedSideEffectImports: boolean;
|
|
27
|
-
resolveJsonModule: boolean;
|
|
28
|
-
esModuleInterop: boolean;
|
|
29
|
-
verbatimModuleSyntax: boolean;
|
|
30
|
-
skipLibCheck: boolean;
|
|
31
|
-
noEmit: boolean;
|
|
32
|
-
};
|
|
33
|
-
exclude?: never;
|
|
34
|
-
} | {
|
|
35
|
-
include: string[];
|
|
36
|
-
exclude: string[];
|
|
37
|
-
compilerOptions: {
|
|
38
|
-
paths: {
|
|
39
|
-
[x: string]: string[];
|
|
40
|
-
};
|
|
41
|
-
types: string[];
|
|
42
|
-
moduleResolution: string;
|
|
43
|
-
module: string;
|
|
44
|
-
target: string;
|
|
45
|
-
strict: boolean;
|
|
46
|
-
exactOptionalPropertyTypes: boolean;
|
|
47
|
-
noImplicitAny: boolean;
|
|
48
|
-
noImplicitThis: boolean;
|
|
49
|
-
noImplicitOverride: boolean;
|
|
50
|
-
noImplicitReturns: boolean;
|
|
51
|
-
noUnusedLocals: boolean;
|
|
52
|
-
noUnusedParameters: boolean;
|
|
53
|
-
allowArbitraryExtensions: boolean;
|
|
54
|
-
allowImportingTsExtensions: boolean;
|
|
55
|
-
allowUnreachableCode: boolean;
|
|
56
|
-
allowUnusedLabels: boolean;
|
|
57
|
-
useUnknownInCatchVariables: boolean;
|
|
58
|
-
noFallthroughCasesInSwitch: boolean;
|
|
59
|
-
noUncheckedSideEffectImports: boolean;
|
|
60
|
-
resolveJsonModule: boolean;
|
|
61
|
-
esModuleInterop: boolean;
|
|
62
|
-
verbatimModuleSyntax: boolean;
|
|
63
|
-
skipLibCheck: boolean;
|
|
64
|
-
noEmit: boolean;
|
|
65
|
-
};
|
|
66
|
-
};
|