@redocly/revel-reef 0.130.0-next.6 → 0.130.0-next.8
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 +34 -5
- package/dist/cli/telemetry/index.d.ts +1 -1
- package/dist/client/browser-entry.js +3 -3
- package/dist/constants/common.d.ts +2 -1
- package/dist/constants/common.js +1 -1
- package/dist/constants/l10n/langs/ar.js +1 -1
- package/dist/constants/l10n/langs/de.js +1 -1
- package/dist/constants/l10n/langs/en.js +1 -1
- package/dist/constants/l10n/langs/es.js +1 -1
- package/dist/constants/l10n/langs/fr.js +1 -1
- package/dist/constants/l10n/langs/hi.js +1 -1
- package/dist/constants/l10n/langs/it.js +1 -1
- package/dist/constants/l10n/langs/ja.js +1 -1
- package/dist/constants/l10n/langs/ko.js +1 -1
- package/dist/constants/l10n/langs/pl.js +1 -1
- package/dist/constants/l10n/langs/pt-BR.js +1 -1
- package/dist/constants/l10n/langs/pt.js +1 -1
- package/dist/constants/l10n/langs/ru.js +1 -1
- package/dist/constants/l10n/langs/uk.js +1 -1
- package/dist/constants/l10n/langs/zh.js +1 -1
- package/dist/server/api-routes/run-api-routes-worker.js +1 -1
- package/dist/server/persistence/kv/repositories/kv-remote-repository.js +2 -2
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +5 -6
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.d.ts +27 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.d.ts +36 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +30 -23
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +3 -2
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +23 -12
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +6 -4
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +2 -5
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/utils/create-merged-entity-fields-for-select.d.ts +34 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/create-merged-entity-fields-for-select.js +13 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/normalize-revision-flags.d.ts +23 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/normalize-revision-flags.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/semantic-version-sort.d.ts +78 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/semantic-version-sort.js +34 -0
- package/dist/server/plugins/catalog-entities/entities/validate-entity.d.ts +3 -1
- package/dist/server/plugins/catalog-entities/entities/validate-entity.js +1 -1
- package/dist/server/plugins/catalog-entities/plugin.js +1 -1
- package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +3 -1
- package/dist/server/plugins/catalog-entities/utils/ajv-validator.js +1 -1
- package/dist/server/plugins/scorecard-classic/loaders/scorecard-config.js +1 -1
- package/dist/server/plugins/scorecards/database/scorecards-config-service.d.ts +1 -1
- package/dist/server/plugins/scorecards/database/scorecards-config-service.js +1 -1
- package/dist/server/plugins/scorecards/workers/run-scorecards-worker.js +1 -1
- package/dist/server/plugins/scorecards/workers/scorecards.d.ts +1 -14
- package/dist/server/plugins/scorecards/workers/scorecards.js +1 -1
- package/dist/server/providers/database/pagination/entities-to-filter.d.ts +15 -0
- package/dist/server/providers/database/pagination/entities-to-filter.js +1 -0
- package/dist/server/providers/database/pagination/utils/index.d.ts +4 -0
- package/dist/server/providers/database/pagination/utils/index.js +1 -1
- package/dist/server/providers/database/pagination/utils/is-nested-condition.d.ts +16 -0
- package/dist/server/providers/database/pagination/utils/is-nested-condition.js +1 -0
- package/dist/server/providers/database/pagination/utils/is-simple-condition.d.ts +18 -0
- package/dist/server/providers/database/pagination/utils/is-simple-condition.js +1 -0
- package/dist/server/providers/database/pagination/utils/map-operator.d.ts +10 -0
- package/dist/server/providers/database/pagination/utils/map-operator.js +1 -0
- package/dist/server/providers/database/pagination/utils/transform-condition.d.ts +12 -0
- package/dist/server/providers/database/pagination/utils/transform-condition.js +1 -0
- package/dist/server/types/plugins/scorecards.d.ts +30 -0
- package/dist/server/types/plugins/scorecards.js +0 -0
- package/dist/server/web-server/routes/catalog/catalog.js +1 -1
- package/dist/server/workers/types.d.ts +1 -1
- package/package.json +11 -14
|
@@ -6,6 +6,6 @@ export declare class ScorecardsConfigService extends BaseRepository {
|
|
|
6
6
|
#private;
|
|
7
7
|
constructor(dbConnection: Awaited<ReturnType<typeof DatabaseConnectionFactory.create>>);
|
|
8
8
|
static getInstance(options: ServiceInstanceOptions): Promise<ScorecardsConfigService>;
|
|
9
|
-
|
|
9
|
+
syncConfig(scorecardsConfig: ScorecardsConfig, onConfigChange?: (key: string) => Promise<void>): Promise<void>;
|
|
10
10
|
}
|
|
11
11
|
//# sourceMappingURL=scorecards-config-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ulid as
|
|
1
|
+
import{ulid as g}from"ulid";import{logger as r}from"../../../tools/notifiers/logger.js";import{DatabaseConnectionFactory as l}from"../../../providers/database/database-connection-factory.js";import{BaseRepository as d}from"../../../providers/database/base-repository.js";import{shaHex as h}from"../../../utils/crypto/sha-hex.js";import{hasOptionsChanged as m}from"../../../plugins/catalog-entities/utils/has-options-changed.js";import{slug as y}from"../../../utils/slugger.js";import{withTimestamp as f}from"../../../utils/time/with-timestamp.js";import{ScorecardsConfigLocalRepository as p}from"./repositories/local/scorecards-config-local-repository.js";class o extends d{static#i;static#e;#t;constructor(t){if(!t)throw new Error("Database connection is required for ScorecardsConfigService");super(t),this.#t=new p(this.databaseClient)}static async getInstance(t){const i=m(o.#e,t);if(!o.#i||i){const n=await l.create("main-local",t);if(!n)throw new Error("Failed to create db connection for scorecards config service");o.#i=new o(n),o.#e=t}return o.#i}async syncConfig(t,i){const n=new Set;(!Array.isArray(t)||t.length===0)&&r.verbose("No scorecard configs to sync"),r.verbose(`Starting scorecard config sync for ${t.length} config(s)`);for(const s of t)try{const e=s.key;if(!/^[a-z0-9-]+$/i.test(e)){r.error(`Skipping invalid scorecard config item: key "${e}" does not match kebab-case format (letters, numbers, and dashes only)`,{scorecard:s});continue}n.add(e);const a=this.#s(s),c=await this.#t.findActiveConfigByKey(e);if(c){if(c.configHash===a){r.verbose(`Config "${e}" unchanged, skipping update`);continue}r.verbose(`Updating config "${e}"`),await this.#r(c.id,s,a)}else r.verbose(`Inserting new config "${e}"`),await this.#n(e,s,a);i&&await i(e)}catch(e){r.error("Error processing scorecard config item:",{error:e.message??e,scorecard:s})}await this.#o(n),r.verbose("Sync scorecard configuration: success")}#s(t){const i=JSON.stringify({entities:t.entities,levels:t.levels});return h(i)}async#n(t,i,n){await this.#t.insertConfig(f({id:`sc_${g()}`,key:t,slug:y(t),name:i.name,description:i.description??null,entitiesFilter:JSON.stringify(i.entities),levels:JSON.stringify(i.levels),configHash:n,archivedAt:null}))}async#r(t,i,n){const s=f({entitiesFilter:JSON.stringify(i.entities),levels:JSON.stringify(i.levels),configHash:n,archivedAt:null},{fields:["updatedAt"]});await this.#t.updateConfigById(t,s)}async#o(t){const i=await this.#t.findAllActiveConfigs(),n=new Date().toISOString();for(const s of i)if(!t.has(s.key)){r.verbose(`Archiving removed config "${s.key}"`);try{await this.#t.archiveConfigById(s.id,n)}catch(e){r.error(`Error archiving config item "${s.key}":`,e.message??e)}}}}export{o as ScorecardsConfigService};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SCORECARDS_WORKER_KEY as
|
|
1
|
+
import{SCORECARDS_WORKER_KEY as u,scorecardsWorker as f}from"../../../workers/scorecards-worker-pool.js";import{logger as e}from"../../../tools/notifiers/logger.js";const o=5;async function n(c){const{baseDbDir:s,scorecardsConfig:a,attempt:t}=c;try{const r=await f.exec(u,[{baseDbDir:s,scorecardsConfig:a,pollingIntervalMs:parseInt(process.env.SCORECARDS_POLLING_INTERVAL_MS||"3000",10)}]);if(r.success)return e.info(`${r.message}`),Promise.resolve();e.error(`Execute Scorecards Worker: failed (attempt ${t}/${o}): ${r.error}`)}catch(r){const i=r instanceof Error?r.message:String(r);e.error(`Execute Scorecards Worker: failed (attempt ${t}/${o}): ${i}`)}return t<o?(e.info(`Execute Scorecards Worker: retrying... (attempt ${t+1}/${o})`),n({baseDbDir:s,scorecardsConfig:a,attempt:t+1})):(e.error(`Execute Scorecards Worker: failed. Scorecards Worker could not be started after all ${o} attempts`),Promise.resolve())}async function S(c,s){return e.info("Start Scorecards Worker: executing..."),n({baseDbDir:c,scorecardsConfig:s,attempt:1})}export{S as runScorecardsWorker};
|
|
@@ -1,16 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export type ScorecardsWorkerParams = {
|
|
3
|
-
baseDbDir: string;
|
|
4
|
-
scorecardsConfig: ScorecardsConfig;
|
|
5
|
-
pollingIntervalMs?: number;
|
|
6
|
-
};
|
|
7
|
-
export type ScorecardsWorkerResponse = {
|
|
8
|
-
success: true;
|
|
9
|
-
message: string;
|
|
10
|
-
} | {
|
|
11
|
-
success: false;
|
|
12
|
-
message: string;
|
|
13
|
-
error: string;
|
|
14
|
-
};
|
|
1
|
+
import type { ScorecardsWorkerParams, ScorecardsWorkerResponse } from '../../../types/plugins/scorecards.js';
|
|
15
2
|
export declare function startScorecardsWorker(params: ScorecardsWorkerParams): Promise<ScorecardsWorkerResponse>;
|
|
16
3
|
//# sourceMappingURL=scorecards.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{logger as
|
|
1
|
+
import{logger as o}from"../../../tools/notifiers/logger.js";import{loadEnvVariables as g}from"../../../utils/envs/load-env-variables.js";import{CatalogEntitiesService as S}from"../../../plugins/catalog-entities/database/catalog-entities-service.js";import{ScorecardsConfigService as y}from"../../../plugins/scorecards/database/scorecards-config-service.js";import{transformEntitiesToFilter as v}from"../../../providers/database/pagination/entities-to-filter.js";const m=3e3;let c=null;async function C(i){try{const{baseDbDir:r,scorecardsConfig:t,pollingIntervalMs:a=m}=i;o.verbose(`Start Scorecards Worker: initializing (polling interval ${a}ms)`);const n=await y.getInstance({baseDbDir:r}),d=await S.getInstance({baseDbDir:r});await g(r);const s=p(t);return await E({scorecardsConfig:t,entitiesFilters:s,entitiesService:d,configService:n}),P({pollingIntervalMs:a,scorecardsConfig:t,entitiesFilters:s,entitiesService:d}),{success:!0,message:"Start Scorecards Worker: success"}}catch(r){return c&&(clearInterval(c),c=null),{success:!1,message:"Start Scorecards Worker: failed",error:r instanceof Error?r.message:String(r)}}}function p(i){const r={};for(const t of i)r[t.key]=v(t.entities);return r}async function E(i){const{configService:r,scorecardsConfig:t,entitiesFilters:a,entitiesService:n}=i,d=async s=>{await n.setEntitiesAsOutdated(a[s]),o.verbose(`Update entities as outdated: success (scorecard ${s})`)};try{await r.syncConfig(t,d),o.verbose("Sync scorecard configuration: success")}catch(s){const e=s instanceof Error?s.message:String(s);o.error(`Sync scorecard configuration: failed (${e})`)}}async function P(i){const{scorecardsConfig:r,pollingIntervalMs:t,entitiesFilters:a,entitiesService:n}=i;return c=setInterval(s,t),new Promise(()=>{});async function d(e,l){return await n.updateEntityScorecardsStatus(e.id,"CALCULATING"),await new Promise(u=>{setTimeout(async()=>{u()},1)}),await n.updateEntityScorecardsStatusIfCalculating(e.id,"UP_TO_DATE")?o.verbose(`Process entity scorecard: success (entity ${e.key}, scorecard ${l})`):(await n.updateEntityScorecardsStatus(e.id,"OUTDATED"),o.verbose(`Process entity scorecard: entity updated during calculation (entity ${e.key})`)),Promise.resolve()}async function s(){try{for(const e of r){const l=a[e.key];if(!l){o.warn(`Process scorecard: filter not found (scorecard ${e.key})`);continue}const f=await n.getOutdatedEntities(l);if(f.length===0){o.verbose(`Poll scorecards: no entities found for scorecard ${e.key}`);continue}o.verbose(`Poll scorecards: found ${f.length} entity(ies) for scorecard ${e.key}`),c&&(clearInterval(c),c=null,o.verbose(`Poll scorecards: stopped (processing ${f.length} entity(ies) for scorecard ${e.key})`));for(const u of f)await d(u,e.key)}c||(o.verbose(`Poll scorecards: resumed (interval ${t}ms)`),c=setInterval(s,t))}catch(e){const l=e instanceof Error?e.message:String(e);o.error(`Poll scorecards: failed (${l})`),c||(c=setInterval(s,t))}}}export{C as startScorecardsWorker};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ScorecardsConfig } from '@redocly/config';
|
|
2
|
+
import type { Filter } from '../../../providers/database/pagination/types.js';
|
|
3
|
+
type ScorecardConfig = ScorecardsConfig[number];
|
|
4
|
+
type EntitiesConfig = ScorecardConfig['entities'];
|
|
5
|
+
/**
|
|
6
|
+
* Transforms scorecards entities config (array or `{ operator, conditions }`) into a {@link Filter}
|
|
7
|
+
* used by the pagination layer. Handles AND/OR, nested conditions, and simple field conditions.
|
|
8
|
+
*
|
|
9
|
+
* @param entities - Entities config: array of conditions (AND) or `{ operator: 'and'|'or', conditions }`
|
|
10
|
+
* @returns A filter tree with `op` and `conditions`
|
|
11
|
+
* @throws Error when config is empty array, invalid structure, or unsupported operator
|
|
12
|
+
*/
|
|
13
|
+
export declare function transformEntitiesToFilter(entities: EntitiesConfig): Filter;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=entities-to-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{OPERATORS as n}from"../../../providers/database/pagination/constants.js";import{isNestedCondition as a}from"../../../providers/database/pagination/utils/is-nested-condition.js";import{isSimpleCondition as f}from"../../../providers/database/pagination/utils/is-simple-condition.js";import{transformCondition as s}from"../../../providers/database/pagination/utils/transform-condition.js";function t(o){if(Array.isArray(o)){if(o.length===0)throw new Error("Entities config cannot be an empty array");if(o.length===1){const r=o[0];if(f(r))return{op:n.AND,conditions:[s(r)]};if(a(r))return{op:n.AND,conditions:[t(r)]};throw new Error("Invalid condition structure")}return{op:n.AND,conditions:o.map(r=>{if(f(r))return s(r);if(a(r))return t(r);throw new Error("Invalid condition structure")})}}const{operator:i,conditions:e}=o;if(!["and","or"].includes(i))throw new Error(`Unsupported operator: ${i}`);const p=Array.isArray(e)?e.map(r=>{if(a(r))return t(r);if(f(r))return s(r);throw new Error("Invalid condition structure")}):[t(e)];return{op:i==="and"?n.AND:n.OR,conditions:p}}export{t as transformEntitiesToFilter};
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
export * from './create-cursor.js';
|
|
2
2
|
export * from './decode-cursor.js';
|
|
3
3
|
export * from './is-base-64.js';
|
|
4
|
+
export * from './is-nested-condition.js';
|
|
5
|
+
export * from './is-simple-condition.js';
|
|
6
|
+
export * from './map-operator.js';
|
|
7
|
+
export * from './transform-condition.js';
|
|
4
8
|
export * from './transform-to-camel-case.js';
|
|
5
9
|
export * from './transform-to-snake-case.js';
|
|
6
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export*from"./create-cursor.js";export*from"./decode-cursor.js";export*from"./is-base-64.js";export*from"./transform-to-camel-case.js";export*from"./transform-to-snake-case.js";
|
|
1
|
+
export*from"./create-cursor.js";export*from"./decode-cursor.js";export*from"./is-base-64.js";export*from"./is-nested-condition.js";export*from"./is-simple-condition.js";export*from"./map-operator.js";export*from"./transform-condition.js";export*from"./transform-to-camel-case.js";export*from"./transform-to-snake-case.js";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nested condition shape: has `operator` and `conditions`, no `field`.
|
|
3
|
+
*/
|
|
4
|
+
type NestedCondition = {
|
|
5
|
+
operator: string;
|
|
6
|
+
conditions: unknown;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Type guard: checks if the value is a nested condition (operator + conditions, no field).
|
|
10
|
+
*
|
|
11
|
+
* @param condition - Value to check
|
|
12
|
+
* @returns `true` when condition has `operator` and `conditions` and no `field`; otherwise `false`
|
|
13
|
+
*/
|
|
14
|
+
export declare function isNestedCondition(condition: unknown): condition is NestedCondition;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=is-nested-condition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function r(e){return typeof e=="object"&&e!==null&&"operator"in e&&"conditions"in e&&!("field"in e)}export{r as isNestedCondition};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A simple entity condition from scorecards config: has `field` and `operator`, optional `value`, `match`, `modifier`.
|
|
3
|
+
*/
|
|
4
|
+
export type SimpleEntityCondition = {
|
|
5
|
+
field: string;
|
|
6
|
+
operator: string;
|
|
7
|
+
value?: unknown;
|
|
8
|
+
match?: unknown;
|
|
9
|
+
modifier?: 'not';
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Type guard: checks if the value is a simple entity condition (field + operator shape).
|
|
13
|
+
*
|
|
14
|
+
* @param condition - Value to check
|
|
15
|
+
* @returns `true` when condition has `field` (string) and `operator`; otherwise `false`
|
|
16
|
+
*/
|
|
17
|
+
export declare function isSimpleCondition(condition: unknown): condition is SimpleEntityCondition;
|
|
18
|
+
//# sourceMappingURL=is-simple-condition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function r(e){return typeof e=="object"&&e!==null&&"field"in e&&typeof e.field=="string"&&"operator"in e}export{r as isSimpleCondition};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FilterClause } from '../../../../providers/database/pagination/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Maps a config operator string to the corresponding {@link FilterClause} operator.
|
|
4
|
+
*
|
|
5
|
+
* @param operator - Config operator: `'eq' | 'in' | 'contains' | 'between'`
|
|
6
|
+
* @returns The filter clause operator: `'equal' | 'in' | 'contains' | 'between'`
|
|
7
|
+
* @throws Error when operator is not supported
|
|
8
|
+
*/
|
|
9
|
+
export declare function mapOperator(operator: string): FilterClause['operator'];
|
|
10
|
+
//# sourceMappingURL=map-operator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function n(e){switch(e){case"eq":return"equal";case"in":return"in";case"contains":return"contains";case"between":return"between";default:throw new Error(`Unsupported operator "${e}". Supported operators: eq, in, contains, between`)}}export{n as mapOperator};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FilterClause } from '../../../../providers/database/pagination/types.js';
|
|
2
|
+
import type { SimpleEntityCondition } from './is-simple-condition.js';
|
|
3
|
+
/**
|
|
4
|
+
* Transforms a simple entity condition from scorecards config into a {@link FilterClause}.
|
|
5
|
+
* Handles operator mapping, optional `modifier: 'not'`, and rejects unsupported `match` / array operators.
|
|
6
|
+
*
|
|
7
|
+
* @param cond - Simple entity condition (must pass {@link isSimpleCondition})
|
|
8
|
+
* @returns A filter clause ready for the pagination layer
|
|
9
|
+
* @throws Error when `match` is used or when operator is an array operator (some, every, none)
|
|
10
|
+
*/
|
|
11
|
+
export declare function transformCondition(cond: SimpleEntityCondition): FilterClause;
|
|
12
|
+
//# sourceMappingURL=transform-condition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{mapOperator as n}from"./map-operator.js";function a(e){const r=e;if(r.match)throw["some","every","none"].includes(r.operator)?new Error("Array query operators (some, every, none) are not yet supported in Filter type"):new Error("match property is only supported with array query operators");const t=n(r.operator),o={field:r.field,operator:t,value:r.value};return r.modifier==="not"&&(o.modifier="not"),o}export{a as transformCondition};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ScorecardsConfig } from '@redocly/config';
|
|
2
|
+
import type { Filter } from '../../providers/database/pagination/types.js';
|
|
3
|
+
import type { CatalogEntitiesService } from '../../plugins/catalog-entities/database/catalog-entities-service.js';
|
|
4
|
+
import type { ScorecardsConfigService } from '../../plugins/scorecards/database/scorecards-config-service.js';
|
|
5
|
+
export type ScorecardsWorkerParams = {
|
|
6
|
+
baseDbDir: string;
|
|
7
|
+
scorecardsConfig: ScorecardsConfig;
|
|
8
|
+
pollingIntervalMs?: number;
|
|
9
|
+
};
|
|
10
|
+
export type PollAndProcessEntitiesParams = {
|
|
11
|
+
scorecardsConfig: ScorecardsConfig;
|
|
12
|
+
pollingIntervalMs: number;
|
|
13
|
+
entitiesFilters: Record<string, Filter>;
|
|
14
|
+
entitiesService: CatalogEntitiesService;
|
|
15
|
+
};
|
|
16
|
+
export type SyncConfigAndUpdateEntitiesParams = {
|
|
17
|
+
scorecardsConfig: ScorecardsConfig;
|
|
18
|
+
entitiesFilters: Record<string, Filter>;
|
|
19
|
+
configService: ScorecardsConfigService;
|
|
20
|
+
entitiesService: CatalogEntitiesService;
|
|
21
|
+
};
|
|
22
|
+
export type ScorecardsWorkerResponse = {
|
|
23
|
+
success: true;
|
|
24
|
+
message: string;
|
|
25
|
+
} | {
|
|
26
|
+
success: false;
|
|
27
|
+
message: string;
|
|
28
|
+
error: string;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=scorecards.d.ts.map
|
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getCompleteCatalogConfig as c}from"../../../plugins/catalog-entities/get-complete-catalog-config.js";import{parseAndValidateEntities as E,parseAndValidateEntity as f}from"../../../plugins/catalog-entities/entities/validate-entity.js";import{telemetryTraceStep as g}from"../../../telemetry/helpers/trace-step.js";import{CATALOG_FILTERS_CACHE_NAMESPACE as A,ALLOWED_CATALOG_QUERY_PARAMS as
|
|
1
|
+
import{getCompleteCatalogConfig as c}from"../../../plugins/catalog-entities/get-complete-catalog-config.js";import{parseAndValidateEntities as E,parseAndValidateEntity as f,parseAndValidateEntityUpdate as w}from"../../../plugins/catalog-entities/entities/validate-entity.js";import{telemetryTraceStep as g}from"../../../telemetry/helpers/trace-step.js";import{CATALOG_FILTERS_CACHE_NAMESPACE as A,ALLOWED_CATALOG_QUERY_PARAMS as h}from"../../../constants/plugins/catalog-entities.js";import{CATALOG_ENTITY_ID as u}from"../../../../constants/common.js";import{allowlistObject as p}from"../../../../utils/object/allowlist-object.js";import{isValidIsoDate as b}from"../../../utils/is-valid-iso-date.js";import{CatalogEntitiesService as j}from"../../../plugins/catalog-entities/database/catalog-entities-service.js";import{createPaginationParamsValidator as _}from"../../../providers/database/pagination/schemas.js";import{createEntityRelationDtoFromFileSchema as q}from"../../../plugins/catalog-entities/database/mappers/create-entity-relation-dto-from-file-schema.js";import{CacheService as O}from"../../../persistence/cache/services/cache-service.js";const C=["type","key","title","summary","tags","metadata","metadata.*","git","contact","links","id","source","sourceFile","createdAt","updatedAt"],m=async n=>{await(await O.getInstance({baseDbDir:n})).deleteByNamespace(A)},F=async({catalogEntitiesService:n,ctx:t})=>g("catalog_entities.get_entities",async s=>{const a=t.get("logger");try{const e=t.req.query();s?.setAttribute("queryParams",JSON.stringify(p(e,h)));const d=_(C).parse(e),r=await n.getEntities(d);return s?.setAttribute("entitiesCount",r.items.length),t.json(r)}catch(e){return a.error(e),s?.error(e),t.json({message:"Failed to get entities"},500)}}),v=async({catalogEntitiesService:n,ctx:t})=>g("catalog_entities.get_entity",async s=>{const a=t.req.param(u);if(!a)return s?.error(new Error("Entity id is required")),t.json({message:"Entity id is required"},400);s?.setAttribute("pathParams",JSON.stringify({entityId:a}));const e=await n.getEntityById(a);return e?(s?.setAttribute("entity",JSON.stringify(e)),t.json(e)):(s?.error(new Error("Entity not found")),t.json({message:"Entity not found"},404))}),D=async({catalogEntitiesService:n,ctx:t,catalogConfig:s,serverOutDir:a})=>g("catalog_entities.create_entity",async e=>{const d=t.get("logger");try{const r=await t.req.json();e?.setAttribute("requestBody",JSON.stringify(r));const i=f(r,s),o=await n.createEntity(i),y=i.relations?.map(l=>q(i.key,l));return await n.createEntitiesRelations(y??[]),o?(m(a),e?.setAttribute("entity",JSON.stringify(o)),t.json(o)):(e?.error(new Error("Failed to create entity")),t.json({message:"Failed to create entity"},500))}catch(r){return d.error(r),r instanceof Error&&r.message.includes("validation failed")?(e?.error(new Error(r.message)),t.json({message:r.message},400)):(e?.error(r),t.json({message:"Failed to create entity"},500))}}),P=async({catalogEntitiesService:n,ctx:t,catalogConfig:s,serverOutDir:a})=>g("catalog_entities.bulk_upsert_entities",async e=>{const d=t.get("logger");try{const r=await t.req.json();e?.setAttribute("requestBody",JSON.stringify(r));const i=E(r,s),o=await n.createEntities(i);if(!o.length)return e?.error(new Error("Failed to create entities")),t.json({message:"Failed to create entities"},500);m(a);const y=o.filter(l=>l.status==="ok");return e?.setAttribute("totalSuccess",y.length),e?.setAttribute("totalFailed",o.length-y.length),t.json(o,207)}catch(r){return d.error(r),r instanceof Error&&r.message.includes("validation failed")?(e?.error(new Error(r.message)),t.json({message:r.message},400)):(e?.error(r),t.json({message:"Failed to create entities"},500))}}),T=async({catalogEntitiesService:n,ctx:t,catalogConfig:s,serverOutDir:a})=>g("catalog_entities.update_entity",async e=>{const d=t.get("logger"),r=t.req.param(u);if(!r)return e?.error(new Error("Entity id is required")),t.json({message:"Entity id is required"},400);e?.setAttribute("pathParams",JSON.stringify({entityId:r}));try{const i=await t.req.json();e?.setAttribute("requestBody",JSON.stringify(i));const o=await n.getEntityById(r);if(!o)return e?.error(new Error(`Entity with id: ${r} not found`)),t.json({message:`Entity with id: ${r} not found`},404);const y=w(i,s,i?.type??o.type);if(y.revision&&!b(y.revision))throw new Error("Entity validation failed: 'entity.revision' must be a valid ISO 8601 date-time string");const l=await n.updateEntity(y,o);return l?(m(a),e?.setAttribute("entity",JSON.stringify(l)),t.json(l)):(e?.error(new Error("Failed to update entity")),t.json({message:"Failed to update entity"},500))}catch(i){return d.error(i),i instanceof Error&&i.message.includes("validation failed")?(e?.error(new Error(i.message)),t.json({message:i.message},400)):(e?.error(i),t.json({message:i.message},500))}}),N=async({catalogEntitiesService:n,ctx:t,serverOutDir:s})=>g("catalog_entities.delete_entity",async a=>{const e=t.req.param(u);return e?(a?.setAttribute("pathParams",JSON.stringify({entityId:e})),await n.deleteEntity(e),m(s),new Response(null,{status:204})):(a?.error(new Error("Entity id is required")),t.json({message:"Entity id is required"},400))}),I={GET:F,POST:D,PUT:P},J={GET:v,DELETE:N,PATCH:T};function Q(n){return async t=>g("catalog_entities",async s=>{const a=await j.getInstance({baseDbDir:n.serverOutDir}),e=t.req.method;s?.setAttribute("method",e);const d=t.req.param(u)?J:I,r=c(n.config.entitiesCatalog),i=d[e];return i?await i({catalogEntitiesService:a,ctx:t,catalogConfig:r,serverOutDir:n.serverOutDir}):(s?.error(new Error("Method not allowed")),t.json({message:"Method not allowed"},405))})}export{Q as catalogHandler};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ApiRoutesWorkerParams, ApiRoutesWorkerResponse } from '../types/plugins/api-routes.js';
|
|
2
2
|
import type { RenderPayload } from '../../types/ssr.js';
|
|
3
|
-
import type { ScorecardsWorkerParams, ScorecardsWorkerResponse } from '../plugins/scorecards
|
|
3
|
+
import type { ScorecardsWorkerParams, ScorecardsWorkerResponse } from '../types/plugins/scorecards.js';
|
|
4
4
|
import type { McpToolWorkerParams, McpToolWorkerResponse } from '../plugins/mcp/types.js';
|
|
5
5
|
import type { SCORECARDS_WORKER_KEY } from './scorecards-worker-pool.js';
|
|
6
6
|
import type { API_ROUTES_WORKER_KEY } from './api-routes-worker-pool.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@redocly/revel-reef",
|
|
3
|
-
"version": "0.130.0-next.
|
|
3
|
+
"version": "0.130.0-next.8",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -23,16 +23,13 @@
|
|
|
23
23
|
"@opentelemetry/core": "2.0.1",
|
|
24
24
|
"@opentelemetry/exporter-trace-otlp-http": "0.202.0",
|
|
25
25
|
"@opentelemetry/instrumentation": "0.202.0",
|
|
26
|
-
"@opentelemetry/instrumentation-document-load": "0.47.0",
|
|
27
|
-
"@opentelemetry/instrumentation-fetch": "0.202.0",
|
|
28
26
|
"@opentelemetry/instrumentation-http": "0.202.0",
|
|
29
|
-
"@opentelemetry/instrumentation-xml-http-request": "0.202.0",
|
|
30
27
|
"@opentelemetry/resources": "2.0.1",
|
|
31
28
|
"@opentelemetry/sdk-trace-node": "2.0.1",
|
|
32
29
|
"@opentelemetry/sdk-trace-web": "2.0.1",
|
|
33
30
|
"@opentelemetry/semantic-conventions": "1.34.0",
|
|
34
31
|
"@redocly/ajv": "8.17.2",
|
|
35
|
-
"@redocly/openapi-core": "0.0.0-snapshot.
|
|
32
|
+
"@redocly/openapi-core": "0.0.0-snapshot.1769511679",
|
|
36
33
|
"@shikijs/transformers": "3.21.0",
|
|
37
34
|
"@tanstack/react-query": "5.62.3",
|
|
38
35
|
"@tanstack/react-table": "8.21.3",
|
|
@@ -71,10 +68,10 @@
|
|
|
71
68
|
"os-browserify": "0.3.0",
|
|
72
69
|
"path-browserify": "1.0.1",
|
|
73
70
|
"picomatch": "2.3.1",
|
|
74
|
-
"react": "19.2.
|
|
71
|
+
"react": "19.2.4",
|
|
75
72
|
"react-calendar": "5.1.0",
|
|
76
73
|
"react-date-picker": "11.0.0",
|
|
77
|
-
"react-dom": "19.2.
|
|
74
|
+
"react-dom": "19.2.4",
|
|
78
75
|
"react-router-dom": "^6.21.1",
|
|
79
76
|
"react-select": "5.10.1",
|
|
80
77
|
"reactjs-popup": "2.0.6",
|
|
@@ -93,18 +90,18 @@
|
|
|
93
90
|
"xml-crypto": "6.0.1",
|
|
94
91
|
"xpath": "0.0.34",
|
|
95
92
|
"yaml-ast-parser": "0.0.43",
|
|
96
|
-
"@redocly/asyncapi-docs": "1.7.0-next.
|
|
97
|
-
"@redocly/config": "0.41.
|
|
93
|
+
"@redocly/asyncapi-docs": "1.7.0-next.7",
|
|
94
|
+
"@redocly/config": "0.41.4",
|
|
98
95
|
"@redocly/graphql-docs": "1.7.0-next.0",
|
|
99
|
-
"@redocly/openapi-docs": "3.18.0-next.
|
|
96
|
+
"@redocly/openapi-docs": "3.18.0-next.7",
|
|
100
97
|
"@redocly/portal-legacy-ui": "0.13.0-next.0",
|
|
101
|
-
"@redocly/portal-plugin-mock-server": "0.15.0-next.
|
|
98
|
+
"@redocly/portal-plugin-mock-server": "0.15.0-next.7",
|
|
102
99
|
"@redocly/realm-asyncapi-sdk": "0.8.0-next.1",
|
|
103
|
-
"@redocly/theme": "0.62.0-next.
|
|
100
|
+
"@redocly/theme": "0.62.0-next.5"
|
|
104
101
|
},
|
|
105
102
|
"peerDependencies": {
|
|
106
|
-
"react": "19.2.
|
|
107
|
-
"react-dom": "19.2.
|
|
103
|
+
"react": "19.2.4",
|
|
104
|
+
"react-dom": "19.2.4"
|
|
108
105
|
},
|
|
109
106
|
"nx": {
|
|
110
107
|
"implicitDependencies": [
|