@eyeseetea/d2-logger 0.1.0-beta.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.
Files changed (67) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +96 -0
  3. package/data/api-futures.d.ts +4 -0
  4. package/data/api-futures.js +21 -0
  5. package/data/repositories/ConsoleLoggerRepository.d.ts +6 -0
  6. package/data/repositories/ConsoleLoggerRepository.js +16 -0
  7. package/data/repositories/ProgramD2Repository.d.ts +7 -0
  8. package/data/repositories/ProgramD2Repository.js +69 -0
  9. package/data/repositories/ProgramLoggerD2Repository.d.ts +19 -0
  10. package/data/repositories/ProgramLoggerD2Repository.js +122 -0
  11. package/domain/entities/Async.d.ts +1 -0
  12. package/domain/entities/Async.js +2 -0
  13. package/domain/entities/Base.d.ts +17 -0
  14. package/domain/entities/Base.js +15 -0
  15. package/domain/entities/Log.d.ts +5 -0
  16. package/domain/entities/Log.js +2 -0
  17. package/domain/entities/LoggerConfig.d.ts +25 -0
  18. package/domain/entities/LoggerConfig.js +2 -0
  19. package/domain/entities/generic/Collection.d.ts +82 -0
  20. package/domain/entities/generic/Collection.js +287 -0
  21. package/domain/entities/generic/Either.d.ts +49 -0
  22. package/domain/entities/generic/Either.js +71 -0
  23. package/domain/entities/generic/Future.d.ts +45 -0
  24. package/domain/entities/generic/Future.js +276 -0
  25. package/domain/entities/generic/HashMap.d.ts +42 -0
  26. package/domain/entities/generic/HashMap.js +149 -0
  27. package/domain/entities/generic/Rec.d.ts +30 -0
  28. package/domain/entities/generic/Rec.js +73 -0
  29. package/domain/entities/generic/Struct.d.ts +36 -0
  30. package/domain/entities/generic/Struct.js +51 -0
  31. package/domain/entities/generic/__tests__/Collection.spec.d.ts +1 -0
  32. package/domain/entities/generic/__tests__/Collection.spec.js +284 -0
  33. package/domain/entities/generic/__tests__/Future.spec.d.ts +8 -0
  34. package/domain/entities/generic/__tests__/Future.spec.js +556 -0
  35. package/domain/entities/generic/__tests__/HashMap.spec.d.ts +1 -0
  36. package/domain/entities/generic/__tests__/HashMap.spec.js +170 -0
  37. package/domain/entities/generic/__tests__/Rec.spec.d.ts +1 -0
  38. package/domain/entities/generic/__tests__/Rec.spec.js +37 -0
  39. package/domain/entities/generic/__tests__/Struct.spec.d.ts +1 -0
  40. package/domain/entities/generic/__tests__/Struct.spec.js +37 -0
  41. package/domain/repositories/LoggerRepository.d.ts +5 -0
  42. package/domain/repositories/LoggerRepository.js +2 -0
  43. package/domain/repositories/ProgramRepository.d.ts +5 -0
  44. package/domain/repositories/ProgramRepository.js +2 -0
  45. package/domain/usecases/CheckConfigProgramLoggerUseCase.d.ts +8 -0
  46. package/domain/usecases/CheckConfigProgramLoggerUseCase.js +13 -0
  47. package/domain/usecases/LogMessageUseCase.d.ts +8 -0
  48. package/domain/usecases/LogMessageUseCase.js +17 -0
  49. package/index.d.ts +17 -0
  50. package/index.js +124 -0
  51. package/package.json +64 -0
  52. package/scripts/cli.d.ts +1 -0
  53. package/scripts/cli.js +45 -0
  54. package/scripts/commands/consoleLogger.d.ts +31 -0
  55. package/scripts/commands/consoleLogger.js +96 -0
  56. package/scripts/commands/programLogger.d.ts +39 -0
  57. package/scripts/commands/programLogger.js +130 -0
  58. package/scripts/common.d.ts +29 -0
  59. package/scripts/common.js +128 -0
  60. package/scripts/index.d.ts +1 -0
  61. package/scripts/index.js +4 -0
  62. package/types/d2-api.d.ts +4 -0
  63. package/types/d2-api.js +7 -0
  64. package/utils/log.d.ts +10 -0
  65. package/utils/log.js +22 -0
  66. package/utils/ts-utils.d.ts +31 -0
  67. package/utils/ts-utils.js +81 -0
package/README.md ADDED
@@ -0,0 +1,96 @@
1
+ # d2-logger
2
+
3
+ DHIS2 library that allows a certain application to register logs as events in a DHIS2 program or display logs on the console.
4
+
5
+ ## Usage
6
+
7
+ There are two types of logger output:
8
+
9
+ 1. Using a DHIS2 events program to register the logs:
10
+
11
+ You will need to have and existing event program in DHIS2 with the following data elements with value type Text: Message and MessageType. MessageType would be and option set with the following options: "Error", "Warn", "Success", "Info" and "Debug".
12
+
13
+ Therefore, the following configuration will be passed to the logger:
14
+
15
+ ```typescript
16
+ import { Logger } from "@eyeseetea/d2-logger";
17
+
18
+ const logger = new Logger();
19
+
20
+ await logger.init({
21
+ type: "program",
22
+ debug: debug,
23
+ baseUrl: baseUrl,
24
+ auth: auth,
25
+ organisationUnitId: organisationUnitId,
26
+ programId: programId,
27
+ loggerDataElements: {
28
+ messageId: messageId,
29
+ messageTypeId: messageTypeId,
30
+ },
31
+ });
32
+
33
+ logger.debug("This is a Debug message");
34
+ logger.info("This is an Info message");
35
+ logger.success("This is a Success message");
36
+ logger.warn("This is a Warn message");
37
+ logger.error("This is an Error message");
38
+ ```
39
+
40
+ Notice:
41
+
42
+ - Please note that `auth` is not mandatory if it's used in the DHIS2 app instead of in a script.
43
+ - Please note that if the `organisationUnitId` is not added to the configuration, then the logs will be registered in the DHIS2 program in the global organization unit.
44
+ - If `debug` is `true`, then in addition to registering the logs in the DHIS2 program, they will also be displayed on the console.
45
+
46
+ 2. Displaying the logs only in the console:
47
+
48
+ ```typescript
49
+ import { Logger } from "@eyeseetea/d2-logger";
50
+
51
+ const logger = new Logger();
52
+
53
+ logger.init({
54
+ type: "console",
55
+ });
56
+
57
+ logger.debug("This is a Debug message");
58
+ logger.info("This is an Info message");
59
+ logger.success("This is a Success message");
60
+ logger.warn("This is a Warn message");
61
+ logger.error("This is an Error message");
62
+ ```
63
+
64
+ ## Development
65
+
66
+ ```bash
67
+ $ yarn install
68
+ $ yarn build
69
+ $ cd build
70
+ $ yarn link
71
+ ```
72
+
73
+ On another app:
74
+
75
+ ```bash
76
+ $ yarn link "@eyeseetea/d2-logger"
77
+ ```
78
+
79
+ ## Tests
80
+
81
+ ```bash
82
+ $ yarn test
83
+ ```
84
+
85
+ ## Code quality
86
+
87
+ ```bash
88
+ $ yarn code-quality
89
+ ```
90
+
91
+ ## Publish
92
+
93
+ ```bash
94
+ $ yarn prerelease
95
+ $ yarn release [--tag beta] [--patch | --minor | --major]
96
+ ```
@@ -0,0 +1,4 @@
1
+ import { Future } from "../domain/entities/generic/Future";
2
+ import { CancelableResponse } from "../types/d2-api";
3
+ export type FutureData<D> = Future<Error, D>;
4
+ export declare function apiToFuture<Data>(res: CancelableResponse<Data>): FutureData<Data>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.apiToFuture = void 0;
4
+ var Future_1 = require("../domain/entities/generic/Future");
5
+ function apiToFuture(res) {
6
+ return Future_1.Future.fromComputation(function (resolve, reject) {
7
+ res.getData()
8
+ .then(resolve)
9
+ .catch(function (err) {
10
+ if (err instanceof Error) {
11
+ reject(err);
12
+ }
13
+ else {
14
+ console.error("apiToFuture:uncatched", err);
15
+ reject(new Error("Unknown error"));
16
+ }
17
+ });
18
+ return res.cancel;
19
+ });
20
+ }
21
+ exports.apiToFuture = apiToFuture;
@@ -0,0 +1,6 @@
1
+ import { FutureData } from "../../data/api-futures";
2
+ import { Log } from "../../domain/entities/Log";
3
+ import { LoggerRepository } from "../../domain/repositories/LoggerRepository";
4
+ export declare class ConsoleLoggerRepository implements LoggerRepository {
5
+ log(log: Log): FutureData<void>;
6
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConsoleLoggerRepository = void 0;
4
+ var Future_1 = require("../../domain/entities/generic/Future");
5
+ var ConsoleLoggerRepository = /** @class */ (function () {
6
+ function ConsoleLoggerRepository() {
7
+ }
8
+ ConsoleLoggerRepository.prototype.log = function (log) {
9
+ var message = log.message, messageType = log.messageType;
10
+ var date = new Date().toISOString();
11
+ process.stderr.write("[".concat(messageType.toUpperCase(), "] [").concat(date, "] ").concat(message, "\n"));
12
+ return Future_1.Future.success(undefined);
13
+ };
14
+ return ConsoleLoggerRepository;
15
+ }());
16
+ exports.ConsoleLoggerRepository = ConsoleLoggerRepository;
@@ -0,0 +1,7 @@
1
+ import { FutureData } from "../../data/api-futures";
2
+ import { ProgramLoggerConfig } from "../../domain/entities/LoggerConfig";
3
+ import { ProgramRepository } from "../../domain/repositories/ProgramRepository";
4
+ export declare class ProgramD2Repository implements ProgramRepository {
5
+ checkConfig(config: ProgramLoggerConfig): FutureData<boolean>;
6
+ private checkProgramIsOk;
7
+ }
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProgramD2Repository = void 0;
4
+ var d2_api_1 = require("../../types/d2-api");
5
+ var api_futures_1 = require("../../data/api-futures");
6
+ var Future_1 = require("../../domain/entities/generic/Future");
7
+ var ProgramD2Repository = /** @class */ (function () {
8
+ function ProgramD2Repository() {
9
+ }
10
+ ProgramD2Repository.prototype.checkConfig = function (config) {
11
+ var baseUrl = config.baseUrl, auth = config.auth, programId = config.programId, loggerDataElements = config.loggerDataElements;
12
+ var d2Api = auth
13
+ ? new d2_api_1.D2Api({ baseUrl: baseUrl, auth: auth })
14
+ : new d2_api_1.D2Api({ baseUrl: baseUrl });
15
+ return this.checkProgramIsOk(d2Api, programId, loggerDataElements).flatMap(function (programIsOk) {
16
+ if (programIsOk) {
17
+ return Future_1.Future.success(programIsOk);
18
+ }
19
+ else {
20
+ return Future_1.Future.error(new Error("Logger not initialized properly. Please check configuration of program ".concat(programId, ", message data element ").concat(loggerDataElements.messageId, " and message type data element ").concat(loggerDataElements.messageTypeId, ".")));
21
+ }
22
+ });
23
+ };
24
+ ProgramD2Repository.prototype.checkProgramIsOk = function (api, programId, loggerDataElements) {
25
+ return (0, api_futures_1.apiToFuture)(api.models.programs.get({
26
+ fields: programFields,
27
+ filter: { id: { eq: programId } },
28
+ })).flatMap(function (response) {
29
+ var _a, _b, _c, _d;
30
+ if ((_a = response === null || response === void 0 ? void 0 : response.objects[0]) === null || _a === void 0 ? void 0 : _a.programStages[0]) {
31
+ var programStageDataElements = response.objects[0].programStages[0].programStageDataElements;
32
+ var messageDataElement = (_b = programStageDataElements.find(function (_a) {
33
+ var dataElement = _a.dataElement;
34
+ return dataElement.id === (loggerDataElements === null || loggerDataElements === void 0 ? void 0 : loggerDataElements.messageId);
35
+ })) === null || _b === void 0 ? void 0 : _b.dataElement;
36
+ var messageTypeDataElement = (_c = programStageDataElements.find(function (_a) {
37
+ var dataElement = _a.dataElement;
38
+ return dataElement.id === (loggerDataElements === null || loggerDataElements === void 0 ? void 0 : loggerDataElements.messageTypeId);
39
+ })) === null || _c === void 0 ? void 0 : _c.dataElement;
40
+ var isMessageDataElementOk = (messageDataElement === null || messageDataElement === void 0 ? void 0 : messageDataElement.valueType) === "TEXT" ||
41
+ (messageDataElement === null || messageDataElement === void 0 ? void 0 : messageDataElement.valueType) === "LONG_TEXT";
42
+ var isMessageTypeDataElementOk = !!(messageTypeDataElement === null || messageTypeDataElement === void 0 ? void 0 : messageTypeDataElement.optionSetValue);
43
+ return Future_1.Future.success(((_d = response.objects[0]) === null || _d === void 0 ? void 0 : _d.id) === programId &&
44
+ isMessageDataElementOk &&
45
+ isMessageTypeDataElementOk);
46
+ }
47
+ else {
48
+ return Future_1.Future.error(new Error("Program with id ".concat(programId, " and its program stage not found. Logger not initialized")));
49
+ }
50
+ });
51
+ };
52
+ return ProgramD2Repository;
53
+ }());
54
+ exports.ProgramD2Repository = ProgramD2Repository;
55
+ var programFields = {
56
+ id: true,
57
+ programStages: {
58
+ id: true,
59
+ programStageDataElements: {
60
+ dataElement: {
61
+ id: true,
62
+ code: true,
63
+ valueType: true,
64
+ optionSetValue: true,
65
+ optionSet: { options: { name: true, code: true } },
66
+ },
67
+ },
68
+ },
69
+ };
@@ -0,0 +1,19 @@
1
+ import { D2Api } from "../../types/d2-api";
2
+ import { FutureData } from "../api-futures";
3
+ import { Id } from "../../domain/entities/Base";
4
+ import { Log } from "../../domain/entities/Log";
5
+ import { ProgramLoggerConfig } from "../../domain/entities/LoggerConfig";
6
+ import { LoggerRepository } from "../../domain/repositories/LoggerRepository";
7
+ export declare class ProgramLoggerD2Repository implements LoggerRepository {
8
+ api: D2Api;
9
+ organisationUnitId: Id;
10
+ programId: Id;
11
+ messageId: Id;
12
+ messageTypeId: Id;
13
+ constructor(config: ProgramLoggerConfig);
14
+ log(log: Log): FutureData<void>;
15
+ private getProgramStage;
16
+ private postApiTracker;
17
+ private mapLogToD2EventProgam;
18
+ private getDataValuesFromLog;
19
+ }
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProgramLoggerD2Repository = void 0;
4
+ var d2_api_1 = require("../../types/d2-api");
5
+ var api_futures_1 = require("../api-futures");
6
+ var Future_1 = require("../../domain/entities/generic/Future");
7
+ var GLOBAL_ORGANISATION_UNIT_ID = "H8RixfF8ugH";
8
+ var IMPORT_STRATEGY_CREATE = "CREATE";
9
+ var TRACKER_IMPORT_JOB = "TRACKER_IMPORT_JOB";
10
+ var EVENT_PROGRAM_STATUS = "COMPLETED";
11
+ var ProgramLoggerD2Repository = /** @class */ (function () {
12
+ function ProgramLoggerD2Repository(config) {
13
+ var baseUrl = config.baseUrl, auth = config.auth, programId = config.programId, loggerDataElements = config.loggerDataElements, _a = config.organisationUnitId, organisationUnitId = _a === void 0 ? GLOBAL_ORGANISATION_UNIT_ID : _a;
14
+ this.api = auth
15
+ ? new d2_api_1.D2Api({ baseUrl: baseUrl, auth: auth })
16
+ : new d2_api_1.D2Api({ baseUrl: baseUrl });
17
+ this.programId = programId;
18
+ this.messageId = loggerDataElements.messageId;
19
+ this.messageTypeId = loggerDataElements.messageTypeId;
20
+ this.organisationUnitId = organisationUnitId;
21
+ }
22
+ ProgramLoggerD2Repository.prototype.log = function (log) {
23
+ var _this = this;
24
+ return this.getProgramStage().flatMap(function (programStage) {
25
+ var d2EventProgram = _this.mapLogToD2EventProgam({
26
+ log: log,
27
+ programId: _this.programId,
28
+ organisationUnitId: _this.organisationUnitId,
29
+ messageId: _this.messageId,
30
+ messageTypeId: _this.messageTypeId,
31
+ programStage: programStage,
32
+ });
33
+ return _this.postApiTracker(d2EventProgram);
34
+ });
35
+ };
36
+ ProgramLoggerD2Repository.prototype.getProgramStage = function () {
37
+ var _this = this;
38
+ return (0, api_futures_1.apiToFuture)(this.api.models.programs.get({
39
+ fields: programFields,
40
+ filter: { id: { eq: this.programId } },
41
+ })).flatMap(function (response) {
42
+ var _a, _b;
43
+ if ((_a = response.objects[0]) === null || _a === void 0 ? void 0 : _a.programStages[0]) {
44
+ return Future_1.Future.success((_b = response.objects[0]) === null || _b === void 0 ? void 0 : _b.programStages[0]);
45
+ }
46
+ else {
47
+ return Future_1.Future.error(new Error("Program stage of program with id ".concat(_this.programId, " not found")));
48
+ }
49
+ });
50
+ };
51
+ ProgramLoggerD2Repository.prototype.postApiTracker = function (d2EventProgram) {
52
+ var _this = this;
53
+ return (0, api_futures_1.apiToFuture)(this.api.tracker.postAsync({
54
+ importStrategy: IMPORT_STRATEGY_CREATE,
55
+ skipRuleEngine: true,
56
+ }, { events: [d2EventProgram] })).flatMap(function (response) {
57
+ return (0, api_futures_1.apiToFuture)(_this.api.system.waitFor(TRACKER_IMPORT_JOB, response.response.id)).flatMap(function (result) {
58
+ var _a, _b, _c;
59
+ if (result && result.status !== "ERROR") {
60
+ return Future_1.Future.success(undefined);
61
+ }
62
+ else {
63
+ return Future_1.Future.error(new Error("Error: ".concat((_c = (_b = (_a = result === null || result === void 0 ? void 0 : result.validationReport) === null || _a === void 0 ? void 0 : _a.errorReports) === null || _b === void 0 ? void 0 : _b.at(0)) === null || _c === void 0 ? void 0 : _c.message, " ")));
64
+ }
65
+ });
66
+ });
67
+ };
68
+ ProgramLoggerD2Repository.prototype.mapLogToD2EventProgam = function (params) {
69
+ var log = params.log, programId = params.programId, messageId = params.messageId, messageTypeId = params.messageTypeId, organisationUnitId = params.organisationUnitId, programStage = params.programStage;
70
+ var dataValues = this.getDataValuesFromLog({
71
+ log: log,
72
+ messageId: messageId,
73
+ messageTypeId: messageTypeId,
74
+ programStage: programStage,
75
+ });
76
+ return {
77
+ event: "",
78
+ occurredAt: new Date().toISOString(),
79
+ status: EVENT_PROGRAM_STATUS,
80
+ program: programId,
81
+ programStage: programStage.id,
82
+ orgUnit: organisationUnitId,
83
+ dataValues: dataValues,
84
+ };
85
+ };
86
+ ProgramLoggerD2Repository.prototype.getDataValuesFromLog = function (params) {
87
+ var _a, _b;
88
+ var log = params.log, messageId = params.messageId, messageTypeId = params.messageTypeId, programStage = params.programStage;
89
+ var messageTypeDataElement = (_a = programStage.programStageDataElements.find(function (_a) {
90
+ var dataElement = _a.dataElement;
91
+ return dataElement.id === messageTypeId;
92
+ })) === null || _a === void 0 ? void 0 : _a.dataElement;
93
+ var messageTypeDataValue = ((_b = messageTypeDataElement === null || messageTypeDataElement === void 0 ? void 0 : messageTypeDataElement.optionSet.options.find(function (option) { return option.name === log.messageType || option.code === log.messageType; })) === null || _b === void 0 ? void 0 : _b.code) || log.messageType;
94
+ return [
95
+ {
96
+ dataElement: messageId,
97
+ value: log.message,
98
+ },
99
+ {
100
+ dataElement: messageTypeId,
101
+ value: messageTypeDataValue,
102
+ },
103
+ ];
104
+ };
105
+ return ProgramLoggerD2Repository;
106
+ }());
107
+ exports.ProgramLoggerD2Repository = ProgramLoggerD2Repository;
108
+ var programFields = {
109
+ id: true,
110
+ programStages: {
111
+ id: true,
112
+ programStageDataElements: {
113
+ dataElement: {
114
+ id: true,
115
+ code: true,
116
+ valueType: true,
117
+ optionSetValue: true,
118
+ optionSet: { options: { name: true, code: true } },
119
+ },
120
+ },
121
+ },
122
+ };
@@ -0,0 +1 @@
1
+ export type Async<Data> = Promise<Data>;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,17 @@
1
+ import { HashMap } from "./generic/HashMap";
2
+ export type Id = string;
3
+ export type Ref = {
4
+ id: Id;
5
+ };
6
+ export type NamedRef = {
7
+ id: Id;
8
+ name: string;
9
+ };
10
+ export type Path = string;
11
+ export type Username = string;
12
+ export type IndexedById<T> = Record<Id, T>;
13
+ export declare function getId<Obj extends Ref>(obj: Obj): Id;
14
+ export declare function indexById<T extends Ref>(objs: T[]): HashMap<Id, T>;
15
+ export type Code = string;
16
+ export type Name = string;
17
+ export type Identifiable = Id | Code | Name;
@@ -0,0 +1,15 @@
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
+ exports.indexById = exports.getId = void 0;
7
+ var Collection_1 = __importDefault(require("./generic/Collection"));
8
+ function getId(obj) {
9
+ return obj.id;
10
+ }
11
+ exports.getId = getId;
12
+ function indexById(objs) {
13
+ return (0, Collection_1.default)(objs).keyBy(getId);
14
+ }
15
+ exports.indexById = indexById;
@@ -0,0 +1,5 @@
1
+ export type Log = {
2
+ message: string;
3
+ messageType: MessageType;
4
+ };
5
+ export type MessageType = "Debug" | "Info" | "Success" | "Warn" | "Error";
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,25 @@
1
+ import { Id } from "./Base";
2
+ interface LoggerConfigBase {
3
+ debug?: boolean;
4
+ }
5
+ export type LoggerConfig = ProgramLoggerConfig | ConsoleLoggerConfig;
6
+ export interface ConsoleLoggerConfig extends LoggerConfigBase {
7
+ type: "console";
8
+ }
9
+ export interface ProgramLoggerConfig extends LoggerConfigBase {
10
+ type: "program";
11
+ baseUrl: string;
12
+ auth?: Auth;
13
+ programId: Id;
14
+ loggerDataElements: LoggerDataElements;
15
+ organisationUnitId?: Id;
16
+ }
17
+ type Auth = {
18
+ username: string;
19
+ password: string;
20
+ };
21
+ export type LoggerDataElements = {
22
+ messageId: Id;
23
+ messageTypeId: Id;
24
+ };
25
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,82 @@
1
+ import { HashMap } from "./HashMap";
2
+ /**
3
+ * Wrap a collection of values, expanding methods for Javascript Arrays. An example:
4
+ *
5
+ * ```
6
+ * import _ from "./Collection";
7
+ *
8
+ * const values = _(["1", "2", "3", "3", "4"])
9
+ * .map(x => parseInt(x))
10
+ * .filter(x => x > 1)
11
+ * .uniq()
12
+ * .reverse()
13
+ * .value(); // [4, 3, 2]
14
+ * ```
15
+ */
16
+ export declare class Collection<T> {
17
+ protected xs: T[];
18
+ protected constructor(values: T[]);
19
+ static from<T>(xs: T[]): Collection<T>;
20
+ static range(start: number, end: number, step?: number): Collection<number>;
21
+ value(): T[];
22
+ toArray: () => T[];
23
+ get size(): number;
24
+ map<U>(fn: (x: T) => U): Collection<U>;
25
+ flatten(): T extends Array<infer U> ? Collection<U> : never;
26
+ flatMap<U>(fn: (x: T) => Collection<U>): Collection<U>;
27
+ select(pred: (x: T) => boolean): Collection<T>;
28
+ filter: (pred: (x: T) => boolean) => Collection<T>;
29
+ reject(pred: (x: T) => boolean): Collection<T>;
30
+ enumerate(): Collection<[number, T]>;
31
+ compact(): Collection<NonNullable<T>>;
32
+ compactMap<U>(fn: (x: T) => U | undefined | null): Collection<U>;
33
+ append(x: T): Collection<T>;
34
+ includes(x: T): boolean;
35
+ every(pred: (x: T) => boolean): boolean;
36
+ all: (pred: (x: T) => boolean) => boolean;
37
+ some(pred: (x: T) => boolean): boolean;
38
+ any: (pred: (x: T) => boolean) => boolean;
39
+ find<Or extends T | undefined>(pred: (x: T) => boolean, options?: {
40
+ or?: Or;
41
+ }): T | Or;
42
+ sort(): Collection<T>;
43
+ reverse(): Collection<T>;
44
+ sortWith(compareFn: CompareFn<T>): Collection<T>;
45
+ sortBy<U>(fn: (x: T) => U, options?: {
46
+ compareFn?: CompareFn<U>;
47
+ }): Collection<T>;
48
+ orderBy(items: OrderItem<T>[]): Collection<T>;
49
+ first(): T | undefined;
50
+ last(): T | undefined;
51
+ sum(): number;
52
+ take(n: number): Collection<T>;
53
+ drop(n: number): Collection<T>;
54
+ pairwise(): Collection<[T, T]>;
55
+ prepend(x: T): Collection<T>;
56
+ tap(fn: (xs: Collection<T>) => void): this;
57
+ splitAt(indexes: number[]): Collection<Collection<T>>;
58
+ thru<U>(fn: (xs: Collection<T>) => Collection<U>): Collection<U>;
59
+ join(char: string): string;
60
+ get(idx: number): T | undefined;
61
+ getMany(idxs: number[]): Collection<T | undefined>;
62
+ intersperse(value: T): Collection<T>;
63
+ uniq(): Collection<T>;
64
+ uniqBy<U>(mapper: (value: T) => U): Collection<T>;
65
+ reduce<U>(mapper: (acc: U, value: T) => U, initialAcc: U): U;
66
+ chunk(size: number): Collection<T[]>;
67
+ cartesian(): T extends Array<infer U> ? Collection<U[]> : never;
68
+ zipLongest<S>(xs: Collection<S>): Collection<[T | undefined, S | undefined]>;
69
+ zip<S>(xs: Collection<S>): Collection<[T, S]>;
70
+ indexBy<U>(grouperFn: (x: T) => U): HashMap<U, T>;
71
+ keyBy: <U>(grouperFn: (x: T) => U) => HashMap<U, T>;
72
+ groupBy<U>(grouperFn: (x: T) => U): HashMap<U, T[]>;
73
+ groupFromMap<U, W>(pairGrouperFn: (x: T) => [U, W]): HashMap<U, W[]>;
74
+ toHashMap<K, V>(toPairFn: (x: T) => [K, V]): HashMap<K, V>;
75
+ isEmpty(): boolean;
76
+ isNotEmpty(): boolean;
77
+ }
78
+ type CompareRes = -1 | 0 | 1;
79
+ type CompareFn<T> = (a: T, b: T) => CompareRes;
80
+ type OrderItem<T> = [(obj: T) => unknown, "asc" | "desc"];
81
+ export default function _c<T>(xs: T[]): Collection<T>;
82
+ export {};