@localazy/cdn-client
Version:
Node.js module that allows you to easily interact with the Localazy CDN.
1 lines • 40.8 kB
Source Map (JSON)
{"version":3,"file":"localazy-cdn-client.cjs","names":[],"sources":["../../src/cdn/api/api.ts","../../src/cdn/cache/memory-cache-adapter.ts","../../src/cdn/utils.ts","../../src/cdn/cache/locales-cache.ts","../../src/cdn/response/response-factory.ts","../../src/cdn/context/context.ts","../../src/cdn/metafile/metafile-file.ts","../../src/cdn/metafile/metafile-locale.ts","../../src/cdn/metafile/metafile-data.ts","../../src/cdn/metafile/metafile-params.ts","../../src/cdn/context/metafile-context.ts","../../src/cdn/http/fetch-http-adapter.ts","../../src/cdn/methods/cdn-base.ts","../../src/cdn/methods/cdn-cache.ts","../../src/cdn/methods/cdn-metafile.ts","../../src/cdn/request/locales-map.ts","../../src/cdn/request/request.ts","../../src/cdn/request/request-builder.ts","../../src/cdn/cdn-client.ts"],"sourcesContent":["import type { Context } from '@/cdn/context/context.js';\nimport type { IMetafile } from '@/interfaces/i-metafile.js';\nimport type { ApiLocaleRequest } from '@/types/api-locale-request.js';\n\nexport class Api {\n protected context: Context;\n\n constructor(context: Context) {\n this.context = context;\n }\n\n public async fetchLocale(options: ApiLocaleRequest): Promise<object | string> {\n if (this.context.cache.has(options)) {\n return new Promise((resolve): void => {\n resolve(this.context.cache.get(options) as object | string);\n });\n }\n\n return this.context.client.get(options.metafileLocale.uri);\n }\n\n public async fetchMetafile(): Promise<IMetafile> {\n return (await this.context.client.get(this.context.metafile.params.jsonPath)) as IMetafile;\n }\n}\n","import type { ICacheAdapter } from '@/interfaces/i-cache-adapter.js';\n\nexport class MemoryCacheAdapter<K, V> implements ICacheAdapter<K, V> {\n protected map: Map<K, V>;\n\n constructor() {\n this.map = new Map();\n }\n\n public get(key: K): V | undefined {\n return this.map.get(key);\n }\n\n public has(key: K): boolean {\n return this.map.has(key);\n }\n\n public set(key: K, value: V): void {\n this.map.set(key, value);\n }\n\n public flush(): void {\n this.map = new Map();\n }\n}\n","export const isString = (value: unknown): value is string => typeof value === 'string';\n\nexport const isUndefined = (value: unknown): value is undefined => typeof value === 'undefined';\n\nexport const isArray = <T>(value: unknown): value is T[] => Array.isArray(value);\n\nexport const isPlainObject = (value: unknown): value is Record<string, unknown> =>\n Object.prototype.toString.call(value) === '[object Object]';\n\nexport const uniq = <T>(array: T[]): T[] => [...new Set(array)];\n\nexport const uniqBy = <T>(array: T[], predicate: (item: T) => string): T[] => {\n const seen: Record<string, boolean> = {};\n\n return array.filter((item: T): boolean => {\n const key: string = predicate(item);\n\n if (!Object.hasOwn(seen, key)) {\n seen[key] = true;\n\n return true;\n }\n\n return false;\n });\n};\n","import { MemoryCacheAdapter } from '@/cdn/cache/memory-cache-adapter.js';\nimport type { Context } from '@/cdn/context/context.js';\nimport { uniq } from '@/cdn/utils.js';\nimport type { ICacheAdapter } from '@/interfaces/i-cache-adapter.js';\nimport type { CacheGetLocalesRequest } from '@/types/cache-get-locales-request.js';\nimport type { CacheHasLocalesRequest } from '@/types/cache-has-locales-request.js';\nimport type { CacheKeyMetafileOptions } from '@/types/cache-key-metafile-options.js';\nimport type { CacheStoreLocalesRequest } from '@/types/cache-store-locales-request.js';\n\nexport class LocalesCache {\n protected context: Context;\n\n protected cacheAdapter: ICacheAdapter<string, object | string>;\n\n constructor(context: Context) {\n this.context = context;\n this.cacheAdapter = new MemoryCacheAdapter();\n }\n\n public setIfMissed(options: CacheStoreLocalesRequest): void {\n const { metafileFile, metafileLocale, data }: CacheStoreLocalesRequest = options;\n\n const key: string = this.keyFromMetafile({\n metafileFile,\n metafileLocale,\n });\n\n if (!this.cacheAdapter.has(key)) {\n this.cacheAdapter.set(key, data);\n }\n }\n\n public has(options: CacheHasLocalesRequest): boolean {\n const key: string = this.keyFromMetafile(options);\n\n return this.cacheAdapter.has(key);\n }\n\n public get(options: CacheGetLocalesRequest): object | string | undefined {\n const key: string = this.keyFromMetafile(options);\n\n return this.cacheAdapter.get(key);\n }\n\n public flush(): void {\n this.cacheAdapter.flush();\n }\n\n protected keyFromMetafile(options: CacheKeyMetafileOptions): string {\n const { metafileFile, metafileLocale }: CacheKeyMetafileOptions = options;\n const productFlavors: string = [...uniq(metafileFile.productFlavors)].sort().join('-');\n\n const indices: string[] = [\n this.context.metafile.params.cdnId,\n metafileFile.id,\n metafileFile.file,\n metafileFile.path,\n metafileFile.library,\n metafileFile.module,\n metafileFile.buildType,\n productFlavors,\n metafileLocale.locale,\n metafileLocale.timestamp.toString(),\n ];\n\n return indices.filter((key: string): boolean => key !== '').join('-');\n }\n}\n","import type { Context } from '@/cdn/context/context.js';\nimport type { ApiLocaleRequest } from '@/types/api-locale-request.js';\nimport type { CacheStoreLocalesRequest } from '@/types/cache-store-locales-request.js';\nimport type { CdnResponse } from '@/types/cdn-response.js';\nimport type { ResponseFactoryOptions } from '@/types/response-factory-options.js';\n\nexport class ResponseFactory {\n protected context: Context;\n\n constructor(context: Context) {\n this.context = context;\n }\n\n public createCdnResponse(options: ResponseFactoryOptions): CdnResponse {\n const {\n requests,\n responses,\n hasSingleFileResponse,\n hasSingleLocaleResponse,\n }: ResponseFactoryOptions = options;\n\n if (responses.length === 0 || typeof responses[0] === 'undefined') {\n return {};\n }\n\n this.cacheResponses(requests, responses);\n\n return hasSingleFileResponse && hasSingleLocaleResponse\n ? responses[0]\n : ResponseFactory.transformResponses(options);\n }\n\n protected cacheResponses(requests: ApiLocaleRequest[], responses: (object | string)[]): void {\n responses.forEach((response: object | string, index: number): void => {\n if (typeof requests[index] !== 'undefined') {\n const { metafileFile, metafileLocale }: Partial<CacheStoreLocalesRequest> = requests[index];\n\n if (metafileFile && metafileLocale) {\n this.context.cache.setIfMissed({ metafileFile, metafileLocale, data: response });\n }\n }\n });\n }\n\n protected static transformResponses(options: ResponseFactoryOptions): CdnResponse {\n const { requests, responses, hasSingleFileResponse }: ResponseFactoryOptions = options;\n\n return responses.reduce((acc: CdnResponse, cur: object | string, index: number) => {\n if (typeof requests[index] !== 'undefined') {\n const { metafileFile, metafileLocale }: Partial<CacheStoreLocalesRequest> = requests[index];\n\n if (metafileFile && metafileLocale) {\n if (hasSingleFileResponse) {\n // @ts-expect-error fix output type\n acc[metafileLocale.locale] = cur;\n } else {\n // @ts-expect-error fix output type\n if (!acc[metafileFile.id]) {\n // @ts-expect-error fix output type\n acc[metafileFile.id] = {};\n }\n\n // @ts-expect-error fix output type\n acc[metafileFile.id][metafileLocale.locale] = cur;\n }\n }\n }\n\n return acc;\n }, {});\n }\n}\n","import { Api } from '@/cdn/api/api.js';\nimport { LocalesCache } from '@/cdn/cache/locales-cache.js';\nimport type { CdnClient } from '@/cdn/cdn-client.js';\nimport type { MetafileContext } from '@/cdn/context/metafile-context.js';\nimport { ResponseFactory } from '@/cdn/response/response-factory.js';\nimport type { IHttpAdapter } from '@/interfaces/i-http-adapter.js';\nimport type { ContextOptions } from '@/types/context-options.js';\n\nexport class Context {\n public metafile: MetafileContext;\n\n public cdn: CdnClient;\n\n public client: IHttpAdapter;\n\n public api: Api;\n\n public cache: LocalesCache;\n\n public responseFactory: ResponseFactory;\n\n constructor(options: ContextOptions) {\n this.metafile = options.metafileContext;\n this.cdn = options.cdn;\n this.client = options.client;\n this.api = new Api(this);\n this.cache = new LocalesCache(this);\n this.responseFactory = new ResponseFactory(this);\n }\n}\n","import type { MetafileLocale } from '@/cdn/metafile/metafile-locale.js';\nimport type { IMetafileFile } from '@/interfaces/i-metafile-file.js';\nimport type { CdnFileLocale } from '@/types/cdn-file-locale.js';\nimport type { CdnFile } from '@/types/cdn-file.js';\nimport type { MetafileFileOptions } from '@/types/metafile-file-options.js';\n\nexport class MetafileFile implements Omit<IMetafileFile, 'locales'> {\n public id: string;\n\n public file: string;\n\n public path: string;\n\n public library: string;\n\n public module: string;\n\n public buildType: string;\n\n public timestamp: number;\n\n public productFlavors: string[];\n\n public locales: MetafileLocale[];\n\n protected baseUrl: string;\n\n constructor(options: MetafileFileOptions) {\n this.id = options.id;\n this.file = options.file;\n this.path = options.path;\n this.library = options.library;\n this.module = options.module;\n this.buildType = options.buildType;\n this.timestamp = options.timestamp;\n this.productFlavors = options.productFlavors;\n this.locales = options.locales;\n this.baseUrl = options.baseUrl;\n }\n\n public toCdnFile(): CdnFile {\n return {\n id: this.id,\n file: this.file,\n path: this.path,\n library: this.library,\n module: this.module,\n buildType: this.buildType,\n productFlavors: this.productFlavors,\n locales: this.locales.map(\n (locale: MetafileLocale): CdnFileLocale => ({\n locale: locale.locale,\n isBaseLocale: locale.isBaseLocale,\n uri: `${this.baseUrl}${locale.uri}`,\n }),\n ),\n };\n }\n}\n","import type { IMetafileFileLocale } from '@/interfaces/i-metafile-file-locale.js';\nimport type { CdnLocale } from '@/types/cdn-locale.js';\n\nexport class MetafileLocale implements IMetafileFileLocale {\n public language: string;\n\n public region: string;\n\n public script: string;\n\n public isRtl: boolean;\n\n public name: string;\n\n public localizedName: string;\n\n public uri: string;\n\n public timestamp: number;\n\n protected baseLocale: string;\n\n constructor(options: IMetafileFileLocale, baseLocale: string) {\n this.language = options.language;\n this.region = options.region;\n this.script = options.script;\n this.isRtl = options.isRtl;\n this.name = options.name;\n this.localizedName = options.localizedName;\n this.uri = options.uri;\n this.timestamp = options.timestamp;\n this.baseLocale = baseLocale;\n }\n\n get locale(): string {\n if (this.language && this.region && this.script) {\n return `${this.language}_${this.region}#${this.script}`;\n }\n\n if (this.language && this.script) {\n return `${this.language}#${this.script}`;\n }\n\n if (this.language && this.region) {\n return `${this.language}_${this.region}`;\n }\n\n return this.language;\n }\n\n get isBaseLocale(): boolean {\n return this.locale === this.baseLocale;\n }\n\n public toCdnLocale(): CdnLocale {\n return {\n locale: this.locale,\n isBaseLocale: this.isBaseLocale,\n language: this.language,\n region: this.region,\n script: this.script,\n isRtl: this.isRtl,\n name: this.name,\n localizedName: this.localizedName,\n };\n }\n}\n","import { MetafileFile } from '@/cdn/metafile/metafile-file.js';\nimport { MetafileLocale } from '@/cdn/metafile/metafile-locale.js';\nimport type { MetafileParams } from '@/cdn/metafile/metafile-params.js';\nimport { uniqBy } from '@/cdn/utils.js';\nimport type { IMetafileFileLocale } from '@/interfaces/i-metafile-file-locale.js';\nimport type { IMetafileFiles } from '@/interfaces/i-metafile-files.js';\nimport type { IMetafile } from '@/interfaces/i-metafile.js';\nimport type { CdnLocale } from '@/types/cdn-locale.js';\nimport type { FilesMap } from '@/types/files-map.js';\nimport type { MetafileOptions } from '@/types/metafile-options.js';\n\nexport class MetafileData implements Omit<IMetafile, 'files' | 'baseLocale'> {\n public projectUrl: string;\n\n public baseLocale: CdnLocale;\n\n public locales: CdnLocale[];\n\n public timestamp: number;\n\n public files: MetafileFile[];\n\n public filesMap: FilesMap;\n\n constructor(options: MetafileOptions, params: MetafileParams) {\n this.projectUrl = options.projectUrl;\n this.timestamp = options.timestamp;\n this.files = MetafileData.filesFactory(options.files, options.baseLocale, params);\n this.filesMap = MetafileData.filesMapFactory(this.files);\n this.locales = MetafileData.localesFactory(this.files);\n this.baseLocale = this.locales.find((locale: CdnLocale) => locale.isBaseLocale) as CdnLocale;\n }\n\n public static createEmpty(params: MetafileParams): MetafileData {\n return new MetafileData(\n {\n projectUrl: '',\n baseLocale: '',\n timestamp: 0,\n files: {},\n },\n params,\n );\n }\n\n protected static filesFactory(\n files: IMetafileFiles,\n baseLocale: string,\n params: MetafileParams,\n ): MetafileFile[] {\n return Object.keys(files).reduce((acc: MetafileFile[], cur: string) => {\n if (typeof files[cur] !== 'undefined') {\n const locales: MetafileLocale[] = files[cur].locales.map(\n (locale: IMetafileFileLocale) => new MetafileLocale(locale, baseLocale),\n );\n\n acc.push(\n new MetafileFile({\n ...files[cur],\n id: cur,\n locales,\n baseUrl: params.baseUrl,\n }),\n );\n }\n\n return acc;\n }, []);\n }\n\n protected static filesMapFactory(files: MetafileFile[]): FilesMap {\n return files.reduce((acc: FilesMap, cur: MetafileFile) => {\n acc[cur.id] = cur;\n\n return acc;\n }, {});\n }\n\n protected static localesFactory(files: MetafileFile[]): CdnLocale[] {\n const locales: CdnLocale[] = files.reduce((acc: CdnLocale[], cur: MetafileFile) => {\n acc.push(...cur.locales.map((locale: MetafileLocale): CdnLocale => locale.toCdnLocale()));\n return acc;\n }, []);\n\n return uniqBy(locales, (cdnLocale: CdnLocale): string => cdnLocale.locale);\n }\n}\n","import type { IMetafileParams } from '@/interfaces/i-metafile-params.js';\n\nexport class MetafileParams implements IMetafileParams {\n protected options: IMetafileParams;\n\n constructor(metafileUrl: string) {\n this.options = MetafileParams.parseMetafileUrl(metafileUrl);\n }\n\n get url(): string {\n return this.options.url;\n }\n\n get baseUrl(): string {\n return this.options.baseUrl;\n }\n\n get cdnId(): string {\n return this.options.cdnId;\n }\n\n get jsonPath(): string {\n return this.options.jsonPath;\n }\n\n protected static parseMetafileUrl(metafileUrl: string): IMetafileParams {\n let url: URL;\n\n try {\n url = new URL(metafileUrl);\n } catch {\n throw new Error('Invalid param: \"options.metafile\" cannot be parsed as url.');\n }\n\n const matches: string[] | null = /^\\/(.*?)\\/(.*?)\\.(v2.json|js|ts)$/.exec(url.pathname);\n\n if (\n matches === null ||\n matches.length !== 4 ||\n typeof matches[1] === 'undefined' ||\n typeof matches[2] === 'undefined'\n ) {\n throw new Error('Invalid param: \"options.metafile\" contains invalid metafile url.');\n }\n\n const cdnId: string = matches[1];\n const tagId: string = matches[2];\n\n return {\n url: metafileUrl,\n baseUrl: url.origin,\n cdnId,\n jsonPath: `/${cdnId}/${tagId}.v2.json`,\n };\n }\n}\n","import { MetafileData } from '@/cdn/metafile/metafile-data.js';\nimport { MetafileParams } from '@/cdn/metafile/metafile-params.js';\nimport type { IMetafile } from '@/interfaces/i-metafile.js';\nimport type { CdnClientOptions } from '@/types/cdn-client-options.js';\n\nexport class MetafileContext {\n public params: MetafileParams;\n\n public parsedData: IMetafile | null;\n\n public data: MetafileData;\n\n constructor(options: CdnClientOptions) {\n this.params = new MetafileParams(options.metafile);\n this.parsedData = null;\n this.data = MetafileData.createEmpty(this.params);\n }\n\n public setMetafile(metafile: IMetafile): void {\n this.parsedData = metafile;\n\n this.data = new MetafileData(metafile, this.params);\n }\n}\n","import type { IHttpAdapter } from '@/interfaces/i-http-adapter.js';\n\nexport class FetchHttpAdapter implements IHttpAdapter {\n protected baseUrl: string;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl;\n }\n\n async get(url: string): Promise<string | object> {\n const response: Response = await fetch(`${this.baseUrl}${url}`);\n const contentType: string | null = response.headers.get('content-type');\n const isJson: boolean =\n contentType === 'application/json5' || contentType === 'application/json';\n\n if (response.status >= 400) {\n throw new Error(`Request failed with status code ${response.status.toString()}`);\n }\n\n let result: string | object;\n\n if (isJson) {\n result = (await response.json()) as object;\n } else {\n result = await response.text();\n }\n\n return result;\n }\n}\n","import type { Context } from '@/cdn/context/context.js';\n\nexport abstract class CdnBase {\n protected context: Context;\n\n constructor(context: Context) {\n this.context = context;\n }\n}\n","import { CdnBase } from '@/cdn/methods/cdn-base.js';\n\nexport class CdnCache extends CdnBase {\n public flush = (): void => {\n this.context.cache.flush();\n };\n}\n","import type { MetafileData } from '@/cdn/metafile/metafile-data.js';\nimport type { MetafileFile } from '@/cdn/metafile/metafile-file.js';\nimport { MetafileParams } from '@/cdn/metafile/metafile-params.js';\nimport { CdnBase } from '@/cdn/methods/cdn-base.js';\nimport type { IMetafile } from '@/interfaces/i-metafile.js';\nimport type { CdnClientOptions } from '@/types/cdn-client-options.js';\nimport type { CdnFile } from '@/types/cdn-file.js';\nimport type { CdnLocale } from '@/types/cdn-locale.js';\nimport type { CdnLocalesOptions } from '@/types/cdn-locales-options.js';\n\nexport class CdnMetafile extends CdnBase {\n get projectUrl(): string {\n return this.context.metafile.data.projectUrl;\n }\n\n get baseLocale(): CdnLocale {\n return this.context.metafile.data.baseLocale;\n }\n\n get url(): string {\n return this.context.metafile.params.url;\n }\n\n get files(): CdnFile[] {\n return this.context.metafile.data.files.map((file: MetafileFile): CdnFile => file.toCdnFile());\n }\n\n public locales = (options?: CdnLocalesOptions): CdnLocale[] => {\n const { excludeBaseLocale }: CdnLocalesOptions = options || {};\n const { locales }: MetafileData = this.context.metafile.data;\n\n return excludeBaseLocale\n ? locales.filter((cdnLocale: CdnLocale): boolean => !cdnLocale.isBaseLocale)\n : locales;\n };\n\n public refresh = async (): Promise<void> => {\n const response: IMetafile = await this.context.api.fetchMetafile();\n\n this.context.metafile.setMetafile(response);\n };\n\n public switch = async (options: CdnClientOptions): Promise<void> => {\n this.context.metafile.params = new MetafileParams(options.metafile);\n\n await this.refresh();\n };\n}\n","import type { Context } from '@/cdn/context/context.js';\nimport type { LocalesMapData } from '@/types/locales-map-data.js';\nimport type { LocalesMapOptions } from '@/types/locales-map-options.js';\n\nexport class LocalesMap {\n public data: LocalesMapData;\n\n protected context: Context;\n\n constructor(options: LocalesMapOptions) {\n this.context = options.context;\n this.data = options.data || {};\n }\n}\n","import type { Context } from '@/cdn/context/context.js';\nimport type { MetafileFile } from '@/cdn/metafile/metafile-file.js';\nimport type { MetafileLocale } from '@/cdn/metafile/metafile-locale.js';\nimport { LocalesMap } from '@/cdn/request/locales-map.js';\nimport type { ApiLocaleRequest } from '@/types/api-locale-request.js';\nimport type { CdnResponse } from '@/types/cdn-response.js';\n\nexport class Request {\n public files: MetafileFile[];\n\n public localesMap: LocalesMap;\n\n public hasSingleFileResponse: boolean;\n\n public hasSingleLocaleResponse: boolean;\n\n protected context: Context;\n\n constructor(context: Context) {\n this.files = [];\n this.localesMap = new LocalesMap({ context });\n this.hasSingleFileResponse = false;\n this.hasSingleLocaleResponse = false;\n this.context = context;\n }\n\n public async execute(): Promise<CdnResponse> {\n const payload: [Promise<string | object>, ApiLocaleRequest][] = this.getPromises();\n const promises: Promise<string | object>[] = payload.map(\n (item: [Promise<string | object>, ApiLocaleRequest]) => item[0],\n );\n const requests: ApiLocaleRequest[] = payload.map(\n (item: [Promise<string | object>, ApiLocaleRequest]) => item[1],\n );\n const responses: (string | object)[] = await Promise.all(promises);\n\n return this.context.responseFactory.createCdnResponse({\n requests,\n responses,\n localesMap: this.localesMap,\n hasSingleFileResponse: this.hasSingleFileResponse,\n hasSingleLocaleResponse: this.hasSingleLocaleResponse,\n });\n }\n\n protected getPromises(): [Promise<string | object>, ApiLocaleRequest][] {\n return this.files.reduce(\n (acc: [Promise<string | object>, ApiLocaleRequest][], cur: MetafileFile) => {\n if (typeof this.localesMap.data?.[cur.id] !== 'undefined') {\n acc.push(\n ...this.localesMap.data[cur.id].map(\n (metafileLocale: MetafileLocale): [Promise<string | object>, ApiLocaleRequest] => {\n const request: ApiLocaleRequest = {\n metafileFile: cur,\n metafileLocale,\n };\n\n return [this.context.api.fetchLocale(request), request];\n },\n ),\n );\n }\n return acc;\n },\n [],\n );\n }\n}\n","import type { Context } from '@/cdn/context/context.js';\nimport { MetafileFile } from '@/cdn/metafile/metafile-file.js';\nimport type { MetafileLocale } from '@/cdn/metafile/metafile-locale.js';\nimport type { LocalesMap } from '@/cdn/request/locales-map.js';\nimport { Request } from '@/cdn/request/request.js';\nimport { isArray, isPlainObject, isString, isUndefined } from '@/cdn/utils.js';\nimport type { IRequestBuilder } from '@/interfaces/i-request-builder.js';\nimport type { CdnFile } from '@/types/cdn-file.js';\n\nexport class RequestBuilder implements IRequestBuilder {\n protected context: Context;\n\n protected request: Request;\n\n constructor(context: Context) {\n this.context = context;\n this.request = new Request(this.context);\n }\n\n public addFiles(files?: (CdnFile | string)[] | CdnFile | string): this {\n if (!(isPlainObject(files) || isString(files) || isUndefined(files) || isArray(files))) {\n throw new Error('Invalid param: \"request.files\" must be object, array, string or undefined.');\n }\n\n if (isArray(files)) {\n files.forEach((i: CdnFile | string): void => {\n if (!(isPlainObject(i) || isString(i))) {\n throw new Error('Invalid param: array \"request.files\" must contain objects or strings.');\n }\n });\n }\n\n if (isString(files)) {\n this.request.hasSingleFileResponse = true;\n\n const file: MetafileFile | undefined = this.context.metafile.data.files.find(\n (i: MetafileFile): boolean => i.id === files,\n );\n\n if (!(file instanceof MetafileFile)) {\n throw new Error(`File not found: \"${files}\".`);\n }\n\n this.request.files = [file];\n } else if (isUndefined(files)) {\n this.request.files = [...this.context.metafile.data.files];\n } else if (isArray(files)) {\n this.request.files = files.map((file: CdnFile | string): MetafileFile => {\n let metafileFile: MetafileFile;\n\n if (isString(file)) {\n const foundFile: MetafileFile | undefined = this.context.metafile.data.files.find(\n (i: MetafileFile): boolean => i.id === file,\n );\n\n if (isUndefined(foundFile)) {\n throw new Error(`File not found: \"${file}\".`);\n }\n\n metafileFile = foundFile;\n } else {\n const foundFile: MetafileFile | undefined = this.context.metafile.data.files.find(\n (i: MetafileFile): boolean => i.id === file.id,\n );\n\n if (isUndefined(foundFile)) {\n throw new Error(`File not found: \"${file.id}\".`);\n }\n\n metafileFile = foundFile;\n }\n\n return metafileFile;\n });\n } else if (isPlainObject(files)) {\n this.request.hasSingleFileResponse = true;\n\n const foundFile: MetafileFile | undefined = this.context.metafile.data.files.find(\n (i: MetafileFile): boolean => i.id === files.id,\n );\n\n if (isUndefined(foundFile)) {\n throw new Error(`File not found: \"${files.id}\".`);\n }\n\n this.request.files = [foundFile];\n }\n\n return this;\n }\n\n public addLocales(locales?: string[] | string, excludeBaseLocale?: boolean): this {\n if (!(isString(locales) || isUndefined(locales) || isArray(locales))) {\n throw new Error('Invalid param: \"request.locales\" must be array, string or undefined.');\n }\n\n if (isArray(locales)) {\n locales.forEach((i: MetafileFile | string): void => {\n if (!isString(i)) {\n throw new Error('Invalid param: array \"request.locales\" must contain strings.');\n }\n });\n }\n\n if (isString(locales)) {\n this.request.hasSingleLocaleResponse = true;\n this.request.files.reduce((acc: LocalesMap, cur: MetafileFile) => {\n acc.data[cur.id] = cur.locales.filter(\n (metafileLocale: MetafileLocale): boolean => metafileLocale.locale === locales,\n );\n\n return acc;\n }, this.request.localesMap);\n } else if (isUndefined(locales)) {\n this.request.files.reduce((acc: LocalesMap, cur: MetafileFile) => {\n acc.data[cur.id] = excludeBaseLocale\n ? cur.locales.filter(\n (metafileLocale: MetafileLocale): boolean => !metafileLocale.isBaseLocale,\n )\n : cur.locales;\n\n return acc;\n }, this.request.localesMap);\n } else if (isArray(locales)) {\n this.request.files.reduce((acc: LocalesMap, cur: MetafileFile) => {\n acc.data[cur.id] = cur.locales.filter((metafileLocale: MetafileLocale) =>\n locales.includes(metafileLocale.locale),\n );\n\n return acc;\n }, this.request.localesMap);\n }\n\n return this;\n }\n\n public getCdnRequest(): Request {\n const result: Request = this.request;\n this.request = new Request(this.context);\n return result;\n }\n}\n","import { Context } from '@/cdn/context/context.js';\nimport { MetafileContext } from '@/cdn/context/metafile-context.js';\nimport { FetchHttpAdapter } from '@/cdn/http/fetch-http-adapter.js';\nimport { CdnCache } from '@/cdn/methods/cdn-cache.js';\nimport { CdnMetafile } from '@/cdn/methods/cdn-metafile.js';\nimport { RequestBuilder } from '@/cdn/request/request-builder.js';\nimport { isString } from '@/cdn/utils.js';\nimport type { CdnClientOptions } from '@/types/cdn-client-options.js';\nimport type { CdnFetchOptions } from '@/types/cdn-fetch-options.js';\nimport type { CdnResponse } from '@/types/cdn-response.js';\n\nexport class CdnClient {\n public metafile: CdnMetafile;\n\n public cache: CdnCache;\n\n protected context: Context;\n\n public static version = '__CLIENT_VERSION__';\n\n protected constructor(options: CdnClientOptions) {\n const metafileContext: MetafileContext = new MetafileContext(options);\n const client: FetchHttpAdapter = new FetchHttpAdapter(metafileContext.params.baseUrl);\n\n this.context = new Context({ metafileContext, cdn: this, client });\n this.metafile = new CdnMetafile(this.context);\n this.cache = new CdnCache(this.context);\n }\n\n public fetch = async (options?: CdnFetchOptions): Promise<CdnResponse> => {\n const { files, locales, excludeBaseLocale }: CdnFetchOptions = options || {};\n const requestBuilder: RequestBuilder = new RequestBuilder(this.context)\n .addFiles(files)\n .addLocales(locales, excludeBaseLocale);\n\n return requestBuilder.getCdnRequest().execute();\n };\n\n public static async create(options: CdnClientOptions): Promise<CdnClient> {\n if (!options) {\n throw new Error('Invalid param: missing required \"options\" parameter.');\n }\n\n if (!isString(options.metafile)) {\n throw new Error('Invalid param: \"options.metafile\" must be string.');\n }\n\n const cdn: CdnClient = new CdnClient(options);\n\n await cdn.metafile.refresh();\n\n return cdn;\n }\n}\n"],"mappings":"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"}