@contentrain/query 7.3.7 → 7.4.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.
Files changed (40) hide show
  1. package/README.md +51 -8
  2. package/dist/astro/index.cjs +30 -2
  3. package/dist/astro/index.d.cts +9 -0
  4. package/dist/astro/index.d.cts.map +1 -1
  5. package/dist/astro/index.d.mts +10 -1
  6. package/dist/astro/index.d.mts.map +1 -1
  7. package/dist/astro/index.mjs +30 -2
  8. package/dist/astro/index.mjs.map +1 -1
  9. package/dist/cdn/index.d.mts +1 -1
  10. package/dist/cli.cjs +1 -1
  11. package/dist/cli.mjs +1 -1
  12. package/dist/{frontmatter-BUaCvV-s.mjs → frontmatter-D9yVqC5y.mjs} +2 -2
  13. package/dist/{frontmatter-BUaCvV-s.mjs.map → frontmatter-D9yVqC5y.mjs.map} +1 -1
  14. package/dist/{generate-CdLXEj13.mjs → generate-BOi6o7Z5.mjs} +27 -14
  15. package/dist/generate-BOi6o7Z5.mjs.map +1 -0
  16. package/dist/{generate-oSHTaAuy.cjs → generate-D4NDHZ_K.cjs} +26 -13
  17. package/dist/generator/generate.cjs +1 -1
  18. package/dist/generator/generate.d.cts +10 -5
  19. package/dist/generator/generate.d.cts.map +1 -1
  20. package/dist/generator/generate.d.mts +11 -6
  21. package/dist/generator/generate.d.mts.map +1 -1
  22. package/dist/generator/generate.mjs +1 -1
  23. package/dist/{index-DWpmPtUW.d.mts → index-ClftI9li.d.mts} +1 -1
  24. package/dist/{index-DWpmPtUW.d.mts.map → index-ClftI9li.d.mts.map} +1 -1
  25. package/dist/index.cjs +3 -0
  26. package/dist/index.d.cts +18 -1
  27. package/dist/index.d.cts.map +1 -1
  28. package/dist/index.d.mts +19 -2
  29. package/dist/index.d.mts.map +1 -1
  30. package/dist/index.mjs +2 -1
  31. package/dist/index.mjs.map +1 -1
  32. package/dist/media-HEEDdrFS.mjs +27 -0
  33. package/dist/media-HEEDdrFS.mjs.map +1 -0
  34. package/dist/media-o6KezVYy.cjs +36 -0
  35. package/dist/{publication-Ba8bLPAO.d.mts → publication-CMrWLPi7.d.mts} +1 -1
  36. package/dist/publication-CMrWLPi7.d.mts.map +1 -0
  37. package/package.json +2 -2
  38. package/dist/generate-CdLXEj13.mjs.map +0 -1
  39. package/dist/publication-Ba8bLPAO.d.mts.map +0 -1
  40. package/dist/{frontmatter-DERIsjeG.cjs → frontmatter-DSpE3so9.cjs} +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/runtime/query.ts","../src/runtime/singleton.ts","../src/runtime/dictionary.ts","../src/runtime/document.ts","../src/index.ts"],"sourcesContent":["import type { WhereOp, WhereClause } from '../shared/where.js'\nimport { applyWhere } from '../shared/where.js'\n\nexport type { WhereOp }\n\nexport interface RelationMeta {\n target: string | string[]\n multi: boolean\n}\n\nexport type RelationResolver = (model: string, id: string, locale: string | null) => Record<string, unknown> | undefined\n\nexport class QueryBuilder<T extends object> {\n private _data: Map<string, T[]>\n private _locale: string | null = null\n private _filters: WhereClause[] = []\n private _sortField: string | null = null\n private _sortOrder: 'asc' | 'desc' = 'asc'\n private _limit: number | null = null\n private _offset = 0\n private _includes: string[] = []\n private _relationMeta: Record<string, RelationMeta>\n private _resolver: RelationResolver | null\n private _defaultLocale: string | null\n\n constructor(\n data: Map<string, T[]>,\n relationMeta?: Record<string, RelationMeta>,\n resolver?: RelationResolver,\n defaultLocale?: string,\n ) {\n this._data = data\n this._relationMeta = relationMeta ?? {}\n this._resolver = resolver ?? null\n this._defaultLocale = defaultLocale ?? null\n }\n\n locale(lang: string): this {\n this._locale = lang\n return this\n }\n\n where<K extends string & keyof T>(field: K, value: T[K]): this\n where<K extends string & keyof T>(field: K, op: WhereOp, value: unknown): this\n where<K extends string & keyof T>(field: K, opOrValue: WhereOp | T[K], value?: unknown): this {\n if (value !== undefined) {\n this._filters.push({ field, op: opOrValue as WhereOp, value })\n } else {\n this._filters.push({ field, op: 'eq', value: opOrValue })\n }\n return this\n }\n\n sort<K extends string & keyof T>(field: K, order: 'asc' | 'desc' = 'asc'): this {\n this._sortField = field\n this._sortOrder = order\n return this\n }\n\n limit(n: number): this {\n this._limit = n\n return this\n }\n\n offset(n: number): this {\n this._offset = n\n return this\n }\n\n include(...fields: string[]): this {\n this._includes.push(...fields)\n return this\n }\n\n count(): number {\n return this.all().length\n }\n\n all(): T[] {\n let items = this._resolveData()\n\n // Filter\n for (const clause of this._filters) {\n items = items.filter(item => applyWhere(item, clause))\n }\n\n // Sort\n if (this._sortField) {\n const field = this._sortField\n const dir = this._sortOrder === 'asc' ? 1 : -1\n items.sort((a, b) => {\n const va = (a as Record<string, unknown>)[field]\n const vb = (b as Record<string, unknown>)[field]\n if (va == null && vb == null) return 0\n if (va == null) return dir\n if (vb == null) return -dir\n if (va < vb) return -dir\n if (va > vb) return dir\n return 0\n })\n }\n\n // Pagination\n if (this._offset > 0 || this._limit !== null) {\n const end = this._limit !== null ? this._offset + this._limit : undefined\n items = items.slice(this._offset, end)\n }\n\n // Resolve relations (after pagination for efficiency)\n if (this._includes.length > 0 && this._resolver) {\n items = items.map(item => this._resolveIncludes(item))\n }\n\n return items\n }\n\n first(): T | undefined {\n return this.all()[0]\n }\n\n private _resolveData(): T[] {\n if (this._locale) {\n return [...(this._data.get(this._locale) ?? [])]\n }\n if (this._defaultLocale) {\n const defaultData = this._data.get(this._defaultLocale)\n if (defaultData) return [...defaultData]\n }\n const firstKey = this._data.keys().next().value\n if (firstKey !== undefined) {\n return [...(this._data.get(firstKey) ?? [])]\n }\n return []\n }\n\n private _resolveIncludes(item: T): T {\n const resolved = { ...item }\n const src = item as Record<string, unknown>\n const dst = resolved as Record<string, unknown>\n for (const field of this._includes) {\n const meta = this._relationMeta[field]\n if (!meta) continue\n const targets = Array.isArray(meta.target) ? meta.target : [meta.target]\n\n if (meta.multi) {\n const ids = src[field]\n if (Array.isArray(ids)) {\n dst[field] = ids.map((id) => {\n if (typeof id === 'string') {\n return this._resolveId(targets, id) ?? id\n }\n if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) {\n const polyObj = id as { model: string; ref: string }\n return this._resolveId([polyObj.model], polyObj.ref) ?? id\n }\n return id\n })\n }\n } else {\n const id = src[field]\n if (typeof id === 'string') {\n dst[field] = this._resolveId(targets, id) ?? id\n } else if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) {\n const polyObj = id as { model: string; ref: string }\n dst[field] = this._resolveId([polyObj.model], polyObj.ref) ?? id\n }\n }\n }\n return resolved\n }\n\n private _resolveId(targets: string[], id: string): Record<string, unknown> | undefined {\n const loc = this._locale ?? this._defaultLocale\n for (const target of targets) {\n const result = this._resolver!(target, id, loc)\n if (result) return result\n }\n return undefined\n }\n}\n","export class SingletonAccessor<T extends Record<string, unknown>> {\n private _data: Map<string, T>\n private _locale: string | null = null\n private _defaultLocale: string | null\n private _includes: string[] = []\n private _relationMeta: Record<string, { target: string | string[]; multi: boolean }> = {}\n private _resolveEntry?: (model: string, id: string, locale: string) => unknown\n\n constructor(\n data: Map<string, T>,\n defaultLocale?: string,\n relationMeta?: Record<string, { target: string | string[]; multi: boolean }>,\n resolveEntry?: (model: string, id: string, locale: string) => unknown,\n ) {\n this._data = data\n this._defaultLocale = defaultLocale ?? null\n if (relationMeta) this._relationMeta = relationMeta\n this._resolveEntry = resolveEntry\n }\n\n locale(lang: string): this {\n this._locale = lang\n return this\n }\n\n include(...fields: string[]): this {\n this._includes.push(...fields)\n return this\n }\n\n get(): T {\n if (this._locale) {\n const d = this._data.get(this._locale)\n if (!d) throw new Error(`No data for locale \"${this._locale}\"`)\n if (this._includes.length > 0) return this._resolveIncludes(d, this._locale)\n return d\n }\n\n const locale = this._defaultLocale ?? undefined\n let data: T | undefined\n\n if (locale) {\n data = this._data.get(locale)\n }\n if (!data) {\n const firstKey = this._data.keys().next().value\n if (firstKey !== undefined) {\n data = this._data.get(firstKey)\n }\n }\n if (!data) throw new Error('No data available')\n\n if (this._includes.length > 0) {\n return this._resolveIncludes(data, locale ?? 'en')\n }\n return data\n }\n\n private _resolveIncludes(item: T, locale: string): T {\n if (!this._resolveEntry || this._includes.length === 0) return item\n const resolved = { ...item }\n const src = item as Record<string, unknown>\n const dst = resolved as Record<string, unknown>\n\n for (const field of this._includes) {\n const meta = this._relationMeta[field]\n if (!meta) continue\n const targets = Array.isArray(meta.target) ? meta.target : [meta.target]\n\n if (meta.multi) {\n const ids = src[field]\n if (Array.isArray(ids)) {\n dst[field] = ids.map((id) => {\n if (typeof id === 'string') {\n return this._resolveId(targets, id, locale) ?? id\n }\n if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) {\n const polyObj = id as { model: string; ref: string }\n return this._resolveId([polyObj.model], polyObj.ref, locale) ?? id\n }\n return id\n })\n }\n } else {\n const id = src[field]\n if (typeof id === 'string') {\n dst[field] = this._resolveId(targets, id, locale) ?? id\n } else if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) {\n const polyObj = id as { model: string; ref: string }\n dst[field] = this._resolveId([polyObj.model], polyObj.ref, locale) ?? id\n }\n }\n }\n\n return resolved\n }\n\n private _resolveId(targets: string[], id: string, locale: string): unknown {\n if (!this._resolveEntry) return undefined\n for (const model of targets) {\n const result = this._resolveEntry(model, id, locale)\n if (result) return result\n }\n return undefined\n }\n}\n","export class DictionaryAccessor {\n private _data: Map<string, Record<string, string>>\n private _locale: string | null = null\n private _defaultLocale: string | null\n\n constructor(data: Map<string, Record<string, string>>, defaultLocale?: string) {\n this._data = data\n this._defaultLocale = defaultLocale ?? null\n }\n\n locale(lang: string): this {\n this._locale = lang\n return this\n }\n\n get(): Record<string, string>\n get(key: string): string | undefined\n get(key: string, params: Record<string, string | number>): string\n get(key?: string, params?: Record<string, string | number>): Record<string, string> | string | undefined {\n const dict = this._resolveData()\n if (key === undefined) return dict\n const value = dict[key]\n if (value === undefined) return undefined\n if (params) return interpolate(value, params)\n return value\n }\n\n private _resolveData(): Record<string, string> {\n if (this._locale) {\n return this._data.get(this._locale) ?? {}\n }\n if (this._defaultLocale) {\n const d = this._data.get(this._defaultLocale)\n if (d) return d\n }\n const firstKey = this._data.keys().next().value\n if (firstKey !== undefined) {\n return this._data.get(firstKey) ?? {}\n }\n return {}\n }\n}\n\nfunction interpolate(template: string, params: Record<string, string | number>): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key: string) => {\n const val = params[key]\n return val !== undefined ? String(val) : match\n })\n}\n","import type { RelationMeta, RelationResolver } from './query.js'\nimport type { WhereOp, WhereClause } from '../shared/where.js'\nimport { applyWhere } from '../shared/where.js'\n\nexport class DocumentQuery<T extends object> {\n private _data: Map<string, T[]>\n private _locale: string | null = null\n private _filters: WhereClause[] = []\n private _sortField: string | null = null\n private _sortOrder: 'asc' | 'desc' = 'asc'\n private _includes: string[] = []\n private _relationMeta: Record<string, RelationMeta>\n private _resolver: RelationResolver | null\n private _defaultLocale: string | null\n\n constructor(\n data: Map<string, T[]>,\n relationMeta?: Record<string, RelationMeta>,\n resolver?: RelationResolver,\n defaultLocale?: string,\n ) {\n this._data = data\n this._relationMeta = relationMeta ?? {}\n this._resolver = resolver ?? null\n this._defaultLocale = defaultLocale ?? null\n }\n\n locale(lang: string): this {\n this._locale = lang\n return this\n }\n\n where<K extends string & keyof T>(field: K, value: T[K]): this\n where<K extends string & keyof T>(field: K, op: WhereOp, value: unknown): this\n where<K extends string & keyof T>(field: K, opOrValue: WhereOp | T[K], value?: unknown): this {\n if (value !== undefined) {\n this._filters.push({ field, op: opOrValue as WhereOp, value })\n } else {\n this._filters.push({ field, op: 'eq', value: opOrValue })\n }\n return this\n }\n\n sort<K extends string & keyof T>(field: K, order: 'asc' | 'desc' = 'asc'): this {\n this._sortField = field\n this._sortOrder = order\n return this\n }\n\n include(...fields: string[]): this {\n this._includes.push(...fields)\n return this\n }\n\n bySlug(slug: string): T | undefined {\n const items = this._resolveData()\n const item = items.find(i => (i as Record<string, unknown>)['slug'] === slug)\n if (item && this._includes.length > 0 && this._resolver) {\n return this._resolveIncludes(item)\n }\n return item\n }\n\n count(): number {\n return this.all().length\n }\n\n all(): T[] {\n let items = this._resolveData()\n for (const clause of this._filters) {\n items = items.filter(item => applyWhere(item, clause))\n }\n if (this._sortField) {\n const sf = this._sortField\n const dir = this._sortOrder === 'asc' ? 1 : -1\n items = items.toSorted((a, b) => {\n const va = (a as Record<string, unknown>)[sf] as number | string | null | undefined\n const vb = (b as Record<string, unknown>)[sf] as number | string | null | undefined\n if (va == null && vb == null) return 0\n if (va == null) return dir\n if (vb == null) return -dir\n return va < vb ? -dir : va > vb ? dir : 0\n })\n }\n if (this._includes.length > 0 && this._resolver) {\n items = items.map(item => this._resolveIncludes(item))\n }\n return items\n }\n\n first(): T | undefined {\n return this.all()[0]\n }\n\n private _resolveData(): T[] {\n if (this._locale) {\n return [...(this._data.get(this._locale) ?? [])]\n }\n if (this._defaultLocale) {\n const defaultData = this._data.get(this._defaultLocale)\n if (defaultData) return [...defaultData]\n }\n const firstKey = this._data.keys().next().value\n if (firstKey !== undefined) {\n return [...(this._data.get(firstKey) ?? [])]\n }\n return []\n }\n\n private _resolveIncludes(item: T): T {\n const resolved = { ...item }\n const src = item as Record<string, unknown>\n const dst = resolved as Record<string, unknown>\n for (const field of this._includes) {\n const meta = this._relationMeta[field]\n if (!meta) continue\n const targets = Array.isArray(meta.target) ? meta.target : [meta.target]\n\n if (meta.multi) {\n const ids = src[field]\n if (Array.isArray(ids)) {\n dst[field] = ids.map((id) => {\n if (typeof id === 'string') {\n return this._resolveId(targets, id) ?? id\n }\n if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) {\n const polyObj = id as { model: string; ref: string }\n return this._resolveId([polyObj.model], polyObj.ref) ?? id\n }\n return id\n })\n }\n } else {\n const id = src[field]\n if (typeof id === 'string') {\n dst[field] = this._resolveId(targets, id) ?? id\n } else if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) {\n const polyObj = id as { model: string; ref: string }\n dst[field] = this._resolveId([polyObj.model], polyObj.ref) ?? id\n }\n }\n }\n return resolved\n }\n\n private _resolveId(targets: string[], id: string): Record<string, unknown> | undefined {\n const loc = this._locale ?? this._defaultLocale\n for (const target of targets) {\n const result = this._resolver!(target, id, loc)\n if (result) return result\n }\n return undefined\n }\n}\n","// Runtime exports — used by framework SDK authors and generated client\nexport { QueryBuilder } from './runtime/query.js'\nexport type { RelationMeta, RelationResolver, WhereOp } from './runtime/query.js'\nexport { SingletonAccessor } from './runtime/singleton.js'\nexport { DictionaryAccessor } from './runtime/dictionary.js'\nexport { DocumentQuery } from './runtime/document.js'\n\n// Shared utilities\nexport type { WhereClause } from './shared/where.js'\nexport { applyWhere } from './shared/where.js'\n\n// Re-export types from @contentrain/types that SDK consumers need\nexport type {\n FieldType,\n ModelKind,\n ContentStatus,\n FieldDef,\n ModelDefinition,\n ContentrainConfig,\n} from '@contentrain/types'\n\n/**\n * Factory for framework SDK authors.\n * Returns the generated client module loaded from .contentrain/client/.\n *\n * Usage (Nuxt composable):\n * ```ts\n * import { createContentrainClient } from '@contentrain/query'\n * const client = createContentrainClient()\n * const posts = client.query('blog-post').locale('en').all()\n * ```\n */\nexport async function createContentrainClient(\n projectRoot?: string,\n): Promise<{\n query: (model: string) => import('./runtime/query.js').QueryBuilder<Record<string, unknown>>\n singleton: (model: string) => import('./runtime/singleton.js').SingletonAccessor<Record<string, unknown>>\n dictionary: (model: string) => import('./runtime/dictionary.js').DictionaryAccessor\n document: (model: string) => import('./runtime/document.js').DocumentQuery<Record<string, unknown>>\n}> {\n const { resolve } = await import('node:path')\n const { pathToFileURL } = await import('node:url')\n const root = projectRoot ?? process.cwd()\n const clientPath = resolve(root, '.contentrain', 'client', 'index.mjs')\n const client = await import(pathToFileURL(clientPath).href)\n return client\n}\n\n// CDN client factory — async, HTTP-based\nexport { createContentrain } from './cdn/index.js'\nexport type { ContentrainCDNConfig, ContentrainCDNClient } from './cdn/index.js'\nexport type { DocumentIndexEntry } from './cdn/data-source.js'\nexport { ContentrainError } from './cdn/errors.js'\n\n// CDN module re-exports — media, forms, comments, metadata\nexport { MediaAccessor } from './cdn/media-accessor.js'\nexport type { MediaAsset, MediaAssetMeta, MediaManifest } from './cdn/media-accessor.js'\nexport { FormsClient } from './cdn/forms-client.js'\nexport type { FormConfig, FormFieldConfig, FormFieldError, FormSubmitOptions, FormSubmitResult, FormsClientConfig } from './cdn/forms-client.js'\nexport { CommentsClient } from './cdn/comments-client.js'\nexport type {\n CommentAuthor,\n CommentFieldError,\n CommentSubmission,\n CommentSubmitResult,\n CommentThread,\n CommentThreadConfig,\n CommentThreadQuery,\n CommentsClientConfig,\n PublicComment,\n} from './cdn/comments-client.js'\nexport type { EntryMeta } from './cdn/collection-query.js'\nexport { ConversationClient } from './cdn/conversation-client.js'\nexport type {\n ConversationClientConfig,\n ConversationResponse,\n ConversationMessage,\n ConversationHistory,\n} from './cdn/conversation-client.js'\n\n// Sync factory for CJS — requires generated client to be pre-loaded\nexport { createContentrainClient as default }\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/runtime/query.ts","../src/runtime/singleton.ts","../src/runtime/dictionary.ts","../src/runtime/document.ts","../src/index.ts"],"sourcesContent":["import type { WhereOp, WhereClause } from '../shared/where.js'\nimport { applyWhere } from '../shared/where.js'\n\nexport type { WhereOp }\n\nexport interface RelationMeta {\n target: string | string[]\n multi: boolean\n}\n\nexport type RelationResolver = (model: string, id: string, locale: string | null) => Record<string, unknown> | undefined\n\nexport class QueryBuilder<T extends object> {\n private _data: Map<string, T[]>\n private _locale: string | null = null\n private _filters: WhereClause[] = []\n private _sortField: string | null = null\n private _sortOrder: 'asc' | 'desc' = 'asc'\n private _limit: number | null = null\n private _offset = 0\n private _includes: string[] = []\n private _relationMeta: Record<string, RelationMeta>\n private _resolver: RelationResolver | null\n private _defaultLocale: string | null\n\n constructor(\n data: Map<string, T[]>,\n relationMeta?: Record<string, RelationMeta>,\n resolver?: RelationResolver,\n defaultLocale?: string,\n ) {\n this._data = data\n this._relationMeta = relationMeta ?? {}\n this._resolver = resolver ?? null\n this._defaultLocale = defaultLocale ?? null\n }\n\n locale(lang: string): this {\n this._locale = lang\n return this\n }\n\n where<K extends string & keyof T>(field: K, value: T[K]): this\n where<K extends string & keyof T>(field: K, op: WhereOp, value: unknown): this\n where<K extends string & keyof T>(field: K, opOrValue: WhereOp | T[K], value?: unknown): this {\n if (value !== undefined) {\n this._filters.push({ field, op: opOrValue as WhereOp, value })\n } else {\n this._filters.push({ field, op: 'eq', value: opOrValue })\n }\n return this\n }\n\n sort<K extends string & keyof T>(field: K, order: 'asc' | 'desc' = 'asc'): this {\n this._sortField = field\n this._sortOrder = order\n return this\n }\n\n limit(n: number): this {\n this._limit = n\n return this\n }\n\n offset(n: number): this {\n this._offset = n\n return this\n }\n\n include(...fields: string[]): this {\n this._includes.push(...fields)\n return this\n }\n\n count(): number {\n return this.all().length\n }\n\n all(): T[] {\n let items = this._resolveData()\n\n // Filter\n for (const clause of this._filters) {\n items = items.filter(item => applyWhere(item, clause))\n }\n\n // Sort\n if (this._sortField) {\n const field = this._sortField\n const dir = this._sortOrder === 'asc' ? 1 : -1\n items.sort((a, b) => {\n const va = (a as Record<string, unknown>)[field]\n const vb = (b as Record<string, unknown>)[field]\n if (va == null && vb == null) return 0\n if (va == null) return dir\n if (vb == null) return -dir\n if (va < vb) return -dir\n if (va > vb) return dir\n return 0\n })\n }\n\n // Pagination\n if (this._offset > 0 || this._limit !== null) {\n const end = this._limit !== null ? this._offset + this._limit : undefined\n items = items.slice(this._offset, end)\n }\n\n // Resolve relations (after pagination for efficiency)\n if (this._includes.length > 0 && this._resolver) {\n items = items.map(item => this._resolveIncludes(item))\n }\n\n return items\n }\n\n first(): T | undefined {\n return this.all()[0]\n }\n\n private _resolveData(): T[] {\n if (this._locale) {\n return [...(this._data.get(this._locale) ?? [])]\n }\n if (this._defaultLocale) {\n const defaultData = this._data.get(this._defaultLocale)\n if (defaultData) return [...defaultData]\n }\n const firstKey = this._data.keys().next().value\n if (firstKey !== undefined) {\n return [...(this._data.get(firstKey) ?? [])]\n }\n return []\n }\n\n private _resolveIncludes(item: T): T {\n const resolved = { ...item }\n const src = item as Record<string, unknown>\n const dst = resolved as Record<string, unknown>\n for (const field of this._includes) {\n const meta = this._relationMeta[field]\n if (!meta) continue\n const targets = Array.isArray(meta.target) ? meta.target : [meta.target]\n\n if (meta.multi) {\n const ids = src[field]\n if (Array.isArray(ids)) {\n dst[field] = ids.map((id) => {\n if (typeof id === 'string') {\n return this._resolveId(targets, id) ?? id\n }\n if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) {\n const polyObj = id as { model: string; ref: string }\n return this._resolveId([polyObj.model], polyObj.ref) ?? id\n }\n return id\n })\n }\n } else {\n const id = src[field]\n if (typeof id === 'string') {\n dst[field] = this._resolveId(targets, id) ?? id\n } else if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) {\n const polyObj = id as { model: string; ref: string }\n dst[field] = this._resolveId([polyObj.model], polyObj.ref) ?? id\n }\n }\n }\n return resolved\n }\n\n private _resolveId(targets: string[], id: string): Record<string, unknown> | undefined {\n const loc = this._locale ?? this._defaultLocale\n for (const target of targets) {\n const result = this._resolver!(target, id, loc)\n if (result) return result\n }\n return undefined\n }\n}\n","export class SingletonAccessor<T extends Record<string, unknown>> {\n private _data: Map<string, T>\n private _locale: string | null = null\n private _defaultLocale: string | null\n private _includes: string[] = []\n private _relationMeta: Record<string, { target: string | string[]; multi: boolean }> = {}\n private _resolveEntry?: (model: string, id: string, locale: string) => unknown\n\n constructor(\n data: Map<string, T>,\n defaultLocale?: string,\n relationMeta?: Record<string, { target: string | string[]; multi: boolean }>,\n resolveEntry?: (model: string, id: string, locale: string) => unknown,\n ) {\n this._data = data\n this._defaultLocale = defaultLocale ?? null\n if (relationMeta) this._relationMeta = relationMeta\n this._resolveEntry = resolveEntry\n }\n\n locale(lang: string): this {\n this._locale = lang\n return this\n }\n\n include(...fields: string[]): this {\n this._includes.push(...fields)\n return this\n }\n\n get(): T {\n if (this._locale) {\n const d = this._data.get(this._locale)\n if (!d) throw new Error(`No data for locale \"${this._locale}\"`)\n if (this._includes.length > 0) return this._resolveIncludes(d, this._locale)\n return d\n }\n\n const locale = this._defaultLocale ?? undefined\n let data: T | undefined\n\n if (locale) {\n data = this._data.get(locale)\n }\n if (!data) {\n const firstKey = this._data.keys().next().value\n if (firstKey !== undefined) {\n data = this._data.get(firstKey)\n }\n }\n if (!data) throw new Error('No data available')\n\n if (this._includes.length > 0) {\n return this._resolveIncludes(data, locale ?? 'en')\n }\n return data\n }\n\n private _resolveIncludes(item: T, locale: string): T {\n if (!this._resolveEntry || this._includes.length === 0) return item\n const resolved = { ...item }\n const src = item as Record<string, unknown>\n const dst = resolved as Record<string, unknown>\n\n for (const field of this._includes) {\n const meta = this._relationMeta[field]\n if (!meta) continue\n const targets = Array.isArray(meta.target) ? meta.target : [meta.target]\n\n if (meta.multi) {\n const ids = src[field]\n if (Array.isArray(ids)) {\n dst[field] = ids.map((id) => {\n if (typeof id === 'string') {\n return this._resolveId(targets, id, locale) ?? id\n }\n if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) {\n const polyObj = id as { model: string; ref: string }\n return this._resolveId([polyObj.model], polyObj.ref, locale) ?? id\n }\n return id\n })\n }\n } else {\n const id = src[field]\n if (typeof id === 'string') {\n dst[field] = this._resolveId(targets, id, locale) ?? id\n } else if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) {\n const polyObj = id as { model: string; ref: string }\n dst[field] = this._resolveId([polyObj.model], polyObj.ref, locale) ?? id\n }\n }\n }\n\n return resolved\n }\n\n private _resolveId(targets: string[], id: string, locale: string): unknown {\n if (!this._resolveEntry) return undefined\n for (const model of targets) {\n const result = this._resolveEntry(model, id, locale)\n if (result) return result\n }\n return undefined\n }\n}\n","export class DictionaryAccessor {\n private _data: Map<string, Record<string, string>>\n private _locale: string | null = null\n private _defaultLocale: string | null\n\n constructor(data: Map<string, Record<string, string>>, defaultLocale?: string) {\n this._data = data\n this._defaultLocale = defaultLocale ?? null\n }\n\n locale(lang: string): this {\n this._locale = lang\n return this\n }\n\n get(): Record<string, string>\n get(key: string): string | undefined\n get(key: string, params: Record<string, string | number>): string\n get(key?: string, params?: Record<string, string | number>): Record<string, string> | string | undefined {\n const dict = this._resolveData()\n if (key === undefined) return dict\n const value = dict[key]\n if (value === undefined) return undefined\n if (params) return interpolate(value, params)\n return value\n }\n\n private _resolveData(): Record<string, string> {\n if (this._locale) {\n return this._data.get(this._locale) ?? {}\n }\n if (this._defaultLocale) {\n const d = this._data.get(this._defaultLocale)\n if (d) return d\n }\n const firstKey = this._data.keys().next().value\n if (firstKey !== undefined) {\n return this._data.get(firstKey) ?? {}\n }\n return {}\n }\n}\n\nfunction interpolate(template: string, params: Record<string, string | number>): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key: string) => {\n const val = params[key]\n return val !== undefined ? String(val) : match\n })\n}\n","import type { RelationMeta, RelationResolver } from './query.js'\nimport type { WhereOp, WhereClause } from '../shared/where.js'\nimport { applyWhere } from '../shared/where.js'\n\nexport class DocumentQuery<T extends object> {\n private _data: Map<string, T[]>\n private _locale: string | null = null\n private _filters: WhereClause[] = []\n private _sortField: string | null = null\n private _sortOrder: 'asc' | 'desc' = 'asc'\n private _includes: string[] = []\n private _relationMeta: Record<string, RelationMeta>\n private _resolver: RelationResolver | null\n private _defaultLocale: string | null\n\n constructor(\n data: Map<string, T[]>,\n relationMeta?: Record<string, RelationMeta>,\n resolver?: RelationResolver,\n defaultLocale?: string,\n ) {\n this._data = data\n this._relationMeta = relationMeta ?? {}\n this._resolver = resolver ?? null\n this._defaultLocale = defaultLocale ?? null\n }\n\n locale(lang: string): this {\n this._locale = lang\n return this\n }\n\n where<K extends string & keyof T>(field: K, value: T[K]): this\n where<K extends string & keyof T>(field: K, op: WhereOp, value: unknown): this\n where<K extends string & keyof T>(field: K, opOrValue: WhereOp | T[K], value?: unknown): this {\n if (value !== undefined) {\n this._filters.push({ field, op: opOrValue as WhereOp, value })\n } else {\n this._filters.push({ field, op: 'eq', value: opOrValue })\n }\n return this\n }\n\n sort<K extends string & keyof T>(field: K, order: 'asc' | 'desc' = 'asc'): this {\n this._sortField = field\n this._sortOrder = order\n return this\n }\n\n include(...fields: string[]): this {\n this._includes.push(...fields)\n return this\n }\n\n bySlug(slug: string): T | undefined {\n const items = this._resolveData()\n const item = items.find(i => (i as Record<string, unknown>)['slug'] === slug)\n if (item && this._includes.length > 0 && this._resolver) {\n return this._resolveIncludes(item)\n }\n return item\n }\n\n count(): number {\n return this.all().length\n }\n\n all(): T[] {\n let items = this._resolveData()\n for (const clause of this._filters) {\n items = items.filter(item => applyWhere(item, clause))\n }\n if (this._sortField) {\n const sf = this._sortField\n const dir = this._sortOrder === 'asc' ? 1 : -1\n items = items.toSorted((a, b) => {\n const va = (a as Record<string, unknown>)[sf] as number | string | null | undefined\n const vb = (b as Record<string, unknown>)[sf] as number | string | null | undefined\n if (va == null && vb == null) return 0\n if (va == null) return dir\n if (vb == null) return -dir\n return va < vb ? -dir : va > vb ? dir : 0\n })\n }\n if (this._includes.length > 0 && this._resolver) {\n items = items.map(item => this._resolveIncludes(item))\n }\n return items\n }\n\n first(): T | undefined {\n return this.all()[0]\n }\n\n private _resolveData(): T[] {\n if (this._locale) {\n return [...(this._data.get(this._locale) ?? [])]\n }\n if (this._defaultLocale) {\n const defaultData = this._data.get(this._defaultLocale)\n if (defaultData) return [...defaultData]\n }\n const firstKey = this._data.keys().next().value\n if (firstKey !== undefined) {\n return [...(this._data.get(firstKey) ?? [])]\n }\n return []\n }\n\n private _resolveIncludes(item: T): T {\n const resolved = { ...item }\n const src = item as Record<string, unknown>\n const dst = resolved as Record<string, unknown>\n for (const field of this._includes) {\n const meta = this._relationMeta[field]\n if (!meta) continue\n const targets = Array.isArray(meta.target) ? meta.target : [meta.target]\n\n if (meta.multi) {\n const ids = src[field]\n if (Array.isArray(ids)) {\n dst[field] = ids.map((id) => {\n if (typeof id === 'string') {\n return this._resolveId(targets, id) ?? id\n }\n if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) {\n const polyObj = id as { model: string; ref: string }\n return this._resolveId([polyObj.model], polyObj.ref) ?? id\n }\n return id\n })\n }\n } else {\n const id = src[field]\n if (typeof id === 'string') {\n dst[field] = this._resolveId(targets, id) ?? id\n } else if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) {\n const polyObj = id as { model: string; ref: string }\n dst[field] = this._resolveId([polyObj.model], polyObj.ref) ?? id\n }\n }\n }\n return resolved\n }\n\n private _resolveId(targets: string[], id: string): Record<string, unknown> | undefined {\n const loc = this._locale ?? this._defaultLocale\n for (const target of targets) {\n const result = this._resolver!(target, id, loc)\n if (result) return result\n }\n return undefined\n }\n}\n","// Runtime exports — used by framework SDK authors and generated client\nexport { QueryBuilder } from './runtime/query.js'\nexport type { RelationMeta, RelationResolver, WhereOp } from './runtime/query.js'\nexport { SingletonAccessor } from './runtime/singleton.js'\nexport { DictionaryAccessor } from './runtime/dictionary.js'\nexport { DocumentQuery } from './runtime/document.js'\n\n// Shared utilities\nexport type { WhereClause } from './shared/where.js'\nexport { applyWhere } from './shared/where.js'\nexport { resolveMediaUrl, resolveMediaRefsInBody } from './shared/media.js'\n\n// Re-export types from @contentrain/types that SDK consumers need\nexport type {\n FieldType,\n ModelKind,\n ContentStatus,\n FieldDef,\n ModelDefinition,\n ContentrainConfig,\n} from '@contentrain/types'\n\n/**\n * Factory for framework SDK authors.\n * Returns the generated client module loaded from .contentrain/client/.\n *\n * Usage (Nuxt composable):\n * ```ts\n * import { createContentrainClient } from '@contentrain/query'\n * const client = createContentrainClient()\n * const posts = client.query('blog-post').locale('en').all()\n * ```\n */\nexport async function createContentrainClient(\n projectRoot?: string,\n): Promise<{\n query: (model: string) => import('./runtime/query.js').QueryBuilder<Record<string, unknown>>\n singleton: (model: string) => import('./runtime/singleton.js').SingletonAccessor<Record<string, unknown>>\n dictionary: (model: string) => import('./runtime/dictionary.js').DictionaryAccessor\n document: (model: string) => import('./runtime/document.js').DocumentQuery<Record<string, unknown>>\n}> {\n const { resolve } = await import('node:path')\n const { pathToFileURL } = await import('node:url')\n const root = projectRoot ?? process.cwd()\n const clientPath = resolve(root, '.contentrain', 'client', 'index.mjs')\n const client = await import(pathToFileURL(clientPath).href)\n return client\n}\n\n// CDN client factory — async, HTTP-based\nexport { createContentrain } from './cdn/index.js'\nexport type { ContentrainCDNConfig, ContentrainCDNClient } from './cdn/index.js'\nexport type { DocumentIndexEntry } from './cdn/data-source.js'\nexport { ContentrainError } from './cdn/errors.js'\n\n// CDN module re-exports — media, forms, comments, metadata\nexport { MediaAccessor } from './cdn/media-accessor.js'\nexport type { MediaAsset, MediaAssetMeta, MediaManifest } from './cdn/media-accessor.js'\nexport { FormsClient } from './cdn/forms-client.js'\nexport type { FormConfig, FormFieldConfig, FormFieldError, FormSubmitOptions, FormSubmitResult, FormsClientConfig } from './cdn/forms-client.js'\nexport { CommentsClient } from './cdn/comments-client.js'\nexport type {\n CommentAuthor,\n CommentFieldError,\n CommentSubmission,\n CommentSubmitResult,\n CommentThread,\n CommentThreadConfig,\n CommentThreadQuery,\n CommentsClientConfig,\n PublicComment,\n} from './cdn/comments-client.js'\nexport type { EntryMeta } from './cdn/collection-query.js'\nexport { ConversationClient } from './cdn/conversation-client.js'\nexport type {\n ConversationClientConfig,\n ConversationResponse,\n ConversationMessage,\n ConversationHistory,\n} from './cdn/conversation-client.js'\n\n// Sync factory for CJS — requires generated client to be pre-loaded\nexport { createContentrainClient as default }\n"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { rewriteMarkdownMedia, rewriteMediaUrl } from "@contentrain/types";
2
+ //#region src/shared/media.ts
3
+ /**
4
+ * Resolve a single field value. Non-string values, values that are not a
5
+ * stored `media/...` path (already-absolute URLs included), and calls with no
6
+ * base all pass through unchanged — safe to call on any field, idempotent on
7
+ * a value it already resolved.
8
+ */
9
+ function resolveMediaUrl(value, mediaBaseUrl) {
10
+ if (!mediaBaseUrl) return value;
11
+ return rewriteMediaUrl(mediaBaseUrl, value);
12
+ }
13
+ /**
14
+ * Resolve every `media/...` reference inside a markdown string — link and
15
+ * image targets (`](media/...)`, titles included) and inline HTML
16
+ * `src`/`href` attributes — to an absolute delivery URL. Any other target —
17
+ * already absolute, or not a `media/...` path — is left untouched. No base is
18
+ * a no-op.
19
+ */
20
+ function resolveMediaRefsInBody(markdown, mediaBaseUrl) {
21
+ if (typeof markdown !== "string" || !mediaBaseUrl) return markdown;
22
+ return rewriteMarkdownMedia(markdown, mediaBaseUrl);
23
+ }
24
+ //#endregion
25
+ export { resolveMediaUrl as n, resolveMediaRefsInBody as t };
26
+
27
+ //# sourceMappingURL=media-HEEDdrFS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-HEEDdrFS.mjs","names":[],"sources":["../src/shared/media.ts"],"sourcesContent":["// Resolves stored `media/...` references — plain field values and the same\n// references embedded in markdown — to absolute delivery URLs.\n//\n// The rewrite rules themselves (titled markdown embeds, inline HTML\n// src/href, object/array field nesting) live once in `@contentrain/types`,\n// shared with `@contentrain/mcp`'s write-time normalization — two\n// independent implementations of \"what counts as a media reference\" is how\n// they drift. This module only adapts that shared engine to this package's\n// public shape: value-first arguments, and an optional/nullable base so a\n// caller with nothing configured gets a plain no-op instead of having to\n// guard the call itself.\n//\n// Framework-agnostic and side-effect free: the base is always supplied by\n// the caller, never read from config or env here. That keeps this package\n// unopinionated about where a host gets its base from — a generated client\n// bakes one in at generate time, a Nuxt app reads it from\n// `useRuntimeConfig()` per request, a script reads `process.env` — and it\n// keeps this opt-in: no base means no-op, so a project that never configures\n// one keeps relative paths exactly as stored.\n\nimport { rewriteMediaUrl, rewriteMarkdownMedia } from '@contentrain/types'\n\n/**\n * Resolve a single field value. Non-string values, values that are not a\n * stored `media/...` path (already-absolute URLs included), and calls with no\n * base all pass through unchanged — safe to call on any field, idempotent on\n * a value it already resolved.\n */\nexport function resolveMediaUrl(value: unknown, mediaBaseUrl: string | null | undefined): unknown {\n if (!mediaBaseUrl) return value\n return rewriteMediaUrl(mediaBaseUrl, value)\n}\n\n/**\n * Resolve every `media/...` reference inside a markdown string — link and\n * image targets (`](media/...)`, titles included) and inline HTML\n * `src`/`href` attributes — to an absolute delivery URL. Any other target —\n * already absolute, or not a `media/...` path — is left untouched. No base is\n * a no-op.\n */\nexport function resolveMediaRefsInBody(markdown: unknown, mediaBaseUrl: string | null | undefined): unknown {\n if (typeof markdown !== 'string' || !mediaBaseUrl) return markdown\n return rewriteMarkdownMedia(markdown, mediaBaseUrl)\n}\n"],"mappings":";;;;;;;;AA4BA,SAAgB,gBAAgB,OAAgB,cAAkD;AAChG,KAAI,CAAC,aAAc,QAAO;AAC1B,QAAO,gBAAgB,cAAc,MAAM;;;;;;;;;AAU7C,SAAgB,uBAAuB,UAAmB,cAAkD;AAC1G,KAAI,OAAO,aAAa,YAAY,CAAC,aAAc,QAAO;AAC1D,QAAO,qBAAqB,UAAU,aAAa"}
@@ -0,0 +1,36 @@
1
+ let _contentrain_types = require("@contentrain/types");
2
+ //#region src/shared/media.ts
3
+ /**
4
+ * Resolve a single field value. Non-string values, values that are not a
5
+ * stored `media/...` path (already-absolute URLs included), and calls with no
6
+ * base all pass through unchanged — safe to call on any field, idempotent on
7
+ * a value it already resolved.
8
+ */
9
+ function resolveMediaUrl(value, mediaBaseUrl) {
10
+ if (!mediaBaseUrl) return value;
11
+ return (0, _contentrain_types.rewriteMediaUrl)(mediaBaseUrl, value);
12
+ }
13
+ /**
14
+ * Resolve every `media/...` reference inside a markdown string — link and
15
+ * image targets (`](media/...)`, titles included) and inline HTML
16
+ * `src`/`href` attributes — to an absolute delivery URL. Any other target —
17
+ * already absolute, or not a `media/...` path — is left untouched. No base is
18
+ * a no-op.
19
+ */
20
+ function resolveMediaRefsInBody(markdown, mediaBaseUrl) {
21
+ if (typeof markdown !== "string" || !mediaBaseUrl) return markdown;
22
+ return (0, _contentrain_types.rewriteMarkdownMedia)(markdown, mediaBaseUrl);
23
+ }
24
+ //#endregion
25
+ Object.defineProperty(exports, "resolveMediaRefsInBody", {
26
+ enumerable: true,
27
+ get: function() {
28
+ return resolveMediaRefsInBody;
29
+ }
30
+ });
31
+ Object.defineProperty(exports, "resolveMediaUrl", {
32
+ enumerable: true,
33
+ get: function() {
34
+ return resolveMediaUrl;
35
+ }
36
+ });
@@ -7,4 +7,4 @@ interface PublicationOptions {
7
7
  }
8
8
  //#endregion
9
9
  export { PublicationOptions as t };
10
- //# sourceMappingURL=publication-Ba8bLPAO.d.mts.map
10
+ //# sourceMappingURL=publication-CMrWLPi7.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publication-CMrWLPi7.d.mts","names":[],"sources":["../src/generator/publication.ts"],"mappings":";UAKiB,kBAAA;;EAEf,aAAA;EAEE;EAAF,EAAA;AAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentrain/query",
3
- "version": "7.3.7",
3
+ "version": "7.4.0",
4
4
  "license": "MIT",
5
5
  "description": "Optional type-safe query SDK for Contentrain — generated TypeScript client for platform-independent JSON content",
6
6
  "type": "module",
@@ -89,7 +89,7 @@
89
89
  "skills"
90
90
  ],
91
91
  "dependencies": {
92
- "@contentrain/types": "1.18.1"
92
+ "@contentrain/types": "1.19.0"
93
93
  },
94
94
  "devDependencies": {
95
95
  "@types/node": "^22.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate-CdLXEj13.mjs","names":[],"sources":["../src/generator/type-emitter.ts","../src/generator/data-emitter.ts","../src/generator/runtime-emitter.ts","../src/generator/package-json.ts","../src/generator/generate.ts"],"sourcesContent":["import type { ModelDefinition, FieldDef } from '@contentrain/types'\n\nexport function emitTypes(models: ModelDefinition[], hasMedia = false): string {\n const lines: string[] = [\n '/* eslint-disable */',\n '/* oxlint-disable */',\n '// Auto-generated by @contentrain/query — do not edit manually',\n '// Re-generate with: npx contentrain-query generate',\n '',\n \"export type ContentStatus = 'draft' | 'published' | 'in_review' | 'rejected' | 'archived'\",\n \"export type WhereOp = 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'contains'\",\n '',\n ]\n\n // Model interfaces\n for (const model of models) {\n if (model.kind === 'dictionary') {\n lines.push(`export type ${kebabToPascal(model.id)} = Record<string, string>`)\n } else {\n lines.push(`export interface ${kebabToPascal(model.id)} {`)\n // System fields by kind. Track their names so a model-defined field of\n // the same name is not emitted twice (the base field wins).\n const baseNames = new Set<string>()\n if (model.kind === 'collection') {\n lines.push(' id: string')\n baseNames.add('id')\n }\n if (model.kind === 'document') {\n lines.push(' slug: string')\n lines.push(' body: string')\n baseNames.add('slug')\n baseNames.add('body')\n }\n // User fields\n if (model.fields) {\n for (const [name, field] of Object.entries(model.fields)) {\n if (baseNames.has(name)) continue\n const tsType = fieldToTS(field)\n const optional = field.required ? '' : '?'\n lines.push(` ${name}${optional}: ${tsType}`)\n }\n }\n lines.push('}')\n }\n lines.push('')\n }\n\n // Query interfaces\n lines.push(`export interface QueryBuilder<T> {\n locale(lang: string): QueryBuilder<T>\n where<K extends keyof T>(field: K, value: T[K]): QueryBuilder<T>\n where<K extends keyof T>(field: K, op: WhereOp, value: unknown): QueryBuilder<T>\n sort<K extends keyof T>(field: K, order?: 'asc' | 'desc'): QueryBuilder<T>\n limit(n: number): QueryBuilder<T>\n offset(n: number): QueryBuilder<T>\n include<K extends keyof T & string>(...fields: K[]): QueryBuilder<T>\n count(): number\n first(): T | undefined\n all(): T[]\n}`)\n lines.push('')\n\n lines.push(`export interface SingletonAccessor<T> {\n locale(lang: string): SingletonAccessor<T>\n include<K extends keyof T & string>(...fields: K[]): SingletonAccessor<T>\n get(): T\n}`)\n lines.push('')\n\n lines.push(`export interface DictionaryAccessor {\n locale(lang: string): DictionaryAccessor\n get(): Record<string, string>\n get(key: string): string | undefined\n get(key: string, params: Record<string, string | number>): string\n}`)\n lines.push('')\n\n lines.push(`export interface DocumentQuery<T> {\n locale(lang: string): DocumentQuery<T>\n where<K extends keyof T>(field: K, value: T[K]): DocumentQuery<T>\n where<K extends keyof T>(field: K, op: WhereOp, value: unknown): DocumentQuery<T>\n sort<K extends keyof T>(field: K, order?: 'asc' | 'desc'): DocumentQuery<T>\n include<K extends keyof T & string>(...fields: K[]): DocumentQuery<T>\n bySlug(slug: string): T | undefined\n count(): number\n first(): T | undefined\n all(): T[]\n}`)\n lines.push('')\n\n // Overloaded entry points\n const collections = models.filter(m => m.kind === 'collection')\n const singletons = models.filter(m => m.kind === 'singleton')\n const dictionaries = models.filter(m => m.kind === 'dictionary')\n const documents = models.filter(m => m.kind === 'document')\n\n // query() overloads\n for (const m of collections) {\n lines.push(`export declare function query(model: '${m.id}'): QueryBuilder<${kebabToPascal(m.id)}>`)\n }\n lines.push('export declare function query(model: string): QueryBuilder<Record<string, unknown>>')\n lines.push('')\n\n // singleton() overloads\n for (const m of singletons) {\n lines.push(`export declare function singleton(model: '${m.id}'): SingletonAccessor<${kebabToPascal(m.id)}>`)\n }\n lines.push('export declare function singleton(model: string): SingletonAccessor<Record<string, unknown>>')\n lines.push('')\n\n // dictionary() overloads\n for (const m of dictionaries) {\n lines.push(`export declare function dictionary(model: '${m.id}'): DictionaryAccessor`)\n }\n lines.push('export declare function dictionary(model: string): DictionaryAccessor')\n lines.push('')\n\n // document() overloads\n for (const m of documents) {\n lines.push(`export declare function document(model: '${m.id}'): DocumentQuery<${kebabToPascal(m.id)}>`)\n }\n lines.push('export declare function document(model: string): DocumentQuery<Record<string, unknown>>')\n lines.push('')\n\n // media() resolver — emitted only when a CDN delivery base is configured.\n if (hasMedia) {\n lines.push('/** Resolve a stored `media/...` path to its absolute delivery URL. External URLs and already-absolute values pass through unchanged. */')\n lines.push('export declare function media(value: string): string')\n lines.push('')\n }\n\n // Typed client interface\n lines.push('export interface ContentrainClient {')\n for (const m of collections) {\n lines.push(` query(model: '${m.id}'): QueryBuilder<${kebabToPascal(m.id)}>`)\n }\n lines.push(' query(model: string): QueryBuilder<Record<string, unknown>>')\n for (const m of singletons) {\n lines.push(` singleton(model: '${m.id}'): SingletonAccessor<${kebabToPascal(m.id)}>`)\n }\n lines.push(' singleton(model: string): SingletonAccessor<Record<string, unknown>>')\n for (const m of dictionaries) {\n lines.push(` dictionary(model: '${m.id}'): DictionaryAccessor`)\n }\n lines.push(' dictionary(model: string): DictionaryAccessor')\n for (const m of documents) {\n lines.push(` document(model: '${m.id}'): DocumentQuery<${kebabToPascal(m.id)}>`)\n }\n lines.push(' document(model: string): DocumentQuery<Record<string, unknown>>')\n lines.push('}')\n lines.push('')\n lines.push('export declare function createContentrainClient(): ContentrainClient')\n lines.push('')\n\n return lines.join('\\n') + '\\n'\n}\n\nfunction fieldToTS(field: FieldDef): string {\n switch (field.type) {\n case 'string': case 'text': case 'email': case 'url': case 'slug':\n case 'color': case 'phone': case 'code': case 'icon':\n case 'markdown': case 'richtext':\n case 'date': case 'datetime':\n case 'image': case 'video': case 'file':\n case 'relation': {\n if (Array.isArray(field.model) && field.model.length > 1) {\n const union = field.model.map(m => `'${m}'`).join(' | ')\n return `{ model: ${union}; ref: string }`\n }\n // Single-target relation: stored as an id string, but include() resolves\n // it to the target entry, so the field can be either at read time.\n const target = Array.isArray(field.model) ? field.model[0] : field.model\n return target ? `string | ${kebabToPascal(target)}` : 'string'\n }\n\n case 'relations': {\n if (Array.isArray(field.model) && field.model.length > 1) {\n const union = field.model.map(m => `'${m}'`).join(' | ')\n return `Array<{ model: ${union}; ref: string }>`\n }\n const target = Array.isArray(field.model) ? field.model[0] : field.model\n return target ? `Array<string | ${kebabToPascal(target)}>` : 'string[]'\n }\n\n case 'number': case 'integer': case 'decimal': case 'percent': case 'rating':\n return 'number'\n\n case 'boolean':\n return 'boolean'\n\n case 'select':\n if (field.options && field.options.length > 0) {\n return field.options.map(o => `'${o}'`).join(' | ')\n }\n return 'string'\n\n case 'array':\n if (field.items) {\n if (typeof field.items === 'string') {\n return `${primitiveToTS(field.items)}[]`\n }\n // items is a FieldDef\n return `${fieldToTS(field.items)}[]`\n }\n return 'unknown[]'\n\n case 'object':\n if (field.fields) {\n const entries = Object.entries(field.fields)\n .map(([k, v]) => `${k}${v.required ? '' : '?'}: ${fieldToTS(v)}`)\n .join('; ')\n return `{ ${entries} }`\n }\n return 'Record<string, unknown>'\n\n default:\n return 'unknown'\n }\n}\n\nfunction primitiveToTS(type: string): string {\n if (['string', 'text', 'email', 'url', 'slug', 'color', 'phone', 'code', 'icon',\n 'markdown', 'richtext', 'date', 'datetime', 'image', 'video', 'file', 'relation'].includes(type)) {\n return 'string'\n }\n if (['number', 'integer', 'decimal', 'percent', 'rating'].includes(type)) {\n return 'number'\n }\n if (type === 'boolean') return 'boolean'\n return 'unknown'\n}\n\nfunction kebabToPascal(s: string): string {\n return s.split('-').map(part => part.charAt(0).toUpperCase() + part.slice(1)).join('')\n}\n","import { publicationMeta, isPublishedAt, type PublicationContext } from './publication.js'\nimport type { ModelDefinition } from '@contentrain/types'\nimport type { ContentFileRef } from './config-reader.js'\nimport { parseFrontmatter, stringLikeFieldKeys } from '../shared/frontmatter.js'\nimport { readJson, readText } from './utils.js'\n\n/** Deterministic JSON: sorted keys, 2-space indent, trailing newline */\nfunction canonicalStringify(data: unknown): string {\n return JSON.stringify(data, (_, v) => {\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n return Object.keys(v).toSorted().reduce<Record<string, unknown>>((acc, k) => {\n acc[k] = (v as Record<string, unknown>)[k]\n return acc\n }, {})\n }\n return v\n }, 2)\n}\n\nexport interface DataModule {\n fileName: string\n content: string\n}\n\nexport async function emitDataModules(\n models: ModelDefinition[],\n contentFiles: ContentFileRef[],\n publication?: PublicationContext,\n): Promise<DataModule[]> {\n const results = await Promise.all(\n contentFiles.map(ref => emitSingleModule(ref, models, publication)),\n )\n return results.filter((r): r is DataModule => r !== null)\n}\n\nasync function emitSingleModule(\n ref: ContentFileRef,\n models: ModelDefinition[],\n publication?: PublicationContext,\n): Promise<DataModule | null> {\n const model = models.find(m => m.id === ref.modelId)\n if (!model) return null\n\n const meta = publication ? await publicationMeta(ref, model, publication) : undefined\n const visible = (id?: string) => !publication || isPublishedAt(id === undefined ? meta : meta?.[id], publication.at)\n if ((model.kind === 'singleton' || model.kind === 'document') && !visible()) return null\n\n const localeSuffix = ref.locale ? `.${ref.locale}` : ''\n\n switch (model.kind) {\n case 'collection': {\n const raw = await readJson<Record<string, Record<string, unknown>>>(ref.filePath)\n if (!raw) return null\n const entries = Object.entries(raw)\n .filter(([id]) => visible(id))\n .toSorted(([a], [b]) => a.localeCompare(b, 'en'))\n .map(([id, fields]) => Object.assign({ id }, fields))\n return { fileName: `${model.id}${localeSuffix}.mjs`, content: `export default ${canonicalStringify(entries)}\\n` }\n }\n\n case 'singleton': {\n const raw = await readJson<Record<string, unknown>>(ref.filePath)\n if (!raw) return null\n return { fileName: `${model.id}${localeSuffix}.mjs`, content: `export default ${canonicalStringify(raw)}\\n` }\n }\n\n case 'dictionary': {\n const raw = await readJson<Record<string, string>>(ref.filePath)\n if (!raw) return null\n const entries = Object.fromEntries(Object.entries(raw).filter(([id]) => visible(id)))\n return { fileName: `${model.id}${localeSuffix}.mjs`, content: `export default ${canonicalStringify(entries)}\\n` }\n }\n\n case 'document': {\n const rawText = await readText(ref.filePath)\n if (!rawText) return null\n const { frontmatter, body } = parseFrontmatter(rawText, stringLikeFieldKeys(model))\n const slug = ref.slug ?? model.id\n // Canonical document field is `body` (matches @contentrain/types\n // DocumentEntry.body and the MCP document_save schema).\n const data = { slug, ...frontmatter, body }\n return { fileName: `${model.id}--${slug}${localeSuffix}.mjs`, content: `export default ${canonicalStringify(data)}\\n` }\n }\n\n default:\n return null\n }\n}\n","import type { ModelDefinition } from '@contentrain/types'\nimport type { DataModule } from './data-emitter.js'\n\nexport function emitRuntimeModule(models: ModelDefinition[], dataModules: DataModule[], defaultLocale?: string, cdnBaseUrl?: string): string {\n const lines: string[] = [\n '/* eslint-disable */',\n '/* oxlint-disable */',\n '// Auto-generated by @contentrain/query — do not edit manually',\n '',\n ]\n\n // Emit default locale constant if provided\n if (defaultLocale) {\n lines.push(`const _defaultLocale = '${defaultLocale}'`)\n lines.push('')\n }\n\n // Emit the media delivery base constant if a CDN base was configured. The\n // base is trimmed of trailing slashes here so the resolver is a plain join.\n if (cdnBaseUrl) {\n lines.push(`const _mediaBase = ${JSON.stringify(cdnBaseUrl.replace(/\\/+$/, ''))}`)\n lines.push('')\n }\n\n // Import data modules\n for (const dm of dataModules) {\n const varName = fileNameToVar(dm.fileName)\n lines.push(`import ${varName} from './data/${dm.fileName}'`)\n }\n lines.push('')\n\n // Inline minimal runtime classes\n lines.push(RUNTIME_CODE)\n lines.push('')\n\n // Build registry\n lines.push('// ─── Data Registry ───')\n lines.push('')\n\n // Group data modules by modelId\n const modelDataMap = new Map<string, { varName: string; locale: string | null }[]>()\n for (const dm of dataModules) {\n const { modelId, locale } = parseDataFileName(dm.fileName)\n if (!modelDataMap.has(modelId)) modelDataMap.set(modelId, [])\n modelDataMap.get(modelId)!.push({ varName: fileNameToVar(dm.fileName), locale })\n }\n\n // Create factory functions for each kind\n const collections = models.filter(m => m.kind === 'collection')\n const singletons = models.filter(m => m.kind === 'singleton')\n const dictionaries = models.filter(m => m.kind === 'dictionary')\n const documents = models.filter(m => m.kind === 'document')\n\n // Generate relation metadata for models that have relation fields\n const relationMetaMap = buildRelationMetaMap(models)\n\n // Generate _resolveEntry helper (needed if any model has relations)\n if (relationMetaMap.size > 0) {\n lines.push('// ─── Relation Resolver ───')\n lines.push('')\n lines.push('function _resolveEntry(model, id, locale) {')\n // Try the requested locale first, then fall back to the locale-agnostic\n // '_default' key. i18n:true targets are keyed by locale string ('en'),\n // i18n:false targets are keyed '_default' — this fallback resolves both\n // regardless of the source query's active locale.\n lines.push(' const localeKeys = locale ? [locale, \\'_default\\'] : [\\'_default\\']')\n lines.push(' for (const localeKey of localeKeys) {')\n // Search in collection registry\n if (collections.length > 0) {\n lines.push(' const colData = _collectionRegistry[model]?.get(localeKey)')\n lines.push(' if (colData) { const e = colData.find(x => x.id === id); if (e) return e; }')\n }\n // Search in document registry\n if (documents.length > 0) {\n lines.push(' const docData = _documentRegistry[model]?.get(localeKey)')\n lines.push(' if (docData) { const e = docData.find(x => x.slug === id); if (e) return e; }')\n }\n lines.push(' }')\n lines.push(' return undefined')\n lines.push('}')\n lines.push('')\n\n // Emit relation meta objects\n lines.push('const _relationMeta = {')\n for (const [modelId, meta] of relationMetaMap) {\n lines.push(` '${modelId}': {`)\n for (const [field, info] of Object.entries(meta)) {\n const targetStr = Array.isArray(info.target)\n ? `[${info.target.map(t => `'${t}'`).join(', ')}]`\n : `'${info.target}'`\n lines.push(` '${field}': { target: ${targetStr}, multi: ${info.multi} },`)\n }\n lines.push(' },')\n }\n lines.push('}')\n lines.push('')\n }\n\n // query() function\n if (collections.length > 0) {\n lines.push('const _collectionRegistry = {')\n for (const m of collections) {\n const entries = modelDataMap.get(m.id) ?? []\n lines.push(` '${m.id}': new Map([`)\n for (const e of entries) {\n const localeKey = e.locale ?? '_default'\n lines.push(` ['${localeKey}', ${e.varName}],`)\n }\n lines.push(' ]),')\n }\n lines.push('}')\n lines.push('')\n lines.push('export function query(model) {')\n lines.push(' const data = _collectionRegistry[model]')\n lines.push(' if (!data) throw new Error(`Unknown collection model: \"${model}\"`)')\n if (relationMetaMap.size > 0 && defaultLocale) {\n lines.push(' return new QueryBuilder(data, _relationMeta[model], _resolveEntry, _defaultLocale)')\n } else if (relationMetaMap.size > 0) {\n lines.push(' return new QueryBuilder(data, _relationMeta[model], _resolveEntry)')\n } else if (defaultLocale) {\n lines.push(' return new QueryBuilder(data, undefined, undefined, _defaultLocale)')\n } else {\n lines.push(' return new QueryBuilder(data)')\n }\n lines.push('}')\n lines.push('')\n }\n\n // singleton() function\n if (singletons.length > 0) {\n lines.push('const _singletonRegistry = {')\n for (const m of singletons) {\n const entries = modelDataMap.get(m.id) ?? []\n lines.push(` '${m.id}': new Map([`)\n for (const e of entries) {\n const localeKey = e.locale ?? '_default'\n lines.push(` ['${localeKey}', ${e.varName}],`)\n }\n lines.push(' ]),')\n }\n lines.push('}')\n lines.push('')\n lines.push('export function singleton(model) {')\n lines.push(' const data = _singletonRegistry[model]')\n lines.push(' if (!data) throw new Error(`Unknown singleton model: \"${model}\"`)')\n if (relationMetaMap.size > 0 && defaultLocale) {\n lines.push(' return new SingletonAccessor(data, _defaultLocale, _relationMeta[model], _resolveEntry)')\n } else if (relationMetaMap.size > 0) {\n lines.push(' return new SingletonAccessor(data, undefined, _relationMeta[model], _resolveEntry)')\n } else if (defaultLocale) {\n lines.push(' return new SingletonAccessor(data, _defaultLocale)')\n } else {\n lines.push(' return new SingletonAccessor(data)')\n }\n lines.push('}')\n lines.push('')\n }\n\n // dictionary() function\n if (dictionaries.length > 0) {\n lines.push('const _dictionaryRegistry = {')\n for (const m of dictionaries) {\n const entries = modelDataMap.get(m.id) ?? []\n lines.push(` '${m.id}': new Map([`)\n for (const e of entries) {\n const localeKey = e.locale ?? '_default'\n lines.push(` ['${localeKey}', ${e.varName}],`)\n }\n lines.push(' ]),')\n }\n lines.push('}')\n lines.push('')\n lines.push('export function dictionary(model) {')\n lines.push(' const data = _dictionaryRegistry[model]')\n lines.push(' if (!data) throw new Error(`Unknown dictionary model: \"${model}\"`)')\n lines.push(defaultLocale ? ' return new DictionaryAccessor(data, _defaultLocale)' : ' return new DictionaryAccessor(data)')\n lines.push('}')\n lines.push('')\n }\n\n // document() function\n if (documents.length > 0) {\n // Group document data modules by model+locale and merge into arrays\n for (const m of documents) {\n const entries = modelDataMap.get(m.id) ?? []\n // Group entries by locale\n const byLocale = new Map<string, string[]>()\n for (const e of entries) {\n const localeKey = e.locale ?? '_default'\n if (!byLocale.has(localeKey)) byLocale.set(localeKey, [])\n byLocale.get(localeKey)!.push(e.varName)\n }\n lines.push(`const _doc_${m.id.replace(/-/g, '_')} = new Map([`)\n for (const [localeKey, varNames] of byLocale) {\n lines.push(` ['${localeKey}', [${varNames.join(', ')}]],`)\n }\n lines.push('])')\n }\n lines.push('')\n lines.push('const _documentRegistry = {')\n for (const m of documents) {\n lines.push(` '${m.id}': _doc_${m.id.replace(/-/g, '_')},`)\n }\n lines.push('}')\n lines.push('')\n lines.push('export function document(model) {')\n lines.push(' const data = _documentRegistry[model]')\n lines.push(' if (!data) throw new Error(`Unknown document model: \"${model}\"`)')\n if (relationMetaMap.size > 0 && defaultLocale) {\n lines.push(' return new DocumentQuery(data, _relationMeta[model], _resolveEntry, _defaultLocale)')\n } else if (relationMetaMap.size > 0) {\n lines.push(' return new DocumentQuery(data, _relationMeta[model], _resolveEntry)')\n } else if (defaultLocale) {\n lines.push(' return new DocumentQuery(data, undefined, undefined, _defaultLocale)')\n } else {\n lines.push(' return new DocumentQuery(data)')\n }\n lines.push('}')\n lines.push('')\n }\n\n // media() resolver — only when a CDN base is configured. Mirrors the rewrite\n // rules of the write path: a stored `media/...` path becomes an absolute\n // delivery URL; external URLs and already-absolute values pass through, so it\n // is safe to call on any field value (idempotent).\n if (cdnBaseUrl) {\n lines.push('// ─── Media ───')\n lines.push('')\n lines.push('export function media(value) {')\n lines.push(' if (typeof value !== \\'string\\' || !value.startsWith(\\'media/\\')) return value')\n lines.push(' return _mediaBase + \\'/\\' + value')\n lines.push('}')\n lines.push('')\n }\n\n return lines.join('\\n') + '\\n'\n}\n\nexport function emitCjsWrapper(models: ModelDefinition[], hasMedia = false): string {\n const exports: string[] = []\n if (models.some(m => m.kind === 'collection')) exports.push('query')\n if (models.some(m => m.kind === 'singleton')) exports.push('singleton')\n if (models.some(m => m.kind === 'dictionary')) exports.push('dictionary')\n if (models.some(m => m.kind === 'document')) exports.push('document')\n if (hasMedia) exports.push('media')\n\n return `/* eslint-disable */\n/* oxlint-disable */\n// Auto-generated CJS proxy — delegates to ESM via dynamic import()\n// The generated client is ESM-first. From CommonJS, await init() once before\n// accessing exports:\n// const client = await require('#contentrain').init()\n// client.query('model')\n// Prefer native ESM (import) where possible.\n'use strict'\nlet _mod = null\nlet _promise = null\n\nmodule.exports.init = function() {\n if (!_promise) _promise = import('./index.mjs').then(function(m) {\n _mod = m\n${exports.map(e => ` module.exports.${e} = m.${e}`).join('\\n')}\n return module.exports\n })\n return _promise\n}\n\n// Eagerly start loading so subsequent sync calls work after first await\n_promise = import('./index.mjs').then(function(m) {\n _mod = m\n${exports.map(e => ` module.exports.${e} = m.${e}`).join('\\n')}\n return module.exports\n}).catch(function() { _promise = null; /* retry on next init() call */ })\n`\n}\n\nfunction buildRelationMetaMap(\n models: ModelDefinition[],\n): Map<string, Record<string, { target: string | string[]; multi: boolean }>> {\n const result = new Map<string, Record<string, { target: string | string[]; multi: boolean }>>()\n\n for (const model of models) {\n if (!model.fields) continue\n const meta: Record<string, { target: string | string[]; multi: boolean }> = {}\n let hasRelations = false\n\n for (const [fieldName, field] of Object.entries(model.fields)) {\n if (field.type === 'relation' && field.model) {\n meta[fieldName] = { target: field.model, multi: false }\n hasRelations = true\n } else if (field.type === 'relations' && field.model) {\n meta[fieldName] = { target: field.model, multi: true }\n hasRelations = true\n }\n }\n\n if (hasRelations) {\n result.set(model.id, meta)\n }\n }\n\n return result\n}\n\nfunction fileNameToVar(fileName: string): string {\n // blog-post.en.mjs → _blogPostEn\n const base = fileName.replace('.mjs', '')\n const parts = base.split(/[-.]/)\n return '_' + parts.map((p, i) => i === 0 ? p : p.charAt(0).toUpperCase() + p.slice(1)).join('')\n}\n\nfunction parseDataFileName(fileName: string): { modelId: string; locale: string | null } {\n const base = fileName.replace('.mjs', '')\n\n // Document files use \"modelId--slug.locale\" or \"modelId--slug\" format\n // Extract modelId from before \"--\", ignore slug part\n let nameForLocale = base\n if (base.includes('--')) {\n nameForLocale = base // locale is still the last dot-segment\n }\n\n // Extract locale from last dot-segment (e.g., \"blog-post.en\" → locale \"en\")\n const parts = nameForLocale.split('.')\n let locale: string | null = null\n let nameWithoutLocale = nameForLocale\n if (parts.length >= 2) {\n const possibleLocale = parts[parts.length - 1]!\n if (possibleLocale.length === 2 || possibleLocale.includes('-')) {\n locale = possibleLocale\n nameWithoutLocale = parts.slice(0, -1).join('.')\n }\n }\n\n // Extract modelId: if \"--\" present, it's the part before \"--\"\n const modelId = nameWithoutLocale.includes('--')\n ? nameWithoutLocale.split('--')[0]!\n : nameWithoutLocale\n\n return { modelId, locale }\n}\n\n// Inlined runtime code — zero dependencies\nconst RUNTIME_CODE = `\n// ─── Runtime Helpers ───\n\nfunction _applyWhere(item, clause) {\n const val = item[clause.field];\n switch (clause.op) {\n case 'eq': return Array.isArray(val) ? val.includes(clause.value) : val === clause.value;\n case 'ne': return Array.isArray(val) ? !val.includes(clause.value) : val !== clause.value;\n case 'gt': return val > clause.value;\n case 'gte': return val >= clause.value;\n case 'lt': return val < clause.value;\n case 'lte': return val <= clause.value;\n case 'in': return Array.isArray(clause.value) && clause.value.includes(val);\n case 'contains': {\n if (typeof val === 'string') return val.includes(clause.value);\n if (Array.isArray(val)) return val.includes(clause.value);\n return false;\n }\n default: return true;\n }\n}\n\n// ─── Runtime Classes ───\n\nclass QueryBuilder {\n constructor(data, relationMeta, resolver, defaultLocale) { this._data = data; this._filters = []; this._sortField = null; this._sortOrder = 'asc'; this._limit = null; this._offset = 0; this._locale = null; this._includes = []; this._relationMeta = relationMeta || {}; this._resolver = resolver || null; this._defaultLocale = defaultLocale || null; }\n locale(lang) { this._locale = lang; return this; }\n where(field, opOrValue, value) { if (value !== undefined) { this._filters.push({ field, op: opOrValue, value }); } else { this._filters.push({ field, op: 'eq', value: opOrValue }); } return this; }\n sort(field, order = 'asc') { this._sortField = field; this._sortOrder = order; return this; }\n limit(n) { this._limit = n; return this; }\n offset(n) { this._offset = n; return this; }\n include(...fields) { this._includes.push(...fields); return this; }\n count() { return this.all().length; }\n all() {\n let items; if (this._locale) { items = [...(this._data.get(this._locale) ?? [])]; } else if (this._defaultLocale && this._data.has(this._defaultLocale)) { items = [...this._data.get(this._defaultLocale)]; } else { items = [...(this._data.get(this._data.keys().next().value) ?? [])]; }\n for (const clause of this._filters) items = items.filter(item => _applyWhere(item, clause));\n if (this._sortField) { const sf = this._sortField; const d = this._sortOrder === 'asc' ? 1 : -1; items.sort((a, b) => { const va = a[sf], vb = b[sf]; if (va == null && vb == null) return 0; if (va == null) return d; if (vb == null) return -d; return va < vb ? -d : va > vb ? d : 0; }); }\n if (this._offset > 0 || this._limit !== null) { const end = this._limit !== null ? this._offset + this._limit : undefined; items = items.slice(this._offset, end); }\n if (this._includes.length > 0 && this._resolver) { items = items.map(item => this._resolveIncludes(item)); }\n return items;\n }\n first() { return this.all()[0]; }\n _resolveIncludes(item) {\n const resolved = { ...item };\n const _loc = this._locale ?? this._defaultLocale;\n for (const field of this._includes) {\n const meta = this._relationMeta[field]; if (!meta) continue;\n const targets = Array.isArray(meta.target) ? meta.target : [meta.target];\n if (meta.multi) { const ids = item[field]; if (Array.isArray(ids)) { resolved[field] = ids.map(id => { if (typeof id === 'string') { for (const t of targets) { const r = this._resolver(t, id, _loc); if (r) return r; } return id; } if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) { const r = this._resolver(id.model, id.ref, _loc); if (r) return r; } return id; }); } }\n else { const id = item[field]; if (typeof id === 'string') { for (const t of targets) { const r = this._resolver(t, id, _loc); if (r) { resolved[field] = r; break; } } } else if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) { const r = this._resolver(id.model, id.ref, _loc); if (r) resolved[field] = r; } }\n }\n return resolved;\n }\n}\n\nclass SingletonAccessor {\n constructor(data, defaultLocale, relationMeta, resolveEntry) { this._data = data; this._locale = null; this._defaultLocale = defaultLocale || null; this._includes = []; this._relationMeta = relationMeta || {}; this._resolver = resolveEntry; }\n locale(lang) { this._locale = lang; return this; }\n include(...fields) { this._includes.push(...fields); return this; }\n get() {\n const locale = this._locale || this._defaultLocale;\n let d = locale ? this._data.get(locale) : undefined;\n if (!d) { const key = this._data.keys().next().value; d = key !== undefined ? this._data.get(key) : undefined; }\n if (!d) throw new Error('No data available');\n if (this._includes.length > 0 && this._resolver) return this._resolveIncludes(d, locale || 'en');\n return d;\n }\n _resolveIncludes(item, locale) {\n const resolved = { ...item };\n for (const field of this._includes) {\n const meta = this._relationMeta[field]; if (!meta) continue;\n const targets = Array.isArray(meta.target) ? meta.target : [meta.target];\n if (meta.multi) { const ids = item[field]; if (Array.isArray(ids)) { resolved[field] = ids.map(id => { if (typeof id === 'string') { for (const t of targets) { const r = this._resolver(t, id, locale); if (r) return r; } return id; } if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) { const r = this._resolver(id.model, id.ref, locale); if (r) return r; } return id; }); } }\n else { const id = item[field]; if (typeof id === 'string') { for (const t of targets) { const r = this._resolver(t, id, locale); if (r) { resolved[field] = r; break; } } } else if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) { const r = this._resolver(id.model, id.ref, locale); if (r) resolved[field] = r; } }\n }\n return resolved;\n }\n}\n\nclass DictionaryAccessor {\n constructor(data, defaultLocale) { this._data = data; this._locale = null; this._defaultLocale = defaultLocale || null; }\n locale(lang) { this._locale = lang; return this; }\n get(key, params) {\n let dict; if (this._locale) { dict = this._data.get(this._locale) ?? {}; } else if (this._defaultLocale && this._data.has(this._defaultLocale)) { dict = this._data.get(this._defaultLocale); } else { const loc = this._data.keys().next().value; dict = this._data.get(loc) ?? {}; }\n if (key === undefined) return dict;\n const val = dict[key];\n if (val === undefined) return undefined;\n if (params) return val.replace(/\\\\{(\\\\w+)\\\\}/g, (m, k) => { const v = params[k]; return v !== undefined ? String(v) : m; });\n return val;\n }\n}\n\nclass DocumentQuery {\n constructor(data, relationMeta, resolver, defaultLocale) { this._data = data; this._filters = []; this._sortField = null; this._sortOrder = 'asc'; this._locale = null; this._includes = []; this._relationMeta = relationMeta || {}; this._resolver = resolver || null; this._defaultLocale = defaultLocale || null; }\n locale(lang) { this._locale = lang; return this; }\n where(field, opOrValue, value) { if (value !== undefined) { this._filters.push({ field, op: opOrValue, value }); } else { this._filters.push({ field, op: 'eq', value: opOrValue }); } return this; }\n sort(field, order = 'asc') { this._sortField = field; this._sortOrder = order; return this; }\n include(...fields) { this._includes.push(...fields); return this; }\n bySlug(slug) {\n const items = this._resolveData(); const item = items.find(x => x.slug === slug);\n if (item && this._includes.length > 0 && this._resolver) return this._resolveIncludes(item);\n return item;\n }\n count() { return this.all().length; }\n first() { return this.all()[0]; }\n all() { let items = this._resolveData(); for (const clause of this._filters) items = items.filter(item => _applyWhere(item, clause)); if (this._sortField) { const sf = this._sortField; const d = this._sortOrder === 'asc' ? 1 : -1; items.sort((a, b) => { const va = a[sf], vb = b[sf]; if (va == null && vb == null) return 0; if (va == null) return d; if (vb == null) return -d; return va < vb ? -d : va > vb ? d : 0; }); } if (this._includes.length > 0 && this._resolver) { items = items.map(item => this._resolveIncludes(item)); } return items; }\n _resolveData() { let key; if (this._locale) { key = this._locale; } else if (this._defaultLocale && this._data.has(this._defaultLocale)) { key = this._defaultLocale; } else { key = this._data.keys().next().value; } return [...(this._data.get(key) ?? [])]; }\n _resolveIncludes(item) {\n const resolved = { ...item };\n const _loc = this._locale ?? this._defaultLocale;\n for (const field of this._includes) {\n const meta = this._relationMeta[field]; if (!meta) continue;\n const targets = Array.isArray(meta.target) ? meta.target : [meta.target];\n if (meta.multi) { const ids = item[field]; if (Array.isArray(ids)) { resolved[field] = ids.map(id => { if (typeof id === 'string') { for (const t of targets) { const r = this._resolver(t, id, _loc); if (r) return r; } return id; } if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) { const r = this._resolver(id.model, id.ref, _loc); if (r) return r; } return id; }); } }\n else { const id = item[field]; if (typeof id === 'string') { for (const t of targets) { const r = this._resolver(t, id, _loc); if (r) { resolved[field] = r; break; } } } else if (typeof id === 'object' && id !== null && 'model' in id && 'ref' in id) { const r = this._resolver(id.model, id.ref, _loc); if (r) resolved[field] = r; } }\n }\n return resolved;\n }\n}\n`.trim()\n","import { join } from 'node:path'\nimport { readJson, writeText } from './utils.js'\n\nconst IMPORTS_CONFIG = {\n '#contentrain': {\n types: './.contentrain/client/index.d.ts',\n import: './.contentrain/client/index.mjs',\n require: './.contentrain/client/index.cjs',\n default: './.contentrain/client/index.mjs',\n },\n '#contentrain/*': {\n types: './.contentrain/client/*.d.ts',\n import: './.contentrain/client/*.mjs',\n require: './.contentrain/client/*.cjs',\n default: './.contentrain/client/*.mjs',\n },\n}\n\nexport async function injectImports(projectRoot: string): Promise<boolean> {\n const pkgPath = join(projectRoot, 'package.json')\n const pkg = await readJson<Record<string, unknown>>(pkgPath)\n if (!pkg) return false\n\n const existing = (pkg['imports'] as Record<string, unknown>) ?? {}\n const updated = { ...existing, ...IMPORTS_CONFIG }\n\n // Check if already matches\n if (JSON.stringify(existing['#contentrain']) === JSON.stringify(IMPORTS_CONFIG['#contentrain']) &&\n JSON.stringify(existing['#contentrain/*']) === JSON.stringify(IMPORTS_CONFIG['#contentrain/*'])) {\n return false // No change needed\n }\n\n pkg['imports'] = updated\n await writeText(pkgPath, JSON.stringify(pkg, null, 2) + '\\n')\n return true\n}\n","import { publicationContext, type PublicationOptions } from './publication.js'\nimport { join } from 'node:path'\nimport { rm } from 'node:fs/promises'\nimport { readProjectManifest } from './config-reader.js'\nimport { emitTypes } from './type-emitter.js'\nimport { emitDataModules } from './data-emitter.js'\nimport { emitRuntimeModule, emitCjsWrapper } from './runtime-emitter.js'\nimport { injectImports } from './package-json.js'\nimport { readDir, writeText } from './utils.js'\n\nexport interface GenerateOptions extends PublicationOptions {\n projectRoot: string\n /**\n * Public media delivery base for resolving relative `media/...` references to\n * absolute URLs. When set (or when `config.cdn.url` is present), the emitted\n * client gains a `media(path)` resolver. The explicit option wins over the\n * config value. Omit for the pure local-file model — media stays a relative\n * path.\n */\n cdnBaseUrl?: string\n}\n\nexport interface GenerateResult {\n generatedFiles: string[]\n typesCount: number\n dataModulesCount: number\n packageJsonUpdated: boolean\n}\n\nexport async function generate(options: GenerateOptions): Promise<GenerateResult> {\n const { projectRoot } = options\n const clientDir = join(projectRoot, '.contentrain', 'client')\n const dataDir = join(clientDir, 'data')\n\n // 1. Read project manifest\n const manifest = await readProjectManifest(projectRoot)\n\n // Media delivery base: explicit option wins over config.cdn.url. When set,\n // the emitted client gains a `media()` resolver.\n const cdnBaseUrl = options.cdnBaseUrl ?? manifest.config.cdn?.url\n const hasMedia = Boolean(cdnBaseUrl)\n\n // 2. Generate data modules (async — reads content files)\n const dataModules = await emitDataModules(manifest.models, manifest.contentFiles, publicationContext(projectRoot, manifest.config.locales.default, options))\n\n // 3. Generate all output content (sync — pure string transforms)\n const typesContent = emitTypes(manifest.models, hasMedia)\n const runtimeContent = emitRuntimeModule(manifest.models, dataModules, manifest.config.locales.default, cdnBaseUrl)\n const cjsContent = emitCjsWrapper(manifest.models, hasMedia)\n\n // 4. Clean stale data modules\n const newFileNames = new Set(dataModules.map(dm => dm.fileName))\n try {\n const existing = await readDir(dataDir)\n await Promise.all(\n existing\n .filter(f => !newFileNames.has(f))\n .map(f => rm(join(dataDir, f), { force: true })),\n )\n } catch { /* dataDir may not exist yet */ }\n\n // 5. Write all files in parallel\n const dataFileNames = dataModules.map(dm => `data/${dm.fileName}`)\n await Promise.all([\n writeText(join(clientDir, 'index.d.ts'), typesContent),\n writeText(join(clientDir, 'index.mjs'), runtimeContent),\n writeText(join(clientDir, 'index.cjs'), cjsContent),\n ...dataModules.map(dm => writeText(join(dataDir, dm.fileName), dm.content)),\n ])\n\n // 6. Inject #imports into package.json\n const packageJsonUpdated = await injectImports(projectRoot)\n\n return {\n generatedFiles: ['index.d.ts', ...dataFileNames, 'index.mjs', 'index.cjs'],\n typesCount: manifest.models.length,\n dataModulesCount: dataModules.length,\n packageJsonUpdated,\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"publication-Ba8bLPAO.d.mts","names":[],"sources":["../src/generator/publication.ts"],"mappings":";UAKiB,kBAAA;;EAEf,aAAA;EAEE;EAAF,EAAA;AAAA"}
@@ -1,6 +1,6 @@
1
+ let _contentrain_types = require("@contentrain/types");
1
2
  let node_fs_promises = require("node:fs/promises");
2
3
  let node_path = require("node:path");
3
- let _contentrain_types = require("@contentrain/types");
4
4
  //#region src/generator/publication.ts
5
5
  function publicationContext(projectRoot, defaultLocale, options) {
6
6
  if (!options.publishedOnly && options.at === void 0) return void 0;