This pull:

- removes zenhub option from package.json
- installs and implement `merge-config` package. This allows for usage of environment variables and command line variables along with `package.json` configuration for the changelog generation.
- implements new variable: `devNoteLabel` for indicating what label indicates the pull has (or requires) a devnote. Pull Requests with this label will have `[DN]` appended to the changelog entry.
- adds new variable: `changelogSrcType` for indicating what source to use for generating changelogs (can be `MILESTONE` or `ZENHUB_RELEASE`). Implemented detection of this in code, defaults to `MILESTONE`.
- Modify initial setup text so if user already has api key(s) setup, then we don't give instructions again. Also improve the output when keys aren't set to make it clear what needs done.
- Make the environment variable for Zenhub Api token consistent with Github token (`ZH_API_TOKEN` instead of `ZH_API_KEY`).
- Update package.json with changelog script variation for running it with zenhub release as the source.
- Update `RELEASE.md` docs to clarify changelog script options
- Add a `README.md` doc for the changelog script.
This commit is contained in:
Darren Ethier 2020-01-28 08:47:26 -05:00 committed by GitHub
parent 7c83133337
commit db14accc64
10 changed files with 674 additions and 70 deletions

View File

@ -54,6 +54,8 @@ _Outcome_: __Release branch has all relevant changes merged & pushed.__
### Prepare release
#### Ensure release branch readme is up to date
- Run changelog script `npm run changelog` to get changelog txt for readme. Changelog content will be output to screen by script.
- The above script will automatically generate changelog entries from a milestone (you will be asked about the milestone name in the script).
- If you want to pull changelog entries from a Zenhub release instead, use `npm run changelog:zenhub` and follow instructions.
- Add changelog section for release, e.g. [`= 2.5.11 - 2020-01-20 =`](https://github.com/woocommerce/woocommerce-gutenberg-products-block/commit/74a41881bfa456a2167a52aaeb4871352255e328).
- Copy-paste the changelog content into `readme.txt`.
- Make any other changes to readme as needed - e.g. support versions changing, new blocks.

View File

@ -0,0 +1,74 @@
# Changelog Script
This folder contains the logic for a changelog script that can be used for generating changelog entries from either pull requests added to a Github milestone, or pull requests that are part of a Zenhub release.
## Usage:
By default, changelog entries will use the title of pull requests. However, you can also customize the changelog entry by adding to the description of the pull custom text in the following format.
```md
### Changelog
> Fix bug in Safari and other Webkit browsers.
```
You can implement the script in your `package.json` in the simplest form by adding the following to the `"scripts"` property (assuming it is installed in `./bin`):
```json
{
"scripts": {
"changelog": "node ./bin/changelog",
}
}
```
## Configuration
The following configuration options can be set for the changelog script. **Note:** you can use all of these options but environment variables overwrite `package.json` config and command line arguments overwrite environment variables.
`package.json` configuration should be added on a top level `changelog` property.
The 'variable' in the following table can be used in `package.json` or as a cli arg.
| variable | description |
| ---- | ---- |
| labelPrefix | Any labels prefixed with this string will be used to derive the "type" of change (defaults to `type:`). |
| skipLabel | Any pull having this label will be skipped for the changelog (defaults to `no-changelog`). |
| defaultPrefix | When there is no label with the `labelPrefix` on a pull, this is the default type that will be used for the changelog entry (defaults to `dev`). |
| changelogSrcType | Either "MILESTONE" (default) or "ZENHUB_RELEASE". This determines what will serve as the source for the changelog entries.
| devNoteLabel | If a pull has this label then `[DN]` will be appended to the end of the changelog. It's a good way to indicate what entries have (or will have) dev notes.
| repo | This is the namespace for the github repository used as the source for pulls used in the changelog entries. Example: `'woocommerce/woocommerce-gutenberg-products-block'`
| ghApiToken | You can pass your github api token to the script. NOTE: Strongly recommend you use environment variable for this. |
| zhApiKey | You can pass your zenhub api key to the script using this config. NOTE: Strongly recommend you use environment variable for this. |
The two environment variables you can use are:
| Environment Variable | Description |
| -------------------- | ---------- |
| GH_API_TOKEN | Github API token for authorizing on the github API. |
| ZH_API_TOKEN | Zenhub api token used for authorizing against the zenhub API. |
### Examples:
**package.json**:
```json
{
"changelog": {
"labelPrefix": "type:",
"skipLabel": "skip-changelog",
"defaultPrefix": "dev",
"repo": "woocommerce/woocommerce-gutenberg-products-block"
},
}
```
**Environment Variable**
```bash
GH_API_TOKEN="1343ASDFQWER13241REASD" node ./bin/changelog
```
**Command Line**
```bash
node ./bin/changelog --labelPrefix="type:" --skipLabel="skip-changelog" --defaultPrefix="dev" --repo="woocommerce/woocommerce-gutenberg-products-block" --ghApiToken="1343ASDFQWER13241REASD"
```

View File

@ -7,7 +7,7 @@ const { pkg, REPO } = require( '../config' );
/* eslint no-console: 0 */
const headers = {
authorization: `token ${ process.env.GH_API_TOKEN }`,
authorization: `token ${ pkg.changelog.ghApiToken }`,
'user-agent': 'changelog-tool',
};
@ -23,6 +23,13 @@ const getPullRequestType = ( labels ) => {
return typeLabel.name.replace( `${ pkg.changelog.labelPrefix } `, '' );
};
const devNoteSuffix = ( labels ) => {
const noteLabel = labels.find( ( label ) =>
label.name.includes( pkg.changelog.devNoteLabel )
);
return noteLabel ? ' [DN]' : '';
};
const isCollaborator = async ( username ) => {
return requestPromise( {
url: `https://api.github.com/orgs/${
@ -54,6 +61,7 @@ const getEntry = async ( pullRequest ) => {
const collaborator = await isCollaborator( pullRequest.author.login );
const type = getPullRequestType( pullRequest.labels.nodes );
const authorTag = collaborator ? '' : `👏 @${ pullRequest.author.login }`;
const devNote = devNoteSuffix( pullRequest.labels.nodes );
let title;
if ( /### Changelog\r\n\r\n> /.test( pullRequest.body ) ) {
const bodyParts = pullRequest.body.split( '### Changelog\r\n\r\n> ' );
@ -71,7 +79,7 @@ const getEntry = async ( pullRequest ) => {
} else {
title = `${ type }: ${ pullRequest.title }`;
}
return `- ${ title } [#${ pullRequest.number }](${ pullRequest.url }) ${ authorTag }`;
return `- ${ title } [#${ pullRequest.number }](${ pullRequest.url })${ devNote } ${ authorTag }`;
};
module.exports = {

View File

@ -1,23 +1,46 @@
'use strict';
const pkg = require( '../../package.json' );
const Config = require( 'merge-config' );
const REPO = pkg.repository.url
// remove https://github.com:
.split( ':' )[ 2 ]
// remove the .git ending.
.slice( 0, -4 );
const config = new Config();
if ( pkg.changelog === undefined ) {
pkg.changelog = {
const changelogSrcTypes = {
MILESTONE: 'MILESTONE',
ZENHUB: 'ZENHUB_RELEASE',
};
const DEFAULTS = {
labelPrefix: 'type:',
skipLabel: 'no-changelog',
defaultPrefix: 'dev',
zenhub: false,
};
changelogSrcType: changelogSrcTypes.MILESTONE,
devNoteLabel: 'dev-note',
repo: '',
ghApiToken: '',
zhApiToken: '',
};
pkg.changelog = pkg.changelog || DEFAULTS;
config.merge( { ...DEFAULTS, ...pkg.changelog } );
config.env( [ 'GH_API_TOKEN', 'ZH_API_TOKEN' ] );
config.argv( Object.keys( DEFAULTS ) );
const REPO = config.get( 'repo' );
if ( ! REPO ) {
throw new Error(
"The 'repo' configuration value is not set. This script requires the\n" +
'repository namespace used as the source for the changelog entries.'
);
}
module.exports = {
pkg,
pkg: {
...pkg,
changelog: config.get(),
},
REPO,
changelogSrcTypes,
};

View File

@ -6,8 +6,10 @@ const { make } = require( '../common' );
const { fetchAllPullRequests } = require( './requests' );
/* eslint no-console: 0 */
let ready = false;
const makeChangeLog = async () => {
if ( ! pkg.changelog.ghApiToken ) {
console.log(
chalk.yellow(
'This program requires an api token. You can create one here: '
@ -27,7 +29,11 @@ const makeChangeLog = async () => {
);
console.log( '' );
const ready = await promptly.confirm( 'Are you ready to continue? ' );
ready = await promptly.confirm( 'Are you ready to continue? ' );
} else {
console.log( chalk.green( 'Detected GH_API_TOKEN is set.' ) );
ready = true;
}
if ( ready ) {
console.log( '' );

View File

@ -1,10 +1,19 @@
#!/usr/bin/env node
'use strict';
/* eslint no-console: 0 */
const chalk = require( 'chalk' );
const { makeChangeLog: githubMake } = require( './github' );
const { makeChangeLog: zenhubMake } = require( './zenhub' );
const { pkg } = require( './config' );
try {
const { makeChangeLog: githubMake } = require( './github' );
const { makeChangeLog: zenhubMake } = require( './zenhub' );
const { pkg, changelogSrcTypes } = require( './config' );
const makeChangeLog = pkg.changelog.zenhub ? zenhubMake : githubMake;
const makeChangeLog =
pkg.changelog.changelogSrcType === changelogSrcTypes.ZENHUB
? zenhubMake
: githubMake;
makeChangeLog();
makeChangeLog();
} catch ( error ) {
console.log( chalk.red( error.message ) );
}

View File

@ -6,14 +6,33 @@ const { make } = require( '../common' );
const { fetchAllPullRequests } = require( './requests' );
/* eslint no-console: 0 */
let ready = false;
const makeChangeLog = async () => {
if ( ! pkg.changelog.zhApiToken || ! pkg.changelog.ghApiToken ) {
const zenhubSet = pkg.changelog.zhApiToken
? chalk.green( 'set' )
: chalk.red( 'not set' );
const githubSet = pkg.changelog.ghApiToken
? chalk.green( 'set' )
: chalk.red( 'not set' );
console.log( `${ chalk.yellow( 'Zenhub Token:' ) } ${ zenhubSet }` );
console.log( `${ chalk.yellow( 'Github Token:' ) } ${ githubSet }` );
console.log( '' );
console.log(
chalk.yellow(
'This program requires an api token from Github and Zenhub. You can create one here: '
) +
'https://github.com/settings/tokens' +
' and https://app.zenhub.com/dashboard/tokens'
'This program requires an api token from Github and Zenhub.'
)
);
console.log(
chalk.yellow(
'You can create and get a Github token here: https://github.com/settings/tokens'
)
);
console.log(
chalk.yellow(
'You can create and get a Zenhub token here: https://app.zenhub.com/dashboard/tokens'
)
);
console.log( '' );
console.log(
@ -24,12 +43,20 @@ const makeChangeLog = async () => {
console.log( '' );
console.log(
chalk.yellow(
'Export the github token as variable called GH_API_TOKEN and the Zenhub token as a variable called ZH_API_KEY from your bash profile.'
'Export the github token as variable called GH_API_TOKEN and the Zenhub token as a variable called ZH_API_TOKEN from your bash profile.'
)
);
console.log( '' );
const ready = await promptly.confirm( 'Are you ready to continue? ' );
ready = await promptly.confirm( 'Are you ready to continue? ' );
} else {
console.log(
chalk.green(
'Detected that ZH_API_TOKEN and GH_API_TOKEN values are set.'
)
);
ready = true;
}
if ( ready ) {
console.log( '' );

View File

@ -3,11 +3,11 @@
/* eslint no-console: 0 */
const ZenHub = require( 'zenhub-api' );
const { REPO } = require( '../config' );
const { REPO, pkg } = require( '../config' );
const { authedGraphql } = require( '../common' );
const { pull } = require( 'lodash' );
const api = new ZenHub( process.env.ZH_API_KEY );
const api = new ZenHub( pkg.changelog.zhApiToken );
const getQuery = ( before ) => {
const [ owner, repo ] = REPO.split( '/' );

View File

@ -6537,6 +6537,16 @@
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
},
"camel-case": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/camel-case/-/camel-case-1.2.2.tgz",
"integrity": "sha1-Gsp8TRlTWaLOmVV5NDPG5VQlEfI=",
"dev": true,
"requires": {
"sentence-case": "^1.1.1",
"upper-case": "^1.1.1"
}
},
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@ -6662,6 +6672,30 @@
}
}
},
"change-case": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/change-case/-/change-case-2.3.1.tgz",
"integrity": "sha1-LE/ePwY7tB0AzWjg1aCdthy+iU8=",
"dev": true,
"requires": {
"camel-case": "^1.1.1",
"constant-case": "^1.1.0",
"dot-case": "^1.1.0",
"is-lower-case": "^1.1.0",
"is-upper-case": "^1.1.0",
"lower-case": "^1.1.1",
"lower-case-first": "^1.0.0",
"param-case": "^1.1.0",
"pascal-case": "^1.1.0",
"path-case": "^1.1.0",
"sentence-case": "^1.1.1",
"snake-case": "^1.1.0",
"swap-case": "^1.1.0",
"title-case": "^1.1.0",
"upper-case": "^1.1.1",
"upper-case-first": "^1.1.0"
}
},
"character-entities": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
@ -7202,6 +7236,16 @@
"resolved": "https://registry.npmjs.org/consolidated-events/-/consolidated-events-2.0.2.tgz",
"integrity": "sha512-2/uRVMdRypf5z/TW/ncD/66l75P5hH2vM/GR8Jf8HLc2xnfJtmina6F6du8+v4Z2vTrMo7jC+W1tmEEuuELgkQ=="
},
"constant-case": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/constant-case/-/constant-case-1.1.2.tgz",
"integrity": "sha1-jsLKW6ND4Aqjjb9OIA/VrJB+/WM=",
"dev": true,
"requires": {
"snake-case": "^1.1.0",
"upper-case": "^1.1.1"
}
},
"constants-browserify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
@ -8269,6 +8313,15 @@
"domelementtype": "1"
}
},
"dot-case": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/dot-case/-/dot-case-1.1.2.tgz",
"integrity": "sha1-HnOCaQDeKNbeVIC8HeMdCEKwa+w=",
"dev": true,
"requires": {
"sentence-case": "^1.1.2"
}
},
"dot-prop": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
@ -10965,6 +11018,12 @@
"value-equal": "^1.0.1"
}
},
"hjson": {
"version": "1.8.4",
"resolved": "https://registry.npmjs.org/hjson/-/hjson-1.8.4.tgz",
"integrity": "sha1-C8j/sCGY0hjEm1iZGxH2BIUBHTY=",
"dev": true
},
"hmac-drbg": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
@ -11782,6 +11841,15 @@
"integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
"dev": true
},
"is-lower-case": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz",
"integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=",
"dev": true,
"requires": {
"lower-case": "^1.1.0"
}
},
"is-number": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
@ -11938,6 +12006,15 @@
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
"dev": true
},
"is-upper-case": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz",
"integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=",
"dev": true,
"requires": {
"upper-case": "^1.1.0"
}
},
"is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
@ -13587,6 +13664,12 @@
"resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
"integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U="
},
"lodash.assign": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
"integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
"dev": true
},
"lodash.escape": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz",
@ -13833,6 +13916,21 @@
"signal-exit": "^3.0.0"
}
},
"lower-case": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
"integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
"dev": true
},
"lower-case-first": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz",
"integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=",
"dev": true,
"requires": {
"lower-case": "^1.1.2"
}
},
"lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@ -14086,6 +14184,268 @@
}
}
},
"merge-config": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-config/-/merge-config-2.0.0.tgz",
"integrity": "sha1-ek7GSj/tIGcu5JgSFsreq1pS+Cg=",
"dev": true,
"requires": {
"change-case": "^2.2.0",
"hjson": "^1.6.1",
"js-yaml": "3.5.3",
"lodash": "^4.5.0",
"therror": "^0.2.0",
"yargs": "^4.1.0"
},
"dependencies": {
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
},
"camelcase": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
"integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
"dev": true
},
"cliui": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
"integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
"dev": true,
"requires": {
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1",
"wrap-ansi": "^2.0.0"
}
},
"esprima": {
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
"integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
"dev": true
},
"find-up": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
"integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
"dev": true,
"requires": {
"path-exists": "^2.0.0",
"pinkie-promise": "^2.0.0"
}
},
"get-caller-file": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
"integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
"dev": true
},
"invert-kv": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
"integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
"dev": true
},
"is-fullwidth-code-point": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"requires": {
"number-is-nan": "^1.0.0"
}
},
"js-yaml": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.3.tgz",
"integrity": "sha1-6e5ggrBld3DkNG368qWMWZIlH3Y=",
"dev": true,
"requires": {
"argparse": "^1.0.2",
"esprima": "^2.6.0"
}
},
"lcid": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
"integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
"dev": true,
"requires": {
"invert-kv": "^1.0.0"
}
},
"load-json-file": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"parse-json": "^2.2.0",
"pify": "^2.0.0",
"pinkie-promise": "^2.0.0",
"strip-bom": "^2.0.0"
}
},
"os-locale": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
"integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
"dev": true,
"requires": {
"lcid": "^1.0.0"
}
},
"parse-json": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
"integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
"dev": true,
"requires": {
"error-ex": "^1.2.0"
}
},
"path-exists": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
"integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
"dev": true,
"requires": {
"pinkie-promise": "^2.0.0"
}
},
"path-type": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
"integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"pify": "^2.0.0",
"pinkie-promise": "^2.0.0"
}
},
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true
},
"read-pkg": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
"integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
"dev": true,
"requires": {
"load-json-file": "^1.0.0",
"normalize-package-data": "^2.3.2",
"path-type": "^1.0.0"
}
},
"read-pkg-up": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
"integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
"dev": true,
"requires": {
"find-up": "^1.0.0",
"read-pkg": "^1.0.0"
}
},
"require-main-filename": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
"integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
"dev": true
},
"string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
"strip-ansi": "^3.0.0"
}
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
}
},
"strip-bom": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
"integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
"dev": true,
"requires": {
"is-utf8": "^0.2.0"
}
},
"which-module": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
"integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
"dev": true
},
"wrap-ansi": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
"dev": true,
"requires": {
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1"
}
},
"y18n": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
"integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
"dev": true
},
"yargs": {
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz",
"integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=",
"dev": true,
"requires": {
"cliui": "^3.2.0",
"decamelize": "^1.1.1",
"get-caller-file": "^1.0.1",
"lodash.assign": "^4.0.3",
"os-locale": "^1.4.0",
"read-pkg-up": "^1.0.1",
"require-directory": "^2.1.1",
"require-main-filename": "^1.0.1",
"set-blocking": "^2.0.0",
"string-width": "^1.0.1",
"which-module": "^1.0.0",
"window-size": "^0.2.0",
"y18n": "^3.2.1",
"yargs-parser": "^2.4.1"
}
},
"yargs-parser": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz",
"integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=",
"dev": true,
"requires": {
"camelcase": "^3.0.0",
"lodash.assign": "^4.0.6"
}
}
}
},
"merge-deep": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz",
@ -15384,6 +15744,15 @@
"readable-stream": "^2.1.5"
}
},
"param-case": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-1.1.2.tgz",
"integrity": "sha1-3LCRpDwlm5Io8cNB57akTqC/l0M=",
"dev": true,
"requires": {
"sentence-case": "^1.1.2"
}
},
"parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@ -15449,6 +15818,16 @@
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"dev": true
},
"pascal-case": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-1.1.2.tgz",
"integrity": "sha1-Pl1kogBDgwp8STRMLXS0G+DJyZs=",
"dev": true,
"requires": {
"camel-case": "^1.1.1",
"upper-case-first": "^1.1.0"
}
},
"pascalcase": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
@ -15461,6 +15840,15 @@
"integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
"dev": true
},
"path-case": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/path-case/-/path-case-1.1.2.tgz",
"integrity": "sha1-UM5roNO+090LXCqcRVNpdDRAlRQ=",
"dev": true,
"requires": {
"sentence-case": "^1.1.2"
}
},
"path-dirname": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
@ -18039,6 +18427,15 @@
}
}
},
"sentence-case": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-1.1.3.tgz",
"integrity": "sha1-gDSq/CFFdy06vhUJqkLJ4QQtwTk=",
"dev": true,
"requires": {
"lower-case": "^1.1.1"
}
},
"serialize-javascript": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz",
@ -18233,6 +18630,15 @@
"is-fullwidth-code-point": "^2.0.0"
}
},
"snake-case": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/snake-case/-/snake-case-1.1.2.tgz",
"integrity": "sha1-DC8l4wUVjZoY09l3BmGH/vilpmo=",
"dev": true,
"requires": {
"sentence-case": "^1.1.2"
}
},
"snapdragon": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
@ -19485,6 +19891,16 @@
}
}
},
"swap-case": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz",
"integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=",
"dev": true,
"requires": {
"lower-case": "^1.1.1",
"upper-case": "^1.1.1"
}
},
"symbol-observable": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
@ -19595,6 +20011,12 @@
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"dev": true
},
"therror": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/therror/-/therror-0.2.0.tgz",
"integrity": "sha1-g0L/I55OhDwoel9TlW+w3HtgX+4=",
"dev": true
},
"thread-loader": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz",
@ -19688,6 +20110,16 @@
"resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz",
"integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g="
},
"title-case": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/title-case/-/title-case-1.1.2.tgz",
"integrity": "sha1-+uSmrlRr+iLQg6DuqRCkDRLtT1o=",
"dev": true,
"requires": {
"sentence-case": "^1.1.1",
"upper-case": "^1.0.3"
}
},
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@ -20177,6 +20609,21 @@
"integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
"dev": true
},
"upper-case": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
"integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
"dev": true
},
"upper-case-first": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz",
"integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=",
"dev": true,
"requires": {
"upper-case": "^1.1.1"
}
},
"uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
@ -20804,6 +21251,12 @@
}
}
},
"window-size": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz",
"integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=",
"dev": true
},
"windows-release": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz",

View File

@ -40,7 +40,8 @@
"test:update": "wp-scripts test-unit-js --updateSnapshot --config tests/js/jest.config.json",
"test:watch": "npm run test -- --watch",
"size-check": "bundlewatch",
"changelog": "node ./bin/changelog"
"changelog": "node ./bin/changelog",
"changelog:zenhub": "node ./bin/changelog --changelogSrcType='ZENHUB_RELEASE'"
},
"devDependencies": {
"@babel/core": "7.8.3",
@ -85,6 +86,7 @@
"husky": "2.4.1",
"ignore-loader": "0.1.2",
"lint-staged": "9.5.0",
"merge-config": "^2.0.0",
"mini-css-extract-plugin": "0.9.0",
"node-sass": "4.13.1",
"postcss-loader": "3.0.0",
@ -163,7 +165,7 @@
"labelPrefix": "type:",
"skipLabel": "skip-changelog",
"defaultPrefix": "dev",
"zenhub": true
"repo": "woocommerce/woocommerce-gutenberg-products-block"
},
"files": [
"assets/**/*.{js,scss,php}",