@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
|
@@ -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,8 +374,120 @@ 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
|
|
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}`;
|
|
384
|
+
var ROUTE_FILE_PATTERNS = [
|
|
385
|
+
// match index files in api dir
|
|
386
|
+
`${defaults.apiDir}/**/${API_INDEX_PATTERN}`,
|
|
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}`
|
|
391
|
+
];
|
|
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
|
+
}) => {
|
|
413
|
+
const [_sourceFolder, folder, ...rest] = resolve3(appRoot2, file).replace(`${appRoot2}/`, "").split("/");
|
|
414
|
+
if (!folder || _sourceFolder !== sourceFolder2 || rest.length < 2) {
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
return picomatch.isMatch(join(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : void 0;
|
|
418
|
+
};
|
|
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 });
|
|
427
|
+
if (!resolvedPaths) {
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
const [folder, file] = resolvedPaths;
|
|
431
|
+
const fileFullpath = join(appRoot2, sourceFolder2, folder, file);
|
|
432
|
+
const pathTokens = pathTokensFactory(dirname2(file));
|
|
433
|
+
const name = pathTokens.map((e) => e.orig).join("/");
|
|
434
|
+
const importFile = file;
|
|
435
|
+
const importName = `${importFile.replace(/\W+/g, "_")}_${crc3(importFile)}`;
|
|
436
|
+
return {
|
|
437
|
+
name,
|
|
438
|
+
folder,
|
|
439
|
+
file,
|
|
440
|
+
fileFullpath,
|
|
441
|
+
pathTokens,
|
|
442
|
+
importFile,
|
|
443
|
+
importName
|
|
444
|
+
};
|
|
445
|
+
};
|
|
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) => {
|
|
374
491
|
const {
|
|
375
492
|
appRoot: appRoot2,
|
|
376
493
|
sourceFolder: sourceFolder2,
|
|
@@ -390,235 +507,185 @@ var routes_default = async (pluginOptions) => {
|
|
|
390
507
|
getSourceFile,
|
|
391
508
|
refreshSourceFile
|
|
392
509
|
} = typeResolverFactory(pluginOptions);
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
const
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
}
|
|
411
|
-
const [folder, file] = resolvedPaths;
|
|
412
|
-
const fileFullpath = join(appRoot2, sourceFolder2, folder, file);
|
|
413
|
-
const pathTokens = pathTokensFactory(dirname2(file));
|
|
414
|
-
const name = pathTokens.map((e) => e.orig).join("/");
|
|
415
|
-
const importPath = dirname2(file);
|
|
416
|
-
const importName = [
|
|
417
|
-
importPath.split(/\[/)[0].replace(/^\W+|\W+$/g, "").replace(/\W+/g, "_"),
|
|
418
|
-
crc3(importPath)
|
|
419
|
-
].join("_");
|
|
420
|
-
return [
|
|
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 },
|
|
421
527
|
{
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
fileFullpath,
|
|
426
|
-
pathTokens,
|
|
427
|
-
importPath,
|
|
428
|
-
importName
|
|
528
|
+
appRoot: appRoot2,
|
|
529
|
+
sourceFolder: sourceFolder2,
|
|
530
|
+
extraContext: { resolveTypes }
|
|
429
531
|
}
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
});
|
|
446
|
-
const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
|
|
447
|
-
const { getCache, persistCache } = cacheFactory(
|
|
448
|
-
{ file, fileFullpath, importName, importPath },
|
|
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 },
|
|
449
547
|
{
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
548
|
+
withReferencedFiles: true,
|
|
549
|
+
sourceFile: getSourceFile(fileFullpath),
|
|
550
|
+
relpathResolver(path) {
|
|
551
|
+
return join(sourceFolder2, defaults.apiDir, dirname2(file), path);
|
|
552
|
+
}
|
|
453
553
|
}
|
|
454
554
|
);
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
555
|
+
const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
|
|
556
|
+
if (text === "number") {
|
|
557
|
+
const param = paramsSchema.at(index);
|
|
558
|
+
return param ? [param.name] : [];
|
|
459
559
|
}
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
sourceFile: getSourceFile(fileFullpath),
|
|
472
|
-
relpathResolver(path) {
|
|
473
|
-
return join(sourceFolder2, defaults.apiDir, dirname2(file), path);
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
);
|
|
477
|
-
const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
|
|
478
|
-
if (text === "number") {
|
|
479
|
-
const param = paramsSchema.at(index);
|
|
480
|
-
return param ? [param.name] : [];
|
|
481
|
-
}
|
|
482
|
-
return [];
|
|
483
|
-
}) : [];
|
|
484
|
-
const typesFile = pathResolver2({ appRoot: appRoot2, sourceFolder: sourceFolder2 }).resolve(
|
|
485
|
-
"apiLibDir",
|
|
486
|
-
importPath,
|
|
487
|
-
"types.ts"
|
|
488
|
-
);
|
|
489
|
-
const params = {
|
|
490
|
-
id: ["ParamsT", crc3(name)].join(""),
|
|
491
|
-
schema: paramsSchema,
|
|
492
|
-
resolvedType: void 0
|
|
493
|
-
};
|
|
494
|
-
const typesFileContent = render(types_default, {
|
|
495
|
-
params,
|
|
496
|
-
paramsSchema: paramsSchema.map((param, index) => {
|
|
497
|
-
return {
|
|
498
|
-
...param,
|
|
499
|
-
refinement: paramsRefinements?.at(index)
|
|
500
|
-
};
|
|
501
|
-
}),
|
|
502
|
-
typeDeclarations,
|
|
503
|
-
payloadTypes,
|
|
504
|
-
responseTypes
|
|
505
|
-
});
|
|
506
|
-
const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
|
|
507
|
-
overrides: [...payloadTypes, ...responseTypes].reduce(
|
|
508
|
-
(map, { id, skipValidation }) => {
|
|
509
|
-
if (skipValidation) {
|
|
510
|
-
map[id] = "never";
|
|
511
|
-
}
|
|
512
|
-
return map;
|
|
513
|
-
},
|
|
514
|
-
{ [refineTypeName]: refineTypeName }
|
|
515
|
-
),
|
|
516
|
-
withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
|
|
517
|
-
formatters: formatters2
|
|
518
|
-
}) : void 0;
|
|
519
|
-
await renderToFile(
|
|
520
|
-
typesFile,
|
|
521
|
-
resolvedTypes ? resolved_types_default : typesFileContent,
|
|
522
|
-
{ resolvedTypes }
|
|
523
|
-
);
|
|
524
|
-
params.resolvedType = resolvedTypes?.find(
|
|
525
|
-
(e) => e.name === params.id
|
|
526
|
-
);
|
|
527
|
-
cache = await persistCache({
|
|
528
|
-
params,
|
|
529
|
-
methods,
|
|
530
|
-
typeDeclarations,
|
|
531
|
-
numericParams,
|
|
532
|
-
// text was needed at writing types.ts file, dropping from cache
|
|
533
|
-
payloadTypes: payloadTypes.map(({ text, ...rest }) => {
|
|
534
|
-
return {
|
|
535
|
-
...rest,
|
|
536
|
-
resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
|
|
537
|
-
};
|
|
538
|
-
}),
|
|
539
|
-
responseTypes: responseTypes.map(({ text, ...rest }) => {
|
|
540
|
-
return {
|
|
541
|
-
...rest,
|
|
542
|
-
resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
|
|
543
|
-
};
|
|
544
|
-
}),
|
|
545
|
-
referencedFiles
|
|
546
|
-
});
|
|
547
|
-
}
|
|
548
|
-
const route = {
|
|
549
|
-
name,
|
|
550
|
-
pathTokens,
|
|
551
|
-
params: cache.params,
|
|
552
|
-
numericParams: cache.numericParams,
|
|
553
|
-
optionalParams,
|
|
554
|
-
importName,
|
|
555
|
-
importPath,
|
|
556
|
-
folder,
|
|
557
|
-
file,
|
|
558
|
-
fileFullpath,
|
|
559
|
-
methods: cache.methods,
|
|
560
|
-
typeDeclarations: cache.typeDeclarations,
|
|
561
|
-
payloadTypes: cache.payloadTypes,
|
|
562
|
-
responseTypes: cache.responseTypes,
|
|
563
|
-
referencedFiles: Object.keys(cache.referencedFiles).map(
|
|
564
|
-
// expand referenced files path,
|
|
565
|
-
// they are stored as relative in cache
|
|
566
|
-
(e) => resolve3(appRoot2, e)
|
|
567
|
-
)
|
|
568
|
-
};
|
|
569
|
-
return {
|
|
570
|
-
kind: "api",
|
|
571
|
-
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
|
|
572
571
|
};
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
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 = {
|
|
579
625
|
name,
|
|
626
|
+
pathTokens,
|
|
627
|
+
params: cache.params,
|
|
628
|
+
numericParams: cache.numericParams,
|
|
629
|
+
optionalParams,
|
|
630
|
+
importName,
|
|
631
|
+
importFile,
|
|
580
632
|
folder,
|
|
581
633
|
file,
|
|
582
634
|
fileFullpath,
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
fileFullpath,
|
|
597
|
-
importPath,
|
|
598
|
-
importName
|
|
599
|
-
};
|
|
600
|
-
return {
|
|
601
|
-
kind: "page",
|
|
602
|
-
route
|
|
603
|
-
};
|
|
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
|
+
)
|
|
644
|
+
};
|
|
645
|
+
return {
|
|
646
|
+
kind: "apiRoute",
|
|
647
|
+
entry: entry2
|
|
604
648
|
};
|
|
605
|
-
|
|
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
|
+
}
|
|
606
682
|
}
|
|
607
683
|
return resolvers2;
|
|
608
684
|
};
|
|
609
|
-
const routeFiles = await
|
|
610
|
-
cwd: resolve3(appRoot2, sourceFolder2),
|
|
611
|
-
absolute: true,
|
|
612
|
-
onlyFiles: true,
|
|
613
|
-
ignore: [
|
|
614
|
-
`${defaults.apiDir}/index.ts`,
|
|
615
|
-
`${defaults.pagesDir}/index.ts{x,}`
|
|
616
|
-
]
|
|
617
|
-
});
|
|
685
|
+
const routeFiles = await scanRoutes({ appRoot: appRoot2, sourceFolder: sourceFolder2 });
|
|
618
686
|
return {
|
|
619
687
|
resolvers: resolversFactory2(routeFiles),
|
|
620
|
-
resolversFactory: resolversFactory2
|
|
621
|
-
resolveRouteFile: resolveRouteFile2
|
|
688
|
+
resolversFactory: resolversFactory2
|
|
622
689
|
};
|
|
623
690
|
};
|
|
624
691
|
|
|
@@ -644,13 +711,8 @@ var resolvedOptions = {
|
|
|
644
711
|
};
|
|
645
712
|
var { appRoot, sourceFolder } = resolvedOptions;
|
|
646
713
|
var watchHandlers = [];
|
|
647
|
-
var
|
|
648
|
-
var {
|
|
649
|
-
//
|
|
650
|
-
resolvers,
|
|
651
|
-
resolversFactory,
|
|
652
|
-
resolveRouteFile
|
|
653
|
-
} = await routes_default(resolvedOptions);
|
|
714
|
+
var resolvedEntries = /* @__PURE__ */ new Map();
|
|
715
|
+
var { resolvers, resolversFactory } = await routes_default(resolvedOptions);
|
|
654
716
|
var { resolve: resolve4 } = pathResolver3({ appRoot, sourceFolder });
|
|
655
717
|
var spinnerFactory = (startText) => {
|
|
656
718
|
const id = [startText, Date.now().toString()].map(crc4).join(":");
|
|
@@ -684,9 +746,9 @@ var createEventHandler = async (file) => {
|
|
|
684
746
|
if (resolver) {
|
|
685
747
|
const spinner = spinnerFactory(`Resolving ${resolver.name} Route`);
|
|
686
748
|
try {
|
|
687
|
-
const
|
|
749
|
+
const resolvedEntry = await resolver.handler();
|
|
688
750
|
resolvers.set(file, resolver);
|
|
689
|
-
|
|
751
|
+
resolvedEntries.set(resolvedEntry.entry.fileFullpath, resolvedEntry);
|
|
690
752
|
spinner.succeed();
|
|
691
753
|
} catch (error) {
|
|
692
754
|
spinner.failed(error);
|
|
@@ -695,16 +757,16 @@ var createEventHandler = async (file) => {
|
|
|
695
757
|
};
|
|
696
758
|
var updateEventHandler = async (file) => {
|
|
697
759
|
const relatedResolvers = /* @__PURE__ */ new Map();
|
|
698
|
-
if (
|
|
760
|
+
if (resolvedEntries.has(file)) {
|
|
699
761
|
const resolver = resolvers.get(file);
|
|
700
762
|
if (resolver) {
|
|
701
763
|
relatedResolvers.set(file, resolver);
|
|
702
764
|
}
|
|
703
765
|
} else {
|
|
704
|
-
const referencedRoutes =
|
|
705
|
-
return kind === "
|
|
766
|
+
const referencedRoutes = resolvedEntries.values().flatMap(({ kind, entry }) => {
|
|
767
|
+
return kind === "apiRoute" ? entry.referencedFiles.includes(file) ? [entry] : [] : [];
|
|
706
768
|
});
|
|
707
|
-
for (const
|
|
769
|
+
for (const route of referencedRoutes) {
|
|
708
770
|
const resolver = resolvers.get(route.fileFullpath);
|
|
709
771
|
if (resolver) {
|
|
710
772
|
relatedResolvers.set(route.fileFullpath, resolver);
|
|
@@ -715,8 +777,8 @@ var updateEventHandler = async (file) => {
|
|
|
715
777
|
for (const resolver of relatedResolvers.values()) {
|
|
716
778
|
spinner.append(resolver.name);
|
|
717
779
|
try {
|
|
718
|
-
const
|
|
719
|
-
|
|
780
|
+
const resolvedEntry = await resolver.handler(file);
|
|
781
|
+
resolvedEntries.set(resolvedEntry.entry.fileFullpath, resolvedEntry);
|
|
720
782
|
} catch (error) {
|
|
721
783
|
spinner.failed(error);
|
|
722
784
|
spinner = spinnerFactory(`Updating ${relatedResolvers.size} Routes`);
|
|
@@ -728,11 +790,11 @@ var deleteEventHandler = async () => {
|
|
|
728
790
|
};
|
|
729
791
|
var runWatchHandlers = async (event) => {
|
|
730
792
|
let spinner = spinnerFactory("Running Generators");
|
|
731
|
-
const
|
|
793
|
+
const entries = Array.from(resolvedEntries.values());
|
|
732
794
|
for (const { name, handler } of watchHandlers) {
|
|
733
795
|
spinner.append(name);
|
|
734
796
|
try {
|
|
735
|
-
await handler(structuredClone(
|
|
797
|
+
await handler(structuredClone(entries), event);
|
|
736
798
|
} catch (error) {
|
|
737
799
|
spinner.failed(error);
|
|
738
800
|
spinner = spinnerFactory("Running Generators");
|
|
@@ -762,7 +824,7 @@ watcher.on("all", async (event, file) => {
|
|
|
762
824
|
if (event.endsWith("Dir")) {
|
|
763
825
|
return;
|
|
764
826
|
}
|
|
765
|
-
if (!
|
|
827
|
+
if (!isRouteFile(file, { appRoot, sourceFolder })) {
|
|
766
828
|
return;
|
|
767
829
|
}
|
|
768
830
|
const match = {
|
|
@@ -780,11 +842,11 @@ watcher.on("all", async (event, file) => {
|
|
|
780
842
|
let spinner = spinnerFactory("Resolving Routes");
|
|
781
843
|
for (const { name, handler } of resolvers.values()) {
|
|
782
844
|
spinner.append(
|
|
783
|
-
`[ ${
|
|
845
|
+
`[ ${resolvedEntries.size + 1} of ${resolvers.size} ] ${name}`
|
|
784
846
|
);
|
|
785
847
|
try {
|
|
786
848
|
const resolvedEntry = await handler();
|
|
787
|
-
|
|
849
|
+
resolvedEntries.set(resolvedEntry.entry.fileFullpath, resolvedEntry);
|
|
788
850
|
} catch (error) {
|
|
789
851
|
spinner.failed(error);
|
|
790
852
|
spinner = spinnerFactory("Resolving Routes");
|