@decantr/registry 1.0.0-beta.3 → 1.0.0-beta.4
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/index.d.ts +123 -1
- package/dist/index.js +150 -2
- package/dist/index.js.map +1 -1
- package/package.json +6 -8
- package/LICENSE +0 -21
package/dist/index.d.ts
CHANGED
|
@@ -37,6 +37,10 @@ interface ArchetypePage {
|
|
|
37
37
|
default_layout: string[];
|
|
38
38
|
shell: string;
|
|
39
39
|
}
|
|
40
|
+
interface SeoHints {
|
|
41
|
+
schema_org?: string[];
|
|
42
|
+
meta_priorities?: string[];
|
|
43
|
+
}
|
|
40
44
|
interface Archetype {
|
|
41
45
|
id: string;
|
|
42
46
|
version: string;
|
|
@@ -49,6 +53,7 @@ interface Archetype {
|
|
|
49
53
|
patterns: Record<string, string>;
|
|
50
54
|
recipes: Record<string, string>;
|
|
51
55
|
};
|
|
56
|
+
seo_hints?: SeoHints;
|
|
52
57
|
}
|
|
53
58
|
interface RecipeSpatialHints {
|
|
54
59
|
density_bias: number;
|
|
@@ -102,6 +107,84 @@ interface ResolvedContent<T> {
|
|
|
102
107
|
source: 'local' | 'installed' | 'core';
|
|
103
108
|
path: string;
|
|
104
109
|
}
|
|
110
|
+
type CvdMode = 'deuteranopia' | 'protanopia' | 'tritanopia' | 'achromatopsia';
|
|
111
|
+
interface ThemeTokens {
|
|
112
|
+
base?: Record<string, string>;
|
|
113
|
+
cvd?: Partial<Record<CvdMode, Record<string, string>>>;
|
|
114
|
+
}
|
|
115
|
+
interface Theme {
|
|
116
|
+
id: string;
|
|
117
|
+
name: string;
|
|
118
|
+
description?: string;
|
|
119
|
+
tags?: string[];
|
|
120
|
+
personality?: string;
|
|
121
|
+
seed?: Record<string, string>;
|
|
122
|
+
modes?: string[];
|
|
123
|
+
shapes?: string[];
|
|
124
|
+
cvd_support?: CvdMode[];
|
|
125
|
+
tokens?: ThemeTokens;
|
|
126
|
+
decantr_compat?: string;
|
|
127
|
+
source?: string;
|
|
128
|
+
}
|
|
129
|
+
type ApiContentType = 'patterns' | 'recipes' | 'themes' | 'blueprints' | 'archetypes' | 'shells';
|
|
130
|
+
interface ContentListResponse<T = Record<string, unknown>> {
|
|
131
|
+
items: T[];
|
|
132
|
+
total: number;
|
|
133
|
+
}
|
|
134
|
+
interface ContentItem {
|
|
135
|
+
id: string;
|
|
136
|
+
slug: string;
|
|
137
|
+
namespace: string;
|
|
138
|
+
type: string;
|
|
139
|
+
version: string;
|
|
140
|
+
data: Record<string, unknown>;
|
|
141
|
+
visibility: 'public' | 'private';
|
|
142
|
+
status: 'pending' | 'approved' | 'rejected' | 'published';
|
|
143
|
+
created_at: string;
|
|
144
|
+
updated_at: string;
|
|
145
|
+
published_at?: string;
|
|
146
|
+
}
|
|
147
|
+
interface PublishPayload {
|
|
148
|
+
type: ApiContentType;
|
|
149
|
+
slug: string;
|
|
150
|
+
namespace: string;
|
|
151
|
+
version: string;
|
|
152
|
+
data: Record<string, unknown>;
|
|
153
|
+
visibility?: 'public' | 'private';
|
|
154
|
+
}
|
|
155
|
+
interface PublishResponse {
|
|
156
|
+
id: string;
|
|
157
|
+
slug: string;
|
|
158
|
+
namespace: string;
|
|
159
|
+
type: string;
|
|
160
|
+
status: string;
|
|
161
|
+
}
|
|
162
|
+
interface SearchParams {
|
|
163
|
+
q: string;
|
|
164
|
+
type?: string;
|
|
165
|
+
namespace?: string;
|
|
166
|
+
limit?: number;
|
|
167
|
+
offset?: number;
|
|
168
|
+
}
|
|
169
|
+
interface SearchResponse {
|
|
170
|
+
results: Array<{
|
|
171
|
+
id: string;
|
|
172
|
+
type: string;
|
|
173
|
+
slug: string;
|
|
174
|
+
namespace: string;
|
|
175
|
+
name: string;
|
|
176
|
+
description: string;
|
|
177
|
+
version: string;
|
|
178
|
+
}>;
|
|
179
|
+
total: number;
|
|
180
|
+
}
|
|
181
|
+
interface UserProfile {
|
|
182
|
+
id: string;
|
|
183
|
+
email: string;
|
|
184
|
+
tier: 'free' | 'pro' | 'team' | 'enterprise';
|
|
185
|
+
reputation_score: number;
|
|
186
|
+
trusted: boolean;
|
|
187
|
+
}
|
|
105
188
|
|
|
106
189
|
type ContentMap = {
|
|
107
190
|
pattern: Pattern;
|
|
@@ -166,4 +249,43 @@ interface RegistryClient {
|
|
|
166
249
|
}
|
|
167
250
|
declare function createRegistryClient(options?: RegistryClientOptions): RegistryClient;
|
|
168
251
|
|
|
169
|
-
|
|
252
|
+
interface RegistryAPIClientOptions {
|
|
253
|
+
baseUrl?: string;
|
|
254
|
+
apiKey?: string;
|
|
255
|
+
timeoutMs?: number;
|
|
256
|
+
cacheTtlMs?: number;
|
|
257
|
+
}
|
|
258
|
+
declare class RegistryAPIClient {
|
|
259
|
+
private baseUrl;
|
|
260
|
+
private apiKey;
|
|
261
|
+
private timeoutMs;
|
|
262
|
+
private cacheTtlMs;
|
|
263
|
+
private cache;
|
|
264
|
+
constructor(options?: RegistryAPIClientOptions);
|
|
265
|
+
private buildHeaders;
|
|
266
|
+
private fetchWithTimeout;
|
|
267
|
+
private request;
|
|
268
|
+
private getCached;
|
|
269
|
+
private setCache;
|
|
270
|
+
clearCache(): void;
|
|
271
|
+
checkHealth(): Promise<boolean>;
|
|
272
|
+
listContent<T = Record<string, unknown>>(type: ApiContentType, params?: {
|
|
273
|
+
namespace?: string;
|
|
274
|
+
limit?: number;
|
|
275
|
+
offset?: number;
|
|
276
|
+
}): Promise<ContentListResponse<T>>;
|
|
277
|
+
getContent<T = Record<string, unknown>>(type: ApiContentType, namespace: string, slug: string): Promise<T>;
|
|
278
|
+
getPattern(namespace: string, slug: string): Promise<Pattern>;
|
|
279
|
+
getArchetype(namespace: string, slug: string): Promise<Archetype>;
|
|
280
|
+
getRecipe(namespace: string, slug: string): Promise<Recipe>;
|
|
281
|
+
getTheme(namespace: string, slug: string): Promise<Theme>;
|
|
282
|
+
getBlueprint(namespace: string, slug: string): Promise<Record<string, unknown>>;
|
|
283
|
+
getShell(namespace: string, slug: string): Promise<Record<string, unknown>>;
|
|
284
|
+
search(params: SearchParams): Promise<SearchResponse>;
|
|
285
|
+
getProfile(): Promise<UserProfile>;
|
|
286
|
+
publishContent(payload: PublishPayload): Promise<PublishResponse>;
|
|
287
|
+
getMyContent(): Promise<ContentListResponse<ContentItem>>;
|
|
288
|
+
getSchema(name?: string): Promise<Record<string, unknown>>;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export { type ApiContentType, type Archetype, type ArchetypePage, type ContentItem, type ContentListResponse, type ContentResolver, type ContentType, type HookType, type Pattern, type PatternIO, type PatternPreset, type PublishPayload, type PublishResponse, type Recipe, type RecipeShell, type RecipeSpatialHints, type RecipeVisualEffects, RegistryAPIClient, type RegistryAPIClientOptions, type RegistryClient, type RegistryClientOptions, type ResolvedContent, type ResolvedPreset, type ResolverOptions, type SearchParams, type SearchResponse, type SearchResult, type UserProfile, WIRING_RULES, type WiringResult, type WiringRule, type WiringSignal, createRegistryClient, createResolver, detectWirings, resolvePatternPreset };
|
package/dist/index.js
CHANGED
|
@@ -27,7 +27,10 @@ function createResolver(options) {
|
|
|
27
27
|
const item = await tryLoadJson(filePath);
|
|
28
28
|
if (item) return { item, source: "local", path: filePath };
|
|
29
29
|
}
|
|
30
|
-
const
|
|
30
|
+
const mainPath = join(contentRoot, dir, fileName);
|
|
31
|
+
const mainItem = await tryLoadJson(mainPath);
|
|
32
|
+
if (mainItem) return { item: mainItem, source: "core", path: mainPath };
|
|
33
|
+
const corePath = join(contentRoot, "core", dir, fileName);
|
|
31
34
|
const coreItem = await tryLoadJson(corePath);
|
|
32
35
|
if (coreItem) return { item: coreItem, source: "core", path: corePath };
|
|
33
36
|
return null;
|
|
@@ -124,7 +127,7 @@ function detectWirings(layout) {
|
|
|
124
127
|
|
|
125
128
|
// src/client.ts
|
|
126
129
|
function createRegistryClient(options = {}) {
|
|
127
|
-
const baseUrl = options.baseUrl ?? "https://decantr
|
|
130
|
+
const baseUrl = options.baseUrl ?? "https://api.decantr.ai/v1";
|
|
128
131
|
return {
|
|
129
132
|
async search(query, type) {
|
|
130
133
|
const params = new URLSearchParams({ q: query });
|
|
@@ -143,7 +146,152 @@ function createRegistryClient(options = {}) {
|
|
|
143
146
|
}
|
|
144
147
|
};
|
|
145
148
|
}
|
|
149
|
+
|
|
150
|
+
// src/api-client.ts
|
|
151
|
+
var DEFAULT_BASE_URL = "https://api.decantr.ai/v1";
|
|
152
|
+
var DEFAULT_TIMEOUT_MS = 8e3;
|
|
153
|
+
var DEFAULT_CACHE_TTL_MS = 5 * 60 * 1e3;
|
|
154
|
+
var RegistryAPIClient = class {
|
|
155
|
+
baseUrl;
|
|
156
|
+
apiKey;
|
|
157
|
+
timeoutMs;
|
|
158
|
+
cacheTtlMs;
|
|
159
|
+
cache = /* @__PURE__ */ new Map();
|
|
160
|
+
constructor(options = {}) {
|
|
161
|
+
this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;
|
|
162
|
+
this.apiKey = options.apiKey;
|
|
163
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
164
|
+
this.cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;
|
|
165
|
+
}
|
|
166
|
+
// ── HTTP helpers ──
|
|
167
|
+
buildHeaders() {
|
|
168
|
+
const headers = {
|
|
169
|
+
"Accept": "application/json"
|
|
170
|
+
};
|
|
171
|
+
if (this.apiKey) {
|
|
172
|
+
headers["X-API-Key"] = this.apiKey;
|
|
173
|
+
}
|
|
174
|
+
return headers;
|
|
175
|
+
}
|
|
176
|
+
async fetchWithTimeout(url, init) {
|
|
177
|
+
const controller = new AbortController();
|
|
178
|
+
const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
179
|
+
try {
|
|
180
|
+
return await fetch(url, { ...init, signal: controller.signal });
|
|
181
|
+
} finally {
|
|
182
|
+
clearTimeout(timeout);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async request(path, init) {
|
|
186
|
+
const url = `${this.baseUrl}${path}`;
|
|
187
|
+
const response = await this.fetchWithTimeout(url, {
|
|
188
|
+
...init,
|
|
189
|
+
headers: { ...this.buildHeaders(), ...init?.headers }
|
|
190
|
+
});
|
|
191
|
+
if (!response.ok) {
|
|
192
|
+
const body = await response.text().catch(() => "");
|
|
193
|
+
throw new Error(`API ${response.status}: ${body || response.statusText}`);
|
|
194
|
+
}
|
|
195
|
+
return response.json();
|
|
196
|
+
}
|
|
197
|
+
// ── Cache helpers ──
|
|
198
|
+
getCached(key) {
|
|
199
|
+
const entry = this.cache.get(key);
|
|
200
|
+
if (!entry) return null;
|
|
201
|
+
if (Date.now() - entry.timestamp > this.cacheTtlMs) {
|
|
202
|
+
this.cache.delete(key);
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
return entry.data;
|
|
206
|
+
}
|
|
207
|
+
setCache(key, data) {
|
|
208
|
+
this.cache.set(key, { data, timestamp: Date.now() });
|
|
209
|
+
}
|
|
210
|
+
clearCache() {
|
|
211
|
+
this.cache.clear();
|
|
212
|
+
}
|
|
213
|
+
// ── Health ──
|
|
214
|
+
async checkHealth() {
|
|
215
|
+
try {
|
|
216
|
+
const url = this.baseUrl.replace(/\/v1$/, "/health");
|
|
217
|
+
const response = await this.fetchWithTimeout(url);
|
|
218
|
+
return response.ok;
|
|
219
|
+
} catch {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// ── Content fetching (public) ──
|
|
224
|
+
async listContent(type, params) {
|
|
225
|
+
const cacheKey = `list:${type}:${JSON.stringify(params ?? {})}`;
|
|
226
|
+
const cached = this.getCached(cacheKey);
|
|
227
|
+
if (cached) return cached;
|
|
228
|
+
const searchParams = new URLSearchParams();
|
|
229
|
+
if (params?.namespace) searchParams.set("namespace", params.namespace);
|
|
230
|
+
if (params?.limit) searchParams.set("limit", String(params.limit));
|
|
231
|
+
if (params?.offset) searchParams.set("offset", String(params.offset));
|
|
232
|
+
const query = searchParams.toString();
|
|
233
|
+
const path = `/${type}${query ? `?${query}` : ""}`;
|
|
234
|
+
const result = await this.request(path);
|
|
235
|
+
this.setCache(cacheKey, result);
|
|
236
|
+
return result;
|
|
237
|
+
}
|
|
238
|
+
async getContent(type, namespace, slug) {
|
|
239
|
+
const cacheKey = `get:${type}:${namespace}:${slug}`;
|
|
240
|
+
const cached = this.getCached(cacheKey);
|
|
241
|
+
if (cached) return cached;
|
|
242
|
+
const result = await this.request(`/${type}/${namespace}/${slug}`);
|
|
243
|
+
this.setCache(cacheKey, result);
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
// ── Typed convenience methods ──
|
|
247
|
+
async getPattern(namespace, slug) {
|
|
248
|
+
return this.getContent("patterns", namespace, slug);
|
|
249
|
+
}
|
|
250
|
+
async getArchetype(namespace, slug) {
|
|
251
|
+
return this.getContent("archetypes", namespace, slug);
|
|
252
|
+
}
|
|
253
|
+
async getRecipe(namespace, slug) {
|
|
254
|
+
return this.getContent("recipes", namespace, slug);
|
|
255
|
+
}
|
|
256
|
+
async getTheme(namespace, slug) {
|
|
257
|
+
return this.getContent("themes", namespace, slug);
|
|
258
|
+
}
|
|
259
|
+
async getBlueprint(namespace, slug) {
|
|
260
|
+
return this.getContent("blueprints", namespace, slug);
|
|
261
|
+
}
|
|
262
|
+
async getShell(namespace, slug) {
|
|
263
|
+
return this.getContent("shells", namespace, slug);
|
|
264
|
+
}
|
|
265
|
+
// ── Search ──
|
|
266
|
+
async search(params) {
|
|
267
|
+
const searchParams = new URLSearchParams({ q: params.q });
|
|
268
|
+
if (params.type) searchParams.set("type", params.type);
|
|
269
|
+
if (params.namespace) searchParams.set("namespace", params.namespace);
|
|
270
|
+
if (params.limit) searchParams.set("limit", String(params.limit));
|
|
271
|
+
if (params.offset) searchParams.set("offset", String(params.offset));
|
|
272
|
+
return this.request(`/search?${searchParams}`);
|
|
273
|
+
}
|
|
274
|
+
// ── Authenticated endpoints ──
|
|
275
|
+
async getProfile() {
|
|
276
|
+
return this.request("/me");
|
|
277
|
+
}
|
|
278
|
+
async publishContent(payload) {
|
|
279
|
+
return this.request("/content", {
|
|
280
|
+
method: "POST",
|
|
281
|
+
headers: { "Content-Type": "application/json" },
|
|
282
|
+
body: JSON.stringify(payload)
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
async getMyContent() {
|
|
286
|
+
return this.request("/my/content");
|
|
287
|
+
}
|
|
288
|
+
// ── Schema ──
|
|
289
|
+
async getSchema(name = "essence.v3.json") {
|
|
290
|
+
return this.request(`/schema/${name}`);
|
|
291
|
+
}
|
|
292
|
+
};
|
|
146
293
|
export {
|
|
294
|
+
RegistryAPIClient,
|
|
147
295
|
WIRING_RULES,
|
|
148
296
|
createRegistryClient,
|
|
149
297
|
createResolver,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/resolver.ts","../src/pattern.ts","../src/wiring.ts","../src/client.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Pattern, Archetype, Recipe, ContentType, ResolvedContent } from './types.js';\n\ntype ContentMap = {\n pattern: Pattern;\n archetype: Archetype;\n recipe: Recipe;\n theme: Record<string, unknown>;\n blueprint: Record<string, unknown>;\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 recipe: 'recipes',\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 const corePath = join(contentRoot, dir, fileName);\n const coreItem = await tryLoadJson<ContentMap[T]>(corePath);\n if (coreItem) return { item: coreItem, source: 'core', path: corePath };\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 recipeDefaultPresets?: 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 && recipeDefaultPresets?.[pattern.id]) {\n const recipeName = recipeDefaultPresets[pattern.id];\n if (presets[recipeName]) presetName = recipeName;\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';\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\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\nexport function detectWirings(layout: LayoutItem[]): WiringResult[] {\n const patternIds = layout.map(getPatternId).filter((id): id is string => id !== null);\n const results: WiringResult[] = [];\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 }\n }\n return results;\n}\n","export interface RegistryClientOptions {\n baseUrl?: string;\n cacheDir?: string;\n cacheTtl?: number;\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://decantr-registry.fly.dev/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/client.ts","../src/api-client.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Pattern, Archetype, Recipe, ContentType, ResolvedContent } from './types.js';\n\ntype ContentMap = {\n pattern: Pattern;\n archetype: Archetype;\n recipe: Recipe;\n theme: Record<string, unknown>;\n blueprint: Record<string, unknown>;\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 recipe: 'recipes',\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 recipeDefaultPresets?: 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 && recipeDefaultPresets?.[pattern.id]) {\n const recipeName = recipeDefaultPresets[pattern.id];\n if (presets[recipeName]) presetName = recipeName;\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';\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\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\nexport function detectWirings(layout: LayoutItem[]): WiringResult[] {\n const patternIds = layout.map(getPatternId).filter((id): id is string => id !== null);\n const results: WiringResult[] = [];\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 }\n }\n return results;\n}\n","export interface RegistryClientOptions {\n baseUrl?: string;\n cacheDir?: string;\n cacheTtl?: number;\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","import type {\n Pattern,\n Archetype,\n Recipe,\n Theme,\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 = 8000;\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 getRecipe(namespace: string, slug: string): Promise<Recipe> {\n return this.getContent<Recipe>('recipes', 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<Record<string, unknown>> {\n return this.getContent<Record<string, unknown>>('blueprints', namespace, slug);\n }\n\n async getShell(namespace: string, slug: string): Promise<Record<string, unknown>> {\n return this.getContent<Record<string, unknown>>('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"],"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.4",
|
|
4
4
|
"description": "Registry format, content resolver, and wiring rules for Decantr",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -18,18 +18,16 @@
|
|
|
18
18
|
"types": "./dist/index.d.ts"
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
|
-
"files": [
|
|
22
|
-
"dist"
|
|
23
|
-
],
|
|
21
|
+
"files": ["dist"],
|
|
24
22
|
"publishConfig": {
|
|
25
23
|
"access": "public"
|
|
26
24
|
},
|
|
27
|
-
"dependencies": {
|
|
28
|
-
"@decantr/essence-spec": "1.0.0-beta.3"
|
|
29
|
-
},
|
|
30
25
|
"scripts": {
|
|
31
26
|
"build": "tsup",
|
|
32
27
|
"test": "vitest run",
|
|
33
28
|
"test:watch": "vitest"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@decantr/essence-spec": "workspace:*"
|
|
34
32
|
}
|
|
35
|
-
}
|
|
33
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
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.
|