@nudojs/env 0.4.7 → 0.4.10

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.
@@ -3,7 +3,11 @@ import {
3
3
  litValue,
4
4
  numLit,
5
5
  strLit as strLit2,
6
- boolLit
6
+ boolLit,
7
+ evalGlobalFn,
8
+ makeArrayCtorAbs,
9
+ evalPromiseCtor,
10
+ evalDateCtor
7
11
  } from "@nudojs/core";
8
12
 
9
13
  // src/abs-helpers.ts
@@ -91,12 +95,17 @@ function errorBrandOf(name) {
91
95
  }
92
96
  function envFn(paramTypes, returnType, apply, opts) {
93
97
  const params = opts?.params ?? paramTypes.map((_, i) => paramTypes.length === 1 && i === 0 ? "x" : `x${i}`);
98
+ const staticSlots = opts?.slots ? slotsOf(opts.slots) : void 0;
94
99
  if (!apply) {
95
- return relationFn(paramTypes, returnType, {
100
+ const a2 = relationFn(paramTypes, returnType, {
96
101
  params,
97
102
  conf: opts?.conf ?? "exact",
98
103
  fingerprint: opts?.name ? `${opts.name}|${relationFingerprint(paramTypes, returnType)}` : void 0
99
104
  });
105
+ if (staticSlots) {
106
+ a2.shape = { ...a2.shape, slots: staticSlots };
107
+ }
108
+ return a2;
100
109
  }
101
110
  const implApply = apply;
102
111
  const a = absFunction(params, {
@@ -115,7 +124,8 @@ function envFn(paramTypes, returnType, apply, opts) {
115
124
  params,
116
125
  paramTypes,
117
126
  returnType,
118
- ...opts?.name ? { name: opts.name } : {}
127
+ ...opts?.name ? { name: opts.name } : {},
128
+ ...staticSlots ? { slots: staticSlots } : {}
119
129
  };
120
130
  if (opts?.conf && opts.conf !== "exact") a.conf = opts.conf;
121
131
  return a;
@@ -178,6 +188,17 @@ function numImpl2Abs(fn) {
178
188
  return a !== void 0 && b !== void 0 ? numLit(fn(a, b)) : void 0;
179
189
  };
180
190
  }
191
+ function numImplVAbs(fn) {
192
+ return (args) => {
193
+ const nums = [];
194
+ for (const a of args) {
195
+ const n = absNumLit(a);
196
+ if (n === void 0) return void 0;
197
+ nums.push(n);
198
+ }
199
+ return numLit(fn(...nums));
200
+ };
201
+ }
181
202
  function strToStrImplAbs(fn) {
182
203
  return (args) => {
183
204
  const s = absStrLit(args[0]);
@@ -275,6 +296,18 @@ function defineEnv() {
275
296
  if (a.term?.op === "lit") return boolLit(false);
276
297
  return void 0;
277
298
  };
299
+ const numberImplAbs = (args) => {
300
+ return evalGlobalFn("Number", args);
301
+ };
302
+ const arrayImplAbs = (args) => {
303
+ return makeArrayCtorAbs(args);
304
+ };
305
+ const promiseCtorImplAbs = (args) => {
306
+ return evalPromiseCtor(args);
307
+ };
308
+ const dateCtorImplAbs = (args) => {
309
+ return evalDateCtor(args);
310
+ };
278
311
  const promiseResolveImplAbs = (args) => {
279
312
  if (!args[0]) return void 0;
280
313
  return promiseOf(args[0]);
@@ -296,8 +329,18 @@ function defineEnv() {
296
329
  round: envFn([prim.num()], prim.num(), numImpl1Abs(Math.round)),
297
330
  trunc: envFn([prim.num()], prim.num(), numImpl1Abs(Math.trunc)),
298
331
  sign: envFn([prim.num()], prim.num(), numImpl1Abs(Math.sign)),
299
- max: envFn([prim.num(), prim.num()], prim.num(), numImpl2Abs(Math.max)),
300
- min: envFn([prim.num(), prim.num()], prim.num(), numImpl2Abs(Math.min)),
332
+ // min/max/hypot 在 JS 里是变参(`Math.min(a, b, c)`)——二元声明会让
333
+ // 多实参调用落进 arity 不匹配 → unknown
334
+ max: envFnVariadic(prim.num(), prim.num(), {
335
+ apply: numImplVAbs(Math.max),
336
+ restName: "...values",
337
+ name: "Math.max"
338
+ }),
339
+ min: envFnVariadic(prim.num(), prim.num(), {
340
+ apply: numImplVAbs(Math.min),
341
+ restName: "...values",
342
+ name: "Math.min"
343
+ }),
301
344
  pow: envFn([prim.num(), prim.num()], prim.num(), numImpl2Abs(Math.pow)),
302
345
  sqrt: envFn([prim.num()], prim.num(), numImpl1Abs(Math.sqrt)),
303
346
  cbrt: envFn([prim.num()], prim.num(), numImpl1Abs(Math.cbrt)),
@@ -313,7 +356,11 @@ function defineEnv() {
313
356
  acos: envFn([prim.num()], prim.num(), numImpl1Abs(Math.acos)),
314
357
  atan: envFn([prim.num()], prim.num(), numImpl1Abs(Math.atan)),
315
358
  atan2: envFn([prim.num(), prim.num()], prim.num(), numImpl2Abs(Math.atan2)),
316
- hypot: envFn([prim.num(), prim.num()], prim.num(), numImpl2Abs(Math.hypot)),
359
+ hypot: envFnVariadic(prim.num(), prim.num(), {
360
+ apply: numImplVAbs(Math.hypot),
361
+ restName: "...values",
362
+ name: "Math.hypot"
363
+ }),
317
364
  clz32: envFn([prim.num()], prim.num(), numImpl1Abs(Math.clz32)),
318
365
  imul: envFn([prim.num(), prim.num()], prim.num(), numImpl2Abs(Math.imul)),
319
366
  fround: envFn([prim.num()], prim.num(), numImpl1Abs(Math.fround)),
@@ -326,28 +373,44 @@ function defineEnv() {
326
373
  SQRT2: prim.num(),
327
374
  SQRT1_2: prim.num()
328
375
  }),
329
- Number: objAbs({
330
- isFinite: envFn([prim.unknown], prim.bool(), isFiniteImplAbs),
331
- isInteger: envFn([prim.unknown], prim.bool(), isIntegerImplAbs),
332
- isNaN: envFn([prim.unknown], prim.bool(), isNaNImplAbs),
333
- isSafeInteger: envFn([prim.unknown], prim.bool(), isSafeIntegerImplAbs),
334
- parseFloat: envFn([prim.str()], prim.num(), parseFloatImplAbs),
335
- parseInt: envFn([prim.str()], prim.num(), parseIntImplAbs),
336
- MAX_SAFE_INTEGER: prim.num(),
337
- MIN_SAFE_INTEGER: prim.num(),
338
- MAX_VALUE: prim.num(),
339
- MIN_VALUE: prim.num(),
340
- POSITIVE_INFINITY: prim.num(),
341
- NEGATIVE_INFINITY: prim.num(),
342
- NaN: prim.num(),
343
- EPSILON: prim.num()
376
+ // dual-facet:Number/Array 既可调用/构造,又带静态槽。
377
+ // 此前 objAbs 遮蔽宿主全局后 $call/$new 折 unknown(issue #58)。
378
+ Number: envFn([prim.unknown], prim.num(), numberImplAbs, {
379
+ name: "Number",
380
+ params: ["value"],
381
+ slots: {
382
+ isFinite: envFn([prim.unknown], prim.bool(), isFiniteImplAbs),
383
+ isInteger: envFn([prim.unknown], prim.bool(), isIntegerImplAbs),
384
+ isNaN: envFn([prim.unknown], prim.bool(), isNaNImplAbs),
385
+ isSafeInteger: envFn([prim.unknown], prim.bool(), isSafeIntegerImplAbs),
386
+ parseFloat: envFn([prim.str()], prim.num(), parseFloatImplAbs),
387
+ parseInt: envFn([prim.str()], prim.num(), parseIntImplAbs),
388
+ MAX_SAFE_INTEGER: prim.num(),
389
+ MIN_SAFE_INTEGER: prim.num(),
390
+ MAX_VALUE: prim.num(),
391
+ MIN_VALUE: prim.num(),
392
+ POSITIVE_INFINITY: prim.num(),
393
+ NEGATIVE_INFINITY: prim.num(),
394
+ NaN: prim.num(),
395
+ EPSILON: prim.num()
396
+ }
344
397
  }),
345
- Boolean: envFn([prim.unknown], prim.bool(), booleanImplAbs),
346
- String: envFn([prim.unknown], prim.str(), stringImplAbs),
347
- Array: objAbs({
348
- isArray: envFn([prim.unknown], prim.bool(), isArrayImplAbs),
349
- from: envFn([prim.unknown], arrOf(prim.unknown)),
350
- of: envFn([prim.unknown], arrOf(prim.unknown))
398
+ Boolean: envFn([prim.unknown], prim.bool(), booleanImplAbs, {
399
+ name: "Boolean",
400
+ params: ["value"]
401
+ }),
402
+ String: envFn([prim.unknown], prim.str(), stringImplAbs, {
403
+ name: "String",
404
+ params: ["value"]
405
+ }),
406
+ Array: envFn([prim.unknown], arrOf(prim.unknown), arrayImplAbs, {
407
+ name: "Array",
408
+ params: ["items"],
409
+ slots: {
410
+ isArray: envFn([prim.unknown], prim.bool(), isArrayImplAbs),
411
+ from: envFn([prim.unknown], arrOf(prim.unknown)),
412
+ of: envFn([prim.unknown], arrOf(prim.unknown))
413
+ }
351
414
  }),
352
415
  console: objAbs(consoleSlots),
353
416
  parseInt: envFn([prim.str(), prim.num()], prim.num(), parseIntImplAbs),
@@ -372,21 +435,29 @@ function defineEnv() {
372
435
  SyntaxError: envFn([prim.str()], errorBrandOf("SyntaxError")),
373
436
  ReferenceError: envFn([prim.str()], errorBrandOf("ReferenceError")),
374
437
  URIError: envFn([prim.str()], errorBrandOf("URIError")),
375
- Promise: objAbs({
376
- resolve: envFn([prim.unknown], promiseOf(prim.unknown), promiseResolveImplAbs),
377
- reject: envFn([prim.unknown], promiseOf(prim.never)),
378
- all: envFn([arrOf(promiseOf(prim.unknown))], promiseOf(arrOf(prim.unknown))),
379
- allSettled: envFn(
380
- [arrOf(promiseOf(prim.unknown))],
381
- promiseOf(arrOf(prim.unknown))
382
- ),
383
- race: envFn([arrOf(promiseOf(prim.unknown))], promiseOf(prim.unknown)),
384
- any: envFn([arrOf(promiseOf(prim.unknown))], promiseOf(prim.unknown))
438
+ Promise: envFn([prim.unknown], promiseOf(prim.unknown), promiseCtorImplAbs, {
439
+ name: "Promise",
440
+ params: ["executor"],
441
+ slots: {
442
+ resolve: envFn([prim.unknown], promiseOf(prim.unknown), promiseResolveImplAbs),
443
+ reject: envFn([prim.unknown], promiseOf(prim.never)),
444
+ all: envFn([arrOf(promiseOf(prim.unknown))], promiseOf(arrOf(prim.unknown))),
445
+ allSettled: envFn(
446
+ [arrOf(promiseOf(prim.unknown))],
447
+ promiseOf(arrOf(prim.unknown))
448
+ ),
449
+ race: envFn([arrOf(promiseOf(prim.unknown))], promiseOf(prim.unknown)),
450
+ any: envFn([arrOf(promiseOf(prim.unknown))], promiseOf(prim.unknown))
451
+ }
385
452
  }),
386
- Date: objAbs({
387
- now: envFn([], prim.num()),
388
- parse: envFn([prim.str()], prim.num()),
389
- UTC: envFn([prim.num(), prim.num()], prim.num())
453
+ Date: envFn([], dateAbs(), dateCtorImplAbs, {
454
+ name: "Date",
455
+ params: ["value"],
456
+ slots: {
457
+ now: envFn([], prim.num()),
458
+ parse: envFn([prim.str()], prim.num()),
459
+ UTC: envFn([prim.num(), prim.num()], prim.num())
460
+ }
390
461
  }),
391
462
  Symbol: envFn([prim.str()], brandOf("Symbol")),
392
463
  Reflect: objAbs({
package/dist/es.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  defineEnv
3
- } from "./chunk-KRMQSDG3.js";
3
+ } from "./chunk-KQ7PVOVE.js";
4
4
  export {
5
5
  defineEnv
6
6
  };
package/dist/node.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  tupleOf,
14
14
  undef,
15
15
  unionOf
16
- } from "./chunk-KRMQSDG3.js";
16
+ } from "./chunk-KQ7PVOVE.js";
17
17
 
18
18
  // src/node.ts
19
19
  import {
package/dist/web.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  promiseOf,
9
9
  undef,
10
10
  unionOf
11
- } from "./chunk-KRMQSDG3.js";
11
+ } from "./chunk-KQ7PVOVE.js";
12
12
 
13
13
  // src/web.ts
14
14
  import { litValue, strLit, numLit } from "@nudojs/core";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nudojs/env",
3
- "version": "0.4.7",
3
+ "version": "0.4.10",
4
4
  "engines": {
5
5
  "node": ">=20"
6
6
  },
@@ -35,7 +35,7 @@
35
35
  "registry": "https://registry.npmjs.org"
36
36
  },
37
37
  "dependencies": {
38
- "@nudojs/core": "1.2.0"
38
+ "@nudojs/core": "1.3.0"
39
39
  },
40
40
  "scripts": {
41
41
  "build": "tsup src/es.ts src/web.ts src/node.ts --format esm --dts"