json-as 0.2.1 → 0.2.5
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/assembly/DynamicObject.ts +29 -0
- package/assembly/bench.ts +6 -6
- package/assembly/{json.ts → index.ts} +93 -69
- package/assembly/test.ts +28 -3
- package/package.json +60 -61
- package/tests/index.js +4 -0
- package/tests/test.js +10 -0
- package/transform/index.ts +1 -0
- package/transform/lib/index.js +9 -9
- package/assembly/Object.ts +0 -28
|
@@ -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,9 @@
|
|
|
1
|
+
import { console, stringify } from '../node_modules/as-console/assembly/wasi'
|
|
1
2
|
import { StringSink } from 'as-string-sink'
|
|
2
|
-
import {
|
|
3
|
+
import { DynamicObject } from './DynamicObject'
|
|
3
4
|
import { unknown, unknownTypes } from './unknown'
|
|
4
5
|
export { unknown, unknownTypes } from './unknown'
|
|
5
|
-
export { Object } from './
|
|
6
|
+
export { DynamicObject as Object } from './DynamicObject'
|
|
6
7
|
|
|
7
8
|
@global
|
|
8
9
|
export class Nullable { }
|
|
@@ -29,7 +30,7 @@ const f_charCode: u16 = 116// "t"
|
|
|
29
30
|
const nCode: u16 = 110// "n"
|
|
30
31
|
const unknownId = idof<unknown>()
|
|
31
32
|
const stringId = idof<string>()
|
|
32
|
-
const objectId = idof<
|
|
33
|
+
const objectId = idof<DynamicObject>()
|
|
33
34
|
const arrayStringId = idof<string[]>()
|
|
34
35
|
const arrayBooleanId = idof<boolean[]>()
|
|
35
36
|
const arrayBoolId = idof<bool[]>()
|
|
@@ -52,6 +53,8 @@ const WS5code = '\u0009'.charCodeAt(0)
|
|
|
52
53
|
const unknownTrue = unknown.wrap(true)
|
|
53
54
|
const unknownFalse = unknown.wrap(false)
|
|
54
55
|
const unknownNull = unknown.wrap(null)
|
|
56
|
+
const fwd_slash = "\\"
|
|
57
|
+
const empty_stringCode = " ".charCodeAt(0)
|
|
55
58
|
|
|
56
59
|
/**
|
|
57
60
|
* JSON Encoder/Decoder for AssemblyScript
|
|
@@ -81,7 +84,7 @@ export namespace JSON {
|
|
|
81
84
|
return serializeArray<T>(data)
|
|
82
85
|
} else if (data instanceof unknown) {
|
|
83
86
|
return serializeUnknown(data)
|
|
84
|
-
} else if (data instanceof
|
|
87
|
+
} else if (data instanceof DynamicObject) {
|
|
85
88
|
return serializeDynamicObject(data)
|
|
86
89
|
}
|
|
87
90
|
|
|
@@ -115,16 +118,16 @@ export namespace JSON {
|
|
|
115
118
|
// @ts-ignore
|
|
116
119
|
else if (type instanceof unknown) return parseUnknown(data)
|
|
117
120
|
// @ts-ignore
|
|
118
|
-
else if (type instanceof
|
|
121
|
+
else if (type instanceof DynamicObject) return parseDynamicObject(data)
|
|
119
122
|
// @ts-ignore
|
|
120
123
|
return parseObject<T>(data)
|
|
121
124
|
}
|
|
122
125
|
}
|
|
123
126
|
|
|
124
|
-
export function serializeDynamicObject(data:
|
|
127
|
+
export function serializeDynamicObject(data: DynamicObject): string {
|
|
125
128
|
const result = new StringSink(lcbracket)
|
|
126
|
-
const keys =
|
|
127
|
-
const values =
|
|
129
|
+
const keys = DynamicObject.keys(data)
|
|
130
|
+
const values = DynamicObject.values(data)
|
|
128
131
|
const len: u32 = keys.length - 1
|
|
129
132
|
if (len === -1) return '{}'
|
|
130
133
|
for (let i: u32 = 0; i < len; i++) {
|
|
@@ -150,134 +153,134 @@ export function serializeUnknown(data: unknown): string {
|
|
|
150
153
|
return serializeString(data.get<string>())
|
|
151
154
|
}
|
|
152
155
|
// @ts-ignore
|
|
153
|
-
else if (data.type ===
|
|
156
|
+
else if (data.type === unknownTypes.boolean) {
|
|
154
157
|
// @ts-ignore
|
|
155
|
-
return
|
|
158
|
+
return serializeBoolean(data.get<boolean>())
|
|
156
159
|
}
|
|
157
160
|
// @ts-ignore
|
|
158
|
-
else if (data.type ===
|
|
161
|
+
else if (data.type === unknownTypes.i8) {
|
|
159
162
|
// @ts-ignore
|
|
160
|
-
return
|
|
163
|
+
return data.get<i8>().toString()
|
|
161
164
|
}
|
|
162
165
|
// @ts-ignore
|
|
163
|
-
else if (data.type ===
|
|
166
|
+
else if (data.type === unknownTypes.i16) {
|
|
164
167
|
// @ts-ignore
|
|
165
|
-
return
|
|
168
|
+
return data.get<i16>().toString()
|
|
166
169
|
}
|
|
167
170
|
// @ts-ignore
|
|
168
|
-
else if (data.type ===
|
|
171
|
+
else if (data.type === unknownTypes.i32) {
|
|
169
172
|
// @ts-ignore
|
|
170
|
-
return
|
|
173
|
+
return data.get<i32>().toString()
|
|
171
174
|
}
|
|
172
175
|
// @ts-ignore
|
|
173
|
-
else if (data.type ===
|
|
176
|
+
else if (data.type === unknownTypes.i64) {
|
|
174
177
|
// @ts-ignore
|
|
175
|
-
return
|
|
178
|
+
return data.get<i64>().toString()
|
|
176
179
|
}
|
|
177
180
|
// @ts-ignore
|
|
178
|
-
else if (data.type ===
|
|
181
|
+
else if (data.type === unknownTypes.u8) {
|
|
179
182
|
// @ts-ignore
|
|
180
|
-
return
|
|
183
|
+
return data.get<u8>().toString()
|
|
181
184
|
}
|
|
182
185
|
// @ts-ignore
|
|
183
|
-
else if (data.type ===
|
|
186
|
+
else if (data.type === unknownTypes.u16) {
|
|
184
187
|
// @ts-ignore
|
|
185
|
-
return
|
|
188
|
+
return data.get<u16>().toString()
|
|
186
189
|
}
|
|
187
190
|
// @ts-ignore
|
|
188
|
-
else if (data.type ===
|
|
191
|
+
else if (data.type === unknownTypes.u32) {
|
|
189
192
|
// @ts-ignore
|
|
190
|
-
return
|
|
193
|
+
return data.get<u32>().toString()
|
|
191
194
|
}
|
|
192
195
|
// @ts-ignore
|
|
193
|
-
else if (data.type ===
|
|
196
|
+
else if (data.type === unknownTypes.u64) {
|
|
194
197
|
// @ts-ignore
|
|
195
|
-
return
|
|
198
|
+
return data.get<u64>().toString()
|
|
196
199
|
}
|
|
197
200
|
// @ts-ignore
|
|
198
|
-
else if (data.type ===
|
|
201
|
+
else if (data.type === unknownTypes.f32) {
|
|
199
202
|
// @ts-ignore
|
|
200
|
-
return
|
|
203
|
+
return data.get<f32>().toString()
|
|
201
204
|
}
|
|
202
205
|
// @ts-ignore
|
|
203
|
-
else if (data.type ===
|
|
206
|
+
else if (data.type === unknownTypes.f64) {
|
|
204
207
|
// @ts-ignore
|
|
205
|
-
return
|
|
208
|
+
return data.get<f64>().toString()
|
|
206
209
|
}
|
|
207
210
|
// @ts-ignore
|
|
208
|
-
else if (data.type ===
|
|
211
|
+
else if (data.type === objectId) {
|
|
209
212
|
// @ts-ignore
|
|
210
|
-
return
|
|
213
|
+
return serializeDynamicObject(data.get<DynamicObject>())
|
|
211
214
|
}
|
|
212
215
|
// @ts-ignore
|
|
213
|
-
else if (data.type ===
|
|
216
|
+
else if (data.type === arrayUnknownId) {
|
|
214
217
|
// @ts-ignore
|
|
215
|
-
return
|
|
218
|
+
return serializeUnknownArray(data.get<unknown[]>())
|
|
216
219
|
}
|
|
217
220
|
// @ts-ignore
|
|
218
|
-
else if (data.type ===
|
|
221
|
+
else if (data.type === arrayBoolId) {
|
|
219
222
|
// @ts-ignore
|
|
220
|
-
return
|
|
223
|
+
return serializeBooleanArray(data.get<bool[]>())
|
|
221
224
|
}
|
|
222
225
|
// @ts-ignore
|
|
223
|
-
else if (data.type ===
|
|
226
|
+
else if (data.type === arrayBooleanId) {
|
|
224
227
|
// @ts-ignore
|
|
225
|
-
return
|
|
228
|
+
return serializeBooleanArray(data.get<boolean[]>())
|
|
226
229
|
}
|
|
227
230
|
// @ts-ignore
|
|
228
|
-
else if (data.type ===
|
|
231
|
+
else if (data.type === arrayF32Id) {
|
|
229
232
|
// @ts-ignore
|
|
230
|
-
return
|
|
233
|
+
return serializeNumberArray<f32[]>(data.get<f32[]>())
|
|
231
234
|
}
|
|
232
235
|
// @ts-ignore
|
|
233
|
-
else if (data.type ===
|
|
236
|
+
else if (data.type === arrayF64Id) {
|
|
234
237
|
// @ts-ignore
|
|
235
|
-
return data.get<
|
|
238
|
+
return serializeNumberArray<f64[]>(data.get<f64[]>())
|
|
236
239
|
}
|
|
237
240
|
// @ts-ignore
|
|
238
|
-
else if (data.type ===
|
|
241
|
+
else if (data.type === arrayU8Id) {
|
|
239
242
|
// @ts-ignore
|
|
240
|
-
return data.get<
|
|
243
|
+
return serializeNumberArray<u8[]>(data.get<u8[]>())
|
|
241
244
|
}
|
|
242
245
|
// @ts-ignore
|
|
243
|
-
else if (data.type ===
|
|
246
|
+
else if (data.type === arrayU16Id) {
|
|
244
247
|
// @ts-ignore
|
|
245
|
-
return data.get<
|
|
248
|
+
return serializeNumberArray<u16[]>(data.get<u16[]>())
|
|
246
249
|
}
|
|
247
250
|
// @ts-ignore
|
|
248
|
-
else if (data.type ===
|
|
251
|
+
else if (data.type === arrayU32Id) {
|
|
249
252
|
// @ts-ignore
|
|
250
|
-
return data.get<
|
|
253
|
+
return serializeNumberArray<u32[]>(data.get<u32[]>())
|
|
251
254
|
}
|
|
252
255
|
// @ts-ignore
|
|
253
|
-
else if (data.type ===
|
|
256
|
+
else if (data.type === arrayU64Id) {
|
|
254
257
|
// @ts-ignore
|
|
255
|
-
return data.get<
|
|
258
|
+
return serializeNumberArray<u64[]>(data.get<u64[]>())
|
|
256
259
|
}
|
|
257
260
|
// @ts-ignore
|
|
258
|
-
else if (data.type ===
|
|
261
|
+
else if (data.type === arrayI8Id) {
|
|
259
262
|
// @ts-ignore
|
|
260
|
-
return data.get<
|
|
263
|
+
return serializeNumberArray<i8[]>(data.get<i8[]>())
|
|
261
264
|
}
|
|
262
265
|
// @ts-ignore
|
|
263
|
-
else if (data.type ===
|
|
266
|
+
else if (data.type === arrayI16Id) {
|
|
264
267
|
// @ts-ignore
|
|
265
|
-
return data.get<
|
|
268
|
+
return serializeNumberArray<i16[]>(data.get<i16[]>())
|
|
266
269
|
}
|
|
267
270
|
// @ts-ignore
|
|
268
|
-
else if (data.type ===
|
|
271
|
+
else if (data.type === arrayI32Id) {
|
|
269
272
|
// @ts-ignore
|
|
270
|
-
return data.get<
|
|
273
|
+
return serializeNumberArray<i32[]>(data.get<i32[]>())
|
|
271
274
|
}
|
|
272
275
|
// @ts-ignore
|
|
273
|
-
else if (data.type ===
|
|
276
|
+
else if (data.type === arrayI64Id) {
|
|
274
277
|
// @ts-ignore
|
|
275
|
-
return data.get<
|
|
278
|
+
return serializeNumberArray<i64[]>(data.get<i64[]>())
|
|
276
279
|
}
|
|
277
280
|
// @ts-ignore
|
|
278
|
-
else if (data.type ===
|
|
281
|
+
else if (data.type === arrayStringId) {
|
|
279
282
|
// @ts-ignore
|
|
280
|
-
return data.get<
|
|
283
|
+
return serializeStringArray(data.get<string[]>())
|
|
281
284
|
}
|
|
282
285
|
// @ts-ignore
|
|
283
286
|
else {
|
|
@@ -377,7 +380,7 @@ function serializeObjectArray<T extends Array<any>>(data: T): string {
|
|
|
377
380
|
return result.toString()
|
|
378
381
|
}
|
|
379
382
|
|
|
380
|
-
function serializeDynamicObjectArray(data:
|
|
383
|
+
function serializeDynamicObjectArray(data: DynamicObject[]): string {
|
|
381
384
|
const result = new StringSink(lbracket)
|
|
382
385
|
const len: u32 = data.length - 1
|
|
383
386
|
for (let i: u32 = 0; i < len; i++) {
|
|
@@ -436,7 +439,7 @@ export function serializeArray<T extends Array<any>>(data: T): string {
|
|
|
436
439
|
result.writeCodePoint(rbracketCode)
|
|
437
440
|
return result.toString()
|
|
438
441
|
// @ts-ignore
|
|
439
|
-
} else if (type instanceof
|
|
442
|
+
} else if (type instanceof DynamicObject) {
|
|
440
443
|
for (let i = 0; i < len; i++) {
|
|
441
444
|
result.write(serializeDynamicObject(unchecked(data[i])))
|
|
442
445
|
result.writeCodePoint(commaCode)
|
|
@@ -667,6 +670,7 @@ export function parseArrayArray<T extends Array<unknown>>(data: string): T {
|
|
|
667
670
|
|
|
668
671
|
export function parseObject<T>(data: string): T {
|
|
669
672
|
//console.log('Data ' + data)
|
|
673
|
+
data = removeJSONWhitespace(data)
|
|
670
674
|
const len: u32 = data.length - 1
|
|
671
675
|
let schema: T
|
|
672
676
|
const result = new Map<string, string>()
|
|
@@ -684,7 +688,7 @@ export function parseObject<T>(data: string): T {
|
|
|
684
688
|
if (char === rcbracketCode || char === rbracketCode) fdepth++
|
|
685
689
|
}
|
|
686
690
|
if (depth !== 0 && depth === fdepth) {
|
|
687
|
-
//console.log(`Deep: ${
|
|
691
|
+
//console.log(`Deep: ${data.slice(lastPos + 1, i + 1)}`)
|
|
688
692
|
result.set(key, data.slice(lastPos + 1, i + 1).trim())
|
|
689
693
|
// Reset the depth
|
|
690
694
|
depth = 0
|
|
@@ -694,27 +698,29 @@ export function parseObject<T>(data: string): T {
|
|
|
694
698
|
}
|
|
695
699
|
if (depth === 0) {
|
|
696
700
|
if (char === colonCode) {
|
|
697
|
-
//console.log(`Key: ${
|
|
701
|
+
//console.log(`Key: ${data.slice(lastPos + 1, i - 1)}`)
|
|
698
702
|
key = data.slice(lastPos + 1, i - 1).trim()
|
|
699
703
|
lastPos = i
|
|
700
704
|
}
|
|
701
705
|
else if (char === commaCode) {
|
|
702
|
-
//console.log(`Value: ${
|
|
706
|
+
//console.log(`Value: ${data.slice(lastPos + 1, i)}`)
|
|
703
707
|
if ((i - lastPos) > 0) result.set(key, data.slice(lastPos + 1, i).trim())
|
|
704
708
|
lastPos = i + 1
|
|
705
709
|
}
|
|
706
710
|
}
|
|
707
711
|
}
|
|
708
|
-
//console.log(`Trailing: ${
|
|
712
|
+
//console.log(`Trailing: ${data.slice(lastPos + 1, len)}\n\t\sValid: ${data.slice(lastPos + 1, len).length > 0}`)
|
|
709
713
|
|
|
710
714
|
if ((len - lastPos) > 0) result.set(key, data.slice(lastPos + 1, len).trim())
|
|
715
|
+
console.log(result.keys())
|
|
716
|
+
console.log(result.values())
|
|
711
717
|
// @ts-ignore
|
|
712
718
|
return schema.__decode(result)
|
|
713
719
|
}
|
|
714
720
|
|
|
715
|
-
export function parseDynamicObject(data: string):
|
|
721
|
+
export function parseDynamicObject(data: string): DynamicObject {
|
|
716
722
|
const len: u32 = data.length - 1
|
|
717
|
-
if (len === 1) return new
|
|
723
|
+
if (len === 1) return new DynamicObject()
|
|
718
724
|
const result = new Map<string, unknown>()
|
|
719
725
|
let lastPos: u32 = 1
|
|
720
726
|
let key: string = ''
|
|
@@ -750,8 +756,26 @@ export function parseDynamicObject(data: string): Object {
|
|
|
750
756
|
}
|
|
751
757
|
|
|
752
758
|
if ((len - lastPos) > 0) result.set(key, unknown.wrap(data.slice(lastPos + 1, len - 1).trim()))
|
|
753
|
-
const o = new
|
|
759
|
+
const o = new DynamicObject()
|
|
754
760
|
// @ts-ignore
|
|
755
761
|
o.__data = result
|
|
756
762
|
return o
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
export function removeJSONWhitespace(data: string): string {
|
|
766
|
+
let result = new StringSink()
|
|
767
|
+
let instr = false
|
|
768
|
+
let char = 0
|
|
769
|
+
for (let i = 0; i < data.length; i++) {
|
|
770
|
+
char = data.charCodeAt(i)
|
|
771
|
+
if (char === quoteCode && data.charCodeAt(i - 1) === fwd_slashCode) {
|
|
772
|
+
instr = !instr
|
|
773
|
+
}
|
|
774
|
+
if (instr === true) {
|
|
775
|
+
result.writeCodePoint(char)
|
|
776
|
+
} else if (instr === false && char !== empty_stringCode) {
|
|
777
|
+
result.writeCodePoint(char)
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
return result.toString()
|
|
757
781
|
}
|
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, removeJSONWhitespace } 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,28 @@ 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"}')))
|
|
193
|
+
// @ts-ignore
|
|
194
|
+
@json
|
|
195
|
+
class Test {
|
|
196
|
+
stuff: string
|
|
197
|
+
things: i32
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const test: Test = {
|
|
201
|
+
stuff: "hi",
|
|
202
|
+
things: 42
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
console.log(stringify(JSON.stringify(test)))
|
|
206
|
+
console.log(removeJSONWhitespace('{"stuff":"hi", "things":42}'))
|
|
207
|
+
console.log(stringify(JSON.stringify(JSON.parse<Test>('{"stuff":"hi", "things":42}'))))
|
package/package.json
CHANGED
|
@@ -1,61 +1,60 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "json-as",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "JSON encoder/decoder for AssemblyScript",
|
|
5
|
-
"types": "assembly/
|
|
6
|
-
"ascMain": "assembly/
|
|
7
|
-
"author": "JairusSW",
|
|
8
|
-
"license": "MIT",
|
|
9
|
-
"scripts": {
|
|
10
|
-
"build:transform": "tsc -w -p ./transform",
|
|
11
|
-
"build:test": "asc assembly/test.ts --transform ./transform --target test --explicitStart",
|
|
12
|
-
"test": "node --experimental-wasi-unstable-preview1 ./tests/test",
|
|
13
|
-
"bench:build": "asc assembly/bench.ts --runtime incremental --transform ./transform --target bench --explicitStart",
|
|
14
|
-
"bench:node": "node --experimental-wasi-unstable-preview1 ./bench/bench",
|
|
15
|
-
"bench:wasmtime": "wasmtime ./bench/output/bench.wasm",
|
|
16
|
-
"bench:lunatic": "lunatic ./bench/output/bench.wasm",
|
|
17
|
-
"asbuild:untouched": "asc assembly/index.ts --target debug",
|
|
18
|
-
"asbuild:optimized": "asc assembly/index.ts --target release",
|
|
19
|
-
"asbuild": "yarn asbuild:untouched && yarn asbuild:optimized"
|
|
20
|
-
},
|
|
21
|
-
"devDependencies": {
|
|
22
|
-
"@as-pect/cli": "^6.2.4",
|
|
23
|
-
"@assemblyscript/loader": "^0.19.10",
|
|
24
|
-
"@serial-as/json": "^1.0.2",
|
|
25
|
-
"@types/jest": "^27.0.2",
|
|
26
|
-
"@types/line-column": "^1.0.0",
|
|
27
|
-
"as-base64": "^0.2.0",
|
|
28
|
-
"as-bignum": "^0.2.18",
|
|
29
|
-
"as-console": "^6.0.2",
|
|
30
|
-
"as-
|
|
31
|
-
"as-
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"assemblyscript": "^
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"ts-
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
"
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "json-as",
|
|
3
|
+
"version": "0.2.5",
|
|
4
|
+
"description": "JSON encoder/decoder for AssemblyScript",
|
|
5
|
+
"types": "assembly/index.ts",
|
|
6
|
+
"ascMain": "assembly/index.ts",
|
|
7
|
+
"author": "JairusSW",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build:transform": "tsc -w -p ./transform",
|
|
11
|
+
"build:test": "asc assembly/test.ts --transform ./transform --target test --explicitStart",
|
|
12
|
+
"test": "node --experimental-wasi-unstable-preview1 ./tests/test",
|
|
13
|
+
"bench:build": "asc assembly/bench.ts --runtime incremental --transform ./transform --target bench --explicitStart",
|
|
14
|
+
"bench:node": "node --experimental-wasi-unstable-preview1 ./bench/bench",
|
|
15
|
+
"bench:wasmtime": "wasmtime ./bench/output/bench.wasm",
|
|
16
|
+
"bench:lunatic": "lunatic ./bench/output/bench.wasm",
|
|
17
|
+
"asbuild:untouched": "asc assembly/index.ts --target debug",
|
|
18
|
+
"asbuild:optimized": "asc assembly/index.ts --target release",
|
|
19
|
+
"asbuild": "yarn asbuild:untouched && yarn asbuild:optimized"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@as-pect/cli": "^6.2.4",
|
|
23
|
+
"@assemblyscript/loader": "^0.19.10",
|
|
24
|
+
"@serial-as/json": "^1.0.2",
|
|
25
|
+
"@types/jest": "^27.0.2",
|
|
26
|
+
"@types/line-column": "^1.0.0",
|
|
27
|
+
"as-base64": "^0.2.0",
|
|
28
|
+
"as-bignum": "^0.2.18",
|
|
29
|
+
"as-console": "^6.0.2",
|
|
30
|
+
"as-variant": "^0.2.1",
|
|
31
|
+
"as-wasi": "^0.4.6",
|
|
32
|
+
"asbuild": "^0.2.0",
|
|
33
|
+
"assemblyscript": "^0.19.18",
|
|
34
|
+
"assemblyscript-json": "^1.1.0",
|
|
35
|
+
"jest": "^27.3.1",
|
|
36
|
+
"kati": "^0.6.2",
|
|
37
|
+
"lerna": "^4.0.0",
|
|
38
|
+
"rimraf": "^3.0.2",
|
|
39
|
+
"ts-jest": "^27.0.7",
|
|
40
|
+
"ts-node": "^10.4.0",
|
|
41
|
+
"typescript": "^4.4.4"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"as-string-sink": "^0.4.2"
|
|
45
|
+
},
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "git+https://github.com/aspkg/as-json.git"
|
|
49
|
+
},
|
|
50
|
+
"keywords": [
|
|
51
|
+
"assemblyscript",
|
|
52
|
+
"json",
|
|
53
|
+
"serialize",
|
|
54
|
+
"deserialize"
|
|
55
|
+
],
|
|
56
|
+
"bugs": {
|
|
57
|
+
"url": "https://github.com/aspkg/as-json/issues"
|
|
58
|
+
},
|
|
59
|
+
"homepage": "https://github.com/aspkg/as-json#readme"
|
|
60
|
+
}
|
package/tests/index.js
ADDED
package/tests/test.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const fs = require("fs");
|
|
2
|
+
const loader = require("@assemblyscript/loader");
|
|
3
|
+
const { WASI } = require('wasi')
|
|
4
|
+
const wasiOptions = {}
|
|
5
|
+
const wasi = new WASI(wasiOptions)
|
|
6
|
+
const imports = {
|
|
7
|
+
wasi_snapshot_preview1: wasi.wasiImport
|
|
8
|
+
};
|
|
9
|
+
const wasmModule = loader.instantiateSync(fs.readFileSync(__dirname + "/output/test.wasm"), imports);
|
|
10
|
+
wasi.start(wasmModule)
|
package/transform/index.ts
CHANGED
|
@@ -95,6 +95,7 @@ class JSONTransformer extends BaseVisitor {
|
|
|
95
95
|
const className = this.currentClass!.name.text
|
|
96
96
|
if (!this.encodeStmts.has(className)) this.encodeStmts.set(className, [])
|
|
97
97
|
if (!this.decodeCode.has(className)) this.decodeCode.set(className, [])
|
|
98
|
+
// TODO: fix later
|
|
98
99
|
// @ts-ignore
|
|
99
100
|
this.encodeStmts.get(className).push(
|
|
100
101
|
`this.__encoded += '' + '"' + '${name}' + '"' + ':' + JSON.stringify<${type}>(this.${name}) + ',';`
|
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
|
-
}
|