/** * This is a minimal script to publish your package to "npm". * This is meant to be used as-is or customize as you see fit. * * This script is executed on "dist/path/to/library" as "cwd" by default. * * You might need to authenticate with NPM before running this script. */ import { readCachedProjectGraph } from '@nrwl/devkit'; import { execSync } from 'child_process'; import { readFileSync, appendFileSync, writeFileSync } from 'fs'; import chalk from 'chalk'; function invariant(condition, message) { if (!condition) { console.error(chalk.bold.red(message)); process.exit(1); } } // Executing publish script: node path/to/publish.mjs {name} --version {version} --tag {tag} // Default "tag" to "next" so we won't publish the "latest" tag by accident. const [, , name, version, tagInput] = process.argv; const tag = tagInput ?? 'next'; // A simple SemVer validation to validate the version const validVersion = /^\d+\.\d+\.\d+(-\w+\.\d+)?/; invariant( version && validVersion.test(version), `No version provided or version did not match Semantic Versioning, expected: #.#.#-tag.# or #.#.#, got ${version}.` ); const graph = readCachedProjectGraph(); const project = graph.nodes[name]; invariant( project, `Could not find project "${name}" in the workspace. Is the project.json configured correctly?` ); const outputPath = project.data?.targets?.build?.options?.outputPath; invariant( outputPath, `Could not find "build.options.outputPath" of project "${name}". Is project.json configured correctly?` ); process.chdir(outputPath); // Updating the version in "package.json" before publishing try { const json = JSON.parse(readFileSync(`package.json`).toString()); json.version = version; writeFileSync(`package.json`, JSON.stringify(json, null, 2)); } catch (e) { console.error( chalk.bold.red(`Error reading package.json file from library build output.`) ); } try { appendFileSync('.npmrc', '//registry.npmjs.org/:_authToken=${NPM_TOKEN}'); } catch (e) { console.error(chalk.bold.red(`Error writing to npmrc.`)); } if (process.env.BUILDKITE) { execSync(`npm publish --access public --tag ${tag}`, { env: { ...process.env, CI: 'true' }, }); } else { console.log('DRY RUN, since we are not in CI.'); console.log(`npm publish --access public --tag ${tag}`); console.log(`With version ${version}`); }