@anmiles/google-api-wrapper 19.0.3 → 19.0.5
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/CHANGELOG.md +8 -0
- package/README.md +1 -0
- package/dist/lib/api.d.ts +4 -4
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +17 -13
- package/dist/lib/api.js.map +1 -1
- package/package.json +24 -24
- package/src/lib/__tests__/__snapshots__/scopes.test.ts.snap +1 -1
- package/src/lib/__tests__/__snapshots__/secrets.test.ts.snap +1 -1
- package/src/lib/__tests__/api.test.ts +2 -9
- package/src/lib/api.ts +27 -15
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [19.0.5](../../tags/v19.0.5) - 2025-07-24
|
|
9
|
+
### Changed
|
|
10
|
+
- Fix vulnerable dependencies
|
|
11
|
+
|
|
12
|
+
## [19.0.4](../../tags/v19.0.4) - 2025-06-02
|
|
13
|
+
### Changed
|
|
14
|
+
- Fixed api property that was optional by mistake
|
|
15
|
+
|
|
8
16
|
## [19.0.3](../../tags/v19.0.3) - 2025-05-24
|
|
9
17
|
### Changed
|
|
10
18
|
- Fixed path to templates
|
package/README.md
CHANGED
|
@@ -65,3 +65,4 @@ getProfiles().map(async (profile) => {
|
|
|
65
65
|
### Live examples
|
|
66
66
|
- [youtube-likes-downloader](https://www.npmjs.com/package/youtube-likes-downloader) - download all liked videos from youtube
|
|
67
67
|
- [google-calendar-entries](https://www.npmjs.com/package/google-calendar-entries) - view and manage google calendar entries
|
|
68
|
+
- [school-schedule-sync](https://www.npmjs.com/package/school-schedule-sync) - synchronization between JSON schedule and Google Calendar
|
package/dist/lib/api.d.ts
CHANGED
|
@@ -18,13 +18,13 @@ export interface CommonResponse<TItem> {
|
|
|
18
18
|
nextPageToken?: string | null | undefined;
|
|
19
19
|
}
|
|
20
20
|
export declare class API<TGoogleAPI> {
|
|
21
|
+
api: TGoogleAPI;
|
|
22
|
+
private auth;
|
|
21
23
|
private readonly getter;
|
|
22
24
|
private readonly profile;
|
|
23
25
|
private readonly authOptions?;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
constructor(getter: (auth: GoogleApis.Common.OAuth2Client) => TGoogleAPI, profile: string, authOptions?: AuthOptions | undefined);
|
|
27
|
-
init(): Promise<void>;
|
|
26
|
+
private constructor();
|
|
27
|
+
static init<TGoogleAPI>(getter: (auth: GoogleApis.Common.OAuth2Client) => TGoogleAPI, profile: string, authOptions?: AuthOptions): Promise<API<TGoogleAPI>>;
|
|
28
28
|
getItems<TItem>(selectAPI: (api: TGoogleAPI) => CommonAPI<TItem>, params: object, options?: CommonOptions): Promise<TItem[]>;
|
|
29
29
|
}
|
|
30
30
|
export declare function getAPI<TGoogleAPI>(getter: (auth: GoogleApis.Common.OAuth2Client) => TGoogleAPI, profile: string, authOptions?: AuthOptions): Promise<API<TGoogleAPI>>;
|
package/dist/lib/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,CAAC;AAE7B,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AAEzC,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOnE,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAC3C,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,CAAC;AAEF,UAAU,SAAS,CAAC,KAAK;IACxB,IAAI,EAAE;QACL,CACC,MAAM,CAAC,EAAE,UAAU,EACnB,OAAO,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,aAAa,GACvC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpE,CACC,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,KAAI,IAAI,GACxG,IAAI,CAAC;KACR,CAAC;CACF;AAED,MAAM,WAAW,cAAc,CAAC,KAAK;IACpC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE;QACV,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;KACzC,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAC1C;AAED,qBAAa,GAAG,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,CAAC;AAE7B,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AAEzC,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOnE,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAC3C,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,CAAC;AAEF,UAAU,SAAS,CAAC,KAAK;IACxB,IAAI,EAAE;QACL,CACC,MAAM,CAAC,EAAE,UAAU,EACnB,OAAO,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,aAAa,GACvC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpE,CACC,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,KAAI,IAAI,GACxG,IAAI,CAAC;KACR,CAAC;CACF;AAED,MAAM,WAAW,cAAc,CAAC,KAAK;IACpC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE;QACV,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;KACzC,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAC1C;AAED,qBAAa,GAAG,CAAC,UAAU;IAElB,GAAG,EAAE,UAAU;IACtB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAL9B,OAAO;WAQM,IAAI,CAAC,UAAU,EAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,YAAY,KAAI,UAAU,EAC3D,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,WAAW,GACvB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAKrB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,KAAI,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;CAuCjI;AAED,wBAAsB,MAAM,CAAC,UAAU,EACtC,MAAM,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,YAAY,KAAI,UAAU,EAC3D,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,WAAW,GACvB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAU1B"}
|
package/dist/lib/api.js
CHANGED
|
@@ -12,19 +12,21 @@ const auth_1 = require("./auth");
|
|
|
12
12
|
const credentials_1 = require("./credentials");
|
|
13
13
|
const requestInterval = 300;
|
|
14
14
|
class API {
|
|
15
|
+
api;
|
|
16
|
+
auth;
|
|
15
17
|
getter;
|
|
16
18
|
profile;
|
|
17
19
|
authOptions;
|
|
18
|
-
api
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
constructor(api, auth, getter, profile, authOptions) {
|
|
21
|
+
this.api = api;
|
|
22
|
+
this.auth = auth;
|
|
21
23
|
this.getter = getter;
|
|
22
24
|
this.profile = profile;
|
|
23
25
|
this.authOptions = authOptions;
|
|
24
26
|
}
|
|
25
|
-
async init() {
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
static async init(getter, profile, authOptions) {
|
|
28
|
+
const { api, auth } = await resetAuth(getter, profile, authOptions);
|
|
29
|
+
return new API(api, auth, getter, profile, authOptions);
|
|
28
30
|
}
|
|
29
31
|
async getItems(selectAPI, params, options) {
|
|
30
32
|
const items = [];
|
|
@@ -32,9 +34,6 @@ class API {
|
|
|
32
34
|
do {
|
|
33
35
|
let response;
|
|
34
36
|
try {
|
|
35
|
-
if (!this.api) {
|
|
36
|
-
throw new Error('API is not initialized. Call `init` before getting items.');
|
|
37
|
-
}
|
|
38
37
|
const selectedAPI = selectAPI(this.api);
|
|
39
38
|
response = await selectedAPI.list({ ...params, pageToken });
|
|
40
39
|
}
|
|
@@ -43,7 +42,9 @@ class API {
|
|
|
43
42
|
if ((message === 'invalid_grant' || message === 'Invalid credentials') && !this.authOptions?.temporary) {
|
|
44
43
|
(0, logger_1.warn)('Access token stored is invalid, re-creating...');
|
|
45
44
|
(0, credentials_1.deleteCredentials)(this.profile);
|
|
46
|
-
await this.
|
|
45
|
+
const { api, auth } = await resetAuth(this.getter, this.profile, this.authOptions);
|
|
46
|
+
this.api = api;
|
|
47
|
+
this.auth = auth;
|
|
47
48
|
return this.getItems(selectAPI, params, options);
|
|
48
49
|
}
|
|
49
50
|
else {
|
|
@@ -68,8 +69,11 @@ async function getAPI(getter, profile, authOptions) {
|
|
|
68
69
|
(0, logger_1.warn)(`WARNING: trying to create permanent credentials using non-readonly scopes (${writableScopes.join(', ')}). Permanent credentials will be stored in the file and potentially might be re-used to modify your data`);
|
|
69
70
|
}
|
|
70
71
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
return API.init(getter, profile, authOptions);
|
|
73
|
+
}
|
|
74
|
+
async function resetAuth(getter, profile, authOptions) {
|
|
75
|
+
const auth = await (0, auth_1.getAuth)(profile, authOptions);
|
|
76
|
+
const api = getter(auth);
|
|
77
|
+
return { api, auth };
|
|
74
78
|
}
|
|
75
79
|
//# sourceMappingURL=api.js.map
|
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anmiles/google-api-wrapper",
|
|
3
|
-
"version": "19.0.
|
|
3
|
+
"version": "19.0.5",
|
|
4
4
|
"description": "Wrapper around googleapis for getting data shortly",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"google",
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
"test:report:coverage": "nyc report"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@anmiles/logger": "^8.0.
|
|
34
|
-
"@anmiles/prototypes": "^11.
|
|
35
|
-
"@anmiles/sleep": "^5.0.
|
|
33
|
+
"@anmiles/logger": "^8.0.1",
|
|
34
|
+
"@anmiles/prototypes": "^11.2.2",
|
|
35
|
+
"@anmiles/sleep": "^5.0.1",
|
|
36
36
|
"out-url": "^1.2.2",
|
|
37
37
|
"server-destroy": "^1.0.1"
|
|
38
38
|
},
|
|
@@ -40,35 +40,35 @@
|
|
|
40
40
|
"googleapis": "^148.0.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@anmiles/eslint-config": "^9.0.
|
|
43
|
+
"@anmiles/eslint-config": "^9.0.3",
|
|
44
44
|
"@anmiles/tsconfig": "^4.0.0",
|
|
45
|
-
"@eslint/compat": "^1.
|
|
46
|
-
"@eslint/css": "^0.
|
|
47
|
-
"@eslint/js": "^9.
|
|
48
|
-
"@eslint/json": "^0.
|
|
49
|
-
"@eslint/markdown": "^
|
|
50
|
-
"@stylistic/eslint-plugin": "^
|
|
51
|
-
"@types/jest": "^
|
|
45
|
+
"@eslint/compat": "^1.3.1",
|
|
46
|
+
"@eslint/css": "^0.10.0",
|
|
47
|
+
"@eslint/js": "^9.31.0",
|
|
48
|
+
"@eslint/json": "^0.13.1",
|
|
49
|
+
"@eslint/markdown": "^7.1.0",
|
|
50
|
+
"@stylistic/eslint-plugin": "^5.2.2",
|
|
51
|
+
"@types/jest": "^30.0.0",
|
|
52
52
|
"@types/mock-fs": "^4.13.4",
|
|
53
53
|
"@types/server-destroy": "^1.0.4",
|
|
54
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
55
|
-
"@typescript-eslint/parser": "^8.
|
|
54
|
+
"@typescript-eslint/eslint-plugin": "^8.38.0",
|
|
55
|
+
"@typescript-eslint/parser": "^8.38.0",
|
|
56
56
|
"copyfiles": "^2.4.1",
|
|
57
|
-
"cspell": "^9.0
|
|
58
|
-
"eslint": "^9.
|
|
59
|
-
"eslint-import-resolver-typescript": "^4.
|
|
57
|
+
"cspell": "^9.2.0",
|
|
58
|
+
"eslint": "^9.31.0",
|
|
59
|
+
"eslint-import-resolver-typescript": "^4.4.4",
|
|
60
60
|
"eslint-plugin-align-assignments": "^1.1.2",
|
|
61
|
-
"eslint-plugin-i18next": "^6.1.
|
|
62
|
-
"eslint-plugin-import": "^2.
|
|
63
|
-
"eslint-plugin-jest": "^
|
|
64
|
-
"eslint-plugin-n": "^17.
|
|
61
|
+
"eslint-plugin-i18next": "^6.1.3",
|
|
62
|
+
"eslint-plugin-import": "^2.32.0",
|
|
63
|
+
"eslint-plugin-jest": "^29.0.1",
|
|
64
|
+
"eslint-plugin-n": "^17.21.0",
|
|
65
65
|
"eslint-plugin-promise": "^7.2.1",
|
|
66
|
-
"jest": "^
|
|
67
|
-
"jiti": "^2.
|
|
66
|
+
"jest": "^30.0.5",
|
|
67
|
+
"jiti": "^2.5.0",
|
|
68
68
|
"mock-fs": "^5.5.0",
|
|
69
69
|
"nyc": "^17.1.0",
|
|
70
70
|
"rimraf": "^6.0.1",
|
|
71
|
-
"ts-jest": "^29.
|
|
71
|
+
"ts-jest": "^29.4.0",
|
|
72
72
|
"typescript": "^5.8.3"
|
|
73
73
|
}
|
|
74
74
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Jest Snapshot v1, https://
|
|
1
|
+
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
|
|
2
2
|
|
|
3
3
|
exports[`src/lib/secrets getSecrets should throw if callbackURI is incorrect 1`] = `"Error in credentials file: redirect URI should be http://localhost:6006/oauthcallback"`;
|
|
4
4
|
|
|
@@ -4,8 +4,8 @@ import type GoogleApis from 'googleapis';
|
|
|
4
4
|
import type { calendar_v3 } from 'googleapis/build/src/apis/calendar';
|
|
5
5
|
import { calendar } from 'googleapis/build/src/apis/calendar';
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
import type { CommonResponse } from '../api';
|
|
7
|
+
import { getAPI } from '../api';
|
|
8
|
+
import type { API, CommonResponse } from '../api';
|
|
9
9
|
import { getAuth } from '../auth';
|
|
10
10
|
import { deleteCredentials } from '../credentials';
|
|
11
11
|
|
|
@@ -211,13 +211,6 @@ Permanent credentials will be stored in the file and potentially might be re-use
|
|
|
211
211
|
|
|
212
212
|
expect(returnedItems).toEqual(items);
|
|
213
213
|
});
|
|
214
|
-
|
|
215
|
-
it('should throw if api was not initialized before getting items', async () => {
|
|
216
|
-
instance = new API((auth) => calendar({ version: 'v3', auth }), profile);
|
|
217
|
-
|
|
218
|
-
await expect(async () => instance.getItems(() => calendarList, params))
|
|
219
|
-
.rejects.toEqual(new Error('API is not initialized. Call `init` before getting items.'));
|
|
220
|
-
});
|
|
221
214
|
});
|
|
222
215
|
});
|
|
223
216
|
});
|
package/src/lib/api.ts
CHANGED
|
@@ -35,18 +35,21 @@ export interface CommonResponse<TItem> {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
export class API<TGoogleAPI> {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
constructor(
|
|
38
|
+
private constructor(
|
|
39
|
+
public api: TGoogleAPI,
|
|
40
|
+
private auth: GoogleApis.Common.OAuth2Client,
|
|
42
41
|
private readonly getter: (auth: GoogleApis.Common.OAuth2Client)=> TGoogleAPI,
|
|
43
42
|
private readonly profile: string,
|
|
44
43
|
private readonly authOptions?: AuthOptions,
|
|
45
44
|
) { }
|
|
46
45
|
|
|
47
|
-
async init
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
static async init<TGoogleAPI>(
|
|
47
|
+
getter: (auth: GoogleApis.Common.OAuth2Client)=> TGoogleAPI,
|
|
48
|
+
profile: string,
|
|
49
|
+
authOptions?: AuthOptions,
|
|
50
|
+
): Promise<API<TGoogleAPI>> {
|
|
51
|
+
const { api, auth } = await resetAuth(getter, profile, authOptions);
|
|
52
|
+
return new API<TGoogleAPI>(api, auth, getter, profile, authOptions);
|
|
50
53
|
}
|
|
51
54
|
|
|
52
55
|
async getItems<TItem>(selectAPI: (api: TGoogleAPI)=> CommonAPI<TItem>, params: object, options?: CommonOptions): Promise<TItem[]> {
|
|
@@ -58,10 +61,6 @@ export class API<TGoogleAPI> {
|
|
|
58
61
|
let response: GoogleApis.Common.GaxiosResponse<CommonResponse<TItem>>;
|
|
59
62
|
|
|
60
63
|
try {
|
|
61
|
-
if (!this.api) {
|
|
62
|
-
throw new Error('API is not initialized. Call `init` before getting items.');
|
|
63
|
-
}
|
|
64
|
-
|
|
65
64
|
const selectedAPI = selectAPI(this.api);
|
|
66
65
|
|
|
67
66
|
response = await selectedAPI.list({ ...params, pageToken });
|
|
@@ -71,7 +70,9 @@ export class API<TGoogleAPI> {
|
|
|
71
70
|
if ((message === 'invalid_grant' || message === 'Invalid credentials') && !this.authOptions?.temporary) {
|
|
72
71
|
warn('Access token stored is invalid, re-creating...');
|
|
73
72
|
deleteCredentials(this.profile);
|
|
74
|
-
await this.
|
|
73
|
+
const { api, auth } = await resetAuth(this.getter, this.profile, this.authOptions);
|
|
74
|
+
this.api = api;
|
|
75
|
+
this.auth = auth;
|
|
75
76
|
return this.getItems(selectAPI, params, options);
|
|
76
77
|
} else {
|
|
77
78
|
throw ex;
|
|
@@ -105,7 +106,18 @@ export async function getAPI<TGoogleAPI>(
|
|
|
105
106
|
}
|
|
106
107
|
}
|
|
107
108
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
return API.init<TGoogleAPI>(getter, profile, authOptions);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function resetAuth<TGoogleAPI>(
|
|
113
|
+
getter: (auth: GoogleApis.Common.OAuth2Client)=> TGoogleAPI,
|
|
114
|
+
profile: string,
|
|
115
|
+
authOptions?: AuthOptions,
|
|
116
|
+
): Promise<{
|
|
117
|
+
api: TGoogleAPI;
|
|
118
|
+
readonly auth: GoogleApis.Common.OAuth2Client;
|
|
119
|
+
}> {
|
|
120
|
+
const auth = await getAuth(profile, authOptions);
|
|
121
|
+
const api = getter(auth);
|
|
122
|
+
return { api, auth };
|
|
111
123
|
}
|