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