Merge branch 'dev'
# Conflicts: # yarn.lock
This commit is contained in:
		@@ -1 +1,2 @@
 | 
			
		||||
**/*.template.js
 | 
			
		||||
**/*.d.ts
 | 
			
		||||
/dist/
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * Copyright (C) SapphireCode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, April 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,4 +1,5 @@
 | 
			
		||||
/node_modules/
 | 
			
		||||
/dist/
 | 
			
		||||
 | 
			
		||||
# stryker temp files
 | 
			
		||||
.stryker-tmp
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								.liconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.liconfig.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
{
 | 
			
		||||
  "has_license": true,
 | 
			
		||||
  "license": "BSD-3-Clause",
 | 
			
		||||
  "author": "Timo Hocker",
 | 
			
		||||
  "company": "SapphireCode",
 | 
			
		||||
  "email": "timo@scode.ovh",
 | 
			
		||||
  "software": "Snippeteer"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							@@ -5,7 +5,7 @@ pipeline {
 | 
			
		||||
        VERSION = VersionNumber([
 | 
			
		||||
            versionNumberString:
 | 
			
		||||
                '${BUILDS_ALL_TIME}',
 | 
			
		||||
            versionPrefix: '1.1.',
 | 
			
		||||
            versionPrefix: '1.2.',
 | 
			
		||||
            worstResultForIncrement: 'SUCCESS'
 | 
			
		||||
        ])
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,3 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-process-exit */
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
/* eslint-disable no-sync */
 | 
			
		||||
@@ -22,6 +15,8 @@ fs.writeFileSync ('package.json', JSON.stringify (pkg, null, 2));
 | 
			
		||||
child_process.execSync ('yarn lint', { stdio: 'inherit' });
 | 
			
		||||
if (typeof pkg.scripts !== 'undefined' && typeof pkg.scripts.test === 'string')
 | 
			
		||||
  child_process.execSync ('yarn test', { stdio: 'inherit' });
 | 
			
		||||
if (typeof pkg.scripts !== 'undefined' && typeof pkg.scripts.compile === 'string')
 | 
			
		||||
  child_process.execSync ('yarn compile', { stdio: 'inherit' });
 | 
			
		||||
 | 
			
		||||
child_process.exec ('git log -1 | grep \'\\[no publish\\]\'')
 | 
			
		||||
  .addListener ('exit', (code) => {
 | 
			
		||||
							
								
								
									
										48
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								index.js
									
									
									
									
									
								
							@@ -1,52 +1,14 @@
 | 
			
		||||
#!/usr/bin/env node
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * Copyright (C) SapphireCode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, April 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
/* eslint-disable global-require */
 | 
			
		||||
/* eslint-disable no-sync */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const { argv } = require ('yargs');
 | 
			
		||||
const path = require ('path');
 | 
			
		||||
const fs = require ('fs-extra');
 | 
			
		||||
 | 
			
		||||
const [
 | 
			
		||||
  template,
 | 
			
		||||
  ...args
 | 
			
		||||
] = argv._;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * main function
 | 
			
		||||
 */
 | 
			
		||||
function main () {
 | 
			
		||||
  if (typeof template !== 'string') {
 | 
			
		||||
    console.log ('please specify a template');
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (
 | 
			
		||||
    !fs.existsSync (path.join (__dirname, 'snippets', template))
 | 
			
		||||
    || !(/^[a-zA-Z]+$/u).test (template)
 | 
			
		||||
  ) {
 | 
			
		||||
    console.log ('template does not exist');
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const snippet = require (`./snippets/${template}/index.js`);
 | 
			
		||||
  const folder = process.cwd ();
 | 
			
		||||
 | 
			
		||||
  if (!snippet.assert (folder, args)) {
 | 
			
		||||
    console.log ('snippet rejected arguments');
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  snippet.run (folder, args);
 | 
			
		||||
}
 | 
			
		||||
main ();
 | 
			
		||||
// @ts-ignore
 | 
			
		||||
// eslint-disable-next-line node/no-missing-require
 | 
			
		||||
require ('./dist');
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * Copyright (C) SapphireCode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, April 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-process-exit */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * Copyright (C) SapphireCode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, April 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
@@ -12,7 +12,7 @@ module.exports = {
 | 
			
		||||
    node: true
 | 
			
		||||
  },
 | 
			
		||||
  extends: [
 | 
			
		||||
    '@scode'
 | 
			
		||||
    '@scode/eslint-config-ts'
 | 
			
		||||
  ],
 | 
			
		||||
  globals: {
 | 
			
		||||
    Atomics: 'readonly',
 | 
			
		||||
							
								
								
									
										57
									
								
								lib/Helper.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								lib/Helper.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
import path from 'path';
 | 
			
		||||
import child_process from 'child_process';
 | 
			
		||||
import fs from 'fs-extra';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * write a template to a file
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} contents file contents
 | 
			
		||||
 * @param {string} destination file destination
 | 
			
		||||
 */
 | 
			
		||||
async function apply_template (
 | 
			
		||||
  contents: string,
 | 
			
		||||
  destination: string
 | 
			
		||||
): Promise<void> {
 | 
			
		||||
  const dst = path.join (process.cwd (), destination);
 | 
			
		||||
  if (!await fs.pathExists (dst)) {
 | 
			
		||||
    await fs.mkdirp (path.dirname (dst));
 | 
			
		||||
    await fs.writeFile (dst, contents);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type JSONMutator = {
 | 
			
		||||
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
			
		||||
  (json: any): any;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * modify a json file
 | 
			
		||||
 *
 | 
			
		||||
 * @param {Function} func function that modifies the object
 | 
			
		||||
 * @param {string} json_path path of json file
 | 
			
		||||
 */
 | 
			
		||||
async function modify_json (
 | 
			
		||||
  func: JSONMutator,
 | 
			
		||||
  json_path = 'package.json'
 | 
			
		||||
): Promise<void> {
 | 
			
		||||
  const file_path = path.join (process.cwd (), json_path);
 | 
			
		||||
  const content = JSON.parse (await fs.readFile (file_path, 'utf-8'));
 | 
			
		||||
  const new_obj = await func (content);
 | 
			
		||||
  await fs.writeFile (file_path, JSON.stringify (new_obj, null, 2));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * run a command
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} command command to run
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 */
 | 
			
		||||
function run_command (command: string, folder = ''): void {
 | 
			
		||||
  // eslint-disable-next-line no-sync
 | 
			
		||||
  child_process.execSync (
 | 
			
		||||
    command,
 | 
			
		||||
    { cwd: path.join (process.cwd (), folder), stdio: 'inherit' }
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export { modify_json, apply_template, run_command };
 | 
			
		||||
							
								
								
									
										10
									
								
								lib/Snippet.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								lib/Snippet.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) SapphireCode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, April 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
export interface Snippet {
 | 
			
		||||
  start(cwd: string): Promise<void>;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								lib/dialog.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								lib/dialog.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) SapphireCode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, April 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
export class DialogHandler {
 | 
			
		||||
  public static catch (): void {
 | 
			
		||||
    // eslint-disable-next-line no-process-exit
 | 
			
		||||
    process.exit ();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								lib/enquirer.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								lib/enquirer.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) SapphireCode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, April 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare module 'enquirer';
 | 
			
		||||
							
								
								
									
										26
									
								
								lib/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								lib/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) SapphireCode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, April 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import path from 'path';
 | 
			
		||||
import fs from 'fs-extra';
 | 
			
		||||
import { AutoComplete } from 'enquirer';
 | 
			
		||||
import { Snippet } from './Snippet';
 | 
			
		||||
 | 
			
		||||
(async (): Promise<void> => {
 | 
			
		||||
  const snippets = await fs.readdir (path.join (__dirname, 'snippets'));
 | 
			
		||||
  const snippet = await new AutoComplete (
 | 
			
		||||
    {
 | 
			
		||||
      name:    'snippet',
 | 
			
		||||
      message: 'choose a snippet',
 | 
			
		||||
      choices: snippets
 | 
			
		||||
    }
 | 
			
		||||
  )
 | 
			
		||||
    .run ();
 | 
			
		||||
  const runner
 | 
			
		||||
  = new (await import (`./snippets/${snippet}/index.js`)).default as Snippet;
 | 
			
		||||
  runner.start (process.cwd ());
 | 
			
		||||
}) ();
 | 
			
		||||
							
								
								
									
										41
									
								
								lib/snippets/copyright/copyright_generator.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								lib/snippets/copyright/copyright_generator.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) SapphireCode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, April 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { CopyrightOptions } from './copyright_options';
 | 
			
		||||
 | 
			
		||||
export class CopyrightGenerator {
 | 
			
		||||
  public static get_copyright_notice (
 | 
			
		||||
    opt: CopyrightOptions
 | 
			
		||||
  ): string {
 | 
			
		||||
    let notice = '';
 | 
			
		||||
    const date = (new Date);
 | 
			
		||||
    const dtf = new Intl.DateTimeFormat ('en', { month: 'long' });
 | 
			
		||||
    const year = date.getFullYear ();
 | 
			
		||||
    const month = dtf.format (date);
 | 
			
		||||
 | 
			
		||||
    if (opt.has_license) {
 | 
			
		||||
      notice = `${'/*'}
 | 
			
		||||
 * Copyright (C) ${opt.company || opt.author} - All Rights Reserved
 | 
			
		||||
 * This file is part of ${opt.software} which is released under ${
 | 
			
		||||
  opt.license}.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by ${opt.author} <${opt.email}>, ${month} ${year}
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
`;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      notice = `${'/*'}
 | 
			
		||||
 * Copyright (C) ${opt.company || opt.author} - All Rights Reserved
 | 
			
		||||
 * Created by ${opt.author} <${opt.email}>, ${month} ${year}
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
`;
 | 
			
		||||
    }
 | 
			
		||||
    return notice;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								lib/snippets/copyright/copyright_options.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								lib/snippets/copyright/copyright_options.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) SapphireCode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, April 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
export class CopyrightOptions {
 | 
			
		||||
  public has_license = false;
 | 
			
		||||
  public license = '';
 | 
			
		||||
  public author = '';
 | 
			
		||||
  public company = '';
 | 
			
		||||
  public email = '';
 | 
			
		||||
  public software = '';
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								lib/snippets/copyright/file_mapper.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								lib/snippets/copyright/file_mapper.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) SapphireCode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, April 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-await-in-loop */
 | 
			
		||||
import path from 'path';
 | 
			
		||||
import fs from 'fs-extra';
 | 
			
		||||
 | 
			
		||||
export class FileMapper {
 | 
			
		||||
  public static async map_all_files (
 | 
			
		||||
    folder: string,
 | 
			
		||||
    mutator: Function,
 | 
			
		||||
    args: Array<unknown> = []
 | 
			
		||||
  ): Promise<void> {
 | 
			
		||||
    const files = await fs.readdir (folder);
 | 
			
		||||
    for (const file of files) {
 | 
			
		||||
      if ([ 'node_modules' ].includes (file))
 | 
			
		||||
        continue;
 | 
			
		||||
      const abs_path = path.join (folder, file);
 | 
			
		||||
      if ((await fs.stat (abs_path)).isDirectory ()) {
 | 
			
		||||
        await FileMapper.map_all_files (abs_path, mutator, args);
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      const data = await fs.readFile (abs_path, 'utf-8');
 | 
			
		||||
      const res = mutator (data, file, args);
 | 
			
		||||
      if (res === null)
 | 
			
		||||
        continue;
 | 
			
		||||
      await fs.writeFile (abs_path, res, 'utf-8');
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										129
									
								
								lib/snippets/copyright/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								lib/snippets/copyright/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,129 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) SapphireCode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, April 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-await-in-loop */
 | 
			
		||||
import path from 'path';
 | 
			
		||||
import fs from 'fs-extra';
 | 
			
		||||
import { Confirm, Input, AutoComplete } from 'enquirer';
 | 
			
		||||
// eslint-disable-next-line id-match
 | 
			
		||||
import { findLicense } from 'license';
 | 
			
		||||
import { Snippet } from '../../Snippet';
 | 
			
		||||
import { DialogHandler } from '../../dialog';
 | 
			
		||||
import { CopyrightGenerator } from './copyright_generator';
 | 
			
		||||
import { FileMapper } from './file_mapper';
 | 
			
		||||
import { CopyrightOptions } from './copyright_options';
 | 
			
		||||
 | 
			
		||||
export default class Copyright implements Snippet {
 | 
			
		||||
  private options: CopyrightOptions | null = null;
 | 
			
		||||
  private cwd = '';
 | 
			
		||||
  private loaded_from_config = false;
 | 
			
		||||
 | 
			
		||||
  async start (cwd: string): Promise<void> {
 | 
			
		||||
    this.cwd = cwd;
 | 
			
		||||
    await this.load_options_file ();
 | 
			
		||||
    if (!this.options)
 | 
			
		||||
      await this.gather_options ();
 | 
			
		||||
 | 
			
		||||
    await FileMapper.map_all_files (
 | 
			
		||||
      this.cwd,
 | 
			
		||||
      this.fix_file_license.bind (this)
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    if (!this.loaded_from_config && await new Confirm (
 | 
			
		||||
      { message: 'should those settings be saved for the next run?' }
 | 
			
		||||
    )
 | 
			
		||||
      .run ()
 | 
			
		||||
      .catch (DialogHandler.catch))
 | 
			
		||||
      this.save_options_file ();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private async gather_options (): Promise<void> {
 | 
			
		||||
    this.options = (new CopyrightOptions);
 | 
			
		||||
    this.options.author = await new Input ({ message: 'author' })
 | 
			
		||||
      .run ()
 | 
			
		||||
      .catch (DialogHandler.catch);
 | 
			
		||||
    this.options.email = await new Input ({ message: 'email' })
 | 
			
		||||
      .run ()
 | 
			
		||||
      .catch (DialogHandler.catch);
 | 
			
		||||
    this.options.company = await new Input ({ message: 'company' })
 | 
			
		||||
      .run ()
 | 
			
		||||
      .catch (DialogHandler.catch);
 | 
			
		||||
    this.options.software = await new Input ({ message: 'software name' })
 | 
			
		||||
      .run ()
 | 
			
		||||
      .catch (DialogHandler.catch);
 | 
			
		||||
    this.options.has_license = await new Confirm ({
 | 
			
		||||
      message:
 | 
			
		||||
       'would you like to specify a license?'
 | 
			
		||||
    })
 | 
			
		||||
      .run ()
 | 
			
		||||
      .catch (DialogHandler.catch);
 | 
			
		||||
    if (this.options.has_license) {
 | 
			
		||||
      this.options.license = await new AutoComplete ({
 | 
			
		||||
        name:    'license',
 | 
			
		||||
        message: 'choose a license',
 | 
			
		||||
        limit:   10,
 | 
			
		||||
        choices: findLicense ('')
 | 
			
		||||
      })
 | 
			
		||||
        .run ()
 | 
			
		||||
        .catch (DialogHandler.catch);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private async load_options_file (): Promise<void> {
 | 
			
		||||
    const file_path = path.join (this.cwd, '.liconfig.json');
 | 
			
		||||
    this.options = null;
 | 
			
		||||
 | 
			
		||||
    if (await fs.pathExists (file_path)) {
 | 
			
		||||
      const options = JSON.parse (
 | 
			
		||||
        await fs.readFile (file_path, 'utf-8')
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
      // eslint-disable-next-line no-console
 | 
			
		||||
      console.log (`author: ${options.author}
 | 
			
		||||
email: ${options.email}
 | 
			
		||||
company: ${options.company}
 | 
			
		||||
software name: ${options.software}
 | 
			
		||||
license: ${options.license}`);
 | 
			
		||||
      const should_load = await new Confirm (
 | 
			
		||||
        { message: 'should those options be used?' }
 | 
			
		||||
      )
 | 
			
		||||
        .run ()
 | 
			
		||||
        .catch (DialogHandler.catch);
 | 
			
		||||
      if (should_load) {
 | 
			
		||||
        this.options = options;
 | 
			
		||||
        this.loaded_from_config = true;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private async save_options_file (): Promise<void> {
 | 
			
		||||
    const file_path = path.join (this.cwd, '.liconfig.json');
 | 
			
		||||
    await fs.writeFile (
 | 
			
		||||
      file_path,
 | 
			
		||||
      JSON.stringify (this.options, null, 2),
 | 
			
		||||
      'utf-8'
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private fix_file_license (
 | 
			
		||||
    data: string,
 | 
			
		||||
    filename: string
 | 
			
		||||
  ): string | null {
 | 
			
		||||
    const regex = /\/\*\s+\*\sCopyright[\s\S]*?\*\/\n{0,2}/gu;
 | 
			
		||||
    const shebang = /^#!.*?\n\n/gu;
 | 
			
		||||
    const shebang_line = shebang.exec (data);
 | 
			
		||||
 | 
			
		||||
    if (!(/\.(?:js|ts|mjs)$/u).test (filename) && !regex.test (data))
 | 
			
		||||
      return null;
 | 
			
		||||
    return (shebang_line ? shebang_line[0] : '')
 | 
			
		||||
     + CopyrightGenerator.get_copyright_notice (
 | 
			
		||||
       this.options as CopyrightOptions
 | 
			
		||||
     )
 | 
			
		||||
     + data.replace (regex, '')
 | 
			
		||||
       .replace (shebang, '');
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								lib/snippets/database/classes/Column.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								lib/snippets/database/classes/Column.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
import { ColumnType } from './ColumnType';
 | 
			
		||||
import { Relation } from './Relation';
 | 
			
		||||
 | 
			
		||||
export class Column {
 | 
			
		||||
  public name: string;
 | 
			
		||||
  public type: ColumnType;
 | 
			
		||||
  public relation?: Relation;
 | 
			
		||||
 | 
			
		||||
  public constructor (name: string, type: ColumnType) {
 | 
			
		||||
    this.name = name;
 | 
			
		||||
    this.type = type;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								lib/snippets/database/classes/ColumnType.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								lib/snippets/database/classes/ColumnType.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
export enum ColumnType {
 | 
			
		||||
  string = 'string',
 | 
			
		||||
  text = 'text',
 | 
			
		||||
  integer = 'integer',
 | 
			
		||||
  big_integer = 'bigInteger',
 | 
			
		||||
  float = 'float',
 | 
			
		||||
  decimal = 'decimal',
 | 
			
		||||
  increments = 'increments',
 | 
			
		||||
  big_increments = 'bigIncrements',
 | 
			
		||||
  boolean = 'boolean',
 | 
			
		||||
  date = 'date',
 | 
			
		||||
  date_time ='datetime',
 | 
			
		||||
  time = 'time',
 | 
			
		||||
  timestamp = 'timestamp',
 | 
			
		||||
  binary = 'binary',
 | 
			
		||||
  enum = 'enu',
 | 
			
		||||
  json='json',
 | 
			
		||||
  jsonb='jsonb',
 | 
			
		||||
  uuid='uuid'
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								lib/snippets/database/classes/Database.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								lib/snippets/database/classes/Database.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
import { Table } from './Table';
 | 
			
		||||
 | 
			
		||||
export class Database {
 | 
			
		||||
  public tables: Array<Table> = [];
 | 
			
		||||
 | 
			
		||||
  public get_table (name: string): Table|null {
 | 
			
		||||
    for (const table of this.tables) {
 | 
			
		||||
      if (table.name === name)
 | 
			
		||||
        return table;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return null;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5
									
								
								lib/snippets/database/classes/PatchAction.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								lib/snippets/database/classes/PatchAction.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
import { Database } from './Database';
 | 
			
		||||
 | 
			
		||||
export interface PatchAction {
 | 
			
		||||
  apply(db: Database): void;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								lib/snippets/database/classes/PatchActions.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								lib/snippets/database/classes/PatchActions.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
export enum PatchActions {
 | 
			
		||||
  rename_column = 'rc',
 | 
			
		||||
  add_column = 'ac',
 | 
			
		||||
  drop_column = 'dc',
 | 
			
		||||
  add_relation = 'ar',
 | 
			
		||||
  drop_relation = 'dr',
 | 
			
		||||
  set_column_type = 'tc',
 | 
			
		||||
  add_table = 'at',
 | 
			
		||||
  drop_table = 'dt',
 | 
			
		||||
  rename_table = 'rt',
 | 
			
		||||
  insert_data = 'id',
 | 
			
		||||
  update_data = 'ud',
 | 
			
		||||
  mutate_data = 'md',
 | 
			
		||||
  delete_data = 'dd'
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								lib/snippets/database/classes/Relation.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								lib/snippets/database/classes/Relation.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
export class Relation {
 | 
			
		||||
  public column: string;
 | 
			
		||||
  public table: string;
 | 
			
		||||
 | 
			
		||||
  public constructor (table: string, column: string) {
 | 
			
		||||
    this.column = column;
 | 
			
		||||
    this.table = table;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								lib/snippets/database/classes/Serializable.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								lib/snippets/database/classes/Serializable.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
export interface Serializable {
 | 
			
		||||
  serialize(): string;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								lib/snippets/database/classes/Table.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								lib/snippets/database/classes/Table.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
import { Column } from './Column';
 | 
			
		||||
 | 
			
		||||
export class Table {
 | 
			
		||||
  public name: string;
 | 
			
		||||
  public columns: Array<Column> = [];
 | 
			
		||||
 | 
			
		||||
  public constructor (name: string) {
 | 
			
		||||
    this.name = name;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public get_column (name: string): Column|null {
 | 
			
		||||
    for (const col of this.columns) {
 | 
			
		||||
      if (col.name === name)
 | 
			
		||||
        return col;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return null;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								lib/snippets/database/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								lib/snippets/database/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
import { Snippet } from '../../Snippet';
 | 
			
		||||
 | 
			
		||||
export default class Database implements Snippet {
 | 
			
		||||
  public start (): Promise<void> {
 | 
			
		||||
    // noop
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										42
									
								
								lib/snippets/database/patch_actions/RenameColumn.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								lib/snippets/database/patch_actions/RenameColumn.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
import { Serializable } from '../classes/Serializable';
 | 
			
		||||
import { PatchAction } from '../classes/PatchAction';
 | 
			
		||||
import { Database } from '../classes/Database';
 | 
			
		||||
 | 
			
		||||
export class RenameColumn implements Serializable, PatchAction {
 | 
			
		||||
  public table: string;
 | 
			
		||||
  public column: string;
 | 
			
		||||
  public new_name: string;
 | 
			
		||||
 | 
			
		||||
  public constructor (
 | 
			
		||||
    column: string,
 | 
			
		||||
    new_name: string|null = null,
 | 
			
		||||
    table: string|null = null
 | 
			
		||||
  ) {
 | 
			
		||||
    if (new_name === null || table === null) {
 | 
			
		||||
      const regex
 | 
			
		||||
      = /(?<table>[a-z_]+) (?<column>[a-z_]+) (?<new_name>[a-z_]+)/iu;
 | 
			
		||||
      const res = regex.exec (column);
 | 
			
		||||
      if (res === null || typeof res.groups === 'undefined')
 | 
			
		||||
        throw new Error ('invalid string to deserialize');
 | 
			
		||||
 | 
			
		||||
      this.column = res.groups.column;
 | 
			
		||||
      this.new_name = res.groups.new_name;
 | 
			
		||||
      this.table = res.groups.table;
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.column = column;
 | 
			
		||||
    this.table = table;
 | 
			
		||||
    this.new_name = new_name;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public serialize (): string {
 | 
			
		||||
    return `${this.table} ${this.column} ${this.new_name}`;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public apply (db: Database): void {
 | 
			
		||||
    const table = db.get_table (this.table);
 | 
			
		||||
    const column = table?.get_column(this.column);
 | 
			
		||||
    column?.name = this.new_name;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										102
									
								
								lib/snippets/jenkins/Assets.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								lib/snippets/jenkins/Assets.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,102 @@
 | 
			
		||||
/* eslint-disable max-len */
 | 
			
		||||
 | 
			
		||||
const general = { jenkinsfile: '' };
 | 
			
		||||
const node = { jenkinsfile: '', js: '' };
 | 
			
		||||
 | 
			
		||||
general.jenkinsfile = `pipeline {
 | 
			
		||||
  agent any
 | 
			
		||||
 | 
			
		||||
  environment {
 | 
			
		||||
      VERSION = VersionNumber([
 | 
			
		||||
          versionNumberString: 
 | 
			
		||||
              '\${BUILDS_ALL_TIME}',
 | 
			
		||||
          versionPrefix: '1.0.',
 | 
			
		||||
          worstResultForIncrement: 'SUCCESS'
 | 
			
		||||
      ])
 | 
			
		||||
      publish = 0
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  stages {
 | 
			
		||||
      stage('Setup') {
 | 
			
		||||
          steps {
 | 
			
		||||
              script {
 | 
			
		||||
                  currentBuild.displayName = env.VERSION
 | 
			
		||||
              }
 | 
			
		||||
              echo 'Setting up test environment'
 | 
			
		||||
              sh 'echo setup'
 | 
			
		||||
          }
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
  post {
 | 
			
		||||
      success {
 | 
			
		||||
          script {
 | 
			
		||||
              publish = sh script: "git log -1 | grep '\\\\[no publish\\\\]'", returnStatus: true
 | 
			
		||||
              if (publish != 0) {
 | 
			
		||||
                echo 'Deploying'
 | 
			
		||||
                sh 'echo deploy'
 | 
			
		||||
              } else {
 | 
			
		||||
                echo 'Build successful, Commit not marked for deploying'
 | 
			
		||||
                currentBuild.result = "UNSTABLE"
 | 
			
		||||
              }
 | 
			
		||||
          }
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
node.jenkinsfile = `pipeline {
 | 
			
		||||
  agent any
 | 
			
		||||
 | 
			
		||||
  environment {
 | 
			
		||||
      VERSION = VersionNumber([
 | 
			
		||||
          versionNumberString:
 | 
			
		||||
              '\${BUILDS_ALL_TIME}',
 | 
			
		||||
          versionPrefix: '1.0.',
 | 
			
		||||
          worstResultForIncrement: 'SUCCESS'
 | 
			
		||||
      ])
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  stages {
 | 
			
		||||
      stage('Building') {
 | 
			
		||||
          steps {
 | 
			
		||||
              script {
 | 
			
		||||
                  currentBuild.displayName = env.VERSION
 | 
			
		||||
              }
 | 
			
		||||
              sh 'yarn ci \${VERSION}'
 | 
			
		||||
          }
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
node.js = `/* eslint-disable no-process-exit */
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
/* eslint-disable no-sync */
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const fs = require ('fs');
 | 
			
		||||
const child_process = require ('child_process');
 | 
			
		||||
 | 
			
		||||
const pkg = JSON.parse (fs.readFileSync ('package.json', 'utf-8'));
 | 
			
		||||
[
 | 
			
		||||
  ,, pkg.version
 | 
			
		||||
] = process.argv;
 | 
			
		||||
fs.writeFileSync ('package.json', JSON.stringify (pkg, null, 2));
 | 
			
		||||
 | 
			
		||||
child_process.execSync ('yarn lint', { stdio: 'inherit' });
 | 
			
		||||
if (typeof pkg.scripts !== 'undefined' && typeof pkg.scripts.test === 'string')
 | 
			
		||||
  child_process.execSync ('yarn test', { stdio: 'inherit' });
 | 
			
		||||
if (typeof pkg.scripts !== 'undefined' && typeof pkg.scripts.compile === 'string')
 | 
			
		||||
  child_process.execSync ('yarn compile', { stdio: 'inherit' });
 | 
			
		||||
 | 
			
		||||
child_process.exec ('git log -1 | grep \\'\\\\[no publish\\\\]\\'')
 | 
			
		||||
  .addListener ('exit', (code) => {
 | 
			
		||||
    if (code === 0) {
 | 
			
		||||
      console.log ('build not marked for deployment');
 | 
			
		||||
      process.exit (1);
 | 
			
		||||
    }
 | 
			
		||||
    else { child_process.execSync ('yarn publish'); }
 | 
			
		||||
  });
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
export { general, node };
 | 
			
		||||
							
								
								
									
										35
									
								
								lib/snippets/jenkins/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								lib/snippets/jenkins/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) SapphireCode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, April 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { Confirm } from 'enquirer';
 | 
			
		||||
import { Snippet } from '../../Snippet';
 | 
			
		||||
import { apply_template, modify_json } from '../../Helper';
 | 
			
		||||
 | 
			
		||||
import { general, node } from './Assets';
 | 
			
		||||
 | 
			
		||||
export default class Jenkins implements Snippet {
 | 
			
		||||
  public async start (): Promise<void> {
 | 
			
		||||
    const is_node = await new Confirm ({
 | 
			
		||||
      message: 'is the current project using nodejs?',
 | 
			
		||||
      initial: true
 | 
			
		||||
    })
 | 
			
		||||
      .run ();
 | 
			
		||||
 | 
			
		||||
    if (is_node) {
 | 
			
		||||
      await apply_template (node.js, 'jenkins.js');
 | 
			
		||||
      await apply_template (node.jenkinsfile, 'Jenkinsfile');
 | 
			
		||||
      // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
			
		||||
      await modify_json ((obj: any): any => {
 | 
			
		||||
        obj.scripts.ci = 'yarn && node jenkins.js';
 | 
			
		||||
        return obj;
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      await apply_template (general.jenkinsfile, 'Jenkinsfile');
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										61
									
								
								lib/snippets/node/Assets.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								lib/snippets/node/Assets.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
const eslintrc = `module.exports = {
 | 
			
		||||
  env: {
 | 
			
		||||
    commonjs: true,
 | 
			
		||||
    es6: true,
 | 
			
		||||
    node: true
 | 
			
		||||
  },
 | 
			
		||||
  extends: [
 | 
			
		||||
    '@scode'
 | 
			
		||||
  ],
 | 
			
		||||
  globals: {
 | 
			
		||||
    Atomics: 'readonly',
 | 
			
		||||
    SharedArrayBuffer: 'readonly'
 | 
			
		||||
  },
 | 
			
		||||
  parserOptions: {
 | 
			
		||||
    ecmaVersion: 2018
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
const eslintrc_ts = `module.exports = {
 | 
			
		||||
  env: {
 | 
			
		||||
    commonjs: true,
 | 
			
		||||
    es6: true,
 | 
			
		||||
    node: true
 | 
			
		||||
  },
 | 
			
		||||
  extends: [
 | 
			
		||||
    '@scode/eslint-config-ts'
 | 
			
		||||
  ],
 | 
			
		||||
  globals: {
 | 
			
		||||
    Atomics: 'readonly',
 | 
			
		||||
    SharedArrayBuffer: 'readonly'
 | 
			
		||||
  },
 | 
			
		||||
  parserOptions: {
 | 
			
		||||
    ecmaVersion: 2018
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
const gitignore = `/node_modules/
 | 
			
		||||
/dist/
 | 
			
		||||
/.nyc_output/
 | 
			
		||||
/coverage/
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
const npmrc = `@scode:registry=https://npm.scode.ovh
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
const tsconfig = `{
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "target": "es5",
 | 
			
		||||
    "module": "commonjs",
 | 
			
		||||
    "outDir": "./dist", 
 | 
			
		||||
    "rootDir": "./lib",
 | 
			
		||||
    "strict": true, 
 | 
			
		||||
    "esModuleInterop": true,
 | 
			
		||||
    "forceConsistentCasingInFileNames": true  
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
export { eslintrc, gitignore, npmrc, tsconfig, eslintrc_ts };
 | 
			
		||||
							
								
								
									
										57
									
								
								lib/snippets/node/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								lib/snippets/node/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) SapphireCode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, April 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import path from 'path';
 | 
			
		||||
import { Input } from 'enquirer';
 | 
			
		||||
import { Snippet } from '../../Snippet';
 | 
			
		||||
import { apply_template, modify_json, run_command } from '../../Helper';
 | 
			
		||||
 | 
			
		||||
import { eslintrc, gitignore, npmrc, tsconfig, eslintrc_ts } from './Assets';
 | 
			
		||||
 | 
			
		||||
export default class Node implements Snippet {
 | 
			
		||||
  public async start (): Promise<void> {
 | 
			
		||||
    const folder = await new Input (
 | 
			
		||||
      { message: 'project name (leave empty for current folder):' }
 | 
			
		||||
    )
 | 
			
		||||
      .run ();
 | 
			
		||||
 | 
			
		||||
    const use_ts = await new confirm ({
 | 
			
		||||
      message: 'use typescript?',
 | 
			
		||||
      initial: false
 | 
			
		||||
    })
 | 
			
		||||
      .run ();
 | 
			
		||||
 | 
			
		||||
    await apply_template (eslintrc, path.join (folder, '.eslintrc.js'));
 | 
			
		||||
    await apply_template (npmrc, path.join (folder, '.npmrc'));
 | 
			
		||||
    await apply_template (gitignore, path.join (folder, '.gitignore'));
 | 
			
		||||
    if (use_ts) {
 | 
			
		||||
      await apply_template (tsconfig, path.join (folder, 'tsconfig.json'));
 | 
			
		||||
      await apply_template (
 | 
			
		||||
        eslintrc_ts,
 | 
			
		||||
        path.join (folder, 'lib', '.eslintrc.js')
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
    run_command ('git init', folder);
 | 
			
		||||
    run_command ('yarn init -y', folder);
 | 
			
		||||
    run_command (
 | 
			
		||||
      `yarn add --dev @scode/eslint-config${use_ts
 | 
			
		||||
        ? '-ts typescript @ava/typescript'
 | 
			
		||||
        : ''} eslint nyc ava`,
 | 
			
		||||
      folder
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    await modify_json ((obj: Record<string, unknown>) => {
 | 
			
		||||
      obj.scripts = {
 | 
			
		||||
        lint: 'eslint . --ext .js,.jsx,.ts,.tsx,.vue,.mjs',
 | 
			
		||||
        test: 'nyc ava'
 | 
			
		||||
      };
 | 
			
		||||
      if (use_ts)
 | 
			
		||||
        obj.scripts.compile = 'tsc';
 | 
			
		||||
      return obj;
 | 
			
		||||
    }, path.join (folder, 'package.json'));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								package.json
									
									
									
									
									
								
							@@ -16,18 +16,23 @@
 | 
			
		||||
    "url": "git@git.scode.ovh:timo/snippeteer"
 | 
			
		||||
  },
 | 
			
		||||
  "files": [
 | 
			
		||||
    "/snippets/",
 | 
			
		||||
    "/dist/",
 | 
			
		||||
    "/assets/",
 | 
			
		||||
    "LICENSE"
 | 
			
		||||
  ],
 | 
			
		||||
  "author": "Timo Hocker",
 | 
			
		||||
  "license": "BSD-3-Clause",
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@scode/eslint-config": "^2.0.2",
 | 
			
		||||
    "eslint": "^6.8.0"
 | 
			
		||||
    "@scode/eslint-config-ts": "^1.0.21",
 | 
			
		||||
    "@types/fs-extra": "^8.1.0",
 | 
			
		||||
    "@types/node": "^13.13.0",
 | 
			
		||||
    "eslint": "^6.8.0",
 | 
			
		||||
    "typescript": "^3.8.3"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "enquirer": "^2.3.5",
 | 
			
		||||
    "fs-extra": "^9.0.0",
 | 
			
		||||
    "yargs": "^15.1.0"
 | 
			
		||||
    "license": "^1.0.3"
 | 
			
		||||
  },
 | 
			
		||||
  "engines": {
 | 
			
		||||
    "node": ">=10.0.0"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,148 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-sync */
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
/* eslint-disable no-await-in-loop */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const fs = require ('fs-extra');
 | 
			
		||||
const path = require ('path');
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * scan all files and execute a mutation on them
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to scan
 | 
			
		||||
 * @param {Function} func function to execute on file contents
 | 
			
		||||
 */
 | 
			
		||||
async function map_all_files (folder, func) {
 | 
			
		||||
  const files = await fs.readdir (folder);
 | 
			
		||||
  for (const file of files) {
 | 
			
		||||
    if ([ 'node_modules' ].includes (file))
 | 
			
		||||
      continue;
 | 
			
		||||
    const abs_path = path.join (folder, file);
 | 
			
		||||
    if ((await fs.stat (abs_path)).isDirectory ()) {
 | 
			
		||||
      map_all_files (abs_path, func);
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
    const data = await fs.readFile (abs_path, 'utf-8');
 | 
			
		||||
    const res = func (data, file);
 | 
			
		||||
    if (res === null)
 | 
			
		||||
      continue;
 | 
			
		||||
    await fs.writeFile (abs_path, res, 'utf-8');
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * returns a copyright notice
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} license license name
 | 
			
		||||
 * @param {string} software software name
 | 
			
		||||
 * @returns {string} copyright notice
 | 
			
		||||
 */
 | 
			
		||||
function get_copyright_notice (license = '', software = '') {
 | 
			
		||||
  let notice = '';
 | 
			
		||||
  const date = (new Date);
 | 
			
		||||
  const dtf = new Intl.DateTimeFormat ('en', { month: 'long' });
 | 
			
		||||
  const year = date.getFullYear ();
 | 
			
		||||
  const month = dtf.format (date);
 | 
			
		||||
 | 
			
		||||
  if (license) {
 | 
			
		||||
    notice = `${'/*'}
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of ${software} which is released under ${license}.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, ${month} ${year}
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
`;
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    notice = `${'/*'}
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, ${month} ${year}
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
`;
 | 
			
		||||
  }
 | 
			
		||||
  return notice;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * scans a folder and fixes all copyright notices
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to scan
 | 
			
		||||
 * @param {string} license license name
 | 
			
		||||
 * @param {string} software software name
 | 
			
		||||
 */
 | 
			
		||||
async function fix_all_copy (folder, license = '', software = '') {
 | 
			
		||||
  const regex = /\/\*\s+\*\sCopyright[\s\S]*?\*\/\n{0,2}/gu;
 | 
			
		||||
  await map_all_files (folder, (data, filename) => {
 | 
			
		||||
    const shebang = /^#!.*?\n\n/gu;
 | 
			
		||||
    const shebang_line = shebang.exec (data);
 | 
			
		||||
    if (!(/\.(?:js|ts|mjs)$/u).test (filename) && !regex.test (data))
 | 
			
		||||
      return null;
 | 
			
		||||
    return (shebang_line ? shebang_line[0] : '')
 | 
			
		||||
     + get_copyright_notice (license, software)
 | 
			
		||||
     + data.replace (regex, '')
 | 
			
		||||
       .replace (shebang, '');
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * copies the full template to a new folder named after arg[0]
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 */
 | 
			
		||||
function run (folder, args) {
 | 
			
		||||
  fix_all_copy (folder, ...args);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * checks if the arguments meet the requirements
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 * @returns {boolean} true if arguments match requirements
 | 
			
		||||
 */
 | 
			
		||||
function assert (folder, args) {
 | 
			
		||||
  const tests = [
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 0 || args.length === 2),
 | 
			
		||||
      reason: 'invalid number of arguments'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 0 || typeof args[0] === 'string'),
 | 
			
		||||
      reason: 'license is not a string'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 0 || typeof args[1] === 'string'),
 | 
			
		||||
      reason: 'software name is not a string'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (typeof folder === 'string'),
 | 
			
		||||
      reason: 'cwd is not a folder (internal error)'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (fs.existsSync (folder)),
 | 
			
		||||
      reason: 'cwd does not exist (internal error)'
 | 
			
		||||
    }
 | 
			
		||||
  ];
 | 
			
		||||
  for (const test of tests) {
 | 
			
		||||
    if (!test.f ()) {
 | 
			
		||||
      console.log (test.reason);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = { run, assert };
 | 
			
		||||
@@ -1,228 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-magic-numbers */
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const fs = require ('fs-extra');
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * convert short type notation to knex notation
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} short short type
 | 
			
		||||
 * @returns {string} type
 | 
			
		||||
 */
 | 
			
		||||
function get_type (short) {
 | 
			
		||||
  switch (short) {
 | 
			
		||||
    case '\'\'':
 | 
			
		||||
      return 'string';
 | 
			
		||||
    case '#':
 | 
			
		||||
      return 'integer';
 | 
			
		||||
    case '#.#':
 | 
			
		||||
      return 'double';
 | 
			
		||||
    case '✓':
 | 
			
		||||
      return 'boolean';
 | 
			
		||||
    case '🖹':
 | 
			
		||||
      return 'text';
 | 
			
		||||
    case '🕓':
 | 
			
		||||
      return 'timestamp';
 | 
			
		||||
    default:
 | 
			
		||||
      return '';
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * returns columns and attributes for a table
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} str table definition
 | 
			
		||||
 * @returns {object} table info
 | 
			
		||||
 */
 | 
			
		||||
function get_table_info (str) {
 | 
			
		||||
  const lines = str.split (/\n/ug);
 | 
			
		||||
  lines.splice (0, 2);
 | 
			
		||||
  lines.splice (lines.length - 2, 2);
 | 
			
		||||
  const name_line = lines.shift ();
 | 
			
		||||
  const { name } = (/<b>(?<name>\S+)<\/b>/u).exec (name_line).groups;
 | 
			
		||||
  const columns = [];
 | 
			
		||||
  while (lines.length > 0) {
 | 
			
		||||
    const col = {};
 | 
			
		||||
    const l = lines.shift ();
 | 
			
		||||
    const regex = /<tr><td.*?>(?<props>.*?)<\/td><\/tr>/u;
 | 
			
		||||
    const data = regex.exec (l).groups.props.split (/\s+/gu);
 | 
			
		||||
    if (data.length === 3 || data[0] === '🔑') {
 | 
			
		||||
      const opt = data.shift ();
 | 
			
		||||
      if (opt === '★')
 | 
			
		||||
        col.unique = true;
 | 
			
		||||
      if (opt === '🔑')
 | 
			
		||||
        col.type = 'increments';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    col.name = data.shift ();
 | 
			
		||||
    if (data.length > 0)
 | 
			
		||||
      col.type = get_type (data.shift ());
 | 
			
		||||
 | 
			
		||||
    if (typeof col.type === 'undefined')
 | 
			
		||||
      console.error (`column type is undefined: ${col.name} table: ${name}`);
 | 
			
		||||
 | 
			
		||||
    columns.push (col);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return { name, columns, foreign_keys: [] };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * get all tables from a structure file
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} file path to the structure file
 | 
			
		||||
 * @returns {Promise<object>} tables and foreign keys
 | 
			
		||||
 */
 | 
			
		||||
async function get_tables (file) {
 | 
			
		||||
  const lines = (await fs.readFile (file, 'utf-8')).split (/\n/gu);
 | 
			
		||||
  const curr = [];
 | 
			
		||||
  const tables = [];
 | 
			
		||||
  const foreign = [];
 | 
			
		||||
  for (const l of lines) {
 | 
			
		||||
    if (curr.length > 0 || (/\S+ \[label=</u).test (l))
 | 
			
		||||
      curr.push (l);
 | 
			
		||||
 | 
			
		||||
    if ((/>.*?\]/u).test (l)) {
 | 
			
		||||
      const val = curr.join ('\n');
 | 
			
		||||
      if (val)
 | 
			
		||||
        tables.push (get_table_info (val));
 | 
			
		||||
      curr.splice (0, curr.length);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get_foreign_key (l, foreign);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  for (const fk of foreign) {
 | 
			
		||||
    for (let i = 0; i < tables.length; i++) {
 | 
			
		||||
      if (tables[i].name === fk.table) {
 | 
			
		||||
        tables[i].foreign_keys.push (fk);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return tables;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * gets foreign keys from a line
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} line line to check
 | 
			
		||||
 * @param {Array<object>} foreign_keys array to add to
 | 
			
		||||
 */
 | 
			
		||||
function get_foreign_key (line, foreign_keys) {
 | 
			
		||||
  const fk = (/(?<col>\S+) -> (?<ref>\S+)/u).exec (line);
 | 
			
		||||
  if (fk) {
 | 
			
		||||
    const col = fk.groups.col.split (':');
 | 
			
		||||
    const ref = fk.groups.ref.split (':');
 | 
			
		||||
 | 
			
		||||
    const foreign_key = {
 | 
			
		||||
      table:      col[0],
 | 
			
		||||
      column:     col[1],
 | 
			
		||||
      ref_table:  ref[0],
 | 
			
		||||
      ref_column: ref[1]
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    foreign_keys.push (foreign_key);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * creates a function for creating a table
 | 
			
		||||
 *
 | 
			
		||||
 * @param {object} table table to create a function for
 | 
			
		||||
 * @returns {string} function
 | 
			
		||||
 */
 | 
			
		||||
function create_table_function (table) {
 | 
			
		||||
  let func = `/**
 | 
			
		||||
 * create table ${table.name}
 | 
			
		||||
 *
 | 
			
		||||
 * @param {any} knex database connection
 | 
			
		||||
 * @returns {Promise} result
 | 
			
		||||
 */
 | 
			
		||||
function create_${table.name} (knex) {
 | 
			
		||||
  return knex.schema.createTable ('${table.name}', (table) => {
 | 
			
		||||
    ${table.columns
 | 
			
		||||
    .map ((col) => `table.${col.type} ('${col.name}');`)
 | 
			
		||||
    .join ('\n    ')}
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
  const unique = table.columns.filter ((val) => val.unique);
 | 
			
		||||
  if (unique.length > 0) {
 | 
			
		||||
    func += `\n    table.unique (${unique
 | 
			
		||||
      .map ((val) => `'${val.name}'`)
 | 
			
		||||
      .join (', ')});\n`;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (table.foreign_keys.length > 0) {
 | 
			
		||||
    func += '\n';
 | 
			
		||||
    for (const fk of table.foreign_keys) {
 | 
			
		||||
      func += `    table.foreign ('${fk.column}')
 | 
			
		||||
      .references ('${fk.ref_column}')
 | 
			
		||||
      .inTable ('${fk.ref_table}');\n`;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  func += `  });
 | 
			
		||||
}`;
 | 
			
		||||
 | 
			
		||||
  return func;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * creates the migration function
 | 
			
		||||
 *
 | 
			
		||||
 * @param {Array<object>} tables table array
 | 
			
		||||
 * @returns {string} function
 | 
			
		||||
 */
 | 
			
		||||
function create_up_function (tables) {
 | 
			
		||||
  const func = `async function up (knex) {
 | 
			
		||||
${tables.map ((val) => `  await create_${val.name} (knex);`)
 | 
			
		||||
    .join ('\n')}
 | 
			
		||||
}`;
 | 
			
		||||
  return func;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * creates the complete migration file for a graph
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} file_path file to scan
 | 
			
		||||
 * @returns {Promise<string>} file
 | 
			
		||||
 */
 | 
			
		||||
async function create_migration (file_path) {
 | 
			
		||||
  const tables = await get_tables (file_path);
 | 
			
		||||
  const functions = tables.map ((tab) => create_table_function (tab));
 | 
			
		||||
 | 
			
		||||
  const file = `'use strict';
 | 
			
		||||
 | 
			
		||||
${functions.join ('\n\n')}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * run migration
 | 
			
		||||
 *
 | 
			
		||||
 * @param {any} knex db connection
 | 
			
		||||
 */
 | 
			
		||||
${create_up_function (tables)}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * revert migration
 | 
			
		||||
 */
 | 
			
		||||
function down () {
 | 
			
		||||
  // noop
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = { up, down };
 | 
			
		||||
`;
 | 
			
		||||
  return file;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = { get_tables, create_table_function, create_migration };
 | 
			
		||||
@@ -1,66 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-magic-numbers */
 | 
			
		||||
/* eslint-disable no-sync */
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const fs = require ('fs-extra');
 | 
			
		||||
const path = require ('path');
 | 
			
		||||
const dot_parser = require ('./dot_parser');
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * copies the full template to a new folder named after arg[0]
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 */
 | 
			
		||||
async function run (folder, args) {
 | 
			
		||||
  const graph = path.join (folder, args[0]);
 | 
			
		||||
  const migration = path.join (folder, args[1]);
 | 
			
		||||
 | 
			
		||||
  const db_migration = await dot_parser.create_migration (graph);
 | 
			
		||||
  await fs.writeFile (migration, db_migration, 'utf-8');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * checks if the arguments meet the requirements
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 * @returns {boolean} true if arguments match requirements
 | 
			
		||||
 */
 | 
			
		||||
function assert (folder, args) {
 | 
			
		||||
  const tests = [
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 2
 | 
			
		||||
        && typeof args[0] === 'string'
 | 
			
		||||
        && typeof args[1] === 'string'),
 | 
			
		||||
      reason: 'db [graph] [migration]'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (typeof folder === 'string'),
 | 
			
		||||
      reason: 'cwd is not a folder (internal error)'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (fs.existsSync (folder)),
 | 
			
		||||
      reason: 'cwd does not exist (internal error)'
 | 
			
		||||
    }
 | 
			
		||||
  ];
 | 
			
		||||
  for (const test of tests) {
 | 
			
		||||
    if (!test.f ()) {
 | 
			
		||||
      console.log (test.reason);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = { run, assert };
 | 
			
		||||
@@ -1,78 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-sync */
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const fs = require ('fs-extra');
 | 
			
		||||
const path = require ('path');
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * copies the full template to a new folder named after arg[0]
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 */
 | 
			
		||||
function run (folder, args) {
 | 
			
		||||
  const is_node = args.length === 1 && (/^node$/ui).test (args[0]);
 | 
			
		||||
 | 
			
		||||
  const template = path.join (
 | 
			
		||||
    __dirname,
 | 
			
		||||
    'template',
 | 
			
		||||
    is_node
 | 
			
		||||
      ? 'node'
 | 
			
		||||
      : 'general'
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  for (const f of fs.readdirSync (template)) {
 | 
			
		||||
    fs.copy (
 | 
			
		||||
      path.join (template, f),
 | 
			
		||||
      path.join (folder, f),
 | 
			
		||||
      { filter: (src, dest) => !fs.existsSync (dest) }
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (is_node) {
 | 
			
		||||
    const pkg = path.join (folder, 'package.json');
 | 
			
		||||
    if (fs.existsSync (pkg)) {
 | 
			
		||||
      const json = JSON.parse (fs.readFileSync (pkg, 'utf-8'));
 | 
			
		||||
      json.scripts.ci = 'yarn && node jenkins.js';
 | 
			
		||||
      fs.writeFileSync (pkg, JSON.stringify (json, null, 2), 'utf-8');
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * checks if the arguments meet the requirements
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @returns {boolean} true if arguments match requirements
 | 
			
		||||
 */
 | 
			
		||||
function assert (folder) {
 | 
			
		||||
  const tests = [
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (typeof folder === 'string'),
 | 
			
		||||
      reason: 'cwd is not a folder (internal error)'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (fs.existsSync (folder)),
 | 
			
		||||
      reason: 'cwd does not exist (internal error)'
 | 
			
		||||
    }
 | 
			
		||||
  ];
 | 
			
		||||
  for (const test of tests) {
 | 
			
		||||
    if (!test.f ()) {
 | 
			
		||||
      console.log (test.reason);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = { run, assert };
 | 
			
		||||
@@ -1,65 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const csv = require ('csv-parse');
 | 
			
		||||
const fs = require ('fs-extra');
 | 
			
		||||
const path = require ('path');
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * get all csv data that should be loaded
 | 
			
		||||
 *
 | 
			
		||||
 * @returns {Promise<Array<object>>} csv data
 | 
			
		||||
 */
 | 
			
		||||
async function get_csv () {
 | 
			
		||||
  const csv_list = await Promise.all ((
 | 
			
		||||
    await fs.readdir ('migrations/csv'))
 | 
			
		||||
    .map (
 | 
			
		||||
      async (file) => {
 | 
			
		||||
        if (path.extname (file) !== '.csv')
 | 
			
		||||
          return null;
 | 
			
		||||
        const name = path.basename (file, '.csv');
 | 
			
		||||
 | 
			
		||||
        const data = [];
 | 
			
		||||
        const parser = csv (await fs.readFile (
 | 
			
		||||
          path.join ('migrations/csv', file)
 | 
			
		||||
        ), { columns: true });
 | 
			
		||||
 | 
			
		||||
        for await (const entry of parser)
 | 
			
		||||
          data.push (entry);
 | 
			
		||||
 | 
			
		||||
        return { name, data };
 | 
			
		||||
      }
 | 
			
		||||
    ));
 | 
			
		||||
 | 
			
		||||
  return csv_list.filter ((val) => val !== null);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * execute migration
 | 
			
		||||
 *
 | 
			
		||||
 * @param {any} knex database connection
 | 
			
		||||
 */
 | 
			
		||||
async function up (knex) {
 | 
			
		||||
  const data = await get_csv ();
 | 
			
		||||
  await Promise.all (
 | 
			
		||||
    data.map (
 | 
			
		||||
      // eslint-disable-next-line no-magic-numbers
 | 
			
		||||
      (table) => knex.bulkInsert (table.name, table.data, 64)
 | 
			
		||||
    )
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * revert migration
 | 
			
		||||
 */
 | 
			
		||||
function down () {
 | 
			
		||||
  // noop
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = { up, down };
 | 
			
		||||
@@ -1,76 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-sync */
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const fs = require ('fs-extra');
 | 
			
		||||
const path = require ('path');
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * copies the full template to a new folder named after arg[0]
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 */
 | 
			
		||||
async function run (folder, args) {
 | 
			
		||||
  const template = path.join (
 | 
			
		||||
    __dirname,
 | 
			
		||||
    args[0] === 'csv' ? 'csv.template.js' : 'template.js'
 | 
			
		||||
  );
 | 
			
		||||
  const target_name = args[0] === 'csv' ? '000001_csv_ingress' : args[0];
 | 
			
		||||
  const dest = path.join (folder, `${target_name}.js`);
 | 
			
		||||
  await fs.writeFile (dest, await fs.readFile (template));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * checks if the arguments meet the requirements
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 * @returns {boolean} true if arguments match requirements
 | 
			
		||||
 */
 | 
			
		||||
function assert (folder, args) {
 | 
			
		||||
  const tests = [
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length < 2),
 | 
			
		||||
      reason: 'too many arguments'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 1 && typeof args[0] === 'string'),
 | 
			
		||||
      reason: 'name is not a string'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => ((/^(?:[0-9]+[-_][a-z-_]+|csv)$/iu).test (args[0])),
 | 
			
		||||
      reason: 'name has to match /^[0-9]+[-_][a-z-_]+$/'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (typeof folder === 'string'),
 | 
			
		||||
      reason: 'cwd is not a folder (internal error)'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (fs.existsSync (folder)),
 | 
			
		||||
      reason: 'cwd does not exist (internal error)'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (!fs.existsSync (path.join (folder, args[0]))),
 | 
			
		||||
      reason: 'migration already exists'
 | 
			
		||||
    }
 | 
			
		||||
  ];
 | 
			
		||||
  for (const test of tests) {
 | 
			
		||||
    if (!test.f ()) {
 | 
			
		||||
      console.log (test.reason);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = { run, assert };
 | 
			
		||||
@@ -1,33 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-magic-numbers */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * execute migration
 | 
			
		||||
 *
 | 
			
		||||
 * @param {any} knex database connections
 | 
			
		||||
 */
 | 
			
		||||
async function up (knex) {
 | 
			
		||||
  await knex.schema.createTable ('template', (table) => {
 | 
			
		||||
    table.increments ('id');
 | 
			
		||||
    table.string ('text', 64);
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * revert migration
 | 
			
		||||
 *
 | 
			
		||||
 * @param {any} knex database connections
 | 
			
		||||
 */
 | 
			
		||||
async function down (knex) {
 | 
			
		||||
  await knex.schema.dropTable ('template');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = { up, down };
 | 
			
		||||
@@ -1,127 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-sync */
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const fs = require ('fs-extra');
 | 
			
		||||
const path = require ('path');
 | 
			
		||||
const child_process = require ('child_process');
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * copies the full template to a new folder named after arg[0]
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 */
 | 
			
		||||
async function run (folder, args) {
 | 
			
		||||
  const snip_folder_path = [ folder ];
 | 
			
		||||
  if (args.length > 0)
 | 
			
		||||
    snip_folder_path.push (args[0]);
 | 
			
		||||
  const snip_folder = path.join (...snip_folder_path);
 | 
			
		||||
  const template = path.join (__dirname, 'template');
 | 
			
		||||
  if (!fs.existsSync (snip_folder))
 | 
			
		||||
    fs.mkdir (snip_folder);
 | 
			
		||||
  for (const f of fs.readdirSync (template)) {
 | 
			
		||||
    fs.copy (
 | 
			
		||||
      path.join (template, f),
 | 
			
		||||
      path.join (snip_folder, f),
 | 
			
		||||
      {
 | 
			
		||||
        recursive: true,
 | 
			
		||||
        filter:    (src, dest) => !fs.existsSync (dest)
 | 
			
		||||
      }
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  child_process.execSync (
 | 
			
		||||
    'git init',
 | 
			
		||||
    { cwd: snip_folder, stdio: 'inherit' }
 | 
			
		||||
  );
 | 
			
		||||
  child_process.execSync (
 | 
			
		||||
    'yarn init -y',
 | 
			
		||||
    { cwd: snip_folder, stdio: 'inherit' }
 | 
			
		||||
  );
 | 
			
		||||
  child_process.execSync (
 | 
			
		||||
    'yarn add --dev @scode/eslint-config eslint nyc ava',
 | 
			
		||||
    { cwd: snip_folder, stdio: 'inherit' }
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  const package_json = JSON.parse (
 | 
			
		||||
    await fs.readFile (path.join (snip_folder, 'package.json'), 'utf-8')
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  package_json.scripts = {
 | 
			
		||||
    lint: 'eslint . --ext .js,.jsx,.ts,.tsx,.vue,.mjs',
 | 
			
		||||
    test: 'nyc ava'
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  await fs.writeFile (
 | 
			
		||||
    path.join (snip_folder, 'package.json'),
 | 
			
		||||
    JSON.stringify (package_json, null, 2)
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  await fs.writeFile (
 | 
			
		||||
    path.join (snip_folder, '.gitignore'),
 | 
			
		||||
    `/node_modules/
 | 
			
		||||
/dist/
 | 
			
		||||
/.nyc_output/
 | 
			
		||||
/coverage/`
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * checks if the arguments meet the requirements
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 * @returns {boolean} true if arguments match requirements
 | 
			
		||||
 */
 | 
			
		||||
function assert (folder, args) {
 | 
			
		||||
  const tests = [
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length < 2),
 | 
			
		||||
      reason: 'too many arguments'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 0 || typeof args[0] === 'string'),
 | 
			
		||||
      reason: 'name is not a string'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 0 || (/^[a-z-]+$/iu).test (args[0])),
 | 
			
		||||
      reason: 'name can only contain [a-z-]'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (typeof folder === 'string'),
 | 
			
		||||
      reason: 'cwd is not a folder (internal error)'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (fs.existsSync (folder)),
 | 
			
		||||
      reason: 'cwd does not exist (internal error)'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 1 || fs.readdirSync (folder).length === 0),
 | 
			
		||||
      reason: 'folder is not empty'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 0
 | 
			
		||||
          || !fs.existsSync (path.join (folder, args[0]))),
 | 
			
		||||
      reason: 'folder already exists'
 | 
			
		||||
    }
 | 
			
		||||
  ];
 | 
			
		||||
  for (const test of tests) {
 | 
			
		||||
    if (!test.f ()) {
 | 
			
		||||
      console.log (test.reason);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = { run, assert };
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
@scode:registry=https://npm.scode.ovh
 | 
			
		||||
@@ -1,7 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
@@ -1,72 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-sync */
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const fs = require ('fs-extra');
 | 
			
		||||
const path = require ('path');
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * copies the full template to a new folder named after arg[0]
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 */
 | 
			
		||||
async function run (folder, args) {
 | 
			
		||||
  const template = path.join (__dirname, 'template.js');
 | 
			
		||||
  const dest = path.join (folder, `${args[0]}.js`);
 | 
			
		||||
  await fs.writeFile (dest, await fs.readFile (template));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * checks if the arguments meet the requirements
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 * @returns {boolean} true if arguments match requirements
 | 
			
		||||
 */
 | 
			
		||||
function assert (folder, args) {
 | 
			
		||||
  const tests = [
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length < 2),
 | 
			
		||||
      reason: 'too many arguments'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 1 && typeof args[0] === 'string'),
 | 
			
		||||
      reason: 'name is not a string'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => ((/^[a-z]+-[a-z]+$/iu).test (args[0])),
 | 
			
		||||
      reason: 'name has to match /^[a-z]+-[a-z]+$/'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (typeof folder === 'string'),
 | 
			
		||||
      reason: 'cwd is not a folder (internal error)'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (fs.existsSync (folder)),
 | 
			
		||||
      reason: 'cwd does not exist (internal error)'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (!fs.existsSync (path.join (folder, args[0]))),
 | 
			
		||||
      reason: 'file already exists'
 | 
			
		||||
    }
 | 
			
		||||
  ];
 | 
			
		||||
  for (const test of tests) {
 | 
			
		||||
    if (!test.f ()) {
 | 
			
		||||
      console.log (test.reason);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = { run, assert };
 | 
			
		||||
@@ -1,17 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
module.exports = function handler (req, res, next, opts) {
 | 
			
		||||
  if (req.headers.example === 'abc')
 | 
			
		||||
    res.writeHead (1);
 | 
			
		||||
  else
 | 
			
		||||
    res.writeHead (2);
 | 
			
		||||
 | 
			
		||||
  res.end (opts.text);
 | 
			
		||||
};
 | 
			
		||||
@@ -1,91 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-sync */
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const fs = require ('fs-extra');
 | 
			
		||||
const path = require ('path');
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * copies the full template to a new folder named after arg[0]
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 */
 | 
			
		||||
function run (folder, args) {
 | 
			
		||||
  const snip_folder_path = [ folder ];
 | 
			
		||||
  if (args.length > 0)
 | 
			
		||||
    snip_folder_path.push (args[0]);
 | 
			
		||||
  const snip_folder = path.join (...snip_folder_path);
 | 
			
		||||
  const template = path.join (__dirname, 'template');
 | 
			
		||||
  if (!fs.existsSync (snip_folder))
 | 
			
		||||
    fs.mkdir (snip_folder);
 | 
			
		||||
  for (const f of fs.readdirSync (template)) {
 | 
			
		||||
    fs.copy (
 | 
			
		||||
      path.join (template, f),
 | 
			
		||||
      path.join (snip_folder, f),
 | 
			
		||||
      {
 | 
			
		||||
        recursive: true,
 | 
			
		||||
        filter:    (src, dest) => !fs.existsSync (dest)
 | 
			
		||||
      }
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * checks if the arguments meet the requirements
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 * @returns {boolean} true if arguments match requirements
 | 
			
		||||
 */
 | 
			
		||||
function assert (folder, args) {
 | 
			
		||||
  const tests = [
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length < 2),
 | 
			
		||||
      reason: 'too many arguments'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 0 || typeof args[0] === 'string'),
 | 
			
		||||
      reason: 'name is not a string'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 0 || (/^[a-z]+$/iu).test (args[0])),
 | 
			
		||||
      reason: 'name can only contain [a-z]'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (typeof folder === 'string'),
 | 
			
		||||
      reason: 'cwd is not a folder (internal error)'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (fs.existsSync (folder)),
 | 
			
		||||
      reason: 'cwd does not exist (internal error)'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 1 || fs.readdirSync (folder).length === 0),
 | 
			
		||||
      reason: 'folder is not empty'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 0
 | 
			
		||||
          || !fs.existsSync (path.join (folder, args[0]))),
 | 
			
		||||
      reason: 'folder already exists'
 | 
			
		||||
    }
 | 
			
		||||
  ];
 | 
			
		||||
  for (const test of tests) {
 | 
			
		||||
    if (!test.f ()) {
 | 
			
		||||
      console.log (test.reason);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = { run, assert };
 | 
			
		||||
@@ -1,91 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) Sapphirecode - All Rights Reserved
 | 
			
		||||
 * This file is part of Snippeteer which is released under BSD-3-Clause.
 | 
			
		||||
 * See file 'LICENSE' for full license details.
 | 
			
		||||
 * Created by Timo Hocker <timo@scode.ovh>, March 2020
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-sync */
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
const fs = require ('fs-extra');
 | 
			
		||||
const path = require ('path');
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * copies the full template to a new folder named after arg[0]
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 */
 | 
			
		||||
function run (folder, args) {
 | 
			
		||||
  const snip_folder_path = [ folder ];
 | 
			
		||||
  if (args.length > 0)
 | 
			
		||||
    snip_folder_path.push (args[0]);
 | 
			
		||||
  const snip_folder = path.join (...snip_folder_path);
 | 
			
		||||
  const template = path.join (__dirname, 'template');
 | 
			
		||||
  if (!fs.existsSync (snip_folder))
 | 
			
		||||
    fs.mkdir (snip_folder);
 | 
			
		||||
  for (const f of fs.readdirSync (template)) {
 | 
			
		||||
    fs.copy (
 | 
			
		||||
      path.join (template, f),
 | 
			
		||||
      path.join (snip_folder, f),
 | 
			
		||||
      {
 | 
			
		||||
        recursive: true,
 | 
			
		||||
        filter:    (src, dest) => !fs.existsSync (dest)
 | 
			
		||||
      }
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * checks if the arguments meet the requirements
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} folder folder to run in
 | 
			
		||||
 * @param {Array} args function arguments
 | 
			
		||||
 * @returns {boolean} true if arguments match requirements
 | 
			
		||||
 */
 | 
			
		||||
function assert (folder, args) {
 | 
			
		||||
  const tests = [
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length < 2),
 | 
			
		||||
      reason: 'too many arguments'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 0 || typeof args[0] === 'string'),
 | 
			
		||||
      reason: 'name is not a string'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 0 || (/^[a-z]+$/iu).test (args[0])),
 | 
			
		||||
      reason: 'name can only contain [a-z]'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (typeof folder === 'string'),
 | 
			
		||||
      reason: 'cwd is not a folder (internal error)'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (fs.existsSync (folder)),
 | 
			
		||||
      reason: 'cwd does not exist (internal error)'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 1 || fs.readdirSync (folder).length === 0),
 | 
			
		||||
      reason: 'folder is not empty'
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      f:      () => (args.length === 0
 | 
			
		||||
          || !fs.existsSync (path.join (folder, args[0]))),
 | 
			
		||||
      reason: 'folder already exists'
 | 
			
		||||
    }
 | 
			
		||||
  ];
 | 
			
		||||
  for (const test of tests) {
 | 
			
		||||
    if (!test.f ()) {
 | 
			
		||||
      console.log (test.reason);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = { run, assert };
 | 
			
		||||
							
								
								
									
										66
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,66 @@
 | 
			
		||||
{
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    /* Basic Options */
 | 
			
		||||
    // "incremental": true,                   /* Enable incremental compilation */
 | 
			
		||||
    "target": "es5",                          /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
 | 
			
		||||
    "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
 | 
			
		||||
    // "lib": [],                             /* Specify library files to be included in the compilation. */
 | 
			
		||||
    // "allowJs": true,                       /* Allow javascript files to be compiled. */
 | 
			
		||||
    // "checkJs": true,                       /* Report errors in .js files. */
 | 
			
		||||
    // "jsx": "preserve",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
 | 
			
		||||
    // "declaration": true,                   /* Generates corresponding '.d.ts' file. */
 | 
			
		||||
    // "declarationMap": true,                /* Generates a sourcemap for each corresponding '.d.ts' file. */
 | 
			
		||||
    // "sourceMap": true,                     /* Generates corresponding '.map' file. */
 | 
			
		||||
    // "outFile": "./",                       /* Concatenate and emit output to single file. */
 | 
			
		||||
    "outDir": "./dist",                        /* Redirect output structure to the directory. */
 | 
			
		||||
    "rootDir": "./lib",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
 | 
			
		||||
    // "composite": true,                     /* Enable project compilation */
 | 
			
		||||
    // "tsBuildInfoFile": "./",               /* Specify file to store incremental compilation information */
 | 
			
		||||
    // "removeComments": true,                /* Do not emit comments to output. */
 | 
			
		||||
    // "noEmit": true,                        /* Do not emit outputs. */
 | 
			
		||||
    // "importHelpers": true,                 /* Import emit helpers from 'tslib'. */
 | 
			
		||||
    // "downlevelIteration": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
 | 
			
		||||
    // "isolatedModules": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
 | 
			
		||||
 | 
			
		||||
    /* Strict Type-Checking Options */
 | 
			
		||||
    "strict": true,                           /* Enable all strict type-checking options. */
 | 
			
		||||
    // "noImplicitAny": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */
 | 
			
		||||
    // "strictNullChecks": true,              /* Enable strict null checks. */
 | 
			
		||||
    // "strictFunctionTypes": true,           /* Enable strict checking of function types. */
 | 
			
		||||
    // "strictBindCallApply": true,           /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
 | 
			
		||||
    // "strictPropertyInitialization": true,  /* Enable strict checking of property initialization in classes. */
 | 
			
		||||
    // "noImplicitThis": true,                /* Raise error on 'this' expressions with an implied 'any' type. */
 | 
			
		||||
    // "alwaysStrict": true,                  /* Parse in strict mode and emit "use strict" for each source file. */
 | 
			
		||||
 | 
			
		||||
    /* Additional Checks */
 | 
			
		||||
    // "noUnusedLocals": true,                /* Report errors on unused locals. */
 | 
			
		||||
    // "noUnusedParameters": true,            /* Report errors on unused parameters. */
 | 
			
		||||
    // "noImplicitReturns": true,             /* Report error when not all code paths in function return a value. */
 | 
			
		||||
    // "noFallthroughCasesInSwitch": true,    /* Report errors for fallthrough cases in switch statement. */
 | 
			
		||||
 | 
			
		||||
    /* Module Resolution Options */
 | 
			
		||||
    // "moduleResolution": "node",            /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
 | 
			
		||||
    // "baseUrl": "./",                       /* Base directory to resolve non-absolute module names. */
 | 
			
		||||
    // "paths": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
 | 
			
		||||
    // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
 | 
			
		||||
    // "typeRoots": [],                       /* List of folders to include type definitions from. */
 | 
			
		||||
    // "types": [],                           /* Type declaration files to be included in compilation. */
 | 
			
		||||
    // "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
 | 
			
		||||
    "esModuleInterop": true,                  /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
 | 
			
		||||
    // "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */
 | 
			
		||||
    // "allowUmdGlobalAccess": true,          /* Allow accessing UMD globals from modules. */
 | 
			
		||||
 | 
			
		||||
    /* Source Map Options */
 | 
			
		||||
    // "sourceRoot": "",                      /* Specify the location where debugger should locate TypeScript files instead of source locations. */
 | 
			
		||||
    // "mapRoot": "",                         /* Specify the location where debugger should locate map files instead of generated locations. */
 | 
			
		||||
    // "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */
 | 
			
		||||
    // "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
 | 
			
		||||
 | 
			
		||||
    /* Experimental Options */
 | 
			
		||||
    // "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */
 | 
			
		||||
    // "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */
 | 
			
		||||
 | 
			
		||||
    /* Advanced Options */
 | 
			
		||||
    "forceConsistentCasingInFileNames": true  /* Disallow inconsistently-cased references to the same file. */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1825
									
								
								yarn-error.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1825
									
								
								yarn-error.log
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										655
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										655
									
								
								yarn.lock
									
									
									
									
									
								
							@@ -23,12 +23,34 @@
 | 
			
		||||
    chalk "^2.0.0"
 | 
			
		||||
    js-tokens "^4.0.0"
 | 
			
		||||
 | 
			
		||||
"@scode/eslint-config@^2.0.2":
 | 
			
		||||
  version "2.0.11"
 | 
			
		||||
  resolved "https://npm.scode.ovh/@scode%2feslint-config/-/eslint-config-2.0.11.tgz#3cc3cd71f3bc3ac39868bf608e0517bee09da58f"
 | 
			
		||||
  integrity sha512-K8DpFdmepU1FNp0QJn5gbXS45g7k04rFUJp2OKQDqSa+3iywBvi44pMzJNOdZjkj+t3dGcOdeWcYOngz2MjdlA==
 | 
			
		||||
"@ovyerus/licenses@^6.4.4":
 | 
			
		||||
  version "6.4.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@ovyerus/licenses/-/licenses-6.4.4.tgz#596e3ace46ab7c70bcf0e2b17f259796a4bedf9f"
 | 
			
		||||
  integrity sha512-IHjc31WXciQT3hfvdY+M59jBkQp70Fpr04tNDVO5rez2PNv4u8tE6w//CkU+GeBoO9k2ahneSqzjzvlgjyjkGw==
 | 
			
		||||
 | 
			
		||||
"@scode/eslint-config-es6@^1.0.1":
 | 
			
		||||
  version "1.0.21"
 | 
			
		||||
  resolved "https://npm.scode.ovh/@scode%2feslint-config-es6/-/eslint-config-es6-1.0.21.tgz#280bed045915dfa40070c465a12e5636f98658a2"
 | 
			
		||||
  integrity sha512-H0XyYtKpq6oZvVdr/+r2CwDcSK8qSVGuCwJzAlD2YXGnQH6QVl5XPav9cvYdMKg06W7ufGP9k1L3JseJMM0H5g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    eslint-plugin-jsdoc "^24.0.0"
 | 
			
		||||
    "@scode/eslint-config" "^2.0.1"
 | 
			
		||||
    eslint-plugin-import "^2.20.1"
 | 
			
		||||
 | 
			
		||||
"@scode/eslint-config-ts@^1.0.19":
 | 
			
		||||
  version "1.0.21"
 | 
			
		||||
  resolved "https://npm.scode.ovh/@scode%2feslint-config-ts/-/eslint-config-ts-1.0.21.tgz#19a87b5db5d7a89aaad00abf543fb1d51c20caf5"
 | 
			
		||||
  integrity sha512-rKDaF54iLt46tLwazDE2WcHvFtOHxhPvnj+ZepZl5ZSP6CC6aS6G97OUV1kfKryb1VZe+QDumw6yMmkXtt4mzg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@scode/eslint-config-es6" "^1.0.1"
 | 
			
		||||
    "@typescript-eslint/eslint-plugin" "^2.26.0"
 | 
			
		||||
    "@typescript-eslint/parser" "^2.26.0"
 | 
			
		||||
 | 
			
		||||
"@scode/eslint-config@^2.0.1":
 | 
			
		||||
  version "2.0.10"
 | 
			
		||||
  resolved "https://npm.scode.ovh/@scode%2feslint-config/-/eslint-config-2.0.10.tgz#a154d30de47893046cda34925c191a88f400ddc9"
 | 
			
		||||
  integrity sha512-6BEMBK8VNPX+9FWkBhXzCWQ6j0l0JTS0F0UTUcPnzefau48WYlFZyORtyIc8H0OvYaeeLUD1gUNjLVsKjwTPHg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    eslint-plugin-jsdoc "^23.0.0"
 | 
			
		||||
    eslint-plugin-node "^11.0.0"
 | 
			
		||||
    eslint-plugin-sort-requires-by-path "^1.0.2"
 | 
			
		||||
 | 
			
		||||
@@ -37,6 +59,71 @@
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
 | 
			
		||||
  integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
 | 
			
		||||
 | 
			
		||||
"@types/eslint-visitor-keys@^1.0.0":
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
 | 
			
		||||
  integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==
 | 
			
		||||
 | 
			
		||||
"@types/fs-extra@^8.1.0":
 | 
			
		||||
  version "8.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.0.tgz#1114834b53c3914806cd03b3304b37b3bd221a4d"
 | 
			
		||||
  integrity sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/node" "*"
 | 
			
		||||
 | 
			
		||||
"@types/json-schema@^7.0.3":
 | 
			
		||||
  version "7.0.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339"
 | 
			
		||||
  integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==
 | 
			
		||||
 | 
			
		||||
"@types/node@*", "@types/node@^13.11.1":
 | 
			
		||||
  version "13.13.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.0.tgz#30d2d09f623fe32cde9cb582c7a6eda2788ce4a8"
 | 
			
		||||
  integrity sha512-WE4IOAC6r/yBZss1oQGM5zs2D7RuKR6Q+w+X2SouPofnWn+LbCqClRyhO3ZE7Ix8nmFgo/oVuuE01cJT2XB13A==
 | 
			
		||||
 | 
			
		||||
"@typescript-eslint/eslint-plugin@^2.26.0":
 | 
			
		||||
  version "2.28.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.28.0.tgz#4431bc6d3af41903e5255770703d4e55a0ccbdec"
 | 
			
		||||
  integrity sha512-w0Ugcq2iatloEabQP56BRWJowliXUP5Wv6f9fKzjJmDW81hOTBxRoJ4LoEOxRpz9gcY51Libytd2ba3yLmSOfg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@typescript-eslint/experimental-utils" "2.28.0"
 | 
			
		||||
    functional-red-black-tree "^1.0.1"
 | 
			
		||||
    regexpp "^3.0.0"
 | 
			
		||||
    tsutils "^3.17.1"
 | 
			
		||||
 | 
			
		||||
"@typescript-eslint/experimental-utils@2.28.0":
 | 
			
		||||
  version "2.28.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.28.0.tgz#1fd0961cd8ef6522687b4c562647da6e71f8833d"
 | 
			
		||||
  integrity sha512-4SL9OWjvFbHumM/Zh/ZeEjUFxrYKtdCi7At4GyKTbQlrj1HcphIDXlje4Uu4cY+qzszR5NdVin4CCm6AXCjd6w==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/json-schema" "^7.0.3"
 | 
			
		||||
    "@typescript-eslint/typescript-estree" "2.28.0"
 | 
			
		||||
    eslint-scope "^5.0.0"
 | 
			
		||||
    eslint-utils "^2.0.0"
 | 
			
		||||
 | 
			
		||||
"@typescript-eslint/parser@^2.26.0":
 | 
			
		||||
  version "2.28.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.28.0.tgz#bb761286efd2b0714761cab9d0ee5847cf080385"
 | 
			
		||||
  integrity sha512-RqPybRDquui9d+K86lL7iPqH6Dfp9461oyqvlXMNtap+PyqYbkY5dB7LawQjDzot99fqzvS0ZLZdfe+1Bt3Jgw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/eslint-visitor-keys" "^1.0.0"
 | 
			
		||||
    "@typescript-eslint/experimental-utils" "2.28.0"
 | 
			
		||||
    "@typescript-eslint/typescript-estree" "2.28.0"
 | 
			
		||||
    eslint-visitor-keys "^1.1.0"
 | 
			
		||||
 | 
			
		||||
"@typescript-eslint/typescript-estree@2.28.0":
 | 
			
		||||
  version "2.28.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.28.0.tgz#d34949099ff81092c36dc275b6a1ea580729ba00"
 | 
			
		||||
  integrity sha512-HDr8MP9wfwkiuqzRVkuM3BeDrOC4cKbO5a6BymZBHUt5y/2pL0BXD6I/C/ceq2IZoHWhcASk+5/zo+dwgu9V8Q==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    debug "^4.1.1"
 | 
			
		||||
    eslint-visitor-keys "^1.1.0"
 | 
			
		||||
    glob "^7.1.6"
 | 
			
		||||
    is-glob "^4.0.1"
 | 
			
		||||
    lodash "^4.17.15"
 | 
			
		||||
    semver "^6.3.0"
 | 
			
		||||
    tsutils "^3.17.1"
 | 
			
		||||
 | 
			
		||||
acorn-jsx@^5.2.0:
 | 
			
		||||
  version "5.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
 | 
			
		||||
@@ -48,15 +135,20 @@ acorn@^7.1.1:
 | 
			
		||||
  integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==
 | 
			
		||||
 | 
			
		||||
ajv@^6.10.0, ajv@^6.10.2:
 | 
			
		||||
  version "6.12.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
 | 
			
		||||
  integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
 | 
			
		||||
  version "6.12.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7"
 | 
			
		||||
  integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    fast-deep-equal "^3.1.1"
 | 
			
		||||
    fast-json-stable-stringify "^2.0.0"
 | 
			
		||||
    json-schema-traverse "^0.4.1"
 | 
			
		||||
    uri-js "^4.2.2"
 | 
			
		||||
 | 
			
		||||
ansi-colors@^3.2.1:
 | 
			
		||||
  version "3.2.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf"
 | 
			
		||||
  integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==
 | 
			
		||||
 | 
			
		||||
ansi-escapes@^4.2.1:
 | 
			
		||||
  version "4.3.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
 | 
			
		||||
@@ -96,6 +188,23 @@ argparse@^1.0.7:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    sprintf-js "~1.0.2"
 | 
			
		||||
 | 
			
		||||
array-includes@^3.0.3:
 | 
			
		||||
  version "3.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348"
 | 
			
		||||
  integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    define-properties "^1.1.3"
 | 
			
		||||
    es-abstract "^1.17.0"
 | 
			
		||||
    is-string "^1.0.5"
 | 
			
		||||
 | 
			
		||||
array.prototype.flat@^1.2.1:
 | 
			
		||||
  version "1.2.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b"
 | 
			
		||||
  integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    define-properties "^1.1.3"
 | 
			
		||||
    es-abstract "^1.17.0-next.1"
 | 
			
		||||
 | 
			
		||||
astral-regex@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
 | 
			
		||||
@@ -206,6 +315,23 @@ concat-map@0.0.1:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
 | 
			
		||||
  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
 | 
			
		||||
 | 
			
		||||
configstore@^5.0.1:
 | 
			
		||||
  version "5.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
 | 
			
		||||
  integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    dot-prop "^5.2.0"
 | 
			
		||||
    graceful-fs "^4.1.2"
 | 
			
		||||
    make-dir "^3.0.0"
 | 
			
		||||
    unique-string "^2.0.0"
 | 
			
		||||
    write-file-atomic "^3.0.0"
 | 
			
		||||
    xdg-basedir "^4.0.0"
 | 
			
		||||
 | 
			
		||||
contains-path@^0.1.0:
 | 
			
		||||
  version "0.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
 | 
			
		||||
  integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
 | 
			
		||||
 | 
			
		||||
cross-spawn@^6.0.5:
 | 
			
		||||
  version "6.0.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
 | 
			
		||||
@@ -217,6 +343,18 @@ cross-spawn@^6.0.5:
 | 
			
		||||
    shebang-command "^1.2.0"
 | 
			
		||||
    which "^1.2.9"
 | 
			
		||||
 | 
			
		||||
crypto-random-string@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
 | 
			
		||||
  integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
 | 
			
		||||
 | 
			
		||||
debug@^2.6.9:
 | 
			
		||||
  version "2.6.9"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
 | 
			
		||||
  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    ms "2.0.0"
 | 
			
		||||
 | 
			
		||||
debug@^4.0.1, debug@^4.1.1:
 | 
			
		||||
  version "4.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
 | 
			
		||||
@@ -234,6 +372,26 @@ deep-is@~0.1.3:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
 | 
			
		||||
  integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
 | 
			
		||||
 | 
			
		||||
define-properties@^1.1.2, define-properties@^1.1.3:
 | 
			
		||||
  version "1.1.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
 | 
			
		||||
  integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    object-keys "^1.0.12"
 | 
			
		||||
 | 
			
		||||
detect-indent@^6.0.0:
 | 
			
		||||
  version "6.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd"
 | 
			
		||||
  integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==
 | 
			
		||||
 | 
			
		||||
doctrine@1.5.0:
 | 
			
		||||
  version "1.5.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
 | 
			
		||||
  integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    esutils "^2.0.2"
 | 
			
		||||
    isarray "^1.0.0"
 | 
			
		||||
 | 
			
		||||
doctrine@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
 | 
			
		||||
@@ -241,6 +399,13 @@ doctrine@^3.0.0:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    esutils "^2.0.2"
 | 
			
		||||
 | 
			
		||||
dot-prop@^5.2.0:
 | 
			
		||||
  version "5.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb"
 | 
			
		||||
  integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-obj "^2.0.0"
 | 
			
		||||
 | 
			
		||||
emoji-regex@^7.0.1:
 | 
			
		||||
  version "7.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
 | 
			
		||||
@@ -251,11 +416,67 @@ emoji-regex@^8.0.0:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
 | 
			
		||||
  integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
 | 
			
		||||
 | 
			
		||||
enquirer@^2.3.5:
 | 
			
		||||
  version "2.3.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.5.tgz#3ab2b838df0a9d8ab9e7dff235b0e8712ef92381"
 | 
			
		||||
  integrity sha512-BNT1C08P9XD0vNg3J475yIUG+mVdp9T6towYFHUv897X0KoHBjB1shyrNmhmtHWKP17iSWgo7Gqh7BBuzLZMSA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    ansi-colors "^3.2.1"
 | 
			
		||||
 | 
			
		||||
error-ex@^1.2.0:
 | 
			
		||||
  version "1.3.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
 | 
			
		||||
  integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-arrayish "^0.2.1"
 | 
			
		||||
 | 
			
		||||
es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5:
 | 
			
		||||
  version "1.17.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9"
 | 
			
		||||
  integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    es-to-primitive "^1.2.1"
 | 
			
		||||
    function-bind "^1.1.1"
 | 
			
		||||
    has "^1.0.3"
 | 
			
		||||
    has-symbols "^1.0.1"
 | 
			
		||||
    is-callable "^1.1.5"
 | 
			
		||||
    is-regex "^1.0.5"
 | 
			
		||||
    object-inspect "^1.7.0"
 | 
			
		||||
    object-keys "^1.1.1"
 | 
			
		||||
    object.assign "^4.1.0"
 | 
			
		||||
    string.prototype.trimleft "^2.1.1"
 | 
			
		||||
    string.prototype.trimright "^2.1.1"
 | 
			
		||||
 | 
			
		||||
es-to-primitive@^1.2.1:
 | 
			
		||||
  version "1.2.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
 | 
			
		||||
  integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-callable "^1.1.4"
 | 
			
		||||
    is-date-object "^1.0.1"
 | 
			
		||||
    is-symbol "^1.0.2"
 | 
			
		||||
 | 
			
		||||
escape-string-regexp@^1.0.5:
 | 
			
		||||
  version "1.0.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
 | 
			
		||||
  integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
 | 
			
		||||
 | 
			
		||||
eslint-import-resolver-node@^0.3.2:
 | 
			
		||||
  version "0.3.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404"
 | 
			
		||||
  integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    debug "^2.6.9"
 | 
			
		||||
    resolve "^1.13.1"
 | 
			
		||||
 | 
			
		||||
eslint-module-utils@^2.4.1:
 | 
			
		||||
  version "2.6.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6"
 | 
			
		||||
  integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    debug "^2.6.9"
 | 
			
		||||
    pkg-dir "^2.0.0"
 | 
			
		||||
 | 
			
		||||
eslint-plugin-es@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz#98cb1bc8ab0aa807977855e11ad9d1c9422d014b"
 | 
			
		||||
@@ -264,10 +485,28 @@ eslint-plugin-es@^3.0.0:
 | 
			
		||||
    eslint-utils "^2.0.0"
 | 
			
		||||
    regexpp "^3.0.0"
 | 
			
		||||
 | 
			
		||||
eslint-plugin-jsdoc@^24.0.0:
 | 
			
		||||
  version "24.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-24.0.0.tgz#41c7b06d33741e41e80a8f08c82aaa58ceef2e4b"
 | 
			
		||||
  integrity sha512-AGAc9PYpramsJGVmqtxnXBYlq+AMh+hIZdbJ52OLvyJS3f+PaT/PzuckRFOLnth2uhCDv4IjgsB3r5jUFWqUnw==
 | 
			
		||||
eslint-plugin-import@^2.20.1:
 | 
			
		||||
  version "2.20.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d"
 | 
			
		||||
  integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    array-includes "^3.0.3"
 | 
			
		||||
    array.prototype.flat "^1.2.1"
 | 
			
		||||
    contains-path "^0.1.0"
 | 
			
		||||
    debug "^2.6.9"
 | 
			
		||||
    doctrine "1.5.0"
 | 
			
		||||
    eslint-import-resolver-node "^0.3.2"
 | 
			
		||||
    eslint-module-utils "^2.4.1"
 | 
			
		||||
    has "^1.0.3"
 | 
			
		||||
    minimatch "^3.0.4"
 | 
			
		||||
    object.values "^1.1.0"
 | 
			
		||||
    read-pkg-up "^2.0.0"
 | 
			
		||||
    resolve "^1.12.0"
 | 
			
		||||
 | 
			
		||||
eslint-plugin-jsdoc@^23.0.0:
 | 
			
		||||
  version "23.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-23.0.0.tgz#f80dca482fc9d93a9e30b3ead70b88dee261caa3"
 | 
			
		||||
  integrity sha512-zj5ZephjKkFU/J9hEw3RcjwpuywChvwNMgHs2DTgOuKarpJ65SJU3JGgx/K4y9l8iFw0ysrk6NlAKDX88ZwZdw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    comment-parser "^0.7.2"
 | 
			
		||||
    debug "^4.1.1"
 | 
			
		||||
@@ -445,6 +684,13 @@ file-entry-cache@^5.0.1:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    flat-cache "^2.0.1"
 | 
			
		||||
 | 
			
		||||
find-up@^2.0.0, find-up@^2.1.0:
 | 
			
		||||
  version "2.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
 | 
			
		||||
  integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    locate-path "^2.0.0"
 | 
			
		||||
 | 
			
		||||
find-up@^4.1.0:
 | 
			
		||||
  version "4.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
 | 
			
		||||
@@ -482,16 +728,31 @@ fs.realpath@^1.0.0:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
 | 
			
		||||
  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
 | 
			
		||||
 | 
			
		||||
function-bind@^1.1.1:
 | 
			
		||||
  version "1.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
 | 
			
		||||
  integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
 | 
			
		||||
 | 
			
		||||
functional-red-black-tree@^1.0.1:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
 | 
			
		||||
  integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
 | 
			
		||||
 | 
			
		||||
fuzzy-search@^3.2.1:
 | 
			
		||||
  version "3.2.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/fuzzy-search/-/fuzzy-search-3.2.1.tgz#65d5faad6bc633aee86f1898b7788dfe312ac6c9"
 | 
			
		||||
  integrity sha512-vAcPiyomt1ioKAsAL2uxSABHJ4Ju/e4UeDM+g1OlR0vV4YhLGMNsdLNvZTpEDY4JCSt0E4hASCNM5t2ETtsbyg==
 | 
			
		||||
 | 
			
		||||
get-caller-file@^2.0.1:
 | 
			
		||||
  version "2.0.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
 | 
			
		||||
  integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
 | 
			
		||||
 | 
			
		||||
git-config-path@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/git-config-path/-/git-config-path-2.0.0.tgz#62633d61af63af4405a5024efd325762f58a181b"
 | 
			
		||||
  integrity sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA==
 | 
			
		||||
 | 
			
		||||
glob-parent@^5.0.0:
 | 
			
		||||
  version "5.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
 | 
			
		||||
@@ -499,7 +760,7 @@ glob-parent@^5.0.0:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-glob "^4.0.1"
 | 
			
		||||
 | 
			
		||||
glob@^7.1.3:
 | 
			
		||||
glob@^7.1.3, glob@^7.1.6:
 | 
			
		||||
  version "7.1.6"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
 | 
			
		||||
  integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
 | 
			
		||||
@@ -518,7 +779,7 @@ globals@^12.1.0:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    type-fest "^0.8.1"
 | 
			
		||||
 | 
			
		||||
graceful-fs@^4.1.6, graceful-fs@^4.2.0:
 | 
			
		||||
graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
 | 
			
		||||
  version "4.2.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
 | 
			
		||||
  integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
 | 
			
		||||
@@ -533,6 +794,23 @@ has-flag@^4.0.0:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
 | 
			
		||||
  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
 | 
			
		||||
 | 
			
		||||
has-symbols@^1.0.0, has-symbols@^1.0.1:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
 | 
			
		||||
  integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
 | 
			
		||||
 | 
			
		||||
has@^1.0.3:
 | 
			
		||||
  version "1.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
 | 
			
		||||
  integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    function-bind "^1.1.1"
 | 
			
		||||
 | 
			
		||||
hosted-git-info@^2.1.4:
 | 
			
		||||
  version "2.8.8"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
 | 
			
		||||
  integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
 | 
			
		||||
 | 
			
		||||
iconv-lite@^0.4.24:
 | 
			
		||||
  version "0.4.24"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
 | 
			
		||||
@@ -576,6 +854,11 @@ inherits@2:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
 | 
			
		||||
  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 | 
			
		||||
 | 
			
		||||
ini@^1.3.5:
 | 
			
		||||
  version "1.3.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
 | 
			
		||||
  integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
 | 
			
		||||
 | 
			
		||||
inquirer@^7.0.0:
 | 
			
		||||
  version "7.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29"
 | 
			
		||||
@@ -595,6 +878,21 @@ inquirer@^7.0.0:
 | 
			
		||||
    strip-ansi "^6.0.0"
 | 
			
		||||
    through "^2.3.6"
 | 
			
		||||
 | 
			
		||||
is-arrayish@^0.2.1:
 | 
			
		||||
  version "0.2.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
 | 
			
		||||
  integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
 | 
			
		||||
 | 
			
		||||
is-callable@^1.1.4, is-callable@^1.1.5:
 | 
			
		||||
  version "1.1.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab"
 | 
			
		||||
  integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==
 | 
			
		||||
 | 
			
		||||
is-date-object@^1.0.1:
 | 
			
		||||
  version "1.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
 | 
			
		||||
  integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
 | 
			
		||||
 | 
			
		||||
is-extglob@^2.1.1:
 | 
			
		||||
  version "2.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
 | 
			
		||||
@@ -617,11 +915,45 @@ is-glob@^4.0.0, is-glob@^4.0.1:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-extglob "^2.1.1"
 | 
			
		||||
 | 
			
		||||
is-obj@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
 | 
			
		||||
  integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
 | 
			
		||||
 | 
			
		||||
is-promise@^2.1.0:
 | 
			
		||||
  version "2.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
 | 
			
		||||
  integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
 | 
			
		||||
 | 
			
		||||
is-regex@^1.0.5:
 | 
			
		||||
  version "1.0.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
 | 
			
		||||
  integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    has "^1.0.3"
 | 
			
		||||
 | 
			
		||||
is-string@^1.0.5:
 | 
			
		||||
  version "1.0.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
 | 
			
		||||
  integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
 | 
			
		||||
 | 
			
		||||
is-symbol@^1.0.2:
 | 
			
		||||
  version "1.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
 | 
			
		||||
  integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    has-symbols "^1.0.1"
 | 
			
		||||
 | 
			
		||||
is-typedarray@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
 | 
			
		||||
  integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
 | 
			
		||||
 | 
			
		||||
isarray@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
 | 
			
		||||
  integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
 | 
			
		||||
 | 
			
		||||
isexe@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
 | 
			
		||||
@@ -664,6 +996,11 @@ jsonfile@^6.0.1:
 | 
			
		||||
  optionalDependencies:
 | 
			
		||||
    graceful-fs "^4.1.6"
 | 
			
		||||
 | 
			
		||||
kleur@^3.0.3:
 | 
			
		||||
  version "3.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
 | 
			
		||||
  integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
 | 
			
		||||
 | 
			
		||||
levn@^0.3.0, levn@~0.3.0:
 | 
			
		||||
  version "0.3.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
 | 
			
		||||
@@ -672,6 +1009,39 @@ levn@^0.3.0, levn@~0.3.0:
 | 
			
		||||
    prelude-ls "~1.1.2"
 | 
			
		||||
    type-check "~0.3.2"
 | 
			
		||||
 | 
			
		||||
license@^1.0.3:
 | 
			
		||||
  version "1.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/license/-/license-1.0.3.tgz#5c0085eff650bbd9f453a1cdd9206aa1ffb6a538"
 | 
			
		||||
  integrity sha512-M3F6dUcor+vy4znXK5ULfTikeMWxSf/K2w7EUk5vbuZL4UAEN4zOmjh7d2UJ0/v9GYTOz13LNsLqPXJGu+A26w==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@ovyerus/licenses" "^6.4.4"
 | 
			
		||||
    configstore "^5.0.1"
 | 
			
		||||
    detect-indent "^6.0.0"
 | 
			
		||||
    fuzzy-search "^3.2.1"
 | 
			
		||||
    git-config-path "^2.0.0"
 | 
			
		||||
    parse-git-config "^3.0.0"
 | 
			
		||||
    prompts "^2.3.2"
 | 
			
		||||
    wrap-text "^1.0.8"
 | 
			
		||||
    yargs "^15.3.1"
 | 
			
		||||
 | 
			
		||||
load-json-file@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
 | 
			
		||||
  integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    graceful-fs "^4.1.2"
 | 
			
		||||
    parse-json "^2.2.0"
 | 
			
		||||
    pify "^2.0.0"
 | 
			
		||||
    strip-bom "^3.0.0"
 | 
			
		||||
 | 
			
		||||
locate-path@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
 | 
			
		||||
  integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    p-locate "^2.0.0"
 | 
			
		||||
    path-exists "^3.0.0"
 | 
			
		||||
 | 
			
		||||
locate-path@^5.0.0:
 | 
			
		||||
  version "5.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
 | 
			
		||||
@@ -684,6 +1054,13 @@ lodash@^4.17.14, lodash@^4.17.15:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
 | 
			
		||||
  integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
 | 
			
		||||
 | 
			
		||||
make-dir@^3.0.0:
 | 
			
		||||
  version "3.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392"
 | 
			
		||||
  integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    semver "^6.0.0"
 | 
			
		||||
 | 
			
		||||
mimic-fn@^2.1.0:
 | 
			
		||||
  version "2.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
 | 
			
		||||
@@ -708,6 +1085,11 @@ mkdirp@^0.5.1:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    minimist "^1.2.5"
 | 
			
		||||
 | 
			
		||||
ms@2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
 | 
			
		||||
  integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
 | 
			
		||||
 | 
			
		||||
ms@^2.1.1:
 | 
			
		||||
  version "2.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
 | 
			
		||||
@@ -728,6 +1110,46 @@ nice-try@^1.0.4:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
 | 
			
		||||
  integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
 | 
			
		||||
 | 
			
		||||
normalize-package-data@^2.3.2:
 | 
			
		||||
  version "2.5.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
 | 
			
		||||
  integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    hosted-git-info "^2.1.4"
 | 
			
		||||
    resolve "^1.10.0"
 | 
			
		||||
    semver "2 || 3 || 4 || 5"
 | 
			
		||||
    validate-npm-package-license "^3.0.1"
 | 
			
		||||
 | 
			
		||||
object-inspect@^1.7.0:
 | 
			
		||||
  version "1.7.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
 | 
			
		||||
  integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
 | 
			
		||||
 | 
			
		||||
object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
 | 
			
		||||
  version "1.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
 | 
			
		||||
  integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
 | 
			
		||||
 | 
			
		||||
object.assign@^4.1.0:
 | 
			
		||||
  version "4.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
 | 
			
		||||
  integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    define-properties "^1.1.2"
 | 
			
		||||
    function-bind "^1.1.1"
 | 
			
		||||
    has-symbols "^1.0.0"
 | 
			
		||||
    object-keys "^1.0.11"
 | 
			
		||||
 | 
			
		||||
object.values@^1.1.0:
 | 
			
		||||
  version "1.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e"
 | 
			
		||||
  integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    define-properties "^1.1.3"
 | 
			
		||||
    es-abstract "^1.17.0-next.1"
 | 
			
		||||
    function-bind "^1.1.1"
 | 
			
		||||
    has "^1.0.3"
 | 
			
		||||
 | 
			
		||||
once@^1.3.0:
 | 
			
		||||
  version "1.4.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
 | 
			
		||||
@@ -759,6 +1181,13 @@ os-tmpdir@~1.0.2:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
 | 
			
		||||
  integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
 | 
			
		||||
 | 
			
		||||
p-limit@^1.1.0:
 | 
			
		||||
  version "1.3.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
 | 
			
		||||
  integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    p-try "^1.0.0"
 | 
			
		||||
 | 
			
		||||
p-limit@^2.2.0:
 | 
			
		||||
  version "2.3.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
 | 
			
		||||
@@ -766,6 +1195,13 @@ p-limit@^2.2.0:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    p-try "^2.0.0"
 | 
			
		||||
 | 
			
		||||
p-locate@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
 | 
			
		||||
  integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    p-limit "^1.1.0"
 | 
			
		||||
 | 
			
		||||
p-locate@^4.1.0:
 | 
			
		||||
  version "4.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
 | 
			
		||||
@@ -773,6 +1209,11 @@ p-locate@^4.1.0:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    p-limit "^2.2.0"
 | 
			
		||||
 | 
			
		||||
p-try@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
 | 
			
		||||
  integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
 | 
			
		||||
 | 
			
		||||
p-try@^2.0.0:
 | 
			
		||||
  version "2.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
 | 
			
		||||
@@ -785,6 +1226,26 @@ parent-module@^1.0.0:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    callsites "^3.0.0"
 | 
			
		||||
 | 
			
		||||
parse-git-config@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-3.0.0.tgz#4a2de08c7b74a2555efa5ae94d40cd44302a6132"
 | 
			
		||||
  integrity sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    git-config-path "^2.0.0"
 | 
			
		||||
    ini "^1.3.5"
 | 
			
		||||
 | 
			
		||||
parse-json@^2.2.0:
 | 
			
		||||
  version "2.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
 | 
			
		||||
  integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    error-ex "^1.2.0"
 | 
			
		||||
 | 
			
		||||
path-exists@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
 | 
			
		||||
  integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
 | 
			
		||||
 | 
			
		||||
path-exists@^4.0.0:
 | 
			
		||||
  version "4.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
 | 
			
		||||
@@ -805,6 +1266,25 @@ path-parse@^1.0.6:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
 | 
			
		||||
  integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
 | 
			
		||||
 | 
			
		||||
path-type@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
 | 
			
		||||
  integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    pify "^2.0.0"
 | 
			
		||||
 | 
			
		||||
pify@^2.0.0:
 | 
			
		||||
  version "2.3.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
 | 
			
		||||
  integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
 | 
			
		||||
 | 
			
		||||
pkg-dir@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
 | 
			
		||||
  integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    find-up "^2.1.0"
 | 
			
		||||
 | 
			
		||||
prelude-ls@~1.1.2:
 | 
			
		||||
  version "1.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
 | 
			
		||||
@@ -815,11 +1295,36 @@ progress@^2.0.0:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
 | 
			
		||||
  integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
 | 
			
		||||
 | 
			
		||||
prompts@^2.3.2:
 | 
			
		||||
  version "2.3.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068"
 | 
			
		||||
  integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    kleur "^3.0.3"
 | 
			
		||||
    sisteransi "^1.0.4"
 | 
			
		||||
 | 
			
		||||
punycode@^2.1.0:
 | 
			
		||||
  version "2.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
 | 
			
		||||
  integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
 | 
			
		||||
 | 
			
		||||
read-pkg-up@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
 | 
			
		||||
  integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    find-up "^2.0.0"
 | 
			
		||||
    read-pkg "^2.0.0"
 | 
			
		||||
 | 
			
		||||
read-pkg@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
 | 
			
		||||
  integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    load-json-file "^2.0.0"
 | 
			
		||||
    normalize-package-data "^2.3.2"
 | 
			
		||||
    path-type "^2.0.0"
 | 
			
		||||
 | 
			
		||||
regexpp@^2.0.1:
 | 
			
		||||
  version "2.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
 | 
			
		||||
@@ -850,7 +1355,7 @@ resolve-from@^4.0.0:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
 | 
			
		||||
  integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
 | 
			
		||||
 | 
			
		||||
resolve@^1.10.1:
 | 
			
		||||
resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1:
 | 
			
		||||
  version "1.16.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.16.1.tgz#49fac5d8bacf1fd53f200fa51247ae736175832c"
 | 
			
		||||
  integrity sha512-rmAglCSqWWMrrBv/XM6sW0NuRFiKViw/W4d9EbC4pt+49H8JwHy+mcGmALTEg504AUDcLTvb1T2q3E9AnmY+ig==
 | 
			
		||||
@@ -891,12 +1396,12 @@ rxjs@^6.5.3:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
 | 
			
		||||
  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
 | 
			
		||||
 | 
			
		||||
semver@^5.5.0:
 | 
			
		||||
"semver@2 || 3 || 4 || 5", semver@^5.5.0:
 | 
			
		||||
  version "5.7.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
 | 
			
		||||
  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
 | 
			
		||||
 | 
			
		||||
semver@^6.1.0, semver@^6.1.2, semver@^6.3.0:
 | 
			
		||||
semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0:
 | 
			
		||||
  version "6.3.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
 | 
			
		||||
  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 | 
			
		||||
@@ -923,6 +1428,11 @@ signal-exit@^3.0.2:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
 | 
			
		||||
  integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
 | 
			
		||||
 | 
			
		||||
sisteransi@^1.0.4:
 | 
			
		||||
  version "1.0.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
 | 
			
		||||
  integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
 | 
			
		||||
 | 
			
		||||
slice-ansi@^2.1.0:
 | 
			
		||||
  version "2.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
 | 
			
		||||
@@ -932,10 +1442,18 @@ slice-ansi@^2.1.0:
 | 
			
		||||
    astral-regex "^1.0.0"
 | 
			
		||||
    is-fullwidth-code-point "^2.0.0"
 | 
			
		||||
 | 
			
		||||
spdx-correct@^3.0.0:
 | 
			
		||||
  version "3.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
 | 
			
		||||
  integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    spdx-expression-parse "^3.0.0"
 | 
			
		||||
    spdx-license-ids "^3.0.0"
 | 
			
		||||
 | 
			
		||||
spdx-exceptions@^2.1.0:
 | 
			
		||||
  version "2.3.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
 | 
			
		||||
  integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
 | 
			
		||||
  version "2.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
 | 
			
		||||
  integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==
 | 
			
		||||
 | 
			
		||||
spdx-expression-parse@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
@@ -973,6 +1491,40 @@ string-width@^4.1.0, string-width@^4.2.0:
 | 
			
		||||
    is-fullwidth-code-point "^3.0.0"
 | 
			
		||||
    strip-ansi "^6.0.0"
 | 
			
		||||
 | 
			
		||||
string.prototype.trimend@^1.0.0:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
 | 
			
		||||
  integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    define-properties "^1.1.3"
 | 
			
		||||
    es-abstract "^1.17.5"
 | 
			
		||||
 | 
			
		||||
string.prototype.trimleft@^2.1.1:
 | 
			
		||||
  version "2.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc"
 | 
			
		||||
  integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    define-properties "^1.1.3"
 | 
			
		||||
    es-abstract "^1.17.5"
 | 
			
		||||
    string.prototype.trimstart "^1.0.0"
 | 
			
		||||
 | 
			
		||||
string.prototype.trimright@^2.1.1:
 | 
			
		||||
  version "2.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3"
 | 
			
		||||
  integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    define-properties "^1.1.3"
 | 
			
		||||
    es-abstract "^1.17.5"
 | 
			
		||||
    string.prototype.trimend "^1.0.0"
 | 
			
		||||
 | 
			
		||||
string.prototype.trimstart@^1.0.0:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
 | 
			
		||||
  integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    define-properties "^1.1.3"
 | 
			
		||||
    es-abstract "^1.17.5"
 | 
			
		||||
 | 
			
		||||
strip-ansi@^5.1.0, strip-ansi@^5.2.0:
 | 
			
		||||
  version "5.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
 | 
			
		||||
@@ -987,6 +1539,11 @@ strip-ansi@^6.0.0:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    ansi-regex "^5.0.0"
 | 
			
		||||
 | 
			
		||||
strip-bom@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
 | 
			
		||||
  integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
 | 
			
		||||
 | 
			
		||||
strip-json-comments@^3.0.1:
 | 
			
		||||
  version "3.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
 | 
			
		||||
@@ -1033,11 +1590,18 @@ tmp@^0.0.33:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    os-tmpdir "~1.0.2"
 | 
			
		||||
 | 
			
		||||
tslib@^1.9.0:
 | 
			
		||||
tslib@^1.8.1, tslib@^1.9.0:
 | 
			
		||||
  version "1.11.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35"
 | 
			
		||||
  integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==
 | 
			
		||||
 | 
			
		||||
tsutils@^3.17.1:
 | 
			
		||||
  version "3.17.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
 | 
			
		||||
  integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    tslib "^1.8.1"
 | 
			
		||||
 | 
			
		||||
type-check@~0.3.2:
 | 
			
		||||
  version "0.3.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
 | 
			
		||||
@@ -1055,6 +1619,25 @@ type-fest@^0.8.1:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
 | 
			
		||||
  integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
 | 
			
		||||
 | 
			
		||||
typedarray-to-buffer@^3.1.5:
 | 
			
		||||
  version "3.1.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
 | 
			
		||||
  integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-typedarray "^1.0.0"
 | 
			
		||||
 | 
			
		||||
typescript@^3.8.3:
 | 
			
		||||
  version "3.8.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061"
 | 
			
		||||
  integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==
 | 
			
		||||
 | 
			
		||||
unique-string@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
 | 
			
		||||
  integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    crypto-random-string "^2.0.0"
 | 
			
		||||
 | 
			
		||||
universalify@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d"
 | 
			
		||||
@@ -1072,6 +1655,14 @@ v8-compile-cache@^2.0.3:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e"
 | 
			
		||||
  integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==
 | 
			
		||||
 | 
			
		||||
validate-npm-package-license@^3.0.1:
 | 
			
		||||
  version "3.0.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
 | 
			
		||||
  integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    spdx-correct "^3.0.0"
 | 
			
		||||
    spdx-expression-parse "^3.0.0"
 | 
			
		||||
 | 
			
		||||
which-module@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
 | 
			
		||||
@@ -1098,11 +1689,26 @@ wrap-ansi@^6.2.0:
 | 
			
		||||
    string-width "^4.1.0"
 | 
			
		||||
    strip-ansi "^6.0.0"
 | 
			
		||||
 | 
			
		||||
wrap-text@^1.0.8:
 | 
			
		||||
  version "1.0.8"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/wrap-text/-/wrap-text-1.0.8.tgz#1b472024c625fc23560880c12f2944b064bfe4f1"
 | 
			
		||||
  integrity sha512-trmZLGAm8DE+uYrrUH6xHiLT/CXMfEGGE5kDJWIyZygI9i6b1eNS2JjnjOwBoYA6RJbtuSB/d3Ae2BUfpiVDiw==
 | 
			
		||||
 | 
			
		||||
wrappy@1:
 | 
			
		||||
  version "1.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
 | 
			
		||||
  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
 | 
			
		||||
 | 
			
		||||
write-file-atomic@^3.0.0:
 | 
			
		||||
  version "3.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
 | 
			
		||||
  integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    imurmurhash "^0.1.4"
 | 
			
		||||
    is-typedarray "^1.0.0"
 | 
			
		||||
    signal-exit "^3.0.2"
 | 
			
		||||
    typedarray-to-buffer "^3.1.5"
 | 
			
		||||
 | 
			
		||||
write@1.0.3:
 | 
			
		||||
  version "1.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
 | 
			
		||||
@@ -1110,6 +1716,11 @@ write@1.0.3:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    mkdirp "^0.5.1"
 | 
			
		||||
 | 
			
		||||
xdg-basedir@^4.0.0:
 | 
			
		||||
  version "4.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
 | 
			
		||||
  integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
 | 
			
		||||
 | 
			
		||||
y18n@^4.0.0:
 | 
			
		||||
  version "4.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
 | 
			
		||||
@@ -1123,7 +1734,7 @@ yargs-parser@^18.1.1:
 | 
			
		||||
    camelcase "^5.0.0"
 | 
			
		||||
    decamelize "^1.2.0"
 | 
			
		||||
 | 
			
		||||
yargs@^15.1.0:
 | 
			
		||||
yargs@^15.3.1:
 | 
			
		||||
  version "15.3.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b"
 | 
			
		||||
  integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user