@redocly/revel-reef 0.130.0-next.2 → 0.130.0-next.3
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 +25 -0
- package/dist/cli/eject/resolveEjectParams.js +1 -1
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +2 -2
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.d.ts +8 -0
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.js +1 -0
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.d.ts +2 -2
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +14 -14
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +2 -2
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +2 -2
- 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 +2 -1
- 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/local/catalog-entities-relations-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +4 -3
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
- package/dist/server/plugins/catalog-entities/plugin.js +1 -1
- package/dist/server/plugins/catalog-entities/schemas/database-schemas.d.ts +3 -0
- package/dist/server/plugins/catalog-entities/schemas/database-schemas.js +1 -1
- package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +12 -0
- package/dist/server/plugins/catalog-entities/schemas/dto-schemas.js +1 -1
- package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +1 -0
- package/dist/server/plugins/catalog-entities/types/extractors.d.ts +4 -4
- package/dist/server/plugins/config-parser/loaders/content-slugs-loader.js +1 -1
- package/dist/server/plugins/default-theme/index.js +1 -1
- package/dist/server/plugins/search/ai-indexer/prepare-ai-search-documents.js +1 -1
- package/dist/server/plugins/search/documents/search-documents.js +1 -1
- package/dist/server/plugins/sso/index.js +1 -1
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/0006_add-catalog-entitities-attributes-table.sql +11 -0
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0006_snapshot.json +458 -0
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/_journal.json +7 -0
- package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.d.ts +143 -0
- package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js +1 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/0008_add-catalog-entitities-attributes-table.sql +11 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0008_snapshot.json +898 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/_journal.json +7 -0
- package/dist/server/utils/rbac.d.ts +11 -7
- package/dist/server/utils/rbac.js +1 -1
- package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
- package/package.json +5 -5
|
@@ -57,6 +57,13 @@
|
|
|
57
57
|
"when": 1768307646039,
|
|
58
58
|
"tag": "0007_catalog-relations-constraint-fix",
|
|
59
59
|
"breakpoints": true
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"idx": 8,
|
|
63
|
+
"version": "6",
|
|
64
|
+
"when": 1768558795586,
|
|
65
|
+
"tag": "0008_add-catalog-entitities-attributes-table",
|
|
66
|
+
"breakpoints": true
|
|
60
67
|
}
|
|
61
68
|
]
|
|
62
69
|
}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import '../node-crypto-polyfill.js';
|
|
2
2
|
import { REDOCLY_TEAMS_RBAC, REDOCLY_ROUTE_RBAC } from '@redocly/config';
|
|
3
|
-
import type {
|
|
4
|
-
import type { AuthDetails
|
|
3
|
+
import type { RbacConfig, RbacScopeItems, RedoclyConfig, SsoConfig } from '@redocly/config';
|
|
4
|
+
import type { AuthDetails } from '../types';
|
|
5
5
|
import type { ContentFs } from '../fs/content-fs.js';
|
|
6
6
|
import type { RbacFeatures } from '../../constants/common.js';
|
|
7
7
|
export type ProjectRole = 'NONE' | 'READ' | 'TRIAGE' | 'WRITE' | 'MAINTAIN' | 'ADMIN';
|
|
8
8
|
export declare const PROJECT_ROLES_ORDERED_BY_ACCESS_LEVEL: string[];
|
|
9
9
|
export declare function getHigherRole(a: ProjectRole, b: ProjectRole): ProjectRole;
|
|
10
|
-
export declare function
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
export declare function getScopeItemsForResource(rbacConfig: RbacConfig | undefined, resource: {
|
|
11
|
+
fsPath?: string;
|
|
12
|
+
slug?: string;
|
|
13
|
+
}): RbacScopeItems;
|
|
13
14
|
export declare function canAccessFeature(feature: RbacFeatures, auth: AuthDetails, rbacConfig?: RbacConfig, requiresLogin?: boolean): boolean;
|
|
14
15
|
export declare function isResourcePubliclyAccessible(resource: {
|
|
15
16
|
slug: string;
|
|
@@ -84,7 +85,10 @@ export declare const normalizeRbacConfig: (rbacConfig: RbacConfig) => {
|
|
|
84
85
|
} | undefined;
|
|
85
86
|
} | undefined;
|
|
86
87
|
};
|
|
87
|
-
export declare function
|
|
88
|
-
|
|
88
|
+
export declare function getRbacTeamsListForResource(resource: {
|
|
89
|
+
fsPath?: string;
|
|
90
|
+
slug?: string;
|
|
91
|
+
}, rbacConfig: RbacConfig): string[];
|
|
92
|
+
export declare function extractTeamsFromScopeItems(scopeItems: RbacScopeItems | undefined): string[];
|
|
89
93
|
export declare function expandTeamsForRead(rbacConfig: RbacConfig, teamNames: string[]): string[];
|
|
90
94
|
//# sourceMappingURL=rbac.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import h from"path";import O from"picomatch";import"../node-crypto-polyfill.js";import{REDOCLY_TEAMS_RBAC as D,REDOCLY_ROUTE_RBAC as R}from"@redocly/config";import{DEFAULT_ANONYMOUS_VISITOR_TEAM as P,ServerRoutes as j,PUBLIC_RBAC_SCOPE_ITEM as A,RBAC_ALL_OTHER_TEAMS as u,DEFAULT_RBAC_SCOPE as _}from"../../constants/common.js";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as L,PUBLIC_API_DEFINITIONS_FOLDER as g,PUBLIC_ASSETS_FOLDER as F}from"../constants/common.js";import{removeTrailingSlash as w}from"../../utils/url/remove-trailing-slash.js";import{parsePathVersions as N}from"../../utils/path/parse-path-versions.js";import{reporter as B}from"../tools/notifiers/reporter.js";import{bold as k}from"../tools/notifiers/helpers/colors.js";import{shaDirPathShort as W}from"../utils/crypto/sha-dir-path-short.js";import{isTruthy as U}from"../../utils/guards/is-truthy.js";import{canExpandConfig as b,expandRbacConfig as M,getTeamFolderDefaults as $,parseTeamFoldersTemplate as v,parseTeamNameTemplate as Y}from"./rbac-expand.js";import{getUserParamsFromCookies as z}from"../web-server/auth.js";import{getDeeperGlobPattern as H}from"./globs.js";import{EntitlementsProvider as G}from"../entitlements/entitlements-provider.js";const S=["NONE","READ","TRIAGE","WRITE","MAINTAIN","ADMIN"],K=new Set(["x-parsed-md-description","x-parsed-md-summary"]);function dt(t,e){const n=S.indexOf(t.toUpperCase()),r=S.indexOf(e.toUpperCase());return n>r?t:e}const I={};function y(t,e){if(!t?.content)return A;const n=t.content,{slug:r,fsPath:o}=e;if(!r&&!o)return A;const s=f=>{const m=I[f]||O(f);return I[f]=m,!!(r&&m(r))||!!(o&&m(o))};if(V(r||o||"")&&Object.keys(n).filter(T=>s(T)).length===0)return n[_]||A;const c=Object.keys(n).filter(f=>s(f));if(c.length==0)return A;const l=c.map(f=>O.scan(f,{tokens:!0,parts:!0}));let p=l[0];for(let f=1;f<l.length;f++)p=H(p,l[f]);return n[p.input]}function ht(t,e,n={},r=!1){if(r&&Object.keys(n).length===0)return e.isAuthenticated;const o=n.features?.[t];return o?e.teams.some(s=>o[s]&&o[s].toLowerCase()!=="none"):!0}function Rt(t,e){return E(t,{isAuthenticated:!1,teams:[P]},e.rbac||{},e.requiresLogin||!1)}function E(t,e={},n={},r=!1){if(t.slug&&typeof t.slug=="string"&&Object.values(j).some(c=>{const l=c.split(":")[0].replace(/\/$/,"");return t.slug===l||t.slug?.startsWith(c)})||typeof t.slug=="string"&&t.slug?.endsWith("/mcp")&&G.instance().canAccessFeature("mcp"))return!0;if(r&&Object.keys(n).length===0)return!!e.isAuthenticated;const o=M(n,e.teams||[]),s=t[D]||y(o,t[R]||{});if(Object.keys(s||{}).length===0)return!1;if(Object.keys(s).length===1&&s[u]&&s[u].toLowerCase()!=="none")return!0;const i=(e?.email?[...e?.teams||[],e?.email]:e?.teams)||[],a=[];for(const c of i??[])s[c]?a.push(s[c]):s[u]&&c!==e?.email&&a.push(s[u]);return a.length?a.some(c=>c.toLowerCase()!=="none"):!1}function At(t,e,n,r){if(!t.startsWith(g)&&!t.startsWith(L))return!0;const o=t.replace(new RegExp(`^${g}/`),"").replace(new RegExp(`^${L}/`),""),i=o==="."?"":o,a={[R]:{slug:t,fsPath:i},slug:t};return E(a,r,e,n)}function yt(t,e,n,r,o){if(!t.startsWith(F))return!0;const s=t.match(/.*\..{64}\.([A-Fa-f0-9]{8})\.[^\.]+$/)?.[1];if(!s)return!0;const i=r[s];if(!i)return!0;const{base:a,ext:c}=h.parse(t),l=a.split(".")[0],p=c.split(".").join(""),m=i==="."?"":i,T={[R]:{slug:t,fsPath:h.posix.join(m,`${l}.${p}`)},slug:t};return E(T,o,e,n)}async function Et(t,e){const{isAuthenticated:n=!1,idpAccessToken:r,federatedAccessToken:o,federatedIdToken:s,...i}=await z(t,e),{teams:a=[]}=i;let c;return n?c=a.filter(l=>l!==P):c=[P],{isAuthenticated:n,idpAccessToken:r,teams:c,claims:i}}function C(t,e,n={},r=!1){if(!t)return t;if(Array.isArray(t)){const o=[];for(const s of t){const i=C(s,e,n,r);i!==void 0&&o.push(i)}return o}if(typeof t=="object"){if(!E(t,e,n,r))return;let o=!1;const s={};for(const i in t){if(i===D||i===R)continue;if(K.has(i)){s[i]=t[i];continue}const a=C(t[i],e,n,r);if(i==="items"&&Array.isArray(a)&&a.length===0&&t[i].length!==0){o=!0;continue}a!==void 0&&(s[i]=a)}return o?void 0:s}return t}function Tt(t){return typeof t=="string"?t.split(" ").filter(Boolean):Array.isArray(t)?t.map(e=>e.toString()):[]}function Pt(t,e){if(!e)return;const n=e.content;if(!n)return e;const r=Object.entries(n).flatMap(([s,i])=>s===_?[[s,i]]:[[s,i],...t.localeFolders.map(a=>[s.startsWith("/")?`/${a.toLocaleLowerCase()}${s}`:h.posix.join(t.localizationFolder,a,s),i])]),o=Object.fromEntries(r);return{...e,content:o}}async function xt(t,e){if(!e)return{};const n={},r=new Set((await t.scan()).flatMap(({relativePath:o})=>{const{versionFolderPath:s}=N(o)||{},i=h.dirname(o);return s?[s,i]:i}));for(const o of r)n[W(o)]=o;return n}const d=t=>typeof t=="object"&&t!==null&&!Array.isArray(t);function V(t){return t?t.split("/").filter(Boolean).some(n=>n.startsWith(".")):!1}const J=t=>{if(t&&d(t)&&("content"in t&&d(t.content)||"reunite"in t&&d(t.reunite)||"features"in t&&d(t.features)||t.teamFolders&&t.teamNamePatterns)){const e=Object.values(t.content||{});if(e.length===0)return!0;if(e.every(d))return e.every(n=>Object.values(n).every(r=>typeof r=="string"))}return!1},Ot=async t=>{if(t){if(Object.keys(t).length===0)return{};if(J(t))return Q(t);await B.panicOnContentError(`You are using an incorrect format of ${k("rbac:")} configuration. See: https://redocly.com/docs/realm/access`)}},Q=t=>{const e={...t};if(e.content){const n={};for(const r in e.content)if(e.content[r]!==void 0){const o=w(r);n[o]=e.content[r]}e.content=n}return e};function Dt(t,e){const n=t.fsPath,r=t.slug,o=[];if(b(e)&&(n||r)){const s=[n,r].filter(U),i=v(e,s);if(i){const a=e?.teamNamePatterns?.map(l=>l.replace("{teamPathSegment}",i.teamPathSegment).replace("{projectRole}","read"))??[];o.push(...a);const c=y({content:{...$(e),...e.content}},t);o.push(...x(c))}else{const a=y(e,t);o.push(...x(a))}}else{const s=y(e,t);o.push(...x(s))}return X(e,o)}function x(t){if(!t)return[];const e=[],n=u in t?{authenticated:t[u],anonymous:t[u]}:{};for(const[r,o]of Object.entries({...n,...t}))o.toLowerCase()!=="none"&&r!==u&&e.push(r);return e}function X(t,e){return e.map(r=>Y(t,r)??{teamName:r}).map(r=>r.projectRole&&r.projectRole!=="READ"?r.teamName?.toLowerCase().replace(r.projectRole?.toLowerCase?.()??"","read")??"":r.teamName?.toLowerCase()??"")}export{S as PROJECT_ROLES_ORDERED_BY_ACCESS_LEVEL,Pt as applyL10nToRbacConfig,yt as canAccessAsset,ht as canAccessFeature,E as canAccessResource,At as canDownloadApiDefinition,X as expandTeamsForRead,x as extractTeamsFromScopeItems,C as filterDataByAccessDeep,Et as getAuthDetailsFromCookies,dt as getHigherRole,Dt as getRbacTeamsListForResource,y as getScopeItemsForResource,J as isRbacConfigValid,Rt as isResourcePubliclyAccessible,Q as normalizeRbacConfig,Ot as parseRbacConfig,Tt as parseTeamClaimToArray,xt as resolveDirectoryHashes};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{telemetryTraceStep as
|
|
1
|
+
import{expandTeamsForRead as u}from"../../../utils/rbac.js";import{telemetryTraceStep as y}from"../../../telemetry/helpers/trace-step.js";import{CATALOG_ENTITY_KEY as d}from"../../../../constants/common.js";import{ALLOWED_CATALOG_QUERY_PARAMS as f}from"../../../constants/plugins/catalog-entities.js";import{allowlistObject as c}from"../../../../utils/object/allowlist-object.js";import{CatalogEntitiesService as p}from"../../../plugins/catalog-entities/database/catalog-entities-service.js";import{createPaginationParamsValidator as v}from"../../../providers/database/pagination/schemas.js";import{isValidIsoDate as b}from"../../../utils/is-valid-iso-date.js";import{isValidSanitizedString as E}from"../../../utils/validate-and-sanitize-string.js";const A=["type","key","title","summary","tags","metadata","metadata.*","git","contact","links","id","source","sourceFile","version","revision","createdAt","updatedAt","domains","owners"],q=async({catalogEntitiesService:r,ctx:t,store:n})=>y("catalog_entities.bff.get_entities",async e=>{const i=t.req.query();e?.setAttribute("queryParams",JSON.stringify(c(i,f)));const a=v(A).parse(i),o=u(n.getConfig().rbac||{},t.get("auth").teams),s=await r.getEntitiesWithRelations(a,o);return e?.setAttribute("entitiesCount",s.items.length),t.json(s)}),h=async({catalogEntitiesService:r,ctx:t,store:n})=>y("catalog_entities.bff.get_entity",async e=>{const i=t.req.param(d);if(!i)return e?.error(new Error("Entity key is required")),t.json({message:"Entity key is required"},400);const a=t.req.query("revision");let o=null;if(a){if(!b(a))return e?.error(new Error("Invalid revision parameter")),t.json({message:"Invalid revision parameter: must be a valid ISO 8601 date-time string"},400);o=a}const s=t.req.query("version");if(!E(s,{pattern:/^[a-zA-Z0-9._-]+$/,maxLength:100,allowEmpty:!0}))return e?.error(new Error("Invalid version parameter")),t.json({message:"Invalid version parameter: version must contain only alphanumeric characters, dots, hyphens, and underscores, and must not exceed 100 characters"},400);const g=t.req.query();e?.setAttribute("queryParams",JSON.stringify(g)),e?.setAttribute("pathParams",JSON.stringify({entityKey:i}));const l=u(n.getConfig().rbac||{},t.get("auth").teams),m=await r.getEntityWithRelationsByKey(i,{revision:o,version:s},l);return m?(e?.setAttribute("entity",JSON.stringify(m)),t.json(m)):(e?.error(new Error("Entity not found")),t.json({message:"Entity not found"},404))});function R(r){return async t=>y("catalog_entities.bff",async n=>{n?.setAttribute("method",t.req.method);const e=await p.getInstance({baseDbDir:r.serverOutDir});return t.req.param("entityKey")?h({catalogEntitiesService:e,ctx:t,store:r}):q({catalogEntitiesService:e,ctx:t,store:r})})}export{R as bffCatalogHandler};
|
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.3",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -93,14 +93,14 @@
|
|
|
93
93
|
"xml-crypto": "6.0.1",
|
|
94
94
|
"xpath": "0.0.34",
|
|
95
95
|
"yaml-ast-parser": "0.0.43",
|
|
96
|
-
"@redocly/asyncapi-docs": "1.7.0-next.
|
|
96
|
+
"@redocly/asyncapi-docs": "1.7.0-next.2",
|
|
97
97
|
"@redocly/config": "0.41.2",
|
|
98
98
|
"@redocly/graphql-docs": "1.7.0-next.0",
|
|
99
|
-
"@redocly/openapi-docs": "3.18.0-next.
|
|
99
|
+
"@redocly/openapi-docs": "3.18.0-next.2",
|
|
100
100
|
"@redocly/portal-legacy-ui": "0.13.0-next.0",
|
|
101
|
-
"@redocly/portal-plugin-mock-server": "0.15.0-next.
|
|
101
|
+
"@redocly/portal-plugin-mock-server": "0.15.0-next.2",
|
|
102
102
|
"@redocly/realm-asyncapi-sdk": "0.8.0-next.1",
|
|
103
|
-
"@redocly/theme": "0.62.0-next.
|
|
103
|
+
"@redocly/theme": "0.62.0-next.1"
|
|
104
104
|
},
|
|
105
105
|
"peerDependencies": {
|
|
106
106
|
"react": "19.2.3",
|