@oktis-works/plugin-sdk 0.0.0-stage → 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.
@@ -0,0 +1,78 @@
1
+ export interface AdminMenuPage {
2
+ slug: string;
3
+ label: string;
4
+ capability?: string;
5
+ icon?: string;
6
+ position?: number;
7
+ }
8
+ export interface AdminSubmenuPage {
9
+ parentSlug: string;
10
+ slug: string;
11
+ label: string;
12
+ capability?: string;
13
+ position?: number;
14
+ }
15
+ export interface DashboardWidget {
16
+ id: string;
17
+ title: string;
18
+ render: 'component';
19
+ componentId: string;
20
+ columnsSpan?: 1 | 2 | 3 | 4;
21
+ }
22
+ export interface MetaBox {
23
+ id: string;
24
+ title: string;
25
+ /** Tipos de conteúdo onde a caixa aparece (ex.: ['post', 'page']). */
26
+ screens: string[];
27
+ context: 'normal' | 'side' | 'advanced';
28
+ priority: 'high' | 'default' | 'low';
29
+ componentId: string;
30
+ }
31
+ export interface AdminNotice {
32
+ id: string;
33
+ level: 'info' | 'success' | 'warning' | 'error';
34
+ message: string;
35
+ dismissible?: boolean;
36
+ }
37
+ export interface ColumnDefinition {
38
+ key: string;
39
+ label: string;
40
+ position?: 'before_title' | 'after_title' | 'end';
41
+ }
42
+ export interface PluginAdminApi {
43
+ addMenuPage(page: AdminMenuPage): void;
44
+ addSubmenuPage(page: AdminSubmenuPage): void;
45
+ addDashboardWidget(widget: DashboardWidget): void;
46
+ addMetaBox(box: MetaBox): void;
47
+ addNotice(notice: Omit<AdminNotice, 'id'> & {
48
+ id?: string;
49
+ }): void;
50
+ removeNotice(noticeId: string): void;
51
+ manageColumns(contentType: string, column: ColumnDefinition): void;
52
+ renderColumn(contentType: string, columnKey: string, componentId: string): void;
53
+ addActionLinks(links: Array<{
54
+ label: string;
55
+ url: string;
56
+ }>): void;
57
+ }
58
+ /**
59
+ * Estado declarativo coletado pelos pontos de extensão e consumido
60
+ * pelo app admin via slots nomeados (FEAT-098 / DECI-027).
61
+ */
62
+ export interface AdminExtensionsState {
63
+ menuPages: AdminMenuPage[];
64
+ submenuPages: AdminSubmenuPage[];
65
+ dashboardWidgets: DashboardWidget[];
66
+ metaBoxes: MetaBox[];
67
+ notices: AdminNotice[];
68
+ columns: Record<string, ColumnDefinition[]>;
69
+ columnRenderers: Record<string, Record<string, string>>;
70
+ actionLinks: Array<{
71
+ label: string;
72
+ url: string;
73
+ }>;
74
+ }
75
+ export declare function createPluginAdminApi(pluginId: string, state?: AdminExtensionsState): PluginAdminApi & {
76
+ state: AdminExtensionsState;
77
+ };
78
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"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"}
package/dist/admin.js ADDED
@@ -0,0 +1,55 @@
1
+ // @oktis-works/plugin-sdk - Admin UI Extension Points (declarative slots)
2
+ export function createPluginAdminApi(pluginId, state = emptyState()) {
3
+ const api = {
4
+ state,
5
+ addMenuPage(page) {
6
+ if (!page.capability || page.capability.length === 0) {
7
+ throw new Error(`[${pluginId}] addMenuPage exige uma capability explícita`);
8
+ }
9
+ state.menuPages.push(page);
10
+ },
11
+ addSubmenuPage(page) {
12
+ if (!page.capability || page.capability.length === 0) {
13
+ throw new Error(`[${pluginId}] addSubmenuPage exige uma capability explícita`);
14
+ }
15
+ state.submenuPages.push(page);
16
+ },
17
+ addDashboardWidget(widget) {
18
+ state.dashboardWidgets.push(widget);
19
+ },
20
+ addMetaBox(box) {
21
+ state.metaBoxes.push(box);
22
+ },
23
+ addNotice(notice) {
24
+ state.notices.push({ ...notice, id: notice.id ?? `${pluginId}:${Date.now().toString(36)}:${state.notices.length}` });
25
+ },
26
+ removeNotice(noticeId) {
27
+ state.notices = state.notices.filter((notice) => notice.id !== noticeId);
28
+ },
29
+ manageColumns(contentType, column) {
30
+ const list = state.columns[contentType] ?? [];
31
+ list.push(column);
32
+ state.columns[contentType] = list;
33
+ },
34
+ renderColumn(contentType, columnKey, componentId) {
35
+ state.columnRenderers[contentType] = { ...(state.columnRenderers[contentType] ?? {}), [columnKey]: componentId };
36
+ },
37
+ addActionLinks(links) {
38
+ state.actionLinks.push(...links);
39
+ },
40
+ };
41
+ return api;
42
+ }
43
+ function emptyState() {
44
+ return {
45
+ menuPages: [],
46
+ submenuPages: [],
47
+ dashboardWidgets: [],
48
+ metaBoxes: [],
49
+ notices: [],
50
+ columns: {},
51
+ columnRenderers: {},
52
+ actionLinks: [],
53
+ };
54
+ }
55
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"AAAA,0EAA0E;AA4E1E,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,QAA8B,UAAU,EAAE;IAC/F,MAAM,GAAG,GAAqD;QAC5D,KAAK;QACL,WAAW,CAAC,IAAI;YACd,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,IAAI,QAAQ,8CAA8C,CAAC,CAAC;YAC9E,CAAC;YACD,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,cAAc,CAAC,IAAI;YACjB,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,IAAI,QAAQ,iDAAiD,CAAC,CAAC;YACjF,CAAC;YACD,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,kBAAkB,CAAC,MAAM;YACvB,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QACD,UAAU,CAAC,GAAG;YACZ,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;QACD,SAAS,CAAC,MAAM;YACd,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACvH,CAAC;QACD,YAAY,CAAC,QAAQ;YACnB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QAC3E,CAAC;QACD,aAAa,CAAC,WAAW,EAAE,MAAM;YAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClB,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;QACpC,CAAC;QACD,YAAY,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW;YAC9C,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;QACnH,CAAC;QACD,cAAc,CAAC,KAAK;YAClB,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU;IACjB,OAAO;QACL,SAAS,EAAE,EAAE;QACb,YAAY,EAAE,EAAE;QAChB,gBAAgB,EAAE,EAAE;QACpB,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,EAAE;QACnB,WAAW,EAAE,EAAE;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,66 @@
1
+ export interface HookRegistration {
2
+ action: string;
3
+ callback: (...args: unknown[]) => unknown;
4
+ priority: number;
5
+ acceptedArgs: number;
6
+ }
7
+ export interface PluginHooksApi {
8
+ addAction(action: string, callback: (...args: unknown[]) => unknown, options?: {
9
+ priority?: number;
10
+ acceptedArgs?: number;
11
+ }): void;
12
+ addFilter(filter: string, callback: (value: unknown, ...args: unknown[]) => unknown, options?: {
13
+ priority?: number;
14
+ acceptedArgs?: number;
15
+ }): void;
16
+ removeAction(action: string, callback: (...args: unknown[]) => unknown, priority?: number): boolean;
17
+ removeFilter(filter: string, callback: (...args: unknown[]) => unknown, priority?: number): boolean;
18
+ hasAction(action: string): boolean;
19
+ hasFilter(filter: string): boolean;
20
+ didAction(action: string): number;
21
+ currentHook(): string | null;
22
+ }
23
+ /**
24
+ * Nomes de pontos de extensão admin disponíveis para plugins (FEAT-098).
25
+ */
26
+ export declare const ADMIN_HOOK_POINTS: {
27
+ readonly MENU: "blacklotus.admin.menu";
28
+ readonly DASHBOARD_WIDGETS: "plugin.admin:dashboard:setup";
29
+ readonly METABOXES: "plugin.admin:metaboxes";
30
+ readonly NOTICES: "admin:notices";
31
+ readonly COLUMNS: "manage:{type}:columns";
32
+ readonly COLUMN_CONTENT: "manage:{type}:custom-column";
33
+ readonly ACTION_LINKS: "plugin.action:links";
34
+ };
35
+ /**
36
+ * Contrato estrutural do registry (implementado por @oktis-works/plugin-runtime).
37
+ * Evita dependência cíclica entre os pacotes.
38
+ */
39
+ export interface HookRegistryLike {
40
+ addAction(action: string, callback: (...args: unknown[]) => unknown, options?: {
41
+ priority?: number;
42
+ acceptedArgs?: number;
43
+ sourceId?: string;
44
+ sourceType?: 'core' | 'plugin';
45
+ }): void;
46
+ addFilter(filter: string, callback: (value: unknown, ...args: unknown[]) => unknown, options?: {
47
+ priority?: number;
48
+ acceptedArgs?: number;
49
+ sourceId?: string;
50
+ sourceType?: 'core' | 'plugin';
51
+ }): void;
52
+ removeAction(action: string, callback: (...args: unknown[]) => unknown, priority?: number): boolean;
53
+ removeFilter(filter: string, callback: (...args: unknown[]) => unknown, priority?: number): boolean;
54
+ hasAction(action: string, callback?: (...args: unknown[]) => unknown): boolean;
55
+ hasFilter(filter: string, callback?: (...args: unknown[]) => unknown): boolean;
56
+ didAction(action: string): number;
57
+ getCurrentHook(): string | null;
58
+ }
59
+ /**
60
+ * Fábrica da API pública de hooks exposta a um plugin específico.
61
+ * Todos os registros são atribuídos ao sourceId do plugin (BUSI-032/BUSI-033).
62
+ */
63
+ export declare function createPluginHooksApi(pluginId: string, registry: HookRegistryLike): PluginHooksApi & {
64
+ registrations: HookRegistration[];
65
+ };
66
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
package/dist/hooks.js ADDED
@@ -0,0 +1,50 @@
1
+ // @oktis-works/plugin-sdk - WordPress-style Hooks API
2
+ /**
3
+ * Nomes de pontos de extensão admin disponíveis para plugins (FEAT-098).
4
+ */
5
+ export const ADMIN_HOOK_POINTS = {
6
+ MENU: 'blacklotus.admin.menu',
7
+ DASHBOARD_WIDGETS: 'plugin.admin:dashboard:setup',
8
+ METABOXES: 'plugin.admin:metaboxes',
9
+ NOTICES: 'admin:notices',
10
+ COLUMNS: 'manage:{type}:columns',
11
+ COLUMN_CONTENT: 'manage:{type}:custom-column',
12
+ ACTION_LINKS: 'plugin.action:links',
13
+ };
14
+ /**
15
+ * Fábrica da API pública de hooks exposta a um plugin específico.
16
+ * Todos os registros são atribuídos ao sourceId do plugin (BUSI-032/BUSI-033).
17
+ */
18
+ export function createPluginHooksApi(pluginId, registry) {
19
+ const sourceId = pluginId;
20
+ return {
21
+ registrations: [],
22
+ addAction(action, callback, options) {
23
+ this.registrations.push({ action, callback, priority: options?.priority ?? 10, acceptedArgs: options?.acceptedArgs ?? callback.length });
24
+ registry.addAction(action, callback, { ...options, sourceId, sourceType: 'plugin' });
25
+ },
26
+ addFilter(filter, callback, options) {
27
+ this.registrations.push({ action: filter, callback: callback, priority: options?.priority ?? 10, acceptedArgs: options?.acceptedArgs ?? callback.length });
28
+ registry.addFilter(filter, callback, { ...options, sourceId, sourceType: 'plugin' });
29
+ },
30
+ removeAction(action, callback, priority) {
31
+ return registry.removeAction(action, callback, priority);
32
+ },
33
+ removeFilter(filter, callback, priority) {
34
+ return registry.removeFilter(filter, callback, priority);
35
+ },
36
+ hasAction(action) {
37
+ return registry.hasAction(action);
38
+ },
39
+ hasFilter(filter) {
40
+ return registry.hasFilter(filter);
41
+ },
42
+ didAction(action) {
43
+ return registry.didAction(action);
44
+ },
45
+ currentHook() {
46
+ return registry.getCurrentHook();
47
+ },
48
+ };
49
+ }
50
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAoBtD;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,uBAAuB;IAC7B,iBAAiB,EAAE,8BAA8B;IACjD,SAAS,EAAE,wBAAwB;IACnC,OAAO,EAAE,eAAe;IACxB,OAAO,EAAE,uBAAuB;IAChC,cAAc,EAAE,6BAA6B;IAC7C,YAAY,EAAE,qBAAqB;CAC3B,CAAC;AAiBX;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,QAA0B;IAC/E,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAE1B,OAAO;QACL,aAAa,EAAE,EAAE;QACjB,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO;YACjC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACzI,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO;YACjC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAA2C,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9L,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;YACrC,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3D,CAAC;QACD,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;YACrC,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3D,CAAC;QACD,SAAS,CAAC,MAAM;YACd,OAAO,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,SAAS,CAAC,MAAM;YACd,OAAO,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,SAAS,CAAC,MAAM;YACd,OAAO,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,WAAW;YACT,OAAO,QAAQ,CAAC,cAAc,EAAE,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { HookType, type PluginManifest, type PluginDependency, type PluginHook, type PluginHookHandler, type ContentField, type PluginContext, type PluginAPI, type RouteDefinition, type TenantInfo, type UserInfo, } from './types.js';
2
+ export { createPluginHooksApi, ADMIN_HOOK_POINTS, } from './hooks.js';
3
+ export type { PluginHooksApi, HookRegistration } from './hooks.js';
4
+ export { createPluginAdminApi, } from './admin.js';
5
+ export type { PluginAdminApi, AdminExtensionsState, AdminMenuPage, AdminSubmenuPage, DashboardWidget, MetaBox, AdminNotice, ColumnDefinition, } from './admin.js';
6
+ export { scopePluginCss, getPluginScopeAttribute, wrapWithPluginScope, } from './style-isolation.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,QAAQ,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnE,OAAO,EACL,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,OAAO,EACP,WAAW,EACX,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { HookType, } from './types.js';
2
+ export { createPluginHooksApi, ADMIN_HOOK_POINTS, } from './hooks.js';
3
+ export { createPluginAdminApi, } from './admin.js';
4
+ // Style isolation helpers (re-export do plugin-runtime para uso sem dependência circular)
5
+ export { scopePluginCss, getPluginScopeAttribute, wrapWithPluginScope, } from './style-isolation.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,GAWT,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAYpB,0FAA0F;AAC1F,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function scopePluginCss(css: string, pluginName: string, prefix?: string): string;
2
+ export declare function getPluginScopeAttribute(pluginName: string): {
3
+ attr: string;
4
+ selector: string;
5
+ dataAttr: string;
6
+ };
7
+ export declare function wrapWithPluginScope(html: string, pluginName: string): string;
8
+ //# sourceMappingURL=style-isolation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-isolation.d.ts","sourceRoot":"","sources":["../src/style-isolation.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAkC,GAAG,MAAM,CA2BhH;AACD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM;;;;EAA4I;AACtM,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAAiI"}
@@ -0,0 +1,73 @@
1
+ // @oktis-works/plugin-sdk - Style Isolation helpers (thin wrapper para evitar ciclo)
2
+ // Implementação canônica em @oktis-works/plugin-runtime/src/style-isolation.ts
3
+ export function scopePluginCss(css, pluginName, prefix = `[data-plugin="${pluginName}"]`) {
4
+ // delega para runtime quando disponível; fallback inline idem ao runtime
5
+ const isExcluded = (s) => s.trim().startsWith('@keyframes') || s.trim().startsWith('@font-face');
6
+ let out = '';
7
+ let i = 0;
8
+ const len = css.length;
9
+ while (i < len) {
10
+ if (css[i]?.trim() === '') {
11
+ out += css[i++];
12
+ continue;
13
+ }
14
+ if (css.startsWith('/*', i)) {
15
+ const end = css.indexOf('*/', i + 2);
16
+ const c = end === -1 ? css.slice(i) : css.slice(i, end + 2);
17
+ out += c;
18
+ i += c.length;
19
+ continue;
20
+ }
21
+ if (css[i] === '@') {
22
+ const semi = css.indexOf(';', i), brace = css.indexOf('{', i);
23
+ if (semi !== -1 && (brace === -1 || semi < brace)) {
24
+ out += css.slice(i, semi + 1);
25
+ i = semi + 1;
26
+ continue;
27
+ }
28
+ }
29
+ const braceIdx = css.indexOf('{', i);
30
+ if (braceIdx === -1) {
31
+ out += css.slice(i);
32
+ break;
33
+ }
34
+ const selectorPart = css.slice(i, braceIdx).trim();
35
+ let depth = 0, endIdx = -1;
36
+ for (let k = braceIdx; k < len; k++) {
37
+ if (css[k] === '{')
38
+ depth++;
39
+ else if (css[k] === '}') {
40
+ depth--;
41
+ if (depth === 0) {
42
+ endIdx = k;
43
+ break;
44
+ }
45
+ }
46
+ }
47
+ if (endIdx === -1) {
48
+ out += css.slice(i);
49
+ break;
50
+ }
51
+ const body = css.slice(braceIdx, endIdx + 1);
52
+ if (isExcluded(selectorPart)) {
53
+ out += css.slice(i, endIdx + 1);
54
+ }
55
+ else if (selectorPart.startsWith('@media') || selectorPart.startsWith('@supports')) {
56
+ const inner = css.slice(braceIdx + 1, endIdx);
57
+ out += `${selectorPart} {${scopePluginCss(inner, pluginName, prefix)}}`;
58
+ }
59
+ else if (selectorPart.startsWith('@')) {
60
+ out += `${selectorPart} {${css.slice(braceIdx + 1, endIdx)}}`;
61
+ }
62
+ else {
63
+ const sels = selectorPart.split(',').map(s => s.trim()).filter(Boolean);
64
+ const scoped = sels.map(sel => sel.includes(prefix) ? sel : (sel === ':root' || sel === 'html' || sel === 'body' ? prefix : sel.match(/:root|\bhtml\b|\bbody\b/) ? sel.replace(':root', prefix).replace(/\bhtml\b/, prefix).replace(/\bbody\b/, prefix) : `${prefix} ${sel}`));
65
+ out += `${scoped.join(', ')}${body}`;
66
+ }
67
+ i = endIdx + 1;
68
+ }
69
+ return out || css;
70
+ }
71
+ export function getPluginScopeAttribute(pluginName) { const e = pluginName.replace(/"/g, '&quot;'); return { attr: `data-plugin="${e}"`, selector: `[data-plugin="${e}"]`, dataAttr: 'data-plugin' }; }
72
+ export function wrapWithPluginScope(html, pluginName) { const { attr } = getPluginScopeAttribute(pluginName); return html.includes('data-plugin=') ? html : `<div ${attr}>${html}</div>`; }
73
+ //# sourceMappingURL=style-isolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-isolation.js","sourceRoot":"","sources":["../src/style-isolation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ export declare enum HookType {
2
+ BEFORE_CONTENT_CREATE = "beforeContentCreate",
3
+ AFTER_CONTENT_CREATE = "afterContentCreate",
4
+ BEFORE_CONTENT_UPDATE = "beforeContentUpdate",
5
+ AFTER_CONTENT_UPDATE = "afterContentUpdate",
6
+ BEFORE_CONTENT_DELETE = "beforeContentDelete",
7
+ AFTER_CONTENT_DELETE = "afterContentDelete",
8
+ ON_CONTENT_PUBLISH = "onContentPublish",
9
+ ON_CONTENT_UNPUBLISH = "onContentUnpublish",
10
+ ON_INSTALL = "onInstall",
11
+ ON_ACTIVATE = "onActivate",
12
+ ON_DEACTIVATE = "onDeactivate",
13
+ ON_UNINSTALL = "onUninstall",
14
+ ON_SETTINGS_PAGE = "onSettingsPage",
15
+ ON_ADMIN_MENU = "onAdminMenu"
16
+ }
17
+ export interface PluginManifest {
18
+ name: string;
19
+ version: string;
20
+ description?: string;
21
+ main: string;
22
+ hooks?: PluginHook[];
23
+ permissions?: string[];
24
+ dependencies?: PluginDependency[];
25
+ }
26
+ export interface PluginDependency {
27
+ name: string;
28
+ version: string;
29
+ required?: boolean;
30
+ }
31
+ export interface PluginHook {
32
+ type: HookType;
33
+ handler: PluginHookHandler;
34
+ }
35
+ export type PluginHookHandler = (context: PluginContext, payload: unknown) => void | Promise<void>;
36
+ export interface ContentField {
37
+ name: string;
38
+ type: string;
39
+ label: string;
40
+ required?: boolean;
41
+ options?: Record<string, unknown>;
42
+ }
43
+ export interface PluginContext {
44
+ tenantId: string;
45
+ userId: string;
46
+ requestId: string;
47
+ api: PluginAPI;
48
+ }
49
+ export interface PluginAPI {
50
+ registerHook(type: HookType, handler: PluginHookHandler): void;
51
+ addRoute(route: RouteDefinition): void;
52
+ addContentField(field: ContentField): void;
53
+ getSetting(key: string): Promise<unknown>;
54
+ setSetting(key: string, value: unknown): Promise<void>;
55
+ getTenant(): Promise<TenantInfo>;
56
+ getUser(): Promise<UserInfo>;
57
+ query<T>(sql: string, params?: unknown[]): Promise<T[]>;
58
+ emit(event: string, payload: unknown): Promise<void>;
59
+ }
60
+ export interface RouteDefinition {
61
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
62
+ path: string;
63
+ handler: (context: PluginContext, request: unknown) => Promise<unknown>;
64
+ }
65
+ export interface TenantInfo {
66
+ id: string;
67
+ name: string;
68
+ slug: string;
69
+ }
70
+ export interface UserInfo {
71
+ id: string;
72
+ email: string;
73
+ name: string;
74
+ }
75
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,18 @@
1
+ export var HookType;
2
+ (function (HookType) {
3
+ HookType["BEFORE_CONTENT_CREATE"] = "beforeContentCreate";
4
+ HookType["AFTER_CONTENT_CREATE"] = "afterContentCreate";
5
+ HookType["BEFORE_CONTENT_UPDATE"] = "beforeContentUpdate";
6
+ HookType["AFTER_CONTENT_UPDATE"] = "afterContentUpdate";
7
+ HookType["BEFORE_CONTENT_DELETE"] = "beforeContentDelete";
8
+ HookType["AFTER_CONTENT_DELETE"] = "afterContentDelete";
9
+ HookType["ON_CONTENT_PUBLISH"] = "onContentPublish";
10
+ HookType["ON_CONTENT_UNPUBLISH"] = "onContentUnpublish";
11
+ HookType["ON_INSTALL"] = "onInstall";
12
+ HookType["ON_ACTIVATE"] = "onActivate";
13
+ HookType["ON_DEACTIVATE"] = "onDeactivate";
14
+ HookType["ON_UNINSTALL"] = "onUninstall";
15
+ HookType["ON_SETTINGS_PAGE"] = "onSettingsPage";
16
+ HookType["ON_ADMIN_MENU"] = "onAdminMenu";
17
+ })(HookType || (HookType = {}));
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAeX;AAfD,WAAY,QAAQ;IAClB,yDAA6C,CAAA;IAC7C,uDAA2C,CAAA;IAC3C,yDAA6C,CAAA;IAC7C,uDAA2C,CAAA;IAC3C,yDAA6C,CAAA;IAC7C,uDAA2C,CAAA;IAC3C,mDAAuC,CAAA;IACvC,uDAA2C,CAAA;IAC3C,oCAAwB,CAAA;IACxB,sCAA0B,CAAA;IAC1B,0CAA8B,CAAA;IAC9B,wCAA4B,CAAA;IAC5B,+CAAmC,CAAA;IACnC,yCAA6B,CAAA;AAC/B,CAAC,EAfW,QAAQ,KAAR,QAAQ,QAenB"}
package/package.json CHANGED
@@ -1,6 +1,38 @@
1
1
  {
2
2
  "name": "@oktis-works/plugin-sdk",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "clean": "rm -rf dist tsconfig.tsbuildinfo"
17
+ },
18
+ "dependencies": {
19
+ "@oktis-works/types": "0.1.0"
20
+ },
21
+ "devDependencies": {
22
+ "typescript": "5.7.3",
23
+ "@oktis-works/plugin-runtime": "0.1.0"
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "publishConfig": {
29
+ "access": "public",
30
+ "registry": "https://registry.npmjs.org/"
31
+ },
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/blacklotus/blacklotus-cms",
36
+ "directory": "packages/plugin-sdk"
37
+ }
38
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.