@acala-network/chopsticks-testing 0.9.5-1 → 0.9.5-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.
@@ -12,9 +12,14 @@ export type RedactOptions = {
12
12
  redactKeys?: RegExp;
13
13
  removeKeys?: RegExp;
14
14
  };
15
+ export type ExpectFn = (value: any) => {
16
+ toMatchSnapshot: (msg?: string) => void;
17
+ toMatch(value: any, msg?: string): void;
18
+ toMatchObject(value: any, msg?: string): void;
19
+ };
15
20
  export declare class Checker {
16
21
  #private;
17
- constructor(value: any, message?: string);
22
+ constructor(expectFn: ExpectFn, value: any, message?: string);
18
23
  toHuman(): this;
19
24
  toHex(): this;
20
25
  toJson(): this;
@@ -25,15 +30,22 @@ export declare class Checker {
25
30
  pipe(fn?: (value: Checker) => Checker): Checker;
26
31
  value(): Promise<any>;
27
32
  toMatchSnapshot(msg?: string): Promise<void>;
33
+ toMatch(value: any, msg?: string): Promise<void>;
34
+ toMatchObject(value: any, msg?: string): Promise<void>;
28
35
  }
29
- export declare const check: (value: any, msg?: string) => Checker;
30
- type Api = {
31
- api: ApiPromise;
36
+ export declare const withExpect: (expectFn: ExpectFn) => {
37
+ check: (value: any, msg?: string) => Checker;
38
+ checkEvents: ({ events }: {
39
+ events: Promise<Codec[] | Codec>;
40
+ }, ...filters: EventFilter[]) => Checker;
41
+ checkSystemEvents: ({ api }: {
42
+ api: ApiPromise;
43
+ }, ...filters: EventFilter[]) => Checker;
44
+ checkUmp: ({ api }: {
45
+ api: ApiPromise;
46
+ }) => Checker;
47
+ checkHrmp: ({ api }: {
48
+ api: ApiPromise;
49
+ }) => Checker;
50
+ checkHex: (value: any, msg?: string) => Checker;
32
51
  };
33
- export declare const checkEvents: ({ events }: {
34
- events: Promise<Codec[] | Codec>;
35
- }, ...filters: EventFilter[]) => Checker;
36
- export declare const checkSystemEvents: ({ api }: Api, ...filters: EventFilter[]) => Checker;
37
- export declare const checkUmp: ({ api }: Api) => Checker;
38
- export declare const checkHrmp: ({ api }: Api) => Checker;
39
- export {};
package/dist/cjs/check.js CHANGED
@@ -12,23 +12,10 @@ _export(exports, {
12
12
  Checker: function() {
13
13
  return Checker;
14
14
  },
15
- check: function() {
16
- return check;
17
- },
18
- checkEvents: function() {
19
- return checkEvents;
20
- },
21
- checkHrmp: function() {
22
- return checkHrmp;
23
- },
24
- checkSystemEvents: function() {
25
- return checkSystemEvents;
26
- },
27
- checkUmp: function() {
28
- return checkUmp;
15
+ withExpect: function() {
16
+ return withExpect;
29
17
  }
30
18
  });
31
- const _vitest = require("vitest");
32
19
  function _check_private_redeclaration(obj, privateCollection) {
33
20
  if (privateCollection.has(obj)) {
34
21
  throw new TypeError("Cannot initialize the same private elements twice on an object");
@@ -83,7 +70,7 @@ const processCodecOrArray = (codec, fn)=>Array.isArray(codec) ? codec.map(fn) :
83
70
  const toHuman = (codec)=>processCodecOrArray(codec, (c)=>c?.toHuman?.() ?? c);
84
71
  const toHex = (codec)=>processCodecOrArray(codec, (c)=>c?.toHex?.() ?? c);
85
72
  const toJson = (codec)=>processCodecOrArray(codec, (c)=>c?.toJSON?.() ?? c);
86
- var _value = /*#__PURE__*/ new WeakMap(), _pipeline = /*#__PURE__*/ new WeakMap(), _format = /*#__PURE__*/ new WeakMap(), _message = /*#__PURE__*/ new WeakMap(), _redactOptions = /*#__PURE__*/ new WeakMap(), _redact = /*#__PURE__*/ new WeakSet();
73
+ var _expectFn = /*#__PURE__*/ new WeakMap(), _value = /*#__PURE__*/ new WeakMap(), _pipeline = /*#__PURE__*/ new WeakMap(), _format = /*#__PURE__*/ new WeakMap(), _message = /*#__PURE__*/ new WeakMap(), _redactOptions = /*#__PURE__*/ new WeakMap(), _redact = /*#__PURE__*/ new WeakSet();
87
74
  class Checker {
88
75
  toHuman() {
89
76
  _class_private_field_set(this, _format, 'human');
@@ -158,10 +145,20 @@ class Checker {
158
145
  return value;
159
146
  }
160
147
  async toMatchSnapshot(msg) {
161
- return (0, _vitest.expect)(await this.value()).toMatchSnapshot(msg ?? _class_private_field_get(this, _message));
148
+ return _class_private_field_get(this, _expectFn).call(this, await this.value()).toMatchSnapshot(msg ?? _class_private_field_get(this, _message));
162
149
  }
163
- constructor(value, message){
150
+ async toMatch(value, msg) {
151
+ return _class_private_field_get(this, _expectFn).call(this, await this.value()).toMatch(value, msg ?? _class_private_field_get(this, _message));
152
+ }
153
+ async toMatchObject(value, msg) {
154
+ return _class_private_field_get(this, _expectFn).call(this, await this.value()).toMatchObject(value, msg ?? _class_private_field_get(this, _message));
155
+ }
156
+ constructor(expectFn, value, message){
164
157
  _class_private_method_init(this, _redact);
158
+ _class_private_field_init(this, _expectFn, {
159
+ writable: true,
160
+ value: void 0
161
+ });
165
162
  _class_private_field_init(this, _value, {
166
163
  writable: true,
167
164
  value: void 0
@@ -182,6 +179,7 @@ class Checker {
182
179
  writable: true,
183
180
  value: void 0
184
181
  });
182
+ _class_private_field_set(this, _expectFn, expectFn);
185
183
  _class_private_field_set(this, _value, value);
186
184
  _class_private_field_set(this, _message, message);
187
185
  }
@@ -259,19 +257,30 @@ function redact(value) {
259
257
  };
260
258
  return process(value);
261
259
  }
262
- const check = (value, msg)=>{
263
- if (value instanceof Checker) {
264
- if (msg) {
265
- return value.message(msg);
260
+ const withExpect = (expectFn)=>{
261
+ const check = (value, msg)=>{
262
+ if (value instanceof Checker) {
263
+ if (msg) {
264
+ return value.message(msg);
265
+ }
266
+ return value;
266
267
  }
267
- return value;
268
- }
269
- return new Checker(value, msg);
268
+ return new Checker(expectFn, value, msg);
269
+ };
270
+ const checkEvents = ({ events }, ...filters)=>check(events, 'events').filterEvents(...filters).redact();
271
+ const checkSystemEvents = ({ api }, ...filters)=>check(api.query.system.events(), 'system events').filterEvents(...filters).redact();
272
+ const checkUmp = ({ api })=>check(api.query.parachainSystem.upwardMessages(), 'ump').map((value)=>api.createType('Vec<XcmVersionedXcm>', value).toJSON());
273
+ const checkHrmp = ({ api })=>check(api.query.parachainSystem.hrmpOutboundMessages(), 'hrmp').map((value)=>value.map(({ recipient, data })=>({
274
+ data: api.createType('(XcmpMessageFormat, XcmVersionedXcm)', data).toJSON(),
275
+ recipient
276
+ })));
277
+ const checkHex = (value, msg)=>check(value, msg).toHex();
278
+ return {
279
+ check,
280
+ checkEvents,
281
+ checkSystemEvents,
282
+ checkUmp,
283
+ checkHrmp,
284
+ checkHex
285
+ };
270
286
  };
271
- const checkEvents = ({ events }, ...filters)=>check(events, 'events').filterEvents(...filters).redact();
272
- const checkSystemEvents = ({ api }, ...filters)=>check(api.query.system.events(), 'system events').filterEvents(...filters).redact();
273
- const checkUmp = ({ api })=>check(api.query.parachainSystem.upwardMessages(), 'ump').map((value)=>api.createType('Vec<XcmVersionedXcm>', value).toJSON());
274
- const checkHrmp = ({ api })=>check(api.query.parachainSystem.hrmpOutboundMessages(), 'hrmp').map((value)=>value.map(({ recipient, data })=>({
275
- data: api.createType('(XcmpMessageFormat, XcmVersionedXcm)', data).toJSON(),
276
- recipient
277
- })));
@@ -1,16 +1,2 @@
1
- import { ApiPromise } from '@polkadot/api';
2
- import { Codec } from '@polkadot/types/types';
3
1
  export * from './check.js';
4
2
  export * from '@acala-network/chopsticks-utils';
5
- type CodecOrArray = Codec | Codec[];
6
- export declare const expectJson: (codec: CodecOrArray) => import("@vitest/expect").Assertion<any>;
7
- export declare const expectHex: (codec: CodecOrArray) => import("@vitest/expect").Assertion<any>;
8
- type EventFilter = string | {
9
- method: string;
10
- section: string;
11
- };
12
- export declare const matchEvents: (events: Promise<Codec[] | Codec>, ...filters: EventFilter[]) => Promise<void>;
13
- export declare const matchSystemEvents: ({ api }: {
14
- api: ApiPromise;
15
- }, ...filters: EventFilter[]) => Promise<void>;
16
- export declare const redact: (data: any | Promise<any>) => Promise<any>;
package/dist/cjs/index.js CHANGED
@@ -2,30 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: all[name]
9
- });
10
- }
11
- _export(exports, {
12
- expectHex: function() {
13
- return expectHex;
14
- },
15
- expectJson: function() {
16
- return expectJson;
17
- },
18
- matchEvents: function() {
19
- return matchEvents;
20
- },
21
- matchSystemEvents: function() {
22
- return matchSystemEvents;
23
- },
24
- redact: function() {
25
- return redact;
26
- }
27
- });
28
- const _vitest = require("vitest");
29
5
  _export_star(require("./check.js"), exports);
30
6
  _export_star(require("@acala-network/chopsticks-utils"), exports);
31
7
  function _export_star(from, to) {
@@ -41,77 +17,3 @@ function _export_star(from, to) {
41
17
  });
42
18
  return from;
43
19
  }
44
- const processCodecOrArray = (codec, fn)=>Array.isArray(codec) ? codec.map(fn) : fn(codec);
45
- const toHuman = (codec)=>processCodecOrArray(codec, (c)=>c?.toHuman?.() ?? c);
46
- const toJson = (codec)=>processCodecOrArray(codec, (c)=>c?.toJSON?.() ?? c);
47
- const toHex = (codec)=>processCodecOrArray(codec, (c)=>c?.toHex?.() ?? c);
48
- const expectJson = (codec)=>{
49
- return (0, _vitest.expect)(toJson(codec));
50
- };
51
- const expectHex = (codec)=>{
52
- return (0, _vitest.expect)(toHex(codec));
53
- };
54
- const _matchEvents = async (msg, events, ...filters)=>{
55
- let data = toHuman(await events).map(({ event: { index: _, ...event } })=>event);
56
- if (filters.length > 0) {
57
- const filtersArr = Array.isArray(filters) ? filters : [
58
- filters
59
- ];
60
- data = data.filter((evt)=>{
61
- return filtersArr.some((filter)=>{
62
- if (typeof filter === 'string') {
63
- return evt.section === filter;
64
- }
65
- const { section, method } = filter;
66
- return evt.section === section && evt.method === method;
67
- });
68
- });
69
- }
70
- return (0, _vitest.expect)(data).toMatchSnapshot(msg);
71
- };
72
- const matchEvents = async (events, ...filters)=>{
73
- return _matchEvents('events', redact(events), ...filters);
74
- };
75
- const matchSystemEvents = async ({ api }, ...filters)=>{
76
- await _matchEvents('system events', redact(api.query.system.events()), ...filters);
77
- };
78
- const redact = async (data)=>{
79
- const json = toHuman(await data);
80
- const process = (obj)=>{
81
- if (obj == null) {
82
- return obj;
83
- }
84
- if (Array.isArray(obj)) {
85
- return obj.map(process);
86
- }
87
- if (typeof obj === 'number') {
88
- const rounded = parseFloat(obj.toPrecision(2));
89
- if (rounded === obj) {
90
- return rounded;
91
- }
92
- return `(rounded ${rounded})`;
93
- }
94
- if (typeof obj === 'string') {
95
- if (obj.match(/0x[0-9a-f]{64}/)) {
96
- return '(hash)';
97
- }
98
- if (obj.match(/^[\d,]+$/)) {
99
- const num = parseInt(obj.replace(/,/g, ''));
100
- const rounded = parseFloat(num.toPrecision(2));
101
- if (rounded === num) {
102
- return rounded;
103
- }
104
- return `(rounded ${rounded})`;
105
- }
106
- return obj;
107
- }
108
- if (typeof obj === 'object') {
109
- return Object.fromEntries(Object.entries(obj).map(([k, v])=>[
110
- k,
111
- process(v)
112
- ]));
113
- }
114
- return obj;
115
- };
116
- return process(json);
117
- };
@@ -12,9 +12,14 @@ export type RedactOptions = {
12
12
  redactKeys?: RegExp;
13
13
  removeKeys?: RegExp;
14
14
  };
15
+ export type ExpectFn = (value: any) => {
16
+ toMatchSnapshot: (msg?: string) => void;
17
+ toMatch(value: any, msg?: string): void;
18
+ toMatchObject(value: any, msg?: string): void;
19
+ };
15
20
  export declare class Checker {
16
21
  #private;
17
- constructor(value: any, message?: string);
22
+ constructor(expectFn: ExpectFn, value: any, message?: string);
18
23
  toHuman(): this;
19
24
  toHex(): this;
20
25
  toJson(): this;
@@ -25,15 +30,22 @@ export declare class Checker {
25
30
  pipe(fn?: (value: Checker) => Checker): Checker;
26
31
  value(): Promise<any>;
27
32
  toMatchSnapshot(msg?: string): Promise<void>;
33
+ toMatch(value: any, msg?: string): Promise<void>;
34
+ toMatchObject(value: any, msg?: string): Promise<void>;
28
35
  }
29
- export declare const check: (value: any, msg?: string) => Checker;
30
- type Api = {
31
- api: ApiPromise;
36
+ export declare const withExpect: (expectFn: ExpectFn) => {
37
+ check: (value: any, msg?: string) => Checker;
38
+ checkEvents: ({ events }: {
39
+ events: Promise<Codec[] | Codec>;
40
+ }, ...filters: EventFilter[]) => Checker;
41
+ checkSystemEvents: ({ api }: {
42
+ api: ApiPromise;
43
+ }, ...filters: EventFilter[]) => Checker;
44
+ checkUmp: ({ api }: {
45
+ api: ApiPromise;
46
+ }) => Checker;
47
+ checkHrmp: ({ api }: {
48
+ api: ApiPromise;
49
+ }) => Checker;
50
+ checkHex: (value: any, msg?: string) => Checker;
32
51
  };
33
- export declare const checkEvents: ({ events }: {
34
- events: Promise<Codec[] | Codec>;
35
- }, ...filters: EventFilter[]) => Checker;
36
- export declare const checkSystemEvents: ({ api }: Api, ...filters: EventFilter[]) => Checker;
37
- export declare const checkUmp: ({ api }: Api) => Checker;
38
- export declare const checkHrmp: ({ api }: Api) => Checker;
39
- export {};
package/dist/esm/check.js CHANGED
@@ -1,15 +1,16 @@
1
- import { expect } from 'vitest';
2
1
  const processCodecOrArray = (codec, fn)=>Array.isArray(codec) ? codec.map(fn) : fn(codec);
3
2
  const toHuman = (codec)=>processCodecOrArray(codec, (c)=>c?.toHuman?.() ?? c);
4
3
  const toHex = (codec)=>processCodecOrArray(codec, (c)=>c?.toHex?.() ?? c);
5
4
  const toJson = (codec)=>processCodecOrArray(codec, (c)=>c?.toJSON?.() ?? c);
6
5
  export class Checker {
6
+ #expectFn;
7
7
  #value;
8
8
  #pipeline = [];
9
9
  #format = 'json';
10
10
  #message;
11
11
  #redactOptions;
12
- constructor(value, message){
12
+ constructor(expectFn, value, message){
13
+ this.#expectFn = expectFn;
13
14
  this.#value = value;
14
15
  this.#message = message;
15
16
  }
@@ -159,22 +160,39 @@ export class Checker {
159
160
  return value;
160
161
  }
161
162
  async toMatchSnapshot(msg) {
162
- return expect(await this.value()).toMatchSnapshot(msg ?? this.#message);
163
+ return this.#expectFn(await this.value()).toMatchSnapshot(msg ?? this.#message);
164
+ }
165
+ async toMatch(value, msg) {
166
+ return this.#expectFn(await this.value()).toMatch(value, msg ?? this.#message);
167
+ }
168
+ async toMatchObject(value, msg) {
169
+ return this.#expectFn(await this.value()).toMatchObject(value, msg ?? this.#message);
163
170
  }
164
171
  }
165
- export const check = (value, msg)=>{
166
- if (value instanceof Checker) {
167
- if (msg) {
168
- return value.message(msg);
172
+ export const withExpect = (expectFn)=>{
173
+ const check = (value, msg)=>{
174
+ if (value instanceof Checker) {
175
+ if (msg) {
176
+ return value.message(msg);
177
+ }
178
+ return value;
169
179
  }
170
- return value;
171
- }
172
- return new Checker(value, msg);
180
+ return new Checker(expectFn, value, msg);
181
+ };
182
+ const checkEvents = ({ events }, ...filters)=>check(events, 'events').filterEvents(...filters).redact();
183
+ const checkSystemEvents = ({ api }, ...filters)=>check(api.query.system.events(), 'system events').filterEvents(...filters).redact();
184
+ const checkUmp = ({ api })=>check(api.query.parachainSystem.upwardMessages(), 'ump').map((value)=>api.createType('Vec<XcmVersionedXcm>', value).toJSON());
185
+ const checkHrmp = ({ api })=>check(api.query.parachainSystem.hrmpOutboundMessages(), 'hrmp').map((value)=>value.map(({ recipient, data })=>({
186
+ data: api.createType('(XcmpMessageFormat, XcmVersionedXcm)', data).toJSON(),
187
+ recipient
188
+ })));
189
+ const checkHex = (value, msg)=>check(value, msg).toHex();
190
+ return {
191
+ check,
192
+ checkEvents,
193
+ checkSystemEvents,
194
+ checkUmp,
195
+ checkHrmp,
196
+ checkHex
197
+ };
173
198
  };
174
- export const checkEvents = ({ events }, ...filters)=>check(events, 'events').filterEvents(...filters).redact();
175
- export const checkSystemEvents = ({ api }, ...filters)=>check(api.query.system.events(), 'system events').filterEvents(...filters).redact();
176
- export const checkUmp = ({ api })=>check(api.query.parachainSystem.upwardMessages(), 'ump').map((value)=>api.createType('Vec<XcmVersionedXcm>', value).toJSON());
177
- export const checkHrmp = ({ api })=>check(api.query.parachainSystem.hrmpOutboundMessages(), 'hrmp').map((value)=>value.map(({ recipient, data })=>({
178
- data: api.createType('(XcmpMessageFormat, XcmVersionedXcm)', data).toJSON(),
179
- recipient
180
- })));
@@ -1,16 +1,2 @@
1
- import { ApiPromise } from '@polkadot/api';
2
- import { Codec } from '@polkadot/types/types';
3
1
  export * from './check.js';
4
2
  export * from '@acala-network/chopsticks-utils';
5
- type CodecOrArray = Codec | Codec[];
6
- export declare const expectJson: (codec: CodecOrArray) => import("@vitest/expect").Assertion<any>;
7
- export declare const expectHex: (codec: CodecOrArray) => import("@vitest/expect").Assertion<any>;
8
- type EventFilter = string | {
9
- method: string;
10
- section: string;
11
- };
12
- export declare const matchEvents: (events: Promise<Codec[] | Codec>, ...filters: EventFilter[]) => Promise<void>;
13
- export declare const matchSystemEvents: ({ api }: {
14
- api: ApiPromise;
15
- }, ...filters: EventFilter[]) => Promise<void>;
16
- export declare const redact: (data: any | Promise<any>) => Promise<any>;
package/dist/esm/index.js CHANGED
@@ -1,77 +1,2 @@
1
- import { expect } from 'vitest';
2
1
  export * from './check.js';
3
2
  export * from '@acala-network/chopsticks-utils';
4
- const processCodecOrArray = (codec, fn)=>Array.isArray(codec) ? codec.map(fn) : fn(codec);
5
- const toHuman = (codec)=>processCodecOrArray(codec, (c)=>c?.toHuman?.() ?? c);
6
- const toJson = (codec)=>processCodecOrArray(codec, (c)=>c?.toJSON?.() ?? c);
7
- const toHex = (codec)=>processCodecOrArray(codec, (c)=>c?.toHex?.() ?? c);
8
- export const expectJson = (codec)=>{
9
- return expect(toJson(codec));
10
- };
11
- export const expectHex = (codec)=>{
12
- return expect(toHex(codec));
13
- };
14
- const _matchEvents = async (msg, events, ...filters)=>{
15
- let data = toHuman(await events).map(({ event: { index: _, ...event } })=>event);
16
- if (filters.length > 0) {
17
- const filtersArr = Array.isArray(filters) ? filters : [
18
- filters
19
- ];
20
- data = data.filter((evt)=>{
21
- return filtersArr.some((filter)=>{
22
- if (typeof filter === 'string') {
23
- return evt.section === filter;
24
- }
25
- const { section, method } = filter;
26
- return evt.section === section && evt.method === method;
27
- });
28
- });
29
- }
30
- return expect(data).toMatchSnapshot(msg);
31
- };
32
- export const matchEvents = async (events, ...filters)=>{
33
- return _matchEvents('events', redact(events), ...filters);
34
- };
35
- export const matchSystemEvents = async ({ api }, ...filters)=>{
36
- await _matchEvents('system events', redact(api.query.system.events()), ...filters);
37
- };
38
- export const redact = async (data)=>{
39
- const json = toHuman(await data);
40
- const process = (obj)=>{
41
- if (obj == null) {
42
- return obj;
43
- }
44
- if (Array.isArray(obj)) {
45
- return obj.map(process);
46
- }
47
- if (typeof obj === 'number') {
48
- const rounded = parseFloat(obj.toPrecision(2));
49
- if (rounded === obj) {
50
- return rounded;
51
- }
52
- return `(rounded ${rounded})`;
53
- }
54
- if (typeof obj === 'string') {
55
- if (obj.match(/0x[0-9a-f]{64}/)) {
56
- return '(hash)';
57
- }
58
- if (obj.match(/^[\d,]+$/)) {
59
- const num = parseInt(obj.replace(/,/g, ''));
60
- const rounded = parseFloat(num.toPrecision(2));
61
- if (rounded === num) {
62
- return rounded;
63
- }
64
- return `(rounded ${rounded})`;
65
- }
66
- return obj;
67
- }
68
- if (typeof obj === 'object') {
69
- return Object.fromEntries(Object.entries(obj).map(([k, v])=>[
70
- k,
71
- process(v)
72
- ]));
73
- }
74
- return obj;
75
- };
76
- return process(json);
77
- };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acala-network/chopsticks-testing",
3
- "version": "0.9.5-1",
3
+ "version": "0.9.5-3",
4
4
  "author": "Acala Developers <hello@acala.network>",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -11,13 +11,10 @@
11
11
  "build:esm": "swc ./src --config-file ../../.esmswcrc -d dist/esm && tsc -p tsconfig.json --declarationDir dist/esm"
12
12
  },
13
13
  "dependencies": {
14
- "@acala-network/chopsticks-utils": "0.9.5-1",
14
+ "@acala-network/chopsticks-utils": "0.9.5-3",
15
15
  "@polkadot/api": "^10.10.1",
16
16
  "@polkadot/types": "^10.10.1"
17
17
  },
18
- "peerDependencies": {
19
- "vitest": "*"
20
- },
21
18
  "devDependencies": {
22
19
  "@swc/cli": "0.1.63",
23
20
  "@swc/core": "^1.3.100",