UNPKG

@localazy/cdn-client

Version:

Node.js module that allows you to easily interact with the Localazy CDN.

1 lines 41.4 kB
{"version":3,"file":"localazy-cdn-client.cjs","sources":["../../src/cdn/api/api.ts","../../src/cdn/utils.ts","../../src/cdn/cache/memory-cache-adapter.ts","../../src/cdn/cache/locales-cache.ts","../../src/cdn/methods/cdn-base.ts","../../src/cdn/methods/cdn-cache.ts","../../src/cdn/metafile/metafile-locale.ts","../../src/cdn/metafile/metafile-file.ts","../../src/cdn/metafile/metafile-data.ts","../../src/cdn/metafile/metafile-params.ts","../../src/cdn/context/metafile-context.ts","../../src/cdn/response/response-factory.ts","../../src/cdn/context/context.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/http/fetch-http-adapter.ts","../../src/cdn/cdn-client.ts"],"sourcesContent":["import { IMetafile } from '@/interfaces/i-metafile';\nimport { ApiLocaleRequest } from '@/types/api-locale-request';\nimport { Context } from '@/cdn/context/context';\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","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 { ICacheAdapter } from '@/interfaces/i-cache-adapter';\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","import { uniq } from '@/cdn/utils';\nimport { ICacheAdapter } from '@/interfaces/i-cache-adapter';\nimport { CacheKeyMetafileOptions } from '@/types/cache-key-metafile-options';\nimport { CacheGetLocalesRequest } from '@/types/cache-get-locales-request';\nimport { CacheHasLocalesRequest } from '@/types/cache-has-locales-request';\nimport { CacheStoreLocalesRequest } from '@/types/cache-store-locales-request';\nimport { MemoryCacheAdapter } from '@/cdn/cache/memory-cache-adapter';\nimport { Context } from '@/cdn/context/context';\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 { Context } from '@/cdn/context/context';\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';\n\nexport class CdnCache extends CdnBase {\n public flush = (): void => {\n this.context.cache.flush();\n };\n}\n","import { CdnLocale } from '@/types/cdn-locale';\nimport { IMetafileFileLocale } from '@/interfaces/i-metafile-file-locale';\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 { CdnFile } from '@/types/cdn-file';\nimport { CdnFileLocale } from '@/types/cdn-file-locale';\nimport { MetafileLocale } from '@/cdn/metafile/metafile-locale';\nimport { IMetafileFile } from '@/interfaces/i-metafile-file';\nimport { MetafileFileOptions } from '@/types/metafile-file-options';\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 { uniqBy } from '@/cdn/utils';\nimport { MetafileParams } from '@/cdn/metafile/metafile-params';\nimport { CdnLocale } from '@/types/cdn-locale';\nimport { MetafileLocale } from '@/cdn/metafile/metafile-locale';\nimport { IMetafile } from '@/interfaces/i-metafile';\nimport { IMetafileFileLocale } from '@/interfaces/i-metafile-file-locale';\nimport { IMetafileFiles } from '@/interfaces/i-metafile-files';\nimport { MetafileFile } from '@/cdn/metafile/metafile-file';\nimport { MetafileOptions } from '@/types/metafile-options';\nimport { FilesMap } from '@/types/files-map';\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(files: IMetafileFiles, baseLocale: string, params: MetafileParams): MetafileFile[] {\n return Object.keys(files).reduce((acc: MetafileFile[], cur: string) => {\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 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 { IMetafileParams } from '@/interfaces/i-metafile-params';\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 (e) {\n throw new Error('Invalid param: \"options.metafile\" cannot be parsed as url.');\n }\n\n const matches: string[] | null = url.pathname.match(/^\\/(.*?)\\/(.*?)\\.(v2.json|js|ts)$/);\n\n if (matches === null || matches.length !== 4) {\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';\nimport { IMetafile } from '@/interfaces/i-metafile';\nimport { MetafileParams } from '@/cdn/metafile/metafile-params';\nimport { CdnClientOptions } from '@/types/cdn-client-options';\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 { ApiLocaleRequest } from '@/types/api-locale-request';\nimport { Context } from '@/cdn/context/context';\nimport { ResponseFactoryOptions } from '@/types/response-factory-options';\nimport { CacheStoreLocalesRequest } from '@/types/cache-store-locales-request';\nimport { CdnResponse } from '@/types/cdn-response';\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 { requests, responses, hasSingleFileResponse, hasSingleLocaleResponse }: ResponseFactoryOptions = options;\n\n if (responses.length === 0) {\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 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 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 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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n acc[metafileFile.id][metafileLocale.locale] = cur;\n }\n }\n\n return acc;\n }, {});\n }\n}\n","import { Api } from '@/cdn/api/api';\nimport { LocalesCache } from '@/cdn/cache/locales-cache';\nimport { CdnClient } from '@/cdn/cdn-client';\nimport { ResponseFactory } from '@/cdn/response/response-factory';\nimport { ContextOptions } from '@/types/context-options';\nimport { MetafileContext } from '@/cdn/context/metafile-context';\nimport { IHttpAdapter } from '@/interfaces/i-http-adapter';\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 { MetafileFile } from '@/cdn/metafile/metafile-file';\nimport { MetafileParams } from '@/cdn/metafile/metafile-params';\nimport { CdnClientOptions } from '@/types/cdn-client-options';\nimport { MetafileData } from '@/cdn/metafile/metafile-data';\nimport { CdnBase } from '@/cdn/methods/cdn-base';\nimport { CdnFile } from '@/types/cdn-file';\nimport { CdnLocalesOptions } from '@/types/cdn-locales-options';\nimport { IMetafile } from '@/interfaces/i-metafile';\nimport { CdnLocale } from '@/types/cdn-locale';\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 ? locales.filter((cdnLocale: CdnLocale): boolean => !cdnLocale.isBaseLocale) : 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 { Context } from '@/cdn/context/context';\nimport { LocalesMapData } from '@/types/locales-map-data';\nimport { LocalesMapOptions } from '@/types/locales-map-options';\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 { Context } from '@/cdn/context/context';\nimport { MetafileFile } from '@/cdn/metafile/metafile-file';\nimport { MetafileLocale } from '@/cdn/metafile/metafile-locale';\nimport { LocalesMap } from '@/cdn/request/locales-map';\nimport { ApiLocaleRequest } from '@/types/api-locale-request';\nimport { CdnResponse } from '@/types/cdn-response';\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((item: [Promise<string | object>, ApiLocaleRequest]) => item[1]);\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((acc: [Promise<string | object>, ApiLocaleRequest][], cur: MetafileFile) => {\n if (this.localesMap.data[cur.id]) {\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","import { isPlainObject, isArray, isString, isUndefined } from '@/cdn/utils';\nimport { CdnFile } from '@/types/cdn-file';\nimport { MetafileLocale } from '@/cdn/metafile/metafile-locale';\nimport { LocalesMap } from '@/cdn/request/locales-map';\nimport { Context } from '@/cdn/context/context';\nimport { MetafileFile } from '@/cdn/metafile/metafile-file';\nimport { IRequestBuilder } from '@/interfaces/i-request-builder';\nimport { Request } from '@/cdn/request/request';\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): RequestBuilder {\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): RequestBuilder {\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((metafileLocale: MetafileLocale): boolean => !metafileLocale.isBaseLocale)\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 { IHttpAdapter } from '@/interfaces/i-http-adapter';\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 = contentType === 'application/json5' || contentType === 'application/json';\n\n if (response.status >= 400) {\n throw new Error(`Request failed with status code ${response.status}`);\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 { isString } from '@/cdn/utils';\nimport { CdnFetchOptions } from '@/types/cdn-fetch-options';\nimport { CdnResponse } from '@/types/cdn-response';\nimport { CdnCache } from '@/cdn/methods/cdn-cache';\nimport { MetafileContext } from '@/cdn/context/metafile-context';\nimport { Context } from '@/cdn/context/context';\nimport { CdnMetafile } from '@/cdn/methods/cdn-metafile';\nimport { RequestBuilder } from '@/cdn/request/request-builder';\nimport { FetchHttpAdapter } from '@/cdn/http/fetch-http-adapter';\nimport { CdnClientOptions } from '@/types/cdn-client-options';\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"],"names":[],"mappings":"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"}