@rjsf/utils 6.0.0-beta.12 → 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 +95 -21
  2. package/dist/index.js.map +4 -4
  3. package/dist/utils.esm.js +95 -21
  4. package/dist/utils.esm.js.map +4 -4
  5. package/dist/utils.umd.js +93 -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 +9 -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 +2 -0
  31. package/package.json +1 -1
  32. package/src/constants.ts +1 -0
  33. package/src/createSchemaUtils.ts +8 -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 +2 -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,7 +2358,11 @@ 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;
@@ -2651,6 +2693,31 @@ function dateRangeOptions(start, stop) {
2651
2693
  return options;
2652
2694
  }
2653
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
+
2654
2721
  // src/replaceStringParameters.ts
2655
2722
  function replaceStringParameters(inputString, params) {
2656
2723
  let output = inputString;
@@ -2723,7 +2790,7 @@ function enumOptionsSelectValue(valueIndex, selected, allEnumOptions = []) {
2723
2790
 
2724
2791
  // src/ErrorSchemaBuilder.ts
2725
2792
  var import_cloneDeep = __toESM(require("lodash/cloneDeep"), 1);
2726
- var import_get16 = __toESM(require("lodash/get"), 1);
2793
+ var import_get17 = __toESM(require("lodash/get"), 1);
2727
2794
  var import_set3 = __toESM(require("lodash/set"), 1);
2728
2795
  var import_setWith = __toESM(require("lodash/setWith"), 1);
2729
2796
  var ErrorSchemaBuilder = class {
@@ -2752,7 +2819,7 @@ var ErrorSchemaBuilder = class {
2752
2819
  */
2753
2820
  getOrCreateErrorBlock(pathOfError) {
2754
2821
  const hasPath = Array.isArray(pathOfError) && pathOfError.length > 0 || typeof pathOfError === "string";
2755
- 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;
2756
2823
  if (!errorBlock && pathOfError) {
2757
2824
  errorBlock = {};
2758
2825
  (0, import_setWith.default)(this.errorSchema, pathOfError, errorBlock, Object);
@@ -2778,7 +2845,7 @@ var ErrorSchemaBuilder = class {
2778
2845
  */
2779
2846
  addErrors(errorOrList, pathOfError) {
2780
2847
  const errorBlock = this.getOrCreateErrorBlock(pathOfError);
2781
- let errorsList = (0, import_get16.default)(errorBlock, ERRORS_KEY);
2848
+ let errorsList = (0, import_get17.default)(errorBlock, ERRORS_KEY);
2782
2849
  if (!Array.isArray(errorsList)) {
2783
2850
  errorsList = [];
2784
2851
  errorBlock[ERRORS_KEY] = errorsList;
@@ -2927,9 +2994,9 @@ function getTemplate(name, registry, uiOptions = {}) {
2927
2994
 
2928
2995
  // src/getTestIds.ts
2929
2996
  var import_nanoid = require("nanoid");
2930
- var import_get17 = __toESM(require("lodash/get"), 1);
2997
+ var import_get18 = __toESM(require("lodash/get"), 1);
2931
2998
  function getTestIds() {
2932
- 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") {
2933
3000
  return {};
2934
3001
  }
2935
3002
  const ids = /* @__PURE__ */ new Map();
@@ -2949,7 +3016,7 @@ function getTestIds() {
2949
3016
  // src/getWidget.tsx
2950
3017
  var import_react = require("react");
2951
3018
  var import_react_is = __toESM(require("react-is"), 1);
2952
- var import_get18 = __toESM(require("lodash/get"), 1);
3019
+ var import_get19 = __toESM(require("lodash/get"), 1);
2953
3020
  var import_set4 = __toESM(require("lodash/set"), 1);
2954
3021
  var import_jsx_runtime = require("react/jsx-runtime");
2955
3022
  var widgetMap = {
@@ -3005,7 +3072,7 @@ var widgetMap = {
3005
3072
  }
3006
3073
  };
3007
3074
  function mergeWidgetOptions(AWidget) {
3008
- let MergedWidget = (0, import_get18.default)(AWidget, "MergedWidget");
3075
+ let MergedWidget = (0, import_get19.default)(AWidget, "MergedWidget");
3009
3076
  if (!MergedWidget) {
3010
3077
  const defaultOptions = AWidget.defaultProps && AWidget.defaultProps.options || {};
3011
3078
  MergedWidget = ({ options, ...props }) => {
@@ -3118,14 +3185,14 @@ function localToUTC(dateString) {
3118
3185
  }
3119
3186
 
3120
3187
  // src/lookupFromFormContext.ts
3121
- var import_get19 = __toESM(require("lodash/get"), 1);
3188
+ var import_get20 = __toESM(require("lodash/get"), 1);
3122
3189
  var import_has6 = __toESM(require("lodash/has"), 1);
3123
3190
  function lookupFromFormContext(regOrFc, toLookup, fallback) {
3124
3191
  const lookupPath = [LOOKUP_MAP_NAME];
3125
3192
  if ((0, import_has6.default)(regOrFc, FORM_CONTEXT_NAME)) {
3126
3193
  lookupPath.unshift(FORM_CONTEXT_NAME);
3127
3194
  }
3128
- return (0, import_get19.default)(regOrFc, [...lookupPath, toLookup], fallback);
3195
+ return (0, import_get20.default)(regOrFc, [...lookupPath, toLookup], fallback);
3129
3196
  }
3130
3197
 
3131
3198
  // src/orderProperties.ts
@@ -3206,7 +3273,14 @@ function schemaRequiresTrueValue(schema) {
3206
3273
  }
3207
3274
 
3208
3275
  // src/shouldRender.ts
3209
- 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
+ }
3210
3284
  const { props, state } = component;
3211
3285
  return !deepEquals(props, nextProps) || !deepEquals(state, nextState);
3212
3286
  }
@@ -3353,7 +3427,7 @@ function withIdRefPrefix(schemaNode) {
3353
3427
  var import_keys = __toESM(require("lodash/keys"), 1);
3354
3428
  var import_pickBy = __toESM(require("lodash/pickBy"), 1);
3355
3429
  var import_isPlainObject4 = __toESM(require("lodash/isPlainObject"), 1);
3356
- var import_get20 = __toESM(require("lodash/get"), 1);
3430
+ var import_get21 = __toESM(require("lodash/get"), 1);
3357
3431
  var import_difference = __toESM(require("lodash/difference"), 1);
3358
3432
  function getChangedFields(a, b) {
3359
3433
  const aIsPlainObject = (0, import_isPlainObject4.default)(a);
@@ -3366,7 +3440,7 @@ function getChangedFields(a, b) {
3366
3440
  } else if (!aIsPlainObject && bIsPlainObject) {
3367
3441
  return (0, import_keys.default)(b);
3368
3442
  } else {
3369
- 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))));
3370
3444
  const diffFields = (0, import_difference.default)((0, import_keys.default)(b), (0, import_keys.default)(a));
3371
3445
  return [...unequalFields, ...diffFields];
3372
3446
  }
@@ -3411,7 +3485,7 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
3411
3485
  var import_forEach = __toESM(require("lodash/forEach"), 1);
3412
3486
 
3413
3487
  // src/parser/ParserValidator.ts
3414
- var import_get21 = __toESM(require("lodash/get"), 1);
3488
+ var import_get22 = __toESM(require("lodash/get"), 1);
3415
3489
  var ParserValidator = class {
3416
3490
  /** Construct the ParserValidator for the given `rootSchema`. This `rootSchema` will be stashed in the `schemaMap`
3417
3491
  * first.
@@ -3437,7 +3511,7 @@ var ParserValidator = class {
3437
3511
  * @param hash - The hash value at which to map the schema
3438
3512
  */
3439
3513
  addSchema(schema, hash) {
3440
- const key = (0, import_get21.default)(schema, ID_KEY, hash);
3514
+ const key = (0, import_get22.default)(schema, ID_KEY, hash);
3441
3515
  const identifiedSchema = { ...schema, [ID_KEY]: key };
3442
3516
  const existing = this.schemaMap[key];
3443
3517
  if (!existing) {