@nudojs/env 0.2.3 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,386 @@
1
+ // src/es.ts
2
+ import {
3
+ litValue,
4
+ numLit,
5
+ strLit,
6
+ boolLit
7
+ } from "@nudojs/core";
8
+
9
+ // src/abs-helpers.ts
10
+ import {
11
+ abs as makeAbs,
12
+ lit as termLit,
13
+ absFunction,
14
+ relationFn,
15
+ relationFingerprint,
16
+ objOf,
17
+ num,
18
+ str,
19
+ bool,
20
+ never,
21
+ unknown
22
+ } from "@nudojs/core";
23
+ var dummyBody = {
24
+ type: "BlockStatement",
25
+ body: [],
26
+ directives: []
27
+ };
28
+ function undef() {
29
+ return makeAbs({ k: "unknown" }, termLit(void 0), void 0, "exact");
30
+ }
31
+ function nullLit() {
32
+ return makeAbs({ k: "unknown" }, termLit(null), void 0, "exact");
33
+ }
34
+ function anyAbs() {
35
+ return makeAbs({ k: "any" }, void 0, void 0, "path");
36
+ }
37
+ function arrOf(element) {
38
+ return makeAbs({ k: "arr", element }, void 0, void 0, "exact");
39
+ }
40
+ function tupleOf(elements, rest) {
41
+ const shape = rest ? { k: "tuple", elements, rest } : { k: "tuple", elements };
42
+ return makeAbs(shape, void 0, void 0, "exact");
43
+ }
44
+ function unionOf(...members) {
45
+ if (members.length === 0) return never;
46
+ if (members.length === 1) return members[0];
47
+ return makeAbs({ k: "sum", members }, void 0, void 0, "exact");
48
+ }
49
+ function promiseOf(inner) {
50
+ return makeAbs({ k: "eff", eff: "promise", inner }, void 0, void 0, "exact");
51
+ }
52
+ function brandOf(name, shape = unknown) {
53
+ return makeAbs({ k: "brand", name, shape }, void 0, void 0, "path");
54
+ }
55
+ function envFn(paramTypes, returnType, apply, opts) {
56
+ const params = opts?.params ?? paramTypes.map((_, i) => paramTypes.length === 1 && i === 0 ? "x" : `x${i}`);
57
+ if (!apply) {
58
+ return relationFn(paramTypes, returnType, {
59
+ params,
60
+ conf: opts?.conf ?? "exact",
61
+ fingerprint: opts?.name ? `${opts.name}|${relationFingerprint(paramTypes, returnType)}` : void 0
62
+ });
63
+ }
64
+ const implApply = apply;
65
+ const a = absFunction(params, {
66
+ body: dummyBody,
67
+ apply: (args) => {
68
+ try {
69
+ const r = implApply(args);
70
+ return r ?? returnType;
71
+ } catch {
72
+ return returnType;
73
+ }
74
+ }
75
+ });
76
+ a.shape = {
77
+ k: "fn",
78
+ params,
79
+ paramTypes,
80
+ returnType,
81
+ ...opts?.name ? { name: opts.name } : {}
82
+ };
83
+ if (opts?.conf && opts.conf !== "exact") a.conf = opts.conf;
84
+ return a;
85
+ }
86
+ function slotsOf(entries) {
87
+ const out = {};
88
+ for (const [k, v] of Object.entries(entries)) {
89
+ out[k] = v && typeof v === "object" && "value" in v && !("shape" in v) ? v : { value: v };
90
+ }
91
+ return out;
92
+ }
93
+ function objAbs(entries) {
94
+ return objOf(slotsOf(entries));
95
+ }
96
+ var prim = {
97
+ num,
98
+ str,
99
+ bool,
100
+ never,
101
+ unknown,
102
+ undef,
103
+ nullLit,
104
+ any: anyAbs
105
+ };
106
+
107
+ // src/es.ts
108
+ function absNumLit(a) {
109
+ if (!a) return void 0;
110
+ const v = litValue(a);
111
+ return typeof v === "number" ? v : void 0;
112
+ }
113
+ function absStrLit(a) {
114
+ if (!a) return void 0;
115
+ const v = litValue(a);
116
+ return typeof v === "string" ? v : void 0;
117
+ }
118
+ function numImpl1Abs(fn) {
119
+ return (args) => {
120
+ const a = absNumLit(args[0]);
121
+ return a !== void 0 ? numLit(fn(a)) : void 0;
122
+ };
123
+ }
124
+ function numImpl2Abs(fn) {
125
+ return (args) => {
126
+ const a = absNumLit(args[0]);
127
+ const b = absNumLit(args[1]);
128
+ return a !== void 0 && b !== void 0 ? numLit(fn(a, b)) : void 0;
129
+ };
130
+ }
131
+ function strToStrImplAbs(fn) {
132
+ return (args) => {
133
+ const s = absStrLit(args[0]);
134
+ return s !== void 0 ? strLit(fn(s)) : void 0;
135
+ };
136
+ }
137
+ function defineEnv() {
138
+ const voidFn = envFn([prim.unknown], undef());
139
+ const consoleSlots = {};
140
+ for (const name of [
141
+ "log",
142
+ "error",
143
+ "warn",
144
+ "info",
145
+ "debug",
146
+ "trace",
147
+ "dir",
148
+ "table",
149
+ "time",
150
+ "timeEnd",
151
+ "timeLog",
152
+ "clear",
153
+ "count",
154
+ "countReset",
155
+ "group",
156
+ "groupCollapsed",
157
+ "groupEnd",
158
+ "assert"
159
+ ]) {
160
+ consoleSlots[name] = voidFn;
161
+ }
162
+ const jsonStringifyImplAbs = (args) => {
163
+ const a = args[0];
164
+ if (!a) return void 0;
165
+ const v = litValue(a);
166
+ if (v === void 0 && a.term?.op !== "lit") return void 0;
167
+ try {
168
+ const result = JSON.stringify(v);
169
+ return result === void 0 ? undef() : strLit(result);
170
+ } catch {
171
+ return void 0;
172
+ }
173
+ };
174
+ const parseIntImplAbs = (args) => {
175
+ const s = absStrLit(args[0]);
176
+ if (s === void 0) return void 0;
177
+ if (args[1] === void 0) return numLit(parseInt(s));
178
+ const radix = absNumLit(args[1]);
179
+ if (radix === void 0) return void 0;
180
+ if (!Number.isInteger(radix) || radix < 2 || radix > 36) return numLit(NaN);
181
+ return numLit(parseInt(s, radix));
182
+ };
183
+ const parseFloatImplAbs = (args) => {
184
+ const s = absStrLit(args[0]);
185
+ if (s !== void 0) return numLit(parseFloat(s));
186
+ return void 0;
187
+ };
188
+ const isNaNImplAbs = (args) => {
189
+ const n = absNumLit(args[0]);
190
+ return n !== void 0 ? boolLit(Number.isNaN(n)) : void 0;
191
+ };
192
+ const isFiniteImplAbs = (args) => {
193
+ const n = absNumLit(args[0]);
194
+ return n !== void 0 ? boolLit(Number.isFinite(n)) : void 0;
195
+ };
196
+ const isIntegerImplAbs = (args) => {
197
+ const n = absNumLit(args[0]);
198
+ return n !== void 0 ? boolLit(Number.isInteger(n)) : void 0;
199
+ };
200
+ const isSafeIntegerImplAbs = (args) => {
201
+ const n = absNumLit(args[0]);
202
+ return n !== void 0 ? boolLit(Number.isSafeInteger(n)) : void 0;
203
+ };
204
+ const booleanImplAbs = (args) => {
205
+ const a = args[0];
206
+ if (!a) return void 0;
207
+ const v = litValue(a);
208
+ if (v === void 0 && a.term?.op !== "lit") return void 0;
209
+ return boolLit(Boolean(v));
210
+ };
211
+ const stringImplAbs = (args) => {
212
+ const a = args[0];
213
+ if (!a) return void 0;
214
+ const v = litValue(a);
215
+ if (v === null || v === void 0) return void 0;
216
+ return strLit(String(v));
217
+ };
218
+ const isArrayImplAbs = (args) => {
219
+ const a = args[0];
220
+ if (!a) return void 0;
221
+ let s = a.shape;
222
+ while (s.k === "brand") s = s.shape.shape;
223
+ if (s.k === "arr" || s.k === "tuple") return boolLit(true);
224
+ if (s.k === "prim" || s.k === "obj" || s.k === "eff") return boolLit(false);
225
+ if (a.term?.op === "lit") return boolLit(false);
226
+ return void 0;
227
+ };
228
+ const promiseResolveImplAbs = (args) => {
229
+ if (!args[0]) return void 0;
230
+ return promiseOf(args[0]);
231
+ };
232
+ return {
233
+ globals: {
234
+ JSON: objAbs({
235
+ parse: envFn([prim.str()], prim.unknown),
236
+ stringify: envFn(
237
+ [prim.unknown],
238
+ unionOf(prim.str(), undef()),
239
+ jsonStringifyImplAbs
240
+ )
241
+ }),
242
+ Math: objAbs({
243
+ abs: envFn([prim.num()], prim.num(), numImpl1Abs(Math.abs)),
244
+ ceil: envFn([prim.num()], prim.num(), numImpl1Abs(Math.ceil)),
245
+ floor: envFn([prim.num()], prim.num(), numImpl1Abs(Math.floor)),
246
+ round: envFn([prim.num()], prim.num(), numImpl1Abs(Math.round)),
247
+ trunc: envFn([prim.num()], prim.num(), numImpl1Abs(Math.trunc)),
248
+ sign: envFn([prim.num()], prim.num(), numImpl1Abs(Math.sign)),
249
+ max: envFn([prim.num(), prim.num()], prim.num(), numImpl2Abs(Math.max)),
250
+ min: envFn([prim.num(), prim.num()], prim.num(), numImpl2Abs(Math.min)),
251
+ pow: envFn([prim.num(), prim.num()], prim.num(), numImpl2Abs(Math.pow)),
252
+ sqrt: envFn([prim.num()], prim.num(), numImpl1Abs(Math.sqrt)),
253
+ cbrt: envFn([prim.num()], prim.num(), numImpl1Abs(Math.cbrt)),
254
+ log: envFn([prim.num()], prim.num(), numImpl1Abs(Math.log)),
255
+ log2: envFn([prim.num()], prim.num(), numImpl1Abs(Math.log2)),
256
+ log10: envFn([prim.num()], prim.num(), numImpl1Abs(Math.log10)),
257
+ exp: envFn([prim.num()], prim.num(), numImpl1Abs(Math.exp)),
258
+ random: envFn([], prim.num()),
259
+ sin: envFn([prim.num()], prim.num(), numImpl1Abs(Math.sin)),
260
+ cos: envFn([prim.num()], prim.num(), numImpl1Abs(Math.cos)),
261
+ tan: envFn([prim.num()], prim.num(), numImpl1Abs(Math.tan)),
262
+ asin: envFn([prim.num()], prim.num(), numImpl1Abs(Math.asin)),
263
+ acos: envFn([prim.num()], prim.num(), numImpl1Abs(Math.acos)),
264
+ atan: envFn([prim.num()], prim.num(), numImpl1Abs(Math.atan)),
265
+ atan2: envFn([prim.num(), prim.num()], prim.num(), numImpl2Abs(Math.atan2)),
266
+ hypot: envFn([prim.num(), prim.num()], prim.num(), numImpl2Abs(Math.hypot)),
267
+ clz32: envFn([prim.num()], prim.num(), numImpl1Abs(Math.clz32)),
268
+ imul: envFn([prim.num(), prim.num()], prim.num(), numImpl2Abs(Math.imul)),
269
+ fround: envFn([prim.num()], prim.num(), numImpl1Abs(Math.fround)),
270
+ PI: prim.num(),
271
+ E: prim.num(),
272
+ LN2: prim.num(),
273
+ LN10: prim.num(),
274
+ LOG2E: prim.num(),
275
+ LOG10E: prim.num(),
276
+ SQRT2: prim.num(),
277
+ SQRT1_2: prim.num()
278
+ }),
279
+ Number: objAbs({
280
+ isFinite: envFn([prim.unknown], prim.bool(), isFiniteImplAbs),
281
+ isInteger: envFn([prim.unknown], prim.bool(), isIntegerImplAbs),
282
+ isNaN: envFn([prim.unknown], prim.bool(), isNaNImplAbs),
283
+ isSafeInteger: envFn([prim.unknown], prim.bool(), isSafeIntegerImplAbs),
284
+ parseFloat: envFn([prim.str()], prim.num(), parseFloatImplAbs),
285
+ parseInt: envFn([prim.str()], prim.num(), parseIntImplAbs),
286
+ MAX_SAFE_INTEGER: prim.num(),
287
+ MIN_SAFE_INTEGER: prim.num(),
288
+ MAX_VALUE: prim.num(),
289
+ MIN_VALUE: prim.num(),
290
+ POSITIVE_INFINITY: prim.num(),
291
+ NEGATIVE_INFINITY: prim.num(),
292
+ NaN: prim.num(),
293
+ EPSILON: prim.num()
294
+ }),
295
+ Boolean: envFn([prim.unknown], prim.bool(), booleanImplAbs),
296
+ String: envFn([prim.unknown], prim.str(), stringImplAbs),
297
+ Array: objAbs({
298
+ isArray: envFn([prim.unknown], prim.bool(), isArrayImplAbs),
299
+ from: envFn([prim.unknown], arrOf(prim.unknown)),
300
+ of: envFn([prim.unknown], arrOf(prim.unknown))
301
+ }),
302
+ console: objAbs(consoleSlots),
303
+ parseInt: envFn([prim.str(), prim.num()], prim.num(), parseIntImplAbs),
304
+ parseFloat: envFn([prim.str()], prim.num(), parseFloatImplAbs),
305
+ isNaN: envFn([prim.unknown], prim.bool(), isNaNImplAbs),
306
+ isFinite: envFn([prim.unknown], prim.bool(), isFiniteImplAbs),
307
+ encodeURI: envFn([prim.str()], prim.str(), strToStrImplAbs(encodeURI)),
308
+ decodeURI: envFn([prim.str()], prim.str(), strToStrImplAbs(decodeURI)),
309
+ encodeURIComponent: envFn(
310
+ [prim.str()],
311
+ prim.str(),
312
+ strToStrImplAbs(encodeURIComponent)
313
+ ),
314
+ decodeURIComponent: envFn(
315
+ [prim.str()],
316
+ prim.str(),
317
+ strToStrImplAbs(decodeURIComponent)
318
+ ),
319
+ Error: envFn([prim.str()], brandOf("Error")),
320
+ TypeError: envFn([prim.str()], brandOf("TypeError")),
321
+ RangeError: envFn([prim.str()], brandOf("RangeError")),
322
+ SyntaxError: envFn([prim.str()], brandOf("SyntaxError")),
323
+ ReferenceError: envFn([prim.str()], brandOf("ReferenceError")),
324
+ URIError: envFn([prim.str()], brandOf("URIError")),
325
+ Promise: objAbs({
326
+ resolve: envFn([prim.unknown], promiseOf(prim.unknown), promiseResolveImplAbs),
327
+ reject: envFn([prim.unknown], promiseOf(prim.never)),
328
+ all: envFn([arrOf(promiseOf(prim.unknown))], promiseOf(arrOf(prim.unknown))),
329
+ allSettled: envFn(
330
+ [arrOf(promiseOf(prim.unknown))],
331
+ promiseOf(arrOf(prim.unknown))
332
+ ),
333
+ race: envFn([arrOf(promiseOf(prim.unknown))], promiseOf(prim.unknown)),
334
+ any: envFn([arrOf(promiseOf(prim.unknown))], promiseOf(prim.unknown))
335
+ }),
336
+ Date: objAbs({
337
+ now: envFn([], prim.num()),
338
+ parse: envFn([prim.str()], prim.num()),
339
+ UTC: envFn([prim.num(), prim.num()], prim.num())
340
+ }),
341
+ Symbol: envFn([prim.str()], brandOf("Symbol")),
342
+ Reflect: objAbs({
343
+ apply: envFn(
344
+ [prim.unknown, prim.unknown, arrOf(prim.unknown)],
345
+ prim.unknown
346
+ ),
347
+ construct: envFn([prim.unknown, arrOf(prim.unknown)], prim.unknown),
348
+ defineProperty: envFn(
349
+ [prim.unknown, prim.str(), prim.unknown],
350
+ prim.bool()
351
+ ),
352
+ deleteProperty: envFn([prim.unknown, prim.str()], prim.bool()),
353
+ get: envFn([prim.unknown, prim.str()], prim.unknown),
354
+ getOwnPropertyDescriptor: envFn(
355
+ [prim.unknown, prim.str()],
356
+ unionOf(prim.unknown, undef())
357
+ ),
358
+ getPrototypeOf: envFn([prim.unknown], unionOf(prim.unknown, nullLit())),
359
+ has: envFn([prim.unknown, prim.str()], prim.bool()),
360
+ isExtensible: envFn([prim.unknown], prim.bool()),
361
+ ownKeys: envFn([prim.unknown], arrOf(prim.str())),
362
+ preventExtensions: envFn([prim.unknown], prim.bool()),
363
+ set: envFn([prim.unknown, prim.str(), prim.unknown], prim.bool()),
364
+ setPrototypeOf: envFn([prim.unknown, prim.unknown], prim.bool())
365
+ }),
366
+ globalThis: prim.unknown,
367
+ undefined: undef(),
368
+ NaN: prim.num(),
369
+ Infinity: prim.num()
370
+ }
371
+ };
372
+ }
373
+
374
+ export {
375
+ undef,
376
+ nullLit,
377
+ arrOf,
378
+ tupleOf,
379
+ unionOf,
380
+ promiseOf,
381
+ brandOf,
382
+ envFn,
383
+ objAbs,
384
+ prim,
385
+ defineEnv
386
+ };
package/dist/es.d.ts CHANGED
@@ -1,8 +1,13 @@
1
- import { TypeValue } from '@nudojs/core';
1
+ import { Abs } from '@nudojs/core';
2
+
3
+ /**
4
+ * ES env:Abs 原生 globals。
5
+ * EnvDefinition.globals / modules 均为 Abs。
6
+ */
2
7
 
3
8
  type EnvDefinition = {
4
- globals: Record<string, TypeValue>;
5
- modules?: Record<string, Record<string, TypeValue>>;
9
+ globals: Record<string, Abs>;
10
+ modules?: Record<string, Record<string, Abs>>;
6
11
  };
7
12
  declare function defineEnv(): EnvDefinition;
8
13
 
package/dist/es.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  defineEnv
3
- } from "./chunk-VBTQ36SR.js";
3
+ } from "./chunk-BPVYU23Z.js";
4
4
  export {
5
5
  defineEnv
6
6
  };
package/dist/node.d.ts CHANGED
@@ -1,6 +1,10 @@
1
1
  import { EnvDefinition } from './es.js';
2
2
  import '@nudojs/core';
3
3
 
4
+ /**
5
+ * Node env:es globals + node 内建 modules(Abs 原生)。
6
+ */
7
+
4
8
  declare function defineEnv(): EnvDefinition;
5
9
 
6
10
  export { EnvDefinition, defineEnv };