@apifuse/provider-sdk 2.1.0-beta.5 → 2.1.0-beta.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.
Files changed (163) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +2 -2
  3. package/SUBMISSION.md +2 -1
  4. package/bin/apifuse-check.ts +60 -6
  5. package/bin/apifuse-dev.ts +48 -5
  6. package/bin/apifuse-perf.ts +50 -11
  7. package/bin/apifuse-record.ts +35 -11
  8. package/bin/apifuse-submit-check.ts +1425 -3
  9. package/dist/ceremonies/index.d.ts +41 -0
  10. package/dist/ceremonies/index.js +490 -0
  11. package/dist/choice-token.d.ts +24 -0
  12. package/dist/choice-token.js +74 -0
  13. package/dist/cli/commands.d.ts +10 -0
  14. package/dist/cli/commands.js +80 -0
  15. package/dist/cli/create.d.ts +47 -0
  16. package/dist/cli/create.js +762 -0
  17. package/dist/config/loader.d.ts +107 -0
  18. package/dist/config/loader.js +935 -0
  19. package/dist/contract-json.d.ts +9 -0
  20. package/dist/contract-json.js +51 -0
  21. package/dist/contract-serialization.d.ts +4 -0
  22. package/dist/contract-serialization.js +78 -0
  23. package/dist/contract-types.d.ts +49 -0
  24. package/dist/contract-types.js +1 -0
  25. package/dist/contract.d.ts +6 -0
  26. package/dist/contract.js +155 -0
  27. package/dist/define.d.ts +97 -0
  28. package/dist/define.js +1320 -0
  29. package/dist/dev.d.ts +9 -0
  30. package/dist/dev.js +15 -0
  31. package/dist/errors.d.ts +59 -0
  32. package/dist/errors.js +97 -0
  33. package/dist/i18n/catalog.d.ts +29 -0
  34. package/dist/i18n/catalog.js +159 -0
  35. package/dist/i18n/index.d.ts +2 -0
  36. package/dist/i18n/index.js +2 -0
  37. package/dist/i18n/keys.d.ts +10 -0
  38. package/dist/i18n/keys.js +34 -0
  39. package/dist/index.d.ts +41 -0
  40. package/dist/index.js +37 -0
  41. package/dist/lint.d.ts +73 -0
  42. package/dist/lint.js +702 -0
  43. package/dist/observability.d.ts +5 -0
  44. package/dist/observability.js +39 -0
  45. package/dist/provider.d.ts +9 -0
  46. package/dist/provider.js +8 -0
  47. package/dist/public-schema-field-lint.d.ts +2 -0
  48. package/dist/public-schema-field-lint.js +158 -0
  49. package/dist/recipes/gov-api.d.ts +19 -0
  50. package/dist/recipes/gov-api.js +72 -0
  51. package/dist/recipes/rest-api.d.ts +21 -0
  52. package/dist/recipes/rest-api.js +115 -0
  53. package/dist/runtime/auth-flow.d.ts +14 -0
  54. package/dist/runtime/auth-flow.js +44 -0
  55. package/dist/runtime/browser.d.ts +25 -0
  56. package/dist/runtime/browser.js +1034 -0
  57. package/dist/runtime/cache.d.ts +10 -0
  58. package/dist/runtime/cache.js +372 -0
  59. package/dist/runtime/choice.d.ts +15 -0
  60. package/dist/runtime/choice.js +435 -0
  61. package/dist/runtime/credential.d.ts +8 -0
  62. package/dist/runtime/credential.js +61 -0
  63. package/dist/runtime/env.d.ts +2 -0
  64. package/dist/runtime/env.js +10 -0
  65. package/dist/runtime/executor.d.ts +16 -0
  66. package/dist/runtime/executor.js +51 -0
  67. package/dist/runtime/http.d.ts +8 -0
  68. package/dist/runtime/http.js +706 -0
  69. package/dist/runtime/insights.d.ts +9 -0
  70. package/dist/runtime/insights.js +324 -0
  71. package/dist/runtime/instrumentation.d.ts +8 -0
  72. package/dist/runtime/instrumentation.js +269 -0
  73. package/dist/runtime/key-derivation.d.ts +24 -0
  74. package/dist/runtime/key-derivation.js +73 -0
  75. package/dist/runtime/keyring.d.ts +25 -0
  76. package/dist/runtime/keyring.js +93 -0
  77. package/dist/runtime/namespace.d.ts +9 -0
  78. package/dist/runtime/namespace.js +19 -0
  79. package/dist/runtime/otlp.d.ts +39 -0
  80. package/dist/runtime/otlp.js +103 -0
  81. package/dist/runtime/perf.d.ts +12 -0
  82. package/dist/runtime/perf.js +52 -0
  83. package/dist/runtime/prevalidate.d.ts +12 -0
  84. package/dist/runtime/prevalidate.js +173 -0
  85. package/dist/runtime/provider.d.ts +2 -0
  86. package/dist/runtime/provider.js +11 -0
  87. package/dist/runtime/proxy-errors.d.ts +21 -0
  88. package/dist/runtime/proxy-errors.js +83 -0
  89. package/dist/runtime/proxy-telemetry.d.ts +8 -0
  90. package/dist/runtime/proxy-telemetry.js +174 -0
  91. package/dist/runtime/redis.d.ts +17 -0
  92. package/dist/runtime/redis.js +82 -0
  93. package/dist/runtime/request-options.d.ts +3 -0
  94. package/dist/runtime/request-options.js +42 -0
  95. package/dist/runtime/state.d.ts +17 -0
  96. package/dist/runtime/state.js +344 -0
  97. package/dist/runtime/stealth.d.ts +18 -0
  98. package/dist/runtime/stealth.js +827 -0
  99. package/dist/runtime/stt.d.ts +22 -0
  100. package/dist/runtime/stt.js +480 -0
  101. package/dist/runtime/trace.d.ts +26 -0
  102. package/dist/runtime/trace.js +142 -0
  103. package/dist/runtime/waterfall.d.ts +12 -0
  104. package/dist/runtime/waterfall.js +147 -0
  105. package/dist/schema.d.ts +74 -0
  106. package/dist/schema.js +243 -0
  107. package/dist/serve.d.ts +1 -0
  108. package/dist/serve.js +1 -0
  109. package/dist/server/index.d.ts +3 -0
  110. package/dist/server/index.js +2 -0
  111. package/dist/server/serve.d.ts +64 -0
  112. package/dist/server/serve.js +1110 -0
  113. package/dist/server/types.d.ts +136 -0
  114. package/dist/server/types.js +86 -0
  115. package/dist/stealth/profiles.d.ts +4 -0
  116. package/dist/stealth/profiles.js +259 -0
  117. package/dist/stream.d.ts +44 -0
  118. package/dist/stream.js +151 -0
  119. package/dist/testing/helpers.d.ts +23 -0
  120. package/dist/testing/helpers.js +95 -0
  121. package/dist/testing/index.d.ts +2 -0
  122. package/dist/testing/index.js +2 -0
  123. package/dist/testing/run.d.ts +34 -0
  124. package/dist/testing/run.js +303 -0
  125. package/dist/types.d.ts +1324 -0
  126. package/dist/types.js +61 -0
  127. package/dist/utils/date.d.ts +6 -0
  128. package/dist/utils/date.js +101 -0
  129. package/dist/utils/parse.d.ts +16 -0
  130. package/dist/utils/parse.js +51 -0
  131. package/dist/utils/text.d.ts +4 -0
  132. package/dist/utils/text.js +14 -0
  133. package/dist/utils/transform.d.ts +8 -0
  134. package/dist/utils/transform.js +48 -0
  135. package/package.json +42 -25
  136. package/src/ceremonies/index.ts +8 -2
  137. package/src/choice-token.ts +1 -0
  138. package/src/cli/commands.ts +8 -5
  139. package/src/cli/create.ts +28 -0
  140. package/src/cli/templates/provider/operations/ping.ts.tpl +3 -2
  141. package/src/cli/templates/provider/schemas/ping.ts.tpl +8 -0
  142. package/src/config/loader.ts +19 -1
  143. package/src/contract-json.ts +75 -0
  144. package/src/contract-serialization.ts +89 -0
  145. package/src/contract-types.ts +52 -0
  146. package/src/contract.ts +215 -0
  147. package/src/define.ts +37 -2
  148. package/src/errors.ts +15 -0
  149. package/src/i18n/catalog.ts +156 -0
  150. package/src/index.ts +22 -1
  151. package/src/lint.ts +256 -37
  152. package/src/provider.ts +45 -2
  153. package/src/runtime/browser.ts +685 -30
  154. package/src/runtime/cache.ts +35 -89
  155. package/src/runtime/choice.ts +760 -0
  156. package/src/runtime/executor.ts +19 -2
  157. package/src/runtime/redis.ts +116 -0
  158. package/src/runtime/state.ts +487 -0
  159. package/src/runtime/stealth.ts +8 -1
  160. package/src/server/serve.ts +361 -46
  161. package/src/server/types.ts +2 -0
  162. package/src/testing/run.ts +16 -3
  163. package/src/types.ts +209 -6
package/dist/dev.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import type { ProviderDefinition } from "./types";
2
+ export interface DevServerOptions {
3
+ port?: number;
4
+ sessionDbPath?: string;
5
+ }
6
+ export declare function createDevServer(provider: ProviderDefinition, options?: DevServerOptions): {
7
+ start: () => void;
8
+ };
9
+ export declare function startDevServer(provider: ProviderDefinition, options?: DevServerOptions): void;
package/dist/dev.js ADDED
@@ -0,0 +1,15 @@
1
+ import { serve } from "./server/serve";
2
+ export function createDevServer(provider, options) {
3
+ const port = options?.port ?? 3900;
4
+ return {
5
+ start: () => {
6
+ void serve(provider, { port });
7
+ console.log(`[apifuse dev] ${provider.id}@${provider.version} running at http://localhost:${port}`);
8
+ console.log(`[apifuse dev] Operations: ${Object.keys(provider.operations).join(", ")}`);
9
+ console.log(`[apifuse dev] Health: http://localhost:${port}/health`);
10
+ },
11
+ };
12
+ }
13
+ export function startDevServer(provider, options) {
14
+ createDevServer(provider, options).start();
15
+ }
@@ -0,0 +1,59 @@
1
+ import type { ProviderErrorCategory } from "./observability";
2
+ export type ProviderErrorOptions = {
3
+ fix?: string;
4
+ code?: string;
5
+ details?: unknown;
6
+ cause?: Error;
7
+ category?: ProviderErrorCategory;
8
+ retryable?: boolean;
9
+ };
10
+ export declare class ProviderError extends Error {
11
+ readonly options?: ProviderErrorOptions | undefined;
12
+ constructor(message: string, options?: ProviderErrorOptions | undefined);
13
+ get fix(): string | undefined;
14
+ get code(): string | undefined;
15
+ get details(): unknown;
16
+ }
17
+ export declare class SDKError extends ProviderError {
18
+ constructor(message: string, options?: ProviderErrorOptions);
19
+ }
20
+ export declare class AuthError extends ProviderError {
21
+ constructor(message: string, options?: ProviderErrorOptions);
22
+ }
23
+ export declare class SessionExpiredError extends AuthError {
24
+ constructor(message?: string, options?: ProviderErrorOptions);
25
+ }
26
+ export type ValidationErrorOptions = ProviderErrorOptions & {
27
+ zodError?: unknown;
28
+ };
29
+ export declare class ValidationError extends ProviderError {
30
+ readonly zodError?: unknown;
31
+ constructor(message: string, options?: ValidationErrorOptions);
32
+ }
33
+ export type TransportErrorOptions = ProviderErrorOptions & {
34
+ status?: number;
35
+ upstreamStatus?: number;
36
+ };
37
+ export declare class TransportError extends ProviderError {
38
+ readonly status?: number;
39
+ readonly upstreamStatus?: number;
40
+ constructor(message: string, options?: TransportErrorOptions);
41
+ }
42
+ export declare class ProviderSecretError extends ProviderError {
43
+ constructor(message: string, options?: ProviderErrorOptions);
44
+ }
45
+ export declare class CredentialKeyError extends ProviderError {
46
+ constructor(message: string, options?: ProviderErrorOptions);
47
+ }
48
+ export declare class CredentialModeError extends ProviderError {
49
+ constructor(message: string, options?: ProviderErrorOptions);
50
+ }
51
+ export declare class FlowExpiredError extends ProviderError {
52
+ constructor(message: string, options?: ProviderErrorOptions);
53
+ }
54
+ export declare class TurnValidationError extends ProviderError {
55
+ constructor(message: string, options?: ProviderErrorOptions);
56
+ }
57
+ export declare class ContextAccessError extends ProviderError {
58
+ constructor(message: string, options?: ProviderErrorOptions);
59
+ }
package/dist/errors.js ADDED
@@ -0,0 +1,97 @@
1
+ export class ProviderError extends Error {
2
+ options;
3
+ constructor(message, options) {
4
+ super(message);
5
+ this.options = options;
6
+ this.name = "ProviderError";
7
+ if (options?.cause) {
8
+ this.cause = options.cause;
9
+ }
10
+ }
11
+ get fix() {
12
+ return this.options?.fix;
13
+ }
14
+ get code() {
15
+ return this.options?.code;
16
+ }
17
+ get details() {
18
+ return this.options?.details;
19
+ }
20
+ }
21
+ export class SDKError extends ProviderError {
22
+ constructor(message, options) {
23
+ super(message, options);
24
+ this.name = "SDKError";
25
+ }
26
+ }
27
+ export class AuthError extends ProviderError {
28
+ constructor(message, options) {
29
+ super(message, options);
30
+ this.name = "AuthError";
31
+ }
32
+ }
33
+ export class SessionExpiredError extends AuthError {
34
+ constructor(message = "Provider session expired", options) {
35
+ super(message, {
36
+ code: "reauth_required",
37
+ category: "credential_expired",
38
+ retryable: false,
39
+ ...options,
40
+ });
41
+ this.name = "SessionExpiredError";
42
+ }
43
+ }
44
+ export class ValidationError extends ProviderError {
45
+ zodError;
46
+ constructor(message, options) {
47
+ super(message, options);
48
+ this.name = "ValidationError";
49
+ this.zodError = options?.zodError;
50
+ }
51
+ }
52
+ export class TransportError extends ProviderError {
53
+ status;
54
+ upstreamStatus;
55
+ constructor(message, options) {
56
+ super(message, options);
57
+ this.name = "TransportError";
58
+ this.status = options?.status;
59
+ this.upstreamStatus = options?.upstreamStatus ?? options?.status;
60
+ }
61
+ }
62
+ export class ProviderSecretError extends ProviderError {
63
+ constructor(message, options) {
64
+ super(message, { code: "provider_secret_error", ...options });
65
+ this.name = "ProviderSecretError";
66
+ }
67
+ }
68
+ export class CredentialKeyError extends ProviderError {
69
+ constructor(message, options) {
70
+ super(message, { code: "credential_key_error", ...options });
71
+ this.name = "CredentialKeyError";
72
+ }
73
+ }
74
+ export class CredentialModeError extends ProviderError {
75
+ constructor(message, options) {
76
+ super(message, { code: "credential_mode_error", ...options });
77
+ this.name = "CredentialModeError";
78
+ }
79
+ }
80
+ export class FlowExpiredError extends ProviderError {
81
+ constructor(message, options) {
82
+ super(message, { code: "flow_expired", ...options });
83
+ this.name = "FlowExpiredError";
84
+ }
85
+ }
86
+ export class TurnValidationError extends ProviderError {
87
+ constructor(message, options) {
88
+ super(message, { code: "turn_validation_error", ...options });
89
+ this.name = "TurnValidationError";
90
+ }
91
+ }
92
+ export class ContextAccessError extends ProviderError {
93
+ constructor(message, options) {
94
+ super(message, { code: "context_access_error", ...options });
95
+ this.name = "ContextAccessError";
96
+ }
97
+ }
@@ -0,0 +1,29 @@
1
+ import type { AuthTurn } from "../types";
2
+ import { type ProviderLocale, type ProviderLocaleCatalog, type ProviderLocaleKey, type ProviderLocaleValue } from "./keys";
3
+ export type ProviderLocaleCatalogMap = Record<ProviderLocale, ProviderLocaleCatalog>;
4
+ export interface LoadProviderLocaleCatalogsOptions {
5
+ providerDir: string;
6
+ locales: readonly ProviderLocale[];
7
+ }
8
+ export interface ProviderLocaleValidationIssue {
9
+ locale: ProviderLocale;
10
+ key: string;
11
+ message: string;
12
+ severity: "error" | "warning";
13
+ }
14
+ export interface ProviderLocaleValidationResult {
15
+ ok: boolean;
16
+ issues: ProviderLocaleValidationIssue[];
17
+ }
18
+ export declare function loadProviderLocaleCatalogs(options: LoadProviderLocaleCatalogsOptions): ProviderLocaleCatalogMap;
19
+ export declare function resolveProviderLocaleValue(catalogs: ProviderLocaleCatalogMap, key: ProviderLocaleKey | string, locale: ProviderLocale, fallbackLocale?: ProviderLocale): ProviderLocaleValue | undefined;
20
+ export declare function localizeAuthTurn(turn: AuthTurn, options: {
21
+ catalogs: ProviderLocaleCatalogMap;
22
+ locale: ProviderLocale;
23
+ fallbackLocale?: ProviderLocale;
24
+ }): AuthTurn;
25
+ export declare function validateProviderLocaleCatalogs(options: {
26
+ catalogs: ProviderLocaleCatalogMap;
27
+ requiredLocales: readonly ProviderLocale[];
28
+ requiredKeys: readonly (ProviderLocaleKey | string)[];
29
+ }): ProviderLocaleValidationResult;
@@ -0,0 +1,159 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { getProviderLocalePath, isProviderLocaleValue, providerLocaleKey, } from "./keys";
4
+ export function loadProviderLocaleCatalogs(options) {
5
+ const catalogs = {};
6
+ for (const locale of options.locales) {
7
+ const filePath = join(options.providerDir, "locales", `${locale}.json`);
8
+ catalogs[locale] = JSON.parse(readFileSync(filePath, "utf8"));
9
+ }
10
+ return catalogs;
11
+ }
12
+ export function resolveProviderLocaleValue(catalogs, key, locale, fallbackLocale = "en") {
13
+ providerLocaleKey(key);
14
+ return (getProviderLocalePath(catalogs[locale] ?? {}, key) ??
15
+ getProviderLocalePath(catalogs[fallbackLocale] ?? {}, key));
16
+ }
17
+ function asStringValue(value) {
18
+ return typeof value === "string" ? value : undefined;
19
+ }
20
+ function isStringRecord(value) {
21
+ return (!!value &&
22
+ typeof value === "object" &&
23
+ !Array.isArray(value) &&
24
+ Object.values(value).every((entry) => typeof entry === "string"));
25
+ }
26
+ function localizeAuthInputSchema(expectedInput, options) {
27
+ if (!expectedInput)
28
+ return undefined;
29
+ const schema = isRecord(expectedInput.schema)
30
+ ? expectedInput.schema
31
+ : expectedInput;
32
+ const localizedSchema = localizeAuthSchemaObject(schema, options);
33
+ if (localizedSchema === schema)
34
+ return undefined;
35
+ return isRecord(expectedInput.schema)
36
+ ? { ...expectedInput, schema: localizedSchema }
37
+ : localizedSchema;
38
+ }
39
+ function isRecord(value) {
40
+ return !!value && typeof value === "object" && !Array.isArray(value);
41
+ }
42
+ function localizeAuthSchemaObject(schema, options) {
43
+ const properties = isRecord(schema.properties)
44
+ ? schema.properties
45
+ : undefined;
46
+ if (!properties)
47
+ return schema;
48
+ let changed = false;
49
+ const localizedProperties = Object.fromEntries(Object.entries(properties).map(([fieldName, property]) => {
50
+ if (!isRecord(property))
51
+ return [fieldName, property];
52
+ const nameKey = typeof property.nameKey === "string" ? property.nameKey : undefined;
53
+ const descriptionKey = typeof property.descriptionKey === "string"
54
+ ? property.descriptionKey
55
+ : undefined;
56
+ const title = nameKey
57
+ ? asStringValue(resolveProviderLocaleValue(options.catalogs, nameKey, options.locale, options.fallbackLocale))
58
+ : undefined;
59
+ const description = descriptionKey
60
+ ? asStringValue(resolveProviderLocaleValue(options.catalogs, descriptionKey, options.locale, options.fallbackLocale))
61
+ : undefined;
62
+ if (!title && !description)
63
+ return [fieldName, property];
64
+ changed = true;
65
+ return [
66
+ fieldName,
67
+ {
68
+ ...property,
69
+ ...(title ? { title } : {}),
70
+ ...(description ? { description } : {}),
71
+ },
72
+ ];
73
+ }));
74
+ return changed ? { ...schema, properties: localizedProperties } : schema;
75
+ }
76
+ export function localizeAuthTurn(turn, options) {
77
+ const fallbackLocale = options.fallbackLocale ?? "en";
78
+ const hint = turn.hintKey
79
+ ? asStringValue(resolveProviderLocaleValue(options.catalogs, turn.hintKey, options.locale, fallbackLocale))
80
+ : undefined;
81
+ const expectedInput = localizeAuthInputSchema(turn.expectedInput, {
82
+ catalogs: options.catalogs,
83
+ locale: options.locale,
84
+ fallbackLocale,
85
+ });
86
+ const fieldErrorKeys = turn.data?.fieldErrorKeys;
87
+ const fieldErrors = isStringRecord(fieldErrorKeys)
88
+ ? Object.fromEntries(Object.entries(fieldErrorKeys).flatMap(([fieldName, key]) => {
89
+ const message = asStringValue(resolveProviderLocaleValue(options.catalogs, key, options.locale, fallbackLocale));
90
+ return message ? [[fieldName, message]] : [];
91
+ }))
92
+ : undefined;
93
+ if (!hint && !fieldErrors && !expectedInput)
94
+ return turn;
95
+ return {
96
+ ...turn,
97
+ ...(hint ? { hint } : {}),
98
+ ...(expectedInput ? { expectedInput } : {}),
99
+ ...(fieldErrors
100
+ ? {
101
+ data: {
102
+ ...(turn.data ?? {}),
103
+ fieldErrors,
104
+ },
105
+ }
106
+ : {}),
107
+ };
108
+ }
109
+ export function validateProviderLocaleCatalogs(options) {
110
+ const issues = [];
111
+ const uniqueKeys = Array.from(new Set(options.requiredKeys.map((key) => {
112
+ providerLocaleKey(key);
113
+ return key;
114
+ })));
115
+ for (const locale of options.requiredLocales) {
116
+ const catalog = options.catalogs[locale];
117
+ if (!catalog) {
118
+ issues.push({
119
+ locale,
120
+ key: "*",
121
+ message: `Missing provider locale catalog for ${locale}`,
122
+ severity: "error",
123
+ });
124
+ continue;
125
+ }
126
+ for (const key of uniqueKeys) {
127
+ const value = getProviderLocalePath(catalog, key);
128
+ if (value === undefined) {
129
+ issues.push({
130
+ locale,
131
+ key,
132
+ message: `Missing provider locale key ${key} in ${locale}`,
133
+ severity: "error",
134
+ });
135
+ continue;
136
+ }
137
+ if (!isProviderLocaleValue(value)) {
138
+ issues.push({
139
+ locale,
140
+ key,
141
+ message: `Provider locale key ${key} must resolve to a string or string array`,
142
+ severity: "error",
143
+ });
144
+ continue;
145
+ }
146
+ for (const text of Array.isArray(value) ? value : [value]) {
147
+ if (text.trim().length === 0 || /\bTODO\b/i.test(text)) {
148
+ issues.push({
149
+ locale,
150
+ key,
151
+ message: `Provider locale key ${key} in ${locale} is empty or placeholder text`,
152
+ severity: "error",
153
+ });
154
+ }
155
+ }
156
+ }
157
+ }
158
+ return { ok: issues.every((issue) => issue.severity !== "error"), issues };
159
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./catalog";
2
+ export * from "./keys";
@@ -0,0 +1,2 @@
1
+ export * from "./catalog";
2
+ export * from "./keys";
@@ -0,0 +1,10 @@
1
+ import type { ProviderLocaleKey } from "../types";
2
+ export type { ProviderLocale, ProviderLocaleKey } from "../types";
3
+ export declare function providerLocaleKey(key: string): ProviderLocaleKey;
4
+ export declare function isProviderLocaleKey(value: unknown): value is ProviderLocaleKey;
5
+ export declare function assertProviderLocaleKey(value: unknown): asserts value is ProviderLocaleKey;
6
+ export declare function qualifyProviderLocaleKey(providerId: string, key: ProviderLocaleKey | string): string;
7
+ export declare function getProviderLocalePath(catalog: ProviderLocaleCatalog, key: ProviderLocaleKey | string): ProviderLocaleValue | undefined;
8
+ export type ProviderLocaleValue = string | readonly string[];
9
+ export type ProviderLocaleCatalog = Record<string, unknown>;
10
+ export declare function isProviderLocaleValue(value: unknown): value is ProviderLocaleValue;
@@ -0,0 +1,34 @@
1
+ const PROVIDER_LOCALE_KEY_RE = /^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]+)*(?:\.[a-z][a-z0-9]*(?:[A-Z][a-z0-9]+)*|\.[0-9]+)*$/;
2
+ export function providerLocaleKey(key) {
3
+ assertProviderLocaleKey(key);
4
+ return key;
5
+ }
6
+ export function isProviderLocaleKey(value) {
7
+ return typeof value === "string" && PROVIDER_LOCALE_KEY_RE.test(value);
8
+ }
9
+ export function assertProviderLocaleKey(value) {
10
+ if (!isProviderLocaleKey(value)) {
11
+ throw new Error(`Provider locale key must be a dot path such as "meta.description" or "operations.search.description"; received ${JSON.stringify(value)}`);
12
+ }
13
+ }
14
+ export function qualifyProviderLocaleKey(providerId, key) {
15
+ assertProviderLocaleKey(key);
16
+ return `providers.${providerId}.${key}`;
17
+ }
18
+ export function getProviderLocalePath(catalog, key) {
19
+ assertProviderLocaleKey(key);
20
+ let cursor = catalog;
21
+ for (const segment of key.split(".")) {
22
+ if (!isRecord(cursor))
23
+ return undefined;
24
+ cursor = cursor[segment];
25
+ }
26
+ return isProviderLocaleValue(cursor) ? cursor : undefined;
27
+ }
28
+ export function isProviderLocaleValue(value) {
29
+ return (typeof value === "string" ||
30
+ (Array.isArray(value) && value.every((entry) => typeof entry === "string")));
31
+ }
32
+ function isRecord(value) {
33
+ return typeof value === "object" && value !== null && !Array.isArray(value);
34
+ }
@@ -0,0 +1,41 @@
1
+ export * from "./ceremonies";
2
+ export * from "./choice-token";
3
+ export type { ApiFuseConfig, BrowserConfig, ProxyConfig, SessionConfig, } from "./config/loader";
4
+ export { defineConfig, loadApiFuseConfig } from "./config/loader";
5
+ export { canonicalJson, digestProviderContract, extractProviderContract, type JsonPrimitive, type JsonValue, PROVIDER_CONTRACT_SCHEMA_VERSION, type ProviderContractOperation, type ProviderContractSnapshot, } from "./contract";
6
+ export { defineHealthJourney, defineOperation, defineProvider, defineSmsOtpMatcher, defineStreamOperation, every, type ProviderConfig, } from "./define";
7
+ export type { DevServerOptions } from "./dev";
8
+ export { createDevServer, startDevServer } from "./dev";
9
+ export * from "./errors";
10
+ export * from "./i18n";
11
+ export { type LintDiagnostic, lintOperation, lintProvider, } from "./lint";
12
+ export * from "./recipes/gov-api";
13
+ export * from "./recipes/rest-api";
14
+ export { createFlowContext, createScratchpad } from "./runtime/auth-flow";
15
+ export type { BrowserClientOptions } from "./runtime/browser";
16
+ export { BrowserClient, createBrowserClient } from "./runtime/browser";
17
+ export { createBypassProviderCache, createProviderCache, type ProviderCacheOptions, resetProviderCacheForTests, } from "./runtime/cache";
18
+ export { type CreateProviderChoiceContextOptions, createProviderChoiceContext, createTestProviderChoiceContext, PROVIDER_RUNTIME_CHOICE_TOKEN_MASTER_SECRET_ENV, } from "./runtime/choice";
19
+ export { type CreateCredentialContextOptions, createCredentialContext, } from "./runtime/credential";
20
+ export { createEnvContext } from "./runtime/env";
21
+ export { executeOperation } from "./runtime/executor";
22
+ export { createHttpClient } from "./runtime/http";
23
+ export type { Insight, InsightSeverity } from "./runtime/insights";
24
+ export { generateInsights } from "./runtime/insights";
25
+ export { type InstrumentationOptions, type InstrumentedProviderContext, wrapWithInstrumentation, } from "./runtime/instrumentation";
26
+ export { type PrevalidateResult, prevalidate } from "./runtime/prevalidate";
27
+ export { getProviderBaseUrl } from "./runtime/provider";
28
+ export { createUnsupportedProviderRuntimeState, UnsupportedProviderStateError, } from "./runtime/state";
29
+ export { createStealthClient } from "./runtime/stealth";
30
+ export { APIFUSE__STT__BACKEND_ENV, APIFUSE__STT__CLOUDFLARE_API_TOKEN_ENV, APIFUSE__STT__MODEL_ENV, createSttClientFromEnv, createUnsupportedSttClient, extractVerificationCode, resolveSttPrompt, } from "./runtime/stt";
31
+ export { type CreateTraceContextOptions, createTraceContext, type Span, type TraceContext, } from "./runtime/trace";
32
+ export { APIFUSE_DESCRIPTION_KEY_META_KEY, APIFUSE_REDACTION_MARKER, APIFUSE_SENSITIVE_KIND_META_KEY, APIFUSE_SENSITIVE_META_KEY, collectSensitivePaths, describeKey, field, fields, isSensitiveSchema, redactPayload, type SensitiveFieldKind, type SensitiveFieldOptions, type SensitivePath, sensitive, z, } from "./schema";
33
+ export { createServerApp, type ServeOptions, serve } from "./server";
34
+ export { getStealthProfile, listStealthProfiles } from "./stealth/profiles";
35
+ export * from "./stream";
36
+ export type { ApiFuseResponse, AuthConfig, AuthContext, AuthFlowDefinition, AuthFlowInputHandler, AuthFlowStartHandler, AuthMode, AuthTurn, Bcp47Locale, BrowserEngine, BrowserOptions, ConnectionMode, ContextDeclaration, ContextScratchpad, CredentialContext, CredentialDeclaration, E164PhoneNumber, EnvContext, FlowContext, FlowContextStore, HealthCheckAssertionContext, HealthCheckCase, HealthCheckCaseResult, HealthCheckSuite, HealthCheckUnsupported, HealthJourneyDefinition, HealthJourneyEventContext, HealthJourneyGatewayContext, HealthJourneyJournalContext, HealthJourneyManualTriggerPolicy, HealthJourneyRunContext, HealthJourneyRunResult, HealthJourneySchedule, HealthJourneySmsContext, HealthJourneyStep, HttpClient, HttpMethod, HttpResponse, HttpRetryOptions, HttpRetrySummary, HttpStreamResponse, IanaTimeZone, InferSchemaOutput, Iso3166Alpha2CountryCode, Iso4217CurrencyCode, Iso8601Duration, OperationAnnotations, OperationApprovalPolicy, OperationContractMetadata, OperationDefinition, OperationDeprecationMetadata, OperationDocMeta, OperationErrorCode, OperationHandlerResult, OperationInputExample, OperationLifecycle, OperationObservabilityConfig, OperationObservabilitySensitiveConfig, OperationRelationships, OperationRiskClass, OperationSensitivePath, OperationToolRouterMetadata, OperationTransport, OperationTransportKind, ProbeInterval, ProviderAccessConfig, ProviderAccessVisibility, ProviderCache, ProviderCacheGetOrSetOptions, ProviderCacheKeyOptions, ProviderCacheLookupMeta, ProviderCacheResponseMeta, ProviderCacheResult, ProviderChoiceBindingOptions, ProviderChoiceContext, ProviderChoiceIssueOptions, ProviderChoiceParseOptions, ProviderContext, ProviderDefinition, ProviderHealthMonitorConfig, ProviderLocale, ProviderLocaleKey, ProviderLocaleKeyInput, ProviderLogoProfile, ProviderLogoSource, ProviderMeta, ProviderProxyConfig, ProviderProxyMode, ProviderProxyPolicy, ProviderProxyProvider, ProviderProxySessionAffinity, ProviderPublicConnectionMode, ProviderPublicProfile, ProviderReviewed, ProviderRuntimeState, ProviderSecretDeclaration, ProviderStateDurationString, ProviderStateNamespace, ProviderStreamEvent, ProviderSttConfig, ProviderSttMode, ProviderSupportLevel, RequestOptions, Rfc3339Instant, SchemaLike, SmsOrigin, SmsOtpExtractionPattern, SmsOtpMatcherDefinition, SseMessage, StandardSchemaV1, StateCasResult, StateNamespaceOptions, StateValue, StateWriteOptions, StealthClient, StealthFetchOptions, StealthPlatform, StealthProfile, StealthResponse, StealthSession, SttAudioInput, SttContext, SttPromptPolicy, SttSegment, SttTranscribeMode, SttTranscribeRequest, SttTranscript, SttUnsupportedOptionPolicy, SttUsage, SttVerificationCodeOptions, SttWarning, TraceConfig, TraceSpan, VerificationCodeCandidate, VerificationCodeCandidateSource, VerificationCodeExtractionResult, } from "./types";
37
+ export { DEFAULT_OPERATION_TRANSPORT, HttpRetryAfterPolicy, HttpRetryDelayStrategy, HttpRetryJitter, HttpRetryPreset, HttpRetryUnsafeMethodPolicy, PROBE_INTERVALS, STREAM_CHUNK_BYTES_MAX, STREAM_CHUNK_BYTES_MIN, STREAM_HEARTBEAT_MS_MAX, STREAM_HEARTBEAT_MS_MIN, STREAM_IDLE_TIMEOUT_MS_MAX, STREAM_IDLE_TIMEOUT_MS_MIN, STREAM_MAX_DURATION_MS_MAX, STREAM_MAX_DURATION_MS_MIN, } from "./types";
38
+ export * from "./utils/date";
39
+ export * from "./utils/parse";
40
+ export * from "./utils/text";
41
+ export * from "./utils/transform";
package/dist/index.js ADDED
@@ -0,0 +1,37 @@
1
+ // @apifuse/provider-sdk
2
+ export * from "./ceremonies";
3
+ export * from "./choice-token";
4
+ export { defineConfig, loadApiFuseConfig } from "./config/loader";
5
+ export { canonicalJson, digestProviderContract, extractProviderContract, PROVIDER_CONTRACT_SCHEMA_VERSION, } from "./contract";
6
+ export { defineHealthJourney, defineOperation, defineProvider, defineSmsOtpMatcher, defineStreamOperation, every, } from "./define";
7
+ export { createDevServer, startDevServer } from "./dev";
8
+ export * from "./errors";
9
+ export * from "./i18n";
10
+ export { lintOperation, lintProvider, } from "./lint";
11
+ export * from "./recipes/gov-api";
12
+ export * from "./recipes/rest-api";
13
+ export { createFlowContext, createScratchpad } from "./runtime/auth-flow";
14
+ export { BrowserClient, createBrowserClient } from "./runtime/browser";
15
+ export { createBypassProviderCache, createProviderCache, resetProviderCacheForTests, } from "./runtime/cache";
16
+ export { createProviderChoiceContext, createTestProviderChoiceContext, PROVIDER_RUNTIME_CHOICE_TOKEN_MASTER_SECRET_ENV, } from "./runtime/choice";
17
+ export { createCredentialContext, } from "./runtime/credential";
18
+ export { createEnvContext } from "./runtime/env";
19
+ export { executeOperation } from "./runtime/executor";
20
+ export { createHttpClient } from "./runtime/http";
21
+ export { generateInsights } from "./runtime/insights";
22
+ export { wrapWithInstrumentation, } from "./runtime/instrumentation";
23
+ export { prevalidate } from "./runtime/prevalidate";
24
+ export { getProviderBaseUrl } from "./runtime/provider";
25
+ export { createUnsupportedProviderRuntimeState, UnsupportedProviderStateError, } from "./runtime/state";
26
+ export { createStealthClient } from "./runtime/stealth";
27
+ export { APIFUSE__STT__BACKEND_ENV, APIFUSE__STT__CLOUDFLARE_API_TOKEN_ENV, APIFUSE__STT__MODEL_ENV, createSttClientFromEnv, createUnsupportedSttClient, extractVerificationCode, resolveSttPrompt, } from "./runtime/stt";
28
+ export { createTraceContext, } from "./runtime/trace";
29
+ export { APIFUSE_DESCRIPTION_KEY_META_KEY, APIFUSE_REDACTION_MARKER, APIFUSE_SENSITIVE_KIND_META_KEY, APIFUSE_SENSITIVE_META_KEY, collectSensitivePaths, describeKey, field, fields, isSensitiveSchema, redactPayload, sensitive, z, } from "./schema";
30
+ export { createServerApp, serve } from "./server";
31
+ export { getStealthProfile, listStealthProfiles } from "./stealth/profiles";
32
+ export * from "./stream";
33
+ export { DEFAULT_OPERATION_TRANSPORT, HttpRetryAfterPolicy, HttpRetryDelayStrategy, HttpRetryJitter, HttpRetryPreset, HttpRetryUnsafeMethodPolicy, PROBE_INTERVALS, STREAM_CHUNK_BYTES_MAX, STREAM_CHUNK_BYTES_MIN, STREAM_HEARTBEAT_MS_MAX, STREAM_HEARTBEAT_MS_MIN, STREAM_IDLE_TIMEOUT_MS_MAX, STREAM_IDLE_TIMEOUT_MS_MIN, STREAM_MAX_DURATION_MS_MAX, STREAM_MAX_DURATION_MS_MIN, } from "./types";
34
+ export * from "./utils/date";
35
+ export * from "./utils/parse";
36
+ export * from "./utils/text";
37
+ export * from "./utils/transform";
package/dist/lint.d.ts ADDED
@@ -0,0 +1,73 @@
1
+ type AuthModeLike = "none" | "platform-managed" | "credentials" | "oauth2" | "api-key";
2
+ type ProviderAuthLike = {
3
+ mode?: AuthModeLike;
4
+ flow?: {
5
+ start?: unknown;
6
+ continue?: unknown;
7
+ poll?: unknown;
8
+ abort?: unknown;
9
+ refresh?: unknown;
10
+ };
11
+ };
12
+ type ProviderContractMetaLike = {
13
+ publicSchemaFieldNames?: "normalized";
14
+ };
15
+ export interface LintDiagnostic {
16
+ rule: string;
17
+ level: "error" | "warn";
18
+ message: string;
19
+ field?: string;
20
+ }
21
+ export type ProviderLintMode = "official" | "standalone";
22
+ type ProviderLintOptions = {
23
+ mode?: ProviderLintMode;
24
+ };
25
+ export declare function lintOperation(op: {
26
+ description?: string;
27
+ descriptionKey?: string;
28
+ whenToUse?: readonly string[];
29
+ whenToUseKeys?: readonly string[];
30
+ whenNotToUse?: readonly string[];
31
+ whenNotToUseKeys?: readonly string[];
32
+ input: unknown;
33
+ output: unknown;
34
+ fixtures?: unknown;
35
+ inputExamples?: readonly unknown[];
36
+ derivations?: Record<string, string>;
37
+ }): LintDiagnostic[];
38
+ export declare function lintProvider(provider: {
39
+ id?: string;
40
+ allowedHosts?: readonly string[];
41
+ stealth?: unknown;
42
+ auth?: ProviderAuthLike;
43
+ credential?: {
44
+ keys?: readonly string[];
45
+ storesReusableSecret?: boolean;
46
+ justification?: string;
47
+ };
48
+ context?: {
49
+ keys?: readonly string[];
50
+ };
51
+ authFlowSource?: string;
52
+ providerSourceFiles?: Record<string, string>;
53
+ operations?: Record<string, {
54
+ description?: string;
55
+ descriptionKey?: string;
56
+ whenToUse?: readonly string[];
57
+ whenToUseKeys?: readonly string[];
58
+ whenNotToUse?: readonly string[];
59
+ whenNotToUseKeys?: readonly string[];
60
+ input: unknown;
61
+ output: unknown;
62
+ fixtures?: unknown;
63
+ inputExamples?: readonly unknown[];
64
+ derivations?: Record<string, string>;
65
+ handler?: unknown;
66
+ source?: string;
67
+ }>;
68
+ meta?: {
69
+ contract?: ProviderContractMetaLike;
70
+ };
71
+ reviewed?: string;
72
+ }, options?: ProviderLintOptions): LintDiagnostic[];
73
+ export {};