json-as 0.1.9 → 0.2.3
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 +15 -42
- package/assembly/DynamicObject.ts +29 -0
- package/assembly/bench.ts +6 -6
- package/assembly/{json.ts → index.ts} +65 -65
- package/assembly/test.ts +13 -3
- package/package.json +10 -11
- package/transform/lib/index.js +9 -9
- package/assembly/Object.ts +0 -28
package/README.md
CHANGED
|
@@ -18,15 +18,13 @@
|
|
|
18
18
|
- ✅ Null
|
|
19
19
|
- ✅ Dynamic Arrays
|
|
20
20
|
- ✅ Dynamic Types
|
|
21
|
-
-
|
|
21
|
+
- ✅ Dynamic Objects
|
|
22
22
|
- ✅ Whitespace
|
|
23
23
|
|
|
24
|
-
## WARNING: Possible breaking changes coming for v2.0.0
|
|
25
|
-
|
|
26
24
|
## Usage
|
|
27
25
|
|
|
28
26
|
```js
|
|
29
|
-
import { JSON
|
|
27
|
+
import { JSON } from 'json-as'
|
|
30
28
|
```
|
|
31
29
|
|
|
32
30
|
**Object**
|
|
@@ -51,7 +49,7 @@ const parsed = JSON.parse<JSONSchema>(stringified)
|
|
|
51
49
|
// { firstName: "Jairus", lastName: "Tanaka", age: 14 }
|
|
52
50
|
```
|
|
53
51
|
|
|
54
|
-
**Array
|
|
52
|
+
**Array**
|
|
55
53
|
|
|
56
54
|
```js
|
|
57
55
|
const stringified = JSON.stringify(['Hello', 'World'])
|
|
@@ -61,16 +59,6 @@ const parsed = JSON.parse<JSONSchema>(stringified)
|
|
|
61
59
|
// ["Hello", "World"]
|
|
62
60
|
```
|
|
63
61
|
|
|
64
|
-
**Array (Dynamic)**
|
|
65
|
-
|
|
66
|
-
```js
|
|
67
|
-
const stringified = JSON.stringify(["Welcome to dynamic arrays", 3.14, ["Deep"], true, "It also supports nulls", null])
|
|
68
|
-
// '["Welcome to dynamic arrays",3.14,["Deep"],true,"It also supports nulls",null]'
|
|
69
|
-
|
|
70
|
-
const parsed = JSON.parse<unknown[]>(stringified)
|
|
71
|
-
// ["Welcome to dynamic arrays", 3.14, ["Deep"], true, "It also supports nulls", null]
|
|
72
|
-
```
|
|
73
|
-
|
|
74
62
|
**Float**
|
|
75
63
|
|
|
76
64
|
```js
|
|
@@ -120,34 +108,19 @@ const stringified = JSON.stringify(null)
|
|
|
120
108
|
const parsed = JSON.parse(stringified)
|
|
121
109
|
// null
|
|
122
110
|
```
|
|
123
|
-
|
|
124
|
-
## Accessing unknown types
|
|
125
|
-
**Breaking changes for v2.0.0!**
|
|
126
|
-
**Experimental usage only**
|
|
127
|
-
|
|
128
|
-
```js
|
|
129
|
-
const parsed = JSON.parse<unknown[]>(["Welcome to dynamic arrays",3.14,["Deep"],true,"It also supports nulls",null])
|
|
130
|
-
console.log(parsed[0].get<string>())
|
|
131
|
-
// "Welcome to dynamic arrays"
|
|
132
|
-
console.log(parsed[1].get<f64>().toString())
|
|
133
|
-
// 3.14
|
|
134
|
-
```
|
|
135
|
-
|
|
136
111
|
## Benchmarks
|
|
137
112
|
|
|
138
113
|
```
|
|
139
|
-
AS-JSON Stringify String: ~
|
|
140
|
-
AS-JSON Parse String: ~
|
|
141
|
-
AS-JSON Stringify Integer: ~
|
|
142
|
-
AS-JSON Parse Integer: ~
|
|
143
|
-
AS-JSON Stringify Float: ~
|
|
144
|
-
AS-JSON Parse Float: ~
|
|
145
|
-
AS-JSON Stringify Boolean: ~
|
|
146
|
-
AS-JSON Parse Boolean: ~
|
|
147
|
-
AS-JSON Stringify Array: ~
|
|
148
|
-
AS-JSON Parse Array: ~
|
|
149
|
-
AS-JSON Stringify Object: ~
|
|
150
|
-
AS-JSON Parse Object: ~
|
|
151
|
-
AS-JSON Stringify Dynamic Array: ~285433.75 ops/s | 350.34ms
|
|
152
|
-
AS-JSON Parse Dynamic Array: ~661516.87 ops/s | 151.17ms
|
|
114
|
+
AS-JSON Stringify String: ~4191267.51 ops/s | 23.86ms
|
|
115
|
+
AS-JSON Parse String: ~6218119.99 ops/s | 16.08ms
|
|
116
|
+
AS-JSON Stringify Integer: ~13775012.61 ops/s | 7.26ms
|
|
117
|
+
AS-JSON Parse Integer: ~55061164.13 ops/s | 1.82ms
|
|
118
|
+
AS-JSON Stringify Float: ~7739399.89 ops/s | 12.92ms
|
|
119
|
+
AS-JSON Parse Float: ~37522902.16 ops/s | 2.67ms
|
|
120
|
+
AS-JSON Stringify Boolean: ~615015015.02 ops/s | 0.16ms
|
|
121
|
+
AS-JSON Parse Boolean: ~93901879.87 ops/s | 1.06ms
|
|
122
|
+
AS-JSON Stringify Array: ~2380329.74 ops/s | 42.01ms
|
|
123
|
+
AS-JSON Parse Array: ~6258786.14 ops/s | 15.98ms
|
|
124
|
+
AS-JSON Stringify Object: ~5245632.91 ops/s | 19.06ms
|
|
125
|
+
AS-JSON Parse Object: ~1328576.06 ops/s | 75.27ms
|
|
153
126
|
```
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { unknown } from "./unknown"
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Provides functionality common to all JavaScript objects.
|
|
5
|
+
*/
|
|
6
|
+
export class DynamicObject {
|
|
7
|
+
[key: string]: any
|
|
8
|
+
// Having it marked as 'any' is for intellisense only
|
|
9
|
+
protected __data: Map<string, unknown> = new Map<string, unknown>()
|
|
10
|
+
set(path: string, value: unknown): void {
|
|
11
|
+
this.__data.set(path, value)
|
|
12
|
+
}
|
|
13
|
+
get<T = unknown>(path: string): T {
|
|
14
|
+
let type!: T
|
|
15
|
+
if (type instanceof unknown) {
|
|
16
|
+
// @ts-ignore
|
|
17
|
+
return this.__data.get(path)
|
|
18
|
+
} else {
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
return this.__data.get(path).get<T>()
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
static keys(o: DynamicObject): string[] {
|
|
24
|
+
return o.__data.keys()
|
|
25
|
+
}
|
|
26
|
+
static values(o: DynamicObject): unknown[] {
|
|
27
|
+
return o.__data.values()
|
|
28
|
+
}
|
|
29
|
+
}
|
package/assembly/bench.ts
CHANGED
|
@@ -2,12 +2,12 @@ import 'wasi'
|
|
|
2
2
|
|
|
3
3
|
import { Date } from 'as-wasi'
|
|
4
4
|
|
|
5
|
-
import { JSON } from '
|
|
5
|
+
import { JSON } from '.'
|
|
6
6
|
|
|
7
7
|
import * as asJSON from "assemblyscript-json"
|
|
8
8
|
|
|
9
9
|
import { unknown } from './unknown'
|
|
10
|
-
import {
|
|
10
|
+
import { DynamicObject } from './DynamicObject'
|
|
11
11
|
|
|
12
12
|
// @ts-ignore
|
|
13
13
|
@json
|
|
@@ -19,7 +19,7 @@ const jsonData: JSONSchema = {
|
|
|
19
19
|
hello: 'world'
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
const o = new
|
|
22
|
+
const o = new DynamicObject()
|
|
23
23
|
|
|
24
24
|
o['hello'] = unknown.wrap('world')
|
|
25
25
|
|
|
@@ -86,11 +86,11 @@ bench('AS-JSON Parse Object', () => {
|
|
|
86
86
|
})
|
|
87
87
|
|
|
88
88
|
bench('AS-JSON Stringify Dynamic Object', () => {
|
|
89
|
-
JSON.stringify<
|
|
89
|
+
JSON.stringify<DynamicObject>(o)
|
|
90
90
|
})
|
|
91
91
|
|
|
92
92
|
bench('AS-JSON Parse Object', () => {
|
|
93
|
-
JSON.parse<
|
|
93
|
+
JSON.parse<DynamicObject>('{"hello":"world"}')
|
|
94
94
|
})
|
|
95
95
|
|
|
96
96
|
bench('AS-JSON Stringify Dynamic Array', () => {
|
|
@@ -116,7 +116,7 @@ bench('AssemblyScript-JSON Stringify String', () => {
|
|
|
116
116
|
String.UTF8.decode(binary.buffer)
|
|
117
117
|
// Its odd. Not encoded in UTF16 Strings.
|
|
118
118
|
// Since AS-JSON returns a string, so does assemblyscript-json in this bench.
|
|
119
|
-
// Or else, the bench is biased.
|
|
119
|
+
// Or else, the bench is biased.
|
|
120
120
|
})
|
|
121
121
|
|
|
122
122
|
bench('AssemblyScript-JSON Parse String', () => {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { StringSink } from 'as-string-sink'
|
|
2
|
-
import {
|
|
2
|
+
import { DynamicObject } from './DynamicObject'
|
|
3
3
|
import { unknown, unknownTypes } from './unknown'
|
|
4
4
|
export { unknown, unknownTypes } from './unknown'
|
|
5
|
-
export { Object } from './
|
|
5
|
+
export { DynamicObject as Object } from './DynamicObject'
|
|
6
6
|
|
|
7
7
|
@global
|
|
8
8
|
export class Nullable { }
|
|
@@ -29,7 +29,7 @@ const f_charCode: u16 = 116// "t"
|
|
|
29
29
|
const nCode: u16 = 110// "n"
|
|
30
30
|
const unknownId = idof<unknown>()
|
|
31
31
|
const stringId = idof<string>()
|
|
32
|
-
const objectId = idof<
|
|
32
|
+
const objectId = idof<DynamicObject>()
|
|
33
33
|
const arrayStringId = idof<string[]>()
|
|
34
34
|
const arrayBooleanId = idof<boolean[]>()
|
|
35
35
|
const arrayBoolId = idof<bool[]>()
|
|
@@ -81,7 +81,7 @@ export namespace JSON {
|
|
|
81
81
|
return serializeArray<T>(data)
|
|
82
82
|
} else if (data instanceof unknown) {
|
|
83
83
|
return serializeUnknown(data)
|
|
84
|
-
} else if (data instanceof
|
|
84
|
+
} else if (data instanceof DynamicObject) {
|
|
85
85
|
return serializeDynamicObject(data)
|
|
86
86
|
}
|
|
87
87
|
|
|
@@ -115,16 +115,16 @@ export namespace JSON {
|
|
|
115
115
|
// @ts-ignore
|
|
116
116
|
else if (type instanceof unknown) return parseUnknown(data)
|
|
117
117
|
// @ts-ignore
|
|
118
|
-
else if (type instanceof
|
|
118
|
+
else if (type instanceof DynamicObject) return parseDynamicObject(data)
|
|
119
119
|
// @ts-ignore
|
|
120
120
|
return parseObject<T>(data)
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
-
export function serializeDynamicObject(data:
|
|
124
|
+
export function serializeDynamicObject(data: DynamicObject): string {
|
|
125
125
|
const result = new StringSink(lcbracket)
|
|
126
|
-
const keys =
|
|
127
|
-
const values =
|
|
126
|
+
const keys = DynamicObject.keys(data)
|
|
127
|
+
const values = DynamicObject.values(data)
|
|
128
128
|
const len: u32 = keys.length - 1
|
|
129
129
|
if (len === -1) return '{}'
|
|
130
130
|
for (let i: u32 = 0; i < len; i++) {
|
|
@@ -150,134 +150,134 @@ export function serializeUnknown(data: unknown): string {
|
|
|
150
150
|
return serializeString(data.get<string>())
|
|
151
151
|
}
|
|
152
152
|
// @ts-ignore
|
|
153
|
-
else if (data.type ===
|
|
153
|
+
else if (data.type === unknownTypes.boolean) {
|
|
154
154
|
// @ts-ignore
|
|
155
|
-
return
|
|
155
|
+
return serializeBoolean(data.get<boolean>())
|
|
156
156
|
}
|
|
157
157
|
// @ts-ignore
|
|
158
|
-
else if (data.type ===
|
|
158
|
+
else if (data.type === unknownTypes.i8) {
|
|
159
159
|
// @ts-ignore
|
|
160
|
-
return
|
|
160
|
+
return data.get<i8>().toString()
|
|
161
161
|
}
|
|
162
162
|
// @ts-ignore
|
|
163
|
-
else if (data.type ===
|
|
163
|
+
else if (data.type === unknownTypes.i16) {
|
|
164
164
|
// @ts-ignore
|
|
165
|
-
return
|
|
165
|
+
return data.get<i16>().toString()
|
|
166
166
|
}
|
|
167
167
|
// @ts-ignore
|
|
168
|
-
else if (data.type ===
|
|
168
|
+
else if (data.type === unknownTypes.i32) {
|
|
169
169
|
// @ts-ignore
|
|
170
|
-
return
|
|
170
|
+
return data.get<i32>().toString()
|
|
171
171
|
}
|
|
172
172
|
// @ts-ignore
|
|
173
|
-
else if (data.type ===
|
|
173
|
+
else if (data.type === unknownTypes.i64) {
|
|
174
174
|
// @ts-ignore
|
|
175
|
-
return
|
|
175
|
+
return data.get<i64>().toString()
|
|
176
176
|
}
|
|
177
177
|
// @ts-ignore
|
|
178
|
-
else if (data.type ===
|
|
178
|
+
else if (data.type === unknownTypes.u8) {
|
|
179
179
|
// @ts-ignore
|
|
180
|
-
return
|
|
180
|
+
return data.get<u8>().toString()
|
|
181
181
|
}
|
|
182
182
|
// @ts-ignore
|
|
183
|
-
else if (data.type ===
|
|
183
|
+
else if (data.type === unknownTypes.u16) {
|
|
184
184
|
// @ts-ignore
|
|
185
|
-
return
|
|
185
|
+
return data.get<u16>().toString()
|
|
186
186
|
}
|
|
187
187
|
// @ts-ignore
|
|
188
|
-
else if (data.type ===
|
|
188
|
+
else if (data.type === unknownTypes.u32) {
|
|
189
189
|
// @ts-ignore
|
|
190
|
-
return
|
|
190
|
+
return data.get<u32>().toString()
|
|
191
191
|
}
|
|
192
192
|
// @ts-ignore
|
|
193
|
-
else if (data.type ===
|
|
193
|
+
else if (data.type === unknownTypes.u64) {
|
|
194
194
|
// @ts-ignore
|
|
195
|
-
return
|
|
195
|
+
return data.get<u64>().toString()
|
|
196
196
|
}
|
|
197
197
|
// @ts-ignore
|
|
198
|
-
else if (data.type ===
|
|
198
|
+
else if (data.type === unknownTypes.f32) {
|
|
199
199
|
// @ts-ignore
|
|
200
|
-
return
|
|
200
|
+
return data.get<f32>().toString()
|
|
201
201
|
}
|
|
202
202
|
// @ts-ignore
|
|
203
|
-
else if (data.type ===
|
|
203
|
+
else if (data.type === unknownTypes.f64) {
|
|
204
204
|
// @ts-ignore
|
|
205
|
-
return
|
|
205
|
+
return data.get<f64>().toString()
|
|
206
206
|
}
|
|
207
207
|
// @ts-ignore
|
|
208
|
-
else if (data.type ===
|
|
208
|
+
else if (data.type === objectId) {
|
|
209
209
|
// @ts-ignore
|
|
210
|
-
return
|
|
210
|
+
return serializeDynamicObject(data.get<DynamicObject>())
|
|
211
211
|
}
|
|
212
212
|
// @ts-ignore
|
|
213
|
-
else if (data.type ===
|
|
213
|
+
else if (data.type === arrayUnknownId) {
|
|
214
214
|
// @ts-ignore
|
|
215
|
-
return
|
|
215
|
+
return serializeUnknownArray(data.get<unknown[]>())
|
|
216
216
|
}
|
|
217
217
|
// @ts-ignore
|
|
218
|
-
else if (data.type ===
|
|
218
|
+
else if (data.type === arrayBoolId) {
|
|
219
219
|
// @ts-ignore
|
|
220
|
-
return
|
|
220
|
+
return serializeBooleanArray(data.get<bool[]>())
|
|
221
221
|
}
|
|
222
222
|
// @ts-ignore
|
|
223
|
-
else if (data.type ===
|
|
223
|
+
else if (data.type === arrayBooleanId) {
|
|
224
224
|
// @ts-ignore
|
|
225
|
-
return
|
|
225
|
+
return serializeBooleanArray(data.get<boolean[]>())
|
|
226
226
|
}
|
|
227
227
|
// @ts-ignore
|
|
228
|
-
else if (data.type ===
|
|
228
|
+
else if (data.type === arrayF32Id) {
|
|
229
229
|
// @ts-ignore
|
|
230
|
-
return
|
|
230
|
+
return serializeNumberArray<f32[]>(data.get<f32[]>())
|
|
231
231
|
}
|
|
232
232
|
// @ts-ignore
|
|
233
|
-
else if (data.type ===
|
|
233
|
+
else if (data.type === arrayF64Id) {
|
|
234
234
|
// @ts-ignore
|
|
235
|
-
return data.get<
|
|
235
|
+
return serializeNumberArray<f64[]>(data.get<f64[]>())
|
|
236
236
|
}
|
|
237
237
|
// @ts-ignore
|
|
238
|
-
else if (data.type ===
|
|
238
|
+
else if (data.type === arrayU8Id) {
|
|
239
239
|
// @ts-ignore
|
|
240
|
-
return data.get<
|
|
240
|
+
return serializeNumberArray<u8[]>(data.get<u8[]>())
|
|
241
241
|
}
|
|
242
242
|
// @ts-ignore
|
|
243
|
-
else if (data.type ===
|
|
243
|
+
else if (data.type === arrayU16Id) {
|
|
244
244
|
// @ts-ignore
|
|
245
|
-
return data.get<
|
|
245
|
+
return serializeNumberArray<u16[]>(data.get<u16[]>())
|
|
246
246
|
}
|
|
247
247
|
// @ts-ignore
|
|
248
|
-
else if (data.type ===
|
|
248
|
+
else if (data.type === arrayU32Id) {
|
|
249
249
|
// @ts-ignore
|
|
250
|
-
return data.get<
|
|
250
|
+
return serializeNumberArray<u32[]>(data.get<u32[]>())
|
|
251
251
|
}
|
|
252
252
|
// @ts-ignore
|
|
253
|
-
else if (data.type ===
|
|
253
|
+
else if (data.type === arrayU64Id) {
|
|
254
254
|
// @ts-ignore
|
|
255
|
-
return data.get<
|
|
255
|
+
return serializeNumberArray<u64[]>(data.get<u64[]>())
|
|
256
256
|
}
|
|
257
257
|
// @ts-ignore
|
|
258
|
-
else if (data.type ===
|
|
258
|
+
else if (data.type === arrayI8Id) {
|
|
259
259
|
// @ts-ignore
|
|
260
|
-
return data.get<
|
|
260
|
+
return serializeNumberArray<i8[]>(data.get<i8[]>())
|
|
261
261
|
}
|
|
262
262
|
// @ts-ignore
|
|
263
|
-
else if (data.type ===
|
|
263
|
+
else if (data.type === arrayI16Id) {
|
|
264
264
|
// @ts-ignore
|
|
265
|
-
return data.get<
|
|
265
|
+
return serializeNumberArray<i16[]>(data.get<i16[]>())
|
|
266
266
|
}
|
|
267
267
|
// @ts-ignore
|
|
268
|
-
else if (data.type ===
|
|
268
|
+
else if (data.type === arrayI32Id) {
|
|
269
269
|
// @ts-ignore
|
|
270
|
-
return data.get<
|
|
270
|
+
return serializeNumberArray<i32[]>(data.get<i32[]>())
|
|
271
271
|
}
|
|
272
272
|
// @ts-ignore
|
|
273
|
-
else if (data.type ===
|
|
273
|
+
else if (data.type === arrayI64Id) {
|
|
274
274
|
// @ts-ignore
|
|
275
|
-
return data.get<
|
|
275
|
+
return serializeNumberArray<i64[]>(data.get<i64[]>())
|
|
276
276
|
}
|
|
277
277
|
// @ts-ignore
|
|
278
|
-
else if (data.type ===
|
|
278
|
+
else if (data.type === arrayStringId) {
|
|
279
279
|
// @ts-ignore
|
|
280
|
-
return data.get<
|
|
280
|
+
return serializeStringArray(data.get<string[]>())
|
|
281
281
|
}
|
|
282
282
|
// @ts-ignore
|
|
283
283
|
else {
|
|
@@ -377,7 +377,7 @@ function serializeObjectArray<T extends Array<any>>(data: T): string {
|
|
|
377
377
|
return result.toString()
|
|
378
378
|
}
|
|
379
379
|
|
|
380
|
-
function serializeDynamicObjectArray(data:
|
|
380
|
+
function serializeDynamicObjectArray(data: DynamicObject[]): string {
|
|
381
381
|
const result = new StringSink(lbracket)
|
|
382
382
|
const len: u32 = data.length - 1
|
|
383
383
|
for (let i: u32 = 0; i < len; i++) {
|
|
@@ -436,7 +436,7 @@ export function serializeArray<T extends Array<any>>(data: T): string {
|
|
|
436
436
|
result.writeCodePoint(rbracketCode)
|
|
437
437
|
return result.toString()
|
|
438
438
|
// @ts-ignore
|
|
439
|
-
} else if (type instanceof
|
|
439
|
+
} else if (type instanceof DynamicObject) {
|
|
440
440
|
for (let i = 0; i < len; i++) {
|
|
441
441
|
result.write(serializeDynamicObject(unchecked(data[i])))
|
|
442
442
|
result.writeCodePoint(commaCode)
|
|
@@ -712,9 +712,9 @@ export function parseObject<T>(data: string): T {
|
|
|
712
712
|
return schema.__decode(result)
|
|
713
713
|
}
|
|
714
714
|
|
|
715
|
-
export function parseDynamicObject(data: string):
|
|
715
|
+
export function parseDynamicObject(data: string): DynamicObject {
|
|
716
716
|
const len: u32 = data.length - 1
|
|
717
|
-
if (len === 1) return new
|
|
717
|
+
if (len === 1) return new DynamicObject()
|
|
718
718
|
const result = new Map<string, unknown>()
|
|
719
719
|
let lastPos: u32 = 1
|
|
720
720
|
let key: string = ''
|
|
@@ -750,7 +750,7 @@ export function parseDynamicObject(data: string): Object {
|
|
|
750
750
|
}
|
|
751
751
|
|
|
752
752
|
if ((len - lastPos) > 0) result.set(key, unknown.wrap(data.slice(lastPos + 1, len - 1).trim()))
|
|
753
|
-
const o = new
|
|
753
|
+
const o = new DynamicObject()
|
|
754
754
|
// @ts-ignore
|
|
755
755
|
o.__data = result
|
|
756
756
|
return o
|
package/assembly/test.ts
CHANGED
|
@@ -2,10 +2,10 @@ import { unknown, unknownTypes } from './unknown'
|
|
|
2
2
|
|
|
3
3
|
import { console, stringify } from "../node_modules/as-console/assembly/wasi"
|
|
4
4
|
|
|
5
|
-
import { JSON, parseDynamicObject, parseUnknown, parseUnknownArray } from '
|
|
6
|
-
|
|
7
|
-
import { Object } from './Object'
|
|
5
|
+
import { JSON, parseDynamicObject, parseUnknown, parseUnknownArray } from '.'
|
|
8
6
|
|
|
7
|
+
import { DynamicObject } from './DynamicObject'
|
|
8
|
+
/*
|
|
9
9
|
// Not inlining results in an error for some reason
|
|
10
10
|
// @ts-ignore
|
|
11
11
|
@inline
|
|
@@ -180,3 +180,13 @@ check<string[][]>('Encode/Decode string[][]', [['Hey'], ['ha'], ['ho']])
|
|
|
180
180
|
check<JSONSchema>('Encode/Decode object', obj)
|
|
181
181
|
|
|
182
182
|
check<EmptySchema>('Encode/Decode object', emptyObj)
|
|
183
|
+
*/
|
|
184
|
+
// Unknown
|
|
185
|
+
//check<unknown[]>('Encode/Decode unknown[]', ["Welcome to dynamic arrays", ["Very", ["Deep", ["Array"]]], "It also supports nulls"])
|
|
186
|
+
|
|
187
|
+
//console.log(JSON.stringify(["Welcome to dynamic arrays", 3.14, ["Very", ["Deep", ["Array"]]], true, "It also supports nulls", null]))
|
|
188
|
+
|
|
189
|
+
//console.log(JSON.stringify(JSON.parse<unknown[]>('["Welcome to dynamic arrays",3.14,["Very",["Deep",["Array"]]],true,"It also supports nulls",null]')))
|
|
190
|
+
const foo = new Map()
|
|
191
|
+
|
|
192
|
+
//console.log(JSON.stringify(parseDynamicObject('{"hello":"world"}')))
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "json-as",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "JSON encoder/decoder for AssemblyScript",
|
|
5
|
-
"types": "assembly/
|
|
6
|
-
"ascMain": "assembly/
|
|
5
|
+
"types": "assembly/index.ts",
|
|
6
|
+
"ascMain": "assembly/index.ts",
|
|
7
7
|
"author": "JairusSW",
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"scripts": {
|
|
@@ -22,24 +22,23 @@
|
|
|
22
22
|
"@as-pect/cli": "^6.2.4",
|
|
23
23
|
"@assemblyscript/loader": "^0.19.10",
|
|
24
24
|
"@serial-as/json": "^1.0.2",
|
|
25
|
-
"@types/jest": "^
|
|
25
|
+
"@types/jest": "^27.0.2",
|
|
26
26
|
"@types/line-column": "^1.0.0",
|
|
27
27
|
"as-base64": "^0.2.0",
|
|
28
28
|
"as-bignum": "^0.2.18",
|
|
29
29
|
"as-console": "^6.0.2",
|
|
30
|
-
"as-string-sink": "^0.4.2",
|
|
31
30
|
"as-variant": "^0.2.1",
|
|
32
31
|
"as-wasi": "^0.4.6",
|
|
33
32
|
"asbuild": "^0.2.0",
|
|
34
|
-
"assemblyscript": "^0.19.
|
|
33
|
+
"assemblyscript": "^0.19.18",
|
|
35
34
|
"assemblyscript-json": "^1.1.0",
|
|
36
|
-
"jest": "^27.
|
|
37
|
-
"kati": "^0.
|
|
35
|
+
"jest": "^27.3.1",
|
|
36
|
+
"kati": "^0.6.2",
|
|
38
37
|
"lerna": "^4.0.0",
|
|
39
38
|
"rimraf": "^3.0.2",
|
|
40
|
-
"ts-jest": "^27.0.
|
|
41
|
-
"ts-node": "^10.
|
|
42
|
-
"typescript": "^4.
|
|
39
|
+
"ts-jest": "^27.0.7",
|
|
40
|
+
"ts-node": "^10.4.0",
|
|
41
|
+
"typescript": "^4.4.4"
|
|
43
42
|
},
|
|
44
43
|
"dependencies": {},
|
|
45
44
|
"repository": {
|
package/transform/lib/index.js
CHANGED
|
@@ -3,7 +3,7 @@ const as_1 = require("visitor-as/as");
|
|
|
3
3
|
const visitor_as_1 = require("visitor-as");
|
|
4
4
|
const utils_1 = require("visitor-as/dist/utils");
|
|
5
5
|
function getTypeName(type) {
|
|
6
|
-
let _type = utils_1.getName(type);
|
|
6
|
+
let _type = (0, utils_1.getName)(type);
|
|
7
7
|
const OR_NULL = /\|.*null/;
|
|
8
8
|
if (type.isNullable && !OR_NULL.test(_type)) {
|
|
9
9
|
_type = `${_type} | null`;
|
|
@@ -29,9 +29,9 @@ class JSONTransformer extends visitor_as_1.BaseVisitor {
|
|
|
29
29
|
}
|
|
30
30
|
visitElementAccessExpression(node) {
|
|
31
31
|
super.visitElementAccessExpression(node);
|
|
32
|
-
if (utils_1.toString(node.expression) === 'o') {
|
|
32
|
+
if ((0, utils_1.toString)(node.expression) === 'o') {
|
|
33
33
|
// Should be like if (node.expression.type.text === "Object") {
|
|
34
|
-
const replacer = visitor_as_1.SimpleParser.parseExpression(`u32(changetype<usize>(${utils_1.toString(node.elementExpression)}))`);
|
|
34
|
+
const replacer = visitor_as_1.SimpleParser.parseExpression(`u32(changetype<usize>(${(0, utils_1.toString)(node.elementExpression)}))`);
|
|
35
35
|
node.elementExpression = replacer;
|
|
36
36
|
this.sources.push(replacer.range.source);
|
|
37
37
|
}
|
|
@@ -49,7 +49,7 @@ class JSONTransformer extends visitor_as_1.BaseVisitor {
|
|
|
49
49
|
this.convertToAnyArray(expr.elementExpressions);
|
|
50
50
|
}
|
|
51
51
|
// @ts-ignore
|
|
52
|
-
replacement = visitor_as_1.SimpleParser.parseExpression(`unknown.wrap(${utils_1.toString(expr)})`);
|
|
52
|
+
replacement = visitor_as_1.SimpleParser.parseExpression(`unknown.wrap(${(0, utils_1.toString)(expr)})`);
|
|
53
53
|
node.elementExpressions[i] = replacement;
|
|
54
54
|
this.sources.push(replacement.range.source);
|
|
55
55
|
}
|
|
@@ -66,14 +66,14 @@ class JSONTransformer extends visitor_as_1.BaseVisitor {
|
|
|
66
66
|
this.convertToAnyArray(expr.elementExpressions);
|
|
67
67
|
}
|
|
68
68
|
// @ts-ignore
|
|
69
|
-
replacement = visitor_as_1.SimpleParser.parseExpression(`unknown.wrap(${utils_1.toString(expr)})`);
|
|
69
|
+
replacement = visitor_as_1.SimpleParser.parseExpression(`unknown.wrap(${(0, utils_1.toString)(expr)})`);
|
|
70
70
|
exprs[i] = replacement;
|
|
71
71
|
this.sources.push(replacement.range.source);
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
visitFieldDeclaration(node) {
|
|
75
75
|
super.visitFieldDeclaration(node);
|
|
76
|
-
const name = utils_1.toString(node.name);
|
|
76
|
+
const name = (0, utils_1.toString)(node.name);
|
|
77
77
|
if (!node.type) {
|
|
78
78
|
throw new Error(`Field ${name} is missing a type declaration`);
|
|
79
79
|
}
|
|
@@ -96,7 +96,7 @@ class JSONTransformer extends visitor_as_1.BaseVisitor {
|
|
|
96
96
|
return;
|
|
97
97
|
}
|
|
98
98
|
this.currentClass = node;
|
|
99
|
-
const name = utils_1.getName(node);
|
|
99
|
+
const name = (0, utils_1.getName)(node);
|
|
100
100
|
this.encodeStmts.delete(name);
|
|
101
101
|
this.decodeCode.delete(name);
|
|
102
102
|
this.visit(node.members);
|
|
@@ -146,10 +146,10 @@ function isanyArray(node) {
|
|
|
146
146
|
if (node.elementExpressions.length === 0)
|
|
147
147
|
return false;
|
|
148
148
|
const firstKind = node.elementExpressions[0]?.kind;
|
|
149
|
-
const isBoolean = (utils_1.toString(node.elementExpressions[0]) === 'true' || utils_1.toString(node.elementExpressions[0]) === 'false');
|
|
149
|
+
const isBoolean = ((0, utils_1.toString)(node.elementExpressions[0]) === 'true' || (0, utils_1.toString)(node.elementExpressions[0]) === 'false');
|
|
150
150
|
for (const chunk of node.elementExpressions) {
|
|
151
151
|
if (isBoolean) {
|
|
152
|
-
if (utils_1.toString(chunk) !== 'true' || utils_1.toString(chunk) !== 'false')
|
|
152
|
+
if ((0, utils_1.toString)(chunk) !== 'true' || (0, utils_1.toString)(chunk) !== 'false')
|
|
153
153
|
true;
|
|
154
154
|
}
|
|
155
155
|
else if (chunk.kind !== firstKind)
|
package/assembly/Object.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { unknown } from "./unknown"
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Provides functionality common to all JavaScript objects.
|
|
5
|
-
*/
|
|
6
|
-
export class Object {
|
|
7
|
-
[key: string]: any
|
|
8
|
-
// Having it marked as 'any' is for intellisense only
|
|
9
|
-
protected __data: Map<string, unknown> = new Map<string, unknown>()
|
|
10
|
-
@operator('[]')
|
|
11
|
-
private __getKeyOp(key: usize): unknown {
|
|
12
|
-
if (this.__data.has(changetype<string>(key))) {
|
|
13
|
-
return this.__data.get(changetype<string>(key))
|
|
14
|
-
} else {
|
|
15
|
-
return unknown.wrap(null)
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
@operator('[]=')
|
|
19
|
-
private __setKeyOp(key: usize, value: unknown): void {
|
|
20
|
-
this.__data.set(changetype<string>(key), value)
|
|
21
|
-
}
|
|
22
|
-
static keys(o: Object): string[] {
|
|
23
|
-
return o.__data.keys()
|
|
24
|
-
}
|
|
25
|
-
static values(o: Object): unknown[] {
|
|
26
|
-
return o.__data.values()
|
|
27
|
-
}
|
|
28
|
-
}
|