@oktis-works/core 0.5.6 → 0.5.8
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.map +1 -1
- package/dist/bootstrap/index.js +5 -0
- package/dist/bootstrap/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/plugin/load.d.ts +8 -0
- package/dist/plugin/load.d.ts.map +1 -0
- package/dist/plugin/load.js +30 -0
- package/dist/plugin/load.js.map +1 -0
- package/dist/theme/service.d.ts +19 -1
- package/dist/theme/service.d.ts.map +1 -1
- package/dist/theme/service.js +93 -41
- package/dist/theme/service.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bootstrap/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bootstrap/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI7D,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,SAAS,CAAC,QAAQ,GAAE,gBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAY9F;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAIxF"}
|
package/dist/bootstrap/index.js
CHANGED
|
@@ -2,10 +2,15 @@
|
|
|
2
2
|
import { loadConfig } from '@oktis-works/config';
|
|
3
3
|
import { ApplicationLifecycle } from '../lifecycle/index.js';
|
|
4
4
|
import { establishTenantContext } from '../tenant/context.js';
|
|
5
|
+
import { syncEnabledPlugins } from '../plugin/load.js';
|
|
5
6
|
export async function bootstrap(_options = {}) {
|
|
6
7
|
const config = loadConfig();
|
|
7
8
|
const lifecycle = new ApplicationLifecycle(config);
|
|
8
9
|
await lifecycle.start();
|
|
10
|
+
// Plugins habilitados (ACTIVATED/RUNNING) entram no registry compartilhado
|
|
11
|
+
// de hooks. Internamente nunca lança: plugin quebrado ou banco indisponível
|
|
12
|
+
// não impedem o boot (isolamento de falha).
|
|
13
|
+
await syncEnabledPlugins();
|
|
9
14
|
return lifecycle;
|
|
10
15
|
}
|
|
11
16
|
export async function bootstrapForTenant(tenantId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bootstrap/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bootstrap/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAMvD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,WAA6B,EAAE;IAC7D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAEnD,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAExB,2EAA2E;IAC3E,4EAA4E;IAC5E,4CAA4C;IAC5C,MAAM,kBAAkB,EAAE,CAAC;IAE3B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACvD,MAAM,SAAS,GAAG,MAAM,SAAS,EAAE,CAAC;IACpC,MAAM,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -49,6 +49,7 @@ export { settingsService, SettingsService } from './settings/service.js';
|
|
|
49
49
|
export { categoryService, CategoryService } from './category/service.js';
|
|
50
50
|
export { tagService, TagService } from './tag/service.js';
|
|
51
51
|
export { pluginService, PluginService } from './plugin/service.js';
|
|
52
|
+
export { syncEnabledPlugins } from './plugin/load.js';
|
|
52
53
|
export { themeService, ThemeService } from './theme/service.js';
|
|
53
54
|
export { resolveExtensionDirectory } from './extensions/project-directories.js';
|
|
54
55
|
export { buildService, BuildService } from './build/service.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
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,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/E,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAG1F,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,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjJ,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,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -42,6 +42,7 @@ export { settingsService, SettingsService } from './settings/service.js';
|
|
|
42
42
|
export { categoryService, CategoryService } from './category/service.js';
|
|
43
43
|
export { tagService, TagService } from './tag/service.js';
|
|
44
44
|
export { pluginService, PluginService } from './plugin/service.js';
|
|
45
|
+
export { syncEnabledPlugins } from './plugin/load.js';
|
|
45
46
|
export { themeService, ThemeService } from './theme/service.js';
|
|
46
47
|
export { resolveExtensionDirectory } from './extensions/project-directories.js';
|
|
47
48
|
export { buildService, BuildService } from './build/service.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type PluginBootstrapResult } from '@oktis-works/plugin-runtime';
|
|
2
|
+
/**
|
|
3
|
+
* Sincroniza o registry de hooks com os plugins habilitados no banco.
|
|
4
|
+
* Idempotente: pode ser chamada no boot e depois de ativar/desativar um
|
|
5
|
+
* plugin pela API (reflete no processo na hora; web/worker no próximo restart).
|
|
6
|
+
*/
|
|
7
|
+
export declare function syncEnabledPlugins(): Promise<PluginBootstrapResult>;
|
|
8
|
+
//# sourceMappingURL=load.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/plugin/load.ts"],"names":[],"mappings":"AAUA,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAI3F;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAYzE"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// @oktis-works/core - Sincronização de plugins habilitados em runtime
|
|
2
|
+
//
|
|
3
|
+
// O PLUGIN.md promete que `register(registry)` é chamado quando o plugin é
|
|
4
|
+
// carregado — aqui o core cumpre isso para todos os processos (API, web,
|
|
5
|
+
// worker, dev): lê os plugins com status ACTIVATED/RUNNING no banco, importa
|
|
6
|
+
// o entrypoint e registra os hooks no registry compartilhado.
|
|
7
|
+
//
|
|
8
|
+
// Nunca lança: falha de banco, diretório ausente ou plugin quebrado são
|
|
9
|
+
// reportadas no resultado, sem derrubar o boot.
|
|
10
|
+
import { bootstrapPlugins } from '@oktis-works/plugin-runtime';
|
|
11
|
+
import { getConnection } from '@oktis-works/database';
|
|
12
|
+
import { resolveExtensionDirectory } from '../extensions/project-directories.js';
|
|
13
|
+
/**
|
|
14
|
+
* Sincroniza o registry de hooks com os plugins habilitados no banco.
|
|
15
|
+
* Idempotente: pode ser chamada no boot e depois de ativar/desativar um
|
|
16
|
+
* plugin pela API (reflete no processo na hora; web/worker no próximo restart).
|
|
17
|
+
*/
|
|
18
|
+
export async function syncEnabledPlugins() {
|
|
19
|
+
try {
|
|
20
|
+
return await bootstrapPlugins({
|
|
21
|
+
pluginsDir: resolveExtensionDirectory('plugin'),
|
|
22
|
+
sql: getConnection(),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
console.warn(`[plugins] sync indisponível: ${error instanceof Error ? error.message : String(error)}`);
|
|
27
|
+
return { enabled: [], loaded: [], unloaded: [], failed: [] };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/plugin/load.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,6EAA6E;AAC7E,8DAA8D;AAC9D,EAAE;AACF,wEAAwE;AACxE,gDAAgD;AAEhD,OAAO,EAAE,gBAAgB,EAA8B,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAEjF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,CAAC;QACH,OAAO,MAAM,gBAAgB,CAAC;YAC5B,UAAU,EAAE,yBAAyB,CAAC,QAAQ,CAAC;YAC/C,GAAG,EAAE,aAAa,EAAE;SACrB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CACV,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACzF,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC/D,CAAC;AACH,CAAC"}
|
package/dist/theme/service.d.ts
CHANGED
|
@@ -1,19 +1,37 @@
|
|
|
1
1
|
import type { Theme } from '@oktis-works/types';
|
|
2
2
|
export declare class ThemeService {
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Descobre temas presentes no diretório configurado do projeto e faz upsert
|
|
5
|
+
* por nome. aceita theme.json (atual) e manifest.json (legado — é o que o
|
|
6
|
+
* tema default distribuído usa). A listagem retornada é o estado do banco
|
|
7
|
+
* COMPLETO: temas removidos do disco continuam visíveis para desinstalação.
|
|
8
|
+
*/
|
|
4
9
|
syncFromDirectory(): Promise<Theme[]>;
|
|
10
|
+
/** Lê theme.json ou (fallback legado) manifest.json do diretório do tema. */
|
|
11
|
+
private readManifest;
|
|
5
12
|
list(): Promise<Theme[]>;
|
|
6
13
|
getById(id: string): Promise<Theme | null>;
|
|
7
14
|
getByName(name: string): Promise<Theme | null>;
|
|
15
|
+
/**
|
|
16
|
+
* Registra um tema enviado via API (instalação explícita). O manifesto
|
|
17
|
+
* precisa do contrato BUSI-022 completo (name, version, type, compatibility).
|
|
18
|
+
*/
|
|
8
19
|
install(input: {
|
|
9
20
|
name: string;
|
|
10
21
|
version: string;
|
|
11
22
|
manifest: Record<string, unknown>;
|
|
12
23
|
config?: Record<string, unknown>;
|
|
13
24
|
}): Promise<Theme>;
|
|
25
|
+
/**
|
|
26
|
+
* Ativa um tema DESATIVANDO os demais (invariante: um único ACTIVE por
|
|
27
|
+
* tenant, garantida também pelo índice parcial idx_themes_single_active).
|
|
28
|
+
*/
|
|
14
29
|
activate(id: string): Promise<Theme | null>;
|
|
15
30
|
deactivate(id: string): Promise<Theme | null>;
|
|
31
|
+
/** Tema ativo atual (fonte única lida pelo app web na renderização). */
|
|
16
32
|
getActive(): Promise<Theme | null>;
|
|
33
|
+
/** Atualiza o config (customizador) do tema — validado como objeto simples. */
|
|
34
|
+
updateConfig(id: string, config: unknown): Promise<Theme | null>;
|
|
17
35
|
uninstall(id: string): Promise<boolean>;
|
|
18
36
|
}
|
|
19
37
|
export declare const themeService: ThemeService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/theme/service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/theme/service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAahD,qBAAa,YAAY;IACvB;;;;;OAKG;IACG,iBAAiB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAwC3C,6EAA6E;YAC/D,YAAY;IAapB,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAMxB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAM1C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAMpD;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,KAAK,CAAC;IAqClB;;;OAGG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAsB3C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAgBnD,wEAAwE;IAClE,SAAS,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAUxC,+EAA+E;IACzE,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAiBhE,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAS9C;AAED,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|
package/dist/theme/service.js
CHANGED
|
@@ -2,9 +2,21 @@ import { randomUUID } from 'node:crypto';
|
|
|
2
2
|
import { readdir, readFile } from 'node:fs/promises';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { getConnection } from '@oktis-works/database';
|
|
5
|
+
import { checkExtensionCompatibility } from '@oktis-works/validation';
|
|
5
6
|
import { resolveExtensionDirectory } from '../extensions/project-directories.js';
|
|
7
|
+
/** Nomes de manifesto aceitos na descoberta (manifest.json = legado do tema default). */
|
|
8
|
+
const MANIFEST_FILENAMES = ['theme.json', 'manifest.json'];
|
|
9
|
+
const SAFE_NAME_RE = /^[a-z0-9][a-z0-9_-]*$/i;
|
|
10
|
+
function isPlainObject(value) {
|
|
11
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
12
|
+
}
|
|
6
13
|
export class ThemeService {
|
|
7
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* Descobre temas presentes no diretório configurado do projeto e faz upsert
|
|
16
|
+
* por nome. aceita theme.json (atual) e manifest.json (legado — é o que o
|
|
17
|
+
* tema default distribuído usa). A listagem retornada é o estado do banco
|
|
18
|
+
* COMPLETO: temas removidos do disco continuam visíveis para desinstalação.
|
|
19
|
+
*/
|
|
8
20
|
async syncFromDirectory() {
|
|
9
21
|
const directory = resolveExtensionDirectory('theme');
|
|
10
22
|
let entries;
|
|
@@ -12,41 +24,46 @@ export class ThemeService {
|
|
|
12
24
|
entries = await readdir(directory, { withFileTypes: true });
|
|
13
25
|
}
|
|
14
26
|
catch {
|
|
15
|
-
|
|
27
|
+
// Sem diretório/sem permissão: devolve o que já está registrado.
|
|
28
|
+
return this.list();
|
|
16
29
|
}
|
|
17
|
-
const discovered = new Set();
|
|
18
30
|
const sql = getConnection();
|
|
19
31
|
for (const entry of entries) {
|
|
20
32
|
if (!entry.isDirectory())
|
|
21
33
|
continue;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const raw = await readFile(join(directory, entry.name, 'theme.json'), 'utf8');
|
|
25
|
-
manifest = JSON.parse(raw);
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
// Um diretório sem theme.json válido não é um tema instalável.
|
|
34
|
+
const manifest = await this.readManifest(join(directory, entry.name));
|
|
35
|
+
if (!manifest)
|
|
29
36
|
continue;
|
|
30
|
-
}
|
|
31
37
|
const name = typeof manifest['name'] === 'string' ? manifest['name'].trim() : '';
|
|
32
38
|
const version = typeof manifest['version'] === 'string' ? manifest['version'].trim() : '';
|
|
33
39
|
if (!name || !version)
|
|
34
40
|
continue;
|
|
35
|
-
discovered.add(name);
|
|
36
41
|
const existing = await this.getByName(name);
|
|
37
42
|
if (existing) {
|
|
38
43
|
const status = existing.status === 'INACTIVE' || existing.status === 'ACTIVE' ? existing.status : 'INSTALLED';
|
|
39
|
-
await sql.unsafe(`UPDATE themes SET version = $1, manifest = $2::jsonb, status = $3 WHERE id = $4`, [version, manifest, status, existing.id]);
|
|
44
|
+
await sql.unsafe(`UPDATE themes SET version = $1, manifest = $2::jsonb, status = $3, updated_at = NOW() WHERE id = $4`, [version, manifest, status, existing.id]);
|
|
40
45
|
}
|
|
41
46
|
else {
|
|
42
|
-
await sql.unsafe(`INSERT INTO themes (id, name, version, status, manifest, config, installed_at)
|
|
43
|
-
VALUES ($1, $2, $3, 'INSTALLED', $4::jsonb, $5::jsonb, NOW())`, [randomUUID(), name, version, manifest, {}]);
|
|
47
|
+
await sql.unsafe(`INSERT INTO themes (id, name, version, status, manifest, config, installed_at, updated_at)
|
|
48
|
+
VALUES ($1, $2, $3, 'INSTALLED', $4::jsonb, $5::jsonb, NOW(), NOW())`, [randomUUID(), name, version, manifest, {}]);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return this.list();
|
|
52
|
+
}
|
|
53
|
+
/** Lê theme.json ou (fallback legado) manifest.json do diretório do tema. */
|
|
54
|
+
async readManifest(themeDir) {
|
|
55
|
+
for (const filename of MANIFEST_FILENAMES) {
|
|
56
|
+
try {
|
|
57
|
+
const raw = await readFile(join(themeDir, filename), 'utf8');
|
|
58
|
+
const manifest = JSON.parse(raw);
|
|
59
|
+
if (isPlainObject(manifest))
|
|
60
|
+
return manifest;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// tenta o próximo nome candidato
|
|
44
64
|
}
|
|
45
65
|
}
|
|
46
|
-
|
|
47
|
-
return [];
|
|
48
|
-
const rows = await this.list();
|
|
49
|
-
return rows.filter((theme) => discovered.has(theme.name));
|
|
66
|
+
return null;
|
|
50
67
|
}
|
|
51
68
|
async list() {
|
|
52
69
|
const sql = getConnection();
|
|
@@ -63,55 +80,90 @@ export class ThemeService {
|
|
|
63
80
|
const result = await sql.unsafe('SELECT * FROM themes WHERE name = $1', [name]);
|
|
64
81
|
return result[0] ?? null;
|
|
65
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Registra um tema enviado via API (instalação explícita). O manifesto
|
|
85
|
+
* precisa do contrato BUSI-022 completo (name, version, type, compatibility).
|
|
86
|
+
*/
|
|
66
87
|
async install(input) {
|
|
88
|
+
const name = typeof input.name === 'string' ? input.name.trim() : '';
|
|
89
|
+
if (!SAFE_NAME_RE.test(name) || name.includes('..') || name.length > 100) {
|
|
90
|
+
throw new Error(`Invalid theme name: "${input.name}" (use [a-z0-9-_], max 100 chars)`);
|
|
91
|
+
}
|
|
92
|
+
const version = typeof input.version === 'string' ? input.version.trim() : '';
|
|
93
|
+
if (!version)
|
|
94
|
+
throw new Error('Theme version is required');
|
|
95
|
+
if (!isPlainObject(input.manifest)) {
|
|
96
|
+
throw new Error('Theme manifest must be an object');
|
|
97
|
+
}
|
|
98
|
+
// BUSI-022: o manifesto precisa declarar type: "theme" e compatibility.okcms.
|
|
99
|
+
const issues = checkExtensionCompatibility('theme', { ...input.manifest, name, version });
|
|
100
|
+
if (issues.length > 0) {
|
|
101
|
+
throw new Error(`Invalid theme manifest: ${issues.map((issue) => issue.message).join('; ')}`);
|
|
102
|
+
}
|
|
103
|
+
const duplicate = await this.getByName(name);
|
|
104
|
+
if (duplicate) {
|
|
105
|
+
throw new Error(`Theme "${name}" is already installed (id ${duplicate.id})`);
|
|
106
|
+
}
|
|
67
107
|
const sql = getConnection();
|
|
68
108
|
const id = randomUUID();
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
RETURNING *`, [
|
|
73
|
-
id,
|
|
74
|
-
input.name,
|
|
75
|
-
input.version,
|
|
76
|
-
'INSTALLED',
|
|
77
|
-
input.manifest,
|
|
78
|
-
input.config ?? {},
|
|
79
|
-
now,
|
|
80
|
-
]);
|
|
109
|
+
const result = await sql.unsafe(`INSERT INTO themes (id, name, version, status, manifest, config, installed_at, created_at, updated_at)
|
|
110
|
+
VALUES ($1, $2, $3, 'INSTALLED', $4::jsonb, $5::jsonb, NOW(), NOW(), NOW())
|
|
111
|
+
RETURNING *`, [id, name, version, { ...input.manifest, name, version }, input.config ?? {}]);
|
|
81
112
|
return result[0];
|
|
82
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Ativa um tema DESATIVANDO os demais (invariante: um único ACTIVE por
|
|
116
|
+
* tenant, garantida também pelo índice parcial idx_themes_single_active).
|
|
117
|
+
*/
|
|
83
118
|
async activate(id) {
|
|
84
|
-
const sql = getConnection();
|
|
85
119
|
const existing = await this.getById(id);
|
|
86
120
|
if (!existing)
|
|
87
121
|
return null;
|
|
122
|
+
const sql = getConnection();
|
|
123
|
+
await sql.unsafe(`UPDATE themes SET status = 'INACTIVE', updated_at = NOW()
|
|
124
|
+
WHERE status = 'ACTIVE' AND id <> $1`, [id]);
|
|
88
125
|
const result = await sql.unsafe(`UPDATE themes
|
|
89
|
-
SET status =
|
|
90
|
-
WHERE id = $
|
|
91
|
-
RETURNING *`, [
|
|
126
|
+
SET status = 'ACTIVE', activated_at = NOW(), updated_at = NOW()
|
|
127
|
+
WHERE id = $1
|
|
128
|
+
RETURNING *`, [id]);
|
|
92
129
|
return result[0] ?? null;
|
|
93
130
|
}
|
|
94
131
|
async deactivate(id) {
|
|
95
|
-
const sql = getConnection();
|
|
96
132
|
const existing = await this.getById(id);
|
|
97
133
|
if (!existing)
|
|
98
134
|
return null;
|
|
135
|
+
const sql = getConnection();
|
|
99
136
|
const result = await sql.unsafe(`UPDATE themes
|
|
100
|
-
SET status =
|
|
101
|
-
WHERE id = $
|
|
102
|
-
RETURNING *`, [
|
|
137
|
+
SET status = 'INACTIVE', updated_at = NOW()
|
|
138
|
+
WHERE id = $1
|
|
139
|
+
RETURNING *`, [id]);
|
|
103
140
|
return result[0] ?? null;
|
|
104
141
|
}
|
|
142
|
+
/** Tema ativo atual (fonte única lida pelo app web na renderização). */
|
|
105
143
|
async getActive() {
|
|
106
144
|
const sql = getConnection();
|
|
107
|
-
const result = await sql.unsafe(
|
|
145
|
+
const result = await sql.unsafe(`SELECT * FROM themes WHERE status = 'ACTIVE'
|
|
146
|
+
ORDER BY activated_at DESC NULLS LAST, created_at DESC
|
|
147
|
+
LIMIT 1`);
|
|
108
148
|
return result[0] ?? null;
|
|
109
149
|
}
|
|
110
|
-
|
|
150
|
+
/** Atualiza o config (customizador) do tema — validado como objeto simples. */
|
|
151
|
+
async updateConfig(id, config) {
|
|
152
|
+
if (!isPlainObject(config)) {
|
|
153
|
+
throw new Error('Theme config must be an object');
|
|
154
|
+
}
|
|
155
|
+
const existing = await this.getById(id);
|
|
156
|
+
if (!existing)
|
|
157
|
+
return null;
|
|
111
158
|
const sql = getConnection();
|
|
159
|
+
const result = await sql.unsafe(`UPDATE themes SET config = $1::jsonb, updated_at = NOW() WHERE id = $2 RETURNING *`, [config, id]);
|
|
160
|
+
return result[0] ?? null;
|
|
161
|
+
}
|
|
162
|
+
async uninstall(id) {
|
|
112
163
|
const existing = await this.getById(id);
|
|
113
164
|
if (!existing)
|
|
114
165
|
return false;
|
|
166
|
+
const sql = getConnection();
|
|
115
167
|
await sql.unsafe('DELETE FROM themes WHERE id = $1', [id]);
|
|
116
168
|
return true;
|
|
117
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/theme/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAEjF,MAAM,OAAO,YAAY;IACvB
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/theme/service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oktis-works/core",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.8",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
"@oktis-works/types": "^0.5.5",
|
|
25
25
|
"@oktis-works/validation": "^0.5.5",
|
|
26
26
|
"@oktis-works/config": "^0.5.5",
|
|
27
|
-
"@oktis-works/database": "^0.5.
|
|
28
|
-
"@oktis-works/plugin-runtime": "^0.5.
|
|
27
|
+
"@oktis-works/database": "^0.5.6",
|
|
28
|
+
"@oktis-works/plugin-runtime": "^0.5.6",
|
|
29
29
|
"@aws-sdk/client-s3": "3.700.0",
|
|
30
30
|
"bullmq": "5.0.0",
|
|
31
31
|
"ioredis": "5.3.0",
|