@kellanjs/actioncraft 0.0.2 → 0.2.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.
Files changed (88) hide show
  1. package/README.md +1263 -1
  2. package/dist/actioncraft-error.d.ts +23 -0
  3. package/dist/actioncraft-error.js +60 -0
  4. package/dist/actioncraft-error.js.map +1 -0
  5. package/dist/actioncraft-prev.d.ts +93 -0
  6. package/dist/actioncraft-prev.js +387 -0
  7. package/dist/actioncraft-prev.js.map +1 -0
  8. package/dist/actioncraft.d.ts +94 -40
  9. package/dist/actioncraft.js +337 -68
  10. package/dist/actioncraft.js.map +1 -1
  11. package/dist/api.d.ts +49 -0
  12. package/dist/api.js +84 -0
  13. package/dist/api.js.map +1 -0
  14. package/dist/classes/action-builder.d.ts +59 -0
  15. package/dist/classes/action-builder.js +95 -0
  16. package/dist/classes/action-builder.js.map +1 -0
  17. package/dist/classes/craft-builder.d.ts +66 -0
  18. package/dist/classes/craft-builder.js +129 -0
  19. package/dist/classes/craft-builder.js.map +1 -0
  20. package/dist/classes/crafter.d.ts +66 -0
  21. package/dist/classes/crafter.js +129 -0
  22. package/dist/classes/crafter.js.map +1 -0
  23. package/dist/classes/error.d.ts +23 -0
  24. package/dist/classes/error.js +60 -0
  25. package/dist/classes/error.js.map +1 -0
  26. package/dist/classes/executor/callbacks.d.ts +6 -0
  27. package/dist/classes/executor/callbacks.js +20 -0
  28. package/dist/classes/executor/callbacks.js.map +1 -0
  29. package/dist/classes/executor/errors.d.ts +29 -0
  30. package/dist/classes/executor/errors.js +114 -0
  31. package/dist/classes/executor/errors.js.map +1 -0
  32. package/dist/classes/executor/executor.d.ts +68 -0
  33. package/dist/classes/executor/executor.js +391 -0
  34. package/dist/classes/executor/executor.js.map +1 -0
  35. package/dist/classes/executor/logging.d.ts +2 -0
  36. package/dist/classes/executor/logging.js +8 -0
  37. package/dist/classes/executor/logging.js.map +1 -0
  38. package/dist/classes/executor/transformation.d.ts +17 -0
  39. package/dist/classes/executor/transformation.js +43 -0
  40. package/dist/classes/executor/transformation.js.map +1 -0
  41. package/dist/classes/executor/validation.d.ts +16 -0
  42. package/dist/classes/executor/validation.js +70 -0
  43. package/dist/classes/executor/validation.js.map +1 -0
  44. package/dist/classes/executor.d.ts +64 -0
  45. package/dist/classes/executor.js +354 -0
  46. package/dist/classes/executor.js.map +1 -0
  47. package/dist/classes/internal.d.ts +10 -0
  48. package/dist/classes/internal.js +5 -0
  49. package/dist/classes/internal.js.map +1 -0
  50. package/dist/core/errors.d.ts +2 -2
  51. package/dist/core/errors.js +5 -5
  52. package/dist/core/errors.js.map +1 -1
  53. package/dist/core/logging.d.ts +1 -1
  54. package/dist/core/transformation.d.ts +2 -2
  55. package/dist/core/validation.d.ts +4 -4
  56. package/dist/core/validation.js +14 -14
  57. package/dist/core/validation.js.map +1 -1
  58. package/dist/craft.d.ts +29 -0
  59. package/dist/craft.js +62 -0
  60. package/dist/craft.js.map +1 -0
  61. package/dist/error.d.ts +21 -6
  62. package/dist/error.js +59 -10
  63. package/dist/error.js.map +1 -1
  64. package/dist/index.d.ts +4 -3
  65. package/dist/index.js +4 -3
  66. package/dist/index.js.map +1 -1
  67. package/dist/initial.d.ts +14 -0
  68. package/dist/initial.js +47 -0
  69. package/dist/initial.js.map +1 -0
  70. package/dist/types/actions.d.ts +67 -25
  71. package/dist/types/builder.d.ts +92 -0
  72. package/dist/types/builder.js +2 -0
  73. package/dist/types/builder.js.map +1 -0
  74. package/dist/types/config.d.ts +4 -0
  75. package/dist/types/crafter.d.ts +87 -0
  76. package/dist/types/crafter.js +2 -0
  77. package/dist/types/crafter.js.map +1 -0
  78. package/dist/types/errors.d.ts +26 -18
  79. package/dist/types/inference.d.ts +41 -8
  80. package/dist/types/result.d.ts +8 -14
  81. package/dist/types/result.js +36 -4
  82. package/dist/types/result.js.map +1 -1
  83. package/dist/types/schemas.d.ts +7 -7
  84. package/dist/types/shared.d.ts +17 -7
  85. package/dist/utils.d.ts +30 -6
  86. package/dist/utils.js +68 -8
  87. package/dist/utils.js.map +1 -1
  88. package/package.json +3 -3
package/dist/api.d.ts ADDED
@@ -0,0 +1,49 @@
1
+ import { ActionBuilder } from "./classes/action-builder.js";
2
+ import { Crafter } from "./classes/crafter.js";
3
+ import type { CraftedAction } from "./types/actions.js";
4
+ import type { CrafterConfig, CrafterSchemas, CrafterErrors, CrafterCallbacks } from "./types/crafter.js";
5
+ /**
6
+ * Represents the function that the user passes to `craft()` in order to build an action.
7
+ */
8
+ type CraftFn<TConfig extends CrafterConfig, TSchemas extends CrafterSchemas, TErrors extends CrafterErrors, TCallbacks extends CrafterCallbacks<TConfig, TSchemas, TErrors, TData>, TData> = (crafter: Crafter<CrafterConfig, Record<string, never>, Record<string, never>, Record<string, never>, unknown>) => Crafter<TConfig, TSchemas, TErrors, TCallbacks, TData> | Promise<Crafter<TConfig, TSchemas, TErrors, TCallbacks, TData>>;
9
+ /**
10
+ * One of two entry points to the Actioncraft system.
11
+ * It provides you with an empty Crafter instance on which you can call any of the fluent
12
+ * Crafter methods to configure and define your action.
13
+ *
14
+ * Example Usage:
15
+ * ```ts
16
+ * const myAction = craft(async (action) => {
17
+ * return action
18
+ * .config(...)
19
+ * .schemas(...)
20
+ * .errors(...)
21
+ * .handler(...)
22
+ * .callbacks(...)
23
+ * });
24
+ * ```
25
+ *
26
+ * @param craftFn - The function that the user passes to `craft()` in order to build an action.
27
+ * @returns The fully-typed server action function that can be used in your app.
28
+ */
29
+ export declare function craft<TConfig extends CrafterConfig, TSchemas extends CrafterSchemas, TErrors extends CrafterErrors, TCallbacks extends CrafterCallbacks<TConfig, TSchemas, TErrors, TData>, TData>(craftFn: CraftFn<TConfig, TSchemas, TErrors, TCallbacks, TData>): CraftedAction<TConfig, TSchemas, TErrors, TData>;
30
+ /**
31
+ * One of two entry points to the Actioncraft system.
32
+ * Creates a new ActionBuilder instance for the fluent API that ends with craft().
33
+ * This provides an alternative syntax for building your server actions.
34
+ *
35
+ * Example Usage:
36
+ * ```ts
37
+ * const myAction = action()
38
+ * .config(...)
39
+ * .schemas(...)
40
+ * .errors(...)
41
+ * .handler(...)
42
+ * .callbacks(...)
43
+ * .craft();
44
+ * ```
45
+ *
46
+ * @returns A new ActionBuilder instance to start building your action.
47
+ */
48
+ export declare function action(): ActionBuilder<Record<string, never>, Record<string, never>, Record<string, never>, Record<string, never>, unknown>;
49
+ export {};
package/dist/api.js ADDED
@@ -0,0 +1,84 @@
1
+ import { ActionBuilder } from "./classes/action-builder.js";
2
+ import { Crafter } from "./classes/crafter.js";
3
+ import { Executor } from "./classes/executor.js";
4
+ /**
5
+ * One of two entry points to the Actioncraft system.
6
+ * It provides you with an empty Crafter instance on which you can call any of the fluent
7
+ * Crafter methods to configure and define your action.
8
+ *
9
+ * Example Usage:
10
+ * ```ts
11
+ * const myAction = craft(async (action) => {
12
+ * return action
13
+ * .config(...)
14
+ * .schemas(...)
15
+ * .errors(...)
16
+ * .handler(...)
17
+ * .callbacks(...)
18
+ * });
19
+ * ```
20
+ *
21
+ * @param craftFn - The function that the user passes to `craft()` in order to build an action.
22
+ * @returns The fully-typed server action function that can be used in your app.
23
+ */
24
+ export function craft(craftFn) {
25
+ const crafter = craftFn(new Crafter({}, {}, {}, {}, undefined));
26
+ // Handle async crafter functions
27
+ if (crafter instanceof Promise) {
28
+ return _craftAsync(crafter);
29
+ }
30
+ // Handle sync crafter functions
31
+ const executor = new Executor(crafter);
32
+ const craftedAction = executor.craft();
33
+ return craftedAction;
34
+ }
35
+ /**
36
+ * Internal helper function to handle async craft functions.
37
+ * Encapsulates the logic for creating async actions and preserving metadata.
38
+ */
39
+ function _craftAsync(crafterPromise) {
40
+ // Resolve the crafter once and cache the resulting action to ensure consistent IDs
41
+ const actionPromise = crafterPromise.then((resolvedCrafter) => {
42
+ const executor = new Executor(resolvedCrafter);
43
+ return executor.craft();
44
+ });
45
+ // For async craft functions, we need to return an async action
46
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
+ const asyncAction = (async (...args) => {
48
+ // Wait for the cached action to be ready
49
+ const craftedAction = await actionPromise;
50
+ // Call the action with the user's arguments
51
+ return craftedAction(...args);
52
+ });
53
+ // We need to preserve the config and ID for the initial() function to work
54
+ // We'll use the same cached action to ensure consistent metadata
55
+ actionPromise.then((craftedAction) => {
56
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
+ asyncAction.__ac_config = craftedAction.__ac_config;
58
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
59
+ asyncAction.__ac_id = craftedAction.__ac_id;
60
+ });
61
+ return asyncAction;
62
+ }
63
+ /**
64
+ * One of two entry points to the Actioncraft system.
65
+ * Creates a new ActionBuilder instance for the fluent API that ends with craft().
66
+ * This provides an alternative syntax for building your server actions.
67
+ *
68
+ * Example Usage:
69
+ * ```ts
70
+ * const myAction = action()
71
+ * .config(...)
72
+ * .schemas(...)
73
+ * .errors(...)
74
+ * .handler(...)
75
+ * .callbacks(...)
76
+ * .craft();
77
+ * ```
78
+ *
79
+ * @returns A new ActionBuilder instance to start building your action.
80
+ */
81
+ export function action() {
82
+ return new ActionBuilder({}, {}, {}, {}, undefined);
83
+ }
84
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAkCjD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,KAAK,CAOnB,OAA+D;IAE/D,MAAM,OAAO,GAAG,OAAO,CACrB,IAAI,OAAO,CACT,EAAmB,EACnB,EAA2B,EAC3B,EAA2B,EAC3B,EAA2B,EAC3B,SAAS,CACV,CACF,CAAC;IAEF,iCAAiC;IACjC,IAAI,OAAO,YAAY,OAAO,EAAE,CAAC;QAC/B,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,gCAAgC;IAChC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEvC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAOlB,cAEC;IAED,mFAAmF;IACnF,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,EAAE;QAC5D,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC/C,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,8DAA8D;IAC9D,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,GAAG,IAAW,EAAE,EAAE;QAC5C,yCAAyC;QACzC,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC;QAE1C,4CAA4C;QAC5C,OAAO,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC;IAChC,CAAC,CAAqD,CAAC;IAEvD,2EAA2E;IAC3E,iEAAiE;IACjE,aAAa,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE;QACnC,8DAA8D;QAC7D,WAAmB,CAAC,WAAW,GAAI,aAAqB,CAAC,WAAW,CAAC;QACtE,8DAA8D;QAC7D,WAAmB,CAAC,OAAO,GAAI,aAAqB,CAAC,OAAO,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,MAAM;IAOpB,OAAO,IAAI,aAAa,CACtB,EAA2B,EAC3B,EAA2B,EAC3B,EAA2B,EAC3B,EAA2B,EAC3B,SAAS,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,59 @@
1
+ import type { Handler, CraftedAction, InferDataFromHandler, HandlerParams } from "../types/actions.js";
2
+ import type { Config, Schemas, Errors, Callbacks } from "../types/builder.js";
3
+ export declare class ActionBuilder<TConfig extends Config, TSchemas extends Schemas, TErrors extends Errors, TCallbacks extends Callbacks<TConfig, TSchemas, TErrors, TData>, TData> {
4
+ private readonly _config;
5
+ private readonly _schemas;
6
+ private readonly _errors;
7
+ private readonly _callbacks;
8
+ private readonly _handler?;
9
+ constructor(config: TConfig, schemas: TSchemas, errors: TErrors, callbacks: TCallbacks, handler?: Handler<TConfig, TSchemas, TErrors, TData>);
10
+ /**
11
+ * Defines configuration options for the action.
12
+ * Resets previously defined handler and callbacks.
13
+ */
14
+ config<TNewConfig extends Config>(config: TNewConfig): ActionBuilder<TNewConfig, TSchemas, TErrors, Record<string, never>, unknown>;
15
+ /**
16
+ * Defines validation schemas for input, output, and bind arguments.
17
+ * Resets previously defined handler and callbacks.
18
+ */
19
+ schemas<TNewSchemas extends Schemas>(schemas: TNewSchemas): ActionBuilder<TConfig, TNewSchemas, TErrors, Record<string, never>, unknown>;
20
+ /**
21
+ * Defines error functions for returning typed errors from the handler.
22
+ * Resets previously defined handler and callbacks.
23
+ */
24
+ errors<const TNewErrors extends Errors>(errors: TNewErrors): ActionBuilder<TConfig, TSchemas, TNewErrors, Record<string, never>, unknown>;
25
+ /**
26
+ * Defines the handler function containing the server action's business logic.
27
+ * Resets previously defined callbacks.
28
+ */
29
+ handler<TFn extends (params: HandlerParams<TConfig, TSchemas, TErrors, TData>) => Promise<unknown>>(fn: TFn): ActionBuilder<TConfig, TSchemas, TErrors, Record<string, never>, InferDataFromHandler<TFn>>;
30
+ /**
31
+ * Defines lifecycle callbacks to be triggered during the exection of an action.
32
+ * Must be called after handler() for correct type inference.
33
+ */
34
+ callbacks<TNewCallbacks extends Callbacks<TConfig, TSchemas, TErrors, TData>>(callbacks: TNewCallbacks): ActionBuilder<TConfig, TSchemas, TErrors, TNewCallbacks, TData>;
35
+ /**
36
+ * Builds and returns the final executable server action.
37
+ * This is the terminal method for the ActionBuilder fluent API.
38
+ */
39
+ craft(): CraftedAction<TConfig, TSchemas, TErrors, TData>;
40
+ }
41
+ /**
42
+ * One of two entry points to the Actioncraft system.
43
+ * Creates a new ActionBuilder instance for the fluent API that ends with craft().
44
+ * This provides an alternative syntax for building your server actions.
45
+ *
46
+ * Example Usage:
47
+ * ```ts
48
+ * const myAction = action()
49
+ * .config(...)
50
+ * .schemas(...)
51
+ * .errors(...)
52
+ * .handler(...)
53
+ * .callbacks(...)
54
+ * .craft();
55
+ * ```
56
+ *
57
+ * @returns A new ActionBuilder instance to start building your action.
58
+ */
59
+ export declare function action(): ActionBuilder<Record<string, never>, Record<string, never>, Record<string, never>, Record<string, never>, unknown>;
@@ -0,0 +1,95 @@
1
+ import { CraftBuilder } from "./craft-builder.js";
2
+ import { Executor } from "./executor/executor.js";
3
+ // ============================================================================
4
+ // ACTION BUILDER CLASS - Alternative fluent API syntax ending with craft()
5
+ // ============================================================================
6
+ export class ActionBuilder {
7
+ _config;
8
+ _schemas;
9
+ _errors;
10
+ _callbacks;
11
+ _handler;
12
+ constructor(config, schemas, errors, callbacks, handler) {
13
+ this._config = config;
14
+ this._schemas = schemas;
15
+ this._errors = errors;
16
+ this._callbacks = callbacks;
17
+ this._handler = handler;
18
+ }
19
+ // --------------------------------------------------------------------------
20
+ // FLUENT API METHODS (same as CraftBuilder)
21
+ // --------------------------------------------------------------------------
22
+ /**
23
+ * Defines configuration options for the action.
24
+ * Resets previously defined handler and callbacks.
25
+ */
26
+ config(config) {
27
+ return new ActionBuilder(config, this._schemas, this._errors, {}, undefined);
28
+ }
29
+ /**
30
+ * Defines validation schemas for input, output, and bind arguments.
31
+ * Resets previously defined handler and callbacks.
32
+ */
33
+ schemas(schemas) {
34
+ return new ActionBuilder(this._config, schemas, this._errors, {}, undefined);
35
+ }
36
+ /**
37
+ * Defines error functions for returning typed errors from the handler.
38
+ * Resets previously defined handler and callbacks.
39
+ */
40
+ errors(errors) {
41
+ return new ActionBuilder(this._config, this._schemas, errors, {}, undefined);
42
+ }
43
+ /**
44
+ * Defines the handler function containing the server action's business logic.
45
+ * Resets previously defined callbacks.
46
+ */
47
+ handler(fn) {
48
+ return new ActionBuilder(this._config, this._schemas, this._errors, {}, fn);
49
+ }
50
+ /**
51
+ * Defines lifecycle callbacks to be triggered during the exection of an action.
52
+ * Must be called after handler() for correct type inference.
53
+ */
54
+ callbacks(callbacks) {
55
+ return new ActionBuilder(this._config, this._schemas, this._errors, callbacks, this._handler);
56
+ }
57
+ // --------------------------------------------------------------------------
58
+ // CRAFT METHOD - Final step to create the action
59
+ // --------------------------------------------------------------------------
60
+ /**
61
+ * Builds and returns the final executable server action.
62
+ * This is the terminal method for the ActionBuilder fluent API.
63
+ */
64
+ craft() {
65
+ // Convert ActionBuilder to CraftBuilder and use existing Executor logic
66
+ const builder = new CraftBuilder(this._config, this._schemas, this._errors, this._callbacks, this._handler);
67
+ const executor = new Executor(builder);
68
+ return executor.craft();
69
+ }
70
+ }
71
+ // ============================================================================
72
+ // PUBLIC API FUNCTION
73
+ // ============================================================================
74
+ /**
75
+ * One of two entry points to the Actioncraft system.
76
+ * Creates a new ActionBuilder instance for the fluent API that ends with craft().
77
+ * This provides an alternative syntax for building your server actions.
78
+ *
79
+ * Example Usage:
80
+ * ```ts
81
+ * const myAction = action()
82
+ * .config(...)
83
+ * .schemas(...)
84
+ * .errors(...)
85
+ * .handler(...)
86
+ * .callbacks(...)
87
+ * .craft();
88
+ * ```
89
+ *
90
+ * @returns A new ActionBuilder instance to start building your action.
91
+ */
92
+ export function action() {
93
+ return new ActionBuilder({}, {}, {}, {}, undefined);
94
+ }
95
+ //# sourceMappingURL=action-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-builder.js","sourceRoot":"","sources":["../../src/classes/action-builder.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,+EAA+E;AAC/E,2EAA2E;AAC3E,+EAA+E;AAE/E,MAAM,OAAO,aAAa;IAOP,OAAO,CAAU;IACjB,QAAQ,CAAW;IACnB,OAAO,CAAU;IACjB,UAAU,CAAa;IACvB,QAAQ,CAA8C;IAEvE,YACE,MAAe,EACf,OAAiB,EACjB,MAAe,EACf,SAAqB,EACrB,OAAoD;QAEpD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,6EAA6E;IAC7E,4CAA4C;IAC5C,6EAA6E;IAE7E;;;OAGG;IACH,MAAM,CACJ,MAAkB;QAQlB,OAAO,IAAI,aAAa,CACtB,MAAM,EACN,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,OAAO,EACZ,EAA2B,EAC3B,SAAS,CACV,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,OAAO,CACL,OAAoB;QAQpB,OAAO,IAAI,aAAa,CACtB,IAAI,CAAC,OAAO,EACZ,OAAO,EACP,IAAI,CAAC,OAAO,EACZ,EAA2B,EAC3B,SAAS,CACV,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CACJ,MAAkB;QAQlB,OAAO,IAAI,aAAa,CACtB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,QAAQ,EACb,MAAM,EACN,EAA2B,EAC3B,SAAS,CACV,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,OAAO,CAKL,EAAO;QAQP,OAAO,IAAI,aAAa,CACtB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,OAAO,EACZ,EAA2B,EAC3B,EAAoE,CACrE,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,SAAS,CACP,SAAwB;QAExB,OAAO,IAAI,aAAa,CACtB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,OAAO,EACZ,SAAS,EACT,IAAI,CAAC,QAAQ,CACd,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,iDAAiD;IACjD,6EAA6E;IAE7E;;;OAGG;IACH,KAAK;QACH,wEAAwE;QACxE,MAAM,OAAO,GAAG,IAAI,YAAY,CAC9B,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,QAAQ,CACd,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACF;AAED,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,MAAM;IAOpB,OAAO,IAAI,aAAa,CACtB,EAA2B,EAC3B,EAA2B,EAC3B,EAA2B,EAC3B,EAA2B,EAC3B,SAAS,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,66 @@
1
+ import type { Handler, InferDataFromHandler, HandlerParams, CraftedAction } from "../types/actions.js";
2
+ import type { Config, Schemas, Errors, Callbacks } from "../types/builder.js";
3
+ import { INTERNAL, type CrafterInternals } from "./internal.js";
4
+ export declare class CraftBuilder<TConfig extends Config, TSchemas extends Schemas, TErrors extends Errors, TCallbacks extends Callbacks<TConfig, TSchemas, TErrors, TData>, TData> {
5
+ private readonly _config;
6
+ private readonly _schemas;
7
+ private readonly _errors;
8
+ private readonly _callbacks;
9
+ private readonly _handler?;
10
+ constructor(config: TConfig, schemas: TSchemas, errors: TErrors, callbacks: TCallbacks, handler?: Handler<TConfig, TSchemas, TErrors, TData>);
11
+ /**
12
+ * Defines configuration options for the action.
13
+ * Resets previously defined handler and callbacks.
14
+ */
15
+ config<TNewConfig extends Config>(config: TNewConfig): CraftBuilder<TNewConfig, TSchemas, TErrors, Record<string, never>, unknown>;
16
+ /**
17
+ * Defines validation schemas for input, output, and bind arguments.
18
+ * Resets previously defined handler and callbacks.
19
+ */
20
+ schemas<TNewSchemas extends Schemas>(schemas: TNewSchemas): CraftBuilder<TConfig, TNewSchemas, TErrors, Record<string, never>, unknown>;
21
+ /**
22
+ * Defines error functions for returning typed errors from the handler.
23
+ * Resets previously defined handler and callbacks.
24
+ */
25
+ errors<const TNewErrors extends Errors>(errors: TNewErrors): CraftBuilder<TConfig, TSchemas, TNewErrors, Record<string, never>, unknown>;
26
+ /**
27
+ * Defines the handler function containing the server action's business logic.
28
+ * Resets previously defined callbacks.
29
+ */
30
+ handler<TFn extends (params: HandlerParams<TConfig, TSchemas, TErrors, TData>) => Promise<unknown>>(fn: TFn): CraftBuilder<TConfig, TSchemas, TErrors, Record<string, never>, InferDataFromHandler<TFn>>;
31
+ /**
32
+ * Defines lifecycle callbacks to be triggered during the exection of an action.
33
+ * Must be called after handler() for correct type inference.
34
+ */
35
+ callbacks<TNewCallbacks extends Callbacks<TConfig, TSchemas, TErrors, TData>>(callbacks: TNewCallbacks): CraftBuilder<TConfig, TSchemas, TErrors, TNewCallbacks, TData>;
36
+ /**
37
+ * @returns Internal properties of the CraftBuilder instance
38
+ */
39
+ [INTERNAL](): CrafterInternals<TConfig, TSchemas, TErrors, TCallbacks, TData>;
40
+ }
41
+ /**
42
+ * Represents the function that the user passes to `craft()` in order to build an action.
43
+ */
44
+ type CraftFn<TConfig extends Config, TSchemas extends Schemas, TErrors extends Errors, TCallbacks extends Callbacks<TConfig, TSchemas, TErrors, TData>, TData> = (builder: CraftBuilder<Config, Record<string, never>, Record<string, never>, Record<string, never>, unknown>) => CraftBuilder<TConfig, TSchemas, TErrors, TCallbacks, TData> | Promise<CraftBuilder<TConfig, TSchemas, TErrors, TCallbacks, TData>>;
45
+ /**
46
+ * One of two entry points to the Actioncraft system.
47
+ * It provides you with an empty CraftBuilder instance on which you can call any of the fluent
48
+ * CraftBuilder methods to configure and define your action.
49
+ *
50
+ * Example Usage:
51
+ * ```ts
52
+ * const myAction = craft(async (action) => {
53
+ * return action
54
+ * .config(...)
55
+ * .schemas(...)
56
+ * .errors(...)
57
+ * .handler(...)
58
+ * .callbacks(...)
59
+ * });
60
+ * ```
61
+ *
62
+ * @param craftFn - The function that the user passes to `craft()` in order to build an action.
63
+ * @returns The fully-typed server action function that can be used in your app.
64
+ */
65
+ export declare function craft<TConfig extends Config, TSchemas extends Schemas, TErrors extends Errors, TCallbacks extends Callbacks<TConfig, TSchemas, TErrors, TData>, TData>(craftFn: CraftFn<TConfig, TSchemas, TErrors, TCallbacks, TData>): CraftedAction<TConfig, TSchemas, TErrors, TData>;
66
+ export {};
@@ -0,0 +1,129 @@
1
+ import { Executor } from "./executor/executor.js";
2
+ import { INTERNAL } from "./internal.js";
3
+ // ============================================================================
4
+ // CRAFT BUILDER CLASS - Configure and define your action
5
+ // ============================================================================
6
+ export class CraftBuilder {
7
+ _config;
8
+ _schemas;
9
+ _errors;
10
+ _callbacks;
11
+ _handler;
12
+ constructor(config, schemas, errors, callbacks, handler) {
13
+ this._config = config;
14
+ this._schemas = schemas;
15
+ this._errors = errors;
16
+ this._callbacks = callbacks;
17
+ this._handler = handler;
18
+ }
19
+ // --------------------------------------------------------------------------
20
+ // FLUENT API METHODS
21
+ // --------------------------------------------------------------------------
22
+ /**
23
+ * Defines configuration options for the action.
24
+ * Resets previously defined handler and callbacks.
25
+ */
26
+ config(config) {
27
+ return new CraftBuilder(config, this._schemas, this._errors, {}, undefined);
28
+ }
29
+ /**
30
+ * Defines validation schemas for input, output, and bind arguments.
31
+ * Resets previously defined handler and callbacks.
32
+ */
33
+ schemas(schemas) {
34
+ return new CraftBuilder(this._config, schemas, this._errors, {}, undefined);
35
+ }
36
+ /**
37
+ * Defines error functions for returning typed errors from the handler.
38
+ * Resets previously defined handler and callbacks.
39
+ */
40
+ errors(errors) {
41
+ return new CraftBuilder(this._config, this._schemas, errors, {}, undefined);
42
+ }
43
+ /**
44
+ * Defines the handler function containing the server action's business logic.
45
+ * Resets previously defined callbacks.
46
+ */
47
+ handler(fn) {
48
+ return new CraftBuilder(this._config, this._schemas, this._errors, {}, fn);
49
+ }
50
+ /**
51
+ * Defines lifecycle callbacks to be triggered during the exection of an action.
52
+ * Must be called after handler() for correct type inference.
53
+ */
54
+ callbacks(callbacks) {
55
+ return new CraftBuilder(this._config, this._schemas, this._errors, callbacks, this._handler);
56
+ }
57
+ /**
58
+ * @returns Internal properties of the CraftBuilder instance
59
+ */
60
+ [INTERNAL]() {
61
+ return {
62
+ config: this._config,
63
+ schemas: this._schemas,
64
+ errors: this._errors,
65
+ callbacks: this._callbacks,
66
+ handler: this._handler,
67
+ };
68
+ }
69
+ }
70
+ /**
71
+ * One of two entry points to the Actioncraft system.
72
+ * It provides you with an empty CraftBuilder instance on which you can call any of the fluent
73
+ * CraftBuilder methods to configure and define your action.
74
+ *
75
+ * Example Usage:
76
+ * ```ts
77
+ * const myAction = craft(async (action) => {
78
+ * return action
79
+ * .config(...)
80
+ * .schemas(...)
81
+ * .errors(...)
82
+ * .handler(...)
83
+ * .callbacks(...)
84
+ * });
85
+ * ```
86
+ *
87
+ * @param craftFn - The function that the user passes to `craft()` in order to build an action.
88
+ * @returns The fully-typed server action function that can be used in your app.
89
+ */
90
+ export function craft(craftFn) {
91
+ const builder = craftFn(new CraftBuilder({}, {}, {}, {}, undefined));
92
+ // Handle async builder functions
93
+ if (builder instanceof Promise) {
94
+ return _craftAsync(builder);
95
+ }
96
+ // Handle sync builder functions
97
+ const executor = new Executor(builder);
98
+ const craftedAction = executor.craft();
99
+ return craftedAction;
100
+ }
101
+ /**
102
+ * Internal helper function to handle async craft functions.
103
+ * Encapsulates the logic for creating async actions and preserving metadata.
104
+ */
105
+ function _craftAsync(builderPromise) {
106
+ // Resolve the builder once and cache the resulting action to ensure consistent IDs
107
+ const actionPromise = builderPromise.then((resolvedBuilder) => {
108
+ const executor = new Executor(resolvedBuilder);
109
+ return executor.craft();
110
+ });
111
+ // For async craft functions, we need to return an async action
112
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
113
+ const asyncAction = (async (...args) => {
114
+ // Wait for the cached action to be ready
115
+ const craftedAction = await actionPromise;
116
+ // Call the action with the user's arguments
117
+ return craftedAction(...args);
118
+ });
119
+ // We need to preserve the config and ID for the initial() function to work
120
+ // We'll use the same cached action to ensure consistent metadata
121
+ actionPromise.then((craftedAction) => {
122
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
123
+ asyncAction.__ac_config = craftedAction.__ac_config;
124
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
125
+ asyncAction.__ac_id = craftedAction.__ac_id;
126
+ });
127
+ return asyncAction;
128
+ }
129
+ //# sourceMappingURL=craft-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"craft-builder.js","sourceRoot":"","sources":["../../src/classes/craft-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { Handler, InferDataFromHandler, HandlerParams, CraftedAction } from "../types/actions.js";
2
+ import type { CrafterConfig, CrafterSchemas, CrafterErrors, CrafterCallbacks } from "../types/crafter.js";
3
+ import { INTERNAL, type CrafterInternals } from "./internal.js";
4
+ export declare class Crafter<TConfig extends CrafterConfig, TSchemas extends CrafterSchemas, TErrors extends CrafterErrors, TCallbacks extends CrafterCallbacks<TConfig, TSchemas, TErrors, TData>, TData> {
5
+ private readonly _config;
6
+ private readonly _schemas;
7
+ private readonly _errors;
8
+ private readonly _callbacks;
9
+ private readonly _handler?;
10
+ constructor(config: TConfig, schemas: TSchemas, errors: TErrors, callbacks: TCallbacks, handler?: Handler<TConfig, TSchemas, TErrors, TData>);
11
+ /**
12
+ * Defines configuration options for the action.
13
+ * Resets previously defined handler and callbacks.
14
+ */
15
+ config<TNewConfig extends CrafterConfig>(config: TNewConfig): Crafter<TNewConfig, TSchemas, TErrors, Record<string, never>, unknown>;
16
+ /**
17
+ * Defines validation schemas for input, output, and bind arguments.
18
+ * Resets previously defined handler and callbacks.
19
+ */
20
+ schemas<TNewSchemas extends CrafterSchemas>(schemas: TNewSchemas): Crafter<TConfig, TNewSchemas, TErrors, Record<string, never>, unknown>;
21
+ /**
22
+ * Defines error functions for returning typed errors from the handler.
23
+ * Resets previously defined handler and callbacks.
24
+ */
25
+ errors<const TNewErrors extends CrafterErrors>(errors: TNewErrors): Crafter<TConfig, TSchemas, TNewErrors, Record<string, never>, unknown>;
26
+ /**
27
+ * Defines the handler function containing the server action's business logic.
28
+ * Resets previously defined callbacks.
29
+ */
30
+ handler<TFn extends (params: HandlerParams<TConfig, TSchemas, TErrors, TData>) => Promise<unknown>>(fn: TFn): Crafter<TConfig, TSchemas, TErrors, Record<string, never>, InferDataFromHandler<TFn>>;
31
+ /**
32
+ * Defines lifecycle callbacks to be triggered during the exection of an action.
33
+ * Must be called after handler() for correct type inference.
34
+ */
35
+ callbacks<TNewCallbacks extends CrafterCallbacks<TConfig, TSchemas, TErrors, TData>>(callbacks: TNewCallbacks): Crafter<TConfig, TSchemas, TErrors, TNewCallbacks, TData>;
36
+ /**
37
+ * @returns Internal properties of the Crafter instance
38
+ */
39
+ [INTERNAL](): CrafterInternals<TConfig, TSchemas, TErrors, TCallbacks, TData>;
40
+ }
41
+ /**
42
+ * Represents the function that the user passes to `craft()` in order to build an action.
43
+ */
44
+ type CraftFn<TConfig extends CrafterConfig, TSchemas extends CrafterSchemas, TErrors extends CrafterErrors, TCallbacks extends CrafterCallbacks<TConfig, TSchemas, TErrors, TData>, TData> = (crafter: Crafter<CrafterConfig, Record<string, never>, Record<string, never>, Record<string, never>, unknown>) => Crafter<TConfig, TSchemas, TErrors, TCallbacks, TData> | Promise<Crafter<TConfig, TSchemas, TErrors, TCallbacks, TData>>;
45
+ /**
46
+ * One of two entry points to the Actioncraft system.
47
+ * It provides you with an empty Crafter instance on which you can call any of the fluent
48
+ * Crafter methods to configure and define your action.
49
+ *
50
+ * Example Usage:
51
+ * ```ts
52
+ * const myAction = craft(async (action) => {
53
+ * return action
54
+ * .config(...)
55
+ * .schemas(...)
56
+ * .errors(...)
57
+ * .handler(...)
58
+ * .callbacks(...)
59
+ * });
60
+ * ```
61
+ *
62
+ * @param craftFn - The function that the user passes to `craft()` in order to build an action.
63
+ * @returns The fully-typed server action function that can be used in your app.
64
+ */
65
+ export declare function craft<TConfig extends CrafterConfig, TSchemas extends CrafterSchemas, TErrors extends CrafterErrors, TCallbacks extends CrafterCallbacks<TConfig, TSchemas, TErrors, TData>, TData>(craftFn: CraftFn<TConfig, TSchemas, TErrors, TCallbacks, TData>): CraftedAction<TConfig, TSchemas, TErrors, TData>;
66
+ export {};