@json-layout/vocabulary 1.4.2 → 1.5.1

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@json-layout/vocabulary",
3
- "version": "1.4.2",
3
+ "version": "1.5.1",
4
4
  "description": "Main JSON Layout vocabulary as JSON schemas and Typescript types. Also contains some small utility functions to validate and normalize annotations.",
5
5
  "type": "module",
6
6
  "exports": {
package/src/index.js CHANGED
@@ -4,4 +4,5 @@
4
4
  export * from './layout-keyword/index.js'
5
5
  export * from './normalized-layout/index.js'
6
6
  export * from './components/index.js'
7
- export { normalizeLayoutFragment, getSchemaFragmentType } from './normalize.js'
7
+ export { normalizeLayoutFragment, getSchemaFragmentType, mergeNullableSubSchema } from './normalize.js'
8
+ export * from './utils/clone.js'
package/src/normalize.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { validateLayoutKeyword, isComponentName, isPartialCompObject, isPartialChildren, isPartialSwitch, isPartialGetItemsExpr, isPartialGetItemsObj, isPartialSlotMarkdown, isPartialGetItemsFetch, isPartialChildComposite, isPartialChildSlot, isPartialSlotText, isPartialSlotName } from './layout-keyword/index.js'
2
2
  import { validateNormalizedLayout } from './normalized-layout/index.js'
3
3
  import { getComponentValidate } from './validate.js'
4
+ import clone from './utils/clone.js'
4
5
 
5
6
  /**
6
7
  * @typedef {import('./index.js').Child} Child
@@ -291,6 +292,39 @@ function getItemsFromSchema (schemaFragment) {
291
292
  return null
292
293
  }
293
294
 
295
+ /**
296
+ * @param {SchemaFragment} schemaFragment
297
+ * @returns {[SchemaFragment, string] | undefined}
298
+ */
299
+ export const mergeNullableSubSchema = (schemaFragment) => {
300
+ /** @type {null | 'oneOf' | 'anyOf'} */
301
+ let subTypesKey = null
302
+ if (schemaFragment.oneOf) subTypesKey = 'oneOf'
303
+ else if (schemaFragment.anyOf) subTypesKey = 'anyOf'
304
+ if (subTypesKey) {
305
+ const subTypes = schemaFragment[subTypesKey]
306
+ /* if (subTypes && subTypes.length === 1) {
307
+ const subType = subTypes[0]
308
+ for (const key of Object.keys(schemaFragment)) delete subType[key]
309
+ Object.assign(schemaFragment, subType)
310
+ delete schemaFragment[subTypesKey]
311
+ } */
312
+ if (subTypes && subTypes.length === 2 && subTypes.some(t => t.type === 'null')) {
313
+ const subTypeIndex = subTypes.findIndex(t => t.type !== 'null')
314
+ if (subTypeIndex !== -1) {
315
+ const subType = subTypes[subTypeIndex]
316
+ const nullableType = clone(schemaFragment)
317
+ for (const key in subType) {
318
+ if (!(key in nullableType)) nullableType[key] = subType[key]
319
+ }
320
+ delete nullableType[subTypesKey]
321
+ nullableType.__pointer = nullableType.__pointer + `/${subTypesKey}/${subTypeIndex}`
322
+ return nullableType
323
+ }
324
+ }
325
+ }
326
+ }
327
+
294
328
  /**
295
329
  * @param {SchemaFragment} schemaFragment
296
330
  * @returns {{type: string | undefined, nullable: boolean}}
@@ -306,7 +340,6 @@ export const getSchemaFragmentType = (schemaFragment) => {
306
340
  }
307
341
 
308
342
  // case where type is not defined but can be deduced from children oneOf/allOf/anyOf
309
- /** @type {any[]} */
310
343
  if (!schemaFragment.type) {
311
344
  /** @type {string[]} */
312
345
  const combinationTypes = []
@@ -323,6 +356,10 @@ export const getSchemaFragmentType = (schemaFragment) => {
323
356
  if (combinationTypes.length === 1) return { type: combinationTypes[0], nullable: false }
324
357
  }
325
358
 
359
+ if (Array.isArray(schemaFragment.type)) {
360
+ throw new Error('multiple types are not supported')
361
+ }
362
+
326
363
  return { type: schemaFragment.type, nullable: false }
327
364
  }
328
365
 
@@ -661,6 +698,7 @@ function normalizeValidLayoutFragment (key, schemaFragment, type, nullable, sche
661
698
  */
662
699
  export function normalizeLayoutFragment (key, schemaFragment, schemaPath, components, markdown = (src) => src, useDescription, optionsKeys, schemaChild, knownType, knownNullable) {
663
700
  const { type, nullable } = knownType ? { type: knownType, nullable: knownNullable ?? false } : getSchemaFragmentType(schemaFragment)
701
+
664
702
  /** @type {string[]} */
665
703
  const errors = []
666
704
  try {
package/src/types.ts CHANGED
@@ -5,7 +5,7 @@ export interface SchemaFragment {
5
5
  layout?: LayoutKeyword
6
6
  oneOfLayout?: LayoutKeyword
7
7
  patternPropertiesLayout?: LayoutKeyword
8
- type: string
8
+ type?: string | string[]
9
9
  format?: string
10
10
  title?: string
11
11
  description?: string
@@ -0,0 +1,67 @@
1
+ /* eslint-disable jsdoc/require-jsdoc */
2
+ // @ts-nocheck
3
+
4
+ // a copy of https://github.com/davidmarkclements/rfdc/blob/master/index.js
5
+ // but lighter and with ESM export
6
+
7
+ function copyBuffer (cur) {
8
+ if (cur instanceof Buffer) {
9
+ return Buffer.from(cur)
10
+ }
11
+
12
+ return new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length)
13
+ }
14
+
15
+ function rfdc () {
16
+ return clone
17
+
18
+ function cloneArray (a, fn) {
19
+ const keys = Object.keys(a)
20
+ const a2 = new Array(keys.length)
21
+ for (let i = 0; i < keys.length; i++) {
22
+ const k = keys[i]
23
+ const cur = a[k]
24
+ if (typeof cur !== 'object' || cur === null) {
25
+ a2[k] = cur
26
+ } else if (cur instanceof Date) {
27
+ a2[k] = new Date(cur)
28
+ } else if (ArrayBuffer.isView(cur)) {
29
+ a2[k] = copyBuffer(cur)
30
+ } else {
31
+ a2[k] = fn(cur)
32
+ }
33
+ }
34
+ return a2
35
+ }
36
+
37
+ function clone (o) {
38
+ if (typeof o !== 'object' || o === null) return o
39
+ if (o instanceof Date) return new Date(o)
40
+ if (Array.isArray(o)) return cloneArray(o, clone)
41
+ if (o instanceof Map) return new Map(cloneArray(Array.from(o), clone))
42
+ if (o instanceof Set) return new Set(cloneArray(Array.from(o), clone))
43
+ const o2 = {}
44
+ for (const k in o) {
45
+ if (Object.hasOwnProperty.call(o, k) === false) continue
46
+ const cur = o[k]
47
+ if (typeof cur !== 'object' || cur === null) {
48
+ o2[k] = cur
49
+ } else if (cur instanceof Date) {
50
+ o2[k] = new Date(cur)
51
+ } else if (cur instanceof Map) {
52
+ o2[k] = new Map(cloneArray(Array.from(cur), clone))
53
+ } else if (cur instanceof Set) {
54
+ o2[k] = new Set(cloneArray(Array.from(cur), clone))
55
+ } else if (ArrayBuffer.isView(cur)) {
56
+ o2[k] = copyBuffer(cur)
57
+ } else {
58
+ o2[k] = clone(cur)
59
+ }
60
+ }
61
+ return o2
62
+ }
63
+ }
64
+
65
+ export const clone = rfdc()
66
+
67
+ export default clone
package/types/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  export * from "./layout-keyword/index.js";
2
2
  export * from "./normalized-layout/index.js";
3
3
  export * from "./components/index.js";
4
+ export * from "./utils/clone.js";
4
5
  export type SchemaFragment = import("./types.js").SchemaFragment;
5
6
  export type ComponentInfo = import("./types.js").ComponentInfo;
6
- export { normalizeLayoutFragment, getSchemaFragmentType } from "./normalize.js";
7
+ export { normalizeLayoutFragment, getSchemaFragmentType, mergeNullableSubSchema } from "./normalize.js";
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":";;;6BAAc,OAAO,YAAY,EAAE,cAAc;4BACnC,OAAO,YAAY,EAAE,aAAa"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":";;;;6BAAc,OAAO,YAAY,EAAE,cAAc;4BACnC,OAAO,YAAY,EAAE,aAAa"}
@@ -15,6 +15,7 @@ export function normalizeLayoutFragment(key: string | number, schemaFragment: Sc
15
15
  layout: NormalizedLayout;
16
16
  errors: string[];
17
17
  };
18
+ export function mergeNullableSubSchema(schemaFragment: SchemaFragment): [SchemaFragment, string] | undefined;
18
19
  export function getSchemaFragmentType(schemaFragment: SchemaFragment): {
19
20
  type: string | undefined;
20
21
  nullable: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../src/normalize.js"],"names":[],"mappings":"AAwoBA;;;;;;;;;;;;GAYG;AACH,6CAZW,MAAM,GAAG,MAAM,kBACf,cAAc,cACd,MAAM,cACN,MAAM,CAAC,MAAM,EAAE,OAAO,YAAY,EAAE,aAAa,CAAC,aAClD,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,+BACxB,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC,gBACnC,MAAM,EAAE,gBACR,OAAO,GAAG,mBAAmB,cAC7B,MAAM,GAAG,SAAS,kBAClB,OAAO,GACL;IAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAC,CAuBxD;AAjYM,sDAHI,cAAc,GACZ;IAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAC,CA+BzD;oBAjUY,OAAO,YAAY,EAAE,KAAK;uBAC1B,OAAO,YAAY,EAAE,QAAQ;6BAC7B,OAAO,YAAY,EAAE,cAAc;yBACnC,OAAO,YAAY,EAAE,UAAU;+BAC/B,OAAO,YAAY,EAAE,gBAAgB;4BACrC,OAAO,YAAY,EAAE,aAAa;8BAClC,OAAO,YAAY,EAAE,eAAe;gCACpC,OAAO,YAAY,EAAE,iBAAiB;6BACtC,OAAO,YAAY,EAAE,cAAc"}
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../src/normalize.js"],"names":[],"mappings":"AA6qBA;;;;;;;;;;;;GAYG;AACH,6CAZW,MAAM,GAAG,MAAM,kBACf,cAAc,cACd,MAAM,cACN,MAAM,CAAC,MAAM,EAAE,OAAO,YAAY,EAAE,aAAa,CAAC,aAClD,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,+BACxB,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC,gBACnC,MAAM,EAAE,gBACR,OAAO,GAAG,mBAAmB,cAC7B,MAAM,GAAG,SAAS,kBAClB,OAAO,GACL;IAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAC,CAwBxD;AAtaM,uDAHI,cAAc,GACZ,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,SAAS,CA6BhD;AAMM,sDAHI,cAAc,GACZ;IAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAC,CAkCzD;oBArWY,OAAO,YAAY,EAAE,KAAK;uBAC1B,OAAO,YAAY,EAAE,QAAQ;6BAC7B,OAAO,YAAY,EAAE,cAAc;yBACnC,OAAO,YAAY,EAAE,UAAU;+BAC/B,OAAO,YAAY,EAAE,gBAAgB;4BACrC,OAAO,YAAY,EAAE,aAAa;8BAClC,OAAO,YAAY,EAAE,eAAe;gCACpC,OAAO,YAAY,EAAE,iBAAiB;6BACtC,OAAO,YAAY,EAAE,cAAc"}
package/types/types.d.ts CHANGED
@@ -4,7 +4,7 @@ export interface SchemaFragment {
4
4
  layout?: LayoutKeyword;
5
5
  oneOfLayout?: LayoutKeyword;
6
6
  patternPropertiesLayout?: LayoutKeyword;
7
- type: string;
7
+ type?: string | string[];
8
8
  format?: string;
9
9
  title?: string;
10
10
  description?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAEpE,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,WAAW,CAAC,EAAE,aAAa,CAAA;IAC3B,uBAAuB,CAAC,EAAE,aAAa,CAAA;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACvC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAA;IACb,KAAK,CAAC,EAAE,GAAG,EAAE,CAAA;IACb,KAAK,CAAC,EAAE,GAAG,EAAE,CAAA;IACb,KAAK,CAAC,EAAE,GAAG,CAAA;IACX,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACZ,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,EAAE,CAAC,EAAE,GAAG,CAAA;IACR,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,MAAM,CAAC,EAAE,GAAG,CAAA;IACZ,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,CAAC,aAAa,EAAE,GAAG,GAAG,aAAa,IAAI,aAAa,CAAA;IACpD,MAAM,EAAE,GAAG,CAAA;CACZ;AAED,MAAM,WAAW,wBAAwB;IACvC,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,IAAI,gBAAgB,CAAA;IACzC,MAAM,EAAE,GAAG,CAAA;CACZ"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAEpE,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,WAAW,CAAC,EAAE,aAAa,CAAA;IAC3B,uBAAuB,CAAC,EAAE,aAAa,CAAA;IACvC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACvC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAA;IACb,KAAK,CAAC,EAAE,GAAG,EAAE,CAAA;IACb,KAAK,CAAC,EAAE,GAAG,EAAE,CAAA;IACb,KAAK,CAAC,EAAE,GAAG,CAAA;IACX,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACZ,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,EAAE,CAAC,EAAE,GAAG,CAAA;IACR,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,MAAM,CAAC,EAAE,GAAG,CAAA;IACZ,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,CAAC,aAAa,EAAE,GAAG,GAAG,aAAa,IAAI,aAAa,CAAA;IACpD,MAAM,EAAE,GAAG,CAAA;CACZ;AAED,MAAM,WAAW,wBAAwB;IACvC,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,IAAI,gBAAgB,CAAA;IACzC,MAAM,EAAE,GAAG,CAAA;CACZ"}
@@ -0,0 +1,3 @@
1
+ export function clone(o: any): any;
2
+ export default clone;
3
+ //# sourceMappingURL=clone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone.d.ts","sourceRoot":"","sources":["../../src/utils/clone.js"],"names":[],"mappings":"AAoCE,mCAyBC"}