@jlnstack/procedure 0.0.1
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 +7 -0
- package/README.md +1 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.cjs +14 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.mjs +14 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.cjs +27 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.mjs +27 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.cjs +16 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.mjs +16 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.cjs +11 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.mjs +11 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.cjs +18 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.mjs +12 -0
- package/dist/core-internal.cjs +71 -0
- package/dist/core-internal.d.cts +33 -0
- package/dist/core-internal.d.cts.map +1 -0
- package/dist/core-internal.d.mts +33 -0
- package/dist/core-internal.d.mts.map +1 -0
- package/dist/core-internal.mjs +71 -0
- package/dist/core-internal.mjs.map +1 -0
- package/dist/core.cjs +12 -0
- package/dist/core.d.cts +15 -0
- package/dist/core.d.cts.map +1 -0
- package/dist/core.d.mts +15 -0
- package/dist/core.d.mts.map +1 -0
- package/dist/core.mjs +13 -0
- package/dist/core.mjs.map +1 -0
- package/dist/index.cjs +3 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.mjs +3 -0
- package/dist/next.cjs +45 -0
- package/dist/next.d.cts +47 -0
- package/dist/next.d.cts.map +1 -0
- package/dist/next.d.mts +47 -0
- package/dist/next.d.mts.map +1 -0
- package/dist/next.mjs +46 -0
- package/dist/next.mjs.map +1 -0
- package/dist/react.cjs +25 -0
- package/dist/react.d.cts +20 -0
- package/dist/react.d.cts.map +1 -0
- package/dist/react.d.mts +20 -0
- package/dist/react.d.mts.map +1 -0
- package/dist/react.mjs +26 -0
- package/dist/react.mjs.map +1 -0
- package/dist/types.d.cts +6 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +6 -0
- package/dist/types.d.mts.map +1 -0
- package/package.json +64 -0
- package/src/core-internal.ts +206 -0
- package/src/core.ts +29 -0
- package/src/index.ts +1 -0
- package/src/next.ts +161 -0
- package/src/react.ts +66 -0
- package/src/types.ts +4 -0
- package/test/core.test-d.ts +89 -0
- package/test/core.test.ts +57 -0
- package/test/next.test-d.ts +177 -0
- package/test/next.test.ts +230 -0
- package/tsconfig.build.json +7 -0
- package/tsconfig.json +5 -0
- package/tsdown.config.ts +23 -0
- package/vitest.config.ts +10 -0
package/dist/next.d.mts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Prettify } from "./types.mjs";
|
|
2
|
+
import { InferMiddlewareArrayInput, InferMiddlewareArrayOutput, InferMiddlewareOutput, MergeInput, Middleware, Run } from "./core-internal.mjs";
|
|
3
|
+
import { InitOptions } from "./core.mjs";
|
|
4
|
+
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
5
|
+
import { Metadata } from "next";
|
|
6
|
+
import { ReactNode } from "react";
|
|
7
|
+
|
|
8
|
+
//#region src/next.d.ts
|
|
9
|
+
type ExtractParams<TInput> = TInput extends {
|
|
10
|
+
params: infer P;
|
|
11
|
+
} ? P : never;
|
|
12
|
+
interface NextProcedureBuilder<TContext, TInput = {}> {
|
|
13
|
+
use<TInputExt, TMiddleware extends Middleware<TInputExt, TContext, any>>(middleware: TMiddleware): NextProcedureBuilder<InferMiddlewareOutput<TMiddleware>, MergeInput<TInput, TInputExt>>;
|
|
14
|
+
use<TMiddlewares extends readonly Middleware<any, TContext, any>[]>(middlewares: [...TMiddlewares]): NextProcedureBuilder<InferMiddlewareArrayOutput<TMiddlewares>, MergeInput<TInput, InferMiddlewareArrayInput<TMiddlewares>>>;
|
|
15
|
+
input<TSchema extends StandardSchemaV1>(schema: TSchema): NextProcedureBuilder<TContext, TInput & StandardSchemaV1.InferInput<TSchema>>;
|
|
16
|
+
params<T, TSchema extends StandardSchemaV1 | undefined = undefined>(schema?: TSchema): NextProcedureBuilder<Prettify<TContext & {
|
|
17
|
+
params: TSchema extends StandardSchemaV1 ? StandardSchemaV1.InferOutput<TSchema> : T;
|
|
18
|
+
}>, Prettify<TInput & {
|
|
19
|
+
params: Promise<TSchema extends StandardSchemaV1 ? StandardSchemaV1.InferOutput<TSchema> : T>;
|
|
20
|
+
}>>;
|
|
21
|
+
searchParams<TSchema extends StandardSchemaV1>(schema: TSchema): NextProcedureBuilder<Prettify<TContext & {
|
|
22
|
+
searchParams: StandardSchemaV1.InferOutput<TSchema>;
|
|
23
|
+
}>, Prettify<TInput & {
|
|
24
|
+
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
|
25
|
+
}>>;
|
|
26
|
+
run: Run<TContext, TInput>;
|
|
27
|
+
page: Run<TContext, Prettify<TInput & {
|
|
28
|
+
searchParams: Promise<Record<string, string | string[] | undefined>>;
|
|
29
|
+
params: Promise<{
|
|
30
|
+
[key: string]: string;
|
|
31
|
+
}>;
|
|
32
|
+
}>, ReactNode>;
|
|
33
|
+
rsc: Run<TContext, TInput, ReactNode>;
|
|
34
|
+
metadata: Run<TContext, TInput, Metadata>;
|
|
35
|
+
layout: Run<TContext, TInput & {
|
|
36
|
+
children: ReactNode;
|
|
37
|
+
}, ReactNode>;
|
|
38
|
+
layoutMetadata: Run<Prettify<Omit<TContext, "searchParams">>, Prettify<Omit<TInput, "searchParams">>, Metadata>;
|
|
39
|
+
staticParams: Run<TContext, TInput, ExtractParams<TContext>[]>;
|
|
40
|
+
}
|
|
41
|
+
declare const init: <TContext>(options: InitOptions<TContext>) => {
|
|
42
|
+
middleware: <TInput, TResult>(fn: Middleware<TInput, TContext, TResult>) => Middleware<TInput, TContext, TResult>;
|
|
43
|
+
procedure: NextProcedureBuilder<TContext>;
|
|
44
|
+
};
|
|
45
|
+
//#endregion
|
|
46
|
+
export { init };
|
|
47
|
+
//# sourceMappingURL=next.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next.d.mts","names":[],"sources":["../src/next.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/next.mjs
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { _objectSpread2 } from "./_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.mjs";
|
|
2
|
+
import { createMiddleware, createProcedureBuilder } from "./core-internal.mjs";
|
|
3
|
+
import { init as init$1 } from "./core.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/next.ts
|
|
6
|
+
const createNextBuilder = (middlewares, factory) => {
|
|
7
|
+
const core = createProcedureBuilder(middlewares, factory !== null && factory !== void 0 ? factory : createNextBuilder);
|
|
8
|
+
return _objectSpread2(_objectSpread2({}, core), {}, {
|
|
9
|
+
params() {
|
|
10
|
+
const mw = createMiddleware("NEXT_PARAMS", async ({ input, ctx, next }) => {
|
|
11
|
+
const params = await input.params;
|
|
12
|
+
return next({ ctx: _objectSpread2(_objectSpread2({}, ctx), {}, { params }) });
|
|
13
|
+
});
|
|
14
|
+
return createNextBuilder([...middlewares, mw], factory);
|
|
15
|
+
},
|
|
16
|
+
searchParams(schema) {
|
|
17
|
+
const mw = createMiddleware("NEXT_SEARCH_PARAMS", async ({ input, ctx, next }) => {
|
|
18
|
+
const searchParams = await input.searchParams;
|
|
19
|
+
const result = await schema["~standard"].validate(searchParams);
|
|
20
|
+
if (result.issues) throw new Error("Invalid search params");
|
|
21
|
+
return next({ ctx: _objectSpread2(_objectSpread2({}, ctx), {}, { searchParams: result.value }) });
|
|
22
|
+
});
|
|
23
|
+
return createNextBuilder([...middlewares, mw], factory);
|
|
24
|
+
},
|
|
25
|
+
page: core.run,
|
|
26
|
+
rsc: core.run,
|
|
27
|
+
metadata: core.run,
|
|
28
|
+
layout: core.run,
|
|
29
|
+
layoutMetadata: core.run,
|
|
30
|
+
staticParams: core.run
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
const init = (options) => {
|
|
34
|
+
const core = init$1(options);
|
|
35
|
+
const initialMiddlewares = [createMiddleware("INITIAL_CONTEXT", async ({ next }) => {
|
|
36
|
+
return next({ ctx: await options.ctx() });
|
|
37
|
+
})];
|
|
38
|
+
return {
|
|
39
|
+
middleware: core.middleware,
|
|
40
|
+
procedure: createNextBuilder(initialMiddlewares)
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
export { init };
|
|
46
|
+
//# sourceMappingURL=next.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next.mjs","names":["createNextBuilder: ProcedureBuilderFactory","coreInit","initialMiddlewares: InternalMiddleware[]"],"sources":["../src/next.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { Metadata } from \"next\";\nimport type { ReactNode } from \"react\";\nimport { init as coreInit, type InitOptions } from \"./core\";\nimport {\n createMiddleware,\n createProcedureBuilder,\n type InferMiddlewareArrayInput,\n type InferMiddlewareArrayOutput,\n type InferMiddlewareOutput,\n type InternalMiddleware,\n type MergeInput,\n type Middleware,\n type ProcedureBuilderFactory,\n type Run,\n} from \"./core-internal\";\nimport type { Prettify } from \"./types\";\n\ntype ExtractParams<TInput> = TInput extends { params: infer P } ? P : never;\n\ninterface NextProcedureBuilder<TContext, TInput = {}> {\n use<TInputExt, TMiddleware extends Middleware<TInputExt, TContext, any>>(\n middleware: TMiddleware,\n ): NextProcedureBuilder<\n InferMiddlewareOutput<TMiddleware>,\n MergeInput<TInput, TInputExt>\n >;\n\n use<TMiddlewares extends readonly Middleware<any, TContext, any>[]>(\n middlewares: [...TMiddlewares],\n ): NextProcedureBuilder<\n InferMiddlewareArrayOutput<TMiddlewares>,\n MergeInput<TInput, InferMiddlewareArrayInput<TMiddlewares>>\n >;\n\n input<TSchema extends StandardSchemaV1>(\n schema: TSchema,\n ): NextProcedureBuilder<\n TContext,\n TInput & StandardSchemaV1.InferInput<TSchema>\n >;\n\n params<T, TSchema extends StandardSchemaV1 | undefined = undefined>(\n schema?: TSchema,\n ): NextProcedureBuilder<\n Prettify<\n TContext & {\n params: TSchema extends StandardSchemaV1\n ? StandardSchemaV1.InferOutput<TSchema>\n : T;\n }\n >,\n Prettify<\n TInput & {\n params: Promise<\n TSchema extends StandardSchemaV1\n ? StandardSchemaV1.InferOutput<TSchema>\n : T\n >;\n }\n >\n >;\n\n searchParams<TSchema extends StandardSchemaV1>(\n schema: TSchema,\n ): NextProcedureBuilder<\n Prettify<\n TContext & { searchParams: StandardSchemaV1.InferOutput<TSchema> }\n >,\n Prettify<\n TInput & {\n searchParams: Promise<Record<string, string | string[] | undefined>>;\n }\n >\n >;\n\n run: Run<TContext, TInput>;\n page: Run<\n TContext,\n Prettify<\n TInput & {\n searchParams: Promise<Record<string, string | string[] | undefined>>;\n params: Promise<{ [key: string]: string }>;\n }\n >,\n ReactNode\n >;\n rsc: Run<TContext, TInput, ReactNode>;\n metadata: Run<TContext, TInput, Metadata>;\n layout: Run<TContext, TInput & { children: ReactNode }, ReactNode>;\n layoutMetadata: Run<\n Prettify<Omit<TContext, \"searchParams\">>,\n Prettify<Omit<TInput, \"searchParams\">>,\n Metadata\n >;\n\n staticParams: Run<TContext, TInput, ExtractParams<TContext>[]>;\n}\n\nconst createNextBuilder: ProcedureBuilderFactory = (\n middlewares: InternalMiddleware[],\n factory?: ProcedureBuilderFactory,\n) => {\n const core = createProcedureBuilder(\n middlewares,\n factory ?? createNextBuilder,\n );\n\n return {\n ...core,\n\n params() {\n const mw = createMiddleware(\n \"NEXT_PARAMS\",\n async ({ input, ctx, next }: any) => {\n const params = await input.params;\n\n return next({ ctx: { ...ctx, params } });\n },\n );\n return createNextBuilder([...middlewares, mw], factory) as any;\n },\n\n searchParams(schema: StandardSchemaV1) {\n const mw = createMiddleware(\n \"NEXT_SEARCH_PARAMS\",\n async ({ input, ctx, next }: any) => {\n const searchParams = await input.searchParams;\n\n const result = await schema[\"~standard\"].validate(searchParams);\n if (result.issues) throw new Error(\"Invalid search params\");\n return next({ ctx: { ...ctx, searchParams: result.value } });\n },\n );\n return createNextBuilder([...middlewares, mw], factory) as any;\n },\n\n page: core.run,\n rsc: core.run,\n metadata: core.run,\n layout: core.run,\n layoutMetadata: core.run,\n staticParams: core.run,\n } as any;\n};\n\nexport const init = <TContext>(options: InitOptions<TContext>) => {\n const core = coreInit(options);\n const initialMiddlewares: InternalMiddleware[] = [\n createMiddleware(\"INITIAL_CONTEXT\", async ({ next }: any) => {\n return next({ ctx: await options.ctx() });\n }),\n ];\n\n return {\n middleware: core.middleware,\n procedure: createNextBuilder(\n initialMiddlewares,\n ) as unknown as NextProcedureBuilder<TContext>,\n };\n};\n"],"mappings":";;;;;AAmGA,MAAMA,qBACJ,aACA,YACG;CACH,MAAM,OAAO,uBACX,aACA,mDAAW,kBACZ;AAED,0CACK;EAEH,SAAS;GACP,MAAM,KAAK,iBACT,eACA,OAAO,EAAE,OAAO,KAAK,WAAgB;IACnC,MAAM,SAAS,MAAM,MAAM;AAE3B,WAAO,KAAK,EAAE,uCAAU,YAAK,WAAU,CAAC;KAE3C;AACD,UAAO,kBAAkB,CAAC,GAAG,aAAa,GAAG,EAAE,QAAQ;;EAGzD,aAAa,QAA0B;GACrC,MAAM,KAAK,iBACT,sBACA,OAAO,EAAE,OAAO,KAAK,WAAgB;IACnC,MAAM,eAAe,MAAM,MAAM;IAEjC,MAAM,SAAS,MAAM,OAAO,aAAa,SAAS,aAAa;AAC/D,QAAI,OAAO,OAAQ,OAAM,IAAI,MAAM,wBAAwB;AAC3D,WAAO,KAAK,EAAE,uCAAU,YAAK,cAAc,OAAO,UAAS,CAAC;KAE/D;AACD,UAAO,kBAAkB,CAAC,GAAG,aAAa,GAAG,EAAE,QAAQ;;EAGzD,MAAM,KAAK;EACX,KAAK,KAAK;EACV,UAAU,KAAK;EACf,QAAQ,KAAK;EACb,gBAAgB,KAAK;EACrB,cAAc,KAAK;;;AAIvB,MAAa,QAAkB,YAAmC;CAChE,MAAM,OAAOC,OAAS,QAAQ;CAC9B,MAAMC,qBAA2C,CAC/C,iBAAiB,mBAAmB,OAAO,EAAE,WAAgB;AAC3D,SAAO,KAAK,EAAE,KAAK,MAAM,QAAQ,KAAK,EAAE,CAAC;GACzC,CACH;AAED,QAAO;EACL,YAAY,KAAK;EACjB,WAAW,kBACT,mBACD;EACF"}
|
package/dist/react.cjs
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const require_objectSpread2 = require('./_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.cjs');
|
|
2
|
+
const require_core_internal = require('./core-internal.cjs');
|
|
3
|
+
const require_core = require('./core.cjs');
|
|
4
|
+
|
|
5
|
+
//#region src/react.ts
|
|
6
|
+
const createReactBuilder = (middlewares, factory) => {
|
|
7
|
+
const core = require_core_internal.createProcedureBuilder(middlewares, factory !== null && factory !== void 0 ? factory : createReactBuilder);
|
|
8
|
+
return require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, core), {}, {
|
|
9
|
+
rsc: core.run,
|
|
10
|
+
serverFn: core.run
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
const init = (options) => {
|
|
14
|
+
const core = require_core.init(options);
|
|
15
|
+
const initialMiddlewares = [require_core_internal.createMiddleware("INITIAL_CONTEXT", async ({ next }) => {
|
|
16
|
+
return next({ ctx: await options.ctx() });
|
|
17
|
+
})];
|
|
18
|
+
return {
|
|
19
|
+
middleware: core.middleware,
|
|
20
|
+
procedure: createReactBuilder(initialMiddlewares)
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
exports.init = init;
|
package/dist/react.d.cts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { InferMiddlewareOutput, MergeInput, Middleware, Run } from "./core-internal.cjs";
|
|
2
|
+
import { InitOptions } from "./core.cjs";
|
|
3
|
+
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
4
|
+
import { ReactNode } from "react";
|
|
5
|
+
|
|
6
|
+
//#region src/react.d.ts
|
|
7
|
+
interface ReactProcedureBuilder<TContext, TInput = Record<string, never>> {
|
|
8
|
+
use<TInputExt, TMiddleware extends Middleware<TInputExt, TContext, any>>(middleware: TMiddleware): ReactProcedureBuilder<InferMiddlewareOutput<TMiddleware>, MergeInput<TInput, TInputExt>>;
|
|
9
|
+
input<TSchema extends StandardSchemaV1>(schema: TSchema): ReactProcedureBuilder<TContext, MergeInput<TInput, StandardSchemaV1.InferInput<TSchema>>>;
|
|
10
|
+
run: Run<TContext, TInput>;
|
|
11
|
+
rsc: Run<TContext, TInput, ReactNode>;
|
|
12
|
+
serverFn: Run<TContext, TInput>;
|
|
13
|
+
}
|
|
14
|
+
declare const init: <TContext>(options: InitOptions<TContext>) => {
|
|
15
|
+
middleware: <TInput, TResult>(fn: Middleware<TInput, TContext, TResult>) => Middleware<TInput, TContext, TResult>;
|
|
16
|
+
procedure: ReactProcedureBuilder<TContext, Record<string, never>>;
|
|
17
|
+
};
|
|
18
|
+
//#endregion
|
|
19
|
+
export { init };
|
|
20
|
+
//# sourceMappingURL=react.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.cts","names":[],"sources":["../src/react.ts"],"sourcesContent":[],"mappings":";;;;;;UAcU,yCAAyC;qCACd,WAAW,WAAW,4BAC3C,cACX,sBACD,sBAAsB,cACtB,WAAW,QAAQ;EALb,KAAA,CAAA,gBAQc,gBARO,CAAA,CAAA,MAAA,EASnB,OATmB,CAAA,EAU1B,qBAV0B,CAW3B,QAX2B,EAY3B,UAZ2B,CAYhB,MAZgB,EAYR,gBAAA,CAAiB,UAZT,CAYoB,OAZpB,CAAA,CAAA,CAAA;EAAA,GAAA,EAexB,GAfwB,CAepB,QAfoB,EAeV,MAfU,CAAA;KAAoB,EAgB5C,GAhB4C,CAgBxC,QAhBwC,EAgB9B,MAhB8B,EAgBtB,SAhBsB,CAAA;UACH,EAgBpC,GAhBoC,CAgBhC,QAhBgC,EAgBtB,MAhBsB,CAAA;;AAAX,cAmCxB,IAnCwB,EAAA,CAAA,QAAA,CAAA,CAAA,OAAA,EAmCG,WAnCH,CAmCe,QAnCf,CAAA,EAAA,GAAA;YACrB,EAAA,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EAAA,YAAA,OAAA,UAAA,SAAA,CAAA,EAAA,aAAA,OAAA,UAAA,SAAA,CAAA;WAEU,EA0C+B,qBA1C/B,CA2CpB,QA3CoB,EA4CpB,MA5CoB,CAAA,MAAA,EAAA,KAAA,CAAA,CAAA"}
|
package/dist/react.d.mts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { InferMiddlewareOutput, MergeInput, Middleware, Run } from "./core-internal.mjs";
|
|
2
|
+
import { InitOptions } from "./core.mjs";
|
|
3
|
+
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
4
|
+
import { ReactNode } from "react";
|
|
5
|
+
|
|
6
|
+
//#region src/react.d.ts
|
|
7
|
+
interface ReactProcedureBuilder<TContext, TInput = Record<string, never>> {
|
|
8
|
+
use<TInputExt, TMiddleware extends Middleware<TInputExt, TContext, any>>(middleware: TMiddleware): ReactProcedureBuilder<InferMiddlewareOutput<TMiddleware>, MergeInput<TInput, TInputExt>>;
|
|
9
|
+
input<TSchema extends StandardSchemaV1>(schema: TSchema): ReactProcedureBuilder<TContext, MergeInput<TInput, StandardSchemaV1.InferInput<TSchema>>>;
|
|
10
|
+
run: Run<TContext, TInput>;
|
|
11
|
+
rsc: Run<TContext, TInput, ReactNode>;
|
|
12
|
+
serverFn: Run<TContext, TInput>;
|
|
13
|
+
}
|
|
14
|
+
declare const init: <TContext>(options: InitOptions<TContext>) => {
|
|
15
|
+
middleware: <TInput, TResult>(fn: Middleware<TInput, TContext, TResult>) => Middleware<TInput, TContext, TResult>;
|
|
16
|
+
procedure: ReactProcedureBuilder<TContext, Record<string, never>>;
|
|
17
|
+
};
|
|
18
|
+
//#endregion
|
|
19
|
+
export { init };
|
|
20
|
+
//# sourceMappingURL=react.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.mts","names":[],"sources":["../src/react.ts"],"sourcesContent":[],"mappings":";;;;;;UAcU,yCAAyC;qCACd,WAAW,WAAW,4BAC3C,cACX,sBACD,sBAAsB,cACtB,WAAW,QAAQ;EALb,KAAA,CAAA,gBAQc,gBARO,CAAA,CAAA,MAAA,EASnB,OATmB,CAAA,EAU1B,qBAV0B,CAW3B,QAX2B,EAY3B,UAZ2B,CAYhB,MAZgB,EAYR,gBAAA,CAAiB,UAZT,CAYoB,OAZpB,CAAA,CAAA,CAAA;EAAA,GAAA,EAexB,GAfwB,CAepB,QAfoB,EAeV,MAfU,CAAA;KAAoB,EAgB5C,GAhB4C,CAgBxC,QAhBwC,EAgB9B,MAhB8B,EAgBtB,SAhBsB,CAAA;UACH,EAgBpC,GAhBoC,CAgBhC,QAhBgC,EAgBtB,MAhBsB,CAAA;;AAAX,cAmCxB,IAnCwB,EAAA,CAAA,QAAA,CAAA,CAAA,OAAA,EAmCG,WAnCH,CAmCe,QAnCf,CAAA,EAAA,GAAA;YACrB,EAAA,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EAAA,YAAA,OAAA,UAAA,SAAA,CAAA,EAAA,aAAA,OAAA,UAAA,SAAA,CAAA;WAEU,EA0C+B,qBA1C/B,CA2CpB,QA3CoB,EA4CpB,MA5CoB,CAAA,MAAA,EAAA,KAAA,CAAA,CAAA"}
|
package/dist/react.mjs
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { _objectSpread2 } from "./_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.mjs";
|
|
2
|
+
import { createMiddleware, createProcedureBuilder } from "./core-internal.mjs";
|
|
3
|
+
import { init as init$1 } from "./core.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/react.ts
|
|
6
|
+
const createReactBuilder = (middlewares, factory) => {
|
|
7
|
+
const core = createProcedureBuilder(middlewares, factory !== null && factory !== void 0 ? factory : createReactBuilder);
|
|
8
|
+
return _objectSpread2(_objectSpread2({}, core), {}, {
|
|
9
|
+
rsc: core.run,
|
|
10
|
+
serverFn: core.run
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
const init = (options) => {
|
|
14
|
+
const core = init$1(options);
|
|
15
|
+
const initialMiddlewares = [createMiddleware("INITIAL_CONTEXT", async ({ next }) => {
|
|
16
|
+
return next({ ctx: await options.ctx() });
|
|
17
|
+
})];
|
|
18
|
+
return {
|
|
19
|
+
middleware: core.middleware,
|
|
20
|
+
procedure: createReactBuilder(initialMiddlewares)
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
export { init };
|
|
26
|
+
//# sourceMappingURL=react.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.mjs","names":["createReactBuilder: ProcedureBuilderFactory","coreInit","initialMiddlewares: InternalMiddleware[]"],"sources":["../src/react.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { ReactNode } from \"react\";\nimport { init as coreInit, type InitOptions } from \"./core\";\nimport {\n createMiddleware,\n createProcedureBuilder,\n type InferMiddlewareOutput,\n type InternalMiddleware,\n type MergeInput,\n type Middleware,\n type ProcedureBuilderFactory,\n type Run,\n} from \"./core-internal\";\n\ninterface ReactProcedureBuilder<TContext, TInput = Record<string, never>> {\n use<TInputExt, TMiddleware extends Middleware<TInputExt, TContext, any>>(\n middleware: TMiddleware,\n ): ReactProcedureBuilder<\n InferMiddlewareOutput<TMiddleware>,\n MergeInput<TInput, TInputExt>\n >;\n\n input<TSchema extends StandardSchemaV1>(\n schema: TSchema,\n ): ReactProcedureBuilder<\n TContext,\n MergeInput<TInput, StandardSchemaV1.InferInput<TSchema>>\n >;\n\n run: Run<TContext, TInput>;\n rsc: Run<TContext, TInput, ReactNode>;\n serverFn: Run<TContext, TInput>;\n}\n\nconst createReactBuilder: ProcedureBuilderFactory = (\n middlewares: InternalMiddleware[],\n factory?: ProcedureBuilderFactory,\n) => {\n const core = createProcedureBuilder(\n middlewares,\n factory ?? createReactBuilder,\n );\n\n return {\n ...core,\n rsc: core.run,\n serverFn: core.run,\n };\n};\n\nexport const init = <TContext>(options: InitOptions<TContext>) => {\n const core = coreInit(options);\n const initialMiddlewares: InternalMiddleware[] = [\n createMiddleware(\"INITIAL_CONTEXT\", async ({ next }: any) => {\n return next({ ctx: await options.ctx() });\n }),\n ];\n\n return {\n middleware: core.middleware,\n procedure: createReactBuilder(initialMiddlewares) as ReactProcedureBuilder<\n TContext,\n Record<string, never>\n >,\n };\n};\n"],"mappings":";;;;;AAkCA,MAAMA,sBACJ,aACA,YACG;CACH,MAAM,OAAO,uBACX,aACA,mDAAW,mBACZ;AAED,0CACK;EACH,KAAK,KAAK;EACV,UAAU,KAAK;;;AAInB,MAAa,QAAkB,YAAmC;CAChE,MAAM,OAAOC,OAAS,QAAQ;CAC9B,MAAMC,qBAA2C,CAC/C,iBAAiB,mBAAmB,OAAO,EAAE,WAAgB;AAC3D,SAAO,KAAK,EAAE,KAAK,MAAM,QAAQ,KAAK,EAAE,CAAC;GACzC,CACH;AAED,QAAO;EACL,YAAY,KAAK;EACjB,WAAW,mBAAmB,mBAAmB;EAIlD"}
|
package/dist/types.d.cts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";KAAY,sBAAA,MAA4B,CAApB,GAAwB,CAAxB,CAA0B,CAA1B,CAAA,EAAA,GAAA,CAAA,CAAA;AAAoB,KAC5B,SAD4B,CAAA,CAAA,CAAA,GACb,CADa,GACT,OADS,CACD,CADC,CAAA"}
|
package/dist/types.d.mts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";KAAY,sBAAA,MAA4B,CAApB,GAAwB,CAAxB,CAA0B,CAA1B,CAAA,EAAA,GAAA,CAAA,CAAA;AAAoB,KAC5B,SAD4B,CAAA,CAAA,CAAA,GACb,CADa,GACT,OADS,CACD,CADC,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jlnstack/procedure",
|
|
3
|
+
"description": "",
|
|
4
|
+
"version": "0.0.1",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "jln13x",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsdown",
|
|
9
|
+
"dev": "tsdown --watch",
|
|
10
|
+
"lint": "tsc --noEmit",
|
|
11
|
+
"test": "vitest",
|
|
12
|
+
"test:run": "vitest run",
|
|
13
|
+
"test:ui": "vitest --ui"
|
|
14
|
+
},
|
|
15
|
+
"peerDependencies": {
|
|
16
|
+
"react": ">=19",
|
|
17
|
+
"react-dom": ">=19",
|
|
18
|
+
"next": ">=16"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@standard-schema/spec": "^1.0.0",
|
|
22
|
+
"@testing-library/jest-dom": "^6.6.3",
|
|
23
|
+
"@testing-library/react": "^16.1.0",
|
|
24
|
+
"@types/react": "^19.1.16",
|
|
25
|
+
"@types/react-dom": "^19.1.9",
|
|
26
|
+
"@vitest/ui": "^2.1.8",
|
|
27
|
+
"tsdown": "^0.15.4",
|
|
28
|
+
"typescript": "catalog:",
|
|
29
|
+
"vitest": "^2.1.8"
|
|
30
|
+
},
|
|
31
|
+
"exports": {
|
|
32
|
+
"./package.json": "./package.json",
|
|
33
|
+
".": {
|
|
34
|
+
"import": {
|
|
35
|
+
"types": "./dist/index.d.mts",
|
|
36
|
+
"default": "./dist/index.mjs"
|
|
37
|
+
},
|
|
38
|
+
"require": {
|
|
39
|
+
"types": "./dist/index.d.cts",
|
|
40
|
+
"default": "./dist/index.cjs"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"./react": {
|
|
44
|
+
"import": {
|
|
45
|
+
"types": "./dist/react.d.mts",
|
|
46
|
+
"default": "./dist/react.mjs"
|
|
47
|
+
},
|
|
48
|
+
"require": {
|
|
49
|
+
"types": "./dist/react.d.cts",
|
|
50
|
+
"default": "./dist/react.cjs"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"./next": {
|
|
54
|
+
"import": {
|
|
55
|
+
"types": "./dist/next.d.mts",
|
|
56
|
+
"default": "./dist/next.mjs"
|
|
57
|
+
},
|
|
58
|
+
"require": {
|
|
59
|
+
"types": "./dist/next.d.cts",
|
|
60
|
+
"default": "./dist/next.cjs"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
+
import type { Awaitable, Prettify } from "./types";
|
|
3
|
+
|
|
4
|
+
export interface MiddlewareResult<TCtx> {
|
|
5
|
+
result: unknown;
|
|
6
|
+
ctx: TCtx;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export type Middleware<TInput, TContext, TResult> = (args: {
|
|
10
|
+
input: TInput;
|
|
11
|
+
ctx: TContext;
|
|
12
|
+
next: <T>(opts: { ctx: T }) => Awaitable<MiddlewareResult<T>>;
|
|
13
|
+
}) => Awaitable<MiddlewareResult<TResult>>;
|
|
14
|
+
|
|
15
|
+
export interface InternalMiddleware {
|
|
16
|
+
id?: string;
|
|
17
|
+
run: Middleware<any, any, any>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type InferMiddlewareOutput<T> = T extends Middleware<any, any, infer O>
|
|
21
|
+
? O
|
|
22
|
+
: never;
|
|
23
|
+
|
|
24
|
+
export type InferMiddlewareArrayOutput<
|
|
25
|
+
T extends readonly Middleware<any, any, any>[],
|
|
26
|
+
> = T extends readonly [infer First, ...infer Rest]
|
|
27
|
+
? First extends Middleware<any, any, infer O>
|
|
28
|
+
? Rest extends readonly Middleware<any, any, any>[]
|
|
29
|
+
? Prettify<O & InferMiddlewareArrayOutput<Rest>>
|
|
30
|
+
: O
|
|
31
|
+
: never
|
|
32
|
+
: {};
|
|
33
|
+
|
|
34
|
+
export type InferMiddlewareArrayInput<
|
|
35
|
+
T extends readonly Middleware<any, any, any>[],
|
|
36
|
+
> = T extends readonly [infer First, ...infer Rest]
|
|
37
|
+
? First extends Middleware<infer I, any, any>
|
|
38
|
+
? Rest extends readonly Middleware<any, any, any>[]
|
|
39
|
+
? MergeInput<I, InferMiddlewareArrayInput<Rest>>
|
|
40
|
+
: I
|
|
41
|
+
: never
|
|
42
|
+
: Record<string, never>;
|
|
43
|
+
|
|
44
|
+
export type MergeInput<A, B> = Prettify<
|
|
45
|
+
(A extends Record<string, never> | undefined ? {} : A) &
|
|
46
|
+
(B extends Record<string, never> | undefined ? {} : B)
|
|
47
|
+
>;
|
|
48
|
+
|
|
49
|
+
export interface ProcedureBuilder<TContext, TInput = Record<string, never>> {
|
|
50
|
+
use<TInputExt, TMiddleware extends Middleware<TInputExt, TContext, any>>(
|
|
51
|
+
middleware: TMiddleware,
|
|
52
|
+
): ProcedureBuilder<
|
|
53
|
+
InferMiddlewareOutput<TMiddleware>,
|
|
54
|
+
MergeInput<TInput, TInputExt>
|
|
55
|
+
>;
|
|
56
|
+
|
|
57
|
+
use<TMiddlewares extends readonly Middleware<any, TContext, any>[]>(
|
|
58
|
+
middlewares: [...TMiddlewares],
|
|
59
|
+
): ProcedureBuilder<
|
|
60
|
+
InferMiddlewareArrayOutput<TMiddlewares>,
|
|
61
|
+
MergeInput<TInput, InferMiddlewareArrayInput<TMiddlewares>>
|
|
62
|
+
>;
|
|
63
|
+
|
|
64
|
+
input<TSchema extends StandardSchemaV1>(
|
|
65
|
+
schema: TSchema,
|
|
66
|
+
): ProcedureBuilder<
|
|
67
|
+
TContext,
|
|
68
|
+
MergeInput<TInput, StandardSchemaV1.InferInput<TSchema>>
|
|
69
|
+
>;
|
|
70
|
+
|
|
71
|
+
run: Run<TContext, TInput>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
type IsPartialObject<T> = T extends object
|
|
75
|
+
? {} extends T
|
|
76
|
+
? true
|
|
77
|
+
: false
|
|
78
|
+
: false;
|
|
79
|
+
|
|
80
|
+
export type Run<
|
|
81
|
+
TContext,
|
|
82
|
+
TInput = Record<string, never>,
|
|
83
|
+
TResultConstraint = unknown,
|
|
84
|
+
> = <TResult extends TResultConstraint>(
|
|
85
|
+
fn: (args: { input: TInput; ctx: TContext }) => Awaitable<TResult>,
|
|
86
|
+
) => TInput extends Record<string, never> | undefined
|
|
87
|
+
? () => Promise<TResult>
|
|
88
|
+
: IsPartialObject<TInput> extends true
|
|
89
|
+
? (input?: TInput) => Promise<TResult>
|
|
90
|
+
: (input: TInput) => Promise<TResult>;
|
|
91
|
+
|
|
92
|
+
export type ProcedureBuilderFactory = (
|
|
93
|
+
mws: InternalMiddleware[],
|
|
94
|
+
factory?: ProcedureBuilderFactory,
|
|
95
|
+
) => ProcedureBuilder<any, any>;
|
|
96
|
+
|
|
97
|
+
export const createProcedureBuilder = <
|
|
98
|
+
TContext,
|
|
99
|
+
TInput = Record<string, never>,
|
|
100
|
+
>(
|
|
101
|
+
middlewares: InternalMiddleware[],
|
|
102
|
+
factory?: ProcedureBuilderFactory,
|
|
103
|
+
): ProcedureBuilder<TContext, TInput> => {
|
|
104
|
+
const create = factory ?? createProcedureBuilder;
|
|
105
|
+
|
|
106
|
+
const builder: ProcedureBuilder<TContext, TInput> = {
|
|
107
|
+
use: (middleware: any) => {
|
|
108
|
+
if (Array.isArray(middleware)) {
|
|
109
|
+
const combined: Middleware<any, any, any> = async ({
|
|
110
|
+
input,
|
|
111
|
+
ctx,
|
|
112
|
+
next,
|
|
113
|
+
}) => {
|
|
114
|
+
const results = await Promise.all(
|
|
115
|
+
middleware.map((mw) =>
|
|
116
|
+
mw({
|
|
117
|
+
input,
|
|
118
|
+
ctx,
|
|
119
|
+
next: <T>(opts: { ctx: T }) =>
|
|
120
|
+
Promise.resolve({ result: undefined, ctx: opts.ctx }),
|
|
121
|
+
}),
|
|
122
|
+
),
|
|
123
|
+
);
|
|
124
|
+
const mergedCtx = results.reduce(
|
|
125
|
+
// biome-ignore lint/performance/noAccumulatingSpread: idc
|
|
126
|
+
(acc, r) => ({ ...acc, ...r.ctx }),
|
|
127
|
+
ctx,
|
|
128
|
+
);
|
|
129
|
+
return next({ ctx: mergedCtx });
|
|
130
|
+
};
|
|
131
|
+
return create([...middlewares, { run: combined }], factory);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return create([...middlewares, { run: middleware }], factory);
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
input(schema: any) {
|
|
138
|
+
return create([createInputMiddleware(schema), ...middlewares], factory);
|
|
139
|
+
},
|
|
140
|
+
|
|
141
|
+
run(fn: any) {
|
|
142
|
+
return (async (input?: TInput) => {
|
|
143
|
+
const executeProcedure = async (
|
|
144
|
+
index: number,
|
|
145
|
+
ctx: unknown,
|
|
146
|
+
): Promise<MiddlewareResult<any>> => {
|
|
147
|
+
if (index >= middlewares.length) {
|
|
148
|
+
return Promise.resolve(fn({ ctx, input })).then((result) => ({
|
|
149
|
+
result,
|
|
150
|
+
ctx,
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const mw = middlewares[index];
|
|
155
|
+
if (!mw) {
|
|
156
|
+
return Promise.resolve(fn({ ctx, input })).then((result) => ({
|
|
157
|
+
result,
|
|
158
|
+
ctx,
|
|
159
|
+
}));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return Promise.resolve(
|
|
163
|
+
mw.run({
|
|
164
|
+
input,
|
|
165
|
+
ctx,
|
|
166
|
+
next: <T>(opts: { ctx: T }) => {
|
|
167
|
+
return executeProcedure(index + 1, {
|
|
168
|
+
...(ctx ?? {}),
|
|
169
|
+
...opts.ctx,
|
|
170
|
+
}).then((result) => ({
|
|
171
|
+
...result,
|
|
172
|
+
ctx: opts.ctx,
|
|
173
|
+
})) as Promise<MiddlewareResult<T>>;
|
|
174
|
+
},
|
|
175
|
+
}),
|
|
176
|
+
);
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const { result } = await executeProcedure(0, undefined);
|
|
180
|
+
return result;
|
|
181
|
+
}) as any;
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
return builder;
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
function createInputMiddleware<TSchema extends StandardSchemaV1>(
|
|
189
|
+
schema: TSchema,
|
|
190
|
+
) {
|
|
191
|
+
return createMiddleware("INPUT_VALIDATION", async (opts) => {
|
|
192
|
+
const result = await schema["~standard"].validate(opts.input);
|
|
193
|
+
if (result.issues) {
|
|
194
|
+
throw new Error("Input validation failed");
|
|
195
|
+
}
|
|
196
|
+
return opts.next({ ctx: opts.ctx });
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export const createMiddleware = <TInput, TContext>(
|
|
201
|
+
id: string,
|
|
202
|
+
fn: Middleware<TInput, TContext, any>,
|
|
203
|
+
): InternalMiddleware => ({
|
|
204
|
+
id,
|
|
205
|
+
run: fn,
|
|
206
|
+
});
|
package/src/core.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createMiddleware,
|
|
3
|
+
createProcedureBuilder,
|
|
4
|
+
type Middleware,
|
|
5
|
+
type ProcedureBuilder,
|
|
6
|
+
} from "./core-internal";
|
|
7
|
+
import type { Awaitable } from "./types";
|
|
8
|
+
|
|
9
|
+
export interface InitOptions<TContext> {
|
|
10
|
+
ctx: () => Awaitable<TContext>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface ProcedureFactory<TContext> {
|
|
14
|
+
middleware: <TInput, TResult>(
|
|
15
|
+
fn: Middleware<TInput, TContext, TResult>,
|
|
16
|
+
) => Middleware<TInput, TContext, TResult>;
|
|
17
|
+
procedure: ProcedureBuilder<TContext>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const init = <TContext>(
|
|
21
|
+
options: InitOptions<TContext>,
|
|
22
|
+
): ProcedureFactory<TContext> => ({
|
|
23
|
+
middleware: (fn) => fn,
|
|
24
|
+
procedure: createProcedureBuilder([
|
|
25
|
+
createMiddleware("INITIAL_CONTEXT", async ({ next }) => {
|
|
26
|
+
return next({ ctx: await options.ctx() });
|
|
27
|
+
}),
|
|
28
|
+
]),
|
|
29
|
+
});
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./core";
|