semola 0.5.2 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -13
- package/dist/cron/builder/index.cjs +166 -0
- package/dist/cron/builder/index.d.cts +28 -0
- package/dist/cron/builder/index.d.cts.map +1 -0
- package/dist/cron/builder/index.d.mts +28 -0
- package/dist/cron/builder/index.d.mts.map +1 -0
- package/dist/cron/builder/index.mjs +163 -0
- package/dist/cron/builder/index.mjs.map +1 -0
- package/dist/cron/builder/types.cjs +27 -0
- package/dist/cron/builder/types.d.cts +79 -0
- package/dist/cron/builder/types.d.cts.map +1 -0
- package/dist/cron/builder/types.d.mts +79 -0
- package/dist/cron/builder/types.d.mts.map +1 -0
- package/dist/cron/builder/types.mjs +28 -0
- package/dist/cron/builder/types.mjs.map +1 -0
- package/dist/cron/core/index.cjs +308 -0
- package/dist/cron/core/index.d.cts +39 -0
- package/dist/cron/core/index.d.cts.map +1 -0
- package/dist/cron/core/index.d.mts +39 -0
- package/dist/cron/core/index.d.mts.map +1 -0
- package/dist/cron/core/index.mjs +310 -0
- package/dist/cron/core/index.mjs.map +1 -0
- package/dist/cron/{scanner.cjs → core/scanner.cjs} +2 -2
- package/dist/cron/{scanner.mjs → core/scanner.mjs} +2 -2
- package/dist/cron/core/scanner.mjs.map +1 -0
- package/dist/cron/{types.d.cts → core/types.d.cts} +1 -1
- package/dist/cron/core/types.d.cts.map +1 -0
- package/dist/cron/{types.d.mts → core/types.d.mts} +1 -1
- package/dist/cron/core/types.d.mts.map +1 -0
- package/dist/errors/types.d.cts +1 -1
- package/dist/errors/types.d.mts +1 -1
- package/dist/lib/cache/index.d.cts +3 -3
- package/dist/lib/cache/index.d.mts +3 -3
- package/dist/lib/cron/index.cjs +12 -275
- package/dist/lib/cron/index.d.cts +4 -39
- package/dist/lib/cron/index.d.mts +4 -39
- package/dist/lib/cron/index.mjs +4 -277
- package/dist/lib/errors/index.d.cts +2 -2
- package/dist/lib/errors/index.d.cts.map +1 -1
- package/dist/lib/errors/index.d.mts +2 -2
- package/dist/lib/errors/index.d.mts.map +1 -1
- package/dist/lib/errors/index.mjs.map +1 -1
- package/dist/lib/i18n/index.cjs +6 -1
- package/dist/lib/i18n/index.d.cts.map +1 -1
- package/dist/lib/i18n/index.d.mts.map +1 -1
- package/dist/lib/i18n/index.mjs +6 -1
- package/dist/lib/i18n/index.mjs.map +1 -1
- package/dist/lib/logging/index.cjs +18 -0
- package/dist/lib/logging/index.d.cts +7 -0
- package/dist/lib/logging/index.d.mts +7 -0
- package/dist/lib/logging/index.mjs +5 -0
- package/dist/lib/orm/index.cjs +20 -0
- package/dist/lib/orm/index.d.cts +7 -0
- package/dist/lib/orm/index.d.mts +7 -0
- package/dist/lib/orm/index.mjs +6 -0
- package/dist/lib/prompts/index.d.cts +8 -8
- package/dist/lib/prompts/index.d.mts +8 -8
- package/dist/lib/pubsub/index.cjs +82 -13
- package/dist/lib/pubsub/index.d.cts +14 -5
- package/dist/lib/pubsub/index.d.cts.map +1 -1
- package/dist/lib/pubsub/index.d.mts +14 -5
- package/dist/lib/pubsub/index.d.mts.map +1 -1
- package/dist/lib/pubsub/index.mjs +82 -13
- package/dist/lib/pubsub/index.mjs.map +1 -1
- package/dist/lib/queue/index.d.cts +2 -2
- package/dist/lib/queue/index.d.mts +2 -2
- package/dist/lib/workflow/index.cjs +534 -0
- package/dist/lib/workflow/index.d.cts +7 -0
- package/dist/lib/workflow/index.d.cts.map +1 -0
- package/dist/lib/workflow/index.d.mts +7 -0
- package/dist/lib/workflow/index.d.mts.map +1 -0
- package/dist/lib/workflow/index.mjs +535 -0
- package/dist/lib/workflow/index.mjs.map +1 -0
- package/dist/logging/core/index.cjs +99 -0
- package/dist/logging/core/index.d.cts +26 -0
- package/dist/logging/core/index.d.cts.map +1 -0
- package/dist/logging/core/index.d.mts +26 -0
- package/dist/logging/core/index.d.mts.map +1 -0
- package/dist/logging/core/index.mjs +99 -0
- package/dist/logging/core/index.mjs.map +1 -0
- package/dist/logging/core/types.cjs +10 -0
- package/dist/logging/core/types.d.cts +22 -0
- package/dist/logging/core/types.d.cts.map +1 -0
- package/dist/logging/core/types.d.mts +22 -0
- package/dist/logging/core/types.d.mts.map +1 -0
- package/dist/logging/core/types.mjs +12 -0
- package/dist/logging/core/types.mjs.map +1 -0
- package/dist/logging/formatter/index.cjs +119 -0
- package/dist/logging/formatter/index.d.cts +27 -0
- package/dist/logging/formatter/index.d.cts.map +1 -0
- package/dist/logging/formatter/index.d.mts +27 -0
- package/dist/logging/formatter/index.d.mts.map +1 -0
- package/dist/logging/formatter/index.mjs +115 -0
- package/dist/logging/formatter/index.mjs.map +1 -0
- package/dist/logging/formatter/types.d.cts +5 -0
- package/dist/logging/formatter/types.d.cts.map +1 -0
- package/dist/logging/formatter/types.d.mts +5 -0
- package/dist/logging/formatter/types.d.mts.map +1 -0
- package/dist/logging/provider/index.cjs +165 -0
- package/dist/logging/provider/index.d.cts +28 -0
- package/dist/logging/provider/index.d.cts.map +1 -0
- package/dist/logging/provider/index.d.mts +28 -0
- package/dist/logging/provider/index.d.mts.map +1 -0
- package/dist/logging/provider/index.mjs +165 -0
- package/dist/logging/provider/index.mjs.map +1 -0
- package/dist/logging/provider/types.d.cts +23 -0
- package/dist/logging/provider/types.d.cts.map +1 -0
- package/dist/logging/provider/types.d.mts +23 -0
- package/dist/logging/provider/types.d.mts.map +1 -0
- package/dist/orm/column.cjs +137 -0
- package/dist/orm/column.d.cts +121 -0
- package/dist/orm/column.d.cts.map +1 -0
- package/dist/orm/column.d.mts +121 -0
- package/dist/orm/column.d.mts.map +1 -0
- package/dist/orm/column.mjs +132 -0
- package/dist/orm/column.mjs.map +1 -0
- package/dist/orm/dialect/index.cjs +14 -0
- package/dist/orm/dialect/index.mjs +16 -0
- package/dist/orm/dialect/index.mjs.map +1 -0
- package/dist/orm/dialect/mysql.cjs +31 -0
- package/dist/orm/dialect/mysql.mjs +33 -0
- package/dist/orm/dialect/mysql.mjs.map +1 -0
- package/dist/orm/dialect/postgres.cjs +23 -0
- package/dist/orm/dialect/postgres.mjs +25 -0
- package/dist/orm/dialect/postgres.mjs.map +1 -0
- package/dist/orm/dialect/sqlite.cjs +31 -0
- package/dist/orm/dialect/sqlite.mjs +33 -0
- package/dist/orm/dialect/sqlite.mjs.map +1 -0
- package/dist/orm/dialect/utils.cjs +8 -0
- package/dist/orm/dialect/utils.mjs +10 -0
- package/dist/orm/dialect/utils.mjs.map +1 -0
- package/dist/orm/internal/table-columns.cjs +31 -0
- package/dist/orm/internal/table-columns.mjs +32 -0
- package/dist/orm/internal/table-columns.mjs.map +1 -0
- package/dist/orm/internal/table-lookup.cjs +35 -0
- package/dist/orm/internal/table-lookup.mjs +35 -0
- package/dist/orm/internal/table-lookup.mjs.map +1 -0
- package/dist/orm/internal/table-relations.cjs +28 -0
- package/dist/orm/internal/table-relations.mjs +29 -0
- package/dist/orm/internal/table-relations.mjs.map +1 -0
- package/dist/orm/migration/config.cjs +7 -0
- package/dist/orm/migration/config.d.cts +7 -0
- package/dist/orm/migration/config.d.cts.map +1 -0
- package/dist/orm/migration/config.d.mts +7 -0
- package/dist/orm/migration/config.d.mts.map +1 -0
- package/dist/orm/migration/config.mjs +8 -0
- package/dist/orm/migration/config.mjs.map +1 -0
- package/dist/orm/migration/types.d.cts +20 -0
- package/dist/orm/migration/types.d.cts.map +1 -0
- package/dist/orm/migration/types.d.mts +20 -0
- package/dist/orm/migration/types.d.mts.map +1 -0
- package/dist/orm/orm.cjs +41 -0
- package/dist/orm/orm.d.cts +18 -0
- package/dist/orm/orm.d.cts.map +1 -0
- package/dist/orm/orm.d.mts +18 -0
- package/dist/orm/orm.d.mts.map +1 -0
- package/dist/orm/orm.mjs +43 -0
- package/dist/orm/orm.mjs.map +1 -0
- package/dist/orm/relation.cjs +18 -0
- package/dist/orm/relation.d.cts +8 -0
- package/dist/orm/relation.d.cts.map +1 -0
- package/dist/orm/relation.d.mts +8 -0
- package/dist/orm/relation.d.mts.map +1 -0
- package/dist/orm/relation.mjs +19 -0
- package/dist/orm/relation.mjs.map +1 -0
- package/dist/orm/runtime/builders/mutations.cjs +29 -0
- package/dist/orm/runtime/builders/mutations.mjs +28 -0
- package/dist/orm/runtime/builders/mutations.mjs.map +1 -0
- package/dist/orm/runtime/builders/select.cjs +18 -0
- package/dist/orm/runtime/builders/select.mjs +19 -0
- package/dist/orm/runtime/builders/select.mjs.map +1 -0
- package/dist/orm/runtime/client.cjs +90 -0
- package/dist/orm/runtime/client.mjs +92 -0
- package/dist/orm/runtime/client.mjs.map +1 -0
- package/dist/orm/runtime/context.cjs +49 -0
- package/dist/orm/runtime/context.mjs +51 -0
- package/dist/orm/runtime/context.mjs.map +1 -0
- package/dist/orm/runtime/dialect/index.cjs +11 -0
- package/dist/orm/runtime/dialect/index.mjs +13 -0
- package/dist/orm/runtime/dialect/index.mjs.map +1 -0
- package/dist/orm/runtime/dialect/mysql.cjs +95 -0
- package/dist/orm/runtime/dialect/mysql.mjs +97 -0
- package/dist/orm/runtime/dialect/mysql.mjs.map +1 -0
- package/dist/orm/runtime/dialect/postgres.cjs +51 -0
- package/dist/orm/runtime/dialect/postgres.mjs +53 -0
- package/dist/orm/runtime/dialect/postgres.mjs.map +1 -0
- package/dist/orm/runtime/dialect/sqlite.cjs +4 -0
- package/dist/orm/runtime/dialect/sqlite.mjs +7 -0
- package/dist/orm/runtime/dialect/sqlite.mjs.map +1 -0
- package/dist/orm/runtime/errors.cjs +19 -0
- package/dist/orm/runtime/errors.mjs +21 -0
- package/dist/orm/runtime/errors.mjs.map +1 -0
- package/dist/orm/runtime/hydrate/many.cjs +46 -0
- package/dist/orm/runtime/hydrate/many.mjs +48 -0
- package/dist/orm/runtime/hydrate/many.mjs.map +1 -0
- package/dist/orm/runtime/hydrate/one.cjs +38 -0
- package/dist/orm/runtime/hydrate/one.mjs +40 -0
- package/dist/orm/runtime/hydrate/one.mjs.map +1 -0
- package/dist/orm/runtime/hydrate.cjs +49 -0
- package/dist/orm/runtime/hydrate.mjs +51 -0
- package/dist/orm/runtime/hydrate.mjs.map +1 -0
- package/dist/orm/runtime/rows.cjs +30 -0
- package/dist/orm/runtime/rows.mjs +31 -0
- package/dist/orm/runtime/rows.mjs.map +1 -0
- package/dist/orm/runtime/utils.cjs +27 -0
- package/dist/orm/runtime/utils.mjs +27 -0
- package/dist/orm/runtime/utils.mjs.map +1 -0
- package/dist/orm/sql/parse-array.cjs +64 -0
- package/dist/orm/sql/parse-array.mjs +66 -0
- package/dist/orm/sql/parse-array.mjs.map +1 -0
- package/dist/orm/sql/plan/select.cjs +36 -0
- package/dist/orm/sql/plan/select.mjs +38 -0
- package/dist/orm/sql/plan/select.mjs.map +1 -0
- package/dist/orm/sql/plan/where/operators.cjs +95 -0
- package/dist/orm/sql/plan/where/operators.mjs +97 -0
- package/dist/orm/sql/plan/where/operators.mjs.map +1 -0
- package/dist/orm/sql/plan/where.cjs +59 -0
- package/dist/orm/sql/plan/where.mjs +61 -0
- package/dist/orm/sql/plan/where.mjs.map +1 -0
- package/dist/orm/sql/serialize/clauses.cjs +36 -0
- package/dist/orm/sql/serialize/clauses.mjs +37 -0
- package/dist/orm/sql/serialize/clauses.mjs.map +1 -0
- package/dist/orm/sql/serialize/joins.cjs +31 -0
- package/dist/orm/sql/serialize/joins.mjs +33 -0
- package/dist/orm/sql/serialize/joins.mjs.map +1 -0
- package/dist/orm/sql/serialize/values.cjs +30 -0
- package/dist/orm/sql/serialize/values.mjs +32 -0
- package/dist/orm/sql/serialize/values.mjs.map +1 -0
- package/dist/orm/sql/serialize/where/predicate.cjs +73 -0
- package/dist/orm/sql/serialize/where/predicate.mjs +75 -0
- package/dist/orm/sql/serialize/where/predicate.mjs.map +1 -0
- package/dist/orm/sql/serialize/where/tree.cjs +26 -0
- package/dist/orm/sql/serialize/where/tree.mjs +28 -0
- package/dist/orm/sql/serialize/where/tree.mjs.map +1 -0
- package/dist/orm/sql/serialize/where.cjs +10 -0
- package/dist/orm/sql/serialize/where.mjs +12 -0
- package/dist/orm/sql/serialize/where.mjs.map +1 -0
- package/dist/orm/sql/serialize.cjs +24 -0
- package/dist/orm/sql/serialize.mjs +25 -0
- package/dist/orm/sql/serialize.mjs.map +1 -0
- package/dist/orm/table.cjs +12 -0
- package/dist/orm/table.d.cts +12 -0
- package/dist/orm/table.d.cts.map +1 -0
- package/dist/orm/table.d.mts +12 -0
- package/dist/orm/table.d.mts.map +1 -0
- package/dist/orm/table.mjs +14 -0
- package/dist/orm/table.mjs.map +1 -0
- package/dist/orm/types.d.cts +183 -0
- package/dist/orm/types.d.cts.map +1 -0
- package/dist/orm/types.d.mts +183 -0
- package/dist/orm/types.d.mts.map +1 -0
- package/dist/workflow/types.d.cts +83 -0
- package/dist/workflow/types.d.cts.map +1 -0
- package/dist/workflow/types.d.mts +83 -0
- package/dist/workflow/types.d.mts.map +1 -0
- package/package.json +29 -3
- package/dist/cron/scanner.mjs.map +0 -1
- package/dist/cron/types.d.cts.map +0 -1
- package/dist/cron/types.d.mts.map +0 -1
- package/dist/lib/cron/index.d.cts.map +0 -1
- package/dist/lib/cron/index.d.mts.map +0 -1
- package/dist/lib/cron/index.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../../src/lib/orm/types.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { Table } from "./table.mjs";
|
|
2
|
+
import { ColumnDef } from "./column.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/lib/orm/types.d.ts
|
|
5
|
+
type ColumnKind = "uuid" | "string" | "number" | "boolean" | "date" | "json" | "jsonb" | "enum";
|
|
6
|
+
type Dialect = "postgres" | "mysql" | "sqlite";
|
|
7
|
+
type KindToType<K extends ColumnKind> = K extends "uuid" | "string" ? string : K extends "number" ? number : K extends "boolean" ? boolean : K extends "date" ? Date : unknown;
|
|
8
|
+
type ColDefs = Record<string, ColumnDef<ColumnKind, ColumnMetaBase, unknown>>;
|
|
9
|
+
type ColumnMetaBase = {
|
|
10
|
+
sqlName: string;
|
|
11
|
+
isSqlArray: boolean;
|
|
12
|
+
isPrimaryKey: boolean;
|
|
13
|
+
isNotNull: boolean;
|
|
14
|
+
isUnique: boolean;
|
|
15
|
+
isEnum: boolean;
|
|
16
|
+
enumValues: string[] | null;
|
|
17
|
+
enumName: string | null;
|
|
18
|
+
hasDefault: boolean;
|
|
19
|
+
defaultKind: "value" | "fn" | null;
|
|
20
|
+
defaultValue: unknown;
|
|
21
|
+
defaultFn: (() => unknown) | null;
|
|
22
|
+
references: (() => ColumnDef<ColumnKind, ColumnMetaBase, unknown>) | null;
|
|
23
|
+
onDeleteAction: "CASCADE" | "RESTRICT" | "SET NULL" | null;
|
|
24
|
+
};
|
|
25
|
+
type Prettify<T> = { [K in keyof T]: T[K] };
|
|
26
|
+
type TableRow<T extends ColDefs> = Prettify<{ [K in keyof T]: T[K] extends ColumnDef<ColumnKind, ColumnMetaBase, infer V> ? T[K]["meta"]["isNotNull"] extends true ? V : V | null : never }>;
|
|
27
|
+
type InsertData<T extends ColDefs> = Prettify<{ [K in keyof T as IsUserProvided<T[K]> extends true ? IsRequired<T[K]> extends true ? K : never : never]: InsertValue<T[K]> } & { [K in keyof T as IsUserProvided<T[K]> extends true ? IsRequired<T[K]> extends true ? never : K : never]?: InsertValue<T[K]> }>;
|
|
28
|
+
type InsertValue<C> = C extends ColumnDef<ColumnKind, infer Meta, infer V> ? Meta["isNotNull"] extends true ? V : V | null : never;
|
|
29
|
+
type IsUserProvided<C> = C extends ColumnDef<"uuid", infer M> ? M["isPrimaryKey"] extends true ? M["hasDefault"] extends true ? true : false : true : true;
|
|
30
|
+
type IsRequired<C> = C extends ColumnDef<ColumnKind, infer M, unknown> ? M["isNotNull"] extends true ? M["hasDefault"] extends true ? false : true : false : false;
|
|
31
|
+
type WhereInput<T extends ColDefs> = {
|
|
32
|
+
and?: WhereInput<T>[];
|
|
33
|
+
or?: WhereInput<T>[];
|
|
34
|
+
} & { [K in keyof T]?: (T[K] extends ColumnDef<ColumnKind, ColumnMetaBase, infer V> ? V : never) | WhereFilter<T[K] extends ColumnDef<ColumnKind, ColumnMetaBase, infer V> ? V : never> };
|
|
35
|
+
type UniqueWhereInput<T extends ColDefs> = { [K in keyof T as T[K]["meta"]["isPrimaryKey"] extends true ? K : T[K]["meta"]["isUnique"] extends true ? K : never]?: T[K] extends ColumnDef<ColumnKind, ColumnMetaBase, infer V> ? V : never };
|
|
36
|
+
type WhereFilter<V> = {
|
|
37
|
+
equals?: V;
|
|
38
|
+
not?: V;
|
|
39
|
+
in?: V[];
|
|
40
|
+
notIn?: V[];
|
|
41
|
+
isNull?: boolean;
|
|
42
|
+
endsWith?: string;
|
|
43
|
+
startsWith?: string;
|
|
44
|
+
contains?: string;
|
|
45
|
+
gt?: V;
|
|
46
|
+
lt?: V;
|
|
47
|
+
gte?: V;
|
|
48
|
+
lte?: V;
|
|
49
|
+
};
|
|
50
|
+
type ManyRelation<TTable> = {
|
|
51
|
+
kind: "many";
|
|
52
|
+
table: () => TTable;
|
|
53
|
+
foreignKey?: string;
|
|
54
|
+
};
|
|
55
|
+
type OneRelation<TTable> = {
|
|
56
|
+
kind: "one";
|
|
57
|
+
foreignKey: string;
|
|
58
|
+
table: () => TTable;
|
|
59
|
+
};
|
|
60
|
+
type RelationDef<TTable> = ManyRelation<TTable> | OneRelation<TTable>;
|
|
61
|
+
type RelationDefs = Record<string, RelationDef<Table<ColDefs>>>;
|
|
62
|
+
type FindManyInput<T extends ColDefs, TRels> = {
|
|
63
|
+
where?: WhereInput<T>;
|
|
64
|
+
include?: { [K in keyof TRels]?: true };
|
|
65
|
+
orderBy?: Partial<Record<keyof T, OrderDirection>>;
|
|
66
|
+
take?: number;
|
|
67
|
+
skip?: number;
|
|
68
|
+
};
|
|
69
|
+
type FindFirstInput<T extends ColDefs, TRels> = FindManyInput<T, TRels>;
|
|
70
|
+
type FindUniqueInput<T extends ColDefs> = {
|
|
71
|
+
where: UniqueWhereInput<T>;
|
|
72
|
+
};
|
|
73
|
+
type CreateInput<T extends ColDefs> = {
|
|
74
|
+
data: InsertData<T>;
|
|
75
|
+
};
|
|
76
|
+
type CreateManyInput<T extends ColDefs> = {
|
|
77
|
+
data: InsertData<T>[];
|
|
78
|
+
};
|
|
79
|
+
type UpdateInput<T extends ColDefs> = {
|
|
80
|
+
where: WhereInput<T>;
|
|
81
|
+
data: Partial<InsertData<T>>;
|
|
82
|
+
};
|
|
83
|
+
type UpdateManyInput<T extends ColDefs> = {
|
|
84
|
+
where: WhereInput<T>;
|
|
85
|
+
data: Partial<InsertData<T>>;
|
|
86
|
+
};
|
|
87
|
+
type DeleteInput<T extends ColDefs> = {
|
|
88
|
+
where: WhereInput<T>;
|
|
89
|
+
};
|
|
90
|
+
type DeleteManyInput<T extends ColDefs> = {
|
|
91
|
+
where: WhereInput<T>;
|
|
92
|
+
};
|
|
93
|
+
type OrderDirection = "asc" | "desc";
|
|
94
|
+
type SelectInput<T extends ColDefs, TRels> = {
|
|
95
|
+
where?: WhereInput<T>;
|
|
96
|
+
include?: { [K in keyof TRels]?: true };
|
|
97
|
+
orderBy?: Partial<Record<keyof T, OrderDirection>>;
|
|
98
|
+
limit?: number;
|
|
99
|
+
offset?: number;
|
|
100
|
+
};
|
|
101
|
+
type InsertInput<T extends ColDefs> = {
|
|
102
|
+
data: InsertData<T>;
|
|
103
|
+
returning?: boolean;
|
|
104
|
+
};
|
|
105
|
+
type UpdateBuilderInput<T extends ColDefs> = {
|
|
106
|
+
where: WhereInput<T>;
|
|
107
|
+
data: Partial<InsertData<T>>;
|
|
108
|
+
returning?: boolean;
|
|
109
|
+
};
|
|
110
|
+
type DeleteBuilderInput<T extends ColDefs> = {
|
|
111
|
+
where: WhereInput<T>;
|
|
112
|
+
returning?: boolean;
|
|
113
|
+
};
|
|
114
|
+
type ClauseOperator = "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "like" | "in" | "not_in" | "is_null" | "is_not_null";
|
|
115
|
+
type WherePredicate<T extends ColDefs> = {
|
|
116
|
+
kind: "predicate";
|
|
117
|
+
key: keyof T & string;
|
|
118
|
+
op: ClauseOperator;
|
|
119
|
+
value?: unknown;
|
|
120
|
+
};
|
|
121
|
+
type WhereNode<T extends ColDefs> = WherePredicate<T> | {
|
|
122
|
+
kind: "and";
|
|
123
|
+
nodes: WhereNode<T>[];
|
|
124
|
+
} | {
|
|
125
|
+
kind: "or";
|
|
126
|
+
nodes: WhereNode<T>[];
|
|
127
|
+
};
|
|
128
|
+
type JoinKind = "inner" | "left";
|
|
129
|
+
type JoinNode = {
|
|
130
|
+
relationKey: string;
|
|
131
|
+
kind: JoinKind;
|
|
132
|
+
};
|
|
133
|
+
type LimitOffsetNode = {
|
|
134
|
+
limit?: number;
|
|
135
|
+
offset?: number;
|
|
136
|
+
};
|
|
137
|
+
type SelectPlan<T extends ColDefs> = {
|
|
138
|
+
where?: WhereNode<T>;
|
|
139
|
+
joins: JoinNode[];
|
|
140
|
+
orderBy: Array<{
|
|
141
|
+
key: keyof T & string;
|
|
142
|
+
direction: OrderDirection;
|
|
143
|
+
}>;
|
|
144
|
+
page: LimitOffsetNode;
|
|
145
|
+
};
|
|
146
|
+
type DialectAdapter = {
|
|
147
|
+
dialect: Dialect;
|
|
148
|
+
likeKeyword: "LIKE" | "ILIKE";
|
|
149
|
+
quoteIdentifier: (identifier: string) => string;
|
|
150
|
+
serializeValue: (kind: ColumnKind, value: unknown) => string | number | boolean | null | unknown;
|
|
151
|
+
renderLikePattern: (mode: "startsWith" | "endsWith" | "contains", value: string) => string;
|
|
152
|
+
};
|
|
153
|
+
type TinyTableClient<T extends ColDefs, TRels> = {
|
|
154
|
+
select: (input?: SelectInput<T, TRels>) => SQL.Query<TableRow<T>[]>;
|
|
155
|
+
findMany: (input?: FindManyInput<T, TRels>) => Promise<TableRow<T>[]>;
|
|
156
|
+
findFirst: (input?: FindFirstInput<T, TRels>) => Promise<TableRow<T> | null>;
|
|
157
|
+
findUnique: (input: FindUniqueInput<T>) => Promise<TableRow<T> | null>;
|
|
158
|
+
insert: <TReturning extends boolean>(input: InsertInput<T> & {
|
|
159
|
+
returning?: TReturning;
|
|
160
|
+
}) => SQL.Query<TReturning extends true ? TableRow<T>[] : unknown>;
|
|
161
|
+
create: (input: CreateInput<T>) => Promise<TableRow<T>>;
|
|
162
|
+
createMany: (input: CreateManyInput<T>) => Promise<{
|
|
163
|
+
count: number;
|
|
164
|
+
rows: TableRow<T>[];
|
|
165
|
+
}>;
|
|
166
|
+
update: <TReturning extends boolean>(input: UpdateBuilderInput<T> & {
|
|
167
|
+
returning?: TReturning;
|
|
168
|
+
}) => SQL.Query<TReturning extends true ? TableRow<T>[] : unknown>;
|
|
169
|
+
updateMany: (input: UpdateManyInput<T>) => Promise<{
|
|
170
|
+
count: number;
|
|
171
|
+
rows: TableRow<T>[];
|
|
172
|
+
}>;
|
|
173
|
+
delete: <TReturning extends boolean>(input: DeleteBuilderInput<T> & {
|
|
174
|
+
returning?: TReturning;
|
|
175
|
+
}) => SQL.Query<TReturning extends true ? TableRow<T>[] : unknown>;
|
|
176
|
+
deleteMany: (input: DeleteManyInput<T>) => Promise<{
|
|
177
|
+
count: number;
|
|
178
|
+
rows: TableRow<T>[];
|
|
179
|
+
}>;
|
|
180
|
+
};
|
|
181
|
+
//#endregion
|
|
182
|
+
export { ColDefs, ColumnKind, ColumnMetaBase, CreateInput, CreateManyInput, DeleteBuilderInput, DeleteInput, DeleteManyInput, Dialect, DialectAdapter, FindFirstInput, FindManyInput, FindUniqueInput, InsertInput, JoinNode, KindToType, ManyRelation, OneRelation, OrderDirection, RelationDefs, SelectInput, SelectPlan, TableRow, TinyTableClient, UpdateBuilderInput, UpdateInput, UpdateManyInput, WhereNode };
|
|
183
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/lib/orm/types.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
//#region src/lib/workflow/types.d.ts
|
|
2
|
+
type WorkflowStatus = "pending" | "running" | "completed" | "failed" | "cancelled";
|
|
3
|
+
type WorkflowErrorType = "WorkflowError" | "WorkflowNotFoundError" | "WorkflowStateError" | "WorkflowSerializationError" | "WorkflowLockError" | "WorkflowExecutionError" | "WorkflowCancelledError";
|
|
4
|
+
type WorkflowError = {
|
|
5
|
+
type: WorkflowErrorType;
|
|
6
|
+
message: string;
|
|
7
|
+
};
|
|
8
|
+
type StepSnapshot = {
|
|
9
|
+
name: string;
|
|
10
|
+
completedAt: number;
|
|
11
|
+
};
|
|
12
|
+
type WorkflowExecution<TInput, TResult> = {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
status: WorkflowStatus;
|
|
16
|
+
input: TInput;
|
|
17
|
+
result: TResult | null;
|
|
18
|
+
error: string | null;
|
|
19
|
+
createdAt: number;
|
|
20
|
+
updatedAt: number;
|
|
21
|
+
completedAt: number | null;
|
|
22
|
+
failedAt: number | null;
|
|
23
|
+
cancelledAt: number | null;
|
|
24
|
+
steps: StepSnapshot[];
|
|
25
|
+
};
|
|
26
|
+
type StepHandler<TInput, TStep> = (input: TInput, signal: AbortSignal) => TStep | Promise<TStep>;
|
|
27
|
+
type WorkflowHandlerContext<TInput> = {
|
|
28
|
+
input: TInput;
|
|
29
|
+
executionId: string;
|
|
30
|
+
signal: AbortSignal;
|
|
31
|
+
step: <TStep>(name: string, handler: StepHandler<TInput, TStep>) => Promise<TStep>;
|
|
32
|
+
};
|
|
33
|
+
type SerializeValue<T> = (value: T) => string;
|
|
34
|
+
type DeserializeValue<T> = (raw: string) => T;
|
|
35
|
+
type WorkflowOptions<TInput, TResult> = {
|
|
36
|
+
name: string;
|
|
37
|
+
redis: Bun.RedisClient;
|
|
38
|
+
handler: (context: WorkflowHandlerContext<TInput>) => TResult | Promise<TResult>;
|
|
39
|
+
lockTTL?: number;
|
|
40
|
+
serializeInput?: SerializeValue<TInput>;
|
|
41
|
+
deserializeInput?: DeserializeValue<TInput>;
|
|
42
|
+
serializeResult?: SerializeValue<TResult>;
|
|
43
|
+
deserializeResult?: DeserializeValue<TResult>;
|
|
44
|
+
serializeStepOutput?: SerializeValue<unknown>;
|
|
45
|
+
deserializeStepOutput?: DeserializeValue<unknown>;
|
|
46
|
+
};
|
|
47
|
+
type WorkflowStartOptions = {
|
|
48
|
+
executionId?: string;
|
|
49
|
+
};
|
|
50
|
+
type WorkflowStartResult = {
|
|
51
|
+
executionId: string;
|
|
52
|
+
status: WorkflowStatus;
|
|
53
|
+
};
|
|
54
|
+
type WorkflowCancelResult = {
|
|
55
|
+
status: WorkflowStatus;
|
|
56
|
+
executionId: string;
|
|
57
|
+
updatedAt: number;
|
|
58
|
+
cancelledAt: number;
|
|
59
|
+
createdAt: number;
|
|
60
|
+
};
|
|
61
|
+
type WorkflowMeta = {
|
|
62
|
+
status: string;
|
|
63
|
+
input: string;
|
|
64
|
+
result: string;
|
|
65
|
+
error: string;
|
|
66
|
+
createdAt: string;
|
|
67
|
+
updatedAt: string;
|
|
68
|
+
completedAt: string;
|
|
69
|
+
failedAt: string;
|
|
70
|
+
cancelledAt: string;
|
|
71
|
+
steps: string;
|
|
72
|
+
};
|
|
73
|
+
type WorkflowMetaField = keyof WorkflowMeta;
|
|
74
|
+
type Workflow<TInput, TResult> = {
|
|
75
|
+
start: (input: TInput, options?: WorkflowStartOptions) => Promise<readonly [WorkflowError | null, WorkflowStartResult | null]>;
|
|
76
|
+
run: (input: TInput, options?: WorkflowStartOptions) => Promise<readonly [WorkflowError | null, TResult | null]>;
|
|
77
|
+
resume: (executionId: string) => Promise<readonly [WorkflowError | null, WorkflowStartResult | null]>;
|
|
78
|
+
get: (executionId: string) => Promise<readonly [WorkflowError | null, WorkflowExecution<TInput, TResult> | null]>;
|
|
79
|
+
cancel: (executionId: string) => Promise<readonly [WorkflowError | null, WorkflowCancelResult | null]>;
|
|
80
|
+
};
|
|
81
|
+
//#endregion
|
|
82
|
+
export { StepHandler, Workflow, WorkflowError, WorkflowExecution, WorkflowHandlerContext, WorkflowMeta, WorkflowMetaField, WorkflowOptions, WorkflowStartOptions, WorkflowStartResult, WorkflowStatus };
|
|
83
|
+
//# sourceMappingURL=types.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../../src/lib/workflow/types.ts"],"mappings":";KAAY,cAAA;AAAA,KAOA,iBAAA;AAAA,KASA,aAAA;EACV,IAAA,EAAM,iBAAA;EACN,OAAA;AAAA;AAAA,KAGU,YAAA;EACV,IAAA;EACA,WAAA;AAAA;AAAA,KAGU,iBAAA;EACV,EAAA;EACA,IAAA;EACA,MAAA,EAAQ,cAAA;EACR,KAAA,EAAO,MAAA;EACP,MAAA,EAAQ,OAAA;EACR,KAAA;EACA,SAAA;EACA,SAAA;EACA,WAAA;EACA,QAAA;EACA,WAAA;EACA,KAAA,EAAO,YAAA;AAAA;AAAA,KAGG,WAAA,mBACV,KAAA,EAAO,MAAA,EACP,MAAA,EAAQ,WAAA,KACL,KAAA,GAAQ,OAAA,CAAQ,KAAA;AAAA,KAET,sBAAA;EACV,KAAA,EAAO,MAAA;EACP,WAAA;EACA,MAAA,EAAQ,WAAA;EACR,IAAA,UACE,IAAA,UACA,OAAA,EAAS,WAAA,CAAY,MAAA,EAAQ,KAAA,MAC1B,OAAA,CAAQ,KAAA;AAAA;AAAA,KAGH,cAAA,OAAqB,KAAA,EAAO,CAAA;AAAA,KAC5B,gBAAA,OAAuB,GAAA,aAAgB,CAAA;AAAA,KAEvC,eAAA;EACV,IAAA;EACA,KAAA,EAAO,GAAA,CAAI,WAAA;EACX,OAAA,GACE,OAAA,EAAS,sBAAA,CAAuB,MAAA,MAC7B,OAAA,GAAU,OAAA,CAAQ,OAAA;EACvB,OAAA;EACA,cAAA,GAAiB,cAAA,CAAe,MAAA;EAChC,gBAAA,GAAmB,gBAAA,CAAiB,MAAA;EACpC,eAAA,GAAkB,cAAA,CAAe,OAAA;EACjC,iBAAA,GAAoB,gBAAA,CAAiB,OAAA;EACrC,mBAAA,GAAsB,cAAA;EACtB,qBAAA,GAAwB,gBAAA;AAAA;AAAA,KAGd,oBAAA;EACV,WAAA;AAAA;AAAA,KAGU,mBAAA;EACV,WAAA;EACA,MAAA,EAAQ,cAAA;AAAA;AAAA,KAGE,oBAAA;EACV,MAAA,EAAQ,cAAA;EACR,WAAA;EACA,SAAA;EACA,WAAA;EACA,SAAA;AAAA;AAAA,KAGU,YAAA;EACV,MAAA;EACA,KAAA;EACA,MAAA;EACA,KAAA;EACA,SAAA;EACA,SAAA;EACA,WAAA;EACA,QAAA;EACA,WAAA;EACA,KAAA;AAAA;AAAA,KAGU,iBAAA,SAA0B,YAAA;AAAA,KAE1B,QAAA;EACV,KAAA,GACE,KAAA,EAAO,MAAA,EACP,OAAA,GAAU,oBAAA,KACP,OAAA,WAAkB,aAAA,SAAsB,mBAAA;EAC7C,GAAA,GACE,KAAA,EAAO,MAAA,EACP,OAAA,GAAU,oBAAA,KACP,OAAA,WAAkB,aAAA,SAAsB,OAAA;EAC7C,MAAA,GACE,WAAA,aACG,OAAA,WAAkB,aAAA,SAAsB,mBAAA;EAC7C,GAAA,GACE,WAAA,aACG,OAAA,WACO,aAAA,SAAsB,iBAAA,CAAkB,MAAA,EAAQ,OAAA;EAE5D,MAAA,GACE,WAAA,aACG,OAAA,WAAkB,aAAA,SAAsB,oBAAA;AAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
//#region src/lib/workflow/types.d.ts
|
|
2
|
+
type WorkflowStatus = "pending" | "running" | "completed" | "failed" | "cancelled";
|
|
3
|
+
type WorkflowErrorType = "WorkflowError" | "WorkflowNotFoundError" | "WorkflowStateError" | "WorkflowSerializationError" | "WorkflowLockError" | "WorkflowExecutionError" | "WorkflowCancelledError";
|
|
4
|
+
type WorkflowError = {
|
|
5
|
+
type: WorkflowErrorType;
|
|
6
|
+
message: string;
|
|
7
|
+
};
|
|
8
|
+
type StepSnapshot = {
|
|
9
|
+
name: string;
|
|
10
|
+
completedAt: number;
|
|
11
|
+
};
|
|
12
|
+
type WorkflowExecution<TInput, TResult> = {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
status: WorkflowStatus;
|
|
16
|
+
input: TInput;
|
|
17
|
+
result: TResult | null;
|
|
18
|
+
error: string | null;
|
|
19
|
+
createdAt: number;
|
|
20
|
+
updatedAt: number;
|
|
21
|
+
completedAt: number | null;
|
|
22
|
+
failedAt: number | null;
|
|
23
|
+
cancelledAt: number | null;
|
|
24
|
+
steps: StepSnapshot[];
|
|
25
|
+
};
|
|
26
|
+
type StepHandler<TInput, TStep> = (input: TInput, signal: AbortSignal) => TStep | Promise<TStep>;
|
|
27
|
+
type WorkflowHandlerContext<TInput> = {
|
|
28
|
+
input: TInput;
|
|
29
|
+
executionId: string;
|
|
30
|
+
signal: AbortSignal;
|
|
31
|
+
step: <TStep>(name: string, handler: StepHandler<TInput, TStep>) => Promise<TStep>;
|
|
32
|
+
};
|
|
33
|
+
type SerializeValue<T> = (value: T) => string;
|
|
34
|
+
type DeserializeValue<T> = (raw: string) => T;
|
|
35
|
+
type WorkflowOptions<TInput, TResult> = {
|
|
36
|
+
name: string;
|
|
37
|
+
redis: Bun.RedisClient;
|
|
38
|
+
handler: (context: WorkflowHandlerContext<TInput>) => TResult | Promise<TResult>;
|
|
39
|
+
lockTTL?: number;
|
|
40
|
+
serializeInput?: SerializeValue<TInput>;
|
|
41
|
+
deserializeInput?: DeserializeValue<TInput>;
|
|
42
|
+
serializeResult?: SerializeValue<TResult>;
|
|
43
|
+
deserializeResult?: DeserializeValue<TResult>;
|
|
44
|
+
serializeStepOutput?: SerializeValue<unknown>;
|
|
45
|
+
deserializeStepOutput?: DeserializeValue<unknown>;
|
|
46
|
+
};
|
|
47
|
+
type WorkflowStartOptions = {
|
|
48
|
+
executionId?: string;
|
|
49
|
+
};
|
|
50
|
+
type WorkflowStartResult = {
|
|
51
|
+
executionId: string;
|
|
52
|
+
status: WorkflowStatus;
|
|
53
|
+
};
|
|
54
|
+
type WorkflowCancelResult = {
|
|
55
|
+
status: WorkflowStatus;
|
|
56
|
+
executionId: string;
|
|
57
|
+
updatedAt: number;
|
|
58
|
+
cancelledAt: number;
|
|
59
|
+
createdAt: number;
|
|
60
|
+
};
|
|
61
|
+
type WorkflowMeta = {
|
|
62
|
+
status: string;
|
|
63
|
+
input: string;
|
|
64
|
+
result: string;
|
|
65
|
+
error: string;
|
|
66
|
+
createdAt: string;
|
|
67
|
+
updatedAt: string;
|
|
68
|
+
completedAt: string;
|
|
69
|
+
failedAt: string;
|
|
70
|
+
cancelledAt: string;
|
|
71
|
+
steps: string;
|
|
72
|
+
};
|
|
73
|
+
type WorkflowMetaField = keyof WorkflowMeta;
|
|
74
|
+
type Workflow<TInput, TResult> = {
|
|
75
|
+
start: (input: TInput, options?: WorkflowStartOptions) => Promise<readonly [WorkflowError | null, WorkflowStartResult | null]>;
|
|
76
|
+
run: (input: TInput, options?: WorkflowStartOptions) => Promise<readonly [WorkflowError | null, TResult | null]>;
|
|
77
|
+
resume: (executionId: string) => Promise<readonly [WorkflowError | null, WorkflowStartResult | null]>;
|
|
78
|
+
get: (executionId: string) => Promise<readonly [WorkflowError | null, WorkflowExecution<TInput, TResult> | null]>;
|
|
79
|
+
cancel: (executionId: string) => Promise<readonly [WorkflowError | null, WorkflowCancelResult | null]>;
|
|
80
|
+
};
|
|
81
|
+
//#endregion
|
|
82
|
+
export { StepHandler, Workflow, WorkflowError, WorkflowExecution, WorkflowHandlerContext, WorkflowMeta, WorkflowMetaField, WorkflowOptions, WorkflowStartOptions, WorkflowStartResult, WorkflowStatus };
|
|
83
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/lib/workflow/types.ts"],"mappings":";KAAY,cAAA;AAAA,KAOA,iBAAA;AAAA,KASA,aAAA;EACV,IAAA,EAAM,iBAAA;EACN,OAAA;AAAA;AAAA,KAGU,YAAA;EACV,IAAA;EACA,WAAA;AAAA;AAAA,KAGU,iBAAA;EACV,EAAA;EACA,IAAA;EACA,MAAA,EAAQ,cAAA;EACR,KAAA,EAAO,MAAA;EACP,MAAA,EAAQ,OAAA;EACR,KAAA;EACA,SAAA;EACA,SAAA;EACA,WAAA;EACA,QAAA;EACA,WAAA;EACA,KAAA,EAAO,YAAA;AAAA;AAAA,KAGG,WAAA,mBACV,KAAA,EAAO,MAAA,EACP,MAAA,EAAQ,WAAA,KACL,KAAA,GAAQ,OAAA,CAAQ,KAAA;AAAA,KAET,sBAAA;EACV,KAAA,EAAO,MAAA;EACP,WAAA;EACA,MAAA,EAAQ,WAAA;EACR,IAAA,UACE,IAAA,UACA,OAAA,EAAS,WAAA,CAAY,MAAA,EAAQ,KAAA,MAC1B,OAAA,CAAQ,KAAA;AAAA;AAAA,KAGH,cAAA,OAAqB,KAAA,EAAO,CAAA;AAAA,KAC5B,gBAAA,OAAuB,GAAA,aAAgB,CAAA;AAAA,KAEvC,eAAA;EACV,IAAA;EACA,KAAA,EAAO,GAAA,CAAI,WAAA;EACX,OAAA,GACE,OAAA,EAAS,sBAAA,CAAuB,MAAA,MAC7B,OAAA,GAAU,OAAA,CAAQ,OAAA;EACvB,OAAA;EACA,cAAA,GAAiB,cAAA,CAAe,MAAA;EAChC,gBAAA,GAAmB,gBAAA,CAAiB,MAAA;EACpC,eAAA,GAAkB,cAAA,CAAe,OAAA;EACjC,iBAAA,GAAoB,gBAAA,CAAiB,OAAA;EACrC,mBAAA,GAAsB,cAAA;EACtB,qBAAA,GAAwB,gBAAA;AAAA;AAAA,KAGd,oBAAA;EACV,WAAA;AAAA;AAAA,KAGU,mBAAA;EACV,WAAA;EACA,MAAA,EAAQ,cAAA;AAAA;AAAA,KAGE,oBAAA;EACV,MAAA,EAAQ,cAAA;EACR,WAAA;EACA,SAAA;EACA,WAAA;EACA,SAAA;AAAA;AAAA,KAGU,YAAA;EACV,MAAA;EACA,KAAA;EACA,MAAA;EACA,KAAA;EACA,SAAA;EACA,SAAA;EACA,WAAA;EACA,QAAA;EACA,WAAA;EACA,KAAA;AAAA;AAAA,KAGU,iBAAA,SAA0B,YAAA;AAAA,KAE1B,QAAA;EACV,KAAA,GACE,KAAA,EAAO,MAAA,EACP,OAAA,GAAU,oBAAA,KACP,OAAA,WAAkB,aAAA,SAAsB,mBAAA;EAC7C,GAAA,GACE,KAAA,EAAO,MAAA,EACP,OAAA,GAAU,oBAAA,KACP,OAAA,WAAkB,aAAA,SAAsB,OAAA;EAC7C,MAAA,GACE,WAAA,aACG,OAAA,WAAkB,aAAA,SAAsB,mBAAA;EAC7C,GAAA,GACE,WAAA,aACG,OAAA,WACO,aAAA,SAAsB,iBAAA,CAAkB,MAAA,EAAQ,OAAA;EAE5D,MAAA,GACE,WAAA,aACG,OAAA,WAAkB,aAAA,SAAsB,oBAAA;AAAA"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "semola",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.3",
|
|
4
4
|
"description": "Zero-dependency TypeScript utilities for Bun. Type-safe APIs, Redis queues, pub/sub, i18n, caching & auth with tree-shakeable imports.",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"semola": "./dist/cli/index.js"
|
|
8
|
+
},
|
|
6
9
|
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
7
14
|
"./errors": {
|
|
8
15
|
"import": {
|
|
9
16
|
"types": "./dist/lib/errors/index.d.mts",
|
|
@@ -85,8 +92,14 @@
|
|
|
85
92
|
}
|
|
86
93
|
},
|
|
87
94
|
"./logging": {
|
|
88
|
-
"import":
|
|
89
|
-
|
|
95
|
+
"import": {
|
|
96
|
+
"types": "./dist/lib/logging/index.d.mts",
|
|
97
|
+
"default": "./dist/lib/logging/index.mjs"
|
|
98
|
+
},
|
|
99
|
+
"require": {
|
|
100
|
+
"types": "./dist/lib/logging/index.d.cts",
|
|
101
|
+
"default": "./dist/lib/logging/index.cjs"
|
|
102
|
+
}
|
|
90
103
|
},
|
|
91
104
|
"./prompts": {
|
|
92
105
|
"import": {
|
|
@@ -97,6 +110,16 @@
|
|
|
97
110
|
"types": "./dist/lib/prompts/index.d.cts",
|
|
98
111
|
"default": "./dist/lib/prompts/index.cjs"
|
|
99
112
|
}
|
|
113
|
+
},
|
|
114
|
+
"./workflow": {
|
|
115
|
+
"import": {
|
|
116
|
+
"types": "./dist/lib/workflow/index.d.mts",
|
|
117
|
+
"default": "./dist/lib/workflow/index.mjs"
|
|
118
|
+
},
|
|
119
|
+
"require": {
|
|
120
|
+
"types": "./dist/lib/workflow/index.d.cts",
|
|
121
|
+
"default": "./dist/lib/workflow/index.cjs"
|
|
122
|
+
}
|
|
100
123
|
}
|
|
101
124
|
},
|
|
102
125
|
"files": [
|
|
@@ -124,6 +147,9 @@
|
|
|
124
147
|
"cron",
|
|
125
148
|
"scheduler",
|
|
126
149
|
"job-scheduler",
|
|
150
|
+
"workflow",
|
|
151
|
+
"durable-workflow",
|
|
152
|
+
"resumable-workflow",
|
|
127
153
|
"i18n",
|
|
128
154
|
"internationalization",
|
|
129
155
|
"authorization",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.mjs","names":[],"sources":["../../src/lib/cron/scanner.ts"],"sourcesContent":["import { err, ok } from \"../errors/index.js\";\nimport type { CronScannerError } from \"./types.js\";\n\nexport const FieldAmount = {\n min: 5,\n max: 6,\n} as const;\n\ntype TokenValueType = string | number;\ntype CronFieldType = \"second\" | \"minute\" | \"hour\" | \"day\" | \"month\" | \"weekday\";\ntype ComponentType = {\n content: string;\n field: CronFieldType;\n};\n\ntype TokenType = \"any\" | \"range\" | \"step\" | \"number\";\n\nexport class Token {\n private readonly type: TokenType;\n private readonly component: string;\n private readonly value: TokenValueType;\n\n private readonly field: CronFieldType;\n\n public constructor(\n component: string,\n type: TokenType,\n value: TokenValueType,\n field: CronFieldType,\n ) {\n this.component = component;\n this.type = type;\n this.value = value;\n this.field = field;\n }\n\n public getComponent() {\n return this.component;\n }\n\n public getTokenType() {\n return this.type;\n }\n\n public getTokenValue() {\n return this.value;\n }\n\n public getField() {\n return this.field;\n }\n\n public toString() {\n const header = `component=\"${this.component}\", type=${this.type}`;\n const body = `field=\"${this.field}\", value=${this.value}`;\n\n return `Token{${header}, ${body}}`;\n }\n\n public equals(other: Token) {\n if (!other) return false;\n\n const isComponentEqual = this.component === other.getComponent();\n const isTokenTypeEqual = this.type === other.getTokenType();\n const isTokenValueEqual = this.value === other.getTokenValue();\n const isFieldEqual = this.field === other.getField();\n\n return (\n isComponentEqual && isTokenTypeEqual && isTokenValueEqual && isFieldEqual\n );\n }\n}\n\nexport class Scanner {\n private expression: string;\n private current: number;\n private start: number;\n private tokens: Token[];\n\n public constructor(expression: string) {\n this.expression = expression;\n this.current = 0;\n this.start = 0;\n this.tokens = [];\n }\n\n public scan() {\n if (this.expression.length === 0) {\n return err<CronScannerError>(\n \"EmptyCronExpressionError\",\n \"Cron expression have zero length\",\n );\n }\n\n const fields = this.expression.trim().split(/\\s+/);\n const hasMinLen = fields.length === FieldAmount.min;\n const hasMaxLen = fields.length === FieldAmount.max;\n\n if (!hasMinLen && !hasMaxLen) {\n return err<CronScannerError>(\n \"CronLengthError\",\n `Invalid number of fields for '${this.expression}'. Expected 5 or 6 fields but got ${fields.length} field(s)`,\n );\n }\n\n const components = this.createComponent(fields);\n\n for (let idx = 0; idx < components.length; idx++) {\n const component = components[idx];\n if (!component) {\n return err<CronScannerError>(\n \"CronExpressionError\",\n `Invalid cron expression: ${this.expression}`,\n );\n }\n\n this.current = 0;\n this.start = 0;\n const [error, _] = this.scanComponent(component);\n if (error) return err<CronScannerError>(error.type, error.message);\n }\n\n return ok(this.tokens);\n }\n\n private scanComponent(component: ComponentType) {\n const { field, content } = component;\n while (this.current < content.length) {\n let currentCh = this.advance(content);\n\n switch (currentCh) {\n case \"*\": {\n const ch = this.peek(content);\n if (this.match(content, \"/\")) {\n const [error, _] = this.handleStep(component);\n if (error) return err<CronScannerError>(error.type, error.message);\n } else if (!ch || ch === \",\") {\n this.addToken(\"*\", \"any\", \"*\", field);\n } else {\n return err<CronScannerError>(\n \"CronExpressionError\",\n `Invalid any expression '${content}' for field '${field}'`,\n );\n }\n\n break;\n }\n case \"-\": {\n currentCh = this.advance(content);\n if (this.isDigit(currentCh)) {\n const [error, _] = this.handleRangeWithStep(component);\n if (error) return err<CronScannerError>(error.type, error.message);\n } else {\n return err<CronScannerError>(\n \"CronExpressionError\",\n `Invalid range expression '${content}' for field '${field}'`,\n );\n }\n break;\n }\n case \",\": {\n if (this.current === 1 && this.start === 0) {\n return err<CronScannerError>(\n \"CronExpressionError\",\n `Invalid list expression '${content}' for field '${field}'`,\n );\n }\n\n const next = this.peek(content);\n if (!next || next === \",\") {\n return err<CronScannerError>(\n \"CronExpressionError\",\n `Invalid list expression '${content}' for field '${field}'`,\n );\n }\n\n break;\n }\n default: {\n if (this.isDigit(currentCh)) {\n const [error, _] = this.handleNumber(component);\n if (error) return err<CronScannerError>(error.type, error.message);\n } else {\n return err<CronScannerError>(\n \"CronExpressionError\",\n `Invalid cron expression '${this.expression}' in field '${field}'`,\n );\n }\n\n break;\n }\n }\n\n this.start = this.current;\n }\n\n return ok(true);\n }\n\n private addToken(\n component: string,\n type: TokenType,\n value: TokenValueType,\n field: CronFieldType,\n ) {\n const token = new Token(component, type, value, field);\n this.tokens.push(token);\n }\n\n private advance(content: string) {\n const currentCh = content.charAt(this.current);\n this.current += 1;\n\n return currentCh;\n }\n\n private match(content: string, expected: string) {\n if (this.current >= content.length) return false;\n if (content.charAt(this.current) !== expected) return false;\n\n this.current += 1;\n return true;\n }\n\n private peek(content: string) {\n if (this.current >= content.length) return undefined;\n\n return content.charAt(this.current);\n }\n\n private handleStep(component: ComponentType) {\n const { field, content } = component;\n let ch = this.peek(content);\n const slashIdx = this.current - 1;\n\n while (ch && this.isDigit(ch)) {\n this.advance(content);\n ch = this.peek(content);\n }\n\n if (ch && ch !== \",\") {\n return err<CronScannerError>(\n \"CronExpressionError\",\n `Invalid step expression '${content}' for field '${field}'`,\n );\n }\n\n const tokenContent = content.substring(this.start, this.current);\n const value = content.slice(slashIdx + 1, this.current);\n\n if (value.length === 0) {\n return err<CronScannerError>(\n \"CronExpressionError\",\n `Invalid step expression '${content}' for field '${field}'`,\n );\n }\n\n this.addToken(tokenContent, \"step\", Number(value), field);\n return ok(true);\n }\n\n private handleRangeWithStep(component: ComponentType) {\n const { field, content } = component;\n let ch = this.peek(content);\n\n while (ch && this.isDigit(ch)) {\n this.advance(content);\n ch = this.peek(content);\n }\n\n if (!ch) {\n return err<CronScannerError>(\n \"CronExpressionError\",\n `Invalid range expression '${content}' for field '${field}'`,\n );\n }\n\n if (this.match(content, \"/\")) {\n const [error, _] = this.handleStep(component);\n if (error) return err<CronScannerError>(error.type, error.message);\n\n return ok(true);\n }\n\n return err<CronScannerError>(\n \"CronExpressionError\",\n `Invalid range expression '${content}' for field '${field}'`,\n );\n }\n\n private handleNumber(component: ComponentType) {\n const { field, content } = component;\n let ch = this.peek(content);\n this.start = this.current - 1;\n\n while (ch && this.isDigit(ch)) {\n this.advance(content);\n ch = this.peek(content);\n }\n\n if (!ch) {\n // Reached the end of the component\n const item = content.substring(this.start);\n this.addToken(item, \"number\", Number(item), field);\n return ok(true);\n }\n\n if (this.match(content, \"-\")) {\n const [error, _] = this.handleRange(component);\n if (error) return err<CronScannerError>(error.type, error.message);\n\n return ok(true);\n }\n\n if (this.match(content, \"/\")) {\n const [error, _] = this.handleStep(component);\n if (error) return err<CronScannerError>(error.type, error.message);\n\n return ok(true);\n }\n\n if (!this.isDigit(ch) && ch !== \",\") {\n return err<CronScannerError>(\n \"CronExpressionError\",\n `Invalid number '${content}' for field '${field}'`,\n );\n }\n\n const item = content.substring(this.start, this.current);\n this.addToken(item, \"number\", Number(item), field);\n return ok(true);\n }\n\n private handleRange(component: ComponentType) {\n const { field, content } = component;\n let ch = this.peek(content);\n\n if (!ch) {\n return err<CronScannerError>(\n \"CronExpressionError\",\n `Invalid range expression '${content}' for field '${field}'`,\n );\n }\n\n while (ch && this.isDigit(ch)) {\n this.advance(content);\n ch = this.peek(content);\n }\n\n if (!ch) {\n // Reached the end of the component\n const tokenContent = content.substring(this.start);\n this.addToken(tokenContent, \"range\", tokenContent, field);\n\n return ok(true);\n }\n\n if (this.match(content, \"/\")) {\n const [error, _] = this.handleStep(component);\n if (error) return err<CronScannerError>(error.type, error.message);\n\n return ok(true);\n }\n\n if (ch && ch !== \",\") {\n return err<CronScannerError>(\n \"CronExpressionError\",\n `Invalid range expression '${content}' for field '${field}'`,\n );\n }\n\n const tokenContent = content.substring(this.start, this.current);\n this.addToken(tokenContent, \"range\", tokenContent, field);\n return ok(true);\n }\n\n private isDigit(ch: string) {\n return ch >= \"0\" && ch <= \"9\";\n }\n\n private createComponent(fields: string[]) {\n const fieldNames = [\n \"second\",\n \"minute\",\n \"hour\",\n \"day\",\n \"month\",\n \"weekday\",\n ] as const;\n const components = [];\n let offset = 1;\n if (fields.length === FieldAmount.max) offset = 0;\n\n for (let idx = 0; idx < fields.length; idx++) {\n const fieldName = fieldNames[idx + offset];\n const content = fields[idx];\n if (!fieldName || !content) break;\n\n components.push({ content, field: fieldName });\n }\n\n return components;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.cts","names":[],"sources":["../../src/lib/cron/types.ts"],"mappings":";KAAY,SAAA;AAAA,KAQA,UAAA;AAAA,KASA,WAAA;EACV,IAAA;EACA,QAAA,EAAU,SAAA;EACV,OAAA,eAAsB,OAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/lib/cron/types.ts"],"mappings":";KAAY,SAAA;AAAA,KAQA,UAAA;AAAA,KASA,WAAA;EACV,IAAA;EACA,QAAA,EAAU,SAAA;EACV,OAAA,eAAsB,OAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/cron/index.ts"],"mappings":";;;cA6Ca,IAAA;EAAA,QACH,OAAA;EAAA,QACA,MAAA;EAAA,QACA,SAAA;EAAA,QAGA,MAAA;EAAA,QACA,MAAA;EAAA,QACA,IAAA;EAAA,QACA,GAAA;EAAA,QACA,KAAA;EAAA,QACA,SAAA;EAAA,QACA,UAAA;EAAA,QACA,YAAA;EAAA,QACA,YAAA;EAAA,QAGA,SAAA;EAAA,QAMA,UAAA;EAAA,QAkDA,eAAA;EAAA,QAiEA,gBAAA;EAAA,QAuCA,WAAA;EAAA,QAmEA,YAAA;cAkCW,OAAA,EAAS,WAAA;EAAA,QAoBpB,YAAA;EAAA,QAIA,KAAA;EAAA,QAoIA,WAAA;EAyCD,OAAA,CAAQ,IAAA,EAAM,IAAA;EAkCd,UAAA,CAAA,GAAU,IAAA;EAuCV,KAAA,CAAA;EAOA,IAAA,CAAA;EASA,KAAA,CAAA;EAWA,MAAA,CAAA;EAOA,SAAA,CAAA,GAAS,UAAA;EAAA,QAIR,IAAA;EAAA,QAmBM,GAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/cron/index.ts"],"mappings":";;;cA6Ca,IAAA;EAAA,QACH,OAAA;EAAA,QACA,MAAA;EAAA,QACA,SAAA;EAAA,QAGA,MAAA;EAAA,QACA,MAAA;EAAA,QACA,IAAA;EAAA,QACA,GAAA;EAAA,QACA,KAAA;EAAA,QACA,SAAA;EAAA,QACA,UAAA;EAAA,QACA,YAAA;EAAA,QACA,YAAA;EAAA,QAGA,SAAA;EAAA,QAMA,UAAA;EAAA,QAkDA,eAAA;EAAA,QAiEA,gBAAA;EAAA,QAuCA,WAAA;EAAA,QAmEA,YAAA;cAkCW,OAAA,EAAS,WAAA;EAAA,QAoBpB,YAAA;EAAA,QAIA,KAAA;EAAA,QAoIA,WAAA;EAyCD,OAAA,CAAQ,IAAA,EAAM,IAAA;EAkCd,UAAA,CAAA,GAAU,IAAA;EAuCV,KAAA,CAAA;EAOA,IAAA,CAAA;EASA,KAAA,CAAA;EAWA,MAAA,CAAA;EAOA,SAAA,CAAA,GAAS,UAAA;EAAA,QAIR,IAAA;EAAA,QAmBM,GAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/cron/index.ts"],"sourcesContent":["import { err, mightThrow, ok } from \"../errors/index.js\";\nimport { FieldAmount, Scanner, type Token } from \"./scanner.js\";\nimport type { CronOptions, CronParsingError, CronStatus } from \"./types.js\";\n\nconst RETRY_DELAY_MS = 60 * 60 * 1000; // 1 hour\n\nconst ALIASES: Record<string, string> = {\n \"@yearly\": \"0 0 1 1 *\",\n \"@monthly\": \"0 0 1 * *\",\n \"@weekly\": \"0 0 * * 0\",\n \"@daily\": \"0 0 * * *\",\n \"@hourly\": \"0 * * * *\",\n \"@minutely\": \"* * * * *\",\n};\n\nconst CronSecondRange = {\n min: 0,\n max: 59,\n} as const;\n\nconst CronMinuteRange = {\n min: 0,\n max: 59,\n} as const;\n\nconst CronHourRange = {\n min: 0,\n max: 23,\n} as const;\n\nconst CronDayRange = {\n min: 1,\n max: 31,\n} as const;\n\nconst CronMonthRange = {\n min: 1,\n max: 12,\n} as const;\n\nconst CronDayOfWeekRange = {\n min: 0,\n max: 6,\n} as const;\n\nexport class Cron {\n private options: CronOptions;\n private status: CronStatus = \"idle\";\n private timeoutId: NodeJS.Timeout | null = null;\n\n // Array-based storage using 1-indexed slots (0 = don't run, 1 = run)\n private second = Array<number>(CronSecondRange.max + 1).fill(0); // 0-59\n private minute = Array<number>(CronMinuteRange.max + 1).fill(0); // 0-59\n private hour = Array<number>(CronHourRange.max + 1).fill(0); // 0-23\n private day = Array<number>(CronDayRange.max + 1).fill(0); // indices 1-31 (0 unused)\n private month = Array<number>(CronMonthRange.max + 1).fill(0); // indices 1-12 (0 unused)\n private dayOfWeek = Array<number>(CronDayOfWeekRange.max + 1).fill(0); // 0-6\n private hasSeconds;\n private _dayWildcard = false;\n private _dowWildcard = false;\n\n // Fill all values from min to max with 1\n private fillRange(values: number[], min: number, max: number) {\n for (let i = min; i <= max; i++) {\n values[i] = 1;\n }\n }\n\n private handleStep(part: string, values: number[], min: number, max: number) {\n // Split step format into range and step components\n const [rangePart, stepStr] = part.split(\"/\");\n\n if (!rangePart) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${rangePart}' is empty`,\n );\n }\n\n if (!stepStr) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${stepStr}' is empty`,\n );\n }\n\n const step = Number(stepStr);\n\n // Validate step is a positive integer\n if (!Number.isInteger(step)) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${step}' is not a valid number`,\n );\n }\n\n if (step <= 0) {\n return err<CronParsingError>(\"OutOfBoundError\", `Expected ${step} > 0`);\n }\n\n if (rangePart === \"*\") {\n // Wildcard with step: apply step across entire range\n for (let i = min; i <= max; i += step) {\n values[i] = 1;\n }\n\n return ok(true);\n }\n\n if (rangePart.includes(\"-\")) {\n // Range with step: delegate to specialized handler\n return this.handleStepRange(rangePart, step, values, min, max);\n }\n\n // Single value with step: delegate to specialized handler\n return this.handleStepSingle(rangePart, step, values, min, max);\n }\n\n private handleStepRange(\n range: string,\n step: number,\n values: number[],\n min: number,\n max: number,\n ) {\n // Split range into start and end values\n const [startStr, endStr] = range.split(\"-\");\n\n if (!endStr) {\n return err<CronParsingError>(\"InvalidValueError\", `'${endStr}' is empty`);\n }\n\n let start = min;\n if (startStr && startStr.length > 0) {\n start = Number(startStr);\n }\n\n const end = Number(endStr);\n\n // Validate range boundaries are integers within bounds\n if (!Number.isInteger(start)) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${start}' is not a valid number`,\n );\n }\n\n if (!Number.isInteger(end)) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${end}' is not a valid number`,\n );\n }\n\n if (start < min) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${start} >= ${min}`,\n );\n }\n\n if (end > max) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${end} <= ${max}`,\n );\n }\n\n if (start > end) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${start} <= ${end}`,\n );\n }\n\n // Apply step through range\n for (let i = start; i <= end; i += step) {\n values[i] = 1;\n }\n\n return ok(true);\n }\n\n private handleStepSingle(\n value: string,\n step: number,\n values: number[],\n min: number,\n max: number,\n ) {\n const start = Number(value);\n\n // Validate starting value is an integer within bounds\n if (!Number.isInteger(start)) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${start}' is not a valid number`,\n );\n }\n\n if (start < min) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${start} >= ${min}`,\n );\n }\n\n if (start > max) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${start} <= ${max}`,\n );\n }\n\n // Apply step from start to end of range\n for (let i = start; i <= max; i += step) {\n values[i] = 1;\n }\n\n return ok(true);\n }\n\n private handleRange(\n part: string,\n values: number[],\n min: number,\n max: number,\n ) {\n // Split range into start and end values\n const [startStr, endStr] = part.split(\"-\");\n\n if (!startStr) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${startStr}' is empty`,\n );\n }\n\n if (!endStr) {\n return err<CronParsingError>(\"InvalidValueError\", `'${endStr}' is empty`);\n }\n\n const start = Number(startStr);\n const end = Number(endStr);\n\n // Validate range boundaries are integers within bounds\n if (!Number.isInteger(start)) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${start}' is not a valid number`,\n );\n }\n\n if (!Number.isInteger(end)) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${end}' is not a valid number`,\n );\n }\n\n if (start < min) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${start} >= ${min}`,\n );\n }\n\n if (end > max) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${end} <= ${max}`,\n );\n }\n\n if (start > end) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${start} <= ${end}`,\n );\n }\n\n // Mark all values in the range\n for (let i = start; i <= end; i++) {\n values[i] = 1;\n }\n\n return ok(true);\n }\n\n private handleNumber(\n value: string,\n values: number[],\n min: number,\n max: number,\n ) {\n const n = Number(value);\n\n // Validate value is an integer within bounds\n if (!Number.isInteger(n)) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${value}' is not a valid number`,\n );\n }\n\n if (n < min) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${n} >= ${min}`,\n );\n }\n if (n > max) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${n} <= ${max}`,\n );\n }\n\n values[n] = 1;\n\n return ok(true);\n }\n\n public constructor(options: CronOptions) {\n this.options = options;\n\n // Resolve alias or use raw expression\n const expr = this.resolveAlias(options.schedule);\n const [error, tokens] = new Scanner(expr).scan();\n if (error) throw new Error(`${error.type}: ${error.message}`);\n\n const fields = expr.trim().split(/\\s+/);\n this.hasSeconds = fields.length === FieldAmount.max;\n\n // Parse and validate the cron expression\n const [parsingError, _] = this.parse(tokens);\n\n if (parsingError) {\n throw new Error(`${parsingError.type}: ${parsingError.message}`);\n }\n }\n\n // Map alias to standard cron expression if present\n private resolveAlias(schedule: string) {\n return ALIASES[schedule] || schedule;\n }\n\n private parse(tokens: Token[]) {\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n if (!token) {\n return err<CronParsingError>(\"InvalidValueError\", \"Undefined token\");\n }\n\n const tokenType = token.getTokenType();\n\n switch (token.getField()) {\n case \"second\": {\n const [error, _] = this.handleField(\n token,\n this.second,\n CronSecondRange.min,\n CronSecondRange.max,\n );\n\n if (error) {\n return err<CronParsingError>(\n error.type,\n `${error.message} in field '${token.getField()}'`,\n );\n }\n\n break;\n }\n case \"minute\": {\n const [error, _] = this.handleField(\n token,\n this.minute,\n CronMinuteRange.min,\n CronMinuteRange.max,\n );\n\n if (error) {\n return err<CronParsingError>(\n error.type,\n `${error.message} in field '${token.getField()}'`,\n );\n }\n\n break;\n }\n case \"hour\": {\n const [error, _] = this.handleField(\n token,\n this.hour,\n CronHourRange.min,\n CronHourRange.max,\n );\n\n if (error) {\n return err<CronParsingError>(\n error.type,\n `${error.message} in field '${token.getField()}'`,\n );\n }\n\n break;\n }\n case \"day\": {\n if (tokenType === \"any\") {\n this._dayWildcard = true;\n }\n\n const [error, _] = this.handleField(\n token,\n this.day,\n CronDayRange.min,\n CronDayRange.max,\n );\n\n if (error) {\n return err<CronParsingError>(\n error.type,\n `${error.message} in field '${token.getField()}'`,\n );\n }\n\n break;\n }\n case \"month\": {\n const [error, _] = this.handleField(\n token,\n this.month,\n CronMonthRange.min,\n CronMonthRange.max,\n );\n\n if (error) {\n return err<CronParsingError>(\n error.type,\n `${error.message} in field '${token.getField()}'`,\n );\n }\n\n break;\n }\n case \"weekday\": {\n if (tokenType === \"any\") {\n this._dowWildcard = true;\n }\n\n const [error, _] = this.handleField(\n token,\n this.dayOfWeek,\n CronDayOfWeekRange.min,\n CronDayOfWeekRange.max,\n );\n\n if (error) {\n return err<CronParsingError>(\n error.type,\n `${error.message} in field '${token.getField()}'`,\n );\n }\n\n break;\n }\n default:\n return err<CronParsingError>(\n \"InvalidValueError\",\n `Invalid field '${token.getField()}'`,\n );\n }\n }\n\n return ok(true);\n }\n\n private handleField(token: Token, field: number[], min: number, max: number) {\n switch (token.getTokenType()) {\n case \"any\": {\n this.fillRange(field, min, max);\n break;\n }\n case \"number\": {\n const [error, _] = this.handleNumber(\n token.getComponent(),\n field,\n min,\n max,\n );\n if (error) return err<CronParsingError>(error.type, error.message);\n\n break;\n }\n case \"range\": {\n const component = token.getComponent();\n const [error, _] = this.handleRange(component, field, min, max);\n if (error) return err<CronParsingError>(error.type, error.message);\n\n break;\n }\n case \"step\": {\n const component = token.getComponent();\n const [error, _] = this.handleStep(component, field, min, max);\n if (error) return err<CronParsingError>(error.type, error.message);\n\n break;\n }\n default:\n return err<CronParsingError>(\n \"InvalidValueError\",\n `Invalid token type '${token.getTokenType()}'`,\n );\n }\n\n return ok(true);\n }\n\n public matches(date: Date) {\n // Extract date/time components\n const s = date.getSeconds();\n const m = date.getMinutes();\n const h = date.getHours();\n const d = date.getDate();\n const mon = date.getMonth();\n const dow = date.getDay();\n\n // Check each component against configured values\n const isSecondMatch = this.hasSeconds ? this.second[s] === 1 : true;\n const isMinuteMatch = this.minute[m] === 1;\n const isHourMatch = this.hour[h] === 1;\n const isMonthMatch = this.month[mon + 1] === 1;\n\n // Standard cron: when both day-of-month and day-of-week are restricted (not *),\n // fire if EITHER matches. When at least one is *, use AND (the wildcard is always 1).\n let isDayOrDowMatch: boolean;\n\n if (!this._dayWildcard && !this._dowWildcard) {\n isDayOrDowMatch = this.day[d] === 1 || this.dayOfWeek[dow] === 1;\n } else {\n isDayOrDowMatch = this.day[d] === 1 && this.dayOfWeek[dow] === 1;\n }\n\n return (\n isSecondMatch &&\n isMinuteMatch &&\n isHourMatch &&\n isDayOrDowMatch &&\n isMonthMatch\n );\n }\n\n public getNextRun() {\n const now = new Date();\n const date = new Date(now);\n\n // Start from next minute/second\n if (this.hasSeconds) {\n date.setMilliseconds(0);\n date.setSeconds(date.getSeconds() + 1);\n } else {\n date.setSeconds(0, 0);\n date.setMinutes(date.getMinutes() + 1);\n }\n\n // Search up to 4 years to cover leap-day schedules (next Feb 29 can be ~4 years away)\n const maxIterations = this.hasSeconds\n ? 366 * 4 * 24 * 3600\n : 366 * 4 * 24 * 60;\n\n for (let i = 0; i < maxIterations; i++) {\n if (this.matches(date)) {\n const freshNow = new Date();\n\n // Ensure match is still in the future\n if (date > freshNow) {\n return new Date(date);\n }\n }\n\n // Increment time\n if (this.hasSeconds) {\n date.setSeconds(date.getSeconds() + 1);\n } else {\n date.setMinutes(date.getMinutes() + 1);\n }\n }\n\n return null;\n }\n\n public start() {\n if (this.status !== \"idle\") return;\n\n this.status = \"running\";\n this.next();\n }\n\n public stop() {\n this.status = \"idle\";\n\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n }\n\n public pause() {\n if (this.status !== \"running\") return;\n\n this.status = \"paused\";\n\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n }\n\n public resume() {\n if (this.status !== \"paused\") return;\n\n this.status = \"running\";\n this.next();\n }\n\n public getStatus() {\n return this.status;\n }\n\n private next() {\n if (this.status !== \"running\") return;\n\n const nextRun = this.getNextRun();\n\n if (!nextRun) {\n this.timeoutId = setTimeout(() => this.next(), RETRY_DELAY_MS);\n return;\n }\n\n const delay = nextRun.getTime() - Date.now();\n\n const actualDelay = Math.max(0, delay);\n\n this.timeoutId = setTimeout(() => {\n this.run();\n }, actualDelay);\n }\n\n private async run() {\n if (this.status !== \"running\") return;\n\n const handlerResult = this.options.handler();\n await mightThrow(Promise.resolve(handlerResult));\n\n if (this.status === \"running\") {\n this.next();\n }\n }\n}\n"],"mappings":"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"}
|