@fabricorg/experiments-api-client 0.1.0 → 0.1.2
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/index.cjs +43 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +620 -0
- package/dist/index.d.ts +620 -0
- package/dist/index.js +43 -1
- package/dist/index.js.map +1 -1
- package/package.json +10 -12
- package/LICENSE +0 -21
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import {\n type EndpointName,\n type EndpointParams,\n type EndpointResponse,\n buildPath,\n endpoints,\n} from '@fabricorg/experiments-api-protocol';\n\nexport interface ApiClientOptions {\n baseUrl: string;\n /** Bearer API key (CLI / SDK paths). Cookie-based callers omit this. */\n apiKey?: string;\n /** Override fetch (for tests / SSR). Defaults to globalThis.fetch. */\n fetchImpl?: typeof fetch;\n /** Default org id used when an endpoint's path includes :orgId and no override is supplied. */\n defaultOrgId?: string;\n /** Retry config for 5xx responses. */\n retry?: { attempts?: number; baseDelayMs?: number };\n}\n\nexport class ApiError extends Error {\n constructor(\n public readonly status: number,\n public readonly code: string,\n message: string,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\n/** Path params for endpoints that include `:orgId`, `:experimentId`, etc. */\nexport type CallPathParams<E extends EndpointName> =\n (typeof endpoints)[E]['path'] extends `${string}:${string}`\n ? Record<string, string>\n : Record<string, string> | undefined;\n\nexport class ApiClient {\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly opts: ApiClientOptions) {\n this.fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n if (!this.fetchImpl) throw new Error('ApiClient: no fetch available');\n }\n\n async call<E extends EndpointName>(\n name: E,\n params: EndpointParams<E>,\n pathParams?: Record<string, string>,\n ): Promise<EndpointResponse<E>> {\n const def = endpoints[name];\n const merged = {\n orgId: this.opts.defaultOrgId,\n ...(pathParams ?? {}),\n } as Record<string, string>;\n const url = new URL(buildPath(def.path, merged), this.opts.baseUrl);\n\n const init: RequestInit = {\n method: def.method,\n headers: {\n accept: 'application/json',\n ...(this.opts.apiKey ? { authorization: `Bearer ${this.opts.apiKey}` } : {}),\n },\n credentials: 'include',\n };\n if (def.method === 'GET' || def.method === 'DELETE') {\n // Send GET params as query string.\n for (const [k, v] of Object.entries(params as Record<string, unknown>)) {\n if (v != null) url.searchParams.set(k, String(v));\n }\n } else {\n init.headers = { ...init.headers, 'content-type': 'application/json' };\n init.body = JSON.stringify(params ?? {});\n }\n\n const attempts = this.opts.retry?.attempts ?? 3;\n const base = this.opts.retry?.baseDelayMs ?? 250;\n let lastErr: unknown;\n for (let i = 0; i < attempts; i++) {\n try {\n const r = await this.fetchImpl(url.toString(), init);\n if (r.ok) {\n if (r.status === 204) return undefined as unknown as EndpointResponse<E>;\n return (await r.json()) as EndpointResponse<E>;\n }\n // 4xx: don't retry. 5xx: retry with backoff.\n if (r.status < 500) {\n const body = await safeJson(r);\n const err = (\n body as { error?: { code?: string; message?: string; details?: unknown } } | null\n )?.error;\n throw new ApiError(\n r.status,\n err?.code ?? 'UNKNOWN',\n err?.message ?? r.statusText,\n err?.details,\n );\n }\n lastErr = new ApiError(r.status, 'INTERNAL', `${r.status} ${r.statusText}`);\n } catch (e) {\n if (e instanceof ApiError && e.status < 500) throw e;\n lastErr = e;\n }\n await sleep(base * 2 ** i + Math.random() * 100);\n }\n throw lastErr;\n }\n\n // ---- Convenience namespaces (typed shortcuts) -----------------------------\n\n tenants = {\n me: () => this.call('tenants.me', {} as never),\n };\n\n experiments = {\n list: (orgId?: string) =>\n this.call('experiments.list', {} as never, orgId ? { orgId } : undefined),\n get: (experimentId: string, orgId?: string) =>\n this.call('experiments.get', {} as never, orgId ? { orgId, experimentId } : { experimentId }),\n invokeAction: (params: EndpointParams<'experiments.invokeAction'>, orgId?: string) =>\n this.call('experiments.invokeAction', params, orgId ? { orgId } : undefined),\n aggregate: (\n experimentId: string,\n params: EndpointParams<'experiments.aggregate'>,\n orgId?: string,\n ) =>\n this.call(\n 'experiments.aggregate',\n params,\n orgId ? { orgId, experimentId } : { experimentId },\n ),\n };\n\n manifests = {\n publish: (orgId?: string) =>\n this.call('manifests.publish', {} as never, orgId ? { orgId } : undefined),\n getKeys: (orgId?: string) =>\n this.call('manifests.getKeys', {} as never, orgId ? { orgId } : undefined),\n rotateKey: (keyId: string, orgId?: string) =>\n this.call('manifests.rotateKey', { keyId }, orgId ? { orgId } : undefined),\n retireKey: (keyId: string, orgId?: string) =>\n this.call('manifests.retireKey', { keyId }, orgId ? { orgId } : undefined),\n };\n\n audit = {\n list: (orgId?: string) => this.call('audit.list', {} as never, orgId ? { orgId } : undefined),\n };\n\n preview = {\n sign: (params: EndpointParams<'preview.sign'>, orgId?: string) =>\n this.call('preview.sign', params, orgId ? { orgId } : undefined),\n };\n\n apiKeys = {\n list: (orgId?: string) => this.call('apiKeys.list', {} as never, orgId ? { orgId } : undefined),\n create: (params: EndpointParams<'apiKeys.create'>, orgId?: string) =>\n this.call('apiKeys.create', params, orgId ? { orgId } : undefined),\n revoke: (keyId: string, orgId?: string) =>\n this.call('apiKeys.revoke', {} as never, orgId ? { orgId, keyId } : { keyId }),\n };\n\n saml = {\n get: (orgId?: string) => this.call('saml.get', {} as never, orgId ? { orgId } : undefined),\n update: (params: EndpointParams<'saml.update'>, orgId?: string) =>\n this.call('saml.update', params, orgId ? { orgId } : undefined),\n };\n}\n\nasync function safeJson(r: Response): Promise<unknown> {\n try {\n return await r.json();\n } catch {\n return null;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import {\n type EndpointName,\n type EndpointParams,\n type EndpointResponse,\n buildPath,\n endpoints,\n} from '@fabricorg/experiments-api-protocol';\n\nexport interface ApiClientOptions {\n baseUrl: string;\n /** Bearer API key (CLI / SDK paths). Cookie-based callers omit this. */\n apiKey?: string;\n /** Override fetch (for tests / SSR). Defaults to globalThis.fetch. */\n fetchImpl?: typeof fetch;\n /** Default org id used when an endpoint's path includes :orgId and no override is supplied. */\n defaultOrgId?: string;\n /** Retry config for 5xx responses. */\n retry?: { attempts?: number; baseDelayMs?: number };\n}\n\nexport class ApiError extends Error {\n constructor(\n public readonly status: number,\n public readonly code: string,\n message: string,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\n/** Path params for endpoints that include `:orgId`, `:experimentId`, etc. */\nexport type CallPathParams<E extends EndpointName> =\n (typeof endpoints)[E]['path'] extends `${string}:${string}`\n ? Record<string, string>\n : Record<string, string> | undefined;\n\nexport class ApiClient {\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly opts: ApiClientOptions) {\n this.fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n if (!this.fetchImpl) throw new Error('ApiClient: no fetch available');\n }\n\n async call<E extends EndpointName>(\n name: E,\n params: EndpointParams<E>,\n pathParams?: Record<string, string>,\n ): Promise<EndpointResponse<E>> {\n const def = endpoints[name];\n const merged = {\n orgId: this.opts.defaultOrgId,\n ...(pathParams ?? {}),\n } as Record<string, string>;\n const url = new URL(buildPath(def.path, merged), this.opts.baseUrl);\n\n const init: RequestInit = {\n method: def.method,\n headers: {\n accept: 'application/json',\n // Hosted Fabric API keys use their own header so upstream auth\n // middleware cannot mistake them for OAuth bearer credentials.\n ...(this.opts.apiKey ? { 'x-api-key': this.opts.apiKey } : {}),\n },\n credentials: 'include',\n };\n if (def.method === 'GET' || def.method === 'DELETE') {\n // Send GET params as query string.\n for (const [k, v] of Object.entries(params as Record<string, unknown>)) {\n if (v != null) url.searchParams.set(k, String(v));\n }\n } else {\n init.headers = { ...init.headers, 'content-type': 'application/json' };\n init.body = JSON.stringify(params ?? {});\n }\n\n const attempts = this.opts.retry?.attempts ?? 3;\n const base = this.opts.retry?.baseDelayMs ?? 250;\n let lastErr: unknown;\n for (let i = 0; i < attempts; i++) {\n try {\n const r = await this.fetchImpl(url.toString(), init);\n if (r.ok) {\n if (r.status === 204) return undefined as unknown as EndpointResponse<E>;\n return (await r.json()) as EndpointResponse<E>;\n }\n // 4xx: don't retry. 5xx: retry with backoff.\n if (r.status < 500) {\n const body = await safeJson(r);\n const err = (\n body as { error?: { code?: string; message?: string; details?: unknown } } | null\n )?.error;\n throw new ApiError(\n r.status,\n err?.code ?? 'UNKNOWN',\n err?.message ?? r.statusText,\n err?.details,\n );\n }\n lastErr = new ApiError(r.status, 'INTERNAL', `${r.status} ${r.statusText}`);\n } catch (e) {\n if (e instanceof ApiError && e.status < 500) throw e;\n lastErr = e;\n }\n await sleep(base * 2 ** i + Math.random() * 100);\n }\n throw lastErr;\n }\n\n // ---- Convenience namespaces (typed shortcuts) -----------------------------\n\n tenants = {\n me: () => this.call('tenants.me', {} as never),\n };\n\n experiments = {\n list: (orgId?: string) =>\n this.call('experiments.list', {} as never, orgId ? { orgId } : undefined),\n get: (experimentId: string, orgId?: string) =>\n this.call('experiments.get', {} as never, orgId ? { orgId, experimentId } : { experimentId }),\n invokeAction: (params: EndpointParams<'experiments.invokeAction'>, orgId?: string) =>\n this.call('experiments.invokeAction', params, orgId ? { orgId } : undefined),\n aggregate: (\n experimentId: string,\n params: EndpointParams<'experiments.aggregate'>,\n orgId?: string,\n ) =>\n this.call(\n 'experiments.aggregate',\n params,\n orgId ? { orgId, experimentId } : { experimentId },\n ),\n };\n\n projects = {\n list: (orgId?: string) =>\n this.call('projects.list', {} as never, orgId ? { orgId } : undefined),\n create: (params: EndpointParams<'projects.create'>, orgId?: string) =>\n this.call('projects.create', params, orgId ? { orgId } : undefined),\n };\n\n properties = {\n list: (projectId: string, orgId?: string) =>\n this.call('properties.list', {} as never, orgId ? { orgId, projectId } : { projectId }),\n create: (projectId: string, params: EndpointParams<'properties.create'>, orgId?: string) =>\n this.call('properties.create', params, orgId ? { orgId, projectId } : { projectId }),\n };\n\n environments = {\n list: (projectId: string, orgId?: string) =>\n this.call('environments.list', {} as never, orgId ? { orgId, projectId } : { projectId }),\n create: (projectId: string, params: EndpointParams<'environments.create'>, orgId?: string) =>\n this.call('environments.create', params, orgId ? { orgId, projectId } : { projectId }),\n publish: (environmentId: string, orgId?: string) =>\n this.call(\n 'environments.publish',\n {} as never,\n orgId ? { orgId, environmentId } : { environmentId },\n ),\n publications: (environmentId: string, orgId?: string) =>\n this.call(\n 'environments.publications',\n {} as never,\n orgId ? { orgId, environmentId } : { environmentId },\n ),\n promote: (\n environmentId: string,\n params: EndpointParams<'environments.promote'>,\n orgId?: string,\n ) =>\n this.call(\n 'environments.promote',\n params,\n orgId ? { orgId, environmentId } : { environmentId },\n ),\n configuration: (environmentId: string, orgId?: string) =>\n this.call(\n 'configuration.getPublished',\n {} as never,\n orgId ? { orgId, environmentId } : { environmentId },\n ),\n };\n\n features = {\n list: (projectId: string, orgId?: string) =>\n this.call('features.list', {} as never, orgId ? { orgId, projectId } : { projectId }),\n create: (projectId: string, params: EndpointParams<'features.create'>, orgId?: string) =>\n this.call('features.create', params, orgId ? { orgId, projectId } : { projectId }),\n };\n\n rules = {\n list: (featureId: string, orgId?: string) =>\n this.call('rules.list', {} as never, orgId ? { orgId, featureId } : { featureId }),\n create: (featureId: string, params: EndpointParams<'rules.create'>, orgId?: string) =>\n this.call('rules.create', params, orgId ? { orgId, featureId } : { featureId }),\n };\n\n manifests = {\n publish: (orgId?: string) =>\n this.call('manifests.publish', {} as never, orgId ? { orgId } : undefined),\n getKeys: (orgId?: string) =>\n this.call('manifests.getKeys', {} as never, orgId ? { orgId } : undefined),\n rotateKey: (keyId: string, orgId?: string) =>\n this.call('manifests.rotateKey', { keyId }, orgId ? { orgId } : undefined),\n retireKey: (keyId: string, orgId?: string) =>\n this.call('manifests.retireKey', { keyId }, orgId ? { orgId } : undefined),\n };\n\n audit = {\n list: (orgId?: string) => this.call('audit.list', {} as never, orgId ? { orgId } : undefined),\n };\n\n preview = {\n sign: (params: EndpointParams<'preview.sign'>, orgId?: string) =>\n this.call('preview.sign', params, orgId ? { orgId } : undefined),\n };\n\n apiKeys = {\n list: (orgId?: string) => this.call('apiKeys.list', {} as never, orgId ? { orgId } : undefined),\n create: (params: EndpointParams<'apiKeys.create'>, orgId?: string) =>\n this.call('apiKeys.create', params, orgId ? { orgId } : undefined),\n revoke: (keyId: string, orgId?: string) =>\n this.call('apiKeys.revoke', {} as never, orgId ? { orgId, keyId } : { keyId }),\n };\n\n saml = {\n get: (orgId?: string) => this.call('saml.get', {} as never, orgId ? { orgId } : undefined),\n update: (params: EndpointParams<'saml.update'>, orgId?: string) =>\n this.call('saml.update', params, orgId ? { orgId } : undefined),\n };\n}\n\nasync function safeJson(r: Response): Promise<unknown> {\n try {\n return await r.json();\n } catch {\n return null;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fabricorg/experiments-api-client",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Typed RPC client for the hosted Fabric Experiments API.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -20,21 +20,19 @@
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
},
|
|
23
|
-
"files": [
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
"files": ["dist"],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsup",
|
|
26
|
+
"type-check": "tsc --noEmit",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"clean": "rm -rf dist"
|
|
29
|
+
},
|
|
26
30
|
"dependencies": {
|
|
27
|
-
"@fabricorg/experiments-api-protocol": "
|
|
31
|
+
"@fabricorg/experiments-api-protocol": "workspace:*"
|
|
28
32
|
},
|
|
29
33
|
"devDependencies": {
|
|
30
34
|
"tsup": "^8.3.5",
|
|
31
35
|
"typescript": "^5.8.3",
|
|
32
36
|
"vitest": "^2.1.8"
|
|
33
|
-
},
|
|
34
|
-
"scripts": {
|
|
35
|
-
"build": "tsup",
|
|
36
|
-
"type-check": "tsc --noEmit",
|
|
37
|
-
"test": "vitest run",
|
|
38
|
-
"clean": "rm -rf dist"
|
|
39
37
|
}
|
|
40
|
-
}
|
|
38
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Fabric
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in
|
|
13
|
-
all copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
-
THE SOFTWARE.
|