@rjsf/utils 6.0.0-beta.11 → 6.0.0-beta.13

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 (41) hide show
  1. package/dist/index.js +102 -21
  2. package/dist/index.js.map +4 -4
  3. package/dist/utils.esm.js +102 -21
  4. package/dist/utils.esm.js.map +4 -4
  5. package/dist/utils.umd.js +100 -22
  6. package/lib/constants.d.ts +1 -0
  7. package/lib/constants.js +1 -0
  8. package/lib/constants.js.map +1 -1
  9. package/lib/createSchemaUtils.js +16 -1
  10. package/lib/createSchemaUtils.js.map +1 -1
  11. package/lib/findSchemaDefinition.d.ts +6 -0
  12. package/lib/findSchemaDefinition.js +44 -3
  13. package/lib/findSchemaDefinition.js.map +1 -1
  14. package/lib/index.d.ts +3 -1
  15. package/lib/index.js +2 -1
  16. package/lib/index.js.map +1 -1
  17. package/lib/mergeDefaultsWithFormData.js +2 -2
  18. package/lib/mergeDefaultsWithFormData.js.map +1 -1
  19. package/lib/schema/getDefaultFormState.js +10 -2
  20. package/lib/schema/getDefaultFormState.js.map +1 -1
  21. package/lib/schema/retrieveSchema.js +2 -2
  22. package/lib/schema/retrieveSchema.js.map +1 -1
  23. package/lib/shallowEquals.d.ts +8 -0
  24. package/lib/shallowEquals.js +36 -0
  25. package/lib/shallowEquals.js.map +1 -0
  26. package/lib/shouldRender.d.ts +8 -2
  27. package/lib/shouldRender.js +17 -2
  28. package/lib/shouldRender.js.map +1 -1
  29. package/lib/tsconfig.tsbuildinfo +1 -1
  30. package/lib/types.d.ts +7 -0
  31. package/package.json +1 -1
  32. package/src/constants.ts +1 -0
  33. package/src/createSchemaUtils.ts +16 -1
  34. package/src/findSchemaDefinition.ts +51 -3
  35. package/src/index.ts +4 -0
  36. package/src/mergeDefaultsWithFormData.ts +1 -1
  37. package/src/schema/getDefaultFormState.ts +12 -2
  38. package/src/schema/retrieveSchema.ts +2 -2
  39. package/src/shallowEquals.ts +41 -0
  40. package/src/shouldRender.ts +27 -2
  41. package/src/types.ts +7 -0
package/dist/index.js CHANGED
@@ -46,6 +46,7 @@ __export(index_exports, {
46
46
  ID_KEY: () => ID_KEY,
47
47
  IF_KEY: () => IF_KEY,
48
48
  ITEMS_KEY: () => ITEMS_KEY,
49
+ JSON_SCHEMA_DRAFT_2019_09: () => JSON_SCHEMA_DRAFT_2019_09,
49
50
  JSON_SCHEMA_DRAFT_2020_12: () => JSON_SCHEMA_DRAFT_2020_12,
50
51
  JUNK_OPTION_ID: () => JUNK_OPTION_ID,
51
52
  LOOKUP_MAP_NAME: () => LOOKUP_MAP_NAME,
@@ -133,6 +134,7 @@ __export(index_exports, {
133
134
  sanitizeDataForNewSchema: () => sanitizeDataForNewSchema,
134
135
  schemaParser: () => schemaParser,
135
136
  schemaRequiresTrueValue: () => schemaRequiresTrueValue,
137
+ shallowEquals: () => shallowEquals,
136
138
  shouldRender: () => shouldRender,
137
139
  sortedJSONStringify: () => sortedJSONStringify,
138
140
  titleId: () => titleId,
@@ -226,6 +228,7 @@ var UI_FIELD_KEY = "ui:field";
226
228
  var UI_WIDGET_KEY = "ui:widget";
227
229
  var UI_OPTIONS_KEY = "ui:options";
228
230
  var UI_GLOBAL_OPTIONS_KEY = "ui:globalOptions";
231
+ var JSON_SCHEMA_DRAFT_2019_09 = "https://json-schema.org/draft/2019-09/schema";
229
232
  var JSON_SCHEMA_DRAFT_2020_12 = "https://json-schema.org/draft/2020-12/schema";
230
233
 
231
234
  // src/getUiOptions.ts
@@ -328,7 +331,16 @@ function findEmbeddedSchemaRecursive(schema, ref) {
328
331
  return schema;
329
332
  }
330
333
  for (const subSchema of Object.values(schema)) {
331
- if ((0, import_isObject3.default)(subSchema)) {
334
+ if (Array.isArray(subSchema)) {
335
+ for (const item of subSchema) {
336
+ if ((0, import_isObject3.default)(item)) {
337
+ const result = findEmbeddedSchemaRecursive(item, ref);
338
+ if (result !== void 0) {
339
+ return result;
340
+ }
341
+ }
342
+ }
343
+ } else if ((0, import_isObject3.default)(subSchema)) {
332
344
  const result = findEmbeddedSchemaRecursive(subSchema, ref);
333
345
  if (result !== void 0) {
334
346
  return result;
@@ -337,6 +349,23 @@ function findEmbeddedSchemaRecursive(schema, ref) {
337
349
  }
338
350
  return void 0;
339
351
  }
352
+ function makeAllReferencesAbsolute(schema, baseURI) {
353
+ const currentURI = (0, import_get.default)(schema, ID_KEY, baseURI);
354
+ if (REF_KEY in schema) {
355
+ schema = { ...schema, [REF_KEY]: import_fast_uri.default.resolve(currentURI, schema[REF_KEY]) };
356
+ }
357
+ for (const [key, subSchema] of Object.entries(schema)) {
358
+ if (Array.isArray(subSchema)) {
359
+ schema = {
360
+ ...schema,
361
+ [key]: subSchema.map((item) => (0, import_isObject3.default)(item) ? makeAllReferencesAbsolute(item, currentURI) : item)
362
+ };
363
+ } else if ((0, import_isObject3.default)(subSchema)) {
364
+ schema = { ...schema, [key]: makeAllReferencesAbsolute(subSchema, currentURI) };
365
+ }
366
+ }
367
+ return schema;
368
+ }
340
369
  function splitKeyElementFromObject(key, object) {
341
370
  const value = object[key];
342
371
  const remaining = (0, import_omit.default)(object, [key]);
@@ -382,7 +411,11 @@ function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [],
382
411
  const [remaining, theRef] = splitKeyElementFromObject(REF_KEY, current);
383
412
  const subSchema = findSchemaDefinitionRecursive(theRef, rootSchema, [...recurseList, ref], baseURI);
384
413
  if (Object.keys(remaining).length > 0) {
385
- return { ...remaining, ...subSchema };
414
+ if (rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2019_09 || rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
415
+ return { [ALL_OF_KEY]: [remaining, subSchema] };
416
+ } else {
417
+ return { ...remaining, ...subSchema };
418
+ }
386
419
  }
387
420
  return subSchema;
388
421
  }
@@ -769,7 +802,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
769
802
  if (!(0, import_isEmpty2.default)(matchingProperties)) {
770
803
  schema.properties[key] = retrieveSchema(
771
804
  validator,
772
- { allOf: Object.values(matchingProperties) },
805
+ { [ALL_OF_KEY]: Object.values(matchingProperties) },
773
806
  rootSchema,
774
807
  (0, import_get5.default)(formData, [key]),
775
808
  experimental_customMergeAllOf
@@ -784,7 +817,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
784
817
  if (REF_KEY in schema.additionalProperties) {
785
818
  additionalProperties = retrieveSchema(
786
819
  validator,
787
- { $ref: (0, import_get5.default)(schema.additionalProperties, [REF_KEY]) },
820
+ { [REF_KEY]: (0, import_get5.default)(schema.additionalProperties, [REF_KEY]) },
788
821
  rootSchema,
789
822
  formData,
790
823
  experimental_customMergeAllOf
@@ -1391,7 +1424,7 @@ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults =
1391
1424
  return acc2;
1392
1425
  }
1393
1426
  acc2[key] = mergeDefaultsWithFormData(
1394
- (0, import_get10.default)(defaults, key) ?? {},
1427
+ (0, import_get10.default)(defaults, key),
1395
1428
  keyValue,
1396
1429
  mergeExtraArrayDefaults,
1397
1430
  defaultSupercedesUndefined,
@@ -1551,8 +1584,12 @@ function getInnerSchemaForArrayItem(schema, additionalItems = 0 /* Ignore */, id
1551
1584
  }
1552
1585
  function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValues, isParentRequired, requiredFields = [], experimental_defaultFormStateBehavior = {}, isConst = false) {
1553
1586
  const { emptyObjectFields = "populateAllDefaults" } = experimental_defaultFormStateBehavior;
1554
- if (includeUndefinedValues || isConst) {
1587
+ if (includeUndefinedValues === true || isConst) {
1555
1588
  obj[key] = computedDefault;
1589
+ } else if (includeUndefinedValues === "excludeObjectChildren") {
1590
+ if (!isObject(computedDefault) || !(0, import_isEmpty4.default)(computedDefault)) {
1591
+ obj[key] = computedDefault;
1592
+ }
1556
1593
  } else if (emptyObjectFields !== "skipDefaults") {
1557
1594
  const isSelfOrParentRequired = isParentRequired === void 0 ? requiredFields.includes(key) : isParentRequired;
1558
1595
  if (isObject(computedDefault)) {
@@ -2311,6 +2348,7 @@ function toPathSchema(validator, schema, name = "", rootSchema, formData, experi
2311
2348
  }
2312
2349
 
2313
2350
  // src/createSchemaUtils.ts
2351
+ var import_get16 = __toESM(require("lodash/get"), 1);
2314
2352
  var SchemaUtils = class {
2315
2353
  /** Constructs the `SchemaUtils` instance with the given `validator` and `rootSchema` stored as instance variables
2316
2354
  *
@@ -2320,11 +2358,22 @@ var SchemaUtils = class {
2320
2358
  * @param [experimental_customMergeAllOf] - Optional function that allows for custom merging of `allOf` schemas
2321
2359
  */
2322
2360
  constructor(validator, rootSchema, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
2323
- this.rootSchema = rootSchema;
2361
+ if (rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
2362
+ this.rootSchema = makeAllReferencesAbsolute(rootSchema, (0, import_get16.default)(rootSchema, ID_KEY, "#"));
2363
+ } else {
2364
+ this.rootSchema = rootSchema;
2365
+ }
2324
2366
  this.validator = validator;
2325
2367
  this.experimental_defaultFormStateBehavior = experimental_defaultFormStateBehavior;
2326
2368
  this.experimental_customMergeAllOf = experimental_customMergeAllOf;
2327
2369
  }
2370
+ /** Returns the `rootSchema` in the `SchemaUtilsType`
2371
+ *
2372
+ * @returns - The `rootSchema`
2373
+ */
2374
+ getRootSchema() {
2375
+ return this.rootSchema;
2376
+ }
2328
2377
  /** Returns the `ValidatorType` in the `SchemaUtilsType`
2329
2378
  *
2330
2379
  * @returns - The `ValidatorType`
@@ -2644,6 +2693,31 @@ function dateRangeOptions(start, stop) {
2644
2693
  return options;
2645
2694
  }
2646
2695
 
2696
+ // src/shallowEquals.ts
2697
+ function shallowEquals(a, b) {
2698
+ if (Object.is(a, b)) {
2699
+ return true;
2700
+ }
2701
+ if (a == null || b == null) {
2702
+ return false;
2703
+ }
2704
+ if (typeof a !== "object" || typeof b !== "object") {
2705
+ return false;
2706
+ }
2707
+ const keysA = Object.keys(a);
2708
+ const keysB = Object.keys(b);
2709
+ if (keysA.length !== keysB.length) {
2710
+ return false;
2711
+ }
2712
+ for (let i = 0; i < keysA.length; i++) {
2713
+ const key = keysA[i];
2714
+ if (!Object.prototype.hasOwnProperty.call(b, key) || !Object.is(a[key], b[key])) {
2715
+ return false;
2716
+ }
2717
+ }
2718
+ return true;
2719
+ }
2720
+
2647
2721
  // src/replaceStringParameters.ts
2648
2722
  function replaceStringParameters(inputString, params) {
2649
2723
  let output = inputString;
@@ -2716,7 +2790,7 @@ function enumOptionsSelectValue(valueIndex, selected, allEnumOptions = []) {
2716
2790
 
2717
2791
  // src/ErrorSchemaBuilder.ts
2718
2792
  var import_cloneDeep = __toESM(require("lodash/cloneDeep"), 1);
2719
- var import_get16 = __toESM(require("lodash/get"), 1);
2793
+ var import_get17 = __toESM(require("lodash/get"), 1);
2720
2794
  var import_set3 = __toESM(require("lodash/set"), 1);
2721
2795
  var import_setWith = __toESM(require("lodash/setWith"), 1);
2722
2796
  var ErrorSchemaBuilder = class {
@@ -2745,7 +2819,7 @@ var ErrorSchemaBuilder = class {
2745
2819
  */
2746
2820
  getOrCreateErrorBlock(pathOfError) {
2747
2821
  const hasPath = Array.isArray(pathOfError) && pathOfError.length > 0 || typeof pathOfError === "string";
2748
- let errorBlock = hasPath ? (0, import_get16.default)(this.errorSchema, pathOfError) : this.errorSchema;
2822
+ let errorBlock = hasPath ? (0, import_get17.default)(this.errorSchema, pathOfError) : this.errorSchema;
2749
2823
  if (!errorBlock && pathOfError) {
2750
2824
  errorBlock = {};
2751
2825
  (0, import_setWith.default)(this.errorSchema, pathOfError, errorBlock, Object);
@@ -2771,7 +2845,7 @@ var ErrorSchemaBuilder = class {
2771
2845
  */
2772
2846
  addErrors(errorOrList, pathOfError) {
2773
2847
  const errorBlock = this.getOrCreateErrorBlock(pathOfError);
2774
- let errorsList = (0, import_get16.default)(errorBlock, ERRORS_KEY);
2848
+ let errorsList = (0, import_get17.default)(errorBlock, ERRORS_KEY);
2775
2849
  if (!Array.isArray(errorsList)) {
2776
2850
  errorsList = [];
2777
2851
  errorBlock[ERRORS_KEY] = errorsList;
@@ -2920,9 +2994,9 @@ function getTemplate(name, registry, uiOptions = {}) {
2920
2994
 
2921
2995
  // src/getTestIds.ts
2922
2996
  var import_nanoid = require("nanoid");
2923
- var import_get17 = __toESM(require("lodash/get"), 1);
2997
+ var import_get18 = __toESM(require("lodash/get"), 1);
2924
2998
  function getTestIds() {
2925
- if (typeof process === "undefined" || (0, import_get17.default)(process, "env.NODE_ENV") !== "test") {
2999
+ if (typeof process === "undefined" || (0, import_get18.default)(process, "env.NODE_ENV") !== "test") {
2926
3000
  return {};
2927
3001
  }
2928
3002
  const ids = /* @__PURE__ */ new Map();
@@ -2942,7 +3016,7 @@ function getTestIds() {
2942
3016
  // src/getWidget.tsx
2943
3017
  var import_react = require("react");
2944
3018
  var import_react_is = __toESM(require("react-is"), 1);
2945
- var import_get18 = __toESM(require("lodash/get"), 1);
3019
+ var import_get19 = __toESM(require("lodash/get"), 1);
2946
3020
  var import_set4 = __toESM(require("lodash/set"), 1);
2947
3021
  var import_jsx_runtime = require("react/jsx-runtime");
2948
3022
  var widgetMap = {
@@ -2998,7 +3072,7 @@ var widgetMap = {
2998
3072
  }
2999
3073
  };
3000
3074
  function mergeWidgetOptions(AWidget) {
3001
- let MergedWidget = (0, import_get18.default)(AWidget, "MergedWidget");
3075
+ let MergedWidget = (0, import_get19.default)(AWidget, "MergedWidget");
3002
3076
  if (!MergedWidget) {
3003
3077
  const defaultOptions = AWidget.defaultProps && AWidget.defaultProps.options || {};
3004
3078
  MergedWidget = ({ options, ...props }) => {
@@ -3111,14 +3185,14 @@ function localToUTC(dateString) {
3111
3185
  }
3112
3186
 
3113
3187
  // src/lookupFromFormContext.ts
3114
- var import_get19 = __toESM(require("lodash/get"), 1);
3188
+ var import_get20 = __toESM(require("lodash/get"), 1);
3115
3189
  var import_has6 = __toESM(require("lodash/has"), 1);
3116
3190
  function lookupFromFormContext(regOrFc, toLookup, fallback) {
3117
3191
  const lookupPath = [LOOKUP_MAP_NAME];
3118
3192
  if ((0, import_has6.default)(regOrFc, FORM_CONTEXT_NAME)) {
3119
3193
  lookupPath.unshift(FORM_CONTEXT_NAME);
3120
3194
  }
3121
- return (0, import_get19.default)(regOrFc, [...lookupPath, toLookup], fallback);
3195
+ return (0, import_get20.default)(regOrFc, [...lookupPath, toLookup], fallback);
3122
3196
  }
3123
3197
 
3124
3198
  // src/orderProperties.ts
@@ -3199,7 +3273,14 @@ function schemaRequiresTrueValue(schema) {
3199
3273
  }
3200
3274
 
3201
3275
  // src/shouldRender.ts
3202
- function shouldRender(component, nextProps, nextState) {
3276
+ function shouldRender(component, nextProps, nextState, updateStrategy = "customDeep") {
3277
+ if (updateStrategy === "always") {
3278
+ return true;
3279
+ }
3280
+ if (updateStrategy === "shallow") {
3281
+ const { props: props2, state: state2 } = component;
3282
+ return !shallowEquals(props2, nextProps) || !shallowEquals(state2, nextState);
3283
+ }
3203
3284
  const { props, state } = component;
3204
3285
  return !deepEquals(props, nextProps) || !deepEquals(state, nextState);
3205
3286
  }
@@ -3346,7 +3427,7 @@ function withIdRefPrefix(schemaNode) {
3346
3427
  var import_keys = __toESM(require("lodash/keys"), 1);
3347
3428
  var import_pickBy = __toESM(require("lodash/pickBy"), 1);
3348
3429
  var import_isPlainObject4 = __toESM(require("lodash/isPlainObject"), 1);
3349
- var import_get20 = __toESM(require("lodash/get"), 1);
3430
+ var import_get21 = __toESM(require("lodash/get"), 1);
3350
3431
  var import_difference = __toESM(require("lodash/difference"), 1);
3351
3432
  function getChangedFields(a, b) {
3352
3433
  const aIsPlainObject = (0, import_isPlainObject4.default)(a);
@@ -3359,7 +3440,7 @@ function getChangedFields(a, b) {
3359
3440
  } else if (!aIsPlainObject && bIsPlainObject) {
3360
3441
  return (0, import_keys.default)(b);
3361
3442
  } else {
3362
- const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals(value, (0, import_get20.default)(b, key))));
3443
+ const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals(value, (0, import_get21.default)(b, key))));
3363
3444
  const diffFields = (0, import_difference.default)((0, import_keys.default)(b), (0, import_keys.default)(a));
3364
3445
  return [...unequalFields, ...diffFields];
3365
3446
  }
@@ -3404,7 +3485,7 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
3404
3485
  var import_forEach = __toESM(require("lodash/forEach"), 1);
3405
3486
 
3406
3487
  // src/parser/ParserValidator.ts
3407
- var import_get21 = __toESM(require("lodash/get"), 1);
3488
+ var import_get22 = __toESM(require("lodash/get"), 1);
3408
3489
  var ParserValidator = class {
3409
3490
  /** Construct the ParserValidator for the given `rootSchema`. This `rootSchema` will be stashed in the `schemaMap`
3410
3491
  * first.
@@ -3430,7 +3511,7 @@ var ParserValidator = class {
3430
3511
  * @param hash - The hash value at which to map the schema
3431
3512
  */
3432
3513
  addSchema(schema, hash) {
3433
- const key = (0, import_get21.default)(schema, ID_KEY, hash);
3514
+ const key = (0, import_get22.default)(schema, ID_KEY, hash);
3434
3515
  const identifiedSchema = { ...schema, [ID_KEY]: key };
3435
3516
  const existing = this.schemaMap[key];
3436
3517
  if (!existing) {