datagrok-tools 4.1.13 → 4.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/_deprecated/migrate.js +4 -4
- package/bin/commands/add.js +2 -2
- package/bin/commands/api.js +14 -39
- package/bin/commands/create.js +6 -19
- package/bin/utils/ent-helpers.js +1 -1
- package/bin/utils/utils.js +42 -5
- package/entity-template/view-class.ts +1 -1
- package/package-template/.eslintrc.json +25 -24
- package/package-template/ts.webpack.config.js +1 -0
- package/package-template/webpack.config.js +1 -0
- package/package.json +10 -8
- package/src/test-utils.ts +0 -84
package/README.md
CHANGED
|
@@ -67,7 +67,7 @@ Read more about package development in [Datagrok's documentation](https://datagr
|
|
|
67
67
|
we recommend that you postfix them with 'View' and 'Viewer' respectively.
|
|
68
68
|
Supported languages for scripts are `javascript`, `julia`, `node`, `octave`, `python`, `r`.
|
|
69
69
|
Available function tags: `panel`, `init`.
|
|
70
|
-
- `api` creates wrapper functions for package scripts. The output is stored in `/src/scripts-api.ts
|
|
70
|
+
- `api` creates wrapper functions for package scripts and queries. The output is stored in files `/src/scripts-api.ts` and `/src/queries-api.ts` respectively.
|
|
71
71
|
- `publish` uploads a package to the specified server (pass either a URL or a server alias from the `config.yaml` file).
|
|
72
72
|
```
|
|
73
73
|
cd <package-name>
|
|
@@ -14,7 +14,7 @@ const packDir = path.join(curDir, 'package.json');
|
|
|
14
14
|
const grokDir = path.join(os.homedir(), '.grok');
|
|
15
15
|
const confPath = path.join(grokDir, 'config.yaml');
|
|
16
16
|
const confTemplateDir = path.join(path.dirname(path.dirname(__dirname)), 'config-template.yaml');
|
|
17
|
-
const confTemplate = yaml.
|
|
17
|
+
const confTemplate = yaml.load(fs.readFileSync(confTemplateDir));
|
|
18
18
|
|
|
19
19
|
const grokMap = {
|
|
20
20
|
'datagrok-upload': 'grok publish',
|
|
@@ -34,9 +34,9 @@ function migrate(args) {
|
|
|
34
34
|
|
|
35
35
|
// Create `config.yaml` if it doesn't exist yet
|
|
36
36
|
if (!fs.existsSync(grokDir)) fs.mkdirSync(grokDir);
|
|
37
|
-
if (!fs.existsSync(confPath)) fs.writeFileSync(confPath, yaml.
|
|
37
|
+
if (!fs.existsSync(confPath)) fs.writeFileSync(confPath, yaml.dump(confTemplate));
|
|
38
38
|
|
|
39
|
-
let config = yaml.
|
|
39
|
+
let config = yaml.load(fs.readFileSync(confPath));
|
|
40
40
|
|
|
41
41
|
// Copy keys to the `config.yaml` file
|
|
42
42
|
if (fs.existsSync(keysDir)) {
|
|
@@ -54,7 +54,7 @@ function migrate(args) {
|
|
|
54
54
|
console.log(`Skipping an invalid URL in \`upload.keys.json\`: ${url}`);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
fs.writeFileSync(confPath, yaml.
|
|
57
|
+
fs.writeFileSync(confPath, yaml.dump(config));
|
|
58
58
|
console.log(`Migrated data from local \`upload.keys.json\` to ${confPath}`);
|
|
59
59
|
fs.unlinkSync(keysDir);
|
|
60
60
|
console.log('Successfully deleted the file');
|
package/bin/commands/add.js
CHANGED
|
@@ -271,7 +271,7 @@ function add(args) {
|
|
|
271
271
|
|
|
272
272
|
var view = _fs["default"].readFileSync(_path["default"].join(_path["default"].dirname(_path["default"].dirname(__dirname)), 'entity-template', 'view.js'), 'utf8');
|
|
273
273
|
|
|
274
|
-
contents = insertName(name, "import {#{NAME}} from '
|
|
274
|
+
contents = insertName(name, "import {#{NAME}} from './".concat(utils.camelCaseToKebab(name), "';\n"));
|
|
275
275
|
contents += _fs["default"].readFileSync(packageEntry, 'utf8');
|
|
276
276
|
contents += insertName(name, view);
|
|
277
277
|
|
|
@@ -306,7 +306,7 @@ function add(args) {
|
|
|
306
306
|
|
|
307
307
|
var viewer = _fs["default"].readFileSync(_path["default"].join(_path["default"].dirname(_path["default"].dirname(__dirname)), 'entity-template', 'viewer.js'), 'utf8');
|
|
308
308
|
|
|
309
|
-
contents = insertName(name, "import {#{NAME}} from '
|
|
309
|
+
contents = insertName(name, "import {#{NAME}} from './".concat(utils.camelCaseToKebab(name), "';\n"));
|
|
310
310
|
contents += _fs["default"].readFileSync(packageEntry, 'utf8');
|
|
311
311
|
contents += insertName(name, viewer);
|
|
312
312
|
|
package/bin/commands/api.js
CHANGED
|
@@ -37,6 +37,12 @@ function generateQueryWrappers() {
|
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
var packagePath = _path["default"].join(curDir, 'package.json');
|
|
41
|
+
|
|
42
|
+
var _package = JSON.parse(_fs["default"].readFileSync(packagePath, {
|
|
43
|
+
encoding: 'utf-8'
|
|
44
|
+
}));
|
|
45
|
+
|
|
40
46
|
var files = _ignoreWalk["default"].sync({
|
|
41
47
|
path: './queries',
|
|
42
48
|
ignoreFiles: ['.npmignore', '.gitignore']
|
|
@@ -71,36 +77,7 @@ function generateQueryWrappers() {
|
|
|
71
77
|
var q = _step2.value;
|
|
72
78
|
var name = utils.getScriptName(q, utils.commentMap[utils.queryExtension]);
|
|
73
79
|
if (!name) continue;
|
|
74
|
-
var tb = new utils.TemplateBuilder(utils.queryWrapperTemplate).replace('FUNC_NAME', name).replace('FUNC_NAME_LOWERCASE', name);
|
|
75
|
-
var connection = utils.getParam('connection', q, utils.commentMap[utils.queryExtension]);
|
|
76
|
-
|
|
77
|
-
if (!connection) {
|
|
78
|
-
// Use the name of the first found connection (either a field or file name)
|
|
79
|
-
var connectionsDir = _path["default"].join(curDir, 'connections');
|
|
80
|
-
|
|
81
|
-
if (_fs["default"].existsSync(connectionsDir) && _fs["default"].readdirSync(connectionsDir).length !== 0) {
|
|
82
|
-
var connectionFile = _fs["default"].readdirSync(connectionsDir).find(function (c) {
|
|
83
|
-
return /.+\.json$/.test(c);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
if (!connectionFile) {
|
|
87
|
-
console.log("Connection for query \"".concat(name, "\" not found."));
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
try {
|
|
92
|
-
var paramString = _fs["default"].readFileSync(connectionFile, 'utf8');
|
|
93
|
-
|
|
94
|
-
var params = JSON.parse(paramString);
|
|
95
|
-
connection = params.name || connectionFile.slice(0, -5);
|
|
96
|
-
} catch (error) {
|
|
97
|
-
console.log("Connection for query \"".concat(name, "\" not found."));
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
tb.replace('NAME', connection);
|
|
80
|
+
var tb = new utils.TemplateBuilder(utils.queryWrapperTemplate).replace('FUNC_NAME', name).replace('FUNC_NAME_LOWERCASE', name).replace('PACKAGE_NAMESPACE', _package.name);
|
|
104
81
|
var inputs = utils.getScriptInputs(q, utils.commentMap[utils.queryExtension]);
|
|
105
82
|
var outputType = utils.getScriptOutputType(q, utils.commentMap[utils.queryExtension]);
|
|
106
83
|
tb.replace('PARAMS_OBJECT', inputs).replace('TYPED_PARAMS', inputs) // The query output, if omitted, is a dataframe
|
|
@@ -142,6 +119,12 @@ function generateScriptWrappers() {
|
|
|
142
119
|
return;
|
|
143
120
|
}
|
|
144
121
|
|
|
122
|
+
var packagePath = _path["default"].join(curDir, 'package.json');
|
|
123
|
+
|
|
124
|
+
var _package = JSON.parse(_fs["default"].readFileSync(packagePath, {
|
|
125
|
+
encoding: 'utf-8'
|
|
126
|
+
}));
|
|
127
|
+
|
|
145
128
|
var files = _ignoreWalk["default"].sync({
|
|
146
129
|
path: './scripts',
|
|
147
130
|
ignoreFiles: ['.npmignore', '.gitignore']
|
|
@@ -167,15 +150,7 @@ function generateScriptWrappers() {
|
|
|
167
150
|
if (!script) return "continue";
|
|
168
151
|
var name = utils.getScriptName(script, utils.commentMap[extension]);
|
|
169
152
|
if (!name) return "continue";
|
|
170
|
-
var tb = new utils.TemplateBuilder(utils.scriptWrapperTemplate).replace('FUNC_NAME', name).replace('FUNC_NAME_LOWERCASE', name);
|
|
171
|
-
|
|
172
|
-
var packagePath = _path["default"].join(curDir, 'package.json');
|
|
173
|
-
|
|
174
|
-
var _package = JSON.parse(_fs["default"].readFileSync(packagePath, {
|
|
175
|
-
encoding: 'utf-8'
|
|
176
|
-
}));
|
|
177
|
-
|
|
178
|
-
tb.replace('PACKAGE_NAMESPACE', _package.name);
|
|
153
|
+
var tb = new utils.TemplateBuilder(utils.scriptWrapperTemplate).replace('FUNC_NAME', name).replace('FUNC_NAME_LOWERCASE', name).replace('PACKAGE_NAMESPACE', _package.name);
|
|
179
154
|
var inputs = utils.getScriptInputs(script);
|
|
180
155
|
var outputType = utils.getScriptOutputType(script);
|
|
181
156
|
tb.replace('PARAMS_OBJECT', inputs).replace('TYPED_PARAMS', inputs).replace('OUTPUT_TYPE', outputType);
|
package/bin/commands/create.js
CHANGED
|
@@ -13,8 +13,6 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
|
|
|
13
13
|
|
|
14
14
|
var _fs = _interopRequireDefault(require("fs"));
|
|
15
15
|
|
|
16
|
-
var _inquirer = _interopRequireDefault(require("inquirer"));
|
|
17
|
-
|
|
18
16
|
var _path = _interopRequireDefault(require("path"));
|
|
19
17
|
|
|
20
18
|
var _os = _interopRequireDefault(require("os"));
|
|
@@ -93,7 +91,7 @@ function createDirectoryContents(name, config, templateDir, packageDir) {
|
|
|
93
91
|
_package['scripts']["release-".concat(name.toLowerCase(), "-").concat(server)] = "grok publish ".concat(server, " --rebuild --release");
|
|
94
92
|
}
|
|
95
93
|
|
|
96
|
-
if (ts) Object.assign(_package.
|
|
94
|
+
if (ts) Object.assign(_package.devDependencies, {
|
|
97
95
|
'ts-loader': 'latest',
|
|
98
96
|
'typescript': 'latest'
|
|
99
97
|
});
|
|
@@ -201,22 +199,11 @@ function create(args) {
|
|
|
201
199
|
createDirectoryContents(name, config, templateDir, packageDir, args.ide, args.ts, args.eslint);
|
|
202
200
|
console.log(_entHelpers.help["package"](name, args.ts));
|
|
203
201
|
console.log("\nThe package has the following dependencies:\n".concat(dependencies.join(' '), "\n"));
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
"default": false
|
|
210
|
-
}).then(function (answers) {
|
|
211
|
-
if (!answers['run-npm-install']) return;
|
|
212
|
-
console.log('\nRunning `npm install` to get the required dependencies...\n');
|
|
213
|
-
(0, _child_process.exec)('npm install', {
|
|
214
|
-
cwd: packageDir
|
|
215
|
-
}, function (err, stdout, stderr) {
|
|
216
|
-
if (err) throw err;else console.log(stderr, stdout);
|
|
217
|
-
});
|
|
218
|
-
})["catch"](function (err) {
|
|
219
|
-
return console.error(err);
|
|
202
|
+
console.log('Running `npm install` to get the required dependencies...\n');
|
|
203
|
+
(0, _child_process.exec)('npm install', {
|
|
204
|
+
cwd: packageDir
|
|
205
|
+
}, function (err, stdout, stderr) {
|
|
206
|
+
if (err) throw err;else console.log(stderr, stdout);
|
|
220
207
|
});
|
|
221
208
|
} else {
|
|
222
209
|
console.log('Package name may only include letters, numbers, underscores, or hyphens');
|
package/bin/utils/ent-helpers.js
CHANGED
|
@@ -27,7 +27,7 @@ var query = function query(queryName) {
|
|
|
27
27
|
};
|
|
28
28
|
|
|
29
29
|
var script = function script(scriptName, packageName) {
|
|
30
|
-
return "\nThe script ".concat(scriptName, " has been created. To call it from a JavaScript file, use:\n\n await grok.functions.call('").concat(packageName, ":").concat(scriptName, "', { params });\n \nRead more at https://datagrok.ai/help/
|
|
30
|
+
return "\nThe script ".concat(scriptName, " has been created. To call it from a JavaScript file, use:\n\n await grok.functions.call('").concat(packageName, ":").concat(scriptName, "', { params });\n \nRead more at https://datagrok.ai/help/compute/scripting\nSee examples at https://public.datagrok.ai/scripts,\nhttps://public.datagrok.ai/js/samples/scripting/scripting");
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
var view = function view(viewName) {
|
package/bin/utils/utils.js
CHANGED
|
@@ -9,6 +9,7 @@ exports.TemplateBuilder = void 0;
|
|
|
9
9
|
exports.camelCaseToKebab = camelCaseToKebab;
|
|
10
10
|
exports.checkScriptLocation = checkScriptLocation;
|
|
11
11
|
exports.dgToTsTypeMap = exports.dgImports = exports.commentMap = void 0;
|
|
12
|
+
exports.friendlyNameToName = friendlyNameToName;
|
|
12
13
|
exports.getParam = getParam;
|
|
13
14
|
exports.getScriptInputs = getScriptInputs;
|
|
14
15
|
exports.getScriptName = getScriptName;
|
|
@@ -17,7 +18,9 @@ exports.isEmpty = isEmpty;
|
|
|
17
18
|
exports.isPackageDir = isPackageDir;
|
|
18
19
|
exports.kebabToCamelCase = kebabToCamelCase;
|
|
19
20
|
exports.mapURL = mapURL;
|
|
20
|
-
exports.
|
|
21
|
+
exports.queryWrapperTemplate = exports.queryExtension = void 0;
|
|
22
|
+
exports.removeScope = removeScope;
|
|
23
|
+
exports.scriptWrapperTemplate = exports.scriptLangExtMap = exports.scriptExtensions = exports.replacers = void 0;
|
|
21
24
|
exports.spaceToCamelCase = spaceToCamelCase;
|
|
22
25
|
exports.wordsToCamelCase = wordsToCamelCase;
|
|
23
26
|
|
|
@@ -75,6 +78,11 @@ function camelCaseToKebab(s) {
|
|
|
75
78
|
});
|
|
76
79
|
}
|
|
77
80
|
|
|
81
|
+
function removeScope(name) {
|
|
82
|
+
var split = name.split('/');
|
|
83
|
+
return split[split.length - 1];
|
|
84
|
+
}
|
|
85
|
+
|
|
78
86
|
function mapURL(conf) {
|
|
79
87
|
var urls = {};
|
|
80
88
|
|
|
@@ -85,6 +93,35 @@ function mapURL(conf) {
|
|
|
85
93
|
return urls;
|
|
86
94
|
}
|
|
87
95
|
|
|
96
|
+
function friendlyNameToName(s) {
|
|
97
|
+
var _s;
|
|
98
|
+
|
|
99
|
+
var firstUpper = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
100
|
+
var out = '';
|
|
101
|
+
var cap = true;
|
|
102
|
+
var firstWordUpperCase = false;
|
|
103
|
+
var start = true;
|
|
104
|
+
s = ((_s = s) !== null && _s !== void 0 ? _s : '').trim();
|
|
105
|
+
var letterRegex = /[A-Za-z]/;
|
|
106
|
+
var digitRegex = /\d/;
|
|
107
|
+
|
|
108
|
+
var isUpper = function isUpper(s) {
|
|
109
|
+
return /[A-Z]/.test(s);
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
for (var i = 0; i < s.length; i++) {
|
|
113
|
+
if (!letterRegex.test(s[i]) && !digitRegex.test(s[i])) cap = true;else {
|
|
114
|
+
if (start && digitRegex.test(s[i])) continue;
|
|
115
|
+
firstWordUpperCase = start ? isUpper(s[i]) : firstWordUpperCase && isUpper(s[i]);
|
|
116
|
+
out += !firstUpper && (start || firstWordUpperCase && !cap) ? s[i].toLowerCase() : cap ? s[i].toUpperCase() : s[i];
|
|
117
|
+
cap = false;
|
|
118
|
+
start = false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return out;
|
|
123
|
+
}
|
|
124
|
+
|
|
88
125
|
var replacers = {
|
|
89
126
|
NAME: function NAME(s, name) {
|
|
90
127
|
return s.replace(/#{NAME}/g, name);
|
|
@@ -102,13 +139,13 @@ var replacers = {
|
|
|
102
139
|
return s.replace(/#{PACKAGE_DETECTORS_NAME}/g, kebabToCamelCase(name));
|
|
103
140
|
},
|
|
104
141
|
PACKAGE_NAMESPACE: function PACKAGE_NAMESPACE(s, name) {
|
|
105
|
-
return s.replace(/#{PACKAGE_NAMESPACE}/g, kebabToCamelCase(name));
|
|
142
|
+
return s.replace(/#{PACKAGE_NAMESPACE}/g, kebabToCamelCase(removeScope(name)));
|
|
106
143
|
},
|
|
107
144
|
FUNC_NAME: function FUNC_NAME(s, name) {
|
|
108
|
-
return s.replace(/#{FUNC_NAME}/g,
|
|
145
|
+
return s.replace(/#{FUNC_NAME}/g, friendlyNameToName(name));
|
|
109
146
|
},
|
|
110
147
|
FUNC_NAME_LOWERCASE: function FUNC_NAME_LOWERCASE(s, name) {
|
|
111
|
-
return s.replace(/#{FUNC_NAME_LOWERCASE}/g,
|
|
148
|
+
return s.replace(/#{FUNC_NAME_LOWERCASE}/g, friendlyNameToName(name, false));
|
|
112
149
|
},
|
|
113
150
|
PARAMS_OBJECT: function PARAMS_OBJECT(s, params) {
|
|
114
151
|
return s.replace(/#{PARAMS_OBJECT}/g, params.length ? "{ ".concat(params.map(function (p) {
|
|
@@ -266,5 +303,5 @@ var dgImports = "import * as grok from 'datagrok-api/grok';\nimport * as DG from
|
|
|
266
303
|
exports.dgImports = dgImports;
|
|
267
304
|
var scriptWrapperTemplate = "export async function #{FUNC_NAME_LOWERCASE}(#{TYPED_PARAMS}): Promise<#{OUTPUT_TYPE}> {\n return await grok.functions.call('#{PACKAGE_NAMESPACE}:#{FUNC_NAME}', #{PARAMS_OBJECT});\n}";
|
|
268
305
|
exports.scriptWrapperTemplate = scriptWrapperTemplate;
|
|
269
|
-
var queryWrapperTemplate = "export async function #{FUNC_NAME_LOWERCASE}(#{TYPED_PARAMS}): Promise<#{OUTPUT_TYPE}> {\n return await grok.data.query('#{
|
|
306
|
+
var queryWrapperTemplate = "export async function #{FUNC_NAME_LOWERCASE}(#{TYPED_PARAMS}): Promise<#{OUTPUT_TYPE}> {\n return await grok.data.query('#{PACKAGE_NAMESPACE}:#{FUNC_NAME}', #{PARAMS_OBJECT});\n}";
|
|
270
307
|
exports.queryWrapperTemplate = queryWrapperTemplate;
|
|
@@ -1,25 +1,26 @@
|
|
|
1
|
-
{
|
|
2
|
-
"env": {
|
|
3
|
-
"browser": true,
|
|
4
|
-
"es2021": true
|
|
5
|
-
},
|
|
6
|
-
"extends": [
|
|
7
|
-
"google"
|
|
8
|
-
],
|
|
9
|
-
"parserOptions": {
|
|
10
|
-
"ecmaVersion": 12,
|
|
11
|
-
"sourceType": "module"
|
|
12
|
-
},
|
|
13
|
-
"rules": {
|
|
14
|
-
"indent": [
|
|
15
|
-
"error",
|
|
16
|
-
2
|
|
17
|
-
],
|
|
18
|
-
"max-len": [
|
|
19
|
-
"error",
|
|
20
|
-
120
|
|
21
|
-
],
|
|
22
|
-
"require-jsdoc": "off",
|
|
23
|
-
"spaced-comment": "off"
|
|
24
|
-
|
|
1
|
+
{
|
|
2
|
+
"env": {
|
|
3
|
+
"browser": true,
|
|
4
|
+
"es2021": true
|
|
5
|
+
},
|
|
6
|
+
"extends": [
|
|
7
|
+
"google"
|
|
8
|
+
],
|
|
9
|
+
"parserOptions": {
|
|
10
|
+
"ecmaVersion": 12,
|
|
11
|
+
"sourceType": "module"
|
|
12
|
+
},
|
|
13
|
+
"rules": {
|
|
14
|
+
"indent": [
|
|
15
|
+
"error",
|
|
16
|
+
2
|
|
17
|
+
],
|
|
18
|
+
"max-len": [
|
|
19
|
+
"error",
|
|
20
|
+
120
|
|
21
|
+
],
|
|
22
|
+
"require-jsdoc": "off",
|
|
23
|
+
"spaced-comment": "off",
|
|
24
|
+
"linebreak-style": "off"
|
|
25
|
+
}
|
|
25
26
|
}
|
package/package.json
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "datagrok-tools",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.17",
|
|
4
4
|
"description": "Utility to upload and publish packages to Datagrok",
|
|
5
5
|
"homepage": "https://github.com/datagrok-ai/public/tree/master/tools#readme",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"
|
|
8
|
-
"minimist": "^1.2.5",
|
|
9
|
-
"node-fetch": "^2.6.0",
|
|
10
|
-
"fs": "latest",
|
|
11
|
-
"node-recursive-directory": "^1.2.0",
|
|
12
|
-
"path": "^0.12.7",
|
|
7
|
+
"@babel/runtime": "^7.16.0",
|
|
13
8
|
"archiver": "^4.0.2",
|
|
14
9
|
"archiver-promise": "^1.0.0",
|
|
10
|
+
"fs": "latest",
|
|
15
11
|
"ignore-walk": "^3.0.3",
|
|
12
|
+
"inquirer": "^7.1.0",
|
|
16
13
|
"js-yaml": "^4.1.0",
|
|
17
|
-
"
|
|
14
|
+
"minimist": "^1.2.5",
|
|
15
|
+
"node-fetch": "^2.6.0",
|
|
16
|
+
"node-recursive-directory": "^1.2.0",
|
|
17
|
+
"os": "^0.1.1",
|
|
18
|
+
"path": "^0.12.7"
|
|
18
19
|
},
|
|
19
20
|
"scripts": {
|
|
21
|
+
"link": "npm link",
|
|
20
22
|
"prepublishOnly": "babel bin --extensions .ts -d bin",
|
|
21
23
|
"babel": "babel bin --extensions .ts -d bin"
|
|
22
24
|
},
|
package/src/test-utils.ts
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import * as path from "path";
|
|
2
|
-
import * as os from "os";
|
|
3
|
-
import * as fs from "fs";
|
|
4
|
-
import * as yaml from 'js-yaml';
|
|
5
|
-
import { Config, Indexable } from "../bin/utils/utils";
|
|
6
|
-
const fetch = require('node-fetch');
|
|
7
|
-
|
|
8
|
-
export async function getToken(url: string, key: string) {
|
|
9
|
-
let response = await fetch(`${url}/users/login/dev/${key}`, {method: 'POST'});
|
|
10
|
-
let json = await response.json();
|
|
11
|
-
if (json.isSuccess == true)
|
|
12
|
-
return json.token;
|
|
13
|
-
else
|
|
14
|
-
throw 'Unable to login to server. Check your dev key';
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export async function getWebUrl(url: string, token: string) {
|
|
18
|
-
let response = await fetch(`${url}/admin/plugins/admin/settings`, {headers: {Authorization: token}});
|
|
19
|
-
let json = await response.json();
|
|
20
|
-
return json.settings.webRoot;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const grokDir = path.join(os.homedir(), '.grok');
|
|
24
|
-
const confPath = path.join(grokDir, 'config.yaml');
|
|
25
|
-
|
|
26
|
-
function mapURL(conf: Config): Indexable {
|
|
27
|
-
let urls: Indexable = {};
|
|
28
|
-
for (let server in conf.servers) {
|
|
29
|
-
urls[conf['servers'][server]['url']] = conf['servers'][server];
|
|
30
|
-
}
|
|
31
|
-
return urls;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function getDevKey(hostKey: string): {url: string, key: string} {
|
|
35
|
-
let config = yaml.load(fs.readFileSync(confPath, 'utf8')) as any;
|
|
36
|
-
let host = hostKey == '' ? config.default : hostKey;
|
|
37
|
-
host = host.trim();
|
|
38
|
-
let urls = mapURL(config);
|
|
39
|
-
let key = '';
|
|
40
|
-
let url = '';
|
|
41
|
-
try {
|
|
42
|
-
let url = new URL(host).href;
|
|
43
|
-
if (url.endsWith('/')) url = url.slice(0, -1);
|
|
44
|
-
if (url in urls) key = config['servers'][urls[url]]['key'];
|
|
45
|
-
} catch (error) {
|
|
46
|
-
if (config['servers'][host] == null)
|
|
47
|
-
throw `Unknown server alias. Please add it to ${confPath}`;
|
|
48
|
-
url = config['servers'][host]['url'];
|
|
49
|
-
key = config['servers'][host]['key'];
|
|
50
|
-
}
|
|
51
|
-
return {url, key};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export async function getBrowserPage(puppeteer: any): Promise<{browser: any, page: any}> {
|
|
55
|
-
let url:string = process.env.HOST ?? '';
|
|
56
|
-
let cfg = getDevKey(url);
|
|
57
|
-
url = cfg.url;
|
|
58
|
-
|
|
59
|
-
let key = cfg.key;
|
|
60
|
-
let token = await getToken(url, key);
|
|
61
|
-
url = await getWebUrl(url, token);
|
|
62
|
-
console.log(`Using web root: ${url}`);
|
|
63
|
-
|
|
64
|
-
let browser = await puppeteer.launch({
|
|
65
|
-
args: ['--disable-dev-shm-usage', '--disable-features=site-per-process'],
|
|
66
|
-
ignoreHTTPSErrors: true,
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
let page = await browser.newPage();
|
|
70
|
-
await page.goto(`${url}/oauth/`);
|
|
71
|
-
await page.setCookie({name: 'auth', value: token});
|
|
72
|
-
await page.evaluate((token: any) => {
|
|
73
|
-
window.localStorage.setItem('auth', token);
|
|
74
|
-
}, token);
|
|
75
|
-
await page.goto(url);
|
|
76
|
-
try {
|
|
77
|
-
await page.waitForSelector('.grok-preloader');
|
|
78
|
-
console.log('got preloader');
|
|
79
|
-
await page.waitForFunction(() => document.querySelector('.grok-preloader') == null, {timeout: 100000});
|
|
80
|
-
} catch (error) {
|
|
81
|
-
throw error;
|
|
82
|
-
}
|
|
83
|
-
return {browser, page};
|
|
84
|
-
}
|