@atproto-labs/pipe 0.1.0 → 0.2.0-next.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 +20 -0
- package/LICENSE.txt +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -6
- package/dist/index.js.map +1 -1
- package/dist/pipe.d.ts +9 -12
- package/dist/pipe.d.ts.map +1 -1
- package/dist/pipe.js +19 -8
- package/dist/pipe.js.map +1 -1
- package/dist/type.d.ts +9 -0
- package/dist/type.d.ts.map +1 -0
- package/dist/type.js +2 -0
- package/dist/type.js.map +1 -0
- package/package.json +6 -6
- package/src/index.ts +1 -1
- package/src/pipe.ts +32 -34
- package/src/type.ts +11 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/dist/transformer.d.ts +0 -2
- package/dist/transformer.d.ts.map +0 -1
- package/dist/transformer.js +0 -3
- package/dist/transformer.js.map +0 -1
- package/src/transformer.ts +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @atproto-labs/pipe
|
|
2
2
|
|
|
3
|
+
## 0.2.0-next.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`bb7491c`](https://github.com/bluesky-social/atproto/commit/bb7491c29e06181e1d2f8cf6eb454f9bb8ab961b) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24.
|
|
8
|
+
|
|
9
|
+
- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`07ae5d4`](https://github.com/bluesky-social/atproto/commit/07ae5d4452df51e045e0239da7a04cf0bc154028) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution.
|
|
10
|
+
|
|
11
|
+
Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code.
|
|
12
|
+
|
|
13
|
+
- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`042df15`](https://github.com/bluesky-social/atproto/commit/042df15087c0e62cd1e715fcbf58852fab875af9) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. Emitted `.d.ts` files now use TypeScript 6's stricter `Uint8Array<ArrayBuffer>` typing in places where Web/Node APIs require buffer-backed (not shared-memory) byte arrays. Consumers compiling against these types on older TypeScript should see no runtime impact, but may need to widen or cast in spots that previously relied on `Uint8Array` defaulting to `<ArrayBufferLike>`.
|
|
14
|
+
|
|
15
|
+
Internal: tsconfig `moduleResolution: "node"` is silenced via `ignoreDeprecations: "6.0"` for now; the proper migration to `node16`/`bundler` resolution is deferred.
|
|
16
|
+
|
|
17
|
+
## 0.1.1
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- [#3821](https://github.com/bluesky-social/atproto/pull/3821) [`5050b6550`](https://github.com/bluesky-social/atproto/commit/5050b6550e07e71b0a524eda0b71b837583294d4) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Allow first pipeline function to have more than one argument
|
|
22
|
+
|
|
3
23
|
## 0.1.0
|
|
4
24
|
|
|
5
25
|
### Minor Changes
|
package/LICENSE.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Dual MIT/Apache-2.0 License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2022-
|
|
3
|
+
Copyright (c) 2022-2026 Bluesky Social PBC, and Contributors
|
|
4
4
|
|
|
5
5
|
Except as otherwise noted in individual files, this software is licensed under the MIT license (<http://opensource.org/licenses/MIT>), or the Apache License, Version 2.0 (<http://www.apache.org/licenses/LICENSE-2.0>).
|
|
6
6
|
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,mBAAmB,WAAW,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.pipeTwo = exports.pipe = void 0;
|
|
4
|
-
var pipe_js_1 = require("./pipe.js");
|
|
5
|
-
Object.defineProperty(exports, "pipe", { enumerable: true, get: function () { return pipe_js_1.pipe; } });
|
|
6
|
-
Object.defineProperty(exports, "pipeTwo", { enumerable: true, get: function () { return pipe_js_1.pipeTwo; } });
|
|
1
|
+
export { pipe, pipeTwo } from './pipe.js';
|
|
7
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA","sourcesContent":["export { pipe, pipeTwo } from './pipe.js'\nexport type * from './type.js'\n"]}
|
package/dist/pipe.d.ts
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import { Transformer } from './
|
|
2
|
-
type
|
|
3
|
-
|
|
1
|
+
import { Fn, Transformer } from './type.js';
|
|
2
|
+
type PipelineArgs<T> = T extends [
|
|
3
|
+
Fn<infer A extends readonly unknown[], any>,
|
|
4
4
|
...any[]
|
|
5
|
-
] ?
|
|
6
|
-
type PipelineOutput<T extends
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
] ? O : T extends Transformer<any, infer O>[] ? O : never;
|
|
10
|
-
type Pipeline<F extends readonly Transformer<any>[], Acc extends readonly Transformer<any>[] = []> = F extends [Transformer<infer I, infer O>] ? [...Acc, Transformer<I, O>] : F extends [Transformer<infer A, any>, ...infer Tail] ? Tail extends [Transformer<infer B, any>, ...any[]] ? Pipeline<Tail, [...Acc, Transformer<A, B>]> : Acc : Acc;
|
|
5
|
+
] ? A : never;
|
|
6
|
+
type PipelineOutput<T> = T extends [...any[], Fn<any, infer O>] ? O : never;
|
|
7
|
+
type PipelineRecursive<F extends readonly Transformer<any>[], Acc extends any[]> = F extends readonly [Transformer<infer I, infer O>] ? [...Acc, Transformer<I, O>] : F extends readonly [Transformer<infer A, any>, ...infer Tail] ? Tail extends readonly [Transformer<infer B, any>, ...any[]] ? PipelineRecursive<Tail, [...Acc, Transformer<A, B>]> : never : never;
|
|
8
|
+
type Pipeline<F extends readonly [Fn<any, any>, ...Transformer<any>[]]> = F extends readonly [Fn<infer A, infer O>] ? [Fn<A, O>] : F extends readonly [Fn<infer A, any>, ...infer Tail] ? Tail extends readonly [Transformer<infer B, any>, ...any[]] ? PipelineRecursive<Tail, [Fn<A, B>]> : never : never;
|
|
11
9
|
/**
|
|
12
10
|
* This utility function allows to properly type a pipeline of transformers.
|
|
13
11
|
*
|
|
@@ -24,8 +22,7 @@ type Pipeline<F extends readonly Transformer<any>[], Acc extends readonly Transf
|
|
|
24
22
|
* )
|
|
25
23
|
* ```
|
|
26
24
|
*/
|
|
27
|
-
export declare function pipe():
|
|
28
|
-
export declare function
|
|
29
|
-
export declare function pipeTwo<I, O, X = unknown>(first: Transformer<I, X>, second: Transformer<X, O>): (input: I) => Promise<O>;
|
|
25
|
+
export declare function pipe<T extends readonly [Fn<any, any>, ...Transformer<any>[]]>(...pipeline: Pipeline<T> extends T ? T : Pipeline<T>): (...args: PipelineArgs<T>) => Promise<PipelineOutput<T>>;
|
|
26
|
+
export declare function pipeTwo<A extends readonly unknown[], O, X = unknown>(first: Fn<A, X>, second: Transformer<X, O>): (...args: A) => Promise<O>;
|
|
30
27
|
export {};
|
|
31
28
|
//# sourceMappingURL=pipe.d.ts.map
|
package/dist/pipe.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipe.d.ts","sourceRoot":"","sources":["../src/pipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"pipe.d.ts","sourceRoot":"","sources":["../src/pipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAE3C,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS;IAC/B,EAAE,CAAC,MAAM,CAAC,SAAS,SAAS,OAAO,EAAE,EAAE,GAAG,CAAC;IAC3C,GAAG,GAAG,EAAE;CACT,GACG,CAAC,GACD,KAAK,CAAA;AAET,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAE3E,KAAK,iBAAiB,CACpB,CAAC,SAAS,SAAS,WAAW,CAAC,GAAG,CAAC,EAAE,EACrC,GAAG,SAAS,GAAG,EAAE,IACf,CAAC,SAAS,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAClD,CAAC,GAAG,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAC3B,CAAC,SAAS,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,GAC3D,IAAI,SAAS,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,GACzD,iBAAiB,CAAC,IAAI,EAAE,CAAC,GAAG,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GACpD,KAAK,GACP,KAAK,CAAA;AAEX,KAAK,QAAQ,CAAC,CAAC,SAAS,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IACpE,CAAC,SAAS,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GACrC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACV,CAAC,SAAS,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,GAClD,IAAI,SAAS,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,GACzD,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GACnC,KAAK,GACP,KAAK,CAAA;AAEb;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAC3E,GAAG,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAEjB,CACjC,GAAG,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KACrB,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAChC;AAED,wBAAgB,OAAO,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,OAAO,EAClE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EACf,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GACxB,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAE5B"}
|
package/dist/pipe.js
CHANGED
|
@@ -1,12 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
/**
|
|
2
|
+
* This utility function allows to properly type a pipeline of transformers.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* // Will be typed as "(input: string) => Promise<number>"
|
|
7
|
+
* const parse = pipe(
|
|
8
|
+
* async (input: string) => JSON.parse(input),
|
|
9
|
+
* async (input: unknown) => {
|
|
10
|
+
* if (typeof input === 'number') return input
|
|
11
|
+
* throw new TypeError('Invalid input')
|
|
12
|
+
* },
|
|
13
|
+
* (input: number) => input * 2,
|
|
14
|
+
* )
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export function pipe(...pipeline) {
|
|
5
18
|
return pipeline.reduce(pipeTwo);
|
|
6
19
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return async (input) => second(await first(input));
|
|
20
|
+
export function pipeTwo(first, second) {
|
|
21
|
+
return async (...args) => second(await first(...args));
|
|
10
22
|
}
|
|
11
|
-
exports.pipeTwo = pipeTwo;
|
|
12
23
|
//# sourceMappingURL=pipe.js.map
|
package/dist/pipe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipe.js","sourceRoot":"","sources":["../src/pipe.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pipe.js","sourceRoot":"","sources":["../src/pipe.ts"],"names":[],"mappings":"AA+BA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,IAAI,CAClB,GAAG,QAAiD;IAEpD,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAEC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,KAAe,EACf,MAAyB;IAEzB,OAAO,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;AACxD,CAAC","sourcesContent":["import { Fn, Transformer } from './type.js'\n\ntype PipelineArgs<T> = T extends [\n Fn<infer A extends readonly unknown[], any>,\n ...any[],\n]\n ? A\n : never\n\ntype PipelineOutput<T> = T extends [...any[], Fn<any, infer O>] ? O : never\n\ntype PipelineRecursive<\n F extends readonly Transformer<any>[],\n Acc extends any[],\n> = F extends readonly [Transformer<infer I, infer O>]\n ? [...Acc, Transformer<I, O>]\n : F extends readonly [Transformer<infer A, any>, ...infer Tail]\n ? Tail extends readonly [Transformer<infer B, any>, ...any[]]\n ? PipelineRecursive<Tail, [...Acc, Transformer<A, B>]>\n : never\n : never\n\ntype Pipeline<F extends readonly [Fn<any, any>, ...Transformer<any>[]]> =\n F extends readonly [Fn<infer A, infer O>]\n ? [Fn<A, O>]\n : F extends readonly [Fn<infer A, any>, ...infer Tail]\n ? Tail extends readonly [Transformer<infer B, any>, ...any[]]\n ? PipelineRecursive<Tail, [Fn<A, B>]>\n : never\n : never\n\n/**\n * This utility function allows to properly type a pipeline of transformers.\n *\n * @example\n * ```ts\n * // Will be typed as \"(input: string) => Promise<number>\"\n * const parse = pipe(\n * async (input: string) => JSON.parse(input),\n * async (input: unknown) => {\n * if (typeof input === 'number') return input\n * throw new TypeError('Invalid input')\n * },\n * (input: number) => input * 2,\n * )\n * ```\n */\nexport function pipe<T extends readonly [Fn<any, any>, ...Transformer<any>[]]>(\n ...pipeline: Pipeline<T> extends T ? T : Pipeline<T>\n) {\n return pipeline.reduce(pipeTwo) as (\n ...args: PipelineArgs<T>\n ) => Promise<PipelineOutput<T>>\n}\n\nexport function pipeTwo<A extends readonly unknown[], O, X = unknown>(\n first: Fn<A, X>,\n second: Transformer<X, O>,\n): (...args: A) => Promise<O> {\n return async (...args) => second(await first(...args))\n}\n"]}
|
package/dist/type.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic, potentially async, function. Parametrized for convenience reasons.
|
|
3
|
+
*/
|
|
4
|
+
export type Fn<A extends readonly unknown[], O> = (...args: A) => O | PromiseLike<O>;
|
|
5
|
+
/**
|
|
6
|
+
* Single input, single output, potentially async transformer function.
|
|
7
|
+
*/
|
|
8
|
+
export type Transformer<I, O = I> = (...args: [I]) => O | PromiseLike<O>;
|
|
9
|
+
//# sourceMappingURL=type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,EAAE,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,EAAE,CAAC,IAAI,CAChD,GAAG,IAAI,EAAE,CAAC,KACP,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;AAEvB;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA"}
|
package/dist/type.js
ADDED
package/dist/type.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Generic, potentially async, function. Parametrized for convenience reasons.\n */\nexport type Fn<A extends readonly unknown[], O> = (\n ...args: A\n) => O | PromiseLike<O>\n\n/**\n * Single input, single output, potentially async transformer function.\n */\nexport type Transformer<I, O = I> = (...args: [I]) => O | PromiseLike<O>\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto-labs/pipe",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0-next.0",
|
|
4
|
+
"engines": {
|
|
5
|
+
"node": ">=22"
|
|
6
|
+
},
|
|
4
7
|
"license": "MIT",
|
|
5
8
|
"description": "Library for combining multiple functions into a single function.",
|
|
6
9
|
"keywords": [
|
|
@@ -13,18 +16,15 @@
|
|
|
13
16
|
"url": "https://github.com/bluesky-social/atproto",
|
|
14
17
|
"directory": "packages/internal/pipe"
|
|
15
18
|
},
|
|
16
|
-
"type": "
|
|
17
|
-
"main": "dist/index.js",
|
|
18
|
-
"types": "dist/index.d.ts",
|
|
19
|
+
"type": "module",
|
|
19
20
|
"exports": {
|
|
20
21
|
".": {
|
|
21
22
|
"types": "./dist/index.d.ts",
|
|
22
23
|
"default": "./dist/index.js"
|
|
23
24
|
}
|
|
24
25
|
},
|
|
25
|
-
"dependencies": {},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"typescript": "^
|
|
27
|
+
"typescript": "^6.0.3"
|
|
28
28
|
},
|
|
29
29
|
"scripts": {
|
|
30
30
|
"build": "tsc --build tsconfig.json"
|
package/src/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { pipe, pipeTwo } from './pipe.js'
|
|
2
|
-
export
|
|
2
|
+
export type * from './type.js'
|
package/src/pipe.ts
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import { Transformer } from './
|
|
1
|
+
import { Fn, Transformer } from './type.js'
|
|
2
2
|
|
|
3
|
-
type
|
|
4
|
-
|
|
3
|
+
type PipelineArgs<T> = T extends [
|
|
4
|
+
Fn<infer A extends readonly unknown[], any>,
|
|
5
5
|
...any[],
|
|
6
6
|
]
|
|
7
|
-
?
|
|
8
|
-
:
|
|
9
|
-
? I
|
|
10
|
-
: never
|
|
7
|
+
? A
|
|
8
|
+
: never
|
|
11
9
|
|
|
12
|
-
type PipelineOutput<T extends
|
|
13
|
-
...any[],
|
|
14
|
-
Transformer<any, infer O>,
|
|
15
|
-
]
|
|
16
|
-
? O
|
|
17
|
-
: T extends Transformer<any, infer O>[]
|
|
18
|
-
? O
|
|
19
|
-
: never
|
|
10
|
+
type PipelineOutput<T> = T extends [...any[], Fn<any, infer O>] ? O : never
|
|
20
11
|
|
|
21
|
-
type
|
|
12
|
+
type PipelineRecursive<
|
|
22
13
|
F extends readonly Transformer<any>[],
|
|
23
|
-
Acc extends
|
|
24
|
-
> = F extends [Transformer<infer I, infer O>]
|
|
14
|
+
Acc extends any[],
|
|
15
|
+
> = F extends readonly [Transformer<infer I, infer O>]
|
|
25
16
|
? [...Acc, Transformer<I, O>]
|
|
26
|
-
: F extends [Transformer<infer A, any>, ...infer Tail]
|
|
27
|
-
? Tail extends [Transformer<infer B, any>, ...any[]]
|
|
28
|
-
?
|
|
29
|
-
:
|
|
30
|
-
:
|
|
17
|
+
: F extends readonly [Transformer<infer A, any>, ...infer Tail]
|
|
18
|
+
? Tail extends readonly [Transformer<infer B, any>, ...any[]]
|
|
19
|
+
? PipelineRecursive<Tail, [...Acc, Transformer<A, B>]>
|
|
20
|
+
: never
|
|
21
|
+
: never
|
|
22
|
+
|
|
23
|
+
type Pipeline<F extends readonly [Fn<any, any>, ...Transformer<any>[]]> =
|
|
24
|
+
F extends readonly [Fn<infer A, infer O>]
|
|
25
|
+
? [Fn<A, O>]
|
|
26
|
+
: F extends readonly [Fn<infer A, any>, ...infer Tail]
|
|
27
|
+
? Tail extends readonly [Transformer<infer B, any>, ...any[]]
|
|
28
|
+
? PipelineRecursive<Tail, [Fn<A, B>]>
|
|
29
|
+
: never
|
|
30
|
+
: never
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
33
|
* This utility function allows to properly type a pipeline of transformers.
|
|
@@ -45,19 +45,17 @@ type Pipeline<
|
|
|
45
45
|
* )
|
|
46
46
|
* ```
|
|
47
47
|
*/
|
|
48
|
-
export function pipe(
|
|
49
|
-
export function pipe<T extends readonly Transformer<any>[]>(
|
|
50
|
-
...pipeline: Pipeline<T> extends T ? T : Pipeline<T>
|
|
51
|
-
): (input: PipelineInput<T>) => Promise<PipelineOutput<T>>
|
|
52
|
-
export function pipe<T extends readonly Transformer<any>[]>(
|
|
48
|
+
export function pipe<T extends readonly [Fn<any, any>, ...Transformer<any>[]]>(
|
|
53
49
|
...pipeline: Pipeline<T> extends T ? T : Pipeline<T>
|
|
54
|
-
)
|
|
55
|
-
return pipeline.reduce(pipeTwo)
|
|
50
|
+
) {
|
|
51
|
+
return pipeline.reduce(pipeTwo) as (
|
|
52
|
+
...args: PipelineArgs<T>
|
|
53
|
+
) => Promise<PipelineOutput<T>>
|
|
56
54
|
}
|
|
57
55
|
|
|
58
|
-
export function pipeTwo<
|
|
59
|
-
first:
|
|
56
|
+
export function pipeTwo<A extends readonly unknown[], O, X = unknown>(
|
|
57
|
+
first: Fn<A, X>,
|
|
60
58
|
second: Transformer<X, O>,
|
|
61
|
-
): (
|
|
62
|
-
return async (
|
|
59
|
+
): (...args: A) => Promise<O> {
|
|
60
|
+
return async (...args) => second(await first(...args))
|
|
63
61
|
}
|
package/src/type.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic, potentially async, function. Parametrized for convenience reasons.
|
|
3
|
+
*/
|
|
4
|
+
export type Fn<A extends readonly unknown[], O> = (
|
|
5
|
+
...args: A
|
|
6
|
+
) => O | PromiseLike<O>
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Single input, single output, potentially async transformer function.
|
|
10
|
+
*/
|
|
11
|
+
export type Transformer<I, O = I> = (...args: [I]) => O | PromiseLike<O>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["./src/index.ts","./src/pipe.ts","./src/type.ts"],"version":"6.0.3"}
|
package/dist/transformer.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../src/transformer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA"}
|
package/dist/transformer.js
DELETED
package/dist/transformer.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transformer.js","sourceRoot":"","sources":["../src/transformer.ts"],"names":[],"mappings":""}
|
package/src/transformer.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export type Transformer<I, O = I> = (input: I) => O | PromiseLike<O>
|