@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.
Files changed (63) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +1 -0
  3. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.cjs +14 -0
  4. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.mjs +14 -0
  5. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.cjs +27 -0
  6. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.mjs +27 -0
  7. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.cjs +16 -0
  8. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.mjs +16 -0
  9. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.cjs +11 -0
  10. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.mjs +11 -0
  11. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.cjs +18 -0
  12. package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.mjs +12 -0
  13. package/dist/core-internal.cjs +71 -0
  14. package/dist/core-internal.d.cts +33 -0
  15. package/dist/core-internal.d.cts.map +1 -0
  16. package/dist/core-internal.d.mts +33 -0
  17. package/dist/core-internal.d.mts.map +1 -0
  18. package/dist/core-internal.mjs +71 -0
  19. package/dist/core-internal.mjs.map +1 -0
  20. package/dist/core.cjs +12 -0
  21. package/dist/core.d.cts +15 -0
  22. package/dist/core.d.cts.map +1 -0
  23. package/dist/core.d.mts +15 -0
  24. package/dist/core.d.mts.map +1 -0
  25. package/dist/core.mjs +13 -0
  26. package/dist/core.mjs.map +1 -0
  27. package/dist/index.cjs +3 -0
  28. package/dist/index.d.cts +2 -0
  29. package/dist/index.d.mts +2 -0
  30. package/dist/index.mjs +3 -0
  31. package/dist/next.cjs +45 -0
  32. package/dist/next.d.cts +47 -0
  33. package/dist/next.d.cts.map +1 -0
  34. package/dist/next.d.mts +47 -0
  35. package/dist/next.d.mts.map +1 -0
  36. package/dist/next.mjs +46 -0
  37. package/dist/next.mjs.map +1 -0
  38. package/dist/react.cjs +25 -0
  39. package/dist/react.d.cts +20 -0
  40. package/dist/react.d.cts.map +1 -0
  41. package/dist/react.d.mts +20 -0
  42. package/dist/react.d.mts.map +1 -0
  43. package/dist/react.mjs +26 -0
  44. package/dist/react.mjs.map +1 -0
  45. package/dist/types.d.cts +6 -0
  46. package/dist/types.d.cts.map +1 -0
  47. package/dist/types.d.mts +6 -0
  48. package/dist/types.d.mts.map +1 -0
  49. package/package.json +64 -0
  50. package/src/core-internal.ts +206 -0
  51. package/src/core.ts +29 -0
  52. package/src/index.ts +1 -0
  53. package/src/next.ts +161 -0
  54. package/src/react.ts +66 -0
  55. package/src/types.ts +4 -0
  56. package/test/core.test-d.ts +89 -0
  57. package/test/core.test.ts +57 -0
  58. package/test/next.test-d.ts +177 -0
  59. package/test/next.test.ts +230 -0
  60. package/tsconfig.build.json +7 -0
  61. package/tsconfig.json +5 -0
  62. package/tsdown.config.ts +23 -0
  63. package/vitest.config.ts +10 -0
@@ -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;
@@ -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"}
@@ -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"}
@@ -0,0 +1,6 @@
1
+ //#region src/types.d.ts
2
+ type Prettify<T> = { [K in keyof T]: T[K] } & {};
3
+ type Awaitable<T> = T | Promise<T>;
4
+ //#endregion
5
+ export { Awaitable, Prettify };
6
+ //# sourceMappingURL=types.d.cts.map
@@ -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"}
@@ -0,0 +1,6 @@
1
+ //#region src/types.d.ts
2
+ type Prettify<T> = { [K in keyof T]: T[K] } & {};
3
+ type Awaitable<T> = T | Promise<T>;
4
+ //#endregion
5
+ export { Awaitable, Prettify };
6
+ //# sourceMappingURL=types.d.mts.map
@@ -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";