@apifuse/provider-sdk 2.1.0-beta.6 → 2.1.0-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/bin/apifuse-perf.ts +18 -9
- package/dist/ceremonies/index.d.ts +41 -0
- package/dist/ceremonies/index.js +490 -0
- package/dist/choice-token.d.ts +24 -0
- package/dist/choice-token.js +74 -0
- package/dist/cli/commands.d.ts +10 -0
- package/dist/cli/commands.js +80 -0
- package/dist/cli/create.d.ts +47 -0
- package/dist/cli/create.js +762 -0
- package/dist/config/loader.d.ts +107 -0
- package/dist/config/loader.js +935 -0
- package/dist/contract-json.d.ts +9 -0
- package/dist/contract-json.js +51 -0
- package/dist/contract-serialization.d.ts +4 -0
- package/dist/contract-serialization.js +78 -0
- package/dist/contract-types.d.ts +49 -0
- package/dist/contract-types.js +1 -0
- package/dist/contract.d.ts +6 -0
- package/dist/contract.js +155 -0
- package/dist/define.d.ts +97 -0
- package/dist/define.js +1320 -0
- package/dist/dev.d.ts +9 -0
- package/dist/dev.js +15 -0
- package/dist/errors.d.ts +59 -0
- package/dist/errors.js +97 -0
- package/dist/i18n/catalog.d.ts +29 -0
- package/dist/i18n/catalog.js +159 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.js +2 -0
- package/dist/i18n/keys.d.ts +10 -0
- package/dist/i18n/keys.js +34 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +37 -0
- package/dist/lint.d.ts +73 -0
- package/dist/lint.js +702 -0
- package/dist/observability.d.ts +5 -0
- package/dist/observability.js +39 -0
- package/dist/provider.d.ts +9 -0
- package/dist/provider.js +8 -0
- package/dist/public-schema-field-lint.d.ts +2 -0
- package/dist/public-schema-field-lint.js +158 -0
- package/dist/recipes/gov-api.d.ts +19 -0
- package/dist/recipes/gov-api.js +72 -0
- package/dist/recipes/rest-api.d.ts +21 -0
- package/dist/recipes/rest-api.js +115 -0
- package/dist/runtime/auth-flow.d.ts +14 -0
- package/dist/runtime/auth-flow.js +44 -0
- package/dist/runtime/browser.d.ts +25 -0
- package/dist/runtime/browser.js +1034 -0
- package/dist/runtime/cache.d.ts +10 -0
- package/dist/runtime/cache.js +372 -0
- package/dist/runtime/choice.d.ts +15 -0
- package/dist/runtime/choice.js +435 -0
- package/dist/runtime/credential.d.ts +8 -0
- package/dist/runtime/credential.js +61 -0
- package/dist/runtime/env.d.ts +2 -0
- package/dist/runtime/env.js +10 -0
- package/dist/runtime/executor.d.ts +16 -0
- package/dist/runtime/executor.js +51 -0
- package/dist/runtime/http.d.ts +8 -0
- package/dist/runtime/http.js +706 -0
- package/dist/runtime/insights.d.ts +9 -0
- package/dist/runtime/insights.js +324 -0
- package/dist/runtime/instrumentation.d.ts +8 -0
- package/dist/runtime/instrumentation.js +269 -0
- package/dist/runtime/key-derivation.d.ts +24 -0
- package/dist/runtime/key-derivation.js +73 -0
- package/dist/runtime/keyring.d.ts +25 -0
- package/dist/runtime/keyring.js +93 -0
- package/dist/runtime/namespace.d.ts +9 -0
- package/dist/runtime/namespace.js +19 -0
- package/dist/runtime/otlp.d.ts +39 -0
- package/dist/runtime/otlp.js +103 -0
- package/dist/runtime/perf.d.ts +12 -0
- package/dist/runtime/perf.js +52 -0
- package/dist/runtime/prevalidate.d.ts +12 -0
- package/dist/runtime/prevalidate.js +173 -0
- package/dist/runtime/provider.d.ts +2 -0
- package/dist/runtime/provider.js +11 -0
- package/dist/runtime/proxy-errors.d.ts +21 -0
- package/dist/runtime/proxy-errors.js +83 -0
- package/dist/runtime/proxy-telemetry.d.ts +8 -0
- package/dist/runtime/proxy-telemetry.js +174 -0
- package/dist/runtime/redis.d.ts +17 -0
- package/dist/runtime/redis.js +82 -0
- package/dist/runtime/request-options.d.ts +3 -0
- package/dist/runtime/request-options.js +42 -0
- package/dist/runtime/state.d.ts +17 -0
- package/dist/runtime/state.js +344 -0
- package/dist/runtime/stealth.d.ts +18 -0
- package/dist/runtime/stealth.js +834 -0
- package/dist/runtime/stt.d.ts +22 -0
- package/dist/runtime/stt.js +480 -0
- package/dist/runtime/trace.d.ts +26 -0
- package/dist/runtime/trace.js +142 -0
- package/dist/runtime/waterfall.d.ts +12 -0
- package/dist/runtime/waterfall.js +147 -0
- package/dist/schema.d.ts +74 -0
- package/dist/schema.js +243 -0
- package/dist/serve.d.ts +1 -0
- package/dist/serve.js +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.js +2 -0
- package/dist/server/serve.d.ts +64 -0
- package/dist/server/serve.js +1110 -0
- package/dist/server/types.d.ts +136 -0
- package/dist/server/types.js +86 -0
- package/dist/stealth/profiles.d.ts +4 -0
- package/dist/stealth/profiles.js +259 -0
- package/dist/stream.d.ts +44 -0
- package/dist/stream.js +151 -0
- package/dist/testing/helpers.d.ts +23 -0
- package/dist/testing/helpers.js +95 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.js +2 -0
- package/dist/testing/run.d.ts +34 -0
- package/dist/testing/run.js +303 -0
- package/dist/types.d.ts +1326 -0
- package/dist/types.js +61 -0
- package/dist/utils/date.d.ts +6 -0
- package/dist/utils/date.js +101 -0
- package/dist/utils/parse.d.ts +16 -0
- package/dist/utils/parse.js +51 -0
- package/dist/utils/text.d.ts +4 -0
- package/dist/utils/text.js +14 -0
- package/dist/utils/transform.d.ts +8 -0
- package/dist/utils/transform.js +48 -0
- package/package.json +109 -107
- package/src/runtime/stealth.ts +8 -1
- package/src/types.ts +2 -0
package/dist/types.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export const OPERATION_TIMEOUT_MS_MIN = 1;
|
|
2
|
+
export const OPERATION_TIMEOUT_MS_MAX = 60_000;
|
|
3
|
+
export const STREAM_HEARTBEAT_MS_MIN = 1_000;
|
|
4
|
+
export const STREAM_HEARTBEAT_MS_MAX = 60_000;
|
|
5
|
+
export const STREAM_IDLE_TIMEOUT_MS_MIN = 1_000;
|
|
6
|
+
export const STREAM_IDLE_TIMEOUT_MS_MAX = 300_000;
|
|
7
|
+
export const STREAM_MAX_DURATION_MS_MIN = 1_000;
|
|
8
|
+
export const STREAM_MAX_DURATION_MS_MAX = 1_800_000;
|
|
9
|
+
export const STREAM_CHUNK_BYTES_MIN = 1;
|
|
10
|
+
export const STREAM_CHUNK_BYTES_MAX = 1_048_576;
|
|
11
|
+
export const DEFAULT_OPERATION_TRANSPORT = {
|
|
12
|
+
kind: "json",
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Common probe interval examples retained for discoverability/backwards
|
|
16
|
+
* compatibility. This list is not exhaustive; any positive `ms`-style duration
|
|
17
|
+
* string accepted by `@types/ms` (for example `2m`, `8h`, or `1 day`) is valid.
|
|
18
|
+
*/
|
|
19
|
+
export const PROBE_INTERVALS = [
|
|
20
|
+
"30s",
|
|
21
|
+
"1m",
|
|
22
|
+
"3m",
|
|
23
|
+
"5m",
|
|
24
|
+
"15m",
|
|
25
|
+
"30m",
|
|
26
|
+
"1h",
|
|
27
|
+
"2h",
|
|
28
|
+
"8h",
|
|
29
|
+
"24h",
|
|
30
|
+
];
|
|
31
|
+
export const HEALTH_CHECK_TIMEOUT_MS_MIN = 1;
|
|
32
|
+
export const HEALTH_CHECK_TIMEOUT_MS_MAX = 60_000;
|
|
33
|
+
export const HEALTH_CHECK_DEGRADED_THRESHOLD_MS_MIN = 1;
|
|
34
|
+
export const HEALTH_CHECK_DEGRADED_THRESHOLD_MS_MAX = 60_000;
|
|
35
|
+
export const HttpRetryPreset = {
|
|
36
|
+
Off: "off",
|
|
37
|
+
TransportTransient: "transport_transient",
|
|
38
|
+
SafeRead: "safe_read",
|
|
39
|
+
AggressiveRead: "aggressive_read",
|
|
40
|
+
RateLimitAware: "rate_limit_aware",
|
|
41
|
+
};
|
|
42
|
+
export const HttpRetryJitter = {
|
|
43
|
+
None: "none",
|
|
44
|
+
Full: "full",
|
|
45
|
+
Equal: "equal",
|
|
46
|
+
};
|
|
47
|
+
export const HttpRetryDelayStrategy = {
|
|
48
|
+
Fixed: "fixed",
|
|
49
|
+
Exponential: "exponential",
|
|
50
|
+
};
|
|
51
|
+
export const HttpRetryAfterPolicy = {
|
|
52
|
+
Ignore: "ignore",
|
|
53
|
+
/** Honor Retry-After up to maxDelayMs. */
|
|
54
|
+
Respect: "respect",
|
|
55
|
+
/** Honor Retry-After but also cap it to the SDK-computed backoff delay. */
|
|
56
|
+
Cap: "cap",
|
|
57
|
+
};
|
|
58
|
+
export const HttpRetryUnsafeMethodPolicy = {
|
|
59
|
+
Reject: "reject",
|
|
60
|
+
AllowExplicitUnsafe: "allow_explicit_unsafe",
|
|
61
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Convert various date formats to ISO 8601 string */
|
|
2
|
+
export declare function toISODate(v: unknown, timezone: string): string;
|
|
3
|
+
/** Get today's date as ISO 8601 string in given timezone */
|
|
4
|
+
export declare function today(timezone: string): string;
|
|
5
|
+
/** Get current hour as string in given timezone */
|
|
6
|
+
export declare function currentHour(timezone: string): string;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
function getDateParts(date, timezone) {
|
|
2
|
+
const formatter = new Intl.DateTimeFormat("en-CA", {
|
|
3
|
+
timeZone: timezone,
|
|
4
|
+
hour12: false,
|
|
5
|
+
year: "numeric",
|
|
6
|
+
month: "2-digit",
|
|
7
|
+
day: "2-digit",
|
|
8
|
+
hour: "2-digit",
|
|
9
|
+
minute: "2-digit",
|
|
10
|
+
second: "2-digit",
|
|
11
|
+
});
|
|
12
|
+
const parts = Object.fromEntries(formatter.formatToParts(date).map((part) => [part.type, part.value]));
|
|
13
|
+
return {
|
|
14
|
+
year: parts.year,
|
|
15
|
+
month: parts.month,
|
|
16
|
+
day: parts.day,
|
|
17
|
+
hour: parts.hour,
|
|
18
|
+
minute: parts.minute,
|
|
19
|
+
second: parts.second,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function getTimezoneOffsetMinutes(date, timezone) {
|
|
23
|
+
const parts = getDateParts(date, timezone);
|
|
24
|
+
const asUTC = Date.UTC(Number(parts.year), Number(parts.month) - 1, Number(parts.day), Number(parts.hour), Number(parts.minute), Number(parts.second));
|
|
25
|
+
return (asUTC - date.getTime()) / 60000;
|
|
26
|
+
}
|
|
27
|
+
function buildUtcInstantFromLocalParts(year, month, day, hour, minute, second, timezone) {
|
|
28
|
+
const guess = Date.UTC(year, month - 1, day, hour, minute, second);
|
|
29
|
+
let utc = guess;
|
|
30
|
+
for (let i = 0; i < 2; i += 1) {
|
|
31
|
+
const offset = getTimezoneOffsetMinutes(new Date(utc), timezone);
|
|
32
|
+
const nextUtc = guess - offset * 60_000;
|
|
33
|
+
if (nextUtc === utc) {
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
utc = nextUtc;
|
|
37
|
+
}
|
|
38
|
+
return new Date(utc);
|
|
39
|
+
}
|
|
40
|
+
function formatOffset(offsetMinutes) {
|
|
41
|
+
const sign = offsetMinutes >= 0 ? "+" : "-";
|
|
42
|
+
const abs = Math.abs(offsetMinutes);
|
|
43
|
+
const hours = String(Math.floor(abs / 60)).padStart(2, "0");
|
|
44
|
+
const minutes = String(abs % 60).padStart(2, "0");
|
|
45
|
+
return `${sign}${hours}:${minutes}`;
|
|
46
|
+
}
|
|
47
|
+
function formatIso(date, timezone) {
|
|
48
|
+
const parts = getDateParts(date, timezone);
|
|
49
|
+
const offset = getTimezoneOffsetMinutes(date, timezone);
|
|
50
|
+
return `${parts.year}-${parts.month}-${parts.day}T${parts.hour}:${parts.minute}:${parts.second}${formatOffset(offset)}`;
|
|
51
|
+
}
|
|
52
|
+
function parseDateValue(v, timezone) {
|
|
53
|
+
if (v instanceof Date) {
|
|
54
|
+
return Number.isNaN(v.getTime()) ? null : v;
|
|
55
|
+
}
|
|
56
|
+
if (typeof v === "number") {
|
|
57
|
+
const date = new Date(v);
|
|
58
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
59
|
+
}
|
|
60
|
+
if (typeof v !== "string") {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const value = v.trim();
|
|
64
|
+
if (value === "") {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const compactDate = /^(\d{4})(\d{2})(\d{2})$/;
|
|
68
|
+
const compactDateTime = /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})?$/;
|
|
69
|
+
const dashedDate = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
70
|
+
let match = value.match(compactDateTime);
|
|
71
|
+
if (match) {
|
|
72
|
+
const [, year, month, day, hour, minute, second = "00"] = match;
|
|
73
|
+
return buildUtcInstantFromLocalParts(Number(year), Number(month), Number(day), Number(hour), Number(minute), Number(second), timezone);
|
|
74
|
+
}
|
|
75
|
+
match = value.match(compactDate);
|
|
76
|
+
if (match) {
|
|
77
|
+
const [, year, month, day] = match;
|
|
78
|
+
return buildUtcInstantFromLocalParts(Number(year), Number(month), Number(day), 0, 0, 0, timezone);
|
|
79
|
+
}
|
|
80
|
+
match = value.match(dashedDate);
|
|
81
|
+
if (match) {
|
|
82
|
+
const [, year, month, day] = match;
|
|
83
|
+
return buildUtcInstantFromLocalParts(Number(year), Number(month), Number(day), 0, 0, 0, timezone);
|
|
84
|
+
}
|
|
85
|
+
const parsed = new Date(value);
|
|
86
|
+
return Number.isNaN(parsed.getTime()) ? null : parsed;
|
|
87
|
+
}
|
|
88
|
+
/** Convert various date formats to ISO 8601 string */
|
|
89
|
+
export function toISODate(v, timezone) {
|
|
90
|
+
const date = parseDateValue(v, timezone);
|
|
91
|
+
return date ? formatIso(date, timezone) : "";
|
|
92
|
+
}
|
|
93
|
+
/** Get today's date as ISO 8601 string in given timezone */
|
|
94
|
+
export function today(timezone) {
|
|
95
|
+
const parts = getDateParts(new Date(), timezone);
|
|
96
|
+
return `${parts.year}-${parts.month}-${parts.day}`;
|
|
97
|
+
}
|
|
98
|
+
/** Get current hour as string in given timezone */
|
|
99
|
+
export function currentHour(timezone) {
|
|
100
|
+
return getDateParts(new Date(), timezone).hour;
|
|
101
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unwrap nested envelope by dot-path
|
|
3
|
+
* e.g., unwrapEnvelope({response: {body: {items: [...]}}}, 'response.body.items')
|
|
4
|
+
*/
|
|
5
|
+
export declare function unwrapEnvelope(data: unknown, path?: string): unknown;
|
|
6
|
+
/**
|
|
7
|
+
* Pivot array by field — generalized version of pivotByCategory
|
|
8
|
+
* e.g., pivotByField([{type:'A', val:1},{type:'B', val:2}], 'type', 'val')
|
|
9
|
+
* → { A: 1, B: 2 }
|
|
10
|
+
*/
|
|
11
|
+
export declare function pivotByField(items: unknown[], keyField: string, valueField: string): Record<string, unknown>;
|
|
12
|
+
/**
|
|
13
|
+
* Parse XML items from string — returns array
|
|
14
|
+
* Uses simple regex (no DOM), suitable for structured XML
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseXmlItems(xml: string, tag: string): string[];
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unwrap nested envelope by dot-path
|
|
3
|
+
* e.g., unwrapEnvelope({response: {body: {items: [...]}}}, 'response.body.items')
|
|
4
|
+
*/
|
|
5
|
+
export function unwrapEnvelope(data, path) {
|
|
6
|
+
if (!path || path.trim() === "") {
|
|
7
|
+
return data;
|
|
8
|
+
}
|
|
9
|
+
const segments = path.split(".").filter(Boolean);
|
|
10
|
+
let current = data;
|
|
11
|
+
for (const segment of segments) {
|
|
12
|
+
if (!current || typeof current !== "object") {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
current = current[segment];
|
|
16
|
+
}
|
|
17
|
+
return current;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Pivot array by field — generalized version of pivotByCategory
|
|
21
|
+
* e.g., pivotByField([{type:'A', val:1},{type:'B', val:2}], 'type', 'val')
|
|
22
|
+
* → { A: 1, B: 2 }
|
|
23
|
+
*/
|
|
24
|
+
export function pivotByField(items, keyField, valueField) {
|
|
25
|
+
const result = {};
|
|
26
|
+
for (const item of items) {
|
|
27
|
+
if (!item || typeof item !== "object") {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const record = item;
|
|
31
|
+
const key = record[keyField];
|
|
32
|
+
const value = record[valueField];
|
|
33
|
+
if (key === undefined || key === null || value === undefined) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
result[String(key)] = value;
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Parse XML items from string — returns array
|
|
42
|
+
* Uses simple regex (no DOM), suitable for structured XML
|
|
43
|
+
*/
|
|
44
|
+
export function parseXmlItems(xml, tag) {
|
|
45
|
+
const matches = [
|
|
46
|
+
...xml.matchAll(new RegExp(`<${tag}[^>]*>([\\s\\S]*?)</${tag}>`, "gi")),
|
|
47
|
+
];
|
|
48
|
+
return matches
|
|
49
|
+
.map((match) => match[1].replace(/<[^>]+>/g, "").trim())
|
|
50
|
+
.filter((item) => item.length > 0);
|
|
51
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Remove HTML tags from string */
|
|
2
|
+
export function stripHtml(html) {
|
|
3
|
+
return html
|
|
4
|
+
.replace(/<[^>]*>/g, "")
|
|
5
|
+
.replace(/\s+/g, " ")
|
|
6
|
+
.trim();
|
|
7
|
+
}
|
|
8
|
+
/** Truncate string to maxLength with optional suffix */
|
|
9
|
+
export function truncate(str, maxLength, suffix = "...") {
|
|
10
|
+
if (str.length <= maxLength) {
|
|
11
|
+
return str;
|
|
12
|
+
}
|
|
13
|
+
return `${str.slice(0, maxLength)}${suffix}`;
|
|
14
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Parse any value to number (returns 0 if not parseable) */
|
|
2
|
+
export declare function toNumber(v: unknown): number;
|
|
3
|
+
/** Parse any value to float */
|
|
4
|
+
export declare function toFloat(v: unknown, decimals?: number): number;
|
|
5
|
+
/** Parse any value to integer */
|
|
6
|
+
export declare function toInt(v: unknown): number;
|
|
7
|
+
/** Parse any value to boolean (handles "true", "1", "yes", true, 1) */
|
|
8
|
+
export declare function toBoolean(v: unknown): boolean;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** Parse any value to number (returns 0 if not parseable) */
|
|
2
|
+
export function toNumber(v) {
|
|
3
|
+
if (typeof v === "number") {
|
|
4
|
+
return Number.isFinite(v) ? v : 0;
|
|
5
|
+
}
|
|
6
|
+
if (typeof v === "boolean") {
|
|
7
|
+
return v ? 1 : 0;
|
|
8
|
+
}
|
|
9
|
+
if (typeof v === "string") {
|
|
10
|
+
const cleaned = v.replaceAll(",", "").trim();
|
|
11
|
+
if (cleaned === "") {
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
14
|
+
const parsed = Number(cleaned);
|
|
15
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
16
|
+
}
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
/** Parse any value to float */
|
|
20
|
+
export function toFloat(v, decimals) {
|
|
21
|
+
const parsed = toNumber(v);
|
|
22
|
+
if (!Number.isFinite(parsed)) {
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
if (decimals === undefined) {
|
|
26
|
+
return parsed;
|
|
27
|
+
}
|
|
28
|
+
const factor = 10 ** decimals;
|
|
29
|
+
return Math.round(parsed * factor) / factor;
|
|
30
|
+
}
|
|
31
|
+
/** Parse any value to integer */
|
|
32
|
+
export function toInt(v) {
|
|
33
|
+
return Math.round(toNumber(v));
|
|
34
|
+
}
|
|
35
|
+
/** Parse any value to boolean (handles "true", "1", "yes", true, 1) */
|
|
36
|
+
export function toBoolean(v) {
|
|
37
|
+
if (typeof v === "boolean") {
|
|
38
|
+
return v;
|
|
39
|
+
}
|
|
40
|
+
if (typeof v === "number") {
|
|
41
|
+
return v === 1;
|
|
42
|
+
}
|
|
43
|
+
if (typeof v === "string") {
|
|
44
|
+
const normalized = v.trim().toLowerCase();
|
|
45
|
+
return ["true", "1", "yes", "y"].includes(normalized);
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
package/package.json
CHANGED
|
@@ -1,109 +1,111 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
2
|
+
"name": "@apifuse/provider-sdk",
|
|
3
|
+
"version": "2.1.0-beta.9",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "APIFuse Provider SDK — Build providers with zero architectural constraints",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"publishConfig": {
|
|
11
|
+
"access": "public"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"src",
|
|
16
|
+
"!src/__tests__",
|
|
17
|
+
"!src/__tests__/**",
|
|
18
|
+
"!src/**/*.test.ts",
|
|
19
|
+
"!src/index.test.ts",
|
|
20
|
+
"bin",
|
|
21
|
+
"README.md",
|
|
22
|
+
"AUTHORING.md",
|
|
23
|
+
"CHANGELOG.md",
|
|
24
|
+
"SUBMISSION.md"
|
|
25
|
+
],
|
|
26
|
+
"keywords": [
|
|
27
|
+
"apifuse",
|
|
28
|
+
"provider",
|
|
29
|
+
"sdk",
|
|
30
|
+
"api",
|
|
31
|
+
"zod",
|
|
32
|
+
"hono"
|
|
33
|
+
],
|
|
34
|
+
"bin": {
|
|
35
|
+
"apifuse": "./bin/apifuse.ts"
|
|
36
|
+
},
|
|
37
|
+
"exports": {
|
|
38
|
+
".": {
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"import": "./dist/index.js",
|
|
41
|
+
"default": "./dist/index.js"
|
|
42
|
+
},
|
|
43
|
+
"./provider": {
|
|
44
|
+
"types": "./dist/provider.d.ts",
|
|
45
|
+
"import": "./dist/provider.js",
|
|
46
|
+
"default": "./dist/provider.js"
|
|
47
|
+
},
|
|
48
|
+
"./contract": {
|
|
49
|
+
"types": "./dist/contract.d.ts",
|
|
50
|
+
"import": "./dist/contract.js",
|
|
51
|
+
"default": "./dist/contract.js"
|
|
52
|
+
},
|
|
53
|
+
"./server": {
|
|
54
|
+
"types": "./dist/server/index.d.ts",
|
|
55
|
+
"import": "./dist/server/index.js",
|
|
56
|
+
"default": "./dist/server/index.js"
|
|
57
|
+
},
|
|
58
|
+
"./testing": {
|
|
59
|
+
"types": "./dist/testing/index.d.ts",
|
|
60
|
+
"import": "./dist/testing/index.js",
|
|
61
|
+
"default": "./dist/testing/index.js"
|
|
62
|
+
},
|
|
63
|
+
"./create": {
|
|
64
|
+
"types": "./dist/cli/create.d.ts",
|
|
65
|
+
"import": "./dist/cli/create.js",
|
|
66
|
+
"default": "./dist/cli/create.js"
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"scripts": {
|
|
70
|
+
"lint": "biome lint .",
|
|
71
|
+
"lint:fix": "biome lint --write",
|
|
72
|
+
"format": "biome format --write",
|
|
73
|
+
"type-check": "tsgo --noEmit",
|
|
74
|
+
"test": "bun test",
|
|
75
|
+
"check": "bun run lint && bun run type-check && bun run build",
|
|
76
|
+
"pack:check": "bun run build && bun bin/apifuse-pack-check.ts",
|
|
77
|
+
"pack:smoke": "bun run build && bun bin/apifuse-pack-smoke.ts",
|
|
78
|
+
"release:guard": "bun scripts/guard-release-pr.ts",
|
|
79
|
+
"format:check": "biome format .",
|
|
80
|
+
"build": "tsgo -p tsconfig.build.json"
|
|
81
|
+
},
|
|
82
|
+
"devDependencies": {
|
|
83
|
+
"@biomejs/biome": "^2.5.0",
|
|
84
|
+
"@types/bun": "latest",
|
|
85
|
+
"@types/node": "^25.9.3",
|
|
86
|
+
"@typescript/native-preview": "7.0.0-dev.20260419.1"
|
|
87
|
+
},
|
|
88
|
+
"dependencies": {
|
|
89
|
+
"@clack/prompts": "^1.5.1",
|
|
90
|
+
"@types/ms": "^2.1.0",
|
|
91
|
+
"ajv": "^8.17",
|
|
92
|
+
"hono": "^4.12.25",
|
|
93
|
+
"impit": "0.14.1",
|
|
94
|
+
"ioredis": "^5.11.1",
|
|
95
|
+
"ms": "^2.1.3",
|
|
96
|
+
"playwright": "^1.55.1",
|
|
97
|
+
"playwright-extra": "^4.3.6",
|
|
98
|
+
"puppeteer-extra-plugin-stealth": "^2.11.2",
|
|
99
|
+
"re2-wasm": "^1.0",
|
|
100
|
+
"safe-regex": "^2.1",
|
|
101
|
+
"zod": "^4.4.3"
|
|
102
|
+
},
|
|
103
|
+
"repository": {
|
|
104
|
+
"type": "git",
|
|
105
|
+
"url": "git+https://github.com/APIFuseHQ/provider-sdk.git"
|
|
106
|
+
},
|
|
107
|
+
"bugs": {
|
|
108
|
+
"url": "https://github.com/APIFuseHQ/provider-sdk/issues"
|
|
109
|
+
},
|
|
110
|
+
"homepage": "https://github.com/APIFuseHQ/provider-sdk#readme"
|
|
109
111
|
}
|
package/src/runtime/stealth.ts
CHANGED
|
@@ -340,7 +340,8 @@ export async function normalizeResponse(
|
|
|
340
340
|
const cookies = new CookieJarImpl(
|
|
341
341
|
setCookieHeadersFromResponse(response.headers),
|
|
342
342
|
);
|
|
343
|
-
const
|
|
343
|
+
const bodyBytes = await response.arrayBuffer();
|
|
344
|
+
const body = new TextDecoder().decode(bodyBytes);
|
|
344
345
|
|
|
345
346
|
return {
|
|
346
347
|
status: response.status,
|
|
@@ -352,6 +353,12 @@ export async function normalizeResponse(
|
|
|
352
353
|
json<T>(): Promise<T> {
|
|
353
354
|
return Promise.resolve(JSON.parse(body));
|
|
354
355
|
},
|
|
356
|
+
arrayBuffer(): Promise<ArrayBuffer> {
|
|
357
|
+
return Promise.resolve(bodyBytes.slice(0));
|
|
358
|
+
},
|
|
359
|
+
bytes(): Promise<Uint8Array> {
|
|
360
|
+
return Promise.resolve(new Uint8Array(bodyBytes.slice(0)));
|
|
361
|
+
},
|
|
355
362
|
};
|
|
356
363
|
}
|
|
357
364
|
|
package/src/types.ts
CHANGED
|
@@ -1015,6 +1015,8 @@ export interface DeclarativeStealthResponse {
|
|
|
1015
1015
|
tlsInfo?: { protocol?: string; cipher?: string; [key: string]: unknown };
|
|
1016
1016
|
cookies: CookieJar;
|
|
1017
1017
|
json<T>(): Promise<T>;
|
|
1018
|
+
arrayBuffer(): Promise<ArrayBuffer>;
|
|
1019
|
+
bytes(): Promise<Uint8Array>;
|
|
1018
1020
|
}
|
|
1019
1021
|
|
|
1020
1022
|
export type StealthResponse = DeclarativeStealthResponse;
|