@benjavicente/router-generator 1.166.24

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 (108) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  3. package/dist/cjs/config.cjs +134 -0
  4. package/dist/cjs/config.cjs.map +1 -0
  5. package/dist/cjs/config.d.cts +254 -0
  6. package/dist/cjs/filesystem/physical/getRouteNodes.cjs +234 -0
  7. package/dist/cjs/filesystem/physical/getRouteNodes.cjs.map +1 -0
  8. package/dist/cjs/filesystem/physical/getRouteNodes.d.cts +25 -0
  9. package/dist/cjs/filesystem/physical/rootPathId.cjs +6 -0
  10. package/dist/cjs/filesystem/physical/rootPathId.cjs.map +1 -0
  11. package/dist/cjs/filesystem/physical/rootPathId.d.cts +1 -0
  12. package/dist/cjs/filesystem/virtual/config.cjs +39 -0
  13. package/dist/cjs/filesystem/virtual/config.cjs.map +1 -0
  14. package/dist/cjs/filesystem/virtual/config.d.cts +3 -0
  15. package/dist/cjs/filesystem/virtual/getRouteNodes.cjs +175 -0
  16. package/dist/cjs/filesystem/virtual/getRouteNodes.cjs.map +1 -0
  17. package/dist/cjs/filesystem/virtual/getRouteNodes.d.cts +9 -0
  18. package/dist/cjs/filesystem/virtual/loadConfigFile.cjs +12 -0
  19. package/dist/cjs/filesystem/virtual/loadConfigFile.cjs.map +1 -0
  20. package/dist/cjs/filesystem/virtual/loadConfigFile.d.cts +1 -0
  21. package/dist/cjs/generator.cjs +805 -0
  22. package/dist/cjs/generator.cjs.map +1 -0
  23. package/dist/cjs/generator.d.cts +116 -0
  24. package/dist/cjs/index.cjs +33 -0
  25. package/dist/cjs/index.d.cts +12 -0
  26. package/dist/cjs/logger.cjs +31 -0
  27. package/dist/cjs/logger.cjs.map +1 -0
  28. package/dist/cjs/logger.d.cts +10 -0
  29. package/dist/cjs/plugin/types.d.cts +18 -0
  30. package/dist/cjs/template.cjs +203 -0
  31. package/dist/cjs/template.cjs.map +1 -0
  32. package/dist/cjs/template.d.cts +34 -0
  33. package/dist/cjs/transform/transform.cjs +302 -0
  34. package/dist/cjs/transform/transform.cjs.map +1 -0
  35. package/dist/cjs/transform/transform.d.cts +4 -0
  36. package/dist/cjs/transform/types.d.cts +31 -0
  37. package/dist/cjs/transform/utils.cjs +34 -0
  38. package/dist/cjs/transform/utils.cjs.map +1 -0
  39. package/dist/cjs/transform/utils.d.cts +2 -0
  40. package/dist/cjs/types.d.cts +57 -0
  41. package/dist/cjs/utils.cjs +653 -0
  42. package/dist/cjs/utils.cjs.map +1 -0
  43. package/dist/cjs/utils.d.cts +212 -0
  44. package/dist/cjs/validate-route-params.cjs +73 -0
  45. package/dist/cjs/validate-route-params.cjs.map +1 -0
  46. package/dist/cjs/validate-route-params.d.cts +9 -0
  47. package/dist/esm/config.d.ts +254 -0
  48. package/dist/esm/config.js +129 -0
  49. package/dist/esm/config.js.map +1 -0
  50. package/dist/esm/filesystem/physical/getRouteNodes.d.ts +25 -0
  51. package/dist/esm/filesystem/physical/getRouteNodes.js +230 -0
  52. package/dist/esm/filesystem/physical/getRouteNodes.js.map +1 -0
  53. package/dist/esm/filesystem/physical/rootPathId.d.ts +1 -0
  54. package/dist/esm/filesystem/physical/rootPathId.js +6 -0
  55. package/dist/esm/filesystem/physical/rootPathId.js.map +1 -0
  56. package/dist/esm/filesystem/virtual/config.d.ts +3 -0
  57. package/dist/esm/filesystem/virtual/config.js +38 -0
  58. package/dist/esm/filesystem/virtual/config.js.map +1 -0
  59. package/dist/esm/filesystem/virtual/getRouteNodes.d.ts +9 -0
  60. package/dist/esm/filesystem/virtual/getRouteNodes.js +173 -0
  61. package/dist/esm/filesystem/virtual/getRouteNodes.js.map +1 -0
  62. package/dist/esm/filesystem/virtual/loadConfigFile.d.ts +1 -0
  63. package/dist/esm/filesystem/virtual/loadConfigFile.js +11 -0
  64. package/dist/esm/filesystem/virtual/loadConfigFile.js.map +1 -0
  65. package/dist/esm/generator.d.ts +116 -0
  66. package/dist/esm/generator.js +801 -0
  67. package/dist/esm/generator.js.map +1 -0
  68. package/dist/esm/index.d.ts +12 -0
  69. package/dist/esm/index.js +8 -0
  70. package/dist/esm/logger.d.ts +10 -0
  71. package/dist/esm/logger.js +31 -0
  72. package/dist/esm/logger.js.map +1 -0
  73. package/dist/esm/plugin/types.d.ts +18 -0
  74. package/dist/esm/template.d.ts +34 -0
  75. package/dist/esm/template.js +202 -0
  76. package/dist/esm/template.js.map +1 -0
  77. package/dist/esm/transform/transform.d.ts +4 -0
  78. package/dist/esm/transform/transform.js +301 -0
  79. package/dist/esm/transform/transform.js.map +1 -0
  80. package/dist/esm/transform/types.d.ts +31 -0
  81. package/dist/esm/transform/utils.d.ts +2 -0
  82. package/dist/esm/transform/utils.js +34 -0
  83. package/dist/esm/transform/utils.js.map +1 -0
  84. package/dist/esm/types.d.ts +57 -0
  85. package/dist/esm/utils.d.ts +212 -0
  86. package/dist/esm/utils.js +609 -0
  87. package/dist/esm/utils.js.map +1 -0
  88. package/dist/esm/validate-route-params.d.ts +9 -0
  89. package/dist/esm/validate-route-params.js +73 -0
  90. package/dist/esm/validate-route-params.js.map +1 -0
  91. package/package.json +82 -0
  92. package/src/config.ts +247 -0
  93. package/src/filesystem/physical/getRouteNodes.ts +541 -0
  94. package/src/filesystem/physical/rootPathId.ts +1 -0
  95. package/src/filesystem/virtual/config.ts +45 -0
  96. package/src/filesystem/virtual/getRouteNodes.ts +307 -0
  97. package/src/filesystem/virtual/loadConfigFile.ts +8 -0
  98. package/src/generator.ts +1686 -0
  99. package/src/index.ts +54 -0
  100. package/src/logger.ts +43 -0
  101. package/src/plugin/types.ts +18 -0
  102. package/src/template.ts +313 -0
  103. package/src/transform/transform.ts +534 -0
  104. package/src/transform/types.ts +39 -0
  105. package/src/transform/utils.ts +42 -0
  106. package/src/types.ts +74 -0
  107. package/src/utils.ts +1067 -0
  108. package/src/validate-route-params.ts +118 -0
@@ -0,0 +1,118 @@
1
+ import type { Logger } from './logger'
2
+
3
+ /**
4
+ * Regex for valid JavaScript identifier (param name)
5
+ * Must start with letter, underscore, or dollar sign
6
+ * Can contain letters, numbers, underscores, or dollar signs
7
+ */
8
+ const VALID_PARAM_NAME_REGEX = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/
9
+
10
+ interface ExtractedParam {
11
+ /** The param name without $ prefix (e.g., "userId", "optional") */
12
+ paramName: string
13
+ /** Whether this param name is valid */
14
+ isValid: boolean
15
+ }
16
+
17
+ /**
18
+ * Extracts param names from a route path segment.
19
+ *
20
+ * Handles these patterns:
21
+ * - $paramName -> extract "paramName"
22
+ * - {$paramName} -> extract "paramName"
23
+ * - prefix{$paramName}suffix -> extract "paramName"
24
+ * - {-$paramName} -> extract "paramName" (optional)
25
+ * - prefix{-$paramName}suffix -> extract "paramName" (optional)
26
+ * - $ or {$} -> wildcard, skip validation
27
+ */
28
+ function extractParamsFromSegment(segment: string): Array<ExtractedParam> {
29
+ const params: Array<ExtractedParam> = []
30
+
31
+ // Skip empty segments
32
+ if (!segment || !segment.includes('$')) {
33
+ return params
34
+ }
35
+
36
+ // Check for wildcard ($ alone or {$})
37
+ if (segment === '$' || segment === '{$}') {
38
+ return params // Wildcard, no param name to validate
39
+ }
40
+
41
+ // Pattern 1: Simple $paramName (entire segment starts with $)
42
+ if (segment.startsWith('$') && !segment.includes('{')) {
43
+ const paramName = segment.slice(1)
44
+ if (paramName) {
45
+ params.push({
46
+ paramName,
47
+ isValid: VALID_PARAM_NAME_REGEX.test(paramName),
48
+ })
49
+ }
50
+ return params
51
+ }
52
+
53
+ // Pattern 2: Braces pattern {$paramName} or {-$paramName} with optional prefix/suffix
54
+ // Match patterns like: prefix{$param}suffix, {$param}, {-$param}
55
+ const bracePattern = /\{(-?\$)([^}]*)\}/g
56
+ let match
57
+
58
+ while ((match = bracePattern.exec(segment)) !== null) {
59
+ const paramName = match[2] // The param name after $ or -$
60
+
61
+ if (!paramName) {
62
+ // This is a wildcard {$} or {-$}, skip
63
+ continue
64
+ }
65
+
66
+ params.push({
67
+ paramName,
68
+ isValid: VALID_PARAM_NAME_REGEX.test(paramName),
69
+ })
70
+ }
71
+
72
+ return params
73
+ }
74
+
75
+ /**
76
+ * Extracts all params from a route path.
77
+ *
78
+ * @param path - The route path (e.g., "/users/$userId/posts/$postId")
79
+ * @returns Array of extracted params with validation info
80
+ */
81
+ function extractParamsFromPath(path: string): Array<ExtractedParam> {
82
+ if (!path || !path.includes('$')) {
83
+ return []
84
+ }
85
+
86
+ const segments = path.split('/')
87
+ const allParams: Array<ExtractedParam> = []
88
+
89
+ for (const segment of segments) {
90
+ const params = extractParamsFromSegment(segment)
91
+ allParams.push(...params)
92
+ }
93
+
94
+ return allParams
95
+ }
96
+
97
+ /**
98
+ * Validates route params and logs warnings for invalid param names.
99
+ *
100
+ * @param routePath - The route path to validate
101
+ * @param filePath - The file path for error messages
102
+ * @param logger - Logger instance for warnings
103
+ */
104
+ export function validateRouteParams(
105
+ routePath: string,
106
+ filePath: string,
107
+ logger: Logger,
108
+ ): void {
109
+ const params = extractParamsFromPath(routePath)
110
+ const invalidParams = params.filter((p) => !p.isValid)
111
+
112
+ for (const param of invalidParams) {
113
+ logger.warn(
114
+ `WARNING: Invalid param name "${param.paramName}" in route "${routePath}" (file: ${filePath}). ` +
115
+ `Param names must be valid JavaScript identifiers (match /[a-zA-Z_$][a-zA-Z0-9_$]*/).`,
116
+ )
117
+ }
118
+ }