@redocly/revel 0.128.0-next.8 → 0.128.0-next.9
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/server/api-routes/execute-api-route.js +1 -1
- package/dist/server/api-routes/helpers/enhance-context.d.ts +2 -2
- package/dist/server/api-routes/helpers/enhance-context.js +1 -1
- package/dist/server/persistence/cache/repositories/cache-local-repository.d.ts +2 -2
- package/dist/server/persistence/cache/repositories/cache-local-repository.js +1 -1
- package/dist/server/persistence/file-hashes/repositories/file-hashes-local-repository.d.ts +2 -2
- package/dist/server/persistence/file-hashes/repositories/file-hashes-local-repository.js +1 -1
- package/dist/server/persistence/kv/repositories/kv-remote-repository.d.ts +3 -3
- package/dist/server/persistence/kv/repositories/kv-remote-repository.js +1 -1
- package/dist/server/persistence/kv/services/kv-service.d.ts +1 -1
- package/dist/server/persistence/kv/services/kv-service.js +1 -1
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +1 -1
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +3 -3
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +4 -4
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +1 -1
- package/dist/server/providers/database/base-repository.d.ts +2 -2
- package/dist/server/providers/database/base-repository.js +1 -1
- package/dist/server/providers/database/constants.d.ts +7 -4
- package/dist/server/providers/database/constants.js +1 -1
- package/dist/server/providers/database/database-connection-factory.d.ts +6 -0
- package/dist/server/providers/database/database-connection-factory.js +1 -0
- package/dist/server/providers/database/database-connections-manager.d.ts +3 -3
- package/dist/server/providers/database/database-connections-manager.js +1 -1
- package/dist/server/providers/database/database-initialization-strategy.d.ts +4 -10
- package/dist/server/providers/database/database-initialization-strategy.js +1 -1
- package/dist/server/providers/database/database-preconnect-service.js +1 -1
- package/dist/server/providers/database/databases/catalog-sqlite/drizzle.config.js +1 -1
- package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.js +1 -1
- package/dist/server/providers/database/types.d.ts +11 -6
- package/dist/server/ssr/server-side-props/get-server-props-from-user-handler.js +1 -1
- package/dist/server/types/plugins/api-functions.d.ts +1 -1
- package/package.json +5 -5
- package/dist/server/constants/sqld-remote-database.d.ts +0 -4
- package/dist/server/constants/sqld-remote-database.js +0 -1
- package/dist/server/plugins/catalog-entities/database/consts.d.ts +0 -4
- package/dist/server/plugins/catalog-entities/database/consts.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @redocly/revel
|
|
2
2
|
|
|
3
|
+
## 0.128.0-next.9
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 39df6e65ff: Fixed an issue where the AI Search form submitted during mid-Japanese input.
|
|
8
|
+
- Updated dependencies [39df6e65ff]
|
|
9
|
+
- Updated dependencies [bc191c239c]
|
|
10
|
+
- @redocly/theme@0.60.0-next.6
|
|
11
|
+
- @redocly/openapi-docs@3.16.0-next.9
|
|
12
|
+
- @redocly/asyncapi-docs@1.5.0-next.9
|
|
13
|
+
- @redocly/graphql-docs@1.5.0-next.1
|
|
14
|
+
- @redocly/portal-plugin-mock-server@0.13.0-next.9
|
|
15
|
+
|
|
3
16
|
## 0.128.0-next.8
|
|
4
17
|
|
|
5
18
|
### Minor Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Hono as
|
|
1
|
+
import{Hono as f}from"hono";import{TrieRouter as g}from"hono/router/trie-router";import{Logger as m}from"../tools/notifiers/logger.js";import{importApiRoutesHandler as q}from"./import-api-routes-handlers.js";import{getBodyWithSizeCheck as h}from"./helpers/get-body-with-size-check.js";import{setupLogger as w}from"./helpers/setup-logger.js";import{telemetry as i}from"../telemetry/index.js";import{KvService as y}from"../persistence/kv/services/kv-service.js";import{enhanceContext as D}from"./helpers/enhance-context.js";const r=new m;r.patchConsole();async function C(e){i.initialize(),w(r,e.loggerStickyState,e.requestHandlerId);const n=new f({router:new g}),{requestHandlers:a}=await q(e.serverOutDir),u=a[e.requestHandlerId],c=(await u()).default,l=async()=>await y.getInstance({baseDbDir:e.serverOutDir,sqldRemoteDatabaseUrl:e.sqldRemoteDatabaseUrl,sqldRemoteDatabaseAuthToken:e.sqldRemoteDatabaseAuthToken});n.all(e.slug,async t=>{const o=await c(t.req.raw,D({honoCtx:t,ctx:e.ctxData,telemetry:i,getKv:l}),e.staticData);return o instanceof Response?o:typeof o=="string"?t.text(o):t.json(o)}),n.onError((t,o)=>{if(r.error(`[${e.requestHandlerId}] ${t.message} ${t.stack}`),t instanceof SyntaxError)return o.text(t.message,500);throw t});const s=await n.request(e.req.url,e.req),d=await h(s,e.maxResponseSizeMB);return{status:s.status,headers:Object.fromEntries(s.headers.entries()),body:d,loggerStickyState:r.getStickyState()}}export{C as executeApiRoute};
|
|
@@ -6,7 +6,7 @@ export type EnhanceContextParams = {
|
|
|
6
6
|
honoCtx: Context;
|
|
7
7
|
ctx: ApiFunctionsBasicContext;
|
|
8
8
|
telemetry?: AsyncApiRealmAPI.Telemetry;
|
|
9
|
-
|
|
9
|
+
getKv: () => Promise<KvService>;
|
|
10
10
|
};
|
|
11
|
-
export declare const enhanceContext: ({ honoCtx, ctx, telemetry,
|
|
11
|
+
export declare const enhanceContext: ({ honoCtx, ctx, telemetry, getKv, }: EnhanceContextParams) => ApiFunctionsContext;
|
|
12
12
|
//# sourceMappingURL=enhance-context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{deleteCookie as o,getCookie as p,setCookie as f}from"hono/cookie";const j=({honoCtx:r,ctx:u,telemetry:a,
|
|
1
|
+
import{deleteCookie as o,getCookie as p,setCookie as f}from"hono/cookie";const j=({honoCtx:r,ctx:u,telemetry:a,getKv:l})=>{const i=r.req.routePath,m=r.req.param(),d=Object.fromEntries(Object.entries(m).map(([e,t])=>{if(t&&(i.includes(`/:${e}{.*}`)||i.includes(`/:${e}{.+}`))){const c=t.split("/").filter(Boolean);return[e,c.length?c:void 0]}return[e,t]})),s={...r.res,status:e=>(r.status(e),s),json:e=>r.json(e),text:(e,t)=>(t&&r.status(t),r.text(e)),redirect:(e,t=302)=>r.redirect(e,t),setCookie:(e,t,n)=>(f(r,e,t,n),s),deleteCookie:e=>(o(r,e),s)};return{...u,...s,params:d,query:r.req.query()||{},cookies:p(r),telemetry:a,getKv:l}};export{j as enhanceContext};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { CacheReadModelSchema, SetCacheParams } from '../types.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../providers/database/types.js';
|
|
3
3
|
export declare class CacheLocalRepository {
|
|
4
4
|
#private;
|
|
5
|
-
constructor(
|
|
5
|
+
constructor(dbConnection: DatabaseConnection);
|
|
6
6
|
static getInstance(options: RepositoryInstanceOptions): Promise<CacheLocalRepository>;
|
|
7
7
|
get(key: string, namespace: string): Promise<CacheReadModelSchema | null>;
|
|
8
8
|
set(params: SetCacheParams): Promise<string | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{and as
|
|
1
|
+
import{and as l,eq as a}from"drizzle-orm";import{isTtlExpired as d}from"../../../utils/is-ttl-expired.js";import{logger as o}from"../../../tools/notifiers/logger.js";import{DatabaseConnectionFactory as m}from"../../../providers/database/database-connection-factory.js";import{cacheTable as r}from"../../../providers/database/databases/main-sqlite/schemas/cache-table.js";import{createCacheDbRecord as u}from"../mappers/create-cache-db-record.js";import{createCacheReadModel as h}from"../mappers/create-cache-read-model.js";class n{static#t;#e;constructor(t){this.#e=t.client}static async getInstance(t){if(!n.#t){const e=await m.create("main-local",t);if(!e)throw new Error("Failed to create db connection for cache local repository");n.#t=new n(e)}return n.#t}async get(t,e){const c=[a(r.key,t)];e&&c.push(a(r.namespace,e));const i=await this.#e.client.select().from(r).where(l(...c)).get();if(!i)return null;const s=h(i);return d(s.ttlInSeconds,s.createdAt)?(await this.delete(t,e),null):s}async set(t){try{const e=u(t);return await this.#e.client.insert(r).values(e).onConflictDoUpdate({target:[r.key],set:{value:e.value,namespace:e.namespace,ttl:e.ttl,updatedAt:e.updatedAt}}),e.key}catch(e){return o.error("Error setting cache: "+e.message),null}}async delete(t,e){try{return await this.#e.client.delete(r).where(l(a(r.key,t),a(r.namespace,e))),!0}catch(c){return o.error("Error deleting cache: "+c.message),!1}}async deleteByNamespace(t){try{return await this.#e.client.delete(r).where(a(r.namespace,t)),!0}catch(e){return o.error("Error deleting cache by namespace: "+e.message),!1}}async clearAll(){try{return await this.#e.client.delete(r),!0}catch(t){return o.error("Error clearing all cache: "+t.message),!1}}}export{n as CacheLocalRepository};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { FileHashReadModelSchema } from '../types.js';
|
|
2
2
|
import type { Filter } from '../../../providers/database/pagination/types.js';
|
|
3
3
|
import type { FileHashStatus, UpsertFileHashParams } from '../types.js';
|
|
4
|
-
import type {
|
|
4
|
+
import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../providers/database/types.js';
|
|
5
5
|
import { BaseRepository } from '../../../providers/database/base-repository.js';
|
|
6
6
|
export declare class FileHashesLocalRepository extends BaseRepository {
|
|
7
7
|
#private;
|
|
8
|
-
constructor(
|
|
8
|
+
constructor(dbConnection: DatabaseConnection);
|
|
9
9
|
static getInstance(options: RepositoryInstanceOptions): Promise<FileHashesLocalRepository>;
|
|
10
10
|
getByPath(filePath: string): Promise<FileHashReadModelSchema | null>;
|
|
11
11
|
getAllOutdated(fileType: string): Promise<FileHashReadModelSchema[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{DatabaseConnectionFactory as s}from"../../../providers/database/database-connection-factory.js";import{BaseRepository as r}from"../../../providers/database/base-repository.js";import{FileHashesLocalWriteRepository as i}from"./file-hashes-local-write-repository.js";import{FileHashesLocalReadRepository as n}from"./file-hashes-local-read-repository.js";class e extends r{static#e;#a;#t;constructor(t){super(t),this.#a=new n(this.databaseClient),this.#t=new i(this.databaseClient)}static async getInstance(t){if(!e.#e){const a=await s.create("main-local",t);if(!a)throw new Error("Failed to create db connection for file hashes local repository");e.#e=new e(a)}return e.#e}async getByPath(t){return this.#a.getByPath(t)}async getAllOutdated(t){return this.#a.getAllOutdated(t)}async upsertFileHash(t){return await this.#t.upsertFileHash(t)}async updateFileHashesStatus(t,a){return this.#t.updateFileHashes(t,a)}async deleteFileHashes(t){return this.#t.deleteFileHashes(t)}}export{e as FileHashesLocalRepository};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { KvKey, KvReadSchema, KvSetOptions, KvValue, KvListSelector, KvListOptions, KvListResponse, KvTransaction } from '@redocly/config';
|
|
2
|
-
import type {
|
|
2
|
+
import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../providers/database/types.js';
|
|
3
3
|
import { BaseRepository } from '../../../providers/database/base-repository.js';
|
|
4
4
|
export declare const KV_KEY_END_BOUNDARY = "\u0002";
|
|
5
5
|
export declare class KvRemoteRepository extends BaseRepository {
|
|
6
6
|
#private;
|
|
7
|
-
constructor(
|
|
8
|
-
static getInstance(options: RepositoryInstanceOptions): Promise<KvRemoteRepository |
|
|
7
|
+
constructor(dbConnection: DatabaseConnection);
|
|
8
|
+
static getInstance(options: RepositoryInstanceOptions): Promise<KvRemoteRepository | null>;
|
|
9
9
|
get<T extends KvValue = KvValue>(key: KvKey): Promise<KvReadSchema<T> | null>;
|
|
10
10
|
getMany<T extends KvValue = KvValue>(keys: KvKey[]): Promise<(KvReadSchema<T> | null)[]>;
|
|
11
11
|
list<T extends KvValue = KvValue>(selector: KvListSelector, options?: KvListOptions): Promise<KvListResponse<T>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{eq as
|
|
1
|
+
import{eq as C,and as f,gte as y,gt as k,lt as w,asc as D,desc as M,or as v,isNull as E,sql as K,inArray as B,count as q}from"drizzle-orm";import{logger as d}from"../../../tools/notifiers/logger.js";import{kvTable as r}from"../../../providers/database/databases/sqld-sqlite/schemas/kv-table.js";import{BaseRepository as I}from"../../../providers/database/base-repository.js";import{DatabaseConnectionFactory as N}from"../../../providers/database/database-connection-factory.js";import{createKvReadRecord as x}from"../mappers/create-kv-read-record.js";import{createKvDbRecord as S,encodeKvKey as o}from"../mappers/create-kv-db-record.js";const Q="";class l extends I{static#e;constructor(e){super(e)}static async getInstance(e){if(!l.#e)try{const t=await N.create("sqld-remote",e);if(!t)return l.#e=null,null;l.#e=new l(t)}catch(t){return d.error("Error creating kv remote repository",t),l.#e=null,null}return l.#e}async get(e){try{const t=o(e),n=await this.databaseClient.client.select().from(r).where(f(C(r.encodedKey,t),v(E(r.expiresAt),y(r.expiresAt,K`datetime('now')`)))).get();return n?x(n):null}catch(t){return d.error("Error getting kv entry by key",t),null}}async getMany(e){try{if(e.length===0)return[];const t=e.map(i=>o(i)),n=await this.databaseClient.client.select().from(r).where(B(r.encodedKey,t)).all(),s=new Map(n.map(i=>[i.encodedKey,i]));return e.map((i,h)=>{const p=t[h],u=s.get(p);return!u||this.#t(u.expiresAt)?null:x(u)})}catch(t){return d.error("Error getting multiple kv entries",t),[]}}async list(e,t){try{const n=t?.limit??100,s=t?.reverse??!1,a=[],i=v(E(r.expiresAt),y(r.expiresAt,K`datetime('now')`));if(a.push(i),"prefix"in e){const c=o(e.prefix),g="start"in e?o(e.start):c,A="end"in e?o(e.end):c+Q;a.push(y(r.encodedKey,g)),a.push(w(r.encodedKey,A))}else if("start"in e&&"end"in e){const c=o(e.start),g=o(e.end);a.push(y(r.encodedKey,c)),a.push(w(r.encodedKey,g))}if(t?.cursor){const c=s?w(r.encodedKey,t.cursor):k(r.encodedKey,t.cursor);a.push(c)}const h=this.databaseClient.client.select().from(r),p=a.length>0?h.where(f(...a)):h,u=this.databaseClient.client.select({count:q()}).from(r),b=(await(a.length>0?u.where(f(...a)):u).get())?.count??0,m=await p.orderBy(s?M(r.encodedKey):D(r.encodedKey)).limit(n).all();return{items:m.map(c=>x(c)),total:b,cursor:b>m.length?m[m.length-1]?.encodedKey??null:null}}catch(n){return d.error("Error listing kv entries",n),{items:[],total:0,cursor:null}}}async set(e,t,n){try{const s=S({key:e,value:t,ttlInSeconds:n?.ttlInSeconds});return await this.databaseClient.client.insert(r).values(s).onConflictDoUpdate({target:[r.encodedKey],set:{value:s.value,expiresAt:s.expiresAt,updatedAt:s.updatedAt}}),s.encodedKey}catch(s){return d.error("Error saving kv entry",s),null}}async delete(e){try{const t=o(e);return await this.databaseClient.client.delete(r).where(C(r.encodedKey,t)),!0}catch(t){return d.error("Error deleting kv entry by key",t),!1}}async clearExpired(){try{await this.databaseClient.client.delete(r).where(y(r.expiresAt,K`datetime('now')`))}catch(e){d.error("Error clearing expired kv entries",e)}}async transaction(e){return this.databaseClient.transactionsManager.transaction(async()=>e({get:async n=>this.get(n),getMany:async n=>this.getMany(n),set:async(n,s,a)=>this.set(n,s,a),delete:async n=>this.delete(n)}))}#t(e){return e?new Date(e)<new Date:!1}}export{Q as KV_KEY_END_BOUNDARY,l as KvRemoteRepository};
|
|
@@ -3,7 +3,7 @@ import type { KvValue, KvKey, KvReadSchema, KvSetOptions, KvListOptions, KvListR
|
|
|
3
3
|
import { KvRemoteRepository } from '../repositories/kv-remote-repository.js';
|
|
4
4
|
export declare class KvService {
|
|
5
5
|
#private;
|
|
6
|
-
constructor(remoteRepository: KvRemoteRepository |
|
|
6
|
+
constructor(remoteRepository: KvRemoteRepository | null);
|
|
7
7
|
static getInstance(options: ServiceInstanceOptions): Promise<KvService>;
|
|
8
8
|
/**
|
|
9
9
|
* Get a kv entry by key
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isTtlCorrect as o}from"../../../utils/is-ttl-correct.js";import{KvRemoteRepository as c}from"../repositories/kv-remote-repository.js";class n{static#e;#t;constructor(t){this.#t=t}static async#n(t){const e=await c.getInstance(t),s=new n(e);n.#e=s}static async getInstance(t){return
|
|
1
|
+
import{isTtlCorrect as o}from"../../../utils/is-ttl-correct.js";import{KvRemoteRepository as c}from"../repositories/kv-remote-repository.js";class n{static#e;#t;constructor(t){this.#t=t}static async#n(t){const e=await c.getInstance(t),s=new n(e);n.#e=s}static async getInstance(t){return n.#e||await n.#n(t),n.#e}async get(t){return await this.#t?.sync(),await this.#t?.get(t)??null}async getMany(t){return await this.#t?.sync(),await this.#t?.getMany(t)??[]}async list(t,e){return await this.#t?.sync(),await this.#t?.list(t,e)??{items:[],total:0,cursor:null}}async set(t,e,s){if(this.#r(e),this.#s(e),!o(s?.ttlInSeconds))throw new Error("TTL must be null or a positive number");return await this.#t?.set(t,e,s)??null}async delete(t){return!!await this.#t?.delete(t)}async clearExpired(){return await this.#t?.clearExpired()}async transaction(t){if(!this.#t)throw new Error("Remote repository not available for transactions");return await this.#t.sync(),this.#t.transaction(async e=>t({get:async r=>e.get(r),getMany:async r=>e.getMany(r),set:async(r,a,i)=>{if(this.#r(a),this.#s(a),!o(i?.ttlInSeconds))throw new Error("TTL must be null or a positive number");return e.set(r,a,i)},delete:async r=>e.delete(r)}))}#r(t){try{JSON.stringify(t)}catch(e){const s=e instanceof Error?e.message:"Unknown error";throw new Error(`Value is not JSON serializable: ${s}`)}}#s(t){const s=JSON.stringify(t),r=Buffer.byteLength(s,"utf8");if(r>1048576){const a=(r/1024).toFixed(2);throw new Error(`Value size (${a} KB) exceeds the maximum allowed size of 1 MB (1024 KB)`)}}}export{n as KvService};
|
|
@@ -22,7 +22,7 @@ type BulkSyncResult<T> = Array<{
|
|
|
22
22
|
}>;
|
|
23
23
|
export declare class CatalogEntitiesService {
|
|
24
24
|
#private;
|
|
25
|
-
constructor(localRepository: CatalogEntitiesLocalRepository, remoteRepository
|
|
25
|
+
constructor(localRepository: CatalogEntitiesLocalRepository, remoteRepository: CatalogEntitiesRemoteRepository | null);
|
|
26
26
|
static getInstance(options: ServiceInstanceOptions): Promise<CatalogEntitiesService>;
|
|
27
27
|
transaction<T>(...args: Parameters<TransactionsManager['transaction']>): Promise<T>;
|
|
28
28
|
getEntities(paginationParams: PaginationParams): Promise<ListResponseResult<EntityReadModelSchema>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{entityFileSchema as d}from"@redocly/config";import{deepMerge as y}from"../../../../utils/object/deep-merge.js";import{promiseMapLimit as c}from"../../../utils/async/promise-map-limit.js";import{logger as r}from"../../../tools/notifiers/logger.js";import{entityRelationDtoSchema as h}from"../schemas/dto-schemas.js";import{CatalogEntitiesLocalRepository as m}from"./repositories/local/catalog-entities-local-repository.js";import{CatalogEntitiesRemoteRepository as R}from"./repositories/remote/catalog-entities-remote-repository.js";import{prepareListResponse as o}from"../../../web-server/utils/prepare-list-response.js";import{ENTITY_RELATION_FROM_DATABASE as l}from"./mappers/field-transformations.js";import{createValidator as u}from"../utils/ajv-validator.js";import{hasOptionsChanged as w}from"../utils/has-options-changed.js";const E=15,f=u(h,{errorPrefix:"Entity relation validation failed:",dataVar:"entity relation"}),p=u(d,{errorPrefix:"Entity file validation failed:",dataVar:"entity"});class n{static#a;static#i;#t;#e;constructor(t,e){this.#t=t,this.#e=e}static async#n(t){const[e,a]=await Promise.all([m.getInstance(t),t.runOnlyLocalDatabase?
|
|
1
|
+
import{entityFileSchema as d}from"@redocly/config";import{deepMerge as y}from"../../../../utils/object/deep-merge.js";import{promiseMapLimit as c}from"../../../utils/async/promise-map-limit.js";import{logger as r}from"../../../tools/notifiers/logger.js";import{entityRelationDtoSchema as h}from"../schemas/dto-schemas.js";import{CatalogEntitiesLocalRepository as m}from"./repositories/local/catalog-entities-local-repository.js";import{CatalogEntitiesRemoteRepository as R}from"./repositories/remote/catalog-entities-remote-repository.js";import{prepareListResponse as o}from"../../../web-server/utils/prepare-list-response.js";import{ENTITY_RELATION_FROM_DATABASE as l}from"./mappers/field-transformations.js";import{createValidator as u}from"../utils/ajv-validator.js";import{hasOptionsChanged as w}from"../utils/has-options-changed.js";const E=15,f=u(h,{errorPrefix:"Entity relation validation failed:",dataVar:"entity relation"}),p=u(d,{errorPrefix:"Entity file validation failed:",dataVar:"entity"});class n{static#a;static#i;#t;#e;constructor(t,e){this.#t=t,this.#e=e}static async#n(t){const[e,a]=await Promise.all([m.getInstance(t),t.runOnlyLocalDatabase?null:R.getInstance(t)]),i=new n(e,a);a&&(process.env.NODE_ENV==="development"&&r.info("Attaching remote database to local database"),await i.#t.attachDatabase(a.path)),n.#a=i,n.#i=t}static async getInstance(t){return t.runOnlyLocalDatabase===void 0&&(t.runOnlyLocalDatabase=process.env.REDOCLY_LOCAL_DEV==="true"||process.env.CI==="true"),t.removeExisting===void 0&&(t.removeExisting=!1),(!n.#a||w(n.#i,t))&&await n.#n(t),n.#a}async transaction(...t){return this.#t.transactionsManager.transaction(...t)}async getEntities(t){await this.#e?.sync();const{items:e,total:a,hasMore:i}=await this.#t.getEntities(t);return o({data:e,params:t,totalCount:a,hasMore:i})}async getEntityByKey(t){return await this.#e?.sync(),await this.#t.getEntityByKey(t)}async getEntitiesCountByTypes(){return await this.#e?.sync(),this.#t.getEntitiesCountByTypes()}async getCatalogFilters(t){return await this.#e?.sync(),this.#t.getCatalogFilters(t)}async createEntity(t){return this.#e?this.#e.createEntity(t):(r.warn("No remote database found"),null)}async createEntities(t){const e=this.#e;return e?await c(t,E,async a=>e.createEntity(a).then(i=>({status:"ok",resource:i})).catch(i=>({key:a.key,status:"error",error:i}))):(r.warn("No remote database found"),[])}getEntitySources(){return this.#t.getEntitySources()}async createEntityInLocalDatabase(t){await this.#t.createEntity(t)}async createEntitiesInLocalDatabase(t){await this.#t.createEntities(t)}async createEntityRelationInLocalDatabase(t){await this.#t.createEntityRelation(t)}async createEntityRelationsInLocalDatabase(t){await this.#t.createEntityRelations(t)}async updateEntityByKey(t,e){const a=await this.#t.getEntityByKey(t);if(!a)throw new Error(`Entity with key ${t} not found`);const i=y(a,e),s=p(i);return await this.#e?.updateEntity({...s,id:a.id,createdAt:a.createdAt||""})}async deleteEntityByKey(t){const e=await this.#e?.deleteEntity(t);return await this.#s(t),e}async deleteEntitiesInLocalDatabase(t){await this.#t.deleteEntities(t)}async getEntityRelationById(t){return await this.#e?.sync(),await this.#t.getEntityRelationById(t)}async getEntitiesRelations(t={}){await this.#e?.sync();const{items:e,total:a,hasMore:i}=await this.#t.getEntitiesRelations(t);return o({data:e,params:t,totalCount:a,nameTransformationsFromDatabase:l,hasMore:i})}async createEntityRelation(t){return this.#e?.createEntityRelation(t)}async createEntitiesRelations(t){const e=this.#e;return e?await c(t,E,async a=>e.createEntityRelation(a).then(i=>({status:"ok",resource:i})).catch(i=>({key:a.sourceKey,status:"error",error:i}))):(r.warn("No remote database found"),[])}async updateEntityRelation(t,e){const a=await this.#t.getEntityRelationById(t);if(!a)throw new Error(`Entity relation with id ${t} not found`);const i=y(a,e),s=f(i);return this.#e?.createEntityRelation(s)}async deleteEntityRelation(t){let e=await this.#e?.deleteEntityRelation(t);return e||(e=await this.#t.deleteEntityRelation(t)),e}async deleteEntityRelationsInLocalDatabase(t){await this.#t.deleteEntityRelations(t)}async getEntitiesWithRelations(t={}){await this.#e?.sync();const{items:e,total:a,hasMore:i}=await this.#t.getEntitiesWithRelations(t);return o({data:e,params:t,totalCount:a,hasMore:i})}async getEntityWithRelationsByKey(t,e={}){return this.#t.getEntityWithRelationsByKey(t,e)}async getRelatedEntities(t,e={}){await this.#e?.sync();const{items:a,total:i,hasMore:s}=await this.#t.getRelatedEntities(t,e);return o({data:a,params:e,totalCount:i,nameTransformationsFromDatabase:l,hasMore:s})}async#s(t){await this.#e?.deleteEntitiesRelations({op:"OR",conditions:[{field:"source_key",operator:"equal",value:t},{field:"target_key",operator:"equal",value:t}]})}async listEntityRevisions(t,e){return await this.#e?.sync(),this.#t.listEntityRevisions(t,e)}async updateEntityScorecardsStatus(t,e){return await this.#e?.sync(),this.#t.updateEntityScorecardsStatus(t,e)}async updateEntityScorecardsStatusIfCalculating(t,e){return await this.#e?.sync(),this.#t.updateEntityScorecardsStatusIfCalculating(t,e)}async getOutdatedEntity(){return await this.#e?.sync(),this.#t.getOneOutdatedEntity()}}export{n as CatalogEntitiesService};
|
|
@@ -2,13 +2,13 @@ import type { Filter } from '../../../../../providers/database/pagination/types.
|
|
|
2
2
|
import type { PaginationParams } from '../../../../../providers/database/pagination/schemas.js';
|
|
3
3
|
import type { EntityRelationDtoSchema } from '../../../../../plugins/catalog-entities/schemas/dto-schemas.js';
|
|
4
4
|
import type { ScorecardsStatus } from '../../../../../plugins/catalog-entities/entities/types.js';
|
|
5
|
-
import type {
|
|
5
|
+
import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../../../providers/database/types.js';
|
|
6
6
|
import type { CatalogFiltersParams } from './catalog-entities-local-read-repository.js';
|
|
7
|
-
import { type CreateEntityParams } from './catalog-entities-local-write-repository.js';
|
|
8
7
|
import { BaseRepository } from '../../../../../providers/database/base-repository.js';
|
|
8
|
+
import { type CreateEntityParams } from './catalog-entities-local-write-repository.js';
|
|
9
9
|
export declare class CatalogEntitiesLocalRepository extends BaseRepository {
|
|
10
10
|
#private;
|
|
11
|
-
constructor(
|
|
11
|
+
constructor(dbConnection: DatabaseConnection);
|
|
12
12
|
get transactionsManager(): import("../../../../../providers/database/transactions-manager.js").TransactionsManager;
|
|
13
13
|
getEntitySources(): Record<string, string>;
|
|
14
14
|
static getInstance(options: RepositoryInstanceOptions): Promise<CatalogEntitiesLocalRepository>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{promiseMapLimit as
|
|
1
|
+
import{promiseMapLimit as a}from"../../../../../utils/async/promise-map-limit.js";import{DatabaseConnectionFactory as r}from"../../../../../providers/database/database-connection-factory.js";import{BaseRepository as o}from"../../../../../providers/database/base-repository.js";import{CatalogEntitiesLocalReadRepository as c}from"./catalog-entities-local-read-repository.js";import{CatalogEntitiesLocalWriteRepository as y}from"./catalog-entities-local-write-repository.js";import{createEntityRelationDbRecordFromDto as l}from"../../mappers/create-entity-relation-db-record-from-dto.js";import{hasOptionsChanged as h}from"../../../utils/has-options-changed.js";const s=50;class i extends o{static#i;static#n;#t;#e;#a={};constructor(t){super(t),this.#t=new c(this.databaseClient),this.#e=new y(this.databaseClient,this.organizationId,this.projectId)}get transactionsManager(){return this.databaseClient.transactionsManager}getEntitySources(){return this.#a}static async getInstance(t){const e=h(i.#n,t);if(!i.#i||e){const n=await r.create("catalog-local",t);if(!n)throw new Error("Failed to create db connection for catalog entities local repository");i.#i=new i(n),i.#n=t}return i.#i}async attachDatabase(t){await this.#t.attachDatabase(t)}getEntities(t={}){return this.#t.getEntities(t)}getEntityByKey(t){return this.#t.getEntityByKey(t)}getEntitiesCountByTypes(){return this.#t.getEntitiesCountByTypes()}getEntitiesRelations(t={}){return this.#t.getEntitiesRelations(t)}getEntityRelationById(t){return this.#t.getEntityRelationById(t)}getEntitiesWithRelations(t={}){return this.#t.getEntitiesWithRelations(t)}getEntityWithRelationsByKey(t,e={}){return this.#t.getEntityWithRelationsByKey(t,e)}getRelatedEntities(t,e={}){return this.#t.getRelatedEntities(t,e)}createEntity(t){return t.isRootEntity&&(this.#a[t.sourceFile]=t.entity.key),this.#e.createEntity(t)}async createEntities(t){await a(t,s,async e=>this.createEntity(e))}createEntityRelation(t){const e=l(t,this.organizationId,this.projectId);return this.#e.createEntityRelation(e)}async createEntityRelations(t){await a(t,s,async e=>this.createEntityRelation(e))}deleteEntity(t){return this.#e.deleteEntity(t)}deleteEntities(t){return this.#e.deleteEntities(t)}deleteEntityRelation(t){return this.#e.deleteEntityRelation(t)}deleteEntityRelations(t){return this.#e.deleteEntityRelations(t)}getCatalogFilters(t){return this.#t.getCatalogFilters(t)}listEntityRevisions(t,e){return this.#t.listEntityRevisions(t,e)}updateEntityScorecardsStatus(t,e){return this.#e.updateEntityScorecardsStatus(t,e)}updateEntityScorecardsStatusIfCalculating(t,e){return this.#e.updateEntityScorecardsStatusIfCalculating(t,e)}getOneOutdatedEntity(){return this.#t.getOneOutdatedEntity()}}export{i as CatalogEntitiesLocalRepository};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { EntityReadModelSchema } from '../../../schemas/read-model-schemas.js';
|
|
2
2
|
import type { EntityDtoSchema, EntityRelationDtoSchema } from '../../../schemas/dto-schemas.js';
|
|
3
3
|
import type { Filter } from '../../../../../providers/database/pagination/types.js';
|
|
4
|
-
import type {
|
|
5
|
-
import {
|
|
4
|
+
import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../../../providers/database/types.js';
|
|
5
|
+
import type { DatabaseEntityRelation } from '../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js';
|
|
6
6
|
import { BaseRepository } from '../../../../../providers/database/base-repository.js';
|
|
7
7
|
export declare class CatalogEntitiesRemoteRepository extends BaseRepository {
|
|
8
8
|
#private;
|
|
9
9
|
get transactionsManager(): import("../../../../../providers/database/transactions-manager.js").TransactionsManager;
|
|
10
|
-
constructor(
|
|
10
|
+
constructor(dbConnection: DatabaseConnection);
|
|
11
11
|
sync(): Promise<void>;
|
|
12
|
-
static getInstance(options: RepositoryInstanceOptions): Promise<CatalogEntitiesRemoteRepository |
|
|
12
|
+
static getInstance(options: RepositoryInstanceOptions): Promise<CatalogEntitiesRemoteRepository | null>;
|
|
13
13
|
createEntity(entity: EntityDtoSchema): Promise<EntityReadModelSchema | null>;
|
|
14
14
|
updateEntity(entity: EntityDtoSchema & {
|
|
15
15
|
id?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{eq as
|
|
1
|
+
import{eq as h,sql as f}from"drizzle-orm";import{convertFilterToWhereCondition as w}from"../../../../../providers/database/pagination/filter.js";import{promiseMapLimit as E}from"../../../../../utils/async/promise-map-limit.js";import{logger as n}from"../../../../../tools/notifiers/logger.js";import{entitiesTable as r}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{telemetryTraceStep as i}from"../../../../../telemetry/helpers/trace-step.js";import{BaseRepository as _}from"../../../../../providers/database/base-repository.js";import{DatabaseConnectionFactory as b}from"../../../../../providers/database/database-connection-factory.js";import{entitiesRelationsTable as a}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{createEntityDbRecord as p}from"../../mappers/create-entity-db-record.js";import{createEntityReadModel as m}from"../../mappers/create-entity-read-model.js";import{createEntityRelationDbRecordFromDto as C}from"../../mappers/create-entity-relation-db-record-from-dto.js";const I=15;class s extends _{static#e;get transactionsManager(){return this.databaseClient.transactionsManager}constructor(e){super(e)}async sync(){return i("catalog_entities.remote_repository.sync",async()=>{await this.#t(),await this.databaseClient.sync()})}static async getInstance(e){return await i("catalog_entities.remote_repository.get_instance",async t=>{if(!s.#e)try{const o=await b.create("sqld-remote",e);if(!o)return n.error("Failed to create db connection for catalog entities remote repository"),t?.error(new Error("Failed to create db connection for catalog entities remote repository")),s.#e=null,null;s.#e=new s(o)}catch(o){return n.error("Error creating db connection for catalog entities remote repository",o),t?.error(o),s.#e=null,null}return s.#e})}async createEntity(e){return i("catalog_entities.remote_repository.create_entity",async()=>{await this.#t();try{n.info(`Adding entity ${e.key} to remote database`);const t=p({entity:e,organizationId:this.organizationId,projectId:this.projectId,source:"remote",sourceFile:null,fileHash:null}),{key:o,source:d,...u}=t,l=await this.databaseClient.client.insert(r).values(t).onConflictDoUpdate({target:[r.key,r.source,r.revision,r.version],set:u}).returning();return l.length?(e.relations&&await this.createEntityRelations(e.relations.map(c=>({...c,sourceKey:e.key,targetKey:c.key}))),m(l[0])):null}catch(t){throw n.error("Error adding entity",t),t}})}async updateEntity(e){return i("catalog_entities.remote_repository.update_entity",async()=>{await this.#t();try{n.info(`Updating entity ${e.key} in remote database`);const t=p({entity:e,organizationId:this.organizationId,projectId:this.projectId,source:"remote",sourceFile:null,fileHash:null}),{key:o,source:d,scorecardsStatus:u,...l}=t,c=await this.databaseClient.client.insert(r).values(t).onConflictDoUpdate({target:[r.key,r.source,r.revision,r.version],set:{...l,scorecardsStatus:f`CASE WHEN ${r.scorecardsStatus} = 'CALCULATING' THEN 'CANCELLED' ELSE 'OUTDATED' END`}}).returning();return c.length?m(c[0]):null}catch(t){return n.error("Error updating entity",t),null}})}async deleteEntity(e){return i("catalog_entities.remote_repository.delete_entity",async()=>{await this.#t();try{return await this.databaseClient.client.delete(r).where(h(r.key,e)),e}catch(t){return n.error("Error deleting entity",t),null}})}async createEntityRelations(e){return i("catalog_entities.remote_repository.create_entity_relations",async()=>(await this.#t(),await E(e,I,async t=>this.createEntityRelation(t))))}async createEntityRelation(e){return i("catalog_entities.remote_repository.create_entity_relation",async()=>{if(await this.#t(),!e)return null;try{const t=C(e,this.organizationId,this.projectId),{sourceKey:o,targetKey:d,sourceVersion:u,targetVersion:l,sourceRevision:c,targetRevision:D,...g}=t,y=await this.databaseClient.client.insert(a).values(t).onConflictDoUpdate({target:[a.sourceKey,a.targetKey,a.sourceVersion,a.targetVersion,a.sourceRevision,a.targetRevision],set:g}).returning();return y.length?y[0]:null}catch(t){throw n.error("Error creating entity relation",t),t}})}async deleteEntityRelation(e){return i("catalog_entities.remote_repository.delete_entity_relation",async()=>{await this.#t();try{return await this.databaseClient.client.delete(a).where(h(a.id,e)),e}catch(t){return n.error("Error deleting entity relation",t),null}})}async deleteEntitiesRelations(e){return i("catalog_entities.remote_repository.delete_entities_relations",async()=>{await this.#t();try{const t=w(e);return t?(await this.databaseClient.client.delete(a).where(t),!0):!1}catch(t){return n.error("Error deleting entities relations",t),!1}})}#t(){return i("catalog_entities.remote_repository.db_health",async e=>{if(this.databaseClient.dbClient.$client.closed){const t=new Error("The remote database connection is closed!");throw e?.error(t),t}})}}export{s as CatalogEntitiesRemoteRepository};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { DatabaseClient } from './client.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { DatabaseConnection } from './types.js';
|
|
3
3
|
export declare abstract class BaseRepository {
|
|
4
4
|
#private;
|
|
5
5
|
protected readonly organizationId: string;
|
|
6
6
|
protected readonly projectId: string;
|
|
7
7
|
protected readonly databaseClient: DatabaseClient;
|
|
8
8
|
readonly path: string;
|
|
9
|
-
protected constructor(
|
|
9
|
+
protected constructor(dbConnection: DatabaseConnection);
|
|
10
10
|
close(): Promise<void>;
|
|
11
11
|
sync(): Promise<void>;
|
|
12
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
class n{static#e="ORGANIZATION_ID";static#t="PROJECT_ID";organizationId;projectId;databaseClient;path;constructor(t){const e=this.#
|
|
1
|
+
class n{static#e="ORGANIZATION_ID";static#t="PROJECT_ID";organizationId;projectId;databaseClient;path;constructor(t){const e=this.#r();this.organizationId=this.#n(e),this.projectId=this.#i(e),this.databaseClient=t.client,this.path=t.path}async close(){await this.databaseClient.close()}async sync(){await this.databaseClient.sync()}#n=t=>{const e=process.env.ORGANIZATION_ID;if(e)return e;if(t)return n.#e;throw new Error("ORGANIZATION_ID environment variable is required. Ensure it is set in your environment configuration.")};#i=t=>{const e=process.env.PROJECT_ID;if(e)return e;if(t)return n.#t;throw new Error("PROJECT_ID environment variable is required. Ensure it is set in your environment configuration.")};#r=()=>!process.env.SQLD_REMOTE_DATABASE_URL&&!process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN}export{n as BaseRepository};
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
export declare const CATALOG_LOCAL_DATABASE_NAME = "catalog-local.sqlite";
|
|
2
|
+
export declare const CATALOG_LOCAL_DATABASE_FOLDER = "catalog-local";
|
|
3
|
+
export declare const CATALOG_LOCAL_DATABASE_MIGRATIONS_FOLDER = "catalog-sqlite";
|
|
1
4
|
export declare const MAIN_LOCAL_DATABASE_NAME = "main-local.sqlite";
|
|
2
5
|
export declare const MAIN_LOCAL_DATABASE_FOLDER = "main-local";
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
6
|
+
export declare const MAIN_LOCAL_DATABASE_MIGRATIONS_FOLDER = "main-sqlite";
|
|
7
|
+
export declare const SQLD_REMOTE_DATABASE_NAME = "sqld-remote.sqlite";
|
|
8
|
+
export declare const SQLD_REMOTE_DATABASE_FOLDER = "sqld-remote";
|
|
9
|
+
export declare const SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER = "sqld-sqlite";
|
|
7
10
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const A="
|
|
1
|
+
const A="catalog-local.sqlite",_="catalog-local",t="catalog-sqlite",o="main-local.sqlite",E="main-local",L="main-sqlite",O="sqld-remote.sqlite",l="sqld-remote",e="sqld-sqlite";export{_ as CATALOG_LOCAL_DATABASE_FOLDER,t as CATALOG_LOCAL_DATABASE_MIGRATIONS_FOLDER,A as CATALOG_LOCAL_DATABASE_NAME,E as MAIN_LOCAL_DATABASE_FOLDER,L as MAIN_LOCAL_DATABASE_MIGRATIONS_FOLDER,o as MAIN_LOCAL_DATABASE_NAME,l as SQLD_REMOTE_DATABASE_FOLDER,e as SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER,O as SQLD_REMOTE_DATABASE_NAME};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DatabaseConnection, DatabaseConnectionOptions, DatabaseName } from './types.js';
|
|
2
|
+
export declare class DatabaseConnectionFactory {
|
|
3
|
+
#private;
|
|
4
|
+
static create(databaseName: DatabaseName, options: DatabaseConnectionOptions): Promise<DatabaseConnection | null>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=database-connection-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{logger as e}from"../../tools/notifiers/logger.js";import{CATALOG_LOCAL_DATABASE_MIGRATIONS_FOLDER as r,CATALOG_LOCAL_DATABASE_FOLDER as i,CATALOG_LOCAL_DATABASE_NAME as s,MAIN_LOCAL_DATABASE_MIGRATIONS_FOLDER as _,MAIN_LOCAL_DATABASE_FOLDER as E,MAIN_LOCAL_DATABASE_NAME as l,SQLD_REMOTE_DATABASE_FOLDER as c,SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER as D,SQLD_REMOTE_DATABASE_NAME as T}from"./constants.js";import{LocalDatabaseInitializationStrategy as n,RemoteDatabaseInitializationStrategy as L}from"./database-initialization-strategy.js";import{DatabaseConnectionsManager as O}from"./database-connections-manager.js";class g{static async create(a,t){switch(a){case"main-local":return await this.#a(t);case"catalog-local":return await this.#t(t);case"sqld-remote":return await this.#e(t);default:return null}}static async#a(a){return await new n().initialize({...a,databaseName:l,additionalFolder:E,migrationsFolder:_})}static async#t(a){return await new n().initialize({...a,databaseName:s,additionalFolder:i,migrationsFolder:r})}static async#e(a){const t=process.env.SQLD_REMOTE_DATABASE_URL&&process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN,A=a.sqldRemoteDatabaseUrl&&a.sqldRemoteDatabaseAuthToken;if(!t&&!A)return process.env.NEW_CATALOG_ENABLED==="true"&&e.warn("SQLD_REMOTE_DATABASE_URL and SQLD_REMOTE_DATABASE_AUTH_TOKEN env variables or sqldRemoteDatabaseUrl and sqldRemoteDatabaseAuthToken options not set - remote database will not be initialized"),null;try{return await O.getConnection({config:{...a,databaseName:T,additionalFolder:c,migrationsFolder:D,syncUrl:process.env.SQLD_REMOTE_DATABASE_URL||a.sqldRemoteDatabaseUrl,authToken:process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN||a.sqldRemoteDatabaseAuthToken},strategy:new L})}catch(o){return e.error("Remote database connection initialization failed",o),null}}}export{g as DatabaseConnectionFactory};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { DatabaseConnectionInitOptions, DatabaseConnection } from './types.js';
|
|
2
2
|
import { type DatabaseInitializationStrategy } from './database-initialization-strategy.js';
|
|
3
|
-
type GetConnectionParams<TConfig extends
|
|
3
|
+
type GetConnectionParams<TConfig extends DatabaseConnectionInitOptions> = {
|
|
4
4
|
config: TConfig;
|
|
5
5
|
strategy: DatabaseInitializationStrategy;
|
|
6
6
|
};
|
|
7
7
|
export declare class DatabaseConnectionsManager {
|
|
8
8
|
#private;
|
|
9
|
-
static getConnection<TConfig extends
|
|
9
|
+
static getConnection<TConfig extends DatabaseConnectionInitOptions>({ config, strategy, }: GetConnectionParams<TConfig>): Promise<DatabaseConnection | null>;
|
|
10
10
|
}
|
|
11
11
|
export {};
|
|
12
12
|
//# sourceMappingURL=database-connections-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{logger as o}from"../../tools/notifiers/logger.js";const
|
|
1
|
+
import{logger as o}from"../../tools/notifiers/logger.js";const n="_redocly_db_preconnect_cache_";class t{static get#t(){const e=globalThis;if(!e[n]){const i={connections:new Map,pendingConnections:new Map,failedConnections:new Set};e[n]=i}return e[n]}static get#c(){return t.#t.connections}static get#e(){return t.#t.failedConnections}static get#i(){return t.#t.pendingConnections}static async getConnection({config:e,strategy:i}){const r=t.#l(e),c=t.#c.get(r);return c||t.#r({config:e,key:r,strategy:i})}static#r=async({config:e,key:i,strategy:r})=>{let c=t.#i.get(i);c||(t.#e.has(i)&&o.warn("Error connecting to the database, retrying..."),c=t.#n(e,i,r),t.#i.set(i,c));try{return await c}catch(l){return o.error("Error connecting to the database",l),t.#e.add(i),null}finally{t.#i.delete(i)}};static#n=async(e,i,r)=>{const c=await r.initialize(e);return t.#c.set(i,c),t.#e.delete(i),c};static#l=e=>`${e.baseDbDir}/${e.additionalFolder}/${e.databaseName}`}export{t as DatabaseConnectionsManager};
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { DatabaseConnectionOptions, DatabaseConnection, DatabaseConnectionInitOptions, RemoteDatabaseConnectionInitOptions } from './types.js';
|
|
2
2
|
export type DatabaseInitializationStrategy = {
|
|
3
|
-
initialize(options:
|
|
3
|
+
initialize(options: DatabaseConnectionOptions): Promise<DatabaseConnection>;
|
|
4
4
|
};
|
|
5
|
-
export declare class DefaultDatabaseInitializationStrategy implements DatabaseInitializationStrategy {
|
|
6
|
-
initialize({ baseDbDir, databaseName, additionalFolder, }: DatabaseInitConnectionOptions): Promise<DatabaseInitializationResult>;
|
|
7
|
-
}
|
|
8
5
|
export declare class LocalDatabaseInitializationStrategy implements DatabaseInitializationStrategy {
|
|
9
|
-
initialize({ removeExisting, baseDbDir, runWithPragmaWalWriteOptimization, databaseName, additionalFolder, migrationsFolder, }:
|
|
6
|
+
initialize({ removeExisting, baseDbDir, runWithPragmaWalWriteOptimization, databaseName, additionalFolder, migrationsFolder, }: DatabaseConnectionInitOptions): Promise<DatabaseConnection>;
|
|
10
7
|
}
|
|
11
8
|
type RemoteDatabaseInitializationStrategyParams = {
|
|
12
9
|
skipLogs?: boolean;
|
|
@@ -14,10 +11,7 @@ type RemoteDatabaseInitializationStrategyParams = {
|
|
|
14
11
|
export declare class RemoteDatabaseInitializationStrategy implements DatabaseInitializationStrategy {
|
|
15
12
|
#private;
|
|
16
13
|
constructor(params?: RemoteDatabaseInitializationStrategyParams);
|
|
17
|
-
initialize({ removeExisting, baseDbDir, syncUrl, authToken, databaseName, additionalFolder, migrationsFolder, }:
|
|
18
|
-
syncUrl: string;
|
|
19
|
-
authToken: string;
|
|
20
|
-
}): Promise<DatabaseInitializationResult>;
|
|
14
|
+
initialize({ removeExisting, baseDbDir, syncUrl, authToken, databaseName, additionalFolder, migrationsFolder, }: RemoteDatabaseConnectionInitOptions): Promise<DatabaseConnection>;
|
|
21
15
|
}
|
|
22
16
|
export {};
|
|
23
17
|
//# sourceMappingURL=database-initialization-strategy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{logger as
|
|
1
|
+
import{logger as r}from"../../tools/notifiers/logger.js";import{DatabaseClient as g}from"./client.js";import{DatabasePathGenerator as p}from"./database-path-generator.js";import{retryAsyncOperation as h}from"./utils/retry-async-operation.js";class u{async initialize({removeExisting:a,baseDbDir:t,runWithPragmaWalWriteOptimization:s,databaseName:o,additionalFolder:l,migrationsFolder:c}){r.info("Initializing local database client...");const m=r.startTiming(),{databasePath:e}=await p.prepareDatabasePath({baseDir:t,databaseName:o,additionalFolder:l,removeExisting:a}),n={url:`file:${e}`},i=await g.init(n,{runWithPragmaWalWriteOptimization:s});return await i.migrate(t,c),r.infoTime(m,"Local database client initialized"),{client:i,path:e}}}class w{#t;#a;constructor(a){this.#t=a?.skipLogs??!1,this.#a=this.#t?void 0:r}async initialize({removeExisting:a,baseDbDir:t,syncUrl:s,authToken:o,databaseName:l,additionalFolder:c,migrationsFolder:m}){this.#a?.info("Initializing remote database client...");const e=this.#a?.startTiming();return await h(async()=>{const{databasePath:n}=await p.prepareDatabasePath({baseDir:t,databaseName:l,additionalFolder:c,removeExisting:a}),i=await g.init({url:`file:${n}`,syncUrl:s,authToken:o});return await i.migrate(t,m),this.#a?.infoTime(e??"","Remote database client initialized"),{client:i,path:n}},{maxRetries:3,retryStrategy:"exponential",delay:1e3,logger:this.#a,messages:{retry:"Retrying remote database client initialization",maxRetriesReached:"Max retries reached, remote database client initialization failed"}})}}export{u as LocalDatabaseInitializationStrategy,w as RemoteDatabaseInitializationStrategy};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{logger as
|
|
1
|
+
import{logger as r}from"../../tools/notifiers/logger.js";import{DatabaseConnectionFactory as a}from"./database-connection-factory.js";class e{static#e=!1;static async init(t){if(!(process.env.REDOCLY_LOCAL_DEV==="true"||process.env.CI==="true")&&!e.#e)try{await e.#t(t)==="PRECONNECTED"&&(e.#e=!0)}catch(o){r.error("Failed to preconnect to sqld remote database",o)}}static#t=async t=>await a.create("sqld-remote",{baseDbDir:t})?(r.info("Sqld remote database preconnected"),"PRECONNECTED"):(r.warn("Sqld remote database preconnect failed"),"NOT_PRECONNECTED")}export{e as DatabasePreconnectService};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{DatabasePathGenerator as a}from"../../database-path-generator";import{CATALOG_LOCAL_DATABASE_NAME as e,CATALOG_LOCAL_DATABASE_FOLDER as t}from"
|
|
1
|
+
import{DatabasePathGenerator as a}from"../../database-path-generator.js";import{CATALOG_LOCAL_DATABASE_NAME as e,CATALOG_LOCAL_DATABASE_FOLDER as t}from"../../constants.js";const s="./dist/server/esbuild/cache/server",r="./src/server/providers/database/databases/catalog-sqlite/schemas/*",A="./src/server/providers/database/databases/catalog-sqlite/migrations",o=()=>({url:a.generateDatabasePath({baseDir:s,databaseName:e,additionalFolder:t})});var c={schema:r,out:A,dialect:"turso",dbCredentials:o()};export{r as SCHEMAS_PATH,c as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{DatabasePathGenerator as a}from"../../database-path-generator";import{
|
|
1
|
+
import{DatabasePathGenerator as a}from"../../database-path-generator.js";import{SQLD_REMOTE_DATABASE_FOLDER as r,SQLD_REMOTE_DATABASE_NAME as t}from"../../constants.js";import{SCHEMAS_PATH as A}from"../catalog-sqlite/drizzle.config.js";const o="./dist/server/esbuild/cache/server",E="./src/server/providers/database/databases/sqld-sqlite/schemas/*",_="./src/server/providers/database/databases/sqld-sqlite/migrations",d=()=>{const e=process.env.SQLD_REMOTE_DATABASE_URL,s=process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN;return e&&s?{url:e,authToken:s}:{url:a.generateDatabasePath({baseDir:o,databaseName:t,additionalFolder:r})}};var n={schema:[E,A],out:_,dialect:"turso",dbCredentials:d()};export{n as default};
|
|
@@ -1,27 +1,32 @@
|
|
|
1
1
|
import type { DatabaseClient } from './client.js';
|
|
2
|
-
export type
|
|
2
|
+
export type DatabaseConnectionInitOptions = {
|
|
3
3
|
baseDbDir: string;
|
|
4
4
|
databaseName: string;
|
|
5
5
|
migrationsFolder: string;
|
|
6
6
|
additionalFolder?: string;
|
|
7
7
|
removeExisting?: boolean;
|
|
8
8
|
runWithPragmaWalWriteOptimization?: boolean;
|
|
9
|
+
sqldRemoteDatabaseUrl?: string;
|
|
10
|
+
sqldRemoteDatabaseAuthToken?: string;
|
|
9
11
|
};
|
|
10
|
-
export type
|
|
12
|
+
export type RemoteDatabaseConnectionInitOptions = DatabaseConnectionInitOptions & {
|
|
13
|
+
syncUrl: string;
|
|
14
|
+
authToken: string;
|
|
15
|
+
};
|
|
16
|
+
export type DatabaseConnectionOptions = {
|
|
11
17
|
baseDbDir: string;
|
|
12
|
-
migrationsFolder?: string;
|
|
13
|
-
databaseName?: string;
|
|
14
|
-
additionalFolder?: string;
|
|
15
18
|
removeExisting?: boolean;
|
|
16
19
|
runWithPragmaWalWriteOptimization?: boolean;
|
|
17
20
|
sqldRemoteDatabaseUrl?: string;
|
|
18
21
|
sqldRemoteDatabaseAuthToken?: string;
|
|
19
22
|
};
|
|
23
|
+
export type RepositoryInstanceOptions = DatabaseConnectionOptions;
|
|
20
24
|
export type ServiceInstanceOptions = RepositoryInstanceOptions & {
|
|
21
25
|
runOnlyLocalDatabase?: boolean;
|
|
22
26
|
};
|
|
23
|
-
export type
|
|
27
|
+
export type DatabaseConnection = {
|
|
24
28
|
client: DatabaseClient;
|
|
25
29
|
path: string;
|
|
26
30
|
};
|
|
31
|
+
export type DatabaseName = 'main-local' | 'catalog-local' | 'sqld-remote';
|
|
27
32
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{logger as
|
|
1
|
+
import{logger as g}from"../../tools/notifiers/logger.js";import{reporter as m}from"../../tools/notifiers/reporter.js";import{enhanceContext as f}from"../../api-routes/helpers/enhance-context.js";import{KvService as l}from"../../persistence/kv/services/kv-service.js";import{enhanceRequest as u}from"../../api-routes/helpers/enhance-request.js";async function S({route:r,ctx:t,staticData:n,serverPropsGetters:a,serverPropsUser:p,actions:s}){try{if(!a[r.fsPath]||!t)return;const e=a[r.fsPath];e||await m.panicOnBuild(`Invalid page props getter id: "${r.fsPath}" for route "${r.slug}"`);const o=async()=>await l.getInstance({baseDbDir:s.serverOutDir,sqldRemoteDatabaseUrl:process.env.SQLD_REMOTE_DATABASE_URL,sqldRemoteDatabaseAuthToken:process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN}),c=f({honoCtx:t,ctx:{user:p,config:s.getConfig()},getKv:o}),i=await u(t);return await(await e()).default(n,i,c)}catch(e){const o=r.fsPath.replace(/\.(page\.tsx?|md)$/,".props.ts");return g.error(`Page prop getter error: ${e.message}`),{pagePropGetterError:{message:`${e.message||"An unknown error occurred"} in ${o}`,name:"ServerPropsGetterError",stack:e.stack}}}}export{S as getServerPropsFromUserHandler};
|
|
@@ -18,5 +18,5 @@ export type ApiFunctionsErrorMessage = {
|
|
|
18
18
|
stack: string;
|
|
19
19
|
};
|
|
20
20
|
};
|
|
21
|
-
export type ApiFunctionsBasicContext = Omit<ApiFunctionsContext, 'params' | 'query' | 'cookies' | 'status' | 'json' | 'text' | 'redirect' | 'setCookie' | 'deleteCookie' | 'log' | '
|
|
21
|
+
export type ApiFunctionsBasicContext = Omit<ApiFunctionsContext, 'params' | 'query' | 'cookies' | 'status' | 'json' | 'text' | 'redirect' | 'setCookie' | 'deleteCookie' | 'log' | 'getKv'>;
|
|
22
22
|
//# sourceMappingURL=api-functions.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@redocly/revel",
|
|
3
|
-
"version": "0.128.0-next.
|
|
3
|
+
"version": "0.128.0-next.9",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -92,14 +92,14 @@
|
|
|
92
92
|
"xml-crypto": "6.0.1",
|
|
93
93
|
"xpath": "0.0.34",
|
|
94
94
|
"yaml-ast-parser": "0.0.43",
|
|
95
|
-
"@redocly/asyncapi-docs": "1.5.0-next.
|
|
95
|
+
"@redocly/asyncapi-docs": "1.5.0-next.9",
|
|
96
96
|
"@redocly/config": "0.40.0",
|
|
97
97
|
"@redocly/graphql-docs": "1.5.0-next.1",
|
|
98
|
-
"@redocly/openapi-docs": "3.16.0-next.
|
|
98
|
+
"@redocly/openapi-docs": "3.16.0-next.9",
|
|
99
99
|
"@redocly/portal-legacy-ui": "0.11.0-next.0",
|
|
100
|
-
"@redocly/portal-plugin-mock-server": "0.13.0-next.
|
|
100
|
+
"@redocly/portal-plugin-mock-server": "0.13.0-next.9",
|
|
101
101
|
"@redocly/realm-asyncapi-sdk": "0.6.0-next.1",
|
|
102
|
-
"@redocly/theme": "0.60.0-next.
|
|
102
|
+
"@redocly/theme": "0.60.0-next.6"
|
|
103
103
|
},
|
|
104
104
|
"peerDependencies": {
|
|
105
105
|
"react": "^19.1.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const E="sqld-remote.sqlite",A="sqld-remote",t="sqld-sqlite";export{A as SQLD_REMOTE_DATABASE_FOLDER,t as SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER,E as SQLD_REMOTE_DATABASE_NAME};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const A="catalog-local.sqlite",o="catalog-local",t="catalog-sqlite";export{t as CATALOG_DATABASE_MIGRATIONS_FOLDER,o as CATALOG_LOCAL_DATABASE_FOLDER,A as CATALOG_LOCAL_DATABASE_NAME};
|