@x12i/catalox-authix-bridge 5.9.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.
@@ -0,0 +1,13 @@
1
+ export declare const CATALOX_FEATURES: {
2
+ readonly discoveryRead: "catalox.discovery.read";
3
+ readonly catalogRead: "catalox.catalog.read";
4
+ readonly catalogWrite: "catalox.catalog.write";
5
+ readonly catalogAdmin: "catalox.catalog.admin";
6
+ readonly itemRead: "catalox.item.read";
7
+ readonly itemWrite: "catalox.item.write";
8
+ readonly itemSearch: "catalox.item.search";
9
+ readonly operatorRead: "catalox.operator.read";
10
+ readonly operatorSuper: "catalox.operator.super";
11
+ };
12
+ export type CataloxFeatureId = (typeof CATALOX_FEATURES)[keyof typeof CATALOX_FEATURES];
13
+ //# sourceMappingURL=features.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../src/features.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB;;;;;;;;;;CAUnB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ export const CATALOX_FEATURES = {
2
+ discoveryRead: "catalox.discovery.read",
3
+ catalogRead: "catalox.catalog.read",
4
+ catalogWrite: "catalox.catalog.write",
5
+ catalogAdmin: "catalox.catalog.admin",
6
+ itemRead: "catalox.item.read",
7
+ itemWrite: "catalox.item.write",
8
+ itemSearch: "catalox.item.search",
9
+ operatorRead: "catalox.operator.read",
10
+ operatorSuper: "catalox.operator.super",
11
+ };
12
+ //# sourceMappingURL=features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../src/features.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,aAAa,EAAE,wBAAwB;IACvC,WAAW,EAAE,sBAAsB;IACnC,YAAY,EAAE,uBAAuB;IACrC,YAAY,EAAE,uBAAuB;IACrC,QAAQ,EAAE,mBAAmB;IAC7B,SAAS,EAAE,oBAAoB;IAC/B,UAAU,EAAE,qBAAqB;IACjC,YAAY,EAAE,uBAAuB;IACrC,aAAa,EAAE,wBAAwB;CAC/B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { CATALOX_FEATURES, type CataloxFeatureId } from "./features.js";
2
+ export { mapAuthixToCataloxContext } from "./map-authix-to-catalox-context.js";
3
+ export { requireCataloxFeature, hasCataloxFeature, CataloxFeatureDeniedError, } from "./require-catalox-feature.js";
4
+ export { narrowScopeFromQuery } from "./narrow-scope-from-query.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { CATALOX_FEATURES } from "./features.js";
2
+ export { mapAuthixToCataloxContext } from "./map-authix-to-catalox-context.js";
3
+ export { requireCataloxFeature, hasCataloxFeature, CataloxFeatureDeniedError, } from "./require-catalox-feature.js";
4
+ export { narrowScopeFromQuery } from "./narrow-scope-from-query.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAyB,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { AuthixTokenPayload } from "@x12i/authix-types";
2
+ import type { CataloxContext } from "@x12i/catalox-contracts/context.js";
3
+ export declare function mapAuthixToCataloxContext(payload: AuthixTokenPayload): CataloxContext;
4
+ //# sourceMappingURL=map-authix-to-catalox-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-authix-to-catalox-context.d.ts","sourceRoot":"","sources":["../src/map-authix-to-catalox-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAuBzE,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,kBAAkB,GAAG,cAAc,CAkCrF"}
@@ -0,0 +1,56 @@
1
+ import { CATALOX_FEATURES } from "./features.js";
2
+ function hasFeature(payload, featureId) {
3
+ return payload.features?.some((f) => f.featureId === featureId && f.enabled) ?? false;
4
+ }
5
+ function mapScope(scope) {
6
+ if (!scope)
7
+ return undefined;
8
+ const out = {};
9
+ if (scope.accountIds?.length)
10
+ out.accountIds = [...scope.accountIds];
11
+ if (scope.domainIds?.length)
12
+ out.domainIds = [...scope.domainIds];
13
+ if (scope.organizationIds?.length)
14
+ out.organizationIds = [...scope.organizationIds];
15
+ if (scope.workspaceIds?.length)
16
+ out.workspaceIds = [...scope.workspaceIds];
17
+ if (scope.custom && typeof scope.custom === "object") {
18
+ Object.assign(out, scope.custom);
19
+ }
20
+ return Object.keys(out).length ? out : undefined;
21
+ }
22
+ export function mapAuthixToCataloxContext(payload) {
23
+ const meta = payload.metadata?.catalox;
24
+ const scope = mapScope(payload.scope);
25
+ const subject = payload.subject;
26
+ const context = {
27
+ appId: payload.appId,
28
+ actor: {
29
+ type: subject.identityType === "user" ? "user" : subject.identityType === "service" ? "service" : "system",
30
+ id: subject.identityId,
31
+ },
32
+ };
33
+ if (scope)
34
+ context.scope = scope;
35
+ if (subject.identityType === "user")
36
+ context.userId = subject.identityId;
37
+ const accountId = scope?.accountIds?.[0];
38
+ const groupId = scope?.organizationIds?.[0];
39
+ const channelId = scope?.workspaceIds?.[0];
40
+ if (accountId)
41
+ context.accountId = accountId;
42
+ if (groupId)
43
+ context.groupId = groupId;
44
+ if (channelId)
45
+ context.channelId = channelId;
46
+ const rawStoreId = meta?.storeId;
47
+ if (typeof rawStoreId === "string") {
48
+ context.storeId = rawStoreId;
49
+ }
50
+ if (hasFeature(payload, CATALOX_FEATURES.operatorSuper) &&
51
+ subject.identityType === "service") {
52
+ context.superAdmin = true;
53
+ }
54
+ return context;
55
+ }
56
+ //# sourceMappingURL=map-authix-to-catalox-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-authix-to-catalox-context.js","sourceRoot":"","sources":["../src/map-authix-to-catalox-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CatalogItemScope } from "@x12i/catalox-contracts/items.js";
2
+ export declare function narrowScopeFromQuery(tokenScope: CatalogItemScope | undefined, queryScope: CatalogItemScope | undefined): CatalogItemScope | undefined;
3
+ //# sourceMappingURL=narrow-scope-from-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narrow-scope-from-query.d.ts","sourceRoot":"","sources":["../src/narrow-scope-from-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAUzE,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,gBAAgB,GAAG,SAAS,EACxC,UAAU,EAAE,gBAAgB,GAAG,SAAS,GACvC,gBAAgB,GAAG,SAAS,CAuB9B"}
@@ -0,0 +1,37 @@
1
+ function intersectStringArrays(token, query) {
2
+ if (!query?.length)
3
+ return token?.length ? [...token] : undefined;
4
+ if (!token?.length)
5
+ return [...query];
6
+ const allowed = new Set(token);
7
+ const narrowed = query.filter((v) => allowed.has(v));
8
+ return narrowed.length ? narrowed : [];
9
+ }
10
+ export function narrowScopeFromQuery(tokenScope, queryScope) {
11
+ if (!queryScope)
12
+ return tokenScope;
13
+ if (!tokenScope)
14
+ return queryScope;
15
+ const out = { ...tokenScope };
16
+ for (const key of Object.keys(queryScope)) {
17
+ const q = queryScope[key];
18
+ if (q == null)
19
+ continue;
20
+ if (Array.isArray(q)) {
21
+ const t = tokenScope[key];
22
+ if (Array.isArray(t)) {
23
+ const narrowed = intersectStringArrays(t, q);
24
+ if (narrowed !== undefined)
25
+ out[key] = narrowed;
26
+ }
27
+ else {
28
+ out[key] = [...q];
29
+ }
30
+ }
31
+ else if (typeof q === "object") {
32
+ out[key] = q;
33
+ }
34
+ }
35
+ return out;
36
+ }
37
+ //# sourceMappingURL=narrow-scope-from-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narrow-scope-from-query.js","sourceRoot":"","sources":["../src/narrow-scope-from-query.ts"],"names":[],"mappings":"AAEA,SAAS,qBAAqB,CAAC,KAAgB,EAAE,KAAgB;IAC/D,IAAI,CAAC,KAAK,EAAE,MAAM;QAAE,OAAO,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,IAAI,CAAC,KAAK,EAAE,MAAM;QAAE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,UAAwC,EACxC,UAAwC;IAExC,IAAI,CAAC,UAAU;QAAE,OAAO,UAAU,CAAC;IACnC,IAAI,CAAC,UAAU;QAAE,OAAO,UAAU,CAAC;IAEnC,MAAM,GAAG,GAAqB,EAAE,GAAG,UAAU,EAAE,CAAC;IAEhD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAI,UAAsC,CAAC,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,IAAI;YAAE,SAAS;QACxB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,GAAI,UAAsC,CAAC,GAAG,CAAC,CAAC;YACvD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,CAAa,EAAE,CAAa,CAAC,CAAC;gBACrE,IAAI,QAAQ,KAAK,SAAS;oBAAG,GAA+B,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACL,GAA+B,CAAC,GAAG,CAAC,GAAG,CAAC,GAAI,CAAc,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChC,GAA+B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { AuthixTokenPayload } from "@x12i/authix-types";
2
+ import type { CataloxFeatureId } from "./features.js";
3
+ export declare class CataloxFeatureDeniedError extends Error {
4
+ readonly featureId: string;
5
+ constructor(featureId: string);
6
+ }
7
+ export declare function requireCataloxFeature(payload: AuthixTokenPayload, featureId: CataloxFeatureId): void;
8
+ export declare function hasCataloxFeature(payload: AuthixTokenPayload, featureId: CataloxFeatureId): boolean;
9
+ //# sourceMappingURL=require-catalox-feature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-catalox-feature.d.ts","sourceRoot":"","sources":["../src/require-catalox-feature.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBACf,SAAS,EAAE,MAAM;CAK9B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAGpG;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAEnG"}
@@ -0,0 +1,17 @@
1
+ export class CataloxFeatureDeniedError extends Error {
2
+ featureId;
3
+ constructor(featureId) {
4
+ super(`Missing required Catalox feature: ${featureId}`);
5
+ this.name = "CataloxFeatureDeniedError";
6
+ this.featureId = featureId;
7
+ }
8
+ }
9
+ export function requireCataloxFeature(payload, featureId) {
10
+ const ok = payload.features?.some((f) => f.featureId === featureId && f.enabled);
11
+ if (!ok)
12
+ throw new CataloxFeatureDeniedError(featureId);
13
+ }
14
+ export function hasCataloxFeature(payload, featureId) {
15
+ return payload.features?.some((f) => f.featureId === featureId && f.enabled) ?? false;
16
+ }
17
+ //# sourceMappingURL=require-catalox-feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-catalox-feature.js","sourceRoot":"","sources":["../src/require-catalox-feature.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACzC,SAAS,CAAS;IAC3B,YAAY,SAAiB;QAC3B,KAAK,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,qBAAqB,CAAC,OAA2B,EAAE,SAA2B;IAC5F,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;IACjF,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,yBAAyB,CAAC,SAAS,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAA2B,EAAE,SAA2B;IACxF,OAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;AACxF,CAAC"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@x12i/catalox-authix-bridge",
3
+ "version": "5.9.8",
4
+ "description": "Map Authix tokens to CataloxContext",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ }
12
+ },
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "files": ["dist"],
16
+ "scripts": {
17
+ "build": "tsc -p tsconfig.json",
18
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
19
+ "test": "node --import tsx --test \"test/**/*.test.ts\""
20
+ },
21
+ "dependencies": {
22
+ "@x12i/authix-types": "^1.0.2",
23
+ "@x12i/catalox-contracts": "5.9.8"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^22.0.0",
27
+ "tsx": "^4.0.0",
28
+ "typescript": "^5.0.0"
29
+ }
30
+ }