@rjsf/utils 6.0.0-beta.12 → 6.0.0-beta.14

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 (47) hide show
  1. package/dist/index.js +100 -23
  2. package/dist/index.js.map +4 -4
  3. package/dist/utils.esm.js +100 -23
  4. package/dist/utils.esm.js.map +4 -4
  5. package/dist/utils.umd.js +98 -24
  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 +11 -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/getUiOptions.js +4 -0
  15. package/lib/getUiOptions.js.map +1 -1
  16. package/lib/index.d.ts +3 -1
  17. package/lib/index.js +2 -1
  18. package/lib/index.js.map +1 -1
  19. package/lib/mergeDefaultsWithFormData.js +2 -2
  20. package/lib/mergeDefaultsWithFormData.js.map +1 -1
  21. package/lib/schema/getDefaultFormState.js +10 -2
  22. package/lib/schema/getDefaultFormState.js.map +1 -1
  23. package/lib/schema/getDisplayLabel.js +2 -2
  24. package/lib/schema/getDisplayLabel.js.map +1 -1
  25. package/lib/schema/retrieveSchema.js +2 -2
  26. package/lib/schema/retrieveSchema.js.map +1 -1
  27. package/lib/shallowEquals.d.ts +8 -0
  28. package/lib/shallowEquals.js +36 -0
  29. package/lib/shallowEquals.js.map +1 -0
  30. package/lib/shouldRender.d.ts +8 -2
  31. package/lib/shouldRender.js +17 -2
  32. package/lib/shouldRender.js.map +1 -1
  33. package/lib/tsconfig.tsbuildinfo +1 -1
  34. package/lib/types.d.ts +20 -3
  35. package/package.json +5 -5
  36. package/src/constants.ts +1 -0
  37. package/src/createSchemaUtils.ts +11 -1
  38. package/src/findSchemaDefinition.ts +51 -3
  39. package/src/getUiOptions.ts +4 -0
  40. package/src/index.ts +4 -0
  41. package/src/mergeDefaultsWithFormData.ts +1 -1
  42. package/src/schema/getDefaultFormState.ts +12 -2
  43. package/src/schema/getDisplayLabel.ts +2 -2
  44. package/src/schema/retrieveSchema.ts +2 -2
  45. package/src/shallowEquals.ts +41 -0
  46. package/src/shouldRender.ts +27 -2
  47. package/src/types.ts +23 -3
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,10 +228,14 @@ 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
232
235
  function getUiOptions(uiSchema = {}, globalOptions = {}) {
236
+ if (!uiSchema) {
237
+ return { ...globalOptions };
238
+ }
233
239
  return Object.keys(uiSchema).filter((key) => key.indexOf("ui:") === 0).reduce(
234
240
  (options, key) => {
235
241
  const value = uiSchema[key];
@@ -328,7 +334,16 @@ function findEmbeddedSchemaRecursive(schema, ref) {
328
334
  return schema;
329
335
  }
330
336
  for (const subSchema of Object.values(schema)) {
331
- if ((0, import_isObject3.default)(subSchema)) {
337
+ if (Array.isArray(subSchema)) {
338
+ for (const item of subSchema) {
339
+ if ((0, import_isObject3.default)(item)) {
340
+ const result = findEmbeddedSchemaRecursive(item, ref);
341
+ if (result !== void 0) {
342
+ return result;
343
+ }
344
+ }
345
+ }
346
+ } else if ((0, import_isObject3.default)(subSchema)) {
332
347
  const result = findEmbeddedSchemaRecursive(subSchema, ref);
333
348
  if (result !== void 0) {
334
349
  return result;
@@ -337,6 +352,23 @@ function findEmbeddedSchemaRecursive(schema, ref) {
337
352
  }
338
353
  return void 0;
339
354
  }
355
+ function makeAllReferencesAbsolute(schema, baseURI) {
356
+ const currentURI = (0, import_get.default)(schema, ID_KEY, baseURI);
357
+ if (REF_KEY in schema) {
358
+ schema = { ...schema, [REF_KEY]: import_fast_uri.default.resolve(currentURI, schema[REF_KEY]) };
359
+ }
360
+ for (const [key, subSchema] of Object.entries(schema)) {
361
+ if (Array.isArray(subSchema)) {
362
+ schema = {
363
+ ...schema,
364
+ [key]: subSchema.map((item) => (0, import_isObject3.default)(item) ? makeAllReferencesAbsolute(item, currentURI) : item)
365
+ };
366
+ } else if ((0, import_isObject3.default)(subSchema)) {
367
+ schema = { ...schema, [key]: makeAllReferencesAbsolute(subSchema, currentURI) };
368
+ }
369
+ }
370
+ return schema;
371
+ }
340
372
  function splitKeyElementFromObject(key, object) {
341
373
  const value = object[key];
342
374
  const remaining = (0, import_omit.default)(object, [key]);
@@ -382,7 +414,11 @@ function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [],
382
414
  const [remaining, theRef] = splitKeyElementFromObject(REF_KEY, current);
383
415
  const subSchema = findSchemaDefinitionRecursive(theRef, rootSchema, [...recurseList, ref], baseURI);
384
416
  if (Object.keys(remaining).length > 0) {
385
- return { ...remaining, ...subSchema };
417
+ if (rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2019_09 || rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
418
+ return { [ALL_OF_KEY]: [remaining, subSchema] };
419
+ } else {
420
+ return { ...remaining, ...subSchema };
421
+ }
386
422
  }
387
423
  return subSchema;
388
424
  }
@@ -769,7 +805,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
769
805
  if (!(0, import_isEmpty2.default)(matchingProperties)) {
770
806
  schema.properties[key] = retrieveSchema(
771
807
  validator,
772
- { allOf: Object.values(matchingProperties) },
808
+ { [ALL_OF_KEY]: Object.values(matchingProperties) },
773
809
  rootSchema,
774
810
  (0, import_get5.default)(formData, [key]),
775
811
  experimental_customMergeAllOf
@@ -784,7 +820,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
784
820
  if (REF_KEY in schema.additionalProperties) {
785
821
  additionalProperties = retrieveSchema(
786
822
  validator,
787
- { $ref: (0, import_get5.default)(schema.additionalProperties, [REF_KEY]) },
823
+ { [REF_KEY]: (0, import_get5.default)(schema.additionalProperties, [REF_KEY]) },
788
824
  rootSchema,
789
825
  formData,
790
826
  experimental_customMergeAllOf
@@ -1391,7 +1427,7 @@ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults =
1391
1427
  return acc2;
1392
1428
  }
1393
1429
  acc2[key] = mergeDefaultsWithFormData(
1394
- (0, import_get10.default)(defaults, key) ?? {},
1430
+ (0, import_get10.default)(defaults, key),
1395
1431
  keyValue,
1396
1432
  mergeExtraArrayDefaults,
1397
1433
  defaultSupercedesUndefined,
@@ -1551,8 +1587,12 @@ function getInnerSchemaForArrayItem(schema, additionalItems = 0 /* Ignore */, id
1551
1587
  }
1552
1588
  function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValues, isParentRequired, requiredFields = [], experimental_defaultFormStateBehavior = {}, isConst = false) {
1553
1589
  const { emptyObjectFields = "populateAllDefaults" } = experimental_defaultFormStateBehavior;
1554
- if (includeUndefinedValues || isConst) {
1590
+ if (includeUndefinedValues === true || isConst) {
1555
1591
  obj[key] = computedDefault;
1592
+ } else if (includeUndefinedValues === "excludeObjectChildren") {
1593
+ if (!isObject(computedDefault) || !(0, import_isEmpty4.default)(computedDefault)) {
1594
+ obj[key] = computedDefault;
1595
+ }
1556
1596
  } else if (emptyObjectFields !== "skipDefaults") {
1557
1597
  const isSelfOrParentRequired = isParentRequired === void 0 ? requiredFields.includes(key) : isParentRequired;
1558
1598
  if (isObject(computedDefault)) {
@@ -1982,10 +2022,10 @@ function getDisplayLabel(validator, schema, uiSchema = {}, rootSchema, globalOpt
1982
2022
  if (schemaType === "object") {
1983
2023
  displayLabel = false;
1984
2024
  }
1985
- if (schemaType === "boolean" && !uiSchema[UI_WIDGET_KEY]) {
2025
+ if (schemaType === "boolean" && uiSchema && !uiSchema[UI_WIDGET_KEY]) {
1986
2026
  displayLabel = false;
1987
2027
  }
1988
- if (uiSchema[UI_FIELD_KEY]) {
2028
+ if (uiSchema && uiSchema[UI_FIELD_KEY]) {
1989
2029
  displayLabel = false;
1990
2030
  }
1991
2031
  return displayLabel;
@@ -2311,6 +2351,7 @@ function toPathSchema(validator, schema, name = "", rootSchema, formData, experi
2311
2351
  }
2312
2352
 
2313
2353
  // src/createSchemaUtils.ts
2354
+ var import_get16 = __toESM(require("lodash/get"), 1);
2314
2355
  var SchemaUtils = class {
2315
2356
  /** Constructs the `SchemaUtils` instance with the given `validator` and `rootSchema` stored as instance variables
2316
2357
  *
@@ -2320,7 +2361,11 @@ var SchemaUtils = class {
2320
2361
  * @param [experimental_customMergeAllOf] - Optional function that allows for custom merging of `allOf` schemas
2321
2362
  */
2322
2363
  constructor(validator, rootSchema, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
2323
- this.rootSchema = rootSchema;
2364
+ if (rootSchema && rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
2365
+ this.rootSchema = makeAllReferencesAbsolute(rootSchema, (0, import_get16.default)(rootSchema, ID_KEY, "#"));
2366
+ } else {
2367
+ this.rootSchema = rootSchema;
2368
+ }
2324
2369
  this.validator = validator;
2325
2370
  this.experimental_defaultFormStateBehavior = experimental_defaultFormStateBehavior;
2326
2371
  this.experimental_customMergeAllOf = experimental_customMergeAllOf;
@@ -2651,6 +2696,31 @@ function dateRangeOptions(start, stop) {
2651
2696
  return options;
2652
2697
  }
2653
2698
 
2699
+ // src/shallowEquals.ts
2700
+ function shallowEquals(a, b) {
2701
+ if (Object.is(a, b)) {
2702
+ return true;
2703
+ }
2704
+ if (a == null || b == null) {
2705
+ return false;
2706
+ }
2707
+ if (typeof a !== "object" || typeof b !== "object") {
2708
+ return false;
2709
+ }
2710
+ const keysA = Object.keys(a);
2711
+ const keysB = Object.keys(b);
2712
+ if (keysA.length !== keysB.length) {
2713
+ return false;
2714
+ }
2715
+ for (let i = 0; i < keysA.length; i++) {
2716
+ const key = keysA[i];
2717
+ if (!Object.prototype.hasOwnProperty.call(b, key) || !Object.is(a[key], b[key])) {
2718
+ return false;
2719
+ }
2720
+ }
2721
+ return true;
2722
+ }
2723
+
2654
2724
  // src/replaceStringParameters.ts
2655
2725
  function replaceStringParameters(inputString, params) {
2656
2726
  let output = inputString;
@@ -2723,7 +2793,7 @@ function enumOptionsSelectValue(valueIndex, selected, allEnumOptions = []) {
2723
2793
 
2724
2794
  // src/ErrorSchemaBuilder.ts
2725
2795
  var import_cloneDeep = __toESM(require("lodash/cloneDeep"), 1);
2726
- var import_get16 = __toESM(require("lodash/get"), 1);
2796
+ var import_get17 = __toESM(require("lodash/get"), 1);
2727
2797
  var import_set3 = __toESM(require("lodash/set"), 1);
2728
2798
  var import_setWith = __toESM(require("lodash/setWith"), 1);
2729
2799
  var ErrorSchemaBuilder = class {
@@ -2752,7 +2822,7 @@ var ErrorSchemaBuilder = class {
2752
2822
  */
2753
2823
  getOrCreateErrorBlock(pathOfError) {
2754
2824
  const hasPath = Array.isArray(pathOfError) && pathOfError.length > 0 || typeof pathOfError === "string";
2755
- let errorBlock = hasPath ? (0, import_get16.default)(this.errorSchema, pathOfError) : this.errorSchema;
2825
+ let errorBlock = hasPath ? (0, import_get17.default)(this.errorSchema, pathOfError) : this.errorSchema;
2756
2826
  if (!errorBlock && pathOfError) {
2757
2827
  errorBlock = {};
2758
2828
  (0, import_setWith.default)(this.errorSchema, pathOfError, errorBlock, Object);
@@ -2778,7 +2848,7 @@ var ErrorSchemaBuilder = class {
2778
2848
  */
2779
2849
  addErrors(errorOrList, pathOfError) {
2780
2850
  const errorBlock = this.getOrCreateErrorBlock(pathOfError);
2781
- let errorsList = (0, import_get16.default)(errorBlock, ERRORS_KEY);
2851
+ let errorsList = (0, import_get17.default)(errorBlock, ERRORS_KEY);
2782
2852
  if (!Array.isArray(errorsList)) {
2783
2853
  errorsList = [];
2784
2854
  errorBlock[ERRORS_KEY] = errorsList;
@@ -2927,9 +2997,9 @@ function getTemplate(name, registry, uiOptions = {}) {
2927
2997
 
2928
2998
  // src/getTestIds.ts
2929
2999
  var import_nanoid = require("nanoid");
2930
- var import_get17 = __toESM(require("lodash/get"), 1);
3000
+ var import_get18 = __toESM(require("lodash/get"), 1);
2931
3001
  function getTestIds() {
2932
- if (typeof process === "undefined" || (0, import_get17.default)(process, "env.NODE_ENV") !== "test") {
3002
+ if (typeof process === "undefined" || (0, import_get18.default)(process, "env.NODE_ENV") !== "test") {
2933
3003
  return {};
2934
3004
  }
2935
3005
  const ids = /* @__PURE__ */ new Map();
@@ -2949,7 +3019,7 @@ function getTestIds() {
2949
3019
  // src/getWidget.tsx
2950
3020
  var import_react = require("react");
2951
3021
  var import_react_is = __toESM(require("react-is"), 1);
2952
- var import_get18 = __toESM(require("lodash/get"), 1);
3022
+ var import_get19 = __toESM(require("lodash/get"), 1);
2953
3023
  var import_set4 = __toESM(require("lodash/set"), 1);
2954
3024
  var import_jsx_runtime = require("react/jsx-runtime");
2955
3025
  var widgetMap = {
@@ -3005,7 +3075,7 @@ var widgetMap = {
3005
3075
  }
3006
3076
  };
3007
3077
  function mergeWidgetOptions(AWidget) {
3008
- let MergedWidget = (0, import_get18.default)(AWidget, "MergedWidget");
3078
+ let MergedWidget = (0, import_get19.default)(AWidget, "MergedWidget");
3009
3079
  if (!MergedWidget) {
3010
3080
  const defaultOptions = AWidget.defaultProps && AWidget.defaultProps.options || {};
3011
3081
  MergedWidget = ({ options, ...props }) => {
@@ -3118,14 +3188,14 @@ function localToUTC(dateString) {
3118
3188
  }
3119
3189
 
3120
3190
  // src/lookupFromFormContext.ts
3121
- var import_get19 = __toESM(require("lodash/get"), 1);
3191
+ var import_get20 = __toESM(require("lodash/get"), 1);
3122
3192
  var import_has6 = __toESM(require("lodash/has"), 1);
3123
3193
  function lookupFromFormContext(regOrFc, toLookup, fallback) {
3124
3194
  const lookupPath = [LOOKUP_MAP_NAME];
3125
3195
  if ((0, import_has6.default)(regOrFc, FORM_CONTEXT_NAME)) {
3126
3196
  lookupPath.unshift(FORM_CONTEXT_NAME);
3127
3197
  }
3128
- return (0, import_get19.default)(regOrFc, [...lookupPath, toLookup], fallback);
3198
+ return (0, import_get20.default)(regOrFc, [...lookupPath, toLookup], fallback);
3129
3199
  }
3130
3200
 
3131
3201
  // src/orderProperties.ts
@@ -3206,7 +3276,14 @@ function schemaRequiresTrueValue(schema) {
3206
3276
  }
3207
3277
 
3208
3278
  // src/shouldRender.ts
3209
- function shouldRender(component, nextProps, nextState) {
3279
+ function shouldRender(component, nextProps, nextState, updateStrategy = "customDeep") {
3280
+ if (updateStrategy === "always") {
3281
+ return true;
3282
+ }
3283
+ if (updateStrategy === "shallow") {
3284
+ const { props: props2, state: state2 } = component;
3285
+ return !shallowEquals(props2, nextProps) || !shallowEquals(state2, nextState);
3286
+ }
3210
3287
  const { props, state } = component;
3211
3288
  return !deepEquals(props, nextProps) || !deepEquals(state, nextState);
3212
3289
  }
@@ -3353,7 +3430,7 @@ function withIdRefPrefix(schemaNode) {
3353
3430
  var import_keys = __toESM(require("lodash/keys"), 1);
3354
3431
  var import_pickBy = __toESM(require("lodash/pickBy"), 1);
3355
3432
  var import_isPlainObject4 = __toESM(require("lodash/isPlainObject"), 1);
3356
- var import_get20 = __toESM(require("lodash/get"), 1);
3433
+ var import_get21 = __toESM(require("lodash/get"), 1);
3357
3434
  var import_difference = __toESM(require("lodash/difference"), 1);
3358
3435
  function getChangedFields(a, b) {
3359
3436
  const aIsPlainObject = (0, import_isPlainObject4.default)(a);
@@ -3366,7 +3443,7 @@ function getChangedFields(a, b) {
3366
3443
  } else if (!aIsPlainObject && bIsPlainObject) {
3367
3444
  return (0, import_keys.default)(b);
3368
3445
  } else {
3369
- const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals(value, (0, import_get20.default)(b, key))));
3446
+ const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals(value, (0, import_get21.default)(b, key))));
3370
3447
  const diffFields = (0, import_difference.default)((0, import_keys.default)(b), (0, import_keys.default)(a));
3371
3448
  return [...unequalFields, ...diffFields];
3372
3449
  }
@@ -3411,7 +3488,7 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
3411
3488
  var import_forEach = __toESM(require("lodash/forEach"), 1);
3412
3489
 
3413
3490
  // src/parser/ParserValidator.ts
3414
- var import_get21 = __toESM(require("lodash/get"), 1);
3491
+ var import_get22 = __toESM(require("lodash/get"), 1);
3415
3492
  var ParserValidator = class {
3416
3493
  /** Construct the ParserValidator for the given `rootSchema`. This `rootSchema` will be stashed in the `schemaMap`
3417
3494
  * first.
@@ -3437,7 +3514,7 @@ var ParserValidator = class {
3437
3514
  * @param hash - The hash value at which to map the schema
3438
3515
  */
3439
3516
  addSchema(schema, hash) {
3440
- const key = (0, import_get21.default)(schema, ID_KEY, hash);
3517
+ const key = (0, import_get22.default)(schema, ID_KEY, hash);
3441
3518
  const identifiedSchema = { ...schema, [ID_KEY]: key };
3442
3519
  const existing = this.schemaMap[key];
3443
3520
  if (!existing) {