@pipedream/google_drive 0.4.0 → 0.4.1

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/LICENSE ADDED
@@ -0,0 +1,7 @@
1
+ Copyright 2020 Pipedream, Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,10 +1,16 @@
1
1
  import googleDrive from "../../google_drive.app.mjs";
2
+ import {
3
+ getListFilesOpts,
4
+ toSingleLineString,
5
+ } from "../../utils.mjs";
6
+
7
+ import { GOOGLE_DRIVE_FOLDER_MIME_TYPE } from "../../constants.mjs";
2
8
 
3
9
  export default {
4
10
  key: "google_drive-create-folder",
5
11
  name: "Create Folder",
6
12
  description: "Create a new empty folder. [See the docs](https://developers.google.com/drive/api/v3/reference/files/create) for more information",
7
- version: "0.0.4",
13
+ version: "0.0.5",
8
14
  type: "action",
9
15
  props: {
10
16
  googleDrive,
@@ -36,12 +42,41 @@ export default {
36
42
  description: "The name of the new folder",
37
43
  optional: true,
38
44
  },
45
+ createIfExists: {
46
+ type: "boolean",
47
+ label: "Create If Exists?",
48
+ description: toSingleLineString(`
49
+ If the folder already exists and is not in the trash, should we create it? This option defaults to 'true' for
50
+ backwards compatability and to be consistent with default Google Drive behavior.
51
+ `),
52
+ optional: true,
53
+ default: true,
54
+ },
39
55
  },
40
56
  async run({ $ }) {
41
57
  const {
42
58
  parentId,
43
59
  name,
60
+ createIfExists,
44
61
  } = this;
62
+ let folder;
63
+ if (createIfExists == false) {//checking "false" because if this optional prop may not be given
64
+ const folders = (await this.googleDrive.listFilesInPage(null, getListFilesOpts(this.drive, {
65
+ q: `mimeType = '${GOOGLE_DRIVE_FOLDER_MIME_TYPE}' and name contains '${name}' and trashed=false`.trim(),
66
+ }))).files;
67
+ for (let f of folders) {
68
+ if (f.name == name) {
69
+ folder = f;
70
+ break;
71
+ }
72
+ }
73
+ if (folder) {
74
+ $.export("$summary", "Found existing folder, therefore not creating folder. Returning found folder.");
75
+ const folderDetails = await this.googleDrive.getFile(folder.id);
76
+
77
+ return folderDetails;
78
+ }
79
+ }
45
80
  const driveId = this.googleDrive.getDriveId(this.drive);
46
81
  const resp = await this.googleDrive.createFolder({
47
82
  name,
@@ -7,7 +7,7 @@ export default {
7
7
  key: "google_drive-find-folder",
8
8
  name: "Find Folder",
9
9
  description: "Search for a specific folder by name. [See the docs](https://developers.google.com/drive/api/v3/search-files) for more information",
10
- version: "0.0.3",
10
+ version: "0.0.5",
11
11
  type: "action",
12
12
  props: {
13
13
  googleDrive,
@@ -25,10 +25,21 @@ export default {
25
25
  ],
26
26
  description: "The name of the folder to search for",
27
27
  },
28
+ includeTrashed: {
29
+ type: "boolean",
30
+ label: "Include Trashed",
31
+ description: "If set to true, returns all matches including items currently in the trash. Defaults to `false`.",
32
+ default: false,
33
+ optional: true,
34
+ },
28
35
  },
29
36
  async run({ $ }) {
37
+ let q = `mimeType = '${GOOGLE_DRIVE_FOLDER_MIME_TYPE}' and name contains '${this.nameSearchTerm}'`.trim();
38
+ if (!this.includeTrashed) {
39
+ q += " and trashed=false";
40
+ }
30
41
  const opts = getListFilesOpts(this.drive, {
31
- q: `mimeType = '${GOOGLE_DRIVE_FOLDER_MIME_TYPE}' and name contains '${this.nameSearchTerm}'`,
42
+ q,
32
43
  });
33
44
  const folders = (await this.googleDrive.listFilesInPage(null, opts)).files;
34
45
  // eslint-disable-next-line multiline-ternary
@@ -1,14 +1,21 @@
1
1
  import path from "path";
2
2
  import googleDrive from "../../google_drive.app.mjs";
3
3
  import { omitEmptyStringValues } from "../../utils.mjs";
4
-
5
- import { getFileStream } from "../../utils.mjs";
4
+ import {
5
+ getFileStream,
6
+ streamToBuffer,
7
+ byteToMB,
8
+ } from "../../utils.mjs";
9
+ import {
10
+ GOOGLE_DRIVE_UPLOAD_TYPE_MEDIA,
11
+ GOOGLE_DRIVE_UPLOAD_TYPE_RESUMABLE,
12
+ } from "../../constants.mjs";
6
13
 
7
14
  export default {
8
15
  key: "google_drive-replace-file",
9
16
  name: "Replace File",
10
17
  description: "Upload a file that replaces an existing file. [See the docs](https://developers.google.com/drive/api/v3/reference/files/update) for more information",
11
- version: "0.0.4",
18
+ version: "0.0.5",
12
19
  type: "action",
13
20
  props: {
14
21
  googleDrive,
@@ -57,6 +64,13 @@ export default {
57
64
  ],
58
65
  description: "The MIME type of the new file (e.g., `image/jpeg`)",
59
66
  },
67
+ uploadType: {
68
+ propDefinition: [
69
+ googleDrive,
70
+ "uploadType",
71
+ ],
72
+ optional: true,
73
+ },
60
74
  },
61
75
  async run({ $ }) {
62
76
  const {
@@ -66,6 +80,7 @@ export default {
66
80
  name,
67
81
  mimeType,
68
82
  } = this;
83
+ let { uploadType } = this;
69
84
  if (!fileUrl && !filePath) {
70
85
  throw new Error("One of File URL and File Path is required.");
71
86
  }
@@ -74,15 +89,44 @@ export default {
74
89
  fileUrl,
75
90
  filePath,
76
91
  });
92
+
93
+ if (!uploadType || uploadType === "") {
94
+ try {
95
+ // Its necessary to get the file stream again, after user streamToBuffer function and pass
96
+ // the same object to updateFileMedia function, the function will throw an error about
97
+ // circular json structure.
98
+ // Deep clone is very slow in this case, so its better get the stream again
99
+ const fileBuffer = await streamToBuffer(await getFileStream({
100
+ $,
101
+ fileUrl,
102
+ filePath,
103
+ }));
104
+ const bufferSize = byteToMB(Buffer.byteLength(fileBuffer));
105
+ uploadType = bufferSize > 5
106
+ ? GOOGLE_DRIVE_UPLOAD_TYPE_RESUMABLE
107
+ : undefined;
108
+ } catch (err) {
109
+ console.log(err);
110
+ uploadType = undefined;
111
+ }
112
+ }
113
+
114
+ if (uploadType === GOOGLE_DRIVE_UPLOAD_TYPE_MEDIA) {
115
+ uploadType = undefined;
116
+ }
117
+ console.log(`Upload type: ${uploadType}`);
77
118
  // Update file media separately from metadata to prevent multipart upload,
78
119
  // which `google-apis-nodejs-client` doesn't seem to support for
79
120
  // [files.update](https://bit.ly/3lP5sWn)
80
121
  await this.googleDrive.updateFileMedia(fileId, fileStream, omitEmptyStringValues({
81
122
  mimeType,
123
+ uploadType,
82
124
  }));
125
+
83
126
  const resp = await this.googleDrive.updateFile(fileId, omitEmptyStringValues({
84
127
  name: name || path.basename(fileUrl || filePath),
85
128
  mimeType,
129
+ uploadType,
86
130
  }));
87
131
  $.export("$summary", "Successfully replaced the file");
88
132
  return resp;
@@ -1,13 +1,21 @@
1
1
  import googleDrive from "../../google_drive.app.mjs";
2
2
  import path from "path";
3
- import { getFileStream } from "../../utils.mjs";
3
+ import {
4
+ getFileStream,
5
+ streamToBuffer,
6
+ byteToMB,
7
+ } from "../../utils.mjs";
4
8
  import { omitEmptyStringValues } from "../../utils.mjs";
9
+ import {
10
+ GOOGLE_DRIVE_UPLOAD_TYPE_MEDIA,
11
+ GOOGLE_DRIVE_UPLOAD_TYPE_RESUMABLE,
12
+ } from "../../constants.mjs";
5
13
 
6
14
  export default {
7
15
  key: "google_drive-upload-file",
8
16
  name: "Upload File",
9
17
  description: "Copy an existing file to Google Drive. [See the docs](https://developers.google.com/drive/api/v3/manage-uploads) for more information",
10
- version: "0.0.4",
18
+ version: "0.0.6",
11
19
  type: "action",
12
20
  props: {
13
21
  googleDrive,
@@ -58,6 +66,13 @@ export default {
58
66
  description:
59
67
  "The file's MIME type (e.g., `image/jpeg`). Google Drive will attempt to automatically detect an appropriate value from uploaded content if no value is provided.",
60
68
  },
69
+ uploadType: {
70
+ propDefinition: [
71
+ googleDrive,
72
+ "uploadType",
73
+ ],
74
+ optional: true,
75
+ },
61
76
  },
62
77
  async run({ $ }) {
63
78
  const {
@@ -67,6 +82,7 @@ export default {
67
82
  name,
68
83
  mimeType,
69
84
  } = this;
85
+ let { uploadType } = this;
70
86
  if (!fileUrl && !filePath) {
71
87
  throw new Error("One of File URL and File Path is required.");
72
88
  }
@@ -76,12 +92,27 @@ export default {
76
92
  fileUrl,
77
93
  filePath,
78
94
  });
95
+ if (!uploadType || uploadType === "") {
96
+ try {
97
+ const fileBuffer = await streamToBuffer(file);
98
+ const bufferSize = byteToMB(Buffer.byteLength(fileBuffer));
99
+ uploadType = bufferSize > 5
100
+ ? GOOGLE_DRIVE_UPLOAD_TYPE_RESUMABLE
101
+ : GOOGLE_DRIVE_UPLOAD_TYPE_MEDIA;
102
+ console.log(`Upload type: ${uploadType}`);
103
+ } catch (err) {
104
+ console.log(err);
105
+ uploadType = "media";
106
+ }
107
+ }
108
+ console.log(`Upload type: ${uploadType}`);
79
109
  const resp = await this.googleDrive.createFile(omitEmptyStringValues({
80
110
  file,
81
111
  mimeType,
82
112
  name: name || path.basename(fileUrl || filePath),
83
113
  parentId,
84
114
  driveId,
115
+ uploadType,
85
116
  }));
86
117
  $.export("$summary", `Successfully uploaded a new file, "${resp.name}"`);
87
118
  return resp;
package/constants.mjs CHANGED
@@ -157,6 +157,15 @@ const GOOGLE_DRIVE_GRANTEE_TYPES = [
157
157
  GOOGLE_DRIVE_GRANTEE_ANYONE,
158
158
  ];
159
159
 
160
+ export const GOOGLE_DRIVE_UPLOAD_TYPE_MEDIA = "media";
161
+ export const GOOGLE_DRIVE_UPLOAD_TYPE_RESUMABLE = "resumable";
162
+ export const GOOGLE_DRIVE_UPLOAD_TYPE_MULTIPART = "multipart";
163
+ const GOOGLE_DRIVE_UPLOAD_TYPES = [
164
+ GOOGLE_DRIVE_UPLOAD_TYPE_MEDIA,
165
+ GOOGLE_DRIVE_UPLOAD_TYPE_RESUMABLE,
166
+ GOOGLE_DRIVE_UPLOAD_TYPE_MULTIPART,
167
+ ];
168
+
160
169
  export {
161
170
  GOOGLE_DRIVE_NOTIFICATION_SYNC,
162
171
  GOOGLE_DRIVE_NOTIFICATION_ADD,
@@ -173,6 +182,7 @@ export {
173
182
  MAX_FILE_OPTION_PATH_SEGMENTS,
174
183
  GOOGLE_DRIVE_MIME_TYPE_PREFIX,
175
184
  GOOGLE_DRIVE_FOLDER_MIME_TYPE,
185
+ GOOGLE_DRIVE_UPLOAD_TYPES,
176
186
  // Google Drive Roles
177
187
  GOOGLE_DRIVE_ROLE_OWNER,
178
188
  GOOGLE_DRIVE_ROLE_ORGANIZER,
@@ -14,6 +14,7 @@ import {
14
14
  GOOGLE_DRIVE_GRANTEE_TYPES,
15
15
  GOOGLE_DRIVE_GRANTEE_ANYONE,
16
16
  GOOGLE_DRIVE_ROLE_READER,
17
+ GOOGLE_DRIVE_UPLOAD_TYPES,
17
18
  } from "./constants.mjs";
18
19
  import googleMimeTypes from "./actions/google-mime-types.mjs";
19
20
 
@@ -188,11 +189,7 @@ export default {
188
189
  multipart - Multipart upload. Upload both the media and its metadata, in a single request.
189
190
  resumable - Resumable upload. Upload the file in a resumable fashion, using a series of
190
191
  at least two requests where the first request includes the metadata.`,
191
- options: [
192
- "media",
193
- "multipart",
194
- "resumable",
195
- ],
192
+ options: GOOGLE_DRIVE_UPLOAD_TYPES,
196
193
  },
197
194
  useDomainAdminAccess: {
198
195
  type: "boolean",
@@ -1003,6 +1000,7 @@ export default {
1003
1000
  fields,
1004
1001
  supportsAllDrives = true,
1005
1002
  requestBody,
1003
+ uploadType,
1006
1004
  ...extraParams
1007
1005
  } = opts;
1008
1006
  const drive = this.drive();
@@ -1015,6 +1013,7 @@ export default {
1015
1013
  ? {
1016
1014
  mimeType,
1017
1015
  body: file,
1016
+ uploadType,
1018
1017
  }
1019
1018
  : undefined,
1020
1019
  requestBody: {
@@ -1081,6 +1080,7 @@ export default {
1081
1080
  const {
1082
1081
  mimeType,
1083
1082
  supportsAllDrives = true,
1083
+ uploadType,
1084
1084
  ...extraParams
1085
1085
  } = opts;
1086
1086
  const drive = this.drive();
@@ -1091,6 +1091,7 @@ export default {
1091
1091
  media: {
1092
1092
  mimeType,
1093
1093
  body: fileStream,
1094
+ uploadType,
1094
1095
  },
1095
1096
  ...extraParams,
1096
1097
  })
@@ -1128,12 +1129,14 @@ export default {
1128
1129
  addParents,
1129
1130
  supportsAllDrives = true,
1130
1131
  requestBody,
1132
+ uploadType,
1131
1133
  ...extraParams
1132
1134
  } = opts;
1133
1135
  const drive = this.drive();
1134
1136
  return (
1135
1137
  await drive.files.update({
1136
1138
  fileId,
1139
+ uploadType,
1137
1140
  removeParents,
1138
1141
  addParents,
1139
1142
  fields,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pipedream/google_drive",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Pipedream Google_drive Components",
5
5
  "main": "google_drive.app.mjs",
6
6
  "keywords": [
package/utils.mjs CHANGED
@@ -81,6 +81,24 @@ async function getFileStream({
81
81
  : fs.createReadStream(filePath);
82
82
  }
83
83
 
84
+ function streamToBuffer(stream) {
85
+ return new Promise((resolve, reject) => {
86
+ const chunks = [];
87
+ stream.on("data", (chunk) => {
88
+ chunks.push(chunk);
89
+ }).on("end", () => {
90
+ resolve(Buffer.concat(chunks));
91
+ // eslint-disable-next-line newline-per-chained-call
92
+ }).on("error", (err) => {
93
+ reject(err);
94
+ });
95
+ });
96
+ }
97
+
98
+ function byteToMB(byte) {
99
+ return byte / 1024 / 1024;
100
+ }
101
+
84
102
  /**
85
103
  * Truncate an array of path segments from its base
86
104
  *
@@ -244,4 +262,6 @@ export {
244
262
  toSingleLineString,
245
263
  buildFilePaths,
246
264
  getFilePaths,
265
+ streamToBuffer,
266
+ byteToMB,
247
267
  };
package/pnpm-lock.yaml DELETED
@@ -1,393 +0,0 @@
1
- lockfileVersion: 5.4
2
-
3
- specifiers:
4
- '@googleapis/drive': ^2.3.0
5
- '@pipedream/platform': ^0.9.0
6
- axios: ^0.21.1
7
- mime-db: ^1.51.0
8
- uuid: ^8.3.2
9
-
10
- dependencies:
11
- '@googleapis/drive': 2.3.0
12
- '@pipedream/platform': 0.9.0
13
- axios: 0.21.4
14
- mime-db: 1.52.0
15
- uuid: 8.3.2
16
-
17
- packages:
18
-
19
- /@googleapis/drive/2.3.0:
20
- resolution: {integrity: sha512-uXLF2qc1Hzee25acyEEmyfwbyw1nI2hjUde7pTNOc3K4OkVlPdq08+e7x+hdlUkQPazmqhtbPmWWm2HNAek9+A==}
21
- engines: {node: '>=10.0.0'}
22
- dependencies:
23
- googleapis-common: 5.1.0
24
- transitivePeerDependencies:
25
- - encoding
26
- - supports-color
27
- dev: false
28
-
29
- /@pipedream/platform/0.9.0:
30
- resolution: {integrity: sha512-d8gcWQi9qkjeMz/Cr/oRQ3h2LOEouxxsb3dPPCZDcAL/w0I3BywvUzr4/wmWENORilwKUZZs+wWmmj5BT0zMIQ==}
31
- dependencies:
32
- axios: 0.19.2
33
- fp-ts: 2.12.1
34
- io-ts: 2.2.16_fp-ts@2.12.1
35
- transitivePeerDependencies:
36
- - supports-color
37
- dev: false
38
-
39
- /abort-controller/3.0.0:
40
- resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
41
- engines: {node: '>=6.5'}
42
- dependencies:
43
- event-target-shim: 5.0.1
44
- dev: false
45
-
46
- /agent-base/6.0.2:
47
- resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
48
- engines: {node: '>= 6.0.0'}
49
- dependencies:
50
- debug: 4.3.4
51
- transitivePeerDependencies:
52
- - supports-color
53
- dev: false
54
-
55
- /arrify/2.0.1:
56
- resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==}
57
- engines: {node: '>=8'}
58
- dev: false
59
-
60
- /axios/0.19.2:
61
- resolution: {integrity: sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==}
62
- deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410
63
- dependencies:
64
- follow-redirects: 1.5.10
65
- transitivePeerDependencies:
66
- - supports-color
67
- dev: false
68
-
69
- /axios/0.21.4:
70
- resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==}
71
- dependencies:
72
- follow-redirects: 1.15.0
73
- transitivePeerDependencies:
74
- - debug
75
- dev: false
76
-
77
- /base64-js/1.5.1:
78
- resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
79
- dev: false
80
-
81
- /bignumber.js/9.0.2:
82
- resolution: {integrity: sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==}
83
- dev: false
84
-
85
- /buffer-equal-constant-time/1.0.1:
86
- resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=}
87
- dev: false
88
-
89
- /call-bind/1.0.2:
90
- resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
91
- dependencies:
92
- function-bind: 1.1.1
93
- get-intrinsic: 1.1.1
94
- dev: false
95
-
96
- /debug/3.1.0:
97
- resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==}
98
- peerDependencies:
99
- supports-color: '*'
100
- peerDependenciesMeta:
101
- supports-color:
102
- optional: true
103
- dependencies:
104
- ms: 2.0.0
105
- dev: false
106
-
107
- /debug/4.3.4:
108
- resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
109
- engines: {node: '>=6.0'}
110
- peerDependencies:
111
- supports-color: '*'
112
- peerDependenciesMeta:
113
- supports-color:
114
- optional: true
115
- dependencies:
116
- ms: 2.1.2
117
- dev: false
118
-
119
- /ecdsa-sig-formatter/1.0.11:
120
- resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
121
- dependencies:
122
- safe-buffer: 5.2.1
123
- dev: false
124
-
125
- /event-target-shim/5.0.1:
126
- resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
127
- engines: {node: '>=6'}
128
- dev: false
129
-
130
- /extend/3.0.2:
131
- resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
132
- dev: false
133
-
134
- /fast-text-encoding/1.0.3:
135
- resolution: {integrity: sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==}
136
- dev: false
137
-
138
- /follow-redirects/1.15.0:
139
- resolution: {integrity: sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==}
140
- engines: {node: '>=4.0'}
141
- peerDependencies:
142
- debug: '*'
143
- peerDependenciesMeta:
144
- debug:
145
- optional: true
146
- dev: false
147
-
148
- /follow-redirects/1.5.10:
149
- resolution: {integrity: sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==}
150
- engines: {node: '>=4.0'}
151
- dependencies:
152
- debug: 3.1.0
153
- transitivePeerDependencies:
154
- - supports-color
155
- dev: false
156
-
157
- /fp-ts/2.12.1:
158
- resolution: {integrity: sha512-oxvgqUYR6O9VkKXrxkJ0NOyU0FrE705MeqgBUMEPWyTu6Pwn768cJbHChw2XOBlgFLKfIHxjr2OOBFpv2mUGZw==}
159
- dev: false
160
-
161
- /function-bind/1.1.1:
162
- resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
163
- dev: false
164
-
165
- /gaxios/4.3.3:
166
- resolution: {integrity: sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==}
167
- engines: {node: '>=10'}
168
- dependencies:
169
- abort-controller: 3.0.0
170
- extend: 3.0.2
171
- https-proxy-agent: 5.0.1
172
- is-stream: 2.0.1
173
- node-fetch: 2.6.7
174
- transitivePeerDependencies:
175
- - encoding
176
- - supports-color
177
- dev: false
178
-
179
- /gcp-metadata/4.3.1:
180
- resolution: {integrity: sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==}
181
- engines: {node: '>=10'}
182
- dependencies:
183
- gaxios: 4.3.3
184
- json-bigint: 1.0.0
185
- transitivePeerDependencies:
186
- - encoding
187
- - supports-color
188
- dev: false
189
-
190
- /get-intrinsic/1.1.1:
191
- resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==}
192
- dependencies:
193
- function-bind: 1.1.1
194
- has: 1.0.3
195
- has-symbols: 1.0.3
196
- dev: false
197
-
198
- /google-auth-library/7.14.1:
199
- resolution: {integrity: sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==}
200
- engines: {node: '>=10'}
201
- dependencies:
202
- arrify: 2.0.1
203
- base64-js: 1.5.1
204
- ecdsa-sig-formatter: 1.0.11
205
- fast-text-encoding: 1.0.3
206
- gaxios: 4.3.3
207
- gcp-metadata: 4.3.1
208
- gtoken: 5.3.2
209
- jws: 4.0.0
210
- lru-cache: 6.0.0
211
- transitivePeerDependencies:
212
- - encoding
213
- - supports-color
214
- dev: false
215
-
216
- /google-p12-pem/3.1.4:
217
- resolution: {integrity: sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==}
218
- engines: {node: '>=10'}
219
- hasBin: true
220
- dependencies:
221
- node-forge: 1.3.1
222
- dev: false
223
-
224
- /googleapis-common/5.1.0:
225
- resolution: {integrity: sha512-RXrif+Gzhq1QAzfjxulbGvAY3FPj8zq/CYcvgjzDbaBNCD6bUl+86I7mUs4DKWHGruuK26ijjR/eDpWIDgNROA==}
226
- engines: {node: '>=10.10.0'}
227
- dependencies:
228
- extend: 3.0.2
229
- gaxios: 4.3.3
230
- google-auth-library: 7.14.1
231
- qs: 6.10.3
232
- url-template: 2.0.8
233
- uuid: 8.3.2
234
- transitivePeerDependencies:
235
- - encoding
236
- - supports-color
237
- dev: false
238
-
239
- /gtoken/5.3.2:
240
- resolution: {integrity: sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==}
241
- engines: {node: '>=10'}
242
- dependencies:
243
- gaxios: 4.3.3
244
- google-p12-pem: 3.1.4
245
- jws: 4.0.0
246
- transitivePeerDependencies:
247
- - encoding
248
- - supports-color
249
- dev: false
250
-
251
- /has-symbols/1.0.3:
252
- resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
253
- engines: {node: '>= 0.4'}
254
- dev: false
255
-
256
- /has/1.0.3:
257
- resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
258
- engines: {node: '>= 0.4.0'}
259
- dependencies:
260
- function-bind: 1.1.1
261
- dev: false
262
-
263
- /https-proxy-agent/5.0.1:
264
- resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
265
- engines: {node: '>= 6'}
266
- dependencies:
267
- agent-base: 6.0.2
268
- debug: 4.3.4
269
- transitivePeerDependencies:
270
- - supports-color
271
- dev: false
272
-
273
- /io-ts/2.2.16_fp-ts@2.12.1:
274
- resolution: {integrity: sha512-y5TTSa6VP6le0hhmIyN0dqEXkrZeJLeC5KApJq6VLci3UEKF80lZ+KuoUs02RhBxNWlrqSNxzfI7otLX1Euv8Q==}
275
- peerDependencies:
276
- fp-ts: ^2.5.0
277
- dependencies:
278
- fp-ts: 2.12.1
279
- dev: false
280
-
281
- /is-stream/2.0.1:
282
- resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
283
- engines: {node: '>=8'}
284
- dev: false
285
-
286
- /json-bigint/1.0.0:
287
- resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==}
288
- dependencies:
289
- bignumber.js: 9.0.2
290
- dev: false
291
-
292
- /jwa/2.0.0:
293
- resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==}
294
- dependencies:
295
- buffer-equal-constant-time: 1.0.1
296
- ecdsa-sig-formatter: 1.0.11
297
- safe-buffer: 5.2.1
298
- dev: false
299
-
300
- /jws/4.0.0:
301
- resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==}
302
- dependencies:
303
- jwa: 2.0.0
304
- safe-buffer: 5.2.1
305
- dev: false
306
-
307
- /lru-cache/6.0.0:
308
- resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
309
- engines: {node: '>=10'}
310
- dependencies:
311
- yallist: 4.0.0
312
- dev: false
313
-
314
- /mime-db/1.52.0:
315
- resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
316
- engines: {node: '>= 0.6'}
317
- dev: false
318
-
319
- /ms/2.0.0:
320
- resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=}
321
- dev: false
322
-
323
- /ms/2.1.2:
324
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
325
- dev: false
326
-
327
- /node-fetch/2.6.7:
328
- resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==}
329
- engines: {node: 4.x || >=6.0.0}
330
- peerDependencies:
331
- encoding: ^0.1.0
332
- peerDependenciesMeta:
333
- encoding:
334
- optional: true
335
- dependencies:
336
- whatwg-url: 5.0.0
337
- dev: false
338
-
339
- /node-forge/1.3.1:
340
- resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
341
- engines: {node: '>= 6.13.0'}
342
- dev: false
343
-
344
- /object-inspect/1.12.0:
345
- resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==}
346
- dev: false
347
-
348
- /qs/6.10.3:
349
- resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==}
350
- engines: {node: '>=0.6'}
351
- dependencies:
352
- side-channel: 1.0.4
353
- dev: false
354
-
355
- /safe-buffer/5.2.1:
356
- resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
357
- dev: false
358
-
359
- /side-channel/1.0.4:
360
- resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
361
- dependencies:
362
- call-bind: 1.0.2
363
- get-intrinsic: 1.1.1
364
- object-inspect: 1.12.0
365
- dev: false
366
-
367
- /tr46/0.0.3:
368
- resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=}
369
- dev: false
370
-
371
- /url-template/2.0.8:
372
- resolution: {integrity: sha1-/FZaPMy/93MMd19WQflVV5FDnyE=}
373
- dev: false
374
-
375
- /uuid/8.3.2:
376
- resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
377
- hasBin: true
378
- dev: false
379
-
380
- /webidl-conversions/3.0.1:
381
- resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=}
382
- dev: false
383
-
384
- /whatwg-url/5.0.0:
385
- resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=}
386
- dependencies:
387
- tr46: 0.0.3
388
- webidl-conversions: 3.0.1
389
- dev: false
390
-
391
- /yallist/4.0.0:
392
- resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
393
- dev: false