@squiz/component-cli-lib 1.2.1-alpha.107 → 1.2.1-alpha.18

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 (61) hide show
  1. package/CHANGELOG.md +0 -730
  2. package/jest.config.ts +3 -11
  3. package/lib/index.d.ts +1 -2
  4. package/lib/index.js +79 -5
  5. package/lib/index.js.map +1 -1
  6. package/lib/{component-dev-folder-structures.spec.d.ts → test.d.ts} +0 -0
  7. package/lib/test.js +12 -0
  8. package/lib/test.js.map +1 -0
  9. package/lib/utils/zipDirectory.d.ts +1 -0
  10. package/lib/utils/zipDirectory.js +32 -0
  11. package/lib/utils/zipDirectory.js.map +1 -0
  12. package/package.json +16 -22
  13. package/src/index.ts +90 -2
  14. package/src/test.ts +9 -0
  15. package/src/utils/zipDirectory.ts +31 -0
  16. package/tsconfig.json +1 -6
  17. package/tsconfig.tsbuildinfo +1 -1
  18. package/.gitlab-ci.yml +0 -115
  19. package/jest.integration.config.ts +0 -17
  20. package/lib/component-dev-folder-structures.spec.js +0 -58
  21. package/lib/component-dev-folder-structures.spec.js.map +0 -1
  22. package/lib/component-dev.d.ts +0 -16
  23. package/lib/component-dev.js +0 -49
  24. package/lib/component-dev.js.map +0 -1
  25. package/lib/component-dev.spec.d.ts +0 -1
  26. package/lib/component-dev.spec.js +0 -54
  27. package/lib/component-dev.spec.js.map +0 -1
  28. package/lib/integration-tests/__components__/big-package/manifest.json +0 -35
  29. package/lib/integration-tests/__components__/cmp-static-file-test/manifest.json +0 -39
  30. package/lib/integration-tests/__components__/invalid-manifest/manifest.json +0 -27
  31. package/lib/integration-tests/helper.d.ts +0 -19
  32. package/lib/integration-tests/helper.js +0 -73
  33. package/lib/integration-tests/helper.js.map +0 -1
  34. package/lib/integration-tests/service-deployment.spec.d.ts +0 -1
  35. package/lib/integration-tests/service-deployment.spec.js +0 -36
  36. package/lib/integration-tests/service-deployment.spec.js.map +0 -1
  37. package/lib/integration-tests/test-setup.d.ts +0 -0
  38. package/lib/integration-tests/test-setup.js +0 -3
  39. package/lib/integration-tests/test-setup.js.map +0 -1
  40. package/lib/integration-tests/upload-and-render-component.spec.d.ts +0 -1
  41. package/lib/integration-tests/upload-and-render-component.spec.js +0 -141
  42. package/lib/integration-tests/upload-and-render-component.spec.js.map +0 -1
  43. package/lib/upload-component-folder.d.ts +0 -3
  44. package/lib/upload-component-folder.js +0 -131
  45. package/lib/upload-component-folder.js.map +0 -1
  46. package/src/component-dev-folder-structures.spec.ts +0 -69
  47. package/src/component-dev.spec.ts +0 -59
  48. package/src/component-dev.ts +0 -60
  49. package/src/integration-tests/__components__/big-package/manifest.json +0 -36
  50. package/src/integration-tests/__components__/big-package/render-json.js +0 -5
  51. package/src/integration-tests/__components__/cmp-static-file-test/main.js +0 -10
  52. package/src/integration-tests/__components__/cmp-static-file-test/manifest.json +0 -42
  53. package/src/integration-tests/__components__/cmp-static-file-test/public/static-library-file.js +0 -1
  54. package/src/integration-tests/__components__/invalid-manifest/main.js +0 -7
  55. package/src/integration-tests/__components__/invalid-manifest/manifest.json +0 -29
  56. package/src/integration-tests/__components__/invalid-upload/main.js +0 -7
  57. package/src/integration-tests/helper.ts +0 -79
  58. package/src/integration-tests/service-deployment.spec.ts +0 -45
  59. package/src/integration-tests/test-setup.ts +0 -1
  60. package/src/integration-tests/upload-and-render-component.spec.ts +0 -173
  61. package/src/upload-component-folder.ts +0 -145
package/jest.config.ts CHANGED
@@ -1,19 +1,11 @@
1
- import type { Config } from 'jest';
2
- import path from 'path';
3
-
4
- process.env.DATA_MOUNT_POINT = path.join(__dirname, '..', '..', 'test-components');
1
+ import type { Config } from '@jest/types';
5
2
 
6
3
  // Sync object
7
- const config: Config = {
4
+ const config: Config.InitialOptions = {
8
5
  preset: 'ts-jest',
9
6
  testEnvironment: 'node',
10
- testPathIgnorePatterns: ['<rootDir>/lib/', '<rootDir>/src/integration-tests', '<rootDir>/src/test.ts'],
7
+ testPathIgnorePatterns: ['<rootDir>/lib/'],
11
8
  maxWorkers: '80%',
12
- globals: {
13
- 'ts-jest': {
14
- tsconfig: 'tsconfig.json',
15
- },
16
- },
17
9
  };
18
10
 
19
11
  export default config;
package/lib/index.d.ts CHANGED
@@ -1,2 +1 @@
1
- export { uploadComponentFolder } from './upload-component-folder';
2
- export { startDevelopmentRender } from './component-dev';
1
+ export declare function uploadComponentFolder(folderPath: string, componentServiceManagementUrl: string): Promise<void>;
package/lib/index.js CHANGED
@@ -1,8 +1,82 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.startDevelopmentRender = exports.uploadComponentFolder = void 0;
4
- var upload_component_folder_1 = require("./upload-component-folder");
5
- Object.defineProperty(exports, "uploadComponentFolder", { enumerable: true, get: function () { return upload_component_folder_1.uploadComponentFolder; } });
6
- var component_dev_1 = require("./component-dev");
7
- Object.defineProperty(exports, "startDevelopmentRender", { enumerable: true, get: function () { return component_dev_1.startDevelopmentRender; } });
6
+ exports.uploadComponentFolder = void 0;
7
+ const zipDirectory_1 = require("./utils/zipDirectory");
8
+ const virus_scanner_lib_1 = require("@squiz/virus-scanner-lib");
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const axios_1 = require("axios");
12
+ async function uploadComponentFolder(folderPath, componentServiceManagementUrl) {
13
+ const tmpDir = path_1.default.resolve(fs_1.default.mkdtempSync('cmp-upload'));
14
+ try {
15
+ const axios = new axios_1.Axios({
16
+ baseURL: componentServiceManagementUrl,
17
+ headers: {
18
+ accept: 'application/json',
19
+ },
20
+ });
21
+ const zip = await (0, zipDirectory_1.zipDirectory)(folderPath, tmpDir);
22
+ const initialUpload = await handleResponse(axios.post('upload-component'));
23
+ await (0, virus_scanner_lib_1.uploadFile)(initialUpload, zip);
24
+ await watchAndWaitForUploadAndScanComplete(initialUpload.id, axios);
25
+ const result = await handleResponse(axios.post('upload-component/next/' + initialUpload.id));
26
+ if (result.status === 'Success') {
27
+ console.log('Success');
28
+ }
29
+ }
30
+ catch (e) {
31
+ if (e instanceof Error) {
32
+ console.log(e.stack);
33
+ console.error(e.message);
34
+ }
35
+ else {
36
+ throw e;
37
+ }
38
+ }
39
+ finally {
40
+ fs_1.default.rmSync(tmpDir, { force: true, recursive: true });
41
+ }
42
+ }
43
+ exports.uploadComponentFolder = uploadComponentFolder;
44
+ async function watchAndWaitForUploadAndScanComplete(id, axios) {
45
+ return new Promise((resolve, reject) => {
46
+ setTimeout(async () => {
47
+ const req = await handleResponse(axios.get('upload-component/status/' + id));
48
+ if (req.status == 'Success') {
49
+ resolve();
50
+ return;
51
+ }
52
+ if (req.status == 'Flagged') {
53
+ reject(new Error('upload has been flagged as a virus'));
54
+ return;
55
+ }
56
+ if (req.status == 'Error') {
57
+ reject(new Error('there has been an error'));
58
+ return;
59
+ }
60
+ watchAndWaitForUploadAndScanComplete(id, axios);
61
+ }, 1000);
62
+ });
63
+ }
64
+ async function handleResponse(promise) {
65
+ try {
66
+ const result = await promise;
67
+ if (result.status > 299 || result.status < 200) {
68
+ throw new Error(`Unexpected response code ${result.status}`);
69
+ }
70
+ if (result.headers['content-type'].includes('application/json') && typeof result.data == 'string') {
71
+ return JSON.parse(result.data);
72
+ }
73
+ return result.data;
74
+ }
75
+ catch (error) {
76
+ if (typeof error == 'object' && error.isAxiosError) {
77
+ throw new Error(`Error received after making request ${error === null || error === void 0 ? void 0 : error.message}`);
78
+ }
79
+ throw error;
80
+ }
81
+ }
8
82
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAC9B,iDAAyD;AAAhD,uHAAA,sBAAsB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/lib/test.js ADDED
@@ -0,0 +1,12 @@
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
+ const _1 = require(".");
7
+ const dotenv_1 = require("dotenv");
8
+ const path_1 = __importDefault(require("path"));
9
+ (0, dotenv_1.config)();
10
+ const dir = path_1.default.resolve(process.argv[2]);
11
+ (0, _1.uploadComponentFolder)(dir, process.env.COMPONENT_MANAGEMENT_URL);
12
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":";;;;;AAAA,wBAA0C;AAC1C,mCAAgC;AAChC,gDAAwB;AAExB,IAAA,eAAM,GAAE,CAAC;AAET,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1C,IAAA,wBAAqB,EAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAyB,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function zipDirectory(sourceDirectory: string, outputDirectory: string): Promise<string>;
@@ -0,0 +1,32 @@
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
+ exports.zipDirectory = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const archiver_1 = __importDefault(require("archiver"));
10
+ function zipDirectory(sourceDirectory, outputDirectory) {
11
+ return new Promise((resolve, reject) => {
12
+ const outputZipFile = path_1.default.join(outputDirectory, '/export.zip');
13
+ const output = fs_1.default.createWriteStream(outputZipFile);
14
+ const archive = (0, archiver_1.default)('zip', {
15
+ zlib: { level: 9 }, // Sets the compression level.
16
+ });
17
+ output.on('close', function () {
18
+ resolve(outputZipFile);
19
+ });
20
+ archive.on('warning', function (err) {
21
+ reject(err);
22
+ });
23
+ archive.on('error', function (err) {
24
+ reject(err);
25
+ });
26
+ archive.pipe(output);
27
+ archive.directory(sourceDirectory, false);
28
+ archive.finalize();
29
+ });
30
+ }
31
+ exports.zipDirectory = zipDirectory;
32
+ //# sourceMappingURL=zipDirectory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zipDirectory.js","sourceRoot":"","sources":["../../src/utils/zipDirectory.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,4CAAoB;AAEpB,wDAAgC;AAEhC,SAAgB,YAAY,CAAC,eAAuB,EAAE,eAAuB;IAC3E,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7C,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,YAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAEnD,MAAM,OAAO,GAAG,IAAA,kBAAQ,EAAC,KAAK,EAAE;YAC9B,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,8BAA8B;SACnD,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE;YACjB,OAAO,CAAC,aAAa,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,GAAG;YACjC,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,GAAG;YAC/B,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,CAAC,SAAS,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,CAAC,QAAQ,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAzBD,oCAyBC"}
package/package.json CHANGED
@@ -1,41 +1,35 @@
1
1
  {
2
2
  "name": "@squiz/component-cli-lib",
3
- "version": "1.2.1-alpha.107",
3
+ "version": "1.2.1-alpha.18",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
7
+ "start": "node ./lib/index.js",
7
8
  "compile": "tsc",
8
9
  "lint": "eslint ./src --ext .ts",
9
- "test": "jest -c jest.config.ts",
10
- "test:integration": "jest -c jest.integration.config.ts",
10
+ "test": "echo \"No unit tests, to be tested in integration tests\"",
11
11
  "clean": "rimraf \".tsbuildinfo\" \"./lib\""
12
12
  },
13
13
  "author": "",
14
14
  "license": "ISC",
15
15
  "devDependencies": {
16
- "@types/cli-color": "2.0.2",
16
+ "@jest/types": "27.5.1",
17
+ "@types/archiver": "^5.3.1",
17
18
  "@types/express": "4.17.13",
18
- "@types/jest": "28.1.8",
19
+ "@types/jest": "27.4.1",
19
20
  "@types/node": "17.0.27",
20
- "@types/supertest": "2.0.12",
21
- "dotenv": "16.0.1",
22
- "eslint": "8.22.0",
23
- "jest": "28.1.3",
24
- "ts-jest": "28.0.8",
25
- "ts-loader": "9.3.1",
26
- "ts-node": "10.9.1",
27
- "typescript": "4.7.4"
21
+ "dotenv": "^16.0.0",
22
+ "eslint": "8.13.0",
23
+ "jest": "27.5.1",
24
+ "ts-jest": "27.1.4",
25
+ "ts-loader": "9.2.8",
26
+ "ts-node": "10.7.0",
27
+ "typescript": "4.6.3"
28
28
  },
29
29
  "dependencies": {
30
- "@squiz/component-lib": "^1.2.1-alpha.107",
31
- "@squiz/dx-common-lib": "^1.2.1-alpha.107",
32
- "@squiz/dx-logger-lib": "^1.2.1-alpha.107",
33
- "@squiz/render-runtime-lib": "^1.2.1-alpha.107",
34
- "@squiz/virus-scanner-lib": "^1.2.1-alpha.107",
30
+ "@squiz/virus-scanner-lib": "^1.2.1-alpha.18",
35
31
  "archiver": "5.3.1",
36
- "axios": "0.27.2",
37
- "cli-color": "^2.0.2",
38
- "supertest": "^6.2.3"
32
+ "axios": "0.27.2"
39
33
  },
40
- "gitHead": "dc09e24c89b0f6d6afd23e958523cf9c9add89ec"
34
+ "gitHead": "c95a3237ebd214ca179bdb881a509dbd94f7514c"
41
35
  }
package/src/index.ts CHANGED
@@ -1,2 +1,90 @@
1
- export { uploadComponentFolder } from './upload-component-folder';
2
- export { startDevelopmentRender } from './component-dev';
1
+ import { zipDirectory } from './utils/zipDirectory';
2
+ import { uploadFile } from '@squiz/virus-scanner-lib';
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import { Axios, AxiosResponse } from 'axios';
6
+ import { ScanStatus } from 'packages/virus-scanner-lib/src/generated';
7
+
8
+ export async function uploadComponentFolder(folderPath: string, componentServiceManagementUrl: string): Promise<void> {
9
+ const tmpDir = path.resolve(fs.mkdtempSync('cmp-upload'));
10
+
11
+ try {
12
+ const axios = new Axios({
13
+ baseURL: componentServiceManagementUrl,
14
+ headers: {
15
+ accept: 'application/json',
16
+ },
17
+ });
18
+
19
+ const zip = await zipDirectory(folderPath, tmpDir);
20
+
21
+ const initialUpload = await handleResponse<any>(axios.post('upload-component'));
22
+
23
+ await uploadFile(initialUpload, zip);
24
+
25
+ await watchAndWaitForUploadAndScanComplete(initialUpload.id, axios);
26
+
27
+ const result = await handleResponse<any>(axios.post('upload-component/next/' + initialUpload.id));
28
+
29
+ if (result.status === 'Success') {
30
+ console.log('Success');
31
+ }
32
+ } catch (e) {
33
+ if (e instanceof Error) {
34
+ console.log(e.stack);
35
+ console.error(e.message);
36
+ } else {
37
+ throw e;
38
+ }
39
+ } finally {
40
+ fs.rmSync(tmpDir, { force: true, recursive: true });
41
+ }
42
+ }
43
+
44
+ async function watchAndWaitForUploadAndScanComplete(id: string, axios: Axios): Promise<void> {
45
+ return new Promise((resolve, reject) => {
46
+ setTimeout(async () => {
47
+ const req = await handleResponse<ScanStatus>(axios.get('upload-component/status/' + id));
48
+
49
+ if (req.status == 'Success') {
50
+ resolve();
51
+ return;
52
+ }
53
+
54
+ if (req.status == 'Flagged') {
55
+ reject(new Error('upload has been flagged as a virus'));
56
+
57
+ return;
58
+ }
59
+
60
+ if (req.status == 'Error') {
61
+ reject(new Error('there has been an error'));
62
+ return;
63
+ }
64
+
65
+ watchAndWaitForUploadAndScanComplete(id, axios);
66
+ }, 1000);
67
+ });
68
+ }
69
+
70
+ async function handleResponse<T>(promise: Promise<AxiosResponse<T>>): Promise<T> {
71
+ try {
72
+ const result = await promise;
73
+
74
+ if (result.status > 299 || result.status < 200) {
75
+ throw new Error(`Unexpected response code ${result.status}`);
76
+ }
77
+
78
+ if (result.headers['content-type'].includes('application/json') && typeof result.data == 'string') {
79
+ return JSON.parse(result.data);
80
+ }
81
+
82
+ return result.data;
83
+ } catch (error: any) {
84
+ if (typeof error == 'object' && error.isAxiosError) {
85
+ throw new Error(`Error received after making request ${error?.message}`);
86
+ }
87
+
88
+ throw error;
89
+ }
90
+ }
package/src/test.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { uploadComponentFolder } from '.';
2
+ import { config } from 'dotenv';
3
+ import path from 'path';
4
+
5
+ config();
6
+
7
+ const dir = path.resolve(process.argv[2]);
8
+
9
+ uploadComponentFolder(dir, process.env.COMPONENT_MANAGEMENT_URL!);
@@ -0,0 +1,31 @@
1
+ import path from 'path';
2
+ import fs from 'fs';
3
+
4
+ import archiver from 'archiver';
5
+
6
+ export function zipDirectory(sourceDirectory: string, outputDirectory: string) {
7
+ return new Promise<string>((resolve, reject) => {
8
+ const outputZipFile = path.join(outputDirectory, '/export.zip');
9
+ const output = fs.createWriteStream(outputZipFile);
10
+
11
+ const archive = archiver('zip', {
12
+ zlib: { level: 9 }, // Sets the compression level.
13
+ });
14
+
15
+ output.on('close', function () {
16
+ resolve(outputZipFile);
17
+ });
18
+
19
+ archive.on('warning', function (err) {
20
+ reject(err);
21
+ });
22
+
23
+ archive.on('error', function (err) {
24
+ reject(err);
25
+ });
26
+
27
+ archive.pipe(output);
28
+ archive.directory(sourceDirectory, false);
29
+ archive.finalize();
30
+ });
31
+ }
package/tsconfig.json CHANGED
@@ -9,12 +9,7 @@
9
9
  "sourceMap": true
10
10
  },
11
11
 
12
- "references": [
13
- { "path": "../virus-scanner-lib" },
14
- { "path": "../component-lib" },
15
- { "path": "../render-runtime-lib" },
16
- { "path": "../dx-logger-lib" }
17
- ],
12
+ "references": [{ "path": "../virus-scanner-lib" }],
18
13
 
19
14
  "include": ["src/**/*.ts", "src/**/*.json"],
20
15
  "exclude": ["jest.config.ts"]