@x12i/catalox-api 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.
- package/dist/authix-verify.d.ts +7 -0
- package/dist/authix-verify.d.ts.map +1 -0
- package/dist/authix-verify.js +44 -0
- package/dist/authix-verify.js.map +1 -0
- package/dist/config.d.ts +17 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +28 -0
- package/dist/config.js.map +1 -0
- package/dist/feature-gates.d.ts +5 -0
- package/dist/feature-gates.d.ts.map +1 -0
- package/dist/feature-gates.js +18 -0
- package/dist/feature-gates.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/outcome-to-http.d.ts +9 -0
- package/dist/outcome-to-http.d.ts.map +1 -0
- package/dist/outcome-to-http.js +38 -0
- package/dist/outcome-to-http.js.map +1 -0
- package/dist/resolve-request-context.d.ts +10 -0
- package/dist/resolve-request-context.d.ts.map +1 -0
- package/dist/resolve-request-context.js +49 -0
- package/dist/resolve-request-context.js.map +1 -0
- package/dist/routes/apps.d.ts +5 -0
- package/dist/routes/apps.d.ts.map +1 -0
- package/dist/routes/apps.js +32 -0
- package/dist/routes/apps.js.map +1 -0
- package/dist/routes/health.d.ts +4 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +4 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/items.d.ts +5 -0
- package/dist/routes/items.d.ts.map +1 -0
- package/dist/routes/items.js +127 -0
- package/dist/routes/items.js.map +1 -0
- package/dist/routes/operator.d.ts +5 -0
- package/dist/routes/operator.d.ts.map +1 -0
- package/dist/routes/operator.js +48 -0
- package/dist/routes/operator.js.map +1 -0
- package/dist/routes/search.d.ts +5 -0
- package/dist/routes/search.d.ts.map +1 -0
- package/dist/routes/search.js +23 -0
- package/dist/routes/search.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AuthixTokenPayload } from "@x12i/authix-types";
|
|
2
|
+
import type { CataloxApiConfig } from "./config.js";
|
|
3
|
+
/** Test/staging tokens: `test.<base64url(JSON AuthixTokenPayload)>` */
|
|
4
|
+
export declare function parseTestAuthixToken(token: string): AuthixTokenPayload | null;
|
|
5
|
+
export declare function encodeTestAuthixToken(payload: AuthixTokenPayload): string;
|
|
6
|
+
export declare function verifyAuthixToken(token: string, config: CataloxApiConfig): Promise<AuthixTokenPayload | null>;
|
|
7
|
+
//# sourceMappingURL=authix-verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authix-verify.d.ts","sourceRoot":"","sources":["../src/authix-verify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAS7E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAOzE;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAoBpC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** Test/staging tokens: `test.<base64url(JSON AuthixTokenPayload)>` */
|
|
2
|
+
export function parseTestAuthixToken(token) {
|
|
3
|
+
if (!token.startsWith("test."))
|
|
4
|
+
return null;
|
|
5
|
+
try {
|
|
6
|
+
const b64 = token.slice(5).replace(/-/g, "+").replace(/_/g, "/");
|
|
7
|
+
const json = Buffer.from(b64, "base64").toString("utf8");
|
|
8
|
+
return JSON.parse(json);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function encodeTestAuthixToken(payload) {
|
|
15
|
+
const b64 = Buffer.from(JSON.stringify(payload), "utf8")
|
|
16
|
+
.toString("base64")
|
|
17
|
+
.replace(/\+/g, "-")
|
|
18
|
+
.replace(/\//g, "_")
|
|
19
|
+
.replace(/=+$/, "");
|
|
20
|
+
return `test.${b64}`;
|
|
21
|
+
}
|
|
22
|
+
export async function verifyAuthixToken(token, config) {
|
|
23
|
+
const testPayload = parseTestAuthixToken(token);
|
|
24
|
+
if (testPayload)
|
|
25
|
+
return testPayload;
|
|
26
|
+
const introspectUrl = config.authix?.introspectUrl;
|
|
27
|
+
if (!introspectUrl)
|
|
28
|
+
return null;
|
|
29
|
+
const headers = { "content-type": "application/json" };
|
|
30
|
+
if (config.authix?.apiKey)
|
|
31
|
+
headers.authorization = `Bearer ${config.authix.apiKey}`;
|
|
32
|
+
const res = await fetch(introspectUrl, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers,
|
|
35
|
+
body: JSON.stringify({ token, appId: config.authix?.appId }),
|
|
36
|
+
});
|
|
37
|
+
if (!res.ok)
|
|
38
|
+
return null;
|
|
39
|
+
const body = (await res.json());
|
|
40
|
+
if (!body.active || !body.payload)
|
|
41
|
+
return null;
|
|
42
|
+
return body.payload;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=authix-verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authix-verify.js","sourceRoot":"","sources":["../src/authix-verify.ts"],"names":[],"mappings":"AAIA,uEAAuE;AACvE,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAuB,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAA2B;IAC/D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;SACrD,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtB,OAAO,QAAQ,GAAG,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAa,EACb,MAAwB;IAExB,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IACnD,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAEhC,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC/E,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM;QAAE,OAAO,CAAC,aAAa,GAAG,UAAU,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IAEpF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE;QACrC,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;KAC7D,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuD,CAAC;IACtF,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type CataloxAuthMode = "open" | "authix";
|
|
2
|
+
export type CataloxApiConfig = {
|
|
3
|
+
authMode: CataloxAuthMode;
|
|
4
|
+
version: string;
|
|
5
|
+
defaultSuperAdmin: boolean;
|
|
6
|
+
internalAppId?: string;
|
|
7
|
+
privateMode: boolean;
|
|
8
|
+
authix?: {
|
|
9
|
+
appId: string;
|
|
10
|
+
appSecretKey: string;
|
|
11
|
+
introspectUrl?: string;
|
|
12
|
+
apiKey?: string;
|
|
13
|
+
issuer: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export declare function loadCataloxApiConfig(env?: NodeJS.ProcessEnv): CataloxApiConfig;
|
|
17
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEhD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,gBAAgB,CA4B3F"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export function loadCataloxApiConfig(env = process.env) {
|
|
2
|
+
const authMode = (env.CATALOX_AUTH_MODE ?? "open");
|
|
3
|
+
const config = {
|
|
4
|
+
authMode: authMode === "authix" ? "authix" : "open",
|
|
5
|
+
version: env.CATALOX_VERSION ?? "5.9.7",
|
|
6
|
+
defaultSuperAdmin: env.CATALOX_DEFAULT_SUPER_ADMIN !== "false",
|
|
7
|
+
privateMode: env.CATALOX_PRIVATE_MODE !== "false",
|
|
8
|
+
...(env.CATALOX_INTERNAL_APP_ID?.trim()
|
|
9
|
+
? { internalAppId: env.CATALOX_INTERNAL_APP_ID.trim() }
|
|
10
|
+
: {}),
|
|
11
|
+
};
|
|
12
|
+
if (config.authMode === "authix") {
|
|
13
|
+
const appId = env.AUTHIX_APP_ID?.trim();
|
|
14
|
+
const appSecretKey = env.AUTHIX_APP_SECRET_KEY?.trim();
|
|
15
|
+
if (!appId || !appSecretKey) {
|
|
16
|
+
throw new Error("AUTHIX_APP_ID and AUTHIX_APP_SECRET_KEY are required when CATALOX_AUTH_MODE=authix");
|
|
17
|
+
}
|
|
18
|
+
config.authix = {
|
|
19
|
+
appId,
|
|
20
|
+
appSecretKey,
|
|
21
|
+
issuer: env.AUTHIX_ISSUER?.trim() || "authix",
|
|
22
|
+
...(env.AUTHIX_INTROSPECT_URL?.trim() ? { introspectUrl: env.AUTHIX_INTROSPECT_URL.trim() } : {}),
|
|
23
|
+
...(env.AUTHIX_API_KEY?.trim() ? { apiKey: env.AUTHIX_API_KEY.trim() } : {}),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return config;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,oBAAoB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACvE,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAoB,CAAC;IACtE,MAAM,MAAM,GAAqB;QAC/B,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;QACnD,OAAO,EAAE,GAAG,CAAC,eAAe,IAAI,OAAO;QACvC,iBAAiB,EAAE,GAAG,CAAC,2BAA2B,KAAK,OAAO;QAC9D,WAAW,EAAE,GAAG,CAAC,oBAAoB,KAAK,OAAO;QACjD,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE;YACrC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,uBAAuB,CAAC,IAAI,EAAE,EAAE;YACvD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC;QACvD,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;QACxG,CAAC;QACD,MAAM,CAAC,MAAM,GAAG;YACd,KAAK;YACL,YAAY;YACZ,MAAM,EAAE,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,QAAQ;YAC7C,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjG,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AuthixTokenPayload } from "@x12i/authix-types";
|
|
2
|
+
import { CATALOX_FEATURES } from "@x12i/catalox-authix-bridge";
|
|
3
|
+
import type { CataloxApiConfig } from "./config.js";
|
|
4
|
+
export declare function gateFeature(config: CataloxApiConfig, token: AuthixTokenPayload | undefined, featureId: (typeof CATALOX_FEATURES)[keyof typeof CATALOX_FEATURES]): void;
|
|
5
|
+
//# sourceMappingURL=feature-gates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-gates.d.ts","sourceRoot":"","sources":["../src/feature-gates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EACL,gBAAgB,EAGjB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,wBAAgB,WAAW,CACzB,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,kBAAkB,GAAG,SAAS,EACrC,SAAS,EAAE,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,GAClE,IAAI,CAaN"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CATALOX_FEATURES, requireCataloxFeature, CataloxFeatureDeniedError, } from "@x12i/catalox-authix-bridge";
|
|
2
|
+
export function gateFeature(config, token, featureId) {
|
|
3
|
+
if (config.authMode !== "authix")
|
|
4
|
+
return;
|
|
5
|
+
if (!token) {
|
|
6
|
+
throw Object.assign(new Error("Unauthorized"), { statusCode: 401 });
|
|
7
|
+
}
|
|
8
|
+
try {
|
|
9
|
+
requireCataloxFeature(token, featureId);
|
|
10
|
+
}
|
|
11
|
+
catch (e) {
|
|
12
|
+
if (e instanceof CataloxFeatureDeniedError) {
|
|
13
|
+
throw Object.assign(e, { statusCode: 403 });
|
|
14
|
+
}
|
|
15
|
+
throw e;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=feature-gates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-gates.js","sourceRoot":"","sources":["../src/feature-gates.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,6BAA6B,CAAC;AAIrC,MAAM,UAAU,WAAW,CACzB,MAAwB,EACxB,KAAqC,EACrC,SAAmE;IAEnE,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC;QACH,qBAAqB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,yBAAyB,EAAE,CAAC;YAC3C,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import Fastify, { type FastifyInstance } from "fastify";
|
|
2
|
+
import type { AuthixTokenPayload } from "@x12i/authix-types";
|
|
3
|
+
import type { Catalox } from "@x12i/catalox-engine/embedder";
|
|
4
|
+
import { type CataloxApiConfig } from "./config.js";
|
|
5
|
+
export { loadCataloxApiConfig, type CataloxApiConfig, type CataloxAuthMode } from "./config.js";
|
|
6
|
+
export { resolveRequestContext } from "./resolve-request-context.js";
|
|
7
|
+
export { encodeTestAuthixToken, parseTestAuthixToken } from "./authix-verify.js";
|
|
8
|
+
export { listOutcomeToHttp, getItemOutcomeToHttp } from "./outcome-to-http.js";
|
|
9
|
+
declare module "fastify" {
|
|
10
|
+
interface FastifyRequest {
|
|
11
|
+
authixToken?: AuthixTokenPayload;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export declare function registerCataloxRoutes(app: FastifyInstance, catalox: Catalox, config: CataloxApiConfig): Promise<void>;
|
|
15
|
+
export declare function createCataloxApiApp(catalox: Catalox, config?: CataloxApiConfig): Promise<FastifyInstance>;
|
|
16
|
+
export { Fastify };
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,EAAE,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAG7D,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAO1E,OAAO,EAAE,oBAAoB,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,WAAW,CAAC,EAAE,kBAAkB,CAAC;KAClC;CACF;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAI1B;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import Fastify, {} from "fastify";
|
|
2
|
+
import { verifyAuthixToken } from "./authix-verify.js";
|
|
3
|
+
import { loadCataloxApiConfig } from "./config.js";
|
|
4
|
+
import { registerAppRoutes } from "./routes/apps.js";
|
|
5
|
+
import { registerHealthRoutes } from "./routes/health.js";
|
|
6
|
+
import { registerItemRoutes } from "./routes/items.js";
|
|
7
|
+
import { registerOperatorRoutes } from "./routes/operator.js";
|
|
8
|
+
import { registerSearchRoutes } from "./routes/search.js";
|
|
9
|
+
export { loadCataloxApiConfig } from "./config.js";
|
|
10
|
+
export { resolveRequestContext } from "./resolve-request-context.js";
|
|
11
|
+
export { encodeTestAuthixToken, parseTestAuthixToken } from "./authix-verify.js";
|
|
12
|
+
export { listOutcomeToHttp, getItemOutcomeToHttp } from "./outcome-to-http.js";
|
|
13
|
+
export async function registerCataloxRoutes(app, catalox, config) {
|
|
14
|
+
if (config.authMode === "authix") {
|
|
15
|
+
app.addHook("onRequest", async (req, reply) => {
|
|
16
|
+
if (req.url === "/health" || req.url.startsWith("/health?"))
|
|
17
|
+
return;
|
|
18
|
+
const auth = req.headers.authorization;
|
|
19
|
+
if (!auth?.startsWith("Bearer ")) {
|
|
20
|
+
return reply.status(401).send({ outcome: "error", error: { message: "Unauthorized" } });
|
|
21
|
+
}
|
|
22
|
+
const token = auth.slice("Bearer ".length).trim();
|
|
23
|
+
const payload = await verifyAuthixToken(token, config);
|
|
24
|
+
if (!payload) {
|
|
25
|
+
return reply.status(401).send({ outcome: "error", error: { message: "Invalid token" } });
|
|
26
|
+
}
|
|
27
|
+
req.authixToken = payload;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
if (!config.privateMode) {
|
|
31
|
+
app.log.warn("Catalox API: CATALOX_PRIVATE_MODE is not set — ensure this service is not exposed publicly without authix mode");
|
|
32
|
+
}
|
|
33
|
+
await registerHealthRoutes(app, config);
|
|
34
|
+
await registerAppRoutes(app, catalox, config);
|
|
35
|
+
await registerItemRoutes(app, catalox, config);
|
|
36
|
+
await registerSearchRoutes(app, catalox, config);
|
|
37
|
+
await registerOperatorRoutes(app, catalox, config);
|
|
38
|
+
}
|
|
39
|
+
export async function createCataloxApiApp(catalox, config) {
|
|
40
|
+
const app = Fastify({ logger: false });
|
|
41
|
+
await registerCataloxRoutes(app, catalox, config ?? loadCataloxApiConfig());
|
|
42
|
+
return app;
|
|
43
|
+
}
|
|
44
|
+
export { Fastify };
|
|
45
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CataloxOutcome } from "@x12i/catalox-contracts";
|
|
2
|
+
export type OutcomeHttpResult = {
|
|
3
|
+
statusCode: number;
|
|
4
|
+
body: Record<string, unknown>;
|
|
5
|
+
};
|
|
6
|
+
export declare function listOutcomeToHttp(outcome: CataloxOutcome, result?: Record<string, unknown>, error?: Record<string, unknown>): OutcomeHttpResult;
|
|
7
|
+
export declare function getItemOutcomeToHttp(outcome: CataloxOutcome, payload?: Record<string, unknown>): OutcomeHttpResult;
|
|
8
|
+
export declare function getItemByFieldOutcomeToHttp(outcome: CataloxOutcome | "ambiguous" | "field_not_queryable", payload?: Record<string, unknown>): OutcomeHttpResult;
|
|
9
|
+
//# sourceMappingURL=outcome-to-http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome-to-http.d.ts","sourceRoot":"","sources":["../src/outcome-to-http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,iBAAiB,CAcnB;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,iBAAiB,CAEnB;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,cAAc,GAAG,WAAW,GAAG,qBAAqB,EAC7D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,iBAAiB,CAkBnB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function listOutcomeToHttp(outcome, result, error) {
|
|
2
|
+
switch (outcome) {
|
|
3
|
+
case "ok":
|
|
4
|
+
case "empty":
|
|
5
|
+
return { statusCode: 200, body: { outcome, result: result ?? {} } };
|
|
6
|
+
case "denied":
|
|
7
|
+
return { statusCode: 403, body: { outcome, error: error ?? { message: "denied" } } };
|
|
8
|
+
case "misconfigured":
|
|
9
|
+
return { statusCode: 409, body: { outcome, error: error ?? { message: "misconfigured" } } };
|
|
10
|
+
case "mapping_blocked":
|
|
11
|
+
return { statusCode: 422, body: { outcome, error: error ?? { message: "mapping_blocked" } } };
|
|
12
|
+
default:
|
|
13
|
+
return { statusCode: 500, body: { outcome, error: { message: String(outcome) } } };
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function getItemOutcomeToHttp(outcome, payload) {
|
|
17
|
+
return listOutcomeToHttp(outcome, payload);
|
|
18
|
+
}
|
|
19
|
+
export function getItemByFieldOutcomeToHttp(outcome, payload) {
|
|
20
|
+
switch (outcome) {
|
|
21
|
+
case "ok":
|
|
22
|
+
case "empty":
|
|
23
|
+
return { statusCode: 200, body: { outcome, result: payload ?? {} } };
|
|
24
|
+
case "denied":
|
|
25
|
+
return { statusCode: 403, body: { outcome, error: payload?.error ?? { message: "denied" } } };
|
|
26
|
+
case "misconfigured":
|
|
27
|
+
return { statusCode: 409, body: { outcome, error: payload?.error ?? { message: "misconfigured" } } };
|
|
28
|
+
case "mapping_blocked":
|
|
29
|
+
return { statusCode: 422, body: { outcome, error: payload?.error ?? { message: "mapping_blocked" } } };
|
|
30
|
+
case "ambiguous":
|
|
31
|
+
return { statusCode: 409, body: { outcome, result: payload ?? {} } };
|
|
32
|
+
case "field_not_queryable":
|
|
33
|
+
return { statusCode: 422, body: { outcome, result: payload ?? {} } };
|
|
34
|
+
default:
|
|
35
|
+
return { statusCode: 500, body: { outcome, error: { message: String(outcome) } } };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=outcome-to-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome-to-http.js","sourceRoot":"","sources":["../src/outcome-to-http.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,iBAAiB,CAC/B,OAAuB,EACvB,MAAgC,EAChC,KAA+B;IAE/B,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC;QACV,KAAK,OAAO;YACV,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,CAAC;QACtE,KAAK,QAAQ;YACX,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACvF,KAAK,eAAe;YAClB,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;QAC9F,KAAK,iBAAiB;YACpB,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;QAChG;YACE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC;IACvF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAAuB,EACvB,OAAiC;IAEjC,OAAO,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,OAA6D,EAC7D,OAAiC;IAEjC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC;QACV,KAAK,OAAO;YACV,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC;QACvE,KAAK,QAAQ;YACX,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAG,OAAe,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACzG,KAAK,eAAe;YAClB,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAG,OAAe,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;QAChH,KAAK,iBAAiB;YACpB,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAG,OAAe,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;QAClH,KAAK,WAAW;YACd,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC;QACvE,KAAK,qBAAqB;YACxB,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC;QACvE;YACE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC;IACvF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AuthixTokenPayload } from "@x12i/authix-types";
|
|
2
|
+
import type { CataloxContext } from "@x12i/catalox-contracts";
|
|
3
|
+
import type { CataloxApiConfig } from "./config.js";
|
|
4
|
+
export type CataloxRequestLike = {
|
|
5
|
+
headers: Record<string, string | string[] | undefined>;
|
|
6
|
+
body?: unknown;
|
|
7
|
+
authixToken?: AuthixTokenPayload;
|
|
8
|
+
};
|
|
9
|
+
export declare function resolveRequestContext(req: CataloxRequestLike, config: CataloxApiConfig): CataloxContext;
|
|
10
|
+
//# sourceMappingURL=resolve-request-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-request-context.d.ts","sourceRoot":"","sources":["../src/resolve-request-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAS,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC,CAAC;AAoBF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,GAAG,cAAc,CAkCvG"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { mapAuthixToCataloxContext } from "@x12i/catalox-authix-bridge";
|
|
2
|
+
function headerJson(req, name) {
|
|
3
|
+
const raw = req.headers[name.toLowerCase()];
|
|
4
|
+
const v = Array.isArray(raw) ? raw[0] : raw;
|
|
5
|
+
if (!v?.trim())
|
|
6
|
+
return undefined;
|
|
7
|
+
try {
|
|
8
|
+
return JSON.parse(v);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function bodyContext(req) {
|
|
15
|
+
const body = req.body;
|
|
16
|
+
if (!body || typeof body !== "object")
|
|
17
|
+
return undefined;
|
|
18
|
+
const ctx = body.context;
|
|
19
|
+
return ctx && typeof ctx === "object" ? ctx : undefined;
|
|
20
|
+
}
|
|
21
|
+
export function resolveRequestContext(req, config) {
|
|
22
|
+
if (config.authMode === "authix") {
|
|
23
|
+
if (!req.authixToken) {
|
|
24
|
+
throw Object.assign(new Error("Missing Authix token"), { statusCode: 401 });
|
|
25
|
+
}
|
|
26
|
+
const headerCtx = headerJson(req, "x-catalox-context");
|
|
27
|
+
if (headerCtx) {
|
|
28
|
+
throw Object.assign(new Error("X-Catalox-Context is not allowed in authix mode"), { statusCode: 400 });
|
|
29
|
+
}
|
|
30
|
+
return mapAuthixToCataloxContext(req.authixToken);
|
|
31
|
+
}
|
|
32
|
+
const fromHeader = headerJson(req, "x-catalox-context");
|
|
33
|
+
const fromBody = bodyContext(req);
|
|
34
|
+
const merged = { ...(fromHeader ?? {}), ...(fromBody ?? {}) };
|
|
35
|
+
if (!merged.appId && config.internalAppId) {
|
|
36
|
+
merged.appId = config.internalAppId;
|
|
37
|
+
}
|
|
38
|
+
if (!merged.appId &&
|
|
39
|
+
!merged.superAdmin &&
|
|
40
|
+
config.defaultSuperAdmin &&
|
|
41
|
+
Object.keys(merged).length === 0) {
|
|
42
|
+
return { superAdmin: true, ...(config.internalAppId ? { appId: config.internalAppId } : {}) };
|
|
43
|
+
}
|
|
44
|
+
if (config.defaultSuperAdmin && merged.superAdmin === undefined && !fromHeader && !fromBody) {
|
|
45
|
+
merged.superAdmin = true;
|
|
46
|
+
}
|
|
47
|
+
return merged;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=resolve-request-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-request-context.js","sourceRoot":"","sources":["../src/resolve-request-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FastifyInstance } from "fastify";
|
|
2
|
+
import type { Catalox } from "@x12i/catalox-engine/embedder";
|
|
3
|
+
import type { CataloxApiConfig } from "../config.js";
|
|
4
|
+
export declare function registerAppRoutes(app: FastifyInstance, catalox: Catalox, config: CataloxApiConfig): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=apps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../src/routes/apps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAI7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIrD,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { CATALOX_FEATURES } from "@x12i/catalox-authix-bridge";
|
|
2
|
+
import { gateFeature } from "../feature-gates.js";
|
|
3
|
+
import { resolveRequestContext } from "../resolve-request-context.js";
|
|
4
|
+
export async function registerAppRoutes(app, catalox, config) {
|
|
5
|
+
app.get("/v1/apps/:appId/catalogs", async (req, reply) => {
|
|
6
|
+
try {
|
|
7
|
+
gateFeature(config, req.authixToken, CATALOX_FEATURES.discoveryRead);
|
|
8
|
+
const context = resolveRequestContext(req, config);
|
|
9
|
+
const appId = req.params.appId;
|
|
10
|
+
const entries = await catalox.listAppCatalogs(context, { appId });
|
|
11
|
+
return reply.send({ outcome: "ok", result: { catalogs: entries } });
|
|
12
|
+
}
|
|
13
|
+
catch (e) {
|
|
14
|
+
const err = e;
|
|
15
|
+
return reply.status(err.statusCode ?? 500).send({ outcome: "error", error: { message: err.message } });
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
app.get("/v1/apps/:appId/bootstrap", async (req, reply) => {
|
|
19
|
+
try {
|
|
20
|
+
gateFeature(config, req.authixToken, CATALOX_FEATURES.discoveryRead);
|
|
21
|
+
const context = resolveRequestContext(req, config);
|
|
22
|
+
const appId = req.params.appId;
|
|
23
|
+
const bootstrap = await catalox.getAppCatalogBootstrap(context, appId);
|
|
24
|
+
return reply.send({ outcome: "ok", result: bootstrap });
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
const err = e;
|
|
28
|
+
return reply.status(err.statusCode ?? 500).send({ outcome: "error", error: { message: err.message } });
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=apps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apps.js","sourceRoot":"","sources":["../../src/routes/apps.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAA2B,MAAM,+BAA+B,CAAC;AAE/F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAoB,EACpB,OAAgB,EAChB,MAAwB;IAExB,GAAG,CAAC,GAAG,CAAgC,0BAA0B,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACtF,IAAI,CAAC;YACH,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAyB,EAAE,MAAM,CAAC,CAAC;YACzE,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAc,CAAC;YACxC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAClE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,CAA8C,CAAC;YAC3D,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACzG,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAgC,2BAA2B,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACvF,IAAI,CAAC;YACH,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAyB,EAAE,MAAM,CAAC,CAAC;YACzE,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAc,CAAC;YACxC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACvE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,CAA8C,CAAC;YAC3D,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACzG,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAExG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAoB,EAAE,MAAwB;IACvF,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FastifyInstance } from "fastify";
|
|
2
|
+
import type { Catalox } from "@x12i/catalox-engine/embedder";
|
|
3
|
+
import type { CataloxApiConfig } from "../config.js";
|
|
4
|
+
export declare function registerItemRoutes(app: FastifyInstance, catalox: Catalox, config: CataloxApiConfig): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=items.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../../src/routes/items.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAI7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAKrD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,IAAI,CAAC,CA2If"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { CATALOX_FEATURES } from "@x12i/catalox-authix-bridge";
|
|
2
|
+
import { gateFeature } from "../feature-gates.js";
|
|
3
|
+
import { getItemOutcomeToHttp, getItemByFieldOutcomeToHttp, listOutcomeToHttp } from "../outcome-to-http.js";
|
|
4
|
+
import { resolveRequestContext } from "../resolve-request-context.js";
|
|
5
|
+
export async function registerItemRoutes(app, catalox, config) {
|
|
6
|
+
app.get("/v1/catalogs/:catalogId/items", async (req, reply) => {
|
|
7
|
+
try {
|
|
8
|
+
gateFeature(config, req.authixToken, CATALOX_FEATURES.itemRead);
|
|
9
|
+
const context = resolveRequestContext(req, config);
|
|
10
|
+
const catalogId = req.params.catalogId;
|
|
11
|
+
const options = {};
|
|
12
|
+
if (req.query.limit)
|
|
13
|
+
options.limit = Number(req.query.limit);
|
|
14
|
+
if (req.query.offset)
|
|
15
|
+
options.offset = Number(req.query.offset);
|
|
16
|
+
const res = await catalox.listCatalogItemsWithOutcome(context, catalogId, options);
|
|
17
|
+
const http = listOutcomeToHttp(res.outcome, res);
|
|
18
|
+
return reply.status(http.statusCode).send(http.body);
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
const err = e;
|
|
22
|
+
return reply.status(err.statusCode ?? 500).send({ outcome: "error", error: { message: err.message } });
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
app.get("/v1/catalogs/:catalogId/items/:itemId", async (req, reply) => {
|
|
26
|
+
try {
|
|
27
|
+
gateFeature(config, req.authixToken, CATALOX_FEATURES.itemRead);
|
|
28
|
+
const context = resolveRequestContext(req, config);
|
|
29
|
+
const catalogId = req.params.catalogId;
|
|
30
|
+
const itemId = req.params.itemId;
|
|
31
|
+
const res = await catalox.getCatalogItemWithOutcome(context, catalogId, itemId);
|
|
32
|
+
const http = getItemOutcomeToHttp(res.outcome, res);
|
|
33
|
+
return reply.status(http.statusCode).send(http.body);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
const err = e;
|
|
37
|
+
return reply.status(err.statusCode ?? 500).send({ outcome: "error", error: { message: err.message } });
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
app.get("/v1/catalogs/:catalogId/items/by-field", async (req, reply) => {
|
|
41
|
+
try {
|
|
42
|
+
gateFeature(config, req.authixToken, CATALOX_FEATURES.itemRead);
|
|
43
|
+
const context = resolveRequestContext(req, config);
|
|
44
|
+
const catalogId = req.params.catalogId;
|
|
45
|
+
const fieldPath = req.query.fieldPath;
|
|
46
|
+
const value = req.query.value;
|
|
47
|
+
if (!fieldPath || value == null) {
|
|
48
|
+
return reply.status(400).send({
|
|
49
|
+
outcome: "error",
|
|
50
|
+
error: { message: "fieldPath and value query parameters are required." },
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
const res = await catalox.getCatalogItemByFieldWithOutcome(context, catalogId, fieldPath, value);
|
|
54
|
+
const http = getItemByFieldOutcomeToHttp(res.outcome, res);
|
|
55
|
+
return reply.status(http.statusCode).send(http.body);
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
const err = e;
|
|
59
|
+
return reply.status(err.statusCode ?? 500).send({ outcome: "error", error: { message: err.message } });
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
app.put("/v1/catalogs/:catalogId/items/:itemId", async (req, reply) => {
|
|
63
|
+
try {
|
|
64
|
+
gateFeature(config, req.authixToken, CATALOX_FEATURES.itemWrite);
|
|
65
|
+
const context = resolveRequestContext(req, config);
|
|
66
|
+
const catalogId = req.params.catalogId;
|
|
67
|
+
const itemId = req.params.itemId;
|
|
68
|
+
const body = req.body ?? {};
|
|
69
|
+
const item = await catalox.upsertNativeCatalogItem(context, catalogId, {
|
|
70
|
+
itemId,
|
|
71
|
+
...body,
|
|
72
|
+
});
|
|
73
|
+
return reply.send({ outcome: "ok", result: { item } });
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
const err = e;
|
|
77
|
+
return reply.status(err.statusCode ?? 500).send({ outcome: "error", error: { message: err.message } });
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
app.patch("/v1/catalogs/:catalogId/items/:itemId", async (req, reply) => {
|
|
81
|
+
try {
|
|
82
|
+
gateFeature(config, req.authixToken, CATALOX_FEATURES.itemWrite);
|
|
83
|
+
const context = resolveRequestContext(req, config);
|
|
84
|
+
const catalogId = req.params.catalogId;
|
|
85
|
+
const itemId = req.params.itemId;
|
|
86
|
+
const item = await catalox.updateNativeCatalogItem(context, catalogId, itemId, req.body ?? {});
|
|
87
|
+
return reply.send({ outcome: "ok", result: { item } });
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
const err = e;
|
|
91
|
+
return reply.status(err.statusCode ?? 500).send({ outcome: "error", error: { message: err.message } });
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
app.get("/v1/catalogs/:catalogId/items/:itemId/native-record", async (req, reply) => {
|
|
95
|
+
try {
|
|
96
|
+
gateFeature(config, req.authixToken, CATALOX_FEATURES.itemRead);
|
|
97
|
+
const context = resolveRequestContext(req, config);
|
|
98
|
+
const catalogId = req.params.catalogId;
|
|
99
|
+
const itemId = req.params.itemId;
|
|
100
|
+
const record = await catalox.getNativeCatalogItem(context, catalogId, itemId);
|
|
101
|
+
if (!record) {
|
|
102
|
+
return reply.status(404).send({ outcome: "not_found", error: { message: "Native catalog item not found" } });
|
|
103
|
+
}
|
|
104
|
+
return reply.send({ outcome: "ok", result: { record } });
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
const err = e;
|
|
108
|
+
return reply.status(err.statusCode ?? 500).send({ outcome: "error", error: { message: err.message } });
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
app.put("/v1/catalogs/:catalogId/items/:itemId/native-record", async (req, reply) => {
|
|
112
|
+
try {
|
|
113
|
+
gateFeature(config, req.authixToken, CATALOX_FEATURES.itemWrite);
|
|
114
|
+
const context = resolveRequestContext(req, config);
|
|
115
|
+
const catalogId = req.params.catalogId;
|
|
116
|
+
const itemId = req.params.itemId;
|
|
117
|
+
const record = { ...(req.body ?? {}), itemId, catalogId };
|
|
118
|
+
await catalox.replaceNativeCatalogItem(context, catalogId, record);
|
|
119
|
+
return reply.send({ outcome: "ok", result: { itemId } });
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
const err = e;
|
|
123
|
+
return reply.status(err.statusCode ?? 500).send({ outcome: "error", error: { message: err.message } });
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=items.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"items.js","sourceRoot":"","sources":["../../src/routes/items.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FastifyInstance } from "fastify";
|
|
2
|
+
import type { Catalox } from "@x12i/catalox-engine/embedder";
|
|
3
|
+
import type { CataloxApiConfig } from "../config.js";
|
|
4
|
+
export declare function registerOperatorRoutes(app: FastifyInstance, catalox: Catalox, config: CataloxApiConfig): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=operator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator.d.ts","sourceRoot":"","sources":["../../src/routes/operator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAI7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIrD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,IAAI,CAAC,CAgDf"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { CATALOX_FEATURES } from "@x12i/catalox-authix-bridge";
|
|
2
|
+
import { gateFeature } from "../feature-gates.js";
|
|
3
|
+
import { resolveRequestContext } from "../resolve-request-context.js";
|
|
4
|
+
export async function registerOperatorRoutes(app, catalox, config) {
|
|
5
|
+
app.get("/v1/catalogs", async (req, reply) => {
|
|
6
|
+
try {
|
|
7
|
+
gateFeature(config, req.authixToken, CATALOX_FEATURES.operatorRead);
|
|
8
|
+
const context = resolveRequestContext(req, config);
|
|
9
|
+
const catalogs = await catalox.listAllCatalogs(context);
|
|
10
|
+
return reply.send({ outcome: "ok", result: { catalogs } });
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
const err = e;
|
|
14
|
+
return reply.status(err.statusCode ?? 500).send({ outcome: "error", error: { message: err.message } });
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
app.post("/v1/apps/:appId/catalogs/:catalogId/bind", async (req, reply) => {
|
|
18
|
+
try {
|
|
19
|
+
gateFeature(config, req.authixToken, CATALOX_FEATURES.catalogAdmin);
|
|
20
|
+
const context = resolveRequestContext(req, config);
|
|
21
|
+
const binding = await catalox.bindCatalogToApp(context, {
|
|
22
|
+
appId: req.params.appId,
|
|
23
|
+
catalogId: req.params.catalogId,
|
|
24
|
+
...req.body,
|
|
25
|
+
});
|
|
26
|
+
return reply.send({ outcome: "ok", result: { binding } });
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
const err = e;
|
|
30
|
+
return reply.status(err.statusCode ?? 500).send({ outcome: "error", error: { message: err.message } });
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
app.get("/v1/catalogs/:catalogId/export", async (req, reply) => {
|
|
34
|
+
try {
|
|
35
|
+
gateFeature(config, req.authixToken, CATALOX_FEATURES.operatorRead);
|
|
36
|
+
const context = resolveRequestContext(req, config);
|
|
37
|
+
const json = await catalox.exportCatalogSnapshotToJson(context, {
|
|
38
|
+
catalogIds: [req.params.catalogId],
|
|
39
|
+
});
|
|
40
|
+
return reply.send({ outcome: "ok", result: json });
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
const err = e;
|
|
44
|
+
return reply.status(err.statusCode ?? 500).send({ outcome: "error", error: { message: err.message } });
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=operator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator.js","sourceRoot":"","sources":["../../src/routes/operator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FastifyInstance } from "fastify";
|
|
2
|
+
import type { Catalox } from "@x12i/catalox-engine/embedder";
|
|
3
|
+
import type { CataloxApiConfig } from "../config.js";
|
|
4
|
+
export declare function registerSearchRoutes(app: FastifyInstance, catalox: Catalox, config: CataloxApiConfig): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/routes/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAI7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIrD,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CATALOX_FEATURES } from "@x12i/catalox-authix-bridge";
|
|
2
|
+
import { gateFeature } from "../feature-gates.js";
|
|
3
|
+
import { resolveRequestContext } from "../resolve-request-context.js";
|
|
4
|
+
export async function registerSearchRoutes(app, catalox, config) {
|
|
5
|
+
app.post("/v1/catalogs/:catalogId/search", async (req, reply) => {
|
|
6
|
+
try {
|
|
7
|
+
gateFeature(config, req.authixToken, CATALOX_FEATURES.itemSearch);
|
|
8
|
+
const context = resolveRequestContext(req, config);
|
|
9
|
+
const catalogId = req.params.catalogId;
|
|
10
|
+
const body = req.body ?? {};
|
|
11
|
+
const results = await catalox.searchCatalogItems(context, catalogId, {
|
|
12
|
+
text: body.query ?? "",
|
|
13
|
+
...(body.limit != null ? { limit: body.limit } : {}),
|
|
14
|
+
});
|
|
15
|
+
return reply.send({ outcome: "ok", result: { items: results } });
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
const err = e;
|
|
19
|
+
return reply.status(err.statusCode ?? 500).send({ outcome: "error", error: { message: err.message } });
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/routes/search.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAA2B,MAAM,+BAA+B,CAAC;AAE/F,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAoB,EACpB,OAAgB,EAChB,MAAwB;IAExB,GAAG,CAAC,IAAI,CAGL,gCAAgC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACxD,IAAI,CAAC;YACH,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAClE,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAyB,EAAE,MAAM,CAAC,CAAC;YACzE,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,SAAsB,CAAC;YACpD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE;gBACnE,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;gBACtB,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrD,CAAC,CAAC;YACH,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,CAA8C,CAAC;YAC3D,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACzG,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@x12i/catalox-api",
|
|
3
|
+
"version": "5.9.8",
|
|
4
|
+
"description": "HTTP route layer for Catalox",
|
|
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-authix-bridge": "5.9.8",
|
|
24
|
+
"@x12i/catalox-contracts": "5.9.8",
|
|
25
|
+
"@x12i/catalox-engine": "5.9.8",
|
|
26
|
+
"fastify": "^5.3.0"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "^22.0.0",
|
|
30
|
+
"tsx": "^4.0.0",
|
|
31
|
+
"typescript": "^5.0.0"
|
|
32
|
+
}
|
|
33
|
+
}
|