@gzhangx/googleapi 0.0.75 → 0.0.77

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 (40) hide show
  1. package/lib/google/drive.d.ts +15 -15
  2. package/lib/google/drive.js +54 -45
  3. package/lib/google/drive.js.map +1 -1
  4. package/lib/google/googleApiServiceAccount.d.ts +131 -132
  5. package/lib/google/googleApiServiceAccount.js +397 -551
  6. package/lib/google/googleApiServiceAccount.js.map +1 -1
  7. package/lib/googleApi.d.ts +58 -58
  8. package/lib/googleApi.js +325 -459
  9. package/lib/googleApi.js.map +1 -1
  10. package/lib/httpRequest.d.ts +24 -25
  11. package/lib/httpRequest.js +138 -179
  12. package/lib/httpRequest.js.map +1 -1
  13. package/lib/index.d.ts +24 -24
  14. package/lib/index.js +62 -55
  15. package/lib/index.js.map +1 -1
  16. package/lib/jwt.d.ts +11 -11
  17. package/lib/jwt.js +45 -46
  18. package/lib/jwt.js.map +1 -1
  19. package/lib/msGraph/msExcell.d.ts +47 -47
  20. package/lib/msGraph/msExcell.js +69 -157
  21. package/lib/msGraph/msExcell.js.map +1 -1
  22. package/lib/msGraph/msauth.d.ts +91 -91
  23. package/lib/msGraph/msauth.js +309 -533
  24. package/lib/msGraph/msauth.js.map +1 -1
  25. package/lib/msGraph/msdir.d.ts +124 -125
  26. package/lib/msGraph/msdir.js +171 -263
  27. package/lib/msGraph/msdir.js.map +1 -1
  28. package/lib/msGraph/types.d.ts +4 -4
  29. package/lib/msGraph/types.js +2 -2
  30. package/lib/tests/gtest.d.ts +1 -1
  31. package/lib/tests/gtest.js +170 -234
  32. package/lib/tests/gtest.js.map +1 -1
  33. package/lib/tests/mstest.d.ts +1 -1
  34. package/lib/tests/mstest.js +184 -269
  35. package/lib/tests/mstest.js.map +1 -1
  36. package/lib/tsconfig.tsbuildinfo +1 -1
  37. package/lib/util.d.ts +9 -9
  38. package/lib/util.js +95 -96
  39. package/lib/util.js.map +1 -1
  40. package/package.json +3 -3
@@ -1,552 +1,398 @@
1
- "use strict";
2
- //rootUrl = 'https://accounts.google.com/o/oauth2/v2/auth';
3
- //opts = { access_type: 'offline', scope: 'https://www.googleapis.com/auth/spreadsheets', response_type: 'code', client_id: 'client_id', redirect_uri: 'urn:ietf:wg:oauth:2.0:oob' }
4
- //return rootUrl + '?' + querystring.stringify(opts);
5
- //'https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fspreadsheets&response_type=code&client_id=client_id&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob'
6
- var __assign = (this && this.__assign) || function () {
7
- __assign = Object.assign || function(t) {
8
- for (var s, i = 1, n = arguments.length; i < n; i++) {
9
- s = arguments[i];
10
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
11
- t[p] = s[p];
12
- }
13
- return t;
14
- };
15
- return __assign.apply(this, arguments);
16
- };
17
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
- if (k2 === undefined) k2 = k;
19
- var desc = Object.getOwnPropertyDescriptor(m, k);
20
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
- desc = { enumerable: true, get: function() { return m[k]; } };
22
- }
23
- Object.defineProperty(o, k2, desc);
24
- }) : (function(o, m, k, k2) {
25
- if (k2 === undefined) k2 = k;
26
- o[k2] = m[k];
27
- }));
28
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
- Object.defineProperty(o, "default", { enumerable: true, value: v });
30
- }) : function(o, v) {
31
- o["default"] = v;
32
- });
33
- var __importStar = (this && this.__importStar) || function (mod) {
34
- if (mod && mod.__esModule) return mod;
35
- var result = {};
36
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
37
- __setModuleDefault(result, mod);
38
- return result;
39
- };
40
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
41
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
42
- return new (P || (P = Promise))(function (resolve, reject) {
43
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
44
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
45
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
46
- step((generator = generator.apply(thisArg, _arguments || [])).next());
47
- });
48
- };
49
- var __generator = (this && this.__generator) || function (thisArg, body) {
50
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
51
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
52
- function verb(n) { return function (v) { return step([n, v]); }; }
53
- function step(op) {
54
- if (f) throw new TypeError("Generator is already executing.");
55
- while (_) try {
56
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
57
- if (y = 0, t) op = [op[0] & 2, t.value];
58
- switch (op[0]) {
59
- case 0: case 1: t = op; break;
60
- case 4: _.label++; return { value: op[1], done: false };
61
- case 5: _.label++; y = op[1]; op = [0]; continue;
62
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
63
- default:
64
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
65
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
66
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
67
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
68
- if (t[2]) _.ops.pop();
69
- _.trys.pop(); continue;
70
- }
71
- op = body.call(thisArg, _);
72
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
73
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
74
- }
75
- };
76
- Object.defineProperty(exports, "__esModule", { value: true });
77
- exports.getClient = void 0;
78
- var httpRequest_1 = require("../httpRequest");
79
- var util_1 = require("../util");
80
- //import jwt from 'jsonwebtoken';
81
- var jwt = __importStar(require("../jwt"));
82
- ;
83
- //old, does not need refresh token
84
- function betterErr(desc) {
85
- return function (err) {
86
- var _a;
87
- var webRsp = err.response;
88
- if (webRsp) {
89
- throw {
90
- desc: desc,
91
- //...pick(webRsp, ['data', 'status', 'statusText', 'headers', 'config.url'])
92
- data: webRsp.data,
93
- status: webRsp.status,
94
- statusText: webRsp.statusText,
95
- headers: webRsp.headers,
96
- url: (_a = webRsp.config) === null || _a === void 0 ? void 0 : _a.url,
97
- };
98
- }
99
- throw err;
100
- };
101
- }
102
- function getClient(creds) {
103
- var _this = this;
104
- if (!creds.token) {
105
- if (!creds.private_key || !creds.private_key_id)
106
- throw "doRefresh needs private_key and private_key_id in creds";
107
- if (!creds.client_email)
108
- throw "missing client_email from creds";
109
- }
110
- var curClientData = {
111
- expirationTime: 0,
112
- curToken: '',
113
- };
114
- var getToken = function () {
115
- if (creds.token)
116
- return creds.token;
117
- var curTime = Math.floor(Date.now() / 1000);
118
- if (curClientData.curToken && curClientData.expirationTime < curTime) {
119
- return curClientData.curToken;
120
- }
121
- curClientData.curToken = jwt.signRs256(creds.private_key, {
122
- iss: creds.client_email,
123
- sub: creds.client_email,
124
- exp: 3600,
125
- aud: 'https://sheets.googleapis.com/',
126
- kid: creds.private_key_id,
127
- });
128
- /*
129
- curClientData.curToken = jwt.sign({
130
- //"iss": cred.client_email,
131
- //"sub": cred.client_email,
132
- "aud": "https://sheets.googleapis.com/",
133
- //"iat": unixTime,
134
- //"exp": unixTime
135
-
136
- "typ": "JWT",
137
- "kid": creds.private_key_id,
138
- }, creds.private_key, {
139
- "algorithm": "RS256",
140
- //"type": "JWT",
141
- expiresIn: 3600,
142
- issuer: creds.client_email,
143
- subject: creds.client_email,
144
- //"kid": cred.private_key_id
145
- });
146
- */
147
- curClientData.expirationTime = curTime + 3600 - 100;
148
- return curClientData.curToken;
149
- };
150
- var rootUrl = 'https://sheets.googleapis.com/v4/spreadsheets';
151
- var doOp = function (op, id, postFix, data) {
152
- var url = "".concat(rootUrl, "/").concat(id).concat(postFix);
153
- return (0, httpRequest_1.doHttpRequest)({
154
- url: url,
155
- headers: {
156
- "Content-Type": "application/json",
157
- "Authorization": "Bearer ".concat(getToken()),
158
- },
159
- method: op,
160
- data: data,
161
- }).then(function (r) {
162
- var data = r.data;
163
- if (data && data.error) {
164
- data.error.url = url;
165
- throw data.error;
166
- }
167
- return data;
168
- }).catch(betterErr("doOps error ".concat(url)));
169
- };
170
- var createTopNewSheet = function (data) {
171
- var url = rootUrl;
172
- return (0, httpRequest_1.doHttpRequest)({
173
- url: url,
174
- headers: {
175
- "Content-Type": "application/json",
176
- "Authorization": "Bearer ".concat(getToken()),
177
- },
178
- method: 'POST',
179
- data: data,
180
- }).then(function (r) {
181
- return (r.data);
182
- }).catch(betterErr("doOps error ".concat(url)));
183
- };
184
- var doPost = function (id, postFix, data) { return doOp('POST', id, postFix, data); };
185
- var doBatchUpdate = function (id, data) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
186
- return [2 /*return*/, doPost(id, ':batchUpdate', data)];
187
- }); }); };
188
- var append = function (_a, data, opts) {
189
- var id = _a.id, range = _a.range;
190
- return __awaiter(_this, void 0, void 0, function () {
191
- return __generator(this, function (_b) {
192
- switch (_b.label) {
193
- case 0:
194
- if (!opts) {
195
- opts = {};
196
- }
197
- if (!opts.valueInputOption)
198
- opts.valueInputOption = 'USER_ENTERED';
199
- return [4 /*yield*/, doPost(id, "/values/".concat(range, ":append?").concat((0, util_1.getFormData)(opts)), { values: data })];
200
- case 1: return [2 /*return*/, _b.sent()];
201
- }
202
- });
203
- });
204
- };
205
- var read = function (_a) {
206
- var id = _a.id, range = _a.range;
207
- return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_b) {
208
- switch (_b.label) {
209
- case 0: return [4 /*yield*/, doOp('GET', id, "/values/".concat(range))];
210
- case 1: return [2 /*return*/, (_b.sent())];
211
- }
212
- }); });
213
- };
214
- return {
215
- //access_token,
216
- //expires_on: new Date().getTime() + (expires_in * 1000 - 2000),
217
- //token_type,
218
- getToken: getToken,
219
- doBatchUpdate: doBatchUpdate,
220
- append: append,
221
- read: read,
222
- createTopNewSheet: createTopNewSheet,
223
- getSheetOps: function (id) {
224
- var getInfo = function () { return doOp('GET', id, ''); };
225
- var clear = function (sheetName, offset, clearRange) { return __awaiter(_this, void 0, void 0, function () {
226
- var range;
227
- return __generator(this, function (_a) {
228
- switch (_a.label) {
229
- case 0: return [4 /*yield*/, getSheetRange(sheetName, clearRange, offset)];
230
- case 1:
231
- range = _a.sent();
232
- return [4 /*yield*/, doOp('POST', id, "/values/".concat(range, ":clear"))];
233
- case 2: return [2 /*return*/, _a.sent()];
234
- }
235
- });
236
- }); };
237
- var createSheet = function (sheetId, title) { return __awaiter(_this, void 0, void 0, function () {
238
- return __generator(this, function (_a) {
239
- return [2 /*return*/, doBatchUpdate(id, {
240
- requests: [
241
- {
242
- addSheet: {
243
- properties: {
244
- sheetId: sheetId,
245
- title: title,
246
- }
247
- }
248
- }
249
- ]
250
- })];
251
- });
252
- }); };
253
- var deleteSheet = function (sheetId) { return __awaiter(_this, void 0, void 0, function () {
254
- return __generator(this, function (_a) {
255
- return [2 /*return*/, doBatchUpdate(id, {
256
- requests: [
257
- {
258
- deleteSheet: {
259
- sheetId: sheetId,
260
- }
261
- }
262
- ]
263
- })];
264
- });
265
- }); };
266
- var deleteSheetByName = function (title) { return __awaiter(_this, void 0, void 0, function () {
267
- var sheets, sheet;
268
- return __generator(this, function (_a) {
269
- switch (_a.label) {
270
- case 0: return [4 /*yield*/, sheetInfo()];
271
- case 1:
272
- sheets = _a.sent();
273
- sheet = sheets.find(function (s) { return s.title === title; });
274
- if (!sheet) return [3 /*break*/, 3];
275
- return [4 /*yield*/, deleteSheet(sheet.sheetId)];
276
- case 2: return [2 /*return*/, _a.sent()];
277
- case 3: return [2 /*return*/, {
278
- message: 'not found',
279
- }];
280
- }
281
- });
282
- }); };
283
- var sheetInfo = function () { return __awaiter(_this, void 0, void 0, function () {
284
- var sheetInfos;
285
- return __generator(this, function (_a) {
286
- switch (_a.label) {
287
- case 0: return [4 /*yield*/, getInfo()];
288
- case 1:
289
- sheetInfos = _a.sent();
290
- if (sheetInfos.error) {
291
- throw sheetInfos.error;
292
- }
293
- return [2 /*return*/, sheetInfos.sheets.map(function (s) {
294
- var props = s.properties;
295
- return __assign({ sheetId: props.sheetId, title: props.title, index: props.index }, props.gridProperties);
296
- })];
297
- }
298
- });
299
- }); };
300
- /// create sheet and deduct sheet Id from existing
301
- var autoCreateSheet = function (title) { return __awaiter(_this, void 0, void 0, function () {
302
- var sheets, sheet, maxId;
303
- return __generator(this, function (_a) {
304
- switch (_a.label) {
305
- case 0: return [4 /*yield*/, sheetInfo()];
306
- case 1:
307
- sheets = _a.sent();
308
- sheet = sheets.find(function (s) { return s.title === title; });
309
- if (sheet)
310
- return [2 /*return*/, {
311
- message: 'found'
312
- }];
313
- maxId = sheets.reduce(function (acc, s) {
314
- if (s.sheetId > acc) {
315
- acc = s.sheetId;
316
- }
317
- return acc;
318
- }, 0) + 1;
319
- return [4 /*yield*/, createSheet(maxId.toString(), title)];
320
- case 2: return [2 /*return*/, _a.sent()];
321
- }
322
- });
323
- }); };
324
- function getSheetRange(sheetName, readSize, offset) {
325
- if (readSize === void 0) { readSize = { row: 0, col: 0 }; }
326
- if (offset === void 0) { offset = { row: 0, col: 0 }; }
327
- return __awaiter(this, void 0, void 0, function () {
328
- var sheetInfos, info, endCol, appendOps, endRow;
329
- return __generator(this, function (_a) {
330
- switch (_a.label) {
331
- case 0:
332
- if (!(sheetName.indexOf('!') < 0)) return [3 /*break*/, 4];
333
- sheetName = sheetName.trim();
334
- return [4 /*yield*/, sheetInfo()];
335
- case 1:
336
- sheetInfos = _a.sent();
337
- info = sheetInfos.find(function (s) { return s.title === sheetName; });
338
- if (!info) {
339
- throw {
340
- message: "Error get sheet info for ".concat(id, " ").concat(sheetName),
341
- };
342
- }
343
- if (!readSize.col)
344
- readSize.col = info.columnCount;
345
- endCol = readSize.col + offset.col;
346
- appendOps = {
347
- row: 0,
348
- col: 0,
349
- };
350
- if (endCol > info.columnCount) {
351
- appendOps.col = endCol - info.columnCount;
352
- }
353
- if (!readSize.row)
354
- readSize.row = info.rowCount;
355
- endRow = readSize.row + offset.row;
356
- if (endRow > info.rowCount) {
357
- appendOps.row = endRow - info.rowCount;
358
- }
359
- if (!(appendOps.col || appendOps.row)) return [3 /*break*/, 3];
360
- return [4 /*yield*/, appendRowCols(info.sheetId, appendOps)];
361
- case 2:
362
- _a.sent();
363
- _a.label = 3;
364
- case 3: return [2 /*return*/, "'".concat(sheetName, "'!").concat((0, util_1.xcelPositionToColumnName)(offset.col)).concat(1 + offset.row, ":").concat((0, util_1.xcelPositionToColumnName)(endCol)).concat(endRow)];
365
- case 4: return [2 /*return*/, sheetName];
366
- }
367
- });
368
- });
369
- }
370
- function appendRowCols(sheetId, ap) {
371
- return __awaiter(this, void 0, void 0, function () {
372
- var requests;
373
- return __generator(this, function (_a) {
374
- requests = [];
375
- if (ap.col) {
376
- requests.push({
377
- appendDimension: {
378
- sheetId: sheetId,
379
- dimension: 'COLUMNS',
380
- length: ap.col,
381
- }
382
- });
383
- }
384
- if (ap.row) {
385
- requests.push({
386
- appendDimension: {
387
- sheetId: sheetId,
388
- dimension: 'ROWS',
389
- length: ap.row,
390
- }
391
- });
392
- }
393
- return [2 /*return*/, doBatchUpdate(id, { requests: requests })];
394
- });
395
- });
396
- }
397
- function readDataByColumnName(sheetName, readSize, offset) {
398
- if (readSize === void 0) { readSize = { row: 0, col: 0 }; }
399
- if (offset === void 0) { offset = { row: 0, col: 0 }; }
400
- return __awaiter(this, void 0, void 0, function () {
401
- var ret, columns, dataRow, data;
402
- return __generator(this, function (_a) {
403
- switch (_a.label) {
404
- case 0: return [4 /*yield*/, getSheetRange(sheetName, readSize, offset)];
405
- case 1:
406
- sheetName = _a.sent();
407
- return [4 /*yield*/, read({ id: id, range: sheetName })];
408
- case 2:
409
- ret = _a.sent();
410
- if (!ret.values) {
411
- throw {
412
- message: "bad data found for id ".concat(id, " sheet ").concat(sheetName),
413
- };
414
- }
415
- columns = ret.values[0];
416
- dataRow = ret.values.slice(1);
417
- data = dataRow.map(function (d) {
418
- return columns.reduce(function (acc, column, i) {
419
- acc[column] = d[i];
420
- return acc;
421
- }, {});
422
- });
423
- return [2 /*return*/, {
424
- message: 'OK',
425
- data: data,
426
- }];
427
- }
428
- });
429
- });
430
- }
431
- function readData(sheetName, readSize, offset) {
432
- if (offset === void 0) { offset = { row: 0, col: 0 }; }
433
- return __awaiter(this, void 0, void 0, function () {
434
- var ret, message;
435
- return __generator(this, function (_a) {
436
- switch (_a.label) {
437
- case 0: return [4 /*yield*/, getSheetRange(sheetName, readSize, offset)];
438
- case 1:
439
- sheetName = _a.sent();
440
- return [4 /*yield*/, read({ id: id, range: sheetName })];
441
- case 2:
442
- ret = _a.sent();
443
- message = ret.values ? 'OK' : "bad data found for id ".concat(id, " sheet ").concat(sheetName);
444
- return [2 /*return*/, {
445
- message: message,
446
- data: ret.values,
447
- }];
448
- }
449
- });
450
- });
451
- }
452
- var updateValues = function (range, values, opts) { return __awaiter(_this, void 0, void 0, function () {
453
- return __generator(this, function (_a) {
454
- switch (_a.label) {
455
- case 0:
456
- if (!opts) {
457
- opts = {
458
- valueInputOption: 'USER_ENTERED'
459
- };
460
- }
461
- if (!opts.valueInputOption)
462
- opts.valueInputOption = 'USER_ENTERED';
463
- return [4 /*yield*/, doOp('PUT', id, "/values/".concat(encodeURIComponent(range), "?").concat((0, util_1.getFormData)(opts)), {
464
- values: values,
465
- })];
466
- case 1: return [2 /*return*/, (_a.sent())];
467
- }
468
- });
469
- }); };
470
- function autoUpdateValues(sheetName, values, offset, opts) {
471
- return __awaiter(this, void 0, void 0, function () {
472
- var writeSize, range;
473
- return __generator(this, function (_a) {
474
- switch (_a.label) {
475
- case 0:
476
- if (!values || !values.length)
477
- return [2 /*return*/, null];
478
- writeSize = {
479
- col: values[0].length,
480
- row: values.length,
481
- };
482
- return [4 /*yield*/, getSheetRange(sheetName, writeSize, offset)];
483
- case 1:
484
- range = _a.sent();
485
- return [4 /*yield*/, updateValues(range, values, opts)];
486
- case 2: return [2 /*return*/, _a.sent()];
487
- }
488
- });
489
- });
490
- }
491
- return {
492
- doBatchUpdate: function (data) { return doBatchUpdate(id, data); },
493
- appendRowCols: appendRowCols,
494
- append: function (range, data, ops) { return append({ id: id, range: range }, data, ops); },
495
- read: function (range) { return read({ id: id, range: range }); },
496
- clear: clear,
497
- sheetInfo: sheetInfo,
498
- createSheet: createSheet,
499
- autoCreateSheet: autoCreateSheet,
500
- updateValues: updateValues,
501
- autoUpdateValues: autoUpdateValues,
502
- readDataByColumnName: readDataByColumnName,
503
- readData: readData,
504
- deleteSheet: deleteSheet,
505
- deleteSheetByName: deleteSheetByName,
506
- getSheetRange: getSheetRange,
507
- addSheet: function (title) { return __awaiter(_this, void 0, void 0, function () {
508
- var sheetsInfo, found, newId, existing;
509
- return __generator(this, function (_a) {
510
- switch (_a.label) {
511
- case 0: return [4 /*yield*/, sheetInfo()];
512
- case 1:
513
- sheetsInfo = _a.sent();
514
- found = sheetsInfo.find(function (s) { return s.title === title; });
515
- if (found) {
516
- return [2 /*return*/, {
517
- found: found,
518
- }];
519
- }
520
- newId = 0;
521
- for (;; newId++) {
522
- existing = sheetsInfo.find(function (s) { return s.sheetId === newId; });
523
- if (existing)
524
- continue;
525
- break;
526
- }
527
- return [2 /*return*/, createSheet(newId.toString(), title)];
528
- }
529
- });
530
- }); },
531
- };
532
- }
533
- };
534
- }
535
- exports.getClient = getClient;
536
- //test(true).catch(err => {
537
- ///console.log(err)
538
- //console.log(err.response.data);
539
- //})
540
- /*
541
- async function test2() {
542
- const creds = getClientCredsByEnv('gzperm');
543
- await getTokenFromCode(creds, '4/xxxx', 'http://localhost:3000');
544
- }
545
- console.log('invoking test2')
546
- test2().catch(err => {
547
- console.log('error');
548
- //console.log(err);
549
- console.log(err.response.text || err.response.data);
550
- })
551
- */
1
+ "use strict";
2
+ //rootUrl = 'https://accounts.google.com/o/oauth2/v2/auth';
3
+ //opts = { access_type: 'offline', scope: 'https://www.googleapis.com/auth/spreadsheets', response_type: 'code', client_id: 'client_id', redirect_uri: 'urn:ietf:wg:oauth:2.0:oob' }
4
+ //return rootUrl + '?' + querystring.stringify(opts);
5
+ //'https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fspreadsheets&response_type=code&client_id=client_id&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob'
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.getClient = getClient;
41
+ const httpRequest_1 = require("../httpRequest");
42
+ const util_1 = require("../util");
43
+ //import jwt from 'jsonwebtoken';
44
+ const jwt = __importStar(require("../jwt"));
45
+ ;
46
+ //old, does not need refresh token
47
+ function betterErr(desc) {
48
+ return err => {
49
+ const webRsp = err.response;
50
+ if (webRsp) {
51
+ throw {
52
+ desc,
53
+ //...pick(webRsp, ['data', 'status', 'statusText', 'headers', 'config.url'])
54
+ data: webRsp.data,
55
+ status: webRsp.status,
56
+ statusText: webRsp.statusText,
57
+ headers: webRsp.headers,
58
+ url: webRsp.config?.url,
59
+ };
60
+ }
61
+ throw err;
62
+ };
63
+ }
64
+ function getClient(creds) {
65
+ if (!creds.token) {
66
+ if (!creds.private_key || !creds.private_key_id)
67
+ throw `doRefresh needs private_key and private_key_id in creds`;
68
+ if (!creds.client_email)
69
+ throw `missing client_email from creds`;
70
+ }
71
+ const curClientData = {
72
+ expirationTime: 0,
73
+ curToken: '',
74
+ };
75
+ const getToken = () => {
76
+ if (creds.token)
77
+ return creds.token;
78
+ const curTime = Math.floor(Date.now() / 1000);
79
+ if (curClientData.curToken && curClientData.expirationTime < curTime) {
80
+ return curClientData.curToken;
81
+ }
82
+ curClientData.curToken = jwt.signRs256(creds.private_key, {
83
+ iss: creds.client_email,
84
+ sub: creds.client_email,
85
+ exp: 3600,
86
+ aud: 'https://sheets.googleapis.com/',
87
+ kid: creds.private_key_id,
88
+ });
89
+ /*
90
+ curClientData.curToken = jwt.sign({
91
+ //"iss": cred.client_email,
92
+ //"sub": cred.client_email,
93
+ "aud": "https://sheets.googleapis.com/",
94
+ //"iat": unixTime,
95
+ //"exp": unixTime
96
+
97
+ "typ": "JWT",
98
+ "kid": creds.private_key_id,
99
+ }, creds.private_key, {
100
+ "algorithm": "RS256",
101
+ //"type": "JWT",
102
+ expiresIn: 3600,
103
+ issuer: creds.client_email,
104
+ subject: creds.client_email,
105
+ //"kid": cred.private_key_id
106
+ });
107
+ */
108
+ curClientData.expirationTime = curTime + 3600 - 100;
109
+ return curClientData.curToken;
110
+ };
111
+ const rootUrl = 'https://sheets.googleapis.com/v4/spreadsheets';
112
+ const doOp = (op, id, postFix, data) => {
113
+ const url = `${rootUrl}/${id}${postFix}`;
114
+ return (0, httpRequest_1.doHttpRequest)({
115
+ url,
116
+ headers: {
117
+ "Content-Type": "application/json",
118
+ "Authorization": `Bearer ${getToken()}`,
119
+ },
120
+ method: op,
121
+ data,
122
+ }).then(r => {
123
+ const data = r.data;
124
+ if (data && data.error) {
125
+ data.error.url = url;
126
+ throw data.error;
127
+ }
128
+ return data;
129
+ }).catch(betterErr(`doOps error ${url}`));
130
+ };
131
+ const createTopNewSheet = (data) => {
132
+ const url = rootUrl;
133
+ return (0, httpRequest_1.doHttpRequest)({
134
+ url,
135
+ headers: {
136
+ "Content-Type": "application/json",
137
+ "Authorization": `Bearer ${getToken()}`,
138
+ },
139
+ method: 'POST',
140
+ data,
141
+ }).then(r => {
142
+ return (r.data);
143
+ }).catch(betterErr(`doOps error ${url}`));
144
+ };
145
+ const doPost = (id, postFix, data) => doOp('POST', id, postFix, data);
146
+ const doBatchUpdate = async (id, data) => doPost(id, ':batchUpdate', data);
147
+ const append = async ({ id, range }, data, opts) => {
148
+ if (!opts) {
149
+ opts = {};
150
+ }
151
+ if (!opts.valueInputOption)
152
+ opts.valueInputOption = 'USER_ENTERED';
153
+ return await doPost(id, `/values/${range}:append?${(0, util_1.getFormData)(opts)}`, { values: data });
154
+ };
155
+ const read = async ({ id, range }) => (await doOp('GET', id, `/values/${range}`));
156
+ return {
157
+ //access_token,
158
+ //expires_on: new Date().getTime() + (expires_in * 1000 - 2000),
159
+ //token_type,
160
+ getToken,
161
+ doBatchUpdate,
162
+ append,
163
+ read,
164
+ createTopNewSheet,
165
+ getSheetOps: id => {
166
+ const getInfo = () => doOp('GET', id, '');
167
+ const clear = async (sheetName, offset, clearRange) => {
168
+ const range = await getSheetRange(sheetName, clearRange, offset);
169
+ return await doOp('POST', id, `/values/${range}:clear`);
170
+ };
171
+ const createSheet = async (sheetId, title) => {
172
+ return doBatchUpdate(id, {
173
+ requests: [
174
+ {
175
+ addSheet: {
176
+ properties: {
177
+ sheetId,
178
+ title,
179
+ }
180
+ }
181
+ }
182
+ ]
183
+ });
184
+ };
185
+ const deleteSheet = async (sheetId) => {
186
+ return doBatchUpdate(id, {
187
+ requests: [
188
+ {
189
+ deleteSheet: {
190
+ sheetId,
191
+ }
192
+ }
193
+ ]
194
+ });
195
+ };
196
+ const deleteSheetByName = async (title) => {
197
+ const sheets = await sheetInfo();
198
+ const sheet = sheets.find(s => s.title === title);
199
+ if (sheet) {
200
+ return await deleteSheet(sheet.sheetId);
201
+ }
202
+ return {
203
+ message: 'not found',
204
+ };
205
+ };
206
+ const sheetInfo = async () => {
207
+ const sheetInfos = await getInfo();
208
+ if (sheetInfos.error) {
209
+ throw sheetInfos.error;
210
+ }
211
+ return sheetInfos.sheets.map(s => {
212
+ const props = s.properties;
213
+ return {
214
+ sheetId: props.sheetId,
215
+ title: props.title,
216
+ index: props.index, //not important,
217
+ ...props.gridProperties, //rowCount, columnCount
218
+ };
219
+ });
220
+ };
221
+ /// create sheet and deduct sheet Id from existing
222
+ const autoCreateSheet = async (title) => {
223
+ const sheets = await sheetInfo();
224
+ const sheet = sheets.find(s => s.title === title);
225
+ if (sheet)
226
+ return {
227
+ message: 'found'
228
+ };
229
+ const maxId = sheets.reduce((acc, s) => {
230
+ if (s.sheetId > acc) {
231
+ acc = s.sheetId;
232
+ }
233
+ return acc;
234
+ }, 0) + 1;
235
+ return await createSheet(maxId.toString(), title);
236
+ };
237
+ async function getSheetRange(sheetName, readSize = { row: 0, col: 0 }, offset = { row: 0, col: 0 }) {
238
+ if (sheetName.indexOf('!') < 0) {
239
+ sheetName = sheetName.trim();
240
+ const sheetInfos = await sheetInfo();
241
+ const info = sheetInfos.find(s => s.title === sheetName);
242
+ if (!info) {
243
+ throw {
244
+ message: `Error get sheet info for ${id} ${sheetName}`,
245
+ };
246
+ }
247
+ if (!readSize.col)
248
+ readSize.col = info.columnCount;
249
+ const endCol = readSize.col + offset.col;
250
+ const appendOps = {
251
+ row: 0,
252
+ col: 0,
253
+ };
254
+ if (endCol > info.columnCount) {
255
+ appendOps.col = endCol - info.columnCount;
256
+ }
257
+ if (!readSize.row)
258
+ readSize.row = info.rowCount;
259
+ const endRow = readSize.row + offset.row;
260
+ if (endRow > info.rowCount) {
261
+ appendOps.row = endRow - info.rowCount;
262
+ }
263
+ if (appendOps.col || appendOps.row) {
264
+ await appendRowCols(info.sheetId, appendOps);
265
+ }
266
+ return `'${sheetName}'!${(0, util_1.xcelPositionToColumnName)(offset.col)}${1 + offset.row}:${(0, util_1.xcelPositionToColumnName)(endCol)}${endRow}`;
267
+ }
268
+ return sheetName;
269
+ }
270
+ async function appendRowCols(sheetId, ap) {
271
+ const requests = [];
272
+ if (ap.col) {
273
+ requests.push({
274
+ appendDimension: {
275
+ sheetId,
276
+ dimension: 'COLUMNS',
277
+ length: ap.col,
278
+ }
279
+ });
280
+ }
281
+ if (ap.row) {
282
+ requests.push({
283
+ appendDimension: {
284
+ sheetId,
285
+ dimension: 'ROWS',
286
+ length: ap.row,
287
+ }
288
+ });
289
+ }
290
+ return doBatchUpdate(id, { requests });
291
+ }
292
+ async function readDataByColumnName(sheetName, readSize = { row: 0, col: 0 }, offset = { row: 0, col: 0 }) {
293
+ sheetName = await getSheetRange(sheetName, readSize, offset);
294
+ const ret = await read({ id, range: sheetName });
295
+ if (!ret.values) {
296
+ throw {
297
+ message: `bad data found for id ${id} sheet ${sheetName}`,
298
+ };
299
+ }
300
+ const columns = ret.values[0];
301
+ const dataRow = ret.values.slice(1);
302
+ const data = dataRow.map(d => {
303
+ return columns.reduce((acc, column, i) => {
304
+ acc[column] = d[i];
305
+ return acc;
306
+ }, {});
307
+ });
308
+ return {
309
+ message: 'OK',
310
+ data,
311
+ };
312
+ }
313
+ async function readData(sheetName, readSize, offset = { row: 0, col: 0 }) {
314
+ sheetName = await getSheetRange(sheetName, readSize, offset);
315
+ const ret = await read({ id, range: sheetName });
316
+ const message = ret.values ? 'OK' : `bad data found for id ${id} sheet ${sheetName}`;
317
+ return {
318
+ message,
319
+ data: ret.values,
320
+ };
321
+ }
322
+ const updateValues = async (range, values, opts) => {
323
+ if (!opts) {
324
+ opts = {
325
+ valueInputOption: 'USER_ENTERED'
326
+ };
327
+ }
328
+ if (!opts.valueInputOption)
329
+ opts.valueInputOption = 'USER_ENTERED';
330
+ return (await doOp('PUT', id, `/values/${encodeURIComponent(range)}?${(0, util_1.getFormData)(opts)}`, {
331
+ values,
332
+ }));
333
+ };
334
+ async function autoUpdateValues(sheetName, values, offset, opts) {
335
+ if (!values || !values.length)
336
+ return null;
337
+ const writeSize = {
338
+ col: values[0].length,
339
+ row: values.length,
340
+ };
341
+ const range = await getSheetRange(sheetName, writeSize, offset);
342
+ return await updateValues(range, values, opts);
343
+ }
344
+ return {
345
+ doBatchUpdate: data => doBatchUpdate(id, data),
346
+ appendRowCols,
347
+ append: (range, data, ops) => append({ id, range }, data, ops),
348
+ read: range => read({ id, range }),
349
+ clear,
350
+ sheetInfo,
351
+ createSheet,
352
+ autoCreateSheet,
353
+ updateValues,
354
+ autoUpdateValues,
355
+ readDataByColumnName,
356
+ readData,
357
+ deleteSheet,
358
+ deleteSheetByName,
359
+ getSheetRange,
360
+ addSheet: async (title) => {
361
+ const sheetsInfo = await sheetInfo();
362
+ //input YYYY, sheetId,
363
+ const found = sheetsInfo.find(s => s.title === title);
364
+ if (found) {
365
+ return {
366
+ found,
367
+ };
368
+ }
369
+ let newId = 0;
370
+ for (;; newId++) {
371
+ const existing = sheetsInfo.find(s => s.sheetId === newId);
372
+ if (existing)
373
+ continue;
374
+ break;
375
+ }
376
+ return createSheet(newId.toString(), title);
377
+ },
378
+ };
379
+ }
380
+ };
381
+ }
382
+ //test(true).catch(err => {
383
+ ///console.log(err)
384
+ //console.log(err.response.data);
385
+ //})
386
+ /*
387
+ async function test2() {
388
+ const creds = getClientCredsByEnv('gzperm');
389
+ await getTokenFromCode(creds, '4/xxxx', 'http://localhost:3000');
390
+ }
391
+ console.log('invoking test2')
392
+ test2().catch(err => {
393
+ console.log('error');
394
+ //console.log(err);
395
+ console.log(err.response.text || err.response.data);
396
+ })
397
+ */
552
398
  //# sourceMappingURL=googleApiServiceAccount.js.map