@es-joy/jsoe 0.28.1 → 0.29.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.
Files changed (171) hide show
  1. package/CHANGES.md +23 -0
  2. package/README.md +2 -0
  3. package/badges/coverage-badge.svg +1 -1
  4. package/badges/tests-badge.svg +1 -1
  5. package/dist/deepEqual.d.ts +3 -0
  6. package/dist/deepEqual.d.ts.map +1 -0
  7. package/dist/formatAndTypeChoices.d.ts +6 -6
  8. package/dist/formatAndTypeChoices.d.ts.map +1 -1
  9. package/dist/formats/schema.d.ts +5 -0
  10. package/dist/formats/schema.d.ts.map +1 -1
  11. package/dist/formats.d.ts +2 -2
  12. package/dist/formats.d.ts.map +1 -1
  13. package/dist/fundamentalTypes/dateType.d.ts +21 -2
  14. package/dist/fundamentalTypes/dateType.d.ts.map +1 -1
  15. package/dist/fundamentalTypes/domexceptionType.d.ts +7 -0
  16. package/dist/fundamentalTypes/domexceptionType.d.ts.map +1 -1
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +2 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/jtltExtensions.d.ts +112 -0
  22. package/dist/jtltExtensions.d.ts.map +1 -0
  23. package/dist/search/fundamentalTypes/arraySearchType.d.ts +15 -0
  24. package/dist/search/fundamentalTypes/arraySearchType.d.ts.map +1 -0
  25. package/dist/search/fundamentalTypes/bigintSearchType.d.ts +10 -0
  26. package/dist/search/fundamentalTypes/bigintSearchType.d.ts.map +1 -0
  27. package/dist/search/fundamentalTypes/blobSearchType.d.ts +19 -0
  28. package/dist/search/fundamentalTypes/blobSearchType.d.ts.map +1 -0
  29. package/dist/search/fundamentalTypes/booleanSearchType.d.ts +11 -0
  30. package/dist/search/fundamentalTypes/booleanSearchType.d.ts.map +1 -0
  31. package/dist/search/fundamentalTypes/catchSearchType.d.ts +18 -0
  32. package/dist/search/fundamentalTypes/catchSearchType.d.ts.map +1 -0
  33. package/dist/search/fundamentalTypes/dateSearchType.d.ts +10 -0
  34. package/dist/search/fundamentalTypes/dateSearchType.d.ts.map +1 -0
  35. package/dist/search/fundamentalTypes/domexceptionSearchType.d.ts +16 -0
  36. package/dist/search/fundamentalTypes/domexceptionSearchType.d.ts.map +1 -0
  37. package/dist/search/fundamentalTypes/enumSearchType.d.ts +22 -0
  38. package/dist/search/fundamentalTypes/enumSearchType.d.ts.map +1 -0
  39. package/dist/search/fundamentalTypes/errorSearchType.d.ts +9 -0
  40. package/dist/search/fundamentalTypes/errorSearchType.d.ts.map +1 -0
  41. package/dist/search/fundamentalTypes/fileSearchType.d.ts +19 -0
  42. package/dist/search/fundamentalTypes/fileSearchType.d.ts.map +1 -0
  43. package/dist/search/fundamentalTypes/filelistSearchType.d.ts +32 -0
  44. package/dist/search/fundamentalTypes/filelistSearchType.d.ts.map +1 -0
  45. package/dist/search/fundamentalTypes/functionSearchType.d.ts +18 -0
  46. package/dist/search/fundamentalTypes/functionSearchType.d.ts.map +1 -0
  47. package/dist/search/fundamentalTypes/mapSearchType.d.ts +18 -0
  48. package/dist/search/fundamentalTypes/mapSearchType.d.ts.map +1 -0
  49. package/dist/search/fundamentalTypes/nanSearchType.d.ts +7 -0
  50. package/dist/search/fundamentalTypes/nanSearchType.d.ts.map +1 -0
  51. package/dist/search/fundamentalTypes/nullSearchType.d.ts +7 -0
  52. package/dist/search/fundamentalTypes/nullSearchType.d.ts.map +1 -0
  53. package/dist/search/fundamentalTypes/numberSearchType.d.ts +11 -0
  54. package/dist/search/fundamentalTypes/numberSearchType.d.ts.map +1 -0
  55. package/dist/search/fundamentalTypes/objectSearchType.d.ts +15 -0
  56. package/dist/search/fundamentalTypes/objectSearchType.d.ts.map +1 -0
  57. package/dist/search/fundamentalTypes/promiseSearchType.d.ts +20 -0
  58. package/dist/search/fundamentalTypes/promiseSearchType.d.ts.map +1 -0
  59. package/dist/search/fundamentalTypes/regexpSearchType.d.ts +14 -0
  60. package/dist/search/fundamentalTypes/regexpSearchType.d.ts.map +1 -0
  61. package/dist/search/fundamentalTypes/setSearchType.d.ts +14 -0
  62. package/dist/search/fundamentalTypes/setSearchType.d.ts.map +1 -0
  63. package/dist/search/fundamentalTypes/stringSearchType.d.ts +13 -0
  64. package/dist/search/fundamentalTypes/stringSearchType.d.ts.map +1 -0
  65. package/dist/search/fundamentalTypes/symbolSearchType.d.ts +16 -0
  66. package/dist/search/fundamentalTypes/symbolSearchType.d.ts.map +1 -0
  67. package/dist/search/fundamentalTypes/undefinedSearchType.d.ts +7 -0
  68. package/dist/search/fundamentalTypes/undefinedSearchType.d.ts.map +1 -0
  69. package/dist/search/index.d.ts +60 -0
  70. package/dist/search/index.d.ts.map +1 -0
  71. package/dist/search/queryTree.d.ts +180 -0
  72. package/dist/search/queryTree.d.ts.map +1 -0
  73. package/dist/search/queryTreeBuilders.d.ts +168 -0
  74. package/dist/search/queryTreeBuilders.d.ts.map +1 -0
  75. package/dist/search/searchDispatch.d.ts +121 -0
  76. package/dist/search/searchDispatch.d.ts.map +1 -0
  77. package/dist/search/searchElementUtils.d.ts +97 -0
  78. package/dist/search/searchElementUtils.d.ts.map +1 -0
  79. package/dist/search/searchUtils.d.ts +225 -0
  80. package/dist/search/searchUtils.d.ts.map +1 -0
  81. package/dist/search/subTypes/blobHTMLSearchType.d.ts +16 -0
  82. package/dist/search/subTypes/blobHTMLSearchType.d.ts.map +1 -0
  83. package/dist/search/subTypes/recordSearchType.d.ts +18 -0
  84. package/dist/search/subTypes/recordSearchType.d.ts.map +1 -0
  85. package/dist/search/subTypes/tupleSearchType.d.ts +21 -0
  86. package/dist/search/subTypes/tupleSearchType.d.ts.map +1 -0
  87. package/dist/search/superTypes/SpecialRealNumberSearchType.d.ts +14 -0
  88. package/dist/search/superTypes/SpecialRealNumberSearchType.d.ts.map +1 -0
  89. package/dist/search/superTypes/buffersourceSearchType.d.ts +17 -0
  90. package/dist/search/superTypes/buffersourceSearchType.d.ts.map +1 -0
  91. package/dist/search/superTypes/dommatrixSearchType.d.ts +11 -0
  92. package/dist/search/superTypes/dommatrixSearchType.d.ts.map +1 -0
  93. package/dist/search/superTypes/dompointSearchType.d.ts +9 -0
  94. package/dist/search/superTypes/dompointSearchType.d.ts.map +1 -0
  95. package/dist/search/superTypes/domrectSearchType.d.ts +9 -0
  96. package/dist/search/superTypes/domrectSearchType.d.ts.map +1 -0
  97. package/dist/search/superTypes/errorsSpecialSearchType.d.ts +11 -0
  98. package/dist/search/superTypes/errorsSpecialSearchType.d.ts.map +1 -0
  99. package/dist/search/unions/discriminatedUnionSearchType.d.ts +12 -0
  100. package/dist/search/unions/discriminatedUnionSearchType.d.ts.map +1 -0
  101. package/dist/search/unions/unionFamilySearchType.d.ts +36 -0
  102. package/dist/search/unions/unionFamilySearchType.d.ts.map +1 -0
  103. package/dist/search/unions/unionSearchType.d.ts +8 -0
  104. package/dist/search/unions/unionSearchType.d.ts.map +1 -0
  105. package/dist/search/unions/xorSearchType.d.ts +12 -0
  106. package/dist/search/unions/xorSearchType.d.ts.map +1 -0
  107. package/dist/superTypes/buffersourceType.d.ts.map +1 -1
  108. package/dist/typeChoices.d.ts +3 -3
  109. package/dist/typeChoices.d.ts.map +1 -1
  110. package/dist/types.d.ts +3 -3
  111. package/dist/types.d.ts.map +1 -1
  112. package/dist/utils/rawTypesonEditor.d.ts.map +1 -1
  113. package/docs/proposals/search-plan.md +166 -0
  114. package/package.json +5 -4
  115. package/pnpm-workspace.yaml +1 -1
  116. package/rollup.config.js +12 -0
  117. package/src/formatAndTypeChoices.js +4 -4
  118. package/src/formats/schema.js +2 -1
  119. package/src/formats.js +1 -1
  120. package/src/fundamentalTypes/dateType.js +35 -14
  121. package/src/fundamentalTypes/domexceptionType.js +41 -33
  122. package/src/index.js +6 -0
  123. package/src/jtltExtensions.js +103 -0
  124. package/src/search/fundamentalTypes/arraySearchType.js +66 -0
  125. package/src/search/fundamentalTypes/bigintSearchType.js +62 -0
  126. package/src/search/fundamentalTypes/blobSearchType.js +41 -0
  127. package/src/search/fundamentalTypes/booleanSearchType.js +40 -0
  128. package/src/search/fundamentalTypes/catchSearchType.js +59 -0
  129. package/src/search/fundamentalTypes/dateSearchType.js +73 -0
  130. package/src/search/fundamentalTypes/domexceptionSearchType.js +55 -0
  131. package/src/search/fundamentalTypes/enumSearchType.js +58 -0
  132. package/src/search/fundamentalTypes/errorSearchType.js +11 -0
  133. package/src/search/fundamentalTypes/fileSearchType.js +41 -0
  134. package/src/search/fundamentalTypes/filelistSearchType.js +78 -0
  135. package/src/search/fundamentalTypes/functionSearchType.js +78 -0
  136. package/src/search/fundamentalTypes/mapSearchType.js +87 -0
  137. package/src/search/fundamentalTypes/nanSearchType.js +11 -0
  138. package/src/search/fundamentalTypes/nullSearchType.js +11 -0
  139. package/src/search/fundamentalTypes/numberSearchType.js +52 -0
  140. package/src/search/fundamentalTypes/objectSearchType.js +148 -0
  141. package/src/search/fundamentalTypes/promiseSearchType.js +61 -0
  142. package/src/search/fundamentalTypes/regexpSearchType.js +48 -0
  143. package/src/search/fundamentalTypes/setSearchType.js +65 -0
  144. package/src/search/fundamentalTypes/stringSearchType.js +35 -0
  145. package/src/search/fundamentalTypes/symbolSearchType.js +38 -0
  146. package/src/search/fundamentalTypes/undefinedSearchType.js +11 -0
  147. package/src/search/index.js +79 -0
  148. package/src/search/queryTree.js +235 -0
  149. package/src/search/queryTreeBuilders.js +224 -0
  150. package/src/search/searchDispatch.js +291 -0
  151. package/src/search/searchElementUtils.js +289 -0
  152. package/src/search/searchUtils.js +355 -0
  153. package/src/search/subTypes/blobHTMLSearchType.js +65 -0
  154. package/src/search/subTypes/recordSearchType.js +84 -0
  155. package/src/search/subTypes/tupleSearchType.js +111 -0
  156. package/src/search/superTypes/SpecialRealNumberSearchType.js +42 -0
  157. package/src/search/superTypes/buffersourceSearchType.js +47 -0
  158. package/src/search/superTypes/dommatrixSearchType.js +24 -0
  159. package/src/search/superTypes/dompointSearchType.js +15 -0
  160. package/src/search/superTypes/domrectSearchType.js +15 -0
  161. package/src/search/superTypes/errorsSpecialSearchType.js +15 -0
  162. package/src/search/unions/discriminatedUnionSearchType.js +16 -0
  163. package/src/search/unions/unionFamilySearchType.js +160 -0
  164. package/src/search/unions/unionSearchType.js +12 -0
  165. package/src/search/unions/xorSearchType.js +16 -0
  166. package/src/superTypes/buffersourceType.js +13 -15
  167. package/src/typeChoices.js +2 -2
  168. package/src/types.js +2 -2
  169. package/src/utils/rawTypesonEditor.js +12 -2
  170. package/tsconfig-prod.json +12 -0
  171. package/tsconfig.json +5 -10
@@ -0,0 +1,47 @@
1
+ import {buildPathLabel, buildRangeInputsPair, readRangeInputsPair} from '../searchUtils.js';
2
+ import {makeRangeLeaf} from '../queryTreeBuilders.js';
3
+ import {getQueryViaElement} from '../searchElementUtils.js';
4
+
5
+ /**
6
+ * @typedef {import('../searchDispatch.js').SearchTypeObject} SearchTypeObject
7
+ */
8
+
9
+ /**
10
+ * BufferSource: OR Range/Is Not Range (README) - a byte-length range, per
11
+ * the build order's own note that `buffersource` (like `function`) is
12
+ * "fuzzy" enough in the README to ship as a minimal, honest stub rather
13
+ * than over-build past what the spec defines. `buffersource` is one of
14
+ * jsoe's "checked" types (`{type: 'any', checks: [{name: 'buffersource'}]}`)
15
+ * with no schema-level byte-length bounds to read `min`/`max` HTML
16
+ * attributes from, unlike `array`'s `minLength`/`maxLength`.
17
+ * @type {SearchTypeObject}
18
+ */
19
+ const buffersourceSearchType = {
20
+ buildUI ({schemaObject, path, typeNamespace}) {
21
+ const label = buildPathLabel(schemaObject, path);
22
+ const name = `${typeNamespace}-buffersource`;
23
+ return ['jsoe-search-buffersource', {
24
+ dataset: {searchPath: path, searchKind: 'buffersource'},
25
+ title: label,
26
+ $define: {
27
+ /** @this {HTMLElement} */
28
+ getQuery () {
29
+ const {gte, lte} = readRangeInputsPair(this);
30
+ if (gte === '' && lte === '') {
31
+ return undefined;
32
+ }
33
+ return makeRangeLeaf(this.dataset.searchPath ?? '', 'buffersource', {
34
+ ...(gte === '' ? {} : {$gte: Number(gte)}),
35
+ ...(lte === '' ? {} : {$lte: Number(lte)})
36
+ });
37
+ }
38
+ }
39
+ }, [
40
+ ['span', {class: 'searchLabel'}, [`${label} (byte length)`]],
41
+ ...buildRangeInputsPair({name, min: 0})
42
+ ]];
43
+ },
44
+ getQuery: getQueryViaElement
45
+ };
46
+
47
+ export default buffersourceSearchType;
@@ -0,0 +1,24 @@
1
+ import {makeDomShapeSearchType} from '../searchElementUtils.js';
2
+
3
+ /**
4
+ * DOMMatrix: numeric search ranges for children; "Is/Is not Readonly";
5
+ * "Is/Is not 3d" (README) - see `searchElementUtils.js`'s
6
+ * `makeDomShapeSearchType` for the shared implementation. `dimensionKeys`
7
+ * covers both the 2D (`a`-`f`) and 3D (`m11`-`m44`) property sets at once;
8
+ * see that factory's doc for why.
9
+ * @type {import('../searchDispatch.js').SearchTypeObject}
10
+ */
11
+ const dommatrixSearchType = makeDomShapeSearchType({
12
+ tagName: 'jsoe-search-dommatrix',
13
+ dimensionKeys: [
14
+ 'a', 'b', 'c', 'd', 'e', 'f',
15
+ 'm11', 'm12', 'm13', 'm14',
16
+ 'm21', 'm22', 'm23', 'm24',
17
+ 'm31', 'm32', 'm33', 'm34',
18
+ 'm41', 'm42', 'm43', 'm44'
19
+ ],
20
+ includeReadonly: true,
21
+ includeDimensionCheck: true
22
+ });
23
+
24
+ export default dommatrixSearchType;
@@ -0,0 +1,15 @@
1
+ import {makeDomShapeSearchType} from '../searchElementUtils.js';
2
+
3
+ /**
4
+ * DOMPoint: numeric search ranges for children; "Is/Is not Readonly"
5
+ * (README) - see `searchElementUtils.js`'s `makeDomShapeSearchType` for the
6
+ * shared implementation.
7
+ * @type {import('../searchDispatch.js').SearchTypeObject}
8
+ */
9
+ const dompointSearchType = makeDomShapeSearchType({
10
+ tagName: 'jsoe-search-dompoint',
11
+ dimensionKeys: ['x', 'y', 'z', 'w'],
12
+ includeReadonly: true
13
+ });
14
+
15
+ export default dompointSearchType;
@@ -0,0 +1,15 @@
1
+ import {makeDomShapeSearchType} from '../searchElementUtils.js';
2
+
3
+ /**
4
+ * DOMRect: numeric search ranges for children; "Is/Is not Readonly"
5
+ * (README) - see `searchElementUtils.js`'s `makeDomShapeSearchType` for the
6
+ * shared implementation.
7
+ * @type {import('../searchDispatch.js').SearchTypeObject}
8
+ */
9
+ const domrectSearchType = makeDomShapeSearchType({
10
+ tagName: 'jsoe-search-domrect',
11
+ dimensionKeys: ['x', 'y', 'width', 'height'],
12
+ includeReadonly: true
13
+ });
14
+
15
+ export default domrectSearchType;
@@ -0,0 +1,15 @@
1
+ import {makeErrorFamilySearchType} from '../searchElementUtils.js';
2
+
3
+ /**
4
+ * Special Errors (RangeError/TypeError/SyntaxError/AggregateError/etc.):
5
+ * Literal/Regex search of child string properties, numeric of number
6
+ * children (README, same bullet as plain `Error`) - see
7
+ * `searchElementUtils.js`'s `makeErrorFamilySearchType` for the shared
8
+ * implementation.
9
+ * @type {import('../searchDispatch.js').SearchTypeObject}
10
+ */
11
+ const errorsSpecialSearchType = makeErrorFamilySearchType({
12
+ tagName: 'jsoe-search-errors-special'
13
+ });
14
+
15
+ export default errorsSpecialSearchType;
@@ -0,0 +1,16 @@
1
+ import {makeUnionFamilySearchType} from './unionFamilySearchType.js';
2
+
3
+ /**
4
+ * Discriminated Union: "Has type <type pull-down>", using the
5
+ * discriminator of discriminated union (README) - the type pull-down's
6
+ * options are labelled by each branch's discriminator value (e.g.
7
+ * `'circle'`/`'square'`) rather than a generic type name, and the resulting
8
+ * `typeOf` leaf carries that value too (`queryTree.js`). See
9
+ * `unionFamilySearchType.js` for the shared implementation.
10
+ * @type {import('../searchDispatch.js').SearchTypeObject}
11
+ */
12
+ const discriminatedUnionSearchType = makeUnionFamilySearchType({
13
+ tagName: 'jsoe-search-discriminated-union', discriminated: true
14
+ });
15
+
16
+ export default discriminatedUnionSearchType;
@@ -0,0 +1,160 @@
1
+ import {jml} from '../../vendor-imports.js';
2
+ import {buildPathLabel, findOwnControl} from '../searchUtils.js';
3
+ import {makeTypeOfLeaf, combineAnd} from '../queryTreeBuilders.js';
4
+ import {findSearchElement, getQueryViaElement, hasGetQuery} from '../searchElementUtils.js';
5
+ import {getSearchSchemaType, buildSearchWidget} from '../searchDispatch.js';
6
+
7
+ /**
8
+ * @typedef {import('../searchDispatch.js').SearchTypeObject} SearchTypeObject
9
+ */
10
+
11
+ /**
12
+ * @param {HTMLElement} el
13
+ * @returns {el is HTMLSelectElement}
14
+ */
15
+ function isSelectElement (el) {
16
+ return el.nodeName.toLowerCase() === 'select';
17
+ }
18
+
19
+ /**
20
+ * @typedef {{
21
+ * discriminator?: string,
22
+ * options: import('../../formats/schema.js').ZodexSchema[]
23
+ * }} UnionLikeSchemaObject
24
+ */
25
+
26
+ /**
27
+ * Shared implementation behind `unionSearchType.js`, `xorSearchType.js` and
28
+ * `discriminatedUnionSearchType.js`: all three share the exact same
29
+ * "has type <type pull-down>" shape (README) - `SzUnion`/`SzXor` carry
30
+ * only `options`, `SzDiscriminatedUnion` additionally carries a
31
+ * `discriminator` field name (`zodexy`'s schema types), so `discriminated`
32
+ * is the only behavioral difference. Picking a branch also renders that
33
+ * branch's own recursively-built search widget below the pull-down (not
34
+ * just "is type X" - "X matches Y" too), matching every other composite
35
+ * built so far.
36
+ *
37
+ * Each `<option>` carries its branch's search-dispatch key and (for a
38
+ * discriminated union) its discriminator value as `data-*` attributes,
39
+ * since `getQuery()` runs as a `$define` mixin method installed once on the
40
+ * tag's shared prototype - the branch metadata needs to be read back off
41
+ * the currently-selected `<option>` itself at query time, not closed over
42
+ * from this factory's one-time call.
43
+ * @param {{tagName: string, discriminated: boolean}} cfg
44
+ * @returns {SearchTypeObject}
45
+ */
46
+ export function makeUnionFamilySearchType ({tagName, discriminated}) {
47
+ return {
48
+ buildUI ({schemaObject, path, typeNamespace, topRoot, types, originalJSON}) {
49
+ const label = buildPathLabel(schemaObject, path);
50
+ const name = `${typeNamespace}-${tagName}`;
51
+ const unionLikeSchemaObject = /** @type {UnionLikeSchemaObject} */ (
52
+ /** @type {unknown} */ (schemaObject)
53
+ );
54
+ const {options} = unionLikeSchemaObject;
55
+ const discriminator = discriminated
56
+ ? unionLikeSchemaObject.discriminator
57
+ : undefined;
58
+
59
+ const branches = options.map((option, idx) => {
60
+ const searchType = getSearchSchemaType(option);
61
+ let discriminatorValue;
62
+ if (discriminator) {
63
+ const discSchema = /** @type {{properties?: {[key: string]: any}}} */ (
64
+ option
65
+ ).properties?.[discriminator];
66
+ if (discSchema?.type === 'literal') {
67
+ [discriminatorValue] = discSchema.values;
68
+ }
69
+ }
70
+ const optLabel = discriminatorValue === undefined
71
+ ? (buildPathLabel(option, `${path}/${idx}`) || searchType)
72
+ : String(discriminatorValue);
73
+ return {idx, option, searchType, discriminatorValue, optLabel};
74
+ });
75
+
76
+ return [tagName, {
77
+ dataset: {searchPath: path, searchKind: tagName},
78
+ title: label,
79
+ $define: {
80
+ /** @this {HTMLElement} */
81
+ getQuery () {
82
+ const searchPath = this.dataset.searchPath ?? '';
83
+ const select = /** @type {HTMLSelectElement|undefined} */ (
84
+ findOwnControl(this, 'select.jsoeSearchTypeOf')
85
+ );
86
+ if (!select || select.value === '') {
87
+ return undefined;
88
+ }
89
+ const selectedOption = select.selectedOptions[0];
90
+ const searchType = selectedOption?.dataset.searchType ?? '';
91
+ const rawDiscriminatorValue = selectedOption?.dataset.discriminatorValue;
92
+ const typeOfLeaf = makeTypeOfLeaf(
93
+ searchPath,
94
+ searchType,
95
+ rawDiscriminatorValue === undefined
96
+ ? undefined
97
+ : JSON.parse(rawDiscriminatorValue)
98
+ );
99
+ const branchEl = findSearchElement(this, searchPath);
100
+ const branchQuery = branchEl && hasGetQuery(branchEl)
101
+ ? branchEl.getQuery()
102
+ : undefined;
103
+ return combineAnd([typeOfLeaf, branchQuery]);
104
+ }
105
+ }
106
+ }, [
107
+ ['span', {class: 'searchLabel'}, [label]],
108
+ ['label', [
109
+ 'Has type: ',
110
+ ['select', {
111
+ name,
112
+ class: 'jsoeSearchTypeOf',
113
+ $on: {
114
+ change () {
115
+ if (!isSelectElement(this)) {
116
+ return;
117
+ }
118
+ const container = this.closest(tagName)?.querySelector(
119
+ '.searchUnionBranch'
120
+ );
121
+ if (!container) {
122
+ return;
123
+ }
124
+ container.textContent = '';
125
+ if (this.value === '') {
126
+ return;
127
+ }
128
+ const branch = branches[Number(this.value)];
129
+ const branchArr = buildSearchWidget({
130
+ schemaObject: branch.option,
131
+ path,
132
+ typeNamespace,
133
+ topRoot,
134
+ types,
135
+ originalJSON
136
+ });
137
+ container.append(/** @type {HTMLElement} */ (jml(...branchArr)));
138
+ }
139
+ }
140
+ }, [
141
+ ['option', {value: ''}, ['(any)']],
142
+ ...branches.map(({idx, searchType, discriminatorValue, optLabel}) => (
143
+ ['option', {
144
+ value: String(idx),
145
+ dataset: {
146
+ searchType,
147
+ ...(discriminatorValue === undefined
148
+ ? {}
149
+ : {discriminatorValue: JSON.stringify(discriminatorValue)})
150
+ }
151
+ }, [optLabel]]
152
+ ))
153
+ ]]
154
+ ]],
155
+ ['div', {class: 'searchUnionBranch'}]
156
+ ]];
157
+ },
158
+ getQuery: getQueryViaElement
159
+ };
160
+ }
@@ -0,0 +1,12 @@
1
+ import {makeUnionFamilySearchType} from './unionFamilySearchType.js';
2
+
3
+ /**
4
+ * Union: "Has type &lt;type pull-down&gt;" (README) - see
5
+ * `unionFamilySearchType.js` for the shared implementation.
6
+ * @type {import('../searchDispatch.js').SearchTypeObject}
7
+ */
8
+ const unionSearchType = makeUnionFamilySearchType({
9
+ tagName: 'jsoe-search-union', discriminated: false
10
+ });
11
+
12
+ export default unionSearchType;
@@ -0,0 +1,16 @@
1
+ import {makeUnionFamilySearchType} from './unionFamilySearchType.js';
2
+
3
+ /**
4
+ * Xor (exclusive union): "Has type &lt;type pull-down&gt;" (README) - see
5
+ * `unionFamilySearchType.js` for the shared implementation.
6
+ * `getXorBranchMatchInfo` (`src/formats/schema.js`) is deliberately not
7
+ * reused here, same as the search plan already rules out for xor generally
8
+ * (§4): it requires a concrete value to test branch match, which the search
9
+ * side never has.
10
+ * @type {import('../searchDispatch.js').SearchTypeObject}
11
+ */
12
+ const xorSearchType = makeUnionFamilySearchType({
13
+ tagName: 'jsoe-search-xor', discriminated: false
14
+ });
15
+
16
+ export default xorSearchType;
@@ -72,26 +72,26 @@ const getMinMaxForTypedArray = (typedArray) => {
72
72
  };
73
73
 
74
74
  /**
75
- * @typedef {"Int8Array"|"Uint8Array"|"Uint8ClampedArray"|
76
- * "Int16Array"|"Uint16Array"|"Int32Array"|"Uint32Array"|
77
- * "Float32Array"|"Float64Array"|"BigInt64Array"|
78
- * "BigUint64Array"} TypedArray
75
+ * @typedef {"Int8Array"|"Uint8Array"|"Uint8ClampedArray"
76
+ * |"Int16Array"|"Uint16Array"|"Int32Array"|"Uint32Array"
77
+ * |"Float32Array"|"Float64Array"|"BigInt64Array"
78
+ * |"BigUint64Array"} TypedArray
79
79
  */
80
80
 
81
81
  /**
82
- * @typedef {Int8Array|Uint8Array|Uint8ClampedArray|
83
- * Int16Array|Uint16Array|Int32Array|Uint32Array|
84
- * Float32Array|Float64Array|BigInt64Array|
85
- * BigUint64Array} TypedArrayInstance
82
+ * @typedef {Int8Array|Uint8Array|Uint8ClampedArray
83
+ * |Int16Array|Uint16Array|Int32Array|Uint32Array
84
+ * |Float32Array|Float64Array|BigInt64Array
85
+ * |BigUint64Array} TypedArrayInstance
86
86
  */
87
87
 
88
88
  /**
89
89
  * @param {TypedArray} prop
90
- * @returns {Int8ArrayConstructor|Uint8ArrayConstructor|
91
- * Uint8ClampedArrayConstructor|Int16ArrayConstructor|
92
- * Uint16ArrayConstructor|Int32ArrayConstructor|Uint32ArrayConstructor|
93
- * Float32ArrayConstructor|Float64ArrayConstructor|
94
- * BigInt64ArrayConstructor|BigUint64ArrayConstructor}
90
+ * @returns {Int8ArrayConstructor|Uint8ArrayConstructor
91
+ * |Uint8ClampedArrayConstructor|Int16ArrayConstructor
92
+ * |Uint16ArrayConstructor|Int32ArrayConstructor|Uint32ArrayConstructor
93
+ * |Float32ArrayConstructor|Float64ArrayConstructor
94
+ * |BigInt64ArrayConstructor|BigUint64ArrayConstructor}
95
95
  */
96
96
  const getTypedArray = (prop) => {
97
97
  switch (prop) {
@@ -164,7 +164,6 @@ const buffersourceType = {
164
164
  dataViewByteOffset,
165
165
  dataViewByteLength, length
166
166
  } = o;
167
- // @ts-expect-error Ok
168
167
  const buffer = new ArrayBuffer(byteLength, {maxByteLength});
169
168
 
170
169
  let typedArray, TypedArray;
@@ -471,7 +470,6 @@ const buffersourceType = {
471
470
  );
472
471
 
473
472
  const buffer = new ArrayBuffer(
474
- // @ts-expect-error New ArrayBuffer argument
475
473
  byteLengthVal, maxByteLength ? {maxByteLength} : undefined
476
474
  );
477
475
 
@@ -29,7 +29,7 @@ import deepEqual from 'fast-deep-equal/es6/index.js';
29
29
  */
30
30
  /**
31
31
  * @callback Validate
32
- * @param {{avoidReport?: boolean}} cfg
32
+ * @param {{avoidReport?: boolean}} [cfg]
33
33
  * @returns {boolean}
34
34
  */
35
35
  /**
@@ -127,7 +127,7 @@ import deepEqual from 'fast-deep-equal/es6/index.js';
127
127
  /**
128
128
  * @callback SetValue
129
129
  * @param {import('./formats.js').StructuredCloneValue} value
130
- * @param {import('./types.js').StateObject} stateObj
130
+ * @param {import('./types.js').StateObject} [stateObj]
131
131
  * @returns {Promise<void>}
132
132
  */
133
133
 
package/src/types.js CHANGED
@@ -641,8 +641,8 @@ class Types {
641
641
  /**
642
642
  * @param {import('./formats.js').AvailableFormat} format
643
643
  * @param {StructuredCloneValue} record
644
- * @param {StateObject} stateObj
645
- * @returns {Promise<Element>}
644
+ * @param {StateObject} [stateObj]
645
+ * @returns {Promise<HTMLElement>}
646
646
  */
647
647
  async getControlsForFormatAndValue (
648
648
  format, record, stateObj
@@ -613,11 +613,22 @@ export async function openRawEditorDialog ({
613
613
  ['div', {class: editorClass}]
614
614
  ];
615
615
 
616
+ // `dialogs.js`'s default `remove` behavior detaches the `<dialog>` from
617
+ // the document on close, but never tears down the `EditorView` mounted
618
+ // into it; left as-is, every "Edit raw"/"View raw" use leaks a live
619
+ // `EditorView` (and its internal `ResizeObserver`/DOM observers) bound
620
+ // to an already-detached subtree. Destroy it alongside the dialog.
621
+ const close = () => {
622
+ view.destroy();
623
+ };
624
+
616
625
  const dialog = readonly
617
626
  // @ts-expect-error TS bug
618
- ? dialogs.makeCancelDialog({children})
627
+ ? dialogs.makeCancelDialog({children, close})
619
628
  : dialogs.makeSubmitDialog({
620
629
  submitText: 'Save',
630
+ // @ts-expect-error TS bug
631
+ close,
621
632
  async submit ({dialog: dlg}) {
622
633
  const text = view.state.doc.toString();
623
634
  showError(dlg, '');
@@ -652,7 +663,6 @@ export async function openRawEditorDialog ({
652
663
  }
653
664
  dlg.close();
654
665
  },
655
- // @ts-expect-error TS bug
656
666
  children
657
667
  });
658
668
 
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "noEmit": false,
5
+ "declaration": true,
6
+ "declarationMap": true,
7
+ "emitDeclarationOnly": true,
8
+ "rootDir": "src",
9
+ "outDir": "dist"
10
+ },
11
+ "include": ["src/**/*.js", "typings/sceditor.d.ts", "typings/json-6.d.ts"]
12
+ }
package/tsconfig.json CHANGED
@@ -1,20 +1,15 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "lib": ["es2023", "DOM"],
4
- "skipLibCheck": true,
3
+ "lib": ["ESNext", "dom"],
5
4
  "moduleResolution": "nodenext",
6
5
  "module": "NodeNext",
7
6
  "allowJs": true,
8
7
  "checkJs": true,
9
- "noEmit": false,
10
- "declaration": true,
11
- "declarationMap": true,
12
- "emitDeclarationOnly": true,
13
8
  "strict": true,
9
+ "noEmit": true,
14
10
  "target": "es2020",
15
- "rootDir": "src",
16
- "outDir": "dist"
11
+ "types": ["node"]
17
12
  },
18
- "include": ["src/**/*.js", "typings/sceditor.d.ts", "typings/json-6.d.ts"],
19
- "exclude": ["node_modules", "src/deepEqual.js", "src/formats/schema.js", "./src/index.ts", "./dist/**/*.js"]
13
+ "include": ["**/*.ts", "**/*.js", "../typings/CypressPlugins.d.ts", "../typings/sceditor.d.ts", "../typings/json-6.d.ts"],
14
+ "exclude": ["rollup.config.js", ".agents", "vendor", "coverage", "instrumented", "node_modules", "dist", "src/deepEqual.js"]
20
15
  }