diff --git a/src/.prettierrc b/src/.prettierrc new file mode 100644 index 00000000..544138be --- /dev/null +++ b/src/.prettierrc @@ -0,0 +1,3 @@ +{ + "singleQuote": true +} diff --git a/src/README.md b/src/README.md index 6dd40306..96ab1701 100644 --- a/src/README.md +++ b/src/README.md @@ -6,7 +6,7 @@ > This is a sample project that helps you to implement your own deployment builder (`ng deploy`) for the Angular CLI. > The actual "deployment" is only a simple copy to another folder in the file system. > ->**Learn more at +> **Learn more at > https://github.com/angular-schule/ngx-deploy-starter** ## Usage @@ -23,18 +23,17 @@ Deploy your project to the file system. ng deploy [options] ``` - ## Options The following options are also available. - #### --configuration - * __optional__ - * Default: `production` (string) - * Example: - * `ng deploy` – Angular project is build in production mode - * `ng deploy --configuration=test` – Angular project is using the configuration `test` (this configuration must exist in the `angular.json` file) + +- **optional** +- Default: `production` (string) +- Example: + - `ng deploy` – Angular project is build in production mode + - `ng deploy --configuration=test` – Angular project is using the configuration `test` (this configuration must exist in the `angular.json` file) A named build target, as specified in the `configurations` section of `angular.json`. Each named target is accompanied by a configuration of option defaults for that target. @@ -43,13 +42,13 @@ This command has no effect if the option `--no-build` option is active. > **This is a proposal from [RFC #1](https://github.com/angular-schule/ngx-deploy-starter/issues/1).** - #### --no-build - * __optional__ - * Default: `false` (string) - * Example: - * `ng deploy` – Angular project is build in production mode before the deployment - * `ng deploy --no-build` – Angular project is NOT build + +- **optional** +- Default: `false` (string) +- Example: + - `ng deploy` – Angular project is build in production mode before the deployment + - `ng deploy --no-build` – Angular project is NOT build Skip build process during deployment. This can be used when you are sure that you haven't changed anything and want to deploy with the latest artifact. @@ -57,23 +56,23 @@ This command causes the `--configuration` setting to have no effect. > **This is a proposal from [RFC #1](https://github.com/angular-schule/ngx-deploy-starter/issues/1).** - #### --target-dir - * __optional__ - * Default: `/example-folder` (string) - * Example: - * `ng deploy` -- App is "deployed" to the example folder (if existing) - * `ng deploy --target=/var/www/html` -- App is "deployed" to another folder -> **This is one of the options you can freely choose according to your needs.** +- **optional** +- Default: `/example-folder` (string) +- Example: + - `ng deploy` -- App is "deployed" to the example folder (if existing) + - `ng deploy --target=/var/www/html` -- App is "deployed" to another folder +> **This is one of the options you can freely choose according to your needs.** #### --base-href - * __optional__ - * Default: `undefined` (string) - * Example: - * `ng deploy` -- `` remains unchanged in your `index.html` - * `ng deploy --base-href=/the-repositoryname/` -- `` is added to your `index.html` + +- **optional** +- Default: `undefined` (string) +- Example: + - `ng deploy` -- `` remains unchanged in your `index.html` + - `ng deploy --base-href=/the-repositoryname/` -- `` is added to your `index.html` Specifies the base URL for the application being built. Same as `ng build --base-href=/XXX/` diff --git a/src/deploy/actions.spec.ts b/src/deploy/actions.spec.ts index 253aee5a..1a56d3b7 100644 --- a/src/deploy/actions.spec.ts +++ b/src/deploy/actions.spec.ts @@ -1,9 +1,14 @@ import { JsonObject, logging } from '@angular-devkit/core'; -import { BuilderContext, BuilderRun, ScheduleOptions, Target } from '@angular-devkit/architect/src/index'; +import { + BuilderContext, + BuilderRun, + ScheduleOptions, + Target +} from '@angular-devkit/architect/src/index'; import deploy from './actions'; let context: BuilderContext; -const mockEngine = { run: (_: string, __: any, __2: any) => Promise.resolve() } +const mockEngine = { run: (_: string, __: any, __2: any) => Promise.resolve() }; const PROJECT = 'pirojok-project'; @@ -14,7 +19,8 @@ describe('Deploy Angular apps', () => { const spy = spyOn(context, 'scheduleTarget').and.callThrough(); await deploy(mockEngine, context, 'host', {}); - expect(spy).toHaveBeenCalledWith({ + expect(spy).toHaveBeenCalledWith( + { target: 'build', configuration: 'production', project: PROJECT @@ -25,9 +31,10 @@ describe('Deploy Angular apps', () => { it('should invoke the builder with the baseHref', async () => { const spy = spyOn(context, 'scheduleTarget').and.callThrough(); - await deploy(mockEngine, context, 'host', { baseHref: '/folder'}); + await deploy(mockEngine, context, 'host', { baseHref: '/folder' }); - expect(spy).toHaveBeenCalledWith({ + expect(spy).toHaveBeenCalledWith( + { target: 'build', configuration: 'production', project: PROJECT @@ -72,15 +79,17 @@ const initMocks = () => { id: 1, logger: new logging.NullLogger() as any, workspaceRoot: 'cwd', - addTeardown: _ => { }, + addTeardown: _ => {}, validateOptions: _ => Promise.resolve({} as any), getBuilderNameForTarget: () => Promise.resolve(''), analytics: null as any, getTargetOptions: (_: Target) => Promise.resolve({}), - reportProgress: (_: number, __?: number, ___?: string) => { }, - reportStatus: (_: string) => { }, - reportRunning: () => { }, - scheduleBuilder: (_: string, __?: JsonObject, ___?: ScheduleOptions) => Promise.resolve({} as BuilderRun), - scheduleTarget: (_: Target, __?: JsonObject, ___?: ScheduleOptions) => Promise.resolve({} as BuilderRun) + reportProgress: (_: number, __?: number, ___?: string) => {}, + reportStatus: (_: string) => {}, + reportRunning: () => {}, + scheduleBuilder: (_: string, __?: JsonObject, ___?: ScheduleOptions) => + Promise.resolve({} as BuilderRun), + scheduleTarget: (_: Target, __?: JsonObject, ___?: ScheduleOptions) => + Promise.resolve({} as BuilderRun) }; }; diff --git a/src/deploy/actions.ts b/src/deploy/actions.ts index 1cd2937d..40e8a95f 100644 --- a/src/deploy/actions.ts +++ b/src/deploy/actions.ts @@ -3,41 +3,55 @@ import { json, logging } from '@angular-devkit/core'; import { Schema } from './schema'; - export default async function deploy( - engine: { run: (dir: string, options: Schema, logger: logging.LoggerApi) => Promise }, + engine: { + run: ( + dir: string, + options: Schema, + logger: logging.LoggerApi + ) => Promise; + }, context: BuilderContext, projectRoot: string, options: Schema ) { - if (options.noBuild) { context.logger.info(`📦 Skipping build`); } else { - if (!context.target) { throw new Error('Cannot execute the build target'); } - const configuration = options.configuration ? options.configuration : 'production' + const configuration = options.configuration + ? options.configuration + : 'production'; const overrides = { // this is an example how to override the workspace set of options - ...(options.baseHref && {baseHref: options.baseHref}) + ...(options.baseHref && { baseHref: options.baseHref }) }; - context.logger.info(`📦 Building "${ context.target.project }". Configuration: "${ configuration }".${ options.baseHref ? ' Your base-href: "' + options.baseHref + '"' : '' }`); - - const build = await context.scheduleTarget({ - target: 'build', - project: context.target.project, - configuration - }, overrides as json.JsonObject); + context.logger.info( + `📦 Building "${ + context.target.project + }". Configuration: "${configuration}".${ + options.baseHref ? ' Your base-href: "' + options.baseHref + '"' : '' + }` + ); + + const build = await context.scheduleTarget( + { + target: 'build', + project: context.target.project, + configuration + }, + overrides as json.JsonObject + ); await build.result; } await engine.run( projectRoot, options, - context.logger as unknown as logging.LoggerApi + (context.logger as unknown) as logging.LoggerApi ); } diff --git a/src/deploy/builder.ts b/src/deploy/builder.ts index 11242673..6edd17f7 100644 --- a/src/deploy/builder.ts +++ b/src/deploy/builder.ts @@ -1,4 +1,8 @@ -import { BuilderContext, BuilderOutput, createBuilder } from '@angular-devkit/architect'; +import { + BuilderContext, + BuilderOutput, + createBuilder +} from '@angular-devkit/architect'; import { asWindowsPath, experimental, normalize } from '@angular-devkit/core'; import { NodeJsSyncHost } from '@angular-devkit/core/node'; import os from 'os'; @@ -11,10 +15,7 @@ import { Schema } from './schema'; // Call the createBuilder() function to create a builder. This mirrors // createJobHandler() but add typings specific to Architect Builders. export default createBuilder( - async ( - options: Schema, - context: BuilderContext - ): Promise => { + async (options: Schema, context: BuilderContext): Promise => { // The project root is added to a BuilderContext. const root = normalize(context.workspaceRoot); const workspace = new experimental.workspace.Workspace( @@ -43,7 +44,9 @@ export default createBuilder( // normalizes pathes don't work with all native functions // as a workaround, you can use the following 2 lines const isWin = os.platform() === 'win32'; - const workspaceRoot = !isWin ? workspace.root : asWindowsPath(workspace.root); + const workspaceRoot = !isWin + ? workspace.root + : asWindowsPath(workspace.root); // if this is not necessary, use this: // const workspaceRoot = workspace.root; diff --git a/src/engine/engine.spec.ts b/src/engine/engine.spec.ts index e63cb890..f7d71371 100644 --- a/src/engine/engine.spec.ts +++ b/src/engine/engine.spec.ts @@ -3,7 +3,6 @@ import { NullLogger } from '@angular-devkit/core/src/logger'; describe('engine', () => { it('should copy directory', () => { - // TODO: really write test here! expect(1 + 1).toEqual(2); }); diff --git a/src/engine/engine.ts b/src/engine/engine.ts index a640845f..94e29c8c 100644 --- a/src/engine/engine.ts +++ b/src/engine/engine.ts @@ -4,22 +4,25 @@ import * as fse from 'fs-extra'; import { Schema } from '../deploy/schema'; // TODO: add your deployment code here! -export async function run(dir: string, options: Schema, logger: logging.LoggerApi) { - +export async function run( + dir: string, + options: Schema, + logger: logging.LoggerApi +) { try { - options.targetDir = options.targetDir || '/example-folder'; - if (!await fse.pathExists(options.targetDir)) { - throw new Error(`Target directory ${ options.targetDir } does not exist!`); + if (!(await fse.pathExists(options.targetDir))) { + throw new Error(`Target directory ${options.targetDir} does not exist!`); } - await fse.copy(dir, options.targetDir) + await fse.copy(dir, options.targetDir); - logger.info('🚀 Successfully published via @angular-schule/ngx-deploy-starter! Have a nice day!'); - } - catch (error) { + logger.info( + '🚀 Successfully published via @angular-schule/ngx-deploy-starter! Have a nice day!' + ); + } catch (error) { logger.error('❌ An error occurred!'); throw error; } -}; +} diff --git a/src/ng-add.spec.ts b/src/ng-add.spec.ts index 0ddf2e57..0fce01c1 100644 --- a/src/ng-add.spec.ts +++ b/src/ng-add.spec.ts @@ -20,11 +20,12 @@ describe('ng-add', () => { project: PROJECT_NAME })(tree, {} as SchematicContext); - expect(result.read('angular.json')!.toString()).toEqual(initialAngularJson); + expect(result.read('angular.json')!.toString()).toEqual( + initialAngularJson + ); }); it('overrides existing files', async () => { - const tempTree = ngAdd({ project: PROJECT_NAME })(tree, {} as SchematicContext); @@ -41,7 +42,6 @@ describe('ng-add', () => { describe('error handling', () => { it('fails if project not defined', () => { - const tree = Tree.empty(); const angularJSON = generateAngularJson(); delete angularJSON.defaultProject; @@ -51,7 +51,9 @@ describe('ng-add', () => { ngAdd({ project: '' })(tree, {} as SchematicContext) - ).toThrowError('No Angular project selected and no default project in the workspace'); + ).toThrowError( + 'No Angular project selected and no default project in the workspace' + ); }); it('Should throw if angular.json not found', async () => { @@ -81,7 +83,9 @@ describe('ng-add', () => { ngAdd({ project: PROJECT_NAME })(tree, {} as SchematicContext) - ).toThrowError('The specified Angular project is not defined in this workspace'); + ).toThrowError( + 'The specified Angular project is not defined in this workspace' + ); }); it('Should throw if specified project is not application', async () => { @@ -97,7 +101,9 @@ describe('ng-add', () => { ngAdd({ project: PROJECT_NAME })(tree, {} as SchematicContext) - ).toThrowError('Deploy requires an Angular project type of "application" in angular.json'); + ).toThrowError( + 'Deploy requires an Angular project type of "application" in angular.json' + ); }); it('Should throw if app does not have architect configured', async () => { @@ -113,7 +119,9 @@ describe('ng-add', () => { ngAdd({ project: PROJECT_NAME })(tree, {} as SchematicContext) - ).toThrowError('Cannot read the output path (architect.build.options.outputPath) of the Angular project "pie-ka-chu" in angular.json'); + ).toThrowError( + 'Cannot read the output path (architect.build.options.outputPath) of the Angular project "pie-ka-chu" in angular.json' + ); }); }); }); @@ -215,4 +223,3 @@ const overwriteAngularJson = `{ } } }`; - diff --git a/src/ng-add.ts b/src/ng-add.ts index 124a956b..c67b3d9f 100644 --- a/src/ng-add.ts +++ b/src/ng-add.ts @@ -1,4 +1,8 @@ -import { SchematicsException, Tree, SchematicContext } from '@angular-devkit/schematics'; +import { + SchematicsException, + Tree, + SchematicContext +} from '@angular-devkit/schematics'; import { experimental, JsonParseMode, parseJson } from '@angular-devkit/core'; function getWorkspace( @@ -68,9 +72,7 @@ export const ngAdd = (options: NgAddOptions) => ( !project.architect.build.options.outputPath ) { throw new SchematicsException( - `Cannot read the output path (architect.build.options.outputPath) of the Angular project "${ - options.project - }" in angular.json` + `Cannot read the output path (architect.build.options.outputPath) of the Angular project "${options.project}" in angular.json` ); } diff --git a/src/package-lock.json b/src/package-lock.json index b1900ce4..353a1694 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -1,5 +1,5 @@ { - "name": "@angular-schule/ngx-deploy-starter", + "name": "@kauppfbi/ngx-deploy-starter", "version": "0.0.2", "lockfileVersion": 1, "requires": true, @@ -576,6 +576,12 @@ "integrity": "sha512-+YB9FtyxXGyD54p8rXwWaN1EWEyar5L58GlGWgtH2I9rGmLGBQcw63+0jw+ujqVavNuO47S1ByAjm9zdHMnskw==", "dev": true }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, "@types/prettier": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.18.1.tgz", @@ -706,18 +712,45 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-differ": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", + "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==", + "dev": true + }, "array-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -1000,6 +1033,32 @@ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", "dev": true }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1163,6 +1222,13 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true, + "optional": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -1279,6 +1345,18 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -1921,8 +1999,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -1943,14 +2020,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1965,20 +2040,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -2108,7 +2180,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2123,7 +2194,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2131,14 +2201,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -2157,7 +2225,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -2238,8 +2305,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -2251,7 +2317,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -2337,8 +2402,7 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -2374,7 +2438,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2394,7 +2457,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2438,14 +2500,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -2461,6 +2521,12 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -2517,9 +2583,9 @@ "dev": true }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.3.4.tgz", + "integrity": "sha512-vvpo6mpK4ScNC1DbGRZ2d5BznS6ht0r1hi20RivsibMc6jNvFAeZQ6qk5VNspo6SOwVOJQbjHyBCpuS7BzA1pw==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -2631,6 +2697,100 @@ "sshpk": "^1.7.0" } }, + "husky": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-3.0.7.tgz", + "integrity": "sha512-fIrkaREoQk6DO8KnSX16Aq7Kg9SxqYYQZH/9b+4AxXyXNNgpJLsc8lWlQCShLus1nbujIyZ/WQZBHGwClohK/w==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cosmiconfig": "^5.2.1", + "execa": "^1.0.0", + "get-stdin": "^7.0.0", + "is-ci": "^2.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "read-pkg": "^5.1.1", + "run-node": "^1.0.0", + "slash": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -2640,6 +2800,22 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -2779,6 +2955,12 @@ } } }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -3644,6 +3826,12 @@ "type-check": "~0.3.2" } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -3695,6 +3883,16 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, "lru-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", @@ -3901,12 +4099,30 @@ } } }, + "mri": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "multimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz", + "integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==", + "dev": true, + "requires": { + "array-differ": "^2.0.3", + "array-union": "^1.0.2", + "arrify": "^1.0.1", + "minimatch": "^3.0.4" + } + }, "mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -4163,6 +4379,12 @@ "integrity": "sha512-4/4BPGHX8OuDDNx1SrOqTOI7zajPjvBvrG1jDG3hDq4qBpoKlzG2d83Vdz26hvv0FFWYsLdHf+1Vu/k2d8Ww9w==", "dev": true }, + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "dev": true + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -4358,6 +4580,15 @@ "find-up": "^3.0.0" } }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", @@ -4394,6 +4625,97 @@ "react-is": "^16.8.4" } }, + "pretty-quick": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-1.11.1.tgz", + "integrity": "sha512-kSXCkcETfak7EQXz6WOkCeCqpbC4GIzrN/vaneTGMP/fAtD8NerA9bPhCUqHAks1geo7biZNl5uEMPceeneLuA==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "execa": "^0.8.0", + "find-up": "^2.1.0", + "ignore": "^3.3.7", + "mri": "^1.1.0", + "multimatch": "^3.0.0" + }, + "dependencies": { + "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=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -4410,6 +4732,12 @@ "sisteransi": "^1.0.0" } }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, "psl": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", @@ -4646,6 +4974,12 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, + "run-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", + "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", + "dev": true + }, "rxjs": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", @@ -4705,6 +5039,12 @@ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -5342,6 +5682,12 @@ "prelude-ls": "~1.1.2" } }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + }, "typescript": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", @@ -5359,13 +5705,6 @@ "source-map": "~0.6.1" }, "dependencies": { - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true, - "optional": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5658,6 +5997,12 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", diff --git a/src/package.json b/src/package.json index 18b66d4b..fc5f52b7 100644 --- a/src/package.json +++ b/src/package.json @@ -41,8 +41,11 @@ "@types/jest": "^24.0.18", "@types/node": "^12.6.9", "copyfiles": "^2.1.1", + "husky": "^3.0.7", "jest": "^24.8.0", "json-schema-to-typescript": "^7.0.0", + "prettier": "1.18.2", + "pretty-quick": "^1.11.1", "rimraf": "^2.6.3", "ts-jest": "^24.0.2", "typescript": "^3.5.3" @@ -55,6 +58,11 @@ "dependencies": { "fs-extra": "^8.1.0" }, + "husky": { + "hooks": { + "pre-commit": "pretty-quick --staged" + } + }, "jest": { "transform": { "^.+\\.tsx?$": "ts-jest"