From f9038defb58d07c2e6b68f3961d894a1c71bea09 Mon Sep 17 00:00:00 2001 From: OJ Kwon <1210596+kwonoj@users.noreply.github.com> Date: Tue, 5 Sep 2023 20:11:44 -0700 Subject: [PATCH] build(package): generate esm output with exports --- package.json | 27 ++++++++++++++++++++++++--- src/generator/docs.ts | 2 +- src/generator/download.ts | 3 ++- src/generator/generator.ts | 3 ++- src/generator/synth.ts | 4 ++-- test/test.clients.ts | 2 +- tsc-multi.json | 24 ++++++++++++++++++++++++ 7 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 tsc-multi.json diff --git a/package.json b/package.json index ace3b945fa..d7b621c414 100644 --- a/package.json +++ b/package.json @@ -5,13 +5,33 @@ "license": "Apache-2.0", "description": "Google APIs Client Library for Node.js", "main": "./build/cjs/src/index.js", - "types": "./build/cjs/src/index.d.ts", + "module": "./build/esm/src/index.mjs", + "types": "./build/esm/src/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./build/esm/src/index.d.ts", + "default": "./build/esm/src/index.mjs" + }, + "require": { + "types": "./build/cjs/src/index.d.ts", + "default": "./build/cjs/src/index.js" + }, + "default": { + "types": "./build/esm/src/index.d.ts", + "default": "./build/esm/src/index.mjs" + } + } + }, "engines": { "node": ">=14.0.0" }, "files": [ "build/cjs/src", - "!build/cjs/src/**/*.map" + "!build/cjs/src/**/*.map", + "build/esm/src", + "!build/esm/src/**/*.map" ], "scripts": { "pretest": "npm run build-test", @@ -28,7 +48,7 @@ "samples-test": "cd samples && npm install && npm link ../ && pwd && npm test", "lint": "gts check", "precompile": "rimraf build", - "compile": "cross-env NODE_OPTIONS=--max-old-space-size=8192 tsc -p tsconfig.json", + "compile": "cross-env NODE_OPTIONS=--max-old-space-size=8192 tsc-multi --verbose", "prebuild-test": "rimraf build", "build-test": "cross-env NODE_OPTIONS=--max-old-space-size=8192 tsc -p tsconfig.test.json", "build-tools": "tsc -p tsconfig.tools.json", @@ -93,6 +113,7 @@ "server-destroy": "^1.0.1", "sinon": "^15.0.0", "tmp": "^0.2.0", + "tsc-multi": "^1.1.0", "typescript": "5.1.6", "yargs-parser": "^20.2.0" } diff --git a/src/generator/docs.ts b/src/generator/docs.ts index 671249c20e..3652927915 100644 --- a/src/generator/docs.ts +++ b/src/generator/docs.ts @@ -12,12 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as execa from 'execa'; import * as fs from 'fs'; import * as nunjucks from 'nunjucks'; import * as path from 'path'; import {promisify} from 'util'; import Q from 'p-queue'; +const execa: typeof import('execa') = require('execa'); const srcPath = path.join(__dirname, '../../../../src'); const apiPath = path.join(srcPath, 'apis'); diff --git a/src/generator/download.ts b/src/generator/download.ts index 3500a39ccc..ad3b35d54e 100644 --- a/src/generator/download.ts +++ b/src/generator/download.ts @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as minimist from 'yargs-parser'; import * as path from 'path'; import * as fs from 'fs'; const {mkdir} = require('fs').promises; @@ -20,6 +19,8 @@ import Q from 'p-queue'; import {request, Headers} from 'gaxios'; import * as gapi from 'googleapis-common'; +const minimist: typeof import('yargs-parser') = require('yargs-parser'); + export type Schema = {[index: string]: {}}; export const DISCOVERY_URL = 'https://www.googleapis.com/discovery/v1/apis/'; diff --git a/src/generator/generator.ts b/src/generator/generator.ts index fda0f85b52..44e66f5f24 100644 --- a/src/generator/generator.ts +++ b/src/generator/generator.ts @@ -20,7 +20,6 @@ import * as path from 'path'; import * as util from 'util'; import Q from 'p-queue'; import * as prettier from 'prettier'; -import * as minimist from 'yargs-parser'; import {GaxiosError, request} from 'gaxios'; import {DISCOVERY_URL} from './download'; import {downloadDiscoveryDocs, ChangeSet} from './download'; @@ -28,6 +27,8 @@ import * as filters from './filters'; import {addFragments} from './samplegen'; import {Disclaimer} from './disclaimer'; +const minimist: typeof import('yargs-parser') = require('yargs-parser'); + const writeFile = util.promisify(fs.writeFile); const readDir = util.promisify(fs.readdir); const readFile = util.promisify(fs.readFile); diff --git a/src/generator/synth.ts b/src/generator/synth.ts index ea663e803d..31ac79a3b3 100644 --- a/src/generator/synth.ts +++ b/src/generator/synth.ts @@ -11,13 +11,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as execa from 'execa'; import * as path from 'path'; import * as fs from 'fs'; import * as gaxios from 'gaxios'; -import * as minimist from 'yargs-parser'; import {Generator} from './generator'; import {DISCOVERY_URL, ChangeSet} from './download'; +const execa: typeof import('execa') = require('execa'); +const minimist: typeof import('yargs-parser') = require('yargs-parser'); export enum Semverity { PATCH = 1, diff --git a/test/test.clients.ts b/test/test.clients.ts index 72e1cc4180..e02b29e7fa 100644 --- a/test/test.clients.ts +++ b/test/test.clients.ts @@ -220,5 +220,5 @@ describe('Clients', () => { it('should pass eslint for a given client', () => { execSync('npx eslint --no-ignore src/apis/youtube/*.ts'); - }); + }).timeout(50000); }); diff --git a/tsc-multi.json b/tsc-multi.json new file mode 100644 index 0000000000..1ba972786e --- /dev/null +++ b/tsc-multi.json @@ -0,0 +1,24 @@ +{ + "targets": [ + { + "extname": ".js", + "module": "commonjs", + "outDir": "build/cjs", + "tsBuildInfoFile": "build/cjs.tsbuildinfo" + }, + { + "extname": ".mjs", + "module": "ES2022", + "outDir": "build/esm", + "moduleResolution": "NodeNext", + "tsBuildInfoFile": "build/esm.tsbuildinfo", + "include": [ + "src/*.ts", + "src/**/*.ts" + ] + } + ], + "projects": [ + "tsconfig.json" + ] +} \ No newline at end of file