@awsless/json 0.0.8 → 0.0.9

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 CHANGED
@@ -24,6 +24,7 @@ JSON doesn't have support for types like:
24
24
  - `Date`
25
25
  - `BigInt`
26
26
  - `BigFloat` - npm package @awsless/bit-float
27
+ - `Duration` - npm package @awsless/duration
27
28
 
28
29
  Having to encode & decode these type of values can get quite annoying. We try to solve this problem by encoding these types using valid JSON syntax.
29
30
 
@@ -117,16 +118,3 @@ console.log(eq(value, result)) // true
117
118
  ### Don't use the `$` character inside your JSON.
118
119
 
119
120
  We use the `$` character to encode our special types inside JSON. In order to prevent parsing errors we recommend to avoid using the `$` character inside your object property names.
120
-
121
- ### Object properties with `undefined` as value type will be stripped away.
122
-
123
- ```ts
124
- // Will result in an empty object.
125
- const result = parse(stringify({ key: undefined }))
126
-
127
- // Will log false.
128
- console.log('key' in result)
129
-
130
- // Will log true.
131
- console.log(result.key === undefined)
132
- ```
package/dist/index.cjs CHANGED
@@ -18,8 +18,8 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
 
20
20
  // src/index.ts
21
- var src_exports = {};
22
- __export(src_exports, {
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
23
  createReplacer: () => createReplacer,
24
24
  createReviver: () => createReviver,
25
25
  createSafeNumberReplacer: () => createSafeNumberReplacer,
@@ -31,7 +31,7 @@ __export(src_exports, {
31
31
  stringify: () => stringify,
32
32
  unpatch: () => unpatch
33
33
  });
34
- module.exports = __toCommonJS(src_exports);
34
+ module.exports = __toCommonJS(index_exports);
35
35
 
36
36
  // src/type/bigfloat.ts
37
37
  var import_big_float = require("@awsless/big-float");
@@ -64,10 +64,24 @@ var $infinity = {
64
64
  stringify: (v) => v > 0 ? 1 : 0
65
65
  };
66
66
 
67
+ // src/type/undefined.ts
68
+ var $undefined = {
69
+ is: (v) => typeof v === "undefined",
70
+ replace: (_) => void 0,
71
+ stringify: (_) => 0
72
+ };
73
+ var isUndefined = (value) => {
74
+ return typeof value === "object" && value !== null && Object.keys(value).length === 1 && "$undefined" in value && value.$undefined === 0;
75
+ };
76
+
67
77
  // src/type/map.ts
68
78
  var $map = {
69
79
  is: (v) => v instanceof Map,
70
- parse: (v) => new Map(v),
80
+ parse: (v) => new Map(
81
+ v.map((pair) => {
82
+ return pair.map((i) => isUndefined(i) ? void 0 : i);
83
+ })
84
+ ),
71
85
  stringify: (v) => Array.from(v)
72
86
  };
73
87
 
@@ -88,7 +102,7 @@ var $regexp = {
88
102
  // src/type/set.ts
89
103
  var $set = {
90
104
  is: (v) => v instanceof Set,
91
- parse: (v) => new Set(v),
105
+ parse: (v) => new Set(v.map((i) => isUndefined(i) ? void 0 : i)),
92
106
  stringify: (v) => Array.from(v)
93
107
  };
94
108
 
@@ -99,13 +113,6 @@ var $binary = {
99
113
  stringify: (v) => btoa(String.fromCharCode(...v))
100
114
  };
101
115
 
102
- // src/type/undefined.ts
103
- var $undefined = {
104
- is: (v) => typeof v === "undefined",
105
- parse: (_) => void 0,
106
- stringify: (_) => 0
107
- };
108
-
109
116
  // src/type/url.ts
110
117
  var $url = {
111
118
  is: (v) => v instanceof URL,
@@ -139,9 +146,19 @@ var baseTypes = {
139
146
 
140
147
  // src/parse.ts
141
148
  var parse = (json, types = {}) => {
142
- return JSON.parse(json, createReviver(types));
149
+ const replacements = [];
150
+ const result = JSON.parse(
151
+ json,
152
+ createReviver(types, (target, key, value) => {
153
+ replacements.push([target, key, value]);
154
+ })
155
+ );
156
+ for (const [target, key, value] of replacements) {
157
+ target[key] = value;
158
+ }
159
+ return result;
143
160
  };
144
- var createReviver = (types = {}) => {
161
+ var createReviver = (types = {}, registerReplacement) => {
145
162
  types = {
146
163
  ...baseTypes,
147
164
  ...types
@@ -154,7 +171,16 @@ var createReviver = (types = {}) => {
154
171
  const typeName = keys[0];
155
172
  if (typeName in types && types[typeName]) {
156
173
  const type = types[typeName];
157
- return type.parse(original[typeName]);
174
+ const stringified = original[typeName];
175
+ if ("parse" in type) {
176
+ return type.parse(stringified);
177
+ } else if (registerReplacement) {
178
+ const result = type.replace(stringified);
179
+ registerReplacement(this, key, result);
180
+ return result;
181
+ } else {
182
+ return type.replace(stringified);
183
+ }
158
184
  }
159
185
  }
160
186
  }
package/dist/index.d.cts CHANGED
@@ -1,8 +1,11 @@
1
1
  type Serializable<I, O> = {
2
2
  is: (value: unknown) => boolean;
3
- parse: (value: O) => I;
4
3
  stringify: (value: I) => O;
5
- };
4
+ } & ({
5
+ parse: (value: O) => I;
6
+ } | {
7
+ replace: (value: O) => I;
8
+ });
6
9
  type SerializableTypes = Record<string, Serializable<any, any>>;
7
10
 
8
11
  declare const patch: (value: unknown, types?: SerializableTypes) => any;
@@ -10,7 +13,7 @@ declare const unpatch: (value: unknown, types?: SerializableTypes) => any;
10
13
 
11
14
  declare const parse: (json: string, types?: SerializableTypes) => any;
12
15
  type Reviver$1 = (this: any, key: string, value: any) => any;
13
- declare const createReviver: (types?: SerializableTypes) => Reviver$1;
16
+ declare const createReviver: (types?: SerializableTypes, registerReplacement?: (target: any, key: string, value: unknown) => void) => Reviver$1;
14
17
 
15
18
  declare const stringify: (value: unknown, types?: SerializableTypes) => string;
16
19
  type Replacer$1 = (this: any, key: string, value: any) => any;
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  type Serializable<I, O> = {
2
2
  is: (value: unknown) => boolean;
3
- parse: (value: O) => I;
4
3
  stringify: (value: I) => O;
5
- };
4
+ } & ({
5
+ parse: (value: O) => I;
6
+ } | {
7
+ replace: (value: O) => I;
8
+ });
6
9
  type SerializableTypes = Record<string, Serializable<any, any>>;
7
10
 
8
11
  declare const patch: (value: unknown, types?: SerializableTypes) => any;
@@ -10,7 +13,7 @@ declare const unpatch: (value: unknown, types?: SerializableTypes) => any;
10
13
 
11
14
  declare const parse: (json: string, types?: SerializableTypes) => any;
12
15
  type Reviver$1 = (this: any, key: string, value: any) => any;
13
- declare const createReviver: (types?: SerializableTypes) => Reviver$1;
16
+ declare const createReviver: (types?: SerializableTypes, registerReplacement?: (target: any, key: string, value: unknown) => void) => Reviver$1;
14
17
 
15
18
  declare const stringify: (value: unknown, types?: SerializableTypes) => string;
16
19
  type Replacer$1 = (this: any, key: string, value: any) => any;
package/dist/index.js CHANGED
@@ -29,10 +29,24 @@ var $infinity = {
29
29
  stringify: (v) => v > 0 ? 1 : 0
30
30
  };
31
31
 
32
+ // src/type/undefined.ts
33
+ var $undefined = {
34
+ is: (v) => typeof v === "undefined",
35
+ replace: (_) => void 0,
36
+ stringify: (_) => 0
37
+ };
38
+ var isUndefined = (value) => {
39
+ return typeof value === "object" && value !== null && Object.keys(value).length === 1 && "$undefined" in value && value.$undefined === 0;
40
+ };
41
+
32
42
  // src/type/map.ts
33
43
  var $map = {
34
44
  is: (v) => v instanceof Map,
35
- parse: (v) => new Map(v),
45
+ parse: (v) => new Map(
46
+ v.map((pair) => {
47
+ return pair.map((i) => isUndefined(i) ? void 0 : i);
48
+ })
49
+ ),
36
50
  stringify: (v) => Array.from(v)
37
51
  };
38
52
 
@@ -53,7 +67,7 @@ var $regexp = {
53
67
  // src/type/set.ts
54
68
  var $set = {
55
69
  is: (v) => v instanceof Set,
56
- parse: (v) => new Set(v),
70
+ parse: (v) => new Set(v.map((i) => isUndefined(i) ? void 0 : i)),
57
71
  stringify: (v) => Array.from(v)
58
72
  };
59
73
 
@@ -64,13 +78,6 @@ var $binary = {
64
78
  stringify: (v) => btoa(String.fromCharCode(...v))
65
79
  };
66
80
 
67
- // src/type/undefined.ts
68
- var $undefined = {
69
- is: (v) => typeof v === "undefined",
70
- parse: (_) => void 0,
71
- stringify: (_) => 0
72
- };
73
-
74
81
  // src/type/url.ts
75
82
  var $url = {
76
83
  is: (v) => v instanceof URL,
@@ -104,9 +111,19 @@ var baseTypes = {
104
111
 
105
112
  // src/parse.ts
106
113
  var parse = (json, types = {}) => {
107
- return JSON.parse(json, createReviver(types));
114
+ const replacements = [];
115
+ const result = JSON.parse(
116
+ json,
117
+ createReviver(types, (target, key, value) => {
118
+ replacements.push([target, key, value]);
119
+ })
120
+ );
121
+ for (const [target, key, value] of replacements) {
122
+ target[key] = value;
123
+ }
124
+ return result;
108
125
  };
109
- var createReviver = (types = {}) => {
126
+ var createReviver = (types = {}, registerReplacement) => {
110
127
  types = {
111
128
  ...baseTypes,
112
129
  ...types
@@ -119,7 +136,16 @@ var createReviver = (types = {}) => {
119
136
  const typeName = keys[0];
120
137
  if (typeName in types && types[typeName]) {
121
138
  const type = types[typeName];
122
- return type.parse(original[typeName]);
139
+ const stringified = original[typeName];
140
+ if ("parse" in type) {
141
+ return type.parse(stringified);
142
+ } else if (registerReplacement) {
143
+ const result = type.replace(stringified);
144
+ registerReplacement(this, key, result);
145
+ return result;
146
+ } else {
147
+ return type.replace(stringified);
148
+ }
123
149
  }
124
150
  }
125
151
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@awsless/json",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -41,12 +41,12 @@
41
41
  }
42
42
  },
43
43
  "peerDependencies": {
44
- "@awsless/big-float": "^0.0.4",
45
- "@awsless/duration": "^0.0.2"
44
+ "@awsless/big-float": "^0.0.6",
45
+ "@awsless/duration": "^0.0.3"
46
46
  },
47
47
  "devDependencies": {
48
- "@awsless/big-float": "^0.0.4",
49
- "@awsless/duration": "^0.0.2"
48
+ "@awsless/big-float": "^0.0.6",
49
+ "@awsless/duration": "^0.0.3"
50
50
  },
51
51
  "scripts": {
52
52
  "test": "pnpm code test",