@valbuild/core 0.83.0 → 0.84.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.
@@ -189,7 +189,7 @@ var Schema = /*#__PURE__*/function () {
189
189
  }
190
190
  return _createClass(Schema, [{
191
191
  key: "executeCustomValidateFunctions",
192
- value: function executeCustomValidateFunctions(src, customValidateFunctions) {
192
+ value: function executeCustomValidateFunctions(src, customValidateFunctions, ctx) {
193
193
  var errors = [];
194
194
  var _iterator = _createForOfIteratorHelper(customValidateFunctions),
195
195
  _step;
@@ -197,7 +197,7 @@ var Schema = /*#__PURE__*/function () {
197
197
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
198
198
  var customValidateFunction = _step.value;
199
199
  try {
200
- var result = customValidateFunction(src);
200
+ var result = customValidateFunction(src, ctx);
201
201
  if (result) {
202
202
  errors.push({
203
203
  message: result,
@@ -403,7 +403,9 @@ var FileSchema = /*#__PURE__*/function (_Schema) {
403
403
  }, {
404
404
  key: "executeValidate",
405
405
  value: function executeValidate(path, src) {
406
- var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions);
406
+ var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions, {
407
+ path: path
408
+ });
407
409
  if (this.opt && (src === null || src === undefined)) {
408
410
  return customValidationErrors.length > 0 ? _defineProperty({}, path, customValidationErrors) : false;
409
411
  }
@@ -666,6 +668,170 @@ function unsafeCreateSourcePath(path, itemKey) {
666
668
  return "".concat(path).concat(Internal.ModuleFilePathSep).concat(JSON.stringify(itemKey));
667
669
  }
668
670
 
671
+ var StringSchema = /*#__PURE__*/function (_Schema) {
672
+ function StringSchema(options) {
673
+ var _this;
674
+ var opt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
675
+ var isRaw = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
676
+ var customValidateFunctions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
677
+ _classCallCheck(this, StringSchema);
678
+ _this = _callSuper(this, StringSchema);
679
+ _this.options = options;
680
+ _this.opt = opt;
681
+ _this.isRaw = isRaw;
682
+ _this.customValidateFunctions = customValidateFunctions;
683
+ return _this;
684
+ }
685
+
686
+ /**
687
+ * @deprecated Use `minLength` instead
688
+ */
689
+ _inherits(StringSchema, _Schema);
690
+ return _createClass(StringSchema, [{
691
+ key: "min",
692
+ value: function min(minLength) {
693
+ return this.minLength(minLength);
694
+ }
695
+ }, {
696
+ key: "minLength",
697
+ value: function minLength(_minLength) {
698
+ return new StringSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
699
+ minLength: _minLength
700
+ }), this.opt, this.isRaw);
701
+ }
702
+
703
+ /**
704
+ * @deprecated Use `maxLength` instead
705
+ */
706
+ }, {
707
+ key: "max",
708
+ value: function max(maxLength) {
709
+ return this.maxLength(maxLength);
710
+ }
711
+ }, {
712
+ key: "maxLength",
713
+ value: function maxLength(_maxLength) {
714
+ return new StringSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
715
+ maxLength: _maxLength
716
+ }), this.opt, this.isRaw);
717
+ }
718
+ }, {
719
+ key: "regexp",
720
+ value: function regexp(_regexp, message) {
721
+ return new StringSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
722
+ regexp: _regexp,
723
+ regExpMessage: message
724
+ }), this.opt, this.isRaw);
725
+ }
726
+ }, {
727
+ key: "validate",
728
+ value: function validate(validationFunction) {
729
+ return new StringSchema(this.options, this.opt, this.isRaw, this.customValidateFunctions.concat(validationFunction));
730
+ }
731
+ }, {
732
+ key: "executeValidate",
733
+ value: function executeValidate(path, src) {
734
+ var _this$options, _this$options2, _this$options3;
735
+ var errors = this.executeCustomValidateFunctions(src, this.customValidateFunctions, {
736
+ path: path
737
+ });
738
+ if (this.opt && (src === null || src === undefined)) {
739
+ return errors.length > 0 ? _defineProperty({}, path, errors) : false;
740
+ }
741
+ if (typeof src !== "string") {
742
+ return _defineProperty({}, path, [{
743
+ message: "Expected 'string', got '".concat(_typeof(src), "'"),
744
+ value: src
745
+ }]);
746
+ }
747
+ if ((_this$options = this.options) !== null && _this$options !== void 0 && _this$options.maxLength && src.length > this.options.maxLength) {
748
+ errors.push({
749
+ message: "Expected string to be at most ".concat(this.options.maxLength, " characters long, got ").concat(src.length),
750
+ value: src
751
+ });
752
+ }
753
+ if ((_this$options2 = this.options) !== null && _this$options2 !== void 0 && _this$options2.minLength && src.length < this.options.minLength) {
754
+ errors.push({
755
+ message: "Expected string to be at least ".concat(this.options.minLength, " characters long, got ").concat(src.length),
756
+ value: src
757
+ });
758
+ }
759
+ if ((_this$options3 = this.options) !== null && _this$options3 !== void 0 && _this$options3.regexp && !this.options.regexp.test(src)) {
760
+ errors.push({
761
+ message: this.options.regExpMessage || "Expected string to match reg exp: ".concat(this.options.regexp.toString(), ", got '").concat(src, "'"),
762
+ value: src
763
+ });
764
+ }
765
+ if (errors.length > 0) {
766
+ return _defineProperty({}, path, errors);
767
+ }
768
+ return false;
769
+ }
770
+ }, {
771
+ key: "executeAssert",
772
+ value: function executeAssert(path, src) {
773
+ if (this.opt && src === null) {
774
+ return {
775
+ success: true,
776
+ data: src
777
+ };
778
+ }
779
+ if (typeof src === "string") {
780
+ return {
781
+ success: true,
782
+ data: src
783
+ };
784
+ }
785
+ return {
786
+ success: false,
787
+ errors: _defineProperty({}, path, [{
788
+ message: "Expected 'string', got '".concat(_typeof(src), "'"),
789
+ typeError: true
790
+ }])
791
+ };
792
+ }
793
+ }, {
794
+ key: "nullable",
795
+ value: function nullable() {
796
+ return new StringSchema(this.options, true, this.isRaw);
797
+ }
798
+ }, {
799
+ key: "raw",
800
+ value: function raw() {
801
+ return new StringSchema(this.options, this.opt, true);
802
+ }
803
+ }, {
804
+ key: "executeSerialize",
805
+ value: function executeSerialize() {
806
+ var _this$options4, _this$options5, _this$options6, _this$customValidateF, _this$customValidateF2;
807
+ return {
808
+ type: "string",
809
+ options: {
810
+ maxLength: (_this$options4 = this.options) === null || _this$options4 === void 0 ? void 0 : _this$options4.maxLength,
811
+ minLength: (_this$options5 = this.options) === null || _this$options5 === void 0 ? void 0 : _this$options5.minLength,
812
+ regexp: ((_this$options6 = this.options) === null || _this$options6 === void 0 ? void 0 : _this$options6.regexp) && {
813
+ message: this.options.regExpMessage,
814
+ source: this.options.regexp.source,
815
+ flags: this.options.regexp.flags
816
+ },
817
+ customValidate: this.customValidateFunctions && ((_this$customValidateF = this.customValidateFunctions) === null || _this$customValidateF === void 0 ? void 0 : _this$customValidateF.length) > 0
818
+ },
819
+ opt: this.opt,
820
+ raw: this.isRaw,
821
+ customValidate: this.customValidateFunctions && ((_this$customValidateF2 = this.customValidateFunctions) === null || _this$customValidateF2 === void 0 ? void 0 : _this$customValidateF2.length) > 0
822
+ };
823
+ }
824
+ }, {
825
+ key: "executeRender",
826
+ value: function executeRender() {
827
+ return {};
828
+ }
829
+ }]);
830
+ }(Schema);
831
+ var string = function string(options) {
832
+ return new StringSchema(options);
833
+ };
834
+
669
835
  var ObjectSchema = /*#__PURE__*/function (_Schema) {
670
836
  function ObjectSchema(items) {
671
837
  var _this;
@@ -688,7 +854,9 @@ var ObjectSchema = /*#__PURE__*/function (_Schema) {
688
854
  key: "executeValidate",
689
855
  value: function executeValidate(path, src) {
690
856
  var error = false;
691
- var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions);
857
+ var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions, {
858
+ path: path
859
+ });
692
860
  if (this.opt && (src === null || src === undefined)) {
693
861
  return customValidationErrors.length > 0 ? _defineProperty({}, path, customValidationErrors) : false;
694
862
  }
@@ -848,6 +1016,11 @@ var ObjectSchema = /*#__PURE__*/function (_Schema) {
848
1016
  var object = function object(schema) {
849
1017
  return new ObjectSchema(schema);
850
1018
  };
1019
+ object({
1020
+ get test() {
1021
+ return string();
1022
+ }
1023
+ });
851
1024
 
852
1025
  var ArraySchema = /*#__PURE__*/function (_Schema) {
853
1026
  function ArraySchema(item) {
@@ -1045,7 +1218,9 @@ var LiteralSchema = /*#__PURE__*/function (_Schema) {
1045
1218
  }, {
1046
1219
  key: "executeValidate",
1047
1220
  value: function executeValidate(path, src) {
1048
- var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions);
1221
+ var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions, {
1222
+ path: path
1223
+ });
1049
1224
  if (this.opt && (src === null || src === undefined)) {
1050
1225
  return customValidationErrors.length > 0 ? _defineProperty({}, path, customValidationErrors) : false;
1051
1226
  }
@@ -1147,7 +1322,9 @@ var UnionSchema = /*#__PURE__*/function (_Schema) {
1147
1322
  }, {
1148
1323
  key: "executeValidate",
1149
1324
  value: function executeValidate(path, src) {
1150
- var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions);
1325
+ var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions, {
1326
+ path: path
1327
+ });
1151
1328
  var unknownSrc = src;
1152
1329
  if (this.opt && unknownSrc === null) {
1153
1330
  return customValidationErrors.length > 0 ? _defineProperty({}, path, customValidationErrors) : false;
@@ -1540,7 +1717,9 @@ var ImageSchema = /*#__PURE__*/function (_Schema) {
1540
1717
  }, {
1541
1718
  key: "executeValidate",
1542
1719
  value: function executeValidate(path, src) {
1543
- var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions);
1720
+ var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions, {
1721
+ path: path
1722
+ });
1544
1723
  if (this.opt && (src === null || src === undefined)) {
1545
1724
  return customValidationErrors.length > 0 ? _defineProperty({}, path, customValidationErrors) : false;
1546
1725
  }
@@ -1767,7 +1946,9 @@ var RichTextSchema = /*#__PURE__*/function (_Schema) {
1767
1946
  }, {
1768
1947
  key: "executeValidate",
1769
1948
  value: function executeValidate(path, src) {
1770
- var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions);
1949
+ var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions, {
1950
+ path: path
1951
+ });
1771
1952
  var assertRes = this.executeAssert(path, src);
1772
1953
  if (!assertRes.success) {
1773
1954
  return customValidationErrors.length > 0 ? _defineProperty({}, path, customValidationErrors) : assertRes.errors;
@@ -2195,12 +2376,14 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
2195
2376
  var _this;
2196
2377
  var opt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
2197
2378
  var customValidateFunctions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
2379
+ var currentRouter = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
2198
2380
  _classCallCheck(this, RecordSchema);
2199
2381
  _this = _callSuper(this, RecordSchema);
2200
2382
  _defineProperty(_this, "renderInput", null);
2201
2383
  _this.item = item;
2202
2384
  _this.opt = opt;
2203
2385
  _this.customValidateFunctions = customValidateFunctions;
2386
+ _this.currentRouter = currentRouter;
2204
2387
  return _this;
2205
2388
  }
2206
2389
  _inherits(RecordSchema, _Schema);
@@ -2214,7 +2397,9 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
2214
2397
  value: function executeValidate(path, src) {
2215
2398
  var _this2 = this;
2216
2399
  var error = false;
2217
- var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions);
2400
+ var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions, {
2401
+ path: path
2402
+ });
2218
2403
  if (this.opt && (src === null || src === undefined)) {
2219
2404
  return customValidationErrors.length > 0 ? _defineProperty({}, path, customValidationErrors) : false;
2220
2405
  }
@@ -2233,6 +2418,10 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
2233
2418
  message: "Expected 'object', got 'array'"
2234
2419
  }]));
2235
2420
  }
2421
+ var routerValidations = this.getRouterValidations(path, src);
2422
+ if (routerValidations) {
2423
+ return routerValidations;
2424
+ }
2236
2425
  var _iterator = _createForOfIteratorHelper(customValidationErrors),
2237
2426
  _step;
2238
2427
  try {
@@ -2302,14 +2491,62 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
2302
2491
  value: function nullable() {
2303
2492
  return new RecordSchema(this.item, true);
2304
2493
  }
2494
+ }, {
2495
+ key: "router",
2496
+ value: function router(_router) {
2497
+ return new RecordSchema(this.item, this.opt, this.customValidateFunctions, _router);
2498
+ }
2499
+ }, {
2500
+ key: "getRouterValidations",
2501
+ value: function getRouterValidations(path, src) {
2502
+ if (!this.currentRouter) {
2503
+ return false;
2504
+ }
2505
+ if (src === null) {
2506
+ return false;
2507
+ }
2508
+ var _splitModuleFilePathA = splitModuleFilePathAndModulePath(path),
2509
+ _splitModuleFilePathA2 = _slicedToArray(_splitModuleFilePathA, 2),
2510
+ moduleFilePath = _splitModuleFilePathA2[0],
2511
+ modulePath = _splitModuleFilePathA2[1];
2512
+ if (modulePath) {
2513
+ return _defineProperty({}, path, [{
2514
+ message: "This field was configured as a router, but it is not defined at the root of the module",
2515
+ schemaError: true
2516
+ }]);
2517
+ }
2518
+ var routerValidations = this.currentRouter.validate(moduleFilePath, Object.keys(src));
2519
+ if (routerValidations.length > 0) {
2520
+ return Object.fromEntries(routerValidations.map(function (validation) {
2521
+ if (!validation.error.urlPath) {
2522
+ return [path, [{
2523
+ message: "Router validation error: ".concat(validation.error.message, " has no url path"),
2524
+ schemaError: true
2525
+ }]];
2526
+ }
2527
+ var subPath = createValPathOfItem(path, validation.error.urlPath);
2528
+ if (!subPath) {
2529
+ return [path, [{
2530
+ message: "Could not create path for router validation error",
2531
+ schemaError: true
2532
+ }]];
2533
+ }
2534
+ return [subPath, [{
2535
+ message: validation.error.message
2536
+ }]];
2537
+ }));
2538
+ }
2539
+ return false;
2540
+ }
2305
2541
  }, {
2306
2542
  key: "executeSerialize",
2307
2543
  value: function executeSerialize() {
2308
- var _this$customValidateF;
2544
+ var _this$currentRouter, _this$customValidateF;
2309
2545
  return {
2310
2546
  type: "record",
2311
2547
  item: this.item["executeSerialize"](),
2312
2548
  opt: this.opt,
2549
+ router: (_this$currentRouter = this.currentRouter) === null || _this$currentRouter === void 0 ? void 0 : _this$currentRouter.getRouterId(),
2313
2550
  customValidate: this.customValidateFunctions && ((_this$customValidateF = this.customValidateFunctions) === null || _this$customValidateF === void 0 ? void 0 : _this$customValidateF.length) > 0
2314
2551
  };
2315
2552
  }
@@ -2348,10 +2585,10 @@ var RecordSchema = /*#__PURE__*/function (_Schema) {
2348
2585
  data: {
2349
2586
  layout: "list",
2350
2587
  parent: "record",
2351
- items: Object.entries(src).map(function (_ref7) {
2352
- var _ref8 = _slicedToArray(_ref7, 2),
2353
- key = _ref8[0],
2354
- val = _ref8[1];
2588
+ items: Object.entries(src).map(function (_ref8) {
2589
+ var _ref9 = _slicedToArray(_ref8, 2),
2590
+ key = _ref9[0],
2591
+ val = _ref9[1];
2355
2592
  // NB NB: display is actually defined by the user
2356
2593
  var _prepare = prepare({
2357
2594
  key: key,
@@ -2911,7 +3148,9 @@ var NumberSchema = /*#__PURE__*/function (_Schema) {
2911
3148
  key: "executeValidate",
2912
3149
  value: function executeValidate(path, src) {
2913
3150
  var _this$options, _this$options2;
2914
- var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions);
3151
+ var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions, {
3152
+ path: path
3153
+ });
2915
3154
  if (this.opt && (src === null || src === undefined)) {
2916
3155
  return customValidationErrors.length > 0 ? _defineProperty({}, path, customValidationErrors) : false;
2917
3156
  }
@@ -3011,168 +3250,6 @@ var number = function number(options) {
3011
3250
  return new NumberSchema(options);
3012
3251
  };
3013
3252
 
3014
- var StringSchema = /*#__PURE__*/function (_Schema) {
3015
- function StringSchema(options) {
3016
- var _this;
3017
- var opt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
3018
- var isRaw = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
3019
- var customValidateFunctions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
3020
- _classCallCheck(this, StringSchema);
3021
- _this = _callSuper(this, StringSchema);
3022
- _this.options = options;
3023
- _this.opt = opt;
3024
- _this.isRaw = isRaw;
3025
- _this.customValidateFunctions = customValidateFunctions;
3026
- return _this;
3027
- }
3028
-
3029
- /**
3030
- * @deprecated Use `minLength` instead
3031
- */
3032
- _inherits(StringSchema, _Schema);
3033
- return _createClass(StringSchema, [{
3034
- key: "min",
3035
- value: function min(minLength) {
3036
- return this.minLength(minLength);
3037
- }
3038
- }, {
3039
- key: "minLength",
3040
- value: function minLength(_minLength) {
3041
- return new StringSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
3042
- minLength: _minLength
3043
- }), this.opt, this.isRaw);
3044
- }
3045
-
3046
- /**
3047
- * @deprecated Use `maxLength` instead
3048
- */
3049
- }, {
3050
- key: "max",
3051
- value: function max(maxLength) {
3052
- return this.maxLength(maxLength);
3053
- }
3054
- }, {
3055
- key: "maxLength",
3056
- value: function maxLength(_maxLength) {
3057
- return new StringSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
3058
- maxLength: _maxLength
3059
- }), this.opt, this.isRaw);
3060
- }
3061
- }, {
3062
- key: "regexp",
3063
- value: function regexp(_regexp, message) {
3064
- return new StringSchema(_objectSpread2(_objectSpread2({}, this.options), {}, {
3065
- regexp: _regexp,
3066
- regExpMessage: message
3067
- }), this.opt, this.isRaw);
3068
- }
3069
- }, {
3070
- key: "validate",
3071
- value: function validate(validationFunction) {
3072
- return new StringSchema(this.options, this.opt, this.isRaw, this.customValidateFunctions.concat(validationFunction));
3073
- }
3074
- }, {
3075
- key: "executeValidate",
3076
- value: function executeValidate(path, src) {
3077
- var _this$options, _this$options2, _this$options3;
3078
- var errors = this.executeCustomValidateFunctions(src, this.customValidateFunctions);
3079
- if (this.opt && (src === null || src === undefined)) {
3080
- return errors.length > 0 ? _defineProperty({}, path, errors) : false;
3081
- }
3082
- if (typeof src !== "string") {
3083
- return _defineProperty({}, path, [{
3084
- message: "Expected 'string', got '".concat(_typeof(src), "'"),
3085
- value: src
3086
- }]);
3087
- }
3088
- if ((_this$options = this.options) !== null && _this$options !== void 0 && _this$options.maxLength && src.length > this.options.maxLength) {
3089
- errors.push({
3090
- message: "Expected string to be at most ".concat(this.options.maxLength, " characters long, got ").concat(src.length),
3091
- value: src
3092
- });
3093
- }
3094
- if ((_this$options2 = this.options) !== null && _this$options2 !== void 0 && _this$options2.minLength && src.length < this.options.minLength) {
3095
- errors.push({
3096
- message: "Expected string to be at least ".concat(this.options.minLength, " characters long, got ").concat(src.length),
3097
- value: src
3098
- });
3099
- }
3100
- if ((_this$options3 = this.options) !== null && _this$options3 !== void 0 && _this$options3.regexp && !this.options.regexp.test(src)) {
3101
- errors.push({
3102
- message: this.options.regExpMessage || "Expected string to match reg exp: ".concat(this.options.regexp.toString(), ", got '").concat(src, "'"),
3103
- value: src
3104
- });
3105
- }
3106
- if (errors.length > 0) {
3107
- return _defineProperty({}, path, errors);
3108
- }
3109
- return false;
3110
- }
3111
- }, {
3112
- key: "executeAssert",
3113
- value: function executeAssert(path, src) {
3114
- if (this.opt && src === null) {
3115
- return {
3116
- success: true,
3117
- data: src
3118
- };
3119
- }
3120
- if (typeof src === "string") {
3121
- return {
3122
- success: true,
3123
- data: src
3124
- };
3125
- }
3126
- return {
3127
- success: false,
3128
- errors: _defineProperty({}, path, [{
3129
- message: "Expected 'string', got '".concat(_typeof(src), "'"),
3130
- typeError: true
3131
- }])
3132
- };
3133
- }
3134
- }, {
3135
- key: "nullable",
3136
- value: function nullable() {
3137
- return new StringSchema(this.options, true, this.isRaw);
3138
- }
3139
- }, {
3140
- key: "raw",
3141
- value: function raw() {
3142
- return new StringSchema(this.options, this.opt, true);
3143
- }
3144
- }, {
3145
- key: "executeSerialize",
3146
- value: function executeSerialize() {
3147
- var _this$options4, _this$options5, _this$options6, _this$customValidateF, _this$customValidateF2;
3148
- return {
3149
- type: "string",
3150
- options: {
3151
- maxLength: (_this$options4 = this.options) === null || _this$options4 === void 0 ? void 0 : _this$options4.maxLength,
3152
- minLength: (_this$options5 = this.options) === null || _this$options5 === void 0 ? void 0 : _this$options5.minLength,
3153
- regexp: ((_this$options6 = this.options) === null || _this$options6 === void 0 ? void 0 : _this$options6.regexp) && {
3154
- message: this.options.regExpMessage,
3155
- source: this.options.regexp.source,
3156
- flags: this.options.regexp.flags
3157
- },
3158
- customValidate: this.customValidateFunctions && ((_this$customValidateF = this.customValidateFunctions) === null || _this$customValidateF === void 0 ? void 0 : _this$customValidateF.length) > 0
3159
- },
3160
- opt: this.opt,
3161
- raw: this.isRaw,
3162
- customValidate: this.customValidateFunctions && ((_this$customValidateF2 = this.customValidateFunctions) === null || _this$customValidateF2 === void 0 ? void 0 : _this$customValidateF2.length) > 0
3163
- };
3164
- }
3165
- }, {
3166
- key: "executeRender",
3167
- value: function executeRender() {
3168
- return {};
3169
- }
3170
- }]);
3171
- }(Schema);
3172
- var string = function string(options) {
3173
- return new StringSchema(options);
3174
- };
3175
-
3176
3253
  var BooleanSchema = /*#__PURE__*/function (_Schema) {
3177
3254
  function BooleanSchema() {
3178
3255
  var _this;
@@ -3284,7 +3361,9 @@ var KeyOfSchema = /*#__PURE__*/function (_Schema) {
3284
3361
  }, {
3285
3362
  key: "executeValidate",
3286
3363
  value: function executeValidate(path, src) {
3287
- var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions);
3364
+ var customValidationErrors = this.executeCustomValidateFunctions(src, this.customValidateFunctions, {
3365
+ path: path
3366
+ });
3288
3367
  if (this.opt && (src === null || src === undefined)) {
3289
3368
  return customValidationErrors.length > 0 ? _defineProperty({}, path, customValidationErrors) : false;
3290
3369
  }
@@ -3296,7 +3375,8 @@ var KeyOfSchema = /*#__PURE__*/function (_Schema) {
3296
3375
  var serializedSchema = this.schema;
3297
3376
  if (!(serializedSchema.type === "object" || serializedSchema.type === "record")) {
3298
3377
  return _defineProperty({}, path, [].concat(_toConsumableArray(customValidationErrors), [{
3299
- message: "Schema in keyOf must be an 'object' or 'record'. Found '".concat(serializedSchema.type, "'")
3378
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3379
+ message: "Schema in keyOf must be an 'object' or 'record'. Found '".concat(serializedSchema.type || "unknown", "'")
3300
3380
  }]));
3301
3381
  }
3302
3382
  if (serializedSchema.opt && (src === null || src === undefined)) {
@@ -3308,7 +3388,7 @@ var KeyOfSchema = /*#__PURE__*/function (_Schema) {
3308
3388
  }]));
3309
3389
  }
3310
3390
  if (serializedSchema.type === "object") {
3311
- var keys = Object.keys(serializedSchema.items);
3391
+ var keys = serializedSchema.keys;
3312
3392
  if (!keys.includes(src)) {
3313
3393
  return _defineProperty({}, path, [].concat(_toConsumableArray(customValidationErrors), [{
3314
3394
  message: "Value of keyOf (object) must be: ".concat(keys.join(", "), ". Found: ").concat(src)
@@ -3368,7 +3448,8 @@ var KeyOfSchema = /*#__PURE__*/function (_Schema) {
3368
3448
  return {
3369
3449
  success: false,
3370
3450
  errors: _defineProperty({}, path, [{
3371
- message: "Schema of first argument must be either: 'array', 'object' or 'record'. Found '".concat(serializedSchema.type, "'"),
3451
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3452
+ message: "Schema of first argument must be either: 'array', 'object' or 'record'. Found '".concat(serializedSchema.type || "unknown", "'"),
3372
3453
  typeError: true
3373
3454
  }])
3374
3455
  };
@@ -3386,7 +3467,7 @@ var KeyOfSchema = /*#__PURE__*/function (_Schema) {
3386
3467
  // and there it also makes sense to check the actual string values (i.e. that it is not just a string) since
3387
3468
  // missing one would lead to a runtime error. At least this is what we are thinking currently.
3388
3469
  if (serializedSchema.type === "object") {
3389
- var keys = Object.keys(serializedSchema.items);
3470
+ var keys = serializedSchema.keys;
3390
3471
  if (!keys.includes(src)) {
3391
3472
  return {
3392
3473
  success: false,
@@ -3425,10 +3506,11 @@ var KeyOfSchema = /*#__PURE__*/function (_Schema) {
3425
3506
  values = "string";
3426
3507
  break;
3427
3508
  case "object":
3428
- values = Object.keys(serializedSchema.items);
3509
+ values = serializedSchema.keys;
3429
3510
  break;
3430
3511
  default:
3431
- throw new Error("Cannot serialize keyOf schema with selector of type '".concat(serializedSchema.type, "'. keyOf must be used with a Val Module."));
3512
+ throw new Error(// eslint-disable-next-line @typescript-eslint/no-explicit-any
3513
+ "Cannot serialize keyOf schema with selector of type '".concat(serializedSchema.type || "unknown", "'"));
3432
3514
  }
3433
3515
  return {
3434
3516
  type: "keyOf",
@@ -3447,8 +3529,27 @@ var KeyOfSchema = /*#__PURE__*/function (_Schema) {
3447
3529
  }]);
3448
3530
  }(Schema);
3449
3531
  var keyOf = function keyOf(valModule) {
3450
- var _valModule$GetSchema;
3451
- return new KeyOfSchema(valModule === null || valModule === void 0 || (_valModule$GetSchema = valModule[GetSchema]) === null || _valModule$GetSchema === void 0 ? void 0 : _valModule$GetSchema["executeSerialize"](), getValPath(valModule));
3532
+ var refSchema = valModule === null || valModule === void 0 ? void 0 : valModule[GetSchema];
3533
+ var serializedRefSchema = undefined;
3534
+ if (refSchema instanceof ObjectSchema) {
3535
+ var keys = [];
3536
+ try {
3537
+ keys = Object.keys((refSchema === null || refSchema === void 0 ? void 0 : refSchema["items"]) || {});
3538
+ } catch (e) {
3539
+ // ignore this error here
3540
+ }
3541
+ serializedRefSchema = {
3542
+ type: "object",
3543
+ keys: keys,
3544
+ opt: refSchema === null || refSchema === void 0 ? void 0 : refSchema["opt"]
3545
+ };
3546
+ } else if (refSchema instanceof RecordSchema) {
3547
+ serializedRefSchema = {
3548
+ type: "record",
3549
+ opt: refSchema === null || refSchema === void 0 ? void 0 : refSchema["opt"]
3550
+ };
3551
+ }
3552
+ return new KeyOfSchema(serializedRefSchema, getValPath(valModule));
3452
3553
  };
3453
3554
 
3454
3555
  var DateSchema = /*#__PURE__*/function (_Schema) {
@@ -5087,6 +5188,193 @@ function deserializeSchema(serialized) {
5087
5188
  }
5088
5189
  }
5089
5190
 
5191
+ // Helper function to validate a URL path against a route pattern
5192
+ function validateUrlAgainstPattern(urlPath, routePattern) {
5193
+ // Remove leading slash and split URL path
5194
+ var urlSegments = urlPath.startsWith("/") ? urlPath.slice(1).split("/") : urlPath.split("/");
5195
+
5196
+ // Handle empty patterns (root route)
5197
+ if (routePattern.length === 0) {
5198
+ return {
5199
+ isValid: urlSegments.length === 0 || urlSegments.length === 1 && urlSegments[0] === "",
5200
+ expectedPath: "/"
5201
+ };
5202
+ }
5203
+
5204
+ // Check if segment counts match (accounting for optional segments and catch-all)
5205
+ var minSegments = 0;
5206
+ var maxSegments = 0;
5207
+ var hasCatchAll = false;
5208
+ var catchAllIndex = -1;
5209
+ for (var i = 0; i < routePattern.length; i++) {
5210
+ var segment = routePattern[i];
5211
+ if (segment.startsWith("[[") && segment.endsWith("]]")) {
5212
+ // Optional catch-all segment
5213
+ hasCatchAll = true;
5214
+ catchAllIndex = i;
5215
+ maxSegments = Infinity;
5216
+ } else if (segment.startsWith("[...") && segment.endsWith("]")) {
5217
+ // Required catch-all segment
5218
+ hasCatchAll = true;
5219
+ catchAllIndex = i;
5220
+ minSegments++;
5221
+ maxSegments = Infinity;
5222
+ } else if (segment.startsWith("[[") && segment.endsWith("]")) {
5223
+ // Optional segment
5224
+ maxSegments++;
5225
+ } else if (segment.startsWith("[") && segment.endsWith("]")) {
5226
+ // Required segment
5227
+ minSegments++;
5228
+ maxSegments++;
5229
+ } else {
5230
+ // Static segment
5231
+ minSegments++;
5232
+ maxSegments++;
5233
+ }
5234
+ }
5235
+
5236
+ // Check segment count
5237
+ if (urlSegments.length < minSegments || !hasCatchAll && urlSegments.length > maxSegments) {
5238
+ var expectedSegments = routePattern.map(function (seg) {
5239
+ if (seg.startsWith("[[") && seg.endsWith("]]")) {
5240
+ return "[optional:".concat(seg.slice(2, -2), "]");
5241
+ } else if (seg.startsWith("[...") && seg.endsWith("]")) {
5242
+ return "[...".concat(seg.slice(4, -1), "]");
5243
+ } else if (seg.startsWith("[[") && seg.endsWith("]")) {
5244
+ return "[optional:".concat(seg.slice(2, -1), "]");
5245
+ } else if (seg.startsWith("[") && seg.endsWith("]")) {
5246
+ return "[".concat(seg.slice(1, -1), "]");
5247
+ }
5248
+ return seg;
5249
+ }).join("/");
5250
+ return {
5251
+ isValid: false,
5252
+ expectedPath: "/".concat(expectedSegments)
5253
+ };
5254
+ }
5255
+
5256
+ // Validate each segment up to the catch-all or the end of the pattern
5257
+ var segmentsToValidate = hasCatchAll ? catchAllIndex : routePattern.length;
5258
+ for (var _i = 0; _i < segmentsToValidate; _i++) {
5259
+ var patternSegment = routePattern[_i];
5260
+ var urlSegment = urlSegments[_i];
5261
+
5262
+ // Handle optional segments
5263
+ if (patternSegment.startsWith("[[") && patternSegment.endsWith("]]")) {
5264
+ // Optional segment - can be empty or match
5265
+ if (urlSegment !== "" && urlSegment !== undefined) {
5266
+ // If provided, validate it's not empty
5267
+ if (urlSegment === "") {
5268
+ return {
5269
+ isValid: false,
5270
+ expectedPath: "/".concat(routePattern.join("/"))
5271
+ };
5272
+ }
5273
+ }
5274
+ } else if (patternSegment.startsWith("[") && patternSegment.endsWith("]")) {
5275
+ // Required dynamic segment - just check it's not empty
5276
+ if (urlSegment === "" || urlSegment === undefined) {
5277
+ return {
5278
+ isValid: false,
5279
+ expectedPath: "/".concat(routePattern.join("/"))
5280
+ };
5281
+ }
5282
+ } else {
5283
+ // Static segment - must match exactly
5284
+ if (patternSegment !== urlSegment) {
5285
+ return {
5286
+ isValid: false,
5287
+ expectedPath: "/".concat(routePattern.join("/"))
5288
+ };
5289
+ }
5290
+ }
5291
+ }
5292
+ return {
5293
+ isValid: true
5294
+ };
5295
+ }
5296
+
5297
+ // This router should not be in core package
5298
+ var nextAppRouter = {
5299
+ getRouterId: function getRouterId() {
5300
+ return "next-app-router";
5301
+ },
5302
+ validate: function validate(moduleFilePath, urlPaths) {
5303
+ var routePattern = parseNextJsRoutePattern(moduleFilePath);
5304
+ var errors = [];
5305
+ var _iterator = _createForOfIteratorHelper(urlPaths),
5306
+ _step;
5307
+ try {
5308
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
5309
+ var urlPath = _step.value;
5310
+ var validation = validateUrlAgainstPattern(urlPath, routePattern);
5311
+ if (!validation.isValid) {
5312
+ errors.push({
5313
+ error: {
5314
+ message: "URL path \"".concat(urlPath, "\" does not match the route pattern for \"").concat(moduleFilePath, "\""),
5315
+ urlPath: urlPath,
5316
+ expectedPath: validation.expectedPath || null
5317
+ }
5318
+ });
5319
+ }
5320
+ }
5321
+ } catch (err) {
5322
+ _iterator.e(err);
5323
+ } finally {
5324
+ _iterator.f();
5325
+ }
5326
+ return errors;
5327
+ }
5328
+ };
5329
+
5330
+ /**
5331
+ * Parse Next.js route pattern from file path
5332
+ * Support multiple Next.js app directory structures:
5333
+ * - /app/blogs/[blog]/page.val.ts -> ["blogs", "[blog]"]
5334
+ * - /src/app/blogs/[blog]/page.val.ts -> ["blogs", "[blog]"]
5335
+ * - /pages/blogs/[blog].tsx -> ["blogs", "[blog]"] (Pages Router)
5336
+ * - /app/(group)/blogs/[blog]/page.val.ts -> ["blogs", "[blog]"] (with groups)
5337
+ * - /app/(.)feed/page.val.ts -> ["feed"] (interception route)
5338
+ * - /app/(..)(dashboard)/feed/page.val.ts -> ["feed"] (interception route)
5339
+ */
5340
+ function parseNextJsRoutePattern(moduleFilePath) {
5341
+ if (!moduleFilePath || typeof moduleFilePath !== "string") {
5342
+ return [];
5343
+ }
5344
+
5345
+ // Try App Router patterns first
5346
+ var appRouterPatterns = [/\/app\/(.+)\/page\.val\.ts$/,
5347
+ // /app/...
5348
+ /\/src\/app\/(.+)\/page\.val\.ts$/,
5349
+ // /src/app/...
5350
+ /\/app\/(.+)\/page\.tsx?$/,
5351
+ // /app/... with .tsx
5352
+ /\/src\/app\/(.+)\/page\.tsx?$/ // /src/app/... with .tsx
5353
+ ];
5354
+ for (var _i2 = 0, _appRouterPatterns = appRouterPatterns; _i2 < _appRouterPatterns.length; _i2++) {
5355
+ var pattern = _appRouterPatterns[_i2];
5356
+ var match = moduleFilePath.match(pattern);
5357
+ if (match) {
5358
+ var routePath = match[1];
5359
+ // Remove group and interception segments
5360
+ // Group: (group), Interception: (.), (..), (..)(dashboard), etc.
5361
+ return routePath.split("/").flatMap(function (segment) {
5362
+ // Remove group segments (but not interception segments)
5363
+ if (segment.startsWith("(") && segment.endsWith(")") && !segment.includes(".")) return [];
5364
+ // Interception segments: (.)feed, (..)(dashboard)/feed, etc.
5365
+ // If segment starts with (.) or (..), strip the interception marker and keep the rest
5366
+ var interceptionMatch = segment.match(/^(\([.]+\)(\(.+\))?)(.*)$/);
5367
+ if (interceptionMatch) {
5368
+ var rest = interceptionMatch[3] || interceptionMatch[4];
5369
+ return rest ? [rest] : [];
5370
+ }
5371
+ return [segment];
5372
+ });
5373
+ }
5374
+ }
5375
+ return [];
5376
+ }
5377
+
5090
5378
  var ModuleFilePathSep = "?p=";
5091
5379
  var FATAL_ERROR_TYPES = ["no-schema", "no-source", "invalid-id", "no-module", "invalid-patch"];
5092
5380
  var DEFAULT_CONTENT_HOST = "https://content.val.build";
@@ -5111,6 +5399,7 @@ var Internal = {
5111
5399
  safeResolvePath: safeResolvePath,
5112
5400
  splitModuleFilePathAndModulePath: splitModuleFilePathAndModulePath,
5113
5401
  joinModuleFilePathAndModulePath: joinModuleFilePathAndModulePath,
5402
+ nextAppRouter: nextAppRouter,
5114
5403
  remote: {
5115
5404
  createRemoteRef: createRemoteRef,
5116
5405
  getValidationBasis: getValidationBasis,