@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.
Files changed (156) hide show
  1. package/package.json +7 -6
  2. package/pkg/base-plugin/routes.js +384 -216
  3. package/pkg/base-plugin/routes.js.map +4 -4
  4. package/pkg/base-plugin/worker.js +297 -235
  5. package/pkg/base-plugin/worker.js.map +4 -4
  6. package/pkg/cli/cli.js +4 -8
  7. package/pkg/cli/cli.js.map +2 -2
  8. package/pkg/cli/index.js +4 -8
  9. package/pkg/cli/index.js.map +2 -2
  10. package/pkg/index.js +286 -219
  11. package/pkg/index.js.map +4 -4
  12. package/pkg/src/base-plugin/cache.d.ts +1 -1
  13. package/pkg/src/base-plugin/routes/nesting.d.ts +5 -0
  14. package/pkg/src/base-plugin/routes/resolve.d.ts +23 -0
  15. package/pkg/src/base-plugin/routes.d.ts +6 -10
  16. package/pkg/src/index.d.ts +1 -1
  17. package/pkg/stub-generator/index.js +5 -4
  18. package/pkg/stub-generator/index.js.map +2 -2
  19. package/pkg/test/@fixtures/app/@src/pages/about/careers/[jobId]/index.d.ts +0 -0
  20. package/pkg/test/@fixtures/app/@src/pages/about/careers/layout.d.ts +0 -0
  21. package/pkg/test/@fixtures/app/@src/pages/about/index.d.ts +0 -0
  22. package/pkg/test/@fixtures/app/@src/pages/about/layout.d.ts +0 -0
  23. package/pkg/test/@fixtures/app/@src/pages/about/team/index.d.ts +0 -0
  24. package/pkg/test/@fixtures/app/@src/pages/account/layout.d.ts +0 -0
  25. package/pkg/test/@fixtures/app/@src/pages/account/profile/index.d.ts +0 -0
  26. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/index.d.ts +0 -0
  27. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/[...path]/index.d.ts +0 -0
  28. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/index.d.ts +0 -0
  29. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/layout.d.ts +0 -0
  30. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/index.d.ts +0 -0
  31. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/layout.d.ts +0 -0
  32. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/general/index.d.ts +0 -0
  33. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/index.d.ts +0 -0
  34. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/layout.d.ts +0 -0
  35. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/permissions/index.d.ts +0 -0
  36. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/[userId]/index.d.ts +0 -0
  37. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/index.d.ts +0 -0
  38. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/layout.d.ts +0 -0
  39. package/pkg/test/@fixtures/app/@src/pages/admin/index.d.ts +0 -0
  40. package/pkg/test/@fixtures/app/@src/pages/admin/layout.d.ts +0 -0
  41. package/pkg/test/@fixtures/app/@src/pages/blog/[[category]]/[[tag]]/index.d.ts +0 -0
  42. package/pkg/test/@fixtures/app/@src/pages/blog/[[category]]/index.d.ts +0 -0
  43. package/pkg/test/@fixtures/app/@src/pages/blog/index.d.ts +0 -0
  44. package/pkg/test/@fixtures/app/@src/pages/blog/layout.d.ts +0 -0
  45. package/pkg/test/@fixtures/app/@src/pages/blog/post/[slug]/index.d.ts +0 -0
  46. package/pkg/test/@fixtures/app/@src/pages/blog/post/[slug]/layout.d.ts +0 -0
  47. package/pkg/test/@fixtures/app/@src/pages/contact/index.d.ts +0 -0
  48. package/pkg/test/@fixtures/app/@src/pages/contact/layout.d.ts +0 -0
  49. package/pkg/test/@fixtures/app/@src/pages/courses/[courseId]/layout.d.ts +0 -0
  50. package/pkg/test/@fixtures/app/@src/pages/courses/[courseId]/lessons/[[lessonId]]/assignments/[...assignmentPath]/index.d.ts +0 -0
  51. package/pkg/test/@fixtures/app/@src/pages/dashboard/[view]/index.d.ts +0 -0
  52. package/pkg/test/@fixtures/app/@src/pages/dashboard/analytics/index.d.ts +0 -0
  53. package/pkg/test/@fixtures/app/@src/pages/dashboard/index.d.ts +0 -0
  54. package/pkg/test/@fixtures/app/@src/pages/dashboard/layout.d.ts +0 -0
  55. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/billing/index.d.ts +0 -0
  56. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/index.d.ts +0 -0
  57. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/layout.d.ts +0 -0
  58. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/notifications/index.d.ts +0 -0
  59. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/profile/index.d.ts +0 -0
  60. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/security/index.d.ts +0 -0
  61. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/security/layout.d.ts +0 -0
  62. package/pkg/test/@fixtures/app/@src/pages/docs/[...path]/index.d.ts +0 -0
  63. package/pkg/test/@fixtures/app/@src/pages/docs/index.d.ts +0 -0
  64. package/pkg/test/@fixtures/app/@src/pages/docs/layout.d.ts +0 -0
  65. package/pkg/test/@fixtures/app/@src/pages/files/[...filePath]/index.d.ts +0 -0
  66. package/pkg/test/@fixtures/app/@src/pages/files/[...filePath]/layout.d.ts +0 -0
  67. package/pkg/test/@fixtures/app/@src/pages/legal/layout.d.ts +0 -0
  68. package/pkg/test/@fixtures/app/@src/pages/legal/privacy/index.d.ts +0 -0
  69. package/pkg/test/@fixtures/app/@src/pages/legal/terms/index.d.ts +0 -0
  70. package/pkg/test/@fixtures/app/@src/pages/news/[category]/articles/[...articlePath]/index.d.ts +0 -0
  71. package/pkg/test/@fixtures/app/@src/pages/news/[category]/layout.d.ts +0 -0
  72. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/layout.d.ts +0 -0
  73. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/index.d.ts +0 -0
  74. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/layout.d.ts +0 -0
  75. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/layout.d.ts +0 -0
  76. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/layout.d.ts +0 -0
  77. package/pkg/test/@fixtures/app/@src/pages/portal/layout.d.ts +0 -0
  78. package/pkg/test/@fixtures/app/@src/pages/products/[id]/index.d.ts +0 -0
  79. package/pkg/test/@fixtures/app/@src/pages/products/index.d.ts +0 -0
  80. package/pkg/test/@fixtures/app/@src/pages/profile/[username]/layout.d.ts +0 -0
  81. package/pkg/test/@fixtures/app/@src/pages/profile/[username]/posts/[postId]/comments/[...thread]/index.d.ts +0 -0
  82. package/pkg/test/@fixtures/app/@src/pages/profile/[username]/posts/[postId]/layout.d.ts +0 -0
  83. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/[...path]/index.d.ts +0 -0
  84. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/index.d.ts +0 -0
  85. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/layout.d.ts +0 -0
  86. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/index.d.ts +0 -0
  87. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/layout.d.ts +0 -0
  88. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/[commentId]/index.d.ts +0 -0
  89. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/index.d.ts +0 -0
  90. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/layout.d.ts +0 -0
  91. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/index.d.ts +0 -0
  92. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/layout.d.ts +0 -0
  93. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/index.d.ts +0 -0
  94. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/layout.d.ts +0 -0
  95. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/[userId]/index.d.ts +0 -0
  96. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/index.d.ts +0 -0
  97. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/layout.d.ts +0 -0
  98. package/pkg/test/@fixtures/app/@src/pages/projects/index.d.ts +0 -0
  99. package/pkg/test/@fixtures/app/@src/pages/projects/layout.d.ts +0 -0
  100. package/pkg/test/@fixtures/app/@src/pages/properties/[[city]]/filters/[...filters]/index.d.ts +0 -0
  101. package/pkg/test/@fixtures/app/@src/pages/properties/filters/index.d.ts +0 -0
  102. package/pkg/test/@fixtures/app/@src/pages/properties/layout.d.ts +0 -0
  103. package/pkg/test/@fixtures/app/@src/pages/search/[[query]]/[[page]]/index.d.ts +0 -0
  104. package/pkg/test/@fixtures/app/@src/pages/search/[[query]]/layout.d.ts +0 -0
  105. package/pkg/test/@fixtures/app/@src/pages/search/index.d.ts +0 -0
  106. package/pkg/test/@fixtures/app/@src/pages/shop/[category]/[productId]/index.d.ts +0 -0
  107. package/pkg/test/@fixtures/app/@src/pages/shop/[category]/[productId]/layout.d.ts +0 -0
  108. package/pkg/test/@fixtures/app/@src/pages/shop/cart/index.d.ts +0 -0
  109. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/confirm/index.d.ts +0 -0
  110. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/layout.d.ts +0 -0
  111. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/payment/index.d.ts +0 -0
  112. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/shipping/index.d.ts +0 -0
  113. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/shipping/layout.d.ts +0 -0
  114. package/pkg/test/@fixtures/app/@src/pages/shop/index.d.ts +0 -0
  115. package/pkg/test/@fixtures/app/@src/pages/shop/layout.d.ts +0 -0
  116. package/pkg/test/@fixtures/app/@src/pages/shop/orders/[orderId]/index.d.ts +0 -0
  117. package/pkg/test/@fixtures/app/@src/pages/shop/orders/index.d.ts +0 -0
  118. package/pkg/test/@fixtures/app/@src/pages/shop/orders/layout.d.ts +0 -0
  119. package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/index.d.ts +0 -0
  120. package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/layout.d.ts +0 -0
  121. package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/reviews/index.d.ts +0 -0
  122. package/pkg/test/@fixtures/app/@src/pages/shop/products/[[category]]/index.d.ts +0 -0
  123. package/pkg/test/@fixtures/app/@src/pages/shop/products/index.d.ts +0 -0
  124. package/pkg/test/@fixtures/app/@src/pages/shop/products/layout.d.ts +0 -0
  125. package/pkg/test/@fixtures/app/@src/pages/signup/index.d.ts +0 -0
  126. package/pkg/test/@fixtures/app/@src/pages/store/[category]/filters/[...filters]/index.d.ts +0 -0
  127. package/pkg/test/@fixtures/app/@src/pages/store/[category]/sort/[sortBy]/index.d.ts +0 -0
  128. package/pkg/test/@fixtures/app/@src/pages/store/[category]/sort/layout.d.ts +0 -0
  129. package/pkg/test/@fixtures/app/@src/pages/store/layout.d.ts +0 -0
  130. package/pkg/test/@fixtures/app/@src/pages/users/[username]/followers/index.d.ts +0 -0
  131. package/pkg/test/@fixtures/app/@src/pages/users/[username]/following/index.d.ts +0 -0
  132. package/pkg/test/@fixtures/app/@src/pages/users/[username]/index.d.ts +0 -0
  133. package/pkg/test/@fixtures/app/@src/pages/users/[username]/layout.d.ts +0 -0
  134. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/[postId]/index.d.ts +0 -0
  135. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/[postId]/layout.d.ts +0 -0
  136. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/index.d.ts +0 -0
  137. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/layout.d.ts +0 -0
  138. package/pkg/test/@fixtures/app/@src/pages/users/index.d.ts +0 -0
  139. package/pkg/test/@fixtures/app/@src/pages/users/layout.d.ts +0 -0
  140. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/[range]/index.d.ts +0 -0
  141. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/[range]/layout.d.ts +0 -0
  142. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/index.d.ts +0 -0
  143. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/layout.d.ts +0 -0
  144. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/team/[memberId]/permissions/[...permissionPath]/index.d.ts +0 -0
  145. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/team/layout.d.ts +0 -0
  146. package/pkg/test/@fixtures/app/lib/@src/{api}/articles/[...path]/index.ts/types.d.ts +3 -0
  147. package/pkg/test/@fixtures/app/lib/@src/{api}/books/[category]/[[author]]/index.ts/types.d.ts +4 -0
  148. package/pkg/test/@fixtures/app/lib/@src/{api}/books/[category]/index.ts/types.d.ts +3 -0
  149. package/pkg/test/@fixtures/app/lib/@src/{api}/books/index.ts/types.d.ts +1 -0
  150. package/pkg/test/@fixtures/app/lib/@src/{api}/files/[[folder]]/[[id]].json/index.ts/types.d.ts +4 -0
  151. package/pkg/test/@fixtures/app/lib/@src/{api}/files/[[folder]]/index.ts/types.d.ts +3 -0
  152. package/pkg/test/@fixtures/app/lib/@src/{api}/index/index.ts/types.d.ts +1 -0
  153. package/pkg/test/@fixtures/app/lib/@src/{api}/pages/[...path].html/index.ts/types.d.ts +3 -0
  154. package/pkg/test/@fixtures/app/lib/@src/{api}/users/[id].json/index.ts/types.d.ts +3 -0
  155. package/pkg/test/routes/base.d.ts +4 -0
  156. 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.importPath, "cache.json");
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 routes_default = async (pluginOptions) => {
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
- const routeFilePatterns = [
394
- `${defaults.apiDir}/**/index.ts`,
395
- `${defaults.pagesDir}/**/index.{ts,tsx,vue,svelte}`
396
- ];
397
- const resolveRouteFile2 = (file) => {
398
- const [_sourceFolder, folder, ...rest] = resolve3(appRoot2, file).replace(`${appRoot2}/`, "").split("/");
399
- if (!folder || _sourceFolder !== sourceFolder2 || rest.length < 2) {
400
- return;
401
- }
402
- return picomatch.isMatch(join(folder, ...rest), routeFilePatterns) ? [folder, rest.join("/")] : void 0;
403
- };
404
- const resolversFactory2 = (routeFiles2) => {
405
- const resolvers2 = /* @__PURE__ */ new Map();
406
- const entries = routeFiles2.flatMap((_file) => {
407
- const resolvedPaths = resolveRouteFile2(_file);
408
- if (!resolvedPaths) {
409
- return [];
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
- name,
423
- folder,
424
- file,
425
- fileFullpath,
426
- pathTokens,
427
- importPath,
428
- importName
528
+ appRoot: appRoot2,
529
+ sourceFolder: sourceFolder2,
530
+ extraContext: { resolveTypes }
429
531
  }
430
- ];
431
- });
432
- for (const entry of entries.filter((e) => e.folder === defaults.apiDir)) {
433
- const {
434
- name,
435
- file,
436
- folder,
437
- fileFullpath,
438
- pathTokens,
439
- importPath,
440
- importName
441
- } = entry;
442
- const handler = async (updatedFile) => {
443
- const paramsSchema = pathTokens.flatMap((e) => {
444
- return e.param ? [e.param] : [];
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
- appRoot: appRoot2,
451
- sourceFolder: sourceFolder2,
452
- extraContext: { resolveTypes }
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
- let cache = await getCache({ validate: true });
456
- if (!cache) {
457
- if (updatedFile === fileFullpath) {
458
- await refreshSourceFile(fileFullpath);
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
- const {
461
- typeDeclarations,
462
- paramsRefinements,
463
- methods,
464
- payloadTypes,
465
- responseTypes,
466
- referencedFiles = []
467
- } = await resolveRouteSignature(
468
- { importName, fileFullpath, optionalParams },
469
- {
470
- withReferencedFiles: true,
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
- resolvers2.set(fileFullpath, { name, handler });
575
- }
576
- for (const entry of entries.filter((e) => e.folder === defaults.pagesDir)) {
577
- const {
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
- pathTokens,
584
- importPath,
585
- importName
586
- } = entry;
587
- const handler = async () => {
588
- const route = {
589
- name,
590
- pathTokens,
591
- params: {
592
- schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
593
- },
594
- folder,
595
- file,
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
- resolvers2.set(fileFullpath, { name, handler });
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 glob(routeFilePatterns, {
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 resolvedRoutes = /* @__PURE__ */ new Map();
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 resolvedRoute = await resolver.handler();
749
+ const resolvedEntry = await resolver.handler();
688
750
  resolvers.set(file, resolver);
689
- resolvedRoutes.set(resolvedRoute.route.fileFullpath, resolvedRoute);
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 (resolvedRoutes.has(file)) {
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 = resolvedRoutes.values().filter(({ kind, route }) => {
705
- return kind === "api" ? route.referencedFiles.includes(file) : false;
766
+ const referencedRoutes = resolvedEntries.values().flatMap(({ kind, entry }) => {
767
+ return kind === "apiRoute" ? entry.referencedFiles.includes(file) ? [entry] : [] : [];
706
768
  });
707
- for (const { route } of referencedRoutes) {
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 route = await resolver.handler(file);
719
- resolvedRoutes.set(route.route.fileFullpath, route);
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 routes = Array.from(resolvedRoutes.values());
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(routes), event);
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 (!resolveRouteFile(file)) {
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
- `[ ${resolvedRoutes.size + 1} of ${resolvers.size} ] ${name}`
845
+ `[ ${resolvedEntries.size + 1} of ${resolvers.size} ] ${name}`
784
846
  );
785
847
  try {
786
848
  const resolvedEntry = await handler();
787
- resolvedRoutes.set(resolvedEntry.route.fileFullpath, resolvedEntry);
849
+ resolvedEntries.set(resolvedEntry.entry.fileFullpath, resolvedEntry);
788
850
  } catch (error) {
789
851
  spinner.failed(error);
790
852
  spinner = spinnerFactory("Resolving Routes");