@mirascript/mirascript 0.1.39 → 0.1.40

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.
@@ -3585,8 +3585,6 @@ export {
3585
3585
  reportDiagnostic,
3586
3586
  emitScript,
3587
3587
  VmModule,
3588
- debug_print,
3589
- panic,
3590
3588
  lib
3591
3589
  };
3592
- //# sourceMappingURL=chunk-EOF4KUT4.js.map
3590
+ //# sourceMappingURL=chunk-SXCYD4OW.js.map
package/dist/index.js CHANGED
@@ -1,20 +1,25 @@
1
1
  import {
2
- compile,
3
- compileSync
4
- } from "./chunk-V5SL3PMV.js";
5
- import {
2
+ $GlobalFallback,
6
3
  VmExtern,
7
4
  VmFunction,
8
5
  VmModule,
9
6
  configCheckpoint,
7
+ createScript,
10
8
  createVmContext,
11
9
  defineVmContextValue,
10
+ emitScript,
11
+ reportDiagnostic,
12
12
  unwrapFromVmValue,
13
+ wrapScript,
13
14
  wrapToVmValue
14
- } from "./chunk-EOF4KUT4.js";
15
+ } from "./chunk-SXCYD4OW.js";
15
16
  import {
16
17
  VmError,
18
+ defineProperty,
19
+ generateBytecode,
20
+ generateBytecodeSync,
17
21
  getVmFunctionInfo,
22
+ isFinite,
18
23
  isVmAny,
19
24
  isVmArray,
20
25
  isVmArrayLikeRecord,
@@ -34,6 +39,175 @@ import {
34
39
  isVmWrapper,
35
40
  serialize
36
41
  } from "./chunk-GBWG7BQZ.js";
42
+
43
+ // src/compiler/compile-fast.ts
44
+ import { isKeyword } from "@mirascript/constants";
45
+ var REG_NUMBER_FULL = /^(?:[+-])?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?$/;
46
+ var REG_IDENTIFIER_FAST = /^(?:\$+|@+|[A-Za-z])[a-zA-Z0-9_]*$/;
47
+ var FAST_SCRIPT_MAX_LEN = 32;
48
+ function constantFiniteNumber(value) {
49
+ if (value === 0) {
50
+ if (Object.is(value, -0)) {
51
+ return () => -0;
52
+ } else {
53
+ return () => 0;
54
+ }
55
+ }
56
+ const f = () => value;
57
+ defineProperty(f, "toString", {
58
+ value: () => {
59
+ return `() => ${value};`;
60
+ },
61
+ writable: false,
62
+ enumerable: false,
63
+ configurable: false
64
+ });
65
+ return f;
66
+ }
67
+ function constantString(value) {
68
+ const f = () => value;
69
+ defineProperty(f, "toString", {
70
+ value: () => {
71
+ return `() => ${JSON.stringify(value)};`;
72
+ },
73
+ writable: false,
74
+ enumerable: false,
75
+ configurable: false
76
+ });
77
+ return f;
78
+ }
79
+ function nan() {
80
+ return () => 0 / 0;
81
+ }
82
+ function posInf() {
83
+ return () => 1 / 0;
84
+ }
85
+ function negInf() {
86
+ return () => -1 / 0;
87
+ }
88
+ function constantBoolean(value) {
89
+ if (value) {
90
+ return () => true;
91
+ } else {
92
+ return () => false;
93
+ }
94
+ }
95
+ function nil() {
96
+ return () => null;
97
+ }
98
+ function globalVariable(id) {
99
+ const f = (global) => (global ?? $GlobalFallback()).get(id);
100
+ defineProperty(f, "toString", {
101
+ value: () => {
102
+ return `(global) => (global ?? $GlobalFallback()).get(${JSON.stringify(id)});`;
103
+ },
104
+ writable: false,
105
+ enumerable: false,
106
+ configurable: false
107
+ });
108
+ return f;
109
+ }
110
+ function compileScriptFast(code) {
111
+ if (code.length > FAST_SCRIPT_MAX_LEN) return void 0;
112
+ const trimmedCode = code.trim();
113
+ if (!trimmedCode) {
114
+ return wrapScript(code, "Script", nil());
115
+ }
116
+ switch (trimmedCode) {
117
+ case "nil":
118
+ return wrapScript(code, "Script", nil());
119
+ case "true":
120
+ return wrapScript(code, "Script", constantBoolean(true));
121
+ case "false":
122
+ return wrapScript(code, "Script", constantBoolean(false));
123
+ case "nan":
124
+ return wrapScript(code, "Script", nan());
125
+ case "inf":
126
+ case "+inf":
127
+ return wrapScript(code, "Script", posInf());
128
+ case "-inf":
129
+ return wrapScript(code, "Script", negInf());
130
+ }
131
+ if (REG_IDENTIFIER_FAST.test(trimmedCode)) {
132
+ const id = trimmedCode;
133
+ if (isKeyword(id)) {
134
+ return void 0;
135
+ }
136
+ return wrapScript(code, "Script", globalVariable(id));
137
+ }
138
+ if (REG_NUMBER_FULL.test(trimmedCode)) {
139
+ const num = Number(trimmedCode);
140
+ if (!isFinite(num)) return void 0;
141
+ return wrapScript(code, "Script", constantFiniteNumber(num));
142
+ }
143
+ return void 0;
144
+ }
145
+ var FAST_TEMPLATE_MAX_LEN = 1024;
146
+ function compileTemplateFast(code) {
147
+ if (code.length > FAST_TEMPLATE_MAX_LEN) return void 0;
148
+ if (!code.includes("$")) {
149
+ return wrapScript(code, "Template", constantString(code));
150
+ }
151
+ return void 0;
152
+ }
153
+ function compileFast(code, options) {
154
+ if (options.sourceMap) return void 0;
155
+ return (options.input_mode === "Template" ? compileTemplateFast : compileScriptFast)(code);
156
+ }
157
+
158
+ // src/compiler/worker-manager.ts
159
+ import { WorkerPool } from "@cloudpss/worker/pool";
160
+ var pool = /* @__PURE__ */ new WorkerPool(
161
+ () => {
162
+ return new Worker(new URL("#compiler/worker", import.meta.url), {
163
+ type: "module",
164
+ name: "@mirascript/compiler"
165
+ });
166
+ },
167
+ {
168
+ name: "@mirascript/compiler"
169
+ }
170
+ );
171
+ async function compileWorker(...args) {
172
+ return await pool.call("compile", args);
173
+ }
174
+
175
+ // src/compiler/index.ts
176
+ var WORKER_MIN_LEN = typeof Worker != "function" ? Number.MAX_VALUE : 1024;
177
+ function getOptions(options) {
178
+ options ??= {};
179
+ if (options.sourceMap) {
180
+ options.diagnostic_sourcemap = true;
181
+ options.diagnostic_position_encoding ??= "Utf16";
182
+ }
183
+ options.input_mode ??= "Script";
184
+ return options;
185
+ }
186
+ async function compile(source, options) {
187
+ options = getOptions(options);
188
+ if (typeof source == "string") {
189
+ const result = compileFast(source, options);
190
+ if (result) return result;
191
+ }
192
+ if (source.length < WORKER_MIN_LEN) {
193
+ const bc = await generateBytecode(source, options);
194
+ return emitScript(source, bc, options);
195
+ }
196
+ const [target, diagnostics] = await compileWorker(source, options);
197
+ if (target == null) {
198
+ reportDiagnostic(source, diagnostics, options.fileName);
199
+ }
200
+ return createScript(source, options.input_mode ?? "Script", target);
201
+ }
202
+ function compileSync(source, options) {
203
+ options = getOptions(options);
204
+ if (typeof source == "string") {
205
+ const result = compileFast(source, options);
206
+ if (result) return result;
207
+ }
208
+ const bc = generateBytecodeSync(source, options);
209
+ return emitScript(source, bc, options);
210
+ }
37
211
  export {
38
212
  VmError,
39
213
  VmExtern,
package/dist/index.js.map CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": [],
4
- "mappings": "",
3
+ "sources": ["../src/compiler/compile-fast.ts", "../src/compiler/worker-manager.ts", "../src/compiler/index.ts"],
4
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,iBAAiB;AAM1B,IAAM,kBAAkB;AAExB,IAAM,sBAAsB;AAU5B,IAAM,sBAAsB;AAG5B,SAAS,qBAAqB,OAA6B;AACvD,MAAI,UAAU,GAAG;AACb,QAAI,OAAO,GAAG,OAAO,EAAE,GAAG;AACtB,aAAO,MAAM;AAAA,IACjB,OAAO;AACH,aAAO,MAAM;AAAA,IACjB;AAAA,EACJ;AACA,QAAM,IAAI,MAAM;AAChB,iBAAe,GAAG,YAAY;AAAA,IAC1B,OAAO,MAAM;AACT,aAAO,SAAS,KAAK;AAAA,IACzB;AAAA,IACA,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,EAClB,CAAC;AACD,SAAO;AACX;AAEA,SAAS,eAAe,OAA6B;AACjD,QAAM,IAAI,MAAM;AAChB,iBAAe,GAAG,YAAY;AAAA,IAC1B,OAAO,MAAM;AACT,aAAO,SAAS,KAAK,UAAU,KAAK,CAAC;AAAA,IACzC;AAAA,IACA,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,EAClB,CAAC;AACD,SAAO;AACX;AAEA,SAAS,MAAoB;AACzB,SAAO,MAAM,IAAI;AACrB;AAGA,SAAS,SAAuB;AAC5B,SAAO,MAAM,IAAK;AACtB;AAGA,SAAS,SAAuB;AAC5B,SAAO,MAAM,KAAK;AACtB;AAGA,SAAS,gBAAgB,OAA+B;AACpD,MAAI,OAAO;AACP,WAAO,MAAM;AAAA,EACjB,OAAO;AACH,WAAO,MAAM;AAAA,EACjB;AACJ;AAGA,SAAS,MAAkB;AACvB,SAAO,MAAM;AACjB;AAGA,SAAS,eAAe,IAA0B;AAC9C,QAAM,IAAkB,CAAC,YAAY,UAAU,gBAAgB,GAAG,IAAI,EAAE;AACxE,iBAAe,GAAG,YAAY;AAAA,IAC1B,OAAO,MAAM;AACT,aAAO,iDAAiD,KAAK,UAAU,EAAE,CAAC;AAAA,IAC9E;AAAA,IACA,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,EAClB,CAAC;AACD,SAAO;AACX;AAKA,SAAS,kBAAkB,MAAoC;AAC3D,MAAI,KAAK,SAAS,oBAAqB,QAAO;AAC9C,QAAM,cAAc,KAAK,KAAK;AAC9B,MAAI,CAAC,aAAa;AACd,WAAO,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,EAC3C;AACA,UAAQ,aAAa;AAAA,IACjB,KAAK;AACD,aAAO,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,IAC3C,KAAK;AACD,aAAO,WAAW,MAAM,UAAU,gBAAgB,IAAI,CAAC;AAAA,IAC3D,KAAK;AACD,aAAO,WAAW,MAAM,UAAU,gBAAgB,KAAK,CAAC;AAAA,IAC5D,KAAK;AACD,aAAO,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,IAC3C,KAAK;AAAA,IACL,KAAK;AACD,aAAO,WAAW,MAAM,UAAU,OAAO,CAAC;AAAA,IAC9C,KAAK;AACD,aAAO,WAAW,MAAM,UAAU,OAAO,CAAC;AAAA,EAClD;AACA,MAAI,oBAAoB,KAAK,WAAW,GAAG;AAEvC,UAAM,KAAK;AACX,QAAI,UAAU,EAAE,GAAG;AACf,aAAO;AAAA,IACX;AACA,WAAO,WAAW,MAAM,UAAU,eAAe,EAAE,CAAC;AAAA,EACxD;AACA,MAAI,gBAAgB,KAAK,WAAW,GAAG;AACnC,UAAM,MAAM,OAAO,WAAW;AAC9B,QAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAE3B,WAAO,WAAW,MAAM,UAAU,qBAAqB,GAAG,CAAC;AAAA,EAC/D;AACA,SAAO;AACX;AAEA,IAAM,wBAAwB;AAK9B,SAAS,oBAAoB,MAAoC;AAC7D,MAAI,KAAK,SAAS,sBAAuB,QAAO;AAEhD,MAAI,CAAC,KAAK,SAAS,GAAG,GAAG;AAErB,WAAO,WAAW,MAAM,YAAY,eAAe,IAAI,CAAC;AAAA,EAC5D;AACA,SAAO;AACX;AAKO,SAAS,YAAY,MAAc,SAAiD;AACvF,MAAI,QAAQ,UAAW,QAAO;AAC9B,UAAQ,QAAQ,eAAe,aAAa,sBAAsB,mBAAmB,IAAI;AAC7F;;;AC9JA,SAAS,kBAAqC;AAG9C,IAAM,OAAqB,oBAAI;AAAA,EAC3B,MAAM;AACF,WAAO,IAAI,OAAO,IAAI,IAAI,oBAAoB,YAAY,GAAG,GAAG;AAAA,MAC5D,MAAM;AAAA,MACN,MAAM;AAAA,IACV,CAAC;AAAA,EACL;AAAA,EACA;AAAA,IACI,MAAM;AAAA,EACV;AACJ;AAKA,eAAsB,iBACf,MAC2D;AAC9D,SAAO,MAAM,KAAK,KAAK,WAAW,IAAI;AAC1C;;;ACVA,IAAM,iBAAiB,OAAO,UAAU,aAAa,OAAO,YAAY;AAGxE,SAAS,WAAW,SAAyD;AACzE,cAAY,CAAC;AACb,MAAI,QAAQ,WAAW;AACnB,YAAQ,uBAAuB;AAE/B,YAAQ,iCAAiC;AAAA,EAC7C;AACA,UAAQ,eAAe;AACvB,SAAO;AACX;AAKA,eAAsB,QAAoB,QAAqB,SAA+C;AAC1G,YAAU,WAAW,OAAO;AAC5B,MAAI,OAAO,UAAU,UAAU;AAC3B,UAAM,SAAS,YAAY,QAAQ,OAAO;AAC1C,QAAI,OAAQ,QAAO;AAAA,EACvB;AACA,MAAI,OAAO,SAAS,gBAAgB;AAChC,UAAM,KAAK,MAAM,iBAAiB,QAAQ,OAAO;AACjD,WAAO,WAAW,QAAQ,IAAI,OAAO;AAAA,EACzC;AACA,QAAM,CAAC,QAAQ,WAAW,IAAI,MAAM,cAAc,QAAQ,OAAO;AACjE,MAAI,UAAU,MAAM;AAChB,qBAAiB,QAAQ,aAAa,QAAQ,QAAQ;AAAA,EAC1D;AACA,SAAO,aAAa,QAAQ,QAAQ,cAAc,UAAU,MAAM;AACtE;AAIO,SAAS,YAAwB,QAAqB,SAAsC;AAC/F,YAAU,WAAW,OAAO;AAC5B,MAAI,OAAO,UAAU,UAAU;AAC3B,UAAM,SAAS,YAAY,QAAQ,OAAO;AAC1C,QAAI,OAAQ,QAAO;AAAA,EACvB;AACA,QAAM,KAAK,qBAAqB,QAAQ,OAAO;AAC/C,SAAO,WAAW,QAAQ,IAAI,OAAO;AACzC;",
5
5
  "names": []
6
6
  }
package/dist/subtle.js CHANGED
@@ -1,8 +1,3 @@
1
- import {
2
- OpCode,
3
- analyzeGlobalReferences,
4
- isKeyword
5
- } from "./chunk-FIKQPSZ6.js";
6
1
  import {
7
2
  DefaultVmContext,
8
3
  convert_exports,
@@ -11,9 +6,10 @@ import {
11
6
  lib,
12
7
  operations_exports,
13
8
  wrapScript
14
- } from "./chunk-EOF4KUT4.js";
9
+ } from "./chunk-SXCYD4OW.js";
15
10
  import {
16
11
  DiagnosticCode,
12
+ REG_IDENTIFIER,
17
13
  constants_exports,
18
14
  display,
19
15
  formatDiagnostics,
@@ -30,6 +26,67 @@ import {
30
26
  serializeRecordKey,
31
27
  serializeString
32
28
  } from "./chunk-GBWG7BQZ.js";
29
+
30
+ // src/subtle.ts
31
+ import { OpCode, isKeyword } from "@mirascript/constants";
32
+
33
+ // src/helpers/analyze.ts
34
+ var REG_SPILT = /\s*!?\s*\.\s*/u;
35
+ var REG_CHAIN = new RegExp(
36
+ String.raw`^(${REG_IDENTIFIER.source})(?:${REG_SPILT.source}(?:\d+|${REG_IDENTIFIER.source}))*`,
37
+ "u"
38
+ );
39
+ var { parseInt } = Number;
40
+ function analyzeGlobalReferences(expression, mode) {
41
+ if (expression.trim() === "") {
42
+ return [];
43
+ }
44
+ const [code, diagnostics] = generateBytecodeSync(expression, {
45
+ input_mode: mode || "Script",
46
+ diagnostic_position_encoding: "Utf16",
47
+ // 需要设为 true 以便在编译失败时返回空的 bytecode
48
+ diagnostic_error: true,
49
+ diagnostic_warning: false,
50
+ diagnostic_info: false,
51
+ diagnostic_hint: false,
52
+ diagnostic_reference: false,
53
+ diagnostic_tag: true,
54
+ diagnostic_sourcemap: false,
55
+ trivia: false
56
+ });
57
+ if (code == null || diagnostics.length === 0) {
58
+ return [];
59
+ }
60
+ const parsedDiagnostics = parseDiagnostics(expression, diagnostics);
61
+ const globals = parsedDiagnostics.tags.filter((t) => t.code === DiagnosticCode.GlobalVariable);
62
+ if (globals.length === 0) {
63
+ return [];
64
+ }
65
+ const lines = expression.split(/\r?\n/);
66
+ const result = /* @__PURE__ */ new Set();
67
+ for (const global of globals) {
68
+ const line = lines[global.range.startLineNumber - 1];
69
+ if (!line) continue;
70
+ const access = line.slice(global.range.startColumn - 1);
71
+ const chain = REG_CHAIN.exec(access);
72
+ if (chain == null) continue;
73
+ const globalName = chain[1];
74
+ if (globalName?.length !== global.range.endColumn - global.range.startColumn) continue;
75
+ const chainStr = chain[0].split(REG_SPILT).join(".");
76
+ result.add(chainStr);
77
+ }
78
+ const accessChains = [];
79
+ for (const chainStr of result) {
80
+ const parts = chainStr.split(".").map((part) => {
81
+ if (/^\d/.test(part)) {
82
+ return parseInt(part, 10);
83
+ }
84
+ return part;
85
+ });
86
+ accessChains.push(parts);
87
+ }
88
+ return accessChains;
89
+ }
33
90
  export {
34
91
  DefaultVmContext,
35
92
  DiagnosticCode,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": [],
4
- "mappings": "",
3
+ "sources": ["../src/subtle.ts", "../src/helpers/analyze.ts"],
4
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,QAAQ,iBAAiB;;;ACMlC,IAAM,YAAY;AAClB,IAAM,YAAY,IAAI;AAAA,EAClB,OAAO,QAAQ,eAAe,MAAM,OAAO,UAAU,MAAM,UAAU,eAAe,MAAM;AAAA,EAC1F;AACJ;AAEA,IAAM,EAAE,SAAS,IAAI;AAId,SAAS,wBAAwB,YAAoB,MAA0C;AAClG,MAAI,WAAW,KAAK,MAAM,IAAI;AAC1B,WAAO,CAAC;AAAA,EACZ;AACA,QAAM,CAAC,MAAM,WAAW,IAAI,qBAAqB,YAAY;AAAA,IACzD,YAAY,QAAQ;AAAA,IACpB,8BAA8B;AAAA;AAAA,IAE9B,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,QAAQ;AAAA,EACZ,CAAC;AACD,MAAI,QAAQ,QAAQ,YAAY,WAAW,GAAG;AAC1C,WAAO,CAAC;AAAA,EACZ;AACA,QAAM,oBAAoB,iBAAiB,YAAY,WAAW;AAClE,QAAM,UAAU,kBAAkB,KAAK,OAAO,CAAC,MAAM,EAAE,SAAS,eAAe,cAAc;AAC7F,MAAI,QAAQ,WAAW,GAAG;AACtB,WAAO,CAAC;AAAA,EACZ;AACA,QAAM,QAAQ,WAAW,MAAM,OAAO;AACtC,QAAM,SAAS,oBAAI,IAAY;AAC/B,aAAW,UAAU,SAAS;AAE1B,UAAM,OAAO,MAAM,OAAO,MAAM,kBAAkB,CAAC;AACnD,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,KAAK,MAAM,OAAO,MAAM,cAAc,CAAC;AACtD,UAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAI,SAAS,KAAM;AACnB,UAAM,aAAa,MAAM,CAAC;AAC1B,QAAI,YAAY,WAAW,OAAO,MAAM,YAAY,OAAO,MAAM,YAAa;AAC9E,UAAM,WAAW,MAAM,CAAC,EAAE,MAAM,SAAS,EAAE,KAAK,GAAG;AACnD,WAAO,IAAI,QAAQ;AAAA,EACvB;AACA,QAAM,eAAuC,CAAC;AAC9C,aAAW,YAAY,QAAQ;AAC3B,UAAM,QAAQ,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS;AAC5C,UAAI,MAAM,KAAK,IAAI,GAAG;AAElB,eAAO,SAAS,MAAM,EAAE;AAAA,MAC5B;AACA,aAAO;AAAA,IACX,CAAC;AACD,iBAAa,KAAK,KAAwC;AAAA,EAC9D;AACA,SAAO;AACX;",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,12 +1,11 @@
1
1
  {
2
2
  "name": "@mirascript/mirascript",
3
- "version": "0.1.39",
3
+ "version": "0.1.40",
4
4
  "author": "CloudPSS",
5
5
  "license": "MIT",
6
6
  "description": "An expression based scripting language.",
7
7
  "type": "module",
8
8
  "main": "./dist/index.js",
9
- "bin": "./cli.js",
10
9
  "types": "./dist/index.d.ts",
11
10
  "exports": {
12
11
  ".": {
@@ -17,10 +16,6 @@
17
16
  "@mirascript/dev": "./src/subtle.ts",
18
17
  "default": "./dist/subtle.js"
19
18
  },
20
- "./cli": {
21
- "@mirascript/dev": "./src/cli/index.ts",
22
- "default": "./dist/cli/index.js"
23
- },
24
19
  "./package.json": "./package.json"
25
20
  },
26
21
  "imports": {
@@ -32,19 +27,15 @@
32
27
  },
33
28
  "dependencies": {
34
29
  "@cloudpss/worker": "^0.1.10",
35
- "@commander-js/extra-typings": "^14.0.0",
36
- "ansi-styles": "^6.2.3",
37
- "commander": "^14.0.2",
38
30
  "source-map-js": "^1.2.1",
39
31
  "supports-color": "^10.2.2",
40
- "@mirascript/bindings": "~0.1.39",
41
- "@mirascript/constants": "~0.1.39"
32
+ "@mirascript/bindings": "~0.1.40",
33
+ "@mirascript/constants": "~0.1.40"
42
34
  },
43
35
  "devDependencies": {
44
- "@types/node": "^25.0.9",
36
+ "@types/node": "^25.0.10",
45
37
  "ava": "^6.4.1",
46
38
  "c8": "^10.1.3",
47
- "madge": "^8.0.0",
48
39
  "tinybench": "^6.0.0",
49
40
  "type-fest": "^5.4.1"
50
41
  },
@@ -52,8 +43,7 @@
52
43
  "watch": "pnpm build:ts --watch",
53
44
  "build:ts": "pnpm clean && tsc",
54
45
  "build": "pnpm build:ts --emitDeclarationOnly && node ./esbuild.config.js",
55
- "mirascript": "node --enable-source-maps ./cli.js",
56
- "deps": "madge --circular --warning ./src",
46
+ "deps": "pnpm dlx madge --circular --warning ./src",
57
47
  "clean": "rimraf dist",
58
48
  "test": "c8 ava",
59
49
  "bench": "node ./bench/index.ts"
package/cli.js DELETED
@@ -1,3 +0,0 @@
1
- import program from './dist/cli/index.js';
2
-
3
- await program.parseAsync();
@@ -1,74 +0,0 @@
1
- import {
2
- DiagnosticCode,
3
- REG_IDENTIFIER,
4
- generateBytecodeSync,
5
- parseDiagnostics
6
- } from "./chunk-GBWG7BQZ.js";
7
-
8
- // src/subtle.ts
9
- import { OpCode, isKeyword } from "@mirascript/constants";
10
-
11
- // src/helpers/analyze.ts
12
- var REG_SPILT = /\s*!?\s*\.\s*/u;
13
- var REG_CHAIN = new RegExp(
14
- String.raw`^(${REG_IDENTIFIER.source})(?:${REG_SPILT.source}(?:\d+|${REG_IDENTIFIER.source}))*`,
15
- "u"
16
- );
17
- var { parseInt } = Number;
18
- function analyzeGlobalReferences(expression, mode) {
19
- if (expression.trim() === "") {
20
- return [];
21
- }
22
- const [code, diagnostics] = generateBytecodeSync(expression, {
23
- input_mode: mode || "Script",
24
- diagnostic_position_encoding: "Utf16",
25
- // 需要设为 true 以便在编译失败时返回空的 bytecode
26
- diagnostic_error: true,
27
- diagnostic_warning: false,
28
- diagnostic_info: false,
29
- diagnostic_hint: false,
30
- diagnostic_reference: false,
31
- diagnostic_tag: true,
32
- diagnostic_sourcemap: false,
33
- trivia: false
34
- });
35
- if (code == null || diagnostics.length === 0) {
36
- return [];
37
- }
38
- const parsedDiagnostics = parseDiagnostics(expression, diagnostics);
39
- const globals = parsedDiagnostics.tags.filter((t) => t.code === DiagnosticCode.GlobalVariable);
40
- if (globals.length === 0) {
41
- return [];
42
- }
43
- const lines = expression.split(/\r?\n/);
44
- const result = /* @__PURE__ */ new Set();
45
- for (const global of globals) {
46
- const line = lines[global.range.startLineNumber - 1];
47
- if (!line) continue;
48
- const access = line.slice(global.range.startColumn - 1);
49
- const chain = REG_CHAIN.exec(access);
50
- if (chain == null) continue;
51
- const globalName = chain[1];
52
- if (globalName?.length !== global.range.endColumn - global.range.startColumn) continue;
53
- const chainStr = chain[0].split(REG_SPILT).join(".");
54
- result.add(chainStr);
55
- }
56
- const accessChains = [];
57
- for (const chainStr of result) {
58
- const parts = chainStr.split(".").map((part) => {
59
- if (/^\d/.test(part)) {
60
- return parseInt(part, 10);
61
- }
62
- return part;
63
- });
64
- accessChains.push(parts);
65
- }
66
- return accessChains;
67
- }
68
-
69
- export {
70
- analyzeGlobalReferences,
71
- OpCode,
72
- isKeyword
73
- };
74
- //# sourceMappingURL=chunk-FIKQPSZ6.js.map
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/subtle.ts", "../src/helpers/analyze.ts"],
4
- "mappings": ";;;;;;;;AAEA,SAAS,QAAQ,iBAAiB;;;ACMlC,IAAM,YAAY;AAClB,IAAM,YAAY,IAAI;AAAA,EAClB,OAAO,QAAQ,eAAe,MAAM,OAAO,UAAU,MAAM,UAAU,eAAe,MAAM;AAAA,EAC1F;AACJ;AAEA,IAAM,EAAE,SAAS,IAAI;AAId,SAAS,wBAAwB,YAAoB,MAA0C;AAClG,MAAI,WAAW,KAAK,MAAM,IAAI;AAC1B,WAAO,CAAC;AAAA,EACZ;AACA,QAAM,CAAC,MAAM,WAAW,IAAI,qBAAqB,YAAY;AAAA,IACzD,YAAY,QAAQ;AAAA,IACpB,8BAA8B;AAAA;AAAA,IAE9B,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,QAAQ;AAAA,EACZ,CAAC;AACD,MAAI,QAAQ,QAAQ,YAAY,WAAW,GAAG;AAC1C,WAAO,CAAC;AAAA,EACZ;AACA,QAAM,oBAAoB,iBAAiB,YAAY,WAAW;AAClE,QAAM,UAAU,kBAAkB,KAAK,OAAO,CAAC,MAAM,EAAE,SAAS,eAAe,cAAc;AAC7F,MAAI,QAAQ,WAAW,GAAG;AACtB,WAAO,CAAC;AAAA,EACZ;AACA,QAAM,QAAQ,WAAW,MAAM,OAAO;AACtC,QAAM,SAAS,oBAAI,IAAY;AAC/B,aAAW,UAAU,SAAS;AAE1B,UAAM,OAAO,MAAM,OAAO,MAAM,kBAAkB,CAAC;AACnD,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,KAAK,MAAM,OAAO,MAAM,cAAc,CAAC;AACtD,UAAM,QAAQ,UAAU,KAAK,MAAM;AACnC,QAAI,SAAS,KAAM;AACnB,UAAM,aAAa,MAAM,CAAC;AAC1B,QAAI,YAAY,WAAW,OAAO,MAAM,YAAY,OAAO,MAAM,YAAa;AAC9E,UAAM,WAAW,MAAM,CAAC,EAAE,MAAM,SAAS,EAAE,KAAK,GAAG;AACnD,WAAO,IAAI,QAAQ;AAAA,EACvB;AACA,QAAM,eAAuC,CAAC;AAC9C,aAAW,YAAY,QAAQ;AAC3B,UAAM,QAAQ,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS;AAC5C,UAAI,MAAM,KAAK,IAAI,GAAG;AAElB,eAAO,SAAS,MAAM,EAAE;AAAA,MAC5B;AACA,aAAO;AAAA,IACX,CAAC;AACD,iBAAa,KAAK,KAAwC;AAAA,EAC9D;AACA,SAAO;AACX;",
5
- "names": []
6
- }
@@ -1,188 +0,0 @@
1
- import {
2
- $GlobalFallback,
3
- createScript,
4
- emitScript,
5
- reportDiagnostic,
6
- wrapScript
7
- } from "./chunk-EOF4KUT4.js";
8
- import {
9
- defineProperty,
10
- generateBytecode,
11
- generateBytecodeSync,
12
- isFinite
13
- } from "./chunk-GBWG7BQZ.js";
14
-
15
- // src/compiler/compile-fast.ts
16
- import { isKeyword } from "@mirascript/constants";
17
- var REG_NUMBER_FULL = /^(?:[+-])?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?$/;
18
- var REG_IDENTIFIER_FAST = /^(?:\$+|@+|[A-Za-z])[a-zA-Z0-9_]*$/;
19
- var FAST_SCRIPT_MAX_LEN = 32;
20
- function constantFiniteNumber(value) {
21
- if (value === 0) {
22
- if (Object.is(value, -0)) {
23
- return () => -0;
24
- } else {
25
- return () => 0;
26
- }
27
- }
28
- const f = () => value;
29
- defineProperty(f, "toString", {
30
- value: () => {
31
- return `() => ${value};`;
32
- },
33
- writable: false,
34
- enumerable: false,
35
- configurable: false
36
- });
37
- return f;
38
- }
39
- function constantString(value) {
40
- const f = () => value;
41
- defineProperty(f, "toString", {
42
- value: () => {
43
- return `() => ${JSON.stringify(value)};`;
44
- },
45
- writable: false,
46
- enumerable: false,
47
- configurable: false
48
- });
49
- return f;
50
- }
51
- function nan() {
52
- return () => 0 / 0;
53
- }
54
- function posInf() {
55
- return () => 1 / 0;
56
- }
57
- function negInf() {
58
- return () => -1 / 0;
59
- }
60
- function constantBoolean(value) {
61
- if (value) {
62
- return () => true;
63
- } else {
64
- return () => false;
65
- }
66
- }
67
- function nil() {
68
- return () => null;
69
- }
70
- function globalVariable(id) {
71
- const f = (global) => (global ?? $GlobalFallback()).get(id);
72
- defineProperty(f, "toString", {
73
- value: () => {
74
- return `(global) => (global ?? $GlobalFallback()).get(${JSON.stringify(id)});`;
75
- },
76
- writable: false,
77
- enumerable: false,
78
- configurable: false
79
- });
80
- return f;
81
- }
82
- function compileScriptFast(code) {
83
- if (code.length > FAST_SCRIPT_MAX_LEN) return void 0;
84
- const trimmedCode = code.trim();
85
- if (!trimmedCode) {
86
- return wrapScript(code, "Script", nil());
87
- }
88
- switch (trimmedCode) {
89
- case "nil":
90
- return wrapScript(code, "Script", nil());
91
- case "true":
92
- return wrapScript(code, "Script", constantBoolean(true));
93
- case "false":
94
- return wrapScript(code, "Script", constantBoolean(false));
95
- case "nan":
96
- return wrapScript(code, "Script", nan());
97
- case "inf":
98
- case "+inf":
99
- return wrapScript(code, "Script", posInf());
100
- case "-inf":
101
- return wrapScript(code, "Script", negInf());
102
- }
103
- if (REG_IDENTIFIER_FAST.test(trimmedCode)) {
104
- const id = trimmedCode;
105
- if (isKeyword(id)) {
106
- return void 0;
107
- }
108
- return wrapScript(code, "Script", globalVariable(id));
109
- }
110
- if (REG_NUMBER_FULL.test(trimmedCode)) {
111
- const num = Number(trimmedCode);
112
- if (!isFinite(num)) return void 0;
113
- return wrapScript(code, "Script", constantFiniteNumber(num));
114
- }
115
- return void 0;
116
- }
117
- var FAST_TEMPLATE_MAX_LEN = 1024;
118
- function compileTemplateFast(code) {
119
- if (code.length > FAST_TEMPLATE_MAX_LEN) return void 0;
120
- if (!code.includes("$")) {
121
- return wrapScript(code, "Template", constantString(code));
122
- }
123
- return void 0;
124
- }
125
- function compileFast(code, options) {
126
- if (options.sourceMap) return void 0;
127
- return (options.input_mode === "Template" ? compileTemplateFast : compileScriptFast)(code);
128
- }
129
-
130
- // src/compiler/worker-manager.ts
131
- import { WorkerPool } from "@cloudpss/worker/pool";
132
- var pool = /* @__PURE__ */ new WorkerPool(
133
- () => {
134
- return new Worker(new URL("#compiler/worker", import.meta.url), {
135
- type: "module",
136
- name: "@mirascript/compiler"
137
- });
138
- },
139
- {
140
- name: "@mirascript/compiler"
141
- }
142
- );
143
- async function compileWorker(...args) {
144
- return await pool.call("compile", args);
145
- }
146
-
147
- // src/compiler/index.ts
148
- var WORKER_MIN_LEN = typeof Worker != "function" ? Number.MAX_VALUE : 1024;
149
- function getOptions(options) {
150
- options ??= {};
151
- if (options.sourceMap) {
152
- options.diagnostic_sourcemap = true;
153
- options.diagnostic_position_encoding ??= "Utf16";
154
- }
155
- options.input_mode ??= "Script";
156
- return options;
157
- }
158
- async function compile(source, options) {
159
- options = getOptions(options);
160
- if (typeof source == "string") {
161
- const result = compileFast(source, options);
162
- if (result) return result;
163
- }
164
- if (source.length < WORKER_MIN_LEN) {
165
- const bc = await generateBytecode(source, options);
166
- return emitScript(source, bc, options);
167
- }
168
- const [target, diagnostics] = await compileWorker(source, options);
169
- if (target == null) {
170
- reportDiagnostic(source, diagnostics, options.fileName);
171
- }
172
- return createScript(source, options.input_mode ?? "Script", target);
173
- }
174
- function compileSync(source, options) {
175
- options = getOptions(options);
176
- if (typeof source == "string") {
177
- const result = compileFast(source, options);
178
- if (result) return result;
179
- }
180
- const bc = generateBytecodeSync(source, options);
181
- return emitScript(source, bc, options);
182
- }
183
-
184
- export {
185
- compile,
186
- compileSync
187
- };
188
- //# sourceMappingURL=chunk-V5SL3PMV.js.map
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/compiler/compile-fast.ts", "../src/compiler/worker-manager.ts", "../src/compiler/index.ts"],
4
- "mappings": "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",
5
- "names": []
6
- }
@@ -1,4 +0,0 @@
1
- import { type VmValue } from '../vm/index.js';
2
- /** 执行脚本 */
3
- export declare function execute(script: string, template: boolean, variables: Record<string, VmValue>, fileName: string): Promise<void>;
4
- //# sourceMappingURL=execute.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/cli/execute.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAW/D,WAAW;AACX,wBAAsB,OAAO,CACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -1,9 +0,0 @@
1
- import { type VmValue } from '../vm/index.js';
2
- declare const _default: import("@commander-js/extra-typings").Command<[string | undefined], {
3
- variable: Record<string, VmValue>;
4
- template?: boolean | undefined;
5
- timeout: number;
6
- eval?: string | undefined;
7
- }, {}>;
8
- export default _default;
9
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAoB,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;;;;;;;AAIhE,wBA4EO"}
package/dist/cli/index.js DELETED
@@ -1,165 +0,0 @@
1
- import {
2
- compile,
3
- compileSync
4
- } from "../chunk-V5SL3PMV.js";
5
- import "../chunk-FIKQPSZ6.js";
6
- import {
7
- configCheckpoint,
8
- createVmContext,
9
- debug_print,
10
- operations_exports,
11
- panic
12
- } from "../chunk-EOF4KUT4.js";
13
- import {
14
- PositiveInfinity,
15
- isNaN,
16
- serialize,
17
- serializeBoolean,
18
- serializeNil,
19
- serializeNumber
20
- } from "../chunk-GBWG7BQZ.js";
21
-
22
- // src/cli/index.ts
23
- import { readFile, stat } from "node:fs/promises";
24
- import { pathToFileURL } from "node:url";
25
- import { InvalidArgumentError, program } from "@commander-js/extra-typings";
26
-
27
- // src/cli/execute.ts
28
- import styles2 from "ansi-styles";
29
- import supportsColor2 from "supports-color";
30
-
31
- // src/cli/print.ts
32
- import styles from "ansi-styles";
33
- import supportsColor from "supports-color";
34
- var noColor = !supportsColor.stdout;
35
- var options = {
36
- maxDepth: 3,
37
- serializeNil: noColor ? void 0 : () => styles.gray.open + serializeNil() + styles.gray.close,
38
- serializeBoolean: noColor ? void 0 : (v) => styles.blue.open + serializeBoolean(v) + styles.blue.close,
39
- serializeNumber: noColor ? void 0 : (v) => styles.yellow.open + serializeNumber(v) + styles.yellow.close,
40
- serializeStringQuote: noColor ? void 0 : (v, open) => {
41
- const q = styles.dim.open + v + styles.dim.close;
42
- if (open) {
43
- return styles.green.open + q;
44
- } else {
45
- return q + styles.green.close;
46
- }
47
- },
48
- serializeStringEscape: noColor ? void 0 : (v) => styles.bold.open + v + styles.bold.close,
49
- serializePropName: noColor ? void 0 : (v) => styles.whiteBright.open + String(v) + styles.whiteBright.close,
50
- serializeFunction: noColor ? operations_exports.$ToString : (v) => styles.cyan.open + operations_exports.$ToString(v) + styles.cyan.close,
51
- serializeModule: noColor ? (v, depth, options2) => {
52
- return operations_exports.$ToString(v) + " " + options2.serializeRecord(v.value, depth, options2);
53
- } : (v, depth, options2) => {
54
- return styles.magenta.open + operations_exports.$ToString(v) + styles.magenta.close + " " + options2.serializeRecord(v.value, depth, options2);
55
- }
56
- };
57
- function print(value, depth = 3) {
58
- if (value === void 0) {
59
- if (noColor) return "<uninitialized>";
60
- return styles.gray.open + "<uninitialized>" + styles.gray.close;
61
- }
62
- return serialize(value, { ...options, maxDepth: depth });
63
- }
64
-
65
- // src/cli/execute.ts
66
- panic.serializer = debug_print.serializer = (arg, format) => {
67
- if (format === "%o" || format === "%O" || !format) {
68
- return print(arg);
69
- }
70
- return null;
71
- };
72
- async function execute(script, template, variables, fileName) {
73
- try {
74
- const f = await compile(script, { input_mode: template ? "Template" : "Script", sourceMap: true, fileName });
75
- const r = f(createVmContext(variables));
76
- if (template) {
77
- console.log(r);
78
- } else {
79
- console.log(print(r));
80
- }
81
- } catch (ex) {
82
- const { stack } = ex;
83
- if (supportsColor2.stderr) {
84
- console.error(styles2.red.open + stack + styles2.red.close);
85
- } else {
86
- console.error(stack);
87
- }
88
- process.exitCode = 2;
89
- }
90
- }
91
-
92
- // src/cli/index.ts
93
- import pkg from "#package.json" with { type: "json" };
94
- var DEFAULT_TIMEOUT = 3e3;
95
- var cli_default = program.name(pkg.name.split("/").pop()).version(pkg.version).description(pkg.description).option(
96
- "-v, --variable <key=value>",
97
- "设置全局变量,可以多次使用",
98
- (v, p) => {
99
- p = { ...p };
100
- const i = v.indexOf("=");
101
- if (i < 0) {
102
- p[v] = true;
103
- } else {
104
- const key = v.slice(0, i).trim();
105
- const value = v.slice(i + 1).trim();
106
- try {
107
- const pv = compileSync(`return (${value});`)();
108
- p[key] = pv ?? value;
109
- } catch {
110
- p[key] = value;
111
- }
112
- }
113
- return p;
114
- },
115
- {}
116
- ).option("-t, --template", "使用模板模式").option(
117
- "--timeout <ms>",
118
- "脚本执行超时时间(毫秒,0 表示不超时)",
119
- (v) => {
120
- const ms = Number.parseFloat(v);
121
- if (isNaN(ms) || ms < 0) {
122
- throw new InvalidArgumentError("超时时间必须是非负整数");
123
- }
124
- return ms;
125
- },
126
- DEFAULT_TIMEOUT
127
- ).option("--no-template", "使用脚本模式").option("-e, --eval <script>", "要执行的脚本").argument("[script]", "要执行的脚本文件路径(如果提供了 -e 则忽略此参数)").action(async (script, opt) => {
128
- configCheckpoint(opt.timeout || PositiveInfinity);
129
- if (opt.eval != null) {
130
- const template = !!opt.template;
131
- await execute(opt.eval, template, opt.variable, template ? "eval.miratpl" : "eval.mira");
132
- return;
133
- }
134
- if (script) {
135
- try {
136
- const s = await stat(script);
137
- if (!s.isFile()) {
138
- console.error(`脚本路径不是文件: ${script}`);
139
- process.exitCode = 2;
140
- return;
141
- }
142
- } catch (ex) {
143
- if (ex.code === "ENOENT") {
144
- console.error(`脚本文件不存在: ${script}`);
145
- process.exitCode = 2;
146
- } else if (ex.code === "EACCES") {
147
- console.error(`权限不足: ${ex.message}`);
148
- process.exitCode = 3;
149
- } else {
150
- console.error(`无法访问脚本文件: ${ex.message}`);
151
- process.exitCode = 1;
152
- }
153
- return;
154
- }
155
- const context = await readFile(script, "utf8");
156
- const template = opt.template ?? script.endsWith(".miratpl");
157
- await execute(context, template, opt.variable, pathToFileURL(script).href);
158
- return;
159
- }
160
- program.help({ error: true });
161
- });
162
- export {
163
- cli_default as default
164
- };
165
- //# sourceMappingURL=index.js.map
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/cli/index.ts", "../../src/cli/execute.ts", "../../src/cli/print.ts"],
4
- "mappings": "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",
5
- "names": ["styles", "supportsColor", "options", "supportsColor", "styles"]
6
- }
@@ -1,4 +0,0 @@
1
- import type { VmAny } from '../vm/index.js';
2
- /** 序列化值 */
3
- export declare function print(value: VmAny, depth?: number): string;
4
- //# sourceMappingURL=print.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"print.d.ts","sourceRoot":"","sources":["../../src/cli/print.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,KAAK,EAAY,MAAM,gBAAgB,CAAC;AAuCtD,WAAW;AACX,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,SAAI,GAAG,MAAM,CAMrD"}
@@ -1,40 +0,0 @@
1
- /* eslint-disable no-console */
2
- import styles from 'ansi-styles';
3
- import supportsColor from 'supports-color';
4
- import { compile } from '../index.js';
5
- import { createVmContext, type VmValue } from '../vm/index.js';
6
- import { debug_print, panic } from '../vm/lib/global/debug.js';
7
- import { print } from './print.js';
8
-
9
- panic.serializer = debug_print.serializer = (arg, format) => {
10
- if (format === '%o' || format === '%O' || !format) {
11
- return print(arg);
12
- }
13
- return null;
14
- };
15
-
16
- /** 执行脚本 */
17
- export async function execute(
18
- script: string,
19
- template: boolean,
20
- variables: Record<string, VmValue>,
21
- fileName: string,
22
- ): Promise<void> {
23
- try {
24
- const f = await compile(script, { input_mode: template ? 'Template' : 'Script', sourceMap: true, fileName });
25
- const r = f(createVmContext(variables));
26
- if (template) {
27
- console.log(r);
28
- } else {
29
- console.log(print(r));
30
- }
31
- } catch (ex) {
32
- const { stack } = ex as Error;
33
- if (supportsColor.stderr) {
34
- console.error(styles.red.open + stack + styles.red.close);
35
- } else {
36
- console.error(stack);
37
- }
38
- process.exitCode = 2;
39
- }
40
- }
package/src/cli/index.ts DELETED
@@ -1,89 +0,0 @@
1
- /* eslint-disable no-console */
2
- import { readFile, stat } from 'node:fs/promises';
3
- import { pathToFileURL } from 'node:url';
4
- import { InvalidArgumentError, program } from '@commander-js/extra-typings';
5
- import { execute } from './execute.js';
6
- import { isNaN, PositiveInfinity } from '../helpers/utils.js';
7
- import pkg from '#package.json' with { type: 'json' };
8
- import { compileSync } from '../compiler/index.js';
9
- import { configCheckpoint, type VmValue } from '../vm/index.js';
10
-
11
- const DEFAULT_TIMEOUT = 3000;
12
-
13
- export default program
14
- .name(pkg.name.split('/').pop()!)
15
- .version(pkg.version)
16
- .description(pkg.description)
17
- .option(
18
- '-v, --variable <key=value>',
19
- '设置全局变量,可以多次使用',
20
- (v, p) => {
21
- p = { ...p };
22
- const i = v.indexOf('=');
23
- if (i < 0) {
24
- p[v] = true;
25
- } else {
26
- const key = v.slice(0, i).trim();
27
- const value = v.slice(i + 1).trim();
28
- try {
29
- const pv = compileSync(`return (${value});`)();
30
- p[key] = pv ?? value;
31
- } catch {
32
- p[key] = value;
33
- }
34
- }
35
- return p;
36
- },
37
- {} as Record<string, VmValue>,
38
- )
39
- .option('-t, --template', '使用模板模式')
40
- .option(
41
- '--timeout <ms>',
42
- '脚本执行超时时间(毫秒,0 表示不超时)',
43
- (v) => {
44
- const ms = Number.parseFloat(v);
45
- if (isNaN(ms) || ms < 0) {
46
- throw new InvalidArgumentError('超时时间必须是非负整数');
47
- }
48
- return ms;
49
- },
50
- DEFAULT_TIMEOUT,
51
- )
52
- .option('--no-template', '使用脚本模式')
53
- .option('-e, --eval <script>', '要执行的脚本')
54
- .argument('[script]', '要执行的脚本文件路径(如果提供了 -e 则忽略此参数)')
55
- .action(async (script, opt) => {
56
- configCheckpoint(opt.timeout || PositiveInfinity);
57
- if (opt.eval != null) {
58
- const template = !!opt.template;
59
- await execute(opt.eval, template, opt.variable, template ? 'eval.miratpl' : 'eval.mira');
60
- return;
61
- }
62
- if (script) {
63
- try {
64
- const s = await stat(script);
65
- if (!s.isFile()) {
66
- console.error(`脚本路径不是文件: ${script}`);
67
- process.exitCode = 2;
68
- return;
69
- }
70
- } catch (ex) {
71
- if ((ex as NodeJS.ErrnoException).code === 'ENOENT') {
72
- console.error(`脚本文件不存在: ${script}`);
73
- process.exitCode = 2;
74
- } else if ((ex as NodeJS.ErrnoException).code === 'EACCES') {
75
- console.error(`权限不足: ${(ex as NodeJS.ErrnoException).message}`);
76
- process.exitCode = 3;
77
- } else {
78
- console.error(`无法访问脚本文件: ${(ex as NodeJS.ErrnoException).message}`);
79
- process.exitCode = 1;
80
- }
81
- return;
82
- }
83
- const context = await readFile(script, 'utf8');
84
- const template = opt.template ?? script.endsWith('.miratpl');
85
- await execute(context, template, opt.variable, pathToFileURL(script).href);
86
- return;
87
- }
88
- program.help({ error: true });
89
- });
package/src/cli/print.ts DELETED
@@ -1,57 +0,0 @@
1
- import styles from 'ansi-styles';
2
- import supportsColor from 'supports-color';
3
- import {
4
- serialize,
5
- serializeNumber,
6
- serializeBoolean,
7
- serializeNil,
8
- type SerializeOptions,
9
- operations,
10
- } from '../subtle.js';
11
- import type { VmAny, VmRecord } from '../vm/index.js';
12
-
13
- const noColor = !supportsColor.stdout;
14
-
15
- const options: Partial<SerializeOptions> = {
16
- maxDepth: 3,
17
- serializeNil: noColor ? undefined : () => styles.gray.open + serializeNil() + styles.gray.close,
18
- serializeBoolean: noColor ? undefined : (v) => styles.blue.open + serializeBoolean(v) + styles.blue.close,
19
- serializeNumber: noColor ? undefined : (v) => styles.yellow.open + serializeNumber(v) + styles.yellow.close,
20
- serializeStringQuote: noColor
21
- ? undefined
22
- : (v, open) => {
23
- const q = styles.dim.open + v + styles.dim.close;
24
- if (open) {
25
- return styles.green.open + q;
26
- } else {
27
- return q + styles.green.close;
28
- }
29
- },
30
- serializeStringEscape: noColor ? undefined : (v) => styles.bold.open + v + styles.bold.close,
31
- serializePropName: noColor ? undefined : (v) => styles.whiteBright.open + String(v) + styles.whiteBright.close,
32
- serializeFunction: noColor
33
- ? operations.$ToString
34
- : (v) => styles.cyan.open + operations.$ToString(v) + styles.cyan.close,
35
- serializeModule: noColor
36
- ? (v, depth, options) => {
37
- return operations.$ToString(v) + ' ' + options.serializeRecord(v.value as VmRecord, depth, options);
38
- }
39
- : (v, depth, options) => {
40
- return (
41
- styles.magenta.open +
42
- operations.$ToString(v) +
43
- styles.magenta.close +
44
- ' ' +
45
- options.serializeRecord(v.value as VmRecord, depth, options)
46
- );
47
- },
48
- };
49
-
50
- /** 序列化值 */
51
- export function print(value: VmAny, depth = 3): string {
52
- if (value === undefined) {
53
- if (noColor) return '<uninitialized>';
54
- return styles.gray.open + '<uninitialized>' + styles.gray.close;
55
- }
56
- return serialize(value, { ...options, maxDepth: depth });
57
- }