@kosmojs/dev 0.0.8 → 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 +6 -6
- package/pkg/base-plugin/routes.js +359 -196
- package/pkg/base-plugin/routes.js.map +4 -4
- package/pkg/base-plugin/worker.js +272 -208
- package/pkg/base-plugin/worker.js.map +4 -4
- package/pkg/index.js +262 -198
- 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 -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
|
@@ -7,6 +7,11 @@ import {
|
|
|
7
7
|
} from "@kosmojs/devlib";
|
|
8
8
|
|
|
9
9
|
// src/base-plugin/routes.ts
|
|
10
|
+
import {
|
|
11
|
+
defaults as defaults2
|
|
12
|
+
} from "@kosmojs/devlib";
|
|
13
|
+
|
|
14
|
+
// src/base-plugin/routes/resolve.ts
|
|
10
15
|
import { dirname as dirname2, join, resolve as resolve3 } from "node:path";
|
|
11
16
|
import crc3 from "crc/crc32";
|
|
12
17
|
import picomatch from "picomatch";
|
|
@@ -288,7 +293,7 @@ var cacheFactory = (route, {
|
|
|
288
293
|
const cacheFile = pathResolver({
|
|
289
294
|
appRoot: appRoot2,
|
|
290
295
|
sourceFolder: sourceFolder2
|
|
291
|
-
}).resolve("apiLibDir", route.
|
|
296
|
+
}).resolve("apiLibDir", dirname(route.file), "cache.json");
|
|
292
297
|
const getCache = async (opt) => {
|
|
293
298
|
if (await pathExists(cacheFile)) {
|
|
294
299
|
try {
|
|
@@ -369,22 +374,56 @@ var resolved_types_default = "{{#each resolvedTypes}}\nexport type {{name}} = {{
|
|
|
369
374
|
// src/base-plugin/templates/types.hbs
|
|
370
375
|
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';
|
|
371
376
|
|
|
372
|
-
// src/base-plugin/routes.ts
|
|
373
|
-
var
|
|
374
|
-
var
|
|
377
|
+
// src/base-plugin/routes/resolve.ts
|
|
378
|
+
var API_INDEX_BASENAME = "index";
|
|
379
|
+
var API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;
|
|
380
|
+
var PAGE_INDEX_BASENAME = "index";
|
|
381
|
+
var PAGE_INDEX_PATTERN = `${PAGE_INDEX_BASENAME}.{tsx,vue}`;
|
|
382
|
+
var PAGE_LAYOUT_BASENAME = "layout";
|
|
383
|
+
var PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue}`;
|
|
375
384
|
var ROUTE_FILE_PATTERNS = [
|
|
385
|
+
// match index files in api dir
|
|
376
386
|
`${defaults.apiDir}/**/${API_INDEX_PATTERN}`,
|
|
377
|
-
|
|
387
|
+
// match index files in pages dir
|
|
388
|
+
`${defaults.pagesDir}/**/${PAGE_INDEX_PATTERN}`,
|
|
389
|
+
// match layout files in pages dir
|
|
390
|
+
`${defaults.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`
|
|
378
391
|
];
|
|
379
|
-
var
|
|
392
|
+
var scanRoutes = async ({
|
|
393
|
+
appRoot: appRoot2,
|
|
394
|
+
sourceFolder: sourceFolder2
|
|
395
|
+
}) => {
|
|
396
|
+
return glob(ROUTE_FILE_PATTERNS, {
|
|
397
|
+
cwd: resolve3(appRoot2, sourceFolder2),
|
|
398
|
+
absolute: true,
|
|
399
|
+
onlyFiles: true,
|
|
400
|
+
followSymbolicLinks: false,
|
|
401
|
+
ignore: [
|
|
402
|
+
// ignore top-level matches, routes resides in folders, even index route
|
|
403
|
+
`${defaults.apiDir}/${API_INDEX_PATTERN}`,
|
|
404
|
+
`${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`,
|
|
405
|
+
`${defaults.pagesDir}/${PAGE_LAYOUT_PATTERN}`
|
|
406
|
+
]
|
|
407
|
+
});
|
|
408
|
+
};
|
|
409
|
+
var isRouteFile = (file, {
|
|
410
|
+
appRoot: appRoot2,
|
|
411
|
+
sourceFolder: sourceFolder2
|
|
412
|
+
}) => {
|
|
380
413
|
const [_sourceFolder, folder, ...rest] = resolve3(appRoot2, file).replace(`${appRoot2}/`, "").split("/");
|
|
381
414
|
if (!folder || _sourceFolder !== sourceFolder2 || rest.length < 2) {
|
|
382
415
|
return;
|
|
383
416
|
}
|
|
384
417
|
return picomatch.isMatch(join(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : void 0;
|
|
385
418
|
};
|
|
386
|
-
var
|
|
387
|
-
|
|
419
|
+
var isPageFile = (file) => {
|
|
420
|
+
return picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`) ? { kind: "index" } : picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`) ? { kind: "layout" } : void 0;
|
|
421
|
+
};
|
|
422
|
+
var createRouteEntry = (_file, {
|
|
423
|
+
appRoot: appRoot2,
|
|
424
|
+
sourceFolder: sourceFolder2
|
|
425
|
+
}) => {
|
|
426
|
+
const resolvedPaths = isRouteFile(_file, { appRoot: appRoot2, sourceFolder: sourceFolder2 });
|
|
388
427
|
if (!resolvedPaths) {
|
|
389
428
|
return;
|
|
390
429
|
}
|
|
@@ -392,22 +431,63 @@ var resolveRouteEntry = (_file, { appRoot: appRoot2, sourceFolder: sourceFolder2
|
|
|
392
431
|
const fileFullpath = join(appRoot2, sourceFolder2, folder, file);
|
|
393
432
|
const pathTokens = pathTokensFactory(dirname2(file));
|
|
394
433
|
const name = pathTokens.map((e) => e.orig).join("/");
|
|
395
|
-
const
|
|
396
|
-
const importName =
|
|
397
|
-
importPath.split(/\[/)[0].replace(/^\W+|\W+$/g, "").replace(/\W+/g, "_"),
|
|
398
|
-
crc3(importPath)
|
|
399
|
-
].join("_");
|
|
434
|
+
const importFile = file;
|
|
435
|
+
const importName = `${importFile.replace(/\W+/g, "_")}_${crc3(importFile)}`;
|
|
400
436
|
return {
|
|
401
437
|
name,
|
|
402
438
|
folder,
|
|
403
439
|
file,
|
|
404
440
|
fileFullpath,
|
|
405
441
|
pathTokens,
|
|
406
|
-
|
|
442
|
+
importFile,
|
|
407
443
|
importName
|
|
408
444
|
};
|
|
409
445
|
};
|
|
410
|
-
var
|
|
446
|
+
var pageLayoutResolverFactory = () => {
|
|
447
|
+
return (entry) => {
|
|
448
|
+
const { name } = entry;
|
|
449
|
+
const handler = async () => {
|
|
450
|
+
return {
|
|
451
|
+
kind: "pageLayout",
|
|
452
|
+
entry
|
|
453
|
+
};
|
|
454
|
+
};
|
|
455
|
+
return { name, handler };
|
|
456
|
+
};
|
|
457
|
+
};
|
|
458
|
+
var pageRouteResolverFactory = () => {
|
|
459
|
+
return (entry) => {
|
|
460
|
+
const {
|
|
461
|
+
name,
|
|
462
|
+
folder,
|
|
463
|
+
file,
|
|
464
|
+
fileFullpath,
|
|
465
|
+
pathTokens,
|
|
466
|
+
importFile,
|
|
467
|
+
importName
|
|
468
|
+
} = entry;
|
|
469
|
+
const handler = async () => {
|
|
470
|
+
const entry2 = {
|
|
471
|
+
name,
|
|
472
|
+
pathTokens,
|
|
473
|
+
params: {
|
|
474
|
+
schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
|
|
475
|
+
},
|
|
476
|
+
folder,
|
|
477
|
+
file,
|
|
478
|
+
fileFullpath,
|
|
479
|
+
importFile,
|
|
480
|
+
importName
|
|
481
|
+
};
|
|
482
|
+
return {
|
|
483
|
+
kind: "pageRoute",
|
|
484
|
+
entry: entry2
|
|
485
|
+
};
|
|
486
|
+
};
|
|
487
|
+
return { name, handler };
|
|
488
|
+
};
|
|
489
|
+
};
|
|
490
|
+
var apiRouteResolverFactory = (pluginOptions) => {
|
|
411
491
|
const {
|
|
412
492
|
appRoot: appRoot2,
|
|
413
493
|
sourceFolder: sourceFolder2,
|
|
@@ -427,198 +507,182 @@ var routes_default = async (pluginOptions) => {
|
|
|
427
507
|
getSourceFile,
|
|
428
508
|
refreshSourceFile
|
|
429
509
|
} = typeResolverFactory(pluginOptions);
|
|
430
|
-
|
|
431
|
-
const
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
} =
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
510
|
+
return (entry) => {
|
|
511
|
+
const {
|
|
512
|
+
name,
|
|
513
|
+
file,
|
|
514
|
+
folder,
|
|
515
|
+
fileFullpath,
|
|
516
|
+
pathTokens,
|
|
517
|
+
importFile,
|
|
518
|
+
importName
|
|
519
|
+
} = entry;
|
|
520
|
+
const handler = async (updatedFile) => {
|
|
521
|
+
const paramsSchema = pathTokens.flatMap((e) => {
|
|
522
|
+
return e.param ? [e.param] : [];
|
|
523
|
+
});
|
|
524
|
+
const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
|
|
525
|
+
const { getCache, persistCache } = cacheFactory(
|
|
526
|
+
{ file, fileFullpath, importName },
|
|
527
|
+
{
|
|
528
|
+
appRoot: appRoot2,
|
|
529
|
+
sourceFolder: sourceFolder2,
|
|
530
|
+
extraContext: { resolveTypes }
|
|
531
|
+
}
|
|
532
|
+
);
|
|
533
|
+
let cache = await getCache({ validate: true });
|
|
534
|
+
if (!cache) {
|
|
535
|
+
if (updatedFile === fileFullpath) {
|
|
536
|
+
await refreshSourceFile(fileFullpath);
|
|
537
|
+
}
|
|
538
|
+
const {
|
|
539
|
+
typeDeclarations,
|
|
540
|
+
paramsRefinements,
|
|
541
|
+
methods,
|
|
542
|
+
payloadTypes,
|
|
543
|
+
responseTypes,
|
|
544
|
+
referencedFiles = []
|
|
545
|
+
} = await resolveRouteSignature(
|
|
546
|
+
{ importName, fileFullpath, optionalParams },
|
|
453
547
|
{
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
548
|
+
withReferencedFiles: true,
|
|
549
|
+
sourceFile: getSourceFile(fileFullpath),
|
|
550
|
+
relpathResolver(path) {
|
|
551
|
+
return join(sourceFolder2, defaults.apiDir, dirname2(file), path);
|
|
552
|
+
}
|
|
457
553
|
}
|
|
458
554
|
);
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
555
|
+
const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
|
|
556
|
+
if (text === "number") {
|
|
557
|
+
const param = paramsSchema.at(index);
|
|
558
|
+
return param ? [param.name] : [];
|
|
463
559
|
}
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
sourceFile: getSourceFile(fileFullpath),
|
|
476
|
-
relpathResolver(path) {
|
|
477
|
-
return join(sourceFolder2, defaults.apiDir, dirname2(file), path);
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
);
|
|
481
|
-
const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
|
|
482
|
-
if (text === "number") {
|
|
483
|
-
const param = paramsSchema.at(index);
|
|
484
|
-
return param ? [param.name] : [];
|
|
485
|
-
}
|
|
486
|
-
return [];
|
|
487
|
-
}) : [];
|
|
488
|
-
const typesFile = pathResolver2({ appRoot: appRoot2, sourceFolder: sourceFolder2 }).resolve(
|
|
489
|
-
"apiLibDir",
|
|
490
|
-
importPath,
|
|
491
|
-
"types.ts"
|
|
492
|
-
);
|
|
493
|
-
const params = {
|
|
494
|
-
id: ["ParamsT", crc3(name)].join(""),
|
|
495
|
-
schema: paramsSchema,
|
|
496
|
-
resolvedType: void 0
|
|
497
|
-
};
|
|
498
|
-
const typesFileContent = render(types_default, {
|
|
499
|
-
params,
|
|
500
|
-
paramsSchema: paramsSchema.map((param, index) => {
|
|
501
|
-
return {
|
|
502
|
-
...param,
|
|
503
|
-
refinement: paramsRefinements?.at(index)
|
|
504
|
-
};
|
|
505
|
-
}),
|
|
506
|
-
typeDeclarations,
|
|
507
|
-
payloadTypes,
|
|
508
|
-
responseTypes
|
|
509
|
-
});
|
|
510
|
-
const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
|
|
511
|
-
overrides: [...payloadTypes, ...responseTypes].reduce(
|
|
512
|
-
(map, { id, skipValidation }) => {
|
|
513
|
-
if (skipValidation) {
|
|
514
|
-
map[id] = "never";
|
|
515
|
-
}
|
|
516
|
-
return map;
|
|
517
|
-
},
|
|
518
|
-
{ [refineTypeName]: refineTypeName }
|
|
519
|
-
),
|
|
520
|
-
withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
|
|
521
|
-
formatters: formatters2
|
|
522
|
-
}) : void 0;
|
|
523
|
-
await renderToFile(
|
|
524
|
-
typesFile,
|
|
525
|
-
resolvedTypes ? resolved_types_default : typesFileContent,
|
|
526
|
-
{ resolvedTypes }
|
|
527
|
-
);
|
|
528
|
-
params.resolvedType = resolvedTypes?.find(
|
|
529
|
-
(e) => e.name === params.id
|
|
530
|
-
);
|
|
531
|
-
cache = await persistCache({
|
|
532
|
-
params,
|
|
533
|
-
methods,
|
|
534
|
-
typeDeclarations,
|
|
535
|
-
numericParams,
|
|
536
|
-
// text was needed at writing types.ts file, dropping from cache
|
|
537
|
-
payloadTypes: payloadTypes.map(({ text, ...rest }) => {
|
|
538
|
-
return {
|
|
539
|
-
...rest,
|
|
540
|
-
resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
|
|
541
|
-
};
|
|
542
|
-
}),
|
|
543
|
-
responseTypes: responseTypes.map(({ text, ...rest }) => {
|
|
544
|
-
return {
|
|
545
|
-
...rest,
|
|
546
|
-
resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
|
|
547
|
-
};
|
|
548
|
-
}),
|
|
549
|
-
referencedFiles
|
|
550
|
-
});
|
|
551
|
-
}
|
|
552
|
-
const route = {
|
|
553
|
-
name,
|
|
554
|
-
pathTokens,
|
|
555
|
-
params: cache.params,
|
|
556
|
-
numericParams: cache.numericParams,
|
|
557
|
-
optionalParams,
|
|
558
|
-
importName,
|
|
559
|
-
importPath,
|
|
560
|
-
folder,
|
|
561
|
-
file,
|
|
562
|
-
fileFullpath,
|
|
563
|
-
methods: cache.methods,
|
|
564
|
-
typeDeclarations: cache.typeDeclarations,
|
|
565
|
-
payloadTypes: cache.payloadTypes,
|
|
566
|
-
responseTypes: cache.responseTypes,
|
|
567
|
-
referencedFiles: Object.keys(cache.referencedFiles).map(
|
|
568
|
-
// expand referenced files path,
|
|
569
|
-
// they are stored as relative in cache
|
|
570
|
-
(e) => resolve3(appRoot2, e)
|
|
571
|
-
)
|
|
572
|
-
};
|
|
573
|
-
return {
|
|
574
|
-
kind: "api",
|
|
575
|
-
route
|
|
560
|
+
return [];
|
|
561
|
+
}) : [];
|
|
562
|
+
const typesFile = pathResolver2({ appRoot: appRoot2, sourceFolder: sourceFolder2 }).resolve(
|
|
563
|
+
"apiLibDir",
|
|
564
|
+
dirname2(file),
|
|
565
|
+
"types.ts"
|
|
566
|
+
);
|
|
567
|
+
const params = {
|
|
568
|
+
id: ["ParamsT", crc3(name)].join(""),
|
|
569
|
+
schema: paramsSchema,
|
|
570
|
+
resolvedType: void 0
|
|
576
571
|
};
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
572
|
+
const typesFileContent = render(types_default, {
|
|
573
|
+
params,
|
|
574
|
+
paramsSchema: paramsSchema.map((param, index) => {
|
|
575
|
+
return {
|
|
576
|
+
...param,
|
|
577
|
+
refinement: paramsRefinements?.at(index)
|
|
578
|
+
};
|
|
579
|
+
}),
|
|
580
|
+
typeDeclarations,
|
|
581
|
+
payloadTypes,
|
|
582
|
+
responseTypes
|
|
583
|
+
});
|
|
584
|
+
const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
|
|
585
|
+
overrides: [...payloadTypes, ...responseTypes].reduce(
|
|
586
|
+
(map, { id, skipValidation }) => {
|
|
587
|
+
if (skipValidation) {
|
|
588
|
+
map[id] = "never";
|
|
589
|
+
}
|
|
590
|
+
return map;
|
|
591
|
+
},
|
|
592
|
+
{ [refineTypeName]: refineTypeName }
|
|
593
|
+
),
|
|
594
|
+
withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
|
|
595
|
+
formatters: formatters2
|
|
596
|
+
}) : void 0;
|
|
597
|
+
await renderToFile(
|
|
598
|
+
typesFile,
|
|
599
|
+
resolvedTypes ? resolved_types_default : typesFileContent,
|
|
600
|
+
{ resolvedTypes }
|
|
601
|
+
);
|
|
602
|
+
params.resolvedType = resolvedTypes?.find((e) => e.name === params.id);
|
|
603
|
+
cache = await persistCache({
|
|
604
|
+
params,
|
|
605
|
+
methods,
|
|
606
|
+
typeDeclarations,
|
|
607
|
+
numericParams,
|
|
608
|
+
// text was needed at writing types.ts file, dropping from cache
|
|
609
|
+
payloadTypes: payloadTypes.map(({ text, ...rest }) => {
|
|
610
|
+
return {
|
|
611
|
+
...rest,
|
|
612
|
+
resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
|
|
613
|
+
};
|
|
614
|
+
}),
|
|
615
|
+
responseTypes: responseTypes.map(({ text, ...rest }) => {
|
|
616
|
+
return {
|
|
617
|
+
...rest,
|
|
618
|
+
resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
|
|
619
|
+
};
|
|
620
|
+
}),
|
|
621
|
+
referencedFiles
|
|
622
|
+
});
|
|
623
|
+
}
|
|
624
|
+
const entry2 = {
|
|
583
625
|
name,
|
|
626
|
+
pathTokens,
|
|
627
|
+
params: cache.params,
|
|
628
|
+
numericParams: cache.numericParams,
|
|
629
|
+
optionalParams,
|
|
630
|
+
importName,
|
|
631
|
+
importFile,
|
|
584
632
|
folder,
|
|
585
633
|
file,
|
|
586
634
|
fileFullpath,
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
|
|
597
|
-
},
|
|
598
|
-
folder,
|
|
599
|
-
file,
|
|
600
|
-
fileFullpath,
|
|
601
|
-
importPath,
|
|
602
|
-
importName
|
|
603
|
-
};
|
|
604
|
-
return {
|
|
605
|
-
kind: "page",
|
|
606
|
-
route
|
|
607
|
-
};
|
|
635
|
+
methods: cache.methods,
|
|
636
|
+
typeDeclarations: cache.typeDeclarations,
|
|
637
|
+
payloadTypes: cache.payloadTypes,
|
|
638
|
+
responseTypes: cache.responseTypes,
|
|
639
|
+
referencedFiles: Object.keys(cache.referencedFiles).map(
|
|
640
|
+
// expand referenced files path,
|
|
641
|
+
// they are stored as relative in cache
|
|
642
|
+
(e) => resolve3(appRoot2, e)
|
|
643
|
+
)
|
|
608
644
|
};
|
|
609
|
-
|
|
645
|
+
return {
|
|
646
|
+
kind: "apiRoute",
|
|
647
|
+
entry: entry2
|
|
648
|
+
};
|
|
649
|
+
};
|
|
650
|
+
return { name, handler };
|
|
651
|
+
};
|
|
652
|
+
};
|
|
653
|
+
|
|
654
|
+
// src/base-plugin/routes/nesting.ts
|
|
655
|
+
import {
|
|
656
|
+
sortRoutes
|
|
657
|
+
} from "@kosmojs/devlib";
|
|
658
|
+
|
|
659
|
+
// src/base-plugin/routes.ts
|
|
660
|
+
var routes_default = async (pluginOptions) => {
|
|
661
|
+
const { appRoot: appRoot2, sourceFolder: sourceFolder2 } = pluginOptions;
|
|
662
|
+
const apiRouteResolver = apiRouteResolverFactory(pluginOptions);
|
|
663
|
+
const pageRouteResolver = pageRouteResolverFactory(pluginOptions);
|
|
664
|
+
const pageLayoutResolver = pageLayoutResolverFactory(pluginOptions);
|
|
665
|
+
const resolversFactory2 = (routeFiles2) => {
|
|
666
|
+
const resolvers2 = /* @__PURE__ */ new Map();
|
|
667
|
+
const entries = routeFiles2.flatMap((file) => {
|
|
668
|
+
const entry = createRouteEntry(file, pluginOptions);
|
|
669
|
+
return entry ? [entry] : [];
|
|
670
|
+
});
|
|
671
|
+
for (const entry of entries) {
|
|
672
|
+
if (entry.folder === defaults2.apiDir) {
|
|
673
|
+
resolvers2.set(entry.fileFullpath, apiRouteResolver(entry));
|
|
674
|
+
} else if (entry.folder === defaults2.pagesDir) {
|
|
675
|
+
const pageFile = isPageFile(entry.file);
|
|
676
|
+
if (pageFile?.kind === "index") {
|
|
677
|
+
resolvers2.set(entry.fileFullpath, pageRouteResolver(entry));
|
|
678
|
+
} else if (pageFile?.kind === "layout") {
|
|
679
|
+
resolvers2.set(entry.fileFullpath, pageLayoutResolver(entry));
|
|
680
|
+
}
|
|
681
|
+
}
|
|
610
682
|
}
|
|
611
683
|
return resolvers2;
|
|
612
684
|
};
|
|
613
|
-
const routeFiles = await
|
|
614
|
-
cwd: resolve3(appRoot2, sourceFolder2),
|
|
615
|
-
absolute: true,
|
|
616
|
-
onlyFiles: true,
|
|
617
|
-
ignore: [
|
|
618
|
-
`${defaults.apiDir}/${API_INDEX_PATTERN}`,
|
|
619
|
-
`${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`
|
|
620
|
-
]
|
|
621
|
-
});
|
|
685
|
+
const routeFiles = await scanRoutes({ appRoot: appRoot2, sourceFolder: sourceFolder2 });
|
|
622
686
|
return {
|
|
623
687
|
resolvers: resolversFactory2(routeFiles),
|
|
624
688
|
resolversFactory: resolversFactory2
|
|
@@ -647,7 +711,7 @@ var resolvedOptions = {
|
|
|
647
711
|
};
|
|
648
712
|
var { appRoot, sourceFolder } = resolvedOptions;
|
|
649
713
|
var watchHandlers = [];
|
|
650
|
-
var
|
|
714
|
+
var resolvedEntries = /* @__PURE__ */ new Map();
|
|
651
715
|
var { resolvers, resolversFactory } = await routes_default(resolvedOptions);
|
|
652
716
|
var { resolve: resolve4 } = pathResolver3({ appRoot, sourceFolder });
|
|
653
717
|
var spinnerFactory = (startText) => {
|
|
@@ -682,9 +746,9 @@ var createEventHandler = async (file) => {
|
|
|
682
746
|
if (resolver) {
|
|
683
747
|
const spinner = spinnerFactory(`Resolving ${resolver.name} Route`);
|
|
684
748
|
try {
|
|
685
|
-
const
|
|
749
|
+
const resolvedEntry = await resolver.handler();
|
|
686
750
|
resolvers.set(file, resolver);
|
|
687
|
-
|
|
751
|
+
resolvedEntries.set(resolvedEntry.entry.fileFullpath, resolvedEntry);
|
|
688
752
|
spinner.succeed();
|
|
689
753
|
} catch (error) {
|
|
690
754
|
spinner.failed(error);
|
|
@@ -693,16 +757,16 @@ var createEventHandler = async (file) => {
|
|
|
693
757
|
};
|
|
694
758
|
var updateEventHandler = async (file) => {
|
|
695
759
|
const relatedResolvers = /* @__PURE__ */ new Map();
|
|
696
|
-
if (
|
|
760
|
+
if (resolvedEntries.has(file)) {
|
|
697
761
|
const resolver = resolvers.get(file);
|
|
698
762
|
if (resolver) {
|
|
699
763
|
relatedResolvers.set(file, resolver);
|
|
700
764
|
}
|
|
701
765
|
} else {
|
|
702
|
-
const referencedRoutes =
|
|
703
|
-
return kind === "
|
|
766
|
+
const referencedRoutes = resolvedEntries.values().flatMap(({ kind, entry }) => {
|
|
767
|
+
return kind === "apiRoute" ? entry.referencedFiles.includes(file) ? [entry] : [] : [];
|
|
704
768
|
});
|
|
705
|
-
for (const
|
|
769
|
+
for (const route of referencedRoutes) {
|
|
706
770
|
const resolver = resolvers.get(route.fileFullpath);
|
|
707
771
|
if (resolver) {
|
|
708
772
|
relatedResolvers.set(route.fileFullpath, resolver);
|
|
@@ -713,8 +777,8 @@ var updateEventHandler = async (file) => {
|
|
|
713
777
|
for (const resolver of relatedResolvers.values()) {
|
|
714
778
|
spinner.append(resolver.name);
|
|
715
779
|
try {
|
|
716
|
-
const
|
|
717
|
-
|
|
780
|
+
const resolvedEntry = await resolver.handler(file);
|
|
781
|
+
resolvedEntries.set(resolvedEntry.entry.fileFullpath, resolvedEntry);
|
|
718
782
|
} catch (error) {
|
|
719
783
|
spinner.failed(error);
|
|
720
784
|
spinner = spinnerFactory(`Updating ${relatedResolvers.size} Routes`);
|
|
@@ -726,11 +790,11 @@ var deleteEventHandler = async () => {
|
|
|
726
790
|
};
|
|
727
791
|
var runWatchHandlers = async (event) => {
|
|
728
792
|
let spinner = spinnerFactory("Running Generators");
|
|
729
|
-
const
|
|
793
|
+
const entries = Array.from(resolvedEntries.values());
|
|
730
794
|
for (const { name, handler } of watchHandlers) {
|
|
731
795
|
spinner.append(name);
|
|
732
796
|
try {
|
|
733
|
-
await handler(structuredClone(
|
|
797
|
+
await handler(structuredClone(entries), event);
|
|
734
798
|
} catch (error) {
|
|
735
799
|
spinner.failed(error);
|
|
736
800
|
spinner = spinnerFactory("Running Generators");
|
|
@@ -760,7 +824,7 @@ watcher.on("all", async (event, file) => {
|
|
|
760
824
|
if (event.endsWith("Dir")) {
|
|
761
825
|
return;
|
|
762
826
|
}
|
|
763
|
-
if (!
|
|
827
|
+
if (!isRouteFile(file, { appRoot, sourceFolder })) {
|
|
764
828
|
return;
|
|
765
829
|
}
|
|
766
830
|
const match = {
|
|
@@ -778,11 +842,11 @@ watcher.on("all", async (event, file) => {
|
|
|
778
842
|
let spinner = spinnerFactory("Resolving Routes");
|
|
779
843
|
for (const { name, handler } of resolvers.values()) {
|
|
780
844
|
spinner.append(
|
|
781
|
-
`[ ${
|
|
845
|
+
`[ ${resolvedEntries.size + 1} of ${resolvers.size} ] ${name}`
|
|
782
846
|
);
|
|
783
847
|
try {
|
|
784
848
|
const resolvedEntry = await handler();
|
|
785
|
-
|
|
849
|
+
resolvedEntries.set(resolvedEntry.entry.fileFullpath, resolvedEntry);
|
|
786
850
|
} catch (error) {
|
|
787
851
|
spinner.failed(error);
|
|
788
852
|
spinner = spinnerFactory("Resolving Routes");
|