@websolutespa/bom-mixer-store 3.0.3 → 4.0.0-next.1
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/CHANGELOG.md +13 -0
- package/dist/exports/server.js +1 -1
- package/dist/exports/server.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{src-D-0XSCD9.js → src-DH2PQJMn.js} +3 -3
- package/dist/{src-D-0XSCD9.js.map → src-DH2PQJMn.js.map} +1 -1
- package/package.json +5 -5
- package/src/cached/cached.service.ts +0 -1
- package/src/mock/mock.api.ts +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @websolutespa/bom-mixer-store
|
|
2
2
|
|
|
3
|
+
## 4.0.0-next.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- feat: renamed API handlers for image, mock, preview, revalidate, vars, and session endpoints
|
|
8
|
+
|
|
9
|
+
## 4.0.0-next.0
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- Updated dependencies
|
|
14
|
+
- @websolutespa/bom-core@4.0.0-next.0
|
|
15
|
+
|
|
3
16
|
## 3.0.3
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
package/dist/exports/server.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { COLLECTIONS, DEFAULT_DEPTH, KNOWN_COLLECTIONS, MOCK_COLLECTIONS, NextPhase, StoreStrategy, buildStrategy, decorateCategories_, decorateCategory_, decorateHref_, decorateHrefs_, decorateLocalizable_, decorateLocalizables_, decorateMenu_, decorateMenus_, decorateNav_, decorateRelation_, decorateRelations_, decorateSchema_, decorateSchemas_, fromCache, getRemoteApiRequestOptions, nextPhase, remoteApiDelete, remoteApiGet, remoteApiPatch, remoteApiPost, staticCollections, storeCacheDuration, storeStrategy } from "../src-
|
|
1
|
+
import { COLLECTIONS, DEFAULT_DEPTH, KNOWN_COLLECTIONS, MOCK_COLLECTIONS, NextPhase, StoreStrategy, buildStrategy, decorateCategories_, decorateCategory_, decorateHref_, decorateHrefs_, decorateLocalizable_, decorateLocalizables_, decorateMenu_, decorateMenus_, decorateNav_, decorateRelation_, decorateRelations_, decorateSchema_, decorateSchemas_, fromCache, getRemoteApiRequestOptions, nextPhase, remoteApiDelete, remoteApiGet, remoteApiPatch, remoteApiPost, staticCollections, storeCacheDuration, storeStrategy } from "../src-DH2PQJMn.js";
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import { JsonService, asCategoryId, asEquatable, defaultLocale, defaultMarket, findRouteOfCategory, getHost, getOrigin, getRootCategory, httpGet, isDevelopment, isProduction, localize, qsDeserialize, qsSerialize } from "@websolutespa/bom-core";
|
|
4
4
|
import { getIronSession } from "iron-session";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","names":["handler: IApiHandler","request: NextApiRequest","response: NextApiResponse<T>","method: ICrudMethod","error: any","response: NextApiResponse","items: T[]","store: IStore","item: B","params: QueryParams","items: B[]","item: B","params: QueryParams","items: B[]","item: B","params: QueryParams","items: B[]","request: NextRequest | NextApiRequest | IncomingMessage & {\r\n cookies: Partial<{ [key: string]: string }>;\r\n }","response: NextResponse | NextApiResponse | ServerResponse<IncomingMessage>","sessionOptions: SessionOptions","pathname: string","option?: fsReadOptions","config: StaticServiceConfig<T>","store: IStore","items: B[]","map?: MapTo","item: Partial<B>","item: B","params: QueryParams","fields: IField[]","item: T","items: T[]","decoratedItems: T[]","PAGES: string[]","data?: IMemoryStore","store: IStore","PAGES","service: IQuerable<T>","options: InMemoryCacheOptions","callback: () => Promise<ICacheResult<T>>","key?: string","item: ICache<T>","key: string","data: ICacheResult<T>","params: GlobalQueryParams","id: IEquatable","params: QueryParams","payload: Omit<B, 'id'>","payload: Partial<B>","params: Omit<QueryParams, 'where'>","key: string","store: IStore","params: GlobalQueryParams","token?: string","id: IEquatable","params: Omit<QueryParams, 'where'>","params: QueryParams","items: B[]","payload: Omit<B, 'id'>","payload: Partial<B>","item: B","item: B","params: QueryParams","items: B[]","item: B","params: QueryParams","items: B[]","PAGES: string[]","mockStore: IStore","store: IStore","storePromise: () => Promise<T>","request: NextApiRequest","response: NextApiResponse","collection: string","id: string","error: any","payload: Omit<IEntity, 'id'>","payload: Partial<IEntity>","store: IStore","path: string","url: URL","urlBeforeRedirect: URL | null","path?: string","path: string | undefined","pathname: string","href: string","hrefBeforeRedirect: string | null","p: (IRoute & { splat: string }) | undefined","c: IRoute","redirect: IRedirect","status: number","request: NextApiRequest","response: NextApiResponse","params: QueryParams","params: QueryParams","params: QueryParams","params: QueryParams","params: QueryParams","category: ICategory","route: IRoute | undefined","locale: string","market: string","locale: string","routes: IRoute[]","categories: ICategory[]","rootCategory: ICategory","category: ICategory","items: IRouteLink[]","market: string","locale: string","markets: IMarket[]","locales: ILocale[]","labels: ILabel[]","routeLink: IRouteLink","menu: Record<string, ILocalizedMenu>","env: Record<string, unknown>","object?: Record<string, unknown>","request: NextApiRequest","response: NextApiResponse","defaultLocale"],"sources":["../../src/api/api.handler.ts","../../src/mock/mock.service.ts","../../src/mock/mock-menu.service.ts","../../src/mock/mock-page.service.ts","../../src/session/session.service.ts","../../src/fs/fs.service.ts","../../src/static/static.service.ts","../../src/mock/mock.store.ts","../../src/cached/cached.service.ts","../../src/remote/remote.service.ts","../../src/remote/remote-menu.service.ts","../../src/remote/remote-page.service.ts","../../src/remote/remote.store.ts","../../src/store/store.service.ts","../../src/store/store.handler.ts","../../src/mock/mock.handler.ts","../../src/preview/preview.handler.ts","../../../models/src/app/app.service.ts","../../../models/src/label/label.service.ts","../../../models/src/locale/locale.service.ts","../../../models/src/market/market.service.ts","../../../models/src/menu/menu.service.ts","../../../models/src/route/route.ts","../../../models/src/route/route.service.ts","../../../models/src/layout/layout.service.ts","../../src/vars/vars.handler.ts"],"sourcesContent":["// Next.js API route support: https://nextjs.org/docs/api-routes/introduction\r\nimport type { NextApiRequest, NextApiResponse } from 'next';\r\n\r\nexport type ICrudMethod = 'get' | 'post' | 'put' | 'patch' | 'delete' | string;\r\n\r\nexport type IHandler<T = any> = (request: NextApiRequest, response: NextApiResponse<T>) => Promise<void | Response>;\r\n\r\nexport type IApiHandler = Record<ICrudMethod, IHandler>;\r\n\r\nexport function apiHandler<T = any>(handler: IApiHandler): IHandler<T> {\r\n return async (request: NextApiRequest, response: NextApiResponse<T>): Promise<void | Response> => {\r\n const method: ICrudMethod = (request.method || 'GET').toLowerCase() as ICrudMethod;\r\n // check handler supports HTTP method\r\n if (!handler[method]) {\r\n response.status(405).end(`Method ${method} Not Allowed`);\r\n return;\r\n }\r\n try {\r\n // global middleware\r\n // await jwtMiddleware(request, response);\r\n // route handler\r\n await handler[method](request, response);\r\n } catch (error) {\r\n // console.log('error', error);\r\n // global error handler\r\n return errorHandler(error, response);\r\n }\r\n };\r\n}\r\n\r\nexport function errorHandler(error: any, response: NextApiResponse): void | Response {\r\n if (typeof (error) === 'string') {\r\n // custom application error\r\n const is404 = error.toLowerCase().endsWith('not found');\r\n const statusCode = is404 ? 404 : 400;\r\n response.status(statusCode).json({ message: error });\r\n return;\r\n }\r\n if (error.name === 'UnauthorizedError') {\r\n // jwt authentication error\r\n response.status(401).json({ message: 'Invalid Token' });\r\n return;\r\n }\r\n // default to 500 server error\r\n console.error(error);\r\n response.status(500).json({ message: error.message });\r\n return;\r\n}\r\n","import { IEntity, IStore, JsonService, QueryParams } from '@websolutespa/bom-core';\r\nimport { DEFAULT_DEPTH, decorateLocalizable_, decorateLocalizables_, decorateRelation_, decorateRelations_ } from '../decorators';\r\n\r\nexport class MockService<T extends IEntity = IEntity> extends JsonService<T> {\r\n store: IStore;\r\n\r\n constructor(items: T[], store: IStore) {\r\n super(items);\r\n this.store = store;\r\n }\r\n\r\n protected override async decorateOne_<B extends T = T>(item: B, params: QueryParams = {}): Promise<B> {\r\n const store = this.store;\r\n let decoratedItem = item;\r\n decoratedItem = await decorateLocalizable_<B>(item, params);\r\n decoratedItem = await decorateRelation_<B>(store, decoratedItem, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth != null ? params.depth : DEFAULT_DEPTH,\r\n });\r\n return decoratedItem;\r\n }\r\n\r\n protected override async decorateMany_<B extends T = T>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n const store = this.store;\r\n let decoratedItems = items;\r\n decoratedItems = await decorateLocalizables_<B>(items, params);\r\n decoratedItems = await decorateRelations_<B>(store, decoratedItems, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth != null ? params.depth : DEFAULT_DEPTH,\r\n });\r\n return decoratedItems;\r\n }\r\n\r\n}\r\n","import { IEntity, IUndecoratedMenu, QueryParams } from '@websolutespa/bom-core';\r\nimport { decorateLocalizable_, decorateLocalizables_, decorateMenu_, decorateMenus_ } from '../decorators';\r\nimport { MockService } from './mock.service';\r\n\r\nexport class MockMenuService<T extends IEntity = IEntity> extends MockService<T> {\r\n\r\n protected override async decorateOne_<B extends T = T>(item: B, params: QueryParams = {}): Promise<B> {\r\n const store = this.store;\r\n let decoratedItem = item;\r\n decoratedItem = await decorateLocalizable_<B>(item, params);\r\n if (params.market && params.locale) {\r\n decoratedItem = await decorateMenu_(store, decoratedItem as any as IUndecoratedMenu, {\r\n market: params.market,\r\n locale: params.locale,\r\n }) as any;\r\n }\r\n return decoratedItem;\r\n }\r\n\r\n protected override async decorateMany_<B extends T = T>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n const store = this.store;\r\n let decoratedItems = items;\r\n decoratedItems = await decorateLocalizables_<B>(items, params);\r\n if (params.market && params.locale) {\r\n decoratedItems = await decorateMenus_(store, decoratedItems as any as IUndecoratedMenu[], {\r\n market: params.market,\r\n locale: params.locale,\r\n }) as any[];\r\n }\r\n return decoratedItems;\r\n }\r\n\r\n}\r\n","import { ICategorized, QueryParams } from '@websolutespa/bom-core';\r\nimport { decorateCategories_, decorateCategory_, decorateHref_, decorateHrefs_, decorateLocalizable_, decorateLocalizables_, decorateNav_, decorateRelation_, decorateRelations_ } from '../decorators';\r\nimport { MockService } from './mock.service';\r\n\r\nexport class MockPageService<T extends ICategorized = ICategorized> extends MockService<T> {\r\n\r\n protected override async decorateOne_<B extends T = T>(item: B, params: QueryParams = {}): Promise<B> {\r\n const store = this.store;\r\n let decoratedItem = item;\r\n decoratedItem = await decorateCategory_<B>(store, decoratedItem, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n decoratedItem = await decorateLocalizable_<B>(decoratedItem, params);\r\n decoratedItem = await decorateHref_<B>(store, decoratedItem, params);\r\n decoratedItem = await decorateNav_<B>(store, decoratedItem, params);\r\n decoratedItem = await decorateRelation_<B>(store, decoratedItem, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n return decoratedItem;\r\n }\r\n\r\n protected override async decorateMany_<B extends T = T>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n const store = this.store;\r\n let decoratedItems = items;\r\n // decoratedItems = await optimizeMany_(decoratedItems);\r\n decoratedItems = await decorateCategories_<B>(store, decoratedItems, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n decoratedItems = await decorateLocalizables_<B>(decoratedItems, params);\r\n decoratedItems = await decorateHrefs_<B>(store, decoratedItems, params);\r\n decoratedItems = await decorateRelations_<B>(store, decoratedItems, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n // !!! optimization for index listing removing components\r\n const invalidKeys = ['components'];\r\n decoratedItems = decoratedItems.map(x => Object.fromEntries(\r\n Object.entries(x).filter(\r\n ([k, v]) => !invalidKeys.includes(k)\r\n )\r\n )) as B[];\r\n /*\r\n decoratedItems = await decorateNavs_<B>(store, decoratedItems, params);\r\n */\r\n return decoratedItems;\r\n }\r\n\r\n}\r\n","import { isDevelopment } from '@websolutespa/bom-core';\r\nimport { IncomingMessage, ServerResponse } from 'http';\r\nimport { getIronSession, IronSession, SessionOptions } from 'iron-session';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { NextRequest, NextResponse } from 'next/server';\r\n\r\nexport async function getSession<T extends object = Record<string, any>>(\r\n request: NextRequest | NextApiRequest | IncomingMessage & {\r\n cookies: Partial<{ [key: string]: string }>;\r\n },\r\n response: NextResponse | NextApiResponse | ServerResponse<IncomingMessage>\r\n): Promise<IronSession<T>> {\r\n const COOKIE_NAME = 'websolutespa-next-js';\r\n const COOKIE_PASSWORD = process.env.MIXER_SECRET as string || 'MIXER_SECRET_32_CHARS_LONG_12345';\r\n const sessionOptions: SessionOptions = {\r\n cookieName: COOKIE_NAME,\r\n // secure: true should be used in production (HTTPS) but can't be used in development (HTTP)\r\n cookieOptions: {\r\n secure: !isDevelopment,\r\n },\r\n password: COOKIE_PASSWORD,\r\n };\r\n const session = await getIronSession<T>(request, response, sessionOptions);\r\n return session;\r\n}\r\n\r\nexport type SessionWithToken<T extends object = Record<string, any>> = T & Partial<{\r\n token: string;\r\n exp: number;\r\n}>;\r\n\r\nexport async function getSessionToken<T extends SessionWithToken>(\r\n request: NextRequest | NextApiRequest | IncomingMessage & {\r\n cookies: Partial<{ [key: string]: string }>;\r\n },\r\n response: NextResponse | NextApiResponse | ServerResponse<IncomingMessage>\r\n): Promise<string | undefined> {\r\n const session = await getSession<T>(request, response);\r\n if (session.token && session.exp && session.exp > Math.floor(new Date().getTime() / 1000)) {\r\n return session.token;\r\n } else {\r\n session.token = undefined;\r\n session.exp = undefined;\r\n await session.save();\r\n session.destroy();\r\n return;\r\n }\r\n}\r\n","import { Json } from '@websolutespa/bom-core';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nexport type fsReadOptions = {\r\n encoding?: null | undefined;\r\n flag?: number | string | undefined;\r\n signal?: AbortSignal | undefined;\r\n};\r\n\r\nexport type fsWatchOptions = (fs.WatchOptions & { encoding: 'buffer' }) | 'buffer';\r\nexport type fsWatchFileOptions = (fs.WatchFileOptions & { bigint?: false });\r\nexport type fsWriteFileOptions = (fs.ObjectEncodingOptions & { mode?: fs.Mode; flag?: fs.OpenMode }) | BufferEncoding | null;\r\n\r\nexport async function fsExists(pathname: string): Promise<boolean> {\r\n try {\r\n await fs.promises.access(pathname);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport async function fsRead(pathname: string, option?: fsReadOptions): Promise<string | undefined> {\r\n try {\r\n const data = await fs.promises.readFile(pathname, option?.encoding || 'utf8');\r\n return data || undefined;\r\n } catch (error) {\r\n console.log('fsRead.error', error, pathname);\r\n return;\r\n }\r\n}\r\n\r\nexport async function fsReadJson<T = Json>(pathname: string): Promise<T | undefined> {\r\n try {\r\n const data = await fsRead(pathname);\r\n // console.log('fsReadJson', 'pathname', pathname, 'data', data);\r\n if (data) {\r\n return JSON.parse(data) as T;\r\n } else {\r\n return;\r\n }\r\n } catch (error) {\r\n console.log('fsReadJson.error', error, pathname);\r\n // throw (error);\r\n return;\r\n }\r\n}\r\n\r\nexport async function fsWrite(pathname: string, data: string, encoding: fsWriteFileOptions = 'utf8'): Promise<void> {\r\n try {\r\n await fs.promises.mkdir(path.dirname(pathname), { recursive: true });\r\n await fs.promises.writeFile(pathname, data, encoding);\r\n } catch (error) {\r\n console.log('fsWrite', error, pathname);\r\n }\r\n}\r\n\r\nexport async function fsWriteJson(pathname: string, data: Json): Promise<void> {\r\n try {\r\n await fsWrite(pathname, JSON.stringify(data, null, 2));\r\n } catch (error) {\r\n console.log('fsWriteJson', error, pathname);\r\n }\r\n}\r\n\r\nexport async function fsExistOrCreateFolder(pathname: string): Promise<void> {\r\n try {\r\n const exists = fs.existsSync(pathname);\r\n if (!exists) {\r\n await fs.promises.mkdir(pathname);\r\n }\r\n } catch (error) {\r\n console.log('fsExistOrCreateFolder', error, pathname);\r\n }\r\n}\r\n\r\nexport async function fsReadDirectory(pathname: string, extension?: string): Promise<{ name: string, data: string }[]> {\r\n const files = await fs.promises.readdir(pathname);\r\n const items = files.flatMap(async (file: string) => {\r\n const filePath = path.join(pathname, file);\r\n const stat = await fs.promises.stat(filePath);\r\n if (stat.isDirectory()) {\r\n return;\r\n }\r\n if (extension && path.parse(file).ext !== extension) {\r\n return;\r\n }\r\n const data = await fs.promises.readFile(filePath);\r\n if (!data) {\r\n return;\r\n }\r\n return {\r\n name: path.parse(file).name,\r\n data: data.toString(),\r\n };\r\n }) as Promise<{ name: string, data: string }>[];\r\n const items2 = (await Promise.all(items)).filter(Boolean);\r\n return items2;\r\n}\r\n\r\nexport async function fsReadJsonDirectory(pathname: string): Promise<{ name: string, data: any }[]> {\r\n try {\r\n const datas = await fsReadDirectory(pathname, '.json');\r\n return datas.filter(Boolean).map(x => {\r\n x.data = JSON.parse(x.data);\r\n return x;\r\n });\r\n } catch (error) {\r\n console.log('fsReadJsonDirectory', error, pathname);\r\n // throw (error);\r\n return [];\r\n }\r\n}\r\n\r\nexport function fsWatch(pathname: string, callback: (eventType: fs.WatchEventType, fileName: string) => void, options: fsWatchOptions) {\r\n const debounced = debounce(callback);\r\n return fs.watch(pathname, options, debounced);\r\n}\r\n\r\nexport function fsWatchFile(pathname: string, callback: (eventType: fs.WatchEventType, fileName: string) => void, options?: fsWatchFileOptions) {\r\n const debounced = debounce(callback);\r\n return fs.watchFile(pathname, options, debounced);\r\n}\r\n\r\nexport function pathJoin(...paths: string[]): string {\r\n return path.join(process.cwd(), ...paths);\r\n}\r\n\r\nexport function debounce(callback: (...args: any[]) => void, timeout: number = 300) {\r\n let timer: NodeJS.Timeout;\r\n return (...args: any[]) => {\r\n clearTimeout(timer);\r\n timer = setTimeout(() => {\r\n callback(...args);\r\n }, timeout);\r\n };\r\n}\r\n","import { IEntity, IEquatable, IStore, JsonService, QueryParams, httpGet } from '@websolutespa/bom-core';\r\nimport { DEFAULT_DEPTH, decorateLocalizable_, decorateLocalizables_ } from '../decorators';\r\nimport { IField, MapTo, StaticServiceConfig } from './static';\r\n\r\nexport class StaticService<T extends IEntity = IEntity> extends JsonService<T> {\r\n loaded: boolean = false;\r\n config: StaticServiceConfig<T>;\r\n store: IStore;\r\n\r\n constructor(config: StaticServiceConfig<T>, store: IStore) {\r\n super([]);\r\n this.config = config;\r\n this.store = store;\r\n }\r\n\r\n protected mapItems_<B extends T = T>(items: B[], map?: MapTo): B[] {\r\n if (typeof map === 'object') {\r\n items = items.map(x => {\r\n const item: Partial<B> = {};\r\n Object.entries(x).forEach(([k, v]) => {\r\n const key = map[k] || k;\r\n (item as any)[key] = v;\r\n });\r\n return item as B;\r\n });\r\n }\r\n return items;\r\n }\r\n\r\n async getItems<B extends T = T>(): Promise<B[]> {\r\n let items = this.items;\r\n if (this.loaded && items) {\r\n return items as B[];\r\n } else {\r\n const config = this.config;\r\n const src = config.src;\r\n if (typeof src === 'string') {\r\n const response = await httpGet(src, {});\r\n items = response.items;\r\n } else if (typeof src === 'function') {\r\n if (src instanceof Promise) {\r\n items = await src(config);\r\n } else {\r\n items = src(config) as T[];\r\n }\r\n } else {\r\n items = src;\r\n }\r\n items = this.mapItems_(items, config.map);\r\n this.items = items;\r\n this.loaded = true;\r\n return items as B[];\r\n }\r\n }\r\n\r\n protected override async decorateOne_<B extends T = T>(item: B, params: QueryParams = {}): Promise<B> {\r\n const store = this.store;\r\n let decoratedItem = item;\r\n decoratedItem = await decorateLocalizable_<B>(item, params);\r\n decoratedItem = await decorateStaticRelation_<B>(store, this.config.fields, decoratedItem, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n return decoratedItem;\r\n }\r\n\r\n protected override async decorateMany_<B extends T = T>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n const store = this.store;\r\n let decoratedItems = items;\r\n decoratedItems = await decorateLocalizables_<B>(items, params);\r\n decoratedItems = await decorateStaticRelations_<B>(store, this.config.fields, decoratedItems, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n return decoratedItems;\r\n }\r\n\r\n}\r\n\r\nexport async function decorateStaticRelation_<T>(store: IStore, fields: IField[], item: T, params: QueryParams = {}): Promise<T> {\r\n const depth = params.depth != null ? params.depth : DEFAULT_DEPTH;\r\n if (depth === 0) {\r\n return item;\r\n }\r\n const decoratedItem = { ...item };\r\n for (const field of fields) {\r\n if (\r\n field.type === 'relationship' &&\r\n typeof field.relationTo === 'string'\r\n ) {\r\n const name = field.name as keyof typeof item;\r\n const value = item[name];\r\n const ids = field.hasMany ? value as IEquatable[] : [value];\r\n const items = await store[field.relationTo]!.findMany({\r\n where: {\r\n id: { in: ids },\r\n },\r\n depth: depth - 1,\r\n locale: params.locale,\r\n });\r\n if (field.hasMany) {\r\n decoratedItem[name] = items as any; // !!!\r\n } else {\r\n decoratedItem[name] = (items.length ? items[0] : undefined) as any; // !!!\r\n }\r\n }\r\n }\r\n return decoratedItem;\r\n}\r\n\r\nexport async function decorateStaticRelations_<T>(store: IStore, fields: IField[], items: T[], params: QueryParams = {}): Promise<T[]> {\r\n const decoratedItems: T[] = [];\r\n for (const item of items) {\r\n const decoratedItem = await decorateStaticRelation_<T>(store, fields, item, params) as T;\r\n decoratedItems.push(decoratedItem);\r\n }\r\n return decoratedItems;\r\n}\r\n","import { ICategorized, IEntity, IMemoryStore, IQuerable, isDevelopment, IStore } from '@websolutespa/bom-core';\r\nimport { fromCache } from '../cache/cache.service';\r\nimport { fsReadJson } from '../fs/fs.service';\r\nimport { staticCollections } from '../static/static';\r\nimport { StaticService } from '../static/static.service';\r\nimport { MockMenuService } from './mock-menu.service';\r\nimport { MockPageService } from './mock-page.service';\r\nimport { MockService } from './mock.service';\r\n\r\nconst PAGES: string[] = process.env.PAGES ? process.env.PAGES.split(',') : [];\r\n\r\nexport function getMockStoreFromData_<T extends IStore>(data?: IMemoryStore): T {\r\n const store: IStore = {};\r\n if (data) {\r\n for (const key in data) {\r\n if (!PAGES.includes(key)) {\r\n // new collection\r\n const service = new MockService(data[key]!, store);\r\n store[key] = service;\r\n }\r\n }\r\n const category = store.category;\r\n if (!category) {\r\n console.warn('mock category not found');\r\n }\r\n const route = store.route;\r\n if (!route) {\r\n console.warn('mock route not found');\r\n }\r\n if (category && route) {\r\n const menu = data.menu;\r\n if (menu) {\r\n store.menu = new MockMenuService(menu, store);\r\n }\r\n for (const key in data) {\r\n if (PAGES.includes(key)) {\r\n const service = new MockPageService(data[key] as ICategorized[], store) as IQuerable<IEntity>;\r\n store[key] = service;\r\n }\r\n }\r\n }\r\n } else {\r\n console.warn('mock store not found');\r\n }\r\n staticCollections.forEach(config => {\r\n store[config.slug] = new StaticService(config, store);\r\n });\r\n return store as T;\r\n}\r\n\r\nasync function getStoreData_(): Promise<IMemoryStore> {\r\n if (isDevelopment) {\r\n\r\n const path = require('path');\r\n const directory = 'cwd' in process && typeof process.cwd === 'function' ? process.cwd() : process.env.CWD;\r\n // console.log('directory', directory);\r\n const pathname = path.join(directory, '.mixer', 'store.json');\r\n return (await fsReadJson<IMemoryStore>(pathname) || {});\r\n } else {\r\n const store = process.env.STORE_ || {};\r\n return (typeof store === 'string' ? JSON.parse(store) : store) as IMemoryStore;\r\n }\r\n}\r\n\r\nasync function getMockStore_<T extends IStore = IStore>(): Promise<T> {\r\n const data = await getStoreData_();\r\n const store: IStore = getMockStoreFromData_(data);\r\n return store as T;\r\n}\r\n\r\nexport async function getMockStore<T extends IStore = IStore>(): Promise<T> {\r\n return fromCache<T>(async () => {\r\n if (!isDevelopment) {\r\n console.warn('getMockStore');\r\n }\r\n const store = await getMockStore_<T>();\r\n return store;\r\n }, isDevelopment ? undefined : 'STORE_MOCK_');\r\n}\r\n","import { GlobalQueryParams, IEntity, IEquatable, IPagedResult, IQuerable, JsonService, QueryParams, qsSerialize } from '@websolutespa/bom-core';\r\nimport { StoreStrategy, storeCacheDuration, storeStrategy } from '../store/store';\r\n\r\nexport type ICacheResult<T extends IEntity = IEntity> = T | T[] | IPagedResult<T> | undefined;\r\n\r\nexport type ICache<T extends IEntity = IEntity> = {\r\n timestamp: number;\r\n data: ICacheResult<T>;\r\n};\r\n\r\nexport type InMemoryCacheOptions = {\r\n duration?: number | false;\r\n};\r\n\r\n// export class CachedService<T extends IEntity = IEntity> implements IQuerable<T> {\r\nexport class CachedService<T extends IEntity = IEntity> extends JsonService<T> {\r\n\r\n private service_: IQuerable<T>;\r\n private cache_: Map<string, ICache<T>> = new Map<string, ICache<T>>();\r\n private duration_: number | false = storeCacheDuration;\r\n\r\n constructor(service: IQuerable<T>, options: InMemoryCacheOptions = {}) {\r\n super([]);\r\n if (!service) {\r\n throw new Error('CachedService: service is required');\r\n }\r\n this.service_ = service;\r\n this.duration_ = typeof options.duration !== 'undefined' ? options.duration : this.duration_;\r\n }\r\n\r\n private async fromCache_(callback: () => Promise<ICacheResult<T>>, key?: string): Promise<ICacheResult<T>> {\r\n if (key && this.hasKey_(key)) {\r\n return this.getKey_(key);\r\n } else {\r\n const t = await callback();\r\n if (key && t) {\r\n this.setKey_(key, t);\r\n }\r\n return t;\r\n }\r\n }\r\n\r\n private isExpired_(item: ICache<T>): boolean {\r\n return this.duration_ === false ? true : item.timestamp < (new Date().getTime() - this.duration_);\r\n }\r\n\r\n private hasKey_(key: string): boolean {\r\n const item = this.cache_.get(key);\r\n return item ? (!this.isExpired_(item)) : false;\r\n }\r\n\r\n private getKey_(key: string): ICacheResult<T> {\r\n return this.cache_.get(key)!.data;\r\n }\r\n\r\n private setKey_(key: string, data: ICacheResult<T>) {\r\n this.cache_.set(key, {\r\n timestamp: new Date().getTime(),\r\n data,\r\n });\r\n }\r\n\r\n async findGlobal<B extends T = T>(params: GlobalQueryParams = {}): Promise<B | undefined> {\r\n const serializedParams = qsSerialize(params);\r\n const key = `findGlobal?${serializedParams}`;\r\n return await this.fromCache_(async () => {\r\n return await this.service_.findGlobal(params);\r\n }, key) as B | undefined;\r\n }\r\n\r\n async findOne<B extends T = T>(id: IEquatable, params: QueryParams = {}): Promise<B | undefined> {\r\n const serializedParams = qsSerialize(params);\r\n const key = `findOne[${id}]?${serializedParams}`;\r\n return await this.fromCache_(async () => {\r\n return await this.service_.findOne(id, params);\r\n }, key) as B | undefined;\r\n }\r\n\r\n async findMany<B extends T = T>(params: QueryParams = {}): Promise<B[]> {\r\n if (storeStrategy === StoreStrategy.DecoratedApi) {\r\n const { market, locale, ...otherParams } = params;\r\n const serializedParams = qsSerialize({ market, locale });\r\n const key = `findMany?${serializedParams}`;\r\n let items = await this.fromCache_(async () => {\r\n return await this.service_.findMany({ market, locale });\r\n }, key) as B[];\r\n if (otherParams.where) {\r\n items = this.whereItems_(items, otherParams.where);\r\n }\r\n if (otherParams.sort) {\r\n items = this.sortCollection_(items, otherParams.sort);\r\n }\r\n return items;\r\n } else {\r\n const serializedParams = qsSerialize(params);\r\n const key = `findMany?${serializedParams}`;\r\n return await this.fromCache_(async () => {\r\n return await this.service_.findMany(params);\r\n }, key) as B[];\r\n }\r\n }\r\n\r\n async findPaged<B extends T = T>(params: QueryParams = {}): Promise<IPagedResult<B>> {\r\n const serializedParams = qsSerialize(params);\r\n const key = `findPaged?${serializedParams}`;\r\n return await this.fromCache_(async () => {\r\n return await this.service_.findPaged(params);\r\n }, key) as IPagedResult<B>;\r\n }\r\n\r\n async create<B extends T = T>(payload: Omit<B, 'id'>): Promise<B> {\r\n return await this.service_.create(payload);\r\n }\r\n\r\n async updateOne<B extends T = T>(id: IEquatable, payload: Partial<B>, params: Omit<QueryParams, 'where'> = {}): Promise<B> {\r\n return await this.service_.updateOne(id, payload, params);\r\n }\r\n\r\n async updateMany<B extends T = T>(payload: Partial<B>, params: QueryParams = {}): Promise<B[]> {\r\n return await this.service_.updateMany(payload, params);\r\n }\r\n\r\n async deleteOne<B extends T = T>(id: IEquatable, params: Omit<QueryParams, 'where'> = {}): Promise<B | undefined> {\r\n return await this.service_.deleteOne(id, params);\r\n }\r\n\r\n async deleteMany<B extends T = T>(params: QueryParams = {}): Promise<B[]> {\r\n return await this.service_.deleteMany(params);\r\n }\r\n\r\n // !!! old\r\n\r\n async update<B extends T = T>(payload: Partial<B>): Promise<B> {\r\n return await this.service_.update(payload);\r\n }\r\n\r\n async delete<B extends T = T>(id: IEquatable): Promise<B | undefined> {\r\n return await this.service_.delete(id);\r\n }\r\n\r\n}\r\n","import { GlobalQueryParams, IEntity, IEquatable, IPagedResult, IQuerable, IStore, qsSerialize, QueryParams } from '@websolutespa/bom-core';\r\nimport { getRemoteApiRequestOptions } from '../api/api';\r\nimport { decorateSchema_, decorateSchemas_ } from '../decorators';\r\nimport { remoteApiDelete, remoteApiGet, remoteApiPatch, remoteApiPost } from './remote.api';\r\n\r\n/**\r\n * This service handle call to remote api (bowl or over)\r\n */\r\n\r\nexport class RemoteService<T extends IEntity = IEntity> implements IQuerable<T> {\r\n key: string;\r\n store: IStore;\r\n\r\n constructor(key: string, store: IStore) {\r\n if (!key) {\r\n throw new Error('RemoteService: key is required');\r\n }\r\n if (!store) {\r\n throw new Error('RemoteService: store is required');\r\n }\r\n this.key = key;\r\n this.store = store;\r\n }\r\n\r\n async findGlobal<B extends T = T>(params: GlobalQueryParams = {}, token?: string): Promise<B | undefined> {\r\n params.richText = String(params.richText) === 'true' ? true : false;\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/globals/${this.key}${search}`;\r\n // console.log('RemoteService', this.key, 'findGlobal', url);\r\n try {\r\n const item = await remoteApiGet<B>(url, getRemoteApiRequestOptions(token));\r\n if (item) {\r\n return await this.decorateOne_(item, params);\r\n }\r\n } catch (error) {\r\n console.log('RemoteService', this.key, 'findGlobal.error');\r\n }\r\n return;\r\n }\r\n\r\n async findOne<B extends T = T>(id: IEquatable, params: Omit<QueryParams, 'where'> = {}, token?: string): Promise<B | undefined> {\r\n params.richText = String(params.richText) === 'true' ? true : false;\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}/${encodeURIComponent(id)}${search}`;\r\n // console.log('RemoteService', this.key, 'findOne', url);\r\n try {\r\n console.log('remoteApiGet', url);\r\n const item = await remoteApiGet<B>(url, getRemoteApiRequestOptions(token));\r\n if (item) {\r\n return await this.decorateOne_(item, params);\r\n }\r\n } catch (error) {\r\n console.log('RemoteService', this.key, 'findOne.error');\r\n }\r\n return;\r\n }\r\n\r\n async findMany<B extends T = T>(params: QueryParams = {}, token?: string): Promise<B[]> {\r\n params.richText = String(params.richText) === 'true' ? true : false;\r\n params.pagination = false;\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}${search}`;\r\n // console.log('RemoteService', this.key, 'findMany', url);\r\n const response = await remoteApiGet<B[] | { docs: B[] }>(url, getRemoteApiRequestOptions(token));\r\n const items: B[] = Array.isArray(response) ? response : response.docs;\r\n return await this.decorateMany_(items, params);\r\n }\r\n\r\n async findPaged<B extends T = T>(params: QueryParams = {}, token?: string): Promise<IPagedResult<B>> {\r\n params.richText = String(params.richText) === 'true' ? true : false;\r\n params.pagination = true;\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}${search}`;\r\n // console.log('RemoteService', this.key, 'findPaged', url);\r\n const response = await remoteApiGet<IPagedResult<B>>(url, getRemoteApiRequestOptions(token));\r\n let items: B[] = response.docs;\r\n items = await this.decorateMany_(items, params);\r\n return { ...response, docs: items };\r\n }\r\n\r\n async create<B extends T = T>(payload: Omit<B, 'id'>, params: QueryParams = {}, token?: string): Promise<B> {\r\n params.richText = String(params.richText) === 'true' ? true : false;\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}${search}`;\r\n // console.log('RemoteService', this.key, 'create', url);\r\n const result = await remoteApiPost<B | { doc: B }>(url, payload, getRemoteApiRequestOptions(token));\r\n const item = (result.doc ? result.doc : result) as B;\r\n return await this.decorateOne_(item, {});\r\n }\r\n\r\n async updateOne<B extends T = T>(id: IEquatable, payload: Partial<B>, params: Omit<QueryParams, 'where'> = {}, token?: string): Promise<B> {\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}/${encodeURIComponent(id)}${search}`;\r\n // console.log('RemoteService', this.key, 'updateOne', url);\r\n const result = await remoteApiPatch<B | { doc: B }>(url, payload, getRemoteApiRequestOptions(token));\r\n const item = (result.doc ? result.doc : result) as B;\r\n return await this.decorateOne_(item, {});\r\n }\r\n\r\n async updateMany<B extends T = T>(payload: Partial<B>, params: QueryParams = {}, token?: string): Promise<B[]> {\r\n params.richText = String(params.richText) === 'true' ? true : false;\r\n params.pagination = false;\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}${search}`;\r\n // console.log('RemoteService', this.key, 'updateMany', url);\r\n const response = await remoteApiPatch<B[] | { docs: B[] }>(url, payload, getRemoteApiRequestOptions(token));\r\n const items: B[] = Array.isArray(response) ? response : response.docs;\r\n return await this.decorateMany_(items, params);\r\n }\r\n\r\n async deleteOne<B extends T = T>(id: IEquatable, params: Omit<QueryParams, 'where'> = {}, token?: string): Promise<B | undefined> {\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}/${encodeURIComponent(id)}${search}`;\r\n // console.log('RemoteService', this.key, 'deleteOne', url);\r\n const item = await remoteApiDelete<B>(url, getRemoteApiRequestOptions(token));\r\n return await this.decorateOne_(item, {});\r\n }\r\n\r\n async deleteMany<B extends T = T>(params: QueryParams = {}, token?: string): Promise<B[]> {\r\n params.richText = String(params.richText) === 'true' ? true : false;\r\n params.pagination = false;\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}${search}`;\r\n // console.log('RemoteService', this.key, 'deleteMany', url);\r\n const response = await remoteApiDelete<B[] | { docs: B[] }>(url, getRemoteApiRequestOptions(token));\r\n const items: B[] = Array.isArray(response) ? response : response.docs;\r\n return await this.decorateMany_(items, params);\r\n }\r\n\r\n // !!! old\r\n\r\n async update<B extends T = T>(payload: Partial<B>, params: QueryParams = {}, token?: string): Promise<B> {\r\n const url = `/${this.key}`;\r\n // console.log('RemoteService', this.key, 'update', url);\r\n const result = await remoteApiPatch<B | { doc: B }>(url, payload, getRemoteApiRequestOptions(token));\r\n const item = (result.doc ? result.doc : result) as B;\r\n return await this.decorateOne_(item, {});\r\n }\r\n\r\n async delete<B extends T = T>(id: IEquatable, token?: string): Promise<B | undefined> {\r\n const params = {\r\n where: {\r\n id: {\r\n equals: id,\r\n },\r\n },\r\n };\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}${search}`;\r\n // console.log('RemoteService', this.key, 'delete', url);\r\n const item = await remoteApiDelete<B>(url, getRemoteApiRequestOptions(token));\r\n return await this.decorateOne_(item, {});\r\n }\r\n\r\n protected async decorateOne_<B extends T = T>(item: B, params: QueryParams = {}): Promise<B> {\r\n let decoratedItem = item;\r\n decoratedItem = await decorateSchema_<B>(this.store, decoratedItem, this.key);\r\n return decoratedItem;\r\n }\r\n\r\n protected async decorateMany_<B extends T = T>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n let decoratedItems = items;\r\n decoratedItems = await decorateSchemas_<B>(this.store, decoratedItems, this.key);\r\n return decoratedItems;\r\n }\r\n}\r\n","import { IEntity, IUndecoratedMenu, QueryParams } from '@websolutespa/bom-core';\r\nimport { decorateLocalizable_, decorateLocalizables_, decorateMenu_, decorateMenus_, decorateSchema_, decorateSchemas_ } from '../decorators';\r\nimport { RemoteService } from './remote.service';\r\n\r\nexport class RemoteMenuService<T extends IEntity = IEntity> extends RemoteService<T> {\r\n\r\n protected override async decorateOne_<B extends T = T>(item: B, params: QueryParams = {}): Promise<B> {\r\n const store = this.store;\r\n let decoratedItem = item;\r\n decoratedItem = await decorateSchema_<B>(store, decoratedItem, this.key);\r\n decoratedItem = await decorateLocalizable_<B>(item, params);\r\n if (params.market && params.locale) {\r\n decoratedItem = await decorateMenu_(store, decoratedItem as IUndecoratedMenu, {\r\n market: params.market,\r\n locale: params.locale,\r\n }) as any;\r\n }\r\n return decoratedItem;\r\n }\r\n\r\n protected override async decorateMany_<B extends T = T>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n const store = this.store;\r\n let decoratedItems = items;\r\n decoratedItems = await decorateSchemas_<B>(store, decoratedItems, this.key);\r\n decoratedItems = await decorateLocalizables_<B>(items, params);\r\n if (params.market && params.locale) {\r\n decoratedItems = await decorateMenus_(store, decoratedItems as IUndecoratedMenu[], {\r\n market: params.market,\r\n locale: params.locale,\r\n }) as any[];\r\n }\r\n return decoratedItems;\r\n }\r\n\r\n}\r\n","import { ICategorized, QueryParams } from '@websolutespa/bom-core';\r\nimport { decorateCategories_, decorateCategory_, decorateHref_, decorateHrefs_, decorateNav_, decorateRelation_, decorateSchema_, decorateSchemas_ } from '../decorators';\r\nimport { RemoteService } from './remote.service';\r\n\r\nexport class RemotePageService<T extends ICategorized = ICategorized> extends RemoteService<T> {\r\n\r\n protected override async decorateOne_<B extends T = T>(item: B, params: QueryParams = {}): Promise<B> {\r\n const store = this.store;\r\n let decoratedItem = item;\r\n decoratedItem = await decorateSchema_<B>(store, decoratedItem, this.key);\r\n decoratedItem = await decorateCategory_<B>(store, decoratedItem, params);\r\n decoratedItem = await decorateHref_<B>(store, decoratedItem, params);\r\n decoratedItem = await decorateNav_<B>(store, decoratedItem, params);\r\n decoratedItem = await decorateRelation_<B>(store, decoratedItem, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n return decoratedItem;\r\n }\r\n\r\n protected override async decorateMany_<B extends T = T>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n const store = this.store;\r\n let decoratedItems = items;\r\n // decoratedItems = await optimizeMany_<B>(decoratedItems);\r\n decoratedItems = await decorateSchemas_<B>(store, decoratedItems, this.key);\r\n decoratedItems = await decorateCategories_<B>(store, decoratedItems, params);\r\n decoratedItems = await decorateHrefs_<B>(store, decoratedItems, params);\r\n /*\r\n // !!! optimization for index listing\r\n decoratedItems = await decorateNavs_<B>(store, decoratedItems, params);\r\n decoratedItems = await decorateRelations_<B>(store, decoratedItems, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n */\r\n return decoratedItems;\r\n }\r\n\r\n}\r\n","import { IMemoryStore, IQuerable, IStore } from '@websolutespa/bom-core';\r\nimport { fromCache } from '../cache/cache.service';\r\nimport { CachedService } from '../cached/cached.service';\r\nimport { getMockStore, getMockStoreFromData_ } from '../mock/mock.store';\r\nimport { COLLECTIONS, KNOWN_COLLECTIONS, MOCK_COLLECTIONS, NextPhase, StoreStrategy, buildStrategy, nextPhase, storeStrategy } from '../store/store';\r\nimport { RemoteMenuService } from './remote-menu.service';\r\nimport { RemotePageService } from './remote-page.service';\r\nimport { remoteApiGet } from './remote.api';\r\nimport { RemoteService } from './remote.service';\r\n\r\nconst PAGES: string[] = process.env.PAGES ? process.env.PAGES.split(',') : [];\r\n\r\nasync function getRemoteStore_<T extends IStore>(): Promise<T> {\r\n return fromCache<T>(async () => {\r\n // console.log('getRemoteStore_');\r\n if (COLLECTIONS.length === 0) {\r\n console.error('RemoteStore.getRemoteStore_ no collections');\r\n throw ('RemoteStore.getRemoteStore_ no collections');\r\n }\r\n let mockStore: IStore = {};\r\n if (MOCK_COLLECTIONS.length > 0) {\r\n mockStore = await getMockStore<T>();\r\n }\r\n const store: IStore = {};\r\n COLLECTIONS.sort();\r\n COLLECTIONS.forEach(key => {\r\n if (MOCK_COLLECTIONS.includes(key)) {\r\n store[key] = mockStore[key]!;\r\n } else if (PAGES.includes(key) && storeStrategy === StoreStrategy.DecoratedApi) {\r\n store[key] = new RemotePageService(key, store) as IQuerable;\r\n } else if (key === 'menu' && storeStrategy === StoreStrategy.DecoratedApi) {\r\n store[key] = new CachedService(\r\n new RemoteMenuService(key, store)\r\n );\r\n } else if (KNOWN_COLLECTIONS.includes(key)) {\r\n store[key] = new CachedService(\r\n new RemoteService(key, store)\r\n );\r\n } else {\r\n store[key] = new RemoteService(key, store);\r\n }\r\n });\r\n return store as T;\r\n }, 'STORE_RUNTIME_');\r\n // }, isDevelopment ? undefined : 'STORE_RUNTIME_');\r\n}\r\n\r\nasync function getRemoteStoreStaticBuild_<T extends IStore>(): Promise<T> {\r\n return fromCache<T>(async () => {\r\n console.log('getRemoteStoreStaticBuild_');\r\n let store: IStore = {};\r\n const url = `/store?strategy=${buildStrategy}`;\r\n const json = await remoteApiGet<IMemoryStore>(url);\r\n if (json != null) {\r\n const data = Object.fromEntries(\r\n COLLECTIONS.map(key => ([key, json[key] || []]))\r\n );\r\n store = getMockStoreFromData_(data);\r\n }\r\n return store as T;\r\n }, 'STORE_BUILD_');\r\n}\r\n\r\nasync function getRemoteStoreRuntimeBuild_<T extends IStore>(): Promise<T> {\r\n return fromCache<T>(async () => {\r\n console.log('getRemoteStoreRuntimeBuild_');\r\n const data: IMemoryStore = {};\r\n COLLECTIONS.forEach(key => {\r\n data[key] = [];\r\n });\r\n const store = getMockStoreFromData_(data);\r\n return store as T;\r\n }, 'STORE_RUNTIME_BUILD_');\r\n}\r\n\r\nexport async function getRemoteStore<T extends IStore>(): Promise<T> {\r\n if (nextPhase === NextPhase.ProductionBuild) {\r\n /*\r\n if (buildStrategy === BuildStrategy.Runtime) {\r\n return await getRemoteStoreRuntimeBuild_();\r\n } else {\r\n return await getRemoteStoreStaticBuild_();\r\n }\r\n */\r\n return await getRemoteStoreStaticBuild_();\r\n } else {\r\n return await getRemoteStore_();\r\n }\r\n}\r\n","import { IStore } from '@websolutespa/bom-core';\r\n// import { getLocalStore } from '../local_/local.store';\r\nimport { getMockStore } from '../mock/mock.store';\r\nimport { getRemoteStore } from '../remote/remote.store';\r\nimport { StoreStrategy, storeStrategy } from './store';\r\n\r\nexport async function getStore<T extends IStore>(): Promise<T> {\r\n // console.trace('getStore', storeStrategy);\r\n switch (storeStrategy) {\r\n case StoreStrategy.Mock:\r\n return await getMockStore<T>();\r\n /*\r\n case StoreStrategy.Local:\r\n return await getLocalStore<T>();\r\n */\r\n default:\r\n return await getRemoteStore<T>();\r\n }\r\n}\r\n","import { IEntity, IRedirect, IRoute, IStore, asEquatable, defaultLocale, defaultMarket, qsDeserialize } from '@websolutespa/bom-core';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { apiHandler } from '../api/api.handler';\r\nimport { getSessionToken } from '../session/session.service';\r\nimport { COLLECTIONS } from './store';\r\nimport { getStore } from './store.service';\r\n\r\n/*\r\n* storeHandler contains generic local api CRUD handlers of next app\r\n* it could serve both api or mock data\r\n*/\r\n\r\nexport function storeHandler<T extends IStore>(storePromise: () => Promise<T> = async () => await getStore<T>()) {\r\n return apiHandler({\r\n get: collectionGet(storePromise),\r\n post: collectionPost(storePromise),\r\n patch: collectionPatch(storePromise),\r\n delete: collectionDelete(storePromise),\r\n });\r\n}\r\n\r\n// find a specific document by id or\r\n// find paginated documents\r\nexport function collectionGet<T extends IStore>(storePromise: () => Promise<T>) {\r\n return async (request: NextApiRequest, response: NextApiResponse) => {\r\n try {\r\n const { collections, ...query } = request.query;\r\n // console.log('query', query);\r\n if (!Array.isArray(collections) || collections?.length === 0) {\r\n console.error('storeHandler.collectionGet', 'method not allowed', collections);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const collection: string = collections[0]!;\r\n const id: string = collections[1]!;\r\n const qs = Object.entries(query).map(kv => kv.join('=')).join('&');\r\n const params = qsDeserialize(qs);\r\n // console.log('params', params);\r\n if (!COLLECTIONS.includes(collection)) {\r\n console.error('storeHandler.collectionGet', 'method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const store = await storePromise();\r\n const service = store[collection];\r\n if (!service) {\r\n console.error('storeHandler.collectionGet', 'method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const token = await getSessionToken(request, response);\r\n // find a specific document by id\r\n if (id) {\r\n // console.log('storeHandler.collectionGet', collection, id, params);\r\n const item = await service.findOne(asEquatable(id), params, token);\r\n if (item) {\r\n return response.status(200).json(item);\r\n } else {\r\n return response.status(404).send('not found');\r\n }\r\n // find paginated documents\r\n } else if (String(params.pagination) === 'true') {\r\n // console.log('storeHandler.collectionGet', collection, params);\r\n const pagination = await service.findPaged(params, token);\r\n return response.status(200).json(pagination);\r\n } else {\r\n // console.log('storeHandler.collectionGet', collection, params);\r\n const items = await service.findMany(params, token);\r\n return response.status(200).json(items);\r\n }\r\n } catch (error: any) {\r\n console.error('storeHandler.collectionGet.error', '500', error);\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n// create a new document + post route\r\nexport function collectionPost<T extends IStore>(storePromise: () => Promise<T>) {\r\n return async (request: NextApiRequest, response: NextApiResponse) => {\r\n try {\r\n const { collections, ...query } = request.query;\r\n if (!Array.isArray(collections) || collections.length !== 1) {\r\n console.error('method not allowed', collections);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const collection: string = collections[0]!;\r\n const id: string = collections[1]!;\r\n if (id) {\r\n console.error('method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const qs = Object.entries(query).map(kv => kv.join('=')).join('&');\r\n const params = qsDeserialize(qs);\r\n const store = await storePromise();\r\n const service = store[collection];\r\n if (!service) {\r\n console.error('method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n // api post route pathname\r\n if (collection === 'route') {\r\n return routePost(store, request, response);\r\n }\r\n const token = await getSessionToken(request, response);\r\n const payload: Omit<IEntity, 'id'> = request.body;\r\n const item = await service.create(payload, params, token);\r\n return response.status(200).json(item);\r\n } catch (error: any) {\r\n console.error('storeHandler.error.500', error);\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n// update a document by id\r\nexport function collectionPatch<T extends IStore>(storePromise: () => Promise<T>) {\r\n return async (request: NextApiRequest, response: NextApiResponse) => {\r\n try {\r\n const { collections, ...query } = request.query;\r\n // console.log('query', query);\r\n if (!Array.isArray(collections) || collections?.length === 0) {\r\n console.error('storeHandler.collectionUpdate', 'method not allowed', collections);\r\n return response.status(405).send('method not allowed');\r\n }\r\n if (!Array.isArray(collections) || collections.length !== 2) {\r\n console.error('method not allowed', collections);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const collection: string = collections[0]!;\r\n const id: string = collections[1]!;\r\n const qs = Object.entries(query).map(kv => kv.join('=')).join('&');\r\n const params = qsDeserialize(qs);\r\n // console.log('params', params);\r\n if (!COLLECTIONS.includes(collection)) {\r\n console.error('storeHandler.collectionUpdate', 'method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const store = await storePromise();\r\n const service = store[collection];\r\n if (!service) {\r\n console.error('storeHandler.collectionUpdate', 'method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const token = await getSessionToken(request, response);\r\n const payload: Partial<IEntity> = request.body;\r\n // update a specific document by id\r\n if (id) {\r\n // console.log('storeHandler.collectionUpdate', collection, id, params);\r\n const item = await service.updateOne(asEquatable(id), payload, params, token);\r\n if (item) {\r\n return response.status(200).json(item);\r\n } else {\r\n return response.status(404).send('not found');\r\n }\r\n } else {\r\n // console.log('storeHandler.collectionUpdate', collection, params);\r\n const items = await service.updateMany(payload, params, token);\r\n return response.status(200).json(items);\r\n }\r\n } catch (error: any) {\r\n console.error('storeHandler.error.500', error);\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n// delete an existing document by id\r\nexport function collectionDelete<T extends IStore>(storePromise: () => Promise<T>) {\r\n return async (request: NextApiRequest, response: NextApiResponse) => {\r\n try {\r\n const { collections, ...query } = request.query;\r\n // console.log('query', query);\r\n if (!Array.isArray(collections) || collections?.length === 0) {\r\n console.error('storeHandler.collectionDelete', 'method not allowed', collections);\r\n return response.status(405).send('method not allowed');\r\n }\r\n if (!Array.isArray(collections) || collections.length !== 2) {\r\n console.error('method not allowed', collections);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const collection: string = collections[0]!;\r\n const id: string = collections[1]!;\r\n const qs = Object.entries(query).map(kv => kv.join('=')).join('&');\r\n const params = qsDeserialize(qs);\r\n // console.log('params', params);\r\n if (!COLLECTIONS.includes(collection)) {\r\n console.error('storeHandler.collectionDelete', 'method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const store = await storePromise();\r\n const service = store[collection];\r\n if (!service) {\r\n console.error('storeHandler.collectionDelete', 'method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const token = await getSessionToken(request, response);\r\n // delete a specific document by id\r\n if (id) {\r\n // console.log('storeHandler.collectionDelete', collection, id, params);\r\n const item = await service.deleteOne(asEquatable(id), params, token);\r\n if (item) {\r\n return response.status(200).json(item);\r\n } else {\r\n return response.status(404).send('not found');\r\n }\r\n } else {\r\n // console.log('storeHandler.collectionDelete', collection, params);\r\n const items = await service.deleteMany(params, token);\r\n return response.status(200).json(items);\r\n }\r\n } catch (error: any) {\r\n console.error('storeHandler.error.500', error);\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n// route post resolver\r\n// !!! todo, should be moved to models -> route service\r\nexport async function routePost(store: IStore, request: NextApiRequest, response: NextApiResponse) {\r\n try {\r\n const { pathname, href, hrefBeforeRedirect } = request.body;\r\n console.log('routePost', pathname, href, hrefBeforeRedirect);\r\n if (pathname && href) {\r\n const route = await findRoute(store, pathname, href, hrefBeforeRedirect);\r\n return response.status(200).json(route);\r\n } else {\r\n return response.status(400).send('bad request');\r\n }\r\n } catch (error: any) {\r\n if (error.status < 500) {\r\n if (error.status < 400) {\r\n return response.status(error.status).send({\r\n redirectUrl: error.redirectUrl,\r\n });\r\n }\r\n if (error.status === 404) {\r\n return response.status(404).send('not found');\r\n } else {\r\n return response.status(error.status).send('gone');\r\n }\r\n } else {\r\n console.error('storeHandler.error.500', error);\r\n throw error;\r\n }\r\n }\r\n}\r\n\r\n/*\r\n* storeIndexHandler contains a list of all the generic local api CRUD handlers of next app\r\n*/\r\nexport function storeIndexHandler() {\r\n return apiHandler({\r\n get: async (request: NextApiRequest, response: NextApiResponse) => {\r\n try {\r\n const market = defaultMarket;\r\n const locale = defaultLocale;\r\n if (!Array.isArray(COLLECTIONS) || COLLECTIONS?.length === 0) {\r\n console.error('apiHome.collectionGet', 'collections not found', COLLECTIONS);\r\n return response.status(405).send('method not allowed');\r\n }\r\n COLLECTIONS.sort((a, b) => a.localeCompare(b));\r\n response.setHeader('Content-Type', 'text/html; charset=UTF-8');\r\n response.setHeader('X-Frame-Options', 'SAMEORIGIN');\r\n response.setHeader('X-Robots-Tag', 'noindex, follow');\r\n return response.status(200).send(`\r\n <html>\r\n <head>\r\n <title>REST Api</title>\r\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n <style type=\"text/css\">\r\n html {\r\n padding: 0;\r\n background: #09090A;\r\n color: #fefefe;\r\n }\r\n body {\r\n padding: 15px;\r\n font-family: Inter,-apple-system,'Helvetica Neue','Segoe UI',Roboto,Arial,'Noto Sans',sans-serif;\r\n font-size: 13px;\r\n background: #09090A;\r\n color: #fefefe;\r\n }\r\n .container {\r\n margin: 0 auto;\r\n max-width: 1280px;\r\n }\r\n a {\r\n color: #fefefe;\r\n text-decoration: none;\r\n }\r\n a:visited {\r\n color: #9e9e9e;\r\n }\r\n a:hover {\r\n text-decoration: underline;\r\n }\r\n table {\r\n width: 100%;\r\n margin: 10px 0;\r\n border: none;\r\n border-collapse: collapse;\r\n }\r\n td,\r\n th {\r\n text-align: left;\r\n font-size: 12px;\r\n padding: 3px;\r\n }\r\n th:not(:last-child),\r\n td:not(:last-child) {\r\n padding-right: 30px;\r\n }\r\n thead th {\r\n border-bottom: 1px solid #0e0e0f;\r\n }\r\n #table tr:nth-child(odd) td {\r\n background-color: #0e0e0f;\r\n }\r\n #table tbody tr:hover td {\r\n background-color: #1A1A1B;\r\n }\r\n #table tbody tr:hover td,\r\n #table tbody tr:hover td a {\r\n color: #fefefe;\r\n }\r\n .wysiwyg {\r\n margin: 0;\r\n padding: 0 0 10px 0;\r\n line-height: 1.2em;\r\n }\r\n .wysiwyg a {\r\n color: #00ea4e;\r\n font-weight: 600;\r\n }\r\n .wysiwyg a:visited {\r\n color: #00ea4e;\r\n }\r\n </style>\r\n </head>\r\n <body>\r\n <div class=\"container\">\r\n <h1>REST API</h1>\r\n <p class=\"wysiwyg\">\r\n This is the REST Api generated by <a href=\"https://github.com/websolutespa/bom\" target=\"_blank\" rel=\"noopener\">Mixer</a>.\r\n </p>\r\n <p class=\"wysiwyg\">\r\n It contains a list of all the generic local api CRUD handlers of Mixer app. <br />\r\n All methods should be called with market and locale parameters.\r\n </p>\r\n <table id=\"table\" cellpadding=\"3\">\r\n <thead>\r\n <tr>\r\n <th width=\"150px\">Method</th>\r\n <th width=\"150px\">Collection</th>\r\n <th>Endpoint</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n ${COLLECTIONS.map(c => (`\r\n <tr>\r\n <td>GET, POST, PATCH</td>\r\n <td>${c}</td>\r\n <td><a href=\"/api/${c}?market=${market}&locale=${locale}\">/api/${c}</a></td>\r\n </tr>\r\n <tr>\r\n <td>GET, DELETE</td>\r\n <td>${c}</td>\r\n <td><a href=\"/api/${c}/{id}?market=${market}&locale=${locale}\">/api/${c}/{id}</a></td>\r\n </tr>\r\n `)).join('\\n')}\r\n\t\t\t\t\t </tbody>\r\n </table>\r\n </div>\r\n </body>\r\n `);\r\n } catch (error: any) {\r\n console.error('storeHandler.collectionGet.error', '500', error);\r\n throw error;\r\n }\r\n },\r\n });\r\n}\r\n\r\nconst trimTerminalSlash = (path: string) => {\r\n return path.replace(/\\/+$/, '');\r\n};\r\n\r\nconst sanitizeHref = (url: URL, urlBeforeRedirect: URL | null) => {\r\n if (urlBeforeRedirect) {\r\n const sanitizedUrl = new URL(urlBeforeRedirect);\r\n sanitizedUrl.protocol = url.protocol;\r\n return trimTerminalSlash(sanitizedUrl.href);\r\n } else {\r\n return trimTerminalSlash(url.href);\r\n }\r\n};\r\n\r\nconst sanitizeRedirectFrom = (path: string, url: URL, urlBeforeRedirect: URL | null) => {\r\n path = trimTerminalSlash(path);\r\n if (urlBeforeRedirect) {\r\n return path.replace(/^(\\^?)((https?:\\/\\/)+)/, `$1${url.protocol}//`);\r\n } else {\r\n return path.replace(/^(\\^?)((https?:\\/\\/)+(\\w|\\.|:)+)/, `$1${url.origin}`);\r\n }\r\n};\r\n\r\nconst sanitizeRedirectTo = (path?: string) => {\r\n return path ? trimTerminalSlash(path) : undefined;\r\n};\r\n\r\nconst sanitizeRedirectUrl = (path: string | undefined, url: URL) => {\r\n if (path != null) {\r\n path = trimTerminalSlash(path);\r\n return path.match(/^((https?:\\/\\/)+)/) ? path : `${url.origin}${path}`;\r\n } else {\r\n return path;\r\n }\r\n};\r\n\r\nexport async function findRoute(store: IStore, pathname: string, href: string, hrefBeforeRedirect: string | null): Promise<IRoute | undefined> {\r\n // here we use findMany because route id would break api url\r\n const routes = await store.route!.findMany<IRoute>({\r\n where: {\r\n id: {\r\n equals: pathname,\r\n },\r\n },\r\n });\r\n // console.log('routes', routes);\r\n // console.log('pathname', pathname);\r\n if (routes.length > 0) {\r\n return routes[0];\r\n } else {\r\n // exact route match not found\r\n // let's try if match splat routes\r\n const splatRoutes = await store.route!.findMany<IRoute>({\r\n where: {\r\n useSplat: {\r\n equals: true,\r\n },\r\n },\r\n });\r\n // find best match splat route\r\n const splatRoute = splatRoutes.reduce((p: (IRoute & { splat: string }) | undefined, c: IRoute) => {\r\n const match = pathname.indexOf(c.id) === 0;\r\n if (match && (!p || p.id.length < c.id.length)) {\r\n return { ...c, splat: pathname.substring(c.id.length, pathname.length) };\r\n } else {\r\n return p;\r\n }\r\n }, undefined);\r\n if (splatRoute) {\r\n return splatRoute;\r\n }\r\n const url = new URL(href);\r\n const urlBeforeRedirect = hrefBeforeRedirect ? new URL(hrefBeforeRedirect) : null;\r\n const sanitizedHref = sanitizeHref(url, urlBeforeRedirect);\r\n /*\r\n console.log('href', url.href);\r\n console.log('hrefBeforeRedirect', urlBeforeRedirect?.href);\r\n console.log('sanitizedHref', sanitizedHref);\r\n */\r\n // collect redirects\r\n let redirects = await store.redirect!.findMany<IRedirect>({\r\n where: {\r\n isActive: {\r\n equals: true,\r\n },\r\n },\r\n });\r\n redirects = redirects.map(x => ({\r\n ...x,\r\n from: sanitizeRedirectFrom(x.from, url, urlBeforeRedirect),\r\n to: sanitizeRedirectTo(x.to),\r\n }));\r\n // redirects.sort((a, b) => a.order - b.order);\r\n // console.log('findRoute redirects', redirects);\r\n // exact match redirect resolver\r\n const exactMatchResolver = (redirect: IRedirect) => {\r\n const status: number = parseInt(redirect.status) || 307;\r\n if (status < 400) {\r\n const redirectUrl = sanitizeRedirectUrl(redirect.to, url);\r\n // console.log('>>>>>>>>>> findRoute exactMatchResolver', status, redirectUrl, redirect.to);\r\n throw { status, redirectUrl };\r\n } else {\r\n throw { status };\r\n }\r\n };\r\n // check exact match redirects\r\n const exactMatchRedirect = redirects.find(x => x.from === sanitizedHref);\r\n if (exactMatchRedirect !== undefined) {\r\n return exactMatchResolver(exactMatchRedirect);\r\n }\r\n // pattern match redirect resolver\r\n const patternMatchResolver = (redirect: IRedirect) => {\r\n const status: number = parseInt(redirect.status) || 307;\r\n if (status < 400) {\r\n const regexp = new RegExp(redirect.from);\r\n let i = 0;\r\n let redirectUrl = (redirect.to as string).replace(/\\*/g, (...rest) => {\r\n return `$${++i}`;\r\n });\r\n redirectUrl = sanitizedHref.replace(regexp, redirectUrl);\r\n redirectUrl = sanitizeRedirectUrl(redirectUrl, url) as string;\r\n // console.log('>>>>>>>>>> findRoute patternMatchResolver', status, redirectUrl, redirect.to);\r\n throw { status, redirectUrl };\r\n } else {\r\n throw { status };\r\n }\r\n };\r\n // check redirects by pattern\r\n redirects.forEach(x => {\r\n let expression = x.from;\r\n // wrapping catchall in (.*)\r\n expression = expression.replace(/\\*(?!\\))/g, '(.*)');\r\n // wrapping expression in ^...$\r\n expression = `^${expression.replace(/(^\\^)|(\\$$)/g, '')}$`;\r\n x.from = expression;\r\n });\r\n // check if a regex pattern redirect does match\r\n const firstMatch = redirects.find(x => sanitizedHref.match(x.from));\r\n // console.log('>>>>>>>>>> findRoute firstMatch', firstMatch);\r\n if (firstMatch) {\r\n return patternMatchResolver(firstMatch);\r\n }\r\n throw { status: 404 };\r\n }\r\n}\r\n","import { storeHandler } from '../store/store.handler';\r\nimport { getMockStore } from './mock.store';\r\n\r\nexport function mockHandler() {\r\n return storeHandler(async () => await getMockStore());\r\n}\r\n","import { NextApiRequest, NextApiResponse } from 'next';\r\nimport { apiHandler } from '../api/api.handler';\r\n\r\nexport function previewHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n get: async (request: NextApiRequest, response: NextApiResponse) => {\r\n const query = request.query as {\r\n marketId: string;\r\n localeId: string;\r\n templateId: string;\r\n documentId: string;\r\n _status: 'published' | 'draft';\r\n _live: string;\r\n _token: string;\r\n };\r\n const { marketId, localeId, templateId, documentId, _status } = query;\r\n const destination = `/${marketId}/${localeId}/${templateId}/${documentId}${query._live ? '?_live=true' : ''}`;\r\n response.setPreviewData({ _status });\r\n response.setDraftMode({ enable: true });\r\n response.redirect(307, destination);\r\n },\r\n });\r\n}\r\n","import { IApp, IAppExtended, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getApp<T extends IAppExtended = IAppExtended>(params: QueryParams = {}): Promise<IApp<T> | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.app.findGlobal(params);\r\n return item as IApp<T>;\r\n}\r\n","import { IEquatable, ILabel, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getLabels(params: QueryParams = {}): Promise<ILabel[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.label!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getLabel(id: IEquatable, params: QueryParams = {}): Promise<ILabel | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.label!.findOne(id, params);\r\n return item;\r\n}\r\n\r\nexport function resolveLabel(labels: ILabel[], id: string): string {\r\n const label = labels.find(x => x.id === id);\r\n return label && label.text ? label.text.toString() : id;\r\n}\r\n\r\n/*\r\nexport function localizedLabel(labels: Label[], id: string, locale: string, defaultLocale: string): Promise<Label> {\r\n const label = labels.find(x => x.id === id);\r\n if (label) {\r\n return store.localizeValue(label, locale, defaultLocale);\r\n }\r\n}\r\n*/\r\n","import { IEquatable, ILocale, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getLocales(params: QueryParams = {}): Promise<ILocale[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.locale!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getLocale(id: IEquatable, params: QueryParams = {}): Promise<ILocale | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.locale!.findOne(id, params);\r\n return item;\r\n}\r\n","import { IEquatable, IMarket, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getMarkets(params: QueryParams = {}): Promise<IMarket[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.market!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getMarket(id: IEquatable, params: QueryParams = {}): Promise<IMarket | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.market!.findOne(id, params);\r\n return item;\r\n}\r\n","import { IEquatable, IMenu, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getMenus(params: QueryParams = {}): Promise<IMenu[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.menu!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getMenu(id: IEquatable, params: QueryParams = {}): Promise<IMenu | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.menu!.findOne(id, params);\r\n return item;\r\n}\r\n","import { asCategoryId, findRouteOfCategory, getRootCategory, ICategory, IRoute, IRouteLink, localize } from '@websolutespa/bom-core';\r\n\r\nexport type StaticPath = { params: { [key: string]: string } };\r\n\r\nexport function categoryToRouteLink(routes: IRoute[], categories: ICategory[], category: ICategory, locale: string): IRouteLink | undefined {\r\n const route = findRouteOfCategory(routes, category.id);\r\n if (!route) {\r\n return undefined;\r\n }\r\n const rootCategory = getRootCategory(categories);\r\n const childCategories = categories.filter(x => {\r\n const parentId = asCategoryId(x.category);\r\n return rootCategory && rootCategory.id === category.id ?\r\n (x.id !== rootCategory.id && (parentId === category.id || !parentId)) :\r\n parentId === category.id;\r\n });\r\n // console.log('childCategories', category.id, childCategories);\r\n const routeLink = newRouteLink(category, route, locale);\r\n // console.log('categoryToRouteLink', href, category.id, route);\r\n routeLink.items = childCategories\r\n .map(x => categoryToRouteLink(routes, categories, x, locale))\r\n .filter(x => x !== undefined) as IRouteLink[];\r\n return routeLink;\r\n}\r\n\r\nexport function newRouteLink(category: ICategory, route: IRoute | undefined, locale: string): IRouteLink {\r\n const href = (route && route.id) ? route.id.toString() : '/';\r\n const id = route?.page || category.id;\r\n const media = category.media || route?.media;\r\n const schema = route?.template || route?.schema || category?.schema || 'unknown';\r\n const title = localize(category.title || route?.title || 'untitled', locale);\r\n const routeLink = {\r\n category: category.id,\r\n href,\r\n id,\r\n items: [],\r\n media,\r\n schema,\r\n title,\r\n };\r\n return routeLink;\r\n}\r\n\r\nexport function routeToRouteLink(route: IRoute): IRouteLink {\r\n const routeLink: IRouteLink = {\r\n category: asCategoryId(route.category),\r\n href: route.id,\r\n id: route.page,\r\n items: [],\r\n media: route.media,\r\n schema: route.schema,\r\n title: route.title,\r\n };\r\n return routeLink;\r\n}\r\n\r\nexport function resolveRoute(route: IRoute & { splat?: string }) {\r\n // console.log('resolveRoute', route);\r\n const routepath: string = route.template || route.schema;\r\n // convert route to next.js pages folder schema\r\n const resolvedPathname = `/${route.market}/${route.locale}/${routepath}/${route.page}${route.splat || ''}`;\r\n // console.log('resolveRoute', route.schema, resolvedPathname);\r\n return resolvedPathname;\r\n}\r\n","import { asCategoryId, defaultLocale, defaultMarket, findRouteOfCategory, getRootCategory, ICategory, IRoute, IRouteLink, QueryParams } from '@websolutespa/bom-core';\r\nimport { buildStrategy, BuildStrategy, StoreStrategy, storeStrategy } from '@websolutespa/bom-mixer-store';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\nimport { newRouteLink, routeToRouteLink } from './route';\r\n\r\nexport type StaticPath = { params: { [key: string]: string } };\r\n\r\nexport async function getRoutes(params: QueryParams = {}): Promise<IRoute[]> {\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany(params);\r\n return routes;\r\n}\r\n\r\nexport async function getRoute(id: string): Promise<IRoute | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const route = await store.route!.findOne(id);\r\n // console.log('RouteService.getRoute', id, '->', route);\r\n return route;\r\n}\r\n\r\nexport async function getRoutesForSchemas(schemas: string[], market?: string, locale?: string): Promise<{ [key: string]: string; }> {\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany({\r\n where: {\r\n schema: {\r\n in: schemas,\r\n },\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n const items: {\r\n [key: string]: string;\r\n } = {};\r\n routes.forEach(route => {\r\n items[route.schema] = route.id;\r\n });\r\n return items;\r\n}\r\n\r\nexport async function getRoutesForTemplates(templates: string[], market?: string, locale?: string): Promise<{ [key: string]: string; }> {\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany({\r\n where: {\r\n template: {\r\n in: templates,\r\n },\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n const items: {\r\n [key: string]: string;\r\n } = {};\r\n routes.forEach(route => {\r\n if (route.template) {\r\n items[route.template] = route.id;\r\n }\r\n });\r\n return items;\r\n}\r\n\r\nexport async function getStaticPathsForSchema(\r\n schema: string,\r\n template?: string\r\n): Promise<StaticPath[]> {\r\n if (buildStrategy === BuildStrategy.Runtime) {\r\n return [];\r\n }\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany({\r\n where: template ? ({\r\n and: [{\r\n template: {\r\n equals: template,\r\n },\r\n }, {\r\n schema: {\r\n equals: schema,\r\n },\r\n }],\r\n }) : ({\r\n schema: {\r\n equals: schema,\r\n },\r\n }),\r\n });\r\n return routes.map((x: any) => ({ params: { id: x.page.toString(), market: x.market, locale: x.locale } }));\r\n}\r\n\r\nexport async function getStaticPathsForSchemaAndFallback(\r\n schema: string,\r\n fallback: 'blocking' | true | false = 'blocking',\r\n template?: string\r\n) {\r\n if (\r\n buildStrategy === BuildStrategy.Runtime ||\r\n (fallback === 'blocking' && storeStrategy !== StoreStrategy.Mock)\r\n ) {\r\n return { paths: [], fallback };\r\n }\r\n const paths = await getStaticPathsForSchema(schema, template);\r\n return {\r\n paths,\r\n fallback,\r\n // fallback: 'blocking', // runs before initial render\r\n // fallback: true, // runs in the background\r\n };\r\n}\r\n\r\nexport async function getBreadcrumbFromSegments(segments: ICategory[], route: IRoute): Promise<IRouteLink[]> {\r\n const market = route.market || defaultMarket;\r\n const locale = route.locale || defaultLocale;\r\n const routes: IRoute[] = await getRoutes({\r\n where: {\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n const tree: IRouteLink[] = segments.map(segment => {\r\n const route = findRouteOfCategory(routes, segment.id);\r\n return {\r\n segment,\r\n route,\r\n };\r\n }).filter(x => Boolean(x.route)).map(x => {\r\n const category = x.segment;\r\n const route = x.route;\r\n // console.log(route, category);\r\n const routeLink = newRouteLink(category, route, locale);\r\n return routeLink;\r\n });\r\n if (!route.isDefault) {\r\n tree.push(routeToRouteLink(route));\r\n }\r\n // console.log(tree);\r\n return tree;\r\n}\r\n\r\nexport async function getRouteLinkTree(market: string, locale: string): Promise<IRouteLink | undefined> {\r\n const store = await getStore<IModelStore>();\r\n // console.log('getRouteLinkTree.store', store);\r\n const routes = await store.route!.findMany({\r\n where: {\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n // console.log('getRouteLinkTree.routes', routes.map(x => x.id));\r\n const categories = await store.category!.findMany({ market, locale });\r\n // console.log('getRouteLinkTree.categories', categories.map(x => x.id));\r\n const rootCategory = getRootCategory(categories);\r\n // console.log('getRouteLinkTree.rootCategory', rootCategory?.id);\r\n if (rootCategory) {\r\n const root = getRouteLinkCategory(locale, routes, categories, rootCategory, rootCategory);\r\n // console.log('getRouteLinkTree', root);\r\n return root as IRouteLink;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getRouteLinkCategory(\r\n locale: string,\r\n routes: IRoute[],\r\n categories: ICategory[],\r\n rootCategory: ICategory,\r\n category: ICategory\r\n): IRouteLink | IRouteLink[] | undefined {\r\n const route = findRouteOfCategory(routes, category.id);\r\n const otherCategories = categories.filter(x => x.id !== category.id);\r\n const childCategories = otherCategories.filter(x => asCategoryId(x.category) === category.id);\r\n // console.log('childCategories', category.id, childCategories.map(x => x.id));\r\n const routeLink = newRouteLink(category, route, locale);\r\n // console.log('getRouteLinkCategory', href, category.id, route);\r\n const items: IRouteLink[] = [];\r\n for (const childCategory of childCategories) {\r\n const itemOrItems = getRouteLinkCategory(locale, routes, otherCategories, rootCategory, childCategory);\r\n if (Array.isArray(itemOrItems)) {\r\n items.push(...itemOrItems);\r\n } else if (itemOrItems) {\r\n items.push(itemOrItems);\r\n }\r\n }\r\n if (\r\n !route ||\r\n (category.isHidden && category.id !== rootCategory.id)\r\n ) {\r\n return items;\r\n }\r\n routeLink.items = items;\r\n return routeLink;\r\n}\r\n","import { IApp, IAppExtended, ILabel, ILayout, ILocale, ILocalizedMenu, IMarket, IRouteLink } from '@websolutespa/bom-core';\r\nimport { getApp } from '../app/app.service';\r\nimport { getLabels } from '../label/label.service';\r\nimport { getLocales } from '../locale/locale.service';\r\nimport { getMarkets } from '../market/market.service';\r\nimport { getMenus } from '../menu/menu.service';\r\nimport { getRouteLinkTree } from '../route/route.service';\r\n\r\nexport async function getLayout<T extends IAppExtended = IAppExtended>(market: string, locale: string): Promise<ILayout<T>> {\r\n const markets: IMarket[] = await getMarkets({ locale });\r\n // console.log('markets', markets);\r\n const locales: ILocale[] = await getLocales({ locale });\r\n // console.log('locales', locales);\r\n const labels: ILabel[] = await getLabels({ locale });\r\n // console.log('labels', labels);\r\n const app = (await getApp<T>({ locale }) || {}) as IApp<T>;\r\n const tree = await getRouteLinkTree(market, locale);\r\n // console.log('tree', tree);\r\n const firstLevelRoutes = tree?.items || [];\r\n // console.log('firstLevelRoutes', firstLevelRoutes);\r\n const flatTopLevelRoutes = tree ? [tree, ...firstLevelRoutes] : [];\r\n // console.log('flatTopLevelRoutes', flatTopLevelRoutes);\r\n const topLevelRoutes = flatTopLevelRoutes.reduce((object, routeLink: IRouteLink) => {\r\n if (!object[routeLink.schema] || routeLink.schema === routeLink.category) {\r\n object[routeLink.schema] = routeLink;\r\n }\r\n return object;\r\n }, {} as Record<string, IRouteLink>);\r\n // console.log('topLevelRoutes', topLevelRoutes);\r\n const topLevelHrefs = flatTopLevelRoutes.reduce((object, routeLink: IRouteLink) => {\r\n if (routeLink.href && (!object[routeLink.schema] || routeLink.schema === routeLink.category)) {\r\n object[routeLink.schema] = routeLink.href;\r\n }\r\n return object;\r\n }, {} as Record<string, string>);\r\n // console.log('topLevelHrefs', topLevelHrefs);\r\n const menu: Record<string, ILocalizedMenu> = {};\r\n // console.log('menu', menu);\r\n const menus = await getMenus({ market, locale });\r\n menus.forEach(x => {\r\n menu[x.id] = x as ILocalizedMenu;\r\n });\r\n // console.log('menus', menus);\r\n // console.log('getLayout');\r\n return {\r\n labels,\r\n locale,\r\n locales,\r\n market,\r\n markets,\r\n app,\r\n menu,\r\n topLevelHrefs,\r\n topLevelRoutes,\r\n tree,\r\n };\r\n}\r\n","import { getHost, getOrigin, isDevelopment, isProduction } from '@websolutespa/bom-core';\r\nimport { getLayout } from '@websolutespa/bom-mixer-models/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { apiHandler } from '../api/api.handler';\r\n\r\nconst DISALLOWED_KEYS = [\r\n '__NEXT_PRIVATE_STANDALONE_CONFIG',\r\n];\r\n\r\nconst getFilteredEnv = (env: Record<string, unknown>): Record<string, unknown> => {\r\n const entries = Object.entries(env).filter(([k, v]) => (\r\n !DISALLOWED_KEYS.includes(k) && typeof v === 'string'\r\n ));\r\n entries.sort();\r\n return Object.fromEntries(entries);\r\n};\r\n\r\nconst sortKeys = (object?: Record<string, unknown>): Record<string, unknown> => {\r\n const entries = Object.entries(object || {});\r\n entries.sort();\r\n return Object.fromEntries(entries);\r\n};\r\n\r\nexport function varsHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n get: async (request: NextApiRequest, response: NextApiResponse) => {\r\n try {\r\n const defaultLocale = process.env.DEFAULT_LOCALE || 'it';\r\n const defaultMaket = process.env.DEFAULT_MARKET || 'ww';\r\n const { locale = defaultLocale, market = defaultMaket } = (request.query || {});\r\n const layout =\r\n typeof locale === 'string' && typeof market === 'string' ?\r\n await getLayout(market, locale) :\r\n undefined;\r\n const info = {\r\n production: isProduction,\r\n development: isDevelopment,\r\n origin: getOrigin(request.headers),\r\n host: getHost(request.headers),\r\n headers: { ...sortKeys(request.headers) },\r\n env: { ...getFilteredEnv(process.env) },\r\n layout: { ...sortKeys(layout) },\r\n };\r\n if (!(request.headers.accept?.includes('text/html'))) {\r\n return response.status(200).json(info);\r\n }\r\n response.status(200).send(`<!DOCTYPE html>\r\n<html>\r\n <head>\r\n <meta charSet=\"utf-8\"/>\r\n <style>\r\n html, body {\r\n background: #282828;\r\n color: #7cacf8;\r\n }\r\n body {\r\n padding: 0;\r\n margin: 0;\r\n font-family: monospace;\r\n font-size: 14px;\r\n line-height: 1.16;\r\n font-weight: 100;\r\n }\r\n json-viewer {\r\n padding: 20px;\r\n min-height: 100vh;\r\n box-sizing: border-box;\r\n line-height: 1.2;\r\n --background-color: #282828;\r\n --color: #e3e3e3;\r\n --property-color: #7cacf8;\r\n --string-color: #53d5fb;\r\n --number-color: #7b80ff;\r\n --boolean-color: #9980ff;\r\n --null-color: #6f6f6f;\r\n --preview-color: #8f8f8f;\r\n --highlight-color: #7b0000;\r\n --font-family: monospace;\r\n --font-size: 14px;\r\n --indent-size: 1em;\r\n --indentguide-size: 1px;\r\n --indentguide-style: solid;\r\n --indentguide-color: #333;\r\n --indentguide-color-active: #666;\r\n --indentguide: var(--indentguide-size) var(--indentguide-style) var(--indentguide-color);\r\n --indentguide-active: var(--indentguide-size) var(--indentguide-style) var(--indentguide-color-active);\r\n }\r\n\r\n :root {\r\n --scrollbar-size: 8px;\r\n --scrollbar-border-radius: 2px;\r\n --scrollbar-track-color: transparent;\r\n --scrollbar-track-hover-color: transparent;\r\n --scrollbar-thumb-color: #888888;\r\n --scrollbar-thumb-hover-color: #aaaaaa;\r\n }\r\n\r\n ::-webkit-scrollbar {\r\n width: var(--scrollbar-size);\r\n height: var(--scrollbar-size);\r\n border-radius: 0;\r\n }\r\n\r\n ::-webkit-scrollbar-button {\r\n display: none;\r\n }\r\n\r\n ::-webkit-scrollbar-button:hover {\r\n display: none;\r\n }\r\n\r\n ::-webkit-scrollbar-thumb {\r\n background-color: var(--scrollbar-thumb-color);\r\n box-shadow: none;\r\n border-radius: calc(var(--scrollbar-size) * 0.5);\r\n }\r\n\r\n ::-webkit-scrollbar-thumb:hover {\r\n background-color: var(--scrollbar-thumb-hover-color);\r\n }\r\n\r\n ::-webkit-scrollbar-track {\r\n background-color: var(--scrollbar-track-color);\r\n border-radius: 0;\r\n }\r\n\r\n ::-webkit-scrollbar-track:hover {\r\n background-color: var(--scrollbar-track-hover-color);\r\n }\r\n\r\n </style>\r\n <script src=\"https://unpkg.com/@alenaksu/json-viewer@2.0.0/dist/json-viewer.bundle.js\"></script>\r\n <script>\r\n document.addEventListener('DOMContentLoaded', () => {\r\n const viewer = document.querySelector('#json-viewer');\r\n viewer.data = ${JSON.stringify(info)};\r\n viewer.expand(/headers|env/);\r\n });\r\n </script>\r\n </head>\r\n <body>\r\n <json-viewer id=\"json-viewer\"></json-viewer>\r\n </body>\r\n</html>`);\r\n } catch (error) {\r\n response.status(400).json(error);\r\n }\r\n },\r\n });\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","names":["handler: IApiHandler","request: NextApiRequest","response: NextApiResponse<T>","method: ICrudMethod","error: any","response: NextApiResponse","items: T[]","store: IStore","item: B","params: QueryParams","items: B[]","item: B","params: QueryParams","items: B[]","item: B","params: QueryParams","items: B[]","request: NextRequest | NextApiRequest | IncomingMessage & {\r\n cookies: Partial<{ [key: string]: string }>;\r\n }","response: NextResponse | NextApiResponse | ServerResponse<IncomingMessage>","sessionOptions: SessionOptions","pathname: string","option?: fsReadOptions","config: StaticServiceConfig<T>","store: IStore","items: B[]","map?: MapTo","item: Partial<B>","item: B","params: QueryParams","fields: IField[]","item: T","items: T[]","decoratedItems: T[]","PAGES: string[]","data?: IMemoryStore","store: IStore","PAGES","service: IQuerable<T>","options: InMemoryCacheOptions","callback: () => Promise<ICacheResult<T>>","key?: string","item: ICache<T>","key: string","data: ICacheResult<T>","params: GlobalQueryParams","id: IEquatable","params: QueryParams","payload: Omit<B, 'id'>","payload: Partial<B>","params: Omit<QueryParams, 'where'>","key: string","store: IStore","params: GlobalQueryParams","token?: string","id: IEquatable","params: Omit<QueryParams, 'where'>","params: QueryParams","items: B[]","payload: Omit<B, 'id'>","payload: Partial<B>","item: B","item: B","params: QueryParams","items: B[]","item: B","params: QueryParams","items: B[]","PAGES: string[]","mockStore: IStore","store: IStore","storePromise: () => Promise<T>","request: NextApiRequest","response: NextApiResponse","collection: string","id: string","error: any","payload: Omit<IEntity, 'id'>","payload: Partial<IEntity>","store: IStore","path: string","url: URL","urlBeforeRedirect: URL | null","path?: string","path: string | undefined","pathname: string","href: string","hrefBeforeRedirect: string | null","p: (IRoute & { splat: string }) | undefined","c: IRoute","redirect: IRedirect","status: number","request: NextApiRequest","response: NextApiResponse","params: QueryParams","params: QueryParams","params: QueryParams","params: QueryParams","params: QueryParams","category: ICategory","route: IRoute | undefined","locale: string","market: string","locale: string","routes: IRoute[]","categories: ICategory[]","rootCategory: ICategory","category: ICategory","items: IRouteLink[]","market: string","locale: string","markets: IMarket[]","locales: ILocale[]","labels: ILabel[]","routeLink: IRouteLink","menu: Record<string, ILocalizedMenu>","env: Record<string, unknown>","object?: Record<string, unknown>","request: NextApiRequest","response: NextApiResponse","defaultLocale"],"sources":["../../src/api/api.handler.ts","../../src/mock/mock.service.ts","../../src/mock/mock-menu.service.ts","../../src/mock/mock-page.service.ts","../../src/session/session.service.ts","../../src/fs/fs.service.ts","../../src/static/static.service.ts","../../src/mock/mock.store.ts","../../src/cached/cached.service.ts","../../src/remote/remote.service.ts","../../src/remote/remote-menu.service.ts","../../src/remote/remote-page.service.ts","../../src/remote/remote.store.ts","../../src/store/store.service.ts","../../src/store/store.handler.ts","../../src/mock/mock.handler.ts","../../src/preview/preview.handler.ts","../../../models/src/app/app.service.ts","../../../models/src/label/label.service.ts","../../../models/src/locale/locale.service.ts","../../../models/src/market/market.service.ts","../../../models/src/menu/menu.service.ts","../../../models/src/route/route.ts","../../../models/src/route/route.service.ts","../../../models/src/layout/layout.service.ts","../../src/vars/vars.handler.ts"],"sourcesContent":["// Next.js API route support: https://nextjs.org/docs/api-routes/introduction\r\nimport type { NextApiRequest, NextApiResponse } from 'next';\r\n\r\nexport type ICrudMethod = 'get' | 'post' | 'put' | 'patch' | 'delete' | string;\r\n\r\nexport type IHandler<T = any> = (request: NextApiRequest, response: NextApiResponse<T>) => Promise<void | Response>;\r\n\r\nexport type IApiHandler = Record<ICrudMethod, IHandler>;\r\n\r\nexport function apiHandler<T = any>(handler: IApiHandler): IHandler<T> {\r\n return async (request: NextApiRequest, response: NextApiResponse<T>): Promise<void | Response> => {\r\n const method: ICrudMethod = (request.method || 'GET').toLowerCase() as ICrudMethod;\r\n // check handler supports HTTP method\r\n if (!handler[method]) {\r\n response.status(405).end(`Method ${method} Not Allowed`);\r\n return;\r\n }\r\n try {\r\n // global middleware\r\n // await jwtMiddleware(request, response);\r\n // route handler\r\n await handler[method](request, response);\r\n } catch (error) {\r\n // console.log('error', error);\r\n // global error handler\r\n return errorHandler(error, response);\r\n }\r\n };\r\n}\r\n\r\nexport function errorHandler(error: any, response: NextApiResponse): void | Response {\r\n if (typeof (error) === 'string') {\r\n // custom application error\r\n const is404 = error.toLowerCase().endsWith('not found');\r\n const statusCode = is404 ? 404 : 400;\r\n response.status(statusCode).json({ message: error });\r\n return;\r\n }\r\n if (error.name === 'UnauthorizedError') {\r\n // jwt authentication error\r\n response.status(401).json({ message: 'Invalid Token' });\r\n return;\r\n }\r\n // default to 500 server error\r\n console.error(error);\r\n response.status(500).json({ message: error.message });\r\n return;\r\n}\r\n","import { IEntity, IStore, JsonService, QueryParams } from '@websolutespa/bom-core';\r\nimport { DEFAULT_DEPTH, decorateLocalizable_, decorateLocalizables_, decorateRelation_, decorateRelations_ } from '../decorators';\r\n\r\nexport class MockService<T extends IEntity = IEntity> extends JsonService<T> {\r\n store: IStore;\r\n\r\n constructor(items: T[], store: IStore) {\r\n super(items);\r\n this.store = store;\r\n }\r\n\r\n protected override async decorateOne_<B extends T = T>(item: B, params: QueryParams = {}): Promise<B> {\r\n const store = this.store;\r\n let decoratedItem = item;\r\n decoratedItem = await decorateLocalizable_<B>(item, params);\r\n decoratedItem = await decorateRelation_<B>(store, decoratedItem, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth != null ? params.depth : DEFAULT_DEPTH,\r\n });\r\n return decoratedItem;\r\n }\r\n\r\n protected override async decorateMany_<B extends T = T>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n const store = this.store;\r\n let decoratedItems = items;\r\n decoratedItems = await decorateLocalizables_<B>(items, params);\r\n decoratedItems = await decorateRelations_<B>(store, decoratedItems, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth != null ? params.depth : DEFAULT_DEPTH,\r\n });\r\n return decoratedItems;\r\n }\r\n\r\n}\r\n","import { IEntity, IUndecoratedMenu, QueryParams } from '@websolutespa/bom-core';\r\nimport { decorateLocalizable_, decorateLocalizables_, decorateMenu_, decorateMenus_ } from '../decorators';\r\nimport { MockService } from './mock.service';\r\n\r\nexport class MockMenuService<T extends IEntity = IEntity> extends MockService<T> {\r\n\r\n protected override async decorateOne_<B extends T = T>(item: B, params: QueryParams = {}): Promise<B> {\r\n const store = this.store;\r\n let decoratedItem = item;\r\n decoratedItem = await decorateLocalizable_<B>(item, params);\r\n if (params.market && params.locale) {\r\n decoratedItem = await decorateMenu_(store, decoratedItem as any as IUndecoratedMenu, {\r\n market: params.market,\r\n locale: params.locale,\r\n }) as any;\r\n }\r\n return decoratedItem;\r\n }\r\n\r\n protected override async decorateMany_<B extends T = T>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n const store = this.store;\r\n let decoratedItems = items;\r\n decoratedItems = await decorateLocalizables_<B>(items, params);\r\n if (params.market && params.locale) {\r\n decoratedItems = await decorateMenus_(store, decoratedItems as any as IUndecoratedMenu[], {\r\n market: params.market,\r\n locale: params.locale,\r\n }) as any[];\r\n }\r\n return decoratedItems;\r\n }\r\n\r\n}\r\n","import { ICategorized, QueryParams } from '@websolutespa/bom-core';\r\nimport { decorateCategories_, decorateCategory_, decorateHref_, decorateHrefs_, decorateLocalizable_, decorateLocalizables_, decorateNav_, decorateRelation_, decorateRelations_ } from '../decorators';\r\nimport { MockService } from './mock.service';\r\n\r\nexport class MockPageService<T extends ICategorized = ICategorized> extends MockService<T> {\r\n\r\n protected override async decorateOne_<B extends T = T>(item: B, params: QueryParams = {}): Promise<B> {\r\n const store = this.store;\r\n let decoratedItem = item;\r\n decoratedItem = await decorateCategory_<B>(store, decoratedItem, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n decoratedItem = await decorateLocalizable_<B>(decoratedItem, params);\r\n decoratedItem = await decorateHref_<B>(store, decoratedItem, params);\r\n decoratedItem = await decorateNav_<B>(store, decoratedItem, params);\r\n decoratedItem = await decorateRelation_<B>(store, decoratedItem, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n return decoratedItem;\r\n }\r\n\r\n protected override async decorateMany_<B extends T = T>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n const store = this.store;\r\n let decoratedItems = items;\r\n // decoratedItems = await optimizeMany_(decoratedItems);\r\n decoratedItems = await decorateCategories_<B>(store, decoratedItems, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n decoratedItems = await decorateLocalizables_<B>(decoratedItems, params);\r\n decoratedItems = await decorateHrefs_<B>(store, decoratedItems, params);\r\n decoratedItems = await decorateRelations_<B>(store, decoratedItems, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n // !!! optimization for index listing removing components\r\n const invalidKeys = ['components'];\r\n decoratedItems = decoratedItems.map(x => Object.fromEntries(\r\n Object.entries(x).filter(\r\n ([k, v]) => !invalidKeys.includes(k)\r\n )\r\n )) as B[];\r\n /*\r\n decoratedItems = await decorateNavs_<B>(store, decoratedItems, params);\r\n */\r\n return decoratedItems;\r\n }\r\n\r\n}\r\n","import { isDevelopment } from '@websolutespa/bom-core';\r\nimport { IncomingMessage, ServerResponse } from 'http';\r\nimport { getIronSession, IronSession, SessionOptions } from 'iron-session';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { NextRequest, NextResponse } from 'next/server';\r\n\r\nexport async function getSession<T extends object = Record<string, any>>(\r\n request: NextRequest | NextApiRequest | IncomingMessage & {\r\n cookies: Partial<{ [key: string]: string }>;\r\n },\r\n response: NextResponse | NextApiResponse | ServerResponse<IncomingMessage>\r\n): Promise<IronSession<T>> {\r\n const COOKIE_NAME = 'websolutespa-next-js';\r\n const COOKIE_PASSWORD = process.env.MIXER_SECRET as string || 'MIXER_SECRET_32_CHARS_LONG_12345';\r\n const sessionOptions: SessionOptions = {\r\n cookieName: COOKIE_NAME,\r\n // secure: true should be used in production (HTTPS) but can't be used in development (HTTP)\r\n cookieOptions: {\r\n secure: !isDevelopment,\r\n },\r\n password: COOKIE_PASSWORD,\r\n };\r\n const session = await getIronSession<T>(request, response, sessionOptions);\r\n return session;\r\n}\r\n\r\nexport type SessionWithToken<T extends object = Record<string, any>> = T & Partial<{\r\n token: string;\r\n exp: number;\r\n}>;\r\n\r\nexport async function getSessionToken<T extends SessionWithToken>(\r\n request: NextRequest | NextApiRequest | IncomingMessage & {\r\n cookies: Partial<{ [key: string]: string }>;\r\n },\r\n response: NextResponse | NextApiResponse | ServerResponse<IncomingMessage>\r\n): Promise<string | undefined> {\r\n const session = await getSession<T>(request, response);\r\n if (session.token && session.exp && session.exp > Math.floor(new Date().getTime() / 1000)) {\r\n return session.token;\r\n } else {\r\n session.token = undefined;\r\n session.exp = undefined;\r\n await session.save();\r\n session.destroy();\r\n return;\r\n }\r\n}\r\n","import { Json } from '@websolutespa/bom-core';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nexport type fsReadOptions = {\r\n encoding?: null | undefined;\r\n flag?: number | string | undefined;\r\n signal?: AbortSignal | undefined;\r\n};\r\n\r\nexport type fsWatchOptions = (fs.WatchOptions & { encoding: 'buffer' }) | 'buffer';\r\nexport type fsWatchFileOptions = (fs.WatchFileOptions & { bigint?: false });\r\nexport type fsWriteFileOptions = (fs.ObjectEncodingOptions & { mode?: fs.Mode; flag?: fs.OpenMode }) | BufferEncoding | null;\r\n\r\nexport async function fsExists(pathname: string): Promise<boolean> {\r\n try {\r\n await fs.promises.access(pathname);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport async function fsRead(pathname: string, option?: fsReadOptions): Promise<string | undefined> {\r\n try {\r\n const data = await fs.promises.readFile(pathname, option?.encoding || 'utf8');\r\n return data || undefined;\r\n } catch (error) {\r\n console.log('fsRead.error', error, pathname);\r\n return;\r\n }\r\n}\r\n\r\nexport async function fsReadJson<T = Json>(pathname: string): Promise<T | undefined> {\r\n try {\r\n const data = await fsRead(pathname);\r\n // console.log('fsReadJson', 'pathname', pathname, 'data', data);\r\n if (data) {\r\n return JSON.parse(data) as T;\r\n } else {\r\n return;\r\n }\r\n } catch (error) {\r\n console.log('fsReadJson.error', error, pathname);\r\n // throw (error);\r\n return;\r\n }\r\n}\r\n\r\nexport async function fsWrite(pathname: string, data: string, encoding: fsWriteFileOptions = 'utf8'): Promise<void> {\r\n try {\r\n await fs.promises.mkdir(path.dirname(pathname), { recursive: true });\r\n await fs.promises.writeFile(pathname, data, encoding);\r\n } catch (error) {\r\n console.log('fsWrite', error, pathname);\r\n }\r\n}\r\n\r\nexport async function fsWriteJson(pathname: string, data: Json): Promise<void> {\r\n try {\r\n await fsWrite(pathname, JSON.stringify(data, null, 2));\r\n } catch (error) {\r\n console.log('fsWriteJson', error, pathname);\r\n }\r\n}\r\n\r\nexport async function fsExistOrCreateFolder(pathname: string): Promise<void> {\r\n try {\r\n const exists = fs.existsSync(pathname);\r\n if (!exists) {\r\n await fs.promises.mkdir(pathname);\r\n }\r\n } catch (error) {\r\n console.log('fsExistOrCreateFolder', error, pathname);\r\n }\r\n}\r\n\r\nexport async function fsReadDirectory(pathname: string, extension?: string): Promise<{ name: string, data: string }[]> {\r\n const files = await fs.promises.readdir(pathname);\r\n const items = files.flatMap(async (file: string) => {\r\n const filePath = path.join(pathname, file);\r\n const stat = await fs.promises.stat(filePath);\r\n if (stat.isDirectory()) {\r\n return;\r\n }\r\n if (extension && path.parse(file).ext !== extension) {\r\n return;\r\n }\r\n const data = await fs.promises.readFile(filePath);\r\n if (!data) {\r\n return;\r\n }\r\n return {\r\n name: path.parse(file).name,\r\n data: data.toString(),\r\n };\r\n }) as Promise<{ name: string, data: string }>[];\r\n const items2 = (await Promise.all(items)).filter(Boolean);\r\n return items2;\r\n}\r\n\r\nexport async function fsReadJsonDirectory(pathname: string): Promise<{ name: string, data: any }[]> {\r\n try {\r\n const datas = await fsReadDirectory(pathname, '.json');\r\n return datas.filter(Boolean).map(x => {\r\n x.data = JSON.parse(x.data);\r\n return x;\r\n });\r\n } catch (error) {\r\n console.log('fsReadJsonDirectory', error, pathname);\r\n // throw (error);\r\n return [];\r\n }\r\n}\r\n\r\nexport function fsWatch(pathname: string, callback: (eventType: fs.WatchEventType, fileName: string) => void, options: fsWatchOptions) {\r\n const debounced = debounce(callback);\r\n return fs.watch(pathname, options, debounced);\r\n}\r\n\r\nexport function fsWatchFile(pathname: string, callback: (eventType: fs.WatchEventType, fileName: string) => void, options?: fsWatchFileOptions) {\r\n const debounced = debounce(callback);\r\n return fs.watchFile(pathname, options, debounced);\r\n}\r\n\r\nexport function pathJoin(...paths: string[]): string {\r\n return path.join(process.cwd(), ...paths);\r\n}\r\n\r\nexport function debounce(callback: (...args: any[]) => void, timeout: number = 300) {\r\n let timer: NodeJS.Timeout;\r\n return (...args: any[]) => {\r\n clearTimeout(timer);\r\n timer = setTimeout(() => {\r\n callback(...args);\r\n }, timeout);\r\n };\r\n}\r\n","import { IEntity, IEquatable, IStore, JsonService, QueryParams, httpGet } from '@websolutespa/bom-core';\r\nimport { DEFAULT_DEPTH, decorateLocalizable_, decorateLocalizables_ } from '../decorators';\r\nimport { IField, MapTo, StaticServiceConfig } from './static';\r\n\r\nexport class StaticService<T extends IEntity = IEntity> extends JsonService<T> {\r\n loaded: boolean = false;\r\n config: StaticServiceConfig<T>;\r\n store: IStore;\r\n\r\n constructor(config: StaticServiceConfig<T>, store: IStore) {\r\n super([]);\r\n this.config = config;\r\n this.store = store;\r\n }\r\n\r\n protected mapItems_<B extends T = T>(items: B[], map?: MapTo): B[] {\r\n if (typeof map === 'object') {\r\n items = items.map(x => {\r\n const item: Partial<B> = {};\r\n Object.entries(x).forEach(([k, v]) => {\r\n const key = map[k] || k;\r\n (item as any)[key] = v;\r\n });\r\n return item as B;\r\n });\r\n }\r\n return items;\r\n }\r\n\r\n async getItems<B extends T = T>(): Promise<B[]> {\r\n let items = this.items;\r\n if (this.loaded && items) {\r\n return items as B[];\r\n } else {\r\n const config = this.config;\r\n const src = config.src;\r\n if (typeof src === 'string') {\r\n const response = await httpGet(src, {});\r\n items = response.items;\r\n } else if (typeof src === 'function') {\r\n if (src instanceof Promise) {\r\n items = await src(config);\r\n } else {\r\n items = src(config) as T[];\r\n }\r\n } else {\r\n items = src;\r\n }\r\n items = this.mapItems_(items, config.map);\r\n this.items = items;\r\n this.loaded = true;\r\n return items as B[];\r\n }\r\n }\r\n\r\n protected override async decorateOne_<B extends T = T>(item: B, params: QueryParams = {}): Promise<B> {\r\n const store = this.store;\r\n let decoratedItem = item;\r\n decoratedItem = await decorateLocalizable_<B>(item, params);\r\n decoratedItem = await decorateStaticRelation_<B>(store, this.config.fields, decoratedItem, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n return decoratedItem;\r\n }\r\n\r\n protected override async decorateMany_<B extends T = T>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n const store = this.store;\r\n let decoratedItems = items;\r\n decoratedItems = await decorateLocalizables_<B>(items, params);\r\n decoratedItems = await decorateStaticRelations_<B>(store, this.config.fields, decoratedItems, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n return decoratedItems;\r\n }\r\n\r\n}\r\n\r\nexport async function decorateStaticRelation_<T>(store: IStore, fields: IField[], item: T, params: QueryParams = {}): Promise<T> {\r\n const depth = params.depth != null ? params.depth : DEFAULT_DEPTH;\r\n if (depth === 0) {\r\n return item;\r\n }\r\n const decoratedItem = { ...item };\r\n for (const field of fields) {\r\n if (\r\n field.type === 'relationship' &&\r\n typeof field.relationTo === 'string'\r\n ) {\r\n const name = field.name as keyof typeof item;\r\n const value = item[name];\r\n const ids = field.hasMany ? value as IEquatable[] : [value];\r\n const items = await store[field.relationTo]!.findMany({\r\n where: {\r\n id: { in: ids },\r\n },\r\n depth: depth - 1,\r\n locale: params.locale,\r\n });\r\n if (field.hasMany) {\r\n decoratedItem[name] = items as any; // !!!\r\n } else {\r\n decoratedItem[name] = (items.length ? items[0] : undefined) as any; // !!!\r\n }\r\n }\r\n }\r\n return decoratedItem;\r\n}\r\n\r\nexport async function decorateStaticRelations_<T>(store: IStore, fields: IField[], items: T[], params: QueryParams = {}): Promise<T[]> {\r\n const decoratedItems: T[] = [];\r\n for (const item of items) {\r\n const decoratedItem = await decorateStaticRelation_<T>(store, fields, item, params) as T;\r\n decoratedItems.push(decoratedItem);\r\n }\r\n return decoratedItems;\r\n}\r\n","import { ICategorized, IEntity, IMemoryStore, IQuerable, isDevelopment, IStore } from '@websolutespa/bom-core';\r\nimport { fromCache } from '../cache/cache.service';\r\nimport { fsReadJson } from '../fs/fs.service';\r\nimport { staticCollections } from '../static/static';\r\nimport { StaticService } from '../static/static.service';\r\nimport { MockMenuService } from './mock-menu.service';\r\nimport { MockPageService } from './mock-page.service';\r\nimport { MockService } from './mock.service';\r\n\r\nconst PAGES: string[] = process.env.PAGES ? process.env.PAGES.split(',') : [];\r\n\r\nexport function getMockStoreFromData_<T extends IStore>(data?: IMemoryStore): T {\r\n const store: IStore = {};\r\n if (data) {\r\n for (const key in data) {\r\n if (!PAGES.includes(key)) {\r\n // new collection\r\n const service = new MockService(data[key]!, store);\r\n store[key] = service;\r\n }\r\n }\r\n const category = store.category;\r\n if (!category) {\r\n console.warn('mock category not found');\r\n }\r\n const route = store.route;\r\n if (!route) {\r\n console.warn('mock route not found');\r\n }\r\n if (category && route) {\r\n const menu = data.menu;\r\n if (menu) {\r\n store.menu = new MockMenuService(menu, store);\r\n }\r\n for (const key in data) {\r\n if (PAGES.includes(key)) {\r\n const service = new MockPageService(data[key] as ICategorized[], store) as IQuerable<IEntity>;\r\n store[key] = service;\r\n }\r\n }\r\n }\r\n } else {\r\n console.warn('mock store not found');\r\n }\r\n staticCollections.forEach(config => {\r\n store[config.slug] = new StaticService(config, store);\r\n });\r\n return store as T;\r\n}\r\n\r\nasync function getStoreData_(): Promise<IMemoryStore> {\r\n if (isDevelopment) {\r\n\r\n const path = require('path');\r\n const directory = 'cwd' in process && typeof process.cwd === 'function' ? process.cwd() : process.env.CWD;\r\n // console.log('directory', directory);\r\n const pathname = path.join(directory, '.mixer', 'store.json');\r\n return (await fsReadJson<IMemoryStore>(pathname) || {});\r\n } else {\r\n const store = process.env.STORE_ || {};\r\n return (typeof store === 'string' ? JSON.parse(store) : store) as IMemoryStore;\r\n }\r\n}\r\n\r\nasync function getMockStore_<T extends IStore = IStore>(): Promise<T> {\r\n const data = await getStoreData_();\r\n const store: IStore = getMockStoreFromData_(data);\r\n return store as T;\r\n}\r\n\r\nexport async function getMockStore<T extends IStore = IStore>(): Promise<T> {\r\n return fromCache<T>(async () => {\r\n if (!isDevelopment) {\r\n console.warn('getMockStore');\r\n }\r\n const store = await getMockStore_<T>();\r\n return store;\r\n }, isDevelopment ? undefined : 'STORE_MOCK_');\r\n}\r\n","import { GlobalQueryParams, IEntity, IEquatable, IPagedResult, IQuerable, JsonService, QueryParams, qsSerialize } from '@websolutespa/bom-core';\r\nimport { StoreStrategy, storeCacheDuration, storeStrategy } from '../store/store';\r\n\r\nexport type ICacheResult<T extends IEntity = IEntity> = T | T[] | IPagedResult<T> | undefined;\r\n\r\nexport type ICache<T extends IEntity = IEntity> = {\r\n timestamp: number;\r\n data: ICacheResult<T>;\r\n};\r\n\r\nexport type InMemoryCacheOptions = {\r\n duration?: number | false;\r\n};\r\n\r\nexport class CachedService<T extends IEntity = IEntity> extends JsonService<T> {\r\n\r\n private service_: IQuerable<T>;\r\n private cache_: Map<string, ICache<T>> = new Map<string, ICache<T>>();\r\n private duration_: number | false = storeCacheDuration;\r\n\r\n constructor(service: IQuerable<T>, options: InMemoryCacheOptions = {}) {\r\n super([]);\r\n if (!service) {\r\n throw new Error('CachedService: service is required');\r\n }\r\n this.service_ = service;\r\n this.duration_ = typeof options.duration !== 'undefined' ? options.duration : this.duration_;\r\n }\r\n\r\n private async fromCache_(callback: () => Promise<ICacheResult<T>>, key?: string): Promise<ICacheResult<T>> {\r\n if (key && this.hasKey_(key)) {\r\n return this.getKey_(key);\r\n } else {\r\n const t = await callback();\r\n if (key && t) {\r\n this.setKey_(key, t);\r\n }\r\n return t;\r\n }\r\n }\r\n\r\n private isExpired_(item: ICache<T>): boolean {\r\n return this.duration_ === false ? true : item.timestamp < (new Date().getTime() - this.duration_);\r\n }\r\n\r\n private hasKey_(key: string): boolean {\r\n const item = this.cache_.get(key);\r\n return item ? (!this.isExpired_(item)) : false;\r\n }\r\n\r\n private getKey_(key: string): ICacheResult<T> {\r\n return this.cache_.get(key)!.data;\r\n }\r\n\r\n private setKey_(key: string, data: ICacheResult<T>) {\r\n this.cache_.set(key, {\r\n timestamp: new Date().getTime(),\r\n data,\r\n });\r\n }\r\n\r\n async findGlobal<B extends T = T>(params: GlobalQueryParams = {}): Promise<B | undefined> {\r\n const serializedParams = qsSerialize(params);\r\n const key = `findGlobal?${serializedParams}`;\r\n return await this.fromCache_(async () => {\r\n return await this.service_.findGlobal(params);\r\n }, key) as B | undefined;\r\n }\r\n\r\n async findOne<B extends T = T>(id: IEquatable, params: QueryParams = {}): Promise<B | undefined> {\r\n const serializedParams = qsSerialize(params);\r\n const key = `findOne[${id}]?${serializedParams}`;\r\n return await this.fromCache_(async () => {\r\n return await this.service_.findOne(id, params);\r\n }, key) as B | undefined;\r\n }\r\n\r\n async findMany<B extends T = T>(params: QueryParams = {}): Promise<B[]> {\r\n if (storeStrategy === StoreStrategy.DecoratedApi) {\r\n const { market, locale, ...otherParams } = params;\r\n const serializedParams = qsSerialize({ market, locale });\r\n const key = `findMany?${serializedParams}`;\r\n let items = await this.fromCache_(async () => {\r\n return await this.service_.findMany({ market, locale });\r\n }, key) as B[];\r\n if (otherParams.where) {\r\n items = this.whereItems_(items, otherParams.where);\r\n }\r\n if (otherParams.sort) {\r\n items = this.sortCollection_(items, otherParams.sort);\r\n }\r\n return items;\r\n } else {\r\n const serializedParams = qsSerialize(params);\r\n const key = `findMany?${serializedParams}`;\r\n return await this.fromCache_(async () => {\r\n return await this.service_.findMany(params);\r\n }, key) as B[];\r\n }\r\n }\r\n\r\n async findPaged<B extends T = T>(params: QueryParams = {}): Promise<IPagedResult<B>> {\r\n const serializedParams = qsSerialize(params);\r\n const key = `findPaged?${serializedParams}`;\r\n return await this.fromCache_(async () => {\r\n return await this.service_.findPaged(params);\r\n }, key) as IPagedResult<B>;\r\n }\r\n\r\n async create<B extends T = T>(payload: Omit<B, 'id'>): Promise<B> {\r\n return await this.service_.create(payload);\r\n }\r\n\r\n async updateOne<B extends T = T>(id: IEquatable, payload: Partial<B>, params: Omit<QueryParams, 'where'> = {}): Promise<B> {\r\n return await this.service_.updateOne(id, payload, params);\r\n }\r\n\r\n async updateMany<B extends T = T>(payload: Partial<B>, params: QueryParams = {}): Promise<B[]> {\r\n return await this.service_.updateMany(payload, params);\r\n }\r\n\r\n async deleteOne<B extends T = T>(id: IEquatable, params: Omit<QueryParams, 'where'> = {}): Promise<B | undefined> {\r\n return await this.service_.deleteOne(id, params);\r\n }\r\n\r\n async deleteMany<B extends T = T>(params: QueryParams = {}): Promise<B[]> {\r\n return await this.service_.deleteMany(params);\r\n }\r\n\r\n // !!! old\r\n\r\n async update<B extends T = T>(payload: Partial<B>): Promise<B> {\r\n return await this.service_.update(payload);\r\n }\r\n\r\n async delete<B extends T = T>(id: IEquatable): Promise<B | undefined> {\r\n return await this.service_.delete(id);\r\n }\r\n\r\n}\r\n","import { GlobalQueryParams, IEntity, IEquatable, IPagedResult, IQuerable, IStore, qsSerialize, QueryParams } from '@websolutespa/bom-core';\r\nimport { getRemoteApiRequestOptions } from '../api/api';\r\nimport { decorateSchema_, decorateSchemas_ } from '../decorators';\r\nimport { remoteApiDelete, remoteApiGet, remoteApiPatch, remoteApiPost } from './remote.api';\r\n\r\n/**\r\n * This service handle call to remote api (bowl or over)\r\n */\r\n\r\nexport class RemoteService<T extends IEntity = IEntity> implements IQuerable<T> {\r\n key: string;\r\n store: IStore;\r\n\r\n constructor(key: string, store: IStore) {\r\n if (!key) {\r\n throw new Error('RemoteService: key is required');\r\n }\r\n if (!store) {\r\n throw new Error('RemoteService: store is required');\r\n }\r\n this.key = key;\r\n this.store = store;\r\n }\r\n\r\n async findGlobal<B extends T = T>(params: GlobalQueryParams = {}, token?: string): Promise<B | undefined> {\r\n params.richText = String(params.richText) === 'true' ? true : false;\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/globals/${this.key}${search}`;\r\n // console.log('RemoteService', this.key, 'findGlobal', url);\r\n try {\r\n const item = await remoteApiGet<B>(url, getRemoteApiRequestOptions(token));\r\n if (item) {\r\n return await this.decorateOne_(item, params);\r\n }\r\n } catch (error) {\r\n console.log('RemoteService', this.key, 'findGlobal.error');\r\n }\r\n return;\r\n }\r\n\r\n async findOne<B extends T = T>(id: IEquatable, params: Omit<QueryParams, 'where'> = {}, token?: string): Promise<B | undefined> {\r\n params.richText = String(params.richText) === 'true' ? true : false;\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}/${encodeURIComponent(id)}${search}`;\r\n // console.log('RemoteService', this.key, 'findOne', url);\r\n try {\r\n console.log('remoteApiGet', url);\r\n const item = await remoteApiGet<B>(url, getRemoteApiRequestOptions(token));\r\n if (item) {\r\n return await this.decorateOne_(item, params);\r\n }\r\n } catch (error) {\r\n console.log('RemoteService', this.key, 'findOne.error');\r\n }\r\n return;\r\n }\r\n\r\n async findMany<B extends T = T>(params: QueryParams = {}, token?: string): Promise<B[]> {\r\n params.richText = String(params.richText) === 'true' ? true : false;\r\n params.pagination = false;\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}${search}`;\r\n // console.log('RemoteService', this.key, 'findMany', url);\r\n const response = await remoteApiGet<B[] | { docs: B[] }>(url, getRemoteApiRequestOptions(token));\r\n const items: B[] = Array.isArray(response) ? response : response.docs;\r\n return await this.decorateMany_(items, params);\r\n }\r\n\r\n async findPaged<B extends T = T>(params: QueryParams = {}, token?: string): Promise<IPagedResult<B>> {\r\n params.richText = String(params.richText) === 'true' ? true : false;\r\n params.pagination = true;\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}${search}`;\r\n // console.log('RemoteService', this.key, 'findPaged', url);\r\n const response = await remoteApiGet<IPagedResult<B>>(url, getRemoteApiRequestOptions(token));\r\n let items: B[] = response.docs;\r\n items = await this.decorateMany_(items, params);\r\n return { ...response, docs: items };\r\n }\r\n\r\n async create<B extends T = T>(payload: Omit<B, 'id'>, params: QueryParams = {}, token?: string): Promise<B> {\r\n params.richText = String(params.richText) === 'true' ? true : false;\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}${search}`;\r\n // console.log('RemoteService', this.key, 'create', url);\r\n const result = await remoteApiPost<B | { doc: B }>(url, payload, getRemoteApiRequestOptions(token));\r\n const item = (result.doc ? result.doc : result) as B;\r\n return await this.decorateOne_(item, {});\r\n }\r\n\r\n async updateOne<B extends T = T>(id: IEquatable, payload: Partial<B>, params: Omit<QueryParams, 'where'> = {}, token?: string): Promise<B> {\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}/${encodeURIComponent(id)}${search}`;\r\n // console.log('RemoteService', this.key, 'updateOne', url);\r\n const result = await remoteApiPatch<B | { doc: B }>(url, payload, getRemoteApiRequestOptions(token));\r\n const item = (result.doc ? result.doc : result) as B;\r\n return await this.decorateOne_(item, {});\r\n }\r\n\r\n async updateMany<B extends T = T>(payload: Partial<B>, params: QueryParams = {}, token?: string): Promise<B[]> {\r\n params.richText = String(params.richText) === 'true' ? true : false;\r\n params.pagination = false;\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}${search}`;\r\n // console.log('RemoteService', this.key, 'updateMany', url);\r\n const response = await remoteApiPatch<B[] | { docs: B[] }>(url, payload, getRemoteApiRequestOptions(token));\r\n const items: B[] = Array.isArray(response) ? response : response.docs;\r\n return await this.decorateMany_(items, params);\r\n }\r\n\r\n async deleteOne<B extends T = T>(id: IEquatable, params: Omit<QueryParams, 'where'> = {}, token?: string): Promise<B | undefined> {\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}/${encodeURIComponent(id)}${search}`;\r\n // console.log('RemoteService', this.key, 'deleteOne', url);\r\n const item = await remoteApiDelete<B>(url, getRemoteApiRequestOptions(token));\r\n return await this.decorateOne_(item, {});\r\n }\r\n\r\n async deleteMany<B extends T = T>(params: QueryParams = {}, token?: string): Promise<B[]> {\r\n params.richText = String(params.richText) === 'true' ? true : false;\r\n params.pagination = false;\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}${search}`;\r\n // console.log('RemoteService', this.key, 'deleteMany', url);\r\n const response = await remoteApiDelete<B[] | { docs: B[] }>(url, getRemoteApiRequestOptions(token));\r\n const items: B[] = Array.isArray(response) ? response : response.docs;\r\n return await this.decorateMany_(items, params);\r\n }\r\n\r\n // !!! old\r\n\r\n async update<B extends T = T>(payload: Partial<B>, params: QueryParams = {}, token?: string): Promise<B> {\r\n const url = `/${this.key}`;\r\n // console.log('RemoteService', this.key, 'update', url);\r\n const result = await remoteApiPatch<B | { doc: B }>(url, payload, getRemoteApiRequestOptions(token));\r\n const item = (result.doc ? result.doc : result) as B;\r\n return await this.decorateOne_(item, {});\r\n }\r\n\r\n async delete<B extends T = T>(id: IEquatable, token?: string): Promise<B | undefined> {\r\n const params = {\r\n where: {\r\n id: {\r\n equals: id,\r\n },\r\n },\r\n };\r\n const query = qsSerialize(params);\r\n const search = query ? `?${query}` : '';\r\n const url = `/${this.key}${search}`;\r\n // console.log('RemoteService', this.key, 'delete', url);\r\n const item = await remoteApiDelete<B>(url, getRemoteApiRequestOptions(token));\r\n return await this.decorateOne_(item, {});\r\n }\r\n\r\n protected async decorateOne_<B extends T = T>(item: B, params: QueryParams = {}): Promise<B> {\r\n let decoratedItem = item;\r\n decoratedItem = await decorateSchema_<B>(this.store, decoratedItem, this.key);\r\n return decoratedItem;\r\n }\r\n\r\n protected async decorateMany_<B extends T = T>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n let decoratedItems = items;\r\n decoratedItems = await decorateSchemas_<B>(this.store, decoratedItems, this.key);\r\n return decoratedItems;\r\n }\r\n}\r\n","import { IEntity, IUndecoratedMenu, QueryParams } from '@websolutespa/bom-core';\r\nimport { decorateLocalizable_, decorateLocalizables_, decorateMenu_, decorateMenus_, decorateSchema_, decorateSchemas_ } from '../decorators';\r\nimport { RemoteService } from './remote.service';\r\n\r\nexport class RemoteMenuService<T extends IEntity = IEntity> extends RemoteService<T> {\r\n\r\n protected override async decorateOne_<B extends T = T>(item: B, params: QueryParams = {}): Promise<B> {\r\n const store = this.store;\r\n let decoratedItem = item;\r\n decoratedItem = await decorateSchema_<B>(store, decoratedItem, this.key);\r\n decoratedItem = await decorateLocalizable_<B>(item, params);\r\n if (params.market && params.locale) {\r\n decoratedItem = await decorateMenu_(store, decoratedItem as IUndecoratedMenu, {\r\n market: params.market,\r\n locale: params.locale,\r\n }) as any;\r\n }\r\n return decoratedItem;\r\n }\r\n\r\n protected override async decorateMany_<B extends T = T>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n const store = this.store;\r\n let decoratedItems = items;\r\n decoratedItems = await decorateSchemas_<B>(store, decoratedItems, this.key);\r\n decoratedItems = await decorateLocalizables_<B>(items, params);\r\n if (params.market && params.locale) {\r\n decoratedItems = await decorateMenus_(store, decoratedItems as IUndecoratedMenu[], {\r\n market: params.market,\r\n locale: params.locale,\r\n }) as any[];\r\n }\r\n return decoratedItems;\r\n }\r\n\r\n}\r\n","import { ICategorized, QueryParams } from '@websolutespa/bom-core';\r\nimport { decorateCategories_, decorateCategory_, decorateHref_, decorateHrefs_, decorateNav_, decorateRelation_, decorateSchema_, decorateSchemas_ } from '../decorators';\r\nimport { RemoteService } from './remote.service';\r\n\r\nexport class RemotePageService<T extends ICategorized = ICategorized> extends RemoteService<T> {\r\n\r\n protected override async decorateOne_<B extends T = T>(item: B, params: QueryParams = {}): Promise<B> {\r\n const store = this.store;\r\n let decoratedItem = item;\r\n decoratedItem = await decorateSchema_<B>(store, decoratedItem, this.key);\r\n decoratedItem = await decorateCategory_<B>(store, decoratedItem, params);\r\n decoratedItem = await decorateHref_<B>(store, decoratedItem, params);\r\n decoratedItem = await decorateNav_<B>(store, decoratedItem, params);\r\n decoratedItem = await decorateRelation_<B>(store, decoratedItem, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n return decoratedItem;\r\n }\r\n\r\n protected override async decorateMany_<B extends T = T>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n const store = this.store;\r\n let decoratedItems = items;\r\n // decoratedItems = await optimizeMany_<B>(decoratedItems);\r\n decoratedItems = await decorateSchemas_<B>(store, decoratedItems, this.key);\r\n decoratedItems = await decorateCategories_<B>(store, decoratedItems, params);\r\n decoratedItems = await decorateHrefs_<B>(store, decoratedItems, params);\r\n /*\r\n // !!! optimization for index listing\r\n decoratedItems = await decorateNavs_<B>(store, decoratedItems, params);\r\n decoratedItems = await decorateRelations_<B>(store, decoratedItems, {\r\n market: params.market,\r\n locale: params.locale,\r\n depth: params.depth,\r\n });\r\n */\r\n return decoratedItems;\r\n }\r\n\r\n}\r\n","import { IMemoryStore, IQuerable, IStore } from '@websolutespa/bom-core';\r\nimport { fromCache } from '../cache/cache.service';\r\nimport { CachedService } from '../cached/cached.service';\r\nimport { getMockStore, getMockStoreFromData_ } from '../mock/mock.store';\r\nimport { COLLECTIONS, KNOWN_COLLECTIONS, MOCK_COLLECTIONS, NextPhase, StoreStrategy, buildStrategy, nextPhase, storeStrategy } from '../store/store';\r\nimport { RemoteMenuService } from './remote-menu.service';\r\nimport { RemotePageService } from './remote-page.service';\r\nimport { remoteApiGet } from './remote.api';\r\nimport { RemoteService } from './remote.service';\r\n\r\nconst PAGES: string[] = process.env.PAGES ? process.env.PAGES.split(',') : [];\r\n\r\nasync function getRemoteStore_<T extends IStore>(): Promise<T> {\r\n return fromCache<T>(async () => {\r\n // console.log('getRemoteStore_');\r\n if (COLLECTIONS.length === 0) {\r\n console.error('RemoteStore.getRemoteStore_ no collections');\r\n throw ('RemoteStore.getRemoteStore_ no collections');\r\n }\r\n let mockStore: IStore = {};\r\n if (MOCK_COLLECTIONS.length > 0) {\r\n mockStore = await getMockStore<T>();\r\n }\r\n const store: IStore = {};\r\n COLLECTIONS.sort();\r\n COLLECTIONS.forEach(key => {\r\n if (MOCK_COLLECTIONS.includes(key)) {\r\n store[key] = mockStore[key]!;\r\n } else if (PAGES.includes(key) && storeStrategy === StoreStrategy.DecoratedApi) {\r\n store[key] = new RemotePageService(key, store) as IQuerable;\r\n } else if (key === 'menu' && storeStrategy === StoreStrategy.DecoratedApi) {\r\n store[key] = new CachedService(\r\n new RemoteMenuService(key, store)\r\n );\r\n } else if (KNOWN_COLLECTIONS.includes(key)) {\r\n store[key] = new CachedService(\r\n new RemoteService(key, store)\r\n );\r\n } else {\r\n store[key] = new RemoteService(key, store);\r\n }\r\n });\r\n return store as T;\r\n }, 'STORE_RUNTIME_');\r\n // }, isDevelopment ? undefined : 'STORE_RUNTIME_');\r\n}\r\n\r\nasync function getRemoteStoreStaticBuild_<T extends IStore>(): Promise<T> {\r\n return fromCache<T>(async () => {\r\n console.log('getRemoteStoreStaticBuild_');\r\n let store: IStore = {};\r\n const url = `/store?strategy=${buildStrategy}`;\r\n const json = await remoteApiGet<IMemoryStore>(url);\r\n if (json != null) {\r\n const data = Object.fromEntries(\r\n COLLECTIONS.map(key => ([key, json[key] || []]))\r\n );\r\n store = getMockStoreFromData_(data);\r\n }\r\n return store as T;\r\n }, 'STORE_BUILD_');\r\n}\r\n\r\nasync function getRemoteStoreRuntimeBuild_<T extends IStore>(): Promise<T> {\r\n return fromCache<T>(async () => {\r\n console.log('getRemoteStoreRuntimeBuild_');\r\n const data: IMemoryStore = {};\r\n COLLECTIONS.forEach(key => {\r\n data[key] = [];\r\n });\r\n const store = getMockStoreFromData_(data);\r\n return store as T;\r\n }, 'STORE_RUNTIME_BUILD_');\r\n}\r\n\r\nexport async function getRemoteStore<T extends IStore>(): Promise<T> {\r\n if (nextPhase === NextPhase.ProductionBuild) {\r\n /*\r\n if (buildStrategy === BuildStrategy.Runtime) {\r\n return await getRemoteStoreRuntimeBuild_();\r\n } else {\r\n return await getRemoteStoreStaticBuild_();\r\n }\r\n */\r\n return await getRemoteStoreStaticBuild_();\r\n } else {\r\n return await getRemoteStore_();\r\n }\r\n}\r\n","import { IStore } from '@websolutespa/bom-core';\r\n// import { getLocalStore } from '../local_/local.store';\r\nimport { getMockStore } from '../mock/mock.store';\r\nimport { getRemoteStore } from '../remote/remote.store';\r\nimport { StoreStrategy, storeStrategy } from './store';\r\n\r\nexport async function getStore<T extends IStore>(): Promise<T> {\r\n // console.trace('getStore', storeStrategy);\r\n switch (storeStrategy) {\r\n case StoreStrategy.Mock:\r\n return await getMockStore<T>();\r\n /*\r\n case StoreStrategy.Local:\r\n return await getLocalStore<T>();\r\n */\r\n default:\r\n return await getRemoteStore<T>();\r\n }\r\n}\r\n","import { IEntity, IRedirect, IRoute, IStore, asEquatable, defaultLocale, defaultMarket, qsDeserialize } from '@websolutespa/bom-core';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { apiHandler } from '../api/api.handler';\r\nimport { getSessionToken } from '../session/session.service';\r\nimport { COLLECTIONS } from './store';\r\nimport { getStore } from './store.service';\r\n\r\n/*\r\n* storeHandler contains generic local api CRUD handlers of next app\r\n* it could serve both api or mock data\r\n*/\r\n\r\nexport function storeHandler<T extends IStore>(storePromise: () => Promise<T> = async () => await getStore<T>()) {\r\n return apiHandler({\r\n get: collectionGet(storePromise),\r\n post: collectionPost(storePromise),\r\n patch: collectionPatch(storePromise),\r\n delete: collectionDelete(storePromise),\r\n });\r\n}\r\n\r\n// find a specific document by id or\r\n// find paginated documents\r\nexport function collectionGet<T extends IStore>(storePromise: () => Promise<T>) {\r\n return async (request: NextApiRequest, response: NextApiResponse) => {\r\n try {\r\n const { collections, ...query } = request.query;\r\n // console.log('query', query);\r\n if (!Array.isArray(collections) || collections?.length === 0) {\r\n console.error('storeHandler.collectionGet', 'method not allowed', collections);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const collection: string = collections[0]!;\r\n const id: string = collections[1]!;\r\n const qs = Object.entries(query).map(kv => kv.join('=')).join('&');\r\n const params = qsDeserialize(qs);\r\n // console.log('params', params);\r\n if (!COLLECTIONS.includes(collection)) {\r\n console.error('storeHandler.collectionGet', 'method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const store = await storePromise();\r\n const service = store[collection];\r\n if (!service) {\r\n console.error('storeHandler.collectionGet', 'method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const token = await getSessionToken(request, response);\r\n // find a specific document by id\r\n if (id) {\r\n // console.log('storeHandler.collectionGet', collection, id, params);\r\n const item = await service.findOne(asEquatable(id), params, token);\r\n if (item) {\r\n return response.status(200).json(item);\r\n } else {\r\n return response.status(404).send('not found');\r\n }\r\n // find paginated documents\r\n } else if (String(params.pagination) === 'true') {\r\n // console.log('storeHandler.collectionGet', collection, params);\r\n const pagination = await service.findPaged(params, token);\r\n return response.status(200).json(pagination);\r\n } else {\r\n // console.log('storeHandler.collectionGet', collection, params);\r\n const items = await service.findMany(params, token);\r\n return response.status(200).json(items);\r\n }\r\n } catch (error: any) {\r\n console.error('storeHandler.collectionGet.error', '500', error);\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n// create a new document + post route\r\nexport function collectionPost<T extends IStore>(storePromise: () => Promise<T>) {\r\n return async (request: NextApiRequest, response: NextApiResponse) => {\r\n try {\r\n const { collections, ...query } = request.query;\r\n if (!Array.isArray(collections) || collections.length !== 1) {\r\n console.error('method not allowed', collections);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const collection: string = collections[0]!;\r\n const id: string = collections[1]!;\r\n if (id) {\r\n console.error('method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const qs = Object.entries(query).map(kv => kv.join('=')).join('&');\r\n const params = qsDeserialize(qs);\r\n const store = await storePromise();\r\n const service = store[collection];\r\n if (!service) {\r\n console.error('method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n // api post route pathname\r\n if (collection === 'route') {\r\n return routePost(store, request, response);\r\n }\r\n const token = await getSessionToken(request, response);\r\n const payload: Omit<IEntity, 'id'> = request.body;\r\n const item = await service.create(payload, params, token);\r\n return response.status(200).json(item);\r\n } catch (error: any) {\r\n console.error('storeHandler.error.500', error);\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n// update a document by id\r\nexport function collectionPatch<T extends IStore>(storePromise: () => Promise<T>) {\r\n return async (request: NextApiRequest, response: NextApiResponse) => {\r\n try {\r\n const { collections, ...query } = request.query;\r\n // console.log('query', query);\r\n if (!Array.isArray(collections) || collections?.length === 0) {\r\n console.error('storeHandler.collectionUpdate', 'method not allowed', collections);\r\n return response.status(405).send('method not allowed');\r\n }\r\n if (!Array.isArray(collections) || collections.length !== 2) {\r\n console.error('method not allowed', collections);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const collection: string = collections[0]!;\r\n const id: string = collections[1]!;\r\n const qs = Object.entries(query).map(kv => kv.join('=')).join('&');\r\n const params = qsDeserialize(qs);\r\n // console.log('params', params);\r\n if (!COLLECTIONS.includes(collection)) {\r\n console.error('storeHandler.collectionUpdate', 'method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const store = await storePromise();\r\n const service = store[collection];\r\n if (!service) {\r\n console.error('storeHandler.collectionUpdate', 'method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const token = await getSessionToken(request, response);\r\n const payload: Partial<IEntity> = request.body;\r\n // update a specific document by id\r\n if (id) {\r\n // console.log('storeHandler.collectionUpdate', collection, id, params);\r\n const item = await service.updateOne(asEquatable(id), payload, params, token);\r\n if (item) {\r\n return response.status(200).json(item);\r\n } else {\r\n return response.status(404).send('not found');\r\n }\r\n } else {\r\n // console.log('storeHandler.collectionUpdate', collection, params);\r\n const items = await service.updateMany(payload, params, token);\r\n return response.status(200).json(items);\r\n }\r\n } catch (error: any) {\r\n console.error('storeHandler.error.500', error);\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n// delete an existing document by id\r\nexport function collectionDelete<T extends IStore>(storePromise: () => Promise<T>) {\r\n return async (request: NextApiRequest, response: NextApiResponse) => {\r\n try {\r\n const { collections, ...query } = request.query;\r\n // console.log('query', query);\r\n if (!Array.isArray(collections) || collections?.length === 0) {\r\n console.error('storeHandler.collectionDelete', 'method not allowed', collections);\r\n return response.status(405).send('method not allowed');\r\n }\r\n if (!Array.isArray(collections) || collections.length !== 2) {\r\n console.error('method not allowed', collections);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const collection: string = collections[0]!;\r\n const id: string = collections[1]!;\r\n const qs = Object.entries(query).map(kv => kv.join('=')).join('&');\r\n const params = qsDeserialize(qs);\r\n // console.log('params', params);\r\n if (!COLLECTIONS.includes(collection)) {\r\n console.error('storeHandler.collectionDelete', 'method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const store = await storePromise();\r\n const service = store[collection];\r\n if (!service) {\r\n console.error('storeHandler.collectionDelete', 'method not allowed', collection);\r\n return response.status(405).send('method not allowed');\r\n }\r\n const token = await getSessionToken(request, response);\r\n // delete a specific document by id\r\n if (id) {\r\n // console.log('storeHandler.collectionDelete', collection, id, params);\r\n const item = await service.deleteOne(asEquatable(id), params, token);\r\n if (item) {\r\n return response.status(200).json(item);\r\n } else {\r\n return response.status(404).send('not found');\r\n }\r\n } else {\r\n // console.log('storeHandler.collectionDelete', collection, params);\r\n const items = await service.deleteMany(params, token);\r\n return response.status(200).json(items);\r\n }\r\n } catch (error: any) {\r\n console.error('storeHandler.error.500', error);\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n// route post resolver\r\n// !!! todo, should be moved to models -> route service\r\nexport async function routePost(store: IStore, request: NextApiRequest, response: NextApiResponse) {\r\n try {\r\n const { pathname, href, hrefBeforeRedirect } = request.body;\r\n console.log('routePost', pathname, href, hrefBeforeRedirect);\r\n if (pathname && href) {\r\n const route = await findRoute(store, pathname, href, hrefBeforeRedirect);\r\n return response.status(200).json(route);\r\n } else {\r\n return response.status(400).send('bad request');\r\n }\r\n } catch (error: any) {\r\n if (error.status < 500) {\r\n if (error.status < 400) {\r\n return response.status(error.status).send({\r\n redirectUrl: error.redirectUrl,\r\n });\r\n }\r\n if (error.status === 404) {\r\n return response.status(404).send('not found');\r\n } else {\r\n return response.status(error.status).send('gone');\r\n }\r\n } else {\r\n console.error('storeHandler.error.500', error);\r\n throw error;\r\n }\r\n }\r\n}\r\n\r\n/*\r\n* storeIndexHandler contains a list of all the generic local api CRUD handlers of next app\r\n*/\r\nexport function storeIndexHandler() {\r\n return apiHandler({\r\n get: async (request: NextApiRequest, response: NextApiResponse) => {\r\n try {\r\n const market = defaultMarket;\r\n const locale = defaultLocale;\r\n if (!Array.isArray(COLLECTIONS) || COLLECTIONS?.length === 0) {\r\n console.error('apiHome.collectionGet', 'collections not found', COLLECTIONS);\r\n return response.status(405).send('method not allowed');\r\n }\r\n COLLECTIONS.sort((a, b) => a.localeCompare(b));\r\n response.setHeader('Content-Type', 'text/html; charset=UTF-8');\r\n response.setHeader('X-Frame-Options', 'SAMEORIGIN');\r\n response.setHeader('X-Robots-Tag', 'noindex, follow');\r\n return response.status(200).send(`\r\n <html>\r\n <head>\r\n <title>REST Api</title>\r\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n <style type=\"text/css\">\r\n html {\r\n padding: 0;\r\n background: #09090A;\r\n color: #fefefe;\r\n }\r\n body {\r\n padding: 15px;\r\n font-family: Inter,-apple-system,'Helvetica Neue','Segoe UI',Roboto,Arial,'Noto Sans',sans-serif;\r\n font-size: 13px;\r\n background: #09090A;\r\n color: #fefefe;\r\n }\r\n .container {\r\n margin: 0 auto;\r\n max-width: 1280px;\r\n }\r\n a {\r\n color: #fefefe;\r\n text-decoration: none;\r\n }\r\n a:visited {\r\n color: #9e9e9e;\r\n }\r\n a:hover {\r\n text-decoration: underline;\r\n }\r\n table {\r\n width: 100%;\r\n margin: 10px 0;\r\n border: none;\r\n border-collapse: collapse;\r\n }\r\n td,\r\n th {\r\n text-align: left;\r\n font-size: 12px;\r\n padding: 3px;\r\n }\r\n th:not(:last-child),\r\n td:not(:last-child) {\r\n padding-right: 30px;\r\n }\r\n thead th {\r\n border-bottom: 1px solid #0e0e0f;\r\n }\r\n #table tr:nth-child(odd) td {\r\n background-color: #0e0e0f;\r\n }\r\n #table tbody tr:hover td {\r\n background-color: #1A1A1B;\r\n }\r\n #table tbody tr:hover td,\r\n #table tbody tr:hover td a {\r\n color: #fefefe;\r\n }\r\n .wysiwyg {\r\n margin: 0;\r\n padding: 0 0 10px 0;\r\n line-height: 1.2em;\r\n }\r\n .wysiwyg a {\r\n color: #00ea4e;\r\n font-weight: 600;\r\n }\r\n .wysiwyg a:visited {\r\n color: #00ea4e;\r\n }\r\n </style>\r\n </head>\r\n <body>\r\n <div class=\"container\">\r\n <h1>REST API</h1>\r\n <p class=\"wysiwyg\">\r\n This is the REST Api generated by <a href=\"https://github.com/websolutespa/bom\" target=\"_blank\" rel=\"noopener\">Mixer</a>.\r\n </p>\r\n <p class=\"wysiwyg\">\r\n It contains a list of all the generic local api CRUD handlers of Mixer app. <br />\r\n All methods should be called with market and locale parameters.\r\n </p>\r\n <table id=\"table\" cellpadding=\"3\">\r\n <thead>\r\n <tr>\r\n <th width=\"150px\">Method</th>\r\n <th width=\"150px\">Collection</th>\r\n <th>Endpoint</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n ${COLLECTIONS.map(c => (`\r\n <tr>\r\n <td>GET, POST, PATCH</td>\r\n <td>${c}</td>\r\n <td><a href=\"/api/${c}?market=${market}&locale=${locale}\">/api/${c}</a></td>\r\n </tr>\r\n <tr>\r\n <td>GET, DELETE</td>\r\n <td>${c}</td>\r\n <td><a href=\"/api/${c}/{id}?market=${market}&locale=${locale}\">/api/${c}/{id}</a></td>\r\n </tr>\r\n `)).join('\\n')}\r\n\t\t\t\t\t </tbody>\r\n </table>\r\n </div>\r\n </body>\r\n `);\r\n } catch (error: any) {\r\n console.error('storeHandler.collectionGet.error', '500', error);\r\n throw error;\r\n }\r\n },\r\n });\r\n}\r\n\r\nconst trimTerminalSlash = (path: string) => {\r\n return path.replace(/\\/+$/, '');\r\n};\r\n\r\nconst sanitizeHref = (url: URL, urlBeforeRedirect: URL | null) => {\r\n if (urlBeforeRedirect) {\r\n const sanitizedUrl = new URL(urlBeforeRedirect);\r\n sanitizedUrl.protocol = url.protocol;\r\n return trimTerminalSlash(sanitizedUrl.href);\r\n } else {\r\n return trimTerminalSlash(url.href);\r\n }\r\n};\r\n\r\nconst sanitizeRedirectFrom = (path: string, url: URL, urlBeforeRedirect: URL | null) => {\r\n path = trimTerminalSlash(path);\r\n if (urlBeforeRedirect) {\r\n return path.replace(/^(\\^?)((https?:\\/\\/)+)/, `$1${url.protocol}//`);\r\n } else {\r\n return path.replace(/^(\\^?)((https?:\\/\\/)+(\\w|\\.|:)+)/, `$1${url.origin}`);\r\n }\r\n};\r\n\r\nconst sanitizeRedirectTo = (path?: string) => {\r\n return path ? trimTerminalSlash(path) : undefined;\r\n};\r\n\r\nconst sanitizeRedirectUrl = (path: string | undefined, url: URL) => {\r\n if (path != null) {\r\n path = trimTerminalSlash(path);\r\n return path.match(/^((https?:\\/\\/)+)/) ? path : `${url.origin}${path}`;\r\n } else {\r\n return path;\r\n }\r\n};\r\n\r\nexport async function findRoute(store: IStore, pathname: string, href: string, hrefBeforeRedirect: string | null): Promise<IRoute | undefined> {\r\n // here we use findMany because route id would break api url\r\n const routes = await store.route!.findMany<IRoute>({\r\n where: {\r\n id: {\r\n equals: pathname,\r\n },\r\n },\r\n });\r\n // console.log('routes', routes);\r\n // console.log('pathname', pathname);\r\n if (routes.length > 0) {\r\n return routes[0];\r\n } else {\r\n // exact route match not found\r\n // let's try if match splat routes\r\n const splatRoutes = await store.route!.findMany<IRoute>({\r\n where: {\r\n useSplat: {\r\n equals: true,\r\n },\r\n },\r\n });\r\n // find best match splat route\r\n const splatRoute = splatRoutes.reduce((p: (IRoute & { splat: string }) | undefined, c: IRoute) => {\r\n const match = pathname.indexOf(c.id) === 0;\r\n if (match && (!p || p.id.length < c.id.length)) {\r\n return { ...c, splat: pathname.substring(c.id.length, pathname.length) };\r\n } else {\r\n return p;\r\n }\r\n }, undefined);\r\n if (splatRoute) {\r\n return splatRoute;\r\n }\r\n const url = new URL(href);\r\n const urlBeforeRedirect = hrefBeforeRedirect ? new URL(hrefBeforeRedirect) : null;\r\n const sanitizedHref = sanitizeHref(url, urlBeforeRedirect);\r\n /*\r\n console.log('href', url.href);\r\n console.log('hrefBeforeRedirect', urlBeforeRedirect?.href);\r\n console.log('sanitizedHref', sanitizedHref);\r\n */\r\n // collect redirects\r\n let redirects = await store.redirect!.findMany<IRedirect>({\r\n where: {\r\n isActive: {\r\n equals: true,\r\n },\r\n },\r\n });\r\n redirects = redirects.map(x => ({\r\n ...x,\r\n from: sanitizeRedirectFrom(x.from, url, urlBeforeRedirect),\r\n to: sanitizeRedirectTo(x.to),\r\n }));\r\n // redirects.sort((a, b) => a.order - b.order);\r\n // console.log('findRoute redirects', redirects);\r\n // exact match redirect resolver\r\n const exactMatchResolver = (redirect: IRedirect) => {\r\n const status: number = parseInt(redirect.status) || 307;\r\n if (status < 400) {\r\n const redirectUrl = sanitizeRedirectUrl(redirect.to, url);\r\n // console.log('>>>>>>>>>> findRoute exactMatchResolver', status, redirectUrl, redirect.to);\r\n throw { status, redirectUrl };\r\n } else {\r\n throw { status };\r\n }\r\n };\r\n // check exact match redirects\r\n const exactMatchRedirect = redirects.find(x => x.from === sanitizedHref);\r\n if (exactMatchRedirect !== undefined) {\r\n return exactMatchResolver(exactMatchRedirect);\r\n }\r\n // pattern match redirect resolver\r\n const patternMatchResolver = (redirect: IRedirect) => {\r\n const status: number = parseInt(redirect.status) || 307;\r\n if (status < 400) {\r\n const regexp = new RegExp(redirect.from);\r\n let i = 0;\r\n let redirectUrl = (redirect.to as string).replace(/\\*/g, (...rest) => {\r\n return `$${++i}`;\r\n });\r\n redirectUrl = sanitizedHref.replace(regexp, redirectUrl);\r\n redirectUrl = sanitizeRedirectUrl(redirectUrl, url) as string;\r\n // console.log('>>>>>>>>>> findRoute patternMatchResolver', status, redirectUrl, redirect.to);\r\n throw { status, redirectUrl };\r\n } else {\r\n throw { status };\r\n }\r\n };\r\n // check redirects by pattern\r\n redirects.forEach(x => {\r\n let expression = x.from;\r\n // wrapping catchall in (.*)\r\n expression = expression.replace(/\\*(?!\\))/g, '(.*)');\r\n // wrapping expression in ^...$\r\n expression = `^${expression.replace(/(^\\^)|(\\$$)/g, '')}$`;\r\n x.from = expression;\r\n });\r\n // check if a regex pattern redirect does match\r\n const firstMatch = redirects.find(x => sanitizedHref.match(x.from));\r\n // console.log('>>>>>>>>>> findRoute firstMatch', firstMatch);\r\n if (firstMatch) {\r\n return patternMatchResolver(firstMatch);\r\n }\r\n throw { status: 404 };\r\n }\r\n}\r\n","import { storeHandler } from '../store/store.handler';\r\nimport { getMockStore } from './mock.store';\r\n\r\nexport function mockHandler() {\r\n return storeHandler(async () => await getMockStore());\r\n}\r\n","import { NextApiRequest, NextApiResponse } from 'next';\r\nimport { apiHandler } from '../api/api.handler';\r\n\r\nexport function previewHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n get: async (request: NextApiRequest, response: NextApiResponse) => {\r\n const query = request.query as {\r\n marketId: string;\r\n localeId: string;\r\n templateId: string;\r\n documentId: string;\r\n _status: 'published' | 'draft';\r\n _live: string;\r\n _token: string;\r\n };\r\n const { marketId, localeId, templateId, documentId, _status } = query;\r\n const destination = `/${marketId}/${localeId}/${templateId}/${documentId}${query._live ? '?_live=true' : ''}`;\r\n response.setPreviewData({ _status });\r\n response.setDraftMode({ enable: true });\r\n response.redirect(307, destination);\r\n },\r\n });\r\n}\r\n","import { IApp, IAppExtended, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getApp<T extends IAppExtended = IAppExtended>(params: QueryParams = {}): Promise<IApp<T> | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.app.findGlobal(params);\r\n return item as IApp<T>;\r\n}\r\n","import { IEquatable, ILabel, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getLabels(params: QueryParams = {}): Promise<ILabel[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.label!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getLabel(id: IEquatable, params: QueryParams = {}): Promise<ILabel | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.label!.findOne(id, params);\r\n return item;\r\n}\r\n\r\nexport function resolveLabel(labels: ILabel[], id: string): string {\r\n const label = labels.find(x => x.id === id);\r\n return label && label.text ? label.text.toString() : id;\r\n}\r\n\r\n/*\r\nexport function localizedLabel(labels: Label[], id: string, locale: string, defaultLocale: string): Promise<Label> {\r\n const label = labels.find(x => x.id === id);\r\n if (label) {\r\n return store.localizeValue(label, locale, defaultLocale);\r\n }\r\n}\r\n*/\r\n","import { IEquatable, ILocale, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getLocales(params: QueryParams = {}): Promise<ILocale[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.locale!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getLocale(id: IEquatable, params: QueryParams = {}): Promise<ILocale | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.locale!.findOne(id, params);\r\n return item;\r\n}\r\n","import { IEquatable, IMarket, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getMarkets(params: QueryParams = {}): Promise<IMarket[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.market!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getMarket(id: IEquatable, params: QueryParams = {}): Promise<IMarket | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.market!.findOne(id, params);\r\n return item;\r\n}\r\n","import { IEquatable, IMenu, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getMenus(params: QueryParams = {}): Promise<IMenu[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.menu!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getMenu(id: IEquatable, params: QueryParams = {}): Promise<IMenu | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.menu!.findOne(id, params);\r\n return item;\r\n}\r\n","import { asCategoryId, findRouteOfCategory, getRootCategory, ICategory, IRoute, IRouteLink, localize } from '@websolutespa/bom-core';\r\n\r\nexport type StaticPath = { params: { [key: string]: string } };\r\n\r\nexport function categoryToRouteLink(routes: IRoute[], categories: ICategory[], category: ICategory, locale: string): IRouteLink | undefined {\r\n const route = findRouteOfCategory(routes, category.id);\r\n if (!route) {\r\n return undefined;\r\n }\r\n const rootCategory = getRootCategory(categories);\r\n const childCategories = categories.filter(x => {\r\n const parentId = asCategoryId(x.category);\r\n return rootCategory && rootCategory.id === category.id ?\r\n (x.id !== rootCategory.id && (parentId === category.id || !parentId)) :\r\n parentId === category.id;\r\n });\r\n // console.log('childCategories', category.id, childCategories);\r\n const routeLink = newRouteLink(category, route, locale);\r\n // console.log('categoryToRouteLink', href, category.id, route);\r\n routeLink.items = childCategories\r\n .map(x => categoryToRouteLink(routes, categories, x, locale))\r\n .filter(x => x !== undefined) as IRouteLink[];\r\n return routeLink;\r\n}\r\n\r\nexport function newRouteLink(category: ICategory, route: IRoute | undefined, locale: string): IRouteLink {\r\n const href = (route && route.id) ? route.id.toString() : '/';\r\n const id = route?.page || category.id;\r\n const media = category.media || route?.media;\r\n const schema = route?.template || route?.schema || category?.schema || 'unknown';\r\n const title = localize(category.title || route?.title || 'untitled', locale);\r\n const routeLink = {\r\n category: category.id,\r\n href,\r\n id,\r\n items: [],\r\n media,\r\n schema,\r\n title,\r\n };\r\n return routeLink;\r\n}\r\n\r\nexport function routeToRouteLink(route: IRoute): IRouteLink {\r\n const routeLink: IRouteLink = {\r\n category: asCategoryId(route.category),\r\n href: route.id,\r\n id: route.page,\r\n items: [],\r\n media: route.media,\r\n schema: route.schema,\r\n title: route.title,\r\n };\r\n return routeLink;\r\n}\r\n\r\nexport function resolveRoute(route: IRoute & { splat?: string }) {\r\n // console.log('resolveRoute', route);\r\n const routepath: string = route.template || route.schema;\r\n // convert route to next.js pages folder schema\r\n const resolvedPathname = `/${route.market}/${route.locale}/${routepath}/${route.page}${route.splat || ''}`;\r\n // console.log('resolveRoute', route.schema, resolvedPathname);\r\n return resolvedPathname;\r\n}\r\n","import { asCategoryId, defaultLocale, defaultMarket, findRouteOfCategory, getRootCategory, ICategory, IRoute, IRouteLink, QueryParams } from '@websolutespa/bom-core';\r\nimport { buildStrategy, BuildStrategy, StoreStrategy, storeStrategy } from '@websolutespa/bom-mixer-store';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\nimport { newRouteLink, routeToRouteLink } from './route';\r\n\r\nexport type StaticPath = { params: { [key: string]: string } };\r\n\r\nexport async function getRoutes(params: QueryParams = {}): Promise<IRoute[]> {\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany(params);\r\n return routes;\r\n}\r\n\r\nexport async function getRoute(id: string): Promise<IRoute | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const route = await store.route!.findOne(id);\r\n // console.log('RouteService.getRoute', id, '->', route);\r\n return route;\r\n}\r\n\r\nexport async function getRoutesForSchemas(schemas: string[], market?: string, locale?: string): Promise<{ [key: string]: string; }> {\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany({\r\n where: {\r\n schema: {\r\n in: schemas,\r\n },\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n const items: {\r\n [key: string]: string;\r\n } = {};\r\n routes.forEach(route => {\r\n items[route.schema] = route.id;\r\n });\r\n return items;\r\n}\r\n\r\nexport async function getRoutesForTemplates(templates: string[], market?: string, locale?: string): Promise<{ [key: string]: string; }> {\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany({\r\n where: {\r\n template: {\r\n in: templates,\r\n },\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n const items: {\r\n [key: string]: string;\r\n } = {};\r\n routes.forEach(route => {\r\n if (route.template) {\r\n items[route.template] = route.id;\r\n }\r\n });\r\n return items;\r\n}\r\n\r\nexport async function getStaticPathsForSchema(\r\n schema: string,\r\n template?: string\r\n): Promise<StaticPath[]> {\r\n if (buildStrategy === BuildStrategy.Runtime) {\r\n return [];\r\n }\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany({\r\n where: template ? ({\r\n and: [{\r\n template: {\r\n equals: template,\r\n },\r\n }, {\r\n schema: {\r\n equals: schema,\r\n },\r\n }],\r\n }) : ({\r\n schema: {\r\n equals: schema,\r\n },\r\n }),\r\n });\r\n return routes.map((x: any) => ({ params: { id: x.page.toString(), market: x.market, locale: x.locale } }));\r\n}\r\n\r\nexport async function getStaticPathsForSchemaAndFallback(\r\n schema: string,\r\n fallback: 'blocking' | true | false = 'blocking',\r\n template?: string\r\n) {\r\n if (\r\n buildStrategy === BuildStrategy.Runtime ||\r\n (fallback === 'blocking' && storeStrategy !== StoreStrategy.Mock)\r\n ) {\r\n return { paths: [], fallback };\r\n }\r\n const paths = await getStaticPathsForSchema(schema, template);\r\n return {\r\n paths,\r\n fallback,\r\n // fallback: 'blocking', // runs before initial render\r\n // fallback: true, // runs in the background\r\n };\r\n}\r\n\r\nexport async function getBreadcrumbFromSegments(segments: ICategory[], route: IRoute): Promise<IRouteLink[]> {\r\n const market = route.market || defaultMarket;\r\n const locale = route.locale || defaultLocale;\r\n const routes: IRoute[] = await getRoutes({\r\n where: {\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n const tree: IRouteLink[] = segments.map(segment => {\r\n const route = findRouteOfCategory(routes, segment.id);\r\n return {\r\n segment,\r\n route,\r\n };\r\n }).filter(x => Boolean(x.route)).map(x => {\r\n const category = x.segment;\r\n const route = x.route;\r\n // console.log(route, category);\r\n const routeLink = newRouteLink(category, route, locale);\r\n return routeLink;\r\n });\r\n if (!route.isDefault) {\r\n tree.push(routeToRouteLink(route));\r\n }\r\n // console.log(tree);\r\n return tree;\r\n}\r\n\r\nexport async function getRouteLinkTree(market: string, locale: string): Promise<IRouteLink | undefined> {\r\n const store = await getStore<IModelStore>();\r\n // console.log('getRouteLinkTree.store', store);\r\n const routes = await store.route!.findMany({\r\n where: {\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n // console.log('getRouteLinkTree.routes', routes.map(x => x.id));\r\n const categories = await store.category!.findMany({ market, locale });\r\n // console.log('getRouteLinkTree.categories', categories.map(x => x.id));\r\n const rootCategory = getRootCategory(categories);\r\n // console.log('getRouteLinkTree.rootCategory', rootCategory?.id);\r\n if (rootCategory) {\r\n const root = getRouteLinkCategory(locale, routes, categories, rootCategory, rootCategory);\r\n // console.log('getRouteLinkTree', root);\r\n return root as IRouteLink;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getRouteLinkCategory(\r\n locale: string,\r\n routes: IRoute[],\r\n categories: ICategory[],\r\n rootCategory: ICategory,\r\n category: ICategory\r\n): IRouteLink | IRouteLink[] | undefined {\r\n const route = findRouteOfCategory(routes, category.id);\r\n const otherCategories = categories.filter(x => x.id !== category.id);\r\n const childCategories = otherCategories.filter(x => asCategoryId(x.category) === category.id);\r\n // console.log('childCategories', category.id, childCategories.map(x => x.id));\r\n const routeLink = newRouteLink(category, route, locale);\r\n // console.log('getRouteLinkCategory', href, category.id, route);\r\n const items: IRouteLink[] = [];\r\n for (const childCategory of childCategories) {\r\n const itemOrItems = getRouteLinkCategory(locale, routes, otherCategories, rootCategory, childCategory);\r\n if (Array.isArray(itemOrItems)) {\r\n items.push(...itemOrItems);\r\n } else if (itemOrItems) {\r\n items.push(itemOrItems);\r\n }\r\n }\r\n if (\r\n !route ||\r\n (category.isHidden && category.id !== rootCategory.id)\r\n ) {\r\n return items;\r\n }\r\n routeLink.items = items;\r\n return routeLink;\r\n}\r\n","import { IApp, IAppExtended, ILabel, ILayout, ILocale, ILocalizedMenu, IMarket, IRouteLink } from '@websolutespa/bom-core';\r\nimport { getApp } from '../app/app.service';\r\nimport { getLabels } from '../label/label.service';\r\nimport { getLocales } from '../locale/locale.service';\r\nimport { getMarkets } from '../market/market.service';\r\nimport { getMenus } from '../menu/menu.service';\r\nimport { getRouteLinkTree } from '../route/route.service';\r\n\r\nexport async function getLayout<T extends IAppExtended = IAppExtended>(market: string, locale: string): Promise<ILayout<T>> {\r\n const markets: IMarket[] = await getMarkets({ locale });\r\n // console.log('markets', markets);\r\n const locales: ILocale[] = await getLocales({ locale });\r\n // console.log('locales', locales);\r\n const labels: ILabel[] = await getLabels({ locale });\r\n // console.log('labels', labels);\r\n const app = (await getApp<T>({ locale }) || {}) as IApp<T>;\r\n const tree = await getRouteLinkTree(market, locale);\r\n // console.log('tree', tree);\r\n const firstLevelRoutes = tree?.items || [];\r\n // console.log('firstLevelRoutes', firstLevelRoutes);\r\n const flatTopLevelRoutes = tree ? [tree, ...firstLevelRoutes] : [];\r\n // console.log('flatTopLevelRoutes', flatTopLevelRoutes);\r\n const topLevelRoutes = flatTopLevelRoutes.reduce((object, routeLink: IRouteLink) => {\r\n if (!object[routeLink.schema] || routeLink.schema === routeLink.category) {\r\n object[routeLink.schema] = routeLink;\r\n }\r\n return object;\r\n }, {} as Record<string, IRouteLink>);\r\n // console.log('topLevelRoutes', topLevelRoutes);\r\n const topLevelHrefs = flatTopLevelRoutes.reduce((object, routeLink: IRouteLink) => {\r\n if (routeLink.href && (!object[routeLink.schema] || routeLink.schema === routeLink.category)) {\r\n object[routeLink.schema] = routeLink.href;\r\n }\r\n return object;\r\n }, {} as Record<string, string>);\r\n // console.log('topLevelHrefs', topLevelHrefs);\r\n const menu: Record<string, ILocalizedMenu> = {};\r\n // console.log('menu', menu);\r\n const menus = await getMenus({ market, locale });\r\n menus.forEach(x => {\r\n menu[x.id] = x as ILocalizedMenu;\r\n });\r\n // console.log('menus', menus);\r\n // console.log('getLayout');\r\n return {\r\n labels,\r\n locale,\r\n locales,\r\n market,\r\n markets,\r\n app,\r\n menu,\r\n topLevelHrefs,\r\n topLevelRoutes,\r\n tree,\r\n };\r\n}\r\n","import { getHost, getOrigin, isDevelopment, isProduction } from '@websolutespa/bom-core';\r\nimport { getLayout } from '@websolutespa/bom-mixer-models/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { apiHandler } from '../api/api.handler';\r\n\r\nconst DISALLOWED_KEYS = [\r\n '__NEXT_PRIVATE_STANDALONE_CONFIG',\r\n];\r\n\r\nconst getFilteredEnv = (env: Record<string, unknown>): Record<string, unknown> => {\r\n const entries = Object.entries(env).filter(([k, v]) => (\r\n !DISALLOWED_KEYS.includes(k) && typeof v === 'string'\r\n ));\r\n entries.sort();\r\n return Object.fromEntries(entries);\r\n};\r\n\r\nconst sortKeys = (object?: Record<string, unknown>): Record<string, unknown> => {\r\n const entries = Object.entries(object || {});\r\n entries.sort();\r\n return Object.fromEntries(entries);\r\n};\r\n\r\nexport function varsHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n get: async (request: NextApiRequest, response: NextApiResponse) => {\r\n try {\r\n const defaultLocale = process.env.DEFAULT_LOCALE || 'it';\r\n const defaultMaket = process.env.DEFAULT_MARKET || 'ww';\r\n const { locale = defaultLocale, market = defaultMaket } = (request.query || {});\r\n const layout =\r\n typeof locale === 'string' && typeof market === 'string' ?\r\n await getLayout(market, locale) :\r\n undefined;\r\n const info = {\r\n production: isProduction,\r\n development: isDevelopment,\r\n origin: getOrigin(request.headers),\r\n host: getHost(request.headers),\r\n headers: { ...sortKeys(request.headers) },\r\n env: { ...getFilteredEnv(process.env) },\r\n layout: { ...sortKeys(layout) },\r\n };\r\n if (!(request.headers.accept?.includes('text/html'))) {\r\n return response.status(200).json(info);\r\n }\r\n response.status(200).send(`<!DOCTYPE html>\r\n<html>\r\n <head>\r\n <meta charSet=\"utf-8\"/>\r\n <style>\r\n html, body {\r\n background: #282828;\r\n color: #7cacf8;\r\n }\r\n body {\r\n padding: 0;\r\n margin: 0;\r\n font-family: monospace;\r\n font-size: 14px;\r\n line-height: 1.16;\r\n font-weight: 100;\r\n }\r\n json-viewer {\r\n padding: 20px;\r\n min-height: 100vh;\r\n box-sizing: border-box;\r\n line-height: 1.2;\r\n --background-color: #282828;\r\n --color: #e3e3e3;\r\n --property-color: #7cacf8;\r\n --string-color: #53d5fb;\r\n --number-color: #7b80ff;\r\n --boolean-color: #9980ff;\r\n --null-color: #6f6f6f;\r\n --preview-color: #8f8f8f;\r\n --highlight-color: #7b0000;\r\n --font-family: monospace;\r\n --font-size: 14px;\r\n --indent-size: 1em;\r\n --indentguide-size: 1px;\r\n --indentguide-style: solid;\r\n --indentguide-color: #333;\r\n --indentguide-color-active: #666;\r\n --indentguide: var(--indentguide-size) var(--indentguide-style) var(--indentguide-color);\r\n --indentguide-active: var(--indentguide-size) var(--indentguide-style) var(--indentguide-color-active);\r\n }\r\n\r\n :root {\r\n --scrollbar-size: 8px;\r\n --scrollbar-border-radius: 2px;\r\n --scrollbar-track-color: transparent;\r\n --scrollbar-track-hover-color: transparent;\r\n --scrollbar-thumb-color: #888888;\r\n --scrollbar-thumb-hover-color: #aaaaaa;\r\n }\r\n\r\n ::-webkit-scrollbar {\r\n width: var(--scrollbar-size);\r\n height: var(--scrollbar-size);\r\n border-radius: 0;\r\n }\r\n\r\n ::-webkit-scrollbar-button {\r\n display: none;\r\n }\r\n\r\n ::-webkit-scrollbar-button:hover {\r\n display: none;\r\n }\r\n\r\n ::-webkit-scrollbar-thumb {\r\n background-color: var(--scrollbar-thumb-color);\r\n box-shadow: none;\r\n border-radius: calc(var(--scrollbar-size) * 0.5);\r\n }\r\n\r\n ::-webkit-scrollbar-thumb:hover {\r\n background-color: var(--scrollbar-thumb-hover-color);\r\n }\r\n\r\n ::-webkit-scrollbar-track {\r\n background-color: var(--scrollbar-track-color);\r\n border-radius: 0;\r\n }\r\n\r\n ::-webkit-scrollbar-track:hover {\r\n background-color: var(--scrollbar-track-hover-color);\r\n }\r\n\r\n </style>\r\n <script src=\"https://unpkg.com/@alenaksu/json-viewer@2.0.0/dist/json-viewer.bundle.js\"></script>\r\n <script>\r\n document.addEventListener('DOMContentLoaded', () => {\r\n const viewer = document.querySelector('#json-viewer');\r\n viewer.data = ${JSON.stringify(info)};\r\n viewer.expand(/headers|env/);\r\n });\r\n </script>\r\n </head>\r\n <body>\r\n <json-viewer id=\"json-viewer\"></json-viewer>\r\n </body>\r\n</html>`);\r\n } catch (error) {\r\n response.status(400).json(error);\r\n }\r\n },\r\n });\r\n}\r\n"],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/api/api.ts","../src/cache/cache.service.ts","../src/decorators/category.ts","../src/decorators/consts.ts","../src/decorators/href.ts","../src/decorators/localizable.ts","../src/decorators/menu.ts","../src/decorators/nav.ts","../src/decorators/optimize.ts","../src/decorators/relation.ts","../src/decorators/schema.ts","../src/local/local.api.ts","../src/mock/mock.api.ts","../src/remote/remote.api.ts","../src/store/store.ts","../src/store/store.api.ts"],"sourcesContent":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/api/api.ts","../src/cache/cache.service.ts","../src/decorators/category.ts","../src/decorators/consts.ts","../src/decorators/href.ts","../src/decorators/localizable.ts","../src/decorators/menu.ts","../src/decorators/nav.ts","../src/decorators/optimize.ts","../src/decorators/relation.ts","../src/decorators/schema.ts","../src/local/local.api.ts","../src/mock/mock.api.ts","../src/remote/remote.api.ts","../src/store/store.ts","../src/store/store.api.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { BuildStrategy, COLLECTIONS, DEFAULT_DEPTH, KNOWN_COLLECTIONS, MAX_INT, MOCK_COLLECTIONS, NextPhase, STATIC_COLLECTIONS, StoreStrategy, buildStrategy, collectCategory_, decorateCategories_, decorateCategory_, decorateHref_, decorateHrefs_, decorateLocalizable_, decorateLocalizables_, decorateMenu_, decorateMenus_, decorateNav_, decorateNavs_, decorateRelation_, decorateRelations_, decorateSchema_, decorateSchemas_, fromCache, getLocalApiRequestOptions, getLocalApiUrl, getRemoteApiRequestOptions, getRemoteApiUrl, localApiDelete, localApiFetch, localApiGet, localApiPatch, localApiPost, localApiPut, mockApiDelete, mockApiFetch, mockApiGet, mockApiPatch, mockApiPost, mockApiPut, nextPhase, optimizeMany_, optimizeOne_, remoteApiDelete, remoteApiFetch, remoteApiGet, remoteApiPatch, remoteApiPost, remoteApiPut, staticCollections, storeApiDelete, storeApiGet, storeApiPatch, storeApiPost, storeApiPut, storeCacheDuration, storeStrategy } from "./src-
|
|
1
|
+
import { BuildStrategy, COLLECTIONS, DEFAULT_DEPTH, KNOWN_COLLECTIONS, MAX_INT, MOCK_COLLECTIONS, NextPhase, STATIC_COLLECTIONS, StoreStrategy, buildStrategy, collectCategory_, decorateCategories_, decorateCategory_, decorateHref_, decorateHrefs_, decorateLocalizable_, decorateLocalizables_, decorateMenu_, decorateMenus_, decorateNav_, decorateNavs_, decorateRelation_, decorateRelations_, decorateSchema_, decorateSchemas_, fromCache, getLocalApiRequestOptions, getLocalApiUrl, getRemoteApiRequestOptions, getRemoteApiUrl, localApiDelete, localApiFetch, localApiGet, localApiPatch, localApiPost, localApiPut, mockApiDelete, mockApiFetch, mockApiGet, mockApiPatch, mockApiPost, mockApiPut, nextPhase, optimizeMany_, optimizeOne_, remoteApiDelete, remoteApiFetch, remoteApiGet, remoteApiPatch, remoteApiPost, remoteApiPut, staticCollections, storeApiDelete, storeApiGet, storeApiPatch, storeApiPost, storeApiPut, storeCacheDuration, storeStrategy } from "./src-DH2PQJMn.js";
|
|
2
2
|
|
|
3
3
|
export { BuildStrategy, COLLECTIONS, DEFAULT_DEPTH, KNOWN_COLLECTIONS, MAX_INT, MOCK_COLLECTIONS, NextPhase, STATIC_COLLECTIONS, StoreStrategy, buildStrategy, collectCategory_, decorateCategories_, decorateCategory_, decorateHref_, decorateHrefs_, decorateLocalizable_, decorateLocalizables_, decorateMenu_, decorateMenus_, decorateNav_, decorateNavs_, decorateRelation_, decorateRelations_, decorateSchema_, decorateSchemas_, fromCache, getLocalApiRequestOptions, getLocalApiUrl, getRemoteApiRequestOptions, getRemoteApiUrl, localApiDelete, localApiFetch, localApiGet, localApiPatch, localApiPost, localApiPut, mockApiDelete, mockApiFetch, mockApiGet, mockApiPatch, mockApiPost, mockApiPut, nextPhase, optimizeMany_, optimizeOne_, remoteApiDelete, remoteApiFetch, remoteApiGet, remoteApiPatch, remoteApiPost, remoteApiPut, staticCollections, storeApiDelete, storeApiGet, storeApiPatch, storeApiPost, storeApiPut, storeCacheDuration, storeStrategy };
|
|
@@ -493,13 +493,13 @@ async function localApiDelete(url, options = {}, serviceOptions) {
|
|
|
493
493
|
//#region src/mock/mock.api.ts
|
|
494
494
|
/**
|
|
495
495
|
|
|
496
|
-
* This methods handle api requests / responses to local /api
|
|
496
|
+
* This methods handle api requests / responses to local /api/-mock data
|
|
497
497
|
|
|
498
498
|
*/
|
|
499
499
|
const API_URL$1 = process.env.NEXT_PUBLIC_URL;
|
|
500
500
|
const API_BASE$1 = process.env.NEXT_PUBLIC_API || "/api";
|
|
501
501
|
function getMockApiUrl(pathname) {
|
|
502
|
-
const url = `${API_URL$1}${API_BASE$1}
|
|
502
|
+
const url = `${API_URL$1}${API_BASE$1}/-mock${pathname}`;
|
|
503
503
|
return url;
|
|
504
504
|
}
|
|
505
505
|
async function mockApiFetch(pathname, options = {}) {
|
|
@@ -928,4 +928,4 @@ async function storeApiDelete(url, options = {}) {
|
|
|
928
928
|
|
|
929
929
|
//#endregion
|
|
930
930
|
export { BuildStrategy, COLLECTIONS, DEFAULT_DEPTH, KNOWN_COLLECTIONS, MAX_INT, MOCK_COLLECTIONS, NextPhase, STATIC_COLLECTIONS, StoreStrategy, buildStrategy, collectCategory_, decorateCategories_, decorateCategory_, decorateHref_, decorateHrefs_, decorateLocalizable_, decorateLocalizables_, decorateMenu_, decorateMenus_, decorateNav_, decorateNavs_, decorateRelation_, decorateRelations_, decorateSchema_, decorateSchemas_, fromCache, getLocalApiRequestOptions, getLocalApiUrl, getRemoteApiRequestOptions, getRemoteApiUrl, localApiDelete, localApiFetch, localApiGet, localApiPatch, localApiPost, localApiPut, mockApiDelete, mockApiFetch, mockApiGet, mockApiPatch, mockApiPost, mockApiPut, nextPhase, optimizeMany_, optimizeOne_, remoteApiDelete, remoteApiFetch, remoteApiGet, remoteApiPatch, remoteApiPost, remoteApiPut, staticCollections, storeApiDelete, storeApiGet, storeApiPatch, storeApiPost, storeApiPut, storeCacheDuration, storeStrategy };
|
|
931
|
-
//# sourceMappingURL=src-
|
|
931
|
+
//# sourceMappingURL=src-DH2PQJMn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"src-D-0XSCD9.js","names":["token?: string","CACHE_: Map<string, unknown>","callback: () => Promise<T>","key?: string","store: IStore","item: T","params: QueryParams","items: T[]","categories: ICategory[]","routes: IRoute[]","depth: number","store: IStore","item: T","params: QueryParams","items: T[]","item: B","params: QueryParams","items: B[]","decoratedItems: B[]","store: IStore","item: IUndecoratedMenu","params: { market: string, locale: string }","decoratedItem: IMenu","items: IUndecoratedMenu[]","decoratedItems: IMenu[]","items: IUndecoratedMenuItem[]","market: string","item: IUndecoratedMenuItem","undecoratedCategories: IUndecoratedMenuCategory[]","undecoratedPages: IUndecoratedMenuPage[]","item: IUndecoratedMenuCategory","category: ICategory","items: IMenuItem[]","categories: ICategory[]","routes: IRoute[]","depth: number","route: IRoute","route","childRouteItems: IMenuItem[]","item: IRoute","decoratedItem: IMenuRoute","item: IUndecoratedMenuPage","params: QueryParams","decoratedItem: IMenuPage","store: IStore","item: T","params: QueryParams","routes?: IRoute[]","items: T[]","item: unknown","navs: IUndecoratedNav[]","item: IUndecoratedNav","routes: IRoute[]","item: T","items: T[]","optimizedItems: T[]","store: IStore","item: T","params: QueryParams","items: T[]","context: {\r\n store: IStore;\r\n params: QueryParams;\r\n depth: number;\r\n}","relations: IPageResolvedRelation[]","items: ICategorized[]","store: IStore","item: T","schema: string","items: T[]","API_URL","API_BASE","pathname: string","options: ApiRequestOptions","serviceOptions?: { locale: string, market: string }","url: string","payload?: unknown","API_URL","API_BASE","pathname: string","options: ApiRequestOptions","url: string","payload: unknown","pathname: string","options: ApiRequestOptions","url: string","payload: unknown","staticCollections: StaticServiceConfig[]","nextPhase","nextPhase: NextPhase","buildStrategy","buildStrategy: BuildStrategy","storeStrategy","storeStrategy: StoreStrategy","storeCacheDuration","storeCacheDuration: number","ENV_COLLECTIONS: string[]","MOCK_COLLECTIONS: string[]","STATIC_COLLECTIONS: string[]","KNOWN_COLLECTIONS: string[]","url: string","options: ApiRequestOptions","payload: unknown"],"sources":["../src/api/api.ts","../src/cache/cache.service.ts","../src/decorators/consts.ts","../src/decorators/category.ts","../src/decorators/href.ts","../src/decorators/localizable.ts","../src/decorators/menu.ts","../src/decorators/nav.ts","../src/decorators/optimize.ts","../src/decorators/relation.ts","../src/decorators/schema.ts","../src/local/local.api.ts","../src/mock/mock.api.ts","../src/remote/remote.api.ts","../src/static/static.ts","../src/store/store.ts","../src/store/store.api.ts"],"sourcesContent":["import { FetchRequestOptions } from '@websolutespa/bom-core';\r\n\r\nexport type ApiRequestOptions = FetchRequestOptions;\r\n\r\nexport function getLocalApiRequestOptions(): ApiRequestOptions {\r\n return {\r\n headers: {\r\n },\r\n };\r\n}\r\n\r\nexport function getRemoteApiRequestOptions(token?: string): ApiRequestOptions {\r\n if (token) {\r\n // authenticated end user JWT token bearer (end_users)\r\n return {\r\n // mode: 'cors',\r\n headers: {\r\n Authorization: `JWT ${token}`,\r\n // Authorization: `Bearer ${token}`,\r\n },\r\n };\r\n } else {\r\n // guest user api key (users)\r\n return {\r\n // mode: 'cors',\r\n headers: {\r\n Authorization: `users API-Key ${process.env.STORE_API_KEY}`,\r\n },\r\n };\r\n }\r\n}\r\n","const CACHE_: Map<string, unknown> = new Map<string, unknown>();\r\n\r\nexport async function fromCache<T = unknown>(callback: () => Promise<T>, key?: string): Promise<T> {\r\n if (key && CACHE_.has(key)) {\r\n return CACHE_.get(key) as T;\r\n } else {\r\n const t = await callback();\r\n if (key) {\r\n CACHE_.set(key, t);\r\n }\r\n return t;\r\n }\r\n}\r\n","\r\nexport const DEFAULT_DEPTH = 3;\r\n","import { ICategorized, ICategory, IEquatable, IRoute, IStore, QueryParams, findRouteOfCategory, isUnresolvedCategory } from '@websolutespa/bom-core';\r\nimport { DEFAULT_DEPTH } from './consts';\r\n\r\nexport async function decorateCategory_<T extends { category?: IEquatable | ICategory } = { category?: IEquatable | ICategory }>(store: IStore, item: T, params: QueryParams = {}): Promise<T | (T & { category: ICategory })> {\r\n const depth = params.depth != null ? params.depth : DEFAULT_DEPTH;\r\n if (depth === 0) {\r\n return item;\r\n }\r\n const categories = await store.category!.findMany<ICategory>({\r\n market: params.market,\r\n locale: params.locale,\r\n depth: 0,\r\n });\r\n const routes = await store.route!.findMany<IRoute>();\r\n const decoratedItem = await collectCategory_(categories, routes, item, params, depth);\r\n return decoratedItem as T & { category: ICategory };\r\n}\r\n\r\nexport async function decorateCategories_<T extends ICategorized = ICategorized>(store: IStore, items: T[], params: QueryParams = {}): Promise<(T | (T & { category: ICategory }))[]> {\r\n const depth = params.depth != null ? params.depth : DEFAULT_DEPTH;\r\n if (depth === 0) {\r\n return items;\r\n }\r\n const categories = await store.category!.findMany<ICategory>({\r\n market: params.market,\r\n locale: params.locale,\r\n depth: 0,\r\n });\r\n const routes = await store.route!.findMany<IRoute>();\r\n const decoratedItems = [];\r\n for (const item of items) {\r\n const decoratedItem = await collectCategory_(categories, routes, item, params, depth);\r\n decoratedItems.push(decoratedItem);\r\n }\r\n return decoratedItems;\r\n}\r\n\r\nexport async function collectCategory_<\r\n T extends { category?: IEquatable | ICategory } = { category?: IEquatable | ICategory }\r\n>(\r\n categories: ICategory[],\r\n routes: IRoute[],\r\n item: T,\r\n params: QueryParams = {},\r\n depth: number\r\n): Promise<T> {\r\n if (depth === 0) {\r\n return item;\r\n }\r\n if (isUnresolvedCategory(item.category)) {\r\n const category = categories.find(x => x.id === item.category);\r\n if (category) {\r\n const route = findRouteOfCategory(routes, category.id, params.market, params.locale);\r\n if (route) {\r\n category.href = route.id;\r\n }\r\n const decoratedCategory = await collectCategory_(categories, routes, category, params, depth - 1);\r\n return { ...item, category: decoratedCategory };\r\n }\r\n }\r\n return item;\r\n}\r\n","import { IRoute, ISchema, IStore, QueryParams } from '@websolutespa/bom-core';\r\n\r\nexport async function decorateHref_<T extends ISchema = ISchema>(store: IStore, item: T, params: QueryParams = {}): Promise<T | T & { href: string | null }> {\r\n if (params.market && params.locale) {\r\n const routes = await store.route!.findMany<IRoute>({\r\n where: {\r\n market: {\r\n equals: params.market,\r\n },\r\n locale: {\r\n equals: params.locale,\r\n },\r\n schema: {\r\n equals: item.schema,\r\n },\r\n page: {\r\n equals: item.id,\r\n },\r\n },\r\n });\r\n const href = routes.length ? routes[0]!.id : null;\r\n return { ...item, href };\r\n } else {\r\n return item;\r\n }\r\n}\r\n\r\nexport async function decorateHrefs_<T extends ISchema = ISchema>(store: IStore, items: T[], params: QueryParams = {}): Promise<T[] | (T & { href: string | null })[]> {\r\n if (params.market && params.locale) {\r\n const routes = await store.route!.findMany<IRoute>({\r\n where: {\r\n market: {\r\n equals: params.market,\r\n },\r\n locale: {\r\n equals: params.locale,\r\n },\r\n },\r\n });\r\n return items.map(item => {\r\n const route = routes.find(x =>\r\n x.schema === item.schema &&\r\n x.page === item.id\r\n );\r\n const href = route ? route.id : null;\r\n return { ...item, href };\r\n });\r\n } else {\r\n return items;\r\n }\r\n}\r\n","import { QueryParams, cloneItem, localizeItem } from '@websolutespa/bom-core';\r\n\r\nexport async function decorateLocalizable_<B>(item: B, params: QueryParams = {}): Promise<B> {\r\n if (params.locale) {\r\n return localizeItem(item, params.locale);\r\n } else {\r\n return cloneItem(item);\r\n }\r\n}\r\n\r\nexport async function decorateLocalizables_<B>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n const decoratedItems: B[] = [];\r\n for (const item of items) {\r\n const decoratedItem = params.locale ?\r\n localizeItem(item, params.locale) :\r\n cloneItem(item);\r\n decoratedItems.push(decoratedItem);\r\n }\r\n return decoratedItems;\r\n}\r\n","import {\r\n ICategorized, ICategory, IMenu, IMenuCategory, IMenuGroup, IMenuItem, IMenuPage, IMenuRoute, IRoute, IStore,\r\n IUndecoratedMenu, IUndecoratedMenuCategory, IUndecoratedMenuItem, IUndecoratedMenuPage, MenuCategoryStrategy, QueryParams,\r\n asCategoryId,\r\n findCategoryInCategories,\r\n findChildCategories,\r\n findRouteOfCategory,\r\n isEquatable, isUndecoratedMenuCategory, isUndecoratedMenuPage,\r\n uuidv4\r\n} from '@websolutespa/bom-core';\r\n\r\nexport async function decorateMenu_(store: IStore, item: IUndecoratedMenu, params: { market: string, locale: string }): Promise<IMenu> {\r\n const { market, locale } = params;\r\n const items = itemsFilteredByMarket_(item.items || [], market);\r\n const decoratedItem: IMenu = {\r\n id: item.id,\r\n items: [],\r\n };\r\n const undecoratedCategories = collectUndecoratedCategories(items);\r\n const undecoratedPages = collectUndecoratedPages(items);\r\n if (\r\n undecoratedCategories.length > 0 ||\r\n undecoratedPages.length > 0\r\n ) {\r\n const routes = await store.route!.findMany<IRoute>({\r\n where: {\r\n ...(market ? { market: { equals: market } } : {}),\r\n ...(locale ? { locale: { equals: locale } } : {}),\r\n },\r\n });\r\n if (undecoratedCategories.length > 0) {\r\n const categories = await store.category!.findMany<ICategory>(params);\r\n for (const undecoratedMenuCategory of undecoratedCategories) {\r\n const decoratedMenuCategory = decorateMenuCategory_(undecoratedMenuCategory, categories, routes, market);\r\n Object.assign(undecoratedMenuCategory, decoratedMenuCategory);\r\n }\r\n }\r\n for (const undecoratedMenuPage of undecoratedPages) {\r\n const decoratedMenuPage = await decorateMenuPage_(undecoratedMenuPage, routes, store, { ...params });\r\n Object.assign(undecoratedMenuPage, decoratedMenuPage);\r\n }\r\n }\r\n decoratedItem.items = items as IMenuItem[];\r\n return decoratedItem;\r\n}\r\n\r\nexport async function decorateMenus_(store: IStore, items: IUndecoratedMenu[], params: { market: string, locale: string }): Promise<IMenu[]> {\r\n const decoratedItems: IMenu[] = [];\r\n for (const item of items) {\r\n const decoratedItem = await decorateMenu_(store, item, params);\r\n decoratedItems.push(decoratedItem);\r\n }\r\n return decoratedItems;\r\n}\r\n\r\nfunction itemsFilteredByMarket_(items: IUndecoratedMenuItem[], market: string): IUndecoratedMenuItem[] {\r\n return items.filter(x => {\r\n const hasMarket = itemHasMarket_(x, market);\r\n if (hasMarket && x.items) {\r\n x.items = itemsFilteredByMarket_(x.items || [], market);\r\n }\r\n return hasMarket;\r\n });\r\n}\r\n\r\nfunction itemHasMarket_(item: IUndecoratedMenuItem, market: string): boolean {\r\n return (Array.isArray(item.markets) && item.markets.length > 0) ? item.markets.includes(market) : true;\r\n}\r\n\r\nfunction collectUndecoratedCategories(items: IUndecoratedMenuItem[], undecoratedCategories: IUndecoratedMenuCategory[] = []): IUndecoratedMenuCategory[] {\r\n items.forEach(item => {\r\n if (isUndecoratedMenuCategory(item)) {\r\n undecoratedCategories.push(item);\r\n }\r\n if (item.items) {\r\n collectUndecoratedCategories(item.items, undecoratedCategories);\r\n }\r\n });\r\n return undecoratedCategories;\r\n}\r\n\r\nfunction collectUndecoratedPages(items: IUndecoratedMenuItem[], undecoratedPages: IUndecoratedMenuPage[] = []): IUndecoratedMenuPage[] {\r\n items.forEach(item => {\r\n if (isUndecoratedMenuPage(item)) {\r\n undecoratedPages.push(item);\r\n }\r\n if (item.items) {\r\n collectUndecoratedPages(item.items, undecoratedPages);\r\n }\r\n });\r\n return undecoratedPages;\r\n}\r\n\r\nexport const MAX_INT = 1000000000000; // 9007199254740991\r\n\r\nfunction makeCategoryMenuItem_(item: IUndecoratedMenuCategory, category: ICategory): IMenuCategory | IMenuGroup {\r\n const id = item.id || uuidv4();\r\n const title = item.title || category.title || '';\r\n const abstract = item.abstract || undefined;\r\n const customClass = item.customClass || undefined;\r\n const media = item.media || category.media;\r\n const items: IMenuItem[] = [];\r\n return category.isHidden ?\r\n {\r\n type: 'group',\r\n id,\r\n title,\r\n abstract,\r\n media,\r\n customClass,\r\n items,\r\n } : {\r\n type: 'category',\r\n category: category.id,\r\n id,\r\n href: '',\r\n title,\r\n abstract,\r\n media,\r\n customClass,\r\n items,\r\n };\r\n}\r\n\r\nfunction decorateMenuCategory_(\r\n item: IUndecoratedMenuCategory,\r\n categories: ICategory[],\r\n routes: IRoute[],\r\n market: string,\r\n depth: number = 0\r\n): IMenuItem | undefined {\r\n const strategy = item.strategy || MenuCategoryStrategy.Default;\r\n const categoryId = asCategoryId(item.category);\r\n // find category\r\n const category = categoryId ? categories.find(x => x.id === categoryId) : undefined;\r\n if (category) {\r\n const decoratedItem = makeCategoryMenuItem_(item, category);\r\n if (!category.isHidden) {\r\n const route = routes.find((route: IRoute) => route.isDefault && route.resolvedCategory === category.id);\r\n if (route) {\r\n (decoratedItem as IMenuCategory).href = route.id;\r\n if (!decoratedItem.media) {\r\n decoratedItem.media = route.media;\r\n }\r\n }\r\n }\r\n // checking for max depth recursion\r\n let maxDepth = item.maxDepth;\r\n if (typeof maxDepth === 'number') {\r\n if (depth > maxDepth) {\r\n return decoratedItem;\r\n }\r\n maxDepth--;\r\n }\r\n // search child categories\r\n const childCategories = (category.id ?\r\n categories.filter(x => asCategoryId(x.category) === category.id) : []\r\n ).filter(x => {\r\n switch (strategy) {\r\n case MenuCategoryStrategy.ExcludeHidden:\r\n return Boolean(x.isHidden) === false;\r\n case MenuCategoryStrategy.Default:\r\n return true;\r\n }\r\n });\r\n // sort child categories\r\n childCategories.sort((a, b) => {\r\n return (a.order || MAX_INT) - (b.order || MAX_INT);\r\n });\r\n // define sub strategy (!!! todo)\r\n const subStrategy = strategy;\r\n // decorate child categories\r\n const childCategoryItems = childCategories.map(c => decorateMenuCategory_({\r\n id: c.id,\r\n type: 'category',\r\n category: c.id,\r\n maxDepth,\r\n strategy: subStrategy, // dispatch sub strategy\r\n items: [],\r\n } as IUndecoratedMenuCategory, categories, routes, market, depth + 1));\r\n // find child routes\r\n const childRoutes = routes.filter((route: IRoute) => {\r\n switch (strategy) {\r\n case MenuCategoryStrategy.ExcludeHidden:\r\n return route.resolvedCategory === category.id && Boolean(route.isDefault) === false;\r\n case MenuCategoryStrategy.Default:\r\n return route.category === category.id && (category.isHidden || Boolean(route.isDefault) === false);\r\n }\r\n });\r\n // sort child routes\r\n childRoutes.sort((a, b) => {\r\n return (a.order || MAX_INT) - (b.order || MAX_INT);\r\n });\r\n // decorate child routes\r\n const childRouteItems: IMenuItem[] = childRoutes.map(x => decorateMenuRoute_(x));\r\n // filter items\r\n decoratedItem.items = [\r\n ...childCategoryItems,\r\n ...childRouteItems,\r\n ].filter(x => Boolean(x)) as IMenuItem[];\r\n return decoratedItem;\r\n }\r\n // return unresolved category as group\r\n return {\r\n id: item.id || uuidv4(),\r\n type: 'group',\r\n title: item.title || '',\r\n items: [],\r\n };\r\n}\r\n\r\nfunction decorateMenuCategoryWithHiddenSubCategories_(\r\n item: IUndecoratedMenuCategory,\r\n categories: ICategory[],\r\n routes: IRoute[],\r\n market: string,\r\n depth: number = 0\r\n): IMenuItem {\r\n const decoratedItem: IMenuCategory = {\r\n abstract: item.abstract,\r\n category: '',\r\n customClass: item.customClass,\r\n href: '',\r\n id: item.id || uuidv4(),\r\n items: [],\r\n title: '',\r\n type: item.type,\r\n };\r\n /*\r\n const categoryId = asCategoryId(item.category);\r\n const category = categoryId ? categories.find(x => x.id === categoryId) : undefined;\r\n */\r\n const category = findCategoryInCategories(categories, item.category);\r\n if (category) {\r\n // assigning category id\r\n decoratedItem.category = category.id;\r\n // assigning category title\r\n decoratedItem.title = item.title || category.title || '';\r\n // assigning current or category media\r\n decoratedItem.media = item.media || category.media;\r\n // find category's index page route\r\n const route = findRouteOfCategory(routes, category.id);\r\n if (route) {\r\n // hasLink\r\n decoratedItem.href = route.id;\r\n } else {\r\n // isGroup\r\n }\r\n // checking for max depth recursion\r\n let maxDepth = item.maxDepth;\r\n if (typeof maxDepth === 'number') {\r\n if (depth > maxDepth) {\r\n return decoratedItem;\r\n }\r\n maxDepth--;\r\n }\r\n // search child categories\r\n const childCategories = findChildCategories(categories, category.id);\r\n if (childCategories.length) {\r\n // sort child categories\r\n childCategories.sort((a, b) => {\r\n return (a.order || MAX_INT) - (b.order || MAX_INT);\r\n });\r\n decoratedItem.items = childCategories.map(c => {\r\n const menuCategory = decorateMenuCategoryWithHiddenSubCategories_({\r\n id: c.id,\r\n type: 'category',\r\n category: c.id,\r\n maxDepth,\r\n items: [],\r\n } as IUndecoratedMenuCategory, categories, routes, market, depth + 1);\r\n if (c.isHidden) {\r\n const group: IMenuGroup = {\r\n id: c.id,\r\n type: 'group',\r\n title: c.title,\r\n items: [\r\n ...(menuCategory.items || []),\r\n ],\r\n };\r\n // find child routes\r\n // const childRoutes = findRoutesOfCategory(routes, c.id, false);\r\n const childRoutes = routes.filter((route: IRoute) =>\r\n route.category === c.id &&\r\n Boolean(route.isDefault) === false\r\n );\r\n // sort child routes\r\n childRoutes.sort((a, b) => {\r\n return (a.order || MAX_INT) - (b.order || MAX_INT);\r\n });\r\n const routeLinks = childRoutes.map(x => decorateMenuRoute_(x));\r\n group.items?.push(...routeLinks);\r\n return group;\r\n } else {\r\n return decorateMenuCategoryWithHiddenSubCategories_({\r\n id: c.id,\r\n type: 'category',\r\n category: c.id,\r\n maxDepth,\r\n items: [],\r\n } as IUndecoratedMenuCategory, categories, routes, market, depth + 1);\r\n }\r\n });\r\n }\r\n // find child routes\r\n // const childRoutes = findRoutesOfCategory(routes, category.id, false);\r\n const childRoutes = routes.filter((route: IRoute) =>\r\n route.category === category.id &&\r\n Boolean(route.isDefault) === false\r\n );\r\n // console.log('childRoutes', childRoutes, category.id);\r\n // sort child routes\r\n childRoutes.sort((a, b) => {\r\n return (a.order || MAX_INT) - (b.order || MAX_INT);\r\n });\r\n decoratedItem.items = [\r\n ...(decoratedItem.items || []),\r\n ...childRoutes.map(x => decorateMenuRoute_(x)),\r\n ];\r\n\r\n }\r\n return decoratedItem;\r\n}\r\n\r\nfunction decorateMenuRoute_(\r\n item: IRoute\r\n): IMenuItem {\r\n const decoratedItem: IMenuRoute = {\r\n id: uuidv4(),\r\n type: 'route',\r\n title: item.title,\r\n href: item.id,\r\n media: item.media,\r\n page: item.page,\r\n schema: item.schema,\r\n items: [],\r\n };\r\n return decoratedItem;\r\n}\r\n\r\nasync function decorateMenuPage_(\r\n item: IUndecoratedMenuPage,\r\n routes: IRoute[],\r\n store: IStore,\r\n params: QueryParams = {}\r\n): Promise<IMenuItem> {\r\n const values = Array.isArray(item.page.value) ? item.page.value : [item.page.value];\r\n const value = values[0]!; // !!!\r\n const id = isEquatable(value) ? value : value.id;\r\n const route = routes.find(x =>\r\n x.schema === item.page.relationTo &&\r\n x.page === id\r\n );\r\n const page = await store[item.page.relationTo]!.findOne<ICategorized>(id, { ...params });\r\n const decoratedItem: IMenuPage = {\r\n id: item.id || uuidv4(),\r\n type: item.type,\r\n title: item.title || page?.title || '',\r\n abstract: item.abstract || page?.abstract || '',\r\n customClass: item.customClass,\r\n href: route?.id || '',\r\n media: page?.media,\r\n page: route?.page || '',\r\n schema: route?.schema || '',\r\n items: (item.items || []) as IMenuItem[],\r\n };\r\n return decoratedItem;\r\n}\r\n","import { IDecoratedNav, IEquatable, IRoute, ISchema, IStore, IUndecoratedNav, QueryParams, isArray, isObject, isUndecoratedNav } from '@websolutespa/bom-core';\r\n\r\nexport async function decorateNav_<T extends ISchema = ISchema>(store: IStore, item: T, params: QueryParams = {}, routes?: IRoute[]): Promise<T> {\r\n if (!routes) {\r\n routes = await store.route!.findMany<IRoute>({\r\n where: {\r\n ...(params.market ? { market: { equals: params.market } } : {}),\r\n ...(params.locale ? { locale: { equals: params.locale } } : {}),\r\n },\r\n });\r\n }\r\n const navs = collectNavs_(item);\r\n for (const nav of navs) {\r\n const decoratedNav = decorateNav__(nav, routes);\r\n Object.assign(nav, decoratedNav);\r\n // (nav as IDecoratedNav<T>).nav = decoratedNav.nav;\r\n }\r\n return item;\r\n}\r\n\r\nexport async function decorateNavs_<T extends ISchema = ISchema>(store: IStore, items: T[], params: QueryParams = {}): Promise<T[]> {\r\n const routes = await store.route!.findMany<IRoute>({\r\n where: {\r\n ...(params.market ? { market: { equals: params.market } } : {}),\r\n ...(params.locale ? { locale: { equals: params.locale } } : {}),\r\n },\r\n });\r\n for (const item of items) {\r\n await decorateNav_<T>(store, item, params, routes);\r\n }\r\n return items;\r\n}\r\n\r\n// collecting navs recursively\r\nfunction collectNavs_(item: unknown, navs: IUndecoratedNav[] = []): IUndecoratedNav[] {\r\n if (isUndecoratedNav(item)) {\r\n navs.push(item);\r\n }\r\n // console.log(item, isUndecoratedNav<T>(item));\r\n if (isArray(item)) {\r\n item.forEach(x => collectNavs_(x, navs));\r\n } else if (isObject(item)) {\r\n Object.values(item).forEach(value => {\r\n collectNavs_(value, navs);\r\n });\r\n }\r\n return navs;\r\n}\r\n\r\nfunction decorateNav__(item: IUndecoratedNav, routes: IRoute[]): IDecoratedNav {\r\n let decoratedNav = item as unknown as IDecoratedNav;\r\n if (item !== undefined) {\r\n const route = routes.find(x =>\r\n x.page === (item.page.value as unknown as IEquatable) &&\r\n x.schema === item.page.relationTo\r\n );\r\n if (route) {\r\n decoratedNav = {\r\n type: 'page',\r\n id: route.page,\r\n href: route.id,\r\n title: route.title,\r\n page: route.page,\r\n schema: route.schema,\r\n };\r\n }\r\n }\r\n return decoratedNav;\r\n}\r\n","import { ICategorized } from '@websolutespa/bom-core';\r\n\r\nexport async function optimizeOne_<T extends ICategorized = ICategorized>(item: T): Promise<T> {\r\n const validEntries = Object.entries(item).filter(([key, value]) => {\r\n switch (key) {\r\n case 'components':\r\n case 'meta':\r\n return false;\r\n /*\r\n default:\r\n if (\r\n isUnresolvedRelation(value) ||\r\n (\r\n Array.isArray(value) &&\r\n value.reduce((p, c) => p && isUnresolvedRelation(c), true)\r\n )\r\n ) {\r\n return false;\r\n }\r\n */\r\n }\r\n return true;\r\n });\r\n return Object.fromEntries(validEntries) as T;\r\n}\r\n\r\nexport async function optimizeMany_<T extends ICategorized = ICategorized>(items: T[]): Promise<T[]> {\r\n const optimizedItems: T[] = [];\r\n for (const item of items) {\r\n const optimizedItem = await optimizeOne_<T>(item);\r\n optimizedItems.push(optimizedItem);\r\n }\r\n return optimizedItems;\r\n}\r\n","import { ICategorized, IEquatable, ISchema, IStore, QueryParams, isArray, isObject, isUnresolvedRelation } from '@websolutespa/bom-core';\r\nimport { DEFAULT_DEPTH } from './consts';\r\n\r\nexport async function decorateRelation_<T extends ISchema = ISchema>(store: IStore, item: T, params: QueryParams = {}): Promise<T> {\r\n const depth = params.depth != null ? params.depth : DEFAULT_DEPTH;\r\n // console.log('decorateRelation_', depth, typeof depth);\r\n item = await collectRelations_({ store, params, depth }, item);\r\n return item;\r\n}\r\n\r\nexport async function decorateRelations_<T extends ISchema = ISchema>(store: IStore, items: T[], params: QueryParams = {}): Promise<T[]> {\r\n for (const item of items) {\r\n await decorateRelation_<T>(store, item, params);\r\n }\r\n return items;\r\n}\r\n\r\nexport type IPageResolvedRelation = {\r\n relationTo: string;\r\n value: IEquatable | IEquatable[];\r\n resolvedValue: ICategorized | ICategorized[] | null;\r\n};\r\n\r\n// collecting relations recursively\r\nasync function collectRelations_<T = any>(context: {\r\n store: IStore;\r\n params: QueryParams;\r\n depth: number;\r\n}, item: T, relations: IPageResolvedRelation[] = []): Promise<T> {\r\n if (isUnresolvedRelation(item)) {\r\n if (context.depth === 0) {\r\n return item.value as T;\r\n }\r\n // skip circular reference\r\n const index = relations.findIndex(x =>\r\n x.relationTo === item.relationTo && x.value === item.value\r\n );\r\n if (index === -1) {\r\n const isMany = Array.isArray(item.value);\r\n const values = isMany ? item.value : [item.value];\r\n let items: ICategorized[] = [];\r\n const collection = context.store[item.relationTo];\r\n if (collection) {\r\n items = await collection.findMany<ICategorized>({\r\n ...context.params,\r\n where: {\r\n id: { in: values },\r\n },\r\n depth: context.depth - 1,\r\n });\r\n } else {\r\n console.log('collectRelations_', `unknown relation \"${item.relationTo}\"`);\r\n }\r\n const resolvedValue = isMany ? items : (items.length > 0 ? items[0]! : null);\r\n // console.log('resolvedValue', resolvedValue);\r\n relations.push({\r\n ...item,\r\n resolvedValue,\r\n });\r\n return resolvedValue as T;\r\n } else {\r\n return relations[index]!.resolvedValue as T;\r\n }\r\n } else if (isArray(item)) {\r\n const items = [];\r\n for (let i = 0; i < item.length; i++) {\r\n items[i] = await collectRelations_(context, item[i], relations);\r\n }\r\n return items as T;\r\n } else if (isObject(item)) {\r\n for (const [key, value] of Object.entries(item)) {\r\n (item[key] as any) = await collectRelations_(context, value, relations);\r\n }\r\n }\r\n return item;\r\n}\r\n","import { ISchema, IStore } from '@websolutespa/bom-core';\r\n\r\nexport async function decorateSchema_<T extends ISchema = ISchema>(store: IStore, item: T, schema: string): Promise<T | T & { schema: string }> {\r\n return { ...item, schema: item.schema || schema };\r\n}\r\n\r\nexport async function decorateSchemas_<T extends ISchema = ISchema>(store: IStore, items: T[], schema: string): Promise<(T & { schema: string })[]> {\r\n return items.map(item => {\r\n return { ...item, schema: item.schema || schema };\r\n });\r\n}\r\n","import { httpFetch, isBrowser, merge } from '@websolutespa/bom-core';\r\nimport { ApiRequestOptions, getLocalApiRequestOptions } from '../api/api';\r\n\r\n/**\r\n * This methods handle api requests / responses to local api (mixer)\r\n */\r\n\r\nconst API_URL = (\r\n process.env.NEXT_PUBLIC_URL === 'https://' ?\r\n process.env.NEXT_PUBLIC_MOCK_FALLBACK_URL :\r\n process.env.NEXT_PUBLIC_URL\r\n);\r\nconst API_BASE = process.env.NEXT_PUBLIC_API || '/api';\r\n\r\nexport function getLocalApiUrl(pathname: string): string {\r\n const url = `${isBrowser ? window.location.origin : API_URL}${API_BASE}${pathname}`;\r\n // console.log('getLocalApiUrl', url);\r\n return url;\r\n}\r\n\r\nexport async function localApiFetch<T = unknown>(pathname: string, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n // console.log('localApiFetch', pathname, options, serviceOptions);\r\n const url = new URL(getLocalApiUrl(pathname));\r\n if (serviceOptions) {\r\n url.searchParams.append('locale', serviceOptions.locale);\r\n url.searchParams.append('market', serviceOptions.market);\r\n }\r\n const apiOptions = merge({ ...getLocalApiRequestOptions() }, options);\r\n console.log('localApiFetch', apiOptions.method, url.href);\r\n const apiResponse = await httpFetch(url.href, apiOptions);\r\n // console.log('localApiFetch', pathname, apiResponse);\r\n return apiResponse;\r\n}\r\n\r\nexport async function localApiGet<T = unknown>(url: string, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'GET' }, serviceOptions);\r\n}\r\n\r\nexport async function localApiPost<T = unknown>(url: string, payload?: unknown, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'POST', body: payload ? JSON.stringify(payload) : undefined }, serviceOptions);\r\n}\r\n\r\nexport async function localApiPut<T = unknown>(url: string, payload?: unknown, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'PUT', body: payload ? JSON.stringify(payload) : undefined }, serviceOptions);\r\n}\r\n\r\nexport async function localApiPatch<T = unknown>(url: string, payload?: unknown, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'PATCH', body: payload ? JSON.stringify(payload) : undefined }, serviceOptions);\r\n}\r\n\r\nexport async function localApiDelete<T = unknown>(url: string, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'DELETE' }, serviceOptions);\r\n}\r\n","import { httpFetch, merge } from '@websolutespa/bom-core';\r\nimport { ApiRequestOptions, getLocalApiRequestOptions } from '../api/api';\r\n\r\n/**\r\n * This methods handle api requests / responses to local /api/_mock data\r\n */\r\nconst API_URL = process.env.NEXT_PUBLIC_URL;\r\nconst API_BASE = process.env.NEXT_PUBLIC_API || '/api';\r\n\r\nfunction getMockApiUrl(pathname: string): string {\r\n const url = `${API_URL}${API_BASE}/_mock${pathname}`;\r\n // console.log('getMockApiUrl', url);\r\n return url;\r\n}\r\n\r\nexport async function mockApiFetch<T = unknown>(pathname: string, options: ApiRequestOptions = {}): Promise<T> {\r\n const url = getMockApiUrl(pathname);\r\n const apiOptions = merge({ ...getLocalApiRequestOptions() }, options);\r\n console.log('mockApiFetch', apiOptions.method, url);\r\n const apiResponse = await httpFetch(url, apiOptions);\r\n return apiResponse;\r\n}\r\n\r\nexport async function mockApiGet<T = unknown>(url: string, options: ApiRequestOptions = {}): Promise<T> {\r\n return await mockApiFetch<T>(url, { ...options, method: 'GET' });\r\n}\r\n\r\nexport async function mockApiPost<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await mockApiFetch<T>(url, { ...options, method: 'POST', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function mockApiPut<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await mockApiFetch<T>(url, { ...options, method: 'PUT', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function mockApiPatch<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await mockApiFetch<T>(url, { ...options, method: 'PATCH', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function mockApiDelete<T = unknown>(url: string, options: ApiRequestOptions = {}): Promise<T> {\r\n return await mockApiFetch<T>(url, { ...options, method: 'DELETE' });\r\n}\r\n","import { httpFetch, isBrowser, merge } from '@websolutespa/bom-core';\r\nimport { ApiRequestOptions, getRemoteApiRequestOptions } from '../api/api';\r\n\r\n/**\r\n * This methods handle api requests / responses to remote api (bowl or over)\r\n */\r\n\r\nconst API_URL = process.env.STORE_URL;\r\nconst API_BASE = process.env.STORE_API || '/api';\r\n\r\nexport function getRemoteApiUrl(pathname: string): string {\r\n const url = `${API_URL}${API_BASE}${pathname}`;\r\n // console.log('getRemoteApiUrl', url);\r\n return url;\r\n}\r\n\r\nexport async function remoteApiFetch<T = unknown>(pathname: string, options: ApiRequestOptions = {}): Promise<T> {\r\n if (isBrowser) {\r\n throw 'Unauthorized: remote api cannot be fetched client side';\r\n }\r\n const url = getRemoteApiUrl(pathname);\r\n const apiOptions = merge({ ...getRemoteApiRequestOptions() }, options);\r\n // console.log('remoteApiFetch', apiOptions.method, url);\r\n // console.log('remoteApiFetch', 'Authorization', apiOptions.headers?.Authorization);\r\n const apiResponse = await httpFetch(url, apiOptions);\r\n return apiResponse;\r\n}\r\n\r\nexport async function remoteApiGet<T = unknown>(url: string, options: ApiRequestOptions = {}): Promise<T> {\r\n return await remoteApiFetch<T>(url, { ...options, method: 'GET' });\r\n}\r\n\r\nexport async function remoteApiPost<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await remoteApiFetch<T>(url, { ...options, method: 'POST', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function remoteApiPut<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await remoteApiFetch<T>(url, { ...options, method: 'PUT', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function remoteApiPatch<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await remoteApiFetch<T>(url, { ...options, method: 'PATCH', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function remoteApiDelete<T = unknown>(url: string, options: ApiRequestOptions = {}): Promise<T> {\r\n return await remoteApiFetch<T>(url, { ...options, method: 'DELETE' });\r\n}\r\n","import type { IEntity } from '@websolutespa/bom-core';\r\n\r\nexport type IField = {\r\n name: string,\r\n type: 'text' | 'number' | 'relationship',\r\n localized?: boolean,\r\n relationTo?: string,\r\n hasMany?: boolean,\r\n required?: boolean\r\n};\r\n\r\nexport type MapTo = Record<string, string>;\r\n\r\nexport type StaticServiceSrc<T extends IEntity = IEntity> = string | T[] | ((config: StaticServiceConfig<T>) => T[]) | ((config: StaticServiceConfig<T>) => Promise<T[]>);\r\n\r\nexport type StaticServiceConfig<T extends IEntity = IEntity> = {\r\n src: StaticServiceSrc<T>;\r\n slug: string;\r\n fields: IField[];\r\n map?: MapTo;\r\n};\r\n\r\nexport const staticCollections: StaticServiceConfig[] = [{\r\n src: 'https://actarian.github.io/cms-i18n-react/api/continent.json',\r\n slug: 'i18n_continent',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n },\r\n ],\r\n}, {\r\n src: 'https://actarian.github.io/cms-i18n-react/api/country.json',\r\n slug: 'i18n_country',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n localized: true,\r\n },\r\n {\r\n name: 'englishName',\r\n type: 'text',\r\n },\r\n {\r\n name: 'nativeName',\r\n type: 'text',\r\n },\r\n {\r\n name: 'alpha2Code',\r\n type: 'text',\r\n },\r\n {\r\n name: 'alpha3Code',\r\n type: 'text',\r\n },\r\n {\r\n name: 'continent',\r\n type: 'relationship',\r\n relationTo: 'i18n_continent',\r\n hasMany: false,\r\n required: true,\r\n },\r\n {\r\n name: 'subContinent',\r\n type: 'relationship',\r\n relationTo: 'i18n_sub_continent',\r\n hasMany: false,\r\n required: true,\r\n },\r\n ],\r\n}, {\r\n src: 'https://actarian.github.io/cms-i18n-react/api/countryZone.json',\r\n slug: 'i18n_country_zone',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n },\r\n ],\r\n}, {\r\n src: 'https://actarian.github.io/cms-i18n-react/api/language.json',\r\n slug: 'i18n_country_zone',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n localized: true,\r\n },\r\n {\r\n name: 'englishName',\r\n type: 'text',\r\n },\r\n {\r\n name: 'nativeName',\r\n type: 'text',\r\n },\r\n ],\r\n}, {\r\n src: 'https://actarian.github.io/cms-i18n-react/api/municipality.json',\r\n slug: 'i18n_municipality',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n },\r\n {\r\n name: 'code',\r\n type: 'text',\r\n },\r\n {\r\n name: 'country',\r\n type: 'relationship',\r\n relationTo: 'i18n_country',\r\n hasMany: false,\r\n required: true,\r\n },\r\n {\r\n name: 'countryZone',\r\n type: 'relationship',\r\n relationTo: 'i18n_country_zone',\r\n hasMany: false,\r\n required: true,\r\n },\r\n {\r\n name: 'region',\r\n type: 'relationship',\r\n relationTo: 'i18n_region',\r\n hasMany: false,\r\n required: true,\r\n },\r\n {\r\n name: 'province',\r\n type: 'relationship',\r\n relationTo: 'i18n_province',\r\n hasMany: false,\r\n required: true,\r\n },\r\n ],\r\n}, {\r\n src: 'https://actarian.github.io/cms-i18n-react/api/province.json',\r\n slug: 'i18n_province',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n },\r\n {\r\n name: 'code',\r\n type: 'text',\r\n },\r\n {\r\n name: 'country',\r\n type: 'relationship',\r\n relationTo: 'i18n_country',\r\n hasMany: false,\r\n required: true,\r\n },\r\n {\r\n name: 'countryZone',\r\n type: 'relationship',\r\n relationTo: 'i18n_country_zone',\r\n hasMany: false,\r\n required: true,\r\n },\r\n {\r\n name: 'region',\r\n type: 'relationship',\r\n relationTo: 'i18n_region',\r\n hasMany: false,\r\n required: true,\r\n },\r\n ],\r\n}, {\r\n src: 'https://actarian.github.io/cms-i18n-react/api/region.json',\r\n slug: 'i18n_region',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n },\r\n {\r\n name: 'country',\r\n type: 'relationship',\r\n relationTo: 'i18n_country',\r\n hasMany: false,\r\n required: true,\r\n },\r\n {\r\n name: 'countryZone',\r\n type: 'relationship',\r\n relationTo: 'i18n_country_zone',\r\n hasMany: false,\r\n required: true,\r\n },\r\n ],\r\n}, {\r\n src: 'https://actarian.github.io/cms-i18n-react/api/subContinent.json',\r\n slug: 'i18n_sub_continent',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n },\r\n {\r\n name: 'continent',\r\n type: 'relationship',\r\n relationTo: 'i18n_continent',\r\n hasMany: false,\r\n required: true,\r\n },\r\n ],\r\n}];\r\n","import { staticCollections } from '../static/static';\r\n\r\n// nextPhase\r\nexport enum NextPhase {\r\n Export = 'phase-export',\r\n ProductionBuild = 'phase-production-build',\r\n ProductionServer = 'phase-production-server',\r\n DevelopmentServer = 'phase-development-server',\r\n Test = 'phase-test',\r\n}\r\n\r\nfunction getNextPhase(): NextPhase {\r\n let nextPhase = NextPhase.Export;\r\n if (typeof process !== 'undefined' && process.env.NEXT_PHASE) {\r\n nextPhase = process.env.NEXT_PHASE as NextPhase;\r\n }\r\n return nextPhase;\r\n}\r\n\r\nexport const nextPhase: NextPhase = getNextPhase();\r\n\r\n// buildStrategy\r\nexport enum BuildStrategy {\r\n Static = 'static',\r\n Runtime = 'runtime',\r\n}\r\n\r\nfunction getBuildStrategy(): BuildStrategy {\r\n let buildStrategy = BuildStrategy.Static;\r\n if (typeof process !== 'undefined' && process.env.BUILD_STRATEGY) {\r\n buildStrategy = process.env.BUILD_STRATEGY as BuildStrategy;\r\n }\r\n return buildStrategy;\r\n}\r\n\r\nexport const buildStrategy: BuildStrategy = getBuildStrategy();\r\n\r\n// storeStrategy\r\nexport enum StoreStrategy {\r\n // Local = 'local',\r\n Api = 'api',\r\n DecoratedApi = 'decoratedApi',\r\n Data = 'data',\r\n Mock = 'mock',\r\n}\r\n\r\nfunction getStoreStrategy(): StoreStrategy {\r\n let storeStrategy = StoreStrategy.Mock;\r\n if (typeof process !== 'undefined' && process.env.STORE_STRATEGY) {\r\n storeStrategy = process.env.STORE_STRATEGY as StoreStrategy;\r\n }\r\n return storeStrategy;\r\n}\r\n\r\nexport const storeStrategy: StoreStrategy = getStoreStrategy();\r\n\r\n// storeCacheDuration\r\nfunction getStoreCacheDuration(): number {\r\n let storeCacheDuration = (1 * 60 * 1000);\r\n if (typeof process !== 'undefined' && process.env.STORE_CACHE_DURATION) {\r\n storeCacheDuration = parseInt(process.env.STORE_CACHE_DURATION);\r\n }\r\n return storeCacheDuration;\r\n}\r\n\r\nexport const storeCacheDuration: number = getStoreCacheDuration();\r\n\r\n// collections\r\nconst ENV_COLLECTIONS: string[] = process.env.COLLECTIONS ? process.env.COLLECTIONS.split(',') : [];\r\nexport const MOCK_COLLECTIONS: string[] = process.env.MOCKS ? process.env.MOCKS.split(',') : [];\r\nexport const STATIC_COLLECTIONS: string[] = staticCollections.map(x => x.slug);\r\nexport const KNOWN_COLLECTIONS: string[] = [\r\n 'app',\r\n 'category',\r\n 'label',\r\n 'locale',\r\n 'market',\r\n 'menu',\r\n 'redirect',\r\n 'route',\r\n 'template',\r\n ...STATIC_COLLECTIONS,\r\n];\r\nexport const COLLECTIONS = [...ENV_COLLECTIONS, ...KNOWN_COLLECTIONS];\r\n","import { ApiRequestOptions } from '../api/api';\r\nimport { localApiFetch } from '../local/local.api';\r\nimport { remoteApiFetch } from '../remote/remote.api';\r\nimport { StoreStrategy, storeStrategy } from './store';\r\n\r\nconst storeApiFetch = storeStrategy === StoreStrategy.Mock ? localApiFetch : remoteApiFetch;\r\n\r\nexport async function storeApiGet<T = unknown>(url: string, options: ApiRequestOptions = {}): Promise<T> {\r\n return await storeApiFetch<T>(url, { ...options, method: 'GET' });\r\n}\r\n\r\nexport async function storeApiPost<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await storeApiFetch<T>(url, { ...options, method: 'POST', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function storeApiPut<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await storeApiFetch<T>(url, { ...options, method: 'PUT', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function storeApiPatch<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await storeApiFetch<T>(url, { ...options, method: 'PATCH', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function storeApiDelete<T = unknown>(url: string, options: ApiRequestOptions = {}): Promise<T> {\r\n return await storeApiFetch<T>(url, { ...options, method: 'DELETE' });\r\n}\r\n"],"mappings":"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MAAM;EACN,QAAQ;GACN;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACZ;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;EACF;CACF;CAAE;EACD,KAAK;EACL,MAAM;EACN,QAAQ,CACN;GACE,MAAM;GACN,MAAM;EACP,GACD;GACE,MAAM;GACN,MAAM;EACP,CACF;CACF;CAAE;EACD,KAAK;EACL,MAAM;EACN,QAAQ;GACN;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACZ;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;EACF;CACF;CAAE;EACD,KAAK;EACL,MAAM;EACN,QAAQ;GACN;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;EACF;CACF;CAAE;EACD,KAAK;EACL,MAAM;EACN,QAAQ;GACN;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;GACD;IACE,MAAM;IACN,MAAM;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"}
|
|
1
|
+
{"version":3,"file":"src-DH2PQJMn.js","names":["token?: string","CACHE_: Map<string, unknown>","callback: () => Promise<T>","key?: string","store: IStore","item: T","params: QueryParams","items: T[]","categories: ICategory[]","routes: IRoute[]","depth: number","store: IStore","item: T","params: QueryParams","items: T[]","item: B","params: QueryParams","items: B[]","decoratedItems: B[]","store: IStore","item: IUndecoratedMenu","params: { market: string, locale: string }","decoratedItem: IMenu","items: IUndecoratedMenu[]","decoratedItems: IMenu[]","items: IUndecoratedMenuItem[]","market: string","item: IUndecoratedMenuItem","undecoratedCategories: IUndecoratedMenuCategory[]","undecoratedPages: IUndecoratedMenuPage[]","item: IUndecoratedMenuCategory","category: ICategory","items: IMenuItem[]","categories: ICategory[]","routes: IRoute[]","depth: number","route: IRoute","route","childRouteItems: IMenuItem[]","item: IRoute","decoratedItem: IMenuRoute","item: IUndecoratedMenuPage","params: QueryParams","decoratedItem: IMenuPage","store: IStore","item: T","params: QueryParams","routes?: IRoute[]","items: T[]","item: unknown","navs: IUndecoratedNav[]","item: IUndecoratedNav","routes: IRoute[]","item: T","items: T[]","optimizedItems: T[]","store: IStore","item: T","params: QueryParams","items: T[]","context: {\r\n store: IStore;\r\n params: QueryParams;\r\n depth: number;\r\n}","relations: IPageResolvedRelation[]","items: ICategorized[]","store: IStore","item: T","schema: string","items: T[]","API_URL","API_BASE","pathname: string","options: ApiRequestOptions","serviceOptions?: { locale: string, market: string }","url: string","payload?: unknown","API_URL","API_BASE","pathname: string","options: ApiRequestOptions","url: string","payload: unknown","pathname: string","options: ApiRequestOptions","url: string","payload: unknown","staticCollections: StaticServiceConfig[]","nextPhase","nextPhase: NextPhase","buildStrategy","buildStrategy: BuildStrategy","storeStrategy","storeStrategy: StoreStrategy","storeCacheDuration","storeCacheDuration: number","ENV_COLLECTIONS: string[]","MOCK_COLLECTIONS: string[]","STATIC_COLLECTIONS: string[]","KNOWN_COLLECTIONS: string[]","url: string","options: ApiRequestOptions","payload: unknown"],"sources":["../src/api/api.ts","../src/cache/cache.service.ts","../src/decorators/consts.ts","../src/decorators/category.ts","../src/decorators/href.ts","../src/decorators/localizable.ts","../src/decorators/menu.ts","../src/decorators/nav.ts","../src/decorators/optimize.ts","../src/decorators/relation.ts","../src/decorators/schema.ts","../src/local/local.api.ts","../src/mock/mock.api.ts","../src/remote/remote.api.ts","../src/static/static.ts","../src/store/store.ts","../src/store/store.api.ts"],"sourcesContent":["import { FetchRequestOptions } from '@websolutespa/bom-core';\r\n\r\nexport type ApiRequestOptions = FetchRequestOptions;\r\n\r\nexport function getLocalApiRequestOptions(): ApiRequestOptions {\r\n return {\r\n headers: {\r\n },\r\n };\r\n}\r\n\r\nexport function getRemoteApiRequestOptions(token?: string): ApiRequestOptions {\r\n if (token) {\r\n // authenticated end user JWT token bearer (end_users)\r\n return {\r\n // mode: 'cors',\r\n headers: {\r\n Authorization: `JWT ${token}`,\r\n // Authorization: `Bearer ${token}`,\r\n },\r\n };\r\n } else {\r\n // guest user api key (users)\r\n return {\r\n // mode: 'cors',\r\n headers: {\r\n Authorization: `users API-Key ${process.env.STORE_API_KEY}`,\r\n },\r\n };\r\n }\r\n}\r\n","const CACHE_: Map<string, unknown> = new Map<string, unknown>();\r\n\r\nexport async function fromCache<T = unknown>(callback: () => Promise<T>, key?: string): Promise<T> {\r\n if (key && CACHE_.has(key)) {\r\n return CACHE_.get(key) as T;\r\n } else {\r\n const t = await callback();\r\n if (key) {\r\n CACHE_.set(key, t);\r\n }\r\n return t;\r\n }\r\n}\r\n","\r\nexport const DEFAULT_DEPTH = 3;\r\n","import { ICategorized, ICategory, IEquatable, IRoute, IStore, QueryParams, findRouteOfCategory, isUnresolvedCategory } from '@websolutespa/bom-core';\r\nimport { DEFAULT_DEPTH } from './consts';\r\n\r\nexport async function decorateCategory_<T extends { category?: IEquatable | ICategory } = { category?: IEquatable | ICategory }>(store: IStore, item: T, params: QueryParams = {}): Promise<T | (T & { category: ICategory })> {\r\n const depth = params.depth != null ? params.depth : DEFAULT_DEPTH;\r\n if (depth === 0) {\r\n return item;\r\n }\r\n const categories = await store.category!.findMany<ICategory>({\r\n market: params.market,\r\n locale: params.locale,\r\n depth: 0,\r\n });\r\n const routes = await store.route!.findMany<IRoute>();\r\n const decoratedItem = await collectCategory_(categories, routes, item, params, depth);\r\n return decoratedItem as T & { category: ICategory };\r\n}\r\n\r\nexport async function decorateCategories_<T extends ICategorized = ICategorized>(store: IStore, items: T[], params: QueryParams = {}): Promise<(T | (T & { category: ICategory }))[]> {\r\n const depth = params.depth != null ? params.depth : DEFAULT_DEPTH;\r\n if (depth === 0) {\r\n return items;\r\n }\r\n const categories = await store.category!.findMany<ICategory>({\r\n market: params.market,\r\n locale: params.locale,\r\n depth: 0,\r\n });\r\n const routes = await store.route!.findMany<IRoute>();\r\n const decoratedItems = [];\r\n for (const item of items) {\r\n const decoratedItem = await collectCategory_(categories, routes, item, params, depth);\r\n decoratedItems.push(decoratedItem);\r\n }\r\n return decoratedItems;\r\n}\r\n\r\nexport async function collectCategory_<\r\n T extends { category?: IEquatable | ICategory } = { category?: IEquatable | ICategory }\r\n>(\r\n categories: ICategory[],\r\n routes: IRoute[],\r\n item: T,\r\n params: QueryParams = {},\r\n depth: number\r\n): Promise<T> {\r\n if (depth === 0) {\r\n return item;\r\n }\r\n if (isUnresolvedCategory(item.category)) {\r\n const category = categories.find(x => x.id === item.category);\r\n if (category) {\r\n const route = findRouteOfCategory(routes, category.id, params.market, params.locale);\r\n if (route) {\r\n category.href = route.id;\r\n }\r\n const decoratedCategory = await collectCategory_(categories, routes, category, params, depth - 1);\r\n return { ...item, category: decoratedCategory };\r\n }\r\n }\r\n return item;\r\n}\r\n","import { IRoute, ISchema, IStore, QueryParams } from '@websolutespa/bom-core';\r\n\r\nexport async function decorateHref_<T extends ISchema = ISchema>(store: IStore, item: T, params: QueryParams = {}): Promise<T | T & { href: string | null }> {\r\n if (params.market && params.locale) {\r\n const routes = await store.route!.findMany<IRoute>({\r\n where: {\r\n market: {\r\n equals: params.market,\r\n },\r\n locale: {\r\n equals: params.locale,\r\n },\r\n schema: {\r\n equals: item.schema,\r\n },\r\n page: {\r\n equals: item.id,\r\n },\r\n },\r\n });\r\n const href = routes.length ? routes[0]!.id : null;\r\n return { ...item, href };\r\n } else {\r\n return item;\r\n }\r\n}\r\n\r\nexport async function decorateHrefs_<T extends ISchema = ISchema>(store: IStore, items: T[], params: QueryParams = {}): Promise<T[] | (T & { href: string | null })[]> {\r\n if (params.market && params.locale) {\r\n const routes = await store.route!.findMany<IRoute>({\r\n where: {\r\n market: {\r\n equals: params.market,\r\n },\r\n locale: {\r\n equals: params.locale,\r\n },\r\n },\r\n });\r\n return items.map(item => {\r\n const route = routes.find(x =>\r\n x.schema === item.schema &&\r\n x.page === item.id\r\n );\r\n const href = route ? route.id : null;\r\n return { ...item, href };\r\n });\r\n } else {\r\n return items;\r\n }\r\n}\r\n","import { QueryParams, cloneItem, localizeItem } from '@websolutespa/bom-core';\r\n\r\nexport async function decorateLocalizable_<B>(item: B, params: QueryParams = {}): Promise<B> {\r\n if (params.locale) {\r\n return localizeItem(item, params.locale);\r\n } else {\r\n return cloneItem(item);\r\n }\r\n}\r\n\r\nexport async function decorateLocalizables_<B>(items: B[], params: QueryParams = {}): Promise<B[]> {\r\n const decoratedItems: B[] = [];\r\n for (const item of items) {\r\n const decoratedItem = params.locale ?\r\n localizeItem(item, params.locale) :\r\n cloneItem(item);\r\n decoratedItems.push(decoratedItem);\r\n }\r\n return decoratedItems;\r\n}\r\n","import {\r\n ICategorized, ICategory, IMenu, IMenuCategory, IMenuGroup, IMenuItem, IMenuPage, IMenuRoute, IRoute, IStore,\r\n IUndecoratedMenu, IUndecoratedMenuCategory, IUndecoratedMenuItem, IUndecoratedMenuPage, MenuCategoryStrategy, QueryParams,\r\n asCategoryId,\r\n findCategoryInCategories,\r\n findChildCategories,\r\n findRouteOfCategory,\r\n isEquatable, isUndecoratedMenuCategory, isUndecoratedMenuPage,\r\n uuidv4\r\n} from '@websolutespa/bom-core';\r\n\r\nexport async function decorateMenu_(store: IStore, item: IUndecoratedMenu, params: { market: string, locale: string }): Promise<IMenu> {\r\n const { market, locale } = params;\r\n const items = itemsFilteredByMarket_(item.items || [], market);\r\n const decoratedItem: IMenu = {\r\n id: item.id,\r\n items: [],\r\n };\r\n const undecoratedCategories = collectUndecoratedCategories(items);\r\n const undecoratedPages = collectUndecoratedPages(items);\r\n if (\r\n undecoratedCategories.length > 0 ||\r\n undecoratedPages.length > 0\r\n ) {\r\n const routes = await store.route!.findMany<IRoute>({\r\n where: {\r\n ...(market ? { market: { equals: market } } : {}),\r\n ...(locale ? { locale: { equals: locale } } : {}),\r\n },\r\n });\r\n if (undecoratedCategories.length > 0) {\r\n const categories = await store.category!.findMany<ICategory>(params);\r\n for (const undecoratedMenuCategory of undecoratedCategories) {\r\n const decoratedMenuCategory = decorateMenuCategory_(undecoratedMenuCategory, categories, routes, market);\r\n Object.assign(undecoratedMenuCategory, decoratedMenuCategory);\r\n }\r\n }\r\n for (const undecoratedMenuPage of undecoratedPages) {\r\n const decoratedMenuPage = await decorateMenuPage_(undecoratedMenuPage, routes, store, { ...params });\r\n Object.assign(undecoratedMenuPage, decoratedMenuPage);\r\n }\r\n }\r\n decoratedItem.items = items as IMenuItem[];\r\n return decoratedItem;\r\n}\r\n\r\nexport async function decorateMenus_(store: IStore, items: IUndecoratedMenu[], params: { market: string, locale: string }): Promise<IMenu[]> {\r\n const decoratedItems: IMenu[] = [];\r\n for (const item of items) {\r\n const decoratedItem = await decorateMenu_(store, item, params);\r\n decoratedItems.push(decoratedItem);\r\n }\r\n return decoratedItems;\r\n}\r\n\r\nfunction itemsFilteredByMarket_(items: IUndecoratedMenuItem[], market: string): IUndecoratedMenuItem[] {\r\n return items.filter(x => {\r\n const hasMarket = itemHasMarket_(x, market);\r\n if (hasMarket && x.items) {\r\n x.items = itemsFilteredByMarket_(x.items || [], market);\r\n }\r\n return hasMarket;\r\n });\r\n}\r\n\r\nfunction itemHasMarket_(item: IUndecoratedMenuItem, market: string): boolean {\r\n return (Array.isArray(item.markets) && item.markets.length > 0) ? item.markets.includes(market) : true;\r\n}\r\n\r\nfunction collectUndecoratedCategories(items: IUndecoratedMenuItem[], undecoratedCategories: IUndecoratedMenuCategory[] = []): IUndecoratedMenuCategory[] {\r\n items.forEach(item => {\r\n if (isUndecoratedMenuCategory(item)) {\r\n undecoratedCategories.push(item);\r\n }\r\n if (item.items) {\r\n collectUndecoratedCategories(item.items, undecoratedCategories);\r\n }\r\n });\r\n return undecoratedCategories;\r\n}\r\n\r\nfunction collectUndecoratedPages(items: IUndecoratedMenuItem[], undecoratedPages: IUndecoratedMenuPage[] = []): IUndecoratedMenuPage[] {\r\n items.forEach(item => {\r\n if (isUndecoratedMenuPage(item)) {\r\n undecoratedPages.push(item);\r\n }\r\n if (item.items) {\r\n collectUndecoratedPages(item.items, undecoratedPages);\r\n }\r\n });\r\n return undecoratedPages;\r\n}\r\n\r\nexport const MAX_INT = 1000000000000; // 9007199254740991\r\n\r\nfunction makeCategoryMenuItem_(item: IUndecoratedMenuCategory, category: ICategory): IMenuCategory | IMenuGroup {\r\n const id = item.id || uuidv4();\r\n const title = item.title || category.title || '';\r\n const abstract = item.abstract || undefined;\r\n const customClass = item.customClass || undefined;\r\n const media = item.media || category.media;\r\n const items: IMenuItem[] = [];\r\n return category.isHidden ?\r\n {\r\n type: 'group',\r\n id,\r\n title,\r\n abstract,\r\n media,\r\n customClass,\r\n items,\r\n } : {\r\n type: 'category',\r\n category: category.id,\r\n id,\r\n href: '',\r\n title,\r\n abstract,\r\n media,\r\n customClass,\r\n items,\r\n };\r\n}\r\n\r\nfunction decorateMenuCategory_(\r\n item: IUndecoratedMenuCategory,\r\n categories: ICategory[],\r\n routes: IRoute[],\r\n market: string,\r\n depth: number = 0\r\n): IMenuItem | undefined {\r\n const strategy = item.strategy || MenuCategoryStrategy.Default;\r\n const categoryId = asCategoryId(item.category);\r\n // find category\r\n const category = categoryId ? categories.find(x => x.id === categoryId) : undefined;\r\n if (category) {\r\n const decoratedItem = makeCategoryMenuItem_(item, category);\r\n if (!category.isHidden) {\r\n const route = routes.find((route: IRoute) => route.isDefault && route.resolvedCategory === category.id);\r\n if (route) {\r\n (decoratedItem as IMenuCategory).href = route.id;\r\n if (!decoratedItem.media) {\r\n decoratedItem.media = route.media;\r\n }\r\n }\r\n }\r\n // checking for max depth recursion\r\n let maxDepth = item.maxDepth;\r\n if (typeof maxDepth === 'number') {\r\n if (depth > maxDepth) {\r\n return decoratedItem;\r\n }\r\n maxDepth--;\r\n }\r\n // search child categories\r\n const childCategories = (category.id ?\r\n categories.filter(x => asCategoryId(x.category) === category.id) : []\r\n ).filter(x => {\r\n switch (strategy) {\r\n case MenuCategoryStrategy.ExcludeHidden:\r\n return Boolean(x.isHidden) === false;\r\n case MenuCategoryStrategy.Default:\r\n return true;\r\n }\r\n });\r\n // sort child categories\r\n childCategories.sort((a, b) => {\r\n return (a.order || MAX_INT) - (b.order || MAX_INT);\r\n });\r\n // define sub strategy (!!! todo)\r\n const subStrategy = strategy;\r\n // decorate child categories\r\n const childCategoryItems = childCategories.map(c => decorateMenuCategory_({\r\n id: c.id,\r\n type: 'category',\r\n category: c.id,\r\n maxDepth,\r\n strategy: subStrategy, // dispatch sub strategy\r\n items: [],\r\n } as IUndecoratedMenuCategory, categories, routes, market, depth + 1));\r\n // find child routes\r\n const childRoutes = routes.filter((route: IRoute) => {\r\n switch (strategy) {\r\n case MenuCategoryStrategy.ExcludeHidden:\r\n return route.resolvedCategory === category.id && Boolean(route.isDefault) === false;\r\n case MenuCategoryStrategy.Default:\r\n return route.category === category.id && (category.isHidden || Boolean(route.isDefault) === false);\r\n }\r\n });\r\n // sort child routes\r\n childRoutes.sort((a, b) => {\r\n return (a.order || MAX_INT) - (b.order || MAX_INT);\r\n });\r\n // decorate child routes\r\n const childRouteItems: IMenuItem[] = childRoutes.map(x => decorateMenuRoute_(x));\r\n // filter items\r\n decoratedItem.items = [\r\n ...childCategoryItems,\r\n ...childRouteItems,\r\n ].filter(x => Boolean(x)) as IMenuItem[];\r\n return decoratedItem;\r\n }\r\n // return unresolved category as group\r\n return {\r\n id: item.id || uuidv4(),\r\n type: 'group',\r\n title: item.title || '',\r\n items: [],\r\n };\r\n}\r\n\r\nfunction decorateMenuCategoryWithHiddenSubCategories_(\r\n item: IUndecoratedMenuCategory,\r\n categories: ICategory[],\r\n routes: IRoute[],\r\n market: string,\r\n depth: number = 0\r\n): IMenuItem {\r\n const decoratedItem: IMenuCategory = {\r\n abstract: item.abstract,\r\n category: '',\r\n customClass: item.customClass,\r\n href: '',\r\n id: item.id || uuidv4(),\r\n items: [],\r\n title: '',\r\n type: item.type,\r\n };\r\n /*\r\n const categoryId = asCategoryId(item.category);\r\n const category = categoryId ? categories.find(x => x.id === categoryId) : undefined;\r\n */\r\n const category = findCategoryInCategories(categories, item.category);\r\n if (category) {\r\n // assigning category id\r\n decoratedItem.category = category.id;\r\n // assigning category title\r\n decoratedItem.title = item.title || category.title || '';\r\n // assigning current or category media\r\n decoratedItem.media = item.media || category.media;\r\n // find category's index page route\r\n const route = findRouteOfCategory(routes, category.id);\r\n if (route) {\r\n // hasLink\r\n decoratedItem.href = route.id;\r\n } else {\r\n // isGroup\r\n }\r\n // checking for max depth recursion\r\n let maxDepth = item.maxDepth;\r\n if (typeof maxDepth === 'number') {\r\n if (depth > maxDepth) {\r\n return decoratedItem;\r\n }\r\n maxDepth--;\r\n }\r\n // search child categories\r\n const childCategories = findChildCategories(categories, category.id);\r\n if (childCategories.length) {\r\n // sort child categories\r\n childCategories.sort((a, b) => {\r\n return (a.order || MAX_INT) - (b.order || MAX_INT);\r\n });\r\n decoratedItem.items = childCategories.map(c => {\r\n const menuCategory = decorateMenuCategoryWithHiddenSubCategories_({\r\n id: c.id,\r\n type: 'category',\r\n category: c.id,\r\n maxDepth,\r\n items: [],\r\n } as IUndecoratedMenuCategory, categories, routes, market, depth + 1);\r\n if (c.isHidden) {\r\n const group: IMenuGroup = {\r\n id: c.id,\r\n type: 'group',\r\n title: c.title,\r\n items: [\r\n ...(menuCategory.items || []),\r\n ],\r\n };\r\n // find child routes\r\n // const childRoutes = findRoutesOfCategory(routes, c.id, false);\r\n const childRoutes = routes.filter((route: IRoute) =>\r\n route.category === c.id &&\r\n Boolean(route.isDefault) === false\r\n );\r\n // sort child routes\r\n childRoutes.sort((a, b) => {\r\n return (a.order || MAX_INT) - (b.order || MAX_INT);\r\n });\r\n const routeLinks = childRoutes.map(x => decorateMenuRoute_(x));\r\n group.items?.push(...routeLinks);\r\n return group;\r\n } else {\r\n return decorateMenuCategoryWithHiddenSubCategories_({\r\n id: c.id,\r\n type: 'category',\r\n category: c.id,\r\n maxDepth,\r\n items: [],\r\n } as IUndecoratedMenuCategory, categories, routes, market, depth + 1);\r\n }\r\n });\r\n }\r\n // find child routes\r\n // const childRoutes = findRoutesOfCategory(routes, category.id, false);\r\n const childRoutes = routes.filter((route: IRoute) =>\r\n route.category === category.id &&\r\n Boolean(route.isDefault) === false\r\n );\r\n // console.log('childRoutes', childRoutes, category.id);\r\n // sort child routes\r\n childRoutes.sort((a, b) => {\r\n return (a.order || MAX_INT) - (b.order || MAX_INT);\r\n });\r\n decoratedItem.items = [\r\n ...(decoratedItem.items || []),\r\n ...childRoutes.map(x => decorateMenuRoute_(x)),\r\n ];\r\n\r\n }\r\n return decoratedItem;\r\n}\r\n\r\nfunction decorateMenuRoute_(\r\n item: IRoute\r\n): IMenuItem {\r\n const decoratedItem: IMenuRoute = {\r\n id: uuidv4(),\r\n type: 'route',\r\n title: item.title,\r\n href: item.id,\r\n media: item.media,\r\n page: item.page,\r\n schema: item.schema,\r\n items: [],\r\n };\r\n return decoratedItem;\r\n}\r\n\r\nasync function decorateMenuPage_(\r\n item: IUndecoratedMenuPage,\r\n routes: IRoute[],\r\n store: IStore,\r\n params: QueryParams = {}\r\n): Promise<IMenuItem> {\r\n const values = Array.isArray(item.page.value) ? item.page.value : [item.page.value];\r\n const value = values[0]!; // !!!\r\n const id = isEquatable(value) ? value : value.id;\r\n const route = routes.find(x =>\r\n x.schema === item.page.relationTo &&\r\n x.page === id\r\n );\r\n const page = await store[item.page.relationTo]!.findOne<ICategorized>(id, { ...params });\r\n const decoratedItem: IMenuPage = {\r\n id: item.id || uuidv4(),\r\n type: item.type,\r\n title: item.title || page?.title || '',\r\n abstract: item.abstract || page?.abstract || '',\r\n customClass: item.customClass,\r\n href: route?.id || '',\r\n media: page?.media,\r\n page: route?.page || '',\r\n schema: route?.schema || '',\r\n items: (item.items || []) as IMenuItem[],\r\n };\r\n return decoratedItem;\r\n}\r\n","import { IDecoratedNav, IEquatable, IRoute, ISchema, IStore, IUndecoratedNav, QueryParams, isArray, isObject, isUndecoratedNav } from '@websolutespa/bom-core';\r\n\r\nexport async function decorateNav_<T extends ISchema = ISchema>(store: IStore, item: T, params: QueryParams = {}, routes?: IRoute[]): Promise<T> {\r\n if (!routes) {\r\n routes = await store.route!.findMany<IRoute>({\r\n where: {\r\n ...(params.market ? { market: { equals: params.market } } : {}),\r\n ...(params.locale ? { locale: { equals: params.locale } } : {}),\r\n },\r\n });\r\n }\r\n const navs = collectNavs_(item);\r\n for (const nav of navs) {\r\n const decoratedNav = decorateNav__(nav, routes);\r\n Object.assign(nav, decoratedNav);\r\n // (nav as IDecoratedNav<T>).nav = decoratedNav.nav;\r\n }\r\n return item;\r\n}\r\n\r\nexport async function decorateNavs_<T extends ISchema = ISchema>(store: IStore, items: T[], params: QueryParams = {}): Promise<T[]> {\r\n const routes = await store.route!.findMany<IRoute>({\r\n where: {\r\n ...(params.market ? { market: { equals: params.market } } : {}),\r\n ...(params.locale ? { locale: { equals: params.locale } } : {}),\r\n },\r\n });\r\n for (const item of items) {\r\n await decorateNav_<T>(store, item, params, routes);\r\n }\r\n return items;\r\n}\r\n\r\n// collecting navs recursively\r\nfunction collectNavs_(item: unknown, navs: IUndecoratedNav[] = []): IUndecoratedNav[] {\r\n if (isUndecoratedNav(item)) {\r\n navs.push(item);\r\n }\r\n // console.log(item, isUndecoratedNav<T>(item));\r\n if (isArray(item)) {\r\n item.forEach(x => collectNavs_(x, navs));\r\n } else if (isObject(item)) {\r\n Object.values(item).forEach(value => {\r\n collectNavs_(value, navs);\r\n });\r\n }\r\n return navs;\r\n}\r\n\r\nfunction decorateNav__(item: IUndecoratedNav, routes: IRoute[]): IDecoratedNav {\r\n let decoratedNav = item as unknown as IDecoratedNav;\r\n if (item !== undefined) {\r\n const route = routes.find(x =>\r\n x.page === (item.page.value as unknown as IEquatable) &&\r\n x.schema === item.page.relationTo\r\n );\r\n if (route) {\r\n decoratedNav = {\r\n type: 'page',\r\n id: route.page,\r\n href: route.id,\r\n title: route.title,\r\n page: route.page,\r\n schema: route.schema,\r\n };\r\n }\r\n }\r\n return decoratedNav;\r\n}\r\n","import { ICategorized } from '@websolutespa/bom-core';\r\n\r\nexport async function optimizeOne_<T extends ICategorized = ICategorized>(item: T): Promise<T> {\r\n const validEntries = Object.entries(item).filter(([key, value]) => {\r\n switch (key) {\r\n case 'components':\r\n case 'meta':\r\n return false;\r\n /*\r\n default:\r\n if (\r\n isUnresolvedRelation(value) ||\r\n (\r\n Array.isArray(value) &&\r\n value.reduce((p, c) => p && isUnresolvedRelation(c), true)\r\n )\r\n ) {\r\n return false;\r\n }\r\n */\r\n }\r\n return true;\r\n });\r\n return Object.fromEntries(validEntries) as T;\r\n}\r\n\r\nexport async function optimizeMany_<T extends ICategorized = ICategorized>(items: T[]): Promise<T[]> {\r\n const optimizedItems: T[] = [];\r\n for (const item of items) {\r\n const optimizedItem = await optimizeOne_<T>(item);\r\n optimizedItems.push(optimizedItem);\r\n }\r\n return optimizedItems;\r\n}\r\n","import { ICategorized, IEquatable, ISchema, IStore, QueryParams, isArray, isObject, isUnresolvedRelation } from '@websolutespa/bom-core';\r\nimport { DEFAULT_DEPTH } from './consts';\r\n\r\nexport async function decorateRelation_<T extends ISchema = ISchema>(store: IStore, item: T, params: QueryParams = {}): Promise<T> {\r\n const depth = params.depth != null ? params.depth : DEFAULT_DEPTH;\r\n // console.log('decorateRelation_', depth, typeof depth);\r\n item = await collectRelations_({ store, params, depth }, item);\r\n return item;\r\n}\r\n\r\nexport async function decorateRelations_<T extends ISchema = ISchema>(store: IStore, items: T[], params: QueryParams = {}): Promise<T[]> {\r\n for (const item of items) {\r\n await decorateRelation_<T>(store, item, params);\r\n }\r\n return items;\r\n}\r\n\r\nexport type IPageResolvedRelation = {\r\n relationTo: string;\r\n value: IEquatable | IEquatable[];\r\n resolvedValue: ICategorized | ICategorized[] | null;\r\n};\r\n\r\n// collecting relations recursively\r\nasync function collectRelations_<T = any>(context: {\r\n store: IStore;\r\n params: QueryParams;\r\n depth: number;\r\n}, item: T, relations: IPageResolvedRelation[] = []): Promise<T> {\r\n if (isUnresolvedRelation(item)) {\r\n if (context.depth === 0) {\r\n return item.value as T;\r\n }\r\n // skip circular reference\r\n const index = relations.findIndex(x =>\r\n x.relationTo === item.relationTo && x.value === item.value\r\n );\r\n if (index === -1) {\r\n const isMany = Array.isArray(item.value);\r\n const values = isMany ? item.value : [item.value];\r\n let items: ICategorized[] = [];\r\n const collection = context.store[item.relationTo];\r\n if (collection) {\r\n items = await collection.findMany<ICategorized>({\r\n ...context.params,\r\n where: {\r\n id: { in: values },\r\n },\r\n depth: context.depth - 1,\r\n });\r\n } else {\r\n console.log('collectRelations_', `unknown relation \"${item.relationTo}\"`);\r\n }\r\n const resolvedValue = isMany ? items : (items.length > 0 ? items[0]! : null);\r\n // console.log('resolvedValue', resolvedValue);\r\n relations.push({\r\n ...item,\r\n resolvedValue,\r\n });\r\n return resolvedValue as T;\r\n } else {\r\n return relations[index]!.resolvedValue as T;\r\n }\r\n } else if (isArray(item)) {\r\n const items = [];\r\n for (let i = 0; i < item.length; i++) {\r\n items[i] = await collectRelations_(context, item[i], relations);\r\n }\r\n return items as T;\r\n } else if (isObject(item)) {\r\n for (const [key, value] of Object.entries(item)) {\r\n (item[key] as any) = await collectRelations_(context, value, relations);\r\n }\r\n }\r\n return item;\r\n}\r\n","import { ISchema, IStore } from '@websolutespa/bom-core';\r\n\r\nexport async function decorateSchema_<T extends ISchema = ISchema>(store: IStore, item: T, schema: string): Promise<T | T & { schema: string }> {\r\n return { ...item, schema: item.schema || schema };\r\n}\r\n\r\nexport async function decorateSchemas_<T extends ISchema = ISchema>(store: IStore, items: T[], schema: string): Promise<(T & { schema: string })[]> {\r\n return items.map(item => {\r\n return { ...item, schema: item.schema || schema };\r\n });\r\n}\r\n","import { httpFetch, isBrowser, merge } from '@websolutespa/bom-core';\r\nimport { ApiRequestOptions, getLocalApiRequestOptions } from '../api/api';\r\n\r\n/**\r\n * This methods handle api requests / responses to local api (mixer)\r\n */\r\n\r\nconst API_URL = (\r\n process.env.NEXT_PUBLIC_URL === 'https://' ?\r\n process.env.NEXT_PUBLIC_MOCK_FALLBACK_URL :\r\n process.env.NEXT_PUBLIC_URL\r\n);\r\nconst API_BASE = process.env.NEXT_PUBLIC_API || '/api';\r\n\r\nexport function getLocalApiUrl(pathname: string): string {\r\n const url = `${isBrowser ? window.location.origin : API_URL}${API_BASE}${pathname}`;\r\n // console.log('getLocalApiUrl', url);\r\n return url;\r\n}\r\n\r\nexport async function localApiFetch<T = unknown>(pathname: string, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n // console.log('localApiFetch', pathname, options, serviceOptions);\r\n const url = new URL(getLocalApiUrl(pathname));\r\n if (serviceOptions) {\r\n url.searchParams.append('locale', serviceOptions.locale);\r\n url.searchParams.append('market', serviceOptions.market);\r\n }\r\n const apiOptions = merge({ ...getLocalApiRequestOptions() }, options);\r\n console.log('localApiFetch', apiOptions.method, url.href);\r\n const apiResponse = await httpFetch(url.href, apiOptions);\r\n // console.log('localApiFetch', pathname, apiResponse);\r\n return apiResponse;\r\n}\r\n\r\nexport async function localApiGet<T = unknown>(url: string, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'GET' }, serviceOptions);\r\n}\r\n\r\nexport async function localApiPost<T = unknown>(url: string, payload?: unknown, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'POST', body: payload ? JSON.stringify(payload) : undefined }, serviceOptions);\r\n}\r\n\r\nexport async function localApiPut<T = unknown>(url: string, payload?: unknown, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'PUT', body: payload ? JSON.stringify(payload) : undefined }, serviceOptions);\r\n}\r\n\r\nexport async function localApiPatch<T = unknown>(url: string, payload?: unknown, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'PATCH', body: payload ? JSON.stringify(payload) : undefined }, serviceOptions);\r\n}\r\n\r\nexport async function localApiDelete<T = unknown>(url: string, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'DELETE' }, serviceOptions);\r\n}\r\n","import { httpFetch, merge } from '@websolutespa/bom-core';\r\nimport { ApiRequestOptions, getLocalApiRequestOptions } from '../api/api';\r\n\r\n/**\r\n * This methods handle api requests / responses to local /api/-mock data\r\n */\r\nconst API_URL = process.env.NEXT_PUBLIC_URL;\r\nconst API_BASE = process.env.NEXT_PUBLIC_API || '/api';\r\n\r\nfunction getMockApiUrl(pathname: string): string {\r\n const url = `${API_URL}${API_BASE}/-mock${pathname}`;\r\n // console.log('getMockApiUrl', url);\r\n return url;\r\n}\r\n\r\nexport async function mockApiFetch<T = unknown>(pathname: string, options: ApiRequestOptions = {}): Promise<T> {\r\n const url = getMockApiUrl(pathname);\r\n const apiOptions = merge({ ...getLocalApiRequestOptions() }, options);\r\n console.log('mockApiFetch', apiOptions.method, url);\r\n const apiResponse = await httpFetch(url, apiOptions);\r\n return apiResponse;\r\n}\r\n\r\nexport async function mockApiGet<T = unknown>(url: string, options: ApiRequestOptions = {}): Promise<T> {\r\n return await mockApiFetch<T>(url, { ...options, method: 'GET' });\r\n}\r\n\r\nexport async function mockApiPost<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await mockApiFetch<T>(url, { ...options, method: 'POST', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function mockApiPut<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await mockApiFetch<T>(url, { ...options, method: 'PUT', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function mockApiPatch<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await mockApiFetch<T>(url, { ...options, method: 'PATCH', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function mockApiDelete<T = unknown>(url: string, options: ApiRequestOptions = {}): Promise<T> {\r\n return await mockApiFetch<T>(url, { ...options, method: 'DELETE' });\r\n}\r\n","import { httpFetch, isBrowser, merge } from '@websolutespa/bom-core';\r\nimport { ApiRequestOptions, getRemoteApiRequestOptions } from '../api/api';\r\n\r\n/**\r\n * This methods handle api requests / responses to remote api (bowl or over)\r\n */\r\n\r\nconst API_URL = process.env.STORE_URL;\r\nconst API_BASE = process.env.STORE_API || '/api';\r\n\r\nexport function getRemoteApiUrl(pathname: string): string {\r\n const url = `${API_URL}${API_BASE}${pathname}`;\r\n // console.log('getRemoteApiUrl', url);\r\n return url;\r\n}\r\n\r\nexport async function remoteApiFetch<T = unknown>(pathname: string, options: ApiRequestOptions = {}): Promise<T> {\r\n if (isBrowser) {\r\n throw 'Unauthorized: remote api cannot be fetched client side';\r\n }\r\n const url = getRemoteApiUrl(pathname);\r\n const apiOptions = merge({ ...getRemoteApiRequestOptions() }, options);\r\n // console.log('remoteApiFetch', apiOptions.method, url);\r\n // console.log('remoteApiFetch', 'Authorization', apiOptions.headers?.Authorization);\r\n const apiResponse = await httpFetch(url, apiOptions);\r\n return apiResponse;\r\n}\r\n\r\nexport async function remoteApiGet<T = unknown>(url: string, options: ApiRequestOptions = {}): Promise<T> {\r\n return await remoteApiFetch<T>(url, { ...options, method: 'GET' });\r\n}\r\n\r\nexport async function remoteApiPost<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await remoteApiFetch<T>(url, { ...options, method: 'POST', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function remoteApiPut<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await remoteApiFetch<T>(url, { ...options, method: 'PUT', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function remoteApiPatch<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await remoteApiFetch<T>(url, { ...options, method: 'PATCH', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function remoteApiDelete<T = unknown>(url: string, options: ApiRequestOptions = {}): Promise<T> {\r\n return await remoteApiFetch<T>(url, { ...options, method: 'DELETE' });\r\n}\r\n","import type { IEntity } from '@websolutespa/bom-core';\r\n\r\nexport type IField = {\r\n name: string,\r\n type: 'text' | 'number' | 'relationship',\r\n localized?: boolean,\r\n relationTo?: string,\r\n hasMany?: boolean,\r\n required?: boolean\r\n};\r\n\r\nexport type MapTo = Record<string, string>;\r\n\r\nexport type StaticServiceSrc<T extends IEntity = IEntity> = string | T[] | ((config: StaticServiceConfig<T>) => T[]) | ((config: StaticServiceConfig<T>) => Promise<T[]>);\r\n\r\nexport type StaticServiceConfig<T extends IEntity = IEntity> = {\r\n src: StaticServiceSrc<T>;\r\n slug: string;\r\n fields: IField[];\r\n map?: MapTo;\r\n};\r\n\r\nexport const staticCollections: StaticServiceConfig[] = [{\r\n src: 'https://actarian.github.io/cms-i18n-react/api/continent.json',\r\n slug: 'i18n_continent',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n },\r\n ],\r\n}, {\r\n src: 'https://actarian.github.io/cms-i18n-react/api/country.json',\r\n slug: 'i18n_country',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n localized: true,\r\n },\r\n {\r\n name: 'englishName',\r\n type: 'text',\r\n },\r\n {\r\n name: 'nativeName',\r\n type: 'text',\r\n },\r\n {\r\n name: 'alpha2Code',\r\n type: 'text',\r\n },\r\n {\r\n name: 'alpha3Code',\r\n type: 'text',\r\n },\r\n {\r\n name: 'continent',\r\n type: 'relationship',\r\n relationTo: 'i18n_continent',\r\n hasMany: false,\r\n required: true,\r\n },\r\n {\r\n name: 'subContinent',\r\n type: 'relationship',\r\n relationTo: 'i18n_sub_continent',\r\n hasMany: false,\r\n required: true,\r\n },\r\n ],\r\n}, {\r\n src: 'https://actarian.github.io/cms-i18n-react/api/countryZone.json',\r\n slug: 'i18n_country_zone',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n },\r\n ],\r\n}, {\r\n src: 'https://actarian.github.io/cms-i18n-react/api/language.json',\r\n slug: 'i18n_country_zone',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n localized: true,\r\n },\r\n {\r\n name: 'englishName',\r\n type: 'text',\r\n },\r\n {\r\n name: 'nativeName',\r\n type: 'text',\r\n },\r\n ],\r\n}, {\r\n src: 'https://actarian.github.io/cms-i18n-react/api/municipality.json',\r\n slug: 'i18n_municipality',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n },\r\n {\r\n name: 'code',\r\n type: 'text',\r\n },\r\n {\r\n name: 'country',\r\n type: 'relationship',\r\n relationTo: 'i18n_country',\r\n hasMany: false,\r\n required: true,\r\n },\r\n {\r\n name: 'countryZone',\r\n type: 'relationship',\r\n relationTo: 'i18n_country_zone',\r\n hasMany: false,\r\n required: true,\r\n },\r\n {\r\n name: 'region',\r\n type: 'relationship',\r\n relationTo: 'i18n_region',\r\n hasMany: false,\r\n required: true,\r\n },\r\n {\r\n name: 'province',\r\n type: 'relationship',\r\n relationTo: 'i18n_province',\r\n hasMany: false,\r\n required: true,\r\n },\r\n ],\r\n}, {\r\n src: 'https://actarian.github.io/cms-i18n-react/api/province.json',\r\n slug: 'i18n_province',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n },\r\n {\r\n name: 'code',\r\n type: 'text',\r\n },\r\n {\r\n name: 'country',\r\n type: 'relationship',\r\n relationTo: 'i18n_country',\r\n hasMany: false,\r\n required: true,\r\n },\r\n {\r\n name: 'countryZone',\r\n type: 'relationship',\r\n relationTo: 'i18n_country_zone',\r\n hasMany: false,\r\n required: true,\r\n },\r\n {\r\n name: 'region',\r\n type: 'relationship',\r\n relationTo: 'i18n_region',\r\n hasMany: false,\r\n required: true,\r\n },\r\n ],\r\n}, {\r\n src: 'https://actarian.github.io/cms-i18n-react/api/region.json',\r\n slug: 'i18n_region',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n },\r\n {\r\n name: 'country',\r\n type: 'relationship',\r\n relationTo: 'i18n_country',\r\n hasMany: false,\r\n required: true,\r\n },\r\n {\r\n name: 'countryZone',\r\n type: 'relationship',\r\n relationTo: 'i18n_country_zone',\r\n hasMany: false,\r\n required: true,\r\n },\r\n ],\r\n}, {\r\n src: 'https://actarian.github.io/cms-i18n-react/api/subContinent.json',\r\n slug: 'i18n_sub_continent',\r\n fields: [\r\n {\r\n name: 'id',\r\n type: 'text',\r\n },\r\n {\r\n name: 'name',\r\n type: 'text',\r\n },\r\n {\r\n name: 'continent',\r\n type: 'relationship',\r\n relationTo: 'i18n_continent',\r\n hasMany: false,\r\n required: true,\r\n },\r\n ],\r\n}];\r\n","import { staticCollections } from '../static/static';\r\n\r\n// nextPhase\r\nexport enum NextPhase {\r\n Export = 'phase-export',\r\n ProductionBuild = 'phase-production-build',\r\n ProductionServer = 'phase-production-server',\r\n DevelopmentServer = 'phase-development-server',\r\n Test = 'phase-test',\r\n}\r\n\r\nfunction getNextPhase(): NextPhase {\r\n let nextPhase = NextPhase.Export;\r\n if (typeof process !== 'undefined' && process.env.NEXT_PHASE) {\r\n nextPhase = process.env.NEXT_PHASE as NextPhase;\r\n }\r\n return nextPhase;\r\n}\r\n\r\nexport const nextPhase: NextPhase = getNextPhase();\r\n\r\n// buildStrategy\r\nexport enum BuildStrategy {\r\n Static = 'static',\r\n Runtime = 'runtime',\r\n}\r\n\r\nfunction getBuildStrategy(): BuildStrategy {\r\n let buildStrategy = BuildStrategy.Static;\r\n if (typeof process !== 'undefined' && process.env.BUILD_STRATEGY) {\r\n buildStrategy = process.env.BUILD_STRATEGY as BuildStrategy;\r\n }\r\n return buildStrategy;\r\n}\r\n\r\nexport const buildStrategy: BuildStrategy = getBuildStrategy();\r\n\r\n// storeStrategy\r\nexport enum StoreStrategy {\r\n // Local = 'local',\r\n Api = 'api',\r\n DecoratedApi = 'decoratedApi',\r\n Data = 'data',\r\n Mock = 'mock',\r\n}\r\n\r\nfunction getStoreStrategy(): StoreStrategy {\r\n let storeStrategy = StoreStrategy.Mock;\r\n if (typeof process !== 'undefined' && process.env.STORE_STRATEGY) {\r\n storeStrategy = process.env.STORE_STRATEGY as StoreStrategy;\r\n }\r\n return storeStrategy;\r\n}\r\n\r\nexport const storeStrategy: StoreStrategy = getStoreStrategy();\r\n\r\n// storeCacheDuration\r\nfunction getStoreCacheDuration(): number {\r\n let storeCacheDuration = (1 * 60 * 1000);\r\n if (typeof process !== 'undefined' && process.env.STORE_CACHE_DURATION) {\r\n storeCacheDuration = parseInt(process.env.STORE_CACHE_DURATION);\r\n }\r\n return storeCacheDuration;\r\n}\r\n\r\nexport const storeCacheDuration: number = getStoreCacheDuration();\r\n\r\n// collections\r\nconst ENV_COLLECTIONS: string[] = process.env.COLLECTIONS ? process.env.COLLECTIONS.split(',') : [];\r\nexport const MOCK_COLLECTIONS: string[] = process.env.MOCKS ? process.env.MOCKS.split(',') : [];\r\nexport const STATIC_COLLECTIONS: string[] = staticCollections.map(x => x.slug);\r\nexport const KNOWN_COLLECTIONS: string[] = [\r\n 'app',\r\n 'category',\r\n 'label',\r\n 'locale',\r\n 'market',\r\n 'menu',\r\n 'redirect',\r\n 'route',\r\n 'template',\r\n ...STATIC_COLLECTIONS,\r\n];\r\nexport const COLLECTIONS = [...ENV_COLLECTIONS, ...KNOWN_COLLECTIONS];\r\n","import { ApiRequestOptions } from '../api/api';\r\nimport { localApiFetch } from '../local/local.api';\r\nimport { remoteApiFetch } from '../remote/remote.api';\r\nimport { StoreStrategy, storeStrategy } from './store';\r\n\r\nconst storeApiFetch = storeStrategy === StoreStrategy.Mock ? localApiFetch : remoteApiFetch;\r\n\r\nexport async function storeApiGet<T = unknown>(url: string, options: ApiRequestOptions = {}): Promise<T> {\r\n return await storeApiFetch<T>(url, { ...options, method: 'GET' });\r\n}\r\n\r\nexport async function storeApiPost<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await storeApiFetch<T>(url, { ...options, method: 'POST', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function storeApiPut<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await storeApiFetch<T>(url, { ...options, method: 'PUT', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function storeApiPatch<T = unknown>(url: string, payload: unknown, options: ApiRequestOptions = {}): Promise<T> {\r\n return await storeApiFetch<T>(url, { ...options, method: 'PATCH', body: JSON.stringify(payload) });\r\n}\r\n\r\nexport async function storeApiDelete<T = unknown>(url: string, options: ApiRequestOptions = {}): Promise<T> {\r\n return await storeApiFetch<T>(url, { ...options, method: 'DELETE' });\r\n}\r\n"],"mappings":"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MAAM;EACN,QAAQ;GACN;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACZ;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;EACF;CACF;CAAE;EACD,KAAK;EACL,MAAM;EACN,QAAQ,CACN;GACE,MAAM;GACN,MAAM;EACP,GACD;GACE,MAAM;GACN,MAAM;EACP,CACF;CACF;CAAE;EACD,KAAK;EACL,MAAM;EACN,QAAQ;GACN;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACZ;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;EACF;CACF;CAAE;EACD,KAAK;EACL,MAAM;EACN,QAAQ;GACN;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;EACF;CACF;CAAE;EACD,KAAK;EACL,MAAM;EACN,QAAQ;GACN;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;EACF;CACF;CAAE;EACD,KAAK;EACL,MAAM;EACN,QAAQ;GACN;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;EACF;CACF;CAAE;EACD,KAAK;EACL,MAAM;EACN,QAAQ;GACN;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;GACP;GACD;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,SAAS;IACT,UAAU;GACX;EACF;CACF;AAAC;;;;ACjPF,IAAY,kDAAL;;;;;;;AAMN;AAED,SAAS,eAA0B;CACjC,IAAIC,cAAY,UAAU;AAC1B,KAAI,OAAO,YAAY,eAAe,QAAQ,IAAI,YAChDA,cAAY,QAAQ,IAAI;AAE1B,QAAOA;AACR;AAED,MAAaC,YAAuB,cAAc;AAGlD,IAAY,0DAAL;;;;AAGN;AAED,SAAS,mBAAkC;CACzC,IAAIC,kBAAgB,cAAc;AAClC,KAAI,OAAO,YAAY,eAAe,QAAQ,IAAI,gBAChDA,kBAAgB,QAAQ,IAAI;AAE9B,QAAOA;AACR;AAED,MAAaC,gBAA+B,kBAAkB;AAG9D,IAAY,0DAAL;;;;;;AAMN;AAED,SAAS,mBAAkC;CACzC,IAAIC,kBAAgB,cAAc;AAClC,KAAI,OAAO,YAAY,eAAe,QAAQ,IAAI,gBAChDA,kBAAgB,QAAQ,IAAI;AAE9B,QAAOA;AACR;AAED,MAAaC,gBAA+B,kBAAkB;AAG9D,SAAS,wBAAgC;CACvC,IAAIC,uBAAsB,KAAS;AACnC,KAAI,OAAO,YAAY,eAAe,QAAQ,IAAI,sBAChDA,uBAAqB,SAAS,QAAQ,IAAI,qBAAqB;AAEjE,QAAOA;AACR;AAED,MAAaC,qBAA6B,uBAAuB;AAGjE,MAAMC,kBAA4B,QAAQ,IAAI,cAAc,QAAQ,IAAI,YAAY,MAAM,IAAI,GAAG,CAAE;AACnG,MAAaC,mBAA6B,QAAQ,IAAI,QAAQ,QAAQ,IAAI,MAAM,MAAM,IAAI,GAAG,CAAE;AAC/F,MAAaC,qBAA+B,kBAAkB,IAAI,OAAK,EAAE,KAAK;AAC9E,MAAaC,oBAA8B;CACzC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,GAAG;AACJ;AACD,MAAa,cAAc,CAAC,GAAG,iBAAiB,GAAG,iBAAkB;;;;AC9ErE,MAAM,gBAAgB,kBAAkB,cAAc,OAAO,gBAAgB;AAE7E,eAAsB,YAAyBC,KAAaC,UAA6B,CAAE,GAAc;AACvG,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;CAAO,EAAC;AAClE;AAED,eAAsB,aAA0BD,KAAaE,SAAkBD,UAA6B,CAAE,GAAc;AAC1H,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;EAAQ,MAAM,KAAK,UAAU,QAAQ;CAAE,EAAC;AAClG;AAED,eAAsB,YAAyBD,KAAaE,SAAkBD,UAA6B,CAAE,GAAc;AACzH,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;EAAO,MAAM,KAAK,UAAU,QAAQ;CAAE,EAAC;AACjG;AAED,eAAsB,cAA2BD,KAAaE,SAAkBD,UAA6B,CAAE,GAAc;AAC3H,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;EAAS,MAAM,KAAK,UAAU,QAAQ;CAAE,EAAC;AACnG;AAED,eAAsB,eAA4BD,KAAaC,UAA6B,CAAE,GAAc;AAC1G,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;CAAU,EAAC;AACrE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@websolutespa/bom-mixer-store",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0-next.1",
|
|
4
4
|
"description": "Mixer Store module of the BOM Repository",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bom",
|
|
@@ -27,15 +27,15 @@
|
|
|
27
27
|
"mime": "^3.0.0"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
|
-
"@websolutespa/bom-core": "^
|
|
30
|
+
"@websolutespa/bom-core": "^4.0.0-next.1",
|
|
31
31
|
"iron-session": "8.0.4",
|
|
32
32
|
"next": "16.1.6"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/mime": "^3.0.1",
|
|
36
|
-
"@websolutespa/bom-cli": "^
|
|
37
|
-
"@websolutespa/eslint-config": "^3.0.0",
|
|
38
|
-
"@websolutespa/test": "^
|
|
36
|
+
"@websolutespa/bom-cli": "^4.0.0-next.0",
|
|
37
|
+
"@websolutespa/eslint-config": "^3.0.1-next.0",
|
|
38
|
+
"@websolutespa/test": "^4.0.0-next.0",
|
|
39
39
|
"@websolutespa/tsconfig": "^3.0.0",
|
|
40
40
|
"eslint": "9.31.0",
|
|
41
41
|
"npm-run-all": "4.1.5",
|
|
@@ -12,7 +12,6 @@ export type InMemoryCacheOptions = {
|
|
|
12
12
|
duration?: number | false;
|
|
13
13
|
};
|
|
14
14
|
|
|
15
|
-
// export class CachedService<T extends IEntity = IEntity> implements IQuerable<T> {
|
|
16
15
|
export class CachedService<T extends IEntity = IEntity> extends JsonService<T> {
|
|
17
16
|
|
|
18
17
|
private service_: IQuerable<T>;
|
package/src/mock/mock.api.ts
CHANGED
|
@@ -2,13 +2,13 @@ import { httpFetch, merge } from '@websolutespa/bom-core';
|
|
|
2
2
|
import { ApiRequestOptions, getLocalApiRequestOptions } from '../api/api';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* This methods handle api requests / responses to local /api
|
|
5
|
+
* This methods handle api requests / responses to local /api/-mock data
|
|
6
6
|
*/
|
|
7
7
|
const API_URL = process.env.NEXT_PUBLIC_URL;
|
|
8
8
|
const API_BASE = process.env.NEXT_PUBLIC_API || '/api';
|
|
9
9
|
|
|
10
10
|
function getMockApiUrl(pathname: string): string {
|
|
11
|
-
const url = `${API_URL}${API_BASE}
|
|
11
|
+
const url = `${API_URL}${API_BASE}/-mock${pathname}`;
|
|
12
12
|
// console.log('getMockApiUrl', url);
|
|
13
13
|
return url;
|
|
14
14
|
}
|