@wasm-fmt/gofmt 0.4.1 → 0.4.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 +3 -3
- package/gofmt.js +69 -141
- package/gofmt.wasm +0 -0
- package/package.json +6 -8
- package/.editorconfig +0 -11
- package/.gitattributes +0 -5
- package/.node-version +0 -1
- package/gen_patch.sh +0 -23
- package/src/lib.go +0 -23
- package/test.js +0 -29
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
[](https://github.com/wasm-fmt/gofmt/actions/workflows/test.yml)
|
|
2
2
|
[](https://www.npmjs.com/package/@wasm-fmt/gofmt)
|
|
3
3
|
|
|
4
4
|
# Install
|
|
@@ -40,8 +40,8 @@ git clone https://github.com/wasm-fmt/gofmt.git
|
|
|
40
40
|
# 2. install TinyGo https://tinygo.org/getting-started/install/
|
|
41
41
|
|
|
42
42
|
# 3. build
|
|
43
|
-
|
|
43
|
+
pnpm build
|
|
44
44
|
|
|
45
45
|
# 4. test
|
|
46
|
-
|
|
46
|
+
pnpm run /^test:/
|
|
47
47
|
```
|
package/gofmt.js
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
// This file has been modified for use by the TinyGo compiler.
|
|
6
6
|
const encoder = new TextEncoder("utf-8");
|
|
7
7
|
const decoder = new TextDecoder("utf-8");
|
|
8
|
+
let reinterpretBuf = new DataView(new ArrayBuffer(8));
|
|
9
|
+
var logLine = [];
|
|
8
10
|
|
|
9
11
|
class Go {
|
|
10
12
|
constructor() {
|
|
@@ -16,19 +18,9 @@
|
|
|
16
18
|
return new DataView(this._inst.exports.memory.buffer);
|
|
17
19
|
}
|
|
18
20
|
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const getInt64 = (addr) => {
|
|
25
|
-
const low = mem().getUint32(addr + 0, true);
|
|
26
|
-
const high = mem().getInt32(addr + 4, true);
|
|
27
|
-
return low + high * 4294967296;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const loadValue = (addr) => {
|
|
31
|
-
const f = mem().getFloat64(addr, true);
|
|
21
|
+
const unboxValue = (v_ref) => {
|
|
22
|
+
reinterpretBuf.setBigInt64(0, v_ref, true);
|
|
23
|
+
const f = reinterpretBuf.getFloat64(0, true);
|
|
32
24
|
if (f === 0) {
|
|
33
25
|
return undefined;
|
|
34
26
|
}
|
|
@@ -36,71 +28,70 @@
|
|
|
36
28
|
return f;
|
|
37
29
|
}
|
|
38
30
|
|
|
39
|
-
const id =
|
|
31
|
+
const id = v_ref & 0xffffffffn;
|
|
40
32
|
return this._values[id];
|
|
41
33
|
}
|
|
42
34
|
|
|
43
|
-
|
|
44
|
-
|
|
35
|
+
|
|
36
|
+
const loadValue = (addr) => {
|
|
37
|
+
let v_ref = mem().getBigUint64(addr, true);
|
|
38
|
+
return unboxValue(v_ref);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const boxValue = (v) => {
|
|
42
|
+
const nanHead = 0x7FF80000n;
|
|
45
43
|
|
|
46
44
|
if (typeof v === "number") {
|
|
47
45
|
if (isNaN(v)) {
|
|
48
|
-
|
|
49
|
-
mem().setUint32(addr, 0, true);
|
|
50
|
-
return;
|
|
46
|
+
return nanHead << 32n;
|
|
51
47
|
}
|
|
52
48
|
if (v === 0) {
|
|
53
|
-
|
|
54
|
-
mem().setUint32(addr, 1, true);
|
|
55
|
-
return;
|
|
49
|
+
return (nanHead << 32n) | 1n;
|
|
56
50
|
}
|
|
57
|
-
|
|
58
|
-
return;
|
|
51
|
+
reinterpretBuf.setFloat64(0, v, true);
|
|
52
|
+
return reinterpretBuf.getBigInt64(0, true);
|
|
59
53
|
}
|
|
60
54
|
|
|
61
55
|
switch (v) {
|
|
62
56
|
case undefined:
|
|
63
|
-
|
|
64
|
-
return;
|
|
57
|
+
return 0n;
|
|
65
58
|
case null:
|
|
66
|
-
|
|
67
|
-
mem().setUint32(addr, 2, true);
|
|
68
|
-
return;
|
|
59
|
+
return (nanHead << 32n) | 2n;
|
|
69
60
|
case true:
|
|
70
|
-
|
|
71
|
-
mem().setUint32(addr, 3, true);
|
|
72
|
-
return;
|
|
61
|
+
return (nanHead << 32n) | 3n;
|
|
73
62
|
case false:
|
|
74
|
-
|
|
75
|
-
mem().setUint32(addr, 4, true);
|
|
76
|
-
return;
|
|
63
|
+
return (nanHead << 32n) | 4n;
|
|
77
64
|
}
|
|
78
65
|
|
|
79
66
|
let id = this._ids.get(v);
|
|
80
67
|
if (id === undefined) {
|
|
81
68
|
id = this._idPool.pop();
|
|
82
69
|
if (id === undefined) {
|
|
83
|
-
id = this._values.length;
|
|
70
|
+
id = BigInt(this._values.length);
|
|
84
71
|
}
|
|
85
72
|
this._values[id] = v;
|
|
86
73
|
this._goRefCounts[id] = 0;
|
|
87
74
|
this._ids.set(v, id);
|
|
88
75
|
}
|
|
89
76
|
this._goRefCounts[id]++;
|
|
90
|
-
let typeFlag =
|
|
77
|
+
let typeFlag = 1n;
|
|
91
78
|
switch (typeof v) {
|
|
92
79
|
case "string":
|
|
93
|
-
typeFlag =
|
|
80
|
+
typeFlag = 2n;
|
|
94
81
|
break;
|
|
95
82
|
case "symbol":
|
|
96
|
-
typeFlag =
|
|
83
|
+
typeFlag = 3n;
|
|
97
84
|
break;
|
|
98
85
|
case "function":
|
|
99
|
-
typeFlag =
|
|
86
|
+
typeFlag = 4n;
|
|
100
87
|
break;
|
|
101
88
|
}
|
|
102
|
-
|
|
103
|
-
|
|
89
|
+
return id | ((nanHead | typeFlag) << 32n);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const storeValue = (addr, v) => {
|
|
93
|
+
let v_ref = boxValue(v);
|
|
94
|
+
mem().setBigUint64(addr, v_ref, true);
|
|
104
95
|
}
|
|
105
96
|
|
|
106
97
|
const loadSlice = (array, len, cap) => {
|
|
@@ -124,27 +115,21 @@
|
|
|
124
115
|
wasi_snapshot_preview1: {
|
|
125
116
|
// https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md#fd_write
|
|
126
117
|
fd_write() {},
|
|
127
|
-
fd_close() {},
|
|
128
|
-
fd_fdstat_get() {},
|
|
129
|
-
fd_seek() {},
|
|
130
|
-
proc_exit() {},
|
|
131
|
-
random_get() {}
|
|
132
118
|
},
|
|
133
|
-
|
|
119
|
+
gojs: {
|
|
134
120
|
// func ticks() float64
|
|
135
121
|
"runtime.ticks": () => {
|
|
136
122
|
return timeOrigin + performance.now();
|
|
137
123
|
},
|
|
138
124
|
|
|
139
|
-
// func sleepTicks(timeout float64)
|
|
140
|
-
"runtime.sleepTicks": (timeout) => {
|
|
141
|
-
// Do not sleep, only reactivate scheduler after the given timeout.
|
|
142
|
-
setTimeout(this._inst.exports.go_scheduler, timeout);
|
|
143
|
-
},
|
|
144
|
-
|
|
145
125
|
// func finalizeRef(v ref)
|
|
146
|
-
"syscall/js.finalizeRef": (
|
|
147
|
-
|
|
126
|
+
"syscall/js.finalizeRef": (v_ref) => {
|
|
127
|
+
reinterpretBuf.setBigInt64(0, v_ref, true);
|
|
128
|
+
const f = reinterpretBuf.getFloat64(0, true);
|
|
129
|
+
if (f === 0 || !isNaN(f)) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const id = v_ref & 0xffffffffn;
|
|
148
133
|
this._goRefCounts[id]--;
|
|
149
134
|
if (this._goRefCounts[id] === 0) {
|
|
150
135
|
const v = this._values[id];
|
|
@@ -155,47 +140,40 @@
|
|
|
155
140
|
},
|
|
156
141
|
|
|
157
142
|
// func stringVal(value string) ref
|
|
158
|
-
"syscall/js.stringVal": (
|
|
143
|
+
"syscall/js.stringVal": (value_ptr, value_len) => {
|
|
159
144
|
const s = loadString(value_ptr, value_len);
|
|
160
|
-
|
|
145
|
+
return boxValue(s);
|
|
161
146
|
},
|
|
162
147
|
|
|
163
148
|
// func valueGet(v ref, p string) ref
|
|
164
|
-
"syscall/js.valueGet": (
|
|
149
|
+
"syscall/js.valueGet": (v_ref, p_ptr, p_len) => {
|
|
165
150
|
let prop = loadString(p_ptr, p_len);
|
|
166
|
-
let
|
|
167
|
-
let result = Reflect.get(
|
|
168
|
-
|
|
151
|
+
let v = unboxValue(v_ref);
|
|
152
|
+
let result = Reflect.get(v, prop);
|
|
153
|
+
return boxValue(result);
|
|
169
154
|
},
|
|
170
155
|
|
|
171
156
|
// func valueSet(v ref, p string, x ref)
|
|
172
|
-
"syscall/js.valueSet": (
|
|
173
|
-
const v =
|
|
157
|
+
"syscall/js.valueSet": (v_ref, p_ptr, p_len, x_ref) => {
|
|
158
|
+
const v = unboxValue(v_ref);
|
|
174
159
|
const p = loadString(p_ptr, p_len);
|
|
175
|
-
const x =
|
|
160
|
+
const x = unboxValue(x_ref);
|
|
176
161
|
Reflect.set(v, p, x);
|
|
177
162
|
},
|
|
178
163
|
|
|
179
|
-
// func valueDelete(v ref, p string)
|
|
180
|
-
"syscall/js.valueDelete": (v_addr, p_ptr, p_len) => {
|
|
181
|
-
const v = loadValue(v_addr);
|
|
182
|
-
const p = loadString(p_ptr, p_len);
|
|
183
|
-
Reflect.deleteProperty(v, p);
|
|
184
|
-
},
|
|
185
|
-
|
|
186
164
|
// func valueIndex(v ref, i int) ref
|
|
187
|
-
"syscall/js.valueIndex": (
|
|
188
|
-
|
|
165
|
+
"syscall/js.valueIndex": (v_ref, i) => {
|
|
166
|
+
return boxValue(Reflect.get(unboxValue(v_ref), i));
|
|
189
167
|
},
|
|
190
168
|
|
|
191
169
|
// valueSetIndex(v ref, i int, x ref)
|
|
192
|
-
"syscall/js.valueSetIndex": (
|
|
193
|
-
Reflect.set(
|
|
170
|
+
"syscall/js.valueSetIndex": (v_ref, i, x_ref) => {
|
|
171
|
+
Reflect.set(unboxValue(v_ref), i, unboxValue(x_ref));
|
|
194
172
|
},
|
|
195
173
|
|
|
196
174
|
// func valueCall(v ref, m string, args []ref) (ref, bool)
|
|
197
|
-
"syscall/js.valueCall": (ret_addr,
|
|
198
|
-
const v =
|
|
175
|
+
"syscall/js.valueCall": (ret_addr, v_ref, m_ptr, m_len, args_ptr, args_len, args_cap) => {
|
|
176
|
+
const v = unboxValue(v_ref);
|
|
199
177
|
const name = loadString(m_ptr, m_len);
|
|
200
178
|
const args = loadSliceOfValues(args_ptr, args_len, args_cap);
|
|
201
179
|
try {
|
|
@@ -208,22 +186,9 @@
|
|
|
208
186
|
}
|
|
209
187
|
},
|
|
210
188
|
|
|
211
|
-
// func valueInvoke(v ref, args []ref) (ref, bool)
|
|
212
|
-
"syscall/js.valueInvoke": (ret_addr, v_addr, args_ptr, args_len, args_cap) => {
|
|
213
|
-
try {
|
|
214
|
-
const v = loadValue(v_addr);
|
|
215
|
-
const args = loadSliceOfValues(args_ptr, args_len, args_cap);
|
|
216
|
-
storeValue(ret_addr, Reflect.apply(v, undefined, args));
|
|
217
|
-
mem().setUint8(ret_addr + 8, 1);
|
|
218
|
-
} catch (err) {
|
|
219
|
-
storeValue(ret_addr, err);
|
|
220
|
-
mem().setUint8(ret_addr + 8, 0);
|
|
221
|
-
}
|
|
222
|
-
},
|
|
223
|
-
|
|
224
189
|
// func valueNew(v ref, args []ref) (ref, bool)
|
|
225
|
-
"syscall/js.valueNew": (ret_addr,
|
|
226
|
-
const v =
|
|
190
|
+
"syscall/js.valueNew": (ret_addr, v_ref, args_ptr, args_len, args_cap) => {
|
|
191
|
+
const v = unboxValue(v_ref);
|
|
227
192
|
const args = loadSliceOfValues(args_ptr, args_len, args_cap);
|
|
228
193
|
try {
|
|
229
194
|
storeValue(ret_addr, Reflect.construct(v, args));
|
|
@@ -235,66 +200,29 @@
|
|
|
235
200
|
},
|
|
236
201
|
|
|
237
202
|
// func valueLength(v ref) int
|
|
238
|
-
"syscall/js.valueLength": (
|
|
239
|
-
return
|
|
203
|
+
"syscall/js.valueLength": (v_ref) => {
|
|
204
|
+
return unboxValue(v_ref).length;
|
|
240
205
|
},
|
|
241
206
|
|
|
242
207
|
// valuePrepareString(v ref) (ref, int)
|
|
243
|
-
"syscall/js.valuePrepareString": (ret_addr,
|
|
244
|
-
const s = String(
|
|
208
|
+
"syscall/js.valuePrepareString": (ret_addr, v_ref) => {
|
|
209
|
+
const s = String(unboxValue(v_ref));
|
|
245
210
|
const str = encoder.encode(s);
|
|
246
211
|
storeValue(ret_addr, str);
|
|
247
|
-
|
|
212
|
+
mem().setInt32(ret_addr + 8, str.length, true);
|
|
248
213
|
},
|
|
249
214
|
|
|
250
215
|
// valueLoadString(v ref, b []byte)
|
|
251
|
-
"syscall/js.valueLoadString": (
|
|
252
|
-
const str =
|
|
216
|
+
"syscall/js.valueLoadString": (v_ref, slice_ptr, slice_len, slice_cap) => {
|
|
217
|
+
const str = unboxValue(v_ref);
|
|
253
218
|
loadSlice(slice_ptr, slice_len, slice_cap).set(str);
|
|
254
219
|
},
|
|
255
|
-
|
|
256
|
-
// func valueInstanceOf(v ref, t ref) bool
|
|
257
|
-
"syscall/js.valueInstanceOf": (v_addr, t_addr) => {
|
|
258
|
-
return loadValue(v_addr) instanceof loadValue(t_addr);
|
|
259
|
-
},
|
|
260
|
-
|
|
261
|
-
// func copyBytesToGo(dst []byte, src ref) (int, bool)
|
|
262
|
-
"syscall/js.copyBytesToGo": (ret_addr, dest_addr, dest_len, dest_cap, source_addr) => {
|
|
263
|
-
let num_bytes_copied_addr = ret_addr;
|
|
264
|
-
let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable
|
|
265
|
-
|
|
266
|
-
const dst = loadSlice(dest_addr, dest_len);
|
|
267
|
-
const src = loadValue(source_addr);
|
|
268
|
-
if (!(src instanceof Uint8Array || src instanceof Uint8ClampedArray)) {
|
|
269
|
-
mem().setUint8(returned_status_addr, 0); // Return "not ok" status
|
|
270
|
-
return;
|
|
271
|
-
}
|
|
272
|
-
const toCopy = src.subarray(0, dst.length);
|
|
273
|
-
dst.set(toCopy);
|
|
274
|
-
setInt64(num_bytes_copied_addr, toCopy.length);
|
|
275
|
-
mem().setUint8(returned_status_addr, 1); // Return "ok" status
|
|
276
|
-
},
|
|
277
|
-
|
|
278
|
-
// copyBytesToJS(dst ref, src []byte) (int, bool)
|
|
279
|
-
// Originally copied from upstream Go project, then modified:
|
|
280
|
-
// https://github.com/golang/go/blob/3f995c3f3b43033013013e6c7ccc93a9b1411ca9/misc/wasm/wasm_exec.js#L404-L416
|
|
281
|
-
"syscall/js.copyBytesToJS": (ret_addr, dest_addr, source_addr, source_len, source_cap) => {
|
|
282
|
-
let num_bytes_copied_addr = ret_addr;
|
|
283
|
-
let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable
|
|
284
|
-
|
|
285
|
-
const dst = loadValue(dest_addr);
|
|
286
|
-
const src = loadSlice(source_addr, source_len);
|
|
287
|
-
if (!(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray)) {
|
|
288
|
-
mem().setUint8(returned_status_addr, 0); // Return "not ok" status
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
const toCopy = src.subarray(0, dst.length);
|
|
292
|
-
dst.set(toCopy);
|
|
293
|
-
setInt64(num_bytes_copied_addr, toCopy.length);
|
|
294
|
-
mem().setUint8(returned_status_addr, 1); // Return "ok" status
|
|
295
|
-
},
|
|
296
220
|
}
|
|
297
221
|
};
|
|
222
|
+
|
|
223
|
+
// Go 1.20 uses 'env'. Go 1.21 uses 'gojs'.
|
|
224
|
+
// For compatibility, we use both as long as Go 1.20 is supported.
|
|
225
|
+
this.importObject.env = this.importObject.gojs;
|
|
298
226
|
}
|
|
299
227
|
|
|
300
228
|
async run(instance) {
|
package/gofmt.wasm
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@wasm-fmt/gofmt",
|
|
3
3
|
"description": "A wasm based golang formatter",
|
|
4
4
|
"author": "magic-akari <akari.ccino@gamil.com>",
|
|
5
|
-
"version": "0.4.
|
|
5
|
+
"version": "0.4.3",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"keywords": [
|
|
8
8
|
"wasm",
|
|
@@ -34,17 +34,15 @@
|
|
|
34
34
|
"./*": "./*"
|
|
35
35
|
},
|
|
36
36
|
"scripts": {
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"test": "node --test"
|
|
37
|
+
"build": "./scripts/build.sh",
|
|
38
|
+
"test:node": "node --test test_node",
|
|
39
|
+
"test:deno": "deno test test_deno --allow-read",
|
|
40
|
+
"test:bun": "bun test test_bun"
|
|
42
41
|
},
|
|
43
42
|
"engines": {
|
|
44
43
|
"node": ">=16.17.0"
|
|
45
44
|
},
|
|
46
45
|
"publishConfig": {
|
|
47
|
-
"access": "public"
|
|
48
|
-
"provenance": true
|
|
46
|
+
"access": "public"
|
|
49
47
|
}
|
|
50
48
|
}
|
package/.editorconfig
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# Check http://editorconfig.org for more information
|
|
2
|
-
# This is the main config file for this project:
|
|
3
|
-
root = true
|
|
4
|
-
|
|
5
|
-
[*]
|
|
6
|
-
charset = utf-8
|
|
7
|
-
trim_trailing_whitespace = true
|
|
8
|
-
end_of_line = lf
|
|
9
|
-
indent_style = tab
|
|
10
|
-
insert_final_newline = true
|
|
11
|
-
indent_size = 4
|
package/.gitattributes
DELETED
package/.node-version
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
v18.17.0
|
package/gen_patch.sh
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
current_dir=$(pwd)
|
|
2
|
-
tmp_dir=$(mktemp -d)
|
|
3
|
-
|
|
4
|
-
cd $tmp_dir
|
|
5
|
-
git init
|
|
6
|
-
|
|
7
|
-
cp $(tinygo env TINYGOROOT)/targets/wasm_exec.js $tmp_dir/gofmt.js
|
|
8
|
-
git add -f .
|
|
9
|
-
git commit -m "init"
|
|
10
|
-
|
|
11
|
-
cp $current_dir/gofmt.js $tmp_dir/gofmt.js
|
|
12
|
-
git add -f .
|
|
13
|
-
|
|
14
|
-
git diff \
|
|
15
|
-
--cached \
|
|
16
|
-
--no-color \
|
|
17
|
-
--ignore-space-at-eol \
|
|
18
|
-
--no-ext-diff \
|
|
19
|
-
--src-prefix=a/ \
|
|
20
|
-
--dst-prefix=b/ \
|
|
21
|
-
>$current_dir/gofmt.patch
|
|
22
|
-
|
|
23
|
-
rm -rf $tmp_dir
|
package/src/lib.go
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
package main
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"go/format"
|
|
5
|
-
"syscall/js"
|
|
6
|
-
)
|
|
7
|
-
|
|
8
|
-
func Format(this js.Value, args []js.Value) any {
|
|
9
|
-
input := ([]byte)(args[0].String())
|
|
10
|
-
|
|
11
|
-
output, err := format.Source(input)
|
|
12
|
-
if err != nil {
|
|
13
|
-
return []any{true, err.Error()}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
return []any{false, string(output)}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
func main() {
|
|
20
|
-
done := make(chan bool)
|
|
21
|
-
js.Global().Set("format", js.FuncOf(Format))
|
|
22
|
-
<-done
|
|
23
|
-
}
|
package/test.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import fs from "node:fs/promises";
|
|
3
|
-
import test from "node:test";
|
|
4
|
-
import init, { format } from "./gofmt.js";
|
|
5
|
-
|
|
6
|
-
await init();
|
|
7
|
-
|
|
8
|
-
const files = (await fs.readdir("testdata"))
|
|
9
|
-
.filter((f) => f.endsWith(".input"))
|
|
10
|
-
.map((f) => {
|
|
11
|
-
return {
|
|
12
|
-
input_name: f,
|
|
13
|
-
golden_name: f.replace(".input", ".golden"),
|
|
14
|
-
};
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
for (const { input_name, golden_name } of files) {
|
|
18
|
-
test(`format ${input_name}`, { skip: input_name[0] === "." }, async () => {
|
|
19
|
-
const [input, expected] = await Promise.all(
|
|
20
|
-
[input_name, golden_name].map((f) =>
|
|
21
|
-
fs.readFile(`testdata/${f}`, "utf-8")
|
|
22
|
-
)
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
const actual = format(input);
|
|
26
|
-
|
|
27
|
-
assert.equal(actual, expected);
|
|
28
|
-
});
|
|
29
|
-
}
|