@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.
Files changed (151) hide show
  1. package/package.json +6 -6
  2. package/pkg/base-plugin/routes.js +359 -196
  3. package/pkg/base-plugin/routes.js.map +4 -4
  4. package/pkg/base-plugin/worker.js +272 -208
  5. package/pkg/base-plugin/worker.js.map +4 -4
  6. package/pkg/index.js +262 -198
  7. package/pkg/index.js.map +4 -4
  8. package/pkg/src/base-plugin/cache.d.ts +1 -1
  9. package/pkg/src/base-plugin/routes/nesting.d.ts +5 -0
  10. package/pkg/src/base-plugin/routes/resolve.d.ts +23 -0
  11. package/pkg/src/base-plugin/routes.d.ts +6 -12
  12. package/pkg/stub-generator/index.js +5 -4
  13. package/pkg/stub-generator/index.js.map +2 -2
  14. package/pkg/test/@fixtures/app/@src/pages/about/careers/[jobId]/index.d.ts +0 -0
  15. package/pkg/test/@fixtures/app/@src/pages/about/careers/layout.d.ts +0 -0
  16. package/pkg/test/@fixtures/app/@src/pages/about/index.d.ts +0 -0
  17. package/pkg/test/@fixtures/app/@src/pages/about/layout.d.ts +0 -0
  18. package/pkg/test/@fixtures/app/@src/pages/about/team/index.d.ts +0 -0
  19. package/pkg/test/@fixtures/app/@src/pages/account/layout.d.ts +0 -0
  20. package/pkg/test/@fixtures/app/@src/pages/account/profile/index.d.ts +0 -0
  21. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/index.d.ts +0 -0
  22. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/[...path]/index.d.ts +0 -0
  23. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/index.d.ts +0 -0
  24. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/layout.d.ts +0 -0
  25. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/index.d.ts +0 -0
  26. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/layout.d.ts +0 -0
  27. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/general/index.d.ts +0 -0
  28. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/index.d.ts +0 -0
  29. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/layout.d.ts +0 -0
  30. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/permissions/index.d.ts +0 -0
  31. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/[userId]/index.d.ts +0 -0
  32. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/index.d.ts +0 -0
  33. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/layout.d.ts +0 -0
  34. package/pkg/test/@fixtures/app/@src/pages/admin/index.d.ts +0 -0
  35. package/pkg/test/@fixtures/app/@src/pages/admin/layout.d.ts +0 -0
  36. package/pkg/test/@fixtures/app/@src/pages/blog/[[category]]/[[tag]]/index.d.ts +0 -0
  37. package/pkg/test/@fixtures/app/@src/pages/blog/[[category]]/index.d.ts +0 -0
  38. package/pkg/test/@fixtures/app/@src/pages/blog/index.d.ts +0 -0
  39. package/pkg/test/@fixtures/app/@src/pages/blog/layout.d.ts +0 -0
  40. package/pkg/test/@fixtures/app/@src/pages/blog/post/[slug]/index.d.ts +0 -0
  41. package/pkg/test/@fixtures/app/@src/pages/blog/post/[slug]/layout.d.ts +0 -0
  42. package/pkg/test/@fixtures/app/@src/pages/contact/index.d.ts +0 -0
  43. package/pkg/test/@fixtures/app/@src/pages/contact/layout.d.ts +0 -0
  44. package/pkg/test/@fixtures/app/@src/pages/courses/[courseId]/layout.d.ts +0 -0
  45. package/pkg/test/@fixtures/app/@src/pages/courses/[courseId]/lessons/[[lessonId]]/assignments/[...assignmentPath]/index.d.ts +0 -0
  46. package/pkg/test/@fixtures/app/@src/pages/dashboard/[view]/index.d.ts +0 -0
  47. package/pkg/test/@fixtures/app/@src/pages/dashboard/analytics/index.d.ts +0 -0
  48. package/pkg/test/@fixtures/app/@src/pages/dashboard/index.d.ts +0 -0
  49. package/pkg/test/@fixtures/app/@src/pages/dashboard/layout.d.ts +0 -0
  50. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/billing/index.d.ts +0 -0
  51. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/index.d.ts +0 -0
  52. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/layout.d.ts +0 -0
  53. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/notifications/index.d.ts +0 -0
  54. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/profile/index.d.ts +0 -0
  55. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/security/index.d.ts +0 -0
  56. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/security/layout.d.ts +0 -0
  57. package/pkg/test/@fixtures/app/@src/pages/docs/[...path]/index.d.ts +0 -0
  58. package/pkg/test/@fixtures/app/@src/pages/docs/index.d.ts +0 -0
  59. package/pkg/test/@fixtures/app/@src/pages/docs/layout.d.ts +0 -0
  60. package/pkg/test/@fixtures/app/@src/pages/files/[...filePath]/index.d.ts +0 -0
  61. package/pkg/test/@fixtures/app/@src/pages/files/[...filePath]/layout.d.ts +0 -0
  62. package/pkg/test/@fixtures/app/@src/pages/legal/layout.d.ts +0 -0
  63. package/pkg/test/@fixtures/app/@src/pages/legal/privacy/index.d.ts +0 -0
  64. package/pkg/test/@fixtures/app/@src/pages/legal/terms/index.d.ts +0 -0
  65. package/pkg/test/@fixtures/app/@src/pages/news/[category]/articles/[...articlePath]/index.d.ts +0 -0
  66. package/pkg/test/@fixtures/app/@src/pages/news/[category]/layout.d.ts +0 -0
  67. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/layout.d.ts +0 -0
  68. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/index.d.ts +0 -0
  69. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/layout.d.ts +0 -0
  70. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/layout.d.ts +0 -0
  71. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/layout.d.ts +0 -0
  72. package/pkg/test/@fixtures/app/@src/pages/portal/layout.d.ts +0 -0
  73. package/pkg/test/@fixtures/app/@src/pages/products/[id]/index.d.ts +0 -0
  74. package/pkg/test/@fixtures/app/@src/pages/products/index.d.ts +0 -0
  75. package/pkg/test/@fixtures/app/@src/pages/profile/[username]/layout.d.ts +0 -0
  76. package/pkg/test/@fixtures/app/@src/pages/profile/[username]/posts/[postId]/comments/[...thread]/index.d.ts +0 -0
  77. package/pkg/test/@fixtures/app/@src/pages/profile/[username]/posts/[postId]/layout.d.ts +0 -0
  78. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/[...path]/index.d.ts +0 -0
  79. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/index.d.ts +0 -0
  80. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/layout.d.ts +0 -0
  81. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/index.d.ts +0 -0
  82. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/layout.d.ts +0 -0
  83. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/[commentId]/index.d.ts +0 -0
  84. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/index.d.ts +0 -0
  85. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/layout.d.ts +0 -0
  86. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/index.d.ts +0 -0
  87. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/layout.d.ts +0 -0
  88. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/index.d.ts +0 -0
  89. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/layout.d.ts +0 -0
  90. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/[userId]/index.d.ts +0 -0
  91. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/index.d.ts +0 -0
  92. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/layout.d.ts +0 -0
  93. package/pkg/test/@fixtures/app/@src/pages/projects/index.d.ts +0 -0
  94. package/pkg/test/@fixtures/app/@src/pages/projects/layout.d.ts +0 -0
  95. package/pkg/test/@fixtures/app/@src/pages/properties/[[city]]/filters/[...filters]/index.d.ts +0 -0
  96. package/pkg/test/@fixtures/app/@src/pages/properties/filters/index.d.ts +0 -0
  97. package/pkg/test/@fixtures/app/@src/pages/properties/layout.d.ts +0 -0
  98. package/pkg/test/@fixtures/app/@src/pages/search/[[query]]/[[page]]/index.d.ts +0 -0
  99. package/pkg/test/@fixtures/app/@src/pages/search/[[query]]/layout.d.ts +0 -0
  100. package/pkg/test/@fixtures/app/@src/pages/search/index.d.ts +0 -0
  101. package/pkg/test/@fixtures/app/@src/pages/shop/[category]/[productId]/index.d.ts +0 -0
  102. package/pkg/test/@fixtures/app/@src/pages/shop/[category]/[productId]/layout.d.ts +0 -0
  103. package/pkg/test/@fixtures/app/@src/pages/shop/cart/index.d.ts +0 -0
  104. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/confirm/index.d.ts +0 -0
  105. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/layout.d.ts +0 -0
  106. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/payment/index.d.ts +0 -0
  107. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/shipping/index.d.ts +0 -0
  108. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/shipping/layout.d.ts +0 -0
  109. package/pkg/test/@fixtures/app/@src/pages/shop/index.d.ts +0 -0
  110. package/pkg/test/@fixtures/app/@src/pages/shop/layout.d.ts +0 -0
  111. package/pkg/test/@fixtures/app/@src/pages/shop/orders/[orderId]/index.d.ts +0 -0
  112. package/pkg/test/@fixtures/app/@src/pages/shop/orders/index.d.ts +0 -0
  113. package/pkg/test/@fixtures/app/@src/pages/shop/orders/layout.d.ts +0 -0
  114. package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/index.d.ts +0 -0
  115. package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/layout.d.ts +0 -0
  116. package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/reviews/index.d.ts +0 -0
  117. package/pkg/test/@fixtures/app/@src/pages/shop/products/[[category]]/index.d.ts +0 -0
  118. package/pkg/test/@fixtures/app/@src/pages/shop/products/index.d.ts +0 -0
  119. package/pkg/test/@fixtures/app/@src/pages/shop/products/layout.d.ts +0 -0
  120. package/pkg/test/@fixtures/app/@src/pages/signup/index.d.ts +0 -0
  121. package/pkg/test/@fixtures/app/@src/pages/store/[category]/filters/[...filters]/index.d.ts +0 -0
  122. package/pkg/test/@fixtures/app/@src/pages/store/[category]/sort/[sortBy]/index.d.ts +0 -0
  123. package/pkg/test/@fixtures/app/@src/pages/store/[category]/sort/layout.d.ts +0 -0
  124. package/pkg/test/@fixtures/app/@src/pages/store/layout.d.ts +0 -0
  125. package/pkg/test/@fixtures/app/@src/pages/users/[username]/followers/index.d.ts +0 -0
  126. package/pkg/test/@fixtures/app/@src/pages/users/[username]/following/index.d.ts +0 -0
  127. package/pkg/test/@fixtures/app/@src/pages/users/[username]/index.d.ts +0 -0
  128. package/pkg/test/@fixtures/app/@src/pages/users/[username]/layout.d.ts +0 -0
  129. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/[postId]/index.d.ts +0 -0
  130. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/[postId]/layout.d.ts +0 -0
  131. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/index.d.ts +0 -0
  132. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/layout.d.ts +0 -0
  133. package/pkg/test/@fixtures/app/@src/pages/users/index.d.ts +0 -0
  134. package/pkg/test/@fixtures/app/@src/pages/users/layout.d.ts +0 -0
  135. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/[range]/index.d.ts +0 -0
  136. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/[range]/layout.d.ts +0 -0
  137. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/index.d.ts +0 -0
  138. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/layout.d.ts +0 -0
  139. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/team/[memberId]/permissions/[...permissionPath]/index.d.ts +0 -0
  140. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/team/layout.d.ts +0 -0
  141. package/pkg/test/@fixtures/app/lib/@src/{api}/articles/[...path]/index.ts/types.d.ts +3 -0
  142. package/pkg/test/@fixtures/app/lib/@src/{api}/books/[category]/[[author]]/index.ts/types.d.ts +4 -0
  143. package/pkg/test/@fixtures/app/lib/@src/{api}/books/[category]/index.ts/types.d.ts +3 -0
  144. package/pkg/test/@fixtures/app/lib/@src/{api}/books/index.ts/types.d.ts +1 -0
  145. package/pkg/test/@fixtures/app/lib/@src/{api}/files/[[folder]]/[[id]].json/index.ts/types.d.ts +4 -0
  146. package/pkg/test/@fixtures/app/lib/@src/{api}/files/[[folder]]/index.ts/types.d.ts +3 -0
  147. package/pkg/test/@fixtures/app/lib/@src/{api}/index/index.ts/types.d.ts +1 -0
  148. package/pkg/test/@fixtures/app/lib/@src/{api}/pages/[...path].html/index.ts/types.d.ts +3 -0
  149. package/pkg/test/@fixtures/app/lib/@src/{api}/users/[id].json/index.ts/types.d.ts +3 -0
  150. package/pkg/test/routes/base.d.ts +4 -0
  151. 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,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 API_INDEX_PATTERN = "index.ts";
374
- var PAGE_INDEX_PATTERN = "index.{tsx,vue}";
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
- `${defaults.pagesDir}/**/${PAGE_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}`
378
391
  ];
379
- var resolveRouteFile = (file, { appRoot: appRoot2, sourceFolder: sourceFolder2 }) => {
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 resolveRouteEntry = (_file, { appRoot: appRoot2, sourceFolder: sourceFolder2 }) => {
387
- const resolvedPaths = resolveRouteFile(_file, { appRoot: appRoot2, sourceFolder: sourceFolder2 });
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 importPath = dirname2(file);
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
- importPath,
442
+ importFile,
407
443
  importName
408
444
  };
409
445
  };
410
- var routes_default = async (pluginOptions) => {
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
- const resolversFactory2 = (routeFiles2) => {
431
- const resolvers2 = /* @__PURE__ */ new Map();
432
- const entries = routeFiles2.flatMap((file) => {
433
- const entry = resolveRouteEntry(file, pluginOptions);
434
- return entry ? [entry] : [];
435
- });
436
- for (const entry of entries.filter((e) => e.folder === defaults.apiDir)) {
437
- const {
438
- name,
439
- file,
440
- folder,
441
- fileFullpath,
442
- pathTokens,
443
- importPath,
444
- importName
445
- } = entry;
446
- const handler = async (updatedFile) => {
447
- const paramsSchema = pathTokens.flatMap((e) => {
448
- return e.param ? [e.param] : [];
449
- });
450
- const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
451
- const { getCache, persistCache } = cacheFactory(
452
- { file, fileFullpath, importName, importPath },
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
- appRoot: appRoot2,
455
- sourceFolder: sourceFolder2,
456
- extraContext: { resolveTypes }
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
- let cache = await getCache({ validate: true });
460
- if (!cache) {
461
- if (updatedFile === fileFullpath) {
462
- 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] : [];
463
559
  }
464
- const {
465
- typeDeclarations,
466
- paramsRefinements,
467
- methods,
468
- payloadTypes,
469
- responseTypes,
470
- referencedFiles = []
471
- } = await resolveRouteSignature(
472
- { importName, fileFullpath, optionalParams },
473
- {
474
- withReferencedFiles: true,
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
- resolvers2.set(fileFullpath, { name, handler });
579
- }
580
- for (const entry of entries.filter((e) => e.folder === defaults.pagesDir)) {
581
- const {
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
- pathTokens,
588
- importPath,
589
- importName
590
- } = entry;
591
- const handler = async () => {
592
- const route = {
593
- name,
594
- pathTokens,
595
- params: {
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
- resolvers2.set(fileFullpath, { name, handler });
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 glob(ROUTE_FILE_PATTERNS, {
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 resolvedRoutes = /* @__PURE__ */ new Map();
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 resolvedRoute = await resolver.handler();
749
+ const resolvedEntry = await resolver.handler();
686
750
  resolvers.set(file, resolver);
687
- resolvedRoutes.set(resolvedRoute.route.fileFullpath, resolvedRoute);
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 (resolvedRoutes.has(file)) {
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 = resolvedRoutes.values().filter(({ kind, route }) => {
703
- 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] : [] : [];
704
768
  });
705
- for (const { route } of referencedRoutes) {
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 route = await resolver.handler(file);
717
- resolvedRoutes.set(route.route.fileFullpath, route);
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 routes = Array.from(resolvedRoutes.values());
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(routes), event);
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 (!resolveRouteFile(file, { appRoot, sourceFolder })) {
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
- `[ ${resolvedRoutes.size + 1} of ${resolvers.size} ] ${name}`
845
+ `[ ${resolvedEntries.size + 1} of ${resolvers.size} ] ${name}`
782
846
  );
783
847
  try {
784
848
  const resolvedEntry = await handler();
785
- resolvedRoutes.set(resolvedEntry.route.fileFullpath, resolvedEntry);
849
+ resolvedEntries.set(resolvedEntry.entry.fileFullpath, resolvedEntry);
786
850
  } catch (error) {
787
851
  spinner.failed(error);
788
852
  spinner = spinnerFactory("Resolving Routes");