json-to-spec 19.1.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 (217) hide show
  1. package/README.md +118 -0
  2. package/docs/demo.html +426 -0
  3. package/docs/dist/min.js +164 -0
  4. package/docs/dist/v1/min.js +124 -0
  5. package/docs/dist/v17/min.js +355 -0
  6. package/docs/dist/v18/min.js +160 -0
  7. package/docs/dist/v19/min.js +164 -0
  8. package/docs/dist/v2/min.js +129 -0
  9. package/docs/dist/v3/min.js +201 -0
  10. package/docs/index.html +248 -0
  11. package/docs/pages/architecture.html +115 -0
  12. package/docs/pages/how-it-works.html +125 -0
  13. package/docs/pages/what-not.html +100 -0
  14. package/docs/pages/what.html +105 -0
  15. package/docs/pages/why.html +88 -0
  16. package/docs/samples/form.html +265 -0
  17. package/docs/samples/index.html +112 -0
  18. package/docs/samples/table.html +306 -0
  19. package/index.js +2 -0
  20. package/package.json +50 -0
  21. package/samples/dataList/index.html +31 -0
  22. package/samples/dataList/index.js +62 -0
  23. package/samples/dataList/input/data.json +5043 -0
  24. package/samples/dataList/input/structure.json +38 -0
  25. package/samples/dataList copy/index.html +30 -0
  26. package/samples/dataList copy/index.js +61 -0
  27. package/samples/dataList copy/input/data.json +35307 -0
  28. package/samples/dataList copy/input/structure.json +18 -0
  29. package/samples/form/index.html +29 -0
  30. package/samples/form/index.js +64 -0
  31. package/samples/form/input/data.json +9 -0
  32. package/samples/form/input/structure.json +192 -0
  33. package/samples/form-/data.json +42 -0
  34. package/samples/form-/structure.json +110 -0
  35. package/samples/select/index.html +31 -0
  36. package/samples/select/index.js +61 -0
  37. package/samples/select/input/data.json +35287 -0
  38. package/samples/select/input/select.json +18 -0
  39. package/samples/select/input/structure.json +47 -0
  40. package/samples/table/index.html +29 -0
  41. package/samples/table/index.js +61 -0
  42. package/samples/table/input/data.json +35287 -0
  43. package/samples/table/input/structure copy.json +47 -0
  44. package/samples/table/input/structure.json +86 -0
  45. package/samples/table/input/table.json +135 -0
  46. package/samples/table-/data.json +68 -0
  47. package/samples/table-/structure.json +235 -0
  48. package/src/index.js +2 -0
  49. package/src/v10/index.js +96 -0
  50. package/src/v10/instructionEngine/compile/compileTree.js +191 -0
  51. package/src/v10/instructionEngine/compileTree.js +1 -0
  52. package/src/v10/instructionEngine/expandIteration.js +1 -0
  53. package/src/v10/instructionEngine/index.js +29 -0
  54. package/src/v10/instructionEngine/interpolate.js +2 -0
  55. package/src/v10/instructionEngine/iteration/expandIteration.js +95 -0
  56. package/src/v10/instructionEngine/operation/operation.js +237 -0
  57. package/src/v10/instructionEngine/other/other.js +150 -0
  58. package/src/v10/instructionEngine/pipeline/pipeline.js +47 -0
  59. package/src/v10/instructionEngine/replace/replace.js +173 -0
  60. package/src/v10/instructionEngine/resolve/resolvePath.js +18 -0
  61. package/src/v10/instructionEngine/resolve/resolveTokenValue.js +22 -0
  62. package/src/v10/instructionEngine/resolvePath.js +1 -0
  63. package/src/v10/instructionEngine/resolveTokenValue.js +1 -0
  64. package/src/v10/instructionEngine/story/storyInjector.js +50 -0
  65. package/src/v10/instructionEngine/storyInjector.js +1 -0
  66. package/src/v10/instructionEngine/value/interpolate.js +38 -0
  67. package/src/v11/index.js +116 -0
  68. package/src/v11/iterate.js +270 -0
  69. package/src/v11/replace.js +169 -0
  70. package/src/v11/resolvePath.js +29 -0
  71. package/src/v12/index.js +122 -0
  72. package/src/v12/iterate/bindFormValues.js +74 -0
  73. package/src/v12/iterate/expandIteration.js +181 -0
  74. package/src/v12/iterate/index.js +10 -0
  75. package/src/v12/iterate/iterate.js +56 -0
  76. package/src/v12/iterate/iterateNode.js +86 -0
  77. package/src/v12/iterate/resolveCollection.js +37 -0
  78. package/src/v12/iterate.js +270 -0
  79. package/src/v12/replace.js +169 -0
  80. package/src/v12/resolvePath.js +29 -0
  81. package/src/v13/index.js +110 -0
  82. package/src/v13/iterate/bindFormValues.js +74 -0
  83. package/src/v13/iterate/expandIteration.js +188 -0
  84. package/src/v13/iterate/index.js +9 -0
  85. package/src/v13/iterate/iterate.js +32 -0
  86. package/src/v13/iterate/iterateNode.js +86 -0
  87. package/src/v13/iterate/resolveCollection.js +37 -0
  88. package/src/v13/iterate/walk.js +90 -0
  89. package/src/v13/iterate.js +270 -0
  90. package/src/v13/replace.js +169 -0
  91. package/src/v13/resolvePath.js +29 -0
  92. package/src/v14/index.js +112 -0
  93. package/src/v14/iterate/bindFormValues.js +74 -0
  94. package/src/v14/iterate/expandIteration.js +188 -0
  95. package/src/v14/iterate/index.js +9 -0
  96. package/src/v14/iterate/iterate.js +32 -0
  97. package/src/v14/iterate/resolveCollection.js +37 -0
  98. package/src/v14/iterate/walk/walk copy 2.js +114 -0
  99. package/src/v14/iterate/walk/walk copy.js +90 -0
  100. package/src/v14/iterate/walk/walk.js +98 -0
  101. package/src/v14/iterate.js +270 -0
  102. package/src/v14/replace/index.js +16 -0
  103. package/src/v14/replace/walk.js +90 -0
  104. package/src/v14/replace.js +153 -0
  105. package/src/v14/resolvePath.js +29 -0
  106. package/src/v15/index.js +123 -0
  107. package/src/v15/iterate/bindFormValues.js +74 -0
  108. package/src/v15/iterate/expandIteration.js +188 -0
  109. package/src/v15/iterate/index.js +9 -0
  110. package/src/v15/iterate/iterate.js +32 -0
  111. package/src/v15/iterate/resolveCollection.js +37 -0
  112. package/src/v15/iterate/walk/walk copy 2.js +114 -0
  113. package/src/v15/iterate/walk/walk copy.js +90 -0
  114. package/src/v15/iterate/walk/walk.js +195 -0
  115. package/src/v15/iterate.js +270 -0
  116. package/src/v15/replace/index.js +16 -0
  117. package/src/v15/replace/walk.js +90 -0
  118. package/src/v15/replace.js +155 -0
  119. package/src/v15/resolvePath.js +29 -0
  120. package/src/v16/index.js +129 -0
  121. package/src/v16/iterate/bindFormValues.js +74 -0
  122. package/src/v16/iterate/expandIteration.js +188 -0
  123. package/src/v16/iterate/index.js +9 -0
  124. package/src/v16/iterate/iterate.js +32 -0
  125. package/src/v16/iterate/resolveCollection.js +37 -0
  126. package/src/v16/iterate/walk/walk copy 2.js +114 -0
  127. package/src/v16/iterate/walk/walk copy.js +90 -0
  128. package/src/v16/iterate/walk/walk.js +196 -0
  129. package/src/v16/iterate.js +270 -0
  130. package/src/v16/replace/index.js +16 -0
  131. package/src/v16/replace/walk.js +90 -0
  132. package/src/v16/replace.js +155 -0
  133. package/src/v16/resolvePath.js +29 -0
  134. package/src/v17/index.js +119 -0
  135. package/src/v17/iterate/bindFormValues.js +74 -0
  136. package/src/v17/iterate/expandIteration.js +188 -0
  137. package/src/v17/iterate/index.js +9 -0
  138. package/src/v17/iterate/iterate.js +32 -0
  139. package/src/v17/iterate/resolveCollection.js +37 -0
  140. package/src/v17/iterate/walk/iterateDo.js +42 -0
  141. package/src/v17/iterate/walk/replaceWithData.js +60 -0
  142. package/src/v17/iterate/walk/walk.js +94 -0
  143. package/src/v17/iterate.js +270 -0
  144. package/src/v17/replace/index.js +16 -0
  145. package/src/v17/replace/walk.js +90 -0
  146. package/src/v17/replace.js +160 -0
  147. package/src/v17/resolvePath.js +29 -0
  148. package/src/v18/index.js +66 -0
  149. package/src/v18/meta.js +7 -0
  150. package/src/v18/registerGlobal.js +17 -0
  151. package/src/v18/replace.js +18 -0
  152. package/src/v18/resolvePath.js +29 -0
  153. package/src/v18/walk/iterate/v1/index.js +42 -0
  154. package/src/v18/walk/iterate/v2/index.js +32 -0
  155. package/src/v18/walk/iterate/v3/index.js +46 -0
  156. package/src/v18/walk/iterate/v4/createChildren.js +24 -0
  157. package/src/v18/walk/iterate/v4/index.js +25 -0
  158. package/src/v18/walk/replaceWithData/v1/index.js +42 -0
  159. package/src/v18/walk/replaceWithData/v1/replaceCommon.js +21 -0
  160. package/src/v18/walk/replaceWithData/v2/index.js +105 -0
  161. package/src/v18/walk/replaceWithData/v2/replaceCommon.js +21 -0
  162. package/src/v18/walk/replaceWithData/v3/index.js +15 -0
  163. package/src/v18/walk/replaceWithData/v3/replaceAttributes.js +29 -0
  164. package/src/v18/walk/replaceWithData/v3/replaceCommon.js +23 -0
  165. package/src/v18/walk/replaceWithData/v3/replaceNodeValue.js +27 -0
  166. package/src/v18/walk/walk.js +94 -0
  167. package/src/v19/index.js +55 -0
  168. package/src/v19/meta.js +7 -0
  169. package/src/v19/registerGlobal.js +17 -0
  170. package/src/v19/replace.js +18 -0
  171. package/src/v19/resolvePath.js +29 -0
  172. package/src/v19/walk/iterate/v1/index.js +42 -0
  173. package/src/v19/walk/iterate/v2/index.js +32 -0
  174. package/src/v19/walk/iterate/v3/index.js +46 -0
  175. package/src/v19/walk/iterate/v4/createChildren.js +27 -0
  176. package/src/v19/walk/iterate/v4/index.js +25 -0
  177. package/src/v19/walk/replaceWithData/v1/index.js +42 -0
  178. package/src/v19/walk/replaceWithData/v1/replaceCommon.js +21 -0
  179. package/src/v19/walk/replaceWithData/v2/index.js +105 -0
  180. package/src/v19/walk/replaceWithData/v2/replaceCommon.js +21 -0
  181. package/src/v19/walk/replaceWithData/v3/index.js +15 -0
  182. package/src/v19/walk/replaceWithData/v3/replaceAttributes.js +29 -0
  183. package/src/v19/walk/replaceWithData/v3/replaceCommon.js +23 -0
  184. package/src/v19/walk/replaceWithData/v3/replaceNodeValue.js +27 -0
  185. package/src/v19/walk/walk.js +97 -0
  186. package/src/v8/index.js +69 -0
  187. package/src/v8/instructionEngine/compile/compileTree.js +191 -0
  188. package/src/v8/instructionEngine/compileTree.js +1 -0
  189. package/src/v8/instructionEngine/expandIteration.js +1 -0
  190. package/src/v8/instructionEngine/index.js +16 -0
  191. package/src/v8/instructionEngine/interpolate.js +2 -0
  192. package/src/v8/instructionEngine/iteration/expandIteration.js +95 -0
  193. package/src/v8/instructionEngine/resolve/resolvePath.js +18 -0
  194. package/src/v8/instructionEngine/resolve/resolveTokenValue.js +22 -0
  195. package/src/v8/instructionEngine/resolvePath.js +1 -0
  196. package/src/v8/instructionEngine/resolveTokenValue.js +1 -0
  197. package/src/v8/instructionEngine/story/storyInjector.js +50 -0
  198. package/src/v8/instructionEngine/storyInjector.js +1 -0
  199. package/src/v8/instructionEngine/value/interpolate.js +38 -0
  200. package/src/v9/index.js +96 -0
  201. package/src/v9/instructionEngine/compile/compileTree.js +191 -0
  202. package/src/v9/instructionEngine/compileTree.js +1 -0
  203. package/src/v9/instructionEngine/expandIteration.js +1 -0
  204. package/src/v9/instructionEngine/index.js +29 -0
  205. package/src/v9/instructionEngine/interpolate.js +2 -0
  206. package/src/v9/instructionEngine/iteration/expandIteration.js +95 -0
  207. package/src/v9/instructionEngine/operation/operation.js +237 -0
  208. package/src/v9/instructionEngine/other/other.js +150 -0
  209. package/src/v9/instructionEngine/pipeline/pipeline.js +47 -0
  210. package/src/v9/instructionEngine/replace/replace.js +173 -0
  211. package/src/v9/instructionEngine/resolve/resolvePath.js +18 -0
  212. package/src/v9/instructionEngine/resolve/resolveTokenValue.js +22 -0
  213. package/src/v9/instructionEngine/resolvePath.js +1 -0
  214. package/src/v9/instructionEngine/resolveTokenValue.js +1 -0
  215. package/src/v9/instructionEngine/story/storyInjector.js +50 -0
  216. package/src/v9/instructionEngine/storyInjector.js +1 -0
  217. package/src/v9/instructionEngine/value/interpolate.js +38 -0
@@ -0,0 +1,150 @@
1
+ import { injectStory } from "../story/storyInjector.js";
2
+
3
+ const otherArrayNode = ({ inNode, inContext, inRootData }) => {
4
+ const localNode = inNode;
5
+ const localContext = inContext;
6
+ const localRootData = inRootData;
7
+
8
+ const flattened = [];
9
+
10
+ for (const child of localNode) {
11
+ const childContext = child && child.__loopItemContext
12
+ ? { ...localContext, ...child.__loopItemContext }
13
+ : localContext;
14
+
15
+ const processed = otherNode({
16
+ inNode: child,
17
+ inContext: childContext,
18
+ inRootData: localRootData
19
+ });
20
+
21
+ if (Array.isArray(processed)) {
22
+ flattened.push(...processed);
23
+ } else if (processed !== null && processed !== undefined) {
24
+ flattened.push(processed);
25
+ }
26
+ }
27
+
28
+ return flattened;
29
+ };
30
+
31
+ const otherStandardNode = ({ inNode, inContext, inRootData }) => {
32
+ const localNode = inNode;
33
+ const localContext = inContext;
34
+ const localRootData = inRootData;
35
+
36
+ const currentItem = {
37
+ ...(typeof localContext.item === "object" ? localContext.item : {}),
38
+ ...localContext,
39
+ ...(localNode.__loopItemContext || {})
40
+ };
41
+
42
+ const clone = { ...localNode };
43
+
44
+ if (clone.attributes) {
45
+ clone.attributes = { ...clone.attributes };
46
+ const isFormField = ["input", "textarea", "select", "option"].includes(clone.tagName?.toLowerCase());
47
+ if (isFormField) {
48
+ const fieldName = currentItem.field || currentItem.columnName || currentItem.name;
49
+ if (currentItem.value !== undefined && currentItem.value !== null) {
50
+ clone.attributes.value = String(currentItem.value);
51
+ if (clone.tagName === "textarea" && !clone.textContent) {
52
+ clone.textContent = String(currentItem.value);
53
+ }
54
+ } else if (fieldName && localRootData[fieldName] !== undefined && localRootData[fieldName] !== null) {
55
+ clone.attributes.value = String(localRootData[fieldName]);
56
+ if (clone.tagName === "textarea" && !clone.textContent) {
57
+ clone.textContent = String(localRootData[fieldName]);
58
+ }
59
+ } else if (fieldName && localRootData.values && localRootData.values[fieldName] !== undefined && localRootData.values[fieldName] !== null) {
60
+ clone.attributes.value = String(localRootData.values[fieldName]);
61
+ if (clone.tagName === "textarea" && !clone.textContent) {
62
+ clone.textContent = String(localRootData.values[fieldName]);
63
+ }
64
+ }
65
+ }
66
+ }
67
+
68
+ const storyNode = injectStory(clone, localNode, currentItem, localRootData);
69
+
70
+ if ("jsonToSpec" in storyNode) {
71
+ delete storyNode.jsonToSpec;
72
+ }
73
+
74
+ if (Array.isArray(storyNode.children)) {
75
+ const processedChildren = [];
76
+ for (const child of storyNode.children) {
77
+ const childContext = child && child.__loopItemContext
78
+ ? { ...currentItem, ...child.__loopItemContext }
79
+ : currentItem;
80
+
81
+ const processedChild = otherNode({
82
+ inNode: child,
83
+ inContext: childContext,
84
+ inRootData: localRootData
85
+ });
86
+
87
+ if (Array.isArray(processedChild)) {
88
+ processedChildren.push(...processedChild);
89
+ } else if (processedChild !== null && processedChild !== undefined) {
90
+ processedChildren.push(processedChild);
91
+ }
92
+ }
93
+ storyNode.children = processedChildren;
94
+ }
95
+
96
+ delete storyNode.__loopItemContext;
97
+ return storyNode;
98
+ };
99
+
100
+ export const otherNode = ({ inNode, inContext = {}, inRootData = {} } = {}) => {
101
+ const localNode = inNode;
102
+ const localContext = inContext;
103
+ const localRootData = inRootData;
104
+
105
+ if (localNode === null || localNode === undefined) return null;
106
+
107
+ if (Array.isArray(localNode)) {
108
+ return otherArrayNode({
109
+ inNode: localNode,
110
+ inContext: localContext,
111
+ inRootData: localRootData
112
+ });
113
+ }
114
+
115
+ if (typeof localNode !== "object") {
116
+ return localNode;
117
+ }
118
+
119
+ return otherStandardNode({
120
+ inNode: localNode,
121
+ inContext: localContext,
122
+ inRootData: localRootData
123
+ });
124
+ };
125
+
126
+ export const other = (inStructureOrOptions, inData = {}) => {
127
+ let localStructure = inStructureOrOptions;
128
+ let localData = inData;
129
+ let localContext = {};
130
+
131
+ if (inStructureOrOptions && typeof inStructureOrOptions === "object" && !Array.isArray(inStructureOrOptions)) {
132
+ if ("inStructure" in inStructureOrOptions || "inTree" in inStructureOrOptions || "inNode" in inStructureOrOptions) {
133
+ localStructure = inStructureOrOptions.inStructure || inStructureOrOptions.inTree || inStructureOrOptions.inNode;
134
+ localData = inStructureOrOptions.inData || localData;
135
+ localContext = inStructureOrOptions.inContext || localContext;
136
+ } else if ("structure" in inStructureOrOptions) {
137
+ localStructure = inStructureOrOptions.structure;
138
+ localData = inStructureOrOptions.data || localData;
139
+ localContext = inStructureOrOptions.context || localContext;
140
+ }
141
+ }
142
+
143
+ return otherNode({
144
+ inNode: localStructure,
145
+ inContext: localContext,
146
+ inRootData: localData
147
+ });
148
+ };
149
+
150
+ export default other;
@@ -0,0 +1,47 @@
1
+ import operation from "../operation/operation.js";
2
+ import replace from "../replace/replace.js";
3
+ import other from "../other/other.js";
4
+
5
+ export const defaultPipeline = [operation, replace, other];
6
+ export const defaultPipeline2 = [replace];
7
+
8
+ export const pipeline = (inStructureOrOptions, inData = {}, inCustomSteps) => {
9
+ let localStructure = inStructureOrOptions;
10
+ let localData = inData;
11
+ let localSteps = inCustomSteps || defaultPipeline;
12
+ console.log("inCustomSteps : ", inCustomSteps, localSteps);
13
+
14
+ if (inStructureOrOptions && typeof inStructureOrOptions === "object" && !Array.isArray(inStructureOrOptions)) {
15
+ if ("inStructure" in inStructureOrOptions || "inTree" in inStructureOrOptions || "inNode" in inStructureOrOptions) {
16
+ localStructure = inStructureOrOptions.inStructure || inStructureOrOptions.inTree || inStructureOrOptions.inNode;
17
+ localData = inStructureOrOptions.inData || localData;
18
+ localSteps = inStructureOrOptions.inSteps || localSteps;
19
+ } else if ("structure" in inStructureOrOptions) {
20
+ localStructure = inStructureOrOptions.structure;
21
+ localData = inStructureOrOptions.data || localData;
22
+ localSteps = inStructureOrOptions.steps || localSteps;
23
+ }
24
+ }
25
+
26
+ let current = localStructure;
27
+ for (const step of localSteps) {
28
+ if (typeof step === "function") {
29
+ current = step({
30
+ inStructure: current,
31
+ inData: localData
32
+ });
33
+ }
34
+ }
35
+
36
+ return current;
37
+ };
38
+
39
+ export const pipe = (...inSteps) => {
40
+ const localSteps = inSteps.length > 0 ? inSteps : defaultPipeline;
41
+
42
+ return (inStructureOrOptions, inData = {}) => {
43
+ return pipeline(inStructureOrOptions, inData, localSteps);
44
+ };
45
+ };
46
+
47
+ export default pipeline;
@@ -0,0 +1,173 @@
1
+ import { interpolateValue, interpolateString } from "../value/interpolate.js";
2
+
3
+ const replaceArrayNode = ({ inNode, inContext, inRootData }) => {
4
+ const localNode = inNode;
5
+ const localContext = inContext;
6
+ const localRootData = inRootData;
7
+
8
+ const flattened = [];
9
+
10
+ for (const child of localNode) {
11
+ const childContext = child && child.__loopItemContext
12
+ ? { ...localContext, ...child.__loopItemContext }
13
+ : localContext;
14
+
15
+ const replaced = replaceNode({
16
+ inNode: child,
17
+ inContext: childContext,
18
+ inRootData: localRootData
19
+ });
20
+
21
+ if (Array.isArray(replaced)) {
22
+ flattened.push(...replaced);
23
+ } else if (replaced !== null && replaced !== undefined) {
24
+ flattened.push(replaced);
25
+ }
26
+ }
27
+
28
+ return flattened;
29
+ };
30
+
31
+ const replacePrimitiveNode = ({ inNode, inContext, inRootData }) => {
32
+ const localNode = inNode;
33
+ const localContext = inContext;
34
+ const localRootData = inRootData;
35
+
36
+ if (typeof localNode === "string") {
37
+ return interpolateString({
38
+ inText: localNode,
39
+ inItemContext: localContext,
40
+ inRootData: localRootData
41
+ });
42
+ }
43
+
44
+ return localNode;
45
+ };
46
+
47
+ const replaceStandardNode = ({ inNode, inContext, inRootData }) => {
48
+ const localNode = inNode;
49
+ const localContext = inContext;
50
+ const localRootData = inRootData;
51
+
52
+ const currentItem = {
53
+ ...(typeof localContext.item === "object" ? localContext.item : {}),
54
+ ...localContext,
55
+ ...(localNode.__loopItemContext || {})
56
+ };
57
+
58
+ const clone = { ...localNode };
59
+
60
+ if (clone.textContent && typeof clone.textContent === "string") {
61
+ clone.textContent = interpolateString({
62
+ inText: clone.textContent,
63
+ inItemContext: currentItem,
64
+ inRootData: localRootData
65
+ });
66
+ }
67
+
68
+ if (clone.attributes) {
69
+ clone.attributes = { ...clone.attributes };
70
+ for (const [name, value] of Object.entries(clone.attributes)) {
71
+ if (typeof value === "string") {
72
+ clone.attributes[name] = interpolateValue({
73
+ inValue: value,
74
+ inItemContext: currentItem,
75
+ inRootData: localRootData
76
+ });
77
+ }
78
+ }
79
+ }
80
+
81
+ if (clone.properties) {
82
+ clone.properties = { ...clone.properties };
83
+ for (const [name, value] of Object.entries(clone.properties)) {
84
+ if (typeof value === "string") {
85
+ clone.properties[name] = interpolateValue({
86
+ inValue: value,
87
+ inItemContext: currentItem,
88
+ inRootData: localRootData
89
+ });
90
+ }
91
+ }
92
+ }
93
+
94
+ if (Array.isArray(clone.children)) {
95
+ const replacedChildren = [];
96
+ for (const child of clone.children) {
97
+ const childContext = child && child.__loopItemContext
98
+ ? { ...currentItem, ...child.__loopItemContext }
99
+ : currentItem;
100
+
101
+ const replacedChild = replaceNode({
102
+ inNode: child,
103
+ inContext: childContext,
104
+ inRootData: localRootData
105
+ });
106
+
107
+ if (Array.isArray(replacedChild)) {
108
+ replacedChildren.push(...replacedChild);
109
+ } else if (replacedChild !== null && replacedChild !== undefined) {
110
+ replacedChildren.push(replacedChild);
111
+ }
112
+ }
113
+ clone.children = replacedChildren;
114
+ }
115
+
116
+ return clone;
117
+ };
118
+
119
+ export const replaceNode = ({ inNode, inContext = {}, inRootData = {} } = {}) => {
120
+ const localNode = inNode;
121
+ const localContext = inContext;
122
+ const localRootData = inRootData;
123
+
124
+ if (localNode === null || localNode === undefined) return null;
125
+
126
+ if (Array.isArray(localNode)) {
127
+ return replaceArrayNode({
128
+ inNode: localNode,
129
+ inContext: localContext,
130
+ inRootData: localRootData
131
+ });
132
+ }
133
+
134
+ if (typeof localNode !== "object") {
135
+ return replacePrimitiveNode({
136
+ inNode: localNode,
137
+ inContext: localContext,
138
+ inRootData: localRootData
139
+ });
140
+ }
141
+
142
+ return replaceStandardNode({
143
+ inNode: localNode,
144
+ inContext: localContext,
145
+ inRootData: localRootData
146
+ });
147
+ };
148
+
149
+ export const replace = (inStructureOrOptions, inData = {}) => {
150
+ let localStructure = inStructureOrOptions;
151
+ let localData = inData;
152
+ let localContext = {};
153
+
154
+ if (inStructureOrOptions && typeof inStructureOrOptions === "object" && !Array.isArray(inStructureOrOptions)) {
155
+ if ("inStructure" in inStructureOrOptions || "inTree" in inStructureOrOptions || "inNode" in inStructureOrOptions) {
156
+ localStructure = inStructureOrOptions.inStructure || inStructureOrOptions.inTree || inStructureOrOptions.inNode;
157
+ localData = inStructureOrOptions.inData || localData;
158
+ localContext = inStructureOrOptions.inContext || localContext;
159
+ } else if ("structure" in inStructureOrOptions) {
160
+ localStructure = inStructureOrOptions.structure;
161
+ localData = inStructureOrOptions.data || localData;
162
+ localContext = inStructureOrOptions.context || localContext;
163
+ }
164
+ }
165
+
166
+ return replaceNode({
167
+ inNode: localStructure,
168
+ inContext: localContext,
169
+ inRootData: localData
170
+ });
171
+ };
172
+
173
+ export default replace;
@@ -0,0 +1,18 @@
1
+ export const resolvePath = ({ inData, inPath }) => {
2
+ if (inData === null || inData === undefined) return undefined;
3
+ if (inPath === undefined || inPath === null || inPath === "" || inPath === ".") {
4
+ return inData;
5
+ }
6
+
7
+ const segments = Array.isArray(inPath) ? inPath : String(inPath).split(".");
8
+ let current = inData;
9
+
10
+ for (const segment of segments) {
11
+ if (current === null || current === undefined) return undefined;
12
+ current = current[segment];
13
+ }
14
+
15
+ return current;
16
+ };
17
+
18
+ export default resolvePath;
@@ -0,0 +1,22 @@
1
+ import resolvePath from "./resolvePath.js";
2
+
3
+ export const resolveTokenValue = ({ inPath, inItemContext, inRootData }) => {
4
+ let value = resolvePath({ inData: inItemContext, inPath });
5
+
6
+ if (value === undefined && inItemContext && typeof inItemContext === "object") {
7
+ if (inItemContext.item && typeof inItemContext.item === "object") {
8
+ value = resolvePath({ inData: inItemContext.item, inPath });
9
+ }
10
+ if (value === undefined && inItemContext.row && typeof inItemContext.row === "object") {
11
+ value = resolvePath({ inData: inItemContext.row, inPath });
12
+ }
13
+ }
14
+
15
+ if (value === undefined && inRootData) {
16
+ value = resolvePath({ inData: inRootData, inPath });
17
+ }
18
+
19
+ return value;
20
+ };
21
+
22
+ export default resolveTokenValue;
@@ -0,0 +1 @@
1
+ export { resolvePath, default } from "./resolve/resolvePath.js";
@@ -0,0 +1 @@
1
+ export { resolveTokenValue, default } from "./resolve/resolveTokenValue.js";
@@ -0,0 +1,50 @@
1
+ import { interpolateString } from "../value/interpolate.js";
2
+
3
+ export const injectStory = (cloned, originalNode, currentItem, inRootData) => {
4
+ if (typeof originalNode.story !== "string" || originalNode.story.trim() === "") return cloned;
5
+
6
+ const storyText = interpolateString({
7
+ inText: originalNode.story,
8
+ inItemContext: currentItem,
9
+ inRootData
10
+ });
11
+
12
+ const storyTitle = typeof originalNode.storyTitle === "string" && originalNode.storyTitle.trim() !== ""
13
+ ? interpolateString({
14
+ inText: originalNode.storyTitle,
15
+ inItemContext: currentItem,
16
+ inRootData
17
+ })
18
+ : null;
19
+
20
+ const storyTag = (typeof originalNode.storyTag === "string" && originalNode.storyTag.trim() !== "") ? originalNode.storyTag : "p";
21
+ const storyClass = (typeof originalNode.storyClass === "string" && originalNode.storyClass.trim() !== "") ? originalNode.storyClass : "story text-muted small";
22
+ const storyPosition = originalNode.storyPosition === "append" ? "append" : "prepend";
23
+
24
+ const nextChildren = Array.isArray(cloned.children) ? cloned.children : [];
25
+ const storyNodes = [];
26
+
27
+ if (storyTitle) {
28
+ storyNodes.push({
29
+ tagName: "strong",
30
+ attributes: { class: "story-title d-block" },
31
+ textContent: storyTitle
32
+ });
33
+ }
34
+
35
+ storyNodes.push({
36
+ tagName: storyTag,
37
+ attributes: { class: storyClass },
38
+ textContent: storyText
39
+ });
40
+
41
+ if (storyPosition === "prepend") {
42
+ cloned.children = [...storyNodes, ...nextChildren];
43
+ } else {
44
+ cloned.children = [...nextChildren, ...storyNodes];
45
+ }
46
+
47
+ return cloned;
48
+ };
49
+
50
+ export default injectStory;
@@ -0,0 +1 @@
1
+ export { injectStory, default } from "./story/storyInjector.js";
@@ -0,0 +1,38 @@
1
+ import { resolveTokenValue } from "../resolve/resolveTokenValue.js";
2
+
3
+ export const interpolateValue = ({ inValue, inItemContext, inRootData }) => {
4
+ if (typeof inValue !== "string" || !inValue.includes("${")) {
5
+ return inValue;
6
+ }
7
+
8
+ const exactMatch = inValue.match(/^\$\{([^}]+)\}$/);
9
+ if (exactMatch) {
10
+ const token = resolveTokenValue({
11
+ inPath: exactMatch[1].trim(),
12
+ inItemContext,
13
+ inRootData
14
+ });
15
+ return token !== undefined && token !== null ? token : "";
16
+ }
17
+
18
+ return inValue.replace(/\$\{([^}]+)\}/g, (_, expr) => {
19
+ const token = resolveTokenValue({
20
+ inPath: expr.trim(),
21
+ inItemContext,
22
+ inRootData
23
+ });
24
+ return token !== undefined && token !== null ? String(token) : "";
25
+ });
26
+ };
27
+
28
+ export const interpolateString = ({ inText, inItemContext, inRootData }) => {
29
+ const value = interpolateValue({
30
+ inValue: inText,
31
+ inItemContext,
32
+ inRootData
33
+ });
34
+
35
+ return value !== undefined && value !== null ? String(value) : "";
36
+ };
37
+
38
+ export default { interpolateValue, interpolateString };
@@ -0,0 +1,116 @@
1
+ /**
2
+ * json-to-spec v11
3
+ *
4
+ * Minimalist 2-Layer Specification Compiler:
5
+ * 1. replace: Pure ${...} token replacement across JSON structures.
6
+ * 2. iterate: Evaluates jsonToSpec operations, expanding collections into clean children.
7
+ */
8
+
9
+ import { replace, replaceNode } from "./replace.js";
10
+ import { iterate, iterateNode, operation } from "./iterate.js";
11
+
12
+ export const meta = {
13
+ version: "11.0.0",
14
+ name: "json-to-spec/v11",
15
+ description: "Minimalist 2-layer compiler: pure value replace + jsonToSpec iterate"
16
+ };
17
+
18
+ /**
19
+ * Executes a custom pipeline of transformations over the structure.
20
+ */
21
+ export const pipeline = ({ inStructure, inData = {}, inSteps = [replace, iterate] } = {}) => {
22
+ const localData = inData;
23
+ const localSteps = inSteps;
24
+
25
+ let current = inStructure;
26
+ for (const step of localSteps) {
27
+ if (typeof step === "function") {
28
+ current = step({ inStructure: current, inData: localData });
29
+ }
30
+ }
31
+ return current;
32
+ };
33
+
34
+ export const pipe = (...inSteps) => {
35
+ const localSteps = inSteps.length > 0 ? inSteps : [replace, iterate];
36
+ return (inStructure, inData = {}) => {
37
+ return pipeline({ inStructure, inData, inSteps: localSteps });
38
+ };
39
+ };
40
+
41
+ /**
42
+ * Main compiler entry point:
43
+ * 1. Replace values: replace(structure, data)
44
+ * 2. Iterate/Operate: iterate(replacedStructure, data)
45
+ */
46
+ export const compile = (inStructureOrOptions, inData = {}) => {
47
+ let localStructure = inStructureOrOptions;
48
+ let localData = inData;
49
+
50
+ if (inStructureOrOptions && typeof inStructureOrOptions === "object" && !Array.isArray(inStructureOrOptions)) {
51
+ if ("inStructure" in inStructureOrOptions || "inTree" in inStructureOrOptions || "inNode" in inStructureOrOptions) {
52
+ localStructure = inStructureOrOptions.inStructure || inStructureOrOptions.inTree || inStructureOrOptions.inNode;
53
+ localData = inStructureOrOptions.inData || localData;
54
+ } else if ("structure" in inStructureOrOptions) {
55
+ localStructure = inStructureOrOptions.structure;
56
+ localData = inStructureOrOptions.data || localData;
57
+ }
58
+ }
59
+
60
+ // Step 1: Replace tokens in the structure
61
+ const replaced = replace({
62
+ inStructure: localStructure,
63
+ inData: localData
64
+ });
65
+
66
+ // Step 2: Expand jsonToSpec operations on the replaced structure
67
+ const spec = iterate({
68
+ inStructure: replaced,
69
+ inData: localData
70
+ });
71
+
72
+ // const spec = replace({
73
+ // inStructure: localStructure,
74
+ // inData: localData
75
+ // });
76
+
77
+ // const spec = iterate({
78
+ // inStructure: localStructure,
79
+ // inData: localData
80
+ // });
81
+
82
+
83
+ return spec;
84
+ };
85
+
86
+ export const jsonToSpec = {
87
+ replace,
88
+ iterate,
89
+ operation,
90
+ pipeline,
91
+ pipe,
92
+ compile
93
+ };
94
+
95
+ export {
96
+ replace,
97
+ replaceNode,
98
+ iterate,
99
+ iterateNode,
100
+ operation
101
+ };
102
+
103
+ if (typeof globalThis !== "undefined") {
104
+ globalThis.ks ??= {};
105
+ globalThis.ks["json-to-spec"] = {
106
+ meta,
107
+ compile,
108
+ replace,
109
+ iterate,
110
+ operation,
111
+ pipeline,
112
+ jsonToSpec
113
+ };
114
+ }
115
+
116
+ export default compile;