@squiz/dx-common-lib 1.21.1-alpha.9 → 1.22.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 (54) hide show
  1. package/.npm/_logs/2023-03-29T01_26_08_740Z-debug-0.log +37 -0
  2. package/lib/index.d.ts +1 -0
  3. package/lib/index.js +1 -0
  4. package/lib/index.js.map +1 -1
  5. package/lib/json-order/index.d.ts +6 -0
  6. package/lib/json-order/index.js +11 -0
  7. package/lib/json-order/index.js.map +1 -0
  8. package/lib/json-order/key.d.ts +2 -0
  9. package/lib/json-order/key.js +44 -0
  10. package/lib/json-order/key.js.map +1 -0
  11. package/lib/json-order/key.spec.d.ts +1 -0
  12. package/lib/json-order/key.spec.js +40 -0
  13. package/lib/json-order/key.spec.js.map +1 -0
  14. package/lib/json-order/models.d.ts +7 -0
  15. package/lib/json-order/models.js +3 -0
  16. package/lib/json-order/models.js.map +1 -0
  17. package/lib/json-order/order.d.ts +11 -0
  18. package/lib/json-order/order.js +75 -0
  19. package/lib/json-order/order.js.map +1 -0
  20. package/lib/json-order/order.spec.d.ts +1 -0
  21. package/lib/json-order/order.spec.js +191 -0
  22. package/lib/json-order/order.spec.js.map +1 -0
  23. package/lib/json-order/parse.d.ts +11 -0
  24. package/lib/json-order/parse.js +47 -0
  25. package/lib/json-order/parse.js.map +1 -0
  26. package/lib/json-order/parse.spec.d.ts +1 -0
  27. package/lib/json-order/parse.spec.js +260 -0
  28. package/lib/json-order/parse.spec.js.map +1 -0
  29. package/lib/json-order/stringify.d.ts +12 -0
  30. package/lib/json-order/stringify.js +20 -0
  31. package/lib/json-order/stringify.js.map +1 -0
  32. package/lib/json-order/stringify.spec.d.ts +1 -0
  33. package/lib/json-order/stringify.spec.js +123 -0
  34. package/lib/json-order/stringify.spec.js.map +1 -0
  35. package/lib/server-utils/errorMiddleware.js +1 -0
  36. package/lib/server-utils/errorMiddleware.js.map +1 -1
  37. package/lib/server-utils/errorMiddleware.spec.js +1 -0
  38. package/lib/server-utils/errorMiddleware.spec.js.map +1 -1
  39. package/package.json +9 -6
  40. package/src/index.ts +1 -0
  41. package/src/json-order/index.ts +6 -0
  42. package/src/json-order/key.spec.ts +39 -0
  43. package/src/json-order/key.ts +40 -0
  44. package/src/json-order/models.ts +8 -0
  45. package/src/json-order/order.spec.ts +251 -0
  46. package/src/json-order/order.ts +95 -0
  47. package/src/json-order/parse.spec.ts +302 -0
  48. package/src/json-order/parse.ts +59 -0
  49. package/src/json-order/stringify.spec.ts +170 -0
  50. package/src/json-order/stringify.ts +17 -0
  51. package/src/server-utils/errorMiddleware.spec.ts +1 -0
  52. package/src/server-utils/errorMiddleware.ts +2 -0
  53. package/tsconfig.tsbuildinfo +1 -1
  54. package/.npm/_logs/2023-03-08T03_21_21_200Z-debug-0.log +0 -39
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const parse_1 = __importDefault(require("./parse"));
7
+ describe('parse ', () => {
8
+ const expectMap = (input, map) => expect((0, parse_1.default)(input, '$', '.').map).toEqual(map);
9
+ it('returns nothing for a blank JSON string', () => expectMap('{}', {}));
10
+ it('throws error if prefix is an empty string', () => {
11
+ expect(() => (0, parse_1.default)('', '', '.')).toThrowError('Prefix should not be an empty string.');
12
+ });
13
+ it('throws error if separator is an empty string', () => {
14
+ expect(() => (0, parse_1.default)('', '$', '')).toThrowError('Separator should not be an empty string.');
15
+ });
16
+ it('throws error if separator is a slash', () => {
17
+ expect(() => (0, parse_1.default)('', '$', '\\')).toThrowError('Separator cannot be "\\".');
18
+ });
19
+ it('handles top level values for of primitive types', () => {
20
+ const input = `
21
+ {
22
+ "b": "str",
23
+ "c": 3,
24
+ "a": true
25
+ }`;
26
+ const map = {
27
+ $: ['b', 'c', 'a'],
28
+ };
29
+ expectMap(input, map);
30
+ });
31
+ it('handles top level values of type [object]', () => {
32
+ const input = `
33
+ {
34
+ "a": {
35
+ "az": "str",
36
+ "ay": "str"
37
+ }
38
+ }`;
39
+ const map = {
40
+ $: ['a'],
41
+ '$.a': ['az', 'ay'],
42
+ };
43
+ expectMap(input, map);
44
+ });
45
+ it('handles top level values of a blank [object]', () => {
46
+ const input = `
47
+ {
48
+ "a": { }
49
+ }`;
50
+ const map = {
51
+ $: ['a'],
52
+ };
53
+ expectMap(input, map);
54
+ });
55
+ it('handles multi-character prefix', () => {
56
+ const input = `
57
+ {
58
+ "a": {
59
+ "a2": {
60
+ "b": "str"
61
+ },
62
+ "a1": {
63
+ "d": 2,
64
+ "c": false
65
+ }
66
+ }
67
+ }`;
68
+ const map = {
69
+ ab: ['a'],
70
+ 'ab.a': ['a2', 'a1'],
71
+ 'ab.a.a2': ['b'],
72
+ 'ab.a.a1': ['d', 'c'],
73
+ };
74
+ expect((0, parse_1.default)(input, 'ab', '.').map).toEqual(map);
75
+ });
76
+ it('handles multi-character separator', () => {
77
+ const input = `
78
+ {
79
+ "a": {
80
+ "a2": {
81
+ "b": "str"
82
+ },
83
+ "a1": {
84
+ "d": 2,
85
+ "c": false
86
+ }
87
+ }
88
+ }`;
89
+ const map = {
90
+ $: ['a'],
91
+ '$~|a': ['a2', 'a1'],
92
+ '$~|a~|a2': ['b'],
93
+ '$~|a~|a1': ['d', 'c'],
94
+ };
95
+ expect((0, parse_1.default)(input, '$', '~|').map).toEqual(map);
96
+ });
97
+ it('handles nesting [object] > [object]', () => {
98
+ const input = `
99
+ {
100
+ "a": {
101
+ "a2": {
102
+ "b": "str"
103
+ },
104
+ "a1": {
105
+ "d": 2,
106
+ "c": false
107
+ }
108
+ }
109
+ }`;
110
+ const map = {
111
+ $: ['a'],
112
+ '$.a': ['a2', 'a1'],
113
+ '$.a.a2': ['b'],
114
+ '$.a.a1': ['d', 'c'],
115
+ };
116
+ expectMap(input, map);
117
+ });
118
+ it('should not return mappings for primitive elements of an [array]', () => {
119
+ const input = `
120
+ {
121
+ "a": [1, "2", "three"]
122
+ }`;
123
+ const map = {
124
+ $: ['a'],
125
+ };
126
+ expectMap(input, map);
127
+ });
128
+ it('handles nesting [array] > [array]', () => {
129
+ const input = `
130
+ {
131
+ "a": [1, "two", [ 3, "four", true]]
132
+ }`;
133
+ const map = {
134
+ $: ['a'],
135
+ };
136
+ expectMap(input, map);
137
+ });
138
+ it('handles nesting [array] > [object]', () => {
139
+ const input = `
140
+ {
141
+ "a": [1, "two", {
142
+ "b": "str"
143
+ }]
144
+ }`;
145
+ const map = {
146
+ $: ['a'],
147
+ '$.a.2': ['b'],
148
+ };
149
+ expectMap(input, map);
150
+ });
151
+ it('handles nesting [array] > [array] > [object]', () => {
152
+ const input = `
153
+ {
154
+ "c": [1, "two", [3, {
155
+ "b": "str"
156
+ }, 4], {
157
+ "a": "str"
158
+ }]
159
+ }`;
160
+ const map = {
161
+ $: ['c'],
162
+ '$.c.2.1': ['b'],
163
+ '$.c.3': ['a'],
164
+ };
165
+ expectMap(input, map);
166
+ });
167
+ it('handles nesting [array] > [array] > [object] > [array] > [object]', () => {
168
+ const input = `
169
+ {
170
+ "d": [
171
+ 1, "two", [
172
+ 3, {
173
+ "c": "str",
174
+ "b": [4, {
175
+ "a": "str"
176
+ }]
177
+ }
178
+ ]
179
+ ]
180
+ }`;
181
+ const map = {
182
+ $: ['d'],
183
+ '$.d.2.1': ['c', 'b'],
184
+ '$.d.2.1.b.1': ['a'],
185
+ };
186
+ expectMap(input, map);
187
+ });
188
+ it('handles keys with no name', () => {
189
+ const input = `
190
+ {
191
+ "": {
192
+ "c": "str",
193
+ "b": "str",
194
+ "a": "str"
195
+ }
196
+ }`;
197
+ const map = {
198
+ $: [''],
199
+ '$.': ['c', 'b', 'a'],
200
+ };
201
+ expectMap(input, map);
202
+ });
203
+ it('escapes slashes as well as the separator when it exists in the object keys', () => {
204
+ // slashes in the encoded JSON are double escapes, so "\\\\" is actually equivalent to "\".
205
+ const input = `
206
+ {
207
+ ".": {
208
+ "a": {"z": "str"},
209
+ "b": {"y": "str"}
210
+ },
211
+ "\\\\.": {
212
+ "b": {"x": "str"},
213
+ "a": {"w": "str"}
214
+ },
215
+ "\\\\": {
216
+ "a": {"v": "str"}
217
+ },
218
+ ".a": {
219
+ "c": {"u": "str"},
220
+ "b": {"t": "str"},
221
+ "a": {"s": "str"}
222
+ }
223
+ }`;
224
+ // all below slashes are escaped so "\\" is actually equivalent to "\".
225
+ const map = {
226
+ $: ['.', '\\.', '\\', '.a'],
227
+ '$.\\.': ['a', 'b'],
228
+ '$.\\..a': ['z'],
229
+ '$.\\..b': ['y'],
230
+ '$.\\\\\\.': ['b', 'a'],
231
+ '$.\\\\\\..b': ['x'],
232
+ '$.\\\\\\..a': ['w'],
233
+ '$.\\\\': ['a'],
234
+ '$.\\\\.a': ['v'],
235
+ '$.\\.a': ['c', 'b', 'a'],
236
+ '$.\\.a.c': ['u'],
237
+ '$.\\.a.b': ['t'],
238
+ '$.\\.a.a': ['s'],
239
+ };
240
+ expectMap(input, map);
241
+ });
242
+ it('handles keys with different types of values', () => {
243
+ const input = `
244
+ {
245
+ "a": "a",
246
+ "b": 2,
247
+ "c": 2.3,
248
+ "d": true,
249
+ "e": false,
250
+ "f": null,
251
+ "g": {},
252
+ "h": []
253
+ }`;
254
+ const map = {
255
+ $: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'],
256
+ };
257
+ expectMap(input, map);
258
+ });
259
+ });
260
+ //# sourceMappingURL=parse.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.spec.js","sourceRoot":"","sources":["../../src/json-order/parse.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { PropertyMap } from './models';
2
+ /**
3
+ * Stringify a JS object while maintaining a particular property order:
4
+ *
5
+ * @param sourceObject an object with the properties in any order
6
+ * @param map the `PropertyMap` generated by the `parse` method.
7
+ * @param separator a non-empty `string` that controls what the key separator is in the generated map. Defaults to `~`.
8
+ * @param space a `number` used to insert white space into the output JSON string for readability purposes, as per the `JSON.stringify` [documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Parameters)
9
+ * @returns the stringified source object ordered as per the map. If the map is unset, the response is a standard `JSON.stringify`.
10
+ */
11
+ declare const stringify: (sourceObject: object, map: PropertyMap | null, separator?: string, space?: number) => string;
12
+ export default stringify;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const order_1 = __importDefault(require("./order"));
7
+ /**
8
+ * Stringify a JS object while maintaining a particular property order:
9
+ *
10
+ * @param sourceObject an object with the properties in any order
11
+ * @param map the `PropertyMap` generated by the `parse` method.
12
+ * @param separator a non-empty `string` that controls what the key separator is in the generated map. Defaults to `~`.
13
+ * @param space a `number` used to insert white space into the output JSON string for readability purposes, as per the `JSON.stringify` [documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Parameters)
14
+ * @returns the stringified source object ordered as per the map. If the map is unset, the response is a standard `JSON.stringify`.
15
+ */
16
+ const stringify = (sourceObject, map, separator = '~', space) => {
17
+ return JSON.stringify((0, order_1.default)(sourceObject, map, separator), null, space);
18
+ };
19
+ exports.default = stringify;
20
+ //# sourceMappingURL=stringify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify.js","sourceRoot":"","sources":["../../src/json-order/stringify.ts"],"names":[],"mappings":";;;;;AACA,oDAA4B;AAE5B;;;;;;;;GAQG;AACH,MAAM,SAAS,GAAG,CAAC,YAAoB,EAAE,GAAuB,EAAE,SAAS,GAAG,GAAG,EAAE,KAAc,EAAU,EAAE;IAC3G,OAAO,IAAI,CAAC,SAAS,CAAC,IAAA,eAAK,EAAC,YAAY,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF,kBAAe,SAAS,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const stringify_1 = __importDefault(require("./stringify"));
7
+ describe('stringify ', () => {
8
+ const expectString = (obj, map, str) => expect((0, stringify_1.default)(obj, map, '.', 0)).toEqual(str);
9
+ it('returns nothing for a blank JSON string', () => expectString({}, {}, '{}'));
10
+ it('throws error if separator is an empty string', () => {
11
+ expect(() => (0, stringify_1.default)({}, {}, '')).toThrowError('Separator should not be an empty string.');
12
+ });
13
+ it('ignores properties not found in source', () => expectString({}, { $: ['a'] }, '{}'));
14
+ it('returns regular json string if map is undefined', () => expectString({ a: '1', b: '2' }, null, '{"a":"1","b":"2"}'));
15
+ it('ignores properties not found in map', () => expectString({ a: '1', b: '2' }, { $: ['b'] }, '{"b":"2"}'));
16
+ it('returns first level object properties in order', () => expectString({ a: 2, b: 1 }, { $: ['b', 'a'] }, '{"b":1,"a":2}'));
17
+ it('returns first level array value in order', () => expectString({ a: ['2', 1, true] }, { $: ['a'] }, '{"a":["2",1,true]}'));
18
+ it('returns nested [array] > [object] properties in expected order', () => expectString({ a: [1, { c: '3', d: '2' }] }, { $: ['a'], '$.a.1': ['d', 'c'] }, '{"a":[1,{"d":"2","c":"3"}]}'));
19
+ it('ignores nested [array] > [object] properties partially not found in map', () => expectString({ a: [1, { b: 2, c: 3 }, 4] }, { $: ['a'], '$.a.1': ['c'] }, '{"a":[1,{"c":3},4]}'));
20
+ it('ignores nested [array] > [object] properties not found in map', () => expectString({ a: [1, { b: 2, c: 3 }, 4] }, { $: ['a'] }, '{"a":[1,{},4]}'));
21
+ it('handles multi-character prefix', () => {
22
+ expect((0, stringify_1.default)({
23
+ a: {
24
+ b: {
25
+ c: 3,
26
+ d: 4,
27
+ },
28
+ e: {
29
+ f: 4,
30
+ g: 5,
31
+ },
32
+ h: 6,
33
+ },
34
+ i: 7,
35
+ }, {
36
+ ab: ['i', 'a'],
37
+ 'ab.a': ['e', 'h', 'b'],
38
+ 'ab.a.e': ['g', 'f'],
39
+ 'ab.a.b': ['d', 'c'],
40
+ }, '.', 0)).toEqual('{"i":7,"a":{"e":{"g":5,"f":4},"h":6,"b":{"d":4,"c":3}}}');
41
+ });
42
+ it('handles multi-character separator', () => {
43
+ expect((0, stringify_1.default)({
44
+ a: {
45
+ b: {
46
+ c: 3,
47
+ d: 4,
48
+ },
49
+ e: {
50
+ f: 4,
51
+ g: 5,
52
+ },
53
+ h: 6,
54
+ },
55
+ i: 7,
56
+ }, {
57
+ $: ['i', 'a'],
58
+ '$~|a': ['e', 'h', 'b'],
59
+ '$~|a~|e': ['g', 'f'],
60
+ '$~|a~|b': ['d', 'c'],
61
+ }, '~|', 0)).toEqual('{"i":7,"a":{"e":{"g":5,"f":4},"h":6,"b":{"d":4,"c":3}}}');
62
+ });
63
+ it('returns nested [object] > [object] properties in expected order', () => expectString({
64
+ a: {
65
+ b: {
66
+ c: 3,
67
+ d: 4,
68
+ },
69
+ e: {
70
+ f: 4,
71
+ g: 5,
72
+ },
73
+ h: 6,
74
+ },
75
+ i: 7,
76
+ }, {
77
+ $: ['i', 'a'],
78
+ '$.a': ['e', 'h', 'b'],
79
+ '$.a.e': ['g', 'f'],
80
+ '$.a.b': ['d', 'c'],
81
+ }, '{"i":7,"a":{"e":{"g":5,"f":4},"h":6,"b":{"d":4,"c":3}}}'));
82
+ it('returns nested [object] > [array] > [object] > [array] > [object] properties in expected order', () => expectString({
83
+ a: {
84
+ b: [
85
+ 8,
86
+ {
87
+ c: 9,
88
+ d: [
89
+ {
90
+ e: 12,
91
+ f: {
92
+ g: true,
93
+ h: 'h',
94
+ },
95
+ },
96
+ 10,
97
+ ],
98
+ },
99
+ 11,
100
+ ],
101
+ },
102
+ i: 7,
103
+ }, {
104
+ $: ['i', 'a'],
105
+ '$.a': ['b'],
106
+ '$.a.b.1': ['d', 'c'],
107
+ '$.a.b.1.d.0': ['f', 'e'],
108
+ '$.a.b.1.d.0.f': ['h', 'g'],
109
+ }, '{"i":7,"a":{"b":[8,{"d":[{"f":{"h":"h","g":true},"e":12},10],"c":9},11]}}'));
110
+ it('handles keys with different types of values', () => expectString({
111
+ a: 'a',
112
+ b: 2,
113
+ c: 2.3,
114
+ d: true,
115
+ e: false,
116
+ f: null,
117
+ g: {},
118
+ h: [],
119
+ }, {
120
+ $: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'],
121
+ }, '{"a":"a","b":2,"c":2.3,"d":true,"e":false,"f":null,"g":{},"h":[]}'));
122
+ });
123
+ //# sourceMappingURL=stringify.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify.spec.js","sourceRoot":"","sources":["../../src/json-order/stringify.spec.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ exports.errorMiddleware = void 0;
5
5
  function errorMiddleware(error, req, res, _next) {
6
6
  const statusCode = error.statusCode || 500;
7
7
  error.message = (error === null || error === void 0 ? void 0 : error.message) || 'An error occurred with no additional information available';
8
+ res = res.setHeader('cache-control', 'no-cache, no-store, max-age=0');
8
9
  if ((error === null || error === void 0 ? void 0 : error.name) === 'ComponentError') {
9
10
  req.log.error({
10
11
  message: error,
@@ -1 +1 @@
1
- {"version":3,"file":"errorMiddleware.js","sourceRoot":"","sources":["../../src/server-utils/errorMiddleware.ts"],"names":[],"mappings":";;;AAEA,iEAAiE;AACjE,SAAgB,eAAe,CAAC,KAAU,EAAE,GAAY,EAAE,GAAa,EAAE,KAAU;IACjF,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC;IAC3C,KAAK,CAAC,OAAO,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,KAAI,4DAA4D,CAAC;IAE/F,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,MAAK,gBAAgB,EAAE;QACpC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;YACZ,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,WAAW;YACjB,eAAe,EAAE,KAAK,CAAC,YAAY;YACnC,gBAAgB,EAAE,KAAK,CAAC,aAAa;YACrC,mBAAmB,EAAE,KAAK,CAAC,gBAAgB;YAC3C,cAAc,EAAE,KAAK,CAAC,UAAU;YAChC,aAAa,EAAE,mBAAmB;SACnC,CAAC,CAAC;KACJ;SAAM,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,MAAK,eAAe,EAAE;QAC1C,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,GAAG,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACxE,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YACnC,OAAO,EAAE,mBAAmB;YAC5B,OAAO,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAM;SACvB,CAAC,CAAC;KACJ;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE;QACjC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;KACnC;SAAM;QACL,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;KACtB;IAED,OAAO,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACjE,CAAC;AA3BD,0CA2BC"}
1
+ {"version":3,"file":"errorMiddleware.js","sourceRoot":"","sources":["../../src/server-utils/errorMiddleware.ts"],"names":[],"mappings":";;;AAEA,iEAAiE;AACjE,SAAgB,eAAe,CAAC,KAAU,EAAE,GAAY,EAAE,GAAa,EAAE,KAAU;IACjF,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC;IAC3C,KAAK,CAAC,OAAO,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,KAAI,4DAA4D,CAAC;IAE/F,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,+BAA+B,CAAC,CAAC;IAEtE,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,MAAK,gBAAgB,EAAE;QACpC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;YACZ,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,WAAW;YACjB,eAAe,EAAE,KAAK,CAAC,YAAY;YACnC,gBAAgB,EAAE,KAAK,CAAC,aAAa;YACrC,mBAAmB,EAAE,KAAK,CAAC,gBAAgB;YAC3C,cAAc,EAAE,KAAK,CAAC,UAAU;YAChC,aAAa,EAAE,mBAAmB;SACnC,CAAC,CAAC;KACJ;SAAM,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,MAAK,eAAe,EAAE;QAC1C,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,GAAG,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACxE,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YACnC,OAAO,EAAE,mBAAmB;YAC5B,OAAO,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAM;SACvB,CAAC,CAAC;KACJ;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE;QACjC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;KACnC;SAAM;QACL,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;KACtB;IAED,OAAO,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACjE,CAAC;AA7BD,0CA6BC"}
@@ -10,6 +10,7 @@ const testRequest = {
10
10
  const testResponse = {
11
11
  status: jest.fn(() => testResponse),
12
12
  json: jest.fn(() => testResponse),
13
+ setHeader: jest.fn(() => testResponse),
13
14
  };
14
15
  class ComponentError extends error_1.ErrorWithHttpStatusCode {
15
16
  constructor(requestId, error, functionName, componentName, componentVersion, setWebPath, statusCode = 500) {
@@ -1 +1 @@
1
- {"version":3,"file":"errorMiddleware.spec.js","sourceRoot":"","sources":["../../src/server-utils/errorMiddleware.spec.ts"],"names":[],"mappings":";;AAAA,oCAAmD;AACnD,uDAAoD;AAEpD,MAAM,WAAW,GAAG;IAClB,GAAG,EAAE;QACH,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;KACjB;CACF,CAAC;AAEF,MAAM,YAAY,GAAQ;IACxB,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;IACnC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;CAClC,CAAC;AAEF,MAAM,cAAe,SAAQ,+BAAuB;IAGlD,YACS,SAAiB,EACjB,KAAkB,EAElB,YAAoB,EACpB,aAAqB,EACrB,gBAAwB,EACxB,UAAkB,EAEzB,aAAqB,GAAG;QAExB,KAAK,CAAC,UAAU,EAAE,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,KAAI,4DAA4D,CAAC,CAAC;QAV3F,cAAS,GAAT,SAAS,CAAQ;QACjB,UAAK,GAAL,KAAK,CAAa;QAElB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,kBAAa,GAAb,aAAa,CAAQ;QACrB,qBAAgB,GAAhB,gBAAgB,CAAQ;QACxB,eAAU,GAAV,UAAU,CAAQ;QAT3B,SAAI,GAAG,gBAAgB,CAAC;QAetB,IAAI,CAAC,KAAK,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,CAAC;IAC5B,CAAC;CACF;AAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,QAAQ,EAAE,IAAI,KAAK,EAAE,EAAE,eAAe,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACjH,IAAA,iCAAe,EAAC,KAAK,EAAE,WAAkB,EAAE,YAAmB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAE3E,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,cAAc,CAC1C,MAAM,CAAC,gBAAgB,CAAC;YACtB,IAAI,EAAE,WAAW;YACjB,eAAe,EAAE,eAAe;YAChC,gBAAgB,EAAE,gBAAgB;YAClC,mBAAmB,EAAE,QAAQ;YAC7B,cAAc,EAAE,UAAU;YAC1B,OAAO,EAAE,KAAK;SACf,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAErD,IAAA,iCAAe,EAAC,KAAK,EAAE,WAAkB,EAAE,YAAmB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3E,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"errorMiddleware.spec.js","sourceRoot":"","sources":["../../src/server-utils/errorMiddleware.spec.ts"],"names":[],"mappings":";;AAAA,oCAAmD;AACnD,uDAAoD;AAEpD,MAAM,WAAW,GAAG;IAClB,GAAG,EAAE;QACH,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;KACjB;CACF,CAAC;AAEF,MAAM,YAAY,GAAQ;IACxB,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;IACnC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;IACjC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;CACvC,CAAC;AAEF,MAAM,cAAe,SAAQ,+BAAuB;IAGlD,YACS,SAAiB,EACjB,KAAkB,EAElB,YAAoB,EACpB,aAAqB,EACrB,gBAAwB,EACxB,UAAkB,EAEzB,aAAqB,GAAG;QAExB,KAAK,CAAC,UAAU,EAAE,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,KAAI,4DAA4D,CAAC,CAAC;QAV3F,cAAS,GAAT,SAAS,CAAQ;QACjB,UAAK,GAAL,KAAK,CAAa;QAElB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,kBAAa,GAAb,aAAa,CAAQ;QACrB,qBAAgB,GAAhB,gBAAgB,CAAQ;QACxB,eAAU,GAAV,UAAU,CAAQ;QAT3B,SAAI,GAAG,gBAAgB,CAAC;QAetB,IAAI,CAAC,KAAK,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,CAAC;IAC5B,CAAC;CACF;AAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,QAAQ,EAAE,IAAI,KAAK,EAAE,EAAE,eAAe,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACjH,IAAA,iCAAe,EAAC,KAAK,EAAE,WAAkB,EAAE,YAAmB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAE3E,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,cAAc,CAC1C,MAAM,CAAC,gBAAgB,CAAC;YACtB,IAAI,EAAE,WAAW;YACjB,eAAe,EAAE,eAAe;YAChC,gBAAgB,EAAE,gBAAgB;YAClC,mBAAmB,EAAE,QAAQ;YAC7B,cAAc,EAAE,UAAU;YAC1B,OAAO,EAAE,KAAK;SACf,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAErD,IAAA,iCAAe,EAAC,KAAK,EAAE,WAAkB,EAAE,YAAmB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3E,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@squiz/dx-common-lib",
3
- "version": "1.21.1-alpha.9",
3
+ "version": "1.22.0",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -13,17 +13,20 @@
13
13
  "license": "ISC",
14
14
  "dependencies": {
15
15
  "@aws-sdk/client-secrets-manager": "3.218.0",
16
- "@squiz/dx-json-schema-lib": "1.21.1-alpha.9",
17
- "@squiz/dx-logger-lib": "1.21.1-alpha.9",
16
+ "@squiz/dx-json-schema-lib": "1.22.0",
17
+ "@squiz/dx-logger-lib": "1.22.0",
18
18
  "archiver": "5.3.1",
19
- "fs-extra": "11.1.0"
19
+ "escape-string-regexp": "4.0.0",
20
+ "fs-extra": "11.1.0",
21
+ "lodash.clonedeep": "4.5.0"
20
22
  },
21
23
  "devDependencies": {
22
24
  "@types/archiver": "5.3.1",
23
25
  "@types/express": "4.17.17",
24
26
  "@types/fs-extra": "11.0.1",
25
27
  "@types/jest": "28.1.8",
26
- "@types/node": "17.0.27",
28
+ "@types/lodash.clonedeep": "4.5.7",
29
+ "@types/node": "18.15.2",
27
30
  "dotenv": "16.0.3",
28
31
  "jest": "29.4.1",
29
32
  "rimraf": "4.1.2",
@@ -32,5 +35,5 @@
32
35
  "ts-node": "10.9.1",
33
36
  "typescript": "4.9.4"
34
37
  },
35
- "gitHead": "64afcee1b33efbff451aa0ef4e727c4e8a079621"
38
+ "gitHead": "c683f01b30c8b35cc23c5bd7426778a94467baec"
36
39
  }
package/src/index.ts CHANGED
@@ -11,3 +11,4 @@ export * from './api-key-validation/getApiKeyService';
11
11
  export * from './server-utils/apiKeyMiddleware';
12
12
  export * from './cache';
13
13
  export * from './formatted-text/formattedTextToHtmlString';
14
+ export * from './json-order';
@@ -0,0 +1,6 @@
1
+ import order from './order';
2
+ import parse from './parse';
3
+ import stringify from './stringify';
4
+
5
+ export { PropertyMap } from './models';
6
+ export const jsonOrder = { order, parse, stringify };
@@ -0,0 +1,39 @@
1
+ import { escapeKey, splitKey } from './key';
2
+
3
+ describe('escapeKey()', () => {
4
+ it.each([
5
+ ['key does not contain a separator or slash', 'object_property_name', '~', 'object_property_name'],
6
+ ['key contains the separator character', 'object~property~name', '~', 'object\\~property\\~name'],
7
+ [
8
+ 'key contains the separator character, using a multi-character separator',
9
+ 'object$$property$$name',
10
+ '$$',
11
+ 'object\\$$property\\$$name',
12
+ ],
13
+ ['key contains the escape character', 'object\\property\\name', '~', 'object\\\\property\\\\name'],
14
+ ])('handles when %s', (description: string, key: string, separator: string, expected: string) => {
15
+ expect(escapeKey(key, separator)).toEqual(expected);
16
+ });
17
+ });
18
+
19
+ describe('splitKey()', () => {
20
+ it.each([
21
+ ['key does not contain any escape sequences', 'object~property~name', '~', ['object', 'property', 'name']],
22
+ [
23
+ 'key does not contain any escape sequences, using a multi-character separator',
24
+ 'object$$property$$name',
25
+ '$$',
26
+ ['object', 'property', 'name'],
27
+ ],
28
+ ['key contains an escaped separator', 'object~property\\~name', '~', ['object', 'property~name']],
29
+ [
30
+ 'keys contains an escaped separator, using a multi-character separator',
31
+ 'object$$property\\$$name',
32
+ '$$',
33
+ ['object', 'property$$name'],
34
+ ],
35
+ ['it contains an escaped slash', 'object~property\\\\name', '~', ['object', 'property\\name']],
36
+ ])('handles when %s', (description: string, key: string, separator: string, expected: Array<string>) => {
37
+ expect(splitKey(key, separator)).toEqual(expected);
38
+ });
39
+ });
@@ -0,0 +1,40 @@
1
+ import escapeStringRegexp from 'escape-string-regexp';
2
+
3
+ export const escapeKey = (key: string, separator: string): string => {
4
+ const stringsToEscape = ['\\', separator];
5
+ const pattern = stringsToEscape.map((string) => escapeStringRegexp(string)).join('|');
6
+
7
+ return key.replace(new RegExp(`(${pattern})`, 'g'), '\\$1');
8
+ };
9
+
10
+ export const splitKey = (key: string, separator: string): Array<string> => {
11
+ // if key doesn't have any escape sequence avoid iterating through the characters.
12
+ if (key.indexOf('\\') < 0) {
13
+ return key.split(separator);
14
+ }
15
+
16
+ const parts: Array<string> = [];
17
+ let currentPart = '';
18
+ let isLiteral = false;
19
+
20
+ for (let index = 0; index < key.length; index++) {
21
+ const character = key[index];
22
+
23
+ if (isLiteral) {
24
+ currentPart += character;
25
+ isLiteral = false;
26
+ } else if (character === '\\') {
27
+ isLiteral = true;
28
+ } else if (character === separator[0] && key.substr(index, separator.length) === separator) {
29
+ parts.push(currentPart);
30
+ currentPart = '';
31
+ index += separator.length - 1;
32
+ } else {
33
+ currentPart += character;
34
+ }
35
+ }
36
+
37
+ parts.push(currentPart);
38
+
39
+ return parts;
40
+ };
@@ -0,0 +1,8 @@
1
+ export interface PropertyMap {
2
+ [key: string]: Array<string>;
3
+ }
4
+
5
+ export interface OrderedParseResult<T> {
6
+ object: T;
7
+ map: PropertyMap;
8
+ }