@contentrain/query 3.1.0 → 4.0.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/README.md +164 -172
- package/dist/index.d.mts +485 -206
- package/dist/index.d.ts +485 -206
- package/dist/index.js +30 -669
- package/dist/index.mjs +30 -663
- package/package.json +13 -4
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contentrain/query",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"description": "Core package for Contentrain SDK, providing fundamental functionality and types",
|
|
5
5
|
"author": "Contentrain Inc.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -37,15 +37,24 @@
|
|
|
37
37
|
"vitest": "^1.1.3"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
+
"@types/better-sqlite3": "^7.6.12",
|
|
41
|
+
"@types/debug": "^4.1.12",
|
|
42
|
+
"better-sqlite3": "^11.8.1",
|
|
43
|
+
"debug": "^4.4.0",
|
|
40
44
|
"tiny-lru": "^11.2.11"
|
|
41
45
|
},
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"better-sqlite3": "^11.8.1",
|
|
48
|
+
"debug": "^4.4.0"
|
|
49
|
+
},
|
|
42
50
|
"scripts": {
|
|
43
|
-
"
|
|
44
|
-
"
|
|
51
|
+
"dev": "NODE_ENV=development tsup --watch",
|
|
52
|
+
"build": "NODE_ENV=production tsup && rm -rf dist/types dist/cache dist/loader dist/query",
|
|
45
53
|
"dev:watch": "tsup --watch",
|
|
46
54
|
"test": "vitest watch",
|
|
47
55
|
"test:run": "vitest run",
|
|
48
56
|
"test:coverage": "vitest run --coverage",
|
|
49
|
-
"clean": "rm -rf dist"
|
|
57
|
+
"clean": "rm -rf dist",
|
|
58
|
+
"test:prod": "NODE_ENV=production vitest run"
|
|
50
59
|
}
|
|
51
60
|
}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cache/memory.ts","../src/loader/content.ts","../src/query/builder.ts","../src/query/executor.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","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"]}
|