@orioro/util 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ type PaginatedFetchParams = {
2
+ offset: number;
3
+ pageSize: number;
4
+ };
5
+ export declare function paginatedHttpFetch({ pageUrl, parseResponse, }: {
6
+ pageUrl: (params: PaginatedFetchParams) => string;
7
+ parseResponse?: (response: Response) => any[] | Promise<any[]>;
8
+ }): (params: PaginatedFetchParams) => Promise<any[]>;
9
+ export type DataStore = {
10
+ getSize: () => number | Promise<number>;
11
+ storePage: (data: any[], params: PaginatedFetchParams) => any | Promise<any>;
12
+ getResult: () => any;
13
+ };
14
+ export declare function inMemoryDataStore(): DataStore;
15
+ export type FetchAllPagesOptions = {
16
+ fetchPage: (params: PaginatedFetchParams) => Promise<any[]>;
17
+ pageSize?: number;
18
+ dataStore?: () => DataStore;
19
+ };
20
+ export declare function fetchAllPages({ fetchPage, pageSize, dataStore, }: FetchAllPagesOptions): Promise<any>;
21
+ export {};
@@ -0,0 +1 @@
1
+ export * from './fetchAllPages';
package/dist/index.d.ts CHANGED
@@ -7,3 +7,4 @@ export * from './promise';
7
7
  export * from './switchValue';
8
8
  export * from './typeOf';
9
9
  export * from './validate';
10
+ export * from './crawling';
package/dist/index.mjs CHANGED
@@ -523,7 +523,8 @@ function batchFn(itemFn, _a) {
523
523
  skip = _b.skip,
524
524
  _d = _b.retry,
525
525
  retry = _d === void 0 ? false : _d,
526
- timeout = _b.timeout;
526
+ timeout = _b.timeout,
527
+ rollback = _b.rollback;
527
528
  //
528
529
  // Optionally wrap itemFn into timeout
529
530
  //
@@ -550,11 +551,11 @@ function batchFn(itemFn, _a) {
550
551
  });
551
552
  return [4 /*yield*/, Promise.all(batchItems.map(function (item) {
552
553
  return __awaiter(_this, void 0, void 0, function () {
553
- var itemSkip, itemResult, _a, err_1;
554
+ var itemSkip, itemResult, _a, err_1, rollbackErr_1;
554
555
  return __generator(this, function (_b) {
555
556
  switch (_b.label) {
556
557
  case 0:
557
- _b.trys.push([0, 5,, 6]);
558
+ _b.trys.push([0, 5,, 10]);
558
559
  promise.emit('itemStart', {
559
560
  batch: batch,
560
561
  item: item
@@ -601,8 +602,21 @@ function batchFn(itemFn, _a) {
601
602
  item: item,
602
603
  result: err_1
603
604
  });
604
- return [2 /*return*/, err_1];
605
+ if (!(typeof rollback === 'function')) return [3 /*break*/, 9];
606
+ _b.label = 6;
605
607
  case 6:
608
+ _b.trys.push([6, 8,, 9]);
609
+ return [4 /*yield*/, rollback(item, err_1)];
610
+ case 7:
611
+ _b.sent();
612
+ return [3 /*break*/, 9];
613
+ case 8:
614
+ rollbackErr_1 = _b.sent();
615
+ console.error('Failure rolling back', rollbackErr_1);
616
+ return [3 /*break*/, 9];
617
+ case 9:
618
+ return [2 /*return*/, err_1];
619
+ case 10:
606
620
  return [2 /*return*/];
607
621
  }
608
622
  });
@@ -1522,4 +1536,87 @@ validateAsync.or = or;
1522
1536
  validateAsync.not = not;
1523
1537
  validateAsync.assertValid = assertValidAsync;
1524
1538
 
1525
- export { PromiseLikeEventEmitter, SKIPPED, TimeoutError, ValidationError, batchFn, debugFn, deepFreeze, interpolate, makeTypeOf, maybeFn, parseBatchedResults, pickPaths, promiseReduce, resolveNestedPromises, switchExec, switchValue, typeMap, typeOf, validate, validateAsync, wait, withTimeout };
1539
+ function defaultParseResponse(response) {
1540
+ return response.json();
1541
+ }
1542
+ function paginatedHttpFetch(_a) {
1543
+ var pageUrl = _a.pageUrl,
1544
+ _b = _a.parseResponse,
1545
+ parseResponse = _b === void 0 ? defaultParseResponse : _b;
1546
+ return function (params) {
1547
+ return __awaiter(this, void 0, void 0, function () {
1548
+ var response, data;
1549
+ return __generator(this, function (_a) {
1550
+ switch (_a.label) {
1551
+ case 0:
1552
+ return [4 /*yield*/, fetch(pageUrl(params))];
1553
+ case 1:
1554
+ response = _a.sent();
1555
+ return [4 /*yield*/, parseResponse(response)];
1556
+ case 2:
1557
+ data = _a.sent();
1558
+ return [2 /*return*/, data];
1559
+ }
1560
+ });
1561
+ });
1562
+ };
1563
+ }
1564
+ function inMemoryDataStore() {
1565
+ var data = [];
1566
+ return {
1567
+ getSize: function getSize() {
1568
+ return data.length;
1569
+ },
1570
+ storePage: function storePage(pageData) {
1571
+ data = __spreadArray(__spreadArray([], data, true), pageData, true);
1572
+ },
1573
+ getResult: function getResult() {
1574
+ return data;
1575
+ }
1576
+ };
1577
+ }
1578
+ function fetchAllPages(_a) {
1579
+ var fetchPage = _a.fetchPage,
1580
+ _b = _a.pageSize,
1581
+ pageSize = _b === void 0 ? 50 : _b,
1582
+ _c = _a.dataStore,
1583
+ dataStore = _c === void 0 ? inMemoryDataStore : _c;
1584
+ return __awaiter(this, void 0, void 0, function () {
1585
+ var store, currentPageData, currentOffset, result;
1586
+ return __generator(this, function (_d) {
1587
+ switch (_d.label) {
1588
+ case 0:
1589
+ store = dataStore();
1590
+ currentPageData = null;
1591
+ _d.label = 1;
1592
+ case 1:
1593
+ return [4 /*yield*/, store.getSize()];
1594
+ case 2:
1595
+ currentOffset = _d.sent() + 1;
1596
+ return [4 /*yield*/, fetchPage({
1597
+ offset: currentOffset,
1598
+ pageSize: pageSize
1599
+ })];
1600
+ case 3:
1601
+ currentPageData = _d.sent();
1602
+ return [4 /*yield*/, store.storePage(currentPageData, {
1603
+ offset: currentOffset,
1604
+ pageSize: pageSize
1605
+ })];
1606
+ case 4:
1607
+ _d.sent();
1608
+ _d.label = 5;
1609
+ case 5:
1610
+ if (currentPageData.length === pageSize) return [3 /*break*/, 1];
1611
+ _d.label = 6;
1612
+ case 6:
1613
+ return [4 /*yield*/, store.getResult()];
1614
+ case 7:
1615
+ result = _d.sent();
1616
+ return [2 /*return*/, result];
1617
+ }
1618
+ });
1619
+ });
1620
+ }
1621
+
1622
+ export { PromiseLikeEventEmitter, SKIPPED, TimeoutError, ValidationError, batchFn, debugFn, deepFreeze, fetchAllPages, inMemoryDataStore, interpolate, makeTypeOf, maybeFn, paginatedHttpFetch, parseBatchedResults, pickPaths, promiseReduce, resolveNestedPromises, switchExec, switchValue, typeMap, typeOf, validate, validateAsync, wait, withTimeout };
@@ -5,6 +5,7 @@ type BatchFnOptions = {
5
5
  batchSize?: number;
6
6
  retry?: BackoffOptions | boolean;
7
7
  timeout?: number | false;
8
+ rollback?: (input: any, err: any) => Promise<any> | any;
8
9
  };
9
10
  type Batch = {
10
11
  index: number;
@@ -40,7 +41,7 @@ type EventTypes = {
40
41
  }) => void;
41
42
  error: (err: Error) => void;
42
43
  };
43
- export declare function batchFn(itemFn: (input: any) => Promise<any> | any, { batchSize, skip, retry, timeout }?: BatchFnOptions): (items: any[]) => PromiseLikeEventEmitter<any[], EventTypes>;
44
+ export declare function batchFn(itemFn: (input: any) => Promise<any> | any, { batchSize, skip, retry, timeout, rollback, }?: BatchFnOptions): (items: any[]) => PromiseLikeEventEmitter<any[], EventTypes>;
44
45
  type ParsedBatchResults = {
45
46
  results: any[];
46
47
  errors: Error[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orioro/util",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "packageManager": "yarn@4.0.2",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -24,7 +24,7 @@
24
24
  "prepublish": "yarn build"
25
25
  },
26
26
  "devDependencies": {
27
- "@orioro/dev": "0.0.0",
27
+ "@orioro/dev": "0.0.1",
28
28
  "@types/clone-deep": "^4.0.4",
29
29
  "@types/jest": "^29.5.12",
30
30
  "babel-jest": "^29.7.0",