Skip to content

Commit 96e5b7f

Browse files
committedJul 20, 2023
v4.0.0-beta.6
1 parent 07b3504 commit 96e5b7f

File tree

13 files changed

+268
-125
lines changed

13 files changed

+268
-125
lines changed
 

‎ecosystem-tests/cli.ts

+4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ const projects = {
1313

1414
await run('npm', ['run', 'tsc']);
1515
await run('npm', ['run', 'build']);
16+
17+
if (state.live) {
18+
await run('npm', ['run', 'test:ci']);
19+
}
1620
},
1721
'vercel-edge': async () => {
1822
await installPackage();

‎ecosystem-tests/ts-browser-webpack/package.json

+8-3
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,22 @@
55
"description": "ts-browser-webpack",
66
"scripts": {
77
"tsc": "tsc",
8-
"test": "echo \"Error: no test specified\" && exit 1",
9-
"serve": "webpack-cli serve --mode development",
10-
"build": "webpack"
8+
"serve": "webpack-cli serve",
9+
"build": "webpack",
10+
"test": "ts-node src/test.ts",
11+
"test:ci": "WAIT_ON_INTERVAL=10000 start-server-and-test serve http://localhost:8080 test"
1112
},
1213
"devDependencies": {
1314
"babel-core": "^6.26.3",
1415
"babel-loader": "^9.1.2",
1516
"babel-preset-es2015": "^6.24.1",
17+
"fastest-levenshtein": "^1.0.16",
1618
"force": "^0.0.3",
1719
"html-webpack-plugin": "^5.5.3",
20+
"puppeteer": "^20.8.3",
21+
"start-server-and-test": "^2.0.0",
1822
"ts-loader": "^9.4.3",
23+
"ts-node": "^10.9.1",
1924
"typescript": "^5.0.4",
2025
"webpack": "^5.87.0",
2126
"webpack-cli": "^5.0.2",

‎ecosystem-tests/ts-browser-webpack/public/index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@
55
<title>Package in the Browser</title>
66
</head>
77
<body>
8-
<button id="myButton">Say Hello</button>
8+
<div id="running">Running tests...</div>
99
</body>
1010
</html>
+150-35
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,164 @@
1-
import OpenAI from 'openai';
2-
import { TranscriptionCreateParams } from 'openai/resources/audio';
1+
import OpenAI, { toFile } from 'openai';
2+
import { distance } from 'fastest-levenshtein';
33

4-
// smoke test that importing and constructing the client works
5-
const openai = new OpenAI({ apiKey: '<invalid API key>' });
6-
console.log(openai);
4+
type TestCase = {
5+
path: string[];
6+
run: () => any;
7+
timeout?: number;
8+
};
9+
10+
const tests: TestCase[] = [];
11+
12+
type TestResult = { path: string[]; passed: boolean; error?: string };
13+
14+
async function runTests() {
15+
const results: TestResult[] = [];
16+
function displayResults() {
17+
let pre = document.getElementById('results');
18+
if (!pre) {
19+
pre = document.createElement('pre');
20+
pre.id = 'results';
21+
document.body.appendChild(pre);
22+
}
23+
pre.innerText = JSON.stringify(results, null, 2);
24+
}
25+
for (const { path, run, timeout } of tests) {
26+
console.log('running', ...path);
27+
try {
28+
await Promise.race([
29+
run(),
30+
new Promise((_, reject) =>
31+
setTimeout(() => reject(new Error(`Test timed out after ${timeout} ms`)), timeout),
32+
),
33+
]);
34+
console.log('passed ', ...path);
35+
results.push({ path, passed: true });
36+
} catch (error) {
37+
console.log('error ', ...path);
38+
console.error(error);
39+
results.push({ path, passed: false, error: error instanceof Error ? error.stack : String(error) });
40+
}
41+
displayResults();
42+
}
43+
const runningEl = document.getElementById('running');
44+
if (runningEl) runningEl.remove();
45+
}
46+
47+
const testPath: string[] = [];
48+
49+
function describe(description: string, handler: () => void) {
50+
testPath.push(description);
51+
try {
52+
handler();
53+
} finally {
54+
testPath.pop();
55+
}
56+
}
57+
58+
function it(description: string, run: () => any, timeout = 15000) {
59+
tests.push({ path: [...testPath, description], run, timeout });
60+
}
61+
62+
function expect(received: any) {
63+
return {
64+
toEqual(expected: any): void {
65+
if (!Object.is(received, expected)) {
66+
throw new Error(
67+
[`Received: ${JSON.stringify(received)}`, `Expected: ${JSON.stringify(expected)}`].join('\n'),
68+
);
69+
}
70+
},
71+
toBeSimilarTo(comparedTo: string, expectedDistance: number) {
72+
const actualDistance = distance(received, comparedTo);
73+
if (actualDistance < expectedDistance) return;
774

8-
// smoke test that making an API request works, even if it errors
9-
openai.completions
10-
.create({
11-
prompt: 'Say this is a test',
12-
model: 'text-davinci-003',
13-
})
14-
.catch((err) => console.error(err));
75+
throw new Error(
76+
[
77+
`Received: ${JSON.stringify(received)}`,
78+
`Expected: ${JSON.stringify(comparedTo)}`,
79+
`Expected distance: ${expectedDistance}`,
80+
`Received distance: ${actualDistance}`,
81+
].join('\n'),
82+
);
83+
},
84+
};
85+
}
86+
87+
const url = 'https://audio-samples.github.io/samples/mp3/blizzard_biased/sample-1.mp3';
88+
const filename = 'sample-1.mp3';
89+
90+
const correctAnswer =
91+
'It was anxious to find him no one that expectation of a man who were giving his father enjoyment. But he was avoided in sight in the minister to which indeed,';
92+
const model = 'whisper-1';
93+
94+
const params = new URLSearchParams(location.search);
95+
96+
const client = new OpenAI({ apiKey: params.get('apiKey') ?? undefined });
1597

1698
async function typeTests() {
1799
// @ts-expect-error this should error if the `Uploadable` type was resolved correctly
18-
await openai.audio.transcriptions.create({ file: { foo: true }, model: 'whisper-1' });
100+
await client.audio.transcriptions.create({ file: { foo: true }, model: 'whisper-1' });
19101
// @ts-expect-error this should error if the `Uploadable` type was resolved correctly
20-
await openai.audio.transcriptions.create({ file: null, model: 'whisper-1' });
102+
await client.audio.transcriptions.create({ file: null, model: 'whisper-1' });
21103
// @ts-expect-error this should error if the `Uploadable` type was resolved correctly
22-
await openai.audio.transcriptions.create({ file: 'test', model: 'whisper-1' });
104+
await client.audio.transcriptions.create({ file: 'test', model: 'whisper-1' });
105+
}
106+
107+
if (typeof File !== 'undefined') {
108+
it('handles builtinFile', async function () {
109+
const file = await fetch(url)
110+
.then((x) => x.arrayBuffer())
111+
.then((x) => new File([x], filename));
23112

24-
const url = 'https://audio-samples.github.io/samples/mp3/blizzard_biased/sample-1.mp3';
25-
const model = 'whisper-1';
113+
const result = await client.audio.transcriptions.create({ file, model });
114+
expect(result.text).toBeSimilarTo(correctAnswer, 12);
115+
});
116+
}
26117

118+
it('handles Response', async function () {
27119
const file = await fetch(url);
28-
const params: TranscriptionCreateParams = { file, model };
29120

30-
await openai.audio.transcriptions.create(params);
31-
}
121+
const result = await client.audio.transcriptions.create({ file, model });
122+
expect(result.text).toBeSimilarTo(correctAnswer, 12);
123+
});
32124

33-
// --------
34-
class Greeter {
35-
greeting: string;
36-
constructor(message: string) {
37-
this.greeting = message;
38-
}
39-
greet(): string {
40-
return `Hello, ${this.greeting}`;
41-
}
42-
}
125+
const fineTune = `{"prompt": "<prompt text>", "completion": "<ideal generated text>"}`;
43126

44-
const greeter = new Greeter('world');
127+
describe('toFile', () => {
128+
if (typeof Blob !== 'undefined') {
129+
it('handles builtin Blob', async function () {
130+
const result = await client.files.create({
131+
file: await toFile(
132+
// @ts-ignore avoid DOM lib for testing purposes
133+
new Blob([new TextEncoder().encode(fineTune)]),
134+
'finetune.jsonl',
135+
),
136+
purpose: 'fine-tune',
137+
});
138+
expect(result.status).toEqual('uploaded');
139+
});
140+
}
141+
it('handles Uint8Array', async function () {
142+
const result = await client.files.create({
143+
file: await toFile(new TextEncoder().encode(fineTune), 'finetune.jsonl'),
144+
purpose: 'fine-tune',
145+
});
146+
expect(result.status).toEqual('uploaded');
147+
});
148+
it('handles ArrayBuffer', async function () {
149+
const result = await client.files.create({
150+
file: await toFile(new TextEncoder().encode(fineTune).buffer, 'finetune.jsonl'),
151+
purpose: 'fine-tune',
152+
});
153+
expect(result.status).toEqual('uploaded');
154+
});
155+
it('handles DataView', async function () {
156+
const result = await client.files.create({
157+
file: await toFile(new DataView(new TextEncoder().encode(fineTune).buffer), 'finetune.jsonl'),
158+
purpose: 'fine-tune',
159+
});
160+
expect(result.status).toEqual('uploaded');
161+
});
162+
});
45163

46-
const button = document.getElementById('myButton')!;
47-
button.onclick = () => {
48-
alert(greeter.greet());
49-
};
164+
runTests();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import puppeteer from 'puppeteer'
2+
3+
(async () => {
4+
const browser = await puppeteer.launch();
5+
try {
6+
const page = await browser.newPage();
7+
8+
const apiKey = process.env.OPENAI_API_KEY
9+
10+
if (!apiKey) throw new Error('missing process.env.OPENAI_API_KEY')
11+
12+
// Navigate the page to a URL
13+
await page.goto(`http://localhost:8080/index.html?apiKey=${apiKey}`);
14+
15+
await page.waitForSelector('#running', { timeout: 15000 })
16+
17+
let start = Date.now()
18+
while (await page.$('#running') != null && Date.now() - start < 60000) {
19+
await new Promise(r => setTimeout(r, 1000))
20+
}
21+
22+
let results
23+
const resultsEl = await page.$('#results')
24+
if (resultsEl) {
25+
const text = await page.evaluate(el => el.textContent, resultsEl)
26+
results = text ? JSON.parse(text) : undefined
27+
}
28+
29+
if (!Array.isArray(results)) {
30+
throw new Error(`failed to get test results from page`)
31+
}
32+
const failed = results.filter(r => !r.passed)
33+
if (failed.length) {
34+
throw new Error(`${failed.length} of ${results.length} tests failed: ${JSON.stringify(failed, null, 2)}`)
35+
}
36+
console.log(`${results.length} tests passed!`)
37+
} finally {
38+
await browser.close();
39+
}
40+
})();

‎ecosystem-tests/ts-browser-webpack/webpack.config.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ const buildPath = path.resolve(__dirname, 'dist');
88
module.exports = {
99
entry: path.join(srcPath, 'index.ts'),
1010

11+
mode: 'development',
12+
1113
output: {
1214
path: buildPath,
1315
filename: 'bundle.js',
@@ -32,7 +34,7 @@ module.exports = {
3234
extensions: ['*', '.js', '.ts'],
3335
},
3436

35-
devtool: 'inline-source-map',
37+
devtool: 'eval',
3638

3739
plugins: [
3840
new HtmlWebpackPlugin({

‎package.json

+5-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "openai",
3-
"version": "4.0.0-beta.5",
3+
"version": "4.0.0-beta.6",
44
"description": "Client library for the OpenAI API",
55
"author": "OpenAI <support@openai.com>",
66
"types": "dist/index.d.ts",
@@ -48,17 +48,17 @@
4848
"types": "./dist/index.d.mts",
4949
"default": "./dist/index.mjs"
5050
},
51-
"./*": {
51+
"./*.mjs": {
5252
"types": "./dist/*.d.ts",
53-
"require": "./dist/*.js",
5453
"default": "./dist/*.mjs"
5554
},
5655
"./*.js": {
5756
"types": "./dist/*.d.ts",
5857
"default": "./dist/*.js"
5958
},
60-
"./*.mjs": {
59+
"./*": {
6160
"types": "./dist/*.d.ts",
61+
"require": "./dist/*.js",
6262
"default": "./dist/*.mjs"
6363
}
6464
},
@@ -74,14 +74,12 @@
7474
"dependencies": {
7575
"@types/node": "^18.11.18",
7676
"@types/node-fetch": "^2.6.4",
77-
"@types/qs": "^6.9.7",
7877
"abort-controller": "^3.0.0",
7978
"agentkeepalive": "^4.2.1",
8079
"digest-fetch": "^1.3.0",
8180
"form-data-encoder": "1.7.2",
8281
"formdata-node": "^4.3.2",
83-
"node-fetch": "^2.6.7",
84-
"qs": "^6.10.3"
82+
"node-fetch": "^2.6.7"
8583
},
8684
"devDependencies": {
8785
"@types/jest": "^29.4.0",

‎src/_shims/fetch.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ exports.Request = Request;
1010
exports.Response = Response;
1111
exports.Headers = Headers;
1212

13-
exports.isPolyfilled = true;
13+
exports.isPolyfilled = false;

‎src/core.ts

+23-17
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import * as qs from 'qs';
21
import { VERSION } from './version';
32
import { Stream } from './streaming';
43
import { APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError } from './error';
@@ -82,18 +81,6 @@ export abstract class APIClient {
8281
*/
8382
protected validateHeaders(headers: Headers, customHeaders: Headers) {}
8483

85-
/**
86-
* Override this to add your own qs.stringify options, for example:
87-
*
88-
* {
89-
* ...super.qsOptions(),
90-
* strictNullHandling: true,
91-
* }
92-
*/
93-
protected qsOptions(): qs.IStringifyOptions | undefined {
94-
return {};
95-
}
96-
9784
protected defaultIdempotencyKey(): string {
9885
return `stainless-node-retry-${uuid4()}`;
9986
}
@@ -128,9 +115,11 @@ export abstract class APIClient {
128115
return Buffer.byteLength(body, 'utf8').toString();
129116
}
130117

131-
const encoder = new TextEncoder();
132-
const encoded = encoder.encode(body);
133-
return encoded.length.toString();
118+
if (typeof TextEncoder !== 'undefined') {
119+
const encoder = new TextEncoder();
120+
const encoded = encoder.encode(body);
121+
return encoded.length.toString();
122+
}
134123
}
135124

136125
return null;
@@ -302,12 +291,29 @@ export abstract class APIClient {
302291
}
303292

304293
if (query) {
305-
url.search = qs.stringify(query, this.qsOptions());
294+
url.search = this.stringifyQuery(query);
306295
}
307296

308297
return url.toString();
309298
}
310299

300+
protected stringifyQuery(query: Record<string, unknown>): string {
301+
return Object.entries(query)
302+
.filter(([_, value]) => typeof value !== 'undefined')
303+
.map(([key, value]) => {
304+
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
305+
return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
306+
}
307+
if (value === null) {
308+
return `${encodeURIComponent(key)}=`;
309+
}
310+
throw new Error(
311+
`Cannot stringify type ${typeof value}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`,
312+
);
313+
})
314+
.join('&');
315+
}
316+
311317
async fetchWithTimeout(
312318
url: RequestInfo,
313319
init: RequestInit | undefined,

‎src/index.ts

+6-11
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
// File generated from our OpenAPI spec by Stainless.
22

3-
import * as qs from 'qs';
43
import * as Core from './core';
54
import * as Pagination from './pagination';
65
import * as API from './resources/index';
76
import * as Errors from './error';
87
import type { Agent } from 'openai/_shims/agent';
98
import * as Uploads from './uploads';
109

11-
type Config = {
10+
export interface ClientOptions {
1211
/**
1312
* Defaults to process.env["OPENAI_API_KEY"].
1413
*/
@@ -67,19 +66,19 @@ type Config = {
6766
* param to `undefined` in request options.
6867
*/
6968
defaultQuery?: Core.DefaultQuery;
70-
};
69+
}
7170

7271
/** Instantiate the API Client. */
7372
export class OpenAI extends Core.APIClient {
7473
apiKey: string;
7574

76-
private _options: Config;
75+
private _options: ClientOptions;
7776

78-
constructor(config?: Config) {
79-
const options: Config = {
77+
constructor(opts?: ClientOptions) {
78+
const options: ClientOptions = {
8079
apiKey: typeof process === 'undefined' ? '' : process.env['OPENAI_API_KEY'] || '',
8180
baseURL: 'https://api.openai.com/v1',
82-
...config,
81+
...opts,
8382
};
8483

8584
if (!options.apiKey && options.apiKey !== null) {
@@ -125,10 +124,6 @@ export class OpenAI extends Core.APIClient {
125124
return { Authorization: `Bearer ${this.apiKey}` };
126125
}
127126

128-
protected override qsOptions(): qs.IStringifyOptions {
129-
return { arrayFormat: 'comma' };
130-
}
131-
132127
static OpenAI = this;
133128

134129
static APIError = Errors.APIError;

‎src/version.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export const VERSION = '4.0.0-beta.5';
1+
export const VERSION = '4.0.0-beta.6';

‎tests/stringifyQuery.test.ts

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { APIClient } from 'openai/core';
2+
3+
const { stringifyQuery } = APIClient.prototype as any;
4+
5+
describe('APIClient.stringifyQuery', () => {
6+
for (const [input, expected] of [
7+
[{ a: '1', b: 2, c: true }, 'a=1&b=2&c=true'],
8+
[{ a: null, b: false, c: undefined }, 'a=&b=false'],
9+
[{ 'a/b': 1.28341 }, `${encodeURIComponent('a/b')}=1.28341`],
10+
[
11+
{ 'a/b': 'c/d', 'e=f': 'g&h' },
12+
`${encodeURIComponent('a/b')}=${encodeURIComponent('c/d')}&${encodeURIComponent(
13+
'e=f',
14+
)}=${encodeURIComponent('g&h')}`,
15+
],
16+
]) {
17+
it(`${JSON.stringify(input)} -> ${expected}`, () => {
18+
expect(stringifyQuery(input)).toEqual(expected);
19+
});
20+
}
21+
for (const value of [[], {}, new Date()]) {
22+
it(`${JSON.stringify(value)} -> <error>`, () => {
23+
expect(() => stringifyQuery({ value })).toThrow(`Cannot stringify type ${typeof value}`);
24+
});
25+
}
26+
});

‎yarn.lock

-48
Original file line numberDiff line numberDiff line change
@@ -845,11 +845,6 @@
845845
resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.0.tgz#efcbd41937f9ae7434c714ab698604822d890759"
846846
integrity sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==
847847

848-
"@types/qs@^6.9.7":
849-
version "6.9.7"
850-
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
851-
integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
852-
853848
"@types/stack-utils@^2.0.0":
854849
version "2.0.1"
855850
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c"
@@ -1260,14 +1255,6 @@ buffer-from@^1.0.0:
12601255
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
12611256
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
12621257

1263-
call-bind@^1.0.0:
1264-
version "1.0.2"
1265-
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
1266-
integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
1267-
dependencies:
1268-
function-bind "^1.1.1"
1269-
get-intrinsic "^1.0.2"
1270-
12711258
callsites@^3.0.0:
12721259
version "3.1.0"
12731260
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
@@ -2027,15 +2014,6 @@ get-caller-file@^2.0.5:
20272014
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
20282015
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
20292016

2030-
get-intrinsic@^1.0.2:
2031-
version "1.1.1"
2032-
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
2033-
integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
2034-
dependencies:
2035-
function-bind "^1.1.1"
2036-
has "^1.0.3"
2037-
has-symbols "^1.0.1"
2038-
20392017
get-package-type@^0.1.0:
20402018
version "0.1.0"
20412019
resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
@@ -2126,11 +2104,6 @@ has-flag@^4.0.0:
21262104
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
21272105
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
21282106

2129-
has-symbols@^1.0.1:
2130-
version "1.0.3"
2131-
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
2132-
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
2133-
21342107
has@^1.0.3:
21352108
version "1.0.3"
21362109
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
@@ -3053,11 +3026,6 @@ npm-run-path@^4.0.1:
30533026
dependencies:
30543027
path-key "^3.0.0"
30553028

3056-
object-inspect@^1.9.0:
3057-
version "1.12.0"
3058-
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0"
3059-
integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==
3060-
30613029
once@^1.3.0:
30623030
version "1.4.0"
30633031
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -3397,13 +3365,6 @@ pure-rand@^6.0.0:
33973365
resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306"
33983366
integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==
33993367

3400-
qs@^6.10.3:
3401-
version "6.10.3"
3402-
resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
3403-
integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
3404-
dependencies:
3405-
side-channel "^1.0.4"
3406-
34073368
queue-lit@^1.5.0:
34083369
version "1.5.0"
34093370
resolved "https://registry.yarnpkg.com/queue-lit/-/queue-lit-1.5.0.tgz#8197fdafda1edd615c8a0fc14c48353626e5160a"
@@ -3597,15 +3558,6 @@ shebang-regex@^3.0.0:
35973558
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
35983559
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
35993560

3600-
side-channel@^1.0.4:
3601-
version "1.0.4"
3602-
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
3603-
integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
3604-
dependencies:
3605-
call-bind "^1.0.0"
3606-
get-intrinsic "^1.0.2"
3607-
object-inspect "^1.9.0"
3608-
36093561
sigmund@^1.0.1:
36103562
version "1.0.1"
36113563
resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"

0 commit comments

Comments
 (0)
Please sign in to comment.