@oktis-works/theme-sdk 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,80 @@
1
+ export interface ThemeField {
2
+ name: string;
3
+ label: string;
4
+ type: string;
5
+ value: unknown;
6
+ config?: Record<string, unknown>;
7
+ }
8
+ export interface FlexibleRow {
9
+ layout: string;
10
+ data: Record<string, unknown>;
11
+ }
12
+ export interface ContentLike {
13
+ id?: string;
14
+ type?: string;
15
+ title?: string | null;
16
+ slug?: string | null;
17
+ excerpt?: string | null;
18
+ status?: string;
19
+ authorId?: string | null;
20
+ featuredImageId?: string | null;
21
+ seoTitle?: string | null;
22
+ seoDescription?: string | null;
23
+ publishedAt?: Date | string | null;
24
+ createdAt?: Date | string;
25
+ updatedAt?: Date | string;
26
+ version?: number;
27
+ body?: Record<string, unknown> | null;
28
+ data?: Record<string, unknown> | null;
29
+ }
30
+ /** Contrato mínimo do registry de tipos (implementado por @oktis-works/core). */
31
+ export interface FieldTypeCatalogEntry {
32
+ type: string;
33
+ category: string;
34
+ isLayout?: boolean;
35
+ supportsConditions?: boolean;
36
+ }
37
+ export interface ThemeHooksLike {
38
+ applyFilters(filter: string, value: unknown, ...args: unknown[]): unknown;
39
+ applyFiltersAsync(filter: string, value: unknown, ...args: unknown[]): Promise<unknown>;
40
+ }
41
+ /**
42
+ * Registra o hook registry usado para os filtros theme:data:*.
43
+ * Chamado pelo bootstrap do app web.
44
+ */
45
+ export declare function setThemeHooks(hooks: ThemeHooksLike): void;
46
+ /** Define o conteúdo da request atual; temas passam a usar getField/getFields sem props. */
47
+ export declare function setCurrentContent(content: ContentLike): void;
48
+ export declare function getCurrentContent(): ContentLike | null;
49
+ export declare function clearCurrentContent(): void;
50
+ /** Executa fn com o conteúdo fixado no contexto (isolado por request via AsyncLocalStorage). */
51
+ export declare function runWithCurrentContent<T>(content: ContentLike, fn: () => T): T;
52
+ /** Campos padrão do conteúdo (colunas nativas), acessíveis igual aos customizados. */
53
+ export declare function getStandardFields(content: ContentLike): Record<string, unknown>;
54
+ /**
55
+ * Retorna todos os campos de um conteúdo: padrão + customizados (custom sobrescreve),
56
+ * passando pelo filtro theme:data:getFields.
57
+ * Sem argumento, usa o conteúdo da request (setCurrentContent/runWithCurrentContent).
58
+ */
59
+ export declare function getFields(content?: ContentLike): Record<string, unknown>;
60
+ /**
61
+ * Retorna o valor de um campo: customizado (body/data) primeiro, senão campo padrão.
62
+ * Aceita getField('title') com contexto ou getField(content, 'title') explícito.
63
+ */
64
+ export declare function getField(nameOrContent: string | ContentLike, maybeName?: string): unknown;
65
+ /**
66
+ * Retorna as seções de um campo flexible_content com seus dados,
67
+ * passando pelo filtro theme:data:getFlexibleLayouts.
68
+ */
69
+ export declare function getFlexibleLayouts(nameOrContent: string | ContentLike, maybeName?: string): FlexibleRow[];
70
+ /**
71
+ * Versão assíncrona de getFields — permite filtros que consultam dados remotos.
72
+ */
73
+ export declare function getFieldsAsync(content?: ContentLike): Promise<Record<string, unknown>>;
74
+ export declare const FIELD_CATALOG_METHOD = "theme:data:getFieldTypes";
75
+ /**
76
+ * Expõe o catálogo de tipos de campos ao tema via filtro
77
+ * (o catálogo canônico vive no core; temas podem estender via plugin).
78
+ */
79
+ export declare function getFieldTypes(catalog: FieldTypeCatalogEntry[]): FieldTypeCatalogEntry[];
80
+ //# sourceMappingURL=fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../src/fields.ts"],"names":[],"mappings":"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"}
package/dist/fields.js ADDED
@@ -0,0 +1,126 @@
1
+ // @oktis-works/theme-sdk - Field Delivery API (FEAT-087/FEAT-100)
2
+ import { AsyncLocalStorage } from 'node:async_hooks';
3
+ let hooksRef = null;
4
+ /**
5
+ * Registra o hook registry usado para os filtros theme:data:*.
6
+ * Chamado pelo bootstrap do app web.
7
+ */
8
+ export function setThemeHooks(hooks) {
9
+ hooksRef = hooks;
10
+ }
11
+ function applyDataFilter(method, payload, args = {}) {
12
+ if (!hooksRef)
13
+ return payload;
14
+ return hooksRef.applyFilters(`theme:data:${method}`, payload, args);
15
+ }
16
+ const contentStorage = new AsyncLocalStorage();
17
+ /** Define o conteúdo da request atual; temas passam a usar getField/getFields sem props. */
18
+ export function setCurrentContent(content) {
19
+ contentStorage.enterWith(content);
20
+ }
21
+ export function getCurrentContent() {
22
+ return contentStorage.getStore() ?? null;
23
+ }
24
+ export function clearCurrentContent() {
25
+ contentStorage.enterWith(undefined);
26
+ }
27
+ /** Executa fn com o conteúdo fixado no contexto (isolado por request via AsyncLocalStorage). */
28
+ export function runWithCurrentContent(content, fn) {
29
+ return contentStorage.run(content ?? {}, fn);
30
+ }
31
+ function resolveContent(content) {
32
+ const explicit = content ?? getCurrentContent();
33
+ return explicit && typeof explicit === 'object' ? explicit : null;
34
+ }
35
+ const STANDARD_KEYS = [
36
+ 'id', 'type', 'title', 'slug', 'excerpt', 'status', 'authorId', 'featuredImageId',
37
+ 'seoTitle', 'seoDescription', 'publishedAt', 'createdAt', 'updatedAt', 'version',
38
+ ];
39
+ function nativeValue(content, key) {
40
+ const snake = key.replace(/[A-Z]/g, (m) => `_${m.toLowerCase()}`);
41
+ const camel = content[key];
42
+ return camel !== undefined ? camel : content[snake];
43
+ }
44
+ /** Campos padrão do conteúdo (colunas nativas), acessíveis igual aos customizados. */
45
+ export function getStandardFields(content) {
46
+ const entries = {};
47
+ for (const key of STANDARD_KEYS) {
48
+ const value = nativeValue(content, key);
49
+ if (value !== undefined && value !== null)
50
+ entries[key] = value;
51
+ }
52
+ return entries;
53
+ }
54
+ function customFieldsOf(content) {
55
+ return (content.data ?? content.body ?? {});
56
+ }
57
+ /**
58
+ * Retorna todos os campos de um conteúdo: padrão + customizados (custom sobrescreve),
59
+ * passando pelo filtro theme:data:getFields.
60
+ * Sem argumento, usa o conteúdo da request (setCurrentContent/runWithCurrentContent).
61
+ */
62
+ export function getFields(content) {
63
+ const resolved = resolveContent(content);
64
+ if (!resolved)
65
+ return {};
66
+ const merged = { ...getStandardFields(resolved), ...customFieldsOf(resolved) };
67
+ return applyDataFilter('getFields', merged, {}) ?? {};
68
+ }
69
+ /**
70
+ * Retorna o valor de um campo: customizado (body/data) primeiro, senão campo padrão.
71
+ * Aceita getField('title') com contexto ou getField(content, 'title') explícito.
72
+ */
73
+ export function getField(nameOrContent, maybeName) {
74
+ const isContextual = typeof nameOrContent === 'string';
75
+ const name = isContextual ? nameOrContent : maybeName;
76
+ const content = resolveContent(isContextual ? undefined : nameOrContent);
77
+ if (!name || !content)
78
+ return undefined;
79
+ const custom = customFieldsOf(content);
80
+ const value = name in custom ? custom[name] : nativeValue(content, name);
81
+ return applyDataFilter('getField', value, { name });
82
+ }
83
+ /**
84
+ * Retorna as seções de um campo flexible_content com seus dados,
85
+ * passando pelo filtro theme:data:getFlexibleLayouts.
86
+ */
87
+ export function getFlexibleLayouts(nameOrContent, maybeName) {
88
+ const isContextual = typeof nameOrContent === 'string';
89
+ const name = isContextual ? nameOrContent : maybeName;
90
+ const content = resolveContent(isContextual ? undefined : nameOrContent);
91
+ if (!name || !content)
92
+ return [];
93
+ const custom = customFieldsOf(content);
94
+ const value = name in custom ? custom[name] : nativeValue(content, name);
95
+ if (!Array.isArray(value))
96
+ return [];
97
+ return value
98
+ .filter((row) => {
99
+ return typeof row === 'object' && row !== null && typeof row.layout === 'string';
100
+ })
101
+ .map((row) => ({
102
+ layout: row.layout,
103
+ data: applyDataFilter('getFlexibleLayouts', row.data ?? {}, { name, layout: row.layout }),
104
+ }));
105
+ }
106
+ /**
107
+ * Versão assíncrona de getFields — permite filtros que consultam dados remotos.
108
+ */
109
+ export async function getFieldsAsync(content) {
110
+ const resolved = resolveContent(content);
111
+ if (!resolved)
112
+ return {};
113
+ const merged = { ...getStandardFields(resolved), ...customFieldsOf(resolved) };
114
+ if (!hooksRef)
115
+ return merged;
116
+ return (await hooksRef.applyFiltersAsync('theme:data:getFields', merged, {})) ?? {};
117
+ }
118
+ export const FIELD_CATALOG_METHOD = 'theme:data:getFieldTypes';
119
+ /**
120
+ * Expõe o catálogo de tipos de campos ao tema via filtro
121
+ * (o catálogo canônico vive no core; temas podem estender via plugin).
122
+ */
123
+ export function getFieldTypes(catalog) {
124
+ return (applyDataFilter('getFieldTypes', catalog, {}) ?? catalog);
125
+ }
126
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../src/fields.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type { ComponentType, SettingType, ThemeSetting, ThemeComponent, ThemeProvides, ThemeManifest, RenderContext, PageProps, StyleEngine, ThemeStyleConfig, } from "./types.js";
2
+ export { getFields, getField, getFlexibleLayouts, getFieldsAsync, getFieldTypes, setThemeHooks, setCurrentContent, getCurrentContent, clearCurrentContent, runWithCurrentContent, getStandardFields, } from './fields.js';
3
+ export type { ThemeField, FlexibleRow, FieldTypeCatalogEntry, ThemeHooksLike, ContentLike, } from './fields.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,aAAa,EACb,WAAW,EACX,YAAY,EACZ,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,EACb,SAAS,EACT,WAAW,EACX,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,cAAc,EACd,WAAW,GACZ,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ // @oktis-works/theme-sdk - Main Entry Point
2
+ export { getFields, getField, getFlexibleLayouts, getFieldsAsync, getFieldTypes, setThemeHooks, setCurrentContent, getCurrentContent, clearCurrentContent, runWithCurrentContent, getStandardFields, } from './fields.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAe5C,OAAO,EACL,SAAS,EACT,QAAQ,EACR,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,62 @@
1
+ export type ComponentType = 'layout' | 'component' | 'page' | 'partial';
2
+ export type SettingType = 'text' | 'color' | 'image' | 'select' | 'toggle';
3
+ export interface ThemeSetting {
4
+ name: string;
5
+ type: SettingType;
6
+ label: string;
7
+ default: string | boolean;
8
+ options?: string[];
9
+ }
10
+ export interface ThemeComponent {
11
+ name: string;
12
+ type: ComponentType;
13
+ file: string;
14
+ props?: Record<string, unknown>;
15
+ }
16
+ export type StyleEngine = 'tailwind' | 'scss' | 'css';
17
+ export interface ThemeStyleConfig {
18
+ /** Engine exclusiva: tailwind XOR scss XOR css (padrão css) */
19
+ engine?: StyleEngine;
20
+ /** Entrada relativa ao tema (ex: styles/main.scss, src/input.css). Se omitido, busca por convenção. */
21
+ entry?: string;
22
+ /** Saída relativa ao tema (ex: dist/theme.css). Se omitido, dist/theme.css isolado. */
23
+ output?: string;
24
+ /** Isolamento fino obrigatório via [data-theme="nome"] — sempre true, false é rejeitado em validação (BUSI-040). */
25
+ isolation?: true;
26
+ }
27
+ export interface ThemeProvides {
28
+ layouts?: string[];
29
+ components?: string[];
30
+ styles?: string[];
31
+ assets?: string[];
32
+ }
33
+ export interface ThemeManifest {
34
+ name: string;
35
+ version: string;
36
+ description?: string;
37
+ author?: string;
38
+ screenshot?: string;
39
+ parent?: string;
40
+ provides?: ThemeProvides;
41
+ /** Configuração de portabilidade de estilos (tailwind OU scss) */
42
+ stylesConfig?: ThemeStyleConfig;
43
+ settings?: ThemeSetting[];
44
+ components?: ThemeComponent[];
45
+ }
46
+ export interface RenderContext {
47
+ content: string;
48
+ tenant: string;
49
+ settings: Record<string, unknown>;
50
+ components: Record<string, ThemeComponent>;
51
+ url: string;
52
+ params: Record<string, string>;
53
+ /** Row completa do conteúdo sendo renderizado; alimenta a API contextual (getField sem props). */
54
+ record?: Record<string, unknown>;
55
+ }
56
+ export interface PageProps {
57
+ title: string;
58
+ content: string;
59
+ meta?: Record<string, string>;
60
+ schema?: Record<string, unknown>;
61
+ }
62
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AAExE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,uGAAuG;IACvG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oHAAoH;IACpH,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,kEAAkE;IAClE,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,kGAAkG;IAClG,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@oktis-works/theme-sdk",
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
+ "devDependencies": {
19
+ "typescript": "5.7.3"
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "publishConfig": {
25
+ "access": "public",
26
+ "registry": "https://registry.npmjs.org/"
27
+ },
28
+ "license": "MIT",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/blacklotus/blacklotus-cms",
32
+ "directory": "packages/theme-sdk"
33
+ }
34
+ }