@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.
- package/dist/bootstrap/index.d.ts +7 -0
- package/dist/bootstrap/index.d.ts.map +1 -0
- package/dist/bootstrap/index.js +16 -0
- package/dist/bootstrap/index.js.map +1 -0
- package/dist/build/service.d.ts +28 -0
- package/dist/build/service.d.ts.map +1 -0
- package/dist/build/service.js +71 -0
- package/dist/build/service.js.map +1 -0
- package/dist/cache/index.d.ts +31 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +110 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/category/service.d.ts +21 -0
- package/dist/category/service.d.ts.map +1 -0
- package/dist/category/service.js +67 -0
- package/dist/category/service.js.map +1 -0
- package/dist/content/field-resolver.d.ts +31 -0
- package/dist/content/field-resolver.d.ts.map +1 -0
- package/dist/content/field-resolver.js +40 -0
- package/dist/content/field-resolver.js.map +1 -0
- package/dist/content/post-types.d.ts +28 -0
- package/dist/content/post-types.d.ts.map +1 -0
- package/dist/content/post-types.js +127 -0
- package/dist/content/post-types.js.map +1 -0
- package/dist/content/publisher.d.ts +26 -0
- package/dist/content/publisher.d.ts.map +1 -0
- package/dist/content/publisher.js +156 -0
- package/dist/content/publisher.js.map +1 -0
- package/dist/content/service.d.ts +53 -0
- package/dist/content/service.d.ts.map +1 -0
- package/dist/content/service.js +335 -0
- package/dist/content/service.js.map +1 -0
- package/dist/deployment/service.d.ts +25 -0
- package/dist/deployment/service.d.ts.map +1 -0
- package/dist/deployment/service.js +102 -0
- package/dist/deployment/service.js.map +1 -0
- package/dist/events/bus.d.ts +25 -0
- package/dist/events/bus.d.ts.map +1 -0
- package/dist/events/bus.js +89 -0
- package/dist/events/bus.js.map +1 -0
- package/dist/events/store.d.ts +19 -0
- package/dist/events/store.d.ts.map +1 -0
- package/dist/events/store.js +52 -0
- package/dist/events/store.js.map +1 -0
- package/dist/fields/clone.d.ts +2 -0
- package/dist/fields/clone.d.ts.map +1 -0
- package/dist/fields/clone.js +3 -0
- package/dist/fields/clone.js.map +1 -0
- package/dist/fields/conditional.d.ts +2 -0
- package/dist/fields/conditional.d.ts.map +1 -0
- package/dist/fields/conditional.js +3 -0
- package/dist/fields/conditional.js.map +1 -0
- package/dist/fields/index.d.ts +5 -0
- package/dist/fields/index.d.ts.map +1 -0
- package/dist/fields/index.js +6 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/fields/location-rules.d.ts +16 -0
- package/dist/fields/location-rules.d.ts.map +1 -0
- package/dist/fields/location-rules.js +22 -0
- package/dist/fields/location-rules.js.map +1 -0
- package/dist/fields/service.d.ts +77 -0
- package/dist/fields/service.d.ts.map +1 -0
- package/dist/fields/service.js +278 -0
- package/dist/fields/service.js.map +1 -0
- package/dist/fields/types/registry.d.ts +20 -0
- package/dist/fields/types/registry.d.ts.map +1 -0
- package/dist/fields/types/registry.js +68 -0
- package/dist/fields/types/registry.js.map +1 -0
- package/dist/fields/types/validators/basic.d.ts +2 -0
- package/dist/fields/types/validators/basic.d.ts.map +1 -0
- package/dist/fields/types/validators/basic.js +3 -0
- package/dist/fields/types/validators/basic.js.map +1 -0
- package/dist/fields/types/validators/choice.d.ts +2 -0
- package/dist/fields/types/validators/choice.d.ts.map +1 -0
- package/dist/fields/types/validators/choice.js +3 -0
- package/dist/fields/types/validators/choice.js.map +1 -0
- package/dist/fields/types/validators/client-validate.d.ts +2 -0
- package/dist/fields/types/validators/client-validate.d.ts.map +1 -0
- package/dist/fields/types/validators/client-validate.js +3 -0
- package/dist/fields/types/validators/client-validate.js.map +1 -0
- package/dist/fields/types/validators/index.d.ts +8 -0
- package/dist/fields/types/validators/index.d.ts.map +1 -0
- package/dist/fields/types/validators/index.js +10 -0
- package/dist/fields/types/validators/index.js.map +1 -0
- package/dist/fields/types/validators/media.d.ts +2 -0
- package/dist/fields/types/validators/media.d.ts.map +1 -0
- package/dist/fields/types/validators/media.js +3 -0
- package/dist/fields/types/validators/media.js.map +1 -0
- package/dist/fields/types/validators/relational.d.ts +2 -0
- package/dist/fields/types/validators/relational.d.ts.map +1 -0
- package/dist/fields/types/validators/relational.js +3 -0
- package/dist/fields/types/validators/relational.js.map +1 -0
- package/dist/fields/types/validators/structural.d.ts +2 -0
- package/dist/fields/types/validators/structural.d.ts.map +1 -0
- package/dist/fields/types/validators/structural.js +3 -0
- package/dist/fields/types/validators/structural.js.map +1 -0
- package/dist/fields/validation.d.ts +16 -0
- package/dist/fields/validation.d.ts.map +1 -0
- package/dist/fields/validation.js +123 -0
- package/dist/fields/validation.js.map +1 -0
- package/dist/hooks/catalog.d.ts +20 -0
- package/dist/hooks/catalog.d.ts.map +1 -0
- package/dist/hooks/catalog.js +59 -0
- package/dist/hooks/catalog.js.map +1 -0
- package/dist/hooks/points.d.ts +26 -0
- package/dist/hooks/points.d.ts.map +1 -0
- package/dist/hooks/points.js +33 -0
- package/dist/hooks/points.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle/index.d.ts +17 -0
- package/dist/lifecycle/index.d.ts.map +1 -0
- package/dist/lifecycle/index.js +79 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/media/service.d.ts +32 -0
- package/dist/media/service.d.ts.map +1 -0
- package/dist/media/service.js +87 -0
- package/dist/media/service.js.map +1 -0
- package/dist/menu/service.d.ts +19 -0
- package/dist/menu/service.d.ts.map +1 -0
- package/dist/menu/service.js +64 -0
- package/dist/menu/service.js.map +1 -0
- package/dist/observability/audit.d.ts +26 -0
- package/dist/observability/audit.d.ts.map +1 -0
- package/dist/observability/audit.js +67 -0
- package/dist/observability/audit.js.map +1 -0
- package/dist/observability/event-audit.d.ts +8 -0
- package/dist/observability/event-audit.d.ts.map +1 -0
- package/dist/observability/event-audit.js +20 -0
- package/dist/observability/event-audit.js.map +1 -0
- package/dist/observability/index.d.ts +5 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +6 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/logger.d.ts +13 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +45 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +34 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +56 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/plugin/service.d.ts +32 -0
- package/dist/plugin/service.d.ts.map +1 -0
- package/dist/plugin/service.js +190 -0
- package/dist/plugin/service.js.map +1 -0
- package/dist/role/service.d.ts +19 -0
- package/dist/role/service.d.ts.map +1 -0
- package/dist/role/service.js +65 -0
- package/dist/role/service.js.map +1 -0
- package/dist/settings/service.d.ts +16 -0
- package/dist/settings/service.d.ts.map +1 -0
- package/dist/settings/service.js +64 -0
- package/dist/settings/service.js.map +1 -0
- package/dist/storage/driver.d.ts +20 -0
- package/dist/storage/driver.d.ts.map +1 -0
- package/dist/storage/driver.js +3 -0
- package/dist/storage/driver.js.map +1 -0
- package/dist/storage/drivers/local.d.ts +17 -0
- package/dist/storage/drivers/local.d.ts.map +1 -0
- package/dist/storage/drivers/local.js +88 -0
- package/dist/storage/drivers/local.js.map +1 -0
- package/dist/storage/drivers/s3.d.ts +28 -0
- package/dist/storage/drivers/s3.d.ts.map +1 -0
- package/dist/storage/drivers/s3.js +105 -0
- package/dist/storage/drivers/s3.js.map +1 -0
- package/dist/storage/index.d.ts +16 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +58 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/migrator.d.ts +18 -0
- package/dist/storage/migrator.d.ts.map +1 -0
- package/dist/storage/migrator.js +46 -0
- package/dist/storage/migrator.js.map +1 -0
- package/dist/tag/service.d.ts +13 -0
- package/dist/tag/service.d.ts.map +1 -0
- package/dist/tag/service.js +37 -0
- package/dist/tag/service.js.map +1 -0
- package/dist/taxonomies/service.d.ts +50 -0
- package/dist/taxonomies/service.d.ts.map +1 -0
- package/dist/taxonomies/service.js +179 -0
- package/dist/taxonomies/service.js.map +1 -0
- package/dist/tenant/context.d.ts +9 -0
- package/dist/tenant/context.d.ts.map +1 -0
- package/dist/tenant/context.js +67 -0
- package/dist/tenant/context.js.map +1 -0
- package/dist/tenant/service.d.ts +31 -0
- package/dist/tenant/service.d.ts.map +1 -0
- package/dist/tenant/service.js +90 -0
- package/dist/tenant/service.js.map +1 -0
- package/dist/theme/service.d.ts +16 -0
- package/dist/theme/service.d.ts.map +1 -0
- package/dist/theme/service.js +57 -0
- package/dist/theme/service.js.map +1 -0
- package/dist/user/service.d.ts +31 -0
- package/dist/user/service.d.ts.map +1 -0
- package/dist/user/service.js +95 -0
- package/dist/user/service.js.map +1 -0
- 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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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":"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"}
|
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":"AAAA,4CAA4C;AAE5C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE1E,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAO3D,MAAM,OAAO,oBAAoB;IACvB,KAAK,GAAG;QACd,WAAW,EAAE,EAAqB;QAClC,UAAU,EAAE,EAAqB;QACjC,UAAU,EAAE,EAAqB;QACjC,SAAS,EAAE,EAAqB;KACjC,CAAC;IACM,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,EAAE,CAAC,KAAgE,EAAE,IAAmB;QACtF,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAEnC,oFAAoF;QACpF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;QAClD,IAAI,SAAkB,CAAC;QACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;YAC5D,IAAI,CAAC;gBACH,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC7C,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAK,CAAC;gBAClB,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;oBACtB,MAAM,IAAI,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,SAAS,CAAC;QAClB,CAAC;QAED,mBAAmB;QACnB,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE/B,uBAAuB;QACvB,cAAc,EAAE,CAAC;QAEjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAElC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QAEtB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,QAAQ,CAAC,oBAAoB,EAAE,CAAC;QAEhC,MAAM,mBAAmB,EAAE,CAAC;QAC5B,MAAM,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,KAAgE;QACrF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,IAAI,UAAU,EAAE,KAAK,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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
|