@astami/temporal-functions 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,133 @@
1
+ import { F as FunctionOptions, a as FunctionDef, W as WorkflowHandler, b as WorkflowOptions, c as WorkflowDef, H as HttpTriggerOptions, C as CronTriggerOptions, R as Registry } from './types-C-cNq1Id.mjs';
2
+ export { g as ClientConfig, f as RetryPolicy, S as StartWorkflowOptions, j as TFNClient, k as TFNWorker, T as TemporalConfig, h as WorkerConfig, d as WorkflowContext, i as WorkflowHandle, e as WorkflowInfo } from './types-C-cNq1Id.mjs';
3
+
4
+ /**
5
+ * Temporal Functions - Main Entry Point
6
+ *
7
+ * This module provides the core API for defining functions and workflows.
8
+ * Import from 'temporal-functions' for function/workflow definitions.
9
+ * Import from 'temporal-functions/client' for triggering workflows.
10
+ * Import from 'temporal-functions/worker' for running workers.
11
+ */
12
+
13
+ /**
14
+ * Global registry for all defined functions and workflows
15
+ */
16
+ declare const registry: Registry;
17
+ /**
18
+ * Define a function (maps to a Temporal Activity)
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * export const sendEmail = tfn.fn(
23
+ * 'sendEmail',
24
+ * async (params: EmailParams) => {
25
+ * return await emailService.send(params);
26
+ * },
27
+ * { timeout: '30s', retries: 3 }
28
+ * );
29
+ * ```
30
+ */
31
+ declare function fn<TInput, TOutput>(name: string, handler: (input: TInput) => Promise<TOutput>, options?: FunctionOptions): FunctionDef<TInput, TOutput>;
32
+ /**
33
+ * Define a workflow
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * export const processOrder = tfn.workflow(
38
+ * 'processOrder',
39
+ * async (ctx, order: Order) => {
40
+ * const validated = await ctx.run(validateOrder, order);
41
+ * const paid = await ctx.run(chargePayment, validated);
42
+ * return { orderId: paid.id, status: 'complete' };
43
+ * }
44
+ * );
45
+ * ```
46
+ */
47
+ declare function workflow<TInput, TOutput>(name: string, handler: WorkflowHandler<TInput, TOutput>, options?: WorkflowOptions): WorkflowDef<TInput, TOutput>;
48
+ interface HttpTriggerDef {
49
+ type: 'http';
50
+ method: string;
51
+ path: string;
52
+ workflow: WorkflowDef;
53
+ options: HttpTriggerOptions;
54
+ }
55
+ interface CronTriggerDef {
56
+ type: 'cron';
57
+ schedule: string;
58
+ workflow: WorkflowDef;
59
+ options: CronTriggerOptions;
60
+ }
61
+ interface SignalTriggerDef {
62
+ type: 'signal';
63
+ signalName: string;
64
+ handler: (payload: unknown) => void | Promise<void>;
65
+ }
66
+ type TriggerDef = HttpTriggerDef | CronTriggerDef | SignalTriggerDef;
67
+ /**
68
+ * Registry for trigger definitions
69
+ */
70
+ declare const triggers: TriggerDef[];
71
+ /**
72
+ * Define an HTTP trigger for a workflow
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * tfn.http('POST', '/api/orders', processOrder);
77
+ * ```
78
+ */
79
+ declare function http<TInput, TOutput>(method: string, path: string, workflow: WorkflowDef<TInput, TOutput>, options?: HttpTriggerOptions): void;
80
+ /**
81
+ * Define a cron/scheduled trigger for a workflow
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * tfn.cron('0 9 * * *', dailyReport); // Every day at 9am
86
+ * ```
87
+ */
88
+ declare function cron<TInput, TOutput>(schedule: string, workflow: WorkflowDef<TInput, TOutput>, options?: CronTriggerOptions): void;
89
+ /**
90
+ * Define an interval trigger (convenience wrapper around cron)
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * tfn.interval('5m', healthCheck); // Every 5 minutes
95
+ * ```
96
+ */
97
+ declare function interval<TInput, TOutput>(duration: string, workflow: WorkflowDef<TInput, TOutput>, options?: CronTriggerOptions): void;
98
+ /**
99
+ * Define a signal trigger
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * tfn.signal('order.cancel', handleCancellation);
104
+ * ```
105
+ */
106
+ declare function signal(signalName: string, handler: (payload: unknown) => void | Promise<void>): void;
107
+ /**
108
+ * Check if a definition is a function
109
+ */
110
+ declare function isFunction(def: unknown): def is FunctionDef;
111
+ /**
112
+ * Check if a definition is a workflow
113
+ */
114
+ declare function isWorkflow(def: unknown): def is WorkflowDef;
115
+ /**
116
+ * The main Temporal Functions API
117
+ */
118
+ declare const tfn: {
119
+ /** Define a function (activity) */
120
+ fn: typeof fn;
121
+ /** Define a workflow */
122
+ workflow: typeof workflow;
123
+ /** Define an HTTP trigger */
124
+ http: typeof http;
125
+ /** Define a cron trigger */
126
+ cron: typeof cron;
127
+ /** Define an interval trigger */
128
+ interval: typeof interval;
129
+ /** Define a signal trigger */
130
+ signal: typeof signal;
131
+ };
132
+
133
+ export { CronTriggerOptions, FunctionDef, FunctionOptions, HttpTriggerOptions, WorkflowDef, WorkflowHandler, WorkflowOptions, tfn as default, isFunction, isWorkflow, registry, tfn, triggers };
@@ -0,0 +1,133 @@
1
+ import { F as FunctionOptions, a as FunctionDef, W as WorkflowHandler, b as WorkflowOptions, c as WorkflowDef, H as HttpTriggerOptions, C as CronTriggerOptions, R as Registry } from './types-C-cNq1Id.js';
2
+ export { g as ClientConfig, f as RetryPolicy, S as StartWorkflowOptions, j as TFNClient, k as TFNWorker, T as TemporalConfig, h as WorkerConfig, d as WorkflowContext, i as WorkflowHandle, e as WorkflowInfo } from './types-C-cNq1Id.js';
3
+
4
+ /**
5
+ * Temporal Functions - Main Entry Point
6
+ *
7
+ * This module provides the core API for defining functions and workflows.
8
+ * Import from 'temporal-functions' for function/workflow definitions.
9
+ * Import from 'temporal-functions/client' for triggering workflows.
10
+ * Import from 'temporal-functions/worker' for running workers.
11
+ */
12
+
13
+ /**
14
+ * Global registry for all defined functions and workflows
15
+ */
16
+ declare const registry: Registry;
17
+ /**
18
+ * Define a function (maps to a Temporal Activity)
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * export const sendEmail = tfn.fn(
23
+ * 'sendEmail',
24
+ * async (params: EmailParams) => {
25
+ * return await emailService.send(params);
26
+ * },
27
+ * { timeout: '30s', retries: 3 }
28
+ * );
29
+ * ```
30
+ */
31
+ declare function fn<TInput, TOutput>(name: string, handler: (input: TInput) => Promise<TOutput>, options?: FunctionOptions): FunctionDef<TInput, TOutput>;
32
+ /**
33
+ * Define a workflow
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * export const processOrder = tfn.workflow(
38
+ * 'processOrder',
39
+ * async (ctx, order: Order) => {
40
+ * const validated = await ctx.run(validateOrder, order);
41
+ * const paid = await ctx.run(chargePayment, validated);
42
+ * return { orderId: paid.id, status: 'complete' };
43
+ * }
44
+ * );
45
+ * ```
46
+ */
47
+ declare function workflow<TInput, TOutput>(name: string, handler: WorkflowHandler<TInput, TOutput>, options?: WorkflowOptions): WorkflowDef<TInput, TOutput>;
48
+ interface HttpTriggerDef {
49
+ type: 'http';
50
+ method: string;
51
+ path: string;
52
+ workflow: WorkflowDef;
53
+ options: HttpTriggerOptions;
54
+ }
55
+ interface CronTriggerDef {
56
+ type: 'cron';
57
+ schedule: string;
58
+ workflow: WorkflowDef;
59
+ options: CronTriggerOptions;
60
+ }
61
+ interface SignalTriggerDef {
62
+ type: 'signal';
63
+ signalName: string;
64
+ handler: (payload: unknown) => void | Promise<void>;
65
+ }
66
+ type TriggerDef = HttpTriggerDef | CronTriggerDef | SignalTriggerDef;
67
+ /**
68
+ * Registry for trigger definitions
69
+ */
70
+ declare const triggers: TriggerDef[];
71
+ /**
72
+ * Define an HTTP trigger for a workflow
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * tfn.http('POST', '/api/orders', processOrder);
77
+ * ```
78
+ */
79
+ declare function http<TInput, TOutput>(method: string, path: string, workflow: WorkflowDef<TInput, TOutput>, options?: HttpTriggerOptions): void;
80
+ /**
81
+ * Define a cron/scheduled trigger for a workflow
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * tfn.cron('0 9 * * *', dailyReport); // Every day at 9am
86
+ * ```
87
+ */
88
+ declare function cron<TInput, TOutput>(schedule: string, workflow: WorkflowDef<TInput, TOutput>, options?: CronTriggerOptions): void;
89
+ /**
90
+ * Define an interval trigger (convenience wrapper around cron)
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * tfn.interval('5m', healthCheck); // Every 5 minutes
95
+ * ```
96
+ */
97
+ declare function interval<TInput, TOutput>(duration: string, workflow: WorkflowDef<TInput, TOutput>, options?: CronTriggerOptions): void;
98
+ /**
99
+ * Define a signal trigger
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * tfn.signal('order.cancel', handleCancellation);
104
+ * ```
105
+ */
106
+ declare function signal(signalName: string, handler: (payload: unknown) => void | Promise<void>): void;
107
+ /**
108
+ * Check if a definition is a function
109
+ */
110
+ declare function isFunction(def: unknown): def is FunctionDef;
111
+ /**
112
+ * Check if a definition is a workflow
113
+ */
114
+ declare function isWorkflow(def: unknown): def is WorkflowDef;
115
+ /**
116
+ * The main Temporal Functions API
117
+ */
118
+ declare const tfn: {
119
+ /** Define a function (activity) */
120
+ fn: typeof fn;
121
+ /** Define a workflow */
122
+ workflow: typeof workflow;
123
+ /** Define an HTTP trigger */
124
+ http: typeof http;
125
+ /** Define a cron trigger */
126
+ cron: typeof cron;
127
+ /** Define an interval trigger */
128
+ interval: typeof interval;
129
+ /** Define a signal trigger */
130
+ signal: typeof signal;
131
+ };
132
+
133
+ export { CronTriggerOptions, FunctionDef, FunctionOptions, HttpTriggerOptions, WorkflowDef, WorkflowHandler, WorkflowOptions, tfn as default, isFunction, isWorkflow, registry, tfn, triggers };
package/dist/index.js ADDED
@@ -0,0 +1,120 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ // src/index.ts
6
+ var registry = {
7
+ functions: /* @__PURE__ */ new Map(),
8
+ workflows: /* @__PURE__ */ new Map()
9
+ };
10
+ function fn(name, handler, options = {}) {
11
+ const def = {
12
+ name,
13
+ handler,
14
+ options: {
15
+ startToCloseTimeout: "1m",
16
+ ...options
17
+ },
18
+ __type: "function"
19
+ };
20
+ registry.functions.set(name, def);
21
+ return def;
22
+ }
23
+ function workflow(name, handler, options = {}) {
24
+ const def = {
25
+ name,
26
+ handler,
27
+ options: {
28
+ taskQueue: "default",
29
+ ...options
30
+ },
31
+ __type: "workflow"
32
+ };
33
+ registry.workflows.set(name, def);
34
+ return def;
35
+ }
36
+ var triggers = [];
37
+ function http(method, path, workflow2, options = {}) {
38
+ triggers.push({
39
+ type: "http",
40
+ method: method.toUpperCase(),
41
+ path,
42
+ workflow: workflow2,
43
+ options
44
+ });
45
+ }
46
+ function cron(schedule, workflow2, options = {}) {
47
+ triggers.push({
48
+ type: "cron",
49
+ schedule,
50
+ workflow: workflow2,
51
+ options
52
+ });
53
+ }
54
+ function interval(duration, workflow2, options = {}) {
55
+ const cronSchedule = durationToCron(duration);
56
+ cron(cronSchedule, workflow2, options);
57
+ }
58
+ function signal(signalName, handler) {
59
+ triggers.push({
60
+ type: "signal",
61
+ signalName,
62
+ handler
63
+ });
64
+ }
65
+ function durationToCron(duration) {
66
+ const match = duration.match(/^(\d+)(s|m|h|d)$/);
67
+ if (!match) {
68
+ throw new Error(`Invalid duration format: ${duration}. Use format like '5m', '1h', '30s'`);
69
+ }
70
+ const value = parseInt(match[1], 10);
71
+ const unit = match[2];
72
+ switch (unit) {
73
+ case "s":
74
+ if (value < 60) {
75
+ return `*/${value} * * * * *`;
76
+ }
77
+ throw new Error("Seconds interval must be less than 60");
78
+ case "m":
79
+ return `*/${value} * * * *`;
80
+ // Every N minutes
81
+ case "h":
82
+ return `0 */${value} * * *`;
83
+ // Every N hours
84
+ case "d":
85
+ return `0 0 */${value} * *`;
86
+ // Every N days
87
+ default:
88
+ throw new Error(`Unknown duration unit: ${unit}`);
89
+ }
90
+ }
91
+ function isFunction(def) {
92
+ return def?.__type === "function";
93
+ }
94
+ function isWorkflow(def) {
95
+ return def?.__type === "workflow";
96
+ }
97
+ var tfn = {
98
+ /** Define a function (activity) */
99
+ fn,
100
+ /** Define a workflow */
101
+ workflow,
102
+ /** Define an HTTP trigger */
103
+ http,
104
+ /** Define a cron trigger */
105
+ cron,
106
+ /** Define an interval trigger */
107
+ interval,
108
+ /** Define a signal trigger */
109
+ signal
110
+ };
111
+ var src_default = tfn;
112
+
113
+ exports.default = src_default;
114
+ exports.isFunction = isFunction;
115
+ exports.isWorkflow = isWorkflow;
116
+ exports.registry = registry;
117
+ exports.tfn = tfn;
118
+ exports.triggers = triggers;
119
+ //# sourceMappingURL=index.js.map
120
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"names":["workflow"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Temporal Functions - Main Entry Point\n *\n * This module provides the core API for defining functions and workflows.\n * Import from 'temporal-functions' for function/workflow definitions.\n * Import from 'temporal-functions/client' for triggering workflows.\n * Import from 'temporal-functions/worker' for running workers.\n */\n\nimport type {\n FunctionDef,\n FunctionOptions,\n WorkflowDef,\n WorkflowOptions,\n WorkflowHandler,\n WorkflowContext,\n Registry,\n HttpTriggerOptions,\n CronTriggerOptions,\n} from './types.js';\n\n// =============================================================================\n// Global Registry\n// =============================================================================\n\n/**\n * Global registry for all defined functions and workflows\n */\nexport const registry: Registry = {\n functions: new Map(),\n workflows: new Map(),\n};\n\n// =============================================================================\n// Function Definition\n// =============================================================================\n\n/**\n * Define a function (maps to a Temporal Activity)\n *\n * @example\n * ```typescript\n * export const sendEmail = tfn.fn(\n * 'sendEmail',\n * async (params: EmailParams) => {\n * return await emailService.send(params);\n * },\n * { timeout: '30s', retries: 3 }\n * );\n * ```\n */\nfunction fn<TInput, TOutput>(\n name: string,\n handler: (input: TInput) => Promise<TOutput>,\n options: FunctionOptions = {}\n): FunctionDef<TInput, TOutput> {\n const def: FunctionDef<TInput, TOutput> = {\n name,\n handler,\n options: {\n startToCloseTimeout: '1m',\n ...options,\n },\n __type: 'function',\n };\n\n registry.functions.set(name, def as FunctionDef);\n return def;\n}\n\n// =============================================================================\n// Workflow Definition\n// =============================================================================\n\n/**\n * Define a workflow\n *\n * @example\n * ```typescript\n * export const processOrder = tfn.workflow(\n * 'processOrder',\n * async (ctx, order: Order) => {\n * const validated = await ctx.run(validateOrder, order);\n * const paid = await ctx.run(chargePayment, validated);\n * return { orderId: paid.id, status: 'complete' };\n * }\n * );\n * ```\n */\nfunction workflow<TInput, TOutput>(\n name: string,\n handler: WorkflowHandler<TInput, TOutput>,\n options: WorkflowOptions = {}\n): WorkflowDef<TInput, TOutput> {\n const def: WorkflowDef<TInput, TOutput> = {\n name,\n handler,\n options: {\n taskQueue: 'default',\n ...options,\n },\n __type: 'workflow',\n };\n\n registry.workflows.set(name, def as WorkflowDef);\n return def;\n}\n\n// =============================================================================\n// Trigger Definitions (Declarative)\n// =============================================================================\n\ninterface HttpTriggerDef {\n type: 'http';\n method: string;\n path: string;\n workflow: WorkflowDef;\n options: HttpTriggerOptions;\n}\n\ninterface CronTriggerDef {\n type: 'cron';\n schedule: string;\n workflow: WorkflowDef;\n options: CronTriggerOptions;\n}\n\ninterface SignalTriggerDef {\n type: 'signal';\n signalName: string;\n handler: (payload: unknown) => void | Promise<void>;\n}\n\ntype TriggerDef = HttpTriggerDef | CronTriggerDef | SignalTriggerDef;\n\n/**\n * Registry for trigger definitions\n */\nexport const triggers: TriggerDef[] = [];\n\n/**\n * Define an HTTP trigger for a workflow\n *\n * @example\n * ```typescript\n * tfn.http('POST', '/api/orders', processOrder);\n * ```\n */\nfunction http<TInput, TOutput>(\n method: string,\n path: string,\n workflow: WorkflowDef<TInput, TOutput>,\n options: HttpTriggerOptions = {}\n): void {\n triggers.push({\n type: 'http',\n method: method.toUpperCase(),\n path,\n workflow: workflow as WorkflowDef,\n options,\n });\n}\n\n/**\n * Define a cron/scheduled trigger for a workflow\n *\n * @example\n * ```typescript\n * tfn.cron('0 9 * * *', dailyReport); // Every day at 9am\n * ```\n */\nfunction cron<TInput, TOutput>(\n schedule: string,\n workflow: WorkflowDef<TInput, TOutput>,\n options: CronTriggerOptions = {}\n): void {\n triggers.push({\n type: 'cron',\n schedule,\n workflow: workflow as WorkflowDef,\n options,\n });\n}\n\n/**\n * Define an interval trigger (convenience wrapper around cron)\n *\n * @example\n * ```typescript\n * tfn.interval('5m', healthCheck); // Every 5 minutes\n * ```\n */\nfunction interval<TInput, TOutput>(\n duration: string,\n workflow: WorkflowDef<TInput, TOutput>,\n options: CronTriggerOptions = {}\n): void {\n // Convert duration to cron expression\n const cronSchedule = durationToCron(duration);\n cron(cronSchedule, workflow, options);\n}\n\n/**\n * Define a signal trigger\n *\n * @example\n * ```typescript\n * tfn.signal('order.cancel', handleCancellation);\n * ```\n */\nfunction signal(\n signalName: string,\n handler: (payload: unknown) => void | Promise<void>\n): void {\n triggers.push({\n type: 'signal',\n signalName,\n handler,\n });\n}\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\n/**\n * Convert a duration string to a cron expression\n */\nfunction durationToCron(duration: string): string {\n const match = duration.match(/^(\\d+)(s|m|h|d)$/);\n if (!match) {\n throw new Error(`Invalid duration format: ${duration}. Use format like '5m', '1h', '30s'`);\n }\n\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case 's':\n if (value < 60) {\n return `*/${value} * * * * *`; // Every N seconds (non-standard)\n }\n throw new Error('Seconds interval must be less than 60');\n case 'm':\n return `*/${value} * * * *`; // Every N minutes\n case 'h':\n return `0 */${value} * * *`; // Every N hours\n case 'd':\n return `0 0 */${value} * *`; // Every N days\n default:\n throw new Error(`Unknown duration unit: ${unit}`);\n }\n}\n\n/**\n * Check if a definition is a function\n */\nexport function isFunction(def: unknown): def is FunctionDef {\n return (def as FunctionDef)?.__type === 'function';\n}\n\n/**\n * Check if a definition is a workflow\n */\nexport function isWorkflow(def: unknown): def is WorkflowDef {\n return (def as WorkflowDef)?.__type === 'workflow';\n}\n\n// =============================================================================\n// Main API Export\n// =============================================================================\n\n/**\n * The main Temporal Functions API\n */\nexport const tfn = {\n /** Define a function (activity) */\n fn,\n /** Define a workflow */\n workflow,\n /** Define an HTTP trigger */\n http,\n /** Define a cron trigger */\n cron,\n /** Define an interval trigger */\n interval,\n /** Define a signal trigger */\n signal,\n};\n\n// Re-export types\nexport type {\n FunctionDef,\n FunctionOptions,\n WorkflowDef,\n WorkflowOptions,\n WorkflowContext,\n WorkflowHandler,\n WorkflowInfo,\n RetryPolicy,\n HttpTriggerOptions,\n CronTriggerOptions,\n TemporalConfig,\n ClientConfig,\n WorkerConfig,\n StartWorkflowOptions,\n WorkflowHandle,\n TFNClient,\n TFNWorker,\n} from './types.js';\n\nexport default tfn;\n"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,111 @@
1
+ // src/index.ts
2
+ var registry = {
3
+ functions: /* @__PURE__ */ new Map(),
4
+ workflows: /* @__PURE__ */ new Map()
5
+ };
6
+ function fn(name, handler, options = {}) {
7
+ const def = {
8
+ name,
9
+ handler,
10
+ options: {
11
+ startToCloseTimeout: "1m",
12
+ ...options
13
+ },
14
+ __type: "function"
15
+ };
16
+ registry.functions.set(name, def);
17
+ return def;
18
+ }
19
+ function workflow(name, handler, options = {}) {
20
+ const def = {
21
+ name,
22
+ handler,
23
+ options: {
24
+ taskQueue: "default",
25
+ ...options
26
+ },
27
+ __type: "workflow"
28
+ };
29
+ registry.workflows.set(name, def);
30
+ return def;
31
+ }
32
+ var triggers = [];
33
+ function http(method, path, workflow2, options = {}) {
34
+ triggers.push({
35
+ type: "http",
36
+ method: method.toUpperCase(),
37
+ path,
38
+ workflow: workflow2,
39
+ options
40
+ });
41
+ }
42
+ function cron(schedule, workflow2, options = {}) {
43
+ triggers.push({
44
+ type: "cron",
45
+ schedule,
46
+ workflow: workflow2,
47
+ options
48
+ });
49
+ }
50
+ function interval(duration, workflow2, options = {}) {
51
+ const cronSchedule = durationToCron(duration);
52
+ cron(cronSchedule, workflow2, options);
53
+ }
54
+ function signal(signalName, handler) {
55
+ triggers.push({
56
+ type: "signal",
57
+ signalName,
58
+ handler
59
+ });
60
+ }
61
+ function durationToCron(duration) {
62
+ const match = duration.match(/^(\d+)(s|m|h|d)$/);
63
+ if (!match) {
64
+ throw new Error(`Invalid duration format: ${duration}. Use format like '5m', '1h', '30s'`);
65
+ }
66
+ const value = parseInt(match[1], 10);
67
+ const unit = match[2];
68
+ switch (unit) {
69
+ case "s":
70
+ if (value < 60) {
71
+ return `*/${value} * * * * *`;
72
+ }
73
+ throw new Error("Seconds interval must be less than 60");
74
+ case "m":
75
+ return `*/${value} * * * *`;
76
+ // Every N minutes
77
+ case "h":
78
+ return `0 */${value} * * *`;
79
+ // Every N hours
80
+ case "d":
81
+ return `0 0 */${value} * *`;
82
+ // Every N days
83
+ default:
84
+ throw new Error(`Unknown duration unit: ${unit}`);
85
+ }
86
+ }
87
+ function isFunction(def) {
88
+ return def?.__type === "function";
89
+ }
90
+ function isWorkflow(def) {
91
+ return def?.__type === "workflow";
92
+ }
93
+ var tfn = {
94
+ /** Define a function (activity) */
95
+ fn,
96
+ /** Define a workflow */
97
+ workflow,
98
+ /** Define an HTTP trigger */
99
+ http,
100
+ /** Define a cron trigger */
101
+ cron,
102
+ /** Define an interval trigger */
103
+ interval,
104
+ /** Define a signal trigger */
105
+ signal
106
+ };
107
+ var src_default = tfn;
108
+
109
+ export { src_default as default, isFunction, isWorkflow, registry, tfn, triggers };
110
+ //# sourceMappingURL=index.mjs.map
111
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"names":["workflow"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Temporal Functions - Main Entry Point\n *\n * This module provides the core API for defining functions and workflows.\n * Import from 'temporal-functions' for function/workflow definitions.\n * Import from 'temporal-functions/client' for triggering workflows.\n * Import from 'temporal-functions/worker' for running workers.\n */\n\nimport type {\n FunctionDef,\n FunctionOptions,\n WorkflowDef,\n WorkflowOptions,\n WorkflowHandler,\n WorkflowContext,\n Registry,\n HttpTriggerOptions,\n CronTriggerOptions,\n} from './types.js';\n\n// =============================================================================\n// Global Registry\n// =============================================================================\n\n/**\n * Global registry for all defined functions and workflows\n */\nexport const registry: Registry = {\n functions: new Map(),\n workflows: new Map(),\n};\n\n// =============================================================================\n// Function Definition\n// =============================================================================\n\n/**\n * Define a function (maps to a Temporal Activity)\n *\n * @example\n * ```typescript\n * export const sendEmail = tfn.fn(\n * 'sendEmail',\n * async (params: EmailParams) => {\n * return await emailService.send(params);\n * },\n * { timeout: '30s', retries: 3 }\n * );\n * ```\n */\nfunction fn<TInput, TOutput>(\n name: string,\n handler: (input: TInput) => Promise<TOutput>,\n options: FunctionOptions = {}\n): FunctionDef<TInput, TOutput> {\n const def: FunctionDef<TInput, TOutput> = {\n name,\n handler,\n options: {\n startToCloseTimeout: '1m',\n ...options,\n },\n __type: 'function',\n };\n\n registry.functions.set(name, def as FunctionDef);\n return def;\n}\n\n// =============================================================================\n// Workflow Definition\n// =============================================================================\n\n/**\n * Define a workflow\n *\n * @example\n * ```typescript\n * export const processOrder = tfn.workflow(\n * 'processOrder',\n * async (ctx, order: Order) => {\n * const validated = await ctx.run(validateOrder, order);\n * const paid = await ctx.run(chargePayment, validated);\n * return { orderId: paid.id, status: 'complete' };\n * }\n * );\n * ```\n */\nfunction workflow<TInput, TOutput>(\n name: string,\n handler: WorkflowHandler<TInput, TOutput>,\n options: WorkflowOptions = {}\n): WorkflowDef<TInput, TOutput> {\n const def: WorkflowDef<TInput, TOutput> = {\n name,\n handler,\n options: {\n taskQueue: 'default',\n ...options,\n },\n __type: 'workflow',\n };\n\n registry.workflows.set(name, def as WorkflowDef);\n return def;\n}\n\n// =============================================================================\n// Trigger Definitions (Declarative)\n// =============================================================================\n\ninterface HttpTriggerDef {\n type: 'http';\n method: string;\n path: string;\n workflow: WorkflowDef;\n options: HttpTriggerOptions;\n}\n\ninterface CronTriggerDef {\n type: 'cron';\n schedule: string;\n workflow: WorkflowDef;\n options: CronTriggerOptions;\n}\n\ninterface SignalTriggerDef {\n type: 'signal';\n signalName: string;\n handler: (payload: unknown) => void | Promise<void>;\n}\n\ntype TriggerDef = HttpTriggerDef | CronTriggerDef | SignalTriggerDef;\n\n/**\n * Registry for trigger definitions\n */\nexport const triggers: TriggerDef[] = [];\n\n/**\n * Define an HTTP trigger for a workflow\n *\n * @example\n * ```typescript\n * tfn.http('POST', '/api/orders', processOrder);\n * ```\n */\nfunction http<TInput, TOutput>(\n method: string,\n path: string,\n workflow: WorkflowDef<TInput, TOutput>,\n options: HttpTriggerOptions = {}\n): void {\n triggers.push({\n type: 'http',\n method: method.toUpperCase(),\n path,\n workflow: workflow as WorkflowDef,\n options,\n });\n}\n\n/**\n * Define a cron/scheduled trigger for a workflow\n *\n * @example\n * ```typescript\n * tfn.cron('0 9 * * *', dailyReport); // Every day at 9am\n * ```\n */\nfunction cron<TInput, TOutput>(\n schedule: string,\n workflow: WorkflowDef<TInput, TOutput>,\n options: CronTriggerOptions = {}\n): void {\n triggers.push({\n type: 'cron',\n schedule,\n workflow: workflow as WorkflowDef,\n options,\n });\n}\n\n/**\n * Define an interval trigger (convenience wrapper around cron)\n *\n * @example\n * ```typescript\n * tfn.interval('5m', healthCheck); // Every 5 minutes\n * ```\n */\nfunction interval<TInput, TOutput>(\n duration: string,\n workflow: WorkflowDef<TInput, TOutput>,\n options: CronTriggerOptions = {}\n): void {\n // Convert duration to cron expression\n const cronSchedule = durationToCron(duration);\n cron(cronSchedule, workflow, options);\n}\n\n/**\n * Define a signal trigger\n *\n * @example\n * ```typescript\n * tfn.signal('order.cancel', handleCancellation);\n * ```\n */\nfunction signal(\n signalName: string,\n handler: (payload: unknown) => void | Promise<void>\n): void {\n triggers.push({\n type: 'signal',\n signalName,\n handler,\n });\n}\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\n/**\n * Convert a duration string to a cron expression\n */\nfunction durationToCron(duration: string): string {\n const match = duration.match(/^(\\d+)(s|m|h|d)$/);\n if (!match) {\n throw new Error(`Invalid duration format: ${duration}. Use format like '5m', '1h', '30s'`);\n }\n\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case 's':\n if (value < 60) {\n return `*/${value} * * * * *`; // Every N seconds (non-standard)\n }\n throw new Error('Seconds interval must be less than 60');\n case 'm':\n return `*/${value} * * * *`; // Every N minutes\n case 'h':\n return `0 */${value} * * *`; // Every N hours\n case 'd':\n return `0 0 */${value} * *`; // Every N days\n default:\n throw new Error(`Unknown duration unit: ${unit}`);\n }\n}\n\n/**\n * Check if a definition is a function\n */\nexport function isFunction(def: unknown): def is FunctionDef {\n return (def as FunctionDef)?.__type === 'function';\n}\n\n/**\n * Check if a definition is a workflow\n */\nexport function isWorkflow(def: unknown): def is WorkflowDef {\n return (def as WorkflowDef)?.__type === 'workflow';\n}\n\n// =============================================================================\n// Main API Export\n// =============================================================================\n\n/**\n * The main Temporal Functions API\n */\nexport const tfn = {\n /** Define a function (activity) */\n fn,\n /** Define a workflow */\n workflow,\n /** Define an HTTP trigger */\n http,\n /** Define a cron trigger */\n cron,\n /** Define an interval trigger */\n interval,\n /** Define a signal trigger */\n signal,\n};\n\n// Re-export types\nexport type {\n FunctionDef,\n FunctionOptions,\n WorkflowDef,\n WorkflowOptions,\n WorkflowContext,\n WorkflowHandler,\n WorkflowInfo,\n RetryPolicy,\n HttpTriggerOptions,\n CronTriggerOptions,\n TemporalConfig,\n ClientConfig,\n WorkerConfig,\n StartWorkflowOptions,\n WorkflowHandle,\n TFNClient,\n TFNWorker,\n} from './types.js';\n\nexport default tfn;\n"]}
@@ -0,0 +1,74 @@
1
+ import { a as FunctionDef, c as WorkflowDef, d as WorkflowContext } from '../types-C-cNq1Id.mjs';
2
+
3
+ /**
4
+ * Temporal Functions - Testing Utilities
5
+ *
6
+ * Utilities for testing functions and workflows.
7
+ * Import from 'temporal-functions/testing'.
8
+ */
9
+
10
+ /**
11
+ * Create a mock workflow context for testing
12
+ */
13
+ declare function createMockContext(overrides?: Partial<WorkflowContext>): WorkflowContext;
14
+ /**
15
+ * Test environment for running workflows in isolation
16
+ */
17
+ declare class TestEnvironment {
18
+ private mocks;
19
+ private currentTime;
20
+ /**
21
+ * Mock a function's implementation
22
+ */
23
+ mock<TInput, TOutput>(fn: FunctionDef<TInput, TOutput>, implementation: (input: TInput) => Promise<TOutput> | TOutput): this;
24
+ /**
25
+ * Set the current time for the test
26
+ */
27
+ setTime(time: Date): this;
28
+ /**
29
+ * Execute a workflow with the test environment
30
+ */
31
+ execute<TInput, TOutput>(workflow: WorkflowDef<TInput, TOutput>, input: TInput): Promise<TOutput>;
32
+ /**
33
+ * Start a workflow and return a handle for interaction
34
+ */
35
+ start<TInput, TOutput>(workflow: WorkflowDef<TInput, TOutput>, input: TInput): Promise<TestWorkflowHandle<TOutput>>;
36
+ /**
37
+ * Create a workflow context with mocks applied
38
+ */
39
+ private createContext;
40
+ }
41
+ /**
42
+ * Handle to a test workflow execution
43
+ */
44
+ interface TestWorkflowHandle<TOutput> {
45
+ /** Wait for the workflow result */
46
+ result(): Promise<TOutput>;
47
+ /** Send a signal to the workflow */
48
+ signal<TPayload>(signalName: string, payload: TPayload): Promise<void>;
49
+ /** Query the workflow */
50
+ query<TResult>(queryName: string): TResult;
51
+ }
52
+ /**
53
+ * Create a test environment
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * import { tfn } from 'temporal-functions/testing';
58
+ *
59
+ * const env = await tfn.testEnv();
60
+ *
61
+ * env.mock(sendEmail, async (params) => ({
62
+ * messageId: 'test-id',
63
+ * }));
64
+ *
65
+ * const result = await env.execute(myWorkflow, { data: 'test' });
66
+ * ```
67
+ */
68
+ declare function createTestEnv(): Promise<TestEnvironment>;
69
+ declare const tfn: {
70
+ testEnv: typeof createTestEnv;
71
+ mockContext: typeof createMockContext;
72
+ };
73
+
74
+ export { TestEnvironment, type TestWorkflowHandle, createMockContext, createTestEnv, tfn as default, tfn };