@valbuild/shared 0.88.0 → 0.90.0

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.
@@ -3098,17 +3098,17 @@ export declare const Api: {
3098
3098
  message: z.ZodString;
3099
3099
  value: z.ZodOptional<z.ZodUnknown>;
3100
3100
  fatal: z.ZodOptional<z.ZodBoolean>;
3101
- fixes: z.ZodOptional<z.ZodArray<z.ZodType<"image:change-extension" | "image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:change-extension" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys", z.ZodTypeDef, "image:change-extension" | "image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:change-extension" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys">, "many">>;
3101
+ fixes: z.ZodOptional<z.ZodArray<z.ZodType<"image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys" | "router:check-route", z.ZodTypeDef, "image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys" | "router:check-route">, "many">>;
3102
3102
  }, "strip", z.ZodTypeAny, {
3103
3103
  message: string;
3104
3104
  value?: unknown;
3105
3105
  fatal?: boolean | undefined;
3106
- fixes?: ("image:change-extension" | "image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:change-extension" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys")[] | undefined;
3106
+ fixes?: ("image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys" | "router:check-route")[] | undefined;
3107
3107
  }, {
3108
3108
  message: string;
3109
3109
  value?: unknown;
3110
3110
  fatal?: boolean | undefined;
3111
- fixes?: ("image:change-extension" | "image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:change-extension" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys")[] | undefined;
3111
+ fixes?: ("image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys" | "router:check-route")[] | undefined;
3112
3112
  }>, "many">>>;
3113
3113
  }, "strip", z.ZodTypeAny, {
3114
3114
  patches?: {
@@ -3124,7 +3124,7 @@ export declare const Api: {
3124
3124
  message: string;
3125
3125
  value?: unknown;
3126
3126
  fatal?: boolean | undefined;
3127
- fixes?: ("image:change-extension" | "image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:change-extension" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys")[] | undefined;
3127
+ fixes?: ("image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys" | "router:check-route")[] | undefined;
3128
3128
  }[]> | undefined;
3129
3129
  }, {
3130
3130
  patches?: {
@@ -3140,7 +3140,7 @@ export declare const Api: {
3140
3140
  message: string;
3141
3141
  value?: unknown;
3142
3142
  fatal?: boolean | undefined;
3143
- fixes?: ("image:change-extension" | "image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:change-extension" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys")[] | undefined;
3143
+ fixes?: ("image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys" | "router:check-route")[] | undefined;
3144
3144
  }[]> | undefined;
3145
3145
  }>>;
3146
3146
  }, "strip", z.ZodTypeAny, {
@@ -3160,7 +3160,7 @@ export declare const Api: {
3160
3160
  message: string;
3161
3161
  value?: unknown;
3162
3162
  fatal?: boolean | undefined;
3163
- fixes?: ("image:change-extension" | "image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:change-extension" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys")[] | undefined;
3163
+ fixes?: ("image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys" | "router:check-route")[] | undefined;
3164
3164
  }[]> | undefined;
3165
3165
  }>>;
3166
3166
  }, {
@@ -3180,7 +3180,7 @@ export declare const Api: {
3180
3180
  message: string;
3181
3181
  value?: unknown;
3182
3182
  fatal?: boolean | undefined;
3183
- fixes?: ("image:change-extension" | "image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:change-extension" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys")[] | undefined;
3183
+ fixes?: ("image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys" | "router:check-route")[] | undefined;
3184
3184
  }[]> | undefined;
3185
3185
  }>;
3186
3186
  }>;
@@ -3203,7 +3203,7 @@ export declare const Api: {
3203
3203
  message: string;
3204
3204
  value?: unknown;
3205
3205
  fatal?: boolean | undefined;
3206
- fixes?: ("image:change-extension" | "image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:change-extension" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys")[] | undefined;
3206
+ fixes?: ("image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys" | "router:check-route")[] | undefined;
3207
3207
  }[]> | undefined;
3208
3208
  }>>;
3209
3209
  };
@@ -3226,7 +3226,7 @@ export declare const Api: {
3226
3226
  message: string;
3227
3227
  value?: unknown;
3228
3228
  fatal?: boolean | undefined;
3229
- fixes?: ("image:change-extension" | "image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:change-extension" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys")[] | undefined;
3229
+ fixes?: ("image:add-metadata" | "image:check-metadata" | "image:upload-remote" | "image:download-remote" | "image:check-remote" | "file:add-metadata" | "file:check-metadata" | "file:upload-remote" | "file:download-remote" | "file:check-remote" | "keyof:check-keys" | "router:check-route")[] | undefined;
3230
3230
  }[]> | undefined;
3231
3231
  }>;
3232
3232
  };
@@ -11,3 +11,4 @@ export * from "./zod/ValDeployment.js";
11
11
  export * from "./getSitemapTree.js";
12
12
  export * from "./parseRoutePattern.js";
13
13
  export * from "./getNextAppRouterSourceFolder.js";
14
+ export * from "./routeValidation.js";
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Shared route validation utilities
3
+ */
4
+ export type SerializedRegExpPattern = {
5
+ source: string;
6
+ flags: string;
7
+ };
8
+ /**
9
+ * Filter routes by include/exclude patterns
10
+ */
11
+ export declare function filterRoutesByPatterns(routes: string[], includePattern?: SerializedRegExpPattern, excludePattern?: SerializedRegExpPattern): string[];
12
+ /**
13
+ * Validate a single route against include/exclude patterns
14
+ */
15
+ export declare function validateRoutePatterns(route: string, includePattern?: SerializedRegExpPattern, excludePattern?: SerializedRegExpPattern): {
16
+ valid: true;
17
+ } | {
18
+ valid: false;
19
+ message: string;
20
+ };
21
+ /**
22
+ * Create RegExp from pattern (with error handling)
23
+ */
24
+ export declare function createRegExpFromPattern(pattern: SerializedRegExpPattern): RegExp | null;
@@ -1131,7 +1131,23 @@ var SerializedDateSchema = zod.z.object({
1131
1131
  type: zod.z.literal("date"),
1132
1132
  opt: zod.z["boolean"]()
1133
1133
  });
1134
- var SerializedSchema = zod.z.union([SerializedStringSchema, SerializedLiteralSchema, SerializedBooleanSchema, SerializedNumberSchema, SerializedObjectSchema, SerializedArraySchema, SerializedUnionSchema, SerializedRichTextSchema, SerializedRecordSchema, SerializedKeyOfSchema, SerializedFileSchema, SerializedDateSchema, SerializedImageSchema]);
1134
+ var SerializedRouteSchema = zod.z.object({
1135
+ type: zod.z.literal("route"),
1136
+ options: zod.z.object({
1137
+ include: zod.z.object({
1138
+ source: zod.z.string(),
1139
+ flags: zod.z.string()
1140
+ }).optional(),
1141
+ exclude: zod.z.object({
1142
+ source: zod.z.string(),
1143
+ flags: zod.z.string()
1144
+ }).optional(),
1145
+ customValidate: zod.z["boolean"]().optional()
1146
+ }).optional(),
1147
+ opt: zod.z["boolean"](),
1148
+ customValidate: zod.z["boolean"]().optional()
1149
+ });
1150
+ var SerializedSchema = zod.z.union([SerializedStringSchema, SerializedLiteralSchema, SerializedBooleanSchema, SerializedNumberSchema, SerializedObjectSchema, SerializedArraySchema, SerializedUnionSchema, SerializedRichTextSchema, SerializedRecordSchema, SerializedKeyOfSchema, SerializedRouteSchema, SerializedFileSchema, SerializedDateSchema, SerializedImageSchema]);
1135
1151
 
1136
1152
  var ValCommit = zod.z.object({
1137
1153
  commitSha: zod.z.string(),
@@ -1163,7 +1179,7 @@ var ValConfig = zod.z.object({
1163
1179
  gitCommit: zod.z.string().optional(),
1164
1180
  gitBranch: zod.z.string().optional()
1165
1181
  });
1166
- var ValidationFixZ = zod.z.union([zod.z.literal("image:change-extension"), zod.z.literal("image:add-metadata"), zod.z.literal("image:check-metadata"), zod.z.literal("image:check-remote"), zod.z.literal("image:upload-remote"), zod.z.literal("image:download-remote"), zod.z.literal("file:change-extension"), zod.z.literal("file:add-metadata"), zod.z.literal("file:check-metadata"), zod.z.literal("file:check-remote"), zod.z.literal("file:upload-remote"), zod.z.literal("file:download-remote"), zod.z.literal("keyof:check-keys")]);
1182
+ var ValidationFixZ = zod.z.union([zod.z.literal("image:add-metadata"), zod.z.literal("image:check-metadata"), zod.z.literal("image:check-remote"), zod.z.literal("image:upload-remote"), zod.z.literal("image:download-remote"), zod.z.literal("file:add-metadata"), zod.z.literal("file:check-metadata"), zod.z.literal("file:check-remote"), zod.z.literal("file:upload-remote"), zod.z.literal("file:download-remote"), zod.z.literal("keyof:check-keys"), zod.z.literal("router:check-route")]);
1167
1183
  var ValidationError = zod.z.object({
1168
1184
  message: zod.z.string(),
1169
1185
  value: zod.z.unknown().optional(),
@@ -2410,6 +2426,112 @@ function getNextAppRouterSourceFolder(moduleFilePath) {
2410
2426
  return null;
2411
2427
  }
2412
2428
 
2429
+ /**
2430
+ * Shared route validation utilities
2431
+ */
2432
+
2433
+ /**
2434
+ * Filter routes by include/exclude patterns
2435
+ */
2436
+ function filterRoutesByPatterns(routes, includePattern, excludePattern) {
2437
+ // Validate patterns upfront and warn about issues
2438
+ var includeRegex = null;
2439
+ var excludeRegex = null;
2440
+ if (includePattern) {
2441
+ try {
2442
+ includeRegex = new RegExp(includePattern.source, includePattern.flags);
2443
+ } catch (e) {
2444
+ console.warn("[Val] Invalid include pattern: /".concat(includePattern.source, "/").concat(includePattern.flags), "\nError: ".concat(e instanceof Error ? e.message : String(e)), "\nAll routes will be filtered out due to malformed include pattern.");
2445
+ }
2446
+ }
2447
+ if (excludePattern) {
2448
+ try {
2449
+ excludeRegex = new RegExp(excludePattern.source, excludePattern.flags);
2450
+ } catch (e) {
2451
+ console.warn("[Val] Invalid exclude pattern: /".concat(excludePattern.source, "/").concat(excludePattern.flags), "\nError: ".concat(e instanceof Error ? e.message : String(e)), "\nAll routes will be filtered out due to malformed exclude pattern.");
2452
+ }
2453
+ }
2454
+ return routes.filter(function (route) {
2455
+ // Check include pattern
2456
+ if (includePattern) {
2457
+ if (!includeRegex) {
2458
+ // Pattern creation failed, filter out this route
2459
+ return false;
2460
+ }
2461
+ if (!includeRegex.test(route)) {
2462
+ return false;
2463
+ }
2464
+ }
2465
+
2466
+ // Check exclude pattern
2467
+ if (excludePattern) {
2468
+ if (!excludeRegex) {
2469
+ // Pattern creation failed, filter out this route
2470
+ return false;
2471
+ }
2472
+ if (excludeRegex.test(route)) {
2473
+ return false;
2474
+ }
2475
+ }
2476
+ return true;
2477
+ });
2478
+ }
2479
+
2480
+ /**
2481
+ * Validate a single route against include/exclude patterns
2482
+ */
2483
+ function validateRoutePatterns(route, includePattern, excludePattern) {
2484
+ // Validate include pattern
2485
+ if (includePattern) {
2486
+ try {
2487
+ var regex = new RegExp(includePattern.source, includePattern.flags);
2488
+ if (!regex.test(route)) {
2489
+ return {
2490
+ valid: false,
2491
+ message: "Route '".concat(route, "' does not match include pattern: /").concat(includePattern.source, "/").concat(includePattern.flags)
2492
+ };
2493
+ }
2494
+ } catch (e) {
2495
+ return {
2496
+ valid: false,
2497
+ message: "Invalid include pattern: ".concat(e instanceof Error ? e.message : String(e))
2498
+ };
2499
+ }
2500
+ }
2501
+
2502
+ // Validate exclude pattern
2503
+ if (excludePattern) {
2504
+ try {
2505
+ var _regex = new RegExp(excludePattern.source, excludePattern.flags);
2506
+ if (_regex.test(route)) {
2507
+ return {
2508
+ valid: false,
2509
+ message: "Route '".concat(route, "' matches exclude pattern: /").concat(excludePattern.source, "/").concat(excludePattern.flags)
2510
+ };
2511
+ }
2512
+ } catch (e) {
2513
+ return {
2514
+ valid: false,
2515
+ message: "Invalid exclude pattern: ".concat(e instanceof Error ? e.message : String(e))
2516
+ };
2517
+ }
2518
+ }
2519
+ return {
2520
+ valid: true
2521
+ };
2522
+ }
2523
+
2524
+ /**
2525
+ * Create RegExp from pattern (with error handling)
2526
+ */
2527
+ function createRegExpFromPattern(pattern) {
2528
+ try {
2529
+ return new RegExp(pattern.source, pattern.flags);
2530
+ } catch (_unused) {
2531
+ return null;
2532
+ }
2533
+ }
2534
+
2413
2535
  exports.Api = Api;
2414
2536
  exports.ParentRef = ParentRef$1;
2415
2537
  exports.Patch = Patch;
@@ -2435,7 +2557,9 @@ exports.VAL_STATE_COOKIE = VAL_STATE_COOKIE;
2435
2557
  exports.VAL_THEME_SESSION_STORAGE_KEY = VAL_THEME_SESSION_STORAGE_KEY;
2436
2558
  exports.ValCommit = ValCommit;
2437
2559
  exports.ValDeployment = ValDeployment;
2560
+ exports.createRegExpFromPattern = createRegExpFromPattern;
2438
2561
  exports.createValClient = createValClient;
2562
+ exports.filterRoutesByPatterns = filterRoutesByPatterns;
2439
2563
  exports.getNextAppRouterSitemapTree = getNextAppRouterSitemapTree;
2440
2564
  exports.getNextAppRouterSourceFolder = getNextAppRouterSourceFolder;
2441
2565
  exports.getPatternFromModuleFilePath = getPatternFromModuleFilePath;
@@ -2443,3 +2567,4 @@ exports.parseRoutePattern = parseRoutePattern;
2443
2567
  exports.remirrorToRichTextSource = remirrorToRichTextSource;
2444
2568
  exports.richTextToRemirror = richTextToRemirror;
2445
2569
  exports.urlOf = urlOf;
2570
+ exports.validateRoutePatterns = validateRoutePatterns;
@@ -1131,7 +1131,23 @@ var SerializedDateSchema = zod.z.object({
1131
1131
  type: zod.z.literal("date"),
1132
1132
  opt: zod.z["boolean"]()
1133
1133
  });
1134
- var SerializedSchema = zod.z.union([SerializedStringSchema, SerializedLiteralSchema, SerializedBooleanSchema, SerializedNumberSchema, SerializedObjectSchema, SerializedArraySchema, SerializedUnionSchema, SerializedRichTextSchema, SerializedRecordSchema, SerializedKeyOfSchema, SerializedFileSchema, SerializedDateSchema, SerializedImageSchema]);
1134
+ var SerializedRouteSchema = zod.z.object({
1135
+ type: zod.z.literal("route"),
1136
+ options: zod.z.object({
1137
+ include: zod.z.object({
1138
+ source: zod.z.string(),
1139
+ flags: zod.z.string()
1140
+ }).optional(),
1141
+ exclude: zod.z.object({
1142
+ source: zod.z.string(),
1143
+ flags: zod.z.string()
1144
+ }).optional(),
1145
+ customValidate: zod.z["boolean"]().optional()
1146
+ }).optional(),
1147
+ opt: zod.z["boolean"](),
1148
+ customValidate: zod.z["boolean"]().optional()
1149
+ });
1150
+ var SerializedSchema = zod.z.union([SerializedStringSchema, SerializedLiteralSchema, SerializedBooleanSchema, SerializedNumberSchema, SerializedObjectSchema, SerializedArraySchema, SerializedUnionSchema, SerializedRichTextSchema, SerializedRecordSchema, SerializedKeyOfSchema, SerializedRouteSchema, SerializedFileSchema, SerializedDateSchema, SerializedImageSchema]);
1135
1151
 
1136
1152
  var ValCommit = zod.z.object({
1137
1153
  commitSha: zod.z.string(),
@@ -1163,7 +1179,7 @@ var ValConfig = zod.z.object({
1163
1179
  gitCommit: zod.z.string().optional(),
1164
1180
  gitBranch: zod.z.string().optional()
1165
1181
  });
1166
- var ValidationFixZ = zod.z.union([zod.z.literal("image:change-extension"), zod.z.literal("image:add-metadata"), zod.z.literal("image:check-metadata"), zod.z.literal("image:check-remote"), zod.z.literal("image:upload-remote"), zod.z.literal("image:download-remote"), zod.z.literal("file:change-extension"), zod.z.literal("file:add-metadata"), zod.z.literal("file:check-metadata"), zod.z.literal("file:check-remote"), zod.z.literal("file:upload-remote"), zod.z.literal("file:download-remote"), zod.z.literal("keyof:check-keys")]);
1182
+ var ValidationFixZ = zod.z.union([zod.z.literal("image:add-metadata"), zod.z.literal("image:check-metadata"), zod.z.literal("image:check-remote"), zod.z.literal("image:upload-remote"), zod.z.literal("image:download-remote"), zod.z.literal("file:add-metadata"), zod.z.literal("file:check-metadata"), zod.z.literal("file:check-remote"), zod.z.literal("file:upload-remote"), zod.z.literal("file:download-remote"), zod.z.literal("keyof:check-keys"), zod.z.literal("router:check-route")]);
1167
1183
  var ValidationError = zod.z.object({
1168
1184
  message: zod.z.string(),
1169
1185
  value: zod.z.unknown().optional(),
@@ -2410,6 +2426,112 @@ function getNextAppRouterSourceFolder(moduleFilePath) {
2410
2426
  return null;
2411
2427
  }
2412
2428
 
2429
+ /**
2430
+ * Shared route validation utilities
2431
+ */
2432
+
2433
+ /**
2434
+ * Filter routes by include/exclude patterns
2435
+ */
2436
+ function filterRoutesByPatterns(routes, includePattern, excludePattern) {
2437
+ // Validate patterns upfront and warn about issues
2438
+ var includeRegex = null;
2439
+ var excludeRegex = null;
2440
+ if (includePattern) {
2441
+ try {
2442
+ includeRegex = new RegExp(includePattern.source, includePattern.flags);
2443
+ } catch (e) {
2444
+ console.warn("[Val] Invalid include pattern: /".concat(includePattern.source, "/").concat(includePattern.flags), "\nError: ".concat(e instanceof Error ? e.message : String(e)), "\nAll routes will be filtered out due to malformed include pattern.");
2445
+ }
2446
+ }
2447
+ if (excludePattern) {
2448
+ try {
2449
+ excludeRegex = new RegExp(excludePattern.source, excludePattern.flags);
2450
+ } catch (e) {
2451
+ console.warn("[Val] Invalid exclude pattern: /".concat(excludePattern.source, "/").concat(excludePattern.flags), "\nError: ".concat(e instanceof Error ? e.message : String(e)), "\nAll routes will be filtered out due to malformed exclude pattern.");
2452
+ }
2453
+ }
2454
+ return routes.filter(function (route) {
2455
+ // Check include pattern
2456
+ if (includePattern) {
2457
+ if (!includeRegex) {
2458
+ // Pattern creation failed, filter out this route
2459
+ return false;
2460
+ }
2461
+ if (!includeRegex.test(route)) {
2462
+ return false;
2463
+ }
2464
+ }
2465
+
2466
+ // Check exclude pattern
2467
+ if (excludePattern) {
2468
+ if (!excludeRegex) {
2469
+ // Pattern creation failed, filter out this route
2470
+ return false;
2471
+ }
2472
+ if (excludeRegex.test(route)) {
2473
+ return false;
2474
+ }
2475
+ }
2476
+ return true;
2477
+ });
2478
+ }
2479
+
2480
+ /**
2481
+ * Validate a single route against include/exclude patterns
2482
+ */
2483
+ function validateRoutePatterns(route, includePattern, excludePattern) {
2484
+ // Validate include pattern
2485
+ if (includePattern) {
2486
+ try {
2487
+ var regex = new RegExp(includePattern.source, includePattern.flags);
2488
+ if (!regex.test(route)) {
2489
+ return {
2490
+ valid: false,
2491
+ message: "Route '".concat(route, "' does not match include pattern: /").concat(includePattern.source, "/").concat(includePattern.flags)
2492
+ };
2493
+ }
2494
+ } catch (e) {
2495
+ return {
2496
+ valid: false,
2497
+ message: "Invalid include pattern: ".concat(e instanceof Error ? e.message : String(e))
2498
+ };
2499
+ }
2500
+ }
2501
+
2502
+ // Validate exclude pattern
2503
+ if (excludePattern) {
2504
+ try {
2505
+ var _regex = new RegExp(excludePattern.source, excludePattern.flags);
2506
+ if (_regex.test(route)) {
2507
+ return {
2508
+ valid: false,
2509
+ message: "Route '".concat(route, "' matches exclude pattern: /").concat(excludePattern.source, "/").concat(excludePattern.flags)
2510
+ };
2511
+ }
2512
+ } catch (e) {
2513
+ return {
2514
+ valid: false,
2515
+ message: "Invalid exclude pattern: ".concat(e instanceof Error ? e.message : String(e))
2516
+ };
2517
+ }
2518
+ }
2519
+ return {
2520
+ valid: true
2521
+ };
2522
+ }
2523
+
2524
+ /**
2525
+ * Create RegExp from pattern (with error handling)
2526
+ */
2527
+ function createRegExpFromPattern(pattern) {
2528
+ try {
2529
+ return new RegExp(pattern.source, pattern.flags);
2530
+ } catch (_unused) {
2531
+ return null;
2532
+ }
2533
+ }
2534
+
2413
2535
  exports.Api = Api;
2414
2536
  exports.ParentRef = ParentRef$1;
2415
2537
  exports.Patch = Patch;
@@ -2435,7 +2557,9 @@ exports.VAL_STATE_COOKIE = VAL_STATE_COOKIE;
2435
2557
  exports.VAL_THEME_SESSION_STORAGE_KEY = VAL_THEME_SESSION_STORAGE_KEY;
2436
2558
  exports.ValCommit = ValCommit;
2437
2559
  exports.ValDeployment = ValDeployment;
2560
+ exports.createRegExpFromPattern = createRegExpFromPattern;
2438
2561
  exports.createValClient = createValClient;
2562
+ exports.filterRoutesByPatterns = filterRoutesByPatterns;
2439
2563
  exports.getNextAppRouterSitemapTree = getNextAppRouterSitemapTree;
2440
2564
  exports.getNextAppRouterSourceFolder = getNextAppRouterSourceFolder;
2441
2565
  exports.getPatternFromModuleFilePath = getPatternFromModuleFilePath;
@@ -2443,3 +2567,4 @@ exports.parseRoutePattern = parseRoutePattern;
2443
2567
  exports.remirrorToRichTextSource = remirrorToRichTextSource;
2444
2568
  exports.richTextToRemirror = richTextToRemirror;
2445
2569
  exports.urlOf = urlOf;
2570
+ exports.validateRoutePatterns = validateRoutePatterns;
@@ -1127,7 +1127,23 @@ var SerializedDateSchema = z.object({
1127
1127
  type: z.literal("date"),
1128
1128
  opt: z["boolean"]()
1129
1129
  });
1130
- var SerializedSchema = z.union([SerializedStringSchema, SerializedLiteralSchema, SerializedBooleanSchema, SerializedNumberSchema, SerializedObjectSchema, SerializedArraySchema, SerializedUnionSchema, SerializedRichTextSchema, SerializedRecordSchema, SerializedKeyOfSchema, SerializedFileSchema, SerializedDateSchema, SerializedImageSchema]);
1130
+ var SerializedRouteSchema = z.object({
1131
+ type: z.literal("route"),
1132
+ options: z.object({
1133
+ include: z.object({
1134
+ source: z.string(),
1135
+ flags: z.string()
1136
+ }).optional(),
1137
+ exclude: z.object({
1138
+ source: z.string(),
1139
+ flags: z.string()
1140
+ }).optional(),
1141
+ customValidate: z["boolean"]().optional()
1142
+ }).optional(),
1143
+ opt: z["boolean"](),
1144
+ customValidate: z["boolean"]().optional()
1145
+ });
1146
+ var SerializedSchema = z.union([SerializedStringSchema, SerializedLiteralSchema, SerializedBooleanSchema, SerializedNumberSchema, SerializedObjectSchema, SerializedArraySchema, SerializedUnionSchema, SerializedRichTextSchema, SerializedRecordSchema, SerializedKeyOfSchema, SerializedRouteSchema, SerializedFileSchema, SerializedDateSchema, SerializedImageSchema]);
1131
1147
 
1132
1148
  var ValCommit = z.object({
1133
1149
  commitSha: z.string(),
@@ -1159,7 +1175,7 @@ var ValConfig = z.object({
1159
1175
  gitCommit: z.string().optional(),
1160
1176
  gitBranch: z.string().optional()
1161
1177
  });
1162
- var ValidationFixZ = z.union([z.literal("image:change-extension"), z.literal("image:add-metadata"), z.literal("image:check-metadata"), z.literal("image:check-remote"), z.literal("image:upload-remote"), z.literal("image:download-remote"), z.literal("file:change-extension"), z.literal("file:add-metadata"), z.literal("file:check-metadata"), z.literal("file:check-remote"), z.literal("file:upload-remote"), z.literal("file:download-remote"), z.literal("keyof:check-keys")]);
1178
+ var ValidationFixZ = z.union([z.literal("image:add-metadata"), z.literal("image:check-metadata"), z.literal("image:check-remote"), z.literal("image:upload-remote"), z.literal("image:download-remote"), z.literal("file:add-metadata"), z.literal("file:check-metadata"), z.literal("file:check-remote"), z.literal("file:upload-remote"), z.literal("file:download-remote"), z.literal("keyof:check-keys"), z.literal("router:check-route")]);
1163
1179
  var ValidationError = z.object({
1164
1180
  message: z.string(),
1165
1181
  value: z.unknown().optional(),
@@ -2406,4 +2422,110 @@ function getNextAppRouterSourceFolder(moduleFilePath) {
2406
2422
  return null;
2407
2423
  }
2408
2424
 
2409
- export { Api, ParentRef$1 as ParentRef, Patch, PatchBlock, PatchId, PatchJSON, RemirrorBr, RemirrorBulletList, RemirrorHeading, RemirrorImage, RemirrorJSON, RemirrorLinkMark, RemirrorListItem, RemirrorOrderedList, RemirrorParagraph, RemirrorText, RemirrorTextMark, SharedValConfig, VAL_CONFIG_SESSION_STORAGE_KEY, VAL_ENABLE_COOKIE_NAME, VAL_SESSION_COOKIE, VAL_STATE_COOKIE, VAL_THEME_SESSION_STORAGE_KEY, ValCommit, ValDeployment, createValClient, getNextAppRouterSitemapTree, getNextAppRouterSourceFolder, getPatternFromModuleFilePath, parseRoutePattern, remirrorToRichTextSource, richTextToRemirror, urlOf };
2425
+ /**
2426
+ * Shared route validation utilities
2427
+ */
2428
+
2429
+ /**
2430
+ * Filter routes by include/exclude patterns
2431
+ */
2432
+ function filterRoutesByPatterns(routes, includePattern, excludePattern) {
2433
+ // Validate patterns upfront and warn about issues
2434
+ var includeRegex = null;
2435
+ var excludeRegex = null;
2436
+ if (includePattern) {
2437
+ try {
2438
+ includeRegex = new RegExp(includePattern.source, includePattern.flags);
2439
+ } catch (e) {
2440
+ console.warn("[Val] Invalid include pattern: /".concat(includePattern.source, "/").concat(includePattern.flags), "\nError: ".concat(e instanceof Error ? e.message : String(e)), "\nAll routes will be filtered out due to malformed include pattern.");
2441
+ }
2442
+ }
2443
+ if (excludePattern) {
2444
+ try {
2445
+ excludeRegex = new RegExp(excludePattern.source, excludePattern.flags);
2446
+ } catch (e) {
2447
+ console.warn("[Val] Invalid exclude pattern: /".concat(excludePattern.source, "/").concat(excludePattern.flags), "\nError: ".concat(e instanceof Error ? e.message : String(e)), "\nAll routes will be filtered out due to malformed exclude pattern.");
2448
+ }
2449
+ }
2450
+ return routes.filter(function (route) {
2451
+ // Check include pattern
2452
+ if (includePattern) {
2453
+ if (!includeRegex) {
2454
+ // Pattern creation failed, filter out this route
2455
+ return false;
2456
+ }
2457
+ if (!includeRegex.test(route)) {
2458
+ return false;
2459
+ }
2460
+ }
2461
+
2462
+ // Check exclude pattern
2463
+ if (excludePattern) {
2464
+ if (!excludeRegex) {
2465
+ // Pattern creation failed, filter out this route
2466
+ return false;
2467
+ }
2468
+ if (excludeRegex.test(route)) {
2469
+ return false;
2470
+ }
2471
+ }
2472
+ return true;
2473
+ });
2474
+ }
2475
+
2476
+ /**
2477
+ * Validate a single route against include/exclude patterns
2478
+ */
2479
+ function validateRoutePatterns(route, includePattern, excludePattern) {
2480
+ // Validate include pattern
2481
+ if (includePattern) {
2482
+ try {
2483
+ var regex = new RegExp(includePattern.source, includePattern.flags);
2484
+ if (!regex.test(route)) {
2485
+ return {
2486
+ valid: false,
2487
+ message: "Route '".concat(route, "' does not match include pattern: /").concat(includePattern.source, "/").concat(includePattern.flags)
2488
+ };
2489
+ }
2490
+ } catch (e) {
2491
+ return {
2492
+ valid: false,
2493
+ message: "Invalid include pattern: ".concat(e instanceof Error ? e.message : String(e))
2494
+ };
2495
+ }
2496
+ }
2497
+
2498
+ // Validate exclude pattern
2499
+ if (excludePattern) {
2500
+ try {
2501
+ var _regex = new RegExp(excludePattern.source, excludePattern.flags);
2502
+ if (_regex.test(route)) {
2503
+ return {
2504
+ valid: false,
2505
+ message: "Route '".concat(route, "' matches exclude pattern: /").concat(excludePattern.source, "/").concat(excludePattern.flags)
2506
+ };
2507
+ }
2508
+ } catch (e) {
2509
+ return {
2510
+ valid: false,
2511
+ message: "Invalid exclude pattern: ".concat(e instanceof Error ? e.message : String(e))
2512
+ };
2513
+ }
2514
+ }
2515
+ return {
2516
+ valid: true
2517
+ };
2518
+ }
2519
+
2520
+ /**
2521
+ * Create RegExp from pattern (with error handling)
2522
+ */
2523
+ function createRegExpFromPattern(pattern) {
2524
+ try {
2525
+ return new RegExp(pattern.source, pattern.flags);
2526
+ } catch (_unused) {
2527
+ return null;
2528
+ }
2529
+ }
2530
+
2531
+ export { Api, ParentRef$1 as ParentRef, Patch, PatchBlock, PatchId, PatchJSON, RemirrorBr, RemirrorBulletList, RemirrorHeading, RemirrorImage, RemirrorJSON, RemirrorLinkMark, RemirrorListItem, RemirrorOrderedList, RemirrorParagraph, RemirrorText, RemirrorTextMark, SharedValConfig, VAL_CONFIG_SESSION_STORAGE_KEY, VAL_ENABLE_COOKIE_NAME, VAL_SESSION_COOKIE, VAL_STATE_COOKIE, VAL_THEME_SESSION_STORAGE_KEY, ValCommit, ValDeployment, createRegExpFromPattern, createValClient, filterRoutesByPatterns, getNextAppRouterSitemapTree, getNextAppRouterSourceFolder, getPatternFromModuleFilePath, parseRoutePattern, remirrorToRichTextSource, richTextToRemirror, urlOf, validateRoutePatterns };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@valbuild/shared",
3
- "version": "0.88.0",
3
+ "version": "0.90.0",
4
4
  "private": false,
5
5
  "description": "Val shared types and utilities",
6
6
  "repository": {
@@ -33,7 +33,7 @@
33
33
  "exports": true
34
34
  },
35
35
  "dependencies": {
36
- "@valbuild/core": "~0.88.0",
36
+ "@valbuild/core": "~0.90.0",
37
37
  "zod": "^3.22.4",
38
38
  "zod-validation-error": "^3.3.0"
39
39
  },