From 3d79f6321f6773c409935f1b1adda063d45acb84 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 15 Jan 2022 13:24:21 +0100 Subject: [PATCH] cli: add support for separate release stage types in publishConfig Signed-off-by: Patrik Oldsberg --- packages/cli/src/commands/pack.ts | 41 ++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/commands/pack.ts b/packages/cli/src/commands/pack.ts index 83b866aa88..e646568980 100644 --- a/packages/cli/src/commands/pack.ts +++ b/packages/cli/src/commands/pack.ts @@ -16,12 +16,30 @@ import fs from 'fs-extra'; import { paths } from '../lib/paths'; +import { join as joinPath } from 'path'; -const SKIPPED_KEYS = ['access', 'registry', 'tag']; +const SKIPPED_KEYS = ['access', 'registry', 'tag', 'alphaTypes', 'betaTypes']; const PKG_PATH = 'package.json'; const PKG_BACKUP_PATH = 'package.json-prepack'; +// Writes e.g. alpha/package.json +async function writeReleaseStageEntrypoint(pkg: any, stage: 'alpha' | 'beta') { + await fs.ensureDir(paths.resolveTarget(stage)); + await fs.writeJson( + paths.resolveTarget(stage, PKG_PATH), + { + name: pkg.name, + version: pkg.version, + main: (pkg.publishConfig.main || pkg.main) && '..', + module: (pkg.publishConfig.module || pkg.module) && '..', + browser: (pkg.publishConfig.browser || pkg.browser) && '..', + types: joinPath('..', pkg.publishConfig[`${stage}Types`]), + }, + { encoding: 'utf8', spaces: 2 }, + ); +} + export const pre = async () => { const pkgPath = paths.resolveTarget(PKG_PATH); @@ -29,18 +47,35 @@ export const pre = async () => { const pkg = JSON.parse(pkgContent); await fs.writeFile(PKG_BACKUP_PATH, pkgContent); - for (const key of Object.keys(pkg.publishConfig ?? {})) { + const publishConfig = pkg.publishConfig ?? {}; + for (const key of Object.keys(publishConfig)) { if (!SKIPPED_KEYS.includes(key)) { - pkg[key] = pkg.publishConfig[key]; + pkg[key] = publishConfig[key]; } } await fs.writeJson(pkgPath, pkg, { encoding: 'utf8', spaces: 2 }); + + if (publishConfig.alphaTypes) { + await writeReleaseStageEntrypoint(pkg, 'alpha'); + } + if (publishConfig.betaTypes) { + await writeReleaseStageEntrypoint(pkg, 'beta'); + } }; export const post = async () => { // postpack isn't called by yarn right now, so it needs to be called manually try { await fs.move(PKG_BACKUP_PATH, PKG_PATH, { overwrite: true }); + + // Check if we're shipping types for other release stages, clean up in that case + const pkg = await fs.readJson(PKG_PATH); + if (pkg.publishConfig?.alphaTypes) { + await fs.remove(paths.resolveTarget('alpha')); + } + if (pkg.publishConfig?.betaTypes) { + await fs.remove(paths.resolveTarget('beta')); + } } catch (error) { console.warn( `Failed to restore package.json during postpack, ${error}. ` +