@ix-xs/node-comfort 2.0.0 → 2.1.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.
- package/CHANGELOG.md +150 -0
- package/README.md +32 -30
- package/index.js +3 -3
- package/package.json +8 -7
- package/src/Arr.js +222 -58
- package/src/Async.js +322 -90
- package/src/Cache.js +148 -44
- package/src/Checker.js +257 -26
- package/src/Cli.js +404 -145
- package/src/Color.js +224 -83
- package/src/Crypto.js +481 -106
- package/src/Emitter.js +104 -37
- package/src/Env.js +176 -42
- package/src/FS.js +203 -60
- package/src/Func.js +226 -76
- package/src/Http.js +311 -149
- package/src/Id.js +281 -96
- package/src/Logger.js +302 -78
- package/src/Num.js +182 -60
- package/src/Obj.js +340 -125
- package/src/SQLite.js +426 -105
- package/src/Schema.js +602 -87
- package/src/Str.js +316 -86
- package/src/Sys.js +197 -54
- package/src/Time.js +572 -317
- package/src/Utils.js +62 -41
- package/src/errors.js +54 -11
- package/src/internal/shared.js +415 -0
- package/types/index.d.ts +59 -17
- package/types/src/Arr.d.ts +78 -0
- package/types/src/Arr.d.ts.map +1 -1
- package/types/src/Async.d.ts +52 -1
- package/types/src/Async.d.ts.map +1 -1
- package/types/src/Cache.d.ts +33 -7
- package/types/src/Cache.d.ts.map +1 -1
- package/types/src/Checker.d.ts +155 -2
- package/types/src/Checker.d.ts.map +1 -1
- package/types/src/Cli.d.ts +97 -15
- package/types/src/Cli.d.ts.map +1 -1
- package/types/src/Color.d.ts +7 -1
- package/types/src/Color.d.ts.map +1 -1
- package/types/src/Crypto.d.ts +99 -13
- package/types/src/Crypto.d.ts.map +1 -1
- package/types/src/Emitter.d.ts +36 -17
- package/types/src/Emitter.d.ts.map +1 -1
- package/types/src/Env.d.ts +31 -1
- package/types/src/Env.d.ts.map +1 -1
- package/types/src/FS.d.ts +36 -5
- package/types/src/FS.d.ts.map +1 -1
- package/types/src/Func.d.ts +147 -19
- package/types/src/Func.d.ts.map +1 -1
- package/types/src/Http.d.ts +113 -43
- package/types/src/Http.d.ts.map +1 -1
- package/types/src/Id.d.ts +60 -8
- package/types/src/Id.d.ts.map +1 -1
- package/types/src/Logger.d.ts +53 -2
- package/types/src/Logger.d.ts.map +1 -1
- package/types/src/Num.d.ts +48 -7
- package/types/src/Num.d.ts.map +1 -1
- package/types/src/Obj.d.ts +67 -4
- package/types/src/Obj.d.ts.map +1 -1
- package/types/src/SQLite.d.ts +123 -14
- package/types/src/SQLite.d.ts.map +1 -1
- package/types/src/Schema.d.ts +256 -7
- package/types/src/Schema.d.ts.map +1 -1
- package/types/src/Str.d.ts +49 -1
- package/types/src/Str.d.ts.map +1 -1
- package/types/src/Sys.d.ts +51 -6
- package/types/src/Sys.d.ts.map +1 -1
- package/types/src/Time.d.ts +130 -34
- package/types/src/Time.d.ts.map +1 -1
- package/types/src/Utils.d.ts +15 -11
- package/types/src/Utils.d.ts.map +1 -1
- package/types/src/errors.d.ts +27 -3
- package/types/src/errors.d.ts.map +1 -1
- package/types/src/internal/shared.d.ts +123 -0
- package/types/src/internal/shared.d.ts.map +1 -0
package/types/src/Env.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ declare namespace _exports {
|
|
|
17
17
|
export { json };
|
|
18
18
|
export { oneOf };
|
|
19
19
|
export { validate };
|
|
20
|
+
export { example };
|
|
20
21
|
export { mode };
|
|
21
22
|
export { isProduction };
|
|
22
23
|
export { isDevelopment };
|
|
@@ -39,6 +40,10 @@ type EnvLoadOptions = {
|
|
|
39
40
|
* Throw if a file is missing.
|
|
40
41
|
*/
|
|
41
42
|
required?: boolean | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Also load the files that go with each one: `.env.production.local`, `.env.local`, `.env.production`, then `.env`. `true` takes the mode from `NODE_ENV`; a string names it. `.env.local` is skipped in test mode, so tests run the same for everyone.
|
|
45
|
+
*/
|
|
46
|
+
cascade?: string | boolean | undefined;
|
|
42
47
|
/**
|
|
43
48
|
* Where to put the variables. Defaults to `process.env`.
|
|
44
49
|
*/
|
|
@@ -165,12 +170,14 @@ declare function parse(content: string, options?: EnvParseOptions): Record<strin
|
|
|
165
170
|
/**
|
|
166
171
|
* Loads `.env` files into `process.env`. The first file to set a variable
|
|
167
172
|
* wins, and variables that are already set are kept, unless you pass
|
|
168
|
-
* `override`.
|
|
173
|
+
* `override`. The `.env` loaded by itself at startup doesn't count as
|
|
174
|
+
* already set: `.env.local` wins over it, as you'd expect.
|
|
169
175
|
*
|
|
170
176
|
* @example
|
|
171
177
|
* env.load(); // ./.env
|
|
172
178
|
* env.load([".env.local", ".env"]); // local values win
|
|
173
179
|
* env.load(".env.test", { override: true });
|
|
180
|
+
* env.load(".env", { cascade: true }); // .env.production.local, .env.local, .env.production, .env
|
|
174
181
|
*
|
|
175
182
|
* @param {string | string[]} [files=".env"] Relative to the working directory.
|
|
176
183
|
* @param {EnvLoadOptions} [options]
|
|
@@ -357,6 +364,29 @@ declare function oneOf<V extends string>(name: string, values: readonly V[], opt
|
|
|
357
364
|
declare function validate<T extends Record<string, EnvVarSpec>>(spec: T, options?: {
|
|
358
365
|
env?: NodeJS.ProcessEnv;
|
|
359
366
|
}): Readonly<EnvConfig<T>>;
|
|
367
|
+
/**
|
|
368
|
+
* Writes the `.env.example` that goes with a `validate()` spec: one entry
|
|
369
|
+
* per variable, with its description, type and default. Keep the file in
|
|
370
|
+
* the repository so nobody has to read the code to know what to set.
|
|
371
|
+
*
|
|
372
|
+
* @example
|
|
373
|
+
* const spec = {
|
|
374
|
+
* PORT: { type: "port", default: 3000, description: "Port to listen on" },
|
|
375
|
+
* DATABASE_URL: { type: "url", description: "Postgres connection string" },
|
|
376
|
+
* };
|
|
377
|
+
* fs.writeFileSync(".env.example", env.example(spec));
|
|
378
|
+
* // # Port to listen on
|
|
379
|
+
* // # port, default: 3000
|
|
380
|
+
* // PORT=3000
|
|
381
|
+
* //
|
|
382
|
+
* // # Postgres connection string
|
|
383
|
+
* // # url, required
|
|
384
|
+
* // DATABASE_URL=
|
|
385
|
+
*
|
|
386
|
+
* @param {Record<string, EnvVarSpec>} spec
|
|
387
|
+
* @returns {string}
|
|
388
|
+
*/
|
|
389
|
+
declare function example(spec: Record<string, EnvVarSpec>): string;
|
|
360
390
|
/**
|
|
361
391
|
* `NODE_ENV`, or `"development"` when it's not set.
|
|
362
392
|
*
|
package/types/src/Env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Env.d.ts","sourceRoot":"","sources":["../../src/Env.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Env.d.ts","sourceRoot":"","sources":["../../src/Env.js"],"names":[],"mappings":"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"}
|
package/types/src/FS.d.ts
CHANGED
|
@@ -124,9 +124,13 @@ export type WriteFileOptions = {
|
|
|
124
124
|
*/
|
|
125
125
|
encoding?: BufferEncoding | undefined;
|
|
126
126
|
/**
|
|
127
|
-
* Permissions, like `0o600` for secrets.
|
|
127
|
+
* Permissions, like `0o600` for secrets. A file that already exists keeps the ones it has.
|
|
128
128
|
*/
|
|
129
129
|
mode?: number | undefined;
|
|
130
|
+
/**
|
|
131
|
+
* Wait until the data is on the disk before returning. Slower, for files that must survive a power cut.
|
|
132
|
+
*/
|
|
133
|
+
fsync?: boolean | undefined;
|
|
130
134
|
/**
|
|
131
135
|
* Indentation when writing an object as JSON. Defaults to `2`.
|
|
132
136
|
*/
|
|
@@ -148,6 +152,14 @@ export type WriteJSONOptions = {
|
|
|
148
152
|
* Passed to `JSON.stringify`.
|
|
149
153
|
*/
|
|
150
154
|
replacer?: ((key: string, value: unknown) => unknown) | undefined;
|
|
155
|
+
/**
|
|
156
|
+
* Permissions, like `0o600` for secrets. A file that already exists keeps the ones it has.
|
|
157
|
+
*/
|
|
158
|
+
mode?: number | undefined;
|
|
159
|
+
/**
|
|
160
|
+
* Wait until the data is on the disk before returning.
|
|
161
|
+
*/
|
|
162
|
+
fsync?: boolean | undefined;
|
|
151
163
|
};
|
|
152
164
|
/**
|
|
153
165
|
* Options for `readJSON()`.
|
|
@@ -238,18 +250,18 @@ export type WatchOptions = {
|
|
|
238
250
|
*/
|
|
239
251
|
filter?: ((event: "rename" | "change", file: string) => boolean) | undefined;
|
|
240
252
|
/**
|
|
241
|
-
* Merge events on the same file within this
|
|
253
|
+
* Merge events on the same file within this long, in ms or like `"100ms"`. Editors often save in several steps.
|
|
242
254
|
*/
|
|
243
|
-
debounce?: number | undefined;
|
|
255
|
+
debounce?: string | number | undefined;
|
|
244
256
|
};
|
|
245
257
|
/**
|
|
246
258
|
* Returned by `watch()`.
|
|
247
259
|
*/
|
|
248
260
|
export type Watcher = {
|
|
249
261
|
/**
|
|
250
|
-
* Listens for changes. `"all"` also gets the event name.
|
|
262
|
+
* Listens for changes. `"all"` also gets the event name. `"error"` tells you the watch broke, for instance because the folder was deleted.
|
|
251
263
|
*/
|
|
252
|
-
on: <E extends "change" | "rename" | "all">(event: E, callback: E extends "all" ? (event: "change" | "rename", file: string) => void : (file: string) => void) => Watcher;
|
|
264
|
+
on: <E extends "change" | "rename" | "all" | "error">(event: E, callback: E extends "all" ? (event: "change" | "rename", file: string) => void : E extends "error" ? (error: Error) => void : (file: string) => void) => Watcher;
|
|
253
265
|
/**
|
|
254
266
|
* Stops watching.
|
|
255
267
|
*/
|
|
@@ -355,6 +367,25 @@ export function glob(pattern: string | string[], options?: GlobOptions): string[
|
|
|
355
367
|
* @returns {string | undefined} The absolute path.
|
|
356
368
|
*/
|
|
357
369
|
export function find(name: string, options?: FindOptions): string | undefined;
|
|
370
|
+
/**
|
|
371
|
+
* Looks for a file or folder in a folder, then in its parent, and so on up
|
|
372
|
+
* to the root. It's how you find the `package.json` or the `.git` a file
|
|
373
|
+
* belongs to.
|
|
374
|
+
*
|
|
375
|
+
* @example
|
|
376
|
+
* nc.findUp("package.json"); // the closest one above the working directory
|
|
377
|
+
* nc.findUp(".git", { type: "folder", cwd: __dirname });
|
|
378
|
+
* nc.findUp(["pnpm-lock.yaml", "yarn.lock", "package-lock.json"]);
|
|
379
|
+
*
|
|
380
|
+
* @param {string | string[]} name One name, or several to try in each folder, in this order.
|
|
381
|
+
* @param {{ cwd?: string, type?: "file" | "folder" | "any", stopAt?: string }} [options] Where to start (the working directory by default), what to look for (`"any"` by default), and a folder not to go above.
|
|
382
|
+
* @returns {string | undefined} The absolute path.
|
|
383
|
+
*/
|
|
384
|
+
export function findUp(name: string | string[], options?: {
|
|
385
|
+
cwd?: string;
|
|
386
|
+
type?: "file" | "folder" | "any";
|
|
387
|
+
stopAt?: string;
|
|
388
|
+
}): string | undefined;
|
|
358
389
|
/**
|
|
359
390
|
* Reads a file as text, or as a Buffer with `"buffer"`.
|
|
360
391
|
*
|
package/types/src/FS.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FS.d.ts","sourceRoot":"","sources":["../../src/FS.js"],"names":[],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"FS.d.ts","sourceRoot":"","sources":["../../src/FS.js"],"names":[],"mappings":";;;;;;;UA8Bc,MAAM;;;;;;;;;;;;;;;;;;;;uBAKG,MAAM,KAAK,OAAO;;;;;;;;;UAM3B,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;UAUN,MAAM;;;;;;;;;;;;;;;;qBAIC,MAAM,KAAK,OAAO;;;;;;;;;UAMzB,MAAM;;;;UACN,MAAM;;;;;;;;;;;;;;;;;uBAQG,MAAM,eAAe,MAAM,KAAK,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAmB1C,MAAM,SAAS,OAAO,KAAK,OAAO;;;;;;;;;;;;;;;;;;;;;qBASlC,MAAM,SAAS,GAAG,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAkCxB,QAAQ,GAAG,QAAQ,QAAQ,MAAM,KAAK,OAAO;;;;;;;;;;;;;QAOrD,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,KAAK,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,SAAS,OAAO,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAAK,OAAO;;;;UAC5N,MAAM,IAAI;;;;WACV,MAAM,OAAO;YACb,MAAM,OAAO;;AA6U3B;;;;;;;;;GASG;AACH,6BAJW,MAAM,aACN,MAAM,GACJ,MAAM,GAAG,SAAS,CAI9B;AAED;;;;;;;;;GASG;AACH,kCAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;GAQG;AACH,iCAHW,MAAM,GACJ,MAAM,GAAG,SAAS,CAI9B;AAED;;;;;GAKG;AACH,8BAHW,MAAM,GACJ,MAAM,GAAG,SAAS,CAI9B;AAED;;;;;;;;;;;GAWG;AACH,oCAJW,MAAM,cACN,OAAO,GAAG,WAAW,GACnB,MAAM,EAAE,GAAG,SAAS,CAKhC;AAED;;;;;;;;;;GAUG;AACH,kCAJW,MAAM,cACN,OAAO,GAAG,WAAW,GACnB,MAAM,EAAE,GAAG,SAAS,CAKhC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,8BAJW,MAAM,GAAG,MAAM,EAAE,YACjB,WAAW,GACT,MAAM,EAAE,CAiBpB;AAyDD;;;;;;;;;;;GAWG;AACH,2BAJW,MAAM,YACN,WAAW,GACT,MAAM,GAAG,SAAS,CAsB9B;AAED;;;;;;;;;;;;;GAaG;AACH,6BAJW,MAAM,GAAG,MAAM,EAAE,YACjB;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACjE,MAAM,GAAG,SAAS,CAgB9B;;;;;;;;;;;;;AASE,+BACQ,MAAM,YACN,QAAQ,GACN,MAAM,GAAG,SAAS,CAC9B;;;;;;;;;AAIE,+BACQ,MAAM,0CAEJ,MAAM,GAAG,SAAS,CAC9B;AAgBD;;;;;;;;GAQG;AACH,gCAHW,MAAM,GACJ,MAAM,EAAE,GAAG,SAAS,CAOhC;AAED;;;;;;;;;;;;;GAaG;AACH,yBANc,CAAC,cACJ,MAAM,aACN,CAAC,YACD,eAAe,GACb,CAAC,CAWb;AAED;;;;;;;;;;;;GAYG;AACH,gCALW,MAAM,QACN,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,YACrC,gBAAgB,GACd,OAAO,CASnB;AAED;;;;;;;;;;GAUG;AACH,gCALW,MAAM,QACN,OAAO,YACP,gBAAgB,GACd,OAAO,CAWnB;AAED;;;;;;;;;GASG;AACH,iCAJW,MAAM,QACN,MAAM,GAAG,MAAM,GACb,OAAO,CAiBnB;AAED;;;;;;;;;;;GAWG;AACH,iCALW,MAAM,UACN,OAAO,SACP,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAC7B,OAAO,GAAG,SAAS,CAY/B;AAED;;;;;;;;;;GAUG;AACH,mCAJW,MAAM,UACN,OAAO,GACL,OAAO,GAAG,SAAS,CAe/B;AAED;;;;;;;;;GASG;AACH,mCAJW,MAAM,GACJ,MAAM,CAOlB;AAED;;;;;;;GAOG;AACH,iCAJW,MAAM,GACJ,MAAM,CAUlB;AAED;;;;;;GAMG;AACH,4BAHW,MAAM,GACJ,OAAO,CAWnB;AAED;;;;;GAKG;AACH,mCAHW,MAAM,GACJ,OAAO,GAAG,SAAS,CAW/B;AAED;;;;;GAKG;AACH,iCAHW,MAAM,GACJ,OAAO,GAAG,SAAS,CAW/B;AAED;;;;;;;;;GASG;AACH,6BAHW,MAAM,GACJ,OAAO,CAWnB;AAED;;;;;;;;;GASG;AACH,uCAJW,MAAM,WACN,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GACzB,MAAM,GAAG,SAAS,CAY9B;AAED;;;;;;;;;;GAUG;AACH,qCALW,MAAM,cACN,OAAO,WACP,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACvB,MAAM,GAAG,SAAS,CAgB9B;AAED;;;;;GAKG;AACH,kCAHW,MAAM,GACJ,OAAO,GAAG,SAAS,CAW/B;AAED;;;;;;;;;;;GAWG;AACH,6BALW,MAAM,eACN,MAAM,YACN,WAAW,GACT,OAAO,CAmBnB;AAED;;;;;;;;;;GAUG;AACH,6BALW,MAAM,eACN,MAAM,YACN;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GACrB,OAAO,CA6BnB;AAED;;;;;;GAMG;AACH,uCAHW,kBAAkB,GAChB,MAAM,GAAG,SAAS,CAoB9B;AAED;;;;;;GAMG;AACH,oCAHW,iBAAiB,GACf,OAAO,GAAG,SAAS,CAqB/B;AAED;;;;;;;;GAQG;AACH,qCAHW,gBAAgB,GACd,MAAM,GAAG,SAAS,CAkB9B;AAED;;;;;;;;;GASG;AACH,kCAHW,eAAe,GACb,OAAO,GAAG,SAAS,CAe/B;AAED;;;;;GAKG;AACH,uCAHW,kBAAkB,GAChB,MAAM,GAAG,SAAS,CAW9B;AAED;;;;;GAKG;AACH,oCAHW,iBAAiB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC,OAAO,GAAG,SAAS,CAO/B;AAED;;;;;GAKG;AACH,qCAHW,gBAAgB,GACd,MAAM,GAAG,SAAS,CAU9B;AAED;;;;;;;;GAQG;AACH,kCAHW,eAAe,GACb,OAAO,GAAG,SAAS,CAO/B;AAED;;;;;GAKG;AACH,6BAHW,MAAM,GACJ,OAAO,CAInB;AAED;;;;;GAKG;AACH,6BAHW,MAAM,GACJ,OAAO,CAInB;AAED;;;;;GAKG;AACH,+BAHW,MAAM,GACJ,OAAO,CAInB;AAED;;;;;;;;GAQG;AACH,2BAHW,MAAM,GACJ,EAAE,CAAC,KAAK,GAAG,SAAS,CAQhC;AAED;;;;;;;;GAQG;AACH,+BAHW,MAAM,GACJ,MAAM,GAAG,SAAS,CAU9B;AAED;;;;;GAKG;AACH,iCAHW,MAAM,GACJ,MAAM,GAAG,SAAS,CAc9B;AAED;;;;;;;;;;GAUG;AACH,+BAJW,MAAM,YACN;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,WAAW,CAAA;CAAE,GAC/D,MAAM,GAAG,SAAS,CAkB9B;AAED;;;;;;;;;GASG;AACH,oCAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;;;;GAYG;AACH,uCAJW,MAAM,YACN;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACtB,MAAM,CAmBlB;AAED;;;;;;;;;;;GAWG;AACH,gCAHW,YAAY,GACV,OAAO,GAAG,SAAS,CAoF/B"}
|
package/types/src/Func.d.ts
CHANGED
|
@@ -11,9 +11,9 @@ export type DebounceOptions = {
|
|
|
11
11
|
*/
|
|
12
12
|
trailing?: boolean | undefined;
|
|
13
13
|
/**
|
|
14
|
-
* Never postpone a call longer than this,
|
|
14
|
+
* Never postpone a call longer than this, even if calls keep coming. In ms, or like `"2s"`.
|
|
15
15
|
*/
|
|
16
|
-
maxWait?: number | undefined;
|
|
16
|
+
maxWait?: string | number | undefined;
|
|
17
17
|
};
|
|
18
18
|
/**
|
|
19
19
|
* A debounced function. `flush()` runs the pending call now, `cancel()`
|
|
@@ -48,13 +48,13 @@ export type ThrottledFunction<F extends (...args: any[]) => any> = ((...args: Pa
|
|
|
48
48
|
*/
|
|
49
49
|
export type MemoizeOptions = {
|
|
50
50
|
/**
|
|
51
|
-
* Builds the cache key from the arguments.
|
|
51
|
+
* Builds the cache key from the arguments. By default, primitives are compared by value, plain objects and arrays by content, anything else by identity.
|
|
52
52
|
*/
|
|
53
53
|
resolver?: ((...args: any[]) => unknown) | undefined;
|
|
54
54
|
/**
|
|
55
|
-
* How long a result stays cached, in ms
|
|
55
|
+
* How long a result stays cached, in ms or like `"5m"`.
|
|
56
56
|
*/
|
|
57
|
-
ttl?: number | undefined;
|
|
57
|
+
ttl?: string | number | undefined;
|
|
58
58
|
/**
|
|
59
59
|
* Maximum number of results; the least recently used goes first.
|
|
60
60
|
*/
|
|
@@ -84,17 +84,17 @@ export type RetryOptions = {
|
|
|
84
84
|
*/
|
|
85
85
|
attempts?: number | undefined;
|
|
86
86
|
/**
|
|
87
|
-
* Wait before the next attempt, in ms
|
|
87
|
+
* Wait before the next attempt, in ms or like `"1s"`, or a function that computes it.
|
|
88
88
|
*/
|
|
89
|
-
delay?: number | ((attempt: number, error: unknown) => number) | undefined;
|
|
89
|
+
delay?: string | number | ((attempt: number, error: unknown) => number) | undefined;
|
|
90
90
|
/**
|
|
91
91
|
* Multiplies the delay after each failure: `2` gives 200, 400, 800... Defaults to `1`.
|
|
92
92
|
*/
|
|
93
93
|
backoff?: number | undefined;
|
|
94
94
|
/**
|
|
95
|
-
* Cap for the computed delay
|
|
95
|
+
* Cap for the computed delay.
|
|
96
96
|
*/
|
|
97
|
-
maxDelay?: number | undefined;
|
|
97
|
+
maxDelay?: string | number | undefined;
|
|
98
98
|
/**
|
|
99
99
|
* Randomizes the delay, from `0` (none) to `1` (anywhere between 0 and 2x). Stops many clients from retrying in sync.
|
|
100
100
|
*/
|
|
@@ -112,6 +112,86 @@ export type RetryOptions = {
|
|
|
112
112
|
*/
|
|
113
113
|
signal?: AbortSignal | undefined;
|
|
114
114
|
};
|
|
115
|
+
/**
|
|
116
|
+
* Options for `batch()`.
|
|
117
|
+
*/
|
|
118
|
+
export type BatchOptions = {
|
|
119
|
+
/**
|
|
120
|
+
* How long to collect calls before running. By default, calls made in the same tick go together.
|
|
121
|
+
*/
|
|
122
|
+
wait?: string | number | undefined;
|
|
123
|
+
/**
|
|
124
|
+
* Run as soon as this many calls are waiting.
|
|
125
|
+
*/
|
|
126
|
+
max?: number | undefined;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* A batched function. `flush()` runs the waiting calls now.
|
|
130
|
+
*/
|
|
131
|
+
export type BatchedFunction<I, R> = ((item: I) => Promise<R>) & {
|
|
132
|
+
flush(): void;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Options for `debounce()`.
|
|
136
|
+
* @typedef {object} DebounceOptions
|
|
137
|
+
* @property {boolean} [leading] Call right away at the start of a burst.
|
|
138
|
+
* @property {boolean} [trailing] Call once the burst is over. Defaults to `true`.
|
|
139
|
+
* @property {number | string} [maxWait] Never postpone a call longer than this, even if calls keep coming. In ms, or like `"2s"`.
|
|
140
|
+
*/
|
|
141
|
+
/**
|
|
142
|
+
* A debounced function. `flush()` runs the pending call now, `cancel()`
|
|
143
|
+
* drops it, `pending()` tells you if there's one.
|
|
144
|
+
* @template {(...args: any[]) => any} F
|
|
145
|
+
* @typedef {((...args: Parameters<F>) => void) & { cancel(): void, flush(): void, pending(): boolean }} DebouncedFunction
|
|
146
|
+
*/
|
|
147
|
+
/**
|
|
148
|
+
* Options for `throttle()`.
|
|
149
|
+
* @typedef {object} ThrottleOptions
|
|
150
|
+
* @property {boolean} [leading] Call right away on the first call. Defaults to `true`.
|
|
151
|
+
* @property {boolean} [trailing] Make a last call with the latest arguments at the end of the interval. Defaults to `true`.
|
|
152
|
+
*/
|
|
153
|
+
/**
|
|
154
|
+
* A throttled function, with `cancel()`.
|
|
155
|
+
* @template {(...args: any[]) => any} F
|
|
156
|
+
* @typedef {((...args: Parameters<F>) => void) & { cancel(): void }} ThrottledFunction
|
|
157
|
+
*/
|
|
158
|
+
/**
|
|
159
|
+
* Options for `memoize()`.
|
|
160
|
+
* @typedef {object} MemoizeOptions
|
|
161
|
+
* @property {(...args: any[]) => unknown} [resolver] Builds the cache key from the arguments. By default, primitives are compared by value, plain objects and arrays by content, anything else by identity.
|
|
162
|
+
* @property {number | string} [ttl] How long a result stays cached, in ms or like `"5m"`.
|
|
163
|
+
* @property {number} [max] Maximum number of results; the least recently used goes first.
|
|
164
|
+
* @property {boolean} [cacheRejections] Keep rejected promises. By default they're dropped so the next call tries again.
|
|
165
|
+
*/
|
|
166
|
+
/**
|
|
167
|
+
* A memoized function, with its `cache`, `clear()` and `delete(...args)`.
|
|
168
|
+
* @template {(...args: any[]) => any} F
|
|
169
|
+
* @typedef {F & { cache: Map<unknown, { value: ReturnType<F>, expires: number }>, clear(): void, delete(...args: Parameters<F>): boolean }} MemoizedFunction
|
|
170
|
+
*/
|
|
171
|
+
/**
|
|
172
|
+
* Options for `retry()`.
|
|
173
|
+
* @typedef {object} RetryOptions
|
|
174
|
+
* @property {number} [attempts] Total attempts, the first one included. Defaults to `3`.
|
|
175
|
+
* @property {number | string | ((attempt: number, error: unknown) => number)} [delay] Wait before the next attempt, in ms or like `"1s"`, or a function that computes it.
|
|
176
|
+
* @property {number} [backoff] Multiplies the delay after each failure: `2` gives 200, 400, 800... Defaults to `1`.
|
|
177
|
+
* @property {number | string} [maxDelay] Cap for the computed delay.
|
|
178
|
+
* @property {number} [jitter] Randomizes the delay, from `0` (none) to `1` (anywhere between 0 and 2x). Stops many clients from retrying in sync.
|
|
179
|
+
* @property {(error: unknown, attempt: number) => boolean | Promise<boolean>} [shouldRetry] Return `false` to give up early, for example on a 4xx error.
|
|
180
|
+
* @property {(error: unknown, attempt: number, delay: number) => void} [onRetry] Called before each wait, for logs or metrics.
|
|
181
|
+
* @property {AbortSignal} [signal] Stops retrying. The attempt in progress isn't interrupted.
|
|
182
|
+
*/
|
|
183
|
+
/**
|
|
184
|
+
* Options for `batch()`.
|
|
185
|
+
* @typedef {object} BatchOptions
|
|
186
|
+
* @property {number | string} [wait] How long to collect calls before running. By default, calls made in the same tick go together.
|
|
187
|
+
* @property {number} [max] Run as soon as this many calls are waiting.
|
|
188
|
+
*/
|
|
189
|
+
/**
|
|
190
|
+
* A batched function. `flush()` runs the waiting calls now.
|
|
191
|
+
* @template I
|
|
192
|
+
* @template R
|
|
193
|
+
* @typedef {((item: I) => Promise<R>) & { flush(): void }} BatchedFunction
|
|
194
|
+
*/
|
|
115
195
|
/**
|
|
116
196
|
* Waits for a pause of `wait` ms between calls, then runs once with the
|
|
117
197
|
* latest arguments. For search boxes, resizing, auto-saving...
|
|
@@ -124,11 +204,11 @@ export type RetryOptions = {
|
|
|
124
204
|
*
|
|
125
205
|
* @template {(...args: any[]) => any} F
|
|
126
206
|
* @param {F} fn
|
|
127
|
-
* @param {number} wait Pause needed, in ms
|
|
207
|
+
* @param {number | string} wait Pause needed, in ms or like `"300ms"`.
|
|
128
208
|
* @param {DebounceOptions} [options]
|
|
129
209
|
* @returns {DebouncedFunction<F>}
|
|
130
210
|
*/
|
|
131
|
-
export function debounce<F extends (...args: any[]) => any>(fn: F, wait: number, options?: DebounceOptions): DebouncedFunction<F>;
|
|
211
|
+
export function debounce<F extends (...args: any[]) => any>(fn: F, wait: number | string, options?: DebounceOptions): DebouncedFunction<F>;
|
|
132
212
|
/**
|
|
133
213
|
* Runs at most once every `wait` ms, however often it's called. For scroll
|
|
134
214
|
* handlers, progress reports, rate-limited APIs...
|
|
@@ -138,11 +218,11 @@ export function debounce<F extends (...args: any[]) => any>(fn: F, wait: number,
|
|
|
138
218
|
*
|
|
139
219
|
* @template {(...args: any[]) => any} F
|
|
140
220
|
* @param {F} fn
|
|
141
|
-
* @param {number}
|
|
221
|
+
* @param {number | string} interval Minimum gap between calls, in ms or like `"1s"`.
|
|
142
222
|
* @param {ThrottleOptions} [options]
|
|
143
223
|
* @returns {ThrottledFunction<F>}
|
|
144
224
|
*/
|
|
145
|
-
export function throttle<F extends (...args: any[]) => any>(fn: F,
|
|
225
|
+
export function throttle<F extends (...args: any[]) => any>(fn: F, interval: number | string, options?: ThrottleOptions): ThrottledFunction<F>;
|
|
146
226
|
/**
|
|
147
227
|
* Runs `fn` the first time only; later calls return the same result.
|
|
148
228
|
*
|
|
@@ -190,20 +270,22 @@ export function memoize<F extends (...args: any[]) => any>(fn: F, options?: Memo
|
|
|
190
270
|
*/
|
|
191
271
|
export function retry<T>(fn: (attempt: number) => T | PromiseLike<T>, options?: RetryOptions): Promise<Awaited<T>>;
|
|
192
272
|
/**
|
|
193
|
-
* Rejects with a `TimeoutError` if the promise takes longer than `ms`.
|
|
273
|
+
* Rejects with a `TimeoutError` if the promise takes longer than `ms`. Pass
|
|
274
|
+
* a function to get an `AbortSignal` that fires when time is up, so the work
|
|
275
|
+
* actually stops instead of running on in the background.
|
|
194
276
|
*
|
|
195
277
|
* @example
|
|
196
278
|
* const res = await func.timeout(fetch(url), 5000);
|
|
197
279
|
* const rows = await func.timeout(() => slowQuery(), 2000, "Database too slow");
|
|
198
280
|
*
|
|
199
281
|
* @template T
|
|
200
|
-
* @param {PromiseLike<T> | (() => PromiseLike<T> | T)} promise A promise, or a function that returns one.
|
|
201
|
-
* @param {number} ms
|
|
282
|
+
* @param {PromiseLike<T> | ((signal: AbortSignal) => PromiseLike<T> | T)} promise A promise, or a function that returns one. The function gets a signal that aborts on timeout.
|
|
283
|
+
* @param {number | string} ms The limit, in ms or like `"5s"`. `Infinity` means no limit.
|
|
202
284
|
* @param {string} [message]
|
|
203
285
|
* @returns {Promise<Awaited<T>>}
|
|
204
286
|
* @throws {TimeoutError}
|
|
205
287
|
*/
|
|
206
|
-
export function timeout<T>(promise: PromiseLike<T> | (() => PromiseLike<T> | T), ms: number, message?: string): Promise<Awaited<T>>;
|
|
288
|
+
export function timeout<T>(promise: PromiseLike<T> | ((signal: AbortSignal) => PromiseLike<T> | T), ms: number | string, message?: string): Promise<Awaited<T>>;
|
|
207
289
|
/**
|
|
208
290
|
* Waits `ms`, then calls `fn` with the arguments and resolves with its result.
|
|
209
291
|
*
|
|
@@ -212,11 +294,11 @@ export function timeout<T>(promise: PromiseLike<T> | (() => PromiseLike<T> | T),
|
|
|
212
294
|
*
|
|
213
295
|
* @template {(...args: any[]) => any} F
|
|
214
296
|
* @param {F} fn
|
|
215
|
-
* @param {number} ms
|
|
297
|
+
* @param {number | string} ms In ms, or like `"2s"`.
|
|
216
298
|
* @param {Parameters<F>} args
|
|
217
299
|
* @returns {Promise<Awaited<ReturnType<F>>>}
|
|
218
300
|
*/
|
|
219
|
-
export function delay<F extends (...args: any[]) => any>(fn: F, ms: number, ...args: Parameters<F>): Promise<Awaited<ReturnType<F>>>;
|
|
301
|
+
export function delay<F extends (...args: any[]) => any>(fn: F, ms: number | string, ...args: Parameters<F>): Promise<Awaited<ReturnType<F>>>;
|
|
220
302
|
/**
|
|
221
303
|
* Awaits a promise and gives you `[error, value]` instead of throwing, so
|
|
222
304
|
* you don't need a try/catch.
|
|
@@ -254,6 +336,40 @@ export function attempt<F extends (...args: any[]) => any>(fn: F): (...args: Par
|
|
|
254
336
|
* @returns {(...args: any[]) => Promise<any>}
|
|
255
337
|
*/
|
|
256
338
|
export function promisify(fn: (...args: any[]) => void): (...args: any[]) => Promise<any>;
|
|
339
|
+
/**
|
|
340
|
+
* Turns many single calls into few grouped ones. Calls made close together
|
|
341
|
+
* are collected, `fn` runs once with all their items, and each caller gets
|
|
342
|
+
* its own result. The classic cure for "N+1 queries".
|
|
343
|
+
*
|
|
344
|
+
* @example
|
|
345
|
+
* const loadUser = func.batch(async (ids) => {
|
|
346
|
+
* const users = await db.getAll("users", { id: ids });
|
|
347
|
+
* return ids.map((id) => users.find((user) => user.id === id));
|
|
348
|
+
* });
|
|
349
|
+
* // One query, however many places ask at once:
|
|
350
|
+
* const [ada, bob] = await Promise.all([loadUser(1), loadUser(2)]);
|
|
351
|
+
*
|
|
352
|
+
* @template I
|
|
353
|
+
* @template R
|
|
354
|
+
* @param {(items: I[]) => ReadonlyArray<R | Error> | Map<I, R | Error> | PromiseLike<ReadonlyArray<R | Error> | Map<I, R | Error>>} fn Gets every waiting item and returns one result per item, in the same order, or a `Map` keyed by item. An `Error` as a result rejects that call only.
|
|
355
|
+
* @param {BatchOptions} [options]
|
|
356
|
+
* @returns {BatchedFunction<I, R>}
|
|
357
|
+
*/
|
|
358
|
+
export function batch<I, R>(fn: (items: I[]) => ReadonlyArray<R | Error> | Map<I, R | Error> | PromiseLike<ReadonlyArray<R | Error> | Map<I, R | Error>>, options?: BatchOptions): BatchedFunction<I, R>;
|
|
359
|
+
/**
|
|
360
|
+
* Makes concurrent calls with the same arguments share one run. Once it
|
|
361
|
+
* settles, the next call starts a new one: nothing is cached.
|
|
362
|
+
*
|
|
363
|
+
* @example
|
|
364
|
+
* const refreshToken = func.dedupe(async () => (await api.post("auth/refresh")).data);
|
|
365
|
+
* // Ten requests hit a 401 at once: one refresh, ten answers.
|
|
366
|
+
*
|
|
367
|
+
* @template {(...args: any[]) => any} F
|
|
368
|
+
* @param {F} fn
|
|
369
|
+
* @param {(...args: Parameters<F>) => unknown} [keyOf] Builds the key that identifies a call. Defaults to its arguments.
|
|
370
|
+
* @returns {(...args: Parameters<F>) => Promise<Awaited<ReturnType<F>>>}
|
|
371
|
+
*/
|
|
372
|
+
export function dedupe<F extends (...args: any[]) => any>(fn: F, keyOf?: (...args: Parameters<F>) => unknown): (...args: Parameters<F>) => Promise<Awaited<ReturnType<F>>>;
|
|
257
373
|
/**
|
|
258
374
|
* Chains functions from left to right: `pipe(f, g)(x)` is `g(f(x))`.
|
|
259
375
|
* Types flow through up to 6 functions.
|
|
@@ -357,6 +473,18 @@ export function pipe<A extends any[], B, C, D, E, F, G>(f1: (...args: A) => B, f
|
|
|
357
473
|
* @returns {(...args: any[]) => any}
|
|
358
474
|
*/
|
|
359
475
|
export function pipe(...fns: ((arg: any) => any)[]): (...args: any[]) => any;
|
|
476
|
+
/**
|
|
477
|
+
* Like `pipe()`, for functions that may be async: each one is awaited
|
|
478
|
+
* before the next runs.
|
|
479
|
+
*
|
|
480
|
+
* @example
|
|
481
|
+
* const publish = func.pipeAsync(loadDraft, renderMarkdown, uploadToCDN);
|
|
482
|
+
* const url = await publish(postId);
|
|
483
|
+
*
|
|
484
|
+
* @param {...((...args: any[]) => any)} fns
|
|
485
|
+
* @returns {(...args: any[]) => Promise<any>}
|
|
486
|
+
*/
|
|
487
|
+
export function pipeAsync(...fns: ((...args: any[]) => any)[]): (...args: any[]) => Promise<any>;
|
|
360
488
|
/**
|
|
361
489
|
* Chains functions from right to left: `compose(f, g)(x)` is `f(g(x))`.
|
|
362
490
|
* `pipe()` reads in execution order and is better typed.
|
package/types/src/Func.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Func.d.ts","sourceRoot":"","sources":["../../src/Func.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"Func.d.ts","sourceRoot":"","sources":["../../src/Func.js"],"names":[],"mappings":"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"}
|