@mirascript/mirascript 0.1.30 → 0.1.32
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/dist/{chunk-NP67IFXU.js → chunk-BMSHG7ON.js} +2 -2
- package/dist/{chunk-XWLR2YT7.js → chunk-MN6Y5AIX.js} +47 -31
- package/dist/chunk-MN6Y5AIX.js.map +6 -0
- package/dist/{chunk-PZXZH3RE.js → chunk-QHPRKCJU.js} +3 -3
- package/dist/{chunk-HCZX65XA.js → chunk-VZGKLLRC.js} +13 -2
- package/dist/chunk-VZGKLLRC.js.map +6 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +8 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/compiler/worker.js +1 -1
- package/dist/helpers/convert/to-format.d.ts.map +1 -1
- package/dist/helpers/convert/to-number.d.ts.map +1 -1
- package/dist/helpers/utils.d.ts +1 -1
- package/dist/helpers/utils.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/subtle.js +3 -3
- package/dist/vm/lib/global/sequence/len.d.ts +1 -1
- package/dist/vm/lib/global/sequence/len.d.ts.map +1 -1
- package/dist/vm/lib/global/to-primitive.d.ts.map +1 -1
- package/dist/vm/operations/compound.d.ts.map +1 -1
- package/dist/vm/types/context.d.ts +2 -2
- package/dist/vm/types/context.d.ts.map +1 -1
- package/dist/vm/types/extern.d.ts +2 -0
- package/dist/vm/types/extern.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/cli/index.ts +3 -2
- package/src/helpers/convert/to-format.ts +10 -8
- package/src/helpers/convert/to-number.ts +5 -6
- package/src/helpers/utils.ts +9 -1
- package/src/vm/lib/global/math-additional.ts +3 -3
- package/src/vm/lib/global/sequence/len.ts +11 -3
- package/src/vm/lib/global/sequence/with.ts +2 -2
- package/src/vm/lib/global/time.ts +5 -5
- package/src/vm/lib/global/to-primitive.ts +2 -1
- package/src/vm/lib/helpers.ts +4 -4
- package/src/vm/operations/compound.ts +7 -6
- package/src/vm/types/context.ts +4 -4
- package/src/vm/types/extern.ts +8 -2
- package/dist/chunk-HCZX65XA.js.map +0 -6
- package/dist/chunk-XWLR2YT7.js.map +0 -6
- /package/dist/{chunk-NP67IFXU.js.map → chunk-BMSHG7ON.js.map} +0 -0
- /package/dist/{chunk-PZXZH3RE.js.map → chunk-QHPRKCJU.js.map} +0 -0
package/dist/cli/index.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/cli/index.ts", "../../src/cli/execute.ts", "../../src/cli/print.ts"],
|
|
4
|
-
"mappings": "
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,UAAU,YAAY;AAC/B,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB,eAAe;;;ACF9C,OAAOA,aAAY;AACnB,OAAOC,oBAAmB;;;ACF1B,OAAO,YAAY;AACnB,OAAO,mBAAmB;AAW1B,IAAM,UAAU,CAAC,cAAc;AAE/B,IAAM,UAAqC;AAAA,EACvC,UAAU;AAAA,EACV,cAAc,UAAU,SAAY,MAAM,OAAO,KAAK,OAAO,aAAa,IAAI,OAAO,KAAK;AAAA,EAC1F,kBAAkB,UAAU,SAAY,CAAC,MAAM,OAAO,KAAK,OAAO,iBAAiB,CAAC,IAAI,OAAO,KAAK;AAAA,EACpG,iBAAiB,UAAU,SAAY,CAAC,MAAM,OAAO,OAAO,OAAO,gBAAgB,CAAC,IAAI,OAAO,OAAO;AAAA,EACtG,sBAAsB,UAChB,SACA,CAAC,GAAG,SAAS;AACT,UAAM,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI;AAC3C,QAAI,MAAM;AACN,aAAO,OAAO,MAAM,OAAO;AAAA,IAC/B,OAAO;AACH,aAAO,IAAI,OAAO,MAAM;AAAA,IAC5B;AAAA,EACJ;AAAA,EACN,uBAAuB,UAAU,SAAY,CAAC,MAAM,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK;AAAA,EACvF,mBAAmB,UAAU,SAAY,CAAC,MAAM,OAAO,YAAY,OAAO,OAAO,CAAC,IAAI,OAAO,YAAY;AAAA,EACzG,mBAAmB,UACb,mBAAW,YACX,CAAC,MAAM,OAAO,KAAK,OAAO,mBAAW,UAAU,CAAC,IAAI,OAAO,KAAK;AAAA,EACtE,iBAAiB,UACX,CAAC,GAAG,OAAOC,aAAY;AACnB,WAAO,mBAAW,UAAU,CAAC,IAAI,MAAMA,SAAQ,gBAAgB,EAAE,OAAmB,OAAOA,QAAO;AAAA,EACtG,IACA,CAAC,GAAG,OAAOA,aAAY;AACnB,WACI,OAAO,QAAQ,OACf,mBAAW,UAAU,CAAC,IACtB,OAAO,QAAQ,QACf,MACAA,SAAQ,gBAAgB,EAAE,OAAmB,OAAOA,QAAO;AAAA,EAEnE;AACV;AAGO,SAAS,MAAM,OAAc,QAAQ,GAAW;AACnD,MAAI,UAAU,QAAW;AACrB,QAAI,QAAS,QAAO;AACpB,WAAO,OAAO,KAAK,OAAO,oBAAoB,OAAO,KAAK;AAAA,EAC9D;AACA,SAAO,UAAU,OAAO,EAAE,GAAG,SAAS,UAAU,MAAM,CAAC;AAC3D;;;ADhDA,MAAM,aAAa,YAAY,aAAa,CAAC,KAAK,WAAW;AACzD,MAAI,WAAW,QAAQ,WAAW,QAAQ,CAAC,QAAQ;AAC/C,WAAO,MAAM,GAAG;AAAA,EACpB;AACA,SAAO;AACX;AAGA,eAAsB,QAClB,QACA,UACA,WACA,UACa;AACb,MAAI;AACA,UAAM,IAAI,MAAM,QAAQ,QAAQ,EAAE,YAAY,WAAW,aAAa,UAAU,WAAW,MAAM,SAAS,CAAC;AAC3G,UAAM,IAAI,EAAE,gBAAgB,SAAS,CAAC;AACtC,QAAI,UAAU;AACV,cAAQ,IAAI,CAAC;AAAA,IACjB,OAAO;AACH,cAAQ,IAAI,MAAM,CAAC,CAAC;AAAA,IACxB;AAAA,EACJ,SAAS,IAAI;AACT,UAAM,EAAE,MAAM,IAAI;AAClB,QAAIC,eAAc,QAAQ;AACtB,cAAQ,MAAMC,QAAO,IAAI,OAAO,QAAQA,QAAO,IAAI,KAAK;AAAA,IAC5D,OAAO;AACH,cAAQ,MAAM,KAAK;AAAA,IACvB;AACA,YAAQ,WAAW;AAAA,EACvB;AACJ;;;ADjCA,OAAO,SAAS,gBAAgB,KAAK,EAAE,MAAM,OAAO;AAIpD,IAAM,kBAAkB;AAExB,IAAO,cAAQ,QACV,KAAK,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,CAAE,EAC/B,QAAQ,IAAI,OAAO,EACnB,YAAY,IAAI,WAAW,EAC3B;AAAA,EACG;AAAA,EACA;AAAA,EACA,CAAC,GAAG,MAAM;AACN,QAAI,EAAE,GAAG,EAAE;AACX,UAAM,IAAI,EAAE,QAAQ,GAAG;AACvB,QAAI,IAAI,GAAG;AACP,QAAE,CAAC,IAAI;AAAA,IACX,OAAO;AACH,YAAM,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK;AAC/B,YAAM,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK;AAClC,UAAI;AACA,cAAM,KAAK,YAAY,WAAW,KAAK,IAAI,EAAE;AAC7C,UAAE,GAAG,IAAI,MAAM;AAAA,MACnB,QAAQ;AACJ,UAAE,GAAG,IAAI;AAAA,MACb;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EACA,CAAC;AACL,EACC,OAAO,kBAAkB,QAAQ,EACjC;AAAA,EACG;AAAA,EACA;AAAA,EACA,CAAC,MAAM;AACH,UAAM,KAAK,OAAO,WAAW,CAAC;AAC9B,QAAI,MAAM,EAAE,KAAK,KAAK,GAAG;AACrB,YAAM,IAAI,qBAAqB,aAAa;AAAA,IAChD;AACA,WAAO;AAAA,EACX;AAAA,EACA;AACJ,EACC,OAAO,iBAAiB,QAAQ,EAChC,OAAO,uBAAuB,QAAQ,EACtC,SAAS,YAAY,6BAA6B,EAClD,OAAO,OAAO,QAAQ,QAAQ;AAC3B,mBAAiB,IAAI,WAAW,gBAAgB;AAChD,MAAI,IAAI,QAAQ,MAAM;AAClB,UAAM,WAAW,CAAC,CAAC,IAAI;AACvB,UAAM,QAAQ,IAAI,MAAM,UAAU,IAAI,UAAU,WAAW,iBAAiB,WAAW;AACvF;AAAA,EACJ;AACA,MAAI,QAAQ;AACR,QAAI;AACA,YAAM,IAAI,MAAM,KAAK,MAAM;AAC3B,UAAI,CAAC,EAAE,OAAO,GAAG;AACb,gBAAQ,MAAM,aAAa,MAAM,EAAE;AACnC,gBAAQ,WAAW;AACnB;AAAA,MACJ;AAAA,IACJ,SAAS,IAAI;AACT,UAAK,GAA6B,SAAS,UAAU;AACjD,gBAAQ,MAAM,YAAY,MAAM,EAAE;AAClC,gBAAQ,WAAW;AAAA,MACvB,WAAY,GAA6B,SAAS,UAAU;AACxD,gBAAQ,MAAM,SAAU,GAA6B,OAAO,EAAE;AAC9D,gBAAQ,WAAW;AAAA,MACvB,OAAO;AACH,gBAAQ,MAAM,aAAc,GAA6B,OAAO,EAAE;AAClE,gBAAQ,WAAW;AAAA,MACvB;AACA;AAAA,IACJ;AACA,UAAM,UAAU,MAAM,SAAS,QAAQ,MAAM;AAC7C,UAAM,WAAW,IAAI,YAAY,OAAO,SAAS,UAAU;AAC3D,UAAM,QAAQ,SAAS,UAAU,IAAI,UAAU,cAAc,MAAM,EAAE,IAAI;AACzE;AAAA,EACJ;AACA,UAAQ,KAAK,EAAE,OAAO,KAAK,CAAC;AAChC,CAAC;",
|
|
5
5
|
"names": ["styles", "supportsColor", "options", "supportsColor", "styles"]
|
|
6
6
|
}
|
package/dist/compiler/worker.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-format.d.ts","sourceRoot":"","sources":["../../../src/helpers/convert/to-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"to-format.d.ts","sourceRoot":"","sources":["../../../src/helpers/convert/to-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAoB/C,kBAAkB;AAClB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAiBhF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-number.d.ts","sourceRoot":"","sources":["../../../src/helpers/convert/to-number.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"to-number.d.ts","sourceRoot":"","sources":["../../../src/helpers/convert/to-number.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAK/C,iBAAiB;AACjB,wBAAgB,QAAQ,CAAC,CAAC,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CA2BlG"}
|
package/dist/helpers/utils.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const isArray: (arg: any) => arg is unknown[];
|
|
2
|
-
export declare const isFinite: (number: unknown) => boolean, isNaN: (number: unknown) => boolean, isInteger: (number: unknown) => boolean, isSafeInteger: (number: unknown) => boolean;
|
|
2
|
+
export declare const isFinite: (number: unknown) => boolean, isNaN: (number: unknown) => boolean, isInteger: (number: unknown) => boolean, isSafeInteger: (number: unknown) => boolean, NotNumber: number, PositiveInfinity: number, NegativeInfinity: number;
|
|
3
3
|
export declare const hasOwn: <Obj extends object, Key extends PropertyKey>(o: Obj, v: Key) => o is Obj & (string extends Key ? {} : number extends Key ? {} : symbol extends Key ? {} : Key extends PropertyKey ? { [key in Key]: unknown; } : {}), keys: {
|
|
4
4
|
(o: object): string[];
|
|
5
5
|
(o: {}): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/helpers/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAQ,OAAO,gCAAU,CAAC;AACjC,eAAO,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/helpers/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAQ,OAAO,gCAAU,CAAC;AACjC,eAAO,MACH,QAAQ,gCACR,KAAK,gCACL,SAAS,gCACT,aAAa,gCACR,SAAS,UACK,gBAAgB,UAChB,gBAAgB,QAC7B,CAAC;AACX,eAAO,MAAQ,MAAM,yNAAE,IAAI;;;GAAE,MAAM;;;;GAAE,OAAO;;;;GAAE,MAAM;;;;;;;;;;;;;GAAE,cAAc,sBAAE,WAAW,2FAAE,cAAc;;;;6BAAW,CAAC;AAC7G,eAAO,MAAQ,KAAK,sBAAY,CAAC;AAEjC;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAGxB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
compile,
|
|
3
3
|
compileSync
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-QHPRKCJU.js";
|
|
5
5
|
import {
|
|
6
6
|
VmExtern,
|
|
7
7
|
VmFunction,
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
defineVmContextValue,
|
|
12
12
|
unwrapFromVmValue,
|
|
13
13
|
wrapToVmValue
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-MN6Y5AIX.js";
|
|
15
15
|
import {
|
|
16
16
|
VmError,
|
|
17
17
|
getVmFunctionInfo,
|
|
@@ -33,7 +33,7 @@ import {
|
|
|
33
33
|
isVmValue,
|
|
34
34
|
isVmWrapper,
|
|
35
35
|
serialize
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-VZGKLLRC.js";
|
|
37
37
|
export {
|
|
38
38
|
VmError,
|
|
39
39
|
VmExtern,
|
package/dist/subtle.js
CHANGED
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
OpCode,
|
|
3
3
|
analyzeGlobalReferences,
|
|
4
4
|
isKeyword
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-BMSHG7ON.js";
|
|
6
6
|
import {
|
|
7
7
|
DefaultVmContext,
|
|
8
8
|
convert_exports,
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
lib,
|
|
12
12
|
operations_exports,
|
|
13
13
|
wrapScript
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-MN6Y5AIX.js";
|
|
15
15
|
import {
|
|
16
16
|
DiagnosticCode,
|
|
17
17
|
constants_exports,
|
|
@@ -29,7 +29,7 @@ import {
|
|
|
29
29
|
serializeRecord,
|
|
30
30
|
serializeRecordKey,
|
|
31
31
|
serializeString
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-VZGKLLRC.js";
|
|
33
33
|
export {
|
|
34
34
|
DefaultVmContext,
|
|
35
35
|
DiagnosticCode,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const len: ((arr: import("../../../index.js").VmValue | undefined) => number) & import("../../helpers.js").VmLibOption & Record<never, never>;
|
|
1
|
+
export declare const len: ((arr: import("../../../types/index.js").VmValue | undefined) => number) & import("../../helpers.js").VmLibOption & Record<never, never>;
|
|
2
2
|
//# sourceMappingURL=len.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"len.d.ts","sourceRoot":"","sources":["../../../../../src/vm/lib/global/sequence/len.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"len.d.ts","sourceRoot":"","sources":["../../../../../src/vm/lib/global/sequence/len.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,GAAG,0IAkBf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-primitive.d.ts","sourceRoot":"","sources":["../../../../src/vm/lib/global/to-primitive.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"to-primitive.d.ts","sourceRoot":"","sources":["../../../../src/vm/lib/global/to-primitive.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,SAAS,ocAerB,CAAC;AAEF,eAAO,MAAM,SAAS,ocAerB,CAAC;AAEF,eAAO,MAAM,UAAU,ocAetB,CAAC;AAEF,eAAO,MAAM,MAAM,qLAYlB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compound.d.ts","sourceRoot":"","sources":["../../../src/vm/operations/compound.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"compound.d.ts","sourceRoot":"","sources":["../../../src/vm/operations/compound.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAQ3E,eAAO,MAAM,GAAG,GAAI,OAAO,KAAK,EAAE,UAAU,KAAK,KAAG,OAoBnD,CAAC;AACF,eAAO,MAAM,OAAO,GAAI,OAAO,KAAK,KAAG,MAOtC,CAAC;AACF,eAAO,MAAM,KAAK,GAAI,OAAO,KAAK,EAAE,SAAS,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,KAAG,QAa7E,CAAC;AACF,eAAO,MAAM,KAAK,GAAI,OAAO,KAAK,EAAE,QAAQ,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,KAAG,QAW5E,CAAC;AACF,eAAO,MAAM,IAAI,GAAI,KAAK,KAAK,EAAE,KAAK,KAAK,KAAG,OAM7C,CAAC;AACF,eAAO,MAAM,IAAI,GAAI,KAAK,KAAK,EAAE,KAAK,KAAK,KAAG,OAa7C,CAAC;AACF,eAAO,MAAM,IAAI,GAAI,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,OAAO,KAAK,KAAG,IAO3D,CAAC;AACF,eAAO,MAAM,SAAS,GAAI,OAAO,KAAK,KAAG,QAAQ,CAAC,OAAO,GAAG,SAAS,CAMpE,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,QAAQ,KAAK,KAAG,QAAQ,GAAG,IAwBxD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,KAAG,QAAQ,CAAC,OAAO,GAAG,SAAS,CAiBvE,CAAC"}
|
|
@@ -27,7 +27,7 @@ export declare const DefaultVmContext: Readonly<VmContext>;
|
|
|
27
27
|
/** 获取用于执行脚本的默认执行上下文 */
|
|
28
28
|
export declare function createVmContext(): Readonly<VmContext>;
|
|
29
29
|
/** 创建用于执行脚本的执行上下文 */
|
|
30
|
-
export declare function createVmContext(vmValues?: VmContextRecord | null, externValues?: Record<string, unknown> | null, describer?: ((key: string) => string | undefined) | null): VmContext;
|
|
31
|
-
/** 创建用于执行脚本的执行上下文 */
|
|
32
30
|
export declare function createVmContext(getter: (key: string) => VmValue | undefined, enumerator?: (() => Iterable<string>) | null, describer?: ((key: string) => string | undefined) | null): VmContext;
|
|
31
|
+
/** 创建用于执行脚本的执行上下文 */
|
|
32
|
+
export declare function createVmContext(vmValues?: VmContextRecord | null, externValues?: Record<string, unknown> | null, describer?: ((key: string) => string | undefined) | null): VmContext;
|
|
33
33
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/vm/types/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAK9D,uBAAuB;AACvB,MAAM,WAAW,SAAS;IACtB,YAAY;IACZ,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;IAC5B,0BAA0B;IAC1B,IAAI,IAAI,SAAS,MAAM,EAAE,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1C;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,oCAAoC;IACpC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B;AACD,uBAAuB;AACvB,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACpD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAgB,CAAC;AAC3E,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAgB,CAAC;AAS/F,qCAAqC;AACrC,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,EAClD,QAAQ,UAAQ,EAChB,WAAW,GAAE,MAAM,GAAG,IAAI,GAAG,SAAqB,GACnD,IAAI,CAcN;AAED,aAAa;AACb,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,SAAS,CAsB/C,CAAC;AAqHH,uBAAuB;AACvB,wBAAgB,eAAe,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;AACvD,qBAAqB;AACrB,wBAAgB,eAAe,CAC3B,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/vm/types/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAK9D,uBAAuB;AACvB,MAAM,WAAW,SAAS;IACtB,YAAY;IACZ,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;IAC5B,0BAA0B;IAC1B,IAAI,IAAI,SAAS,MAAM,EAAE,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1C;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,oCAAoC;IACpC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B;AACD,uBAAuB;AACvB,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACpD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAgB,CAAC;AAC3E,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAgB,CAAC;AAS/F,qCAAqC;AACrC,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,EAClD,QAAQ,UAAQ,EAChB,WAAW,GAAE,MAAM,GAAG,IAAI,GAAG,SAAqB,GACnD,IAAI,CAcN;AAED,aAAa;AACb,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,SAAS,CAsB/C,CAAC;AAqHH,uBAAuB;AACvB,wBAAgB,eAAe,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;AACvD,qBAAqB;AACrB,wBAAgB,eAAe,CAC3B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,EAC5C,UAAU,CAAC,EAAE,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,EAC5C,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,GACzD,SAAS,CAAC;AACb,qBAAqB;AACrB,wBAAgB,eAAe,CAC3B,QAAQ,CAAC,EAAE,eAAe,GAAG,IAAI,EACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAC7C,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,GACzD,SAAS,CAAC"}
|
|
@@ -21,6 +21,8 @@ export declare class VmExtern<const T extends object = object> extends VmWrapper
|
|
|
21
21
|
/** @inheritdoc */
|
|
22
22
|
same(other: VmAny): boolean;
|
|
23
23
|
/** @inheritdoc */
|
|
24
|
+
isArrayLike(): this is VmExtern<ArrayLike<unknown>>;
|
|
25
|
+
/** @inheritdoc */
|
|
24
26
|
toString(useBraces: boolean): string;
|
|
25
27
|
/** @inheritdoc */
|
|
26
28
|
get type(): TypeName;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extern.d.ts","sourceRoot":"","sources":["../../../src/vm/types/extern.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"extern.d.ts","sourceRoot":"","sources":["../../../src/vm/types/extern.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAwBzC,mCAAmC;AACnC,qBAAa,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAGnE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI;gBAD7C,KAAK,EAAE,CAAC,EACC,OAAO,GAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAW;IAKxD,yCAAyC;IACzC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO;IAiBrD,kBAAkB;IAClB,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,SAAS,GAAG,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC;IAIxG,kBAAkB;IACT,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAGlC,kBAAkB;IACT,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK;IAMhC,mCAAmC;IACnC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO;IAMzC,wBAAwB;IACxB,IAAI,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,KAAK;IAerC,kBAAkB;IACT,IAAI,CAAC,oBAAoB,UAAQ,GAAG,MAAM,EAAE;IAqBrD,kBAAkB;IACT,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAIpC,kBAAkB;IAClB,WAAW,IAAI,IAAI,IAAI,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAGnD,kBAAkB;IACT,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM;IAiB7C,kBAAkB;IAClB,IAAa,IAAI,IAAI,QAAQ,CAE5B;IACD,kBAAkB;IAClB,IAAa,GAAG,IAAI,MAAM,CA6BzB;CACJ"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mirascript/mirascript",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.32",
|
|
4
4
|
"author": "CloudPSS",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "An expression based scripting language.",
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
"commander": "^14.0.2",
|
|
37
37
|
"source-map-js": "^1.2.1",
|
|
38
38
|
"supports-color": "^10.2.2",
|
|
39
|
-
"@mirascript/
|
|
40
|
-
"@mirascript/
|
|
39
|
+
"@mirascript/constants": "~0.1.32",
|
|
40
|
+
"@mirascript/bindings": "~0.1.32"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/node": "^25.0.3",
|
package/src/cli/index.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { readFile, stat } from 'node:fs/promises';
|
|
|
3
3
|
import { pathToFileURL } from 'node:url';
|
|
4
4
|
import { InvalidArgumentError, program } from '@commander-js/extra-typings';
|
|
5
5
|
import { execute } from './execute.js';
|
|
6
|
+
import { isNaN, PositiveInfinity } from '../helpers/utils.js';
|
|
6
7
|
import pkg from '#package.json' with { type: 'json' };
|
|
7
8
|
import { compileSync } from '../compiler/index.js';
|
|
8
9
|
import { configCheckpoint, type VmValue } from '../vm/index.js';
|
|
@@ -41,7 +42,7 @@ export default program
|
|
|
41
42
|
'脚本执行超时时间(毫秒,0 表示不超时)',
|
|
42
43
|
(v) => {
|
|
43
44
|
const ms = Number.parseFloat(v);
|
|
44
|
-
if (
|
|
45
|
+
if (isNaN(ms) || ms < 0) {
|
|
45
46
|
throw new InvalidArgumentError('超时时间必须是非负整数');
|
|
46
47
|
}
|
|
47
48
|
return ms;
|
|
@@ -52,7 +53,7 @@ export default program
|
|
|
52
53
|
.option('-e, --eval <script>', '要执行的脚本')
|
|
53
54
|
.argument('[script]', '要执行的脚本文件路径(如果提供了 -e 则忽略此参数)')
|
|
54
55
|
.action(async (script, opt) => {
|
|
55
|
-
configCheckpoint(opt.timeout ||
|
|
56
|
+
configCheckpoint(opt.timeout || PositiveInfinity);
|
|
56
57
|
if (opt.eval != null) {
|
|
57
58
|
const template = !!opt.template;
|
|
58
59
|
await execute(opt.eval, template, opt.variable, template ? 'eval.miratpl' : 'eval.mira');
|
|
@@ -3,18 +3,17 @@ import { isFinite } from '../utils.js';
|
|
|
3
3
|
import { toString } from './to-string.js';
|
|
4
4
|
|
|
5
5
|
/** 渲染数字 */
|
|
6
|
-
function formatNumber(
|
|
7
|
-
if (
|
|
8
|
-
|
|
9
|
-
const s = value.toString();
|
|
6
|
+
function formatNumber(finite: number): string {
|
|
7
|
+
if (finite === 0) return '0';
|
|
8
|
+
const s = finite.toString();
|
|
10
9
|
let ps;
|
|
11
|
-
const abs = Math.abs(
|
|
10
|
+
const abs = Math.abs(finite);
|
|
12
11
|
if (abs >= 1000 || abs < 0.001) {
|
|
13
|
-
const ps1 =
|
|
14
|
-
const ps2 =
|
|
12
|
+
const ps1 = finite.toExponential();
|
|
13
|
+
const ps2 = finite.toExponential(5);
|
|
15
14
|
ps = ps1.length < ps2.length ? ps1 : ps2;
|
|
16
15
|
} else {
|
|
17
|
-
ps =
|
|
16
|
+
ps = finite.toPrecision(6);
|
|
18
17
|
}
|
|
19
18
|
return ps.length < s.length ? ps : s;
|
|
20
19
|
}
|
|
@@ -24,6 +23,9 @@ export function toFormat(value: VmAny, format: string | null | undefined): strin
|
|
|
24
23
|
const f = format == null ? '' : format.trim();
|
|
25
24
|
|
|
26
25
|
if (typeof value == 'number') {
|
|
26
|
+
if (!isFinite(value)) {
|
|
27
|
+
return toString(value, undefined as never);
|
|
28
|
+
}
|
|
27
29
|
if (/^\.\d+$/.test(f)) {
|
|
28
30
|
let digits = Math.trunc(Number(f.slice(1)));
|
|
29
31
|
if (!(digits <= 100)) digits = 100;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { VmAny } from '../../vm/index.js';
|
|
2
2
|
import { VmError } from '../error.js';
|
|
3
3
|
import { display } from '../serialize.js';
|
|
4
|
-
import { isNaN } from '../utils.js';
|
|
5
|
-
const { POSITIVE_INFINITY, NEGATIVE_INFINITY } = Number;
|
|
4
|
+
import { isNaN, NegativeInfinity, NotNumber, PositiveInfinity } from '../utils.js';
|
|
6
5
|
|
|
7
6
|
/** 转换为 number */
|
|
8
7
|
export function toNumber<F = undefined>(value: VmAny, fallback?: F): number | Exclude<F, undefined> {
|
|
@@ -16,20 +15,20 @@ export function toNumber<F = undefined>(value: VmAny, fallback?: F): number | Ex
|
|
|
16
15
|
value = value.trim();
|
|
17
16
|
if (value !== '') {
|
|
18
17
|
if (value === 'inf' || value === '+inf' || value === 'Infinity' || value === '+Infinity') {
|
|
19
|
-
return
|
|
18
|
+
return PositiveInfinity;
|
|
20
19
|
}
|
|
21
20
|
if (value === '-inf' || value === '-Infinity') {
|
|
22
|
-
return
|
|
21
|
+
return NegativeInfinity;
|
|
23
22
|
}
|
|
24
23
|
if (value === 'nan' || value === 'NaN') {
|
|
25
|
-
return
|
|
24
|
+
return NotNumber;
|
|
26
25
|
}
|
|
27
26
|
const num = Number(value);
|
|
28
27
|
if (!isNaN(num)) return num;
|
|
29
28
|
}
|
|
30
29
|
}
|
|
31
30
|
if (fallback === undefined) {
|
|
32
|
-
throw new VmError(`Failed to convert value to number: ${display(value)}`,
|
|
31
|
+
throw new VmError(`Failed to convert value to number: ${display(value)}`, NotNumber);
|
|
33
32
|
}
|
|
34
33
|
return fallback as Exclude<F, undefined>;
|
|
35
34
|
}
|
package/src/helpers/utils.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
export const { isArray } = Array;
|
|
2
|
-
export const {
|
|
2
|
+
export const {
|
|
3
|
+
isFinite,
|
|
4
|
+
isNaN,
|
|
5
|
+
isInteger,
|
|
6
|
+
isSafeInteger,
|
|
7
|
+
NaN: NotNumber,
|
|
8
|
+
POSITIVE_INFINITY: PositiveInfinity,
|
|
9
|
+
NEGATIVE_INFINITY: NegativeInfinity,
|
|
10
|
+
} = Number;
|
|
3
11
|
export const { hasOwn, keys, values, entries, create, getPrototypeOf, fromEntries, defineProperty } = Object;
|
|
4
12
|
export const { apply } = Reflect;
|
|
5
13
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable no-loss-of-precision */
|
|
2
|
-
import { isInteger, isNaN } from '../../../helpers/utils.js';
|
|
2
|
+
import { isInteger, isNaN, NotNumber, PositiveInfinity } from '../../../helpers/utils.js';
|
|
3
3
|
import { expectNumber, VmLib } from '../helpers.js';
|
|
4
4
|
const { sqrt, pow, exp } = Math;
|
|
5
5
|
|
|
@@ -18,8 +18,8 @@ const SQRT_2_PI = sqrt(2 * Math.PI);
|
|
|
18
18
|
export const factorial = VmLib(
|
|
19
19
|
(x): number => {
|
|
20
20
|
let n = expectNumber('x', x);
|
|
21
|
-
if (isNaN(n) || n < 0) return
|
|
22
|
-
if (n >= 171) return
|
|
21
|
+
if (isNaN(n) || n < 0) return NotNumber;
|
|
22
|
+
if (n >= 171) return PositiveInfinity; // will overflow
|
|
23
23
|
|
|
24
24
|
if (isInteger(n)) {
|
|
25
25
|
if (n === 0 || n === 1) return 1;
|
|
@@ -1,14 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { NotNumber } from '../../../../helpers/utils.js';
|
|
2
|
+
import { isVmExtern } from '../../../types/index.js';
|
|
3
|
+
import { VmLib, expectArray, throwUnexpectedTypeError } from '../../helpers.js';
|
|
2
4
|
|
|
3
5
|
export const len = VmLib(
|
|
4
6
|
(arr) => {
|
|
5
|
-
|
|
7
|
+
if (isVmExtern(arr)) {
|
|
8
|
+
if (!arr.isArrayLike()) {
|
|
9
|
+
throwUnexpectedTypeError('arr', 'array-like extern', arr, NotNumber);
|
|
10
|
+
}
|
|
11
|
+
return arr.value.length;
|
|
12
|
+
}
|
|
13
|
+
expectArray('arr', arr, NotNumber);
|
|
6
14
|
return arr.length;
|
|
7
15
|
},
|
|
8
16
|
{
|
|
9
17
|
summary: '返回数组的长度',
|
|
10
18
|
params: { arr: '要求长度的数组' },
|
|
11
|
-
paramsType: { arr: 'array' },
|
|
19
|
+
paramsType: { arr: 'array | extern' },
|
|
12
20
|
returnsType: 'number',
|
|
13
21
|
examples: ['len([1, 2, 3]) // 3'],
|
|
14
22
|
},
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { VM_ARRAY_MAX_LENGTH } from '../../../../helpers/constants.js';
|
|
2
2
|
import { toNumber, toString } from '../../../../helpers/convert/index.js';
|
|
3
3
|
import { isVmArray, isVmRecord } from '../../../../helpers/types.js';
|
|
4
|
-
import { isArray, isInteger, isNaN } from '../../../../helpers/utils.js';
|
|
4
|
+
import { isArray, isInteger, isNaN, NotNumber } from '../../../../helpers/utils.js';
|
|
5
5
|
import { $El } from '../../../operations/helpers.js';
|
|
6
6
|
import type { VmArray, VmConst, VmValue } from '../../../types/index.js';
|
|
7
7
|
import { VmLib, expectArrayOrRecord, expectConst, throwError } from '../../helpers.js';
|
|
8
8
|
|
|
9
9
|
const arrIndex = (index: NonNullable<VmConst>): number => {
|
|
10
|
-
const idx = Math.trunc(toNumber(index,
|
|
10
|
+
const idx = Math.trunc(toNumber(index, NotNumber));
|
|
11
11
|
if (isNaN(idx) || idx < 0) {
|
|
12
12
|
throwError('Array index must be a non-negative integer', index);
|
|
13
13
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describeParam, expectNumberRange, throwError, throwUnexpectedTypeError, VmLib } from '../helpers.js';
|
|
2
|
-
import { isNaN, isFinite } from '../../../helpers/utils.js';
|
|
2
|
+
import { isNaN, NotNumber, isFinite } from '../../../helpers/utils.js';
|
|
3
3
|
import { toNumber } from '../../../helpers/convert/to-number.js';
|
|
4
4
|
import { display } from '../../../helpers/serialize.js';
|
|
5
5
|
import type { VmAny } from '../../types/index.js';
|
|
@@ -8,7 +8,7 @@ const fromNumber = (datetime: number, fallback: boolean): number | null => {
|
|
|
8
8
|
const n = new Date(datetime).getTime();
|
|
9
9
|
if (isFinite(n)) return n;
|
|
10
10
|
if (fallback) return null;
|
|
11
|
-
throwError(`${describeParam('datetime')} is an invalid timestamp: ${display(datetime)}`,
|
|
11
|
+
throwError(`${describeParam('datetime')} is an invalid timestamp: ${display(datetime)}`, NotNumber);
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
const getTimestamp = (datetime: VmAny, fallback: boolean): number | null => {
|
|
@@ -20,16 +20,16 @@ const getTimestamp = (datetime: VmAny, fallback: boolean): number | null => {
|
|
|
20
20
|
}
|
|
21
21
|
if (typeof datetime != 'string') {
|
|
22
22
|
if (fallback) return null;
|
|
23
|
-
throwUnexpectedTypeError('datetime', 'number | string', datetime,
|
|
23
|
+
throwUnexpectedTypeError('datetime', 'number | string', datetime, NotNumber);
|
|
24
24
|
}
|
|
25
|
-
const num = toNumber(datetime,
|
|
25
|
+
const num = toNumber(datetime, NotNumber);
|
|
26
26
|
if (!isNaN(num)) {
|
|
27
27
|
return fromNumber(num, fallback);
|
|
28
28
|
}
|
|
29
29
|
const parsed = Date.parse(datetime);
|
|
30
30
|
if (isFinite(parsed)) return parsed;
|
|
31
31
|
if (fallback) return null;
|
|
32
|
-
throwError(`${describeParam('datetime')} cannot be parsed as datetime: ${display(datetime)}`,
|
|
32
|
+
throwError(`${describeParam('datetime')} cannot be parsed as datetime: ${display(datetime)}`, NotNumber);
|
|
33
33
|
};
|
|
34
34
|
|
|
35
35
|
export const to_timestamp = VmLib(
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { toBoolean, toFormat, toNumber, toString } from '../../../helpers/convert/index.js';
|
|
2
|
+
import { NotNumber } from '../../../helpers/utils.js';
|
|
2
3
|
import { expectString, required, VmLib } from '../helpers.js';
|
|
3
4
|
|
|
4
5
|
export const to_string = VmLib(
|
|
@@ -20,7 +21,7 @@ export const to_string = VmLib(
|
|
|
20
21
|
|
|
21
22
|
export const to_number = VmLib(
|
|
22
23
|
(data, fallback) => {
|
|
23
|
-
required('data', data,
|
|
24
|
+
required('data', data, NotNumber);
|
|
24
25
|
return toNumber(data, fallback);
|
|
25
26
|
},
|
|
26
27
|
{
|
package/src/vm/lib/helpers.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Writable } from 'type-fest';
|
|
2
2
|
import { VM_ARRAY_MAX_LENGTH } from '../../helpers/constants.js';
|
|
3
|
-
import { isNaN, entries, fromEntries, isSafeInteger, isFinite } from '../../helpers/utils.js';
|
|
3
|
+
import { isNaN, NotNumber, entries, fromEntries, isSafeInteger, isFinite } from '../../helpers/utils.js';
|
|
4
4
|
import { toBoolean, toNumber, toString } from '../../helpers/convert/index.js';
|
|
5
5
|
import { display } from '../../helpers/serialize.js';
|
|
6
6
|
import { isVmArray, isVmFunction, isVmPrimitive, isVmConst, isVmCallable, isVmRecord } from '../../helpers/types.js';
|
|
@@ -75,10 +75,10 @@ export function required<const T = VmValue>(
|
|
|
75
75
|
|
|
76
76
|
/** 标记并转换参数为数字 */
|
|
77
77
|
export function expectNumber(name: ParamIndex, value: VmAny): number {
|
|
78
|
-
required(name, value,
|
|
78
|
+
required(name, value, NotNumber);
|
|
79
79
|
const v = toNumber(value, null);
|
|
80
80
|
if (v == null) {
|
|
81
|
-
throwUnconvertedTypeError(name, 'number', value,
|
|
81
|
+
throwUnconvertedTypeError(name, 'number', value, NotNumber);
|
|
82
82
|
}
|
|
83
83
|
return v;
|
|
84
84
|
}
|
|
@@ -86,7 +86,7 @@ export function expectNumber(name: ParamIndex, value: VmAny): number {
|
|
|
86
86
|
export function expectNumberRange(name: ParamIndex, value: VmAny, min: number, max: number): number {
|
|
87
87
|
const v = expectNumber(name, value);
|
|
88
88
|
if (!isFinite(v)) {
|
|
89
|
-
throwError(`${describeParam(name)} is not a finite number: ${display(value)}`,
|
|
89
|
+
throwError(`${describeParam(name)} is not a finite number: ${display(value)}`, NotNumber);
|
|
90
90
|
}
|
|
91
91
|
if (v < min) {
|
|
92
92
|
throwError(`${describeParam(name)} is less than minimum value ${min}: ${display(value)}`, min);
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { VmError } from '../../helpers/error.js';
|
|
2
|
-
import { hasOwnEnumerable, isNaN, keys, create } from '../../helpers/utils.js';
|
|
3
|
-
import { toString } from '../../helpers/convert/index.js';
|
|
2
|
+
import { hasOwnEnumerable, isNaN, NotNumber, keys, create } from '../../helpers/utils.js';
|
|
3
|
+
import { toNumber, toString } from '../../helpers/convert/index.js';
|
|
4
4
|
import { display } from '../../helpers/serialize.js';
|
|
5
5
|
import { isVmPrimitive, isVmArray, isVmRecord, isVmFunction, isVmExtern, isVmWrapper } from '../../helpers/types.js';
|
|
6
|
-
import type { VmAny,
|
|
6
|
+
import type { VmAny, VmRecord, VmValue, VmConst } from '../types/index.js';
|
|
7
7
|
import { isSame } from './utils.js';
|
|
8
8
|
import { $AssertInit } from './common.js';
|
|
9
|
-
import { $
|
|
9
|
+
import { $ToString } from './convert.js';
|
|
10
10
|
|
|
11
11
|
const { trunc } = Math;
|
|
12
12
|
const { at } = Array.prototype;
|
|
@@ -76,7 +76,8 @@ export const $Has = (obj: VmAny, key: VmAny): boolean => {
|
|
|
76
76
|
export const $Get = (obj: VmAny, key: VmAny): VmValue => {
|
|
77
77
|
$AssertInit(obj);
|
|
78
78
|
if (isVmArray(obj)) {
|
|
79
|
-
|
|
79
|
+
$AssertInit(key);
|
|
80
|
+
const index = toNumber(key, NotNumber);
|
|
80
81
|
if (isNaN(index)) return null;
|
|
81
82
|
return (at.call(obj, trunc(index)) as VmConst | undefined) ?? null;
|
|
82
83
|
}
|
|
@@ -84,7 +85,7 @@ export const $Get = (obj: VmAny, key: VmAny): VmValue => {
|
|
|
84
85
|
if (obj == null || typeof obj != 'object') return null;
|
|
85
86
|
if (isVmWrapper(obj)) return obj.get(pk) ?? null;
|
|
86
87
|
if (!hasOwnEnumerable(obj, pk)) return null;
|
|
87
|
-
return
|
|
88
|
+
return obj[pk] ?? null;
|
|
88
89
|
};
|
|
89
90
|
export const $Set = (obj: VmAny, key: VmAny, value: VmAny): void => {
|
|
90
91
|
$AssertInit(obj);
|
package/src/vm/types/context.ts
CHANGED
|
@@ -200,14 +200,14 @@ freeze(FactoryVmContext.prototype);
|
|
|
200
200
|
export function createVmContext(): Readonly<VmContext>;
|
|
201
201
|
/** 创建用于执行脚本的执行上下文 */
|
|
202
202
|
export function createVmContext(
|
|
203
|
-
|
|
204
|
-
|
|
203
|
+
getter: (key: string) => VmValue | undefined,
|
|
204
|
+
enumerator?: (() => Iterable<string>) | null,
|
|
205
205
|
describer?: ((key: string) => string | undefined) | null,
|
|
206
206
|
): VmContext;
|
|
207
207
|
/** 创建用于执行脚本的执行上下文 */
|
|
208
208
|
export function createVmContext(
|
|
209
|
-
|
|
210
|
-
|
|
209
|
+
vmValues?: VmContextRecord | null,
|
|
210
|
+
externValues?: Record<string, unknown> | null,
|
|
211
211
|
describer?: ((key: string) => string | undefined) | null,
|
|
212
212
|
): VmContext;
|
|
213
213
|
|
package/src/vm/types/extern.ts
CHANGED
|
@@ -14,6 +14,8 @@ const ObjectToString = ObjectPrototype.toString;
|
|
|
14
14
|
const FunctionToString = Function.prototype.toString;
|
|
15
15
|
const ArrayToString = Array.prototype.toString;
|
|
16
16
|
const ArrayMap = Array.prototype.map;
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
18
|
+
const TypedArrayToString = Uint8Array.prototype.toString;
|
|
17
19
|
|
|
18
20
|
/** 获取类的名称,如果无法确定则返回 null */
|
|
19
21
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
@@ -120,13 +122,17 @@ export class VmExtern<const T extends object = object> extends VmWrapper<T> {
|
|
|
120
122
|
return this.value === other.value && this.thisArg === other.thisArg;
|
|
121
123
|
}
|
|
122
124
|
/** @inheritdoc */
|
|
125
|
+
isArrayLike(): this is VmExtern<ArrayLike<unknown>> {
|
|
126
|
+
return isArray(this.value) || (ArrayBuffer.isView(this.value) && 'length' in this.value);
|
|
127
|
+
}
|
|
128
|
+
/** @inheritdoc */
|
|
123
129
|
override toString(useBraces: boolean): string {
|
|
124
130
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
125
131
|
const { toString } = this.value;
|
|
126
132
|
if (typeof toString != 'function' || toString === ObjectToString || toString === FunctionToString) {
|
|
127
133
|
return super.toString(useBraces);
|
|
128
134
|
}
|
|
129
|
-
if (toString === ArrayToString &&
|
|
135
|
+
if ((toString === ArrayToString || toString === TypedArrayToString) && this.isArrayLike()) {
|
|
130
136
|
const mapped = ArrayMap.call(this.value, (item: unknown) => {
|
|
131
137
|
if (item === undefined) return '';
|
|
132
138
|
return innerToString(wrapToVmValue(item ?? null, null, null), true);
|
|
@@ -144,7 +150,7 @@ export class VmExtern<const T extends object = object> extends VmWrapper<T> {
|
|
|
144
150
|
/** @inheritdoc */
|
|
145
151
|
override get tag(): string {
|
|
146
152
|
const tag = ObjectToString.call(this.value).slice(8, -1);
|
|
147
|
-
if (
|
|
153
|
+
if (this.isArrayLike()) {
|
|
148
154
|
return `${tag}(${this.value.length})`;
|
|
149
155
|
} else if (tag === 'Object') {
|
|
150
156
|
const proto = getPrototypeOf(this.value);
|