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.
- package/README.md +118 -0
- package/docs/demo.html +426 -0
- package/docs/dist/min.js +164 -0
- package/docs/dist/v1/min.js +124 -0
- package/docs/dist/v17/min.js +355 -0
- package/docs/dist/v18/min.js +160 -0
- package/docs/dist/v19/min.js +164 -0
- package/docs/dist/v2/min.js +129 -0
- package/docs/dist/v3/min.js +201 -0
- package/docs/index.html +248 -0
- package/docs/pages/architecture.html +115 -0
- package/docs/pages/how-it-works.html +125 -0
- package/docs/pages/what-not.html +100 -0
- package/docs/pages/what.html +105 -0
- package/docs/pages/why.html +88 -0
- package/docs/samples/form.html +265 -0
- package/docs/samples/index.html +112 -0
- package/docs/samples/table.html +306 -0
- package/index.js +2 -0
- package/package.json +50 -0
- package/samples/dataList/index.html +31 -0
- package/samples/dataList/index.js +62 -0
- package/samples/dataList/input/data.json +5043 -0
- package/samples/dataList/input/structure.json +38 -0
- package/samples/dataList copy/index.html +30 -0
- package/samples/dataList copy/index.js +61 -0
- package/samples/dataList copy/input/data.json +35307 -0
- package/samples/dataList copy/input/structure.json +18 -0
- package/samples/form/index.html +29 -0
- package/samples/form/index.js +64 -0
- package/samples/form/input/data.json +9 -0
- package/samples/form/input/structure.json +192 -0
- package/samples/form-/data.json +42 -0
- package/samples/form-/structure.json +110 -0
- package/samples/select/index.html +31 -0
- package/samples/select/index.js +61 -0
- package/samples/select/input/data.json +35287 -0
- package/samples/select/input/select.json +18 -0
- package/samples/select/input/structure.json +47 -0
- package/samples/table/index.html +29 -0
- package/samples/table/index.js +61 -0
- package/samples/table/input/data.json +35287 -0
- package/samples/table/input/structure copy.json +47 -0
- package/samples/table/input/structure.json +86 -0
- package/samples/table/input/table.json +135 -0
- package/samples/table-/data.json +68 -0
- package/samples/table-/structure.json +235 -0
- package/src/index.js +2 -0
- package/src/v10/index.js +96 -0
- package/src/v10/instructionEngine/compile/compileTree.js +191 -0
- package/src/v10/instructionEngine/compileTree.js +1 -0
- package/src/v10/instructionEngine/expandIteration.js +1 -0
- package/src/v10/instructionEngine/index.js +29 -0
- package/src/v10/instructionEngine/interpolate.js +2 -0
- package/src/v10/instructionEngine/iteration/expandIteration.js +95 -0
- package/src/v10/instructionEngine/operation/operation.js +237 -0
- package/src/v10/instructionEngine/other/other.js +150 -0
- package/src/v10/instructionEngine/pipeline/pipeline.js +47 -0
- package/src/v10/instructionEngine/replace/replace.js +173 -0
- package/src/v10/instructionEngine/resolve/resolvePath.js +18 -0
- package/src/v10/instructionEngine/resolve/resolveTokenValue.js +22 -0
- package/src/v10/instructionEngine/resolvePath.js +1 -0
- package/src/v10/instructionEngine/resolveTokenValue.js +1 -0
- package/src/v10/instructionEngine/story/storyInjector.js +50 -0
- package/src/v10/instructionEngine/storyInjector.js +1 -0
- package/src/v10/instructionEngine/value/interpolate.js +38 -0
- package/src/v11/index.js +116 -0
- package/src/v11/iterate.js +270 -0
- package/src/v11/replace.js +169 -0
- package/src/v11/resolvePath.js +29 -0
- package/src/v12/index.js +122 -0
- package/src/v12/iterate/bindFormValues.js +74 -0
- package/src/v12/iterate/expandIteration.js +181 -0
- package/src/v12/iterate/index.js +10 -0
- package/src/v12/iterate/iterate.js +56 -0
- package/src/v12/iterate/iterateNode.js +86 -0
- package/src/v12/iterate/resolveCollection.js +37 -0
- package/src/v12/iterate.js +270 -0
- package/src/v12/replace.js +169 -0
- package/src/v12/resolvePath.js +29 -0
- package/src/v13/index.js +110 -0
- package/src/v13/iterate/bindFormValues.js +74 -0
- package/src/v13/iterate/expandIteration.js +188 -0
- package/src/v13/iterate/index.js +9 -0
- package/src/v13/iterate/iterate.js +32 -0
- package/src/v13/iterate/iterateNode.js +86 -0
- package/src/v13/iterate/resolveCollection.js +37 -0
- package/src/v13/iterate/walk.js +90 -0
- package/src/v13/iterate.js +270 -0
- package/src/v13/replace.js +169 -0
- package/src/v13/resolvePath.js +29 -0
- package/src/v14/index.js +112 -0
- package/src/v14/iterate/bindFormValues.js +74 -0
- package/src/v14/iterate/expandIteration.js +188 -0
- package/src/v14/iterate/index.js +9 -0
- package/src/v14/iterate/iterate.js +32 -0
- package/src/v14/iterate/resolveCollection.js +37 -0
- package/src/v14/iterate/walk/walk copy 2.js +114 -0
- package/src/v14/iterate/walk/walk copy.js +90 -0
- package/src/v14/iterate/walk/walk.js +98 -0
- package/src/v14/iterate.js +270 -0
- package/src/v14/replace/index.js +16 -0
- package/src/v14/replace/walk.js +90 -0
- package/src/v14/replace.js +153 -0
- package/src/v14/resolvePath.js +29 -0
- package/src/v15/index.js +123 -0
- package/src/v15/iterate/bindFormValues.js +74 -0
- package/src/v15/iterate/expandIteration.js +188 -0
- package/src/v15/iterate/index.js +9 -0
- package/src/v15/iterate/iterate.js +32 -0
- package/src/v15/iterate/resolveCollection.js +37 -0
- package/src/v15/iterate/walk/walk copy 2.js +114 -0
- package/src/v15/iterate/walk/walk copy.js +90 -0
- package/src/v15/iterate/walk/walk.js +195 -0
- package/src/v15/iterate.js +270 -0
- package/src/v15/replace/index.js +16 -0
- package/src/v15/replace/walk.js +90 -0
- package/src/v15/replace.js +155 -0
- package/src/v15/resolvePath.js +29 -0
- package/src/v16/index.js +129 -0
- package/src/v16/iterate/bindFormValues.js +74 -0
- package/src/v16/iterate/expandIteration.js +188 -0
- package/src/v16/iterate/index.js +9 -0
- package/src/v16/iterate/iterate.js +32 -0
- package/src/v16/iterate/resolveCollection.js +37 -0
- package/src/v16/iterate/walk/walk copy 2.js +114 -0
- package/src/v16/iterate/walk/walk copy.js +90 -0
- package/src/v16/iterate/walk/walk.js +196 -0
- package/src/v16/iterate.js +270 -0
- package/src/v16/replace/index.js +16 -0
- package/src/v16/replace/walk.js +90 -0
- package/src/v16/replace.js +155 -0
- package/src/v16/resolvePath.js +29 -0
- package/src/v17/index.js +119 -0
- package/src/v17/iterate/bindFormValues.js +74 -0
- package/src/v17/iterate/expandIteration.js +188 -0
- package/src/v17/iterate/index.js +9 -0
- package/src/v17/iterate/iterate.js +32 -0
- package/src/v17/iterate/resolveCollection.js +37 -0
- package/src/v17/iterate/walk/iterateDo.js +42 -0
- package/src/v17/iterate/walk/replaceWithData.js +60 -0
- package/src/v17/iterate/walk/walk.js +94 -0
- package/src/v17/iterate.js +270 -0
- package/src/v17/replace/index.js +16 -0
- package/src/v17/replace/walk.js +90 -0
- package/src/v17/replace.js +160 -0
- package/src/v17/resolvePath.js +29 -0
- package/src/v18/index.js +66 -0
- package/src/v18/meta.js +7 -0
- package/src/v18/registerGlobal.js +17 -0
- package/src/v18/replace.js +18 -0
- package/src/v18/resolvePath.js +29 -0
- package/src/v18/walk/iterate/v1/index.js +42 -0
- package/src/v18/walk/iterate/v2/index.js +32 -0
- package/src/v18/walk/iterate/v3/index.js +46 -0
- package/src/v18/walk/iterate/v4/createChildren.js +24 -0
- package/src/v18/walk/iterate/v4/index.js +25 -0
- package/src/v18/walk/replaceWithData/v1/index.js +42 -0
- package/src/v18/walk/replaceWithData/v1/replaceCommon.js +21 -0
- package/src/v18/walk/replaceWithData/v2/index.js +105 -0
- package/src/v18/walk/replaceWithData/v2/replaceCommon.js +21 -0
- package/src/v18/walk/replaceWithData/v3/index.js +15 -0
- package/src/v18/walk/replaceWithData/v3/replaceAttributes.js +29 -0
- package/src/v18/walk/replaceWithData/v3/replaceCommon.js +23 -0
- package/src/v18/walk/replaceWithData/v3/replaceNodeValue.js +27 -0
- package/src/v18/walk/walk.js +94 -0
- package/src/v19/index.js +55 -0
- package/src/v19/meta.js +7 -0
- package/src/v19/registerGlobal.js +17 -0
- package/src/v19/replace.js +18 -0
- package/src/v19/resolvePath.js +29 -0
- package/src/v19/walk/iterate/v1/index.js +42 -0
- package/src/v19/walk/iterate/v2/index.js +32 -0
- package/src/v19/walk/iterate/v3/index.js +46 -0
- package/src/v19/walk/iterate/v4/createChildren.js +27 -0
- package/src/v19/walk/iterate/v4/index.js +25 -0
- package/src/v19/walk/replaceWithData/v1/index.js +42 -0
- package/src/v19/walk/replaceWithData/v1/replaceCommon.js +21 -0
- package/src/v19/walk/replaceWithData/v2/index.js +105 -0
- package/src/v19/walk/replaceWithData/v2/replaceCommon.js +21 -0
- package/src/v19/walk/replaceWithData/v3/index.js +15 -0
- package/src/v19/walk/replaceWithData/v3/replaceAttributes.js +29 -0
- package/src/v19/walk/replaceWithData/v3/replaceCommon.js +23 -0
- package/src/v19/walk/replaceWithData/v3/replaceNodeValue.js +27 -0
- package/src/v19/walk/walk.js +97 -0
- package/src/v8/index.js +69 -0
- package/src/v8/instructionEngine/compile/compileTree.js +191 -0
- package/src/v8/instructionEngine/compileTree.js +1 -0
- package/src/v8/instructionEngine/expandIteration.js +1 -0
- package/src/v8/instructionEngine/index.js +16 -0
- package/src/v8/instructionEngine/interpolate.js +2 -0
- package/src/v8/instructionEngine/iteration/expandIteration.js +95 -0
- package/src/v8/instructionEngine/resolve/resolvePath.js +18 -0
- package/src/v8/instructionEngine/resolve/resolveTokenValue.js +22 -0
- package/src/v8/instructionEngine/resolvePath.js +1 -0
- package/src/v8/instructionEngine/resolveTokenValue.js +1 -0
- package/src/v8/instructionEngine/story/storyInjector.js +50 -0
- package/src/v8/instructionEngine/storyInjector.js +1 -0
- package/src/v8/instructionEngine/value/interpolate.js +38 -0
- package/src/v9/index.js +96 -0
- package/src/v9/instructionEngine/compile/compileTree.js +191 -0
- package/src/v9/instructionEngine/compileTree.js +1 -0
- package/src/v9/instructionEngine/expandIteration.js +1 -0
- package/src/v9/instructionEngine/index.js +29 -0
- package/src/v9/instructionEngine/interpolate.js +2 -0
- package/src/v9/instructionEngine/iteration/expandIteration.js +95 -0
- package/src/v9/instructionEngine/operation/operation.js +237 -0
- package/src/v9/instructionEngine/other/other.js +150 -0
- package/src/v9/instructionEngine/pipeline/pipeline.js +47 -0
- package/src/v9/instructionEngine/replace/replace.js +173 -0
- package/src/v9/instructionEngine/resolve/resolvePath.js +18 -0
- package/src/v9/instructionEngine/resolve/resolveTokenValue.js +22 -0
- package/src/v9/instructionEngine/resolvePath.js +1 -0
- package/src/v9/instructionEngine/resolveTokenValue.js +1 -0
- package/src/v9/instructionEngine/story/storyInjector.js +50 -0
- package/src/v9/instructionEngine/storyInjector.js +1 -0
- 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 };
|
package/src/v11/index.js
ADDED
|
@@ -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;
|