diff --git a/package-lock.json b/package-lock.json index 1214ea4c..da0ca4c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,14 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/runtime": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.3.tgz", + "integrity": "sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -78,6 +86,11 @@ "@types/node": "*" } }, + "@types/yaml": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/yaml/-/yaml-1.0.2.tgz", + "integrity": "sha512-rS1VJFjyGKNHk8H97COnPIK+oeLnc0J9G0ES63o/Ky+WlJCeaFGiGCTGhV/GEVKua7ZWIV1JIDopYUwrfvTo7A==" + }, "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", @@ -244,9 +257,9 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" }, "compare-func": { "version": "1.3.2", @@ -1395,6 +1408,11 @@ "strip-indent": "^2.0.0" } }, + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", @@ -1718,9 +1736,9 @@ "dev": true }, "typescript": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.1.tgz", - "integrity": "sha512-3NSMb2VzDQm8oBTLH6Nj55VVtUEpe/rgkIzMir0qVoLyjDZlnMBva0U6vDiV3IH+sl/Yu6oP5QwsAQtHPmDd2Q==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.2.tgz", + "integrity": "sha512-Og2Vn6Mk7JAuWA1hQdDQN/Ekm/SchX80VzLhjKN9ETYrIepBFAd8PkOdOTK2nKt0FCkmMZKBJvQ1dV1gIxPu/A==", "dev": true }, "uglify-js": { @@ -1732,6 +1750,15 @@ "requires": { "commander": "~2.19.0", "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true, + "optional": true + } } }, "universalify": { @@ -1779,6 +1806,14 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, + "yaml": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.5.0.tgz", + "integrity": "sha512-nKxSWOa7vxAP2pikrGxbkZsG/garQseRiLn9mIDjzwoQsyVy7ZWIpLoARejnINGGLA4fttuzRFFNxxbsztdJgw==", + "requires": { + "@babel/runtime": "^7.4.3" + } + }, "yn": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz", diff --git a/package.json b/package.json index 6261c4b4..38c3a53f 100644 --- a/package.json +++ b/package.json @@ -24,10 +24,12 @@ "license": "GPL-3.0-only", "dependencies": { "@types/node": "10.14.4", + "@types/yaml": "1.0.2", "chalk": "2.4.2", - "commander": "2.19.0", + "commander": "2.20.0", "tslint": "5.15.0", - "tslint-eslint-rules": "5.4.0" + "tslint-eslint-rules": "5.4.0", + "yaml": "1.5.0" }, "devDependencies": { "conventional-changelog-cli": "2.0.12", @@ -35,10 +37,10 @@ "rimraf": "2.6.3", "ts-node": "8.0.3", "typedoc": "0.14.2", - "typescript": "3.4.1" + "typescript": "3.4.2" }, "peerDependencies": { - "typescript": "^3.4.0" + "typescript": "^3.4.2" }, "bin": { "openstapps-configuration": "lib/cli.js" diff --git a/src/cli.ts b/src/cli.ts index 769b09c6..8432a35b 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -18,7 +18,8 @@ import {copyFileSync, existsSync, readFileSync, writeFileSync} from 'fs'; import {resolve, sep} from 'path'; import {cwd} from 'process'; import {isDeepStrictEqual} from 'util'; -import {EXPECTED_LICENSES, NEEDED_FILES, NYC_CONFIGURATION, SCRIPTS} from './configuration'; +import {parse, stringify} from 'yaml'; +import {EXPECTED_CI_CONFIG, EXPECTED_LICENSES, NEEDED_FILES, NYC_CONFIGURATION, SCRIPTS} from './configuration'; /* tslint:disable:no-console */ @@ -28,7 +29,7 @@ import {EXPECTED_LICENSES, NEEDED_FILES, NYC_CONFIGURATION, SCRIPTS} from './con */ function consoleInfo(...args: string[]): void { args.forEach((arg) => { - console.info(chalk.cyan(arg)); + console.info('\n' + chalk.cyan(arg)); }); } @@ -38,7 +39,7 @@ function consoleInfo(...args: string[]): void { */ function consoleWarn(...args: string[]): void { args.forEach((arg) => { - console.warn(chalk.red.bold(arg)); + console.warn('\n' + chalk.red.bold(arg)); }); } @@ -48,7 +49,7 @@ function consoleWarn(...args: string[]): void { */ function consoleLog(...args: string[]): void { args.forEach((arg) => { - console.log(chalk.green.bold(arg)); + console.log('\n' + chalk.green.bold(arg)); }); } @@ -157,16 +158,46 @@ Object.keys(SCRIPTS).forEach((scriptName) => { // check if script exists if (typeof scriptToCheck === 'undefined' || commander.replace) { - packageJson.scripts[scriptName] = SCRIPTS[scriptName]; + packageJson.scripts[scriptName] = SCRIPTS[scriptName].replace('\n', '\\n'); packageJsonChanged = true; consoleInfo(`Added "${scriptName}" script to "${packageJsonPath}".`); } else if (typeof scriptToCheck === 'string' && scriptToCheck !== SCRIPTS[scriptName]) { - consoleWarn(`NPM script "${scriptName}" should be "${SCRIPTS[scriptName]}".`); + consoleWarn(`NPM script "${scriptName}" should be "${SCRIPTS[scriptName].replace('\n', '\\n')}".`); } }); +// check CI config if it exists +const pathToCiConfig = resolve(path, '.gitlab-ci.yml'); +if (existsSync(pathToCiConfig)) { + // read CI config + const buffer = readFileSync(pathToCiConfig); + try { + const ciConfig = parse(buffer.toString()); + + // check entries + for (const entry in EXPECTED_CI_CONFIG) { + if (!EXPECTED_CI_CONFIG.hasOwnProperty(entry)) { + continue; + } + + if (!isDeepStrictEqual(EXPECTED_CI_CONFIG[entry], ciConfig[entry])) { + consoleWarn(`Entry '${entry}' in ${pathToCiConfig} is incorrect. Expected value is:`); + consoleInfo(stringify((() => { + const completeEntry: any = {}; + completeEntry[entry] = EXPECTED_CI_CONFIG[entry]; + return completeEntry; + })())); + } + } + } catch (error) { + consoleWarn(`Could not parse ${pathToCiConfig} because of '${error.message}'. +Please ensure consistency of CI config manually.`); + consoleInfo(stringify(EXPECTED_CI_CONFIG)); + } +} + if (packageJsonChanged) { writeFileSync(resolve(path, 'package.json'), JSON.stringify(packageJson, null, 2)); consoleLog(`Changes were written to "${packageJsonPath}".`); diff --git a/src/configuration.ts b/src/configuration.ts index 1d86a286..05110ba5 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -72,3 +72,52 @@ export const EXPECTED_LICENSES = [ 'AGPL-3.0-only', 'GPL-3.0-only', ]; + +/* tslint:disable:object-literal-sort-keys */ +/** + * Expected values in CI config + */ +export const EXPECTED_CI_CONFIG: any = { + image: 'registry.gitlab.com/openstapps/projectmanagement/node', + cache: { + key: '${CI_COMMIT_REF_SLUG}', + paths: [ + 'node_modules', + ], + }, + audit: { + allow_failure: true, + except: [ + 'schedules', + ], + script: [ + 'npm audit', + ], + stage: 'test', + }, + 'scheduled-audit': { + only: [ + 'schedules', + ], + script: [ + 'npm audit', + ], + stage: 'test', + }, + pages: { + artifacts: { + 'paths': [ + 'public', + ], + }, + only: [ + '/^v[0-9]+\\.[0-9]+\\.[0-9]+$/', + ], + script: [ + 'npm run documentation', + 'mv docs public', + ], + stage: 'deploy', + }, +}; +/* tslint:enable */