From 9d95a0ba01cfa89ca0f26ca221ff4861f894564e Mon Sep 17 00:00:00 2001 From: Ahmad Awais Date: Sun, 14 Jan 2018 21:35:03 +0500 Subject: [PATCH 1/7] =?UTF-8?q?=F0=9F=93=A6=20NEW:=20Eject=20Script?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 10 +- packages/cgb-scripts/config/paths.js | 18 ++ packages/cgb-scripts/eject/paths.js | 16 ++ packages/cgb-scripts/package-lock.json | 310 ++++++++++++++++++++++++- packages/cgb-scripts/package.json | 3 + packages/cgb-scripts/scripts/eject.js | 306 ++++++++++++++++++++++++ packages/cgb-scripts/scripts/test.js | 2 + 7 files changed, 663 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4fa4acf0..e71b5c42 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -28,4 +28,12 @@ First of all, I'd like to welcome you for thinking about contributing to this pr - Run `npm start` or `yarn start` - This will compile your code in `dist` and you're good to go. - Run `yarn updated` to check which npm packages were updated -- Finally publish with 'yarn publishNPM' since yarn has some issues with publishing with lerna not sure why. \ No newline at end of file +- Finally publish with 'yarn publishNPM' since yarn has some issues with publishing with lerna not sure why. + + + +### Other Stuff + +- Use `// @remove-file-on-eject` to do just that. +- Use `// @remove-on-eject-begin` to do just that. +- Use `// @remove-on-eject-end` to do just that. \ No newline at end of file diff --git a/packages/cgb-scripts/config/paths.js b/packages/cgb-scripts/config/paths.js index 4bf1e3fc..b1121419 100644 --- a/packages/cgb-scripts/config/paths.js +++ b/packages/cgb-scripts/config/paths.js @@ -11,8 +11,26 @@ const fs = require( 'fs' ); const pluginDir = fs.realpathSync( process.cwd() ); const resolveApp = relativePath => path.resolve( pluginDir, relativePath ); +// Config after eject: we're in ./config/ module.exports = { dotenv: resolveApp( '.env' ), pluginBlocksJs: resolveApp( 'src/blocks.js' ), + yarnLockFile: resolveApp( 'yarn.lock' ), pluginDist: resolveApp( '.' ), // We are in ./dist folder already so the path '.' resolves to ./dist/. }; + +// @remove-on-eject-begin +const resolveOwn = relativePath => path.resolve( __dirname, '..', relativePath ); + +// config before eject: we're in ./node_modules/react-scripts/config/ +module.exports = { + dotenv: resolveApp( '.env' ), + pluginBlocksJs: resolveApp( 'src/blocks.js' ), + pluginDist: resolveApp( '.' ), // We are in ./dist folder already so the path '.' resolves to ./dist/. + yarnLockFile: resolveApp( 'yarn.lock' ), + appPath: resolveApp( '.' ), + // These properties only exist before ejecting: + ownPath: resolveOwn( '.' ), +}; + +console.log( resolveApp( '.' ) ); diff --git a/packages/cgb-scripts/eject/paths.js b/packages/cgb-scripts/eject/paths.js index 4bf1e3fc..02be3ccf 100644 --- a/packages/cgb-scripts/eject/paths.js +++ b/packages/cgb-scripts/eject/paths.js @@ -11,8 +11,24 @@ const fs = require( 'fs' ); const pluginDir = fs.realpathSync( process.cwd() ); const resolveApp = relativePath => path.resolve( pluginDir, relativePath ); +// Config after eject: we're in ./config/ module.exports = { dotenv: resolveApp( '.env' ), pluginBlocksJs: resolveApp( 'src/blocks.js' ), pluginDist: resolveApp( '.' ), // We are in ./dist folder already so the path '.' resolves to ./dist/. }; + +// @remove-on-eject-begin +const resolveOwn = relativePath => path.resolve( __dirname, '..', relativePath ); + +// config before eject: we're in ./node_modules/react-scripts/config/ +module.exports = { + dotenv: resolveApp( '.env' ), + pluginBlocksJs: resolveApp( 'src/blocks.js' ), + pluginDist: resolveApp( '.' ), // We are in ./dist folder already so the path '.' resolves to ./dist/. + appPath: resolveApp( '.' ), + // These properties only exist before ejecting: + ownPath: resolveOwn( '.' ), +}; + +console.log( ownPath ); diff --git a/packages/cgb-scripts/package-lock.json b/packages/cgb-scripts/package-lock.json index 2d5395fa..5f2e1c59 100644 --- a/packages/cgb-scripts/package-lock.json +++ b/packages/cgb-scripts/package-lock.json @@ -1,19 +1,116 @@ { "name": "cgb-scripts", - "version": "0.1.2", + "version": "0.1.4", "lockfileVersion": 1, "requires": true, "dependencies": { + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.1" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "1.0.5" + } + }, "filesize": { "version": "3.5.11", "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==" }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, "gzip-size": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz", @@ -23,10 +120,221 @@ "pify": "3.0.0" } }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "inquirer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.0.0.tgz", + "integrity": "sha512-p/UAvVLKRI9fLukkVeeSnP05Ilz76+7najkJptTKOMJApaqJhdwxLGlIymYvn0a1WFqrEG8MqfzKfVMvArwdIQ==", + "requires": { + "ansi-escapes": "3.0.0", + "chalk": "2.3.0", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.4", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rxjs": "5.5.6", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + } + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "2.1.0" + } + }, + "rxjs": { + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz", + "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==", + "requires": { + "symbol-observable": "1.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "2.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "2.0.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" } } } diff --git a/packages/cgb-scripts/package.json b/packages/cgb-scripts/package.json index cb58105c..8ab1811c 100644 --- a/packages/cgb-scripts/package.json +++ b/packages/cgb-scripts/package.json @@ -22,6 +22,7 @@ "cgb-dev-utils": "^0.0.7", "chalk": "2.3.0", "cross-env": "^5.0.1", + "cross-spawn": "^5.1.0", "eslint": "^4.15.0", "eslint-config-wordpress": "^2.0.0", "eslint-plugin-jest": "^21.6.1", @@ -30,7 +31,9 @@ "eslint-plugin-wordpress": "^0.1.0", "extract-text-webpack-plugin": "^3.0.2", "filesize": "^3.5.11", + "fs-extra": "^5.0.0", "gzip-size": "^4.1.0", + "inquirer": "^5.0.0", "node-sass": "^4.7.2", "ora": "^1.3.0", "postcss-loader": "^2.0.10", diff --git a/packages/cgb-scripts/scripts/eject.js b/packages/cgb-scripts/scripts/eject.js index d38770b8..2a189690 100644 --- a/packages/cgb-scripts/scripts/eject.js +++ b/packages/cgb-scripts/scripts/eject.js @@ -12,3 +12,309 @@ * - printBuildError */ 'use strict'; + +// @remove-file-on-eject + +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on( 'unhandledRejection', err => { + throw err; +} ); + +const fs = require( 'fs-extra' ); +const path = require( 'path' ); +const execSync = require( 'child_process' ).execSync; +const chalk = require( 'chalk' ); +const paths = require( '../config/paths' ); +const inquirer = require( 'inquirer' ); +const spawnSync = require( 'cross-spawn' ).sync; + +const green = chalk.green; +const cyan = chalk.cyan; + +function getGitStatus() { + try { + const stdout = execSync( 'git status --porcelain', { + stdio: [ 'pipe', 'pipe', 'ignore' ], + } ).toString(); + return stdout.trim(); + } catch ( e ) { + return ''; + } +} + +inquirer + .prompt( { + type: 'confirm', + name: 'shouldEject', + message: 'Are you sure you want to eject? This action is permanent.', + default: false, + } ) + .then( answer => { + if ( ! answer.shouldEject ) { + console.log( cyan( 'Close one! Eject aborted.' ) ); + return; + } + + const gitStatus = getGitStatus(); + if ( gitStatus ) { + console.error( + chalk.red( + 'This git repository has untracked files or uncommitted changes:' + ) + + '\n\n' + + gitStatus + .split( '\n' ) + .map( line => line.match( / .*/g )[ 0 ].trim() ) + .join( '\n' ) + + '\n\n' + + chalk.red( + 'Remove untracked files, stash or commit any changes, and try again.' + ) + ); + process.exit( 1 ); + } + + console.log( 'Ejecting...' ); + + const ownPath = paths.ownPath; + const appPath = paths.appPath; + + function verifyAbsent( file ) { + if ( fs.existsSync( path.join( appPath, file ) ) ) { + console.error( + `\`${ file }\` already exists in your app folder. We cannot ` + + 'continue as you would lose all the changes in that file or directory. ' + + 'Please move or delete it (maybe make a copy for backup) and run this ' + + 'command again.' + ); + process.exit( 1 ); + } + } + + const folders = [ 'config', 'scripts' ]; + + // Make shallow array of files paths. + const files = folders.reduce( ( files, folder ) => { + return files.concat( + fs + .readdirSync( path.join( ownPath, folder ) ) + // Set full path. + .map( file => path.join( ownPath, folder, file ) ) + // Omit dirs from file list. + .filter( file => fs.lstatSync( file ).isFile() ) + ); + }, [] ); + + // Ensure that the app folder is clean and we won't override any files + folders.forEach( verifyAbsent ); + files.forEach( verifyAbsent ); + + console.log(); + console.log( cyan( `Copying files into ${ appPath }` ) ); + + folders.forEach( folder => { + fs.mkdirSync( path.join( appPath, folder ) ); + } ); + + files.forEach( file => { + let content = fs.readFileSync( file, 'utf8' ); + + // Skip flagged files. + if ( content.match( /\/\/ @remove-file-on-eject/ ) ) { + return; + } + content = + content + // Remove dead code from .js files on eject. + .replace( + /\/\/ @remove-on-eject-begin([\s\S]*?)\/\/ @remove-on-eject-end/gm, + '' + ) + // Remove dead code from .applescript files on eject. + .replace( + /-- @remove-on-eject-begin([\s\S]*?)-- @remove-on-eject-end/gm, + '' + ) + .trim() + '\n'; + console.log( ` Adding ${ cyan( file.replace( ownPath, '' ) ) } to the project` ); + fs.writeFileSync( file.replace( ownPath, appPath ), content ); + } ); + console.log(); + + // Select cgb-scripts/package.json file. + const ownPackage = require( path.join( ownPath, 'package.json' ) ); + + // Assume a file called package.json file in current folder. + const appPackage = require( path.join( appPath, 'package.json' ) ); + + console.log( cyan( 'Updating the dependencies' ) ); + + // Name: cgb-scripts. + const ownPackageName = ownPackage.name; + + // Del cgb-scripts from devDep if there. + if ( appPackage.devDependencies ) { + // We used to put cgb-scripts in devDependencies. + if ( appPackage.devDependencies[ ownPackageName ] ) { + console.log( ` Removing ${ cyan( ownPackageName ) } from devDependencies` ); + delete appPackage.devDependencies[ ownPackageName ]; + } + } + + // Dependencies. + appPackage.dependencies = appPackage.dependencies || {}; + if ( appPackage.dependencies[ ownPackageName ] ) { + // Del cgb-scripts from dependencies now. + console.log( ` Removing ${ cyan( ownPackageName ) } from dependencies` ); + delete appPackage.dependencies[ ownPackageName ]; + } + + // For some reason optionalDependencies end up in dependencies after install. + Object.keys( ownPackage.dependencies ).forEach( key => { + if ( ownPackage.optionalDependencies[ key ] ) { + return; + } + console.log( ` Adding ${ cyan( key ) } to dependencies` ); + appPackage.dependencies[ key ] = ownPackage.dependencies[ key ]; + } ); + + // Sort the dependencies because we are that good :). + const unsortedDependencies = appPackage.dependencies; + appPackage.dependencies = {}; + Object.keys( unsortedDependencies ) + .sort() + .forEach( key => { + appPackage.dependencies[ key ] = unsortedDependencies[ key ]; + } ); + console.log(); + + // Update the scripts. + console.log( cyan( 'Updating the scripts' ) ); + + // Del the eject script. + delete appPackage.scripts.eject; + + // Build the scripts. + Object.keys( appPackage.scripts ).forEach( key => { + Object.keys( ownPackage.bin ).forEach( binKey => { + const regex = new RegExp( binKey + ' (\\w+)', 'g' ); + if ( ! regex.test( appPackage.scripts[ key ] ) ) { + return; + } + appPackage.scripts[ key ] = appPackage.scripts[ key ].replace( + regex, + 'node scripts/$1.js' + ); + console.log( + ` Replacing ${ cyan( `"${ binKey } ${ key }"` ) } with ${ cyan( + `"node scripts/${ key }.js"` + ) }` + ); + } ); + } ); + + console.log(); + console.log( cyan( 'Configuring package.json' ) ); + + // Add Babel config. + console.log( ` Adding ${ cyan( 'Babel' ) } preset` ); + appPackage.babel = { + presets: [ + [ + 'env', + { + modules: false, + targets: { + browsers: [ + 'last 2 Chrome versions', + 'last 2 Firefox versions', + 'last 2 Safari versions', + 'last 2 iOS versions', + 'last 1 Android version', + 'last 1 ChromeAndroid version', + 'ie 11', + ], + }, + }, + ], + ], + plugins: [ + [ 'transform-object-rest-spread' ], + [ + 'transform-object-rest-spread', + { + useBuiltIns: true, + }, + ], + [ + 'transform-react-jsx', + { + pragma: 'wp.element.createElement', + }, + ], + [ + 'transform-runtime', + { + helpers: false, + polyfill: false, + regenerator: true, + }, + ], + ], + }; + + // // Add ESlint config — already there. + // console.log( ` Adding ${ cyan( 'ESLint' ) } configuration` ); + + fs.writeFileSync( + path.join( appPath, 'package.json' ), + JSON.stringify( appPackage, null, 2 ) + '\n' + ); + console.log(); + + // "Don't destroy what isn't ours". + if ( ownPath.indexOf( appPath ) === 0 ) { + try { + // Remove cgb-scripts and cgb-scripts binaries from app node_modules. + Object.keys( ownPackage.bin ).forEach( binKey => { + fs.removeSync( path.join( appPath, 'node_modules', '.bin', binKey ) ); + } ); + fs.removeSync( ownPath ); + } catch ( e ) { + // It's not essential that this succeeds. + } + } + + if ( fs.existsSync( paths.yarnLockFile ) ) { + // TODO: this is disabled for three reasons. + // + // 1. It produces garbage warnings on Windows on some systems: + // https://github.com/facebookincubator/create-react-app/issues/2030 + // + // 2. For the above reason, it breaks Windows CI: + // https://github.com/facebookincubator/create-react-app/issues/2624 + // + // 3. It is wrong anyway: re-running yarn will respect the lockfile + // rather than package.json we just updated. Instead we should have + // updated the lockfile. So we might as well not do it while it's broken. + // https://github.com/facebookincubator/create-react-app/issues/2627 + // + // console.log(cyan('Running yarn...')); + // spawnSync('yarnpkg', [], { stdio: 'inherit' }); + } else { + console.log( cyan( 'Running npm install...' ) ); + spawnSync( 'npm', [ 'install', '--loglevel', 'error' ], { + stdio: 'inherit', + } ); + } + console.log( green( 'Ejected successfully!' ) ); + console.log(); + + console.log( + green( 'Please consider sharing why you ejected in this survey:' ) + ); + console.log( green( ' http://goo.gl/forms/ADDDDD' ) ); + console.log(); + } ); diff --git a/packages/cgb-scripts/scripts/test.js b/packages/cgb-scripts/scripts/test.js index 6af0a9c9..0fa723ca 100644 --- a/packages/cgb-scripts/scripts/test.js +++ b/packages/cgb-scripts/scripts/test.js @@ -1,2 +1,4 @@ +// @remove-file-on-eject + console.clear(); console.log( 'MANUAL TEST!' ); From 12734fda46f1f728d8c445af51746ee62a47c9f0 Mon Sep 17 00:00:00 2001 From: Ahmad Awais Date: Sun, 14 Jan 2018 21:36:14 +0500 Subject: [PATCH 2/7] =?UTF-8?q?=F0=9F=91=8C=20IMPROVE:=20Yarn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yarn.lock | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index 3a6e00be..4e8a2233 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2014,7 +2014,7 @@ extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" -external-editor@^2.0.4: +external-editor@^2.0.4, external-editor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" dependencies: @@ -2182,6 +2182,14 @@ fs-extra@^4.0.1: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2638,6 +2646,24 @@ inquirer@^3.0.6, inquirer@^3.2.2: strip-ansi "^4.0.0" through "^2.3.6" +inquirer@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.0.0.tgz#261b77cdb535495509f1b90197108ffb96c02db5" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.1.0" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^5.5.2" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + interpret@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" @@ -4237,6 +4263,12 @@ rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" +rxjs@^5.5.2: + version "5.5.6" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02" + dependencies: + symbol-observable "1.0.1" + safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -4558,6 +4590,10 @@ supports-color@^5.1.0: dependencies: has-flag "^2.0.0" +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + table@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" From 0f51380be0044c23441e260f1eba0c5d3df90a4a Mon Sep 17 00:00:00 2001 From: Ahmad Awais Date: Sun, 14 Jan 2018 21:36:48 +0500 Subject: [PATCH 3/7] =?UTF-8?q?=F0=9F=9A=80=20RELEASE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cgb-scripts@0.1.5 - create-guten-block@1.1.3 --- packages/cgb-scripts/package.json | 2 +- packages/create-guten-block/package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/cgb-scripts/package.json b/packages/cgb-scripts/package.json index 8ab1811c..8101c849 100644 --- a/packages/cgb-scripts/package.json +++ b/packages/cgb-scripts/package.json @@ -1,6 +1,6 @@ { "name": "cgb-scripts", - "version": "0.1.4", + "version": "0.1.5", "description": "Configuration and scripts for Create Guten Blocks.", "repository": "ahmadawais/create-guten-block", "license": "MIT", diff --git a/packages/create-guten-block/package.json b/packages/create-guten-block/package.json index 5daf9280..d73d7573 100644 --- a/packages/create-guten-block/package.json +++ b/packages/create-guten-block/package.json @@ -1,6 +1,6 @@ { "name": "create-guten-block", - "version": "1.1.2", + "version": "1.1.3", "description": "Create a gutenberg block plugin on the go.", "main": "index.js", "keywords": [ @@ -19,7 +19,7 @@ }, "homepage": "https://github.com/ahmadawais/create-guten-block#readme", "dependencies": { - "cgb-scripts": "^0.1.4", + "cgb-scripts": "^0.1.5", "chalk": "^2.3.0", "directory-exists": "^1.0.2", "execa": "^0.9.0", From cab5f31f872947a82a9c49a43d7e6cf969fe1494 Mon Sep 17 00:00:00 2001 From: Ahmad Awais Date: Sun, 14 Jan 2018 22:07:56 +0500 Subject: [PATCH 4/7] =?UTF-8?q?=F0=9F=90=9B=20FIX:=20Eject=20code=20remova?= =?UTF-8?q?l?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/cgb-scripts/config/paths.js | 3 +-- .../cgb-scripts/config/webpack.config.dev.js | 2 ++ .../cgb-scripts/config/webpack.config.prod.js | 2 ++ packages/cgb-scripts/scripts/eject.js | 16 +++++++++++----- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/cgb-scripts/config/paths.js b/packages/cgb-scripts/config/paths.js index b1121419..5ffe939e 100644 --- a/packages/cgb-scripts/config/paths.js +++ b/packages/cgb-scripts/config/paths.js @@ -32,5 +32,4 @@ module.exports = { // These properties only exist before ejecting: ownPath: resolveOwn( '.' ), }; - -console.log( resolveApp( '.' ) ); +// @remove-on-eject-end diff --git a/packages/cgb-scripts/config/webpack.config.dev.js b/packages/cgb-scripts/config/webpack.config.dev.js index 2ccc9c1c..28979e89 100644 --- a/packages/cgb-scripts/config/webpack.config.dev.js +++ b/packages/cgb-scripts/config/webpack.config.dev.js @@ -93,8 +93,10 @@ module.exports = { use: { loader: 'babel-loader', options: { + // @remove-on-eject-begin babelrc: false, presets: [ require.resolve( 'babel-preset-cgb' ) ], + // @remove-on-eject-end // This is a feature of `babel-loader` for webpack (not Babel itself). // It enables caching results in ./node_modules/.cache/babel-loader/ // directory for faster rebuilds. diff --git a/packages/cgb-scripts/config/webpack.config.prod.js b/packages/cgb-scripts/config/webpack.config.prod.js index 3919f236..0328ec8b 100644 --- a/packages/cgb-scripts/config/webpack.config.prod.js +++ b/packages/cgb-scripts/config/webpack.config.prod.js @@ -93,8 +93,10 @@ module.exports = { use: { loader: 'babel-loader', options: { + // @remove-on-eject-begin babelrc: false, presets: [ require.resolve( 'babel-preset-cgb' ) ], + // @remove-on-eject-end // This is a feature of `babel-loader` for webpack (not Babel itself). // It enables caching results in ./node_modules/.cache/babel-loader/ // directory for faster rebuilds. diff --git a/packages/cgb-scripts/scripts/eject.js b/packages/cgb-scripts/scripts/eject.js index 2a189690..7b365a23 100644 --- a/packages/cgb-scripts/scripts/eject.js +++ b/packages/cgb-scripts/scripts/eject.js @@ -29,10 +29,15 @@ const chalk = require( 'chalk' ); const paths = require( '../config/paths' ); const inquirer = require( 'inquirer' ); const spawnSync = require( 'cross-spawn' ).sync; +const resolvePkg = require( 'resolve-pkg' ); +const cgbDevUtilsPath = resolvePkg( 'cgb-dev-utils', { cwd: __dirname } ); +const clearConsole = require( cgbDevUtilsPath + '/clearConsole' ); const green = chalk.green; const cyan = chalk.cyan; +clearConsole(); + function getGitStatus() { try { const stdout = execSync( 'git status --porcelain', { @@ -53,7 +58,7 @@ inquirer } ) .then( answer => { if ( ! answer.shouldEject ) { - console.log( cyan( 'Close one! Eject aborted.' ) ); + console.log( cyan( '\n\nClose one! Eject aborted.\n\n' ) ); return; } @@ -171,11 +176,12 @@ inquirer delete appPackage.dependencies[ ownPackageName ]; } - // For some reason optionalDependencies end up in dependencies after install. + // Add deps to appPackage. Object.keys( ownPackage.dependencies ).forEach( key => { - if ( ownPackage.optionalDependencies[ key ] ) { - return; - } + // // For some reason optionalDependencies end up in dependencies after install. + // if ( ownPackage.optionalDependencies[ key ] ) { + // return; + // } console.log( ` Adding ${ cyan( key ) } to dependencies` ); appPackage.dependencies[ key ] = ownPackage.dependencies[ key ]; } ); From 6ef941baa709bac129bb3d4bae1cf9083c18c508 Mon Sep 17 00:00:00 2001 From: Ahmad Awais Date: Sun, 14 Jan 2018 22:09:36 +0500 Subject: [PATCH 5/7] =?UTF-8?q?=F0=9F=93=A6=20NEW:=20Lerna=20Script?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c5a82c17..ac438e6a 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,8 @@ "beforepublish": "lerna bootstrap", "publish": "bash tasks/publish.sh && echo 'Now update dependency packages.'", - "publishNPM": "bash tasks/publish.sh --npm-client=npm" + "publishNPM": "bash tasks/publish.sh --npm-client=npm", + "lerna": + "lerna updated && lerna bootstrap && lerna publish --independent --npm-client=npm" } } From 3d021373fd26436bd79060e52306983ba1516884 Mon Sep 17 00:00:00 2001 From: Ahmad Awais Date: Sun, 14 Jan 2018 22:10:11 +0500 Subject: [PATCH 6/7] =?UTF-8?q?=F0=9F=9A=80=20RELEASE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cgb-scripts@0.1.6 - create-guten-block@1.2.0 --- packages/cgb-scripts/package.json | 2 +- packages/create-guten-block/package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/cgb-scripts/package.json b/packages/cgb-scripts/package.json index 8101c849..f272d373 100644 --- a/packages/cgb-scripts/package.json +++ b/packages/cgb-scripts/package.json @@ -1,6 +1,6 @@ { "name": "cgb-scripts", - "version": "0.1.5", + "version": "0.1.6", "description": "Configuration and scripts for Create Guten Blocks.", "repository": "ahmadawais/create-guten-block", "license": "MIT", diff --git a/packages/create-guten-block/package.json b/packages/create-guten-block/package.json index d73d7573..1b777a2b 100644 --- a/packages/create-guten-block/package.json +++ b/packages/create-guten-block/package.json @@ -1,6 +1,6 @@ { "name": "create-guten-block", - "version": "1.1.3", + "version": "1.2.0", "description": "Create a gutenberg block plugin on the go.", "main": "index.js", "keywords": [ @@ -19,7 +19,7 @@ }, "homepage": "https://github.com/ahmadawais/create-guten-block#readme", "dependencies": { - "cgb-scripts": "^0.1.5", + "cgb-scripts": "^0.1.6", "chalk": "^2.3.0", "directory-exists": "^1.0.2", "execa": "^0.9.0", From f0f1ff2769b36a2e750c77f27d241be5a45fa9eb Mon Sep 17 00:00:00 2001 From: Ahmad Awais Date: Sun, 14 Jan 2018 22:15:01 +0500 Subject: [PATCH 7/7] =?UTF-8?q?=F0=9F=93=96=20DOC:=20Publish=20workflow=20?= =?UTF-8?q?caveats?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e71b5c42..67044615 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,10 +29,16 @@ First of all, I'd like to welcome you for thinking about contributing to this pr - This will compile your code in `dist` and you're good to go. - Run `yarn updated` to check which npm packages were updated - Finally publish with 'yarn publishNPM' since yarn has some issues with publishing with lerna not sure why. +- Check caveats for publishing. +### 🤔 Caveats +- Some issue with yarn not being able to publish via lerna +- Use yarn with everything else but lerna +- To publish always run via `npm` this command `npm run lerna` -### Other Stuff + +### 🐵 Other Stuff - Use `// @remove-file-on-eject` to do just that. - Use `// @remove-on-eject-begin` to do just that.