@nzz/q-cli 1.10.2 → 2.0.0-beta.7

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.
Files changed (163) hide show
  1. package/dist/index.js +79 -0
  2. package/dist/interfaces.js +1 -0
  3. package/dist/newCustomCode.js +106 -0
  4. package/dist/updateItem.js +191 -0
  5. package/dist/utils.js +11 -0
  6. package/package.json +27 -36
  7. package/.nvmrc +0 -1
  8. package/.travis.yml +0 -17
  9. package/.vscode/launch.json +0 -36
  10. package/.vscode/settings.json +0 -5
  11. package/LICENSE +0 -21
  12. package/README.md +0 -360
  13. package/bin/commands/bootstrap.js +0 -68
  14. package/bin/commands/qItem/configStore.js +0 -144
  15. package/bin/commands/qItem/copyItem/copyItem.js +0 -103
  16. package/bin/commands/qItem/copyItem/copySchema.json +0 -37
  17. package/bin/commands/qItem/createCustomCodeItem/createCustomCodeItem.js +0 -70
  18. package/bin/commands/qItem/createCustomCodeItem/schema.json +0 -41
  19. package/bin/commands/qItem/helpers.js +0 -102
  20. package/bin/commands/qItem/itemService.js +0 -310
  21. package/bin/commands/qItem/resourcesService.js +0 -148
  22. package/bin/commands/qItem/schemaService.js +0 -65
  23. package/bin/commands/qItem/updateItem/updateItem.js +0 -64
  24. package/bin/commands/server.js +0 -80
  25. package/bin/q.js +0 -213
  26. package/dev-server/config/default.js +0 -51
  27. package/dev-server/public/favicon.ico +0 -0
  28. package/dev-server/public/style.css +0 -64
  29. package/dev-server/routes/dev-view.js +0 -52
  30. package/dev-server/routes/file.js +0 -10
  31. package/dev-server/routes/rendering-info.js +0 -130
  32. package/dev-server/routes/routes.js +0 -6
  33. package/dev-server/routes/tool-default.js +0 -108
  34. package/dev-server/server-plugins.js +0 -1
  35. package/dev-server/server.js +0 -18
  36. package/dev-server/views/index.html +0 -184
  37. package/skeletons/custom-code-skeleton/.nvmrc +0 -1
  38. package/skeletons/custom-code-skeleton/.vscode/settings.json +0 -5
  39. package/skeletons/custom-code-skeleton/README.md +0 -26
  40. package/skeletons/custom-code-skeleton/index.d.ts +0 -3
  41. package/skeletons/custom-code-skeleton/package-lock.json +0 -7355
  42. package/skeletons/custom-code-skeleton/package.json +0 -46
  43. package/skeletons/custom-code-skeleton/q.config.json +0 -60
  44. package/skeletons/custom-code-skeleton/rollup.config.js +0 -185
  45. package/skeletons/custom-code-skeleton/src/App.scss +0 -5
  46. package/skeletons/custom-code-skeleton/src/App.svelte +0 -7
  47. package/skeletons/custom-code-skeleton/src/enums.ts +0 -0
  48. package/skeletons/custom-code-skeleton/src/interfaces.ts +0 -0
  49. package/skeletons/custom-code-skeleton/src/main-prod.ts +0 -4
  50. package/skeletons/custom-code-skeleton/src/main.scss +0 -1
  51. package/skeletons/custom-code-skeleton/src/main.ts +0 -18
  52. package/skeletons/custom-code-skeleton/tsconfig.json +0 -16
  53. package/skeletons/et-utils-package-skeleton/.nvmrc +0 -1
  54. package/skeletons/et-utils-package-skeleton/README.md +0 -12
  55. package/skeletons/et-utils-package-skeleton/jest.config.ts +0 -17
  56. package/skeletons/et-utils-package-skeleton/package-lock.json +0 -3969
  57. package/skeletons/et-utils-package-skeleton/package.json +0 -40
  58. package/skeletons/et-utils-package-skeleton/scripts/package-fixup.sh +0 -13
  59. package/skeletons/et-utils-package-skeleton/src/Service.ts +0 -8
  60. package/skeletons/et-utils-package-skeleton/src/index.ts +0 -4
  61. package/skeletons/et-utils-package-skeleton/test/Service.spec.ts +0 -10
  62. package/skeletons/et-utils-package-skeleton/test/tsconfig.json +0 -8
  63. package/skeletons/et-utils-package-skeleton/tsconfig-base.json +0 -10
  64. package/skeletons/et-utils-package-skeleton/tsconfig-cjs.json +0 -8
  65. package/skeletons/et-utils-package-skeleton/tsconfig.json +0 -8
  66. package/skeletons/server-skeleton/.nvmrc +0 -1
  67. package/skeletons/server-skeleton/Dockerfile +0 -19
  68. package/skeletons/server-skeleton/auth/routes.js +0 -85
  69. package/skeletons/server-skeleton/auth/strategyOptions.js +0 -28
  70. package/skeletons/server-skeleton/config/base.js +0 -45
  71. package/skeletons/server-skeleton/config/db.js +0 -6
  72. package/skeletons/server-skeleton/config/editor.js +0 -105
  73. package/skeletons/server-skeleton/config/rendering-info.js +0 -70
  74. package/skeletons/server-skeleton/config/screenshot.js +0 -80
  75. package/skeletons/server-skeleton/config/targets.js +0 -31
  76. package/skeletons/server-skeleton/config/tools.js +0 -65
  77. package/skeletons/server-skeleton/files/favicon.png +0 -0
  78. package/skeletons/server-skeleton/files/system.js +0 -3612
  79. package/skeletons/server-skeleton/index.js +0 -106
  80. package/skeletons/server-skeleton/package-lock.json +0 -1825
  81. package/skeletons/server-skeleton/package.json +0 -29
  82. package/skeletons/tool-skeleton/.dockerignore +0 -1
  83. package/skeletons/tool-skeleton/.nvmrc +0 -1
  84. package/skeletons/tool-skeleton/.travis.yml +0 -26
  85. package/skeletons/tool-skeleton/.vscode/settings.json +0 -5
  86. package/skeletons/tool-skeleton/Dockerfile +0 -19
  87. package/skeletons/tool-skeleton/LICENSE +0 -20
  88. package/skeletons/tool-skeleton/README.md +0 -104
  89. package/skeletons/tool-skeleton/index.js +0 -32
  90. package/skeletons/tool-skeleton/package-lock.json +0 -10108
  91. package/skeletons/tool-skeleton/package.json +0 -45
  92. package/skeletons/tool-skeleton/resources/display-options-schema.json +0 -11
  93. package/skeletons/tool-skeleton/resources/fixtures/data/basic.json +0 -4
  94. package/skeletons/tool-skeleton/resources/locales/de/translation.json +0 -1
  95. package/skeletons/tool-skeleton/resources/locales/en/translation.json +0 -1
  96. package/skeletons/tool-skeleton/resources/locales/fr/translation.json +0 -1
  97. package/skeletons/tool-skeleton/resources/schema.json +0 -16
  98. package/skeletons/tool-skeleton/rollup.config.js +0 -75
  99. package/skeletons/tool-skeleton/routes/fixtures/data.js +0 -15
  100. package/skeletons/tool-skeleton/routes/health.js +0 -10
  101. package/skeletons/tool-skeleton/routes/locales.js +0 -21
  102. package/skeletons/tool-skeleton/routes/rendering-info/web.js +0 -97
  103. package/skeletons/tool-skeleton/routes/routes.js +0 -8
  104. package/skeletons/tool-skeleton/routes/schema.js +0 -19
  105. package/skeletons/tool-skeleton/routes/script.js +0 -17
  106. package/skeletons/tool-skeleton/routes/stylesheet.js +0 -17
  107. package/skeletons/tool-skeleton/sass.config.js +0 -66
  108. package/skeletons/tool-skeleton/scripts_src/default.js +0 -3
  109. package/skeletons/tool-skeleton/styles_src/_variables.scss +0 -1
  110. package/skeletons/tool-skeleton/styles_src/main.scss +0 -2
  111. package/skeletons/tool-skeleton/test/e2e-tests.js +0 -162
  112. package/skeletons/tool-skeleton/views/dynamic/YourTool.scss +0 -5
  113. package/skeletons/tool-skeleton/views/dynamic/YourTool.svelte +0 -19
  114. package/skeletons/tool-skeleton/views/static/App.scss +0 -5
  115. package/skeletons/tool-skeleton/views/static/App.svelte +0 -21
  116. package/skeletons/tool-skeleton/views/static/components/Footer.svelte +0 -31
  117. package/skeletons/tool-skeleton/views/static/components/Header.svelte +0 -7
  118. package/skeletons/toolv2-skeleton/.husky/pre-commit +0 -6
  119. package/skeletons/toolv2-skeleton/.nvmrc +0 -1
  120. package/skeletons/toolv2-skeleton/.prettierrc.cjs +0 -15
  121. package/skeletons/toolv2-skeleton/.travis.yml +0 -30
  122. package/skeletons/toolv2-skeleton/.vscode/settings.json +0 -6
  123. package/skeletons/toolv2-skeleton/Dockerfile +0 -19
  124. package/skeletons/toolv2-skeleton/LICENSE +0 -21
  125. package/skeletons/toolv2-skeleton/README.md +0 -99
  126. package/skeletons/toolv2-skeleton/dev.js +0 -7
  127. package/skeletons/toolv2-skeleton/index.js +0 -39
  128. package/skeletons/toolv2-skeleton/jest.config.ts +0 -39
  129. package/skeletons/toolv2-skeleton/nodemon.json +0 -4
  130. package/skeletons/toolv2-skeleton/package-lock.json +0 -21382
  131. package/skeletons/toolv2-skeleton/package.json +0 -80
  132. package/skeletons/toolv2-skeleton/resources/display-options-schema.json +0 -11
  133. package/skeletons/toolv2-skeleton/resources/locales/de/translation.json +0 -8
  134. package/skeletons/toolv2-skeleton/resources/locales/en/translation.json +0 -10
  135. package/skeletons/toolv2-skeleton/resources/locales/fr/translation.json +0 -10
  136. package/skeletons/toolv2-skeleton/resources/schema.json +0 -66
  137. package/skeletons/toolv2-skeleton/rollup.config.js +0 -48
  138. package/skeletons/toolv2-skeleton/scripts/postinstall.sh +0 -5
  139. package/skeletons/toolv2-skeleton/src/.eslintrc.cjs +0 -52
  140. package/skeletons/toolv2-skeleton/src/components/Main.spec.ts +0 -15
  141. package/skeletons/toolv2-skeleton/src/components/Main.svelte +0 -32
  142. package/skeletons/toolv2-skeleton/src/enums.ts +0 -11
  143. package/skeletons/toolv2-skeleton/src/helpers/fixture-generators.ts +0 -38
  144. package/skeletons/toolv2-skeleton/src/helpers/toolRuntimeConfig.ts +0 -15
  145. package/skeletons/toolv2-skeleton/src/interfaces.ts +0 -82
  146. package/skeletons/toolv2-skeleton/src/modules.d.ts +0 -8
  147. package/skeletons/toolv2-skeleton/src/routes/dynamic-schemas/exampleDynamicSchema.ts +0 -49
  148. package/skeletons/toolv2-skeleton/src/routes/dynamic-schemas/index.ts +0 -5
  149. package/skeletons/toolv2-skeleton/src/routes/health.ts +0 -14
  150. package/skeletons/toolv2-skeleton/src/routes/locales.ts +0 -31
  151. package/skeletons/toolv2-skeleton/src/routes/notifications/exampleNotification.ts +0 -46
  152. package/skeletons/toolv2-skeleton/src/routes/option-availability.ts +0 -27
  153. package/skeletons/toolv2-skeleton/src/routes/rendering-info/web.ts +0 -150
  154. package/skeletons/toolv2-skeleton/src/routes/routes.ts +0 -21
  155. package/skeletons/toolv2-skeleton/src/routes/schema.ts +0 -21
  156. package/skeletons/toolv2-skeleton/src/routes/stylesheet.ts +0 -31
  157. package/skeletons/toolv2-skeleton/src/styles/main.scss +0 -6
  158. package/skeletons/toolv2-skeleton/svelte.config.cjs +0 -6
  159. package/skeletons/toolv2-skeleton/tasks/compileStyleFiles.cjs +0 -101
  160. package/skeletons/toolv2-skeleton/tests/e2e-tests.spec.ts +0 -158
  161. package/skeletons/toolv2-skeleton/tests/helpers.ts +0 -21
  162. package/skeletons/toolv2-skeleton/tsconfig.json +0 -48
  163. /package/{bin/commands/qItem/updateItem → dist/assets}/updateSchema.json +0 -0
@@ -1,70 +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
- { assetGroups: [], data: [], files: [], title: title, tool: 'custom_code' },
45
- { name: environmentName },
46
- config
47
- );
48
-
49
- if (!newItem) {
50
- console.error(errorColor('Failed to create a new custom code item.'));
51
- process.exit(1);
52
- }
53
-
54
- // Add the new custom code item to the config file
55
- qConfig.items[0].environments.push({
56
- id: newItem._id,
57
- name: environmentName,
58
- });
59
-
60
- // Write the updated config file
61
- fs.writeFileSync(qConfigPath, JSON.stringify(qConfig, null, 2));
62
-
63
- console.log(
64
- successColor(`Successfully added new custom code item with id ${newItem._id} on ${environmentName} environment.`)
65
- );
66
- } catch (error) {
67
- console.error(errorColor(`A problem occured while parsing the config file at ${command.config}.`));
68
- console.error(error);
69
- }
70
- };
@@ -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
- };
@@ -1,148 +0,0 @@
1
- const fetch = require("node-fetch");
2
- const FormData = require("form-data");
3
- const fs = require("fs");
4
- const util = require("util");
5
- const stat = util.promisify(fs.stat);
6
- const Mimos = require("@hapi/mimos");
7
- const mimos = new Mimos({
8
- override: {
9
- "application/javascript": {
10
- source: "iana",
11
- charset: "UTF-8",
12
- compressible: true,
13
- extensions: ["js", "javascript"],
14
- type: "text/javascript",
15
- },
16
- },
17
- });
18
- const imageSize = require("image-size");
19
- const path = require("path");
20
- const chalk = require("chalk");
21
- const errorColor = chalk.red;
22
-
23
- // Recursively traverses the item object
24
- // If a property called "path" is found, the resource is uploaded
25
- // and the metadata of that resource is inserted at that place in the item object
26
- async function handleResources(
27
- qServer,
28
- accessToken,
29
- cookie,
30
- item,
31
- defaultItem,
32
- qConfigPath,
33
- environment
34
- ) {
35
- try {
36
- if (item) {
37
- for (let key of Object.keys(item)) {
38
- if (typeof item[key] === "object") {
39
- let defaultItemSubtree;
40
- if (defaultItem && Number.isInteger(parseInt(key)) && key > 0) {
41
- defaultItemSubtree = defaultItem[0];
42
- } else if (defaultItem && defaultItem[key]) {
43
- defaultItemSubtree = defaultItem[key];
44
- }
45
- item[key] = await handleResources(
46
- qServer,
47
- accessToken,
48
- cookie,
49
- item[key],
50
- defaultItemSubtree,
51
- qConfigPath,
52
- environment
53
- );
54
- } else if (key === "path") {
55
- const resourcePath = item[key];
56
- if (defaultItem) {
57
- item = await getResourceMetadata(
58
- qServer,
59
- accessToken,
60
- cookie,
61
- resourcePath,
62
- defaultItem,
63
- qConfigPath,
64
- environment
65
- );
66
- } else {
67
- throw new Error(
68
- `Error occured while uploading the resource at ${resourcePath}. Please make sure the config structure matches the schema of the tool and try again. `
69
- );
70
- }
71
- }
72
- }
73
- }
74
- return item;
75
- } catch (error) {
76
- console.error(errorColor(error.message));
77
- process.exit(1);
78
- }
79
- }
80
-
81
- // Uploads the resource and returns the metadata based on the file properties
82
- async function getResourceMetadata(
83
- qServer,
84
- accessToken,
85
- cookie,
86
- resource,
87
- fileProperties,
88
- qConfigPath,
89
- environment
90
- ) {
91
- const resourcePath = path
92
- .resolve(path.dirname(qConfigPath), resource)
93
- .replace(/{id}/g, environment.id);
94
- resource = await uploadResource(qServer, accessToken, cookie, resourcePath);
95
- const statistic = await stat(resourcePath);
96
- resource.size = statistic.size;
97
- resource.type = mimos.path(resourcePath).type;
98
-
99
- if (fileProperties.name) {
100
- resource[fileProperties.name] = path.basename(resourcePath);
101
- }
102
- if (fileProperties.width && fileProperties.height) {
103
- const dimensions = imageSize(resourcePath);
104
- resource[fileProperties.width] = dimensions.width;
105
- resource[fileProperties.height] = dimensions.height;
106
- }
107
-
108
- return resource;
109
- }
110
-
111
- async function uploadResource(qServer, accessToken, cookie, resourcePath) {
112
- try {
113
- if (fs.existsSync(resourcePath)) {
114
- const form = new FormData();
115
- const stream = fs.createReadStream(resourcePath);
116
- form.append("file", stream);
117
- const headers = form.getHeaders();
118
- headers.Authorization = `Bearer ${accessToken}`;
119
- headers.Cookie = cookie;
120
-
121
- const response = await fetch(`${qServer}file`, {
122
- method: "POST",
123
- headers: headers,
124
- body: form,
125
- });
126
- const body = await response.json();
127
-
128
- if (response.ok) {
129
- return body;
130
- } else {
131
- throw new Error(
132
- `Error occured while uploading the resource at ${resourcePath}. Please check your connection and try again.\nResponse: ${body.statusCode} ${body.error} - ${body.message}`
133
- );
134
- }
135
- } else {
136
- throw new Error(
137
- `Error occured while reading the resource at ${resourcePath}. Please make sure that the resource exists and try again.`
138
- );
139
- }
140
- } catch (error) {
141
- console.error(errorColor(error.message));
142
- process.exit(1);
143
- }
144
- }
145
-
146
- module.exports = {
147
- handleResources: handleResources,
148
- };