@anmiles/google-api-wrapper 17.0.8 → 18.0.0
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/.eslintignore +2 -0
- package/.eslintrc.js +23 -7
- package/.vscode/settings.json +1 -0
- package/CHANGELOG.md +10 -0
- package/README.md +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +16 -16
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +9 -7
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/auth.d.ts +3 -3
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +1 -1
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/paths.d.ts +5 -5
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +1 -1
- package/dist/lib/paths.js.map +1 -1
- package/dist/lib/profiles.d.ts +4 -4
- package/dist/lib/profiles.d.ts.map +1 -1
- package/dist/lib/profiles.js +4 -4
- package/dist/lib/profiles.js.map +1 -1
- package/dist/lib/renderer.d.ts +2 -2
- package/dist/lib/renderer.d.ts.map +1 -1
- package/dist/lib/renderer.js +1 -1
- package/dist/lib/renderer.js.map +1 -1
- package/dist/lib/secrets.d.ts +14 -13
- package/dist/lib/secrets.d.ts.map +1 -1
- package/dist/lib/secrets.js +13 -12
- package/dist/lib/secrets.js.map +1 -1
- package/dist/types/options.d.ts +9 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/{common.js → options.js} +1 -1
- package/dist/types/options.js.map +1 -0
- package/dist/types/secrets.d.ts +2 -5
- package/dist/types/secrets.d.ts.map +1 -1
- package/jest.config.js +3 -11
- package/package.json +63 -55
- package/src/index.ts +2 -0
- package/src/lib/__tests__/api.test.ts +30 -24
- package/src/lib/__tests__/auth.test.ts +4 -5
- package/src/lib/__tests__/paths.test.ts +6 -5
- package/src/lib/__tests__/profiles.test.ts +17 -27
- package/src/lib/__tests__/renderer.test.ts +7 -7
- package/src/lib/__tests__/secrets.test.ts +54 -77
- package/src/lib/api.ts +36 -26
- package/src/lib/auth.ts +5 -5
- package/src/lib/paths.ts +8 -8
- package/src/lib/profiles.ts +6 -6
- package/src/lib/renderer.ts +8 -9
- package/src/lib/secrets.ts +22 -19
- package/src/types/options.ts +10 -0
- package/src/types/secrets.ts +9 -13
- package/tsconfig.build.json +2 -2
- package/tsconfig.json +5 -5
- package/tsconfig.test.json +3 -3
- package/.gitlab-ci.yml +0 -117
- package/dist/types/common.d.ts +0 -4
- package/dist/types/common.d.ts.map +0 -1
- package/dist/types/common.js.map +0 -1
- package/dist/types/index.d.ts +0 -3
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -19
- package/dist/types/index.js.map +0 -1
- package/src/types/common.ts +0 -3
- package/src/types/index.ts +0 -2
package/dist/lib/secrets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/lib/secrets.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,qCAA+B;AAC/B,oEAA2C;AAE3C,4CAAuC;
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/lib/secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/types/options.ts"],"names":[],"mappings":"AAAA,UAAU,aAAa;IACtB,YAAY,CAAC,EAAG,OAAO,CAAC;CACxB;AAED,UAAU,WAAW;IACpB,SAAS,CAAC,EAAG,OAAO,CAAC;IACrB,MAAM,CAAC,EAAM,MAAM,EAAE,CAAC;CACtB;AAED,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/types/options.ts"],"names":[],"mappings":""}
|
package/dist/types/secrets.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
interface Secrets {
|
|
2
2
|
web: {
|
|
3
3
|
client_id: `${string}.apps.googleusercontent.com`;
|
|
4
4
|
project_id: string;
|
|
@@ -9,8 +9,5 @@ export interface Secrets {
|
|
|
9
9
|
redirect_uris: string[];
|
|
10
10
|
};
|
|
11
11
|
}
|
|
12
|
-
export
|
|
13
|
-
temporary?: boolean;
|
|
14
|
-
scopes?: string[];
|
|
15
|
-
}
|
|
12
|
+
export type { Secrets };
|
|
16
13
|
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/types/secrets.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/types/secrets.ts"],"names":[],"mappings":"AAAA,UAAU,OAAO;IAChB,GAAG,EAAE;QACJ,SAAS,EAAqB,GAAG,MAAM,6BAA6B,CAAC;QACrE,UAAU,EAAoB,MAAM,CAAC;QACrC,QAAQ,EAAsB,2CAA2C,CAAC;QAC1E,SAAS,EAAqB,qCAAqC,CAAC;QACpE,2BAA2B,EAAG,4CAA4C,CAAC;QAC3E,aAAa,EAAiB,MAAM,CAAC;QACrC,aAAa,EAAiB,MAAM,EAAE,CAAC;KACvC,CAAC;CACF;AAED,YAAY,EAAE,OAAO,EAAE,CAAC"}
|
package/jest.config.js
CHANGED
|
@@ -10,18 +10,10 @@ module.exports = {
|
|
|
10
10
|
clearMocks : true,
|
|
11
11
|
|
|
12
12
|
roots : [ '<rootDir>/src' ],
|
|
13
|
-
testMatch : [ '<rootDir>/src/**/__tests__/*.test.ts' ],
|
|
13
|
+
testMatch : [ '<rootDir>/src/**/__tests__/*.test.{ts,tsx}' ],
|
|
14
14
|
|
|
15
15
|
collectCoverageFrom : [
|
|
16
|
-
'<rootDir>/src/**/*.ts',
|
|
17
|
-
'!<rootDir>/src
|
|
18
|
-
'!<rootDir>/src/*.ts',
|
|
19
|
-
'!<rootDir>/src/types/*.ts',
|
|
20
|
-
|
|
21
|
-
'!**/node_modules/**',
|
|
22
|
-
'!**/__tests__/**',
|
|
23
|
-
|
|
24
|
-
'!<rootDir>/coverage/**',
|
|
25
|
-
'!<rootDir>/dist/**',
|
|
16
|
+
'<rootDir>/src/**/*.{ts,tsx}',
|
|
17
|
+
'!<rootDir>/src/**/__tests__/**',
|
|
26
18
|
],
|
|
27
19
|
};
|
package/package.json
CHANGED
|
@@ -1,57 +1,65 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
2
|
+
"name": "@anmiles/google-api-wrapper",
|
|
3
|
+
"version": "18.0.0",
|
|
4
|
+
"description": "Wrapper around googleapis for getting data shortly",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"google",
|
|
7
|
+
"api",
|
|
8
|
+
"auth"
|
|
9
|
+
],
|
|
10
|
+
"author": "Anatoliy Oblaukhov",
|
|
11
|
+
"homepage": "https://github.com/anmiles/google-api-wrapper",
|
|
12
|
+
"repository": "github:anmiles/google-api-wrapper",
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=18.18.0"
|
|
16
|
+
},
|
|
17
|
+
"main": "dist/index.js",
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "rimraf dist && tsc -p ./tsconfig.build.json && copyfiles -u 1 src/templates/* dist/",
|
|
20
|
+
"build:ci": "tsc -noEmit -p ./tsconfig.build.json",
|
|
21
|
+
"lint": "eslint .",
|
|
22
|
+
"lint:fix": "npm run lint -- --fix",
|
|
23
|
+
"test": "jest --verbose",
|
|
24
|
+
"test:coverage": "npm test -- --coverage",
|
|
25
|
+
"test:ci": "npm test -- --ci --coverage",
|
|
26
|
+
"test:watch": "npm test -- --watch",
|
|
27
|
+
"test:watch:coverage": "npm test -- --watch --coverage",
|
|
28
|
+
"test:report:coverage": "nyc report --nycrc-path ./coverage.config.js -t ./coverage --report-dir ./coverage"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@anmiles/logger": "^7.0.1",
|
|
32
|
+
"@anmiles/prototypes": "^10.0.1",
|
|
33
|
+
"@anmiles/sleep": "^4.0.0",
|
|
34
|
+
"out-url": "^1.2.2",
|
|
35
|
+
"server-destroy": "^1.0.1"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"googleapis": "^130.0.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@anmiles/eslint-config": "^7.0.1",
|
|
42
|
+
"@anmiles/tsconfig": "^2.0.1",
|
|
43
|
+
"@stylistic/eslint-plugin": "^1.7.0",
|
|
44
|
+
"@types/event-emitter": "^0.3.5",
|
|
45
|
+
"@types/jest": "^29.5.12",
|
|
46
|
+
"@types/server-destroy": "^1.0.3",
|
|
47
|
+
"@typescript-eslint/eslint-plugin": "^7.2.0",
|
|
48
|
+
"@typescript-eslint/parser": "^7.2.0",
|
|
49
|
+
"copyfiles": "^2.4.1",
|
|
50
|
+
"eslint": "^8.57.0",
|
|
51
|
+
"eslint-import-resolver-typescript": "^3.6.1",
|
|
52
|
+
"eslint-plugin-align-assignments": "^1.1.2",
|
|
53
|
+
"eslint-plugin-import": "^2.29.1",
|
|
54
|
+
"eslint-plugin-jest": "^27.9.0",
|
|
55
|
+
"eslint-plugin-jsonc": "^2.13.0",
|
|
56
|
+
"eslint-plugin-n": "^16.6.2",
|
|
57
|
+
"eslint-plugin-promise": "^6.1.1",
|
|
58
|
+
"event-emitter": "^0.3.5",
|
|
59
|
+
"jest": "^29.7.0",
|
|
60
|
+
"nyc": "^15.1.0",
|
|
61
|
+
"rimraf": "^5.0.5",
|
|
62
|
+
"ts-jest": "^29.1.2",
|
|
63
|
+
"typescript": "^5.4.2"
|
|
64
|
+
}
|
|
57
65
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
1
|
+
import type GoogleApis from 'googleapis';
|
|
2
|
+
import type { calendar_v3 } from 'googleapis/build/src/apis/calendar';
|
|
3
|
+
import { calendar } from 'googleapis/build/src/apis/calendar';
|
|
3
4
|
import logger from '@anmiles/logger';
|
|
4
5
|
import sleep from '@anmiles/sleep';
|
|
5
6
|
import auth from '../auth';
|
|
6
7
|
import secrets from '../secrets';
|
|
8
|
+
import type { CommonResponse } from '../api';
|
|
7
9
|
import api from '../api';
|
|
8
10
|
|
|
9
|
-
const items: Array<{ data: string}> = [
|
|
11
|
+
const items: Array<{ data : string }> = [
|
|
10
12
|
{ data : 'first' },
|
|
11
13
|
{ data : 'second' },
|
|
12
14
|
{ data : 'third' },
|
|
@@ -25,8 +27,11 @@ const pageTokens = [
|
|
|
25
27
|
'token2',
|
|
26
28
|
];
|
|
27
29
|
|
|
28
|
-
const getAPI = <T>(items: Array<Array<T> | null>, pageTokens: Array<string | undefined>)
|
|
29
|
-
list
|
|
30
|
+
const getAPI = <T>(items: Array<Array<T> | null>, pageTokens: Array<string | undefined>): {
|
|
31
|
+
list : jest.Mock;
|
|
32
|
+
update : jest.Mock;
|
|
33
|
+
} => ({
|
|
34
|
+
list : jest.fn().mockImplementation(({ pageToken }: { pageToken? : string }): Pick<GoogleApis.Common.GaxiosResponse<CommonResponse<unknown>>, 'data'> => {
|
|
30
35
|
const listException = getListException();
|
|
31
36
|
|
|
32
37
|
if (listException) {
|
|
@@ -37,10 +42,12 @@ const getAPI = <T>(items: Array<Array<T> | null>, pageTokens: Array<string | und
|
|
|
37
42
|
|
|
38
43
|
return {
|
|
39
44
|
data : {
|
|
40
|
-
items : items[index]
|
|
45
|
+
items : items[index]!,
|
|
41
46
|
nextPageToken : pageTokens[index + 1],
|
|
42
|
-
pageInfo :
|
|
43
|
-
totalResults : items
|
|
47
|
+
pageInfo : {
|
|
48
|
+
totalResults : !items[index]
|
|
49
|
+
? null
|
|
50
|
+
: items.reduce((sum, list) => sum + (list?.length ?? 0), 0),
|
|
44
51
|
},
|
|
45
52
|
},
|
|
46
53
|
};
|
|
@@ -48,7 +55,7 @@ const getAPI = <T>(items: Array<Array<T> | null>, pageTokens: Array<string | und
|
|
|
48
55
|
update : jest.fn(),
|
|
49
56
|
});
|
|
50
57
|
|
|
51
|
-
const
|
|
58
|
+
const params = { key : 'value' };
|
|
52
59
|
|
|
53
60
|
const profile = 'username1';
|
|
54
61
|
const apis = {
|
|
@@ -59,13 +66,13 @@ const googleAuth = 'googleAuth';
|
|
|
59
66
|
|
|
60
67
|
const scopes = [ 'scope1', 'scope2' ];
|
|
61
68
|
|
|
62
|
-
const getListException
|
|
69
|
+
const getListException = jest.fn() as jest.Mock<Error | undefined>;
|
|
63
70
|
|
|
64
71
|
beforeEach(() => {
|
|
65
72
|
getListException.mockReturnValue(undefined);
|
|
66
73
|
});
|
|
67
74
|
|
|
68
|
-
jest.mock<{ calendar: typeof calendar }>('googleapis/build/src/apis/calendar', () => ({
|
|
75
|
+
jest.mock<{ calendar : typeof calendar }>('googleapis/build/src/apis/calendar', () => ({
|
|
69
76
|
calendar : jest.fn().mockImplementation(() => apis),
|
|
70
77
|
}));
|
|
71
78
|
|
|
@@ -101,7 +108,7 @@ describe('src/lib/api', () => {
|
|
|
101
108
|
it('should warn when creating permanent credentials using non-readonly scopes', async () => {
|
|
102
109
|
await api.getAPI((auth) => calendar({ version : 'v3', auth }), profile, { scopes });
|
|
103
110
|
|
|
104
|
-
expect(logger.warn).toHaveBeenCalledWith('WARNING: trying to create permanent credentials using non-readonly scopes (scope1,scope2). Permanent credentials will be stored in the file and potentially might be re-used to modify your data');
|
|
111
|
+
expect(logger.warn).toHaveBeenCalledWith('WARNING: trying to create permanent credentials using non-readonly scopes (scope1, scope2). Permanent credentials will be stored in the file and potentially might be re-used to modify your data');
|
|
105
112
|
});
|
|
106
113
|
|
|
107
114
|
it('should not warn when creating temporary credentials using non-readonly scopes', async () => {
|
|
@@ -118,7 +125,6 @@ describe('src/lib/api', () => {
|
|
|
118
125
|
});
|
|
119
126
|
|
|
120
127
|
describe('API', () => {
|
|
121
|
-
// eslint-disable-next-line camelcase
|
|
122
128
|
let instance: InstanceType<typeof api.API<calendar_v3.Calendar>>;
|
|
123
129
|
|
|
124
130
|
beforeEach(async () => {
|
|
@@ -127,15 +133,15 @@ describe('src/lib/api', () => {
|
|
|
127
133
|
|
|
128
134
|
describe('getItems', () => {
|
|
129
135
|
it('should call API list method for each page', async () => {
|
|
130
|
-
await instance.getItems((api) => api.calendarList,
|
|
136
|
+
await instance.getItems((api) => api.calendarList, params);
|
|
131
137
|
|
|
132
138
|
pageTokens.forEach((pageToken) => {
|
|
133
|
-
expect(apis.calendarList.list).toHaveBeenCalledWith({ ...
|
|
139
|
+
expect(apis.calendarList.list).toHaveBeenCalledWith({ ...params, pageToken });
|
|
134
140
|
});
|
|
135
141
|
});
|
|
136
142
|
|
|
137
143
|
it('should output progress by default', async () => {
|
|
138
|
-
await instance.getItems((api) => api.calendarList,
|
|
144
|
+
await instance.getItems((api) => api.calendarList, params);
|
|
139
145
|
|
|
140
146
|
expect(logger.log).toHaveBeenCalledTimes(response.length);
|
|
141
147
|
expect(logger.log).toHaveBeenCalledWith('Getting items (2 of 4)...');
|
|
@@ -144,13 +150,13 @@ describe('src/lib/api', () => {
|
|
|
144
150
|
});
|
|
145
151
|
|
|
146
152
|
it('should not output progress if hidden', async () => {
|
|
147
|
-
await instance.getItems((api) => api.calendarList,
|
|
153
|
+
await instance.getItems((api) => api.calendarList, params, { hideProgress : true });
|
|
148
154
|
|
|
149
155
|
expect(logger.log).not.toHaveBeenCalled();
|
|
150
156
|
});
|
|
151
157
|
|
|
152
158
|
it('should sleep after reach request', async () => {
|
|
153
|
-
await instance.getItems((api) => api.calendarList,
|
|
159
|
+
await instance.getItems((api) => api.calendarList, params);
|
|
154
160
|
|
|
155
161
|
expect(sleep).toHaveBeenCalledTimes(response.length);
|
|
156
162
|
expect(sleep).toHaveBeenCalledWith(300);
|
|
@@ -160,7 +166,7 @@ describe('src/lib/api', () => {
|
|
|
160
166
|
const getAuthSpy = jest.spyOn(auth, 'getAuth');
|
|
161
167
|
const getItemsSpy = jest.spyOn(instance, 'getItems');
|
|
162
168
|
|
|
163
|
-
await instance.getItems((api) => api.calendarList,
|
|
169
|
+
await instance.getItems((api) => api.calendarList, params);
|
|
164
170
|
|
|
165
171
|
expect(getAuthSpy).toHaveBeenCalledTimes(1);
|
|
166
172
|
expect(getItemsSpy).toHaveBeenCalledTimes(1);
|
|
@@ -177,7 +183,7 @@ describe('src/lib/api', () => {
|
|
|
177
183
|
getAuthSpy.mockClear();
|
|
178
184
|
getItemsSpy.mockClear();
|
|
179
185
|
|
|
180
|
-
await instance.getItems((api) => api.calendarList,
|
|
186
|
+
await instance.getItems((api) => api.calendarList, params);
|
|
181
187
|
|
|
182
188
|
expect(logger.warn).toHaveBeenCalledWith('Access token stored is invalid, re-creating...');
|
|
183
189
|
expect(secrets.deleteCredentials).toHaveBeenCalledWith(profile);
|
|
@@ -193,18 +199,18 @@ describe('src/lib/api', () => {
|
|
|
193
199
|
getListException.mockReturnValueOnce(error);
|
|
194
200
|
|
|
195
201
|
const instance = await api.getAPI((auth) => calendar({ version : 'v3', auth }), profile, { temporary : true });
|
|
196
|
-
await expect(instance.getItems((api) => api.calendarList,
|
|
202
|
+
await expect(instance.getItems((api) => api.calendarList, params)).rejects.toEqual(error);
|
|
197
203
|
}
|
|
198
204
|
});
|
|
199
205
|
|
|
200
206
|
it('should re-throw API exception if not invalid_grant or Invalid credentials', async () => {
|
|
201
207
|
const error = new Error('random exception');
|
|
202
208
|
getListException.mockReturnValueOnce(error);
|
|
203
|
-
await expect(instance.getItems((api) => api.calendarList,
|
|
209
|
+
await expect(instance.getItems((api) => api.calendarList, params)).rejects.toEqual(error);
|
|
204
210
|
});
|
|
205
211
|
|
|
206
212
|
it('should return items data', async () => {
|
|
207
|
-
const items = await instance.getItems((api) => api.calendarList,
|
|
213
|
+
const items = await instance.getItems((api) => api.calendarList, params);
|
|
208
214
|
|
|
209
215
|
expect(items).toEqual(items);
|
|
210
216
|
});
|
|
@@ -212,7 +218,7 @@ describe('src/lib/api', () => {
|
|
|
212
218
|
it('should throw if api was not initialized before getting items', async () => {
|
|
213
219
|
instance = new api.API((auth) => calendar({ version : 'v3', auth }), profile);
|
|
214
220
|
|
|
215
|
-
await expect(() => instance.getItems((api) => api.calendarList,
|
|
221
|
+
await expect(async () => instance.getItems((api) => api.calendarList, params)).rejects.toEqual(new Error('API is not initialized. Call `init` before getting items.'));
|
|
216
222
|
});
|
|
217
223
|
});
|
|
218
224
|
});
|
|
@@ -5,10 +5,11 @@ import profiles from '../profiles';
|
|
|
5
5
|
import secrets from '../secrets';
|
|
6
6
|
|
|
7
7
|
import auth from '../auth';
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
const original = jest.requireActual<{ default : typeof auth }>('../auth').default;
|
|
9
10
|
jest.mock<typeof auth>('../auth', () => ({
|
|
10
11
|
login : jest.fn(),
|
|
11
|
-
getAuth : jest.fn().mockImplementation(
|
|
12
|
+
getAuth : jest.fn().mockImplementation(() => googleAuth),
|
|
12
13
|
}));
|
|
13
14
|
|
|
14
15
|
jest.mock<Partial<typeof logger>>('@anmiles/logger', () => ({
|
|
@@ -22,7 +23,7 @@ jest.mock<Partial<typeof profiles>>('../profiles', () => ({
|
|
|
22
23
|
|
|
23
24
|
jest.mock<Partial<typeof secrets>>('../secrets', () => ({
|
|
24
25
|
getSecrets : jest.fn().mockImplementation(() => secretsObject),
|
|
25
|
-
getCredentials : jest.fn().mockImplementation(
|
|
26
|
+
getCredentials : jest.fn().mockImplementation(() => credentials),
|
|
26
27
|
}));
|
|
27
28
|
|
|
28
29
|
jest.mock('googleapis', () => ({
|
|
@@ -44,11 +45,9 @@ const googleAuth = {
|
|
|
44
45
|
|
|
45
46
|
const secretsObject = {
|
|
46
47
|
web : {
|
|
47
|
-
/* eslint-disable camelcase */
|
|
48
48
|
client_id : 'client_id',
|
|
49
49
|
client_secret : 'client_secret',
|
|
50
50
|
redirect_uris : [ 'redirect_uri' ],
|
|
51
|
-
/* eslint-enable camelcase */
|
|
52
51
|
},
|
|
53
52
|
};
|
|
54
53
|
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
1
|
+
import type fs from 'fs';
|
|
2
|
+
import type path from 'path';
|
|
3
3
|
|
|
4
|
-
import paths from '../paths';
|
|
5
|
-
|
|
4
|
+
import type paths from '../paths';
|
|
5
|
+
|
|
6
|
+
const original = jest.requireActual<{ default : typeof paths }>('../paths').default;
|
|
6
7
|
jest.mock<typeof paths>('../paths', () => ({
|
|
7
8
|
getProfilesFile : jest.fn().mockImplementation(() => profilesFile),
|
|
8
9
|
getScopesFile : jest.fn().mockImplementation(() => scopesFile),
|
|
@@ -18,7 +19,7 @@ jest.mock<Partial<typeof fs>>('fs', () => ({
|
|
|
18
19
|
}));
|
|
19
20
|
|
|
20
21
|
jest.mock<Partial<typeof path>>('path', () => ({
|
|
21
|
-
join : jest.fn().mockImplementation((...args) => args.join('/')),
|
|
22
|
+
join : jest.fn().mockImplementation((...args: string[]) => args.join('/')),
|
|
22
23
|
}));
|
|
23
24
|
|
|
24
25
|
const profile = 'username';
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
|
-
import logger from '@anmiles/logger';
|
|
3
|
-
import paths from '../paths';
|
|
2
|
+
import type logger from '@anmiles/logger';
|
|
3
|
+
import type paths from '../paths';
|
|
4
4
|
|
|
5
5
|
import profiles from '../profiles';
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
const original = jest.requireActual<{ default : typeof profiles }>('../profiles').default;
|
|
7
8
|
jest.mock<typeof profiles>('../profiles', () => ({
|
|
8
9
|
getProfiles : jest.fn().mockImplementation(() => existingProfiles),
|
|
9
10
|
setProfiles : jest.fn(),
|
|
@@ -15,7 +16,7 @@ jest.mock<Partial<typeof fs>>('fs', () => ({
|
|
|
15
16
|
mkdirSync : jest.fn(),
|
|
16
17
|
renameSync : jest.fn(),
|
|
17
18
|
writeFileSync : jest.fn(),
|
|
18
|
-
existsSync : jest.fn().mockImplementation((file) => existingFiles.includes(file)),
|
|
19
|
+
existsSync : jest.fn().mockImplementation((file: string) => existingFiles.includes(file)),
|
|
19
20
|
}));
|
|
20
21
|
|
|
21
22
|
jest.mock<Partial<typeof logger>>('@anmiles/logger', () => ({
|
|
@@ -36,27 +37,14 @@ const allProfiles = [ profile1, profile2 ];
|
|
|
36
37
|
let existingProfiles: string[];
|
|
37
38
|
let existingFiles: string[] = [];
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
beforeAll(() => {
|
|
43
|
-
getJSONSpy = jest.spyOn(fs, 'getJSON');
|
|
44
|
-
writeJSONSpy = jest.spyOn(fs, 'writeJSON');
|
|
45
|
-
});
|
|
40
|
+
const getJSONSpy = jest.spyOn(fs, 'getJSON').mockImplementation(() => json);
|
|
41
|
+
const writeJSONSpy = jest.spyOn(fs, 'writeJSON').mockImplementation();
|
|
46
42
|
|
|
47
43
|
beforeEach(() => {
|
|
48
|
-
getJSONSpy.mockImplementation(() => json);
|
|
49
|
-
writeJSONSpy.mockImplementation();
|
|
50
|
-
|
|
51
44
|
existingFiles = [];
|
|
52
45
|
existingProfiles = [ 'username1', 'username2' ];
|
|
53
46
|
});
|
|
54
47
|
|
|
55
|
-
afterAll(() => {
|
|
56
|
-
getJSONSpy.mockRestore();
|
|
57
|
-
writeJSONSpy.mockRestore();
|
|
58
|
-
});
|
|
59
|
-
|
|
60
48
|
describe('src/lib/profiles', () => {
|
|
61
49
|
|
|
62
50
|
describe('getProfiles', () => {
|
|
@@ -64,15 +52,15 @@ describe('src/lib/profiles', () => {
|
|
|
64
52
|
original.getProfiles();
|
|
65
53
|
|
|
66
54
|
expect(getJSONSpy).toHaveBeenCalled();
|
|
67
|
-
expect(getJSONSpy.mock.calls[0][0]).toEqual(profilesFile);
|
|
55
|
+
expect(getJSONSpy.mock.calls[0]?.[0]).toEqual(profilesFile);
|
|
68
56
|
});
|
|
69
57
|
|
|
70
58
|
it('should fallback to empty profiles array', () => {
|
|
71
59
|
original.getProfiles();
|
|
72
60
|
|
|
73
|
-
const fallback = getJSONSpy.mock.calls[0][1];
|
|
61
|
+
const fallback = getJSONSpy.mock.calls[0]?.[1];
|
|
74
62
|
|
|
75
|
-
expect(fallback()).toEqual([]);
|
|
63
|
+
expect(fallback?.()).toEqual([]);
|
|
76
64
|
});
|
|
77
65
|
|
|
78
66
|
it('should return JSON', () => {
|
|
@@ -92,7 +80,9 @@ describe('src/lib/profiles', () => {
|
|
|
92
80
|
|
|
93
81
|
describe('createProfile', () => {
|
|
94
82
|
it('should output error and do nothing if profile is falsy', () => {
|
|
95
|
-
const func = () =>
|
|
83
|
+
const func = (): void => {
|
|
84
|
+
original.createProfile('');
|
|
85
|
+
};
|
|
96
86
|
|
|
97
87
|
expect(func).toThrow('Usage: `npm run create <profile>` where `profile` - is any profile name you want');
|
|
98
88
|
});
|
|
@@ -132,17 +122,17 @@ describe('src/lib/profiles', () => {
|
|
|
132
122
|
it('should output error if no profiles', () => {
|
|
133
123
|
existingProfiles = [];
|
|
134
124
|
|
|
135
|
-
const func = () => original.filterProfiles();
|
|
125
|
+
const func = (): string[] => original.filterProfiles();
|
|
136
126
|
|
|
137
|
-
expect(func).toThrow('Please `npm run create` at least one profile');
|
|
127
|
+
expect(func).toThrow(new Error('Please `npm run create` at least one profile'));
|
|
138
128
|
});
|
|
139
129
|
|
|
140
130
|
it('should output error if profile does not exist', () => {
|
|
141
131
|
const newProfile = 'newProfile';
|
|
142
132
|
|
|
143
|
-
const func = () => original.filterProfiles(newProfile);
|
|
133
|
+
const func = (): string[] => original.filterProfiles(newProfile);
|
|
144
134
|
|
|
145
|
-
expect(func).toThrow(`Profile '${newProfile}' does not exist`);
|
|
135
|
+
expect(func).toThrow(new Error(`Profile '${newProfile}' does not exist`));
|
|
146
136
|
});
|
|
147
137
|
|
|
148
138
|
it('should return array with requested profile if it exists', () => {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import paths from '../paths';
|
|
4
|
-
import renderer from '../renderer';
|
|
2
|
+
import type path from 'path';
|
|
3
|
+
import type paths from '../paths';
|
|
4
|
+
import type renderer from '../renderer';
|
|
5
5
|
|
|
6
|
-
const original = jest.requireActual('../renderer').default
|
|
6
|
+
const original = jest.requireActual<{ default : typeof renderer }>('../renderer').default;
|
|
7
7
|
|
|
8
8
|
type TemplateName = keyof typeof original.templates;
|
|
9
9
|
type GetFileName<T extends TemplateName> = `${T}.html`;
|
|
@@ -28,7 +28,7 @@ jest.mock<Partial<typeof fs>>('fs', () => ({
|
|
|
28
28
|
}));
|
|
29
29
|
|
|
30
30
|
jest.mock<Partial<typeof path>>('path', () => ({
|
|
31
|
-
join : jest.fn().mockImplementation((...
|
|
31
|
+
join : jest.fn().mockImplementation((...paths: string[]) => paths.join('/')),
|
|
32
32
|
}));
|
|
33
33
|
|
|
34
34
|
jest.mock<Partial<typeof paths>>('../paths', () => ({
|
|
@@ -72,9 +72,9 @@ describe('src/lib/renderer', () => {
|
|
|
72
72
|
});
|
|
73
73
|
|
|
74
74
|
it('should replace non-existing template variable with empty string', () => {
|
|
75
|
-
const values = { name : 'scope.readonly' };
|
|
75
|
+
const values = { name : 'scope.readonly', type : undefined, title : undefined };
|
|
76
76
|
|
|
77
|
-
const result = original.render('scope', values
|
|
77
|
+
const result = original.render('scope', values);
|
|
78
78
|
|
|
79
79
|
expect(result).toEqual('scope type = () title = () name = (scope.readonly)');
|
|
80
80
|
});
|