@coast/core-utils 0.0.25 → 0.0.29
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/dist/AssertionUtils.d.ts +0 -9
- package/dist/AssertionUtils.js +0 -16
- package/dist/AssertionUtils.js.map +1 -1
- package/dist/CompactSet.d.ts +5 -0
- package/dist/CompactSet.js +21 -0
- package/dist/CompactSet.js.map +1 -0
- package/dist/EntityRehydrator.d.ts +12 -0
- package/dist/EntityRehydrator.js +30 -0
- package/dist/EntityRehydrator.js.map +1 -0
- package/dist/EntityUtils.d.ts +11 -0
- package/dist/EntityUtils.js +24 -0
- package/dist/EntityUtils.js.map +1 -0
- package/dist/ISODateStringUtils.d.ts +5 -0
- package/dist/ISODateStringUtils.js +16 -0
- package/dist/ISODateStringUtils.js.map +1 -0
- package/dist/JsonPath.d.ts +8 -0
- package/dist/JsonPath.js +38 -0
- package/dist/JsonPath.js.map +1 -0
- package/dist/test/AssertionUtilsTest.js +0 -41
- package/dist/test/AssertionUtilsTest.js.map +1 -1
- package/dist/test/CompactSetTest.d.ts +1 -0
- package/dist/test/CompactSetTest.js +95 -0
- package/dist/test/CompactSetTest.js.map +1 -0
- package/dist/test/EntityRehydratorTest.d.ts +1 -0
- package/dist/test/EntityRehydratorTest.js +48 -0
- package/dist/test/EntityRehydratorTest.js.map +1 -0
- package/dist/test/EntityUtilsTest.d.ts +1 -0
- package/dist/test/EntityUtilsTest.js +87 -0
- package/dist/test/EntityUtilsTest.js.map +1 -0
- package/dist/test/JsonPathTest.d.ts +1 -0
- package/dist/test/JsonPathTest.js +419 -0
- package/dist/test/JsonPathTest.js.map +1 -0
- package/jest.config.js +1 -0
- package/package.json +5 -7
- package/src/AssertionUtils.ts +0 -33
- package/src/CompactSet.ts +31 -0
- package/src/EntityRehydrator.ts +35 -0
- package/src/EntityUtils.ts +37 -0
- package/src/ISODateStringUtils.ts +24 -0
- package/src/JsonPath.ts +58 -0
- package/src/test/AssertionUtilsTest.ts +0 -48
- package/src/test/CompactSetTest.ts +106 -0
- package/src/test/EntityRehydratorTest.ts +74 -0
- package/src/test/EntityUtilsTest.ts +97 -0
- package/src/test/JsonPathTest.ts +516 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const common_test_1 = require("@paradoxical-io/common-test");
|
|
4
|
+
const JsonPath_1 = require("../JsonPath");
|
|
5
|
+
const TEST_PATHS = {
|
|
6
|
+
FOO_BAR_BAZ: 'foo.bar.baz',
|
|
7
|
+
FOO_BAR_BAZ_FORMATTED: '$.foo.bar.baz',
|
|
8
|
+
FOO_BAR_FORMATTED: '$.foo.bar',
|
|
9
|
+
FOO_FORMATTED: '$.foo',
|
|
10
|
+
FOO: 'foo',
|
|
11
|
+
BAR_BAZ_HYPHENATED: 'bar-baz',
|
|
12
|
+
FOO_BAR_BAZ_HYPHENATED: 'foo.bar-baz',
|
|
13
|
+
BAR_BAZ_HYPHENATED_FORMATTED: "$.foo['bar-baz']",
|
|
14
|
+
BAR_BAZ_QUX_FORMATTED: "$.foo['bar-baz'].qux",
|
|
15
|
+
FOO_BAR_BAZ_QUX_FORMATTED: '$.foo.bar.baz.qux',
|
|
16
|
+
SIMPLE_FOO_BAR: 'foo.bar',
|
|
17
|
+
};
|
|
18
|
+
describe('JsonPath', () => {
|
|
19
|
+
describe('constructor', () => {
|
|
20
|
+
it('creates a JsonPath with a given value', () => {
|
|
21
|
+
const path = new JsonPath_1.JsonPath(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
22
|
+
(0, common_test_1.safeExpect)(path.value).toEqual(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe('fromString', () => {
|
|
26
|
+
describe('simple paths', () => {
|
|
27
|
+
it('converts a simple dot-notation path', () => {
|
|
28
|
+
const path = JsonPath_1.JsonPath.fromString(TEST_PATHS.FOO_BAR_BAZ);
|
|
29
|
+
(0, common_test_1.safeExpect)(path.value).toEqual(TEST_PATHS.FOO_BAR_BAZ_FORMATTED);
|
|
30
|
+
});
|
|
31
|
+
it('converts a single segment path', () => {
|
|
32
|
+
const path = JsonPath_1.JsonPath.fromString(TEST_PATHS.FOO);
|
|
33
|
+
(0, common_test_1.safeExpect)(path.value).toEqual(TEST_PATHS.FOO_FORMATTED);
|
|
34
|
+
});
|
|
35
|
+
it('converts a two segment path', () => {
|
|
36
|
+
const path = JsonPath_1.JsonPath.fromString(TEST_PATHS.SIMPLE_FOO_BAR);
|
|
37
|
+
(0, common_test_1.safeExpect)(path.value).toEqual(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
38
|
+
});
|
|
39
|
+
it('returns the path unchanged if it already starts with $', () => {
|
|
40
|
+
const path = JsonPath_1.JsonPath.fromString(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
41
|
+
(0, common_test_1.safeExpect)(path.value).toEqual(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
42
|
+
});
|
|
43
|
+
it('handles paths with underscores', () => {
|
|
44
|
+
const path = JsonPath_1.JsonPath.fromString('foo_bar.baz_qux');
|
|
45
|
+
(0, common_test_1.safeExpect)(path.value).toEqual('$.foo_bar.baz_qux');
|
|
46
|
+
});
|
|
47
|
+
it('handles paths with mixed case', () => {
|
|
48
|
+
const path = JsonPath_1.JsonPath.fromString('FooBar.BazQux');
|
|
49
|
+
(0, common_test_1.safeExpect)(path.value).toEqual('$.FooBar.BazQux');
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('numeric segments', () => {
|
|
53
|
+
it('uses bracket notation for segments starting with numbers', () => {
|
|
54
|
+
const path = JsonPath_1.JsonPath.fromString('foo.123bar');
|
|
55
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['123bar']");
|
|
56
|
+
});
|
|
57
|
+
it('uses bracket notation for purely numeric segments', () => {
|
|
58
|
+
const path = JsonPath_1.JsonPath.fromString('foo.123');
|
|
59
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['123']");
|
|
60
|
+
});
|
|
61
|
+
it('uses bracket notation for array index notation', () => {
|
|
62
|
+
const path = JsonPath_1.JsonPath.fromString('foo.0.bar');
|
|
63
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['0'].bar");
|
|
64
|
+
});
|
|
65
|
+
it('handles multiple numeric segments', () => {
|
|
66
|
+
const path = JsonPath_1.JsonPath.fromString('foo.123.456.bar');
|
|
67
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['123']['456'].bar");
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('special characters', () => {
|
|
71
|
+
it('uses bracket notation for segments with hyphens', () => {
|
|
72
|
+
const path = JsonPath_1.JsonPath.fromString(TEST_PATHS.FOO_BAR_BAZ_HYPHENATED);
|
|
73
|
+
(0, common_test_1.safeExpect)(path.value).toEqual(TEST_PATHS.BAR_BAZ_HYPHENATED_FORMATTED);
|
|
74
|
+
});
|
|
75
|
+
it('uses bracket notation for segments with spaces', () => {
|
|
76
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar baz');
|
|
77
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['bar baz']");
|
|
78
|
+
});
|
|
79
|
+
it('uses bracket notation for segments with dots', () => {
|
|
80
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar.baz.qux');
|
|
81
|
+
(0, common_test_1.safeExpect)(path.value).toEqual(TEST_PATHS.FOO_BAR_BAZ_QUX_FORMATTED);
|
|
82
|
+
});
|
|
83
|
+
it('uses bracket notation for segments with special characters', () => {
|
|
84
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar@baz');
|
|
85
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['bar@baz']");
|
|
86
|
+
});
|
|
87
|
+
it('uses bracket notation for segments with dollar signs', () => {
|
|
88
|
+
const path = JsonPath_1.JsonPath.fromString('foo.$bar');
|
|
89
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['$bar']");
|
|
90
|
+
});
|
|
91
|
+
it('uses bracket notation for segments with brackets', () => {
|
|
92
|
+
const path = JsonPath_1.JsonPath.fromString('foo.[bar]');
|
|
93
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['[bar]']");
|
|
94
|
+
});
|
|
95
|
+
it('uses bracket notation for segments with parentheses', () => {
|
|
96
|
+
const path = JsonPath_1.JsonPath.fromString('foo.(bar)');
|
|
97
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['(bar)']");
|
|
98
|
+
});
|
|
99
|
+
it('uses bracket notation for segments with slashes', () => {
|
|
100
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar/baz');
|
|
101
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['bar/baz']");
|
|
102
|
+
});
|
|
103
|
+
it('uses bracket notation for segments with colons', () => {
|
|
104
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar:baz');
|
|
105
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['bar:baz']");
|
|
106
|
+
});
|
|
107
|
+
it('uses bracket notation for segments with commas', () => {
|
|
108
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar,baz');
|
|
109
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['bar,baz']");
|
|
110
|
+
});
|
|
111
|
+
it('uses bracket notation for segments with semicolons', () => {
|
|
112
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar;baz');
|
|
113
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['bar;baz']");
|
|
114
|
+
});
|
|
115
|
+
it('uses bracket notation for segments with quotes', () => {
|
|
116
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar"baz');
|
|
117
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['bar\"baz']");
|
|
118
|
+
});
|
|
119
|
+
it('uses bracket notation for segments with apostrophes', () => {
|
|
120
|
+
const path = JsonPath_1.JsonPath.fromString("foo.bar'baz");
|
|
121
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['bar'baz']");
|
|
122
|
+
});
|
|
123
|
+
it('uses bracket notation for segments with asterisks', () => {
|
|
124
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar*baz');
|
|
125
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['bar*baz']");
|
|
126
|
+
});
|
|
127
|
+
it('uses bracket notation for segments with plus signs', () => {
|
|
128
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar+baz');
|
|
129
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['bar+baz']");
|
|
130
|
+
});
|
|
131
|
+
it('uses bracket notation for segments with equals signs', () => {
|
|
132
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar=baz');
|
|
133
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['bar=baz']");
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('UUID segments', () => {
|
|
137
|
+
it('uses bracket notation for UUID segments', () => {
|
|
138
|
+
const path = JsonPath_1.JsonPath.fromString('foo.123e4567-e89b-12d3-a456-426614174000');
|
|
139
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['123e4567-e89b-12d3-a456-426614174000']");
|
|
140
|
+
});
|
|
141
|
+
it('uses bracket notation for uppercase UUID segments', () => {
|
|
142
|
+
const path = JsonPath_1.JsonPath.fromString('foo.123E4567-E89B-12D3-A456-426614174000');
|
|
143
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['123E4567-E89B-12D3-A456-426614174000']");
|
|
144
|
+
});
|
|
145
|
+
it('uses bracket notation for mixed case UUID segments', () => {
|
|
146
|
+
const path = JsonPath_1.JsonPath.fromString('foo.123e4567-E89B-12d3-A456-426614174000');
|
|
147
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['123e4567-E89B-12d3-A456-426614174000']");
|
|
148
|
+
});
|
|
149
|
+
it('handles UUIDs in the middle of a path', () => {
|
|
150
|
+
const path = JsonPath_1.JsonPath.fromString('foo.123e4567-e89b-12d3-a456-426614174000.bar');
|
|
151
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['123e4567-e89b-12d3-a456-426614174000'].bar");
|
|
152
|
+
});
|
|
153
|
+
it('handles multiple UUIDs in a path', () => {
|
|
154
|
+
const path = JsonPath_1.JsonPath.fromString('foo.123e4567-e89b-12d3-a456-426614174000.bar.987fcdeb-51a2-43e1-9876-543210fedcba');
|
|
155
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['123e4567-e89b-12d3-a456-426614174000'].bar['987fcdeb-51a2-43e1-9876-543210fedcba']");
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe('complex paths', () => {
|
|
159
|
+
it('handles paths with mixed regular and special segments', () => {
|
|
160
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar-baz.qux');
|
|
161
|
+
(0, common_test_1.safeExpect)(path.value).toEqual(TEST_PATHS.BAR_BAZ_QUX_FORMATTED);
|
|
162
|
+
});
|
|
163
|
+
it('handles paths with multiple special character segments', () => {
|
|
164
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar-baz.qux-quux');
|
|
165
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['bar-baz']['qux-quux']");
|
|
166
|
+
});
|
|
167
|
+
it('handles paths with numeric and special character segments', () => {
|
|
168
|
+
const path = JsonPath_1.JsonPath.fromString('foo.123.bar-baz');
|
|
169
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['123']['bar-baz']");
|
|
170
|
+
});
|
|
171
|
+
it('handles paths with UUIDs and special character segments', () => {
|
|
172
|
+
const path = JsonPath_1.JsonPath.fromString('foo.123e4567-e89b-12d3-a456-426614174000.bar-baz');
|
|
173
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['123e4567-e89b-12d3-a456-426614174000']['bar-baz']");
|
|
174
|
+
});
|
|
175
|
+
it('handles long paths with many segments', () => {
|
|
176
|
+
const path = JsonPath_1.JsonPath.fromString('a.b.c.d.e.f.g.h.i.j');
|
|
177
|
+
(0, common_test_1.safeExpect)(path.value).toEqual('$.a.b.c.d.e.f.g.h.i.j');
|
|
178
|
+
});
|
|
179
|
+
it('handles paths with consecutive special segments', () => {
|
|
180
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar-baz.qux-quux.hello-world');
|
|
181
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.foo['bar-baz']['qux-quux']['hello-world']");
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
describe('edge cases', () => {
|
|
185
|
+
it('handles empty string gracefully', () => {
|
|
186
|
+
const path = JsonPath_1.JsonPath.fromString('');
|
|
187
|
+
(0, common_test_1.safeExpect)(path.value).toEqual('$.');
|
|
188
|
+
});
|
|
189
|
+
it('handles path that is just $', () => {
|
|
190
|
+
const path = JsonPath_1.JsonPath.fromString('$');
|
|
191
|
+
(0, common_test_1.safeExpect)(path.value).toEqual('$');
|
|
192
|
+
});
|
|
193
|
+
it('handles path starting with $ and having segments', () => {
|
|
194
|
+
const path = JsonPath_1.JsonPath.fromString(TEST_PATHS.FOO_BAR_BAZ_FORMATTED);
|
|
195
|
+
(0, common_test_1.safeExpect)(path.value).toEqual(TEST_PATHS.FOO_BAR_BAZ_FORMATTED);
|
|
196
|
+
});
|
|
197
|
+
it('handles path with special characters already in bracket notation', () => {
|
|
198
|
+
const path = JsonPath_1.JsonPath.fromString(TEST_PATHS.BAR_BAZ_HYPHENATED_FORMATTED);
|
|
199
|
+
(0, common_test_1.safeExpect)(path.value).toEqual(TEST_PATHS.BAR_BAZ_HYPHENATED_FORMATTED);
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
describe('appendPath', () => {
|
|
204
|
+
describe('appending JsonPath instances', () => {
|
|
205
|
+
it('appends a JsonPath to another JsonPath', () => {
|
|
206
|
+
const path1 = new JsonPath_1.JsonPath(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
207
|
+
const path2 = new JsonPath_1.JsonPath('$.baz.qux');
|
|
208
|
+
const result = path1.appendPath(path2);
|
|
209
|
+
(0, common_test_1.safeExpect)(result.value).toEqual(TEST_PATHS.FOO_BAR_BAZ_QUX_FORMATTED);
|
|
210
|
+
});
|
|
211
|
+
it('appends a simple JsonPath', () => {
|
|
212
|
+
const path1 = new JsonPath_1.JsonPath(TEST_PATHS.FOO_FORMATTED);
|
|
213
|
+
const path2 = new JsonPath_1.JsonPath('$.bar');
|
|
214
|
+
const result = path1.appendPath(path2);
|
|
215
|
+
(0, common_test_1.safeExpect)(result.value).toEqual(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
216
|
+
});
|
|
217
|
+
it('appends a JsonPath with bracket notation', () => {
|
|
218
|
+
const path1 = new JsonPath_1.JsonPath(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
219
|
+
const path2 = new JsonPath_1.JsonPath("$['baz-qux']");
|
|
220
|
+
const result = path1.appendPath(path2);
|
|
221
|
+
(0, common_test_1.safeExpect)(result.value).toEqual("$.foo.bar['baz-qux']");
|
|
222
|
+
});
|
|
223
|
+
it('appends to a path with bracket notation', () => {
|
|
224
|
+
const path1 = new JsonPath_1.JsonPath(TEST_PATHS.BAR_BAZ_HYPHENATED_FORMATTED);
|
|
225
|
+
const path2 = new JsonPath_1.JsonPath('$.qux');
|
|
226
|
+
const result = path1.appendPath(path2);
|
|
227
|
+
(0, common_test_1.safeExpect)(result.value).toEqual(TEST_PATHS.BAR_BAZ_QUX_FORMATTED);
|
|
228
|
+
});
|
|
229
|
+
it('appends a complex path to another complex path', () => {
|
|
230
|
+
const path1 = new JsonPath_1.JsonPath(TEST_PATHS.BAR_BAZ_HYPHENATED_FORMATTED);
|
|
231
|
+
const path2 = new JsonPath_1.JsonPath("$.qux['hello-world']");
|
|
232
|
+
const result = path1.appendPath(path2);
|
|
233
|
+
(0, common_test_1.safeExpect)(result.value).toEqual("$.foo['bar-baz'].qux['hello-world']");
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
describe('appending string paths', () => {
|
|
237
|
+
it('appends a string path to a JsonPath', () => {
|
|
238
|
+
const path1 = new JsonPath_1.JsonPath(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
239
|
+
const result = path1.appendPath('baz.qux');
|
|
240
|
+
(0, common_test_1.safeExpect)(result.value).toEqual(TEST_PATHS.FOO_BAR_BAZ_QUX_FORMATTED);
|
|
241
|
+
});
|
|
242
|
+
it('appends a simple string path', () => {
|
|
243
|
+
const path1 = new JsonPath_1.JsonPath(TEST_PATHS.FOO_FORMATTED);
|
|
244
|
+
const result = path1.appendPath('bar');
|
|
245
|
+
(0, common_test_1.safeExpect)(result.value).toEqual(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
246
|
+
});
|
|
247
|
+
it('converts and appends a string path with special characters', () => {
|
|
248
|
+
const path1 = new JsonPath_1.JsonPath(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
249
|
+
const result = path1.appendPath('baz-qux');
|
|
250
|
+
(0, common_test_1.safeExpect)(result.value).toEqual("$.foo.bar['baz-qux']");
|
|
251
|
+
});
|
|
252
|
+
it('converts and appends a string path with numbers', () => {
|
|
253
|
+
const path1 = new JsonPath_1.JsonPath(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
254
|
+
const result = path1.appendPath('123.baz');
|
|
255
|
+
(0, common_test_1.safeExpect)(result.value).toEqual("$.foo.bar['123'].baz");
|
|
256
|
+
});
|
|
257
|
+
it('converts and appends a string path with UUIDs', () => {
|
|
258
|
+
const path1 = new JsonPath_1.JsonPath(TEST_PATHS.FOO_FORMATTED);
|
|
259
|
+
const result = path1.appendPath('123e4567-e89b-12d3-a456-426614174000');
|
|
260
|
+
(0, common_test_1.safeExpect)(result.value).toEqual("$.foo['123e4567-e89b-12d3-a456-426614174000']");
|
|
261
|
+
});
|
|
262
|
+
it('appends a multi-segment string path', () => {
|
|
263
|
+
const path1 = new JsonPath_1.JsonPath(TEST_PATHS.FOO_FORMATTED);
|
|
264
|
+
const result = path1.appendPath('bar.baz.qux');
|
|
265
|
+
(0, common_test_1.safeExpect)(result.value).toEqual(TEST_PATHS.FOO_BAR_BAZ_QUX_FORMATTED);
|
|
266
|
+
});
|
|
267
|
+
it('appends a string path that already starts with $', () => {
|
|
268
|
+
const path1 = new JsonPath_1.JsonPath(TEST_PATHS.FOO_FORMATTED);
|
|
269
|
+
const result = path1.appendPath('$.bar.baz');
|
|
270
|
+
(0, common_test_1.safeExpect)(result.value).toEqual('$.foo.bar.baz');
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
describe('chaining multiple appends', () => {
|
|
274
|
+
it('chains multiple appendPath calls', () => {
|
|
275
|
+
const path = new JsonPath_1.JsonPath(TEST_PATHS.FOO_FORMATTED);
|
|
276
|
+
const result = path.appendPath('bar').appendPath('baz').appendPath('qux');
|
|
277
|
+
(0, common_test_1.safeExpect)(result.value).toEqual(TEST_PATHS.FOO_BAR_BAZ_QUX_FORMATTED);
|
|
278
|
+
});
|
|
279
|
+
it('chains appends with mixed types', () => {
|
|
280
|
+
const path = new JsonPath_1.JsonPath(TEST_PATHS.FOO_FORMATTED);
|
|
281
|
+
const path2 = new JsonPath_1.JsonPath('$.bar');
|
|
282
|
+
const result = path.appendPath(path2).appendPath('baz').appendPath(new JsonPath_1.JsonPath('$.qux'));
|
|
283
|
+
(0, common_test_1.safeExpect)(result.value).toEqual(TEST_PATHS.FOO_BAR_BAZ_QUX_FORMATTED);
|
|
284
|
+
});
|
|
285
|
+
it('chains appends with special characters', () => {
|
|
286
|
+
const path = new JsonPath_1.JsonPath(TEST_PATHS.FOO_FORMATTED);
|
|
287
|
+
const result = path.appendPath('bar-baz').appendPath('qux').appendPath('hello-world');
|
|
288
|
+
(0, common_test_1.safeExpect)(result.value).toEqual("$.foo['bar-baz'].qux['hello-world']");
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
describe('edge cases', () => {
|
|
292
|
+
it('appends an empty string', () => {
|
|
293
|
+
const path1 = new JsonPath_1.JsonPath(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
294
|
+
const result = path1.appendPath('');
|
|
295
|
+
(0, common_test_1.safeExpect)(result.value).toEqual('$.foo.bar.');
|
|
296
|
+
});
|
|
297
|
+
it('appends to root path', () => {
|
|
298
|
+
const path1 = new JsonPath_1.JsonPath('$');
|
|
299
|
+
const result = path1.appendPath(TEST_PATHS.SIMPLE_FOO_BAR);
|
|
300
|
+
(0, common_test_1.safeExpect)(result.value).toEqual(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
301
|
+
});
|
|
302
|
+
it('appends to path ending with bracket notation', () => {
|
|
303
|
+
const path1 = new JsonPath_1.JsonPath(TEST_PATHS.BAR_BAZ_HYPHENATED_FORMATTED);
|
|
304
|
+
const result = path1.appendPath('qux.quux');
|
|
305
|
+
(0, common_test_1.safeExpect)(result.value).toEqual("$.foo['bar-baz'].qux.quux");
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
describe('toString', () => {
|
|
310
|
+
it('returns the string representation of the path', () => {
|
|
311
|
+
const path = new JsonPath_1.JsonPath(TEST_PATHS.FOO_BAR_BAZ_FORMATTED);
|
|
312
|
+
(0, common_test_1.safeExpect)(path.toString()).toEqual(TEST_PATHS.FOO_BAR_BAZ_FORMATTED);
|
|
313
|
+
});
|
|
314
|
+
it('returns the string representation of a path with bracket notation', () => {
|
|
315
|
+
const path = new JsonPath_1.JsonPath(TEST_PATHS.BAR_BAZ_QUX_FORMATTED);
|
|
316
|
+
(0, common_test_1.safeExpect)(path.toString()).toEqual(TEST_PATHS.BAR_BAZ_QUX_FORMATTED);
|
|
317
|
+
});
|
|
318
|
+
it('returns the string representation of a complex path', () => {
|
|
319
|
+
const path = new JsonPath_1.JsonPath("$.foo['123'].bar['456-abc']");
|
|
320
|
+
(0, common_test_1.safeExpect)(path.toString()).toEqual("$.foo['123'].bar['456-abc']");
|
|
321
|
+
});
|
|
322
|
+
it('returns the same value as the value property', () => {
|
|
323
|
+
const path = new JsonPath_1.JsonPath(TEST_PATHS.FOO_BAR_FORMATTED);
|
|
324
|
+
(0, common_test_1.safeExpect)(path.toString()).toEqual(path.value);
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
describe('integration tests', () => {
|
|
328
|
+
it('handles a real-world workflow path', () => {
|
|
329
|
+
const path = JsonPath_1.JsonPath.fromString('workflowTemplate.components.textField.value');
|
|
330
|
+
(0, common_test_1.safeExpect)(path.value).toEqual('$.workflowTemplate.components.textField.value');
|
|
331
|
+
});
|
|
332
|
+
it('handles a path with UUID identifiers', () => {
|
|
333
|
+
const path = JsonPath_1.JsonPath.fromString('channels.123e4567-e89b-12d3-a456-426614174000.workflowTemplates.987fcdeb-51a2-43e1-9876-543210fedcba');
|
|
334
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.channels['123e4567-e89b-12d3-a456-426614174000'].workflowTemplates['987fcdeb-51a2-43e1-9876-543210fedcba']");
|
|
335
|
+
});
|
|
336
|
+
it('handles a path with array indices', () => {
|
|
337
|
+
const path = JsonPath_1.JsonPath.fromString('items.0.name');
|
|
338
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.items['0'].name");
|
|
339
|
+
});
|
|
340
|
+
it('handles building a path incrementally', () => {
|
|
341
|
+
const base = JsonPath_1.JsonPath.fromString('workflowEntity');
|
|
342
|
+
const withComponent = base.appendPath('components');
|
|
343
|
+
const withField = withComponent.appendPath('date-field');
|
|
344
|
+
const withValue = withField.appendPath('value');
|
|
345
|
+
(0, common_test_1.safeExpect)(withValue.value).toEqual("$.workflowEntity.components['date-field'].value");
|
|
346
|
+
});
|
|
347
|
+
it('handles error paths with field names', () => {
|
|
348
|
+
const path = JsonPath_1.JsonPath.fromString('validation.errors.email-address.message');
|
|
349
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.validation.errors['email-address'].message");
|
|
350
|
+
});
|
|
351
|
+
it('handles deeply nested object paths', () => {
|
|
352
|
+
const path = JsonPath_1.JsonPath.fromString('a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p');
|
|
353
|
+
(0, common_test_1.safeExpect)(path.value).toEqual('$.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p');
|
|
354
|
+
});
|
|
355
|
+
it('handles mixed notation in real-world scenario', () => {
|
|
356
|
+
const base = JsonPath_1.JsonPath.fromString('workflow.123e4567-e89b-12d3-a456-426614174000');
|
|
357
|
+
const result = base.appendPath('components.my-field.settings');
|
|
358
|
+
(0, common_test_1.safeExpect)(result.value).toEqual("$.workflow['123e4567-e89b-12d3-a456-426614174000'].components['my-field'].settings");
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
describe('RFC 9535 compliance', () => {
|
|
362
|
+
it('never produces dot before bracket notation', () => {
|
|
363
|
+
const testCases = [
|
|
364
|
+
{ input: TEST_PATHS.FOO_BAR_BAZ_HYPHENATED, invalid: ".['", description: 'hyphenated segment' },
|
|
365
|
+
{ input: 'foo.123', invalid: ".['", description: 'numeric segment' },
|
|
366
|
+
{ input: 'foo.bar baz', invalid: ".['", description: 'segment with space' },
|
|
367
|
+
{ input: 'foo.$bar', invalid: ".['", description: 'segment with dollar' },
|
|
368
|
+
];
|
|
369
|
+
testCases.forEach(({ input, invalid, description }) => {
|
|
370
|
+
const path = JsonPath_1.JsonPath.fromString(input);
|
|
371
|
+
(0, common_test_1.safeExpect)(path.value).not.toContain(invalid);
|
|
372
|
+
if (path.value.includes(invalid)) {
|
|
373
|
+
throw new Error(`Path "${input}" (${description}) produced invalid syntax: ${path.value}`);
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
it('produces valid bracket notation without preceding dots', () => {
|
|
378
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar-baz.qux');
|
|
379
|
+
(0, common_test_1.safeExpect)(path.value).toEqual(TEST_PATHS.BAR_BAZ_QUX_FORMATTED);
|
|
380
|
+
(0, common_test_1.safeExpect)(path.value.includes(".['")).toEqual(false);
|
|
381
|
+
});
|
|
382
|
+
it('produces paths that work with jsonpath library', () => {
|
|
383
|
+
const validPaths = [
|
|
384
|
+
JsonPath_1.JsonPath.fromString(TEST_PATHS.FOO_BAR_BAZ).value,
|
|
385
|
+
JsonPath_1.JsonPath.fromString(TEST_PATHS.FOO_BAR_BAZ_HYPHENATED).value,
|
|
386
|
+
JsonPath_1.JsonPath.fromString('foo.123.bar').value,
|
|
387
|
+
JsonPath_1.JsonPath.fromString('foo.123e4567-e89b-12d3-a456-426614174000').value,
|
|
388
|
+
];
|
|
389
|
+
validPaths.forEach((path) => {
|
|
390
|
+
(0, common_test_1.safeExpect)(path.startsWith('$')).toEqual(true);
|
|
391
|
+
(0, common_test_1.safeExpect)(path.includes('.[')).toEqual(false);
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
it('handles first segment with special characters correctly', () => {
|
|
395
|
+
const path = JsonPath_1.JsonPath.fromString('123-start.foo');
|
|
396
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$['123-start'].foo");
|
|
397
|
+
(0, common_test_1.safeExpect)(path.value).not.toEqual("$.['123-start'].foo");
|
|
398
|
+
});
|
|
399
|
+
it('uses consistent notation throughout path', () => {
|
|
400
|
+
const path = JsonPath_1.JsonPath.fromString('foo.bar-baz.qux.hello-world.end');
|
|
401
|
+
const expected = "$.foo['bar-baz'].qux['hello-world'].end";
|
|
402
|
+
(0, common_test_1.safeExpect)(path.value).toEqual(expected);
|
|
403
|
+
(0, common_test_1.safeExpect)(path.value.includes(".['")).toEqual(false);
|
|
404
|
+
(0, common_test_1.safeExpect)(path.value.includes('][')).toEqual(false);
|
|
405
|
+
});
|
|
406
|
+
it('appended paths maintain RFC compliance', () => {
|
|
407
|
+
const base = new JsonPath_1.JsonPath(TEST_PATHS.FOO_FORMATTED);
|
|
408
|
+
const appended = base.appendPath(TEST_PATHS.BAR_BAZ_HYPHENATED).appendPath('qux');
|
|
409
|
+
(0, common_test_1.safeExpect)(appended.value).toEqual(TEST_PATHS.BAR_BAZ_QUX_FORMATTED);
|
|
410
|
+
(0, common_test_1.safeExpect)(appended.value.includes(".['")).toEqual(false);
|
|
411
|
+
});
|
|
412
|
+
it('handles complex real-world paths in RFC-compliant way', () => {
|
|
413
|
+
const path = JsonPath_1.JsonPath.fromString('workflowTemplate.components.email-field.validation.pattern');
|
|
414
|
+
(0, common_test_1.safeExpect)(path.value).toEqual("$.workflowTemplate.components['email-field'].validation.pattern");
|
|
415
|
+
(0, common_test_1.safeExpect)(path.value.includes(".['")).toEqual(false);
|
|
416
|
+
});
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
//# sourceMappingURL=JsonPathTest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonPathTest.js","sourceRoot":"","sources":["../../src/test/JsonPathTest.ts"],"names":[],"mappings":"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"}
|
package/jest.config.js
CHANGED
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coast/core-utils",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.29",
|
|
4
4
|
"author": "Coast Engineering",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@coast/core-types": "0.0.
|
|
8
|
-
"@coast/service-common": "^2.0.
|
|
7
|
+
"@coast/core-types": "0.0.152",
|
|
8
|
+
"@coast/service-common": "^2.0.85",
|
|
9
9
|
"lodash": "^4.17.21"
|
|
10
10
|
},
|
|
11
11
|
"scripts": {
|
|
12
12
|
"clean": "yarn run -T rimraf dist tsconfig.tsbuildinfo",
|
|
13
13
|
"prepack": "yarn build",
|
|
14
14
|
"build": "yarn clean && yarn run -T build:local",
|
|
15
|
-
"compile": "yarn run -T
|
|
15
|
+
"compile": "yarn run -T tsc",
|
|
16
16
|
"lint": "yarn run -T eslint",
|
|
17
17
|
"lint:fix": "yarn run -T eslint --fix",
|
|
18
18
|
"test": "cross-env TZ=UTC jest --config ./jest.config.js",
|
|
@@ -21,10 +21,8 @@
|
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@paradoxical-io/common-test": "^2.7.0",
|
|
23
23
|
"@types/lodash": "^4.17.7",
|
|
24
|
-
"@typescript/native-preview": "^7.0.0-dev.20260327.2",
|
|
25
24
|
"cross-env": "^7.0.3",
|
|
26
|
-
"jest": "^29.7.0"
|
|
27
|
-
"typescript": "^6.0.3"
|
|
25
|
+
"jest": "^29.7.0"
|
|
28
26
|
},
|
|
29
27
|
"exports": {
|
|
30
28
|
"./*": {
|
package/src/AssertionUtils.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import { EntityType } from '@coast/core-types/common/EntityType';
|
|
2
1
|
import { GeneralErrorCode } from '@coast/core-types/error/GeneralErrorCode';
|
|
3
2
|
import { AssertionFailedException } from '@coast/core-types/exception/AssertionFailedException';
|
|
4
3
|
import { CoastException } from '@coast/core-types/exception/CoastException';
|
|
5
|
-
import { InvalidEntityReferenceException } from '@coast/core-types/exception/InvalidEntityReferenceException';
|
|
6
4
|
import { NotDefinedException } from '@coast/core-types/exception/NotDefinedException';
|
|
7
|
-
import { NotFoundException } from '@coast/core-types/exception/NotFoundException';
|
|
8
5
|
import { DeepLogObject } from '@coast/service-common/logger/DeepLogObject';
|
|
9
6
|
import _ from 'lodash';
|
|
10
7
|
import nodeAssert from 'node:assert';
|
|
@@ -19,36 +16,6 @@ export class AssertionUtils {
|
|
|
19
16
|
}
|
|
20
17
|
}
|
|
21
18
|
|
|
22
|
-
public static assertValidEntityReference<T extends object>(
|
|
23
|
-
entity: T | null | undefined,
|
|
24
|
-
entityType: EntityType,
|
|
25
|
-
options: { id?: string; message?: string } = {}
|
|
26
|
-
): asserts entity is T {
|
|
27
|
-
AssertionUtils.assertIsDefined(
|
|
28
|
-
entity,
|
|
29
|
-
new InvalidEntityReferenceException({
|
|
30
|
-
entityType,
|
|
31
|
-
id: options?.id,
|
|
32
|
-
message: options?.message,
|
|
33
|
-
})
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
public static assertEntityFound<T extends object>(
|
|
38
|
-
entity: T | null | undefined,
|
|
39
|
-
entityType: EntityType,
|
|
40
|
-
options: { id?: string; message?: string } = {}
|
|
41
|
-
): asserts entity is T {
|
|
42
|
-
AssertionUtils.assertIsDefined(
|
|
43
|
-
entity,
|
|
44
|
-
new NotFoundException({
|
|
45
|
-
entityType,
|
|
46
|
-
id: options?.id,
|
|
47
|
-
message: options?.message,
|
|
48
|
-
})
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
19
|
public static assert(value: unknown, error?: CoastException | string): asserts value {
|
|
53
20
|
try {
|
|
54
21
|
nodeAssert(value); // eslint-disable-line @typescript-eslint/strict-boolean-expressions
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CompactSet is a typical Set but ignores null and undefined
|
|
3
|
+
*/
|
|
4
|
+
export class CompactSet<T = unknown> extends Set<T> {
|
|
5
|
+
/**
|
|
6
|
+
* Null and undefined values will be ingnored
|
|
7
|
+
* (new CompactSet()).add(null).add(undefined).size // 0
|
|
8
|
+
*/
|
|
9
|
+
public add(value: T | null | undefined): this {
|
|
10
|
+
if (value === undefined || value === null) {
|
|
11
|
+
return this;
|
|
12
|
+
}
|
|
13
|
+
super.add(value);
|
|
14
|
+
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Convenience method to add all items in an array to this set
|
|
20
|
+
* Handles null, undefined and empty arrays gracefully
|
|
21
|
+
*/
|
|
22
|
+
public addAll(values: Array<T | null | undefined> | null | undefined): this {
|
|
23
|
+
values?.forEach((value: T | null | undefined) => this.add(value));
|
|
24
|
+
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public asArray(): T[] {
|
|
29
|
+
return Array.from(this);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { EntityIdMap } from '@coast/core-types/common/EntityIdMap';
|
|
2
|
+
import { EntityType } from '@coast/core-types/common/EntityType';
|
|
3
|
+
import { EntityTypeLabels } from '@coast/core-types/common/EntityTypeLabels';
|
|
4
|
+
import { CoastLogger } from '@coast/service-common/logger/CoastLogger';
|
|
5
|
+
import _ from 'lodash';
|
|
6
|
+
|
|
7
|
+
export class EntityRehydrator<ET extends EntityType> {
|
|
8
|
+
public static readonly MISSING_REQUIRED_PROPERTY = 'MISSING_REQUIRED_PROPERTY';
|
|
9
|
+
|
|
10
|
+
public constructor(
|
|
11
|
+
private readonly entityType: ET,
|
|
12
|
+
private readonly logger?: CoastLogger
|
|
13
|
+
) {}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* A read never throws. The row exists either way, and failing it hides every other row in the
|
|
17
|
+
* same fetch while giving the caller nothing it can act on, so a property the stored row left
|
|
18
|
+
* out is narrowed and reported rather than rejected.
|
|
19
|
+
*/
|
|
20
|
+
public require<T extends { id: EntityIdMap[ET] }, K extends keyof T>(entity: T, propertyName: K): NonNullable<T[K]> {
|
|
21
|
+
const value = entity[propertyName];
|
|
22
|
+
|
|
23
|
+
if (_.isNil(value)) {
|
|
24
|
+
this.logger?.warn({
|
|
25
|
+
msg: `${EntityTypeLabels[this.entityType]} is missing required property ${String(propertyName)}`,
|
|
26
|
+
event: EntityRehydrator.MISSING_REQUIRED_PROPERTY,
|
|
27
|
+
entityType: this.entityType,
|
|
28
|
+
propertyName: String(propertyName),
|
|
29
|
+
id: _.isNil(entity.id) ? undefined : String(entity.id),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return value as NonNullable<T[K]>;
|
|
34
|
+
}
|
|
35
|
+
}
|