diff --git a/.github/workflows/prepare-package-release.yml b/.github/workflows/prepare-package-release.yml index 3eb728e2130..e230b271ef7 100644 --- a/.github/workflows/prepare-package-release.yml +++ b/.github/workflows/prepare-package-release.yml @@ -3,7 +3,7 @@ on: workflow_dispatch: inputs: packages: - description: 'Enter a specific package to release, or packages separated by commas, ie @woocommerce/components,@woocommerce/number. Leaving this input to the default "-a" will prepare to release all eligible packages.' + description: 'Enter a specific package to release, or packages separated by commas, ie @woocommerce/components,@woocommerce/number. Leaving this input to the default "-a" will prepare to release all eligible packages. When releasing a package for the first time, pass the "--initialRelease" flag.' required: false default: '-a' diff --git a/packages/js/README.md b/packages/js/README.md index e3ac5425675..5c7dfe15136 100644 --- a/packages/js/README.md +++ b/packages/js/README.md @@ -62,4 +62,12 @@ To create a new package, add a new folder to `/packages`, containing… - Usage example 4. A `src` directory for the source of your module, which will be built by default using the `pnpm run turbo:build` command. Note that you'll want an `index.js` file that exports the package contents, see other packages for examples. -5. Add the new package name to `packages/js/dependency-extraction-webpack-plugin/assets/packages.js` so that users of that plugin will also be able to use the new package without enqueuing it. +5. A blank Changelog file, `changelog.md`. + +``` +# Changelog + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +``` + +6. Add the new package name to `packages/js/dependency-extraction-webpack-plugin/assets/packages.js` so that users of that plugin will also be able to use the new package without enqueuing it. diff --git a/packages/js/product-editor/changelog.md b/packages/js/product-editor/changelog.md new file mode 100644 index 00000000000..3783eb0da3d --- /dev/null +++ b/packages/js/product-editor/changelog.md @@ -0,0 +1,3 @@ +# Changelog + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/packages/js/product-editor/changelog/fix-initial-package-release b/packages/js/product-editor/changelog/fix-initial-package-release new file mode 100644 index 00000000000..1ead14034ee --- /dev/null +++ b/packages/js/product-editor/changelog/fix-initial-package-release @@ -0,0 +1,5 @@ +Significance: patch +Type: dev +Comment: Added a blank changelog file + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f8dbbb89d1..74cb3bb3805 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2705,32 +2705,6 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-compilation-targets/7.17.7_@babel+core@7.12.9: - resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.12.9 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.19.3 - semver: 6.3.0 - dev: true - - /@babel/helper-compilation-targets/7.17.7_@babel+core@7.16.12: - resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.16.12 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.19.3 - semver: 6.3.0 - dev: false - /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} engines: {node: '>=6.9.0'} @@ -6393,9 +6367,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-module-imports': 7.16.0 - '@babel/helper-plugin-utils': 7.14.5 - babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.16.12 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.16.12 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 semver: 6.3.0 @@ -6410,9 +6384,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-module-imports': 7.16.0 - '@babel/helper-plugin-utils': 7.14.5 - babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.17.8 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.17.8 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.17.8 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.17.8 semver: 6.3.0 @@ -6921,7 +6895,7 @@ packages: dependencies: '@babel/compat-data': 7.17.7 '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.12.9 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-validator-option': 7.16.7 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.12.9 @@ -6988,7 +6962,7 @@ packages: '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.12.9 '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.12.9 '@babel/preset-modules': 0.1.5_@babel+core@7.12.9 - '@babel/types': 7.17.0 + '@babel/types': 7.19.3 babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.12.9 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.12.9 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.12.9 @@ -7006,7 +6980,7 @@ packages: dependencies: '@babel/compat-data': 7.17.7 '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.16.12 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-validator-option': 7.16.7 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.16.12 @@ -7073,7 +7047,7 @@ packages: '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.16.12 '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.16.12 '@babel/preset-modules': 0.1.5_@babel+core@7.16.12 - '@babel/types': 7.17.0 + '@babel/types': 7.19.3 babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.16.12 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 @@ -14511,7 +14485,7 @@ packages: dependencies: '@babel/runtime': 7.19.0 '@wordpress/dom-ready': 3.10.0 - '@wordpress/i18n': 4.19.0 + '@wordpress/i18n': 4.26.0 dev: false /@wordpress/a11y/3.5.0: @@ -14546,7 +14520,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/i18n': 4.19.0 + '@wordpress/i18n': 4.26.0 '@wordpress/url': 3.20.0 dev: true @@ -14796,7 +14770,7 @@ packages: '@wordpress/deprecated': 3.19.0 '@wordpress/dom': 3.19.0 '@wordpress/element': 4.20.0 - '@wordpress/hooks': 3.19.0 + '@wordpress/hooks': 3.26.0 '@wordpress/html-entities': 3.19.0 '@wordpress/i18n': 4.26.0 '@wordpress/icons': 9.10.0 @@ -14995,9 +14969,9 @@ packages: '@wordpress/deprecated': 3.19.0 '@wordpress/dom': 3.19.0 '@wordpress/element': 4.20.0 - '@wordpress/hooks': 3.19.0 + '@wordpress/hooks': 3.26.0 '@wordpress/html-entities': 3.19.0 - '@wordpress/i18n': 4.19.0 + '@wordpress/i18n': 4.26.0 '@wordpress/is-shallow-equal': 4.19.0 '@wordpress/shortcode': 3.19.0 colord: 2.9.2 @@ -15326,7 +15300,7 @@ packages: '@wordpress/dom': 3.19.0 '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.22.0 - '@wordpress/hooks': 3.19.0 + '@wordpress/hooks': 3.26.0 '@wordpress/i18n': 4.26.0 '@wordpress/icons': 9.10.0 '@wordpress/is-shallow-equal': 4.19.0 @@ -15380,7 +15354,7 @@ packages: '@wordpress/dom': 3.19.0 '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.22.0 - '@wordpress/hooks': 3.19.0 + '@wordpress/hooks': 3.26.0 '@wordpress/i18n': 4.26.0 '@wordpress/icons': 9.10.0 '@wordpress/is-shallow-equal': 4.19.0 @@ -15762,14 +15736,14 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/hooks': 3.19.0 + '@wordpress/hooks': 3.26.0 /@wordpress/deprecated/3.19.0: resolution: {integrity: sha512-0YdT5emjDd7RPwQ0SMlUqqwxlxRDvF3hDsFJkUmMU5CtMVbWh+vnaGSmFEYJB7LyGc7ZkN0/BOvD2THl8bNnoA==} engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/hooks': 3.19.0 + '@wordpress/hooks': 3.26.0 /@wordpress/deprecated/3.2.3: resolution: {integrity: sha512-YoJos/hW216PIlxbtNyb24kPR3TUFTSsfeVT23SxudW4jhmwM12vkl3KY1RDbhD/qi89OE4k+8xsBo5cM3lCSw==} @@ -16205,7 +16179,7 @@ packages: hasBin: true dependencies: '@babel/runtime': 7.19.0 - '@wordpress/hooks': 3.19.0 + '@wordpress/hooks': 3.26.0 gettext-parser: 1.4.0 lodash: 4.17.21 memize: 1.1.0 @@ -16219,7 +16193,7 @@ packages: hasBin: true dependencies: '@babel/runtime': 7.19.0 - '@wordpress/hooks': 3.19.0 + '@wordpress/hooks': 3.26.0 gettext-parser: 1.4.0 lodash: 4.17.21 memize: 1.1.0 @@ -16233,7 +16207,7 @@ packages: hasBin: true dependencies: '@babel/runtime': 7.19.0 - '@wordpress/hooks': 3.19.0 + '@wordpress/hooks': 3.26.0 gettext-parser: 1.4.0 memize: 1.1.0 sprintf-js: 1.1.2 @@ -16724,7 +16698,7 @@ packages: dependencies: '@babel/runtime': 7.19.0 '@wordpress/element': 4.20.0 - '@wordpress/i18n': 4.19.0 + '@wordpress/i18n': 4.26.0 utility-types: 3.10.0 dev: false @@ -16853,7 +16827,7 @@ packages: '@wordpress/data': 6.15.0_react@17.0.2 '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.22.0 - '@wordpress/i18n': 4.19.0 + '@wordpress/i18n': 4.26.0 '@wordpress/keycodes': 3.19.0 lodash: 4.17.21 memize: 1.1.0 @@ -18498,6 +18472,19 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.16.12: + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.16.12 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.16.12 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: false + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.17.8: resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: diff --git a/tools/package-release/README.md b/tools/package-release/README.md index b50b3f17aa9..7667b396dff 100644 --- a/tools/package-release/README.md +++ b/tools/package-release/README.md @@ -36,6 +36,8 @@ In order to prepare a package for release, a changelog will need to be compiled ./tools/package-release/bin/dev prepare -a ``` +When making an initial release for a new package, pass the `--initialRelease` flag to signify a new release for a new package. + 2. Create a pull request with the resulting changes and merge it. See more about the prepare script using `./tools/package-release/bin/dev publish --help`. diff --git a/tools/package-release/src/changelogger.ts b/tools/package-release/src/changelogger.ts index a8febe6a5f3..9525204ea07 100644 --- a/tools/package-release/src/changelogger.ts +++ b/tools/package-release/src/changelogger.ts @@ -14,7 +14,7 @@ import { getFilepathFromPackageName } from './validate'; * Call changelogger's next version function to get the version for the next release. * * @param {string} name Package name. - * @return {string} Next release version. + * @return {string|null} Next release version or null if none exists. */ export const getNextVersion = ( name: string ) => { try { @@ -25,9 +25,7 @@ export const getNextVersion = ( name: string ) => { } ).trim(); } catch ( e ) { if ( e instanceof Error ) { - // eslint-disable-next-line no-console - console.log( e ); - throw e; + return null; } } }; @@ -59,13 +57,18 @@ export const validateChangelogEntries = ( name: string ) => { * * @param {string} name Package name. */ -export const writeChangelog = ( name: string ) => { +export const writeChangelog = ( name: string, nextVersion?: string ) => { try { const cwd = getFilepathFromPackageName( name ); - execSync( './vendor/bin/changelogger write --add-pr-num', { - cwd, - encoding: 'utf-8', - } ); + execSync( + `./vendor/bin/changelogger write --add-pr-num ${ + nextVersion ? '--use-version ' + nextVersion : '' + }`, + { + cwd, + encoding: 'utf-8', + } + ); } catch ( e ) { if ( e instanceof Error ) { // eslint-disable-next-line no-console diff --git a/tools/package-release/src/commands/prepare/index.ts b/tools/package-release/src/commands/prepare/index.ts index 3cb16e9ced0..dcf7dd6ba12 100644 --- a/tools/package-release/src/commands/prepare/index.ts +++ b/tools/package-release/src/commands/prepare/index.ts @@ -49,6 +49,10 @@ export default class PackagePrepare extends Command { default: false, description: 'Perform prepare function on all packages.', } ), + initialRelease: Flags.boolean( { + default: false, + description: "Create a package's first release to NPM", + } ), }; /** @@ -62,17 +66,23 @@ export default class PackagePrepare extends Command { } if ( flags.all ) { - this.preparePackages( getAllPackges() ); + await this.preparePackages( getAllPackges() ); return; } const packages = args.packages.split( ',' ); + if ( flags.initialRelease && packages.length > 1 ) { + this.error( + 'Please release only a single package when making an initial release' + ); + } + packages.forEach( ( name: string ) => validatePackage( name, ( e: string ): void => this.error( e ) ) ); - this.preparePackages( packages ); + await this.preparePackages( packages, flags.initialRelease ); } /** @@ -80,18 +90,33 @@ export default class PackagePrepare extends Command { * * @param {Array} packages Packages to prepare. */ - private preparePackages( packages: Array< string > ) { - packages.forEach( ( name ) => { + private async preparePackages( + packages: Array< string >, + initialRelease?: Boolean + ) { + packages.forEach( async ( name ) => { CliUx.ux.action.start( `Preparing ${ name }` ); try { if ( hasValidChangelogs( name ) ) { validateChangelogEntries( name ); - const nextVersion = getNextVersion( name ); - writeChangelog( name ); + let nextVersion = getNextVersion( name ); if ( nextVersion ) { - this.bumpPackageVersion( name, nextVersion ); + writeChangelog( name ); + } else { + if ( initialRelease ) { + nextVersion = '1.0.0'; + } else { + throw new Error( + `Error reading version number for ${ name }. Check that a Changelog file exists and has a version number. If making an initial release, pass the --initialRelease flag.` + ); + } + + writeChangelog( name, nextVersion ); } + + this.bumpPackageVersion( name, nextVersion ); + CliUx.ux.action.stop(); } else { CliUx.ux.action.stop(