@contentrain/query 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cache/memory.ts","../src/loader/content.ts","../src/query/builder.ts","../src/query/executor.ts","../src/index.ts"],"names":["lru","join","readFile"],"mappings":"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","file":"index.js","sourcesContent":["import type { CacheEntry, CacheStats } from '../types/loader';\r\nimport { lru } from 'tiny-lru';\r\n\r\nexport interface MemoryCacheOptions {\r\n maxSize?: number // MB cinsinden\r\n defaultTTL?: number // ms cinsinden\r\n}\r\n\r\nexport class MemoryCache {\r\n private cache;\r\n private options: Required<MemoryCacheOptions>;\r\n private stats: CacheStats = {\r\n hits: 0,\r\n misses: 0,\r\n size: 0,\r\n lastCleanup: Date.now(),\r\n };\r\n\r\n constructor(options: MemoryCacheOptions = {}) {\r\n this.options = {\r\n maxSize: 100, // 100 MB\r\n defaultTTL: 60 * 1000, // 1 dakika\r\n ...options,\r\n };\r\n\r\n const maxItems = Math.floor(this.options.maxSize * 1024 * 1024 / 1000); // Yaklaşık item sayısı\r\n this.cache = lru(maxItems);\r\n }\r\n\r\n private calculateSize(data: unknown): number {\r\n const str = JSON.stringify(data);\r\n return new TextEncoder().encode(str).length;\r\n }\r\n\r\n async set<T>(key: string, data: T, ttl?: number): Promise<void> {\r\n // Önce temizlik yap\r\n await this.cleanupCache();\r\n\r\n const size = this.calculateSize(data);\r\n const now = Date.now();\r\n const expireAt = now + (ttl || this.options.defaultTTL);\r\n\r\n // Yeni girişin boyutu limiti aşıyorsa, eski girişleri temizle\r\n while (size + this.stats.size > this.options.maxSize * 1024 * 1024) {\r\n const oldestKey = this.findOldestKey();\r\n if (!oldestKey)\r\n break;\r\n await this.delete(oldestKey);\r\n }\r\n\r\n const entry: CacheEntry<T> = {\r\n data,\r\n expireAt,\r\n size,\r\n createdAt: now,\r\n };\r\n\r\n // Önce eski girişi sil\r\n const oldEntry = this.cache.get(key) as CacheEntry<unknown> | undefined;\r\n if (oldEntry) {\r\n this.stats.size -= oldEntry.size;\r\n }\r\n\r\n // Yeni girişi ekle\r\n this.cache.set(key, entry);\r\n this.stats.size += size;\r\n }\r\n\r\n private findOldestKey(): string | null {\r\n let oldestKey: string | null = null;\r\n let oldestTime = Infinity;\r\n\r\n for (const key of this.cache.keys()) {\r\n const entry = this.cache.get(key) as CacheEntry<unknown>;\r\n if (entry.createdAt < oldestTime) {\r\n oldestTime = entry.createdAt;\r\n oldestKey = key;\r\n }\r\n }\r\n\r\n return oldestKey;\r\n }\r\n\r\n async get<T>(key: string): Promise<T | null> {\r\n const entry = this.cache.get(key) as CacheEntry<T> | undefined;\r\n\r\n if (!entry) {\r\n this.stats.misses++;\r\n return null;\r\n }\r\n\r\n // TTL kontrolü\r\n if (Date.now() >= entry.expireAt) {\r\n await this.delete(key);\r\n this.stats.misses++;\r\n return null;\r\n }\r\n\r\n this.stats.hits++;\r\n return entry.data;\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n const entry = this.cache.get(key) as CacheEntry<unknown> | undefined;\r\n if (entry) {\r\n this.stats.size -= entry.size;\r\n this.cache.delete(key);\r\n }\r\n }\r\n\r\n async clear(): Promise<void> {\r\n this.cache.clear();\r\n this.stats = {\r\n hits: 0,\r\n misses: 0,\r\n size: 0,\r\n lastCleanup: Date.now(),\r\n };\r\n }\r\n\r\n private async cleanupCache(): Promise<void> {\r\n const now = Date.now();\r\n const expiredKeys: string[] = [];\r\n let totalSize = 0;\r\n\r\n // Süresi dolmuş girişleri bul\r\n for (const key of this.cache.keys()) {\r\n const entry = this.cache.get(key) as CacheEntry<unknown>;\r\n if (entry.expireAt <= now) {\r\n expiredKeys.push(key);\r\n }\r\n else {\r\n totalSize += entry.size;\r\n }\r\n }\r\n\r\n // Süresi dolmuş girişleri sil\r\n for (const key of expiredKeys) {\r\n await this.delete(key);\r\n }\r\n\r\n // Boyut hala limiti aşıyorsa, en eski girişleri sil\r\n while (totalSize > this.options.maxSize * 1024 * 1024) {\r\n const oldestKey = this.findOldestKey();\r\n if (!oldestKey)\r\n break;\r\n const entry = this.cache.get(oldestKey) as CacheEntry<unknown>;\r\n await this.delete(oldestKey);\r\n totalSize -= entry.size;\r\n }\r\n\r\n this.stats.lastCleanup = now;\r\n }\r\n\r\n getStats(): CacheStats {\r\n return { ...this.stats };\r\n }\r\n}\r\n","import type { ContentFile, ContentLoaderOptions, LoaderResult, ModelConfig, RelationConfig } from '../types/loader';\r\nimport type { BaseContentrainType, FieldMetadata, ModelMetadata } from '../types/model';\r\nimport { readFile } from 'node:fs/promises';\r\nimport { join } from 'node:path';\r\nimport { MemoryCache } from '../cache';\r\n\r\nexport class ContentLoader {\r\n private options: ContentLoaderOptions;\r\n private modelConfigs: Map<string, ModelConfig> = new Map();\r\n private relations: Map<string, RelationConfig[]> = new Map();\r\n private cache: MemoryCache;\r\n\r\n constructor(options: ContentLoaderOptions) {\r\n this.options = {\r\n defaultLocale: 'en',\r\n cache: true,\r\n ttl: 60 * 1000, // 1 dakika\r\n maxCacheSize: 100, // 100 MB\r\n ...options,\r\n };\r\n\r\n this.cache = new MemoryCache({\r\n maxSize: this.options.maxCacheSize,\r\n defaultTTL: this.options.ttl,\r\n });\r\n }\r\n\r\n private getCacheKey(model: string): string {\r\n return `${model}`;\r\n }\r\n\r\n private getModelTTL(model: string): number {\r\n return this.options.modelTTL?.[model] || this.options.ttl || 0;\r\n }\r\n\r\n async clearCache(): Promise<void> {\r\n await this.cache.clear();\r\n }\r\n\r\n async refreshCache(model: string): Promise<void> {\r\n const cacheKey = this.getCacheKey(model);\r\n await this.cache.delete(cacheKey);\r\n await this.load(model);\r\n }\r\n\r\n getCacheStats() {\r\n return this.cache.getStats();\r\n }\r\n\r\n private async loadModelConfig(model: string): Promise<ModelConfig> {\r\n try {\r\n // Önce genel metadata'yı oku\r\n const metadataPath = join(this.options.contentDir, 'models', 'metadata.json');\r\n const metadataContent = await readFile(metadataPath, 'utf-8');\r\n const allMetadata = JSON.parse(metadataContent);\r\n\r\n // Model özel metadata'sını bul\r\n const modelMetadata = allMetadata.find((m: ModelMetadata) => m.modelId === model);\r\n if (!modelMetadata) {\r\n throw new Error(`Model metadata not found for ${model}`);\r\n }\r\n\r\n // Model field'larını oku\r\n const modelPath = join(this.options.contentDir, 'models', `${model}.json`);\r\n const modelContent = await readFile(modelPath, 'utf-8');\r\n const modelFields = JSON.parse(modelContent) as FieldMetadata[];\r\n\r\n // Field'ların geçerli olduğunu kontrol et\r\n if (!Array.isArray(modelFields)) {\r\n throw new TypeError(`Invalid field configuration for model ${model}: Expected an array of fields`);\r\n }\r\n\r\n // Field'ların tiplerini kontrol et\r\n modelFields.forEach((field, index) => {\r\n if (!field.fieldId || !field.fieldType || !field.componentId) {\r\n throw new Error(`Invalid field at index ${index} for model ${model}: Missing required properties`);\r\n }\r\n });\r\n\r\n return {\r\n metadata: modelMetadata,\r\n fields: modelFields,\r\n };\r\n }\r\n catch (error: any) {\r\n throw new Error(`Failed to load model config for ${model}: ${error?.message || 'Unknown error'}`);\r\n }\r\n }\r\n\r\n private async loadContentFile<T extends BaseContentrainType>(\r\n model: string,\r\n locale?: string,\r\n ): Promise<ContentFile<T>> {\r\n try {\r\n // İçerik dosyasının yolunu belirle\r\n let contentPath: string;\r\n if (locale) {\r\n contentPath = join(this.options.contentDir, model, `${locale}.json`);\r\n }\r\n else {\r\n // Non-lokalize içerikler için modelId.json formatını kullan\r\n contentPath = join(this.options.contentDir, model, `${model}.json`);\r\n }\r\n\r\n // Dosyayı oku ve parse et\r\n const content = await readFile(contentPath, 'utf-8');\r\n try {\r\n const data = JSON.parse(content) as T[];\r\n return {\r\n model,\r\n locale,\r\n data,\r\n };\r\n }\r\n catch {\r\n throw new Error(`Failed to load content: Invalid JSON format in ${contentPath}`);\r\n }\r\n }\r\n catch (error: any) {\r\n if (error.message.includes('Invalid JSON format')) {\r\n throw error;\r\n }\r\n throw new Error(\r\n `Failed to load content file for ${model}${locale ? ` (${locale})` : ''}: ${\r\n error?.message || 'Unknown error'\r\n }`,\r\n );\r\n }\r\n }\r\n\r\n private async loadRelations(model: string): Promise<RelationConfig[]> {\r\n try {\r\n // Model config'i al\r\n const modelConfig = this.modelConfigs.get(model);\r\n if (!modelConfig) {\r\n throw new Error(`Model config not found for ${model}`);\r\n }\r\n\r\n // İlişki field'larını bul\r\n const relationFields = modelConfig.fields.filter((field) => {\r\n return field.fieldType === 'relation';\r\n });\r\n\r\n // İlişki config'lerini oluştur\r\n return relationFields.map((field) => {\r\n const options = field.options;\r\n const reference = options?.reference?.form?.reference?.value;\r\n\r\n if (!reference) {\r\n throw new Error(`Reference not found for relation field: ${field.name}`);\r\n }\r\n\r\n return {\r\n model: reference,\r\n type: field.componentId === 'one-to-one' ? 'one-to-one' : 'one-to-many',\r\n foreignKey: field.fieldId,\r\n };\r\n });\r\n }\r\n catch (error: any) {\r\n throw new Error(`Failed to load relations for ${model}: ${error?.message || 'Unknown error'}`);\r\n }\r\n }\r\n\r\n async load<T extends BaseContentrainType>(model: string): Promise<LoaderResult<T>> {\r\n const cacheKey = this.getCacheKey(model);\r\n\r\n // Cache kontrolü\r\n if (this.options.cache) {\r\n const cached = await this.cache.get<LoaderResult<T>>(cacheKey);\r\n if (cached)\r\n return cached;\r\n }\r\n\r\n // Model config'i yükle\r\n const modelConfig = await this.loadModelConfig(model);\r\n this.modelConfigs.set(model, modelConfig);\r\n\r\n // İlişkileri yükle\r\n const relations = await this.loadRelations(model);\r\n this.relations.set(model, relations);\r\n\r\n // İçeriği yükle\r\n const content: { [locale: string]: T[] } = {};\r\n\r\n if (modelConfig.metadata.localization) {\r\n // Tüm dilleri yükle\r\n // TODO: Dil listesini al\r\n const locales = ['en', 'tr'];\r\n\r\n for (const locale of locales) {\r\n const file = await this.loadContentFile<T>(model, locale);\r\n content[locale] = file.data;\r\n }\r\n }\r\n else {\r\n // Tek dosyayı yükle\r\n const file = await this.loadContentFile<T>(model);\r\n content.default = file.data;\r\n }\r\n\r\n const result: LoaderResult<T> = {\r\n model: modelConfig,\r\n content,\r\n };\r\n\r\n // Cache'e kaydet\r\n if (this.options.cache) {\r\n const ttl = this.getModelTTL(model);\r\n await this.cache.set(cacheKey, result, ttl);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n async resolveRelation<T extends BaseContentrainType, R extends BaseContentrainType>(\r\n model: string,\r\n relationField: keyof T,\r\n data: T[],\r\n locale?: string,\r\n ): Promise<R[]> {\r\n try {\r\n const relations = this.relations.get(model);\r\n if (!relations)\r\n throw new Error(`No relations found for model: ${model}`);\r\n\r\n const relation = relations.find(r => r.foreignKey === relationField);\r\n if (!relation)\r\n throw new Error(`No relation found for field: ${String(relationField)}`);\r\n\r\n // İlişkili modeli yükle\r\n const relatedContent = await this.load<R>(relation.model);\r\n const relatedData = locale ? relatedContent.content[locale] : relatedContent.content.en;\r\n\r\n if (!relatedData) {\r\n throw new Error(`Failed to resolve relation: No data found for model ${relation.model}`);\r\n }\r\n\r\n if (relation.type === 'one-to-one') {\r\n // Birebir ilişki\r\n return data.map((item) => {\r\n const relatedItem = relatedData.find(r => r.ID === item[relationField]);\r\n if (!relatedItem) {\r\n throw new Error(`Failed to resolve relation: No matching item found for ID ${String(item[relationField])}`);\r\n }\r\n return relatedItem;\r\n });\r\n }\r\n else {\r\n // Çoka bir ilişki\r\n return data.flatMap((item) => {\r\n const ids = Array.isArray(item[relationField])\r\n ? item[relationField]\r\n : [item[relationField]];\r\n\r\n const items = ids\r\n .map(id => relatedData.find(r => r.ID === id))\r\n .filter(Boolean) as R[];\r\n\r\n if (items.length !== ids.length) {\r\n throw new Error('Failed to resolve relation: Some related items not found');\r\n }\r\n\r\n return items;\r\n });\r\n }\r\n }\r\n catch (error: any) {\r\n throw new Error(`Failed to resolve relation: ${error.message}`);\r\n }\r\n }\r\n}\r\n","import type { ContentLoader } from '../loader/content';\nimport type { BaseContentrainType, ContentrainLocales } from '../types/model';\nimport type { Filter, Include, Operator, QueryOptions, QueryResult, Sort } from '../types/query';\nimport type { QueryExecutor } from './executor';\n\nexport class ContentrainQueryBuilder<\n TFields extends BaseContentrainType,\n TLocales extends ContentrainLocales = 'en' | 'tr',\n TRelations extends Record<string, BaseContentrainType> = Record<string, never>,\n> {\n private model: string;\n private filters: Filter[] = [];\n private includes: Include = {};\n private sorting: Sort[] = [];\n private pagination: {\n limit?: number\n offset?: number\n } = {};\n\n private options: QueryOptions = {};\n private executor: QueryExecutor;\n private loader: ContentLoader;\n\n constructor(model: string, executor: QueryExecutor, loader: ContentLoader) {\n this.model = model;\n this.executor = executor;\n this.loader = loader;\n }\n\n where<K extends keyof TFields, O extends Operator>(\n field: K,\n operator: O,\n value: O extends 'in' ? TFields[K][] : TFields[K],\n ): this {\n this.filters.push({\n field: field as string,\n operator,\n value,\n });\n return this;\n }\n\n include<K extends keyof TRelations>(relation: K | K[]): this {\n if (typeof relation === 'string') {\n this.includes[relation] = {};\n }\n else if (Array.isArray(relation)) {\n relation.forEach((r) => {\n this.includes[r as string] = {};\n });\n }\n return this;\n }\n\n orderBy<K extends keyof TFields>(field: K, direction: 'asc' | 'desc' = 'asc'): this {\n this.sorting.push({\n field: field as string,\n direction,\n });\n return this;\n }\n\n limit(count: number): this {\n this.pagination.limit = count;\n return this;\n }\n\n offset(count: number): this {\n this.pagination.offset = count;\n return this;\n }\n\n locale(code: TLocales): this {\n this.options.locale = code;\n return this;\n }\n\n cache(ttl?: number): this {\n this.options.cache = true;\n if (ttl)\n this.options.ttl = ttl;\n return this;\n }\n\n noCache(): this {\n this.options.cache = false;\n return this;\n }\n\n bypassCache(): this {\n this.options.cache = false;\n this.options.ttl = 0;\n return this;\n }\n\n toJSON() {\n return {\n model: this.model,\n filters: this.filters,\n includes: this.includes,\n sorting: this.sorting,\n pagination: this.pagination,\n options: this.options,\n };\n }\n\n async get(): Promise<QueryResult<TFields>> {\n const result = await this.loader.load<TFields>(this.model);\n const data = this.options.locale ? result.content[this.options.locale] : result.content.en;\n\n return this.executor.execute({\n model: this.model,\n data,\n filters: this.filters,\n includes: this.includes,\n sorting: this.sorting,\n pagination: this.pagination,\n options: this.options,\n });\n }\n\n async first(): Promise<TFields | null> {\n const result = await this.limit(1).get();\n return result.data[0] || null;\n }\n\n async count(): Promise<number> {\n const result = await this.get();\n return result.total;\n }\n}\n","import type { ContentLoader } from '../loader/content';\r\nimport type { BaseContentrainType } from '../types/model';\r\nimport type { Filter, Include, QueryOptions, QueryResult, Sort } from '../types/query';\r\n\r\nexport class QueryExecutor {\r\n private loader: ContentLoader;\r\n\r\n constructor(loader: ContentLoader) {\r\n this.loader = loader;\r\n }\r\n\r\n private applyFilters<T extends BaseContentrainType>(data: T[], filters: Filter[]): T[] {\r\n return data.filter((item) => {\r\n return filters.every((filter) => {\r\n const value = item[filter.field as keyof T];\r\n\r\n // Operatör validasyonu\r\n const validOperators = ['eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'nin', 'contains', 'startsWith', 'endsWith'];\r\n if (!validOperators.includes(filter.operator)) {\r\n throw new Error(`Invalid operator: ${filter.operator}`);\r\n }\r\n\r\n switch (filter.operator) {\r\n case 'eq':\r\n return value === filter.value;\r\n case 'ne':\r\n return value !== filter.value;\r\n case 'gt':\r\n return value > filter.value;\r\n case 'gte':\r\n return value >= filter.value;\r\n case 'lt':\r\n return value < filter.value;\r\n case 'lte':\r\n return value <= filter.value;\r\n case 'in':\r\n return Array.isArray(filter.value) && filter.value.includes(value);\r\n case 'nin':\r\n return Array.isArray(filter.value) && !filter.value.includes(value);\r\n case 'contains':\r\n return typeof value === 'string' && value.includes(filter.value);\r\n case 'startsWith':\r\n return typeof value === 'string' && value.startsWith(filter.value);\r\n case 'endsWith':\r\n return typeof value === 'string' && value.endsWith(filter.value);\r\n default:\r\n return false;\r\n }\r\n });\r\n });\r\n }\r\n\r\n private applySorting<T extends BaseContentrainType>(data: T[], sorting: Sort[]): T[] {\r\n return [...data].sort((a, b) => {\r\n for (const sort of sorting) {\r\n const aValue = a[sort.field as keyof T];\r\n const bValue = b[sort.field as keyof T];\r\n\r\n if (aValue === bValue)\r\n continue;\r\n\r\n const direction = sort.direction === 'asc' ? 1 : -1;\r\n return aValue > bValue ? direction : -direction;\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n private applyPagination<T>(data: T[], limit?: number, offset: number = 0): T[] {\r\n if (!limit)\r\n return data.slice(offset);\r\n return data.slice(offset, offset + limit);\r\n }\r\n\r\n private async resolveIncludes<T extends BaseContentrainType>(\r\n model: string,\r\n data: T[],\r\n includes: Include,\r\n options: QueryOptions,\r\n ): Promise<T[]> {\r\n const result = [...data];\r\n\r\n for (const [field, config] of Object.entries(includes)) {\r\n // İlişkiyi çöz\r\n const relations = await this.loader.resolveRelation(\r\n model,\r\n field as keyof T,\r\n result,\r\n options.locale,\r\n );\r\n\r\n // Alt ilişkileri çöz\r\n if (config.include && relations.length) {\r\n await this.resolveIncludes(\r\n field,\r\n relations,\r\n config.include,\r\n options,\r\n );\r\n }\r\n\r\n // İlişkili verileri ekle\r\n result.forEach((item) => {\r\n const value = item[field as keyof T];\r\n const relatedItems = relations.filter((r) => {\r\n if (Array.isArray(value)) {\r\n return value.includes(r.ID);\r\n }\r\n return r.ID === value;\r\n });\r\n\r\n if (!item._relations) {\r\n item._relations = {};\r\n }\r\n item._relations[field] = Array.isArray(value) ? relatedItems : relatedItems[0];\r\n });\r\n }\r\n\r\n return result;\r\n }\r\n\r\n async execute<T extends BaseContentrainType>({\r\n model,\r\n data,\r\n filters = [],\r\n includes = {},\r\n sorting = [],\r\n pagination = {},\r\n options = {},\r\n }: {\r\n model: string\r\n data: T[]\r\n filters?: Filter[]\r\n includes?: Include\r\n sorting?: Sort[]\r\n pagination?: { limit?: number, offset?: number }\r\n options?: QueryOptions\r\n }): Promise<QueryResult<T>> {\r\n let result = [...data];\r\n // Filtreleri uygula\r\n if (filters.length) {\r\n result = this.applyFilters(result, filters);\r\n }\r\n\r\n // İlişkileri çöz\r\n if (Object.keys(includes).length) {\r\n result = await this.resolveIncludes(model, result, includes, options);\r\n }\r\n\r\n // Sıralama yap\r\n if (sorting.length) {\r\n result = this.applySorting(result, sorting);\r\n }\r\n\r\n // Sayfalama yap\r\n const paginatedData = this.applyPagination(result, pagination.limit, pagination.offset);\r\n\r\n return {\r\n data: paginatedData,\r\n total: result.length,\r\n pagination: pagination.limit\r\n ? {\r\n limit: pagination.limit,\r\n offset: pagination.offset || 0,\r\n hasMore: (pagination.offset || 0) + paginatedData.length < result.length,\r\n }\r\n : undefined,\r\n };\r\n }\r\n}\r\n","import type { ContentLoaderOptions } from './types/loader';\r\nimport type { BaseContentrainType, QueryConfig } from './types/model';\r\nimport { ContentLoader } from './loader/content';\r\nimport { ContentrainQueryBuilder } from './query/builder';\r\nimport { QueryExecutor } from './query/executor';\r\n\r\nexport * from './cache';\r\nexport * from './loader/content';\r\nexport * from './query/builder';\r\nexport * from './query/executor';\r\nexport * from './types';\r\n\r\nexport class ContentrainSDK {\r\n private loader: ContentLoader;\r\n private executor: QueryExecutor;\r\n\r\n constructor(options: ContentLoaderOptions) {\r\n this.loader = new ContentLoader(options);\r\n this.executor = new QueryExecutor(this.loader);\r\n }\r\n\r\n query<T extends QueryConfig<BaseContentrainType, string, Record<string, BaseContentrainType>>>(\r\n model: string,\r\n ): ContentrainQueryBuilder<T['fields'], T['locales'], T['relations']> {\r\n return new ContentrainQueryBuilder<T['fields'], T['locales'], T['relations']>(\r\n model,\r\n this.executor,\r\n this.loader,\r\n );\r\n }\r\n\r\n async load<T extends BaseContentrainType>(model: string) {\r\n return this.loader.load<T>(model);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/cache/memory.ts","../src/loader/content.ts","../src/query/builder.ts","../src/query/executor.ts","../src/index.ts"],"names":["lru","join","readFile","readdir"],"mappings":"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","file":"index.js","sourcesContent":["import type { CacheEntry, CacheStats, MemoryCacheOptions } from '../types/loader';\r\nimport { lru } from 'tiny-lru';\r\n\r\nexport class MemoryCache {\r\n private cache;\r\n private options: Required<MemoryCacheOptions>;\r\n private stats: CacheStats = {\r\n hits: 0,\r\n misses: 0,\r\n size: 0,\r\n lastCleanup: Date.now(),\r\n };\r\n\r\n constructor(options: MemoryCacheOptions = {}) {\r\n this.options = {\r\n maxSize: 100, // 100 MB\r\n defaultTTL: 60 * 1000, // 1 dakika\r\n ...options,\r\n };\r\n\r\n const maxItems = Math.floor(this.options.maxSize * 1024 * 1024 / 1000); // Yaklaşık item sayısı\r\n this.cache = lru(maxItems);\r\n }\r\n\r\n private calculateSize(data: unknown): number {\r\n const str = JSON.stringify(data);\r\n return new TextEncoder().encode(str).length;\r\n }\r\n\r\n async set<T>(key: string, data: T, ttl?: number): Promise<void> {\r\n // Önce temizlik yap\r\n await this.cleanupCache();\r\n\r\n const size = this.calculateSize(data);\r\n const now = Date.now();\r\n const expireAt = now + (ttl || this.options.defaultTTL);\r\n\r\n // Yeni girişin boyutu limiti aşıyorsa, eski girişleri temizle\r\n while (size + this.stats.size > this.options.maxSize * 1024 * 1024) {\r\n const oldestKey = this.findOldestKey();\r\n if (!oldestKey)\r\n break;\r\n await this.delete(oldestKey);\r\n }\r\n\r\n const entry: CacheEntry<T> = {\r\n data,\r\n expireAt,\r\n size,\r\n createdAt: now,\r\n };\r\n\r\n // Önce eski girişi sil\r\n const oldEntry = this.cache.get(key) as CacheEntry<unknown> | undefined;\r\n if (oldEntry) {\r\n this.stats.size -= oldEntry.size;\r\n }\r\n\r\n // Yeni girişi ekle\r\n this.cache.set(key, entry);\r\n this.stats.size += size;\r\n }\r\n\r\n private findOldestKey(): string | null {\r\n let oldestKey: string | null = null;\r\n let oldestTime = Infinity;\r\n\r\n for (const key of this.cache.keys()) {\r\n const entry = this.cache.get(key) as CacheEntry<unknown>;\r\n if (entry.createdAt < oldestTime) {\r\n oldestTime = entry.createdAt;\r\n oldestKey = key;\r\n }\r\n }\r\n\r\n return oldestKey;\r\n }\r\n\r\n async get<T>(key: string): Promise<T | null> {\r\n const entry = this.cache.get(key) as CacheEntry<T> | undefined;\r\n\r\n if (!entry) {\r\n this.stats.misses++;\r\n return null;\r\n }\r\n\r\n // TTL kontrolü\r\n if (Date.now() >= entry.expireAt) {\r\n await this.delete(key);\r\n this.stats.misses++;\r\n return null;\r\n }\r\n\r\n this.stats.hits++;\r\n return entry.data;\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n const entry = this.cache.get(key) as CacheEntry<unknown> | undefined;\r\n if (entry) {\r\n this.stats.size -= entry.size;\r\n this.cache.delete(key);\r\n }\r\n }\r\n\r\n async clear(): Promise<void> {\r\n this.cache.clear();\r\n this.stats = {\r\n hits: 0,\r\n misses: 0,\r\n size: 0,\r\n lastCleanup: Date.now(),\r\n };\r\n }\r\n\r\n private async cleanupCache(): Promise<void> {\r\n const now = Date.now();\r\n const expiredKeys: string[] = [];\r\n let totalSize = 0;\r\n\r\n // Süresi dolmuş girişleri bul\r\n for (const key of this.cache.keys()) {\r\n const entry = this.cache.get(key) as CacheEntry<unknown>;\r\n if (entry.expireAt <= now) {\r\n expiredKeys.push(key);\r\n }\r\n else {\r\n totalSize += entry.size;\r\n }\r\n }\r\n\r\n // Süresi dolmuş girişleri sil\r\n for (const key of expiredKeys) {\r\n await this.delete(key);\r\n }\r\n\r\n // Boyut hala limiti aşıyorsa, en eski girişleri sil\r\n while (totalSize > this.options.maxSize * 1024 * 1024) {\r\n const oldestKey = this.findOldestKey();\r\n if (!oldestKey)\r\n break;\r\n const entry = this.cache.get(oldestKey) as CacheEntry<unknown>;\r\n await this.delete(oldestKey);\r\n totalSize -= entry.size;\r\n }\r\n\r\n this.stats.lastCleanup = now;\r\n }\r\n\r\n getStats(): CacheStats {\r\n return { ...this.stats };\r\n }\r\n}\r\n","import type { ContentFile, ContentLoaderOptions, LoaderResult, ModelConfig, RelationConfig } from '../types/loader';\r\nimport type { BaseContentrainType, FieldMetadata, ModelMetadata } from '../types/model';\r\nimport { readdir, readFile } from 'node:fs/promises';\r\nimport { join } from 'node:path';\r\nimport { MemoryCache } from '../cache/memory';\r\n\r\nexport class ContentLoader {\r\n private options: ContentLoaderOptions;\r\n private modelConfigs: Map<string, ModelConfig> = new Map();\r\n private relations: Map<string, RelationConfig[]> = new Map();\r\n private cache: MemoryCache;\r\n\r\n constructor(options: ContentLoaderOptions) {\r\n this.options = {\r\n defaultLocale: 'en',\r\n cache: true,\r\n ttl: 60 * 1000, // 1 dakika\r\n maxCacheSize: 100, // 100 MB\r\n ...options,\r\n };\r\n\r\n this.cache = new MemoryCache({\r\n maxSize: this.options.maxCacheSize,\r\n defaultTTL: this.options.ttl,\r\n });\r\n }\r\n\r\n private getCacheKey(model: string): string {\r\n return `${model}`;\r\n }\r\n\r\n private getModelTTL(model: string): number {\r\n return this.options.modelTTL?.[model] || this.options.ttl || 0;\r\n }\r\n\r\n async clearCache(): Promise<void> {\r\n await this.cache.clear();\r\n }\r\n\r\n async refreshCache(model: string): Promise<void> {\r\n const cacheKey = this.getCacheKey(model);\r\n await this.cache.delete(cacheKey);\r\n await this.load(model);\r\n }\r\n\r\n getCacheStats() {\r\n return this.cache.getStats();\r\n }\r\n\r\n private async loadModelConfig(model: string): Promise<ModelConfig> {\r\n try {\r\n // Önce genel metadata'yı oku\r\n const metadataPath = join(this.options.contentDir, 'models', 'metadata.json');\r\n const metadataContent = await readFile(metadataPath, 'utf-8');\r\n const allMetadata = JSON.parse(metadataContent);\r\n\r\n // Model özel metadata'sını bul\r\n const modelMetadata = allMetadata.find((m: ModelMetadata) => m.modelId === model);\r\n if (!modelMetadata) {\r\n throw new Error(`Model metadata not found for ${model}`);\r\n }\r\n\r\n // Model field'larını oku\r\n const modelPath = join(this.options.contentDir, 'models', `${model}.json`);\r\n const modelContent = await readFile(modelPath, 'utf-8');\r\n const modelFields = JSON.parse(modelContent) as FieldMetadata[];\r\n\r\n return {\r\n metadata: modelMetadata,\r\n fields: modelFields,\r\n };\r\n }\r\n catch (error: any) {\r\n throw new Error(`Failed to load model config for ${model}: ${error?.message || 'Unknown error'}`);\r\n }\r\n }\r\n\r\n private async loadContentFile<T extends BaseContentrainType>(\r\n model: string,\r\n locale: string = 'default',\r\n ): Promise<ContentFile<T>> {\r\n try {\r\n const modelConfig = await this.loadModelConfig(model);\r\n let contentPath: string;\r\n\r\n if (modelConfig.metadata.localization) {\r\n if (!locale || locale === 'default') {\r\n if (!this.options.defaultLocale) {\r\n throw new Error(`Default locale is required for localized model \"${model}\"`);\r\n }\r\n locale = this.options.defaultLocale;\r\n }\r\n contentPath = join(this.options.contentDir, model, `${locale}.json`);\r\n }\r\n else {\r\n if (locale !== 'default') {\r\n console.warn(`Locale \"${locale}\" specified for non-localized model \"${model}\". This parameter will be ignored.`);\r\n }\r\n contentPath = join(this.options.contentDir, model, `${model}.json`);\r\n }\r\n\r\n const content = await readFile(contentPath, 'utf-8');\r\n try {\r\n const data = JSON.parse(content) as T[];\r\n return {\r\n model,\r\n locale: modelConfig.metadata.localization ? locale : undefined,\r\n data,\r\n };\r\n }\r\n catch {\r\n throw new Error(`Failed to load content: Invalid JSON format in ${contentPath}`);\r\n }\r\n }\r\n catch (error: any) {\r\n if (error.message.includes('Invalid JSON format')) {\r\n throw error;\r\n }\r\n throw new Error(\r\n `Failed to load content file for ${model}${locale ? ` (${locale})` : ''}: ${\r\n error?.message || 'Unknown error'\r\n }`,\r\n );\r\n }\r\n }\r\n\r\n private async loadRelations(model: string): Promise<RelationConfig[]> {\r\n try {\r\n // Model config'i al\r\n const modelConfig = this.modelConfigs.get(model);\r\n if (!modelConfig) {\r\n throw new Error(`Model config not found for ${model}`);\r\n }\r\n\r\n // İlişki field'larını bul\r\n const relationFields = modelConfig.fields.filter((field) => {\r\n return field.fieldType === 'relation';\r\n });\r\n\r\n // İlişki config'lerini oluştur\r\n return relationFields.map((field) => {\r\n const options = field.options;\r\n const reference = options?.reference?.form?.reference?.value;\r\n\r\n if (!reference) {\r\n throw new Error(`Reference not found for relation field: ${field.name}`);\r\n }\r\n\r\n return {\r\n model: reference,\r\n type: field.componentId === 'one-to-one' ? 'one-to-one' : 'one-to-many',\r\n foreignKey: field.fieldId,\r\n };\r\n });\r\n }\r\n catch (error: any) {\r\n throw new Error(`Failed to load relations for ${model}: ${error?.message || 'Unknown error'}`);\r\n }\r\n }\r\n\r\n private async getModelLocales(model: string, modelConfig: ModelConfig): Promise<string[]> {\r\n try {\r\n if (!modelConfig.metadata.localization) {\r\n return ['default'];\r\n }\r\n\r\n const modelDir = join(this.options.contentDir, model);\r\n const files = await readdir(modelDir);\r\n\r\n // .json uzantılı dosyaları filtrele ve uzantıyı kaldır\r\n const locales = files\r\n .filter(file => file.endsWith('.json'))\r\n .map(file => file.replace('.json', ''))\r\n .filter(locale => locale !== model); // model.json dosyasını hariç tut\r\n\r\n if (locales.length === 0) {\r\n if (!this.options.defaultLocale) {\r\n throw new Error(`No locale files found for localized model \"${model}\" and no default locale specified`);\r\n }\r\n return [this.options.defaultLocale];\r\n }\r\n\r\n return locales;\r\n }\r\n catch (error: any) {\r\n if (!this.options.defaultLocale) {\r\n throw new Error(`Failed to read locales for model ${model} and no default locale specified: ${error?.message}`);\r\n }\r\n console.warn(`Failed to read locales for model ${model}: ${error?.message}`);\r\n return [this.options.defaultLocale];\r\n }\r\n }\r\n\r\n async load<T extends BaseContentrainType>(model: string): Promise<LoaderResult<T>> {\r\n const cacheKey = `${model}`;\r\n\r\n // Cache kontrolü\r\n if (this.options.cache) {\r\n const cached = await this.cache.get<LoaderResult<T>>(cacheKey);\r\n if (cached)\r\n return cached;\r\n }\r\n\r\n // Model konfigürasyonunu yükle\r\n const modelConfig = await this.loadModelConfig(model);\r\n this.modelConfigs.set(model, modelConfig);\r\n\r\n // İlişkileri yükle\r\n const relations = await this.loadRelations(model);\r\n this.relations.set(model, relations);\r\n\r\n // İçeriği yükle\r\n const content: { [locale: string]: T[] } = {};\r\n\r\n if (modelConfig.metadata.localization) {\r\n // Dil listesini dizinden al\r\n const locales = await this.getModelLocales(model, modelConfig);\r\n\r\n for (const locale of locales) {\r\n try {\r\n const file = await this.loadContentFile<T>(model, locale);\r\n content[locale] = file.data;\r\n }\r\n catch (error: any) {\r\n console.warn(`Failed to load content for locale ${locale}: ${error?.message}`);\r\n // Eğer default locale yüklenemezse hata fırlat\r\n if (locale === this.options.defaultLocale) {\r\n throw error;\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n // Tek dosyayı yükle\r\n const file = await this.loadContentFile<T>(model);\r\n content.default = file.data;\r\n }\r\n\r\n // Assets dosyasını yükle\r\n let assets;\r\n try {\r\n const assetsPath = join(this.options.contentDir, 'assets.json');\r\n const assetsContent = await readFile(assetsPath, 'utf-8');\r\n assets = JSON.parse(assetsContent);\r\n }\r\n catch (error) {\r\n // Assets dosyası yoksa veya okunamazsa boş geç\r\n console.warn('Assets file not found or cannot be read:', error);\r\n }\r\n\r\n const result: LoaderResult<T> = {\r\n model: modelConfig,\r\n content,\r\n assets,\r\n };\r\n\r\n // Cache'e kaydet\r\n if (this.options.cache) {\r\n const ttl = this.getModelTTL(model);\r\n await this.cache.set(cacheKey, result, ttl);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n async resolveRelation<T extends BaseContentrainType, R extends BaseContentrainType>(\r\n model: string,\r\n relationField: keyof T,\r\n data: T[],\r\n locale?: string,\r\n ): Promise<R[]> {\r\n try {\r\n const relations = this.relations.get(model);\r\n if (!relations)\r\n throw new Error(`No relations found for model: ${model}`);\r\n\r\n const relation = relations.find(r => r.foreignKey === relationField);\r\n if (!relation)\r\n throw new Error(`No relation found for field: ${String(relationField)}`);\r\n\r\n // İlişkili modeli yükle\r\n const relatedContent = await this.load<R>(relation.model);\r\n const relatedData = locale ? relatedContent.content[locale] : relatedContent.content.en;\r\n\r\n if (!relatedData) {\r\n throw new Error(`Failed to resolve relation: No data found for model ${relation.model}`);\r\n }\r\n\r\n if (relation.type === 'one-to-one') {\r\n // Birebir ilişki\r\n return data.map((item) => {\r\n const relatedItem = relatedData.find(r => r.ID === item[relationField]);\r\n if (!relatedItem) {\r\n throw new Error(`Failed to resolve relation: No matching item found for ID ${String(item[relationField])}`);\r\n }\r\n return relatedItem;\r\n });\r\n }\r\n else {\r\n // Çoka bir ilişki - tekrarlanan öğeleri önle\r\n const uniqueIds = new Set(\r\n data.flatMap(item =>\r\n Array.isArray(item[relationField])\r\n ? item[relationField]\r\n : [item[relationField]],\r\n ),\r\n );\r\n\r\n const items = Array.from(uniqueIds)\r\n .map(id => relatedData.find(r => r.ID === id))\r\n .filter(Boolean) as R[];\r\n\r\n if (items.length !== uniqueIds.size) {\r\n throw new Error('Failed to resolve relation: Some related items not found');\r\n }\r\n\r\n return items;\r\n }\r\n }\r\n catch (error: any) {\r\n throw new Error(`Failed to resolve relation: ${error.message}`);\r\n }\r\n }\r\n}\r\n","import type { ContentLoader } from '../loader/content';\nimport type { BaseContentrainType, ContentrainLocales } from '../types/model';\nimport type { Filter, Include, Operator, Pagination, QueryOptions, QueryResult, Sort } from '../types/query';\nimport type { QueryExecutor } from './executor';\n\nexport class ContentrainQueryBuilder<\n TFields extends BaseContentrainType,\n TLocales extends ContentrainLocales = 'en' | 'tr',\n TRelations extends Record<string, BaseContentrainType> = Record<string, never>,\n> {\n private model: string;\n private filters: Filter[] = [];\n private includes: Include = {};\n private sorting: Sort[] = [];\n private pagination: Pagination = {};\n\n private options: QueryOptions = {};\n private executor: QueryExecutor;\n private loader: ContentLoader;\n\n constructor(model: string, executor: QueryExecutor, loader: ContentLoader) {\n this.model = model;\n this.executor = executor;\n this.loader = loader;\n }\n\n where<K extends keyof TFields, O extends Operator>(\n field: K,\n operator: O,\n value: O extends 'in' ? TFields[K][] : TFields[K],\n ): this {\n this.filters.push({\n field: field as string,\n operator,\n value,\n });\n return this;\n }\n\n include<K extends keyof TRelations>(relation: K | K[]): this {\n if (typeof relation === 'string') {\n this.includes[relation] = {};\n }\n else if (Array.isArray(relation)) {\n relation.forEach((r) => {\n this.includes[r as string] = {};\n });\n }\n return this;\n }\n\n orderBy<K extends keyof TFields>(field: K, direction: 'asc' | 'desc' = 'asc'): this {\n this.sorting.push({\n field: field as string,\n direction,\n });\n return this;\n }\n\n limit(count: number): this {\n this.pagination.limit = count;\n return this;\n }\n\n offset(count: number): this {\n this.pagination.offset = count;\n return this;\n }\n\n locale(code: TLocales): this {\n this.options.locale = code;\n return this;\n }\n\n cache(ttl?: number): this {\n this.options.cache = true;\n if (ttl)\n this.options.ttl = ttl;\n return this;\n }\n\n noCache(): this {\n this.options.cache = false;\n return this;\n }\n\n bypassCache(): this {\n this.options.cache = false;\n this.options.ttl = 0;\n return this;\n }\n\n toJSON() {\n return {\n model: this.model,\n filters: this.filters,\n includes: this.includes,\n sorting: this.sorting,\n pagination: this.pagination,\n options: this.options,\n };\n }\n\n async get(): Promise<QueryResult<TFields>> {\n const result = await this.loader.load<TFields>(this.model);\n const modelConfig = result.model;\n\n // Locale kontrolü ve veri seçimi\n let data: TFields[];\n if (modelConfig.metadata.localization) {\n // Localize edilmiş model için locale kontrolü\n const locale = this.options.locale || 'en'; // Default locale\n data = result.content[locale];\n\n if (!data) {\n throw new Error(`Content not found for locale: ${locale}`);\n }\n }\n else {\n // Localize edilmemiş model için default içerik\n if (!result.content.default) {\n throw new Error(`Content not found for model: ${this.model}`);\n }\n data = result.content.default;\n }\n\n return this.executor.execute({\n model: this.model,\n data,\n filters: this.filters,\n includes: this.includes,\n sorting: this.sorting,\n pagination: this.pagination,\n options: this.options,\n });\n }\n\n async first(): Promise<TFields | null> {\n const result = await this.limit(1).get();\n return result.data[0] || null;\n }\n\n async count(): Promise<number> {\n const result = await this.get();\n return result.total;\n }\n}\n","import type { ContentLoader } from '../loader/content';\r\nimport type { BaseContentrainType } from '../types/model';\r\nimport type { ArrayOperator, Filter, Include, NumericOperator, QueryOptions, QueryResult, Sort, StringOperator } from '../types/query';\r\n\r\nexport class QueryExecutor {\r\n private loader: ContentLoader;\r\n\r\n constructor(loader: ContentLoader) {\r\n this.loader = loader;\r\n }\r\n\r\n private applyFilters<T extends BaseContentrainType>(data: T[], filters: Filter[]): T[] {\r\n return data.filter((item) => {\r\n return filters.every(({ field, operator, value }) => {\r\n const itemValue = item[field as keyof T];\r\n\r\n // Geçersiz operatör kontrolü\r\n const validOperators = ['eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'nin', 'contains', 'startsWith', 'endsWith'];\r\n if (!validOperators.includes(operator)) {\r\n throw new Error(`Invalid operator: ${operator}`);\r\n }\r\n\r\n if (typeof itemValue === 'string' && typeof value === 'string') {\r\n return this.applyStringOperation(itemValue, operator as StringOperator, value);\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n switch (operator as ArrayOperator) {\r\n case 'in':\r\n return (value as unknown[]).includes(itemValue);\r\n case 'nin':\r\n return !(value as unknown[]).includes(itemValue);\r\n default:\r\n throw new Error(`Invalid array operator: ${operator}`);\r\n }\r\n }\r\n\r\n if (Array.isArray(itemValue)) {\r\n switch (operator as ArrayOperator) {\r\n case 'in':\r\n return (value as unknown[]).some((v: unknown) => itemValue.includes(v));\r\n case 'nin':\r\n return !(value as unknown[]).some((v: unknown) => itemValue.includes(v));\r\n default:\r\n throw new Error(`Invalid array operator: ${operator}`);\r\n }\r\n }\r\n\r\n if (typeof itemValue === 'number' && typeof value === 'number') {\r\n switch (operator as NumericOperator) {\r\n case 'eq':\r\n return itemValue === value;\r\n case 'ne':\r\n return itemValue !== value;\r\n case 'gt':\r\n return itemValue > value;\r\n case 'gte':\r\n return itemValue >= value;\r\n case 'lt':\r\n return itemValue < value;\r\n case 'lte':\r\n return itemValue <= value;\r\n }\r\n }\r\n\r\n return false;\r\n });\r\n });\r\n }\r\n\r\n private applySorting<T extends BaseContentrainType>(data: T[], sorting: Sort[]): T[] {\r\n return [...data].sort((a, b) => {\r\n for (const { field, direction } of sorting) {\r\n // Sıralama alanı validasyonu\r\n if (!(field in a)) {\r\n throw new Error(`Invalid sort field: ${field}`);\r\n }\r\n\r\n const aValue = a[field as keyof T];\r\n const bValue = b[field as keyof T];\r\n\r\n if (aValue === bValue)\r\n continue;\r\n\r\n const compareResult = aValue < bValue ? -1 : 1;\r\n return direction === 'asc' ? compareResult : -compareResult;\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n private applyPagination<T>(data: T[], limit?: number, offset: number = 0): T[] {\r\n if (!limit)\r\n return data.slice(offset);\r\n return data.slice(offset, offset + limit);\r\n }\r\n\r\n private async resolveIncludes<T extends BaseContentrainType>(\r\n model: string,\r\n data: T[],\r\n includes: Include,\r\n options: QueryOptions,\r\n ): Promise<T[]> {\r\n const result = [...data];\r\n\r\n for (const [field, config] of Object.entries(includes)) {\r\n // İlişkiyi çöz\r\n const relations = await this.loader.resolveRelation(\r\n model,\r\n field as keyof T,\r\n result,\r\n options.locale,\r\n );\r\n\r\n // Alt ilişkileri çöz\r\n if (config.include && relations.length) {\r\n await this.resolveIncludes(\r\n field,\r\n relations,\r\n config.include,\r\n options,\r\n );\r\n }\r\n\r\n // İlişkili verileri ekle\r\n result.forEach((item) => {\r\n const value = item[field as keyof T];\r\n const relatedItems = relations.filter((r) => {\r\n if (Array.isArray(value)) {\r\n return value.includes(r.ID);\r\n }\r\n return r.ID === value;\r\n });\r\n\r\n if (!item._relations) {\r\n item._relations = {};\r\n }\r\n item._relations[field] = Array.isArray(value) ? relatedItems : relatedItems[0];\r\n });\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private applyStringOperation(value: string, operator: StringOperator, searchValue: string): boolean {\r\n switch (operator) {\r\n case 'eq':\r\n return value === searchValue;\r\n case 'ne':\r\n return value !== searchValue;\r\n case 'contains':\r\n return value.toLowerCase().includes(searchValue.toLowerCase());\r\n case 'startsWith':\r\n return value.toLowerCase().startsWith(searchValue.toLowerCase());\r\n case 'endsWith':\r\n return value.toLowerCase().endsWith(searchValue.toLowerCase());\r\n default: {\r\n const _exhaustiveCheck: never = operator;\r\n return _exhaustiveCheck;\r\n }\r\n }\r\n }\r\n\r\n async execute<T extends BaseContentrainType>({\r\n model,\r\n data,\r\n filters = [],\r\n includes = {},\r\n sorting = [],\r\n pagination = {},\r\n options = {},\r\n }: {\r\n model: string\r\n data: T[]\r\n filters?: Filter[]\r\n includes?: Include\r\n sorting?: Sort[]\r\n pagination?: { limit?: number, offset?: number }\r\n options?: QueryOptions\r\n }): Promise<QueryResult<T>> {\r\n let result = [...data];\r\n // Filtreleri uygula\r\n if (filters.length) {\r\n result = this.applyFilters(result, filters);\r\n }\r\n\r\n // İlişkileri çöz\r\n if (Object.keys(includes).length) {\r\n result = await this.resolveIncludes(model, result, includes, options);\r\n }\r\n\r\n // Sıralama yap\r\n if (sorting.length) {\r\n result = this.applySorting(result, sorting);\r\n }\r\n\r\n // Sayfalama yap\r\n const paginatedData = this.applyPagination(result, pagination.limit, pagination.offset);\r\n\r\n return {\r\n data: paginatedData,\r\n total: result.length,\r\n pagination: pagination.limit\r\n ? {\r\n limit: pagination.limit,\r\n offset: pagination.offset || 0,\r\n hasMore: (pagination.offset || 0) + paginatedData.length < result.length,\r\n }\r\n : undefined,\r\n };\r\n }\r\n}\r\n","import type { ContentLoaderOptions } from './types/loader';\r\nimport type { BaseContentrainType } from './types/model';\r\nimport type { QueryConfig } from './types/query';\r\nimport { ContentLoader } from './loader/content';\r\nimport { ContentrainQueryBuilder } from './query/builder';\r\nimport { QueryExecutor } from './query/executor';\r\n\r\nexport * from './cache';\r\nexport * from './loader/content';\r\nexport * from './query/builder';\r\nexport * from './query/executor';\r\nexport * from './types';\r\n\r\nexport class ContentrainSDK {\r\n private loader: ContentLoader;\r\n private executor: QueryExecutor;\r\n\r\n constructor(options: ContentLoaderOptions) {\r\n this.loader = new ContentLoader(options);\r\n this.executor = new QueryExecutor(this.loader);\r\n }\r\n\r\n query<T extends QueryConfig<BaseContentrainType, string, Record<string, BaseContentrainType>>>(\r\n model: string,\r\n ): ContentrainQueryBuilder<T['fields'], T['locales'], T['relations']> {\r\n return new ContentrainQueryBuilder<T['fields'], T['locales'], T['relations']>(\r\n model,\r\n this.executor,\r\n this.loader,\r\n );\r\n }\r\n\r\n async load<T extends BaseContentrainType>(model: string) {\r\n return this.loader.load<T>(model);\r\n }\r\n\r\n async clearCache(): Promise<void> {\r\n return this.loader.clearCache();\r\n }\r\n\r\n async refreshCache(model: string): Promise<void> {\r\n return this.loader.refreshCache(model);\r\n }\r\n\r\n getCacheStats() {\r\n return this.loader.getCacheStats();\r\n }\r\n}\r\n"]}
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { readFile } from 'node:fs/promises';
1
+ import { readFile, readdir } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
3
  import { lru } from 'tiny-lru';
4
4
 
@@ -172,14 +172,6 @@ var _ContentLoader = class _ContentLoader {
172
172
  const modelPath = join(this.options.contentDir, "models", `${model}.json`);
173
173
  const modelContent = await readFile(modelPath, "utf-8");
174
174
  const modelFields = JSON.parse(modelContent);
175
- if (!Array.isArray(modelFields)) {
176
- throw new TypeError(`Invalid field configuration for model ${model}: Expected an array of fields`);
177
- }
178
- modelFields.forEach((field, index) => {
179
- if (!field.fieldId || !field.fieldType || !field.componentId) {
180
- throw new Error(`Invalid field at index ${index} for model ${model}: Missing required properties`);
181
- }
182
- });
183
175
  return {
184
176
  metadata: modelMetadata,
185
177
  fields: modelFields
@@ -188,12 +180,22 @@ var _ContentLoader = class _ContentLoader {
188
180
  throw new Error(`Failed to load model config for ${model}: ${error?.message || "Unknown error"}`);
189
181
  }
190
182
  }
191
- async loadContentFile(model, locale) {
183
+ async loadContentFile(model, locale = "default") {
192
184
  try {
185
+ const modelConfig = await this.loadModelConfig(model);
193
186
  let contentPath;
194
- if (locale) {
187
+ if (modelConfig.metadata.localization) {
188
+ if (!locale || locale === "default") {
189
+ if (!this.options.defaultLocale) {
190
+ throw new Error(`Default locale is required for localized model "${model}"`);
191
+ }
192
+ locale = this.options.defaultLocale;
193
+ }
195
194
  contentPath = join(this.options.contentDir, model, `${locale}.json`);
196
195
  } else {
196
+ if (locale !== "default") {
197
+ console.warn(`Locale "${locale}" specified for non-localized model "${model}". This parameter will be ignored.`);
198
+ }
197
199
  contentPath = join(this.options.contentDir, model, `${model}.json`);
198
200
  }
199
201
  const content = await readFile(contentPath, "utf-8");
@@ -201,7 +203,7 @@ var _ContentLoader = class _ContentLoader {
201
203
  const data = JSON.parse(content);
202
204
  return {
203
205
  model,
204
- locale,
206
+ locale: modelConfig.metadata.localization ? locale : void 0,
205
207
  data
206
208
  };
207
209
  } catch {
@@ -241,8 +243,31 @@ var _ContentLoader = class _ContentLoader {
241
243
  throw new Error(`Failed to load relations for ${model}: ${error?.message || "Unknown error"}`);
242
244
  }
243
245
  }
246
+ async getModelLocales(model, modelConfig) {
247
+ try {
248
+ if (!modelConfig.metadata.localization) {
249
+ return ["default"];
250
+ }
251
+ const modelDir = join(this.options.contentDir, model);
252
+ const files = await readdir(modelDir);
253
+ const locales = files.filter((file) => file.endsWith(".json")).map((file) => file.replace(".json", "")).filter((locale) => locale !== model);
254
+ if (locales.length === 0) {
255
+ if (!this.options.defaultLocale) {
256
+ throw new Error(`No locale files found for localized model "${model}" and no default locale specified`);
257
+ }
258
+ return [this.options.defaultLocale];
259
+ }
260
+ return locales;
261
+ } catch (error) {
262
+ if (!this.options.defaultLocale) {
263
+ throw new Error(`Failed to read locales for model ${model} and no default locale specified: ${error?.message}`);
264
+ }
265
+ console.warn(`Failed to read locales for model ${model}: ${error?.message}`);
266
+ return [this.options.defaultLocale];
267
+ }
268
+ }
244
269
  async load(model) {
245
- const cacheKey = this.getCacheKey(model);
270
+ const cacheKey = `${model}`;
246
271
  if (this.options.cache) {
247
272
  const cached = await this.cache.get(cacheKey);
248
273
  if (cached)
@@ -254,18 +279,34 @@ var _ContentLoader = class _ContentLoader {
254
279
  this.relations.set(model, relations);
255
280
  const content = {};
256
281
  if (modelConfig.metadata.localization) {
257
- const locales = ["en", "tr"];
282
+ const locales = await this.getModelLocales(model, modelConfig);
258
283
  for (const locale of locales) {
259
- const file = await this.loadContentFile(model, locale);
260
- content[locale] = file.data;
284
+ try {
285
+ const file = await this.loadContentFile(model, locale);
286
+ content[locale] = file.data;
287
+ } catch (error) {
288
+ console.warn(`Failed to load content for locale ${locale}: ${error?.message}`);
289
+ if (locale === this.options.defaultLocale) {
290
+ throw error;
291
+ }
292
+ }
261
293
  }
262
294
  } else {
263
295
  const file = await this.loadContentFile(model);
264
296
  content.default = file.data;
265
297
  }
298
+ let assets;
299
+ try {
300
+ const assetsPath = join(this.options.contentDir, "assets.json");
301
+ const assetsContent = await readFile(assetsPath, "utf-8");
302
+ assets = JSON.parse(assetsContent);
303
+ } catch (error) {
304
+ console.warn("Assets file not found or cannot be read:", error);
305
+ }
266
306
  const result = {
267
307
  model: modelConfig,
268
- content
308
+ content,
309
+ assets
269
310
  };
270
311
  if (this.options.cache) {
271
312
  const ttl = this.getModelTTL(model);
@@ -295,14 +336,16 @@ var _ContentLoader = class _ContentLoader {
295
336
  return relatedItem;
296
337
  });
297
338
  } else {
298
- return data.flatMap((item) => {
299
- const ids = Array.isArray(item[relationField]) ? item[relationField] : [item[relationField]];
300
- const items = ids.map((id) => relatedData.find((r) => r.ID === id)).filter(Boolean);
301
- if (items.length !== ids.length) {
302
- throw new Error("Failed to resolve relation: Some related items not found");
303
- }
304
- return items;
305
- });
339
+ const uniqueIds = new Set(
340
+ data.flatMap(
341
+ (item) => Array.isArray(item[relationField]) ? item[relationField] : [item[relationField]]
342
+ )
343
+ );
344
+ const items = Array.from(uniqueIds).map((id) => relatedData.find((r) => r.ID === id)).filter(Boolean);
345
+ if (items.length !== uniqueIds.size) {
346
+ throw new Error("Failed to resolve relation: Some related items not found");
347
+ }
348
+ return items;
306
349
  }
307
350
  } catch (error) {
308
351
  throw new Error(`Failed to resolve relation: ${error.message}`);
@@ -388,7 +431,20 @@ var _ContentrainQueryBuilder = class _ContentrainQueryBuilder {
388
431
  }
389
432
  async get() {
390
433
  const result = await this.loader.load(this.model);
391
- const data = this.options.locale ? result.content[this.options.locale] : result.content.en;
434
+ const modelConfig = result.model;
435
+ let data;
436
+ if (modelConfig.metadata.localization) {
437
+ const locale = this.options.locale || "en";
438
+ data = result.content[locale];
439
+ if (!data) {
440
+ throw new Error(`Content not found for locale: ${locale}`);
441
+ }
442
+ } else {
443
+ if (!result.content.default) {
444
+ throw new Error(`Content not found for model: ${this.model}`);
445
+ }
446
+ data = result.content.default;
447
+ }
392
448
  return this.executor.execute({
393
449
  model: this.model,
394
450
  data,
@@ -418,50 +474,67 @@ var _QueryExecutor = class _QueryExecutor {
418
474
  }
419
475
  applyFilters(data, filters) {
420
476
  return data.filter((item) => {
421
- return filters.every((filter) => {
422
- const value = item[filter.field];
477
+ return filters.every(({ field, operator, value }) => {
478
+ const itemValue = item[field];
423
479
  const validOperators = ["eq", "ne", "gt", "gte", "lt", "lte", "in", "nin", "contains", "startsWith", "endsWith"];
424
- if (!validOperators.includes(filter.operator)) {
425
- throw new Error(`Invalid operator: ${filter.operator}`);
480
+ if (!validOperators.includes(operator)) {
481
+ throw new Error(`Invalid operator: ${operator}`);
482
+ }
483
+ if (typeof itemValue === "string" && typeof value === "string") {
484
+ return this.applyStringOperation(itemValue, operator, value);
485
+ }
486
+ if (Array.isArray(value)) {
487
+ switch (operator) {
488
+ case "in":
489
+ return value.includes(itemValue);
490
+ case "nin":
491
+ return !value.includes(itemValue);
492
+ default:
493
+ throw new Error(`Invalid array operator: ${operator}`);
494
+ }
495
+ }
496
+ if (Array.isArray(itemValue)) {
497
+ switch (operator) {
498
+ case "in":
499
+ return value.some((v) => itemValue.includes(v));
500
+ case "nin":
501
+ return !value.some((v) => itemValue.includes(v));
502
+ default:
503
+ throw new Error(`Invalid array operator: ${operator}`);
504
+ }
426
505
  }
427
- switch (filter.operator) {
428
- case "eq":
429
- return value === filter.value;
430
- case "ne":
431
- return value !== filter.value;
432
- case "gt":
433
- return value > filter.value;
434
- case "gte":
435
- return value >= filter.value;
436
- case "lt":
437
- return value < filter.value;
438
- case "lte":
439
- return value <= filter.value;
440
- case "in":
441
- return Array.isArray(filter.value) && filter.value.includes(value);
442
- case "nin":
443
- return Array.isArray(filter.value) && !filter.value.includes(value);
444
- case "contains":
445
- return typeof value === "string" && value.includes(filter.value);
446
- case "startsWith":
447
- return typeof value === "string" && value.startsWith(filter.value);
448
- case "endsWith":
449
- return typeof value === "string" && value.endsWith(filter.value);
450
- default:
451
- return false;
506
+ if (typeof itemValue === "number" && typeof value === "number") {
507
+ switch (operator) {
508
+ case "eq":
509
+ return itemValue === value;
510
+ case "ne":
511
+ return itemValue !== value;
512
+ case "gt":
513
+ return itemValue > value;
514
+ case "gte":
515
+ return itemValue >= value;
516
+ case "lt":
517
+ return itemValue < value;
518
+ case "lte":
519
+ return itemValue <= value;
520
+ }
452
521
  }
522
+ return false;
453
523
  });
454
524
  });
455
525
  }
456
526
  applySorting(data, sorting) {
457
527
  return [...data].sort((a, b) => {
458
- for (const sort of sorting) {
459
- const aValue = a[sort.field];
460
- const bValue = b[sort.field];
528
+ for (const { field, direction } of sorting) {
529
+ if (!(field in a)) {
530
+ throw new Error(`Invalid sort field: ${field}`);
531
+ }
532
+ const aValue = a[field];
533
+ const bValue = b[field];
461
534
  if (aValue === bValue)
462
535
  continue;
463
- const direction = sort.direction === "asc" ? 1 : -1;
464
- return aValue > bValue ? direction : -direction;
536
+ const compareResult = aValue < bValue ? -1 : 1;
537
+ return direction === "asc" ? compareResult : -compareResult;
465
538
  }
466
539
  return 0;
467
540
  });
@@ -504,6 +577,24 @@ var _QueryExecutor = class _QueryExecutor {
504
577
  }
505
578
  return result;
506
579
  }
580
+ applyStringOperation(value, operator, searchValue) {
581
+ switch (operator) {
582
+ case "eq":
583
+ return value === searchValue;
584
+ case "ne":
585
+ return value !== searchValue;
586
+ case "contains":
587
+ return value.toLowerCase().includes(searchValue.toLowerCase());
588
+ case "startsWith":
589
+ return value.toLowerCase().startsWith(searchValue.toLowerCase());
590
+ case "endsWith":
591
+ return value.toLowerCase().endsWith(searchValue.toLowerCase());
592
+ default: {
593
+ const _exhaustiveCheck = operator;
594
+ return _exhaustiveCheck;
595
+ }
596
+ }
597
+ }
507
598
  async execute({
508
599
  model,
509
600
  data,
@@ -554,6 +645,15 @@ var _ContentrainSDK = class _ContentrainSDK {
554
645
  async load(model) {
555
646
  return this.loader.load(model);
556
647
  }
648
+ async clearCache() {
649
+ return this.loader.clearCache();
650
+ }
651
+ async refreshCache(model) {
652
+ return this.loader.refreshCache(model);
653
+ }
654
+ getCacheStats() {
655
+ return this.loader.getCacheStats();
656
+ }
557
657
  };
558
658
  __name(_ContentrainSDK, "ContentrainSDK");
559
659
  var ContentrainSDK = _ContentrainSDK;