@nzz/q-cli 1.10.3 → 2.0.0-beta.13
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 +22 -313
- package/dist/createCustomCodeItem.js +74 -0
- package/dist/enums.js +7 -0
- package/dist/index.js +50 -0
- package/dist/interfaces.js +1 -0
- package/dist/newCustomCode.js +107 -0
- package/dist/updateItem.js +194 -0
- package/dist/utils.js +88 -0
- package/package.json +29 -36
- package/.nvmrc +0 -1
- package/.travis.yml +0 -17
- package/.vscode/launch.json +0 -36
- package/.vscode/settings.json +0 -5
- package/LICENSE +0 -21
- package/bin/commands/bootstrap.js +0 -68
- package/bin/commands/qItem/configStore.js +0 -144
- package/bin/commands/qItem/copyItem/copyItem.js +0 -103
- package/bin/commands/qItem/copyItem/copySchema.json +0 -37
- package/bin/commands/qItem/createCustomCodeItem/createCustomCodeItem.js +0 -81
- package/bin/commands/qItem/createCustomCodeItem/schema.json +0 -41
- package/bin/commands/qItem/helpers.js +0 -102
- package/bin/commands/qItem/itemService.js +0 -310
- package/bin/commands/qItem/resourcesService.js +0 -148
- package/bin/commands/qItem/schemaService.js +0 -65
- package/bin/commands/qItem/updateItem/updateItem.js +0 -64
- package/bin/commands/server.js +0 -80
- package/bin/q.js +0 -213
- package/dev-server/config/default.js +0 -51
- package/dev-server/public/favicon.ico +0 -0
- package/dev-server/public/style.css +0 -64
- package/dev-server/routes/dev-view.js +0 -52
- package/dev-server/routes/file.js +0 -10
- package/dev-server/routes/rendering-info.js +0 -130
- package/dev-server/routes/routes.js +0 -6
- package/dev-server/routes/tool-default.js +0 -108
- package/dev-server/server-plugins.js +0 -1
- package/dev-server/server.js +0 -18
- package/dev-server/views/index.html +0 -184
- package/skeletons/custom-code-skeleton/.nvmrc +0 -1
- package/skeletons/custom-code-skeleton/.vscode/settings.json +0 -5
- package/skeletons/custom-code-skeleton/README.md +0 -26
- package/skeletons/custom-code-skeleton/index.d.ts +0 -3
- package/skeletons/custom-code-skeleton/package-lock.json +0 -7355
- package/skeletons/custom-code-skeleton/package.json +0 -46
- package/skeletons/custom-code-skeleton/q.config.json +0 -60
- package/skeletons/custom-code-skeleton/rollup.config.js +0 -185
- package/skeletons/custom-code-skeleton/src/App.scss +0 -5
- package/skeletons/custom-code-skeleton/src/App.svelte +0 -7
- package/skeletons/custom-code-skeleton/src/enums.ts +0 -0
- package/skeletons/custom-code-skeleton/src/interfaces.ts +0 -0
- package/skeletons/custom-code-skeleton/src/main-prod.ts +0 -4
- package/skeletons/custom-code-skeleton/src/main.scss +0 -1
- package/skeletons/custom-code-skeleton/src/main.ts +0 -18
- package/skeletons/custom-code-skeleton/tsconfig.json +0 -16
- package/skeletons/et-utils-package-skeleton/.nvmrc +0 -1
- package/skeletons/et-utils-package-skeleton/README.md +0 -12
- package/skeletons/et-utils-package-skeleton/jest.config.ts +0 -17
- package/skeletons/et-utils-package-skeleton/package-lock.json +0 -3969
- package/skeletons/et-utils-package-skeleton/package.json +0 -40
- package/skeletons/et-utils-package-skeleton/scripts/package-fixup.sh +0 -13
- package/skeletons/et-utils-package-skeleton/src/Service.ts +0 -8
- package/skeletons/et-utils-package-skeleton/src/index.ts +0 -4
- package/skeletons/et-utils-package-skeleton/test/Service.spec.ts +0 -10
- package/skeletons/et-utils-package-skeleton/test/tsconfig.json +0 -8
- package/skeletons/et-utils-package-skeleton/tsconfig-base.json +0 -10
- package/skeletons/et-utils-package-skeleton/tsconfig-cjs.json +0 -8
- package/skeletons/et-utils-package-skeleton/tsconfig.json +0 -8
- package/skeletons/server-skeleton/.nvmrc +0 -1
- package/skeletons/server-skeleton/Dockerfile +0 -19
- package/skeletons/server-skeleton/auth/routes.js +0 -85
- package/skeletons/server-skeleton/auth/strategyOptions.js +0 -28
- package/skeletons/server-skeleton/config/base.js +0 -45
- package/skeletons/server-skeleton/config/db.js +0 -6
- package/skeletons/server-skeleton/config/editor.js +0 -105
- package/skeletons/server-skeleton/config/rendering-info.js +0 -70
- package/skeletons/server-skeleton/config/screenshot.js +0 -80
- package/skeletons/server-skeleton/config/targets.js +0 -31
- package/skeletons/server-skeleton/config/tools.js +0 -65
- package/skeletons/server-skeleton/files/favicon.png +0 -0
- package/skeletons/server-skeleton/files/system.js +0 -3612
- package/skeletons/server-skeleton/index.js +0 -106
- package/skeletons/server-skeleton/package-lock.json +0 -1825
- package/skeletons/server-skeleton/package.json +0 -29
- package/skeletons/tool-skeleton/.dockerignore +0 -1
- package/skeletons/tool-skeleton/.nvmrc +0 -1
- package/skeletons/tool-skeleton/.travis.yml +0 -26
- package/skeletons/tool-skeleton/.vscode/settings.json +0 -5
- package/skeletons/tool-skeleton/Dockerfile +0 -19
- package/skeletons/tool-skeleton/LICENSE +0 -20
- package/skeletons/tool-skeleton/README.md +0 -104
- package/skeletons/tool-skeleton/index.js +0 -32
- package/skeletons/tool-skeleton/package-lock.json +0 -10108
- package/skeletons/tool-skeleton/package.json +0 -45
- package/skeletons/tool-skeleton/resources/display-options-schema.json +0 -11
- package/skeletons/tool-skeleton/resources/fixtures/data/basic.json +0 -4
- package/skeletons/tool-skeleton/resources/locales/de/translation.json +0 -1
- package/skeletons/tool-skeleton/resources/locales/en/translation.json +0 -1
- package/skeletons/tool-skeleton/resources/locales/fr/translation.json +0 -1
- package/skeletons/tool-skeleton/resources/schema.json +0 -16
- package/skeletons/tool-skeleton/rollup.config.js +0 -75
- package/skeletons/tool-skeleton/routes/fixtures/data.js +0 -15
- package/skeletons/tool-skeleton/routes/health.js +0 -10
- package/skeletons/tool-skeleton/routes/locales.js +0 -21
- package/skeletons/tool-skeleton/routes/rendering-info/web.js +0 -97
- package/skeletons/tool-skeleton/routes/routes.js +0 -8
- package/skeletons/tool-skeleton/routes/schema.js +0 -19
- package/skeletons/tool-skeleton/routes/script.js +0 -17
- package/skeletons/tool-skeleton/routes/stylesheet.js +0 -17
- package/skeletons/tool-skeleton/sass.config.js +0 -66
- package/skeletons/tool-skeleton/scripts_src/default.js +0 -3
- package/skeletons/tool-skeleton/styles_src/_variables.scss +0 -1
- package/skeletons/tool-skeleton/styles_src/main.scss +0 -2
- package/skeletons/tool-skeleton/test/e2e-tests.js +0 -162
- package/skeletons/tool-skeleton/views/dynamic/YourTool.scss +0 -5
- package/skeletons/tool-skeleton/views/dynamic/YourTool.svelte +0 -19
- package/skeletons/tool-skeleton/views/static/App.scss +0 -5
- package/skeletons/tool-skeleton/views/static/App.svelte +0 -21
- package/skeletons/tool-skeleton/views/static/components/Footer.svelte +0 -31
- package/skeletons/tool-skeleton/views/static/components/Header.svelte +0 -7
- package/skeletons/toolv2-skeleton/.husky/pre-commit +0 -6
- package/skeletons/toolv2-skeleton/.nvmrc +0 -1
- package/skeletons/toolv2-skeleton/.prettierrc.cjs +0 -15
- package/skeletons/toolv2-skeleton/.travis.yml +0 -30
- package/skeletons/toolv2-skeleton/.vscode/settings.json +0 -6
- package/skeletons/toolv2-skeleton/Dockerfile +0 -19
- package/skeletons/toolv2-skeleton/LICENSE +0 -21
- package/skeletons/toolv2-skeleton/README.md +0 -99
- package/skeletons/toolv2-skeleton/dev.js +0 -7
- package/skeletons/toolv2-skeleton/index.js +0 -39
- package/skeletons/toolv2-skeleton/jest.config.ts +0 -39
- package/skeletons/toolv2-skeleton/nodemon.json +0 -4
- package/skeletons/toolv2-skeleton/package-lock.json +0 -21382
- package/skeletons/toolv2-skeleton/package.json +0 -80
- package/skeletons/toolv2-skeleton/resources/display-options-schema.json +0 -11
- package/skeletons/toolv2-skeleton/resources/locales/de/translation.json +0 -8
- package/skeletons/toolv2-skeleton/resources/locales/en/translation.json +0 -10
- package/skeletons/toolv2-skeleton/resources/locales/fr/translation.json +0 -10
- package/skeletons/toolv2-skeleton/resources/schema.json +0 -66
- package/skeletons/toolv2-skeleton/rollup.config.js +0 -48
- package/skeletons/toolv2-skeleton/scripts/postinstall.sh +0 -5
- package/skeletons/toolv2-skeleton/src/.eslintrc.cjs +0 -52
- package/skeletons/toolv2-skeleton/src/components/Main.spec.ts +0 -15
- package/skeletons/toolv2-skeleton/src/components/Main.svelte +0 -32
- package/skeletons/toolv2-skeleton/src/enums.ts +0 -11
- package/skeletons/toolv2-skeleton/src/helpers/fixture-generators.ts +0 -38
- package/skeletons/toolv2-skeleton/src/helpers/toolRuntimeConfig.ts +0 -15
- package/skeletons/toolv2-skeleton/src/interfaces.ts +0 -82
- package/skeletons/toolv2-skeleton/src/modules.d.ts +0 -8
- package/skeletons/toolv2-skeleton/src/routes/dynamic-schemas/exampleDynamicSchema.ts +0 -49
- package/skeletons/toolv2-skeleton/src/routes/dynamic-schemas/index.ts +0 -5
- package/skeletons/toolv2-skeleton/src/routes/health.ts +0 -14
- package/skeletons/toolv2-skeleton/src/routes/locales.ts +0 -31
- package/skeletons/toolv2-skeleton/src/routes/notifications/exampleNotification.ts +0 -46
- package/skeletons/toolv2-skeleton/src/routes/option-availability.ts +0 -27
- package/skeletons/toolv2-skeleton/src/routes/rendering-info/web.ts +0 -150
- package/skeletons/toolv2-skeleton/src/routes/routes.ts +0 -21
- package/skeletons/toolv2-skeleton/src/routes/schema.ts +0 -21
- package/skeletons/toolv2-skeleton/src/routes/stylesheet.ts +0 -31
- package/skeletons/toolv2-skeleton/src/styles/main.scss +0 -6
- package/skeletons/toolv2-skeleton/svelte.config.cjs +0 -6
- package/skeletons/toolv2-skeleton/tasks/compileStyleFiles.cjs +0 -101
- package/skeletons/toolv2-skeleton/tests/e2e-tests.spec.ts +0 -158
- package/skeletons/toolv2-skeleton/tests/helpers.ts +0 -21
- package/skeletons/toolv2-skeleton/tsconfig.json +0 -48
- /package/{bin/commands/qItem/updateItem → dist/assets}/updateSchema.json +0 -0
@@ -1,103 +0,0 @@
|
|
1
|
-
const schemaService = require("./../schemaService.js");
|
2
|
-
const configStore = require("./../configStore.js");
|
3
|
-
const itemService = require("./../itemService.js");
|
4
|
-
const fs = require("fs");
|
5
|
-
const path = require("path");
|
6
|
-
const chalk = require("chalk");
|
7
|
-
const errorColor = chalk.red;
|
8
|
-
const successColor = chalk.green;
|
9
|
-
|
10
|
-
module.exports = async function (command) {
|
11
|
-
try {
|
12
|
-
const qConfigPath = path.resolve(command.config);
|
13
|
-
|
14
|
-
if (fs.existsSync(qConfigPath)) {
|
15
|
-
const qConfig = JSON.parse(fs.readFileSync(qConfigPath));
|
16
|
-
const validationResult = schemaService.validateConfig(
|
17
|
-
qConfig,
|
18
|
-
"copyItem"
|
19
|
-
);
|
20
|
-
|
21
|
-
if (validationResult.isValid) {
|
22
|
-
const config = await configStore.setupStore(
|
23
|
-
qConfig,
|
24
|
-
command.environment,
|
25
|
-
command.reset
|
26
|
-
);
|
27
|
-
|
28
|
-
for (const item of itemService.getItems(qConfig, command.environment)) {
|
29
|
-
for (const environment of item.environments) {
|
30
|
-
const qServer = config.get(`${environment.name}.qServer`);
|
31
|
-
const accessToken = config.get(`${environment.name}.accessToken`);
|
32
|
-
const cookie = config.get(`${environment.name}.cookie`);
|
33
|
-
|
34
|
-
const existingItem = await itemService.getItem(
|
35
|
-
qServer,
|
36
|
-
environment,
|
37
|
-
accessToken,
|
38
|
-
cookie
|
39
|
-
);
|
40
|
-
|
41
|
-
delete existingItem.updatedBy;
|
42
|
-
delete existingItem.createdBy;
|
43
|
-
delete existingItem.createdDate;
|
44
|
-
delete existingItem._id;
|
45
|
-
delete existingItem._rev;
|
46
|
-
|
47
|
-
let newItem = await itemService.createItem(
|
48
|
-
existingItem,
|
49
|
-
environment,
|
50
|
-
config
|
51
|
-
);
|
52
|
-
// Save for success message
|
53
|
-
const newItemId = newItem._id;
|
54
|
-
const existingItemId = environment.id;
|
55
|
-
|
56
|
-
const hasOverwrites =
|
57
|
-
item.item &&
|
58
|
-
Object.keys(item.item).length > 0 &&
|
59
|
-
Object.getPrototypeOf(item.item) === Object.prototype;
|
60
|
-
|
61
|
-
if (hasOverwrites) {
|
62
|
-
environment.id = newItemId;
|
63
|
-
|
64
|
-
newItem = await itemService.updateItem(
|
65
|
-
item.item,
|
66
|
-
environment,
|
67
|
-
config,
|
68
|
-
qConfigPath
|
69
|
-
);
|
70
|
-
}
|
71
|
-
|
72
|
-
if (newItem) {
|
73
|
-
console.log(
|
74
|
-
successColor(
|
75
|
-
`Successfully copied item with id ${existingItemId} on ${environment.name} environment. Copied item id ${newItemId}`
|
76
|
-
)
|
77
|
-
);
|
78
|
-
}
|
79
|
-
}
|
80
|
-
}
|
81
|
-
} else {
|
82
|
-
console.error(
|
83
|
-
errorColor(
|
84
|
-
`A problem occured while validating the config file: ${validationResult.errorsText}`
|
85
|
-
)
|
86
|
-
);
|
87
|
-
process.exit(1);
|
88
|
-
}
|
89
|
-
} else {
|
90
|
-
console.error(
|
91
|
-
errorColor(
|
92
|
-
"Couldn't find config file named q.config.json in the current directory. Create a config file in the current directory or pass the path to the config file with the option -c <path>"
|
93
|
-
)
|
94
|
-
);
|
95
|
-
}
|
96
|
-
} catch (error) {
|
97
|
-
console.error(
|
98
|
-
errorColor(
|
99
|
-
`A problem occured while parsing the config file at ${command.config}. Please make sure it is valid JSON.`
|
100
|
-
)
|
101
|
-
);
|
102
|
-
}
|
103
|
-
};
|
@@ -1,37 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
3
|
-
"title": "Q Config",
|
4
|
-
"description": "Config used by the Q CLI to copy items",
|
5
|
-
"type": "object",
|
6
|
-
"properties": {
|
7
|
-
"items": {
|
8
|
-
"description": "Array of Q items",
|
9
|
-
"type": "array",
|
10
|
-
"minItems": 1,
|
11
|
-
"items": {
|
12
|
-
"type": "object",
|
13
|
-
"properties": {
|
14
|
-
"environments": {
|
15
|
-
"type": "array",
|
16
|
-
"minItems": 1,
|
17
|
-
"items": {
|
18
|
-
"type": "object",
|
19
|
-
"properties": {
|
20
|
-
"id": {
|
21
|
-
"type": "string",
|
22
|
-
"description": "Id of Q item"
|
23
|
-
}
|
24
|
-
},
|
25
|
-
"required": ["id"]
|
26
|
-
}
|
27
|
-
},
|
28
|
-
"item": {
|
29
|
-
"type": "object"
|
30
|
-
}
|
31
|
-
},
|
32
|
-
"required": ["environments", "item"]
|
33
|
-
}
|
34
|
-
}
|
35
|
-
},
|
36
|
-
"required": ["items"]
|
37
|
-
}
|
@@ -1,81 +0,0 @@
|
|
1
|
-
const schemaService = require('../schemaService.js');
|
2
|
-
const configStore = require('../configStore.js');
|
3
|
-
const itemService = require('../itemService.js');
|
4
|
-
const fs = require('fs');
|
5
|
-
const path = require('path');
|
6
|
-
const chalk = require('chalk');
|
7
|
-
const errorColor = chalk.red;
|
8
|
-
const successColor = chalk.green;
|
9
|
-
|
10
|
-
module.exports = async function (command) {
|
11
|
-
try {
|
12
|
-
const qConfigPath = path.resolve(command.config);
|
13
|
-
|
14
|
-
if (!fs.existsSync(qConfigPath)) {
|
15
|
-
console.error(
|
16
|
-
errorColor(
|
17
|
-
"Couldn't find config file named q.config.json in the current directory. Create a config file in the current directory or pass the path to the config file with the option -c <path>"
|
18
|
-
)
|
19
|
-
);
|
20
|
-
process.exit(1);
|
21
|
-
}
|
22
|
-
|
23
|
-
const qConfig = JSON.parse(fs.readFileSync(qConfigPath));
|
24
|
-
const validationResult = schemaService.validateConfig(qConfig, 'createCustomCodeItem');
|
25
|
-
|
26
|
-
if (!validationResult.isValid) {
|
27
|
-
console.error(errorColor(`A problem occured while validating the config file: ${validationResult.errorsText}`));
|
28
|
-
process.exit(1);
|
29
|
-
}
|
30
|
-
|
31
|
-
const environmentName = command.environment;
|
32
|
-
const config = await configStore.setupStore(qConfig, environmentName, command.reset);
|
33
|
-
const items = itemService.getItems(qConfig);
|
34
|
-
const firstItem = items?.[0];
|
35
|
-
|
36
|
-
if (!firstItem) {
|
37
|
-
console.error(errorColor('No items found in the config file.'));
|
38
|
-
process.exit(1);
|
39
|
-
}
|
40
|
-
|
41
|
-
// Create a new custom code item
|
42
|
-
const title = command.title || 'Custom Code item created by Q-cli';
|
43
|
-
const newItem = await itemService.createItem(
|
44
|
-
{
|
45
|
-
acronym: 'Visuals',
|
46
|
-
assetGroups: [],
|
47
|
-
data: [],
|
48
|
-
department: 'Visuals',
|
49
|
-
files: [],
|
50
|
-
options: {
|
51
|
-
previewDisabled: false,
|
52
|
-
},
|
53
|
-
title: title,
|
54
|
-
tool: 'custom_code',
|
55
|
-
},
|
56
|
-
{ name: environmentName },
|
57
|
-
config
|
58
|
-
);
|
59
|
-
|
60
|
-
if (!newItem) {
|
61
|
-
console.error(errorColor('Failed to create a new custom code item.'));
|
62
|
-
process.exit(1);
|
63
|
-
}
|
64
|
-
|
65
|
-
// Add the new custom code item to the config file
|
66
|
-
qConfig.items[0].environments.push({
|
67
|
-
id: newItem._id,
|
68
|
-
name: environmentName,
|
69
|
-
});
|
70
|
-
|
71
|
-
// Write the updated config file
|
72
|
-
fs.writeFileSync(qConfigPath, JSON.stringify(qConfig, null, 2));
|
73
|
-
|
74
|
-
console.log(
|
75
|
-
successColor(`Successfully added new custom code item with id ${newItem._id} on ${environmentName} environment.`)
|
76
|
-
);
|
77
|
-
} catch (error) {
|
78
|
-
console.error(errorColor(`A problem occured while parsing the config file at ${command.config}.`));
|
79
|
-
console.error(error);
|
80
|
-
}
|
81
|
-
};
|
@@ -1,41 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
3
|
-
"title": "Q Config",
|
4
|
-
"description": "Config used by the Q CLI to update items",
|
5
|
-
"type": "object",
|
6
|
-
"properties": {
|
7
|
-
"items": {
|
8
|
-
"description": "Array of Q items",
|
9
|
-
"type": "array",
|
10
|
-
"minItems": 1,
|
11
|
-
"items": {
|
12
|
-
"type": "object",
|
13
|
-
"properties": {
|
14
|
-
"environments": {
|
15
|
-
"type": "array",
|
16
|
-
"minItems": 1,
|
17
|
-
"items": {
|
18
|
-
"type": "object",
|
19
|
-
"properties": {
|
20
|
-
"name": {
|
21
|
-
"type": "string",
|
22
|
-
"description": "Environment name of Q item"
|
23
|
-
},
|
24
|
-
"id": {
|
25
|
-
"type": "string",
|
26
|
-
"description": "Id of Q item"
|
27
|
-
}
|
28
|
-
},
|
29
|
-
"required": ["name", "id"]
|
30
|
-
}
|
31
|
-
},
|
32
|
-
"item": {
|
33
|
-
"type": "object"
|
34
|
-
}
|
35
|
-
},
|
36
|
-
"required": ["environments", "item"]
|
37
|
-
}
|
38
|
-
}
|
39
|
-
},
|
40
|
-
"required": ["items"]
|
41
|
-
}
|
@@ -1,102 +0,0 @@
|
|
1
|
-
const fetch = require("node-fetch");
|
2
|
-
const chalk = require("chalk");
|
3
|
-
const errorColor = chalk.red;
|
4
|
-
|
5
|
-
function getEnvironments(qConfig, environmentFilter) {
|
6
|
-
try {
|
7
|
-
const environments = new Set();
|
8
|
-
for (const item of qConfig.items) {
|
9
|
-
for (const environment of item.environments) {
|
10
|
-
if (environmentFilter) {
|
11
|
-
if (environmentFilter === environment.name) {
|
12
|
-
environments.add(environment.name);
|
13
|
-
}
|
14
|
-
} else {
|
15
|
-
environments.add(environment.name);
|
16
|
-
}
|
17
|
-
}
|
18
|
-
}
|
19
|
-
|
20
|
-
if (environments.size > 0) {
|
21
|
-
return Array.from(environments);
|
22
|
-
} else {
|
23
|
-
throw new Error(
|
24
|
-
`No items with environment ${environmentFilter} found. Please check your configuration and try again.`
|
25
|
-
);
|
26
|
-
}
|
27
|
-
} catch (error) {
|
28
|
-
console.error(errorColor(error.message));
|
29
|
-
process.exit(1);
|
30
|
-
}
|
31
|
-
}
|
32
|
-
|
33
|
-
async function getAccessToken(
|
34
|
-
environment,
|
35
|
-
qServer,
|
36
|
-
username,
|
37
|
-
password,
|
38
|
-
cookie
|
39
|
-
) {
|
40
|
-
try {
|
41
|
-
const response = await fetch(`${qServer}authenticate`, {
|
42
|
-
method: "POST",
|
43
|
-
headers: {
|
44
|
-
"user-agent": "Q Command-line Tool",
|
45
|
-
origin: qServer,
|
46
|
-
Cookie: cookie ? cookie : "",
|
47
|
-
},
|
48
|
-
body: JSON.stringify({
|
49
|
-
username: username,
|
50
|
-
password: password,
|
51
|
-
}),
|
52
|
-
});
|
53
|
-
|
54
|
-
if (response.ok) {
|
55
|
-
const body = await response.json();
|
56
|
-
return {
|
57
|
-
accessToken: body.access_token,
|
58
|
-
cookie: response.headers.get("set-cookie"),
|
59
|
-
};
|
60
|
-
}
|
61
|
-
|
62
|
-
return false;
|
63
|
-
} catch (error) {
|
64
|
-
console.error(
|
65
|
-
errorColor(
|
66
|
-
`A problem occured while authenticating on ${environment} environment. Please check your connection and try again.`
|
67
|
-
)
|
68
|
-
);
|
69
|
-
process.exit(1);
|
70
|
-
}
|
71
|
-
}
|
72
|
-
|
73
|
-
async function checkValidityOfAccessToken(
|
74
|
-
environment,
|
75
|
-
qServer,
|
76
|
-
accessToken,
|
77
|
-
cookie
|
78
|
-
) {
|
79
|
-
try {
|
80
|
-
const response = await fetch(`${qServer}user`, {
|
81
|
-
headers: {
|
82
|
-
"user-agent": "Q Command-line Tool",
|
83
|
-
Authorization: `Bearer ${accessToken}`,
|
84
|
-
Cookie: cookie ? cookie : "",
|
85
|
-
},
|
86
|
-
});
|
87
|
-
return response.ok;
|
88
|
-
} catch (error) {
|
89
|
-
console.error(
|
90
|
-
errorColor(
|
91
|
-
`A problem occured while checking the validity of your access token on ${environment} environment. Please check your connection and try again.`
|
92
|
-
)
|
93
|
-
);
|
94
|
-
process.exit(1);
|
95
|
-
}
|
96
|
-
}
|
97
|
-
|
98
|
-
module.exports = {
|
99
|
-
getEnvironments: getEnvironments,
|
100
|
-
getAccessToken,
|
101
|
-
checkValidityOfAccessToken,
|
102
|
-
};
|
@@ -1,310 +0,0 @@
|
|
1
|
-
const resourcesService = require("./resourcesService.js");
|
2
|
-
const schemaService = require("./schemaService.js");
|
3
|
-
const deepmerge = require("deepmerge");
|
4
|
-
const fetch = require("node-fetch");
|
5
|
-
const chalk = require("chalk");
|
6
|
-
const errorColor = chalk.red;
|
7
|
-
|
8
|
-
async function createItem(item, environment, config) {
|
9
|
-
const qServer = config.get(`${environment.name}.qServer`);
|
10
|
-
const accessToken = config.get(`${environment.name}.accessToken`);
|
11
|
-
const cookie = config.get(`${environment.name}.cookie`);
|
12
|
-
|
13
|
-
try {
|
14
|
-
const response = await fetch(`${qServer}item`, {
|
15
|
-
method: "POST",
|
16
|
-
body: JSON.stringify(item),
|
17
|
-
headers: {
|
18
|
-
"user-agent": "Q Command-line Tool",
|
19
|
-
Authorization: `Bearer ${accessToken}`,
|
20
|
-
"Content-Type": "application/json",
|
21
|
-
Cookie: cookie ? cookie : "",
|
22
|
-
},
|
23
|
-
});
|
24
|
-
if (response.ok) {
|
25
|
-
return await response.json();
|
26
|
-
} else {
|
27
|
-
throw new Error(
|
28
|
-
`A problem occured while creating item on ${environment.name} environment. Please check your connection and try again.`
|
29
|
-
);
|
30
|
-
}
|
31
|
-
} catch (error) {
|
32
|
-
console.error(errorColor(error.message));
|
33
|
-
process.exit(1);
|
34
|
-
}
|
35
|
-
}
|
36
|
-
|
37
|
-
async function getItem(qServer, environment, accessToken, cookie) {
|
38
|
-
try {
|
39
|
-
const response = await fetch(`${qServer}item/${environment.id}`, {
|
40
|
-
headers: {
|
41
|
-
"user-agent": "Q Command-line Tool",
|
42
|
-
Authorization: `Bearer ${accessToken}`,
|
43
|
-
Cookie: cookie ? cookie : "",
|
44
|
-
},
|
45
|
-
});
|
46
|
-
if (response.ok) {
|
47
|
-
return await response.json();
|
48
|
-
} else {
|
49
|
-
throw new Error(
|
50
|
-
`A problem occured while getting item with id ${environment.id} on ${environment.name} environment. Please make sure that the id is correct, you have an internet connection and try again.`
|
51
|
-
);
|
52
|
-
}
|
53
|
-
} catch (error) {
|
54
|
-
console.error(errorColor(error.message));
|
55
|
-
process.exit(1);
|
56
|
-
}
|
57
|
-
}
|
58
|
-
|
59
|
-
function getItems(qConfig, environmentFilter) {
|
60
|
-
const items = qConfig.items
|
61
|
-
.filter((item) => {
|
62
|
-
if (environmentFilter) {
|
63
|
-
return item.environments.some(
|
64
|
-
(environment) => environment.name === environmentFilter
|
65
|
-
);
|
66
|
-
}
|
67
|
-
|
68
|
-
return true;
|
69
|
-
})
|
70
|
-
.map((item) => {
|
71
|
-
if (environmentFilter) {
|
72
|
-
item.environments = item.environments.filter(
|
73
|
-
(environment) => environment.name === environmentFilter
|
74
|
-
);
|
75
|
-
}
|
76
|
-
|
77
|
-
return item;
|
78
|
-
});
|
79
|
-
|
80
|
-
return items;
|
81
|
-
}
|
82
|
-
|
83
|
-
function getDefaultOrNull(schema) {
|
84
|
-
if (schema.hasOwnProperty("default")) {
|
85
|
-
if (typeof schema.default === "object") {
|
86
|
-
return JSON.parse(JSON.stringify(schema.default));
|
87
|
-
}
|
88
|
-
return schema.default;
|
89
|
-
}
|
90
|
-
return null;
|
91
|
-
}
|
92
|
-
|
93
|
-
// Returns a default item based on the tool schema
|
94
|
-
// The default item is used to derive the file properties of a certain file type
|
95
|
-
// These file properties are specified by the tool and are specific to the file type
|
96
|
-
// For example an image file has height/width file properties
|
97
|
-
function getDefaultItem(schema) {
|
98
|
-
schema = JSON.parse(JSON.stringify(schema));
|
99
|
-
if (schema.type === "array") {
|
100
|
-
let array = [];
|
101
|
-
schema.minItems = 1;
|
102
|
-
for (let i = 0; i < schema.minItems; i++) {
|
103
|
-
let value = getDefaultItem(schema.items);
|
104
|
-
if (value) {
|
105
|
-
if (
|
106
|
-
schema["Q:type"] &&
|
107
|
-
schema["Q:type"] === "files" &&
|
108
|
-
schema["Q:options"] &&
|
109
|
-
schema["Q:options"].fileProperties
|
110
|
-
) {
|
111
|
-
array.push(Object.assign(value, schema["Q:options"].fileProperties));
|
112
|
-
} else {
|
113
|
-
array.push(value);
|
114
|
-
}
|
115
|
-
}
|
116
|
-
}
|
117
|
-
|
118
|
-
const defaultValue = getDefaultOrNull(schema);
|
119
|
-
if (array === null && defaultValue !== null) {
|
120
|
-
array = defaultValue;
|
121
|
-
}
|
122
|
-
return array;
|
123
|
-
} else if (schema.type === "object") {
|
124
|
-
const defaultValue = getDefaultOrNull(schema);
|
125
|
-
if (defaultValue !== null) {
|
126
|
-
return defaultValue;
|
127
|
-
}
|
128
|
-
|
129
|
-
if (
|
130
|
-
schema["Q:type"] &&
|
131
|
-
schema["Q:type"] === "files" &&
|
132
|
-
schema["Q:options"] &&
|
133
|
-
schema["Q:options"].fileProperties
|
134
|
-
) {
|
135
|
-
return schema["Q:options"].fileProperties;
|
136
|
-
}
|
137
|
-
|
138
|
-
if (!schema.hasOwnProperty("properties")) {
|
139
|
-
return undefined;
|
140
|
-
}
|
141
|
-
let object = {};
|
142
|
-
Object.keys(schema.properties).forEach((propertyName) => {
|
143
|
-
const property = schema.properties[propertyName];
|
144
|
-
let value = getDefaultItem(property);
|
145
|
-
if (value !== undefined) {
|
146
|
-
object[propertyName] = value;
|
147
|
-
} else if (
|
148
|
-
property["Q:type"] &&
|
149
|
-
property["Q:type"] === "files" &&
|
150
|
-
property["Q:options"] &&
|
151
|
-
property["Q:options"].fileProperties
|
152
|
-
) {
|
153
|
-
object[propertyName] = property["Q:options"].fileProperties;
|
154
|
-
}
|
155
|
-
});
|
156
|
-
return object;
|
157
|
-
}
|
158
|
-
|
159
|
-
// if this is not an array or object, we just get the default if any
|
160
|
-
const defaultValue = getDefaultOrNull(schema);
|
161
|
-
if (defaultValue !== null) {
|
162
|
-
return defaultValue;
|
163
|
-
}
|
164
|
-
return undefined;
|
165
|
-
}
|
166
|
-
|
167
|
-
async function updateItem(item, environment, config, qConfigPath) {
|
168
|
-
const qServer = config.get(`${environment.name}.qServer`);
|
169
|
-
const accessToken = config.get(`${environment.name}.accessToken`);
|
170
|
-
const cookie = config.get(`${environment.name}.cookie`);
|
171
|
-
const existingItem = await getItem(qServer, environment, accessToken, cookie);
|
172
|
-
const updatedItem = await getUpdatedItem(
|
173
|
-
qServer,
|
174
|
-
accessToken,
|
175
|
-
cookie,
|
176
|
-
existingItem,
|
177
|
-
item,
|
178
|
-
environment,
|
179
|
-
qConfigPath
|
180
|
-
);
|
181
|
-
return await saveItem(qServer, environment, accessToken, cookie, updatedItem);
|
182
|
-
}
|
183
|
-
|
184
|
-
async function getUpdatedItem(
|
185
|
-
qServer,
|
186
|
-
accessToken,
|
187
|
-
cookie,
|
188
|
-
existingItem,
|
189
|
-
item,
|
190
|
-
environment,
|
191
|
-
qConfigPath
|
192
|
-
) {
|
193
|
-
try {
|
194
|
-
const toolSchema = await schemaService.getToolSchema(
|
195
|
-
qServer,
|
196
|
-
existingItem.tool
|
197
|
-
);
|
198
|
-
// Removes additional properties not defined in the schema on the top level object of the item
|
199
|
-
toolSchema.additionalProperties = false;
|
200
|
-
|
201
|
-
if(existingItem.customSchema) {
|
202
|
-
toolSchema.properties = {...toolSchema.properties, ...existingItem.customSchema}
|
203
|
-
}
|
204
|
-
|
205
|
-
if(existingItem.customSchemaDefinitions) {
|
206
|
-
toolSchema.definitions = {...toolSchema.definitions, ...existingItem.customSchemaDefinitions}
|
207
|
-
}
|
208
|
-
// If options object is available additional properties not defined in the schema are removed
|
209
|
-
if (toolSchema.properties && toolSchema.properties.options) {
|
210
|
-
toolSchema.properties.options.additionalProperties = false;
|
211
|
-
}
|
212
|
-
const defaultItem = getDefaultItem(toolSchema);
|
213
|
-
item = JSON.parse(JSON.stringify(item));
|
214
|
-
item = await resourcesService.handleResources(
|
215
|
-
qServer,
|
216
|
-
accessToken,
|
217
|
-
cookie,
|
218
|
-
item,
|
219
|
-
defaultItem,
|
220
|
-
qConfigPath,
|
221
|
-
environment
|
222
|
-
);
|
223
|
-
|
224
|
-
// Merge options:
|
225
|
-
// File of files property will be updated (if file exists on destination)
|
226
|
-
// If it doesn't exist it is appended to the files array
|
227
|
-
// All other properties are overwritten from source config
|
228
|
-
const options = {
|
229
|
-
arrayMerge: (destArr, srcArr) => srcArr,
|
230
|
-
customMerge: (key) => {
|
231
|
-
if (key === "files") {
|
232
|
-
return (destArr, srcArr) => {
|
233
|
-
if (destArr.length <= 0) {
|
234
|
-
return srcArr;
|
235
|
-
}
|
236
|
-
|
237
|
-
srcArr.forEach((fileObj) => {
|
238
|
-
let destIndex = destArr.findIndex(
|
239
|
-
(destFileObj) =>
|
240
|
-
destFileObj.file.originalName === fileObj.file.originalName
|
241
|
-
);
|
242
|
-
|
243
|
-
if (destIndex !== -1) {
|
244
|
-
destArr[destIndex] = fileObj;
|
245
|
-
} else {
|
246
|
-
destArr.push(fileObj);
|
247
|
-
}
|
248
|
-
});
|
249
|
-
return destArr;
|
250
|
-
};
|
251
|
-
}
|
252
|
-
},
|
253
|
-
};
|
254
|
-
|
255
|
-
// merges existing item with the item defined in q.config.json
|
256
|
-
const updatedItem = deepmerge(existingItem, item, options);
|
257
|
-
// normalizes the item which removes additional properties not defined in the schema
|
258
|
-
// and validates the item against the schema
|
259
|
-
const normalizedItem = schemaService.getNormalizedItem(
|
260
|
-
toolSchema,
|
261
|
-
updatedItem,
|
262
|
-
environment
|
263
|
-
);
|
264
|
-
// the normalized item is merged with the existing item. This is done because properties such as _id and _rev
|
265
|
-
// defined in the existing item are removed during normalization, because they are not defined in the schema
|
266
|
-
return deepmerge(existingItem, normalizedItem, options);
|
267
|
-
} catch (error) {
|
268
|
-
console.error(errorColor(error.message));
|
269
|
-
process.exit(1);
|
270
|
-
}
|
271
|
-
}
|
272
|
-
|
273
|
-
async function saveItem(
|
274
|
-
qServer,
|
275
|
-
environment,
|
276
|
-
accessToken,
|
277
|
-
cookie,
|
278
|
-
updatedItem
|
279
|
-
) {
|
280
|
-
try {
|
281
|
-
delete updatedItem.updatedDate;
|
282
|
-
const response = await fetch(`${qServer}item`, {
|
283
|
-
method: "PUT",
|
284
|
-
body: JSON.stringify(updatedItem),
|
285
|
-
headers: {
|
286
|
-
"user-agent": "Q Command-line Tool",
|
287
|
-
Authorization: `Bearer ${accessToken}`,
|
288
|
-
"Content-Type": "application/json",
|
289
|
-
Cookie: cookie ? cookie : "",
|
290
|
-
},
|
291
|
-
});
|
292
|
-
if (response.ok) {
|
293
|
-
return await response.json();
|
294
|
-
} else {
|
295
|
-
throw new Error(
|
296
|
-
`A problem occured while saving item with id ${environment.id} on ${environment.name} environment. Please check your connection and try again.`
|
297
|
-
);
|
298
|
-
}
|
299
|
-
} catch (error) {
|
300
|
-
console.error(errorColor(error.message));
|
301
|
-
process.exit(1);
|
302
|
-
}
|
303
|
-
}
|
304
|
-
|
305
|
-
module.exports = {
|
306
|
-
createItem: createItem,
|
307
|
-
getItem: getItem,
|
308
|
-
getItems: getItems,
|
309
|
-
updateItem: updateItem,
|
310
|
-
};
|