@kosmojs/dev 0.0.7 → 0.0.9
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 +7 -6
- package/pkg/base-plugin/routes.js +384 -216
- package/pkg/base-plugin/routes.js.map +4 -4
- package/pkg/base-plugin/worker.js +297 -235
- package/pkg/base-plugin/worker.js.map +4 -4
- package/pkg/cli/cli.js +4 -8
- package/pkg/cli/cli.js.map +2 -2
- package/pkg/cli/index.js +4 -8
- package/pkg/cli/index.js.map +2 -2
- package/pkg/index.js +286 -219
- package/pkg/index.js.map +4 -4
- package/pkg/src/base-plugin/cache.d.ts +1 -1
- package/pkg/src/base-plugin/routes/nesting.d.ts +5 -0
- package/pkg/src/base-plugin/routes/resolve.d.ts +23 -0
- package/pkg/src/base-plugin/routes.d.ts +6 -10
- package/pkg/src/index.d.ts +1 -1
- package/pkg/stub-generator/index.js +5 -4
- package/pkg/stub-generator/index.js.map +2 -2
- package/pkg/test/@fixtures/app/@src/pages/about/careers/[jobId]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/about/careers/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/about/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/about/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/about/team/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/account/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/account/profile/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/[...path]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/general/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/permissions/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/[userId]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/admin/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/blog/[[category]]/[[tag]]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/blog/[[category]]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/blog/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/blog/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/blog/post/[slug]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/blog/post/[slug]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/contact/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/contact/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/courses/[courseId]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/courses/[courseId]/lessons/[[lessonId]]/assignments/[...assignmentPath]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/dashboard/[view]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/dashboard/analytics/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/dashboard/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/dashboard/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/billing/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/notifications/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/profile/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/security/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/security/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/docs/[...path]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/docs/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/docs/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/files/[...filePath]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/files/[...filePath]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/legal/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/legal/privacy/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/legal/terms/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/news/[category]/articles/[...articlePath]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/news/[category]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/portal/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/products/[id]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/products/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/profile/[username]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/profile/[username]/posts/[postId]/comments/[...thread]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/profile/[username]/posts/[postId]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/[...path]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/[commentId]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/[userId]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/projects/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/properties/[[city]]/filters/[...filters]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/properties/filters/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/properties/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/search/[[query]]/[[page]]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/search/[[query]]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/search/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/[category]/[productId]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/[category]/[productId]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/cart/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/checkout/confirm/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/checkout/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/checkout/payment/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/checkout/shipping/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/checkout/shipping/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/orders/[orderId]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/orders/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/orders/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/reviews/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/products/[[category]]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/products/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/shop/products/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/signup/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/store/[category]/filters/[...filters]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/store/[category]/sort/[sortBy]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/store/[category]/sort/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/store/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/users/[username]/followers/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/users/[username]/following/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/users/[username]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/users/[username]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/[postId]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/[postId]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/users/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/users/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/[range]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/[range]/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/team/[memberId]/permissions/[...permissionPath]/index.d.ts +0 -0
- package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/team/layout.d.ts +0 -0
- package/pkg/test/@fixtures/app/lib/@src/{api}/articles/[...path]/index.ts/types.d.ts +3 -0
- package/pkg/test/@fixtures/app/lib/@src/{api}/books/[category]/[[author]]/index.ts/types.d.ts +4 -0
- package/pkg/test/@fixtures/app/lib/@src/{api}/books/[category]/index.ts/types.d.ts +3 -0
- package/pkg/test/@fixtures/app/lib/@src/{api}/books/index.ts/types.d.ts +1 -0
- package/pkg/test/@fixtures/app/lib/@src/{api}/files/[[folder]]/[[id]].json/index.ts/types.d.ts +4 -0
- package/pkg/test/@fixtures/app/lib/@src/{api}/files/[[folder]]/index.ts/types.d.ts +3 -0
- package/pkg/test/@fixtures/app/lib/@src/{api}/index/index.ts/types.d.ts +1 -0
- package/pkg/test/@fixtures/app/lib/@src/{api}/pages/[...path].html/index.ts/types.d.ts +3 -0
- package/pkg/test/@fixtures/app/lib/@src/{api}/users/[id].json/index.ts/types.d.ts +3 -0
- package/pkg/test/routes/base.d.ts +4 -0
- package/pkg/test/routes/nesting.test.d.ts +1 -0
package/pkg/index.js
CHANGED
|
@@ -147,6 +147,11 @@ var api_handler_default = async (options) => {
|
|
|
147
147
|
};
|
|
148
148
|
|
|
149
149
|
// src/base-plugin/routes.ts
|
|
150
|
+
import {
|
|
151
|
+
defaults as defaults3
|
|
152
|
+
} from "@kosmojs/devlib";
|
|
153
|
+
|
|
154
|
+
// src/base-plugin/routes/resolve.ts
|
|
150
155
|
import { dirname as dirname2, join as join2, resolve as resolve4 } from "node:path";
|
|
151
156
|
import crc3 from "crc/crc32";
|
|
152
157
|
import picomatch from "picomatch";
|
|
@@ -428,7 +433,7 @@ var cacheFactory = (route, {
|
|
|
428
433
|
const cacheFile = pathResolver({
|
|
429
434
|
appRoot,
|
|
430
435
|
sourceFolder
|
|
431
|
-
}).resolve("apiLibDir", route.
|
|
436
|
+
}).resolve("apiLibDir", dirname(route.file), "cache.json");
|
|
432
437
|
const getCache = async (opt) => {
|
|
433
438
|
if (await pathExists(cacheFile)) {
|
|
434
439
|
try {
|
|
@@ -509,8 +514,120 @@ var resolved_types_default = "{{#each resolvedTypes}}\nexport type {{name}} = {{
|
|
|
509
514
|
// src/base-plugin/templates/types.hbs
|
|
510
515
|
var types_default = '{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n "{{name}}"{{#unless isRequired}}?{{/unless}}:{{#if isRest}} Array<{{/if}}\n {{#if refinement}}{{refinement.text}}{{else}}string{{/if}}\n {{#if isRest}}>{{/if}}\n {{/each}}\n};\n\n{{#each payloadTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n\n{{#each responseTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n';
|
|
511
516
|
|
|
512
|
-
// src/base-plugin/routes.ts
|
|
513
|
-
var
|
|
517
|
+
// src/base-plugin/routes/resolve.ts
|
|
518
|
+
var API_INDEX_BASENAME = "index";
|
|
519
|
+
var API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;
|
|
520
|
+
var PAGE_INDEX_BASENAME = "index";
|
|
521
|
+
var PAGE_INDEX_PATTERN = `${PAGE_INDEX_BASENAME}.{tsx,vue}`;
|
|
522
|
+
var PAGE_LAYOUT_BASENAME = "layout";
|
|
523
|
+
var PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue}`;
|
|
524
|
+
var ROUTE_FILE_PATTERNS = [
|
|
525
|
+
// match index files in api dir
|
|
526
|
+
`${defaults2.apiDir}/**/${API_INDEX_PATTERN}`,
|
|
527
|
+
// match index files in pages dir
|
|
528
|
+
`${defaults2.pagesDir}/**/${PAGE_INDEX_PATTERN}`,
|
|
529
|
+
// match layout files in pages dir
|
|
530
|
+
`${defaults2.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`
|
|
531
|
+
];
|
|
532
|
+
var scanRoutes = async ({
|
|
533
|
+
appRoot,
|
|
534
|
+
sourceFolder
|
|
535
|
+
}) => {
|
|
536
|
+
return glob2(ROUTE_FILE_PATTERNS, {
|
|
537
|
+
cwd: resolve4(appRoot, sourceFolder),
|
|
538
|
+
absolute: true,
|
|
539
|
+
onlyFiles: true,
|
|
540
|
+
followSymbolicLinks: false,
|
|
541
|
+
ignore: [
|
|
542
|
+
// ignore top-level matches, routes resides in folders, even index route
|
|
543
|
+
`${defaults2.apiDir}/${API_INDEX_PATTERN}`,
|
|
544
|
+
`${defaults2.pagesDir}/${PAGE_INDEX_PATTERN}`,
|
|
545
|
+
`${defaults2.pagesDir}/${PAGE_LAYOUT_PATTERN}`
|
|
546
|
+
]
|
|
547
|
+
});
|
|
548
|
+
};
|
|
549
|
+
var isRouteFile = (file, {
|
|
550
|
+
appRoot,
|
|
551
|
+
sourceFolder
|
|
552
|
+
}) => {
|
|
553
|
+
const [_sourceFolder, folder, ...rest] = resolve4(appRoot, file).replace(`${appRoot}/`, "").split("/");
|
|
554
|
+
if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
return picomatch.isMatch(join2(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : void 0;
|
|
558
|
+
};
|
|
559
|
+
var isPageFile = (file) => {
|
|
560
|
+
return picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`) ? { kind: "index" } : picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`) ? { kind: "layout" } : void 0;
|
|
561
|
+
};
|
|
562
|
+
var createRouteEntry = (_file, {
|
|
563
|
+
appRoot,
|
|
564
|
+
sourceFolder
|
|
565
|
+
}) => {
|
|
566
|
+
const resolvedPaths = isRouteFile(_file, { appRoot, sourceFolder });
|
|
567
|
+
if (!resolvedPaths) {
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
const [folder, file] = resolvedPaths;
|
|
571
|
+
const fileFullpath = join2(appRoot, sourceFolder, folder, file);
|
|
572
|
+
const pathTokens = pathTokensFactory(dirname2(file));
|
|
573
|
+
const name = pathTokens.map((e) => e.orig).join("/");
|
|
574
|
+
const importFile = file;
|
|
575
|
+
const importName = `${importFile.replace(/\W+/g, "_")}_${crc3(importFile)}`;
|
|
576
|
+
return {
|
|
577
|
+
name,
|
|
578
|
+
folder,
|
|
579
|
+
file,
|
|
580
|
+
fileFullpath,
|
|
581
|
+
pathTokens,
|
|
582
|
+
importFile,
|
|
583
|
+
importName
|
|
584
|
+
};
|
|
585
|
+
};
|
|
586
|
+
var pageLayoutResolverFactory = () => {
|
|
587
|
+
return (entry) => {
|
|
588
|
+
const { name } = entry;
|
|
589
|
+
const handler = async () => {
|
|
590
|
+
return {
|
|
591
|
+
kind: "pageLayout",
|
|
592
|
+
entry
|
|
593
|
+
};
|
|
594
|
+
};
|
|
595
|
+
return { name, handler };
|
|
596
|
+
};
|
|
597
|
+
};
|
|
598
|
+
var pageRouteResolverFactory = () => {
|
|
599
|
+
return (entry) => {
|
|
600
|
+
const {
|
|
601
|
+
name,
|
|
602
|
+
folder,
|
|
603
|
+
file,
|
|
604
|
+
fileFullpath,
|
|
605
|
+
pathTokens,
|
|
606
|
+
importFile,
|
|
607
|
+
importName
|
|
608
|
+
} = entry;
|
|
609
|
+
const handler = async () => {
|
|
610
|
+
const entry2 = {
|
|
611
|
+
name,
|
|
612
|
+
pathTokens,
|
|
613
|
+
params: {
|
|
614
|
+
schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
|
|
615
|
+
},
|
|
616
|
+
folder,
|
|
617
|
+
file,
|
|
618
|
+
fileFullpath,
|
|
619
|
+
importFile,
|
|
620
|
+
importName
|
|
621
|
+
};
|
|
622
|
+
return {
|
|
623
|
+
kind: "pageRoute",
|
|
624
|
+
entry: entry2
|
|
625
|
+
};
|
|
626
|
+
};
|
|
627
|
+
return { name, handler };
|
|
628
|
+
};
|
|
629
|
+
};
|
|
630
|
+
var apiRouteResolverFactory = (pluginOptions) => {
|
|
514
631
|
const {
|
|
515
632
|
appRoot,
|
|
516
633
|
sourceFolder,
|
|
@@ -530,235 +647,185 @@ var routes_default = async (pluginOptions) => {
|
|
|
530
647
|
getSourceFile,
|
|
531
648
|
refreshSourceFile
|
|
532
649
|
} = typeResolverFactory(pluginOptions);
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
const
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
}
|
|
551
|
-
const [folder, file] = resolvedPaths;
|
|
552
|
-
const fileFullpath = join2(appRoot, sourceFolder, folder, file);
|
|
553
|
-
const pathTokens = pathTokensFactory(dirname2(file));
|
|
554
|
-
const name = pathTokens.map((e) => e.orig).join("/");
|
|
555
|
-
const importPath = dirname2(file);
|
|
556
|
-
const importName = [
|
|
557
|
-
importPath.split(/\[/)[0].replace(/^\W+|\W+$/g, "").replace(/\W+/g, "_"),
|
|
558
|
-
crc3(importPath)
|
|
559
|
-
].join("_");
|
|
560
|
-
return [
|
|
650
|
+
return (entry) => {
|
|
651
|
+
const {
|
|
652
|
+
name,
|
|
653
|
+
file,
|
|
654
|
+
folder,
|
|
655
|
+
fileFullpath,
|
|
656
|
+
pathTokens,
|
|
657
|
+
importFile,
|
|
658
|
+
importName
|
|
659
|
+
} = entry;
|
|
660
|
+
const handler = async (updatedFile) => {
|
|
661
|
+
const paramsSchema = pathTokens.flatMap((e) => {
|
|
662
|
+
return e.param ? [e.param] : [];
|
|
663
|
+
});
|
|
664
|
+
const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
|
|
665
|
+
const { getCache, persistCache } = cacheFactory(
|
|
666
|
+
{ file, fileFullpath, importName },
|
|
561
667
|
{
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
fileFullpath,
|
|
566
|
-
pathTokens,
|
|
567
|
-
importPath,
|
|
568
|
-
importName
|
|
668
|
+
appRoot,
|
|
669
|
+
sourceFolder,
|
|
670
|
+
extraContext: { resolveTypes }
|
|
569
671
|
}
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
});
|
|
586
|
-
const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
|
|
587
|
-
const { getCache, persistCache } = cacheFactory(
|
|
588
|
-
{ file, fileFullpath, importName, importPath },
|
|
672
|
+
);
|
|
673
|
+
let cache = await getCache({ validate: true });
|
|
674
|
+
if (!cache) {
|
|
675
|
+
if (updatedFile === fileFullpath) {
|
|
676
|
+
await refreshSourceFile(fileFullpath);
|
|
677
|
+
}
|
|
678
|
+
const {
|
|
679
|
+
typeDeclarations,
|
|
680
|
+
paramsRefinements,
|
|
681
|
+
methods,
|
|
682
|
+
payloadTypes,
|
|
683
|
+
responseTypes,
|
|
684
|
+
referencedFiles = []
|
|
685
|
+
} = await resolveRouteSignature(
|
|
686
|
+
{ importName, fileFullpath, optionalParams },
|
|
589
687
|
{
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
688
|
+
withReferencedFiles: true,
|
|
689
|
+
sourceFile: getSourceFile(fileFullpath),
|
|
690
|
+
relpathResolver(path) {
|
|
691
|
+
return join2(sourceFolder, defaults2.apiDir, dirname2(file), path);
|
|
692
|
+
}
|
|
593
693
|
}
|
|
594
694
|
);
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
695
|
+
const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
|
|
696
|
+
if (text === "number") {
|
|
697
|
+
const param = paramsSchema.at(index);
|
|
698
|
+
return param ? [param.name] : [];
|
|
599
699
|
}
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
sourceFile: getSourceFile(fileFullpath),
|
|
612
|
-
relpathResolver(path) {
|
|
613
|
-
return join2(sourceFolder, defaults2.apiDir, dirname2(file), path);
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
);
|
|
617
|
-
const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
|
|
618
|
-
if (text === "number") {
|
|
619
|
-
const param = paramsSchema.at(index);
|
|
620
|
-
return param ? [param.name] : [];
|
|
621
|
-
}
|
|
622
|
-
return [];
|
|
623
|
-
}) : [];
|
|
624
|
-
const typesFile = pathResolver2({ appRoot, sourceFolder }).resolve(
|
|
625
|
-
"apiLibDir",
|
|
626
|
-
importPath,
|
|
627
|
-
"types.ts"
|
|
628
|
-
);
|
|
629
|
-
const params = {
|
|
630
|
-
id: ["ParamsT", crc3(name)].join(""),
|
|
631
|
-
schema: paramsSchema,
|
|
632
|
-
resolvedType: void 0
|
|
633
|
-
};
|
|
634
|
-
const typesFileContent = render(types_default, {
|
|
635
|
-
params,
|
|
636
|
-
paramsSchema: paramsSchema.map((param, index) => {
|
|
637
|
-
return {
|
|
638
|
-
...param,
|
|
639
|
-
refinement: paramsRefinements?.at(index)
|
|
640
|
-
};
|
|
641
|
-
}),
|
|
642
|
-
typeDeclarations,
|
|
643
|
-
payloadTypes,
|
|
644
|
-
responseTypes
|
|
645
|
-
});
|
|
646
|
-
const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
|
|
647
|
-
overrides: [...payloadTypes, ...responseTypes].reduce(
|
|
648
|
-
(map, { id, skipValidation }) => {
|
|
649
|
-
if (skipValidation) {
|
|
650
|
-
map[id] = "never";
|
|
651
|
-
}
|
|
652
|
-
return map;
|
|
653
|
-
},
|
|
654
|
-
{ [refineTypeName]: refineTypeName }
|
|
655
|
-
),
|
|
656
|
-
withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
|
|
657
|
-
formatters
|
|
658
|
-
}) : void 0;
|
|
659
|
-
await renderToFile(
|
|
660
|
-
typesFile,
|
|
661
|
-
resolvedTypes ? resolved_types_default : typesFileContent,
|
|
662
|
-
{ resolvedTypes }
|
|
663
|
-
);
|
|
664
|
-
params.resolvedType = resolvedTypes?.find(
|
|
665
|
-
(e) => e.name === params.id
|
|
666
|
-
);
|
|
667
|
-
cache = await persistCache({
|
|
668
|
-
params,
|
|
669
|
-
methods,
|
|
670
|
-
typeDeclarations,
|
|
671
|
-
numericParams,
|
|
672
|
-
// text was needed at writing types.ts file, dropping from cache
|
|
673
|
-
payloadTypes: payloadTypes.map(({ text, ...rest }) => {
|
|
674
|
-
return {
|
|
675
|
-
...rest,
|
|
676
|
-
resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
|
|
677
|
-
};
|
|
678
|
-
}),
|
|
679
|
-
responseTypes: responseTypes.map(({ text, ...rest }) => {
|
|
680
|
-
return {
|
|
681
|
-
...rest,
|
|
682
|
-
resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
|
|
683
|
-
};
|
|
684
|
-
}),
|
|
685
|
-
referencedFiles
|
|
686
|
-
});
|
|
687
|
-
}
|
|
688
|
-
const route = {
|
|
689
|
-
name,
|
|
690
|
-
pathTokens,
|
|
691
|
-
params: cache.params,
|
|
692
|
-
numericParams: cache.numericParams,
|
|
693
|
-
optionalParams,
|
|
694
|
-
importName,
|
|
695
|
-
importPath,
|
|
696
|
-
folder,
|
|
697
|
-
file,
|
|
698
|
-
fileFullpath,
|
|
699
|
-
methods: cache.methods,
|
|
700
|
-
typeDeclarations: cache.typeDeclarations,
|
|
701
|
-
payloadTypes: cache.payloadTypes,
|
|
702
|
-
responseTypes: cache.responseTypes,
|
|
703
|
-
referencedFiles: Object.keys(cache.referencedFiles).map(
|
|
704
|
-
// expand referenced files path,
|
|
705
|
-
// they are stored as relative in cache
|
|
706
|
-
(e) => resolve4(appRoot, e)
|
|
707
|
-
)
|
|
708
|
-
};
|
|
709
|
-
return {
|
|
710
|
-
kind: "api",
|
|
711
|
-
route
|
|
700
|
+
return [];
|
|
701
|
+
}) : [];
|
|
702
|
+
const typesFile = pathResolver2({ appRoot, sourceFolder }).resolve(
|
|
703
|
+
"apiLibDir",
|
|
704
|
+
dirname2(file),
|
|
705
|
+
"types.ts"
|
|
706
|
+
);
|
|
707
|
+
const params = {
|
|
708
|
+
id: ["ParamsT", crc3(name)].join(""),
|
|
709
|
+
schema: paramsSchema,
|
|
710
|
+
resolvedType: void 0
|
|
712
711
|
};
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
712
|
+
const typesFileContent = render(types_default, {
|
|
713
|
+
params,
|
|
714
|
+
paramsSchema: paramsSchema.map((param, index) => {
|
|
715
|
+
return {
|
|
716
|
+
...param,
|
|
717
|
+
refinement: paramsRefinements?.at(index)
|
|
718
|
+
};
|
|
719
|
+
}),
|
|
720
|
+
typeDeclarations,
|
|
721
|
+
payloadTypes,
|
|
722
|
+
responseTypes
|
|
723
|
+
});
|
|
724
|
+
const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
|
|
725
|
+
overrides: [...payloadTypes, ...responseTypes].reduce(
|
|
726
|
+
(map, { id, skipValidation }) => {
|
|
727
|
+
if (skipValidation) {
|
|
728
|
+
map[id] = "never";
|
|
729
|
+
}
|
|
730
|
+
return map;
|
|
731
|
+
},
|
|
732
|
+
{ [refineTypeName]: refineTypeName }
|
|
733
|
+
),
|
|
734
|
+
withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
|
|
735
|
+
formatters
|
|
736
|
+
}) : void 0;
|
|
737
|
+
await renderToFile(
|
|
738
|
+
typesFile,
|
|
739
|
+
resolvedTypes ? resolved_types_default : typesFileContent,
|
|
740
|
+
{ resolvedTypes }
|
|
741
|
+
);
|
|
742
|
+
params.resolvedType = resolvedTypes?.find((e) => e.name === params.id);
|
|
743
|
+
cache = await persistCache({
|
|
744
|
+
params,
|
|
745
|
+
methods,
|
|
746
|
+
typeDeclarations,
|
|
747
|
+
numericParams,
|
|
748
|
+
// text was needed at writing types.ts file, dropping from cache
|
|
749
|
+
payloadTypes: payloadTypes.map(({ text, ...rest }) => {
|
|
750
|
+
return {
|
|
751
|
+
...rest,
|
|
752
|
+
resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
|
|
753
|
+
};
|
|
754
|
+
}),
|
|
755
|
+
responseTypes: responseTypes.map(({ text, ...rest }) => {
|
|
756
|
+
return {
|
|
757
|
+
...rest,
|
|
758
|
+
resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
|
|
759
|
+
};
|
|
760
|
+
}),
|
|
761
|
+
referencedFiles
|
|
762
|
+
});
|
|
763
|
+
}
|
|
764
|
+
const entry2 = {
|
|
719
765
|
name,
|
|
766
|
+
pathTokens,
|
|
767
|
+
params: cache.params,
|
|
768
|
+
numericParams: cache.numericParams,
|
|
769
|
+
optionalParams,
|
|
770
|
+
importName,
|
|
771
|
+
importFile,
|
|
720
772
|
folder,
|
|
721
773
|
file,
|
|
722
774
|
fileFullpath,
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
|
|
733
|
-
},
|
|
734
|
-
folder,
|
|
735
|
-
file,
|
|
736
|
-
fileFullpath,
|
|
737
|
-
importPath,
|
|
738
|
-
importName
|
|
739
|
-
};
|
|
740
|
-
return {
|
|
741
|
-
kind: "page",
|
|
742
|
-
route
|
|
743
|
-
};
|
|
775
|
+
methods: cache.methods,
|
|
776
|
+
typeDeclarations: cache.typeDeclarations,
|
|
777
|
+
payloadTypes: cache.payloadTypes,
|
|
778
|
+
responseTypes: cache.responseTypes,
|
|
779
|
+
referencedFiles: Object.keys(cache.referencedFiles).map(
|
|
780
|
+
// expand referenced files path,
|
|
781
|
+
// they are stored as relative in cache
|
|
782
|
+
(e) => resolve4(appRoot, e)
|
|
783
|
+
)
|
|
744
784
|
};
|
|
745
|
-
|
|
785
|
+
return {
|
|
786
|
+
kind: "apiRoute",
|
|
787
|
+
entry: entry2
|
|
788
|
+
};
|
|
789
|
+
};
|
|
790
|
+
return { name, handler };
|
|
791
|
+
};
|
|
792
|
+
};
|
|
793
|
+
|
|
794
|
+
// src/base-plugin/routes/nesting.ts
|
|
795
|
+
import {
|
|
796
|
+
sortRoutes
|
|
797
|
+
} from "@kosmojs/devlib";
|
|
798
|
+
|
|
799
|
+
// src/base-plugin/routes.ts
|
|
800
|
+
var routes_default = async (pluginOptions) => {
|
|
801
|
+
const { appRoot, sourceFolder } = pluginOptions;
|
|
802
|
+
const apiRouteResolver = apiRouteResolverFactory(pluginOptions);
|
|
803
|
+
const pageRouteResolver = pageRouteResolverFactory(pluginOptions);
|
|
804
|
+
const pageLayoutResolver = pageLayoutResolverFactory(pluginOptions);
|
|
805
|
+
const resolversFactory = (routeFiles2) => {
|
|
806
|
+
const resolvers = /* @__PURE__ */ new Map();
|
|
807
|
+
const entries = routeFiles2.flatMap((file) => {
|
|
808
|
+
const entry = createRouteEntry(file, pluginOptions);
|
|
809
|
+
return entry ? [entry] : [];
|
|
810
|
+
});
|
|
811
|
+
for (const entry of entries) {
|
|
812
|
+
if (entry.folder === defaults3.apiDir) {
|
|
813
|
+
resolvers.set(entry.fileFullpath, apiRouteResolver(entry));
|
|
814
|
+
} else if (entry.folder === defaults3.pagesDir) {
|
|
815
|
+
const pageFile = isPageFile(entry.file);
|
|
816
|
+
if (pageFile?.kind === "index") {
|
|
817
|
+
resolvers.set(entry.fileFullpath, pageRouteResolver(entry));
|
|
818
|
+
} else if (pageFile?.kind === "layout") {
|
|
819
|
+
resolvers.set(entry.fileFullpath, pageLayoutResolver(entry));
|
|
820
|
+
}
|
|
821
|
+
}
|
|
746
822
|
}
|
|
747
823
|
return resolvers;
|
|
748
824
|
};
|
|
749
|
-
const routeFiles = await
|
|
750
|
-
cwd: resolve4(appRoot, sourceFolder),
|
|
751
|
-
absolute: true,
|
|
752
|
-
onlyFiles: true,
|
|
753
|
-
ignore: [
|
|
754
|
-
`${defaults2.apiDir}/index.ts`,
|
|
755
|
-
`${defaults2.pagesDir}/index.ts{x,}`
|
|
756
|
-
]
|
|
757
|
-
});
|
|
825
|
+
const routeFiles = await scanRoutes({ appRoot, sourceFolder });
|
|
758
826
|
return {
|
|
759
827
|
resolvers: resolversFactory(routeFiles),
|
|
760
|
-
resolversFactory
|
|
761
|
-
resolveRouteFile
|
|
828
|
+
resolversFactory
|
|
762
829
|
};
|
|
763
830
|
};
|
|
764
831
|
|
|
@@ -931,14 +998,14 @@ var base_plugin_default = (apiurl, pluginOptions) => {
|
|
|
931
998
|
}
|
|
932
999
|
if (store.config.command === "build") {
|
|
933
1000
|
const { resolvers } = await routes_default(store.resolvedOptions);
|
|
934
|
-
const
|
|
1001
|
+
const resolvedEntries = [];
|
|
935
1002
|
{
|
|
936
1003
|
const spinner = spinnerFactory("Resolving Routes");
|
|
937
1004
|
for (const { name, handler } of resolvers.values()) {
|
|
938
1005
|
spinner.append(
|
|
939
|
-
`[ ${
|
|
1006
|
+
`[ ${resolvedEntries.length + 1} of ${resolvers.size} ] ${name}`
|
|
940
1007
|
);
|
|
941
|
-
|
|
1008
|
+
resolvedEntries.push(await handler());
|
|
942
1009
|
}
|
|
943
1010
|
spinner.succeed();
|
|
944
1011
|
}
|
|
@@ -947,7 +1014,7 @@ var base_plugin_default = (apiurl, pluginOptions) => {
|
|
|
947
1014
|
for (const { name, factory } of store.resolvedOptions.generators) {
|
|
948
1015
|
spinner.append(name);
|
|
949
1016
|
const { watchHandler } = await factory(store.resolvedOptions);
|
|
950
|
-
await watchHandler(
|
|
1017
|
+
await watchHandler(resolvedEntries);
|
|
951
1018
|
}
|
|
952
1019
|
spinner.succeed();
|
|
953
1020
|
}
|