@kosmojs/dev 0.0.8 → 0.0.10
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 +16 -19
- package/pkg/base-plugin/routes.js +391 -196
- package/pkg/base-plugin/routes.js.map +4 -4
- package/pkg/base-plugin/worker.js +302 -208
- package/pkg/base-plugin/worker.js.map +4 -4
- package/pkg/cli/cli.js +1 -4
- package/pkg/cli/cli.js.map +2 -2
- package/pkg/cli/index.js +1 -6
- package/pkg/cli/index.js.map +2 -2
- package/pkg/cli/templates/@src/api/router.hbs +2 -2
- package/pkg/index.js +294 -201
- 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 +26 -0
- package/pkg/src/base-plugin/routes.d.ts +6 -12
- 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
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
// src/base-plugin/routes.ts
|
|
2
|
+
import {
|
|
3
|
+
defaults as defaults2
|
|
4
|
+
} from "@kosmojs/devlib";
|
|
5
|
+
|
|
6
|
+
// src/base-plugin/routes/resolve.ts
|
|
2
7
|
import { dirname as dirname2, join, resolve as resolve3 } from "node:path";
|
|
3
8
|
import crc3 from "crc/crc32";
|
|
4
9
|
import picomatch from "picomatch";
|
|
@@ -280,7 +285,7 @@ var cacheFactory = (route, {
|
|
|
280
285
|
const cacheFile = pathResolver({
|
|
281
286
|
appRoot,
|
|
282
287
|
sourceFolder
|
|
283
|
-
}).resolve("apiLibDir", route.
|
|
288
|
+
}).resolve("apiLibDir", dirname(route.file), "cache.json");
|
|
284
289
|
const getCache = async (opt) => {
|
|
285
290
|
if (await pathExists(cacheFile)) {
|
|
286
291
|
try {
|
|
@@ -361,22 +366,70 @@ var resolved_types_default = "{{#each resolvedTypes}}\nexport type {{name}} = {{
|
|
|
361
366
|
// src/base-plugin/templates/types.hbs
|
|
362
367
|
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';
|
|
363
368
|
|
|
364
|
-
// src/base-plugin/routes.ts
|
|
365
|
-
var
|
|
366
|
-
var
|
|
369
|
+
// src/base-plugin/routes/resolve.ts
|
|
370
|
+
var API_INDEX_BASENAME = "index";
|
|
371
|
+
var API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;
|
|
372
|
+
var API_USE_BASENAME = "use";
|
|
373
|
+
var API_USE_PATTERN = `${API_USE_BASENAME}.ts`;
|
|
374
|
+
var PAGE_INDEX_BASENAME = "index";
|
|
375
|
+
var PAGE_INDEX_PATTERN = `${PAGE_INDEX_BASENAME}.{tsx,vue}`;
|
|
376
|
+
var PAGE_LAYOUT_BASENAME = "layout";
|
|
377
|
+
var PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue}`;
|
|
367
378
|
var ROUTE_FILE_PATTERNS = [
|
|
379
|
+
// match index files in api dir
|
|
368
380
|
`${defaults.apiDir}/**/${API_INDEX_PATTERN}`,
|
|
369
|
-
|
|
381
|
+
// match use files in api dir
|
|
382
|
+
`${defaults.apiDir}/**/${API_USE_PATTERN}`,
|
|
383
|
+
// match index files in pages dir
|
|
384
|
+
`${defaults.pagesDir}/**/${PAGE_INDEX_PATTERN}`,
|
|
385
|
+
// match layout files in pages dir
|
|
386
|
+
`${defaults.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`
|
|
370
387
|
];
|
|
371
|
-
var
|
|
388
|
+
var scanRoutes = async ({
|
|
389
|
+
appRoot,
|
|
390
|
+
sourceFolder
|
|
391
|
+
}) => {
|
|
392
|
+
return glob(ROUTE_FILE_PATTERNS, {
|
|
393
|
+
cwd: resolve3(appRoot, sourceFolder),
|
|
394
|
+
absolute: true,
|
|
395
|
+
onlyFiles: true,
|
|
396
|
+
followSymbolicLinks: false,
|
|
397
|
+
ignore: [
|
|
398
|
+
// ignore top-level matches, routes resides in folders, even index route
|
|
399
|
+
`${defaults.apiDir}/${API_INDEX_PATTERN}`,
|
|
400
|
+
`${defaults.apiDir}/${API_USE_PATTERN}`,
|
|
401
|
+
`${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`,
|
|
402
|
+
`${defaults.pagesDir}/${PAGE_LAYOUT_PATTERN}`
|
|
403
|
+
]
|
|
404
|
+
});
|
|
405
|
+
};
|
|
406
|
+
var isRouteFile = (file, {
|
|
407
|
+
appRoot,
|
|
408
|
+
sourceFolder
|
|
409
|
+
}) => {
|
|
372
410
|
const [_sourceFolder, folder, ...rest] = resolve3(appRoot, file).replace(`${appRoot}/`, "").split("/");
|
|
373
411
|
if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
|
|
374
412
|
return;
|
|
375
413
|
}
|
|
376
414
|
return picomatch.isMatch(join(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : void 0;
|
|
377
415
|
};
|
|
378
|
-
var
|
|
379
|
-
|
|
416
|
+
var isApiRoute = (file) => {
|
|
417
|
+
return picomatch.matchBase(file, `**/${API_INDEX_PATTERN}`);
|
|
418
|
+
};
|
|
419
|
+
var isApiUse = (file) => {
|
|
420
|
+
return picomatch.matchBase(file, `**/${API_USE_PATTERN}`);
|
|
421
|
+
};
|
|
422
|
+
var isPageRoute = (file) => {
|
|
423
|
+
return picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`);
|
|
424
|
+
};
|
|
425
|
+
var isPageLayout = (file) => {
|
|
426
|
+
return picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`);
|
|
427
|
+
};
|
|
428
|
+
var createRouteEntry = (_file, {
|
|
429
|
+
appRoot,
|
|
430
|
+
sourceFolder
|
|
431
|
+
}) => {
|
|
432
|
+
const resolvedPaths = isRouteFile(_file, { appRoot, sourceFolder });
|
|
380
433
|
if (!resolvedPaths) {
|
|
381
434
|
return;
|
|
382
435
|
}
|
|
@@ -384,22 +437,75 @@ var resolveRouteEntry = (_file, { appRoot, sourceFolder }) => {
|
|
|
384
437
|
const fileFullpath = join(appRoot, sourceFolder, folder, file);
|
|
385
438
|
const pathTokens = pathTokensFactory(dirname2(file));
|
|
386
439
|
const name = pathTokens.map((e) => e.orig).join("/");
|
|
387
|
-
const
|
|
388
|
-
const importName =
|
|
389
|
-
importPath.split(/\[/)[0].replace(/^\W+|\W+$/g, "").replace(/\W+/g, "_"),
|
|
390
|
-
crc3(importPath)
|
|
391
|
-
].join("_");
|
|
440
|
+
const importFile = file;
|
|
441
|
+
const importName = `${importFile.replace(/\W+/g, "_")}_${crc3(importFile)}`;
|
|
392
442
|
return {
|
|
393
443
|
name,
|
|
394
444
|
folder,
|
|
395
445
|
file,
|
|
396
446
|
fileFullpath,
|
|
397
447
|
pathTokens,
|
|
398
|
-
|
|
448
|
+
importFile,
|
|
399
449
|
importName
|
|
400
450
|
};
|
|
401
451
|
};
|
|
402
|
-
var
|
|
452
|
+
var pageLayoutResolverFactory = () => {
|
|
453
|
+
return (entry) => {
|
|
454
|
+
const { name } = entry;
|
|
455
|
+
const handler = async () => {
|
|
456
|
+
return {
|
|
457
|
+
kind: "pageLayout",
|
|
458
|
+
entry
|
|
459
|
+
};
|
|
460
|
+
};
|
|
461
|
+
return { name, handler };
|
|
462
|
+
};
|
|
463
|
+
};
|
|
464
|
+
var pageRouteResolverFactory = () => {
|
|
465
|
+
return (entry) => {
|
|
466
|
+
const {
|
|
467
|
+
name,
|
|
468
|
+
folder,
|
|
469
|
+
file,
|
|
470
|
+
fileFullpath,
|
|
471
|
+
pathTokens,
|
|
472
|
+
importFile,
|
|
473
|
+
importName
|
|
474
|
+
} = entry;
|
|
475
|
+
const handler = async () => {
|
|
476
|
+
const entry2 = {
|
|
477
|
+
name,
|
|
478
|
+
pathTokens,
|
|
479
|
+
params: {
|
|
480
|
+
schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
|
|
481
|
+
},
|
|
482
|
+
folder,
|
|
483
|
+
file,
|
|
484
|
+
fileFullpath,
|
|
485
|
+
importFile,
|
|
486
|
+
importName
|
|
487
|
+
};
|
|
488
|
+
return {
|
|
489
|
+
kind: "pageRoute",
|
|
490
|
+
entry: entry2
|
|
491
|
+
};
|
|
492
|
+
};
|
|
493
|
+
return { name, handler };
|
|
494
|
+
};
|
|
495
|
+
};
|
|
496
|
+
var apiUseResolverFactory = () => {
|
|
497
|
+
return (entry) => {
|
|
498
|
+
const { name } = entry;
|
|
499
|
+
const handler = async () => {
|
|
500
|
+
return {
|
|
501
|
+
kind: "apiUse",
|
|
502
|
+
entry
|
|
503
|
+
};
|
|
504
|
+
};
|
|
505
|
+
return { name, handler };
|
|
506
|
+
};
|
|
507
|
+
};
|
|
508
|
+
var apiRouteResolverFactory = (pluginOptions) => {
|
|
403
509
|
const {
|
|
404
510
|
appRoot,
|
|
405
511
|
sourceFolder,
|
|
@@ -419,206 +525,295 @@ var routes_default = async (pluginOptions) => {
|
|
|
419
525
|
getSourceFile,
|
|
420
526
|
refreshSourceFile
|
|
421
527
|
} = typeResolverFactory(pluginOptions);
|
|
422
|
-
|
|
423
|
-
const
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
} =
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
528
|
+
return (entry) => {
|
|
529
|
+
const {
|
|
530
|
+
name,
|
|
531
|
+
file,
|
|
532
|
+
folder,
|
|
533
|
+
fileFullpath,
|
|
534
|
+
pathTokens,
|
|
535
|
+
importFile,
|
|
536
|
+
importName
|
|
537
|
+
} = entry;
|
|
538
|
+
const handler = async (updatedFile) => {
|
|
539
|
+
const paramsSchema = pathTokens.flatMap((e) => {
|
|
540
|
+
return e.param ? [e.param] : [];
|
|
541
|
+
});
|
|
542
|
+
const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
|
|
543
|
+
const { getCache, persistCache } = cacheFactory(
|
|
544
|
+
{ file, fileFullpath, importName },
|
|
545
|
+
{
|
|
546
|
+
appRoot,
|
|
547
|
+
sourceFolder,
|
|
548
|
+
extraContext: { resolveTypes }
|
|
549
|
+
}
|
|
550
|
+
);
|
|
551
|
+
let cache = await getCache({ validate: true });
|
|
552
|
+
if (!cache) {
|
|
553
|
+
if (updatedFile === fileFullpath) {
|
|
554
|
+
await refreshSourceFile(fileFullpath);
|
|
555
|
+
}
|
|
556
|
+
const {
|
|
557
|
+
typeDeclarations,
|
|
558
|
+
paramsRefinements,
|
|
559
|
+
methods,
|
|
560
|
+
payloadTypes,
|
|
561
|
+
responseTypes,
|
|
562
|
+
referencedFiles = []
|
|
563
|
+
} = await resolveRouteSignature(
|
|
564
|
+
{ importName, fileFullpath, optionalParams },
|
|
445
565
|
{
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
566
|
+
withReferencedFiles: true,
|
|
567
|
+
sourceFile: getSourceFile(fileFullpath),
|
|
568
|
+
relpathResolver(path) {
|
|
569
|
+
return join(sourceFolder, defaults.apiDir, dirname2(file), path);
|
|
570
|
+
}
|
|
449
571
|
}
|
|
450
572
|
);
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
573
|
+
const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
|
|
574
|
+
if (text === "number") {
|
|
575
|
+
const param = paramsSchema.at(index);
|
|
576
|
+
return param ? [param.name] : [];
|
|
455
577
|
}
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
sourceFile: getSourceFile(fileFullpath),
|
|
468
|
-
relpathResolver(path) {
|
|
469
|
-
return join(sourceFolder, defaults.apiDir, dirname2(file), path);
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
);
|
|
473
|
-
const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
|
|
474
|
-
if (text === "number") {
|
|
475
|
-
const param = paramsSchema.at(index);
|
|
476
|
-
return param ? [param.name] : [];
|
|
477
|
-
}
|
|
478
|
-
return [];
|
|
479
|
-
}) : [];
|
|
480
|
-
const typesFile = pathResolver2({ appRoot, sourceFolder }).resolve(
|
|
481
|
-
"apiLibDir",
|
|
482
|
-
importPath,
|
|
483
|
-
"types.ts"
|
|
484
|
-
);
|
|
485
|
-
const params = {
|
|
486
|
-
id: ["ParamsT", crc3(name)].join(""),
|
|
487
|
-
schema: paramsSchema,
|
|
488
|
-
resolvedType: void 0
|
|
489
|
-
};
|
|
490
|
-
const typesFileContent = render(types_default, {
|
|
491
|
-
params,
|
|
492
|
-
paramsSchema: paramsSchema.map((param, index) => {
|
|
493
|
-
return {
|
|
494
|
-
...param,
|
|
495
|
-
refinement: paramsRefinements?.at(index)
|
|
496
|
-
};
|
|
497
|
-
}),
|
|
498
|
-
typeDeclarations,
|
|
499
|
-
payloadTypes,
|
|
500
|
-
responseTypes
|
|
501
|
-
});
|
|
502
|
-
const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
|
|
503
|
-
overrides: [...payloadTypes, ...responseTypes].reduce(
|
|
504
|
-
(map, { id, skipValidation }) => {
|
|
505
|
-
if (skipValidation) {
|
|
506
|
-
map[id] = "never";
|
|
507
|
-
}
|
|
508
|
-
return map;
|
|
509
|
-
},
|
|
510
|
-
{ [refineTypeName]: refineTypeName }
|
|
511
|
-
),
|
|
512
|
-
withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
|
|
513
|
-
formatters
|
|
514
|
-
}) : void 0;
|
|
515
|
-
await renderToFile(
|
|
516
|
-
typesFile,
|
|
517
|
-
resolvedTypes ? resolved_types_default : typesFileContent,
|
|
518
|
-
{ resolvedTypes }
|
|
519
|
-
);
|
|
520
|
-
params.resolvedType = resolvedTypes?.find(
|
|
521
|
-
(e) => e.name === params.id
|
|
522
|
-
);
|
|
523
|
-
cache = await persistCache({
|
|
524
|
-
params,
|
|
525
|
-
methods,
|
|
526
|
-
typeDeclarations,
|
|
527
|
-
numericParams,
|
|
528
|
-
// text was needed at writing types.ts file, dropping from cache
|
|
529
|
-
payloadTypes: payloadTypes.map(({ text, ...rest }) => {
|
|
530
|
-
return {
|
|
531
|
-
...rest,
|
|
532
|
-
resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
|
|
533
|
-
};
|
|
534
|
-
}),
|
|
535
|
-
responseTypes: responseTypes.map(({ text, ...rest }) => {
|
|
536
|
-
return {
|
|
537
|
-
...rest,
|
|
538
|
-
resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
|
|
539
|
-
};
|
|
540
|
-
}),
|
|
541
|
-
referencedFiles
|
|
542
|
-
});
|
|
543
|
-
}
|
|
544
|
-
const route = {
|
|
545
|
-
name,
|
|
546
|
-
pathTokens,
|
|
547
|
-
params: cache.params,
|
|
548
|
-
numericParams: cache.numericParams,
|
|
549
|
-
optionalParams,
|
|
550
|
-
importName,
|
|
551
|
-
importPath,
|
|
552
|
-
folder,
|
|
553
|
-
file,
|
|
554
|
-
fileFullpath,
|
|
555
|
-
methods: cache.methods,
|
|
556
|
-
typeDeclarations: cache.typeDeclarations,
|
|
557
|
-
payloadTypes: cache.payloadTypes,
|
|
558
|
-
responseTypes: cache.responseTypes,
|
|
559
|
-
referencedFiles: Object.keys(cache.referencedFiles).map(
|
|
560
|
-
// expand referenced files path,
|
|
561
|
-
// they are stored as relative in cache
|
|
562
|
-
(e) => resolve3(appRoot, e)
|
|
563
|
-
)
|
|
564
|
-
};
|
|
565
|
-
return {
|
|
566
|
-
kind: "api",
|
|
567
|
-
route
|
|
578
|
+
return [];
|
|
579
|
+
}) : [];
|
|
580
|
+
const typesFile = pathResolver2({ appRoot, sourceFolder }).resolve(
|
|
581
|
+
"apiLibDir",
|
|
582
|
+
dirname2(file),
|
|
583
|
+
"types.ts"
|
|
584
|
+
);
|
|
585
|
+
const params = {
|
|
586
|
+
id: ["ParamsT", crc3(name)].join(""),
|
|
587
|
+
schema: paramsSchema,
|
|
588
|
+
resolvedType: void 0
|
|
568
589
|
};
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
590
|
+
const typesFileContent = render(types_default, {
|
|
591
|
+
params,
|
|
592
|
+
paramsSchema: paramsSchema.map((param, index) => {
|
|
593
|
+
return {
|
|
594
|
+
...param,
|
|
595
|
+
refinement: paramsRefinements?.at(index)
|
|
596
|
+
};
|
|
597
|
+
}),
|
|
598
|
+
typeDeclarations,
|
|
599
|
+
payloadTypes,
|
|
600
|
+
responseTypes
|
|
601
|
+
});
|
|
602
|
+
const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
|
|
603
|
+
overrides: [...payloadTypes, ...responseTypes].reduce(
|
|
604
|
+
(map, { id, skipValidation }) => {
|
|
605
|
+
if (skipValidation) {
|
|
606
|
+
map[id] = "never";
|
|
607
|
+
}
|
|
608
|
+
return map;
|
|
609
|
+
},
|
|
610
|
+
{ [refineTypeName]: refineTypeName }
|
|
611
|
+
),
|
|
612
|
+
withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
|
|
613
|
+
formatters
|
|
614
|
+
}) : void 0;
|
|
615
|
+
await renderToFile(
|
|
616
|
+
typesFile,
|
|
617
|
+
resolvedTypes ? resolved_types_default : typesFileContent,
|
|
618
|
+
{ resolvedTypes }
|
|
619
|
+
);
|
|
620
|
+
params.resolvedType = resolvedTypes?.find((e) => e.name === params.id);
|
|
621
|
+
cache = await persistCache({
|
|
622
|
+
params,
|
|
623
|
+
methods,
|
|
624
|
+
typeDeclarations,
|
|
625
|
+
numericParams,
|
|
626
|
+
// text was needed at writing types.ts file, dropping from cache
|
|
627
|
+
payloadTypes: payloadTypes.map(({ text, ...rest }) => {
|
|
628
|
+
return {
|
|
629
|
+
...rest,
|
|
630
|
+
resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
|
|
631
|
+
};
|
|
632
|
+
}),
|
|
633
|
+
responseTypes: responseTypes.map(({ text, ...rest }) => {
|
|
634
|
+
return {
|
|
635
|
+
...rest,
|
|
636
|
+
resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
|
|
637
|
+
};
|
|
638
|
+
}),
|
|
639
|
+
referencedFiles
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
const entry2 = {
|
|
575
643
|
name,
|
|
644
|
+
pathTokens,
|
|
645
|
+
params: cache.params,
|
|
646
|
+
numericParams: cache.numericParams,
|
|
647
|
+
optionalParams,
|
|
648
|
+
importName,
|
|
649
|
+
importFile,
|
|
576
650
|
folder,
|
|
577
651
|
file,
|
|
578
652
|
fileFullpath,
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
|
|
589
|
-
},
|
|
590
|
-
folder,
|
|
591
|
-
file,
|
|
592
|
-
fileFullpath,
|
|
593
|
-
importPath,
|
|
594
|
-
importName
|
|
595
|
-
};
|
|
596
|
-
return {
|
|
597
|
-
kind: "page",
|
|
598
|
-
route
|
|
599
|
-
};
|
|
653
|
+
methods: cache.methods,
|
|
654
|
+
typeDeclarations: cache.typeDeclarations,
|
|
655
|
+
payloadTypes: cache.payloadTypes,
|
|
656
|
+
responseTypes: cache.responseTypes,
|
|
657
|
+
referencedFiles: Object.keys(cache.referencedFiles).map(
|
|
658
|
+
// expand referenced files path,
|
|
659
|
+
// they are stored as relative in cache
|
|
660
|
+
(e) => resolve3(appRoot, e)
|
|
661
|
+
)
|
|
600
662
|
};
|
|
601
|
-
|
|
663
|
+
return {
|
|
664
|
+
kind: "apiRoute",
|
|
665
|
+
entry: entry2
|
|
666
|
+
};
|
|
667
|
+
};
|
|
668
|
+
return { name, handler };
|
|
669
|
+
};
|
|
670
|
+
};
|
|
671
|
+
|
|
672
|
+
// src/base-plugin/routes/nesting.ts
|
|
673
|
+
import { basename } from "node:path";
|
|
674
|
+
import {
|
|
675
|
+
sortRoutes
|
|
676
|
+
} from "@kosmojs/devlib";
|
|
677
|
+
var nestedRoutesFactory = (routeEntries) => {
|
|
678
|
+
const entryStack = structuredClone(routeEntries).sort(sortRoutes);
|
|
679
|
+
const transformEntries = (entries, parent) => {
|
|
680
|
+
return [...new Set(entries.map((e) => e.name))].flatMap((name) => {
|
|
681
|
+
const nameEntries = entryStack.flatMap(({ fileFullpath, ...entry }) => {
|
|
682
|
+
return entry.name === name ? [entry] : [];
|
|
683
|
+
});
|
|
684
|
+
const index = nameEntries.find(
|
|
685
|
+
(e) => basename(e.file).startsWith(PAGE_INDEX_BASENAME)
|
|
686
|
+
);
|
|
687
|
+
const layout = nameEntries.find(
|
|
688
|
+
(e) => basename(e.file).startsWith(PAGE_LAYOUT_BASENAME)
|
|
689
|
+
);
|
|
690
|
+
if (index || layout) {
|
|
691
|
+
return [
|
|
692
|
+
{
|
|
693
|
+
index: index ? {
|
|
694
|
+
...index,
|
|
695
|
+
pathTokens: index.pathTokens.slice(
|
|
696
|
+
parent?.pathTokens.length || 0
|
|
697
|
+
)
|
|
698
|
+
} : void 0,
|
|
699
|
+
layout: layout ? {
|
|
700
|
+
...layout,
|
|
701
|
+
pathTokens: layout.pathTokens.slice(
|
|
702
|
+
parent?.pathTokens.length || 0
|
|
703
|
+
)
|
|
704
|
+
} : void 0,
|
|
705
|
+
parent: parent?.name,
|
|
706
|
+
children: transformEntries(
|
|
707
|
+
findDescendantEntries(index || layout),
|
|
708
|
+
index || layout
|
|
709
|
+
)
|
|
710
|
+
}
|
|
711
|
+
];
|
|
712
|
+
}
|
|
713
|
+
return [];
|
|
714
|
+
});
|
|
715
|
+
};
|
|
716
|
+
const findDescendantEntries = ({
|
|
717
|
+
name,
|
|
718
|
+
pathTokens
|
|
719
|
+
}) => {
|
|
720
|
+
const potentialChildren = entryStack.filter((entry) => {
|
|
721
|
+
if (entry.pathTokens.length <= pathTokens.length) {
|
|
722
|
+
return false;
|
|
723
|
+
}
|
|
724
|
+
if (!entry.name.startsWith(`${name}/`)) {
|
|
725
|
+
return false;
|
|
726
|
+
}
|
|
727
|
+
return true;
|
|
728
|
+
});
|
|
729
|
+
return potentialChildren.filter((child) => {
|
|
730
|
+
const hasIntermediateRoute = potentialChildren.some((intermediate) => {
|
|
731
|
+
if (intermediate === child) {
|
|
732
|
+
return false;
|
|
733
|
+
}
|
|
734
|
+
if (intermediate.pathTokens.length <= pathTokens.length) {
|
|
735
|
+
return false;
|
|
736
|
+
}
|
|
737
|
+
if (intermediate.pathTokens.length >= child.pathTokens.length) {
|
|
738
|
+
return false;
|
|
739
|
+
}
|
|
740
|
+
return child.name.startsWith(`${intermediate.name}/`);
|
|
741
|
+
});
|
|
742
|
+
return !hasIntermediateRoute;
|
|
743
|
+
});
|
|
744
|
+
};
|
|
745
|
+
const rootEntries = entryStack.filter((entry) => {
|
|
746
|
+
const hasParent = entryStack.some((potential) => {
|
|
747
|
+
if (potential === entry) {
|
|
748
|
+
return false;
|
|
749
|
+
}
|
|
750
|
+
if (potential.pathTokens.length >= entry.pathTokens.length) {
|
|
751
|
+
return false;
|
|
752
|
+
}
|
|
753
|
+
return entry.name.startsWith(`${potential.name}/`);
|
|
754
|
+
});
|
|
755
|
+
return !hasParent;
|
|
756
|
+
});
|
|
757
|
+
return transformEntries(rootEntries);
|
|
758
|
+
};
|
|
759
|
+
|
|
760
|
+
// src/base-plugin/routes.ts
|
|
761
|
+
var routes_default = async (pluginOptions) => {
|
|
762
|
+
const { appRoot, sourceFolder } = pluginOptions;
|
|
763
|
+
const apiRouteResolver = apiRouteResolverFactory(pluginOptions);
|
|
764
|
+
const apiUseResolver = apiUseResolverFactory(pluginOptions);
|
|
765
|
+
const pageRouteResolver = pageRouteResolverFactory(pluginOptions);
|
|
766
|
+
const pageLayoutResolver = pageLayoutResolverFactory(pluginOptions);
|
|
767
|
+
const resolversFactory = (routeFiles2) => {
|
|
768
|
+
const resolvers = /* @__PURE__ */ new Map();
|
|
769
|
+
const entries = routeFiles2.flatMap((file) => {
|
|
770
|
+
const entry = createRouteEntry(file, pluginOptions);
|
|
771
|
+
return entry ? [entry] : [];
|
|
772
|
+
});
|
|
773
|
+
for (const entry of entries) {
|
|
774
|
+
if (entry.folder === defaults2.apiDir) {
|
|
775
|
+
if (isApiRoute(entry.file)) {
|
|
776
|
+
resolvers.set(entry.fileFullpath, apiRouteResolver(entry));
|
|
777
|
+
} else if (isApiUse(entry.file)) {
|
|
778
|
+
resolvers.set(entry.fileFullpath, apiUseResolver(entry));
|
|
779
|
+
}
|
|
780
|
+
} else if (entry.folder === defaults2.pagesDir) {
|
|
781
|
+
if (isPageRoute(entry.file)) {
|
|
782
|
+
resolvers.set(entry.fileFullpath, pageRouteResolver(entry));
|
|
783
|
+
} else if (isPageLayout(entry.file)) {
|
|
784
|
+
resolvers.set(entry.fileFullpath, pageLayoutResolver(entry));
|
|
785
|
+
}
|
|
786
|
+
}
|
|
602
787
|
}
|
|
603
788
|
return resolvers;
|
|
604
789
|
};
|
|
605
|
-
const routeFiles = await
|
|
606
|
-
cwd: resolve3(appRoot, sourceFolder),
|
|
607
|
-
absolute: true,
|
|
608
|
-
onlyFiles: true,
|
|
609
|
-
ignore: [
|
|
610
|
-
`${defaults.apiDir}/${API_INDEX_PATTERN}`,
|
|
611
|
-
`${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`
|
|
612
|
-
]
|
|
613
|
-
});
|
|
790
|
+
const routeFiles = await scanRoutes({ appRoot, sourceFolder });
|
|
614
791
|
return {
|
|
615
792
|
resolvers: resolversFactory(routeFiles),
|
|
616
793
|
resolversFactory
|
|
617
794
|
};
|
|
618
795
|
};
|
|
619
796
|
export {
|
|
797
|
+
API_INDEX_BASENAME,
|
|
798
|
+
API_INDEX_PATTERN,
|
|
799
|
+
API_USE_BASENAME,
|
|
800
|
+
API_USE_PATTERN,
|
|
801
|
+
PAGE_INDEX_BASENAME,
|
|
802
|
+
PAGE_INDEX_PATTERN,
|
|
803
|
+
PAGE_LAYOUT_BASENAME,
|
|
804
|
+
PAGE_LAYOUT_PATTERN,
|
|
805
|
+
apiRouteResolverFactory,
|
|
806
|
+
apiUseResolverFactory,
|
|
807
|
+
createRouteEntry,
|
|
620
808
|
routes_default as default,
|
|
621
|
-
|
|
622
|
-
|
|
809
|
+
isApiRoute,
|
|
810
|
+
isApiUse,
|
|
811
|
+
isPageLayout,
|
|
812
|
+
isPageRoute,
|
|
813
|
+
isRouteFile,
|
|
814
|
+
nestedRoutesFactory,
|
|
815
|
+
pageLayoutResolverFactory,
|
|
816
|
+
pageRouteResolverFactory,
|
|
817
|
+
scanRoutes
|
|
623
818
|
};
|
|
624
819
|
//# sourceMappingURL=routes.js.map
|