@8ms/helpers 1.1.17 → 1.1.20

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.
@@ -0,0 +1,14 @@
1
+ export declare type CopyFileType = {
2
+ bucket: string;
3
+ key: string;
4
+ };
5
+ /**
6
+ * Copy a file from one bucket/path to another bucket/path.
7
+ */
8
+ declare const copyFile: ({ S3Lib, client, from, to }: {
9
+ S3Lib: any;
10
+ client: any;
11
+ from: CopyFileType;
12
+ to: CopyFileType;
13
+ }) => Promise<void>;
14
+ export default copyFile;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ /**
40
+ * Copy a file from one bucket/path to another bucket/path.
41
+ */
42
+ var copyFile = function (_a) {
43
+ var S3Lib = _a.S3Lib, client = _a.client, from = _a.from, to = _a.to;
44
+ return __awaiter(void 0, void 0, void 0, function () {
45
+ var CopyObjectCommand;
46
+ return __generator(this, function (_b) {
47
+ switch (_b.label) {
48
+ case 0:
49
+ CopyObjectCommand = S3Lib.CopyObjectCommand;
50
+ return [4 /*yield*/, client.send(new CopyObjectCommand({
51
+ Bucket: to.bucket,
52
+ CopySource: encodeURIComponent("".concat(from.bucket, "/").concat(from.key)),
53
+ Key: to.key,
54
+ }))];
55
+ case 1:
56
+ _b.sent();
57
+ return [2 /*return*/];
58
+ }
59
+ });
60
+ });
61
+ };
62
+ exports.default = copyFile;
@@ -1,3 +1,4 @@
1
+ import copyFile from './copyFile';
1
2
  import deleteFile from './deleteFile';
2
3
  import deleteFiles from './deleteFiles';
3
4
  import deleteFolder from './deleteFolder';
@@ -6,10 +7,11 @@ import getPresignedPost from './getPresignedPost';
6
7
  import getSignedUrl from './getSignedUrl';
7
8
  import listFiles from './listFiles';
8
9
  import listFolders from './listFolders';
10
+ import moveFile from './moveFile';
9
11
  import readBuffer, { ReadBufferType } from './readBuffer';
10
12
  import readFile, { ReadFileType, ReadType } from './readFile';
11
13
  import writeFile from './writeFile';
12
14
  import writeGlueJsonFile from './writeGlueJsonFile';
13
15
  import writePresignedPost from './writePresignedPost';
14
16
  export type { ReadType, ReadBufferType, ReadFileType, };
15
- export { deleteFolder, deleteFile, deleteFiles, getClient, getPresignedPost, getSignedUrl, listFiles, listFolders, readBuffer, readFile, writeFile, writeGlueJsonFile, writePresignedPost, };
17
+ export { copyFile, deleteFolder, deleteFile, deleteFiles, getClient, getPresignedPost, getSignedUrl, listFiles, listFolders, moveFile, readBuffer, readFile, writeFile, writeGlueJsonFile, writePresignedPost, };
@@ -3,7 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.writePresignedPost = exports.writeGlueJsonFile = exports.writeFile = exports.readFile = exports.readBuffer = exports.listFolders = exports.listFiles = exports.getSignedUrl = exports.getPresignedPost = exports.getClient = exports.deleteFiles = exports.deleteFile = exports.deleteFolder = void 0;
6
+ exports.writePresignedPost = exports.writeGlueJsonFile = exports.writeFile = exports.readFile = exports.readBuffer = exports.moveFile = exports.listFolders = exports.listFiles = exports.getSignedUrl = exports.getPresignedPost = exports.getClient = exports.deleteFiles = exports.deleteFile = exports.deleteFolder = exports.copyFile = void 0;
7
+ var copyFile_1 = __importDefault(require("./copyFile"));
8
+ exports.copyFile = copyFile_1.default;
7
9
  var deleteFile_1 = __importDefault(require("./deleteFile"));
8
10
  exports.deleteFile = deleteFile_1.default;
9
11
  var deleteFiles_1 = __importDefault(require("./deleteFiles"));
@@ -20,6 +22,8 @@ var listFiles_1 = __importDefault(require("./listFiles"));
20
22
  exports.listFiles = listFiles_1.default;
21
23
  var listFolders_1 = __importDefault(require("./listFolders"));
22
24
  exports.listFolders = listFolders_1.default;
25
+ var moveFile_1 = __importDefault(require("./moveFile"));
26
+ exports.moveFile = moveFile_1.default;
23
27
  var readBuffer_1 = __importDefault(require("./readBuffer"));
24
28
  exports.readBuffer = readBuffer_1.default;
25
29
  var readFile_1 = __importDefault(require("./readFile"));
@@ -0,0 +1,11 @@
1
+ import { CopyFileType } from './copyFile';
2
+ /**
3
+ * It's not possible to just move or rename a file, you must copy then delete the old file.
4
+ */
5
+ declare const moveFile: ({ S3Lib, client, from, to }: {
6
+ S3Lib: any;
7
+ client: any;
8
+ from: CopyFileType;
9
+ to: CopyFileType;
10
+ }) => Promise<void>;
11
+ export default moveFile;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ var copyFile_1 = __importDefault(require("./copyFile"));
43
+ var deleteFile_1 = __importDefault(require("./deleteFile"));
44
+ /**
45
+ * It's not possible to just move or rename a file, you must copy then delete the old file.
46
+ */
47
+ var moveFile = function (_a) {
48
+ var S3Lib = _a.S3Lib, client = _a.client, from = _a.from, to = _a.to;
49
+ return __awaiter(void 0, void 0, void 0, function () {
50
+ return __generator(this, function (_b) {
51
+ switch (_b.label) {
52
+ case 0: return [4 /*yield*/, (0, copyFile_1.default)({
53
+ S3Lib: S3Lib,
54
+ client: client,
55
+ from: from,
56
+ to: to,
57
+ })];
58
+ case 1:
59
+ _b.sent();
60
+ return [4 /*yield*/, (0, deleteFile_1.default)({
61
+ S3Lib: S3Lib,
62
+ bucket: from.bucket,
63
+ client: client,
64
+ key: from.key,
65
+ })];
66
+ case 2:
67
+ _b.sent();
68
+ return [2 /*return*/];
69
+ }
70
+ });
71
+ });
72
+ };
73
+ exports.default = moveFile;
@@ -1,9 +1,5 @@
1
- /**
2
- * Encrypt a string using sha256
3
- * Library: crypto-js
4
- */
5
1
  declare const getSha256: ({ CryptoLib, input }: {
6
2
  CryptoLib: any;
7
- input: string;
3
+ input: any;
8
4
  }) => string;
9
5
  export default getSha256;
@@ -4,10 +4,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  * Encrypt a string using sha256
5
5
  * Library: crypto-js
6
6
  */
7
+ var string_1 = require("../string");
7
8
  var getSha256 = function (_a) {
8
9
  var CryptoLib = _a.CryptoLib, input = _a.input;
9
10
  var SHA256 = CryptoLib.SHA256;
10
- return SHA256(input)
11
+ var inputString = (0, string_1.getString)({ input: input });
12
+ return SHA256(inputString)
11
13
  .toString();
12
14
  };
13
15
  exports.default = getSha256;
@@ -1,8 +1,10 @@
1
1
  import { DateType } from './date';
2
+ declare type GetDateType = {
3
+ input: DateType;
4
+ setMidnight?: boolean;
5
+ };
2
6
  /**
3
7
  * Convert a (number | string | Date) into a Date object.
4
8
  */
5
- declare const getDate: ({ input }: {
6
- input: DateType;
7
- }) => Date;
9
+ declare const getDate: ({ input, setMidnight }: GetDateType) => Date;
8
10
  export default getDate;
@@ -3,36 +3,47 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- var addHours_1 = __importDefault(require("date-fns/addHours"));
7
6
  var parse_1 = __importDefault(require("date-fns/parse"));
8
- var subHours_1 = __importDefault(require("date-fns/subHours"));
9
7
  /**
10
8
  * Convert a (number | string | Date) into a Date object.
11
9
  */
12
10
  var getDate = function (_a) {
13
- var input = _a.input;
11
+ var input = _a.input, _b = _a.setMidnight, setMidnight = _b === void 0 ? true : _b;
14
12
  var date;
15
13
  if (input instanceof Date) {
16
14
  date = new Date(input.valueOf());
17
15
  }
18
- else if ('string' === typeof input) {
19
- var dateString = input.toString() + ' 00:00:00';
20
- date = (0, parse_1.default)(dateString, 'yyyy-MM-dd HH:mm:ss', new Date());
16
+ else if ('string' === typeof input || 'number' === typeof input) {
17
+ // Convert the input into string
18
+ var dateString = input.toString();
19
+ // 20220412
20
+ if (8 === dateString.length) {
21
+ var year = Number(dateString.substring(0, 4));
22
+ var month = Number(dateString.substring(4, 6));
23
+ var day = Number(dateString.substring(6, 8));
24
+ if (year > 999 && month < 13 && day < 32) {
25
+ date = new Date();
26
+ date.setUTCFullYear(year);
27
+ date.setUTCMonth(month - 1);
28
+ date.setUTCDate(day);
29
+ }
30
+ }
31
+ // 2022-04-12
32
+ else if (10 === dateString.length) {
33
+ var dateTimeString = dateString + ' 00:00:00s';
34
+ date = (0, parse_1.default)(dateTimeString, 'yyyy-MM-dd HH:mm:ss', new Date());
35
+ }
36
+ // 2022-04-12 01:01:01
37
+ else if (19 === dateString.length) {
38
+ date = (0, parse_1.default)(dateString, 'yyyy-MM-dd HH:mm:ss', new Date());
39
+ }
40
+ // Unsure date format, try anything
41
+ else {
42
+ date = new Date(dateString);
43
+ }
21
44
  }
22
- else if ('number' === typeof input) {
23
- var dateString = input.toString() + ' 00:00:00';
24
- date = (0, parse_1.default)(dateString, 'yyyyMMdd HH:mm:ss', new Date());
25
- }
26
- // Behind an hour (going back to DST)
27
- if (date.getTimezoneOffset() < 0) {
28
- date = (0, addHours_1.default)(date, 1);
29
- }
30
- // Forward an hour (going into BST)
31
- else if (date.getTimezoneOffset() > 0) {
32
- date = (0, subHours_1.default)(date, 1);
33
- }
34
- // Otherwise set to UTC hours
35
- else {
45
+ // Reset to UTC hours
46
+ if (setMidnight) {
36
47
  date.setHours(0, 0, 0, 0);
37
48
  }
38
49
  return date;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Convert an excel date "e.g. 44216" into a JavaScript date object.
3
+ * https://stackoverflow.com/questions/16229494/converting-excel-date-serial-number-to-date-using-javascript
4
+ */
5
+ declare const getExcelDate: ({ input }: {
6
+ input: number;
7
+ }) => Date;
8
+ export default getExcelDate;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Convert an excel date "e.g. 44216" into a JavaScript date object.
5
+ * https://stackoverflow.com/questions/16229494/converting-excel-date-serial-number-to-date-using-javascript
6
+ */
7
+ var getExcelDate = function (_a) {
8
+ var input = _a.input;
9
+ var utcDates = Math.floor(input - 25569);
10
+ var utcValue = utcDates * 86400;
11
+ var dateInfo = new Date(utcValue * 1000);
12
+ var fractionalDay = input - Math.floor(input) + 0.0000001;
13
+ var totalSeconds = Math.floor(86400 * fractionalDay);
14
+ var seconds = totalSeconds % 60;
15
+ totalSeconds -= seconds;
16
+ var hours = Math.floor(totalSeconds / (60 * 60));
17
+ var minutes = Math.floor(totalSeconds / 60) % 60;
18
+ return new Date(dateInfo.getFullYear(), dateInfo.getMonth(), dateInfo.getDate(), hours, minutes, seconds);
19
+ };
20
+ exports.default = getExcelDate;
@@ -8,6 +8,7 @@ import format from './format';
8
8
  import getDate from './getDate';
9
9
  import getDurationHours from './getDurationHours';
10
10
  import getDurationMinutes from './getDurationMinutes';
11
+ import getExcelDate from './getExcelDate';
11
12
  import getFinancialYear from './getFinancialYear';
12
13
  import getFinancialYearToDate from './getFinancialYearToDate';
13
14
  import getFinancialYearWeeks from './getFinancialYearWeeks';
@@ -31,4 +32,4 @@ import { predefinedTimeframes, PredefinedTimeframesType } from './predefinedTime
31
32
  import { TimeframeType } from './timeframe';
32
33
  import { timeframes } from './timeframes';
33
34
  export type { DateType, DurationType, FinancialYearType, FinancialYearWeekType, PredefinedTimeframesType, TimeframeType, };
34
- export { durations, durationComparisons, predefinedTimeframes, timeframes, format, getDate, getDurationHours, getDurationMinutes, getFinancialYear, getFinancialYearToDate, getFinancialYearWeeks, getLastWeek, getMax, getMin, getMonday, getNumber, getPredefinedTimeframe, getSunday, getThisWeek, getToday, getTwoWeeksAgo, getWeeksAgo, getYesterday, isDateValid, isLastWeek, isThisWeek, parseExcelDate, };
35
+ export { durations, durationComparisons, predefinedTimeframes, timeframes, format, getDate, getDurationHours, getDurationMinutes, getExcelDate, getFinancialYear, getFinancialYearToDate, getFinancialYearWeeks, getLastWeek, getMax, getMin, getMonday, getNumber, getPredefinedTimeframe, getSunday, getThisWeek, getToday, getTwoWeeksAgo, getWeeksAgo, getYesterday, isDateValid, isLastWeek, isThisWeek, parseExcelDate, };
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.parseExcelDate = exports.isThisWeek = exports.isLastWeek = exports.isDateValid = exports.getYesterday = exports.getWeeksAgo = exports.getTwoWeeksAgo = exports.getToday = exports.getThisWeek = exports.getSunday = exports.getPredefinedTimeframe = exports.getNumber = exports.getMonday = exports.getMin = exports.getMax = exports.getLastWeek = exports.getFinancialYearWeeks = exports.getFinancialYearToDate = exports.getFinancialYear = exports.getDurationMinutes = exports.getDurationHours = exports.getDate = exports.format = exports.timeframes = exports.predefinedTimeframes = exports.durationComparisons = exports.durations = void 0;
6
+ exports.parseExcelDate = exports.isThisWeek = exports.isLastWeek = exports.isDateValid = exports.getYesterday = exports.getWeeksAgo = exports.getTwoWeeksAgo = exports.getToday = exports.getThisWeek = exports.getSunday = exports.getPredefinedTimeframe = exports.getNumber = exports.getMonday = exports.getMin = exports.getMax = exports.getLastWeek = exports.getFinancialYearWeeks = exports.getFinancialYearToDate = exports.getFinancialYear = exports.getExcelDate = exports.getDurationMinutes = exports.getDurationHours = exports.getDate = exports.format = exports.timeframes = exports.predefinedTimeframes = exports.durationComparisons = exports.durations = void 0;
7
7
  var durationComparisons_1 = require("./durationComparisons");
8
8
  Object.defineProperty(exports, "durationComparisons", { enumerable: true, get: function () { return durationComparisons_1.durationComparisons; } });
9
9
  var durations_1 = require("./durations");
@@ -16,6 +16,8 @@ var getDurationHours_1 = __importDefault(require("./getDurationHours"));
16
16
  exports.getDurationHours = getDurationHours_1.default;
17
17
  var getDurationMinutes_1 = __importDefault(require("./getDurationMinutes"));
18
18
  exports.getDurationMinutes = getDurationMinutes_1.default;
19
+ var getExcelDate_1 = __importDefault(require("./getExcelDate"));
20
+ exports.getExcelDate = getExcelDate_1.default;
19
21
  var getFinancialYear_1 = __importDefault(require("./getFinancialYear"));
20
22
  exports.getFinancialYear = getFinancialYear_1.default;
21
23
  var getFinancialYearToDate_1 = __importDefault(require("./getFinancialYearToDate"));
@@ -0,0 +1,20 @@
1
+ export declare type AssociateDataRequestType = {
2
+ spreadsheetId: string;
3
+ ranges: [
4
+ format: string,
5
+ defaultRange: string,
6
+ heading: string,
7
+ data: string
8
+ ];
9
+ dateTimeRender: 'FORMATTED_STRING' | 'SERIAL_NUMBER';
10
+ valueRender: 'FORMATTED_VALUE' | 'UNFORMATTED_VALUE' | 'FORMULA';
11
+ };
12
+ /**
13
+ * Make a batch get to Google Sheets to retrieve the data correctly formatted, with default values provided.
14
+ */
15
+ declare const getAssociatedData: ({ SheetsLib, client, request }: {
16
+ SheetsLib: any;
17
+ client: any;
18
+ request: AssociateDataRequestType;
19
+ }) => Promise<object[]>;
20
+ export default getAssociatedData;
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ var isUndefined_1 = __importDefault(require("lodash/isUndefined"));
43
+ var getBatchData_1 = __importDefault(require("./getBatchData"));
44
+ /**
45
+ * Make a batch get to Google Sheets to retrieve the data correctly formatted, with default values provided.
46
+ */
47
+ var getAssociatedData = function (_a) {
48
+ var SheetsLib = _a.SheetsLib, client = _a.client, request = _a.request;
49
+ return __awaiter(void 0, void 0, void 0, function () {
50
+ var apiResponse, template, response, initialRangeLength, i, rowIndex, row, columnIndex, refValue, value;
51
+ return __generator(this, function (_b) {
52
+ switch (_b.label) {
53
+ case 0: return [4 /*yield*/, (0, getBatchData_1.default)({
54
+ SheetsLib: SheetsLib,
55
+ client: client,
56
+ spreadsheetId: request.spreadsheetId,
57
+ ranges: request.ranges,
58
+ dateTimeRender: request.dateTimeRender,
59
+ valueRender: request.valueRender,
60
+ })];
61
+ case 1:
62
+ apiResponse = _b.sent();
63
+ template = [];
64
+ response = [];
65
+ // Missing ranges or too many ranges
66
+ if (4 !== apiResponse.valueRanges.length) {
67
+ throw new Error("Associated data response length must be 4.");
68
+ }
69
+ initialRangeLength = apiResponse.valueRanges[0].values[0].length;
70
+ // Loop through the headings
71
+ for (i = 0; i < initialRangeLength; i++) {
72
+ template.push({
73
+ format: apiResponse.valueRanges[0].values[0][i],
74
+ default: apiResponse.valueRanges[1].values[0][i],
75
+ heading: apiResponse.valueRanges[2].values[0][i],
76
+ index: i,
77
+ });
78
+ }
79
+ // console.log('template', template);
80
+ // Loop through each row of data
81
+ if (!(0, isUndefined_1.default)(apiResponse.valueRanges[3].values)) {
82
+ for (rowIndex = 0; rowIndex < apiResponse.valueRanges[3].values.length; rowIndex++) {
83
+ row = {};
84
+ // Loop through each column within the row
85
+ for (columnIndex = 0; columnIndex < apiResponse.valueRanges[3].values[rowIndex].length; columnIndex++) {
86
+ refValue = apiResponse.valueRanges[3].values[rowIndex][columnIndex];
87
+ value = ('' === refValue ? template[columnIndex]['default'] : refValue);
88
+ // Add this to our row
89
+ row[template[columnIndex]['heading']] = value;
90
+ }
91
+ // Add the row to our response
92
+ response.push(row);
93
+ }
94
+ }
95
+ return [2 /*return*/, response];
96
+ }
97
+ });
98
+ });
99
+ };
100
+ exports.default = getAssociatedData;
@@ -0,0 +1,20 @@
1
+ declare type BatchRangeResponse = {
2
+ spreadsheetId: string;
3
+ valueRanges: {
4
+ range: string;
5
+ majorDimension: 'rows' | 'dimension';
6
+ values: [
7
+ any[]
8
+ ];
9
+ }[];
10
+ };
11
+ declare type BatchDataRequestType = {
12
+ SheetsLib: any;
13
+ client: any;
14
+ spreadsheetId: string;
15
+ ranges: string[];
16
+ dateTimeRender?: string;
17
+ valueRender?: string;
18
+ };
19
+ declare const getBatchData: ({ SheetsLib, client, spreadsheetId, ranges, dateTimeRender, valueRender, }: BatchDataRequestType) => Promise<BatchRangeResponse>;
20
+ export default getBatchData;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ var getBatchData = function (_a) {
40
+ var SheetsLib = _a.SheetsLib, client = _a.client, spreadsheetId = _a.spreadsheetId, ranges = _a.ranges, _b = _a.dateTimeRender, dateTimeRender = _b === void 0 ? 'FORMATTED_STRING' : _b, _c = _a.valueRender, valueRender = _c === void 0 ? 'UNFORMATTED_VALUE' : _c;
41
+ return __awaiter(void 0, void 0, void 0, function () {
42
+ var request, data;
43
+ return __generator(this, function (_d) {
44
+ switch (_d.label) {
45
+ case 0:
46
+ request = {
47
+ auth: client,
48
+ dateTimeRenderOption: dateTimeRender,
49
+ ranges: ranges,
50
+ spreadsheetId: spreadsheetId,
51
+ valueRenderOption: valueRender,
52
+ };
53
+ return [4 /*yield*/, SheetsLib.sheets('v4')
54
+ .spreadsheets
55
+ .values
56
+ .batchGet(request)];
57
+ case 1:
58
+ data = (_d.sent()).data;
59
+ return [2 /*return*/, data];
60
+ }
61
+ });
62
+ });
63
+ };
64
+ exports.default = getBatchData;
@@ -1,3 +1,6 @@
1
1
  import getAuth from './getAuth';
2
+ import getAssociatedData from './getAssociatedData';
3
+ import getBatchData from './getBatchData';
4
+ import isCellNa from './isCellNa';
2
5
  export type {};
3
- export { getAuth, };
6
+ export { getAssociatedData, getAuth, getBatchData, isCellNa, };
@@ -3,6 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getAuth = void 0;
6
+ exports.isCellNa = exports.getBatchData = exports.getAuth = exports.getAssociatedData = void 0;
7
7
  var getAuth_1 = __importDefault(require("./getAuth"));
8
8
  exports.getAuth = getAuth_1.default;
9
+ var getAssociatedData_1 = __importDefault(require("./getAssociatedData"));
10
+ exports.getAssociatedData = getAssociatedData_1.default;
11
+ var getBatchData_1 = __importDefault(require("./getBatchData"));
12
+ exports.getBatchData = getBatchData_1.default;
13
+ var isCellNa_1 = __importDefault(require("./isCellNa"));
14
+ exports.isCellNa = isCellNa_1.default;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Noticed sometimes Google Sheets can struggle with import XML resulting to N/A values.
3
+ */
4
+ declare const isCellNa: ({ input }: {
5
+ input: any;
6
+ }) => boolean;
7
+ export default isCellNa;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Noticed sometimes Google Sheets can struggle with import XML resulting to N/A values.
5
+ */
6
+ var isCellNa = function (_a) {
7
+ var input = _a.input;
8
+ return '#N/A' === input;
9
+ };
10
+ exports.default = isCellNa;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Convert into string.
3
+ */
4
+ declare const getString: ({ input }: {
5
+ input: any;
6
+ }) => string;
7
+ export default getString;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var isArray_1 = __importDefault(require("lodash/isArray"));
7
+ var isDate_1 = __importDefault(require("lodash/isDate"));
8
+ var isNumber_1 = __importDefault(require("lodash/isNumber"));
9
+ var isObject_1 = __importDefault(require("lodash/isObject"));
10
+ var isString_1 = __importDefault(require("lodash/isString"));
11
+ var date_1 = require("../date");
12
+ /**
13
+ * Convert into string.
14
+ */
15
+ var getString = function (_a) {
16
+ var input = _a.input;
17
+ var string = '';
18
+ // Already a string
19
+ if ((0, isString_1.default)(input)) {
20
+ string = input;
21
+ }
22
+ // Convert a number into a date
23
+ else if ((0, isNumber_1.default)(input)) {
24
+ string = input.toString();
25
+ }
26
+ // Object or array to JSON
27
+ else if ((0, isObject_1.default)(input) || (0, isArray_1.default)(input)) {
28
+ string = JSON.stringify(input);
29
+ }
30
+ // Date
31
+ else if ((0, isDate_1.default)(input)) {
32
+ string = (0, date_1.getNumber)({ input: input })
33
+ .toString();
34
+ }
35
+ return string;
36
+ };
37
+ exports.default = getString;
@@ -1,5 +1,6 @@
1
1
  import formatCapitalise from './formatCapitalise';
2
2
  import getCleanFolder from './getCleanFolder';
3
+ import getString from './getString';
3
4
  import getStringFromStream from './getStringFromStream';
4
5
  export type {};
5
- export { formatCapitalise, getCleanFolder, getStringFromStream, };
6
+ export { formatCapitalise, getCleanFolder, getString, getStringFromStream, };
@@ -3,10 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getStringFromStream = exports.getCleanFolder = exports.formatCapitalise = void 0;
6
+ exports.getStringFromStream = exports.getString = exports.getCleanFolder = exports.formatCapitalise = void 0;
7
7
  var formatCapitalise_1 = __importDefault(require("./formatCapitalise"));
8
8
  exports.formatCapitalise = formatCapitalise_1.default;
9
9
  var getCleanFolder_1 = __importDefault(require("./getCleanFolder"));
10
10
  exports.getCleanFolder = getCleanFolder_1.default;
11
+ var getString_1 = __importDefault(require("./getString"));
12
+ exports.getString = getString_1.default;
11
13
  var getStringFromStream_1 = __importDefault(require("./getStringFromStream"));
12
14
  exports.getStringFromStream = getStringFromStream_1.default;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Return a string "With Proper Casing".
3
+ */
4
+ declare const toProperCase: ({ input }: {
5
+ input: any;
6
+ }) => string;
7
+ export default toProperCase;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var getString_1 = __importDefault(require("./getString"));
7
+ /**
8
+ * Return a string "With Proper Casing".
9
+ */
10
+ var toProperCase = function (_a) {
11
+ var input = _a.input;
12
+ var preparedInput = (0, getString_1.default)({ input: input });
13
+ var clean = preparedInput.split('_')
14
+ .join(' ');
15
+ return clean.replace(/\w\S*/g, function (word) { return word.charAt(0)
16
+ .toUpperCase() + word.substr(1)
17
+ .toLowerCase(); });
18
+ };
19
+ exports.default = toProperCase;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@8ms/helpers",
3
- "version": "1.1.17",
3
+ "version": "1.1.20",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/8millionstories-organisation/8ms-helpers-ts.git"
@@ -25,6 +25,7 @@
25
25
  "@types/node": "17.0.23",
26
26
  "babel-jest": "27.5.1",
27
27
  "crypto-js": "4.1.1",
28
+ "date-fns-tz": "1.3.3",
28
29
  "jest": "27.5.1",
29
30
  "ts-node": "10.7.0",
30
31
  "tslib": "2.3.1",