assistant-cloud 0.1.9 → 0.1.10
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/AssistantCloudAuthStrategy.js +1 -1
- package/dist/AssistantCloudAuthStrategy.js.map +1 -1
- package/dist/AssistantCloudRuns.js +1 -1
- package/dist/AssistantCloudRuns.js.map +1 -1
- package/dist/tests/setup.js +44 -42
- package/dist/tests/setup.js.map +1 -1
- package/package.json +5 -6
- package/src/AssistantCloudAuthStrategy.tsx +1 -1
- package/src/AssistantCloudRuns.tsx +1 -1
|
@@ -18,7 +18,7 @@ var getJwtExpiry = (jwt) => {
|
|
|
18
18
|
}
|
|
19
19
|
return exp * 1e3;
|
|
20
20
|
} catch (error) {
|
|
21
|
-
throw new Error(
|
|
21
|
+
throw new Error(`Unable to determine the token expiry: ${error}`);
|
|
22
22
|
}
|
|
23
23
|
};
|
|
24
24
|
var AssistantCloudJWTAuthStrategy = class {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AssistantCloudAuthStrategy.tsx"],"sourcesContent":["export type AssistantCloudAuthStrategy = {\n readonly strategy: \"anon\" | \"jwt\" | \"api-key\";\n getAuthHeaders(): Promise<Record<string, string> | false>;\n readAuthHeaders(headers: Headers): void;\n};\n\nconst getJwtExpiry = (jwt: string): number => {\n try {\n const parts = jwt.split(\".\");\n const bodyPart = parts[1];\n if (!bodyPart) {\n throw new Error(\"Invalid JWT format\");\n }\n\n // Convert from Base64Url to Base64 and add padding if necessary\n let base64 = bodyPart.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (base64.length % 4 !== 0) {\n base64 += \"=\";\n }\n\n // Decode the Base64 string and parse the payload\n const payload = atob(base64);\n const payloadObj = JSON.parse(payload);\n const exp = payloadObj.exp;\n\n if (!exp || typeof exp !== \"number\") {\n throw new Error('JWT does not contain a valid \"exp\" field');\n }\n\n // Convert expiration time to milliseconds\n return exp * 1000;\n } catch (error) {\n throw new Error(
|
|
1
|
+
{"version":3,"sources":["../src/AssistantCloudAuthStrategy.tsx"],"sourcesContent":["export type AssistantCloudAuthStrategy = {\n readonly strategy: \"anon\" | \"jwt\" | \"api-key\";\n getAuthHeaders(): Promise<Record<string, string> | false>;\n readAuthHeaders(headers: Headers): void;\n};\n\nconst getJwtExpiry = (jwt: string): number => {\n try {\n const parts = jwt.split(\".\");\n const bodyPart = parts[1];\n if (!bodyPart) {\n throw new Error(\"Invalid JWT format\");\n }\n\n // Convert from Base64Url to Base64 and add padding if necessary\n let base64 = bodyPart.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (base64.length % 4 !== 0) {\n base64 += \"=\";\n }\n\n // Decode the Base64 string and parse the payload\n const payload = atob(base64);\n const payloadObj = JSON.parse(payload);\n const exp = payloadObj.exp;\n\n if (!exp || typeof exp !== \"number\") {\n throw new Error('JWT does not contain a valid \"exp\" field');\n }\n\n // Convert expiration time to milliseconds\n return exp * 1000;\n } catch (error) {\n throw new Error(`Unable to determine the token expiry: ${error}`);\n }\n};\n\nexport class AssistantCloudJWTAuthStrategy\n implements AssistantCloudAuthStrategy\n{\n public readonly strategy = \"jwt\";\n\n private cachedToken: string | null = null;\n private tokenExpiry: number | null = null;\n #authTokenCallback: () => Promise<string | null>;\n\n constructor(authTokenCallback: () => Promise<string | null>) {\n this.#authTokenCallback = authTokenCallback;\n }\n\n public async getAuthHeaders(): Promise<Record<string, string> | false> {\n const currentTime = Date.now();\n\n // Use cached token if it's valid for at least 30 more seconds\n if (\n this.cachedToken &&\n this.tokenExpiry &&\n this.tokenExpiry - currentTime > 30 * 1000\n ) {\n return { Authorization: `Bearer ${this.cachedToken}` };\n }\n\n // Fetch a new token via the callback\n const newToken = await this.#authTokenCallback();\n if (!newToken) return false;\n\n this.cachedToken = newToken;\n this.tokenExpiry = getJwtExpiry(newToken);\n\n return { Authorization: `Bearer ${newToken}` };\n }\n\n public readAuthHeaders(headers: Headers) {\n const authHeader = headers.get(\"Authorization\");\n if (!authHeader) return;\n\n const [scheme, token] = authHeader.split(\" \");\n if (scheme !== \"Bearer\" || !token) {\n throw new Error(\"Invalid auth header received\");\n }\n\n this.cachedToken = token;\n this.tokenExpiry = getJwtExpiry(token);\n }\n}\n\nexport class AssistantCloudAPIKeyAuthStrategy\n implements AssistantCloudAuthStrategy\n{\n public readonly strategy = \"api-key\";\n\n #apiKey: string;\n #userId: string;\n #workspaceId: string;\n\n constructor(apiKey: string, userId: string, workspaceId: string) {\n this.#apiKey = apiKey;\n this.#userId = userId;\n this.#workspaceId = workspaceId;\n }\n\n public async getAuthHeaders(): Promise<Record<string, string>> {\n return {\n Authorization: `Bearer ${this.#apiKey}`,\n \"Aui-User-Id\": this.#userId,\n \"Aui-Workspace-Id\": this.#workspaceId,\n };\n }\n\n public readAuthHeaders() {\n // No operation needed for API key auth\n }\n}\n\nconst AUI_REFRESH_TOKEN_NAME = \"aui:refresh_token\";\n\nexport class AssistantCloudAnonymousAuthStrategy\n implements AssistantCloudAuthStrategy\n{\n public readonly strategy = \"anon\";\n\n private baseUrl: string;\n private jwtStrategy: AssistantCloudJWTAuthStrategy;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl;\n this.jwtStrategy = new AssistantCloudJWTAuthStrategy(async () => {\n const currentTime = Date.now();\n const storedRefreshTokenJson = localStorage.getItem(\n AUI_REFRESH_TOKEN_NAME,\n );\n const storedRefreshToken = storedRefreshTokenJson\n ? (JSON.parse(storedRefreshTokenJson) as {\n token: string;\n expires_at: string;\n })\n : undefined;\n\n if (storedRefreshToken) {\n const refreshExpiry = new Date(storedRefreshToken.expires_at).getTime();\n if (refreshExpiry - currentTime > 30 * 1000) {\n const response = await fetch(\n `${this.baseUrl}/v1/auth/tokens/refresh`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refresh_token: storedRefreshToken.token }),\n },\n );\n\n if (response.ok) {\n const data = await response.json();\n const { access_token, refresh_token } = data;\n if (refresh_token) {\n localStorage.setItem(\n AUI_REFRESH_TOKEN_NAME,\n JSON.stringify(refresh_token),\n );\n }\n return access_token;\n }\n } else {\n localStorage.removeItem(AUI_REFRESH_TOKEN_NAME);\n }\n }\n\n // No valid refresh token; request a new anonymous token\n const response = await fetch(`${this.baseUrl}/v1/auth/tokens/anonymous`, {\n method: \"POST\",\n });\n\n if (!response.ok) return null;\n\n const data = await response.json();\n const { access_token, refresh_token } = data;\n\n if (!access_token || !refresh_token) return null;\n\n localStorage.setItem(\n AUI_REFRESH_TOKEN_NAME,\n JSON.stringify(refresh_token),\n );\n return access_token;\n });\n }\n\n public async getAuthHeaders(): Promise<Record<string, string> | false> {\n return this.jwtStrategy.getAuthHeaders();\n }\n\n public readAuthHeaders(headers: Headers): void {\n this.jwtStrategy.readAuthHeaders(headers);\n }\n}\n"],"mappings":"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","names":["response","data","access_token","refresh_token"]}
|
|
@@ -6,7 +6,7 @@ var AssistantCloudRuns = class {
|
|
|
6
6
|
}
|
|
7
7
|
__internal_getAssistantOptions(assistantId) {
|
|
8
8
|
return {
|
|
9
|
-
api: this.cloud._baseUrl
|
|
9
|
+
api: `${this.cloud._baseUrl}/v1/runs/stream`,
|
|
10
10
|
headers: async () => {
|
|
11
11
|
const headers = await this.cloud._auth.getAuthHeaders();
|
|
12
12
|
if (!headers) throw new Error("Authorization failed");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AssistantCloudRuns.tsx"],"sourcesContent":["import { AssistantCloudAPI } from \"./AssistantCloudAPI\";\nimport { AssistantStream, PlainTextDecoder } from \"assistant-stream\";\n\ntype AssistantCloudRunsStreamBody = {\n thread_id: string;\n assistant_id: \"system/thread_title\";\n messages: readonly unknown[]; // TODO type\n};\n\nexport class AssistantCloudRuns {\n constructor(private cloud: AssistantCloudAPI) {}\n\n public __internal_getAssistantOptions(assistantId: string) {\n return {\n api: this.cloud._baseUrl
|
|
1
|
+
{"version":3,"sources":["../src/AssistantCloudRuns.tsx"],"sourcesContent":["import { AssistantCloudAPI } from \"./AssistantCloudAPI\";\nimport { AssistantStream, PlainTextDecoder } from \"assistant-stream\";\n\ntype AssistantCloudRunsStreamBody = {\n thread_id: string;\n assistant_id: \"system/thread_title\";\n messages: readonly unknown[]; // TODO type\n};\n\nexport class AssistantCloudRuns {\n constructor(private cloud: AssistantCloudAPI) {}\n\n public __internal_getAssistantOptions(assistantId: string) {\n return {\n api: `${this.cloud._baseUrl}/v1/runs/stream`,\n headers: async () => {\n const headers = await this.cloud._auth.getAuthHeaders();\n if (!headers) throw new Error(\"Authorization failed\");\n return {\n ...headers,\n Accept: \"text/plain\",\n };\n },\n body: {\n assistant_id: assistantId,\n response_format: \"vercel-ai-data-stream/v1\",\n thread_id: \"unstable_todo\",\n },\n };\n }\n\n public async stream(\n body: AssistantCloudRunsStreamBody,\n ): Promise<AssistantStream> {\n const response = await this.cloud.makeRawRequest(\"/runs/stream\", {\n method: \"POST\",\n headers: {\n Accept: \"text/plain\",\n },\n body,\n });\n return AssistantStream.fromResponse(response, new PlainTextDecoder());\n }\n}\n"],"mappings":";AACA,SAAS,iBAAiB,wBAAwB;AAQ3C,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAAoB,OAA0B;AAA1B;AAAA,EAA2B;AAAA,EAExC,+BAA+B,aAAqB;AACzD,WAAO;AAAA,MACL,KAAK,GAAG,KAAK,MAAM,QAAQ;AAAA,MAC3B,SAAS,YAAY;AACnB,cAAM,UAAU,MAAM,KAAK,MAAM,MAAM,eAAe;AACtD,YAAI,CAAC,QAAS,OAAM,IAAI,MAAM,sBAAsB;AACpD,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,OACX,MAC0B;AAC1B,UAAM,WAAW,MAAM,KAAK,MAAM,eAAe,gBAAgB;AAAA,MAC/D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO,gBAAgB,aAAa,UAAU,IAAI,iBAAiB,CAAC;AAAA,EACtE;AACF;","names":[]}
|
package/dist/tests/setup.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
// ../../node_modules/.pnpm/vitest@4.0.
|
|
1
|
+
// ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@24.10.1_@vitest+ui@4.0.15_jiti@2.6.1_1316c7438d8db3eab2efa08f08502397/node_modules/vitest/dist/chunks/vi.2VT5v0um.js
|
|
2
2
|
import { chai, equals, iterableEquality, subsetEquality, JestExtend, JestChaiExpect, JestAsymmetricMatchers, GLOBAL_EXPECT, ASYMMETRIC_MATCHERS_OBJECT, getState, setState, addCustomEqualityTesters, customMatchers } from "@vitest/expect.js";
|
|
3
3
|
import { getCurrentTest } from "@vitest/runner.js";
|
|
4
|
-
import { getNames, getTestName } from "@vitest/runner/utils.js";
|
|
5
4
|
|
|
6
|
-
// ../../node_modules/.pnpm/vitest@4.0.
|
|
5
|
+
// ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@24.10.1_@vitest+ui@4.0.15_jiti@2.6.1_1316c7438d8db3eab2efa08f08502397/node_modules/vitest/dist/chunks/utils.DvEY5TfP.js
|
|
7
6
|
import { getSafeTimers } from "@vitest/utils/timers.js";
|
|
8
7
|
var NAME_WORKER_STATE = "__vitest_worker__";
|
|
9
8
|
function getWorkerState() {
|
|
@@ -44,8 +43,9 @@ async function waitForImportsToResolve() {
|
|
|
44
43
|
await waitForImportsToResolve();
|
|
45
44
|
}
|
|
46
45
|
|
|
47
|
-
// ../../node_modules/.pnpm/vitest@4.0.
|
|
48
|
-
import { getSafeTimers as getSafeTimers2 } from "@vitest/utils/timers.js";
|
|
46
|
+
// ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@24.10.1_@vitest+ui@4.0.15_jiti@2.6.1_1316c7438d8db3eab2efa08f08502397/node_modules/vitest/dist/chunks/vi.2VT5v0um.js
|
|
47
|
+
import { getSafeTimers as getSafeTimers2, delay } from "@vitest/utils/timers.js";
|
|
48
|
+
import { getNames } from "@vitest/runner/utils.js";
|
|
49
49
|
import { stripSnapshotIndentation, addSerializer, SnapshotClient } from "@vitest/snapshot.js";
|
|
50
50
|
import "@vitest/utils/error.js";
|
|
51
51
|
import { assertTypes, createSimpleStackTrace } from "@vitest/utils/helpers.js";
|
|
@@ -53,10 +53,10 @@ import { fn, spyOn, restoreAllMocks, resetAllMocks, clearAllMocks, isMockFunctio
|
|
|
53
53
|
import "@vitest/utils/offset.js";
|
|
54
54
|
import { parseSingleStack } from "@vitest/utils/source-map.js";
|
|
55
55
|
|
|
56
|
-
// ../../node_modules/.pnpm/vitest@4.0.
|
|
56
|
+
// ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@24.10.1_@vitest+ui@4.0.15_jiti@2.6.1_1316c7438d8db3eab2efa08f08502397/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js
|
|
57
57
|
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
|
|
58
58
|
|
|
59
|
-
// ../../node_modules/.pnpm/vitest@4.0.
|
|
59
|
+
// ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@24.10.1_@vitest+ui@4.0.15_jiti@2.6.1_1316c7438d8db3eab2efa08f08502397/node_modules/vitest/dist/chunks/date.Bq6ZW5rf.js
|
|
60
60
|
var RealDate = Date;
|
|
61
61
|
var now = null;
|
|
62
62
|
var MockDate = class _MockDate extends RealDate {
|
|
@@ -104,7 +104,7 @@ function resetDate() {
|
|
|
104
104
|
globalThis.Date = RealDate;
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
// ../../node_modules/.pnpm/vitest@4.0.
|
|
107
|
+
// ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@24.10.1_@vitest+ui@4.0.15_jiti@2.6.1_1316c7438d8db3eab2efa08f08502397/node_modules/vitest/dist/chunks/vi.2VT5v0um.js
|
|
108
108
|
var unsupported = [
|
|
109
109
|
"matchSnapshot",
|
|
110
110
|
"toMatchSnapshot",
|
|
@@ -117,6 +117,10 @@ var unsupported = [
|
|
|
117
117
|
"toThrow",
|
|
118
118
|
"toThrowError"
|
|
119
119
|
];
|
|
120
|
+
function throwWithCause(error, source) {
|
|
121
|
+
if (error.cause == null) error.cause = /* @__PURE__ */ new Error("Matcher did not succeed in time.");
|
|
122
|
+
throw copyStackTrace$1(error, source);
|
|
123
|
+
}
|
|
120
124
|
function createExpectPoll(expect) {
|
|
121
125
|
return function poll(fn2, options = {}) {
|
|
122
126
|
const defaults = getWorkerState().config.expect?.poll ?? {};
|
|
@@ -132,35 +136,33 @@ function createExpectPoll(expect) {
|
|
|
132
136
|
if (typeof key === "string" && unsupported.includes(key)) throw new SyntaxError(`expect.poll() is not supported in combination with .${key}(). Use vi.waitFor() if your assertion condition is unstable.`);
|
|
133
137
|
return function(...args) {
|
|
134
138
|
const STACK_TRACE_ERROR = /* @__PURE__ */ new Error("STACK_TRACE_ERROR");
|
|
135
|
-
const promise =
|
|
136
|
-
let intervalId;
|
|
137
|
-
let timeoutId;
|
|
138
|
-
let lastError;
|
|
139
|
+
const promise = async () => {
|
|
139
140
|
const { setTimeout, clearTimeout } = getSafeTimers2();
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
chai.util.flag(assertion, "object", obj);
|
|
145
|
-
resolve(await assertionFunction.call(assertion, ...args));
|
|
146
|
-
clearTimeout(intervalId);
|
|
147
|
-
clearTimeout(timeoutId);
|
|
148
|
-
} catch (err) {
|
|
149
|
-
lastError = err;
|
|
150
|
-
if (!chai.util.flag(assertion, "_isLastPollAttempt")) intervalId = setTimeout(check, interval);
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
timeoutId = setTimeout(() => {
|
|
154
|
-
clearTimeout(intervalId);
|
|
155
|
-
chai.util.flag(assertion, "_isLastPollAttempt", true);
|
|
156
|
-
const rejectWithCause = (error) => {
|
|
157
|
-
if (error.cause == null) error.cause = /* @__PURE__ */ new Error("Matcher did not succeed in time.");
|
|
158
|
-
reject(copyStackTrace$1(error, STACK_TRACE_ERROR));
|
|
159
|
-
};
|
|
160
|
-
check().then(() => rejectWithCause(lastError)).catch((e) => rejectWithCause(e));
|
|
141
|
+
let executionPhase = "fn";
|
|
142
|
+
let hasTimedOut = false;
|
|
143
|
+
const timerId = setTimeout(() => {
|
|
144
|
+
hasTimedOut = true;
|
|
161
145
|
}, timeout);
|
|
162
|
-
|
|
163
|
-
|
|
146
|
+
chai.util.flag(assertion, "_name", key);
|
|
147
|
+
try {
|
|
148
|
+
while (true) {
|
|
149
|
+
const isLastAttempt = hasTimedOut;
|
|
150
|
+
if (isLastAttempt) chai.util.flag(assertion, "_isLastPollAttempt", true);
|
|
151
|
+
try {
|
|
152
|
+
executionPhase = "fn";
|
|
153
|
+
const obj = await fn2();
|
|
154
|
+
chai.util.flag(assertion, "object", obj);
|
|
155
|
+
executionPhase = "assertion";
|
|
156
|
+
return await assertionFunction.call(assertion, ...args);
|
|
157
|
+
} catch (err) {
|
|
158
|
+
if (isLastAttempt || executionPhase === "assertion" && chai.util.flag(assertion, "_poll.assert_once")) throwWithCause(err, STACK_TRACE_ERROR);
|
|
159
|
+
await delay(interval, setTimeout);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
} finally {
|
|
163
|
+
clearTimeout(timerId);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
164
166
|
let awaited = false;
|
|
165
167
|
test2.onFinished ??= [];
|
|
166
168
|
test2.onFinished.push(() => {
|
|
@@ -397,7 +399,7 @@ function createExpect(test2) {
|
|
|
397
399
|
get testPath() {
|
|
398
400
|
return getWorkerState().filepath;
|
|
399
401
|
},
|
|
400
|
-
currentTestName: test2 ?
|
|
402
|
+
currentTestName: test2 ? test2.fullTestName ?? "" : globalState.currentTestName
|
|
401
403
|
}, expect);
|
|
402
404
|
expect.assert = chai.assert;
|
|
403
405
|
expect.extend = (matchers) => chai.expect.extend(expect, matchers);
|
|
@@ -2056,7 +2058,7 @@ To automatically clean-up native timers, use \`shouldClearNativeTimers\`.`
|
|
|
2056
2058
|
methodName: "setTimeout",
|
|
2057
2059
|
original: timersPromisesModule.setTimeout
|
|
2058
2060
|
});
|
|
2059
|
-
timersPromisesModule.setTimeout = (
|
|
2061
|
+
timersPromisesModule.setTimeout = (delay2, value, options = {}) => new Promise((resolve, reject) => {
|
|
2060
2062
|
const abort = () => {
|
|
2061
2063
|
options.signal.removeEventListener(
|
|
2062
2064
|
"abort",
|
|
@@ -2075,7 +2077,7 @@ To automatically clean-up native timers, use \`shouldClearNativeTimers\`.`
|
|
|
2075
2077
|
clock.abortListenerMap.delete(abort);
|
|
2076
2078
|
}
|
|
2077
2079
|
resolve(value);
|
|
2078
|
-
},
|
|
2080
|
+
}, delay2);
|
|
2079
2081
|
if (options.signal) {
|
|
2080
2082
|
if (options.signal.aborted) {
|
|
2081
2083
|
abort();
|
|
@@ -2136,7 +2138,7 @@ To automatically clean-up native timers, use \`shouldClearNativeTimers\`.`
|
|
|
2136
2138
|
methodName: "setInterval",
|
|
2137
2139
|
original: timersPromisesModule.setInterval
|
|
2138
2140
|
});
|
|
2139
|
-
timersPromisesModule.setInterval = (
|
|
2141
|
+
timersPromisesModule.setInterval = (delay2, value, options = {}) => ({
|
|
2140
2142
|
[Symbol.asyncIterator]: () => {
|
|
2141
2143
|
const createResolvable = () => {
|
|
2142
2144
|
let resolve, reject;
|
|
@@ -2159,7 +2161,7 @@ To automatically clean-up native timers, use \`shouldClearNativeTimers\`.`
|
|
|
2159
2161
|
} else {
|
|
2160
2162
|
nextAvailable++;
|
|
2161
2163
|
}
|
|
2162
|
-
},
|
|
2164
|
+
}, delay2);
|
|
2163
2165
|
const abort = () => {
|
|
2164
2166
|
options.signal.removeEventListener(
|
|
2165
2167
|
"abort",
|
|
@@ -2696,12 +2698,12 @@ function getImporter(name) {
|
|
|
2696
2698
|
}) + 1])?.file || "";
|
|
2697
2699
|
}
|
|
2698
2700
|
|
|
2699
|
-
// ../../node_modules/.pnpm/vitest@4.0.
|
|
2701
|
+
// ../../node_modules/.pnpm/vitest@4.0.15_@opentelemetry+api@1.9.0_@types+node@24.10.1_@vitest+ui@4.0.15_jiti@2.6.1_1316c7438d8db3eab2efa08f08502397/node_modules/vitest/dist/index.js
|
|
2700
2702
|
import { expectTypeOf } from "expect-type.js";
|
|
2701
2703
|
import { afterAll, afterEach, beforeAll, beforeEach, describe, it, onTestFailed, onTestFinished, recordArtifact, suite, test } from "@vitest/runner.js";
|
|
2702
2704
|
import { chai as chai2 } from "@vitest/expect.js";
|
|
2703
|
-
import "@vitest/runner/utils.js";
|
|
2704
2705
|
import "@vitest/utils/timers.js";
|
|
2706
|
+
import "@vitest/runner/utils.js";
|
|
2705
2707
|
import "@vitest/snapshot.js";
|
|
2706
2708
|
import "@vitest/utils/error.js";
|
|
2707
2709
|
import "@vitest/utils/helpers.js";
|