diff --git a/build b/build index 85312ce8e..d3aa4f5ae 100755 --- a/build +++ b/build @@ -12,6 +12,7 @@ rm -rf dist; mkdir dist # Copy src to dist/src and build from dist/src into dist, so that # the source map for index.js.map will refer to ./src/index.ts etc cp -rp src README.md dist +rm dist/src/_shims/*-deno.* for file in LICENSE CHANGELOG.md; do if [ -e "${file}" ]; then cp "${file}" dist; fi done diff --git a/jest.config.js b/jest.config.js index 29efff74a..2f22a3d51 100644 --- a/jest.config.js +++ b/jest.config.js @@ -4,7 +4,7 @@ module.exports = { testEnvironment: 'node', moduleNameMapper: { '^openai$': '/src/index.ts', - '^openai/_shims/(.*)$': '/src/_shims/$1.node', + '^openai/_shims/(.*)$': '/src/_shims/$1-node', '^openai/(.*)$': '/src/$1', }, modulePathIgnorePatterns: ['/ecosystem-tests/', '/dist/', '/deno_tests/'], diff --git a/package.json b/package.json index 8e6f07882..d493b0550 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,9 @@ "license": "Apache-2.0", "private": false, "exports": { - "./_shims/*": { + "./_shims/*.mjs": { "deno": { "types": "./dist/_shims/*.d.ts", - "require": "./dist/_shims/*.js", "default": "./dist/_shims/*.mjs" }, "bun": { @@ -23,28 +22,47 @@ }, "browser": { "types": "./dist/_shims/*.d.ts", - "require": "./dist/_shims/*.js", "default": "./dist/_shims/*.mjs" }, "worker": { "types": "./dist/_shims/*.d.ts", - "require": "./dist/_shims/*.js", "default": "./dist/_shims/*.mjs" }, "workerd": { "types": "./dist/_shims/*.d.ts", - "require": "./dist/_shims/*.js", "default": "./dist/_shims/*.mjs" }, "node": { - "types": "./dist/_shims/*.node.d.ts", - "require": "./dist/_shims/*.node.js", - "default": "./dist/_shims/*.node.mjs" + "types": "./dist/_shims/*-node.d.ts", + "default": "./dist/_shims/*-node.mjs" }, "types": "./dist/_shims/*.d.ts", - "require": "./dist/_shims/*.js", "default": "./dist/_shims/*.mjs" }, + "./_shims/*.js": { + "deno": { + "types": "./dist/_shims/*.d.ts", + "default": "./dist/_shims/*.js" + }, + "browser": { + "types": "./dist/_shims/*.d.ts", + "default": "./dist/_shims/*.js" + }, + "worker": { + "types": "./dist/_shims/*.d.ts", + "default": "./dist/_shims/*.js" + }, + "workerd": { + "types": "./dist/_shims/*.d.ts", + "default": "./dist/_shims/*.js" + }, + "node": { + "types": "./dist/_shims/*-node.d.ts", + "default": "./dist/_shims/*-node.js" + }, + "types": "./dist/_shims/*.d.ts", + "default": "./dist/_shims/*.js" + }, ".": { "require": { "types": "./dist/index.d.ts", diff --git a/scripts/replace-self-referencing-imports.js b/scripts/replace-self-referencing-imports.js index de3246dd3..7d49d7c74 100644 --- a/scripts/replace-self-referencing-imports.js +++ b/scripts/replace-self-referencing-imports.js @@ -2,14 +2,21 @@ Object.defineProperty(exports, '__esModule', { value: true }); const path = require('path'); -const distSrcDir = path.resolve(__dirname, '..', 'dist', 'src'); +const distDir = path.resolve(__dirname, '..', 'dist'); +const distSrcDir = path.join(distDir, 'src'); function replaceSelfReferencingImports({ orig, file, config }) { // replace self-referencing imports in source files to reduce errors users will // see if they go to definition - if (!file.startsWith(distSrcDir)) return orig; + if (!file.startsWith(distDir)) return orig; + return orig.replace(/['"]([^"'\r\n]+)['"]/, (match, importPath) => { if (!importPath.startsWith('openai/')) return match; + if (!file.startsWith(distSrcDir)) { + const ext = file.endsWith('.d.ts') ? '' : path.extname(file); + const { dir, base } = path.parse(importPath); + return JSON.stringify(`${dir}/${base}${ext}`); + } let relativePath = path.relative( path.dirname(file), path.join(distSrcDir, importPath.substring('openai/'.length)), diff --git a/scripts/resolve-full-paths.js b/scripts/resolve-full-paths.js new file mode 100644 index 000000000..f8f979ad7 --- /dev/null +++ b/scripts/resolve-full-paths.js @@ -0,0 +1,16 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); + +const path = require('path'); + +// tsc-alias --resolveFullPaths is buggy, it replaces 'formdata-node' +// with 'formdata-node.js' because we have a file with that name +function resolveFullPaths({ orig, file, config }) { + return orig.replace(/['"]([^"'\r\n]+)['"]/, (match, importPath) => { + if (!importPath.startsWith('.')) return match; + const { dir, name } = path.parse(importPath); + const ext = /\.mjs$/.test(file) ? '.mjs' : '.js'; + return JSON.stringify(`${dir}/${name}${ext}`); + }); +} +exports.default = resolveFullPaths; diff --git a/src/_shims/ReadableStream.node.ts b/src/_shims/ReadableStream-node.ts similarity index 100% rename from src/_shims/ReadableStream.node.ts rename to src/_shims/ReadableStream-node.ts diff --git a/src/_shims/agent.node.ts b/src/_shims/agent-node.ts similarity index 100% rename from src/_shims/agent.node.ts rename to src/_shims/agent-node.ts diff --git a/src/_shims/agent.ts b/src/_shims/agent.ts index c39d1cfb0..24e5bf7ca 100644 --- a/src/_shims/agent.ts +++ b/src/_shims/agent.ts @@ -2,7 +2,7 @@ * Disclaimer: modules in _shims aren't intended to be imported by SDK users. * * This is a stub for non-node environments. - * In node environments, it gets replaced agent.node.ts by the package export map + * In node environments, it gets replaced agent-node.ts by the package export map */ export type Agent = any; diff --git a/src/_shims/fetch.deno.ts b/src/_shims/fetch-deno.ts similarity index 100% rename from src/_shims/fetch.deno.ts rename to src/_shims/fetch-deno.ts diff --git a/src/_shims/fetch.node.d.ts b/src/_shims/fetch-node.d.ts similarity index 100% rename from src/_shims/fetch.node.d.ts rename to src/_shims/fetch-node.d.ts diff --git a/src/_shims/fetch.node.js b/src/_shims/fetch-node.js similarity index 100% rename from src/_shims/fetch.node.js rename to src/_shims/fetch-node.js diff --git a/src/_shims/fetch.node.mjs b/src/_shims/fetch-node.mjs similarity index 100% rename from src/_shims/fetch.node.mjs rename to src/_shims/fetch-node.mjs diff --git a/src/_shims/fileFromPath.node.ts b/src/_shims/fileFromPath-node.ts similarity index 93% rename from src/_shims/fileFromPath.node.ts rename to src/_shims/fileFromPath-node.ts index 676d2e2df..065fd7ecb 100644 --- a/src/_shims/fileFromPath.node.ts +++ b/src/_shims/fileFromPath-node.ts @@ -3,7 +3,7 @@ */ import { fileFromPath as _fileFromPath } from 'formdata-node/file-from-path'; -import type { File, FilePropertyBag } from './formdata.node'; +import type { File, FilePropertyBag } from './form-data-node'; export type FileFromPathOptions = Omit; diff --git a/src/_shims/fileFromPath.ts b/src/_shims/fileFromPath.ts index 7926b4a56..4e7c4c001 100644 --- a/src/_shims/fileFromPath.ts +++ b/src/_shims/fileFromPath.ts @@ -1,11 +1,11 @@ /** * Disclaimer: modules in _shims aren't intended to be imported by SDK users. * - * This is a stub that gets replaced by fileFromPath.node.js for node environments + * This is a stub that gets replaced by fileFromPath-node.js for node environments * in the package export map */ -import type { FilePropertyBag, File } from './formdata'; +import type { FilePropertyBag, File } from './form-data'; export type FileFromPathOptions = Omit; diff --git a/src/_shims/formdata.deno.ts b/src/_shims/form-data-deno.ts similarity index 100% rename from src/_shims/formdata.deno.ts rename to src/_shims/form-data-deno.ts diff --git a/src/_shims/formdata.node.d.ts b/src/_shims/form-data-node.d.ts similarity index 100% rename from src/_shims/formdata.node.d.ts rename to src/_shims/form-data-node.d.ts diff --git a/src/_shims/formdata.node.js b/src/_shims/form-data-node.js similarity index 100% rename from src/_shims/formdata.node.js rename to src/_shims/form-data-node.js diff --git a/src/_shims/formdata.node.mjs b/src/_shims/form-data-node.mjs similarity index 100% rename from src/_shims/formdata.node.mjs rename to src/_shims/form-data-node.mjs diff --git a/src/_shims/formdata.d.ts b/src/_shims/form-data.d.ts similarity index 100% rename from src/_shims/formdata.d.ts rename to src/_shims/form-data.d.ts diff --git a/src/_shims/formdata.js b/src/_shims/form-data.js similarity index 100% rename from src/_shims/formdata.js rename to src/_shims/form-data.js diff --git a/src/_shims/formdata.mjs b/src/_shims/form-data.mjs similarity index 100% rename from src/_shims/formdata.mjs rename to src/_shims/form-data.mjs diff --git a/src/_shims/getMultipartRequestOptions.node.ts b/src/_shims/getMultipartRequestOptions-node.ts similarity index 94% rename from src/_shims/getMultipartRequestOptions.node.ts rename to src/_shims/getMultipartRequestOptions-node.ts index 3d6907492..ac13a0756 100644 --- a/src/_shims/getMultipartRequestOptions.node.ts +++ b/src/_shims/getMultipartRequestOptions-node.ts @@ -2,7 +2,7 @@ * Disclaimer: modules in _shims aren't intended to be imported by SDK users. */ -import { FormData } from './formdata.node'; +import { FormData } from './form-data-node'; import type { RequestOptions } from '../core'; import { Readable } from 'node:stream'; import { FormDataEncoder } from 'form-data-encoder'; diff --git a/src/_shims/getMultipartRequestOptions.ts b/src/_shims/getMultipartRequestOptions.ts index b9abe6437..f74227d0b 100644 --- a/src/_shims/getMultipartRequestOptions.ts +++ b/src/_shims/getMultipartRequestOptions.ts @@ -2,7 +2,7 @@ * Disclaimer: modules in _shims aren't intended to be imported by SDK users. */ -import { FormData } from './formdata'; +import { FormData } from './form-data'; import type { RequestOptions } from '../core'; import { MultipartBody } from '../uploads'; diff --git a/src/_shims/node-readable.node.ts b/src/_shims/node-readable-node.ts similarity index 100% rename from src/_shims/node-readable.node.ts rename to src/_shims/node-readable-node.ts diff --git a/src/uploads.ts b/src/uploads.ts index 642bc66a5..e02ecb8a1 100644 --- a/src/uploads.ts +++ b/src/uploads.ts @@ -1,7 +1,7 @@ import { type RequestOptions } from './core'; import { type Readable } from 'openai/_shims/node-readable'; import { type BodyInit } from 'openai/_shims/fetch'; -import { FormData, File, type Blob, type FilePropertyBag } from 'openai/_shims/formdata'; +import { FormData, File, type Blob, type FilePropertyBag } from 'openai/_shims/form-data'; import { getMultipartRequestOptions } from 'openai/_shims/getMultipartRequestOptions'; import { fileFromPath } from 'openai/_shims/fileFromPath'; import { type FsReadStream, isFsReadStream } from 'openai/_shims/node-readable'; diff --git a/tests/form.test.ts b/tests/form.test.ts index 1b51d0795..88dfaac77 100644 --- a/tests/form.test.ts +++ b/tests/form.test.ts @@ -1,5 +1,5 @@ import { multipartFormRequestOptions, createForm } from 'openai/core'; -import { Blob } from 'openai/_shims/formdata'; +import { Blob } from 'openai/_shims/form-data'; import { toFile } from 'openai'; describe('form data validation', () => { diff --git a/tests/uploads.test.ts b/tests/uploads.test.ts index 1079379ed..76fa6573c 100644 --- a/tests/uploads.test.ts +++ b/tests/uploads.test.ts @@ -1,6 +1,6 @@ import fs from 'fs'; import { toFile, type ResponseLike } from 'openai/uploads'; -import { File } from 'openai/_shims/formdata'; +import { File } from 'openai/_shims/form-data'; class MyClass { name: string = 'foo'; diff --git a/tsconfig.build.json b/tsconfig.build.json index 890200d2b..320dc5c1d 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -5,7 +5,7 @@ "compilerOptions": { "rootDir": "./dist/src", "paths": { - "openai/_shims/*": ["dist/src/_shims/*.node"], + "openai/_shims/*": ["dist/src/_shims/*-node"], "openai": ["dist/src/index.ts"], "openai/*": ["dist/src/*"], "digest-fetch": ["./typings/digest-fetch"] @@ -18,14 +18,17 @@ "sourceMap": true }, "tsc-alias": { - "resolveFullPaths": true, "fileExtensions": { "inputGlob": "{mjs,cjs,js,jsx,mts,cts,ts,tsx}" }, "replacers": { - "replace-absolute-imports": { + "replace-self-referencing-imports": { "enabled": true, "file": "./scripts/replace-self-referencing-imports.js" + }, + "resolve-full-paths": { + "enabled": true, + "file": "./scripts/resolve-full-paths.js" } } } diff --git a/tsconfig.json b/tsconfig.json index 89f263f29..1edbcb2e2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,7 @@ "esModuleInterop": true, "baseUrl": "./", "paths": { - "openai/_shims/*": ["src/_shims/*.node"], + "openai/_shims/*": ["src/_shims/*-node"], "openai": ["src/index.ts"], "openai/*": ["src/*"], "digest-fetch": ["./typings/digest-fetch"]