@oktis-works/core 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.
Files changed (201) hide show
  1. package/dist/bootstrap/index.d.ts +7 -0
  2. package/dist/bootstrap/index.d.ts.map +1 -0
  3. package/dist/bootstrap/index.js +16 -0
  4. package/dist/bootstrap/index.js.map +1 -0
  5. package/dist/build/service.d.ts +28 -0
  6. package/dist/build/service.d.ts.map +1 -0
  7. package/dist/build/service.js +71 -0
  8. package/dist/build/service.js.map +1 -0
  9. package/dist/cache/index.d.ts +31 -0
  10. package/dist/cache/index.d.ts.map +1 -0
  11. package/dist/cache/index.js +110 -0
  12. package/dist/cache/index.js.map +1 -0
  13. package/dist/category/service.d.ts +21 -0
  14. package/dist/category/service.d.ts.map +1 -0
  15. package/dist/category/service.js +67 -0
  16. package/dist/category/service.js.map +1 -0
  17. package/dist/content/field-resolver.d.ts +31 -0
  18. package/dist/content/field-resolver.d.ts.map +1 -0
  19. package/dist/content/field-resolver.js +40 -0
  20. package/dist/content/field-resolver.js.map +1 -0
  21. package/dist/content/post-types.d.ts +28 -0
  22. package/dist/content/post-types.d.ts.map +1 -0
  23. package/dist/content/post-types.js +127 -0
  24. package/dist/content/post-types.js.map +1 -0
  25. package/dist/content/publisher.d.ts +26 -0
  26. package/dist/content/publisher.d.ts.map +1 -0
  27. package/dist/content/publisher.js +156 -0
  28. package/dist/content/publisher.js.map +1 -0
  29. package/dist/content/service.d.ts +53 -0
  30. package/dist/content/service.d.ts.map +1 -0
  31. package/dist/content/service.js +335 -0
  32. package/dist/content/service.js.map +1 -0
  33. package/dist/deployment/service.d.ts +25 -0
  34. package/dist/deployment/service.d.ts.map +1 -0
  35. package/dist/deployment/service.js +102 -0
  36. package/dist/deployment/service.js.map +1 -0
  37. package/dist/events/bus.d.ts +25 -0
  38. package/dist/events/bus.d.ts.map +1 -0
  39. package/dist/events/bus.js +89 -0
  40. package/dist/events/bus.js.map +1 -0
  41. package/dist/events/store.d.ts +19 -0
  42. package/dist/events/store.d.ts.map +1 -0
  43. package/dist/events/store.js +52 -0
  44. package/dist/events/store.js.map +1 -0
  45. package/dist/fields/clone.d.ts +2 -0
  46. package/dist/fields/clone.d.ts.map +1 -0
  47. package/dist/fields/clone.js +3 -0
  48. package/dist/fields/clone.js.map +1 -0
  49. package/dist/fields/conditional.d.ts +2 -0
  50. package/dist/fields/conditional.d.ts.map +1 -0
  51. package/dist/fields/conditional.js +3 -0
  52. package/dist/fields/conditional.js.map +1 -0
  53. package/dist/fields/index.d.ts +5 -0
  54. package/dist/fields/index.d.ts.map +1 -0
  55. package/dist/fields/index.js +6 -0
  56. package/dist/fields/index.js.map +1 -0
  57. package/dist/fields/location-rules.d.ts +16 -0
  58. package/dist/fields/location-rules.d.ts.map +1 -0
  59. package/dist/fields/location-rules.js +22 -0
  60. package/dist/fields/location-rules.js.map +1 -0
  61. package/dist/fields/service.d.ts +77 -0
  62. package/dist/fields/service.d.ts.map +1 -0
  63. package/dist/fields/service.js +278 -0
  64. package/dist/fields/service.js.map +1 -0
  65. package/dist/fields/types/registry.d.ts +20 -0
  66. package/dist/fields/types/registry.d.ts.map +1 -0
  67. package/dist/fields/types/registry.js +68 -0
  68. package/dist/fields/types/registry.js.map +1 -0
  69. package/dist/fields/types/validators/basic.d.ts +2 -0
  70. package/dist/fields/types/validators/basic.d.ts.map +1 -0
  71. package/dist/fields/types/validators/basic.js +3 -0
  72. package/dist/fields/types/validators/basic.js.map +1 -0
  73. package/dist/fields/types/validators/choice.d.ts +2 -0
  74. package/dist/fields/types/validators/choice.d.ts.map +1 -0
  75. package/dist/fields/types/validators/choice.js +3 -0
  76. package/dist/fields/types/validators/choice.js.map +1 -0
  77. package/dist/fields/types/validators/client-validate.d.ts +2 -0
  78. package/dist/fields/types/validators/client-validate.d.ts.map +1 -0
  79. package/dist/fields/types/validators/client-validate.js +3 -0
  80. package/dist/fields/types/validators/client-validate.js.map +1 -0
  81. package/dist/fields/types/validators/index.d.ts +8 -0
  82. package/dist/fields/types/validators/index.d.ts.map +1 -0
  83. package/dist/fields/types/validators/index.js +10 -0
  84. package/dist/fields/types/validators/index.js.map +1 -0
  85. package/dist/fields/types/validators/media.d.ts +2 -0
  86. package/dist/fields/types/validators/media.d.ts.map +1 -0
  87. package/dist/fields/types/validators/media.js +3 -0
  88. package/dist/fields/types/validators/media.js.map +1 -0
  89. package/dist/fields/types/validators/relational.d.ts +2 -0
  90. package/dist/fields/types/validators/relational.d.ts.map +1 -0
  91. package/dist/fields/types/validators/relational.js +3 -0
  92. package/dist/fields/types/validators/relational.js.map +1 -0
  93. package/dist/fields/types/validators/structural.d.ts +2 -0
  94. package/dist/fields/types/validators/structural.d.ts.map +1 -0
  95. package/dist/fields/types/validators/structural.js +3 -0
  96. package/dist/fields/types/validators/structural.js.map +1 -0
  97. package/dist/fields/validation.d.ts +16 -0
  98. package/dist/fields/validation.d.ts.map +1 -0
  99. package/dist/fields/validation.js +123 -0
  100. package/dist/fields/validation.js.map +1 -0
  101. package/dist/hooks/catalog.d.ts +20 -0
  102. package/dist/hooks/catalog.d.ts.map +1 -0
  103. package/dist/hooks/catalog.js +59 -0
  104. package/dist/hooks/catalog.js.map +1 -0
  105. package/dist/hooks/points.d.ts +26 -0
  106. package/dist/hooks/points.d.ts.map +1 -0
  107. package/dist/hooks/points.js +33 -0
  108. package/dist/hooks/points.js.map +1 -0
  109. package/dist/index.d.ts +52 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +45 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/lifecycle/index.d.ts +17 -0
  114. package/dist/lifecycle/index.d.ts.map +1 -0
  115. package/dist/lifecycle/index.js +79 -0
  116. package/dist/lifecycle/index.js.map +1 -0
  117. package/dist/media/service.d.ts +32 -0
  118. package/dist/media/service.d.ts.map +1 -0
  119. package/dist/media/service.js +87 -0
  120. package/dist/media/service.js.map +1 -0
  121. package/dist/menu/service.d.ts +19 -0
  122. package/dist/menu/service.d.ts.map +1 -0
  123. package/dist/menu/service.js +64 -0
  124. package/dist/menu/service.js.map +1 -0
  125. package/dist/observability/audit.d.ts +26 -0
  126. package/dist/observability/audit.d.ts.map +1 -0
  127. package/dist/observability/audit.js +67 -0
  128. package/dist/observability/audit.js.map +1 -0
  129. package/dist/observability/event-audit.d.ts +8 -0
  130. package/dist/observability/event-audit.d.ts.map +1 -0
  131. package/dist/observability/event-audit.js +20 -0
  132. package/dist/observability/event-audit.js.map +1 -0
  133. package/dist/observability/index.d.ts +5 -0
  134. package/dist/observability/index.d.ts.map +1 -0
  135. package/dist/observability/index.js +6 -0
  136. package/dist/observability/index.js.map +1 -0
  137. package/dist/observability/logger.d.ts +13 -0
  138. package/dist/observability/logger.d.ts.map +1 -0
  139. package/dist/observability/logger.js +45 -0
  140. package/dist/observability/logger.js.map +1 -0
  141. package/dist/observability/metrics.d.ts +34 -0
  142. package/dist/observability/metrics.d.ts.map +1 -0
  143. package/dist/observability/metrics.js +56 -0
  144. package/dist/observability/metrics.js.map +1 -0
  145. package/dist/plugin/service.d.ts +32 -0
  146. package/dist/plugin/service.d.ts.map +1 -0
  147. package/dist/plugin/service.js +190 -0
  148. package/dist/plugin/service.js.map +1 -0
  149. package/dist/role/service.d.ts +19 -0
  150. package/dist/role/service.d.ts.map +1 -0
  151. package/dist/role/service.js +65 -0
  152. package/dist/role/service.js.map +1 -0
  153. package/dist/settings/service.d.ts +16 -0
  154. package/dist/settings/service.d.ts.map +1 -0
  155. package/dist/settings/service.js +64 -0
  156. package/dist/settings/service.js.map +1 -0
  157. package/dist/storage/driver.d.ts +20 -0
  158. package/dist/storage/driver.d.ts.map +1 -0
  159. package/dist/storage/driver.js +3 -0
  160. package/dist/storage/driver.js.map +1 -0
  161. package/dist/storage/drivers/local.d.ts +17 -0
  162. package/dist/storage/drivers/local.d.ts.map +1 -0
  163. package/dist/storage/drivers/local.js +88 -0
  164. package/dist/storage/drivers/local.js.map +1 -0
  165. package/dist/storage/drivers/s3.d.ts +28 -0
  166. package/dist/storage/drivers/s3.d.ts.map +1 -0
  167. package/dist/storage/drivers/s3.js +105 -0
  168. package/dist/storage/drivers/s3.js.map +1 -0
  169. package/dist/storage/index.d.ts +16 -0
  170. package/dist/storage/index.d.ts.map +1 -0
  171. package/dist/storage/index.js +58 -0
  172. package/dist/storage/index.js.map +1 -0
  173. package/dist/storage/migrator.d.ts +18 -0
  174. package/dist/storage/migrator.d.ts.map +1 -0
  175. package/dist/storage/migrator.js +46 -0
  176. package/dist/storage/migrator.js.map +1 -0
  177. package/dist/tag/service.d.ts +13 -0
  178. package/dist/tag/service.d.ts.map +1 -0
  179. package/dist/tag/service.js +37 -0
  180. package/dist/tag/service.js.map +1 -0
  181. package/dist/taxonomies/service.d.ts +50 -0
  182. package/dist/taxonomies/service.d.ts.map +1 -0
  183. package/dist/taxonomies/service.js +179 -0
  184. package/dist/taxonomies/service.js.map +1 -0
  185. package/dist/tenant/context.d.ts +9 -0
  186. package/dist/tenant/context.d.ts.map +1 -0
  187. package/dist/tenant/context.js +67 -0
  188. package/dist/tenant/context.js.map +1 -0
  189. package/dist/tenant/service.d.ts +31 -0
  190. package/dist/tenant/service.d.ts.map +1 -0
  191. package/dist/tenant/service.js +90 -0
  192. package/dist/tenant/service.js.map +1 -0
  193. package/dist/theme/service.d.ts +16 -0
  194. package/dist/theme/service.d.ts.map +1 -0
  195. package/dist/theme/service.js +57 -0
  196. package/dist/theme/service.js.map +1 -0
  197. package/dist/user/service.d.ts +31 -0
  198. package/dist/user/service.d.ts.map +1 -0
  199. package/dist/user/service.js +95 -0
  200. package/dist/user/service.js.map +1 -0
  201. package/package.json +48 -0
@@ -0,0 +1,25 @@
1
+ import type { Deployment } from '@oktis-works/types';
2
+ export declare class DeploymentService {
3
+ list(options: {
4
+ page?: number;
5
+ limit?: number;
6
+ status?: string;
7
+ }): Promise<{
8
+ data: Deployment[];
9
+ total: number;
10
+ }>;
11
+ getById(id: string): Promise<Deployment | null>;
12
+ create(input: {
13
+ buildId: string;
14
+ coreVersion: string;
15
+ themeVersion?: string;
16
+ pluginVersions?: Record<string, string>;
17
+ checksum: string;
18
+ createdBy: string;
19
+ }): Promise<Deployment>;
20
+ activate(id: string): Promise<Deployment | null>;
21
+ rollback(id: string, rollbackToId: string): Promise<Deployment | null>;
22
+ updateHealthCheck(id: string, status: string): Promise<Deployment | null>;
23
+ }
24
+ export declare const deploymentService: DeploymentService;
25
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/deployment/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,qBAAa,iBAAiB;IACtB,IAAI,CAAC,OAAO,EAAE;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA6B5C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAM/C,MAAM,CAAC,KAAK,EAAE;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,UAAU,CAAC;IAwBjB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA0BhD,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAmCtE,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CAehF;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { getConnection } from '@oktis-works/database';
3
+ export class DeploymentService {
4
+ async list(options) {
5
+ const sql = getConnection();
6
+ const page = Math.max(1, Math.floor(options.page ?? 1));
7
+ const limit = Math.min(100, Math.max(1, Math.floor(options.limit ?? 20)));
8
+ const offset = (page - 1) * limit;
9
+ let whereClause = 'WHERE 1=1';
10
+ const params = [];
11
+ if (status) {
12
+ whereClause += ` AND status = $${params.length + 1}`;
13
+ params.push(status);
14
+ }
15
+ const dataResult = await sql.unsafe(`SELECT * FROM deployments ${whereClause} ORDER BY created_at DESC LIMIT $${params.length + 1} OFFSET $${params.length + 2}`, [...params, String(limit), String(offset)]);
16
+ const countResult = await sql.unsafe(`SELECT COUNT(*) as total FROM deployments ${whereClause}`, params);
17
+ return {
18
+ data: dataResult,
19
+ total: Number(countResult[0]?.['total'] ?? 0),
20
+ };
21
+ }
22
+ async getById(id) {
23
+ const sql = getConnection();
24
+ const result = await sql.unsafe('SELECT * FROM deployments WHERE id = $1', [id]);
25
+ return result[0] ?? null;
26
+ }
27
+ async create(input) {
28
+ const sql = getConnection();
29
+ const id = randomUUID();
30
+ const now = new Date().toISOString();
31
+ const result = await sql.unsafe(`INSERT INTO deployments (id, status, build_id, core_version, theme_version, plugin_versions, checksum, created_by, started_at, created_at, updated_at)
32
+ VALUES ($1, 'PENDING', $2, $3, $4, $5::jsonb, $6, $7, NOW(), $8, $8)
33
+ RETURNING *`, [
34
+ id,
35
+ input.buildId,
36
+ input.coreVersion,
37
+ input.themeVersion ?? null,
38
+ JSON.stringify(input.pluginVersions ?? {}),
39
+ input.checksum,
40
+ input.createdBy,
41
+ now,
42
+ ]);
43
+ return result[0];
44
+ }
45
+ async activate(id) {
46
+ const sql = getConnection();
47
+ const existing = await this.getById(id);
48
+ if (!existing)
49
+ return null;
50
+ if (!['PENDING', 'HEALTH_CHECK', 'FAILED', 'CANCELLED'].includes(existing.status)) {
51
+ throw new Error(`Invalid deployment transition: ${existing.status} → ACTIVE`);
52
+ }
53
+ return sql.begin(async (tx) => {
54
+ await tx.unsafe(`UPDATE deployments
55
+ SET status = 'ROLLED_BACK', updated_at = NOW()
56
+ WHERE status = 'ACTIVE' AND id <> $1`, [id]);
57
+ const result = await tx.unsafe(`UPDATE deployments
58
+ SET status = 'ACTIVE', completed_at = NOW(), updated_at = NOW()
59
+ WHERE id = $1 AND status IN ('PENDING', 'HEALTH_CHECK', 'FAILED', 'CANCELLED')
60
+ RETURNING *`, [id]);
61
+ return result[0] ?? null;
62
+ });
63
+ }
64
+ async rollback(id, rollbackToId) {
65
+ const sql = getConnection();
66
+ const existing = await this.getById(id);
67
+ if (!existing)
68
+ return null;
69
+ const target = await this.getById(rollbackToId);
70
+ if (!target)
71
+ return null;
72
+ if (target.status === 'ROLLED_BACK' || target.status === 'CANCELLED') {
73
+ throw new Error(`Cannot roll back to deployment in status ${target.status}`);
74
+ }
75
+ return sql.begin(async (tx) => {
76
+ await tx.unsafe(`UPDATE deployments
77
+ SET status = 'ROLLED_BACK', updated_at = NOW()
78
+ WHERE status = 'ACTIVE' AND id <> $1`, [rollbackToId]);
79
+ await tx.unsafe(`UPDATE deployments
80
+ SET status = 'ROLLED_BACK', rollback_to_id = $1, completed_at = NOW(), updated_at = NOW()
81
+ WHERE id = $2`, [rollbackToId, id]);
82
+ const result = await tx.unsafe(`UPDATE deployments
83
+ SET status = 'ACTIVE', completed_at = NOW(), updated_at = NOW()
84
+ WHERE id = $1
85
+ RETURNING *`, [rollbackToId]);
86
+ return result[0] ?? null;
87
+ });
88
+ }
89
+ async updateHealthCheck(id, status) {
90
+ const sql = getConnection();
91
+ const existing = await this.getById(id);
92
+ if (!existing)
93
+ return null;
94
+ const result = await sql.unsafe(`UPDATE deployments
95
+ SET health_check_status = $1, updated_at = NOW()
96
+ WHERE id = $2
97
+ RETURNING *`, [status, id]);
98
+ return result[0] ?? null;
99
+ }
100
+ }
101
+ export const deploymentService = new DeploymentService();
102
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/deployment/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Event } from '@oktis-works/types';
2
+ import type { EventStore } from './store.js';
3
+ export type EventHandler = (event: Event) => Promise<void>;
4
+ export interface EventBusConfig {
5
+ maxRetries: number;
6
+ retryDelay: number;
7
+ deadLetterQueueEnabled: boolean;
8
+ }
9
+ export declare class EventBus {
10
+ private handlers;
11
+ private deadLetterQueue;
12
+ private config;
13
+ private store?;
14
+ constructor(config?: Partial<EventBusConfig>, store?: EventStore);
15
+ on(eventType: string, handler: EventHandler): void;
16
+ off(eventType: string, handler: EventHandler): void;
17
+ emit(event: Event): Promise<void>;
18
+ emitSync(event: Event): Promise<void>;
19
+ private executeWithRetry;
20
+ getDeadLetterQueue(): Event[];
21
+ clearDeadLetterQueue(): void;
22
+ }
23
+ export declare function getEventBus(): EventBus;
24
+ export declare function createEventBus(config?: Partial<EventBusConfig>): EventBus;
25
+ //# sourceMappingURL=bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../src/events/bus.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAQD,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAAC,CAAa;gBAEf,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM,EAAE,KAAK,CAAC,EAAE,UAAU;IAKpE,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAMlD,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAQ7C,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBjC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;YAI7B,gBAAgB;IA4B9B,kBAAkB,IAAI,KAAK,EAAE;IAI7B,oBAAoB,IAAI,IAAI;CAG7B;AAID,wBAAgB,WAAW,IAAI,QAAQ,CAKtC;AAED,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,QAAQ,CAGzE"}
@@ -0,0 +1,89 @@
1
+ // @oktis-works/core - Event Bus
2
+ const defaultConfig = {
3
+ maxRetries: 3,
4
+ retryDelay: 1000,
5
+ deadLetterQueueEnabled: true,
6
+ };
7
+ export class EventBus {
8
+ handlers = new Map();
9
+ deadLetterQueue = [];
10
+ config;
11
+ store;
12
+ constructor(config = {}, store) {
13
+ this.config = { ...defaultConfig, ...config };
14
+ this.store = store;
15
+ }
16
+ on(eventType, handler) {
17
+ const handlers = this.handlers.get(eventType) ?? [];
18
+ handlers.push(handler);
19
+ this.handlers.set(eventType, handlers);
20
+ }
21
+ off(eventType, handler) {
22
+ const handlers = this.handlers.get(eventType) ?? [];
23
+ const index = handlers.indexOf(handler);
24
+ if (index > -1) {
25
+ handlers.splice(index, 1);
26
+ }
27
+ }
28
+ async emit(event) {
29
+ // RULE-event-idempotency: evento já processado não é reprocessado
30
+ if (this.store) {
31
+ if (await this.store.isProcessed(event.id))
32
+ return;
33
+ await this.store.persist(event);
34
+ }
35
+ const handlers = this.handlers.get(event.type) ?? [];
36
+ const allHandlers = [...handlers, ...this.handlers.get('*') ?? []];
37
+ const results = await Promise.allSettled(allHandlers.map(handler => this.executeWithRetry(handler, event, 0)));
38
+ const firstRejection = results.find((r) => r.status === 'rejected');
39
+ if (!firstRejection) {
40
+ if (this.store && allHandlers.length > 0)
41
+ await this.store.markProcessed(event.id);
42
+ return;
43
+ }
44
+ throw firstRejection.reason;
45
+ }
46
+ async emitSync(event) {
47
+ await this.emit(event);
48
+ }
49
+ async executeWithRetry(handler, event, attempt) {
50
+ try {
51
+ await handler(event);
52
+ }
53
+ catch (error) {
54
+ if (attempt < this.config.maxRetries) {
55
+ const delay = this.config.retryDelay * Math.pow(2, attempt);
56
+ await new Promise(resolve => setTimeout(resolve, delay));
57
+ await this.executeWithRetry(handler, event, attempt + 1);
58
+ }
59
+ else if (this.config.deadLetterQueueEnabled) {
60
+ this.deadLetterQueue.push(event);
61
+ if (this.store) {
62
+ await this.store.toDeadLetter(event, error instanceof Error ? error.message : String(error), this.config.maxRetries);
63
+ }
64
+ console.error(`Event ${event.type} sent to dead letter queue after ${this.config.maxRetries} attempts`);
65
+ }
66
+ else {
67
+ throw error;
68
+ }
69
+ }
70
+ }
71
+ getDeadLetterQueue() {
72
+ return [...this.deadLetterQueue];
73
+ }
74
+ clearDeadLetterQueue() {
75
+ this.deadLetterQueue = [];
76
+ }
77
+ }
78
+ let _eventBus = null;
79
+ export function getEventBus() {
80
+ if (!_eventBus) {
81
+ _eventBus = new EventBus();
82
+ }
83
+ return _eventBus;
84
+ }
85
+ export function createEventBus(config) {
86
+ _eventBus = new EventBus(config);
87
+ return _eventBus;
88
+ }
89
+ //# sourceMappingURL=bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.js","sourceRoot":"","sources":["../../src/events/bus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Event } from '@oktis-works/types';
2
+ export interface DeadLetterEntry extends Event {
3
+ error: string;
4
+ attempts: number;
5
+ }
6
+ /**
7
+ * Persistência de eventos com idempotência por id:
8
+ * - persist é ON CONFLICT DO NOTHING (emit duplicado não reprocessa)
9
+ * - processed marca conclusão de todos os handlers
10
+ * - DLQ durável sobrevive a restarts (replaces fila em memória)
11
+ */
12
+ export declare class EventStore {
13
+ isProcessed(eventId: string): Promise<boolean>;
14
+ persist(event: Event): Promise<void>;
15
+ markProcessed(eventId: string): Promise<void>;
16
+ toDeadLetter(event: Event, error: string, attempts: number): Promise<void>;
17
+ listDeadLetter(limit?: number): Promise<DeadLetterEntry[]>;
18
+ }
19
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/events/store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,WAAW,eAAgB,SAAQ,KAAK;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,UAAU;IACf,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ9C,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1E,cAAc,CAAC,KAAK,SAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAY9D"}
@@ -0,0 +1,52 @@
1
+ // @oktis-works/core - Persistent Event Store (RULE-event-idempotency)
2
+ import { getConnection } from '@oktis-works/database';
3
+ /**
4
+ * Persistência de eventos com idempotência por id:
5
+ * - persist é ON CONFLICT DO NOTHING (emit duplicado não reprocessa)
6
+ * - processed marca conclusão de todos os handlers
7
+ * - DLQ durável sobrevive a restarts (replaces fila em memória)
8
+ */
9
+ export class EventStore {
10
+ async isProcessed(eventId) {
11
+ const sql = getConnection();
12
+ const result = await sql `
13
+ SELECT processed FROM events WHERE id = ${eventId}
14
+ `;
15
+ return result[0]?.processed === true;
16
+ }
17
+ async persist(event) {
18
+ const sql = getConnection();
19
+ await sql `
20
+ INSERT INTO events (id, type, aggregate_type, aggregate_id, payload, tenant_id, processed)
21
+ VALUES (${event.id}, ${event.type}, ${event.aggregateType}, ${event.aggregateId},
22
+ ${JSON.stringify(event.payload)}::jsonb, ${event.tenantId ?? null}, false)
23
+ ON CONFLICT (id) DO NOTHING
24
+ `;
25
+ }
26
+ async markProcessed(eventId) {
27
+ const sql = getConnection();
28
+ await sql `UPDATE events SET processed = true WHERE id = ${eventId}`;
29
+ }
30
+ async toDeadLetter(event, error, attempts) {
31
+ const sql = getConnection();
32
+ await sql `
33
+ INSERT INTO dead_letter_events (id, type, aggregate_type, aggregate_id, payload, tenant_id, error, attempts)
34
+ VALUES (${event.id}, ${event.type}, ${event.aggregateType}, ${event.aggregateId},
35
+ ${JSON.stringify(event.payload)}::jsonb, ${event.tenantId ?? null}, ${error}, ${attempts})
36
+ ON CONFLICT (id) DO NOTHING
37
+ `;
38
+ }
39
+ async listDeadLetter(limit = 100) {
40
+ const sql = getConnection();
41
+ const clamped = Math.min(Math.max(limit, 1), 500);
42
+ const result = await sql `
43
+ SELECT id, type, aggregate_type AS "aggregateType", aggregate_id AS "aggregateId",
44
+ payload, tenant_id AS "tenantId", created_at AS "createdAt", error, attempts
45
+ FROM dead_letter_events
46
+ ORDER BY created_at DESC
47
+ LIMIT ${clamped}
48
+ `;
49
+ return result;
50
+ }
51
+ }
52
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/events/store.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAQtD;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IACrB,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,GAAG,CAA0B;gDACN,OAAO;KAClD,CAAC;QACF,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAY;QACxB,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,GAAG,CAAA;;gBAEG,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,WAAW;gBACrE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,KAAK,CAAC,QAAQ,IAAI,IAAI;;KAE1E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,GAAG,CAAA,iDAAiD,OAAO,EAAE,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAY,EAAE,KAAa,EAAE,QAAgB;QAC9D,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,GAAG,CAAA;;gBAEG,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,WAAW;gBACrE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,KAAK,CAAC,QAAQ,IAAI,IAAI,KAAK,KAAK,KAAK,QAAQ;;KAEjG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAK,GAAG,GAAG;QAC9B,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAmB;;;;;cAKjC,OAAO;KAChB,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export * from '@oktis-works/validation/clone';
2
+ //# sourceMappingURL=clone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone.d.ts","sourceRoot":"","sources":["../../src/fields/clone.ts"],"names":[],"mappings":"AACA,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Shim: implementação movida para @oktis-works/validation
2
+ export * from '@oktis-works/validation/clone';
3
+ //# sourceMappingURL=clone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone.js","sourceRoot":"","sources":["../../src/fields/clone.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from '@oktis-works/validation/conditional';
2
+ //# sourceMappingURL=conditional.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditional.d.ts","sourceRoot":"","sources":["../../src/fields/conditional.ts"],"names":[],"mappings":"AACA,cAAc,qCAAqC,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Shim: implementação movida para @oktis-works/validation
2
+ export * from '@oktis-works/validation/conditional';
3
+ //# sourceMappingURL=conditional.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditional.js","sourceRoot":"","sources":["../../src/fields/conditional.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,cAAc,qCAAqC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './types/registry.js';
2
+ export * from './conditional.js';
3
+ export * from './validation.js';
4
+ export * from './location-rules.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAEA,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,6 @@
1
+ // @oktis-works/core - Fields Module
2
+ export * from './types/registry.js';
3
+ export * from './conditional.js';
4
+ export * from './validation.js';
5
+ export * from './location-rules.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AAEpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type LocationParam = 'content_type' | 'taxonomy' | 'term' | 'user_role' | 'page_template' | 'post_status';
2
+ export interface LocationRule {
3
+ param: LocationParam;
4
+ operator: 'eq' | 'neq';
5
+ value: string;
6
+ }
7
+ export interface LocationContext {
8
+ contentType?: string;
9
+ taxonomy?: string;
10
+ termSlug?: string;
11
+ userRole?: string;
12
+ pageTemplate?: string;
13
+ postStatus?: string;
14
+ }
15
+ export declare function matchLocationRules(groups: LocationRule[][], context: LocationContext): boolean;
16
+ //# sourceMappingURL=location-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location-rules.d.ts","sourceRoot":"","sources":["../../src/fields/location-rules.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GACrB,cAAc,GACd,UAAU,GACV,MAAM,GACN,WAAW,GACX,eAAe,GACf,aAAa,CAAC;AAElB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,IAAI,GAAG,KAAK,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAqBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAM9F"}
@@ -0,0 +1,22 @@
1
+ // @oktis-works/core - Field Group Location Rules (ACF parity)
2
+ function matchesRule(rule, context) {
3
+ const actual = {
4
+ content_type: context.contentType,
5
+ taxonomy: context.taxonomy,
6
+ term: context.termSlug,
7
+ user_role: context.userRole,
8
+ page_template: context.pageTemplate,
9
+ post_status: context.postStatus,
10
+ };
11
+ const expected = actual[rule.param];
12
+ if (rule.operator === 'neq') {
13
+ return expected !== rule.value;
14
+ }
15
+ return expected === rule.value;
16
+ }
17
+ export function matchLocationRules(groups, context) {
18
+ if (!groups || groups.length === 0)
19
+ return false;
20
+ return groups.some((group) => group.length > 0 ? group.every((rule) => matchesRule(rule, context)) : false);
21
+ }
22
+ //# sourceMappingURL=location-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location-rules.js","sourceRoot":"","sources":["../../src/fields/location-rules.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAyB9D,SAAS,WAAW,CAAC,IAAkB,EAAE,OAAwB;IAC/D,MAAM,MAAM,GAA8C;QACxD,YAAY,EAAE,OAAO,CAAC,WAAW;QACjC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI,EAAE,OAAO,CAAC,QAAQ;QACtB,SAAS,EAAE,OAAO,CAAC,QAAQ;QAC3B,aAAa,EAAE,OAAO,CAAC,YAAY;QACnC,WAAW,EAAE,OAAO,CAAC,UAAU;KAChC,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC5B,OAAO,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC;IACjC,CAAC;IAED,OAAO,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAwB,EAAE,OAAwB;IACnF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEjD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC3B,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAC7E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,77 @@
1
+ import type { LocationContext, LocationRule } from './location-rules.js';
2
+ import type { ValidatableField } from './types/validators/structural.js';
3
+ export interface FlexibleLayoutInput {
4
+ name: string;
5
+ label: string;
6
+ display?: 'block' | 'table' | 'row';
7
+ min?: number;
8
+ max?: number;
9
+ subFields: FieldDefinitionInput[];
10
+ }
11
+ export interface FieldDefinitionInput {
12
+ id?: string;
13
+ type: string;
14
+ name: string;
15
+ key?: string;
16
+ label: string;
17
+ instructions?: string;
18
+ required?: boolean;
19
+ config?: Record<string, unknown>;
20
+ conditionalLogic?: unknown;
21
+ sortOrder?: number;
22
+ subFields?: FieldDefinitionInput[];
23
+ layouts?: FlexibleLayoutInput[];
24
+ }
25
+ export interface FieldGroupInput {
26
+ title: string;
27
+ key?: string;
28
+ locationRules?: LocationRule[][];
29
+ position?: 'normal' | 'side' | 'acf_after_title';
30
+ displayStyle?: 'standard' | 'seamless' | 'grouped';
31
+ active?: boolean;
32
+ fields?: FieldDefinitionInput[];
33
+ }
34
+ export interface FieldGroup extends Omit<FieldGroupInput, 'fields'> {
35
+ id: string;
36
+ fields: ResolvedFieldDefinition[];
37
+ }
38
+ export interface ResolvedFieldDefinition {
39
+ id: string;
40
+ type: string;
41
+ name: string;
42
+ key: string;
43
+ label: string;
44
+ instructions?: string;
45
+ required: boolean;
46
+ config: Record<string, unknown>;
47
+ conditionalLogic: unknown;
48
+ sortOrder: number;
49
+ subFields: ResolvedFieldDefinition[];
50
+ layouts: Array<{
51
+ name: string;
52
+ label: string;
53
+ display: string;
54
+ min?: number;
55
+ max?: number;
56
+ subFields: ResolvedFieldDefinition[];
57
+ }>;
58
+ }
59
+ export declare class FieldGroupService {
60
+ list(): Promise<Array<Omit<FieldGroup, 'fields'> & {
61
+ fieldCount: number;
62
+ }>>;
63
+ getById(id: string): Promise<FieldGroup | null>;
64
+ create(input: FieldGroupInput): Promise<FieldGroup>;
65
+ update(id: string, patch: Partial<FieldGroupInput>): Promise<FieldGroup | null>;
66
+ delete(id: string): Promise<boolean>;
67
+ resolveGroupsByLocation(context: LocationContext): Promise<FieldGroup[]>;
68
+ toValidatableFields(groups: FieldGroup[]): Promise<ValidatableField[]>;
69
+ private toValidatable;
70
+ private flattenForValidation;
71
+ private insertDefinition;
72
+ private getDefinitionTree;
73
+ private rowToDefinition;
74
+ private rowToGroup;
75
+ }
76
+ export declare const fieldGroupService: FieldGroupService;
77
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/fields/service.ts"],"names":[],"mappings":"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"}