@nudojs/env 0.2.5 → 0.4.0

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.
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  litValue,
4
4
  numLit,
5
- strLit,
5
+ strLit as strLit2,
6
6
  boolLit
7
7
  } from "@nudojs/core";
8
8
 
@@ -16,6 +16,7 @@ import {
16
16
  objOf,
17
17
  num,
18
18
  str,
19
+ strLit,
19
20
  bool,
20
21
  never,
21
22
  unknown
@@ -52,6 +53,21 @@ function promiseOf(inner) {
52
53
  function brandOf(name, shape = unknown) {
53
54
  return makeAbs({ k: "brand", name, shape }, void 0, void 0, "path");
54
55
  }
56
+ function errorBrandOf(name) {
57
+ return makeAbs(
58
+ {
59
+ k: "brand",
60
+ name,
61
+ shape: objOf({
62
+ name: { value: strLit(name) },
63
+ message: { value: str() }
64
+ })
65
+ },
66
+ void 0,
67
+ void 0,
68
+ "path"
69
+ );
70
+ }
55
71
  function envFn(paramTypes, returnType, apply, opts) {
56
72
  const params = opts?.params ?? paramTypes.map((_, i) => paramTypes.length === 1 && i === 0 ? "x" : `x${i}`);
57
73
  if (!apply) {
@@ -83,6 +99,19 @@ function envFn(paramTypes, returnType, apply, opts) {
83
99
  if (opts?.conf && opts.conf !== "exact") a.conf = opts.conf;
84
100
  return a;
85
101
  }
102
+ function envFnVariadic(restType, returnType, opts) {
103
+ const required = opts?.required ?? [];
104
+ const restName = opts?.restName ?? "...rest";
105
+ const paramTypes = [...required, restType];
106
+ const params = [
107
+ ...required.map((_, i) => `x${i}`),
108
+ restName
109
+ ];
110
+ return envFn(paramTypes, returnType, opts?.apply, {
111
+ params,
112
+ ...opts?.name ? { name: opts.name } : {}
113
+ });
114
+ }
86
115
  function slotsOf(entries) {
87
116
  const out = {};
88
117
  for (const [k, v] of Object.entries(entries)) {
@@ -131,7 +160,7 @@ function numImpl2Abs(fn) {
131
160
  function strToStrImplAbs(fn) {
132
161
  return (args) => {
133
162
  const s = absStrLit(args[0]);
134
- return s !== void 0 ? strLit(fn(s)) : void 0;
163
+ return s !== void 0 ? strLit2(fn(s)) : void 0;
135
164
  };
136
165
  }
137
166
  function defineEnv() {
@@ -166,7 +195,7 @@ function defineEnv() {
166
195
  if (v === void 0 && a.term?.op !== "lit") return void 0;
167
196
  try {
168
197
  const result = JSON.stringify(v);
169
- return result === void 0 ? undef() : strLit(result);
198
+ return result === void 0 ? undef() : strLit2(result);
170
199
  } catch {
171
200
  return void 0;
172
201
  }
@@ -213,7 +242,7 @@ function defineEnv() {
213
242
  if (!a) return void 0;
214
243
  const v = litValue(a);
215
244
  if (v === null || v === void 0) return void 0;
216
- return strLit(String(v));
245
+ return strLit2(String(v));
217
246
  };
218
247
  const isArrayImplAbs = (args) => {
219
248
  const a = args[0];
@@ -316,12 +345,12 @@ function defineEnv() {
316
345
  prim.str(),
317
346
  strToStrImplAbs(decodeURIComponent)
318
347
  ),
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")),
348
+ Error: envFn([prim.str()], errorBrandOf("Error")),
349
+ TypeError: envFn([prim.str()], errorBrandOf("TypeError")),
350
+ RangeError: envFn([prim.str()], errorBrandOf("RangeError")),
351
+ SyntaxError: envFn([prim.str()], errorBrandOf("SyntaxError")),
352
+ ReferenceError: envFn([prim.str()], errorBrandOf("ReferenceError")),
353
+ URIError: envFn([prim.str()], errorBrandOf("URIError")),
325
354
  Promise: objAbs({
326
355
  resolve: envFn([prim.unknown], promiseOf(prim.unknown), promiseResolveImplAbs),
327
356
  reject: envFn([prim.unknown], promiseOf(prim.never)),
@@ -380,6 +409,7 @@ export {
380
409
  promiseOf,
381
410
  brandOf,
382
411
  envFn,
412
+ envFnVariadic,
383
413
  objAbs,
384
414
  prim,
385
415
  defineEnv
package/dist/es.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  defineEnv
3
- } from "./chunk-BPVYU23Z.js";
3
+ } from "./chunk-6RZUMVN5.js";
4
4
  export {
5
5
  defineEnv
6
6
  };
package/dist/node.js CHANGED
@@ -3,6 +3,7 @@ import {
3
3
  brandOf,
4
4
  defineEnv,
5
5
  envFn,
6
+ envFnVariadic,
6
7
  nullLit,
7
8
  objAbs,
8
9
  prim,
@@ -10,7 +11,7 @@ import {
10
11
  tupleOf,
11
12
  undef,
12
13
  unionOf
13
- } from "./chunk-BPVYU23Z.js";
14
+ } from "./chunk-6RZUMVN5.js";
14
15
 
15
16
  // src/node.ts
16
17
  import {
@@ -130,6 +131,106 @@ function defineEnv2() {
130
131
  chmodSync: envFn([prim.str(), prim.num()], undef()),
131
132
  chownSync: envFn([prim.str(), prim.num(), prim.num()], undef()),
132
133
  accessSync: envFn([prim.str(), prim.num()], undef()),
134
+ // Callback-style async on `fs` / `node:fs` (Node actual API).
135
+ // Promise APIs live only under fs.promises / node:fs/promises.
136
+ readFile: envFn(
137
+ [prim.str(), prim.unknown, prim.unknown],
138
+ undef(),
139
+ void 0,
140
+ { params: ["path", "options?", "callback"] }
141
+ ),
142
+ writeFile: envFn(
143
+ [prim.str(), unionOf(prim.str(), bufferBrand), prim.unknown],
144
+ undef(),
145
+ void 0,
146
+ { params: ["path", "data", "callback"] }
147
+ ),
148
+ mkdir: envFn(
149
+ [prim.str(), prim.unknown, prim.unknown],
150
+ undef(),
151
+ void 0,
152
+ { params: ["path", "options?", "callback"] }
153
+ ),
154
+ rm: envFn(
155
+ [prim.str(), prim.unknown, prim.unknown],
156
+ undef(),
157
+ void 0,
158
+ { params: ["path", "options?", "callback"] }
159
+ ),
160
+ stat: envFn(
161
+ [prim.str(), prim.unknown, prim.unknown],
162
+ undef(),
163
+ void 0,
164
+ { params: ["path", "options?", "callback"] }
165
+ ),
166
+ readdir: envFn(
167
+ [prim.str(), prim.unknown, prim.unknown],
168
+ undef(),
169
+ void 0,
170
+ { params: ["path", "options?", "callback"] }
171
+ ),
172
+ access: envFn(
173
+ [prim.str(), prim.unknown, prim.unknown],
174
+ undef(),
175
+ void 0,
176
+ { params: ["path", "mode?", "callback"] }
177
+ ),
178
+ appendFile: envFn(
179
+ [prim.str(), unionOf(prim.str(), bufferBrand), prim.unknown],
180
+ undef(),
181
+ void 0,
182
+ { params: ["path", "data", "callback"] }
183
+ ),
184
+ unlink: envFn(
185
+ [prim.str(), prim.unknown, prim.unknown],
186
+ undef(),
187
+ void 0,
188
+ { params: ["path", "options?", "callback"] }
189
+ ),
190
+ rename: envFn(
191
+ [prim.str(), prim.str(), prim.unknown],
192
+ undef(),
193
+ void 0,
194
+ { params: ["oldPath", "newPath", "callback"] }
195
+ ),
196
+ copyFile: envFn(
197
+ [prim.str(), prim.str(), prim.unknown],
198
+ undef(),
199
+ void 0,
200
+ { params: ["src", "dest", "callback"] }
201
+ ),
202
+ realpath: envFn(
203
+ [prim.str(), prim.unknown, prim.unknown],
204
+ undef(),
205
+ void 0,
206
+ { params: ["path", "options?", "callback"] }
207
+ ),
208
+ readlink: envFn(
209
+ [prim.str(), prim.unknown, prim.unknown],
210
+ undef(),
211
+ void 0,
212
+ { params: ["path", "options?", "callback"] }
213
+ ),
214
+ symlink: envFn(
215
+ [prim.str(), prim.str(), prim.unknown, prim.unknown],
216
+ undef(),
217
+ void 0,
218
+ { params: ["target", "path", "type?", "callback"] }
219
+ ),
220
+ chmod: envFn(
221
+ [prim.str(), prim.num(), prim.unknown],
222
+ undef(),
223
+ void 0,
224
+ { params: ["path", "mode", "callback"] }
225
+ ),
226
+ open: envFn(
227
+ [prim.str(), prim.unknown, prim.unknown],
228
+ undef(),
229
+ void 0,
230
+ { params: ["path", "flags?", "callback"] }
231
+ )
232
+ };
233
+ const fsPromisesModule = {
133
234
  readFile: envFn(
134
235
  [prim.str(), prim.unknown],
135
236
  promiseOf(unionOf(prim.str(), bufferBrand))
@@ -148,7 +249,19 @@ function defineEnv2() {
148
249
  [prim.str(), prim.unknown],
149
250
  promiseOf(arrOf(prim.unknown))
150
251
  ),
151
- access: envFn([prim.str(), prim.num()], promiseOf(undef()))
252
+ access: envFn([prim.str(), prim.num()], promiseOf(undef())),
253
+ appendFile: envFn(
254
+ [prim.str(), unionOf(prim.str(), bufferBrand)],
255
+ promiseOf(undef())
256
+ ),
257
+ unlink: envFn([prim.str()], promiseOf(undef())),
258
+ rename: envFn([prim.str(), prim.str()], promiseOf(undef())),
259
+ copyFile: envFn([prim.str(), prim.str()], promiseOf(undef())),
260
+ realpath: envFn([prim.str()], promiseOf(prim.str())),
261
+ readlink: envFn([prim.str()], promiseOf(prim.str())),
262
+ symlink: envFn([prim.str(), prim.str()], promiseOf(undef())),
263
+ chmod: envFn([prim.str(), prim.num()], promiseOf(undef())),
264
+ open: envFn([prim.str(), prim.str()], promiseOf(prim.unknown))
152
265
  };
153
266
  const strImpl1Abs = (fn) => (args) => {
154
267
  const a = absStr(args[0]);
@@ -178,10 +291,21 @@ function defineEnv2() {
178
291
  return p !== void 0 ? boolLit(nodePath.isAbsolute(p)) : void 0;
179
292
  };
180
293
  const pathModule = {
181
- join: envFn([prim.str(), prim.str()], prim.str(), pathJoinAbs),
182
- resolve: envFn([prim.str()], prim.str(), pathResolveAbs),
294
+ // Node variadic: declare min required arity + rest label (not n fixed slots).
295
+ join: envFnVariadic(prim.str(), prim.str(), {
296
+ apply: pathJoinAbs,
297
+ required: [prim.str()],
298
+ restName: "...paths"
299
+ }),
300
+ resolve: envFnVariadic(prim.str(), prim.str(), {
301
+ apply: pathResolveAbs,
302
+ restName: "...paths"
303
+ }),
183
304
  dirname: envFn([prim.str()], prim.str(), strImpl1Abs(nodePath.dirname)),
184
- basename: envFn([prim.str(), prim.str()], prim.str(), pathBasenameAbs),
305
+ // ext is optional in Node — required arity 1; label+type render `ext?: string`.
306
+ basename: envFn([prim.str(), prim.str()], prim.str(), pathBasenameAbs, {
307
+ params: ["path", "ext?"]
308
+ }),
185
309
  extname: envFn([prim.str()], prim.str(), strImpl1Abs(nodePath.extname)),
186
310
  relative: envFn([prim.str(), prim.str()], prim.str(), pathRelativeAbs),
187
311
  normalize: envFn([prim.str()], prim.str(), strImpl1Abs(nodePath.normalize)),
@@ -259,6 +383,7 @@ function defineEnv2() {
259
383
  toJSON: envFn([], prim.str())
260
384
  });
261
385
  const urlModule = {
386
+ // base is optional in Node — required arity 1; label+type render `base?: string`.
262
387
  URL: envFn(
263
388
  [prim.str(), prim.str()],
264
389
  nodeUrlObj,
@@ -286,7 +411,8 @@ function defineEnv2() {
286
411
  } catch {
287
412
  return void 0;
288
413
  }
289
- }
414
+ },
415
+ { params: ["href", "base?"] }
290
416
  ),
291
417
  URLSearchParams: envFn(
292
418
  [prim.unknown],
@@ -384,15 +510,27 @@ function defineEnv2() {
384
510
  fork: envFn([prim.str(), arrOf(prim.str()), prim.unknown], prim.unknown)
385
511
  };
386
512
  const utilModule = {
387
- promisify: envFn([prim.unknown], prim.unknown),
513
+ // Signature-level: promisify preserves fn-ness only as unknown (no generic).
514
+ promisify: envFn([prim.unknown], prim.unknown, void 0, { name: "util.promisify" }),
388
515
  inspect: envFn([prim.unknown, prim.unknown], prim.str()),
389
- format: envFn([prim.str()], prim.str()),
516
+ format: envFnVariadic(prim.unknown, prim.str(), {
517
+ // util.format() with zero args is valid in Node.
518
+ restName: "...args",
519
+ name: "util.format"
520
+ }),
521
+ callbackify: envFn([prim.unknown], prim.unknown),
522
+ deprecate: envFn([prim.unknown, prim.str()], prim.unknown),
523
+ inherits: envFn([prim.unknown, prim.unknown], undef()),
524
+ isDeepStrictEqual: envFn([prim.unknown, prim.unknown], prim.bool()),
390
525
  types: objAbs({
391
526
  isDate: envFn([prim.unknown], prim.bool()),
392
527
  isRegExp: envFn([prim.unknown], prim.bool()),
393
528
  isPromise: envFn([prim.unknown], prim.bool()),
394
529
  isArrayBuffer: envFn([prim.unknown], prim.bool()),
395
- isTypedArray: envFn([prim.unknown], prim.bool())
530
+ isTypedArray: envFn([prim.unknown], prim.bool()),
531
+ isNativeError: envFn([prim.unknown], prim.bool()),
532
+ isAsyncFunction: envFn([prim.unknown], prim.bool()),
533
+ isGeneratorFunction: envFn([prim.unknown], prim.bool())
396
534
  }),
397
535
  TextEncoder: envFn(
398
536
  [],
@@ -403,6 +541,79 @@ function defineEnv2() {
403
541
  objAbs({ decode: envFn([prim.unknown], prim.str()) })
404
542
  )
405
543
  };
544
+ const eventEmitterShape = objAbs({
545
+ on: envFn([prim.str(), prim.unknown], prim.unknown),
546
+ once: envFn([prim.str(), prim.unknown], prim.unknown),
547
+ off: envFn([prim.str(), prim.unknown], prim.unknown),
548
+ emit: envFn([prim.str()], prim.bool()),
549
+ addListener: envFn([prim.str(), prim.unknown], prim.unknown),
550
+ removeListener: envFn([prim.str(), prim.unknown], prim.unknown),
551
+ removeAllListeners: envFn([prim.str()], prim.unknown),
552
+ listeners: envFn([prim.str()], arrOf(prim.unknown)),
553
+ listenerCount: envFn([prim.str()], prim.num()),
554
+ eventNames: envFn([], arrOf(prim.str()))
555
+ });
556
+ const eventEmitterInstance = brandOf("EventEmitter", eventEmitterShape);
557
+ const EventEmitterCtor = envFn([prim.unknown], eventEmitterInstance, void 0, {
558
+ params: ["options?"]
559
+ });
560
+ const eventsModule = {
561
+ EventEmitter: EventEmitterCtor,
562
+ once: envFn(
563
+ [prim.unknown, prim.str()],
564
+ promiseOf(arrOf(prim.unknown))
565
+ ),
566
+ on: envFn([prim.unknown, prim.str()], prim.unknown),
567
+ listenerCount: envFn([prim.unknown, prim.str()], prim.num())
568
+ };
569
+ const streamIoMethods = {
570
+ on: envFn([prim.str(), prim.unknown], prim.unknown),
571
+ once: envFn([prim.str(), prim.unknown], prim.unknown),
572
+ off: envFn([prim.str(), prim.unknown], prim.unknown),
573
+ emit: envFn([prim.str()], prim.bool()),
574
+ pipe: envFn([prim.unknown], prim.unknown),
575
+ destroy: envFn([prim.unknown], undef()),
576
+ read: envFn([prim.num()], prim.unknown),
577
+ write: envFn([unionOf(prim.str(), bufferBrand)], prim.bool()),
578
+ end: envFn([prim.unknown], undef()),
579
+ pause: envFn([], prim.unknown),
580
+ resume: envFn([], prim.unknown),
581
+ setEncoding: envFn([prim.str()], prim.unknown)
582
+ };
583
+ const streamCtor = (brandName) => envFn([prim.unknown], brandOf(brandName, objAbs(streamIoMethods)), void 0, {
584
+ params: ["options?"]
585
+ });
586
+ const streamModule = {
587
+ Readable: streamCtor("Readable"),
588
+ Writable: streamCtor("Writable"),
589
+ Duplex: streamCtor("Duplex"),
590
+ Transform: streamCtor("Transform"),
591
+ pipeline: envFnVariadic(prim.unknown, promiseOf(undef()), {
592
+ restName: "...streams"
593
+ }),
594
+ finished: envFn([prim.unknown], promiseOf(undef()))
595
+ };
596
+ const parsedQueryString = brandOf(
597
+ "ParsedQueryString",
598
+ objAbs({})
599
+ );
600
+ const querystringModule = {
601
+ // sep/eq/options optional — required arity 1; labels+types render `sep?: string` etc.
602
+ parse: envFn(
603
+ [prim.str(), prim.str(), prim.str(), prim.unknown],
604
+ parsedQueryString,
605
+ void 0,
606
+ { params: ["str", "sep?", "eq?", "options?"] }
607
+ ),
608
+ stringify: envFn(
609
+ [prim.unknown, prim.str(), prim.str(), prim.unknown],
610
+ prim.str(),
611
+ void 0,
612
+ { params: ["obj", "sep?", "eq?", "options?"] }
613
+ ),
614
+ escape: envFn([prim.str()], prim.str()),
615
+ unescape: envFn([prim.str()], prim.str())
616
+ };
406
617
  const nodeGlobals = {
407
618
  process: objAbs({
408
619
  env: objAbs({}),
@@ -472,15 +683,8 @@ function defineEnv2() {
472
683
  const modules = {
473
684
  fs: fsModule,
474
685
  "node:fs": fsModule,
475
- "node:fs/promises": {
476
- readFile: fsModule.readFile,
477
- writeFile: fsModule.writeFile,
478
- mkdir: fsModule.mkdir,
479
- rm: fsModule.rm,
480
- stat: fsModule.stat,
481
- readdir: fsModule.readdir,
482
- access: fsModule.access
483
- },
686
+ "fs/promises": fsPromisesModule,
687
+ "node:fs/promises": fsPromisesModule,
484
688
  path: pathModule,
485
689
  "node:path": pathModule,
486
690
  os: osModule,
@@ -492,7 +696,13 @@ function defineEnv2() {
492
696
  child_process: childProcessModule,
493
697
  "node:child_process": childProcessModule,
494
698
  util: utilModule,
495
- "node:util": utilModule
699
+ "node:util": utilModule,
700
+ events: eventsModule,
701
+ "node:events": eventsModule,
702
+ stream: streamModule,
703
+ "node:stream": streamModule,
704
+ querystring: querystringModule,
705
+ "node:querystring": querystringModule
496
706
  };
497
707
  return {
498
708
  globals: { ...esEnv.globals, ...nodeGlobals },
package/dist/web.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  promiseOf,
9
9
  undef,
10
10
  unionOf
11
- } from "./chunk-BPVYU23Z.js";
11
+ } from "./chunk-6RZUMVN5.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.2.5",
3
+ "version": "0.4.0",
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.0.1"
38
+ "@nudojs/core": "2.0.1"
39
39
  },
40
40
  "scripts": {
41
41
  "build": "tsup src/es.ts src/web.ts src/node.ts --format esm --dts"