@decantr/registry 1.0.0-beta.10 → 1.0.0-beta.11
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/LICENSE +21 -0
- package/dist/index.d.ts +57 -2
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/package.json +8 -6
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Decantr AI
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/index.d.ts
CHANGED
|
@@ -31,7 +31,29 @@ interface Pattern {
|
|
|
31
31
|
imports: string;
|
|
32
32
|
example: string;
|
|
33
33
|
};
|
|
34
|
+
visual_brief?: string;
|
|
35
|
+
composition?: Record<string, string>;
|
|
36
|
+
motion?: {
|
|
37
|
+
micro?: Record<string, string>;
|
|
38
|
+
transitions?: Record<string, string>;
|
|
39
|
+
ambient?: Record<string, string>;
|
|
40
|
+
};
|
|
41
|
+
responsive?: {
|
|
42
|
+
mobile?: string;
|
|
43
|
+
tablet?: string;
|
|
44
|
+
desktop?: string;
|
|
45
|
+
};
|
|
46
|
+
accessibility?: {
|
|
47
|
+
role?: string;
|
|
48
|
+
'aria-label'?: string;
|
|
49
|
+
keyboard?: string[];
|
|
50
|
+
announcements?: string[];
|
|
51
|
+
focus_management?: string;
|
|
52
|
+
};
|
|
53
|
+
layout_hints?: Record<string, string>;
|
|
54
|
+
category?: string;
|
|
34
55
|
}
|
|
56
|
+
type ArchetypeRole = 'primary' | 'gateway' | 'public' | 'auxiliary';
|
|
35
57
|
interface ArchetypePage {
|
|
36
58
|
id: string;
|
|
37
59
|
default_layout: (string | {
|
|
@@ -51,12 +73,24 @@ interface Archetype {
|
|
|
51
73
|
name: string;
|
|
52
74
|
description: string;
|
|
53
75
|
tags: string[];
|
|
76
|
+
role: ArchetypeRole;
|
|
54
77
|
pages: ArchetypePage[];
|
|
55
78
|
features: string[];
|
|
56
79
|
dependencies: {
|
|
57
80
|
patterns: Record<string, string>;
|
|
58
81
|
};
|
|
59
82
|
seo_hints?: SeoHints;
|
|
83
|
+
classification?: {
|
|
84
|
+
triggers: {
|
|
85
|
+
primary: string[];
|
|
86
|
+
secondary: string[];
|
|
87
|
+
negative: string[];
|
|
88
|
+
};
|
|
89
|
+
implies: string[];
|
|
90
|
+
weight: number;
|
|
91
|
+
tier: string;
|
|
92
|
+
};
|
|
93
|
+
page_briefs?: Record<string, string>;
|
|
60
94
|
}
|
|
61
95
|
interface ThemeSpatial {
|
|
62
96
|
density_bias: number;
|
|
@@ -83,7 +117,6 @@ interface ThemeShell {
|
|
|
83
117
|
headerHeight?: string;
|
|
84
118
|
};
|
|
85
119
|
}
|
|
86
|
-
type ArchetypeRole = 'primary' | 'gateway' | 'public' | 'auxiliary';
|
|
87
120
|
type ComposeEntry = string | {
|
|
88
121
|
archetype: string;
|
|
89
122
|
prefix: string;
|
|
@@ -108,6 +141,20 @@ interface Blueprint {
|
|
|
108
141
|
}>;
|
|
109
142
|
features?: string[];
|
|
110
143
|
version?: string;
|
|
144
|
+
voice?: {
|
|
145
|
+
tone?: string;
|
|
146
|
+
cta_verbs?: string[];
|
|
147
|
+
avoid?: string[];
|
|
148
|
+
empty_states?: string;
|
|
149
|
+
errors?: string;
|
|
150
|
+
loading?: string;
|
|
151
|
+
metrics_format?: string;
|
|
152
|
+
};
|
|
153
|
+
responsive_strategy?: {
|
|
154
|
+
breakpoints?: string[];
|
|
155
|
+
navigation?: Record<string, string>;
|
|
156
|
+
data_display?: Record<string, string>;
|
|
157
|
+
};
|
|
111
158
|
}
|
|
112
159
|
interface Shell {
|
|
113
160
|
id: string;
|
|
@@ -122,7 +169,7 @@ interface Shell {
|
|
|
122
169
|
headerHeight?: string;
|
|
123
170
|
};
|
|
124
171
|
}
|
|
125
|
-
type ContentType = 'pattern' | 'archetype' | 'theme' | 'blueprint';
|
|
172
|
+
type ContentType = 'pattern' | 'archetype' | 'theme' | 'blueprint' | 'shell';
|
|
126
173
|
interface ResolvedContent<T> {
|
|
127
174
|
item: T;
|
|
128
175
|
source: 'local' | 'core';
|
|
@@ -179,6 +226,13 @@ interface Theme {
|
|
|
179
226
|
avoid: string[];
|
|
180
227
|
default_presets?: Record<string, string>;
|
|
181
228
|
};
|
|
229
|
+
decorator_definitions?: Record<string, {
|
|
230
|
+
description: string;
|
|
231
|
+
intent: string;
|
|
232
|
+
suggested_properties?: Record<string, string>;
|
|
233
|
+
pairs_with?: string[];
|
|
234
|
+
usage?: string[];
|
|
235
|
+
}>;
|
|
182
236
|
}
|
|
183
237
|
type ApiContentType = 'patterns' | 'themes' | 'blueprints' | 'archetypes' | 'shells';
|
|
184
238
|
interface ContentListResponse<T = Record<string, unknown>> {
|
|
@@ -245,6 +299,7 @@ type ContentMap = {
|
|
|
245
299
|
archetype: Archetype;
|
|
246
300
|
theme: Theme;
|
|
247
301
|
blueprint: Blueprint;
|
|
302
|
+
shell: Shell;
|
|
248
303
|
};
|
|
249
304
|
interface ResolverOptions {
|
|
250
305
|
contentRoot: string;
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,8 @@ var TYPE_DIRS = {
|
|
|
5
5
|
pattern: "patterns",
|
|
6
6
|
archetype: "archetypes",
|
|
7
7
|
theme: "themes",
|
|
8
|
-
blueprint: "blueprints"
|
|
8
|
+
blueprint: "blueprints",
|
|
9
|
+
shell: "shells"
|
|
9
10
|
};
|
|
10
11
|
async function tryLoadJson(filePath) {
|
|
11
12
|
try {
|
|
@@ -296,9 +297,10 @@ var RegistryAPIClient = class {
|
|
|
296
297
|
const cacheKey = `get:${type}:${namespace}:${slug}`;
|
|
297
298
|
const cached = this.getCached(cacheKey);
|
|
298
299
|
if (cached) return cached;
|
|
299
|
-
const
|
|
300
|
-
|
|
301
|
-
|
|
300
|
+
const raw = await this.request(`/${type}/${namespace}/${slug}`);
|
|
301
|
+
const unwrapped = raw.data ?? raw;
|
|
302
|
+
this.setCache(cacheKey, unwrapped);
|
|
303
|
+
return unwrapped;
|
|
302
304
|
}
|
|
303
305
|
// ── Typed convenience methods ──
|
|
304
306
|
async getPattern(namespace, slug) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/resolver.ts","../src/pattern.ts","../src/wiring.ts","../src/api-client.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Pattern, Archetype, Theme, Blueprint, ContentType, ResolvedContent } from './types.js';\n\ntype ContentMap = {\n pattern: Pattern;\n archetype: Archetype;\n theme: Theme;\n blueprint: Blueprint;\n};\n\nexport interface ResolverOptions {\n contentRoot: string;\n overridePaths?: string[];\n}\n\nexport interface ContentResolver {\n resolve<T extends ContentType>(type: T, id: string): Promise<ResolvedContent<ContentMap[T]> | null>;\n}\n\nconst TYPE_DIRS: Record<ContentType, string> = {\n pattern: 'patterns',\n archetype: 'archetypes',\n theme: 'themes',\n blueprint: 'blueprints',\n};\n\nasync function tryLoadJson<T>(filePath: string): Promise<T | null> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nexport function createResolver(options: ResolverOptions): ContentResolver {\n const { contentRoot, overridePaths = [] } = options;\n return {\n async resolve<T extends ContentType>(type: T, id: string): Promise<ResolvedContent<ContentMap[T]> | null> {\n const dir = TYPE_DIRS[type];\n const fileName = `${id}.json`;\n for (const overridePath of overridePaths) {\n const filePath = join(overridePath, dir, fileName);\n const item = await tryLoadJson<ContentMap[T]>(filePath);\n if (item) return { item, source: 'local', path: filePath };\n }\n // Check main content directory\n const mainPath = join(contentRoot, dir, fileName);\n const mainItem = await tryLoadJson<ContentMap[T]>(mainPath);\n if (mainItem) return { item: mainItem, source: 'core', path: mainPath };\n\n // Check content/core/{type}/ as fallback\n const corePath = join(contentRoot, 'core', dir, fileName);\n const coreItem = await tryLoadJson<ContentMap[T]>(corePath);\n if (coreItem) return { item: coreItem, source: 'core', path: corePath };\n\n return null;\n },\n };\n}\n","import type { Pattern, PatternPreset } from './types.js';\n\nexport interface ResolvedPreset {\n preset: string;\n layout: PatternPreset['layout'];\n code: PatternPreset['code'];\n}\n\nexport function resolvePatternPreset(\n pattern: Pattern,\n explicitPreset?: string,\n themeDefaultPresets?: Record<string, string>,\n): ResolvedPreset {\n const presets = pattern.presets;\n const hasPresets = Object.keys(presets).length > 0;\n\n if (!hasPresets) {\n return {\n preset: '',\n layout: { layout: 'row', atoms: '' },\n code: pattern.code ?? { imports: '', example: '' },\n };\n }\n\n let presetName = explicitPreset;\n if (presetName && !presets[presetName]) presetName = undefined;\n if (!presetName && themeDefaultPresets?.[pattern.id]) {\n const themeName = themeDefaultPresets[pattern.id];\n if (presets[themeName]) presetName = themeName;\n }\n if (!presetName) presetName = pattern.default_preset;\n if (!presetName || !presets[presetName]) presetName = Object.keys(presets)[0];\n\n const preset = presets[presetName];\n return { preset: presetName, layout: preset.layout, code: preset.code };\n}\n","import type { LayoutItem, PatternRef } from '@decantr/essence-spec';\nimport type { PatternIO } from './types.js';\n\n// AUTO: hookType classifies each signal for custom hook generation\nexport type HookType = 'search' | 'filter' | 'selection' | 'sort';\n\nexport interface WiringSignal { name: string; init: string; hookType: HookType }\n\nexport interface WiringRule {\n pair: [string, string];\n signals: WiringSignal[];\n props: Record<string, Record<string, string>>;\n // AUTO: hookProps maps pattern IDs to hook variable names passed as props\n hookProps: Record<string, Record<string, string>>;\n}\n\nexport interface WiringResult {\n rule: WiringRule;\n signals: WiringSignal[];\n props: Record<string, Record<string, string>>;\n hookProps: Record<string, Record<string, string>>;\n}\n\n/**\n * IO declaration for a pattern, used by the data-driven wiring system.\n */\nexport interface PatternIOEntry {\n id: string;\n io: PatternIO;\n}\n\n/**\n * A dynamically derived wiring edge between two patterns based on shared IO signals.\n */\nexport interface IOWiringEdge {\n producer: string;\n consumer: string;\n signals: string[];\n}\n\nexport const WIRING_RULES: WiringRule[] = [\n {\n pair: ['filter-bar', 'data-table'],\n signals: [\n { name: 'pageSearch', init: \"''\", hookType: 'search' },\n { name: 'pageStatus', init: \"'all'\", hookType: 'filter' },\n ],\n props: {\n 'filter-bar': { onSearch: 'setPageSearch', onCategory: 'setPageStatus' },\n 'data-table': { search: 'pageSearch', status: 'pageStatus' },\n },\n hookProps: {\n 'filter-bar': { search: 'search', filters: 'filters' },\n 'data-table': { search: 'search', filters: 'filters' },\n },\n },\n {\n pair: ['filter-bar', 'activity-feed'],\n signals: [\n { name: 'pageSearch', init: \"''\", hookType: 'search' },\n { name: 'pageView', init: \"'all'\", hookType: 'filter' },\n ],\n props: {\n 'filter-bar': { onSearch: 'setPageSearch', onView: 'setPageView' },\n 'activity-feed': { search: 'pageSearch', view: 'pageView' },\n },\n hookProps: {\n 'filter-bar': { search: 'search', filters: 'filters' },\n 'activity-feed': { search: 'search', filters: 'filters' },\n },\n },\n {\n pair: ['filter-bar', 'card-grid'],\n signals: [\n { name: 'pageSearch', init: \"''\", hookType: 'search' },\n ],\n props: {\n 'filter-bar': { onSearch: 'setPageSearch' },\n 'card-grid': { search: 'pageSearch' },\n },\n hookProps: {\n 'filter-bar': { search: 'search' },\n 'card-grid': { search: 'search' },\n },\n },\n];\n\nfunction getPatternId(item: LayoutItem): string | null {\n if (typeof item === 'string') return item;\n if ('pattern' in item) return (item as PatternRef).pattern;\n return null;\n}\n\n/**\n * Derive wiring edges from pattern IO declarations.\n * If pattern A produces signal X and pattern B consumes signal X, an edge is created.\n * Only patterns present in the layout are considered.\n */\nexport function deriveIOWirings(\n layoutIds: string[],\n patternIOMap: Map<string, PatternIO>,\n): IOWiringEdge[] {\n const edges: IOWiringEdge[] = [];\n const layoutSet = new Set(layoutIds);\n\n for (const producerId of layoutIds) {\n const producerIO = patternIOMap.get(producerId);\n if (!producerIO?.produces?.length) continue;\n\n for (const consumerId of layoutIds) {\n if (producerId === consumerId) continue;\n if (!layoutSet.has(consumerId)) continue;\n const consumerIO = patternIOMap.get(consumerId);\n if (!consumerIO?.consumes?.length) continue;\n\n const shared = producerIO.produces.filter(\n (signal) => consumerIO.consumes!.includes(signal),\n );\n if (shared.length > 0) {\n edges.push({ producer: producerId, consumer: consumerId, signals: shared });\n }\n }\n }\n\n return edges;\n}\n\n/**\n * Build a PatternIO map from an array of PatternIOEntry objects.\n */\nexport function buildIOMap(entries: PatternIOEntry[]): Map<string, PatternIO> {\n const map = new Map<string, PatternIO>();\n for (const entry of entries) {\n map.set(entry.id, entry.io);\n }\n return map;\n}\n\n/**\n * Detect wirings from a layout. Uses hardcoded WIRING_RULES for detailed\n * signal/prop information. When a patternIOMap is provided, also derives\n * IO-based wirings and merges them (hardcoded rules take precedence for\n * pairs they cover).\n */\nexport function detectWirings(\n layout: LayoutItem[],\n patternIOMap?: Map<string, PatternIO>,\n): WiringResult[] {\n const patternIds = layout.map(getPatternId).filter((id): id is string => id !== null);\n const results: WiringResult[] = [];\n const coveredPairs = new Set<string>();\n\n // Apply hardcoded rules first (these have detailed signal/prop info)\n for (const rule of WIRING_RULES) {\n const [a, b] = rule.pair;\n if (patternIds.includes(a) && patternIds.includes(b)) {\n results.push({ rule, signals: rule.signals, props: rule.props, hookProps: rule.hookProps });\n coveredPairs.add(`${a}:${b}`);\n coveredPairs.add(`${b}:${a}`);\n }\n }\n\n // If IO map provided, derive additional wirings from IO declarations\n if (patternIOMap) {\n const ioEdges = deriveIOWirings(patternIds, patternIOMap);\n for (const edge of ioEdges) {\n const pairKey = `${edge.producer}:${edge.consumer}`;\n if (coveredPairs.has(pairKey)) continue;\n coveredPairs.add(pairKey);\n\n // Generate a synthetic WiringRule from IO signals\n const signals: WiringSignal[] = edge.signals.map((sig) => {\n const camel = toCamelCase(sig);\n return {\n name: `page${capitalize(camel)}`,\n init: \"''\",\n hookType: classifySignal(sig),\n };\n });\n\n const producerProps: Record<string, string> = {};\n const consumerProps: Record<string, string> = {};\n const producerHookProps: Record<string, string> = {};\n const consumerHookProps: Record<string, string> = {};\n\n for (const sig of edge.signals) {\n const camel = toCamelCase(sig);\n const stateName = `page${capitalize(camel)}`;\n const setterName = `set${capitalize(stateName)}`;\n producerProps[`on${capitalize(camel)}`] = setterName;\n consumerProps[sig] = stateName;\n producerHookProps[sig] = sig;\n consumerHookProps[sig] = sig;\n }\n\n const rule: WiringRule = {\n pair: [edge.producer, edge.consumer],\n signals,\n props: { [edge.producer]: producerProps, [edge.consumer]: consumerProps },\n hookProps: { [edge.producer]: producerHookProps, [edge.consumer]: consumerHookProps },\n };\n\n results.push({ rule, signals, props: rule.props, hookProps: rule.hookProps });\n }\n }\n\n return results;\n}\n\n/**\n * Convert a kebab-case string to camelCase.\n */\nfunction toCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n/**\n * Capitalize the first letter of a string.\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Classify a signal name into a HookType for code generation.\n */\nfunction classifySignal(signal: string): HookType {\n const normalized = toCamelCase(signal);\n if (normalized === 'search') return 'search';\n if (normalized === 'selection') return 'selection';\n if (normalized === 'sort') return 'sort';\n return 'filter';\n}\n","import type {\n Pattern,\n Archetype,\n Theme,\n Blueprint,\n Shell,\n ApiContentType,\n ContentListResponse,\n ContentItem,\n PublishPayload,\n PublishResponse,\n SearchParams,\n SearchResponse,\n UserProfile,\n} from './types.js';\n\nconst DEFAULT_BASE_URL = 'https://api.decantr.ai/v1';\nconst DEFAULT_TIMEOUT_MS = 30000;\nconst DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\ninterface CacheEntry<T> {\n data: T;\n timestamp: number;\n}\n\nexport interface RegistryAPIClientOptions {\n baseUrl?: string;\n apiKey?: string;\n timeoutMs?: number;\n cacheTtlMs?: number;\n}\n\nexport class RegistryAPIClient {\n private baseUrl: string;\n private apiKey: string | undefined;\n private timeoutMs: number;\n private cacheTtlMs: number;\n private cache = new Map<string, CacheEntry<unknown>>();\n\n constructor(options: RegistryAPIClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.apiKey = options.apiKey;\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n }\n\n // ── HTTP helpers ──\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Accept': 'application/json',\n };\n if (this.apiKey) {\n headers['X-API-Key'] = this.apiKey;\n }\n return headers;\n }\n\n private async fetchWithTimeout(url: string, init?: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const response = await this.fetchWithTimeout(url, {\n ...init,\n headers: { ...this.buildHeaders(), ...init?.headers },\n });\n if (!response.ok) {\n const body = await response.text().catch(() => '');\n throw new Error(`API ${response.status}: ${body || response.statusText}`);\n }\n return response.json() as Promise<T>;\n }\n\n // ── Cache helpers ──\n\n private getCached<T>(key: string): T | null {\n const entry = this.cache.get(key) as CacheEntry<T> | undefined;\n if (!entry) return null;\n if (Date.now() - entry.timestamp > this.cacheTtlMs) {\n this.cache.delete(key);\n return null;\n }\n return entry.data;\n }\n\n private setCache<T>(key: string, data: T): void {\n this.cache.set(key, { data, timestamp: Date.now() });\n }\n\n clearCache(): void {\n this.cache.clear();\n }\n\n // ── Health ──\n\n async checkHealth(): Promise<boolean> {\n try {\n const url = this.baseUrl.replace(/\\/v1$/, '/health');\n const response = await this.fetchWithTimeout(url);\n return response.ok;\n } catch {\n return false;\n }\n }\n\n // ── Content fetching (public) ──\n\n async listContent<T = Record<string, unknown>>(\n type: ApiContentType,\n params?: { namespace?: string; limit?: number; offset?: number }\n ): Promise<ContentListResponse<T>> {\n const cacheKey = `list:${type}:${JSON.stringify(params ?? {})}`;\n const cached = this.getCached<ContentListResponse<T>>(cacheKey);\n if (cached) return cached;\n\n const searchParams = new URLSearchParams();\n if (params?.namespace) searchParams.set('namespace', params.namespace);\n if (params?.limit) searchParams.set('limit', String(params.limit));\n if (params?.offset) searchParams.set('offset', String(params.offset));\n\n const query = searchParams.toString();\n const path = `/${type}${query ? `?${query}` : ''}`;\n const result = await this.request<ContentListResponse<T>>(path);\n this.setCache(cacheKey, result);\n return result;\n }\n\n async getContent<T = Record<string, unknown>>(\n type: ApiContentType,\n namespace: string,\n slug: string\n ): Promise<T> {\n const cacheKey = `get:${type}:${namespace}:${slug}`;\n const cached = this.getCached<T>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<T>(`/${type}/${namespace}/${slug}`);\n this.setCache(cacheKey, result);\n return result;\n }\n\n // ── Typed convenience methods ──\n\n async getPattern(namespace: string, slug: string): Promise<Pattern> {\n return this.getContent<Pattern>('patterns', namespace, slug);\n }\n\n async getArchetype(namespace: string, slug: string): Promise<Archetype> {\n return this.getContent<Archetype>('archetypes', namespace, slug);\n }\n\n async getTheme(namespace: string, slug: string): Promise<Theme> {\n return this.getContent<Theme>('themes', namespace, slug);\n }\n\n async getBlueprint(namespace: string, slug: string): Promise<Blueprint> {\n return this.getContent<Blueprint>('blueprints', namespace, slug);\n }\n\n async getShell(namespace: string, slug: string): Promise<Shell> {\n return this.getContent<Shell>('shells', namespace, slug);\n }\n\n // ── Search ──\n\n async search(params: SearchParams): Promise<SearchResponse> {\n const searchParams = new URLSearchParams({ q: params.q });\n if (params.type) searchParams.set('type', params.type);\n if (params.namespace) searchParams.set('namespace', params.namespace);\n if (params.limit) searchParams.set('limit', String(params.limit));\n if (params.offset) searchParams.set('offset', String(params.offset));\n\n return this.request<SearchResponse>(`/search?${searchParams}`);\n }\n\n // ── Authenticated endpoints ──\n\n async getProfile(): Promise<UserProfile> {\n return this.request<UserProfile>('/me');\n }\n\n async publishContent(payload: PublishPayload): Promise<PublishResponse> {\n return this.request<PublishResponse>('/content', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n }\n\n async getMyContent(): Promise<ContentListResponse<ContentItem>> {\n return this.request<ContentListResponse<ContentItem>>('/my/content');\n }\n\n // ── Schema ──\n\n async getSchema(name: string = 'essence.v3.json'): Promise<Record<string, unknown>> {\n return this.request<Record<string, unknown>>(`/schema/${name}`);\n }\n}\n\n// ── Lightweight registry client (merged from client.ts) ──\n\nexport interface RegistryClientOptions {\n baseUrl?: string;\n}\n\nexport interface SearchResult {\n id: string;\n type: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n}\n\nexport interface RegistryClient {\n search(query: string, type?: string): Promise<SearchResult[]>;\n fetch(type: string, id: string, version?: string): Promise<unknown>;\n}\n\nexport function createRegistryClient(options: RegistryClientOptions = {}): RegistryClient {\n const baseUrl = options.baseUrl ?? 'https://api.decantr.ai/v1';\n return {\n async search(query: string, type?: string): Promise<SearchResult[]> {\n const params = new URLSearchParams({ q: query });\n if (type) params.set('type', type);\n const res = await fetch(`${baseUrl}/search?${params}`);\n if (!res.ok) return [];\n const data = await res.json() as { results?: SearchResult[]; total?: number } | SearchResult[];\n // API returns { total, results } wrapper\n if (Array.isArray(data)) return data;\n return (data as { results: SearchResult[] }).results ?? [];\n },\n async fetch(type: string, id: string, version?: string): Promise<unknown> {\n const url = version ? `${baseUrl}/content/${type}/${id}/${version}` : `${baseUrl}/content/${type}/${id}`;\n const res = await fetch(url);\n if (!res.ok) return null;\n return res.json();\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/resolver.ts","../src/pattern.ts","../src/wiring.ts","../src/api-client.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Pattern, Archetype, Theme, Blueprint, Shell, ContentType, ResolvedContent } from './types.js';\n\ntype ContentMap = {\n pattern: Pattern;\n archetype: Archetype;\n theme: Theme;\n blueprint: Blueprint;\n shell: Shell;\n};\n\nexport interface ResolverOptions {\n contentRoot: string;\n overridePaths?: string[];\n}\n\nexport interface ContentResolver {\n resolve<T extends ContentType>(type: T, id: string): Promise<ResolvedContent<ContentMap[T]> | null>;\n}\n\nconst TYPE_DIRS: Record<ContentType, string> = {\n pattern: 'patterns',\n archetype: 'archetypes',\n theme: 'themes',\n blueprint: 'blueprints',\n shell: 'shells',\n};\n\nasync function tryLoadJson<T>(filePath: string): Promise<T | null> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nexport function createResolver(options: ResolverOptions): ContentResolver {\n const { contentRoot, overridePaths = [] } = options;\n return {\n async resolve<T extends ContentType>(type: T, id: string): Promise<ResolvedContent<ContentMap[T]> | null> {\n const dir = TYPE_DIRS[type];\n const fileName = `${id}.json`;\n for (const overridePath of overridePaths) {\n const filePath = join(overridePath, dir, fileName);\n const item = await tryLoadJson<ContentMap[T]>(filePath);\n if (item) return { item, source: 'local', path: filePath };\n }\n // Check main content directory\n const mainPath = join(contentRoot, dir, fileName);\n const mainItem = await tryLoadJson<ContentMap[T]>(mainPath);\n if (mainItem) return { item: mainItem, source: 'core', path: mainPath };\n\n // Check content/core/{type}/ as fallback\n const corePath = join(contentRoot, 'core', dir, fileName);\n const coreItem = await tryLoadJson<ContentMap[T]>(corePath);\n if (coreItem) return { item: coreItem, source: 'core', path: corePath };\n\n return null;\n },\n };\n}\n","import type { Pattern, PatternPreset } from './types.js';\n\nexport interface ResolvedPreset {\n preset: string;\n layout: PatternPreset['layout'];\n code: PatternPreset['code'];\n}\n\nexport function resolvePatternPreset(\n pattern: Pattern,\n explicitPreset?: string,\n themeDefaultPresets?: Record<string, string>,\n): ResolvedPreset {\n const presets = pattern.presets;\n const hasPresets = Object.keys(presets).length > 0;\n\n if (!hasPresets) {\n return {\n preset: '',\n layout: { layout: 'row', atoms: '' },\n code: pattern.code ?? { imports: '', example: '' },\n };\n }\n\n let presetName = explicitPreset;\n if (presetName && !presets[presetName]) presetName = undefined;\n if (!presetName && themeDefaultPresets?.[pattern.id]) {\n const themeName = themeDefaultPresets[pattern.id];\n if (presets[themeName]) presetName = themeName;\n }\n if (!presetName) presetName = pattern.default_preset;\n if (!presetName || !presets[presetName]) presetName = Object.keys(presets)[0];\n\n const preset = presets[presetName];\n return { preset: presetName, layout: preset.layout, code: preset.code };\n}\n","import type { LayoutItem, PatternRef } from '@decantr/essence-spec';\nimport type { PatternIO } from './types.js';\n\n// AUTO: hookType classifies each signal for custom hook generation\nexport type HookType = 'search' | 'filter' | 'selection' | 'sort';\n\nexport interface WiringSignal { name: string; init: string; hookType: HookType }\n\nexport interface WiringRule {\n pair: [string, string];\n signals: WiringSignal[];\n props: Record<string, Record<string, string>>;\n // AUTO: hookProps maps pattern IDs to hook variable names passed as props\n hookProps: Record<string, Record<string, string>>;\n}\n\nexport interface WiringResult {\n rule: WiringRule;\n signals: WiringSignal[];\n props: Record<string, Record<string, string>>;\n hookProps: Record<string, Record<string, string>>;\n}\n\n/**\n * IO declaration for a pattern, used by the data-driven wiring system.\n */\nexport interface PatternIOEntry {\n id: string;\n io: PatternIO;\n}\n\n/**\n * A dynamically derived wiring edge between two patterns based on shared IO signals.\n */\nexport interface IOWiringEdge {\n producer: string;\n consumer: string;\n signals: string[];\n}\n\nexport const WIRING_RULES: WiringRule[] = [\n {\n pair: ['filter-bar', 'data-table'],\n signals: [\n { name: 'pageSearch', init: \"''\", hookType: 'search' },\n { name: 'pageStatus', init: \"'all'\", hookType: 'filter' },\n ],\n props: {\n 'filter-bar': { onSearch: 'setPageSearch', onCategory: 'setPageStatus' },\n 'data-table': { search: 'pageSearch', status: 'pageStatus' },\n },\n hookProps: {\n 'filter-bar': { search: 'search', filters: 'filters' },\n 'data-table': { search: 'search', filters: 'filters' },\n },\n },\n {\n pair: ['filter-bar', 'activity-feed'],\n signals: [\n { name: 'pageSearch', init: \"''\", hookType: 'search' },\n { name: 'pageView', init: \"'all'\", hookType: 'filter' },\n ],\n props: {\n 'filter-bar': { onSearch: 'setPageSearch', onView: 'setPageView' },\n 'activity-feed': { search: 'pageSearch', view: 'pageView' },\n },\n hookProps: {\n 'filter-bar': { search: 'search', filters: 'filters' },\n 'activity-feed': { search: 'search', filters: 'filters' },\n },\n },\n {\n pair: ['filter-bar', 'card-grid'],\n signals: [\n { name: 'pageSearch', init: \"''\", hookType: 'search' },\n ],\n props: {\n 'filter-bar': { onSearch: 'setPageSearch' },\n 'card-grid': { search: 'pageSearch' },\n },\n hookProps: {\n 'filter-bar': { search: 'search' },\n 'card-grid': { search: 'search' },\n },\n },\n];\n\nfunction getPatternId(item: LayoutItem): string | null {\n if (typeof item === 'string') return item;\n if ('pattern' in item) return (item as PatternRef).pattern;\n return null;\n}\n\n/**\n * Derive wiring edges from pattern IO declarations.\n * If pattern A produces signal X and pattern B consumes signal X, an edge is created.\n * Only patterns present in the layout are considered.\n */\nexport function deriveIOWirings(\n layoutIds: string[],\n patternIOMap: Map<string, PatternIO>,\n): IOWiringEdge[] {\n const edges: IOWiringEdge[] = [];\n const layoutSet = new Set(layoutIds);\n\n for (const producerId of layoutIds) {\n const producerIO = patternIOMap.get(producerId);\n if (!producerIO?.produces?.length) continue;\n\n for (const consumerId of layoutIds) {\n if (producerId === consumerId) continue;\n if (!layoutSet.has(consumerId)) continue;\n const consumerIO = patternIOMap.get(consumerId);\n if (!consumerIO?.consumes?.length) continue;\n\n const shared = producerIO.produces.filter(\n (signal) => consumerIO.consumes!.includes(signal),\n );\n if (shared.length > 0) {\n edges.push({ producer: producerId, consumer: consumerId, signals: shared });\n }\n }\n }\n\n return edges;\n}\n\n/**\n * Build a PatternIO map from an array of PatternIOEntry objects.\n */\nexport function buildIOMap(entries: PatternIOEntry[]): Map<string, PatternIO> {\n const map = new Map<string, PatternIO>();\n for (const entry of entries) {\n map.set(entry.id, entry.io);\n }\n return map;\n}\n\n/**\n * Detect wirings from a layout. Uses hardcoded WIRING_RULES for detailed\n * signal/prop information. When a patternIOMap is provided, also derives\n * IO-based wirings and merges them (hardcoded rules take precedence for\n * pairs they cover).\n */\nexport function detectWirings(\n layout: LayoutItem[],\n patternIOMap?: Map<string, PatternIO>,\n): WiringResult[] {\n const patternIds = layout.map(getPatternId).filter((id): id is string => id !== null);\n const results: WiringResult[] = [];\n const coveredPairs = new Set<string>();\n\n // Apply hardcoded rules first (these have detailed signal/prop info)\n for (const rule of WIRING_RULES) {\n const [a, b] = rule.pair;\n if (patternIds.includes(a) && patternIds.includes(b)) {\n results.push({ rule, signals: rule.signals, props: rule.props, hookProps: rule.hookProps });\n coveredPairs.add(`${a}:${b}`);\n coveredPairs.add(`${b}:${a}`);\n }\n }\n\n // If IO map provided, derive additional wirings from IO declarations\n if (patternIOMap) {\n const ioEdges = deriveIOWirings(patternIds, patternIOMap);\n for (const edge of ioEdges) {\n const pairKey = `${edge.producer}:${edge.consumer}`;\n if (coveredPairs.has(pairKey)) continue;\n coveredPairs.add(pairKey);\n\n // Generate a synthetic WiringRule from IO signals\n const signals: WiringSignal[] = edge.signals.map((sig) => {\n const camel = toCamelCase(sig);\n return {\n name: `page${capitalize(camel)}`,\n init: \"''\",\n hookType: classifySignal(sig),\n };\n });\n\n const producerProps: Record<string, string> = {};\n const consumerProps: Record<string, string> = {};\n const producerHookProps: Record<string, string> = {};\n const consumerHookProps: Record<string, string> = {};\n\n for (const sig of edge.signals) {\n const camel = toCamelCase(sig);\n const stateName = `page${capitalize(camel)}`;\n const setterName = `set${capitalize(stateName)}`;\n producerProps[`on${capitalize(camel)}`] = setterName;\n consumerProps[sig] = stateName;\n producerHookProps[sig] = sig;\n consumerHookProps[sig] = sig;\n }\n\n const rule: WiringRule = {\n pair: [edge.producer, edge.consumer],\n signals,\n props: { [edge.producer]: producerProps, [edge.consumer]: consumerProps },\n hookProps: { [edge.producer]: producerHookProps, [edge.consumer]: consumerHookProps },\n };\n\n results.push({ rule, signals, props: rule.props, hookProps: rule.hookProps });\n }\n }\n\n return results;\n}\n\n/**\n * Convert a kebab-case string to camelCase.\n */\nfunction toCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n/**\n * Capitalize the first letter of a string.\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Classify a signal name into a HookType for code generation.\n */\nfunction classifySignal(signal: string): HookType {\n const normalized = toCamelCase(signal);\n if (normalized === 'search') return 'search';\n if (normalized === 'selection') return 'selection';\n if (normalized === 'sort') return 'sort';\n return 'filter';\n}\n","import type {\n Pattern,\n Archetype,\n Theme,\n Blueprint,\n Shell,\n ApiContentType,\n ContentListResponse,\n ContentItem,\n PublishPayload,\n PublishResponse,\n SearchParams,\n SearchResponse,\n UserProfile,\n} from './types.js';\n\nconst DEFAULT_BASE_URL = 'https://api.decantr.ai/v1';\nconst DEFAULT_TIMEOUT_MS = 30000;\nconst DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\ninterface CacheEntry<T> {\n data: T;\n timestamp: number;\n}\n\nexport interface RegistryAPIClientOptions {\n baseUrl?: string;\n apiKey?: string;\n timeoutMs?: number;\n cacheTtlMs?: number;\n}\n\nexport class RegistryAPIClient {\n private baseUrl: string;\n private apiKey: string | undefined;\n private timeoutMs: number;\n private cacheTtlMs: number;\n private cache = new Map<string, CacheEntry<unknown>>();\n\n constructor(options: RegistryAPIClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.apiKey = options.apiKey;\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n }\n\n // ── HTTP helpers ──\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Accept': 'application/json',\n };\n if (this.apiKey) {\n headers['X-API-Key'] = this.apiKey;\n }\n return headers;\n }\n\n private async fetchWithTimeout(url: string, init?: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const response = await this.fetchWithTimeout(url, {\n ...init,\n headers: { ...this.buildHeaders(), ...init?.headers },\n });\n if (!response.ok) {\n const body = await response.text().catch(() => '');\n throw new Error(`API ${response.status}: ${body || response.statusText}`);\n }\n return response.json() as Promise<T>;\n }\n\n // ── Cache helpers ──\n\n private getCached<T>(key: string): T | null {\n const entry = this.cache.get(key) as CacheEntry<T> | undefined;\n if (!entry) return null;\n if (Date.now() - entry.timestamp > this.cacheTtlMs) {\n this.cache.delete(key);\n return null;\n }\n return entry.data;\n }\n\n private setCache<T>(key: string, data: T): void {\n this.cache.set(key, { data, timestamp: Date.now() });\n }\n\n clearCache(): void {\n this.cache.clear();\n }\n\n // ── Health ──\n\n async checkHealth(): Promise<boolean> {\n try {\n const url = this.baseUrl.replace(/\\/v1$/, '/health');\n const response = await this.fetchWithTimeout(url);\n return response.ok;\n } catch {\n return false;\n }\n }\n\n // ── Content fetching (public) ──\n\n async listContent<T = Record<string, unknown>>(\n type: ApiContentType,\n params?: { namespace?: string; limit?: number; offset?: number }\n ): Promise<ContentListResponse<T>> {\n const cacheKey = `list:${type}:${JSON.stringify(params ?? {})}`;\n const cached = this.getCached<ContentListResponse<T>>(cacheKey);\n if (cached) return cached;\n\n const searchParams = new URLSearchParams();\n if (params?.namespace) searchParams.set('namespace', params.namespace);\n if (params?.limit) searchParams.set('limit', String(params.limit));\n if (params?.offset) searchParams.set('offset', String(params.offset));\n\n const query = searchParams.toString();\n const path = `/${type}${query ? `?${query}` : ''}`;\n const result = await this.request<ContentListResponse<T>>(path);\n this.setCache(cacheKey, result);\n return result;\n }\n\n async getContent<T = Record<string, unknown>>(\n type: ApiContentType,\n namespace: string,\n slug: string\n ): Promise<T> {\n const cacheKey = `get:${type}:${namespace}:${slug}`;\n const cached = this.getCached<T>(cacheKey);\n if (cached) return cached;\n\n const raw = await this.request<T>(`/${type}/${namespace}/${slug}`);\n // API returns { id, type, slug, data: {...actual content...} } — unwrap\n const unwrapped = ((raw as any).data ?? raw) as T;\n this.setCache(cacheKey, unwrapped);\n return unwrapped;\n }\n\n // ── Typed convenience methods ──\n\n async getPattern(namespace: string, slug: string): Promise<Pattern> {\n return this.getContent<Pattern>('patterns', namespace, slug);\n }\n\n async getArchetype(namespace: string, slug: string): Promise<Archetype> {\n return this.getContent<Archetype>('archetypes', namespace, slug);\n }\n\n async getTheme(namespace: string, slug: string): Promise<Theme> {\n return this.getContent<Theme>('themes', namespace, slug);\n }\n\n async getBlueprint(namespace: string, slug: string): Promise<Blueprint> {\n return this.getContent<Blueprint>('blueprints', namespace, slug);\n }\n\n async getShell(namespace: string, slug: string): Promise<Shell> {\n return this.getContent<Shell>('shells', namespace, slug);\n }\n\n // ── Search ──\n\n async search(params: SearchParams): Promise<SearchResponse> {\n const searchParams = new URLSearchParams({ q: params.q });\n if (params.type) searchParams.set('type', params.type);\n if (params.namespace) searchParams.set('namespace', params.namespace);\n if (params.limit) searchParams.set('limit', String(params.limit));\n if (params.offset) searchParams.set('offset', String(params.offset));\n\n return this.request<SearchResponse>(`/search?${searchParams}`);\n }\n\n // ── Authenticated endpoints ──\n\n async getProfile(): Promise<UserProfile> {\n return this.request<UserProfile>('/me');\n }\n\n async publishContent(payload: PublishPayload): Promise<PublishResponse> {\n return this.request<PublishResponse>('/content', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n }\n\n async getMyContent(): Promise<ContentListResponse<ContentItem>> {\n return this.request<ContentListResponse<ContentItem>>('/my/content');\n }\n\n // ── Schema ──\n\n async getSchema(name: string = 'essence.v3.json'): Promise<Record<string, unknown>> {\n return this.request<Record<string, unknown>>(`/schema/${name}`);\n }\n}\n\n// ── Lightweight registry client (merged from client.ts) ──\n\nexport interface RegistryClientOptions {\n baseUrl?: string;\n}\n\nexport interface SearchResult {\n id: string;\n type: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n}\n\nexport interface RegistryClient {\n search(query: string, type?: string): Promise<SearchResult[]>;\n fetch(type: string, id: string, version?: string): Promise<unknown>;\n}\n\nexport function createRegistryClient(options: RegistryClientOptions = {}): RegistryClient {\n const baseUrl = options.baseUrl ?? 'https://api.decantr.ai/v1';\n return {\n async search(query: string, type?: string): Promise<SearchResult[]> {\n const params = new URLSearchParams({ q: query });\n if (type) params.set('type', type);\n const res = await fetch(`${baseUrl}/search?${params}`);\n if (!res.ok) return [];\n const data = await res.json() as { results?: SearchResult[]; total?: number } | SearchResult[];\n // API returns { total, results } wrapper\n if (Array.isArray(data)) return data;\n return (data as { results: SearchResult[] }).results ?? [];\n },\n async fetch(type: string, id: string, version?: string): Promise<unknown> {\n const url = version ? `${baseUrl}/content/${type}/${id}/${version}` : `${baseUrl}/content/${type}/${id}`;\n const res = await fetch(url);\n if (!res.ok) return null;\n return res.json();\n },\n };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@decantr/registry",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.11",
|
|
4
4
|
"description": "Registry format, content resolver, and wiring rules for Decantr",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -18,16 +18,18 @@
|
|
|
18
18
|
"types": "./dist/index.d.ts"
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
|
-
"files": [
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
22
24
|
"publishConfig": {
|
|
23
25
|
"access": "public"
|
|
24
26
|
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@decantr/essence-spec": "1.0.0-beta.11"
|
|
29
|
+
},
|
|
25
30
|
"scripts": {
|
|
26
31
|
"build": "tsup",
|
|
27
32
|
"test": "vitest run",
|
|
28
33
|
"test:watch": "vitest"
|
|
29
|
-
},
|
|
30
|
-
"dependencies": {
|
|
31
|
-
"@decantr/essence-spec": "workspace:*"
|
|
32
34
|
}
|
|
33
|
-
}
|
|
35
|
+
}
|