@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,123 @@
1
+ // @oktis-works/core - Field Validation Engine (ACF parity)
2
+ import { isVisibleField } from './conditional.js';
3
+ import { expandCloneFields } from './clone.js';
4
+ import { checkRequired, validateEmail, validateNumber, validateTextLike, validateUrl, } from './types/validators/basic.js';
5
+ import { validateCheckbox, validateRadio, validateSelect, validateTrueFalse, } from './types/validators/choice.js';
6
+ import { validateFile, validateGallery, validateImage } from './types/validators/media.js';
7
+ import { validateColorPicker, validateGoogleMap, validateLink, validateRelationshipIds, } from './types/validators/relational.js';
8
+ import { validateFlexible, validateRepeater, } from './types/validators/structural.js';
9
+ function isLayoutOnly(type) {
10
+ return ['message', 'tab', 'accordion'].includes(type);
11
+ }
12
+ export function validateFieldValue(field, value, siblingValues, errors, context) {
13
+ if (!isVisibleField(field, siblingValues))
14
+ return;
15
+ if (isLayoutOnly(field.type))
16
+ return;
17
+ const config = field.config ?? {};
18
+ const requiredOk = checkRequired(value, field.required, field.label, errors);
19
+ switch (field.type) {
20
+ case 'text':
21
+ case 'textarea':
22
+ case 'password':
23
+ validateTextLike(value, config, field.label, errors);
24
+ break;
25
+ case 'email':
26
+ validateTextLike(value, config, field.label, errors);
27
+ validateEmail(value, field.label, errors);
28
+ break;
29
+ case 'url':
30
+ case 'oembed':
31
+ validateUrl(value, field.label, errors);
32
+ break;
33
+ case 'number':
34
+ case 'range':
35
+ validateNumber(value, config, field.label, errors);
36
+ break;
37
+ case 'wysiwyg':
38
+ validateTextLike(value, config, field.label, errors);
39
+ break;
40
+ case 'select':
41
+ validateSelect(value, config, field.label, errors);
42
+ break;
43
+ case 'checkbox':
44
+ validateCheckbox(value, config, field.label, errors);
45
+ break;
46
+ case 'radio':
47
+ validateRadio(value, config, field.label, errors);
48
+ break;
49
+ case 'true_false':
50
+ validateTrueFalse(value, field.label, errors);
51
+ break;
52
+ case 'image':
53
+ validateImage(value, config, field.label, errors);
54
+ break;
55
+ case 'file':
56
+ validateFile(value, config, field.label, errors);
57
+ break;
58
+ case 'gallery':
59
+ validateGallery(value, config, field.label, errors);
60
+ break;
61
+ case 'link':
62
+ validateLink(value, field.label, errors);
63
+ break;
64
+ case 'page_link':
65
+ case 'post_object':
66
+ case 'relationship':
67
+ case 'taxonomy':
68
+ case 'user':
69
+ validateRelationshipIds(value, config, field.label, errors);
70
+ break;
71
+ case 'google_map':
72
+ validateGoogleMap(value, field.label, errors);
73
+ break;
74
+ case 'color_picker':
75
+ validateColorPicker(value, config, field.label, errors);
76
+ break;
77
+ default:
78
+ break;
79
+ }
80
+ if (field.type === 'repeater') {
81
+ validateRepeater(value, config, field.label, errors);
82
+ if (Array.isArray(value) && Array.isArray(field.subFields)) {
83
+ for (const row of value) {
84
+ if (typeof row !== 'object' || row === null)
85
+ continue;
86
+ validateFields(field.subFields, row, errors, context);
87
+ }
88
+ }
89
+ }
90
+ if (field.type === 'group') {
91
+ if (typeof value === 'object' && value !== null && !Array.isArray(value) && Array.isArray(field.subFields)) {
92
+ validateFields(field.subFields, value, errors, context);
93
+ }
94
+ }
95
+ if (field.type === 'flexible_content') {
96
+ validateFlexible(value, field.layouts, config, field.label, errors);
97
+ if (Array.isArray(value) && Array.isArray(field.layouts)) {
98
+ for (const row of value) {
99
+ const flexibleRow = row;
100
+ if (!flexibleRow || typeof flexibleRow.layout !== 'string' || typeof flexibleRow.data !== 'object')
101
+ continue;
102
+ const layout = field.layouts.find((entry) => entry.name === flexibleRow.layout);
103
+ if (layout && Array.isArray(layout.subFields)) {
104
+ validateFields(layout.subFields, flexibleRow.data ?? {}, errors, context);
105
+ }
106
+ }
107
+ }
108
+ }
109
+ void requiredOk;
110
+ }
111
+ export function validateFields(rawFields, data, errors, context) {
112
+ // Clones são expandidos antes da validação (ACF parity: seamless/group).
113
+ const fields = expandCloneFields(rawFields);
114
+ for (const field of fields) {
115
+ validateFieldValue(field, data[field.name], data, errors, context);
116
+ }
117
+ }
118
+ export function validateContentData(fields, data, context) {
119
+ const errors = [];
120
+ validateFields(fields, data, errors, context);
121
+ return { valid: errors.length === 0, errors };
122
+ }
123
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/fields/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface HookCatalogEntry {
2
+ hook: string;
3
+ type: 'action' | 'filter';
4
+ registered: boolean;
5
+ priorities: number[];
6
+ sources: string[];
7
+ total: number;
8
+ }
9
+ export interface HookCatalog {
10
+ generatedAt: string;
11
+ total: number;
12
+ entries: HookCatalogEntry[];
13
+ }
14
+ /**
15
+ * Gera o catálogo completo de hooks: todos os pontos conhecidos do core
16
+ * (HOOK_POINTS) mais qualquer hook registrado dinamicamente por plugins,
17
+ * com o estado atual de registros no HookRegistry.
18
+ */
19
+ export declare function getHookCatalog(): HookCatalog;
20
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/hooks/catalog.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAoD5C"}
@@ -0,0 +1,59 @@
1
+ // @oktis-works/core - Catálogo de hooks gerado a partir do registry (REQ-REQU-035-002)
2
+ import { getHookRegistry } from '@oktis-works/plugin-runtime';
3
+ import { HOOK_POINTS } from './points.js';
4
+ /**
5
+ * Gera o catálogo completo de hooks: todos os pontos conhecidos do core
6
+ * (HOOK_POINTS) mais qualquer hook registrado dinamicamente por plugins,
7
+ * com o estado atual de registros no HookRegistry.
8
+ */
9
+ export function getHookCatalog() {
10
+ const registry = getHookRegistry();
11
+ const registered = registry.listRegistered();
12
+ const byHook = new Map(registered.map((entry) => [entry.hook, entry]));
13
+ const known = new Set();
14
+ // Pontos estáticos entram direto; parametrizados são materializados com um
15
+ // valor de exemplo ('post') para aparecerem no catálogo.
16
+ for (const value of Object.values(HOOK_POINTS)) {
17
+ if (typeof value === 'string')
18
+ known.add(value);
19
+ else if (typeof value === 'function') {
20
+ try {
21
+ known.add(value('post'));
22
+ }
23
+ catch {
24
+ known.add(String(value));
25
+ }
26
+ }
27
+ }
28
+ const entries = [];
29
+ for (const hook of known) {
30
+ if (!hook)
31
+ continue;
32
+ const base = hook.split('{')[0];
33
+ const reg = byHook.get(hook) ?? byHook.get(base);
34
+ entries.push({
35
+ hook,
36
+ type: (reg?.type ?? (hook.startsWith('theme:data:') ? 'filter' : 'action')),
37
+ registered: Boolean(reg),
38
+ priorities: reg?.priorities ?? [],
39
+ sources: reg?.sources ?? [],
40
+ total: reg?.total ?? 0,
41
+ });
42
+ byHook.delete(hook);
43
+ if (reg)
44
+ byHook.delete(base);
45
+ }
46
+ for (const reg of byHook.values()) {
47
+ entries.push({
48
+ hook: reg.hook,
49
+ type: reg.type,
50
+ registered: true,
51
+ priorities: reg.priorities,
52
+ sources: reg.sources,
53
+ total: reg.total,
54
+ });
55
+ }
56
+ entries.sort((a, b) => a.hook.localeCompare(b.hook));
57
+ return { generatedAt: new Date().toISOString(), total: entries.length, entries };
58
+ }
59
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/hooks/catalog.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkB1C;;;;GAIG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAEvE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,2EAA2E;IAC3E,yDAAyD;IACzD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC3C,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,KAAK,CAAC,GAAG,CAAE,KAAwC,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/D,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAwB;YAClG,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC;YACxB,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,EAAE;YACjC,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,EAAE;YAC3B,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;SACvB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,GAAG;YAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAErD,OAAO,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AACnF,CAAC"}
@@ -0,0 +1,26 @@
1
+ export declare const HOOK_POINTS: {
2
+ readonly ADMIN_MENU: "blacklotus.admin.menu";
3
+ readonly ADMIN_DASHBOARD_SETUP: "plugin.admin:dashboard:setup";
4
+ readonly ADMIN_METABOXES: "plugin.admin:metaboxes";
5
+ readonly ADMIN_NOTICES: "admin:notices";
6
+ readonly MANAGE_COLUMNS: (type: string) => string;
7
+ readonly MANAGE_COLUMN_CONTENT: (type: string, key: string) => string;
8
+ readonly PLUGIN_ACTION_LINKS: "plugin.action:links";
9
+ readonly SETTINGS_DEFAULTS: (group: string) => string;
10
+ readonly BEFORE_SAVE_CONTENT: (type: string) => string;
11
+ readonly AFTER_SAVE_CONTENT: (type: string) => string;
12
+ readonly BEFORE_PUBLISH_CONTENT: (type: string) => string;
13
+ readonly AFTER_PUBLISH_CONTENT: (type: string) => string;
14
+ readonly BEFORE_DELETE_CONTENT: (type: string) => string;
15
+ readonly AFTER_DELETE_CONTENT: (type: string) => string;
16
+ readonly CONTENT_QUERY: "content:query";
17
+ readonly MEDIA_META: "media:meta";
18
+ readonly USER_PROFILE_FIELDS: "user:profile-fields";
19
+ readonly REST_RESPONSE: (resource: string) => string;
20
+ readonly THEME_DATA: (method: string) => string;
21
+ readonly THEME_BEFORE_RENDER: "theme:before:render";
22
+ readonly THEME_AFTER_RENDER: "theme:after:render";
23
+ readonly THEME_HEAD: "theme:head";
24
+ };
25
+ export declare function hooks(): import("@oktis-works/plugin-runtime").HookRegistry;
26
+ //# sourceMappingURL=points.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"points.d.ts","sourceRoot":"","sources":["../../src/hooks/points.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW;;;;;oCAMC,MAAM,KAAG,MAAM;2CACR,MAAM,OAAO,MAAM,KAAG,MAAM;;wCAI/B,MAAM,KAAG,MAAM;yCACd,MAAM,KAAG,MAAM;wCAChB,MAAM,KAAG,MAAM;4CACX,MAAM,KAAG,MAAM;2CAChB,MAAM,KAAG,MAAM;2CACf,MAAM,KAAG,MAAM;0CAChB,MAAM,KAAG,MAAM;;;;uCAIlB,MAAM,KAAG,MAAM;kCAGpB,MAAM,KAAG,MAAM;;;;CAI5B,CAAC;AAEX,wBAAgB,KAAK,uDAEpB"}
@@ -0,0 +1,33 @@
1
+ // @oktis-works/core - Hook Points (WordPress-style Extension Surface)
2
+ import { getHookRegistry } from '@oktis-works/plugin-runtime';
3
+ export const HOOK_POINTS = {
4
+ // Admin UI (FEAT-098)
5
+ ADMIN_MENU: 'blacklotus.admin.menu',
6
+ ADMIN_DASHBOARD_SETUP: 'plugin.admin:dashboard:setup',
7
+ ADMIN_METABOXES: 'plugin.admin:metaboxes',
8
+ ADMIN_NOTICES: 'admin:notices',
9
+ MANAGE_COLUMNS: (type) => `manage:${type}:columns`,
10
+ MANAGE_COLUMN_CONTENT: (type, key) => `manage:${type}:custom-column:${key}`,
11
+ PLUGIN_ACTION_LINKS: 'plugin.action:links',
12
+ // Data filters (FEAT-099)
13
+ SETTINGS_DEFAULTS: (group) => `settings:defaults:${group}`,
14
+ BEFORE_SAVE_CONTENT: (type) => `before_save_content_${type}`,
15
+ AFTER_SAVE_CONTENT: (type) => `after_save_content_${type}`,
16
+ BEFORE_PUBLISH_CONTENT: (type) => `before_publish_content_${type}`,
17
+ AFTER_PUBLISH_CONTENT: (type) => `after_publish_content_${type}`,
18
+ BEFORE_DELETE_CONTENT: (type) => `before_delete_content_${type}`,
19
+ AFTER_DELETE_CONTENT: (type) => `after_delete_content_${type}`,
20
+ CONTENT_QUERY: 'content:query',
21
+ MEDIA_META: 'media:meta',
22
+ USER_PROFILE_FIELDS: 'user:profile-fields',
23
+ REST_RESPONSE: (resource) => `rest:${resource}:response`,
24
+ // Theme delivery (FEAT-100)
25
+ THEME_DATA: (method) => `theme:data:${method}`,
26
+ THEME_BEFORE_RENDER: 'theme:before:render',
27
+ THEME_AFTER_RENDER: 'theme:after:render',
28
+ THEME_HEAD: 'theme:head',
29
+ };
30
+ export function hooks() {
31
+ return getHookRegistry();
32
+ }
33
+ //# sourceMappingURL=points.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"points.js","sourceRoot":"","sources":["../../src/hooks/points.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,sBAAsB;IACtB,UAAU,EAAE,uBAAuB;IACnC,qBAAqB,EAAE,8BAA8B;IACrD,eAAe,EAAE,wBAAwB;IACzC,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,UAAU,IAAI,UAAU;IAClE,qBAAqB,EAAE,CAAC,IAAY,EAAE,GAAW,EAAU,EAAE,CAAC,UAAU,IAAI,kBAAkB,GAAG,EAAE;IACnG,mBAAmB,EAAE,qBAAqB;IAE1C,0BAA0B;IAC1B,iBAAiB,EAAE,CAAC,KAAa,EAAU,EAAE,CAAC,qBAAqB,KAAK,EAAE;IAC1E,mBAAmB,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,uBAAuB,IAAI,EAAE;IAC5E,kBAAkB,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,sBAAsB,IAAI,EAAE;IAC1E,sBAAsB,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,0BAA0B,IAAI,EAAE;IAClF,qBAAqB,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,yBAAyB,IAAI,EAAE;IAChF,qBAAqB,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,yBAAyB,IAAI,EAAE;IAChF,oBAAoB,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,wBAAwB,IAAI,EAAE;IAC9E,aAAa,EAAE,eAAe;IAC9B,UAAU,EAAE,YAAY;IACxB,mBAAmB,EAAE,qBAAqB;IAC1C,aAAa,EAAE,CAAC,QAAgB,EAAU,EAAE,CAAC,QAAQ,QAAQ,WAAW;IAExE,4BAA4B;IAC5B,UAAU,EAAE,CAAC,MAAc,EAAU,EAAE,CAAC,cAAc,MAAM,EAAE;IAC9D,mBAAmB,EAAE,qBAAqB;IAC1C,kBAAkB,EAAE,oBAAoB;IACxC,UAAU,EAAE,YAAY;CAChB,CAAC;AAEX,MAAM,UAAU,KAAK;IACnB,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,52 @@
1
+ export { bootstrap, bootstrapForTenant } from './bootstrap/index.js';
2
+ export type { BootstrapOptions } from './bootstrap/index.js';
3
+ export { ApplicationLifecycle } from './lifecycle/index.js';
4
+ export type { LifecycleHook } from './lifecycle/index.js';
5
+ export { EventBus, createEventBus, getEventBus } from './events/bus.js';
6
+ export type { EventHandler, EventBusConfig } from './events/bus.js';
7
+ export { metrics, trackDeploymentProgress, MetricsRegistry, registerEventAuditLog } from './observability/index.js';
8
+ export { createLogger, AuditService, auditService } from './observability/index.js';
9
+ export type { Logger, LogLevel, AuditEntry, AuditFilter } from './observability/index.js';
10
+ export { MemoryCache, createCache, getCache } from './cache/index.js';
11
+ export type { CacheEntry } from './cache/index.js';
12
+ export { establishTenantContext, getCurrentContext, clearCurrentContext, requireTenantContext } from './tenant/context.js';
13
+ export type { TenantContext } from './tenant/context.js';
14
+ export { tenantService, TenantService } from './tenant/service.js';
15
+ export { userService, UserService } from './user/service.js';
16
+ export { roleService, RoleService } from './role/service.js';
17
+ export { contentService, ContentService } from './content/service.js';
18
+ export type { CreateContentInput, UpdateContentInput } from './content/service.js';
19
+ export { postTypeRegistry, PostTypeRegistry } from './content/post-types.js';
20
+ export type { ContentTypeDefinition } from './content/post-types.js';
21
+ export { taxonomyService, TaxonomyService } from './taxonomies/service.js';
22
+ export type { CustomTaxonomy, TaxonomyTerm } from './taxonomies/service.js';
23
+ export { fieldTypeRegistry, getFieldType, listFieldTypes, listFieldTypesByCategory, registerFieldType, FIELD_TYPE_CATEGORIES, } from './fields/types/registry.js';
24
+ export type { FieldCategory } from './fields/types/registry.js';
25
+ export { evaluateConditionalLogic, isVisibleField, findConditionalIssues, } from './fields/conditional.js';
26
+ export type { ConditionalLogic, ConditionalRule, ConditionalGroup, ConditionOperator } from './fields/conditional.js';
27
+ export { validateContentData, validateFieldValue, validateFields, } from './fields/validation.js';
28
+ export type { FieldError, ValidationResult } from './fields/validation.js';
29
+ export { matchLocationRules } from './fields/location-rules.js';
30
+ export type { LocationRule, LocationContext, LocationParam } from './fields/location-rules.js';
31
+ export { fieldGroupService, FieldGroupService } from './fields/service.js';
32
+ export type { FieldGroup, FieldGroupInput, FieldDefinitionInput, FlexibleLayoutInput } from './fields/service.js';
33
+ export { createStorageDriver, storage, StorageMigrator, createMigrator } from './storage/index.js';
34
+ export type { StorageDriver, StorageDriverName, StorageObject, MigrationResult } from './storage/index.js';
35
+ export { LocalStorageDriver } from './storage/drivers/local.js';
36
+ export { S3StorageDriver } from './storage/drivers/s3.js';
37
+ export { HOOK_POINTS, hooks } from './hooks/points.js';
38
+ export { getHookCatalog, type HookCatalog, type HookCatalogEntry } from './hooks/catalog.js';
39
+ export { contentFieldResolver, ContentFieldResolver } from './content/field-resolver.js';
40
+ export type { ContentFieldsResult } from './content/field-resolver.js';
41
+ export { contentPublisher, ContentPublisher } from './content/publisher.js';
42
+ export type { PublishResult } from './content/publisher.js';
43
+ export { mediaService, MediaService } from './media/service.js';
44
+ export { menuService, MenuService } from './menu/service.js';
45
+ export { settingsService, SettingsService } from './settings/service.js';
46
+ export { categoryService, CategoryService } from './category/service.js';
47
+ export { tagService, TagService } from './tag/service.js';
48
+ export { pluginService, PluginService } from './plugin/service.js';
49
+ export { themeService, ThemeService } from './theme/service.js';
50
+ export { buildService, BuildService } from './build/service.js';
51
+ export { deploymentService, DeploymentService } from './deployment/service.js';
52
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACpH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACpF,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG1F,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACtE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3H,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,YAAY,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC3E,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACtH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,GACf,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAGlH,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnG,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC3G,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG7F,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACzF,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,45 @@
1
+ // @oktis-works/core - Main Entry Point
2
+ // Bootstrap & Lifecycle
3
+ export { bootstrap, bootstrapForTenant } from './bootstrap/index.js';
4
+ export { ApplicationLifecycle } from './lifecycle/index.js';
5
+ // Events
6
+ export { EventBus, createEventBus, getEventBus } from './events/bus.js';
7
+ // Observability
8
+ export { metrics, trackDeploymentProgress, MetricsRegistry, registerEventAuditLog } from './observability/index.js';
9
+ export { createLogger, AuditService, auditService } from './observability/index.js';
10
+ // Cache
11
+ export { MemoryCache, createCache, getCache } from './cache/index.js';
12
+ // Tenant Context
13
+ export { establishTenantContext, getCurrentContext, clearCurrentContext, requireTenantContext } from './tenant/context.js';
14
+ // Core Services
15
+ export { tenantService, TenantService } from './tenant/service.js';
16
+ export { userService, UserService } from './user/service.js';
17
+ export { roleService, RoleService } from './role/service.js';
18
+ export { contentService, ContentService } from './content/service.js';
19
+ export { postTypeRegistry, PostTypeRegistry } from './content/post-types.js';
20
+ export { taxonomyService, TaxonomyService } from './taxonomies/service.js';
21
+ export { fieldTypeRegistry, getFieldType, listFieldTypes, listFieldTypesByCategory, registerFieldType, FIELD_TYPE_CATEGORIES, } from './fields/types/registry.js';
22
+ export { evaluateConditionalLogic, isVisibleField, findConditionalIssues, } from './fields/conditional.js';
23
+ export { validateContentData, validateFieldValue, validateFields, } from './fields/validation.js';
24
+ export { matchLocationRules } from './fields/location-rules.js';
25
+ export { fieldGroupService, FieldGroupService } from './fields/service.js';
26
+ // Storage
27
+ export { createStorageDriver, storage, StorageMigrator, createMigrator } from './storage/index.js';
28
+ export { LocalStorageDriver } from './storage/drivers/local.js';
29
+ export { S3StorageDriver } from './storage/drivers/s3.js';
30
+ // Hooks
31
+ export { HOOK_POINTS, hooks } from './hooks/points.js';
32
+ export { getHookCatalog } from './hooks/catalog.js';
33
+ // Field delivery
34
+ export { contentFieldResolver, ContentFieldResolver } from './content/field-resolver.js';
35
+ export { contentPublisher, ContentPublisher } from './content/publisher.js';
36
+ export { mediaService, MediaService } from './media/service.js';
37
+ export { menuService, MenuService } from './menu/service.js';
38
+ export { settingsService, SettingsService } from './settings/service.js';
39
+ export { categoryService, CategoryService } from './category/service.js';
40
+ export { tagService, TagService } from './tag/service.js';
41
+ export { pluginService, PluginService } from './plugin/service.js';
42
+ export { themeService, ThemeService } from './theme/service.js';
43
+ export { buildService, BuildService } from './build/service.js';
44
+ export { deploymentService, DeploymentService } from './deployment/service.js';
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Config } from '@oktis-works/config';
2
+ export interface LifecycleHook {
3
+ name: string;
4
+ handler: () => Promise<void>;
5
+ }
6
+ export declare class ApplicationLifecycle {
7
+ private hooks;
8
+ private started;
9
+ private config;
10
+ constructor(config: Config);
11
+ on(event: 'beforeStart' | 'afterStart' | 'beforeStop' | 'afterStop', hook: LifecycleHook): void;
12
+ start(): Promise<void>;
13
+ stop(): Promise<void>;
14
+ isStarted(): boolean;
15
+ private runHooks;
16
+ }
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycle/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAKX;IACF,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAI1B,EAAE,CAAC,KAAK,EAAE,aAAa,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;IAIzF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB3B,SAAS,IAAI,OAAO;YAIN,QAAQ;CASvB"}
@@ -0,0 +1,79 @@
1
+ // @oktis-works/core - Application Lifecycle
2
+ import { createConnection, closeConnection } from '@oktis-works/database';
3
+ import { createCache, getCache } from '../cache/index.js';
4
+ import { createEventBus, getEventBus } from '../events/bus.js';
5
+ import { clearCurrentContext } from '../tenant/context.js';
6
+ export class ApplicationLifecycle {
7
+ hooks = {
8
+ beforeStart: [],
9
+ afterStart: [],
10
+ beforeStop: [],
11
+ afterStop: [],
12
+ };
13
+ started = false;
14
+ config;
15
+ constructor(config) {
16
+ this.config = config;
17
+ }
18
+ on(event, hook) {
19
+ this.hooks[event].push(hook);
20
+ }
21
+ async start() {
22
+ if (this.started) {
23
+ throw new Error('Application already started');
24
+ }
25
+ await this.runHooks('beforeStart');
26
+ // Initialize database (core-bootstrap-002: retry com backoff em falhas transitivas)
27
+ const retries = this.config.database.retries ?? 3;
28
+ let lastError;
29
+ for (let attempt = 1; attempt <= Number(retries); attempt++) {
30
+ try {
31
+ await createConnection(this.config.database);
32
+ lastError = null;
33
+ break;
34
+ }
35
+ catch (error) {
36
+ lastError = error;
37
+ if (attempt < retries) {
38
+ await new Promise((resolveDelay) => setTimeout(resolveDelay, 250 * attempt));
39
+ }
40
+ }
41
+ }
42
+ if (lastError) {
43
+ throw lastError;
44
+ }
45
+ // Initialize cache
46
+ createCache(this.config.cache);
47
+ // Initialize event bus
48
+ createEventBus();
49
+ this.started = true;
50
+ await this.runHooks('afterStart');
51
+ }
52
+ async stop() {
53
+ if (!this.started)
54
+ return;
55
+ await this.runHooks('beforeStop');
56
+ const cache = getCache();
57
+ await cache.cleanup();
58
+ const eventBus = getEventBus();
59
+ eventBus.clearDeadLetterQueue();
60
+ await clearCurrentContext();
61
+ await closeConnection();
62
+ this.started = false;
63
+ await this.runHooks('afterStop');
64
+ }
65
+ isStarted() {
66
+ return this.started;
67
+ }
68
+ async runHooks(event) {
69
+ for (const hook of this.hooks[event]) {
70
+ try {
71
+ await hook.handler();
72
+ }
73
+ catch (error) {
74
+ console.error(`Lifecycle hook ${hook.name} failed:`, error);
75
+ }
76
+ }
77
+ }
78
+ }
79
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lifecycle/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Media } from '@oktis-works/types';
2
+ export declare class MediaService {
3
+ list(options: {
4
+ page?: number;
5
+ limit?: number;
6
+ mimeType?: string;
7
+ search?: string;
8
+ }): Promise<{
9
+ data: Media[];
10
+ total: number;
11
+ }>;
12
+ getById(id: string): Promise<Media | null>;
13
+ create(input: {
14
+ filename: string;
15
+ mimeType: string;
16
+ size: number;
17
+ path: string;
18
+ url: string;
19
+ alt?: string;
20
+ caption?: string;
21
+ metadata?: Record<string, unknown>;
22
+ uploadedBy: string;
23
+ }): Promise<Media>;
24
+ update(id: string, input: {
25
+ alt?: string;
26
+ caption?: string;
27
+ metadata?: Record<string, unknown>;
28
+ }): Promise<Media | null>;
29
+ delete(id: string): Promise<boolean>;
30
+ }
31
+ export declare const mediaService: MediaService;
32
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/media/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,qBAAa,YAAY;IACjB,IAAI,CAAC,OAAO,EAAE;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAiCvC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAM1C,MAAM,CAAC,KAAK,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,KAAK,CAAC;IA0BZ,MAAM,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GACA,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAmClB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAU3C;AAED,eAAO,MAAM,YAAY,cAAqB,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { getConnection } from '@oktis-works/database';
3
+ export class MediaService {
4
+ async list(options) {
5
+ const sql = getConnection();
6
+ const { page = 1, limit = 20, mimeType, search } = options;
7
+ const offset = (page - 1) * limit;
8
+ let whereClause = 'WHERE 1=1';
9
+ const params = [];
10
+ if (mimeType) {
11
+ whereClause += ` AND mime_type = $${params.length + 1}`;
12
+ params.push(mimeType);
13
+ }
14
+ if (search) {
15
+ whereClause += ` AND (filename ILIKE $${params.length + 1} OR alt ILIKE $${params.length + 2})`;
16
+ params.push(`%${search}%`);
17
+ params.push(`%${search}%`);
18
+ }
19
+ const dataResult = await sql.unsafe(`SELECT * FROM media ${whereClause} ORDER BY created_at DESC LIMIT ${limit} OFFSET ${offset}`, params);
20
+ const countResult = await sql.unsafe(`SELECT COUNT(*) as total FROM media ${whereClause}`, params);
21
+ return {
22
+ data: dataResult,
23
+ total: Number(countResult[0]?.['total'] ?? 0),
24
+ };
25
+ }
26
+ async getById(id) {
27
+ const sql = getConnection();
28
+ const result = await sql.unsafe('SELECT * FROM media WHERE id = $1', [id]);
29
+ return result[0] ?? null;
30
+ }
31
+ async create(input) {
32
+ const sql = getConnection();
33
+ const id = randomUUID();
34
+ const metadataJson = input.metadata ? JSON.stringify(input.metadata) : null;
35
+ const result = await sql.unsafe(`INSERT INTO media (id, filename, mime_type, size, path, url, alt, caption, metadata, uploaded_by)
36
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::jsonb, $10)
37
+ RETURNING *`, [
38
+ id,
39
+ input.filename,
40
+ input.mimeType,
41
+ input.size,
42
+ input.path,
43
+ input.url,
44
+ input.alt ?? null,
45
+ input.caption ?? null,
46
+ metadataJson,
47
+ input.uploadedBy,
48
+ ]);
49
+ return result[0];
50
+ }
51
+ async update(id, input) {
52
+ const sql = getConnection();
53
+ const existing = await this.getById(id);
54
+ if (!existing)
55
+ return null;
56
+ const setClauses = [];
57
+ const setParams = [];
58
+ if (input.alt !== undefined) {
59
+ setClauses.push(`alt = $${setParams.length + 1}`);
60
+ setParams.push(input.alt);
61
+ }
62
+ if (input.caption !== undefined) {
63
+ setClauses.push(`caption = $${setParams.length + 1}`);
64
+ setParams.push(input.caption);
65
+ }
66
+ if (input.metadata !== undefined) {
67
+ setClauses.push(`metadata = $${setParams.length + 1}::jsonb`);
68
+ setParams.push(JSON.stringify(input.metadata));
69
+ }
70
+ if (setClauses.length === 0)
71
+ return existing;
72
+ setClauses.push(`updated_at = NOW()`);
73
+ setParams.push(id);
74
+ const result = await sql.unsafe(`UPDATE media SET ${setClauses.join(', ')} WHERE id = $${setParams.length} RETURNING *`, setParams);
75
+ return result[0] ?? null;
76
+ }
77
+ async delete(id) {
78
+ const sql = getConnection();
79
+ const existing = await this.getById(id);
80
+ if (!existing)
81
+ return false;
82
+ await sql.unsafe('DELETE FROM media WHERE id = $1', [id]);
83
+ return true;
84
+ }
85
+ }
86
+ export const mediaService = new MediaService();
87
+ //# sourceMappingURL=service.js.map