├── .DS_Store
├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── LICENSE
├── README-zh_CN.md
├── README.md
├── dist
├── compiler
│ └── index.js
├── generateCodeByOption.js
├── getExcelData.js
├── interface
│ └── index.js
├── main.js
├── sliceByColumn.js
└── warn.js
├── example
├── excel.xlsx
├── index.js
└── index.vue
├── index.d.ts
├── package-lock.json
├── package.json
├── script
└── release.sh
├── src
├── compiler
│ └── index.ts
├── generateCodeByOption.ts
├── getExcelData.ts
├── interface
│ └── index.ts
├── main.ts
├── sliceByColumn.ts
└── warn.ts
└── tsconfig.json
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zzzzzhowie/excel-code-generator/4abe51a5055356392cf78b044e67375984e1bd7a/.DS_Store
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | *.js
2 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | parser: "@typescript-eslint/parser", // Specifies the ESLint parser
3 | extends: [
4 | "plugin:@typescript-eslint/recommended", // Uses the recommended rules from the @typescript-eslint/eslint-plugin
5 | "prettier/@typescript-eslint", // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier
6 | "plugin:prettier/recommended" // Enables eslint-plugin-prettier and displays prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array.
7 | ],
8 | parserOptions: {
9 | ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features
10 | sourceType: "module" // Allows for the use of imports
11 | },
12 | rules: {
13 | "@typescript-eslint/no-non-null-assertion": "off", // 允许非空断言
14 | "@typescript-eslint/no-explicit-any": "off", // 允许显式的 any
15 | "@typescript-eslint/explicit-function-return-type": "off" // // 允许隐式的函数返回值
16 | }
17 | };
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules/
2 | .idea
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 夜宴
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README-zh_CN.md:
--------------------------------------------------------------------------------
1 | # excel-code-generator
2 |
3 | [English](./README.md) | 中文
4 |
5 | 一个能够读取 excel 文件的指定单元格并生成指定代码到文件中的工具
6 |
7 | 在后台管理系统中,往往需要输入很多字段名,手动输入会造成很多隐藏的错误
8 |
9 | `如果数据字段的文档是用 excel 写的话`,使用这款工具,用户只需配置生成的代码的模版,即可自动生成代码片段并写入指定文件中,提高工作效率,减少误差
10 |
11 | ## 使用
12 |
13 | ```
14 | npm i excel-code-generator -D
15 | ```
16 |
17 | ```javascript
18 | const { gen, excel } = require("excel-code-generator");
19 |
20 | gen({
21 | target: "./example/index.vue",
22 | reg: /table>/g,
23 | template: excel`
24 |
34 |
35 | `
36 | });
37 | ```
38 |
39 | ## Api
40 |
41 | | Name | 类型 | Description | 是否必填 |
42 | |:--------------:|:----------:|:------------|------|
43 | | **`template`** | `{string}` | `生成的代码模版` | 是 |
44 | | **`target`** | `{string}` | `写入文件路径` | 否 |
45 | | **`reg`** | `{RegExp}` | `写入文件的具体位置` | 否 |
46 |
47 | 其中 excel-code-generator 为 template 提供了特殊的标签模版 `excel`,标签模版提供了一些自定义语法帮助更好的填入 excel 的值
48 |
49 | ```javascript
50 | excel`
51 |
61 |
62 | `
63 | ```
64 |
65 | 在 `${}` 中传入一个对象,类型如下,最后生成以下模版
66 |
67 | Option
68 |
69 | | 参数 | Type | Description | 是否必填 |
70 | |:---------------:|:------------:|:---------------------------------------------------|------|
71 | | **`source`** | `{string}` | `读取的 excel 路径` | 是 |
72 | | **`line`** | `{string[]}` | `读取 excel 的位置,第一个元素为 excel 的列(英文索引),第二,三个元素为列的起止行` | 是 |
73 | | **`camelcase`** | `{boolean}` | `是否将该字段转为驼峰,默认 true` | 否 |
74 |
75 | ```vue
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 | ```
91 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # excel-code-generator
2 |
3 | English | [中文](./README-zh_CN.md)
4 |
5 | A tool that can extract specified data from xlsx and generate code into any file
6 |
7 | In the dashboard, we often need to enter a lot of field names, manual input will cause a lot of hidden errors
8 |
9 | If the data field document is written in Excel, using this tool, users only need to configure the generated code template, you can automatically generate code snippets and write to the specified file, improve work efficiency and reduce errors
10 |
11 | ## Usage
12 | ```
13 | npm i excel-code-generator -D
14 | ```
15 |
16 | ```javascript
17 | const { gen, excel } = require("excel-code-generator");
18 |
19 | gen({
20 | target: "./example/index.vue",
21 | reg: /table>/g,
22 | template: excel`
23 |
33 |
34 | `
35 | });
36 | ```
37 |
38 | ## Api
39 |
40 | | Name | Type | Description | Required |
41 | |:--------------:|:----------:|:---------------------------------------------------------------------------|----------|
42 | | **`template`** | `{string}` | `Generated code template` | true |
43 | | **`target`** | `{string}` | `Path of the Excel` | false |
44 | | **`reg`** | `{RegExp}` | `Use this RegExp to match the specific location of the file to be written` | false |
45 |
46 | excel-code-generator provides a special tag "excel" for template, and the tag template provides some custom syntax to help better fill in Excel values
47 |
48 |
49 | ```javascript
50 | excel`
51 |
61 |
62 | `
63 | ```
64 |
65 | Pass an object in `${}` of the following type, and finally generate the following template
66 |
67 | Option
68 |
69 | | Paramters | Type | Description | Required |
70 | |:---------------:| :----------: |:----------------------------------------------------------------------------------------------------------------------------------------------------------|----------|
71 | | **`source`** | `{string}` | `Path of the Excel` | true |
72 | | **`line`** | `{string[]}` | `Read excel's position, the first element is excel's column (English index), and the second and third elements are the column's starting and ending rows` | true |
73 | | **`camelcase`** | `{boolean}` | `Whether to convert this field to a hump. The default is true` | false |
74 |
75 | ```vue
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 | ```
91 |
--------------------------------------------------------------------------------
/dist/compiler/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | var generateCodeByOption_1 = require("../generateCodeByOption");
4 | exports.excel = function (strs) {
5 | var options = [];
6 | for (var _i = 1; _i < arguments.length; _i++) {
7 | options[_i - 1] = arguments[_i];
8 | }
9 | var res = "";
10 | var maxNumber = 0;
11 | var selectedExcelData = options.map(function (option) {
12 | var number = 1 + option.line[2] - option.line[1];
13 | maxNumber = Math.max(number, maxNumber);
14 | return generateCodeByOption_1.generateCodeByOption(option);
15 | });
16 | var codeFunc = function (rowIndex) {
17 | return strs.map(function (str, columnIndex) { var _a; return str + (((_a = selectedExcelData[columnIndex]) === null || _a === void 0 ? void 0 : _a[rowIndex]) || ""); });
18 | };
19 | for (var rowIndex = 0; rowIndex < maxNumber; rowIndex++) {
20 | res += codeFunc(rowIndex).join("");
21 | }
22 | return res;
23 | };
24 |
--------------------------------------------------------------------------------
/dist/generateCodeByOption.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | var getExcelData_1 = require("./getExcelData");
4 | var sliceByColumn_1 = require("./sliceByColumn");
5 | function generateCodeByOption(option) {
6 | var excelPath = option.source;
7 | var sheet = option.sheet || 1;
8 | var data = getExcelData_1.getExcelData(excelPath, sheet);
9 | return sliceByColumn_1.sliceByColumn(data, option);
10 | }
11 | exports.generateCodeByOption = generateCodeByOption;
12 |
--------------------------------------------------------------------------------
/dist/getExcelData.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
4 | };
5 | Object.defineProperty(exports, "__esModule", { value: true });
6 | var fs_1 = __importDefault(require("fs"));
7 | var node_xlsx_1 = __importDefault(require("node-xlsx"));
8 | var fp_1 = require("lodash/fp");
9 | var warn_1 = require("./warn");
10 | exports.getExcelData = function (path, sheet) {
11 | var generateBuffer = fp_1.pipe(fs_1.default.readFileSync, node_xlsx_1.default.parse);
12 | var workSheetsFromBuffer = generateBuffer(path);
13 | var _a = (workSheetsFromBuffer[sheet - 1] || {}).data, data = _a === void 0 ? null : _a; // 第 x 张sheet 中的数据
14 | if (!data) {
15 | warn_1.warn("没有找到相应的excel数据");
16 | }
17 | return data;
18 | };
19 |
--------------------------------------------------------------------------------
/dist/interface/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 |
--------------------------------------------------------------------------------
/dist/main.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
4 | };
5 | Object.defineProperty(exports, "__esModule", { value: true });
6 | var fs_1 = __importDefault(require("fs"));
7 | var chalk_1 = __importDefault(require("chalk"));
8 | var warn_1 = require("./warn");
9 | var compiler_1 = require("./compiler");
10 | exports.excel = compiler_1.excel;
11 | function fillCode(initCode, reg, fillCode) {
12 | if (!initCode.match(reg))
13 | warn_1.warn("没有匹配到相应字段,请查看reg是否配置正确");
14 | var matchRes = initCode.match(reg);
15 | if (!matchRes)
16 | warn_1.warn("正则匹配不到任何文件的字段");
17 | var matchStr = matchRes[0]; //matchRes匹配到的是标签的前半部分
18 | //从各个匹配的位置替换原来标签
19 | var openTagStart = initCode.indexOf(matchStr);
20 | var openTagLength = matchStr.length;
21 | var openTagEnd = openTagStart + openTagLength;
22 | return initCode.slice(0, openTagEnd) + fillCode + initCode.slice(openTagEnd);
23 | }
24 | exports.gen = function (config) {
25 | if (!config.reg || !config.target) {
26 | console.log(chalk_1.default.yellow("没有提供 reg/target 属性,显示解析后的 template"));
27 | console.log(config.template);
28 | }
29 | else {
30 | var readData = fs_1.default.readFileSync(config.target, "utf-8");
31 | console.log("read success!");
32 | fs_1.default.writeFileSync(config.target, fillCode(readData, config.reg, config.template));
33 | console.log("write success!");
34 | }
35 | };
36 |
--------------------------------------------------------------------------------
/dist/sliceByColumn.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | var warn_1 = require("./warn");
4 | var VALID_LINE_NUMBER = 3;
5 | var isPositiveNum = function (num) { return num >= 0; };
6 | function sliceByColumn(data, option) {
7 | // 生成 a-z 的数组
8 | var alphabetArr = Array.from(new Array(26)).map(function (item, index) { return String.fromCharCode(index + 97); });
9 | if (option.line.length !== VALID_LINE_NUMBER) {
10 | warn_1.warn("错误的 line 配置项");
11 | }
12 | var index = alphabetArr.findIndex(function (item) { return item === option.line[0].toLowerCase(); });
13 | var columnData = data.map(function (rowArr) { return rowArr[index]; });
14 | var startPos = Number(option.line[1]) - 1;
15 | var endPos = Number(option.line[2]);
16 | if (!isPositiveNum(startPos) || !isPositiveNum(endPos)) {
17 | warn_1.warn("line的参数格式不正确");
18 | }
19 | return columnData.slice(startPos, endPos);
20 | }
21 | exports.sliceByColumn = sliceByColumn;
22 |
--------------------------------------------------------------------------------
/dist/warn.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | function warn(errMessage) {
4 | console.error(errMessage);
5 | process.exit();
6 | }
7 | exports.warn = warn;
8 |
--------------------------------------------------------------------------------
/example/excel.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zzzzzhowie/excel-code-generator/4abe51a5055356392cf78b044e67375984e1bd7a/example/excel.xlsx
--------------------------------------------------------------------------------
/example/index.js:
--------------------------------------------------------------------------------
1 | const { gen, excel } = require("../dist/main");
2 |
3 | gen({
4 | target: "./example/index.vue",
5 | reg: /table>/g,
6 | template: excel`
7 |
17 |
18 | `
19 | });
20 |
--------------------------------------------------------------------------------
/example/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/index.d.ts:
--------------------------------------------------------------------------------
1 | import { Option } from "./src/interface";
2 |
3 | declare function gen(config: {
4 | template: string;
5 | target?: string;
6 | reg?: RegExp;
7 | }): void;
8 |
9 | declare function excel(
10 | strs: TemplateStringsArray,
11 | ...options: Option[]
12 | ): string;
13 |
14 | export { excel, gen };
15 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "excel-code-generator",
3 | "version": "2.0.3",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/code-frame": {
8 | "version": "7.0.0",
9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
10 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
11 | "dev": true,
12 | "requires": {
13 | "@babel/highlight": "^7.0.0"
14 | }
15 | },
16 | "@babel/highlight": {
17 | "version": "7.0.0",
18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
19 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
20 | "dev": true,
21 | "requires": {
22 | "chalk": "^2.0.0",
23 | "esutils": "^2.0.2",
24 | "js-tokens": "^4.0.0"
25 | },
26 | "dependencies": {
27 | "chalk": {
28 | "version": "2.4.2",
29 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
30 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
31 | "dev": true,
32 | "requires": {
33 | "ansi-styles": "^3.2.1",
34 | "escape-string-regexp": "^1.0.5",
35 | "supports-color": "^5.3.0"
36 | }
37 | },
38 | "has-flag": {
39 | "version": "3.0.0",
40 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
41 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
42 | "dev": true
43 | },
44 | "supports-color": {
45 | "version": "5.5.0",
46 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
47 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
48 | "dev": true,
49 | "requires": {
50 | "has-flag": "^3.0.0"
51 | }
52 | }
53 | }
54 | },
55 | "@types/chalk": {
56 | "version": "2.2.0",
57 | "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-2.2.0.tgz",
58 | "integrity": "sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==",
59 | "dev": true,
60 | "requires": {
61 | "chalk": "*"
62 | }
63 | },
64 | "@types/color-name": {
65 | "version": "1.1.1",
66 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
67 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
68 | "dev": true
69 | },
70 | "@types/events": {
71 | "version": "3.0.0",
72 | "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
73 | "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
74 | "dev": true
75 | },
76 | "@types/glob": {
77 | "version": "7.1.1",
78 | "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
79 | "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
80 | "dev": true,
81 | "requires": {
82 | "@types/events": "*",
83 | "@types/minimatch": "*",
84 | "@types/node": "*"
85 | }
86 | },
87 | "@types/lodash": {
88 | "version": "4.14.126",
89 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.126.tgz",
90 | "integrity": "sha512-HxQ+wQnBtnL0LszZrVdMqWIlzZNyKuMLUb6swQ3mo6ysPqpAu7gfnapCQIi0B+Mrf0fNLZh8AWgJs2njejVasg==",
91 | "dev": true
92 | },
93 | "@types/minimatch": {
94 | "version": "3.0.3",
95 | "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
96 | "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
97 | "dev": true
98 | },
99 | "@types/node": {
100 | "version": "12.6.8",
101 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.8.tgz",
102 | "integrity": "sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==",
103 | "dev": true
104 | },
105 | "@types/node-xlsx": {
106 | "version": "0.12.1",
107 | "resolved": "https://registry.npmjs.org/@types/node-xlsx/-/node-xlsx-0.12.1.tgz",
108 | "integrity": "sha512-KIP4AaUvh69FM7OozMAppWT/av0+/HgZEmFKKcq/XIXUFdOpiWxE8oC5Jq33kXgvfdLS0q6n687iGJvoe/0gkA==",
109 | "dev": true
110 | },
111 | "@types/prettier": {
112 | "version": "1.19.0",
113 | "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.0.tgz",
114 | "integrity": "sha512-gDE8JJEygpay7IjA/u3JiIURvwZW08f0cZSZLAzFoX/ZmeqvS0Sqv+97aKuHpNsalAMMhwPe+iAS6fQbfmbt7A==",
115 | "dev": true
116 | },
117 | "@types/shelljs": {
118 | "version": "0.8.6",
119 | "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.6.tgz",
120 | "integrity": "sha512-svx2eQS268awlppL/P8wgDLBrsDXdKznABHJcuqXyWpSKJgE1s2clXlBvAwbO/lehTmG06NtEWJRkAk4tAgenA==",
121 | "dev": true,
122 | "requires": {
123 | "@types/glob": "*",
124 | "@types/node": "*"
125 | }
126 | },
127 | "@typescript-eslint/eslint-plugin": {
128 | "version": "1.8.0",
129 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.8.0.tgz",
130 | "integrity": "sha512-wypT9PZUDKxCc2wVMqifo5unmtHqOPuBdcvuY03fPWQfHLqWEl49JCbGzRRXovRROONxMqbaiJPo+biL7QoDwQ==",
131 | "dev": true,
132 | "requires": {
133 | "@typescript-eslint/experimental-utils": "1.8.0",
134 | "@typescript-eslint/parser": "1.8.0",
135 | "eslint-utils": "^1.3.1",
136 | "regexpp": "^2.0.1",
137 | "requireindex": "^1.2.0",
138 | "tsutils": "^3.7.0"
139 | }
140 | },
141 | "@typescript-eslint/experimental-utils": {
142 | "version": "1.8.0",
143 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.8.0.tgz",
144 | "integrity": "sha512-j+uDLmB/OC8Siir8bJk7PzGxkDn04MVLC+hRMADrK5JnKRXxiE2nSR2E6jk4XP36y/Hba2uma+CRGfs6n+Kwaw==",
145 | "dev": true,
146 | "requires": {
147 | "@typescript-eslint/typescript-estree": "1.8.0"
148 | }
149 | },
150 | "@typescript-eslint/parser": {
151 | "version": "1.8.0",
152 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.8.0.tgz",
153 | "integrity": "sha512-3SK++gL2ndV/X7jlceiaRfHww7/JVguxFKMSF7k8iNXflR+oSucfRacReXuwVcNy09aepgDD/MCMJo/7Eh/GVg==",
154 | "dev": true,
155 | "requires": {
156 | "@typescript-eslint/experimental-utils": "1.8.0",
157 | "@typescript-eslint/typescript-estree": "1.8.0",
158 | "eslint-scope": "^4.0.0",
159 | "eslint-visitor-keys": "^1.0.0"
160 | }
161 | },
162 | "@typescript-eslint/typescript-estree": {
163 | "version": "1.8.0",
164 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.8.0.tgz",
165 | "integrity": "sha512-3ZeE79z+L8W/zsuta8vStI8W0d5j5BYiFc5sH8zerIl61hlwU3HJZIQTAnzX9r7kqf0QvIk5ak5iacttmci/mg==",
166 | "dev": true,
167 | "requires": {
168 | "lodash.unescape": "4.0.1",
169 | "semver": "5.5.0"
170 | },
171 | "dependencies": {
172 | "semver": {
173 | "version": "5.5.0",
174 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
175 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
176 | "dev": true
177 | }
178 | }
179 | },
180 | "acorn": {
181 | "version": "6.1.1",
182 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz",
183 | "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==",
184 | "dev": true
185 | },
186 | "acorn-jsx": {
187 | "version": "5.0.1",
188 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz",
189 | "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==",
190 | "dev": true
191 | },
192 | "adler-32": {
193 | "version": "1.2.0",
194 | "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz",
195 | "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=",
196 | "requires": {
197 | "exit-on-epipe": "~1.0.1",
198 | "printj": "~1.1.0"
199 | }
200 | },
201 | "ajv": {
202 | "version": "6.10.0",
203 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
204 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
205 | "dev": true,
206 | "requires": {
207 | "fast-deep-equal": "^2.0.1",
208 | "fast-json-stable-stringify": "^2.0.0",
209 | "json-schema-traverse": "^0.4.1",
210 | "uri-js": "^4.2.2"
211 | }
212 | },
213 | "ansi-escapes": {
214 | "version": "3.2.0",
215 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
216 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
217 | "dev": true
218 | },
219 | "ansi-regex": {
220 | "version": "3.0.0",
221 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
222 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
223 | "dev": true
224 | },
225 | "ansi-styles": {
226 | "version": "3.2.1",
227 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
228 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
229 | "dev": true,
230 | "requires": {
231 | "color-convert": "^1.9.0"
232 | }
233 | },
234 | "arg": {
235 | "version": "4.1.1",
236 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz",
237 | "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==",
238 | "dev": true
239 | },
240 | "argparse": {
241 | "version": "1.0.10",
242 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
243 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
244 | "dev": true,
245 | "requires": {
246 | "sprintf-js": "~1.0.2"
247 | }
248 | },
249 | "astral-regex": {
250 | "version": "1.0.0",
251 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
252 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
253 | "dev": true
254 | },
255 | "balanced-match": {
256 | "version": "1.0.0",
257 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
258 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
259 | "dev": true
260 | },
261 | "brace-expansion": {
262 | "version": "1.1.11",
263 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
264 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
265 | "dev": true,
266 | "requires": {
267 | "balanced-match": "^1.0.0",
268 | "concat-map": "0.0.1"
269 | }
270 | },
271 | "buffer-from": {
272 | "version": "1.1.1",
273 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
274 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
275 | },
276 | "callsites": {
277 | "version": "3.1.0",
278 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
279 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
280 | "dev": true
281 | },
282 | "camelcase": {
283 | "version": "5.3.1",
284 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
285 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
286 | },
287 | "cfb": {
288 | "version": "1.0.8",
289 | "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.0.8.tgz",
290 | "integrity": "sha1-d/ITST1pfXVP2cD1UR6rWtctAs8=",
291 | "requires": {
292 | "commander": "^2.14.1",
293 | "printj": "~1.1.2"
294 | }
295 | },
296 | "chalk": {
297 | "version": "3.0.0",
298 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
299 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
300 | "dev": true,
301 | "requires": {
302 | "ansi-styles": "^4.1.0",
303 | "supports-color": "^7.1.0"
304 | },
305 | "dependencies": {
306 | "ansi-styles": {
307 | "version": "4.2.1",
308 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
309 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
310 | "dev": true,
311 | "requires": {
312 | "@types/color-name": "^1.1.1",
313 | "color-convert": "^2.0.1"
314 | }
315 | },
316 | "color-convert": {
317 | "version": "2.0.1",
318 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
319 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
320 | "dev": true,
321 | "requires": {
322 | "color-name": "~1.1.4"
323 | }
324 | },
325 | "color-name": {
326 | "version": "1.1.4",
327 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
328 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
329 | "dev": true
330 | }
331 | }
332 | },
333 | "chardet": {
334 | "version": "0.7.0",
335 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
336 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
337 | "dev": true
338 | },
339 | "cli-cursor": {
340 | "version": "2.1.0",
341 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
342 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
343 | "dev": true,
344 | "requires": {
345 | "restore-cursor": "^2.0.0"
346 | }
347 | },
348 | "cli-width": {
349 | "version": "2.2.0",
350 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
351 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
352 | "dev": true
353 | },
354 | "codepage": {
355 | "version": "1.13.1",
356 | "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.13.1.tgz",
357 | "integrity": "sha512-KnY6cQlgkfBjplnQkLk3M5KEfAKa7i9SMqXp+bMuy2/bgYovvU4LDAQvkMaoScwhvozA9VUtgnbS4Z8f7zVA8w==",
358 | "requires": {
359 | "commander": "~2.14.1",
360 | "exit-on-epipe": "~1.0.1"
361 | },
362 | "dependencies": {
363 | "commander": {
364 | "version": "2.14.1",
365 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
366 | "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
367 | }
368 | }
369 | },
370 | "color-convert": {
371 | "version": "1.9.3",
372 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
373 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
374 | "dev": true,
375 | "requires": {
376 | "color-name": "1.1.3"
377 | }
378 | },
379 | "color-name": {
380 | "version": "1.1.3",
381 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
382 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
383 | "dev": true
384 | },
385 | "commander": {
386 | "version": "2.15.1",
387 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
388 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
389 | },
390 | "concat-map": {
391 | "version": "0.0.1",
392 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
393 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
394 | "dev": true
395 | },
396 | "crc-32": {
397 | "version": "1.2.0",
398 | "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
399 | "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
400 | "requires": {
401 | "exit-on-epipe": "~1.0.1",
402 | "printj": "~1.1.0"
403 | }
404 | },
405 | "cross-spawn": {
406 | "version": "6.0.5",
407 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
408 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
409 | "dev": true,
410 | "requires": {
411 | "nice-try": "^1.0.4",
412 | "path-key": "^2.0.1",
413 | "semver": "^5.5.0",
414 | "shebang-command": "^1.2.0",
415 | "which": "^1.2.9"
416 | }
417 | },
418 | "debug": {
419 | "version": "4.1.1",
420 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
421 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
422 | "dev": true,
423 | "requires": {
424 | "ms": "^2.1.1"
425 | }
426 | },
427 | "deep-is": {
428 | "version": "0.1.3",
429 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
430 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
431 | "dev": true
432 | },
433 | "diff": {
434 | "version": "4.0.1",
435 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
436 | "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==",
437 | "dev": true
438 | },
439 | "doctrine": {
440 | "version": "3.0.0",
441 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
442 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
443 | "dev": true,
444 | "requires": {
445 | "esutils": "^2.0.2"
446 | }
447 | },
448 | "emoji-regex": {
449 | "version": "7.0.3",
450 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
451 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
452 | "dev": true
453 | },
454 | "escape-string-regexp": {
455 | "version": "1.0.5",
456 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
457 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
458 | "dev": true
459 | },
460 | "eslint": {
461 | "version": "5.16.0",
462 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz",
463 | "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==",
464 | "dev": true,
465 | "requires": {
466 | "@babel/code-frame": "^7.0.0",
467 | "ajv": "^6.9.1",
468 | "chalk": "^2.1.0",
469 | "cross-spawn": "^6.0.5",
470 | "debug": "^4.0.1",
471 | "doctrine": "^3.0.0",
472 | "eslint-scope": "^4.0.3",
473 | "eslint-utils": "^1.3.1",
474 | "eslint-visitor-keys": "^1.0.0",
475 | "espree": "^5.0.1",
476 | "esquery": "^1.0.1",
477 | "esutils": "^2.0.2",
478 | "file-entry-cache": "^5.0.1",
479 | "functional-red-black-tree": "^1.0.1",
480 | "glob": "^7.1.2",
481 | "globals": "^11.7.0",
482 | "ignore": "^4.0.6",
483 | "import-fresh": "^3.0.0",
484 | "imurmurhash": "^0.1.4",
485 | "inquirer": "^6.2.2",
486 | "js-yaml": "^3.13.0",
487 | "json-stable-stringify-without-jsonify": "^1.0.1",
488 | "levn": "^0.3.0",
489 | "lodash": "^4.17.11",
490 | "minimatch": "^3.0.4",
491 | "mkdirp": "^0.5.1",
492 | "natural-compare": "^1.4.0",
493 | "optionator": "^0.8.2",
494 | "path-is-inside": "^1.0.2",
495 | "progress": "^2.0.0",
496 | "regexpp": "^2.0.1",
497 | "semver": "^5.5.1",
498 | "strip-ansi": "^4.0.0",
499 | "strip-json-comments": "^2.0.1",
500 | "table": "^5.2.3",
501 | "text-table": "^0.2.0"
502 | },
503 | "dependencies": {
504 | "chalk": {
505 | "version": "2.4.2",
506 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
507 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
508 | "dev": true,
509 | "requires": {
510 | "ansi-styles": "^3.2.1",
511 | "escape-string-regexp": "^1.0.5",
512 | "supports-color": "^5.3.0"
513 | }
514 | },
515 | "has-flag": {
516 | "version": "3.0.0",
517 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
518 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
519 | "dev": true
520 | },
521 | "supports-color": {
522 | "version": "5.5.0",
523 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
524 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
525 | "dev": true,
526 | "requires": {
527 | "has-flag": "^3.0.0"
528 | }
529 | }
530 | }
531 | },
532 | "eslint-config-prettier": {
533 | "version": "4.2.0",
534 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-4.2.0.tgz",
535 | "integrity": "sha512-y0uWc/FRfrHhpPZCYflWC8aE0KRJRY04rdZVfl8cL3sEZmOYyaBdhdlQPjKZBnuRMyLVK+JUZr7HaZFClQiH4w==",
536 | "dev": true,
537 | "requires": {
538 | "get-stdin": "^6.0.0"
539 | }
540 | },
541 | "eslint-plugin-prettier": {
542 | "version": "3.0.1",
543 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.1.tgz",
544 | "integrity": "sha512-/PMttrarPAY78PLvV3xfWibMOdMDl57hmlQ2XqFeA37wd+CJ7WSxV7txqjVPHi/AAFKd2lX0ZqfsOc/i5yFCSQ==",
545 | "dev": true,
546 | "requires": {
547 | "prettier-linter-helpers": "^1.0.0"
548 | }
549 | },
550 | "eslint-scope": {
551 | "version": "4.0.3",
552 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
553 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
554 | "dev": true,
555 | "requires": {
556 | "esrecurse": "^4.1.0",
557 | "estraverse": "^4.1.1"
558 | }
559 | },
560 | "eslint-utils": {
561 | "version": "1.4.3",
562 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
563 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
564 | "dev": true,
565 | "requires": {
566 | "eslint-visitor-keys": "^1.1.0"
567 | },
568 | "dependencies": {
569 | "eslint-visitor-keys": {
570 | "version": "1.1.0",
571 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
572 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
573 | "dev": true
574 | }
575 | }
576 | },
577 | "eslint-visitor-keys": {
578 | "version": "1.0.0",
579 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
580 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
581 | "dev": true
582 | },
583 | "espree": {
584 | "version": "5.0.1",
585 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz",
586 | "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==",
587 | "dev": true,
588 | "requires": {
589 | "acorn": "^6.0.7",
590 | "acorn-jsx": "^5.0.0",
591 | "eslint-visitor-keys": "^1.0.0"
592 | }
593 | },
594 | "esprima": {
595 | "version": "4.0.1",
596 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
597 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
598 | "dev": true
599 | },
600 | "esquery": {
601 | "version": "1.0.1",
602 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
603 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
604 | "dev": true,
605 | "requires": {
606 | "estraverse": "^4.0.0"
607 | }
608 | },
609 | "esrecurse": {
610 | "version": "4.2.1",
611 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
612 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
613 | "dev": true,
614 | "requires": {
615 | "estraverse": "^4.1.0"
616 | }
617 | },
618 | "estraverse": {
619 | "version": "4.2.0",
620 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
621 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
622 | "dev": true
623 | },
624 | "esutils": {
625 | "version": "2.0.2",
626 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
627 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
628 | "dev": true
629 | },
630 | "exit-on-epipe": {
631 | "version": "1.0.1",
632 | "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
633 | "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
634 | },
635 | "external-editor": {
636 | "version": "3.0.3",
637 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
638 | "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
639 | "dev": true,
640 | "requires": {
641 | "chardet": "^0.7.0",
642 | "iconv-lite": "^0.4.24",
643 | "tmp": "^0.0.33"
644 | }
645 | },
646 | "fast-deep-equal": {
647 | "version": "2.0.1",
648 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
649 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
650 | "dev": true
651 | },
652 | "fast-diff": {
653 | "version": "1.2.0",
654 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
655 | "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
656 | "dev": true
657 | },
658 | "fast-json-stable-stringify": {
659 | "version": "2.0.0",
660 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
661 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
662 | "dev": true
663 | },
664 | "fast-levenshtein": {
665 | "version": "2.0.6",
666 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
667 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
668 | "dev": true
669 | },
670 | "figures": {
671 | "version": "2.0.0",
672 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
673 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
674 | "dev": true,
675 | "requires": {
676 | "escape-string-regexp": "^1.0.5"
677 | }
678 | },
679 | "file-entry-cache": {
680 | "version": "5.0.1",
681 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
682 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
683 | "dev": true,
684 | "requires": {
685 | "flat-cache": "^2.0.1"
686 | }
687 | },
688 | "flat-cache": {
689 | "version": "2.0.1",
690 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
691 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
692 | "dev": true,
693 | "requires": {
694 | "flatted": "^2.0.0",
695 | "rimraf": "2.6.3",
696 | "write": "1.0.3"
697 | }
698 | },
699 | "flatted": {
700 | "version": "2.0.0",
701 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz",
702 | "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==",
703 | "dev": true
704 | },
705 | "frac": {
706 | "version": "1.1.2",
707 | "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
708 | "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
709 | },
710 | "fs.realpath": {
711 | "version": "1.0.0",
712 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
713 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
714 | "dev": true
715 | },
716 | "functional-red-black-tree": {
717 | "version": "1.0.1",
718 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
719 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
720 | "dev": true
721 | },
722 | "get-stdin": {
723 | "version": "6.0.0",
724 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
725 | "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
726 | "dev": true
727 | },
728 | "glob": {
729 | "version": "7.1.4",
730 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
731 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
732 | "dev": true,
733 | "requires": {
734 | "fs.realpath": "^1.0.0",
735 | "inflight": "^1.0.4",
736 | "inherits": "2",
737 | "minimatch": "^3.0.4",
738 | "once": "^1.3.0",
739 | "path-is-absolute": "^1.0.0"
740 | }
741 | },
742 | "globals": {
743 | "version": "11.12.0",
744 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
745 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
746 | "dev": true
747 | },
748 | "has-flag": {
749 | "version": "4.0.0",
750 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
751 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
752 | "dev": true
753 | },
754 | "iconv-lite": {
755 | "version": "0.4.24",
756 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
757 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
758 | "dev": true,
759 | "requires": {
760 | "safer-buffer": ">= 2.1.2 < 3"
761 | }
762 | },
763 | "ignore": {
764 | "version": "4.0.6",
765 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
766 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
767 | "dev": true
768 | },
769 | "import-fresh": {
770 | "version": "3.0.0",
771 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz",
772 | "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==",
773 | "dev": true,
774 | "requires": {
775 | "parent-module": "^1.0.0",
776 | "resolve-from": "^4.0.0"
777 | }
778 | },
779 | "imurmurhash": {
780 | "version": "0.1.4",
781 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
782 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
783 | "dev": true
784 | },
785 | "inflight": {
786 | "version": "1.0.6",
787 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
788 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
789 | "dev": true,
790 | "requires": {
791 | "once": "^1.3.0",
792 | "wrappy": "1"
793 | }
794 | },
795 | "inherits": {
796 | "version": "2.0.3",
797 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
798 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
799 | "dev": true
800 | },
801 | "inquirer": {
802 | "version": "6.3.1",
803 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz",
804 | "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==",
805 | "dev": true,
806 | "requires": {
807 | "ansi-escapes": "^3.2.0",
808 | "chalk": "^2.4.2",
809 | "cli-cursor": "^2.1.0",
810 | "cli-width": "^2.0.0",
811 | "external-editor": "^3.0.3",
812 | "figures": "^2.0.0",
813 | "lodash": "^4.17.11",
814 | "mute-stream": "0.0.7",
815 | "run-async": "^2.2.0",
816 | "rxjs": "^6.4.0",
817 | "string-width": "^2.1.0",
818 | "strip-ansi": "^5.1.0",
819 | "through": "^2.3.6"
820 | },
821 | "dependencies": {
822 | "ansi-regex": {
823 | "version": "4.1.0",
824 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
825 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
826 | "dev": true
827 | },
828 | "chalk": {
829 | "version": "2.4.2",
830 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
831 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
832 | "dev": true,
833 | "requires": {
834 | "ansi-styles": "^3.2.1",
835 | "escape-string-regexp": "^1.0.5",
836 | "supports-color": "^5.3.0"
837 | }
838 | },
839 | "has-flag": {
840 | "version": "3.0.0",
841 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
842 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
843 | "dev": true
844 | },
845 | "strip-ansi": {
846 | "version": "5.2.0",
847 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
848 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
849 | "dev": true,
850 | "requires": {
851 | "ansi-regex": "^4.1.0"
852 | }
853 | },
854 | "supports-color": {
855 | "version": "5.5.0",
856 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
857 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
858 | "dev": true,
859 | "requires": {
860 | "has-flag": "^3.0.0"
861 | }
862 | }
863 | }
864 | },
865 | "interpret": {
866 | "version": "1.2.0",
867 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
868 | "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
869 | "dev": true
870 | },
871 | "is-fullwidth-code-point": {
872 | "version": "2.0.0",
873 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
874 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
875 | "dev": true
876 | },
877 | "is-promise": {
878 | "version": "2.1.0",
879 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
880 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
881 | "dev": true
882 | },
883 | "isexe": {
884 | "version": "2.0.0",
885 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
886 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
887 | "dev": true
888 | },
889 | "js-tokens": {
890 | "version": "4.0.0",
891 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
892 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
893 | "dev": true
894 | },
895 | "js-yaml": {
896 | "version": "3.13.1",
897 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
898 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
899 | "dev": true,
900 | "requires": {
901 | "argparse": "^1.0.7",
902 | "esprima": "^4.0.0"
903 | }
904 | },
905 | "json-schema-traverse": {
906 | "version": "0.4.1",
907 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
908 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
909 | "dev": true
910 | },
911 | "json-stable-stringify-without-jsonify": {
912 | "version": "1.0.1",
913 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
914 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
915 | "dev": true
916 | },
917 | "levn": {
918 | "version": "0.3.0",
919 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
920 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
921 | "dev": true,
922 | "requires": {
923 | "prelude-ls": "~1.1.2",
924 | "type-check": "~0.3.2"
925 | }
926 | },
927 | "lodash": {
928 | "version": "4.17.15",
929 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
930 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
931 | },
932 | "lodash.unescape": {
933 | "version": "4.0.1",
934 | "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz",
935 | "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=",
936 | "dev": true
937 | },
938 | "make-error": {
939 | "version": "1.3.5",
940 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz",
941 | "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==",
942 | "dev": true
943 | },
944 | "mimic-fn": {
945 | "version": "1.2.0",
946 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
947 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
948 | "dev": true
949 | },
950 | "minimatch": {
951 | "version": "3.0.4",
952 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
953 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
954 | "dev": true,
955 | "requires": {
956 | "brace-expansion": "^1.1.7"
957 | }
958 | },
959 | "minimist": {
960 | "version": "0.0.8",
961 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
962 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
963 | "dev": true
964 | },
965 | "mkdirp": {
966 | "version": "0.5.1",
967 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
968 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
969 | "dev": true,
970 | "requires": {
971 | "minimist": "0.0.8"
972 | }
973 | },
974 | "ms": {
975 | "version": "2.1.1",
976 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
977 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
978 | "dev": true
979 | },
980 | "mute-stream": {
981 | "version": "0.0.7",
982 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
983 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
984 | "dev": true
985 | },
986 | "natural-compare": {
987 | "version": "1.4.0",
988 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
989 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
990 | "dev": true
991 | },
992 | "nice-try": {
993 | "version": "1.0.5",
994 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
995 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
996 | "dev": true
997 | },
998 | "node-xlsx": {
999 | "version": "0.12.1",
1000 | "resolved": "https://registry.npmjs.org/node-xlsx/-/node-xlsx-0.12.1.tgz",
1001 | "integrity": "sha512-PMIv0Gs05zb+7ZUQIMA5Fw8eFHxT8fVieKUKMUXI5EBuCsZ56bYKeaMaBf7pBAH3cw8Xa+dGK/xaLWZaEuyfiw==",
1002 | "requires": {
1003 | "buffer-from": "^1.1.0",
1004 | "xlsx": "^0.12.4"
1005 | }
1006 | },
1007 | "once": {
1008 | "version": "1.4.0",
1009 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1010 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1011 | "dev": true,
1012 | "requires": {
1013 | "wrappy": "1"
1014 | }
1015 | },
1016 | "onetime": {
1017 | "version": "2.0.1",
1018 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
1019 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
1020 | "dev": true,
1021 | "requires": {
1022 | "mimic-fn": "^1.0.0"
1023 | }
1024 | },
1025 | "optionator": {
1026 | "version": "0.8.2",
1027 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
1028 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
1029 | "dev": true,
1030 | "requires": {
1031 | "deep-is": "~0.1.3",
1032 | "fast-levenshtein": "~2.0.4",
1033 | "levn": "~0.3.0",
1034 | "prelude-ls": "~1.1.2",
1035 | "type-check": "~0.3.2",
1036 | "wordwrap": "~1.0.0"
1037 | }
1038 | },
1039 | "os-tmpdir": {
1040 | "version": "1.0.2",
1041 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1042 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
1043 | "dev": true
1044 | },
1045 | "parent-module": {
1046 | "version": "1.0.1",
1047 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
1048 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
1049 | "dev": true,
1050 | "requires": {
1051 | "callsites": "^3.0.0"
1052 | }
1053 | },
1054 | "path-is-absolute": {
1055 | "version": "1.0.1",
1056 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1057 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1058 | "dev": true
1059 | },
1060 | "path-is-inside": {
1061 | "version": "1.0.2",
1062 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
1063 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
1064 | "dev": true
1065 | },
1066 | "path-key": {
1067 | "version": "2.0.1",
1068 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
1069 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
1070 | "dev": true
1071 | },
1072 | "path-parse": {
1073 | "version": "1.0.6",
1074 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1075 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
1076 | "dev": true
1077 | },
1078 | "prelude-ls": {
1079 | "version": "1.1.2",
1080 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
1081 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
1082 | "dev": true
1083 | },
1084 | "prettier": {
1085 | "version": "1.19.1",
1086 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
1087 | "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
1088 | "dev": true
1089 | },
1090 | "prettier-linter-helpers": {
1091 | "version": "1.0.0",
1092 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
1093 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
1094 | "dev": true,
1095 | "requires": {
1096 | "fast-diff": "^1.1.2"
1097 | }
1098 | },
1099 | "printj": {
1100 | "version": "1.1.2",
1101 | "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
1102 | "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
1103 | },
1104 | "progress": {
1105 | "version": "2.0.3",
1106 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
1107 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
1108 | "dev": true
1109 | },
1110 | "punycode": {
1111 | "version": "2.1.1",
1112 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1113 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
1114 | "dev": true
1115 | },
1116 | "rechoir": {
1117 | "version": "0.6.2",
1118 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
1119 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
1120 | "dev": true,
1121 | "requires": {
1122 | "resolve": "^1.1.6"
1123 | }
1124 | },
1125 | "regexpp": {
1126 | "version": "2.0.1",
1127 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
1128 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
1129 | "dev": true
1130 | },
1131 | "requireindex": {
1132 | "version": "1.2.0",
1133 | "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
1134 | "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
1135 | "dev": true
1136 | },
1137 | "resolve": {
1138 | "version": "1.14.2",
1139 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz",
1140 | "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==",
1141 | "dev": true,
1142 | "requires": {
1143 | "path-parse": "^1.0.6"
1144 | }
1145 | },
1146 | "resolve-from": {
1147 | "version": "4.0.0",
1148 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
1149 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
1150 | "dev": true
1151 | },
1152 | "restore-cursor": {
1153 | "version": "2.0.0",
1154 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
1155 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
1156 | "dev": true,
1157 | "requires": {
1158 | "onetime": "^2.0.0",
1159 | "signal-exit": "^3.0.2"
1160 | }
1161 | },
1162 | "rimraf": {
1163 | "version": "2.6.3",
1164 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
1165 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
1166 | "dev": true,
1167 | "requires": {
1168 | "glob": "^7.1.3"
1169 | }
1170 | },
1171 | "run-async": {
1172 | "version": "2.3.0",
1173 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
1174 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
1175 | "dev": true,
1176 | "requires": {
1177 | "is-promise": "^2.1.0"
1178 | }
1179 | },
1180 | "rxjs": {
1181 | "version": "6.5.2",
1182 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
1183 | "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
1184 | "dev": true,
1185 | "requires": {
1186 | "tslib": "^1.9.0"
1187 | }
1188 | },
1189 | "safer-buffer": {
1190 | "version": "2.1.2",
1191 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1192 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1193 | "dev": true
1194 | },
1195 | "semver": {
1196 | "version": "5.7.0",
1197 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
1198 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
1199 | "dev": true
1200 | },
1201 | "shebang-command": {
1202 | "version": "1.2.0",
1203 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
1204 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
1205 | "dev": true,
1206 | "requires": {
1207 | "shebang-regex": "^1.0.0"
1208 | }
1209 | },
1210 | "shebang-regex": {
1211 | "version": "1.0.0",
1212 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
1213 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
1214 | "dev": true
1215 | },
1216 | "shelljs": {
1217 | "version": "0.8.3",
1218 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz",
1219 | "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==",
1220 | "dev": true,
1221 | "requires": {
1222 | "glob": "^7.0.0",
1223 | "interpret": "^1.0.0",
1224 | "rechoir": "^0.6.2"
1225 | }
1226 | },
1227 | "signal-exit": {
1228 | "version": "3.0.2",
1229 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1230 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
1231 | "dev": true
1232 | },
1233 | "slice-ansi": {
1234 | "version": "2.1.0",
1235 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
1236 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
1237 | "dev": true,
1238 | "requires": {
1239 | "ansi-styles": "^3.2.0",
1240 | "astral-regex": "^1.0.0",
1241 | "is-fullwidth-code-point": "^2.0.0"
1242 | }
1243 | },
1244 | "source-map": {
1245 | "version": "0.6.1",
1246 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1247 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1248 | "dev": true
1249 | },
1250 | "source-map-support": {
1251 | "version": "0.5.13",
1252 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
1253 | "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
1254 | "dev": true,
1255 | "requires": {
1256 | "buffer-from": "^1.0.0",
1257 | "source-map": "^0.6.0"
1258 | }
1259 | },
1260 | "sprintf-js": {
1261 | "version": "1.0.3",
1262 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1263 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
1264 | "dev": true
1265 | },
1266 | "ssf": {
1267 | "version": "0.10.2",
1268 | "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.10.2.tgz",
1269 | "integrity": "sha512-rDhAPm9WyIsY8eZEKyE8Qsotb3j/wBdvMWBUsOhJdfhKGLfQidRjiBUV0y/MkyCLiXQ38FG6LWW/VYUtqlIDZQ==",
1270 | "requires": {
1271 | "frac": "~1.1.2"
1272 | }
1273 | },
1274 | "string-width": {
1275 | "version": "2.1.1",
1276 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
1277 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
1278 | "dev": true,
1279 | "requires": {
1280 | "is-fullwidth-code-point": "^2.0.0",
1281 | "strip-ansi": "^4.0.0"
1282 | }
1283 | },
1284 | "strip-ansi": {
1285 | "version": "4.0.0",
1286 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
1287 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
1288 | "dev": true,
1289 | "requires": {
1290 | "ansi-regex": "^3.0.0"
1291 | }
1292 | },
1293 | "strip-json-comments": {
1294 | "version": "2.0.1",
1295 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1296 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1297 | "dev": true
1298 | },
1299 | "supports-color": {
1300 | "version": "7.1.0",
1301 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
1302 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
1303 | "dev": true,
1304 | "requires": {
1305 | "has-flag": "^4.0.0"
1306 | }
1307 | },
1308 | "table": {
1309 | "version": "5.3.3",
1310 | "resolved": "https://registry.npmjs.org/table/-/table-5.3.3.tgz",
1311 | "integrity": "sha512-3wUNCgdWX6PNpOe3amTTPWPuF6VGvgzjKCaO1snFj0z7Y3mUPWf5+zDtxUVGispJkDECPmR29wbzh6bVMOHbcw==",
1312 | "dev": true,
1313 | "requires": {
1314 | "ajv": "^6.9.1",
1315 | "lodash": "^4.17.11",
1316 | "slice-ansi": "^2.1.0",
1317 | "string-width": "^3.0.0"
1318 | },
1319 | "dependencies": {
1320 | "ansi-regex": {
1321 | "version": "4.1.0",
1322 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
1323 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
1324 | "dev": true
1325 | },
1326 | "string-width": {
1327 | "version": "3.1.0",
1328 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
1329 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
1330 | "dev": true,
1331 | "requires": {
1332 | "emoji-regex": "^7.0.1",
1333 | "is-fullwidth-code-point": "^2.0.0",
1334 | "strip-ansi": "^5.1.0"
1335 | }
1336 | },
1337 | "strip-ansi": {
1338 | "version": "5.2.0",
1339 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1340 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1341 | "dev": true,
1342 | "requires": {
1343 | "ansi-regex": "^4.1.0"
1344 | }
1345 | }
1346 | }
1347 | },
1348 | "text-table": {
1349 | "version": "0.2.0",
1350 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
1351 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
1352 | "dev": true
1353 | },
1354 | "through": {
1355 | "version": "2.3.8",
1356 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
1357 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
1358 | "dev": true
1359 | },
1360 | "tmp": {
1361 | "version": "0.0.33",
1362 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
1363 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
1364 | "dev": true,
1365 | "requires": {
1366 | "os-tmpdir": "~1.0.2"
1367 | }
1368 | },
1369 | "ts-node": {
1370 | "version": "8.3.0",
1371 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz",
1372 | "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==",
1373 | "dev": true,
1374 | "requires": {
1375 | "arg": "^4.1.0",
1376 | "diff": "^4.0.1",
1377 | "make-error": "^1.1.1",
1378 | "source-map-support": "^0.5.6",
1379 | "yn": "^3.0.0"
1380 | }
1381 | },
1382 | "tslib": {
1383 | "version": "1.9.3",
1384 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
1385 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
1386 | "dev": true
1387 | },
1388 | "tsutils": {
1389 | "version": "3.10.0",
1390 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.10.0.tgz",
1391 | "integrity": "sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q==",
1392 | "dev": true,
1393 | "requires": {
1394 | "tslib": "^1.8.1"
1395 | }
1396 | },
1397 | "type-check": {
1398 | "version": "0.3.2",
1399 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
1400 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
1401 | "dev": true,
1402 | "requires": {
1403 | "prelude-ls": "~1.1.2"
1404 | }
1405 | },
1406 | "typescript": {
1407 | "version": "3.7.4",
1408 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.4.tgz",
1409 | "integrity": "sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==",
1410 | "dev": true
1411 | },
1412 | "uri-js": {
1413 | "version": "4.2.2",
1414 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
1415 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
1416 | "dev": true,
1417 | "requires": {
1418 | "punycode": "^2.1.0"
1419 | }
1420 | },
1421 | "which": {
1422 | "version": "1.3.1",
1423 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1424 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1425 | "dev": true,
1426 | "requires": {
1427 | "isexe": "^2.0.0"
1428 | }
1429 | },
1430 | "wordwrap": {
1431 | "version": "1.0.0",
1432 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
1433 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
1434 | "dev": true
1435 | },
1436 | "wrappy": {
1437 | "version": "1.0.2",
1438 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1439 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1440 | "dev": true
1441 | },
1442 | "write": {
1443 | "version": "1.0.3",
1444 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
1445 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
1446 | "dev": true,
1447 | "requires": {
1448 | "mkdirp": "^0.5.1"
1449 | }
1450 | },
1451 | "xlsx": {
1452 | "version": "0.12.13",
1453 | "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.12.13.tgz",
1454 | "integrity": "sha512-9/2H4PLphmG8sDvI3mfWb6JIFqbvK8IRGhgS55Pw5F+fmKPuzdv4OW9RFjrH5PiTKeqB/883Z8o+jW3JrDahmw==",
1455 | "requires": {
1456 | "adler-32": "~1.2.0",
1457 | "cfb": "~1.0.7",
1458 | "codepage": "~1.13.0",
1459 | "commander": "~2.15.1",
1460 | "crc-32": "~1.2.0",
1461 | "exit-on-epipe": "~1.0.1",
1462 | "ssf": "~0.10.2"
1463 | }
1464 | },
1465 | "yn": {
1466 | "version": "3.1.1",
1467 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
1468 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
1469 | "dev": true
1470 | }
1471 | }
1472 | }
1473 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "excel-code-generator",
3 | "version": "2.0.3",
4 | "description": "一个能够读取 excel 文件的指定单元格并生成指定代码到文件中的工具",
5 | "main": "dist/main.js",
6 | "types": "./index.d.ts",
7 | "scripts": {
8 | "release": "sh script/release.sh",
9 | "example": "node example/index.js",
10 | "build": "rm -rf ./dist && tsc",
11 | "lint": "eslint src --ext .ts --fix",
12 | "debugger": "node --inspect-brk --require ts-node/register src/main.ts"
13 | },
14 | "repository": {
15 | "type": "git",
16 | "url": "git+https://github.com/yeyan1996/excel-code-generator.git"
17 | },
18 | "keywords": [
19 | "excel",
20 | "node"
21 | ],
22 | "author": "yeyan1996",
23 | "license": "MIT",
24 | "bugs": {
25 | "url": "https://github.com/yeyan1996/excel-code-generator/issues"
26 | },
27 | "homepage": "https://github.com/yeyan1996/excel-code-generator#readme",
28 | "devDependencies": {
29 | "@types/chalk": "^2.2.0",
30 | "@types/lodash": "^4.14.126",
31 | "@types/node": "^12.0.2",
32 | "@types/node-xlsx": "^0.12.1",
33 | "@types/prettier": "^1.19.0",
34 | "@types/shelljs": "^0.8.6",
35 | "@typescript-eslint/eslint-plugin": "^1.8.0",
36 | "@typescript-eslint/parser": "^1.8.0",
37 | "chalk": "^3.0.0",
38 | "eslint": "^5.16.0",
39 | "eslint-config-prettier": "^4.2.0",
40 | "eslint-plugin-prettier": "^3.0.1",
41 | "prettier": "^1.19.1",
42 | "shelljs": "^0.8.3",
43 | "ts-node": "^8.3.0",
44 | "typescript": "^3.7.4"
45 | },
46 | "dependencies": {
47 | "camelcase": "^5.3.1",
48 | "lodash": "^4.17.15",
49 | "node-xlsx": "^0.12.1"
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/script/release.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | set -e
4 | echo "Enter release version: "
5 | read VERSION
6 | echo "Enter git comment: "
7 | read COMMENT
8 | read -p "Releasing $VERSION - are you sure? (y/n)" -n 1 -r
9 | echo # (optional) move to a new line
10 | if [[ $REPLY =~ ^[Yy]$ ]]
11 | then
12 | echo "Releasing $VERSION ..."
13 |
14 | # build
15 | npm run build
16 |
17 | # commit
18 | git add -A
19 | git commit -m "$COMMENT"
20 | npm version ${VERSION} --message "[release] $VERSION"
21 |
22 |
23 | # publish
24 | git push
25 | npm publish
26 | fi
27 |
--------------------------------------------------------------------------------
/src/compiler/index.ts:
--------------------------------------------------------------------------------
1 | import { generateCodeByOption } from "../generateCodeByOption";
2 | import { Option } from "../interface";
3 |
4 | export const excel = (
5 | strs: TemplateStringsArray,
6 | ...options: Option[]
7 | ): string => {
8 | let res = "";
9 | let maxNumber = 0;
10 |
11 | const selectedExcelData = options.map((option: Option) => {
12 | const number = 1 + option.line[2] - option.line[1];
13 | maxNumber = Math.max(number, maxNumber);
14 | return generateCodeByOption(option);
15 | });
16 |
17 | const codeFunc = (rowIndex: number) =>
18 | strs.map(
19 | (str, columnIndex) =>
20 | str + (selectedExcelData[columnIndex]?.[rowIndex] || "")
21 | );
22 | for (let rowIndex = 0; rowIndex < maxNumber; rowIndex++) {
23 | res += codeFunc(rowIndex).join("");
24 | }
25 | return res;
26 | };
27 |
--------------------------------------------------------------------------------
/src/generateCodeByOption.ts:
--------------------------------------------------------------------------------
1 | import { Option } from "./interface";
2 | import { getExcelData } from "./getExcelData";
3 | import { sliceByColumn } from "./sliceByColumn";
4 |
5 | export function generateCodeByOption(option: Option): string[] {
6 | const excelPath = option.source;
7 | const sheet = option.sheet || 1;
8 | const data = getExcelData(excelPath, sheet);
9 | return sliceByColumn(data, option);
10 | }
11 |
--------------------------------------------------------------------------------
/src/getExcelData.ts:
--------------------------------------------------------------------------------
1 | import fs from "fs";
2 | import xlsx from "node-xlsx";
3 | import { pipe } from "lodash/fp";
4 | import { warn } from "./warn";
5 |
6 | export const getExcelData = (path: string, sheet: number): string[][] => {
7 | const generateBuffer = pipe(fs.readFileSync, xlsx.parse);
8 | const workSheetsFromBuffer: {
9 | name: string;
10 | data: string[][];
11 | }[] = generateBuffer(path);
12 |
13 | const { data = null } = workSheetsFromBuffer[sheet - 1] || {}; // 第 x 张sheet 中的数据
14 |
15 | if (!data) {
16 | warn("没有找到相应的excel数据");
17 | }
18 | return data!;
19 | };
20 |
--------------------------------------------------------------------------------
/src/interface/index.ts:
--------------------------------------------------------------------------------
1 | export interface Config {
2 | reg?: RegExp;
3 | template: string;
4 | target?: string;
5 | }
6 |
7 | export interface Option {
8 | line: [string, number, number];
9 | source: string;
10 | sheet?: number;
11 | camelcase?: boolean;
12 | }
13 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import fs from "fs";
2 | import chalk from "chalk";
3 | import { warn } from "./warn";
4 | import { Config } from "./interface";
5 | export { excel } from "./compiler";
6 |
7 | function fillCode(initCode: string, reg: RegExp, fillCode: string): string {
8 | if (!initCode.match(reg)) warn("没有匹配到相应字段,请查看reg是否配置正确");
9 |
10 | let matchRes = initCode.match(reg);
11 | if (!matchRes) warn("正则匹配不到任何文件的字段");
12 | let matchStr: string = matchRes![0]; //matchRes匹配到的是标签的前半部分
13 |
14 | //从各个匹配的位置替换原来标签
15 | const openTagStart = initCode.indexOf(matchStr);
16 | const openTagLength = matchStr.length;
17 | const openTagEnd = openTagStart + openTagLength;
18 | return initCode.slice(0, openTagEnd) + fillCode + initCode.slice(openTagEnd);
19 | }
20 |
21 | export const gen = (config: Config) => {
22 | if (!config.reg || !config.target) {
23 | console.log(
24 | chalk.yellow("没有提供 reg/target 属性,显示解析后的 template")
25 | );
26 | console.log(config.template);
27 | } else {
28 | const readData = fs.readFileSync(config.target!, "utf-8");
29 | console.log("read success!");
30 | fs.writeFileSync(
31 | config.target!,
32 | fillCode(readData, config.reg, config.template)
33 | );
34 | console.log("write success!");
35 | }
36 | };
37 |
--------------------------------------------------------------------------------
/src/sliceByColumn.ts:
--------------------------------------------------------------------------------
1 | import { Option } from "./interface";
2 | import { warn } from "./warn";
3 |
4 | const VALID_LINE_NUMBER = 3;
5 | const isPositiveNum = (num: number) => num >= 0;
6 |
7 | export function sliceByColumn(data: string[][], option: Option): string[] {
8 | // 生成 a-z 的数组
9 | const alphabetArr: string[] = Array.from(
10 | new Array(26)
11 | ).map((item, index): string => String.fromCharCode(index + 97));
12 |
13 | if (option.line.length !== VALID_LINE_NUMBER) {
14 | warn("错误的 line 配置项");
15 | }
16 |
17 | const index = alphabetArr.findIndex(
18 | item => item === option.line[0].toLowerCase()
19 | );
20 | const columnData: string[] = data.map(rowArr => rowArr[index]);
21 |
22 | let startPos = Number(option.line[1]) - 1;
23 | let endPos = Number(option.line[2]);
24 |
25 | if (!isPositiveNum(startPos) || !isPositiveNum(endPos)) {
26 | warn("line的参数格式不正确");
27 | }
28 | return columnData.slice(startPos, endPos);
29 | }
30 |
--------------------------------------------------------------------------------
/src/warn.ts:
--------------------------------------------------------------------------------
1 | export function warn(errMessage: string): void {
2 | console.error(errMessage);
3 | process.exit();
4 | }
5 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | /* Basic Options */
4 | "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */,
5 | "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
6 | "lib": [
7 | "es2015"
8 | ] /* Specify library files to be included in the compilation. */,
9 | // "allowJs": true, /* Allow javascript files to be compiled. */
10 | // "checkJs": true, /* Report errors in .js files. */
11 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
12 | // "declaration": true, /* Generates corresponding '.d.ts' file. */
13 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
14 | // "sourceMap": true, /* Generates corresponding '.map' file. */
15 | // "outFile": "./", /* Concatenate and emit output to single file. */
16 | "outDir": "./dist" /* Redirect output structure to the directory. */,
17 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
18 | // "composite": true, /* Enable project compilation */
19 | // "removeComments": true, /* Do not emit comments to output. */
20 | // "noEmit": true, /* Do not emit outputs. */
21 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */
22 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
23 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
24 |
25 | /* Strict Type-Checking Options */
26 | "strict": true /* Enable all strict type-checking options. */,
27 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
28 | // "strictNullChecks": true, /* Enable strict null checks. */
29 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */
30 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
31 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
32 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
33 |
34 | /* Additional Checks */
35 | // "noUnusedLocals": true, /* Report errors on unused locals. */
36 | // "noUnusedParameters": true, /* Report errors on unused parameters. */
37 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
38 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
39 |
40 | /* Module Resolution Options */
41 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
42 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
43 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
44 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
45 | // "typeRoots": [], /* List of folders to include type definitions from. */
46 | // "types": [], /* Type declaration files to be included in compilation. */
47 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
48 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
49 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
50 |
51 | /* Source Map Options */
52 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
53 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
54 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
55 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
56 |
57 | /* Experimental Options */
58 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
59 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
60 | },
61 | "include": ["src"]
62 | }
63 |
--------------------------------------------------------------------------------