transaction-serde 2.0.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/build/main/lib/deserialisers/csv.d.ts +1 -1
- package/build/main/lib/deserialisers/csv.js +32 -28
- package/build/main/lib/serialisers/csv.js +6 -6
- package/package.json +19 -5
- package/build/module/index.d.ts +0 -1
- package/build/module/index.js +0 -2
- package/build/module/lib/deserialisers/csv.d.ts +0 -28
- package/build/module/lib/deserialisers/csv.js +0 -93
- package/build/module/lib/deserialisers/index.d.ts +0 -4
- package/build/module/lib/deserialisers/index.js +0 -5
- package/build/module/lib/deserialisers/json.d.ts +0 -24
- package/build/module/lib/deserialisers/json.js +0 -79
- package/build/module/lib/deserialisers/qif.d.ts +0 -24
- package/build/module/lib/deserialisers/qif.js +0 -73
- package/build/module/lib/index.d.ts +0 -2
- package/build/module/lib/index.js +0 -3
- package/build/module/lib/serialisers/csv.d.ts +0 -24
- package/build/module/lib/serialisers/csv.js +0 -40
- package/build/module/lib/serialisers/index.d.ts +0 -4
- package/build/module/lib/serialisers/index.js +0 -5
- package/build/module/lib/serialisers/json.d.ts +0 -24
- package/build/module/lib/serialisers/json.js +0 -33
- package/build/module/lib/serialisers/qif.d.ts +0 -29
- package/build/module/lib/serialisers/qif.js +0 -65
- package/build/module/types/common.d.ts +0 -1
- package/build/module/types/common.js +0 -8
- package/build/module/types/qif.d.ts +0 -10
- package/build/module/types/qif.js +0 -15
- package/build/module/utilities/dates.d.ts +0 -9
- package/build/module/utilities/dates.js +0 -41
- package/build/module/utilities/options.d.ts +0 -1
- package/build/module/utilities/options.js +0 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [2.1.1](https://github.com/andrewbridge/transaction-serde/compare/v2.1.0...v2.1.1) (2025-02-17)
|
|
6
|
+
|
|
7
|
+
## [2.1.0](https://github.com/andrewbridge/transaction-serde/compare/v2.0.0...v2.1.0) (2025-02-17)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* add browser compatible builds of the library ([12ed6e9](https://github.com/andrewbridge/transaction-serde/commit/12ed6e942f96a46481972e12aa92990c03e6324f))
|
|
13
|
+
|
|
5
14
|
## [2.0.0](https://github.com/andrewbridge/transaction-serde/compare/v1.1.0...v2.0.0) (2025-02-16)
|
|
6
15
|
|
|
7
16
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Deserialiser, TransactionLike } from 'transaction-serde';
|
|
2
2
|
type DeserialiserOptions = {
|
|
3
3
|
headers: boolean;
|
|
4
|
-
map: (object: Record<string, unknown>) => TransactionLike;
|
|
4
|
+
map: (object: Record<string, unknown>) => TransactionLike | null;
|
|
5
5
|
};
|
|
6
6
|
/**
|
|
7
7
|
* Multiplies a value by 2. (Also a full example of TypeDoc's functionality.)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const papaparse_1 = require("papaparse");
|
|
4
4
|
const common_1 = require("../../types/common");
|
|
5
5
|
const dates_1 = require("../../utilities/dates");
|
|
6
6
|
const options_1 = require("../../utilities/options");
|
|
@@ -9,7 +9,7 @@ const defaultOptions = {
|
|
|
9
9
|
map: (object) => {
|
|
10
10
|
const transaction = {};
|
|
11
11
|
if (typeof object !== 'object' || object === null)
|
|
12
|
-
return
|
|
12
|
+
return null;
|
|
13
13
|
common_1.transactionKeys.forEach((key) => {
|
|
14
14
|
const value = object[key];
|
|
15
15
|
if (typeof value === 'string') {
|
|
@@ -40,37 +40,41 @@ const defaultOptions = {
|
|
|
40
40
|
* @returns Comment describing the return type.
|
|
41
41
|
* @anotherNote Some other value.
|
|
42
42
|
*/
|
|
43
|
-
const handler =
|
|
43
|
+
const handler = (input, options) => {
|
|
44
44
|
const { headers, map } = (0, options_1.mergeOptions)(defaultOptions, options);
|
|
45
|
-
const objects =
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
45
|
+
const objects = (0, papaparse_1.parse)(input, { header: headers });
|
|
46
|
+
if (objects.errors.length > 0) {
|
|
47
|
+
throw new Error('Invalid CSV data');
|
|
48
|
+
}
|
|
49
|
+
/* const objects: TransactionLike[] = await new Promise((resolve, reject) => {
|
|
50
|
+
const rows: TransactionLike[] = [];
|
|
51
|
+
parseString<Record<string, unknown>, Transaction>(input, { headers })
|
|
52
|
+
.transform(map)
|
|
53
|
+
.on('data', (row: TransactionLike) => rows.push(row))
|
|
54
|
+
.on('error', (error) => reject(error))
|
|
55
|
+
.on('end', () => resolve(rows));
|
|
56
|
+
}); */
|
|
53
57
|
const transactions = [];
|
|
54
58
|
const dates = [];
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
if (
|
|
58
|
-
|
|
59
|
-
if (typeof
|
|
60
|
-
|
|
61
|
-
typeof
|
|
62
|
-
|
|
63
|
-
|
|
59
|
+
objects.data.forEach((object) => {
|
|
60
|
+
const transactionLike = map(object);
|
|
61
|
+
if (transactionLike === null)
|
|
62
|
+
return; // Exit early for invalid objects
|
|
63
|
+
if (typeof transactionLike.date !== 'string' ||
|
|
64
|
+
transactionLike.date.length === 0 ||
|
|
65
|
+
typeof transactionLike.amount !== 'string' ||
|
|
66
|
+
transactionLike.amount.length === 0)
|
|
67
|
+
return; // Exit early for objects without critical data items
|
|
64
68
|
const transaction = {};
|
|
65
|
-
const dateString =
|
|
66
|
-
Object.keys(
|
|
69
|
+
const dateString = transactionLike.date;
|
|
70
|
+
Object.keys(transactionLike).forEach((key) => {
|
|
67
71
|
switch (key) {
|
|
68
72
|
case 'date':
|
|
69
73
|
dates.push({ date: dateString, transaction });
|
|
70
74
|
break;
|
|
71
75
|
case 'amount':
|
|
72
|
-
if (typeof
|
|
73
|
-
transaction.amount = parseFloat(
|
|
76
|
+
if (typeof transactionLike.amount === 'string') {
|
|
77
|
+
transaction.amount = parseFloat(transactionLike.amount);
|
|
74
78
|
if (!Number.isFinite(transaction.amount)) {
|
|
75
79
|
throw new TypeError('Could not parse amount');
|
|
76
80
|
}
|
|
@@ -79,17 +83,17 @@ const handler = async (input, options) => {
|
|
|
79
83
|
case 'payee':
|
|
80
84
|
case 'description':
|
|
81
85
|
case 'category':
|
|
82
|
-
if (typeof
|
|
83
|
-
transaction[key] =
|
|
86
|
+
if (typeof transactionLike[key] === 'string') {
|
|
87
|
+
transaction[key] = transactionLike[key];
|
|
84
88
|
}
|
|
85
89
|
break;
|
|
86
90
|
}
|
|
87
91
|
});
|
|
88
92
|
transactions.push(transaction);
|
|
89
|
-
}
|
|
93
|
+
});
|
|
90
94
|
const parsedDates = (0, dates_1.parseDateStrings)(dates.map((d) => d.date));
|
|
91
95
|
parsedDates.forEach((date, i) => (dates[i].transaction.date = date));
|
|
92
96
|
return transactions;
|
|
93
97
|
};
|
|
94
98
|
exports.default = handler;
|
|
95
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9kZXNlcmlhbGlzZXJzL2Nzdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUFrQztBQUdsQywrQ0FBcUQ7QUFDckQsaURBQXlEO0FBQ3pELHFEQUF1RDtBQVF2RCxNQUFNLGNBQWMsR0FBd0I7SUFDMUMsT0FBTyxFQUFFLElBQUk7SUFDYixHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNkLE1BQU0sV0FBVyxHQUFvQixFQUFFLENBQUM7UUFDeEMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMvRCx3QkFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzlCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM5QixXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7Q0FDRixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxPQUFPLEdBQXNDLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ3BFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBQSxzQkFBWSxFQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRCxNQUFNLE9BQU8sR0FBRyxJQUFBLGlCQUFLLEVBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbEQsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUs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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const papaparse_1 = require("papaparse");
|
|
4
4
|
const common_1 = require("../../types/common");
|
|
5
5
|
/**
|
|
6
6
|
* Multiplies a value by 2. (Also a full example of TypeDoc's functionality.)
|
|
@@ -32,11 +32,11 @@ const handler = (input) => {
|
|
|
32
32
|
output.push({ date: date.toISOString().substring(0, 10), ...rest });
|
|
33
33
|
}
|
|
34
34
|
const quoteColumns = common_1.transactionKeys.map((key) => key === 'amount' ? false : true);
|
|
35
|
-
return (0,
|
|
36
|
-
|
|
37
|
-
quoteColumns,
|
|
38
|
-
|
|
35
|
+
return (0, papaparse_1.unparse)(output, {
|
|
36
|
+
header: true,
|
|
37
|
+
quotes: quoteColumns,
|
|
38
|
+
newline: '\n',
|
|
39
39
|
});
|
|
40
40
|
};
|
|
41
41
|
exports.default = handler;
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJpYWxpc2Vycy9jc3YudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5Q0FBb0M7QUFHcEMsK0NBQXFEO0FBRXJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sT0FBTyxHQUFlLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDcEMsTUFBTSxNQUFNLEdBQXlDLEVBQUUsQ0FBQztJQUN4RCxLQUFLLE1BQU0sV0FBVyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxXQUFXLENBQUM7UUFDdEMsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQUUsU0FBUztRQUN0RSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsTUFBTSxZQUFZLEdBQUcsd0JBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUMvQyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDaEMsQ0FBQztJQUNGLE9BQU8sSUFBQSxtQkFBTyxFQUFDLE1BQU0sRUFBRTtRQUNyQixNQUFNLEVBQUUsSUFBSTtRQUNaLE1BQU0sRUFBRSxZQUFZO1FBQ3BCLE9BQU8sRUFBRSxJQUFJO0tBQ2QsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBQ0Ysa0JBQWUsT0FBTyxDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "transaction-serde",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"description": "Transaction serialisation and deserialisation library",
|
|
5
5
|
"main": "build/main/index.js",
|
|
6
6
|
"typings": "build/main/index.d.ts",
|
|
7
7
|
"module": "build/module/index.js",
|
|
8
|
+
"browser": "build/browser/index.iife.js",
|
|
8
9
|
"repository": "https://github.com/andrewbridge/transaction-serde",
|
|
9
10
|
"license": "MIT",
|
|
10
11
|
"keywords": [],
|
|
@@ -12,10 +13,11 @@
|
|
|
12
13
|
"build": "run-p build:*",
|
|
13
14
|
"build:main": "tsc -p tsconfig.json",
|
|
14
15
|
"build:module": "tsc -p tsconfig.module.json",
|
|
16
|
+
"build:browser": "rollup -c",
|
|
15
17
|
"fix": "run-s fix:*",
|
|
16
18
|
"fix:prettier": "prettier \"src/**/*.ts\" --write",
|
|
17
19
|
"fix:lint": "eslint src --fix",
|
|
18
|
-
"test": "run-s build test:*",
|
|
20
|
+
"test": "run-s build:main test:*",
|
|
19
21
|
"test:lint": "eslint src",
|
|
20
22
|
"test:prettier": "prettier \"src/**/*.ts\" --list-different",
|
|
21
23
|
"test:unit": "nyc --silent ava",
|
|
@@ -44,9 +46,8 @@
|
|
|
44
46
|
},
|
|
45
47
|
"dependencies": {
|
|
46
48
|
"@date-fns/utc": "^1.2.0",
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"date-fns": "^3.6.0"
|
|
49
|
+
"date-fns": "^3.6.0",
|
|
50
|
+
"papaparse": "^5.5.2"
|
|
50
51
|
},
|
|
51
52
|
"devDependencies": {
|
|
52
53
|
"@ava/typescript": "^5.0.0",
|
|
@@ -54,6 +55,11 @@
|
|
|
54
55
|
"@eslint/eslintrc": "^3.2.0",
|
|
55
56
|
"@eslint/js": "^9.20.0",
|
|
56
57
|
"@istanbuljs/nyc-config-typescript": "^1.0.1",
|
|
58
|
+
"@rollup/plugin-commonjs": "^28.0.2",
|
|
59
|
+
"@rollup/plugin-node-resolve": "^16.0.0",
|
|
60
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
61
|
+
"@rollup/plugin-typescript": "^12.1.2",
|
|
62
|
+
"@types/papaparse": "^5.3.15",
|
|
57
63
|
"@typescript-eslint/eslint-plugin": "^8.24.0",
|
|
58
64
|
"@typescript-eslint/parser": "^8.24.0",
|
|
59
65
|
"ava": "^6.2.0",
|
|
@@ -69,6 +75,7 @@
|
|
|
69
75
|
"nyc": "^15.1.0",
|
|
70
76
|
"open-cli": "^8.0.0",
|
|
71
77
|
"prettier": "^2.1.1",
|
|
78
|
+
"rollup": "^4.34.8",
|
|
72
79
|
"standard-version": "^9.0.0",
|
|
73
80
|
"ts-node": "^9.0.0",
|
|
74
81
|
"typedoc": "^0.27.4",
|
|
@@ -77,6 +84,7 @@
|
|
|
77
84
|
"files": [
|
|
78
85
|
"build/main",
|
|
79
86
|
"build/module",
|
|
87
|
+
"build/browser",
|
|
80
88
|
"!**/*.spec.*",
|
|
81
89
|
"!**/*.json",
|
|
82
90
|
"CHANGELOG.md",
|
|
@@ -109,5 +117,11 @@
|
|
|
109
117
|
"exclude": [
|
|
110
118
|
"**/*.spec.js"
|
|
111
119
|
]
|
|
120
|
+
},
|
|
121
|
+
"exports": {
|
|
122
|
+
".": {
|
|
123
|
+
"import": "./build/browser/index.esm.js",
|
|
124
|
+
"require": "./build/main/index.js"
|
|
125
|
+
}
|
|
112
126
|
}
|
|
113
127
|
}
|
package/build/module/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './lib';
|
package/build/module/index.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { Deserialiser, TransactionLike } from 'transaction-serde';
|
|
2
|
-
type DeserialiserOptions = {
|
|
3
|
-
headers: boolean;
|
|
4
|
-
map: (object: Record<string, unknown>) => TransactionLike;
|
|
5
|
-
};
|
|
6
|
-
/**
|
|
7
|
-
* Multiplies a value by 2. (Also a full example of TypeDoc's functionality.)
|
|
8
|
-
*
|
|
9
|
-
* ### Example (es module)
|
|
10
|
-
* ```js
|
|
11
|
-
* import { double } from 'typescript-starter'
|
|
12
|
-
* console.log(double(4))
|
|
13
|
-
* // => 8
|
|
14
|
-
* ```
|
|
15
|
-
*
|
|
16
|
-
* ### Example (commonjs)
|
|
17
|
-
* ```js
|
|
18
|
-
* var double = require('typescript-starter').double;
|
|
19
|
-
* console.log(double(4))
|
|
20
|
-
* // => 8
|
|
21
|
-
* ```
|
|
22
|
-
*
|
|
23
|
-
* @param value - Comment describing the `value` parameter.
|
|
24
|
-
* @returns Comment describing the return type.
|
|
25
|
-
* @anotherNote Some other value.
|
|
26
|
-
*/
|
|
27
|
-
declare const handler: Deserialiser<DeserialiserOptions>;
|
|
28
|
-
export default handler;
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { parseString } from '@fast-csv/parse';
|
|
2
|
-
import { transactionKeys } from '../../types/common';
|
|
3
|
-
import { parseDateStrings } from '../../utilities/dates';
|
|
4
|
-
import { mergeOptions } from '../../utilities/options';
|
|
5
|
-
const defaultOptions = {
|
|
6
|
-
headers: true,
|
|
7
|
-
map: (object) => {
|
|
8
|
-
const transaction = {};
|
|
9
|
-
if (typeof object !== 'object' || object === null)
|
|
10
|
-
return transaction;
|
|
11
|
-
transactionKeys.forEach((key) => {
|
|
12
|
-
const value = object[key];
|
|
13
|
-
if (typeof value === 'string') {
|
|
14
|
-
transaction[key] = value;
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
return transaction;
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
/**
|
|
21
|
-
* Multiplies a value by 2. (Also a full example of TypeDoc's functionality.)
|
|
22
|
-
*
|
|
23
|
-
* ### Example (es module)
|
|
24
|
-
* ```js
|
|
25
|
-
* import { double } from 'typescript-starter'
|
|
26
|
-
* console.log(double(4))
|
|
27
|
-
* // => 8
|
|
28
|
-
* ```
|
|
29
|
-
*
|
|
30
|
-
* ### Example (commonjs)
|
|
31
|
-
* ```js
|
|
32
|
-
* var double = require('typescript-starter').double;
|
|
33
|
-
* console.log(double(4))
|
|
34
|
-
* // => 8
|
|
35
|
-
* ```
|
|
36
|
-
*
|
|
37
|
-
* @param value - Comment describing the `value` parameter.
|
|
38
|
-
* @returns Comment describing the return type.
|
|
39
|
-
* @anotherNote Some other value.
|
|
40
|
-
*/
|
|
41
|
-
const handler = async (input, options) => {
|
|
42
|
-
const { headers, map } = mergeOptions(defaultOptions, options);
|
|
43
|
-
const objects = await new Promise((resolve, reject) => {
|
|
44
|
-
const rows = [];
|
|
45
|
-
parseString(input, { headers })
|
|
46
|
-
.transform(map)
|
|
47
|
-
.on('data', (row) => rows.push(row))
|
|
48
|
-
.on('error', (error) => reject(error))
|
|
49
|
-
.on('end', () => resolve(rows));
|
|
50
|
-
});
|
|
51
|
-
const transactions = [];
|
|
52
|
-
const dates = [];
|
|
53
|
-
while (objects.length > 0) {
|
|
54
|
-
const object = objects.shift();
|
|
55
|
-
if (!object)
|
|
56
|
-
continue;
|
|
57
|
-
if (typeof object.date !== 'string' ||
|
|
58
|
-
object.date.length === 0 ||
|
|
59
|
-
typeof object.amount !== 'string' ||
|
|
60
|
-
object.amount.length === 0)
|
|
61
|
-
continue;
|
|
62
|
-
const transaction = {};
|
|
63
|
-
const dateString = object.date;
|
|
64
|
-
Object.keys(object).forEach((key) => {
|
|
65
|
-
switch (key) {
|
|
66
|
-
case 'date':
|
|
67
|
-
dates.push({ date: dateString, transaction });
|
|
68
|
-
break;
|
|
69
|
-
case 'amount':
|
|
70
|
-
if (typeof object.amount === 'string') {
|
|
71
|
-
transaction.amount = parseFloat(object.amount);
|
|
72
|
-
if (!Number.isFinite(transaction.amount)) {
|
|
73
|
-
throw new TypeError('Could not parse amount');
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
break;
|
|
77
|
-
case 'payee':
|
|
78
|
-
case 'description':
|
|
79
|
-
case 'category':
|
|
80
|
-
if (typeof object[key] === 'string') {
|
|
81
|
-
transaction[key] = object[key];
|
|
82
|
-
}
|
|
83
|
-
break;
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
transactions.push(transaction);
|
|
87
|
-
}
|
|
88
|
-
const parsedDates = parseDateStrings(dates.map((d) => d.date));
|
|
89
|
-
parsedDates.forEach((date, i) => (dates[i].transaction.date = date));
|
|
90
|
-
return transactions;
|
|
91
|
-
};
|
|
92
|
-
export default handler;
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9kZXNlcmlhbGlzZXJzL2Nzdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVF2RCxNQUFNLGNBQWMsR0FBd0I7SUFDMUMsT0FBTyxFQUFFLElBQUk7SUFDYixHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNkLE1BQU0sV0FBVyxHQUFvQixFQUFFLENBQUM7UUFDeEMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLElBQUk7WUFBRSxPQUFPLFdBQVcsQ0FBQztRQUN0RSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDOUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzlCLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztDQUNGLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLE9BQU8sR0FBc0MsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUMxRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLFlBQVksQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0QsTUFBTSxPQUFP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
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import csv from './csv';
|
|
2
|
-
import json from './json';
|
|
3
|
-
import qif from './qif';
|
|
4
|
-
export { qif, json, csv };
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Rlc2VyaWFsaXNlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDO0FBQ3hCLE9BQU8sSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUMxQixPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUM7QUFFeEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMifQ==
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Deserialiser } from 'transaction-serde';
|
|
2
|
-
/**
|
|
3
|
-
* Multiplies a value by 2. (Also a full example of TypeDoc's functionality.)
|
|
4
|
-
*
|
|
5
|
-
* ### Example (es module)
|
|
6
|
-
* ```js
|
|
7
|
-
* import { double } from 'typescript-starter'
|
|
8
|
-
* console.log(double(4))
|
|
9
|
-
* // => 8
|
|
10
|
-
* ```
|
|
11
|
-
*
|
|
12
|
-
* ### Example (commonjs)
|
|
13
|
-
* ```js
|
|
14
|
-
* var double = require('typescript-starter').double;
|
|
15
|
-
* console.log(double(4))
|
|
16
|
-
* // => 8
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* @param value - Comment describing the `value` parameter.
|
|
20
|
-
* @returns Comment describing the return type.
|
|
21
|
-
* @anotherNote Some other value.
|
|
22
|
-
*/
|
|
23
|
-
declare const handler: Deserialiser;
|
|
24
|
-
export default handler;
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { parseDateStrings } from '../../utilities/dates';
|
|
2
|
-
/**
|
|
3
|
-
* Multiplies a value by 2. (Also a full example of TypeDoc's functionality.)
|
|
4
|
-
*
|
|
5
|
-
* ### Example (es module)
|
|
6
|
-
* ```js
|
|
7
|
-
* import { double } from 'typescript-starter'
|
|
8
|
-
* console.log(double(4))
|
|
9
|
-
* // => 8
|
|
10
|
-
* ```
|
|
11
|
-
*
|
|
12
|
-
* ### Example (commonjs)
|
|
13
|
-
* ```js
|
|
14
|
-
* var double = require('typescript-starter').double;
|
|
15
|
-
* console.log(double(4))
|
|
16
|
-
* // => 8
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* @param value - Comment describing the `value` parameter.
|
|
20
|
-
* @returns Comment describing the return type.
|
|
21
|
-
* @anotherNote Some other value.
|
|
22
|
-
*/
|
|
23
|
-
const handler = (input) => {
|
|
24
|
-
let objects = [];
|
|
25
|
-
try {
|
|
26
|
-
objects = JSON.parse(input);
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
throw Error('Input is not valid JSON');
|
|
30
|
-
}
|
|
31
|
-
if (!Array.isArray(objects)) {
|
|
32
|
-
throw Error('Input is not an array');
|
|
33
|
-
}
|
|
34
|
-
const transactions = [];
|
|
35
|
-
const dates = [];
|
|
36
|
-
while (objects.length > 0) {
|
|
37
|
-
const object = objects.shift();
|
|
38
|
-
if (!object)
|
|
39
|
-
continue;
|
|
40
|
-
if (typeof object.date !== 'string' ||
|
|
41
|
-
object.date.length === 0 ||
|
|
42
|
-
!['number', 'string'].includes(typeof object.amount) ||
|
|
43
|
-
String(object.amount).length === 0)
|
|
44
|
-
continue;
|
|
45
|
-
const transaction = {};
|
|
46
|
-
const dateString = object.date;
|
|
47
|
-
Object.keys(object).forEach((key) => {
|
|
48
|
-
switch (key) {
|
|
49
|
-
case 'date':
|
|
50
|
-
dates.push({ date: dateString, transaction });
|
|
51
|
-
break;
|
|
52
|
-
case 'amount':
|
|
53
|
-
if (typeof object.amount === 'number') {
|
|
54
|
-
transaction.amount = object.amount;
|
|
55
|
-
}
|
|
56
|
-
else if (typeof object.amount === 'string') {
|
|
57
|
-
transaction.amount = parseFloat(object.amount);
|
|
58
|
-
if (!Number.isFinite(transaction.amount)) {
|
|
59
|
-
throw new TypeError('Could not parse amount');
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
break;
|
|
63
|
-
case 'payee':
|
|
64
|
-
case 'description':
|
|
65
|
-
case 'category':
|
|
66
|
-
if (typeof object[key] === 'string') {
|
|
67
|
-
transaction[key] = object[key];
|
|
68
|
-
}
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
transactions.push(transaction);
|
|
73
|
-
}
|
|
74
|
-
const parsedDates = parseDateStrings(dates.map((d) => d.date));
|
|
75
|
-
parsedDates.forEach((date, i) => (dates[i].transaction.date = date));
|
|
76
|
-
return transactions;
|
|
77
|
-
};
|
|
78
|
-
export default handler;
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGVzZXJpYWxpc2Vycy9qc29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sT0FBTyxHQUFpQixDQUFDLEtBQWEsRUFBRSxFQUFFO0lBQzlDLElBQUksT0FBTyxHQUFpQyxFQUFFLENBQUM7SUFDL0MsSUFBSSxDQUFDO1FBQ0gsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDNUIsTUFBTSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsTUFBTSxZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUN2QyxNQUFNLEtBQUssR0FBaUQsRUFBRSxDQUFDO0lBQy9ELE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU07WUFBRSxTQUFTO1FBQ3RCLElBQ0UsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN4QixDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUVsQyxTQUFTO1FBQ1gsTUFBTSxXQUFXLEdBQWdCLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDbEMsUUFBUSxHQUFHLEVBQUUsQ0FBQztnQkFDWixLQUFLLE1BQU07b0JBQ1QsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztvQkFDOUMsTUFBTTtnQkFDUixLQUFLLFFBQVE7b0JBQ1gsSUFBSSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ3RDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztvQkFDckMsQ0FBQzt5QkFBTSxJQUFJLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDN0MsV0FBVyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzs0QkFDekMsTUFBTSxJQUFJLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO3dCQUNoRCxDQUFDO29CQUNILENBQUM7b0JBQ0QsTUFBTTtnQkFDUixLQUFLLE9BQU8sQ0FBQztnQkFDYixLQUFLLGFBQWEsQ0FBQztnQkFDbkIsS0FBSyxVQUFVO29CQUNiLElBQUksT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ3BDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFXLENBQUM7b0JBQzNDLENBQUM7b0JBQ0QsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9ELFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckUsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQyxDQUFDO0FBQ0YsZUFBZSxPQUFPLENBQUMifQ==
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Deserialiser } from 'transaction-serde';
|
|
2
|
-
/**
|
|
3
|
-
* Multiplies a value by 2. (Also a full example of TypeDoc's functionality.)
|
|
4
|
-
*
|
|
5
|
-
* ### Example (es module)
|
|
6
|
-
* ```js
|
|
7
|
-
* import { double } from 'typescript-starter'
|
|
8
|
-
* console.log(double(4))
|
|
9
|
-
* // => 8
|
|
10
|
-
* ```
|
|
11
|
-
*
|
|
12
|
-
* ### Example (commonjs)
|
|
13
|
-
* ```js
|
|
14
|
-
* var double = require('typescript-starter').double;
|
|
15
|
-
* console.log(double(4))
|
|
16
|
-
* // => 8
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* @param value - Comment describing the `value` parameter.
|
|
20
|
-
* @returns Comment describing the return type.
|
|
21
|
-
* @anotherNote Some other value.
|
|
22
|
-
*/
|
|
23
|
-
declare const handler: Deserialiser;
|
|
24
|
-
export default handler;
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { ENTRY_END, HEADER_VALUES } from '../../types/qif';
|
|
2
|
-
import { parseDateStrings } from '../../utilities/dates';
|
|
3
|
-
function isValidHeader(header) {
|
|
4
|
-
return HEADER_VALUES.includes(header);
|
|
5
|
-
}
|
|
6
|
-
const fieldMap = {
|
|
7
|
-
D: 'date',
|
|
8
|
-
T: 'amount',
|
|
9
|
-
P: 'payee',
|
|
10
|
-
M: 'description',
|
|
11
|
-
L: 'category',
|
|
12
|
-
};
|
|
13
|
-
/**
|
|
14
|
-
* Multiplies a value by 2. (Also a full example of TypeDoc's functionality.)
|
|
15
|
-
*
|
|
16
|
-
* ### Example (es module)
|
|
17
|
-
* ```js
|
|
18
|
-
* import { double } from 'typescript-starter'
|
|
19
|
-
* console.log(double(4))
|
|
20
|
-
* // => 8
|
|
21
|
-
* ```
|
|
22
|
-
*
|
|
23
|
-
* ### Example (commonjs)
|
|
24
|
-
* ```js
|
|
25
|
-
* var double = require('typescript-starter').double;
|
|
26
|
-
* console.log(double(4))
|
|
27
|
-
* // => 8
|
|
28
|
-
* ```
|
|
29
|
-
*
|
|
30
|
-
* @param value - Comment describing the `value` parameter.
|
|
31
|
-
* @returns Comment describing the return type.
|
|
32
|
-
* @anotherNote Some other value.
|
|
33
|
-
*/
|
|
34
|
-
const handler = (input) => {
|
|
35
|
-
const lines = input.trim().split('\n');
|
|
36
|
-
const header = lines.shift();
|
|
37
|
-
if (!isValidHeader(header))
|
|
38
|
-
throw Error('Unknown header: ' + header);
|
|
39
|
-
const transactions = [{}];
|
|
40
|
-
const dates = [];
|
|
41
|
-
while (lines.length > 0) {
|
|
42
|
-
const line = lines.shift();
|
|
43
|
-
if (!line)
|
|
44
|
-
continue;
|
|
45
|
-
const indicator = line.charAt(0);
|
|
46
|
-
if (indicator === ENTRY_END && lines.length > 0) {
|
|
47
|
-
transactions.push({});
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
else if (indicator === ENTRY_END)
|
|
51
|
-
break;
|
|
52
|
-
const transaction = transactions.at(-1);
|
|
53
|
-
if (!(indicator in fieldMap))
|
|
54
|
-
continue;
|
|
55
|
-
const fieldName = fieldMap[indicator];
|
|
56
|
-
const fieldValue = line.substring(1);
|
|
57
|
-
switch (fieldName) {
|
|
58
|
-
case 'date':
|
|
59
|
-
dates.push({ date: fieldValue, transaction });
|
|
60
|
-
break;
|
|
61
|
-
case 'amount':
|
|
62
|
-
transaction.amount = parseFloat(fieldValue);
|
|
63
|
-
break;
|
|
64
|
-
default:
|
|
65
|
-
transaction[fieldName] = fieldValue;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
const parsedDates = parseDateStrings(dates.map((d) => d.date));
|
|
69
|
-
parsedDates.forEach((date, i) => (dates[i].transaction.date = date));
|
|
70
|
-
return transactions;
|
|
71
|
-
};
|
|
72
|
-
export default handler;
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWlmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9kZXNlcmlhbGlzZXJzL3FpZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXpELFNBQVMsYUFBYSxDQUFDLE1BQWU7SUFDcEMsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQWdCLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsTUFBTSxRQUFRLEdBQXlDO0lBQ3JELENBQUMsRUFBRSxNQUFNO0lBQ1QsQ0FBQyxFQUFFLFFBQVE7SUFDWCxDQUFDLEVBQUUsT0FBTztJQUNWLENBQUMsRUFBRSxhQUFhO0lBQ2hCLENBQUMsRUFBRSxVQUFVO0NBQ2QsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sT0FBTyxHQUFpQixDQUFDLEtBQWEsRUFBRSxFQUFFO0lBQzlDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQUUsTUFBTSxLQUFLLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDckUsTUFBTSxZQUFZLEdBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekMsTUFBTSxLQUFLLEdBQWlELEVBQUUsQ0FBQztJQUMvRCxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxJQUFJO1lBQUUsU0FBUztRQUNwQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksU0FBUyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hELFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEIsU0FBUztRQUNYLENBQUM7YUFBTSxJQUFJLFNBQVMsS0FBSyxTQUFTO1lBQUUsTUFBTTtRQUMxQyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFnQixDQUFDO1FBQ3ZELElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUM7WUFBRSxTQUFTO1FBQ3ZDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLFFBQVEsU0FBUyxFQUFFLENBQUM7WUFDbEIsS0FBSyxNQUFNO2dCQUNULEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQzlDLE1BQU07WUFDUixLQUFLLFFBQVE7Z0JBQ1gsV0FBVyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzVDLE1BQU07WUFDUjtnQkFDRSxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDL0QsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyRSxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDLENBQUM7QUFDRixlQUFlLE9BQU8sQ0FBQyJ9
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export * as deserialisers from './deserialisers';
|
|
2
|
-
export * as serialisers from './serialisers';
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxhQUFhLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxLQUFLLFdBQVcsTUFBTSxlQUFlLENBQUMifQ==
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Serialiser } from 'transaction-serde';
|
|
2
|
-
/**
|
|
3
|
-
* Multiplies a value by 2. (Also a full example of TypeDoc's functionality.)
|
|
4
|
-
*
|
|
5
|
-
* ### Example (es module)
|
|
6
|
-
* ```js
|
|
7
|
-
* import { double } from 'typescript-starter'
|
|
8
|
-
* console.log(double(4))
|
|
9
|
-
* // => 8
|
|
10
|
-
* ```
|
|
11
|
-
*
|
|
12
|
-
* ### Example (commonjs)
|
|
13
|
-
* ```js
|
|
14
|
-
* var double = require('typescript-starter').double;
|
|
15
|
-
* console.log(double(4))
|
|
16
|
-
* // => 8
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* @param value - Comment describing the `value` parameter.
|
|
20
|
-
* @returns Comment describing the return type.
|
|
21
|
-
* @anotherNote Some other value.
|
|
22
|
-
*/
|
|
23
|
-
declare const handler: Serialiser;
|
|
24
|
-
export default handler;
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { writeToString } from '@fast-csv/format';
|
|
2
|
-
import { transactionKeys } from '../../types/common';
|
|
3
|
-
/**
|
|
4
|
-
* Multiplies a value by 2. (Also a full example of TypeDoc's functionality.)
|
|
5
|
-
*
|
|
6
|
-
* ### Example (es module)
|
|
7
|
-
* ```js
|
|
8
|
-
* import { double } from 'typescript-starter'
|
|
9
|
-
* console.log(double(4))
|
|
10
|
-
* // => 8
|
|
11
|
-
* ```
|
|
12
|
-
*
|
|
13
|
-
* ### Example (commonjs)
|
|
14
|
-
* ```js
|
|
15
|
-
* var double = require('typescript-starter').double;
|
|
16
|
-
* console.log(double(4))
|
|
17
|
-
* // => 8
|
|
18
|
-
* ```
|
|
19
|
-
*
|
|
20
|
-
* @param value - Comment describing the `value` parameter.
|
|
21
|
-
* @returns Comment describing the return type.
|
|
22
|
-
* @anotherNote Some other value.
|
|
23
|
-
*/
|
|
24
|
-
const handler = (input) => {
|
|
25
|
-
const output = [];
|
|
26
|
-
for (const transaction of input) {
|
|
27
|
-
const { date, ...rest } = transaction;
|
|
28
|
-
if (!(date instanceof Date) || Number.isNaN(date.getTime()))
|
|
29
|
-
continue;
|
|
30
|
-
output.push({ date: date.toISOString().substring(0, 10), ...rest });
|
|
31
|
-
}
|
|
32
|
-
const quoteColumns = transactionKeys.map((key) => key === 'amount' ? false : true);
|
|
33
|
-
return writeToString(output, {
|
|
34
|
-
headers: true,
|
|
35
|
-
quoteColumns,
|
|
36
|
-
quoteHeaders: true,
|
|
37
|
-
});
|
|
38
|
-
};
|
|
39
|
-
export default handler;
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJpYWxpc2Vycy9jc3YudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBR2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVyRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLE9BQU8sR0FBZSxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ3BDLE1BQU0sTUFBTSxHQUF5QyxFQUFFLENBQUM7SUFDeEQsS0FBSyxNQUFNLFdBQVcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNoQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUFFLFNBQVM7UUFDdEUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUMvQyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDaEMsQ0FBQztJQUNGLE9BQU8sYUFBYSxDQUFDLE1BQU0sRUFBRTtRQUMzQixPQUFPLEVBQUUsSUFBSTtRQUNiLFlBQVk7UUFDWixZQUFZLEVBQUUsSUFBSTtLQUNuQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFDRixlQUFlLE9BQU8sQ0FBQyJ9
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import csv from './csv';
|
|
2
|
-
import json from './json';
|
|
3
|
-
import qif from './qif';
|
|
4
|
-
export { qif, json, csv };
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlcmlhbGlzZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQztBQUN4QixPQUFPLElBQUksTUFBTSxRQUFRLENBQUM7QUFDMUIsT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDIn0=
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Serialiser } from 'transaction-serde';
|
|
2
|
-
/**
|
|
3
|
-
* Multiplies a value by 2. (Also a full example of TypeDoc's functionality.)
|
|
4
|
-
*
|
|
5
|
-
* ### Example (es module)
|
|
6
|
-
* ```js
|
|
7
|
-
* import { double } from 'typescript-starter'
|
|
8
|
-
* console.log(double(4))
|
|
9
|
-
* // => 8
|
|
10
|
-
* ```
|
|
11
|
-
*
|
|
12
|
-
* ### Example (commonjs)
|
|
13
|
-
* ```js
|
|
14
|
-
* var double = require('typescript-starter').double;
|
|
15
|
-
* console.log(double(4))
|
|
16
|
-
* // => 8
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* @param value - Comment describing the `value` parameter.
|
|
20
|
-
* @returns Comment describing the return type.
|
|
21
|
-
* @anotherNote Some other value.
|
|
22
|
-
*/
|
|
23
|
-
declare const handler: Serialiser;
|
|
24
|
-
export default handler;
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Multiplies a value by 2. (Also a full example of TypeDoc's functionality.)
|
|
3
|
-
*
|
|
4
|
-
* ### Example (es module)
|
|
5
|
-
* ```js
|
|
6
|
-
* import { double } from 'typescript-starter'
|
|
7
|
-
* console.log(double(4))
|
|
8
|
-
* // => 8
|
|
9
|
-
* ```
|
|
10
|
-
*
|
|
11
|
-
* ### Example (commonjs)
|
|
12
|
-
* ```js
|
|
13
|
-
* var double = require('typescript-starter').double;
|
|
14
|
-
* console.log(double(4))
|
|
15
|
-
* // => 8
|
|
16
|
-
* ```
|
|
17
|
-
*
|
|
18
|
-
* @param value - Comment describing the `value` parameter.
|
|
19
|
-
* @returns Comment describing the return type.
|
|
20
|
-
* @anotherNote Some other value.
|
|
21
|
-
*/
|
|
22
|
-
const handler = (input) => {
|
|
23
|
-
const output = [];
|
|
24
|
-
for (const transaction of input) {
|
|
25
|
-
const { date, ...rest } = transaction;
|
|
26
|
-
if (!(date instanceof Date) || Number.isNaN(date.getTime()))
|
|
27
|
-
continue;
|
|
28
|
-
output.push({ date: date.toISOString().substring(0, 10), ...rest });
|
|
29
|
-
}
|
|
30
|
-
return JSON.stringify(output);
|
|
31
|
-
};
|
|
32
|
-
export default handler;
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VyaWFsaXNlcnMvanNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLE9BQU8sR0FBZSxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ3BDLE1BQU0sTUFBTSxHQUF5QyxFQUFFLENBQUM7SUFDeEQsS0FBSyxNQUFNLFdBQVcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNoQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUFFLFNBQVM7UUFDdEUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUM7QUFDRixlQUFlLE9BQU8sQ0FBQyJ9
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { Serialiser } from 'transaction-serde';
|
|
2
|
-
import { HEADER_VALUES } from '../../types/qif';
|
|
3
|
-
type SerialiserOptions = {
|
|
4
|
-
locale: string | string[];
|
|
5
|
-
header: (typeof HEADER_VALUES)[number];
|
|
6
|
-
};
|
|
7
|
-
/**
|
|
8
|
-
* Multiplies a value by 2. (Also a full example of TypeDoc's functionality.)
|
|
9
|
-
*
|
|
10
|
-
* ### Example (es module)
|
|
11
|
-
* ```js
|
|
12
|
-
* import { double } from 'typescript-starter'
|
|
13
|
-
* console.log(double(4))
|
|
14
|
-
* // => 8
|
|
15
|
-
* ```
|
|
16
|
-
*
|
|
17
|
-
* ### Example (commonjs)
|
|
18
|
-
* ```js
|
|
19
|
-
* var double = require('typescript-starter').double;
|
|
20
|
-
* console.log(double(4))
|
|
21
|
-
* // => 8
|
|
22
|
-
* ```
|
|
23
|
-
*
|
|
24
|
-
* @param value - Comment describing the `value` parameter.
|
|
25
|
-
* @returns Comment describing the return type.
|
|
26
|
-
* @anotherNote Some other value.
|
|
27
|
-
*/
|
|
28
|
-
declare const handler: Serialiser<SerialiserOptions>;
|
|
29
|
-
export default handler;
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { ENTRY_END, HEADERS } from '../../types/qif';
|
|
2
|
-
import { mergeOptions } from '../../utilities/options';
|
|
3
|
-
const fieldMap = {
|
|
4
|
-
date: 'D',
|
|
5
|
-
amount: 'T',
|
|
6
|
-
payee: 'P',
|
|
7
|
-
description: 'M',
|
|
8
|
-
category: 'L',
|
|
9
|
-
};
|
|
10
|
-
const defaultOptions = {
|
|
11
|
-
locale: 'en-US',
|
|
12
|
-
header: HEADERS.BANK,
|
|
13
|
-
};
|
|
14
|
-
/**
|
|
15
|
-
* Multiplies a value by 2. (Also a full example of TypeDoc's functionality.)
|
|
16
|
-
*
|
|
17
|
-
* ### Example (es module)
|
|
18
|
-
* ```js
|
|
19
|
-
* import { double } from 'typescript-starter'
|
|
20
|
-
* console.log(double(4))
|
|
21
|
-
* // => 8
|
|
22
|
-
* ```
|
|
23
|
-
*
|
|
24
|
-
* ### Example (commonjs)
|
|
25
|
-
* ```js
|
|
26
|
-
* var double = require('typescript-starter').double;
|
|
27
|
-
* console.log(double(4))
|
|
28
|
-
* // => 8
|
|
29
|
-
* ```
|
|
30
|
-
*
|
|
31
|
-
* @param value - Comment describing the `value` parameter.
|
|
32
|
-
* @returns Comment describing the return type.
|
|
33
|
-
* @anotherNote Some other value.
|
|
34
|
-
*/
|
|
35
|
-
const handler = (input, options) => {
|
|
36
|
-
const { locale, header } = mergeOptions(defaultOptions, options);
|
|
37
|
-
const output = [header];
|
|
38
|
-
for (const transaction of input) {
|
|
39
|
-
const { date, amount } = transaction;
|
|
40
|
-
if (!(date instanceof Date) ||
|
|
41
|
-
Number.isNaN(date.getTime()) ||
|
|
42
|
-
typeof amount !== 'number')
|
|
43
|
-
continue;
|
|
44
|
-
Object.keys(transaction).forEach((key) => {
|
|
45
|
-
const validKey = key;
|
|
46
|
-
switch (validKey) {
|
|
47
|
-
case 'date':
|
|
48
|
-
output.push(fieldMap.date + date.toISOString().substring(0, 10));
|
|
49
|
-
break;
|
|
50
|
-
case 'amount':
|
|
51
|
-
output.push(fieldMap.amount + amount.toLocaleString(locale));
|
|
52
|
-
break;
|
|
53
|
-
default:
|
|
54
|
-
if (typeof transaction[validKey] === 'string') {
|
|
55
|
-
const value = transaction[validKey];
|
|
56
|
-
output.push(fieldMap[validKey] + value);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
output.push(ENTRY_END);
|
|
61
|
-
}
|
|
62
|
-
return output.join('\n');
|
|
63
|
-
};
|
|
64
|
-
export default handler;
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWlmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJpYWxpc2Vycy9xaWYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFNBQVMsRUFBaUIsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE1BQU0sUUFBUSxHQUEyQztJQUN2RCxJQUFJLEVBQUUsR0FBRztJQUNULE1BQU0sRUFBRSxHQUFHO0lBQ1gsS0FBSyxFQUFFLEdBQUc7SUFDVixXQUFXLEVBQUUsR0FBRztJQUNoQixRQUFRLEVBQUUsR0FBRztDQUNkLENBQUM7QUFPRixNQUFNLGNBQWMsR0FBc0I7SUFDeEMsTUFBTSxFQUFFLE9BQU87SUFDZixNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUk7Q0FDckIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sT0FBTyxHQUFrQyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNoRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakUsTUFBTSxNQUFNLEdBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxLQUFLLE1BQU0sV0FBVyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDO1FBQ3JDLElBQ0UsQ0FBQyxDQUFDLElBQUksWUFBWSxJQUFJLENBQUM7WUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUIsT0FBTyxNQUFNLEtBQUssUUFBUTtZQUUxQixTQUFTO1FBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN2QyxNQUFNLFFBQVEsR0FBRyxHQUF3QixDQUFDO1lBQzFDLFFBQVEsUUFBUSxFQUFFLENBQUM7Z0JBQ2pCLEtBQUssTUFBTTtvQkFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDakUsTUFBTTtnQkFDUixLQUFLLFFBQVE7b0JBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDN0QsTUFBTTtnQkFDUjtvQkFDRSxJQUFJLE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUM5QyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFXLENBQUM7d0JBQzlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO29CQUMxQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQztBQUNGLGVBQWUsT0FBTyxDQUFDIn0=
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const transactionKeys: readonly ["date", "amount", "payee", "description", "category"];
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export const transactionKeys = [
|
|
2
|
-
'date',
|
|
3
|
-
'amount',
|
|
4
|
-
'payee',
|
|
5
|
-
'description',
|
|
6
|
-
'category',
|
|
7
|
-
];
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3R5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUc7SUFDN0IsTUFBTTtJQUNOLFFBQVE7SUFDUixPQUFPO0lBQ1AsYUFBYTtJQUNiLFVBQVU7Q0FDRixDQUFDIn0=
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export declare const HEADERS: {
|
|
2
|
-
readonly BANK: "!Type:Bank";
|
|
3
|
-
readonly CASH: "!Type:Cash";
|
|
4
|
-
readonly CREDIT_CARD: "!Type:CCard";
|
|
5
|
-
readonly ASSETS: "!Type:Oth A";
|
|
6
|
-
readonly LIABILITIES: "!Type:Oth L";
|
|
7
|
-
};
|
|
8
|
-
export declare const HEADER_VALUES: ("!Type:Bank" | "!Type:Cash" | "!Type:CCard" | "!Type:Oth A" | "!Type:Oth L")[];
|
|
9
|
-
export type Header = (typeof HEADER_VALUES)[number];
|
|
10
|
-
export declare const ENTRY_END = "^";
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export const HEADERS = {
|
|
2
|
-
BANK: '!Type:Bank',
|
|
3
|
-
CASH: '!Type:Cash',
|
|
4
|
-
CREDIT_CARD: '!Type:CCard',
|
|
5
|
-
// INVESTMENTS: '!Type:Invst',
|
|
6
|
-
ASSETS: '!Type:Oth A',
|
|
7
|
-
LIABILITIES: '!Type:Oth L',
|
|
8
|
-
// ACCOUNTS: '!Account',
|
|
9
|
-
// CATEGORIES: '!Type:Cat',
|
|
10
|
-
// CLASS: '!Type:Class',
|
|
11
|
-
// MEMORIZED: '!Type:Memorized'
|
|
12
|
-
};
|
|
13
|
-
export const HEADER_VALUES = Object.values(HEADERS);
|
|
14
|
-
export const ENTRY_END = '^';
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWlmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3R5cGVzL3FpZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUc7SUFDckIsSUFBSSxFQUFFLFlBQVk7SUFDbEIsSUFBSSxFQUFFLFlBQVk7SUFDbEIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsOEJBQThCO0lBQzlCLE1BQU0sRUFBRSxhQUFhO0lBQ3JCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLHdCQUF3QjtJQUN4QiwyQkFBMkI7SUFDM0Isd0JBQXdCO0lBQ3hCLCtCQUErQjtDQUN2QixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFJcEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyJ9
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parse a set of date strings that could be one of many formats to a set of Date objects.
|
|
3
|
-
*
|
|
4
|
-
* @param dates The date strings to parse
|
|
5
|
-
* @param formats The formats to try parsing the dates with, in order of preference. Optional; defaults to standard numeric
|
|
6
|
-
* @throws if the date strings were not parsable using any of the formats
|
|
7
|
-
* @returns An array of date objects representing the same dates as the date strings provided
|
|
8
|
-
*/
|
|
9
|
-
export declare const parseDateStrings: (dates: string[], formats?: string[]) => Date[];
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { UTCDateMini } from '@date-fns/utc';
|
|
2
|
-
import { parse } from 'date-fns/parse';
|
|
3
|
-
const defaultFormats = [
|
|
4
|
-
'yyyy/MM/dd',
|
|
5
|
-
'yyyy/M/d',
|
|
6
|
-
'dd/MM/yyyy',
|
|
7
|
-
'd/M/yyyy',
|
|
8
|
-
'MM/dd/yyyy',
|
|
9
|
-
'M/d/yyyy',
|
|
10
|
-
'd MMMM yyyy',
|
|
11
|
-
'dd MMM yyyy',
|
|
12
|
-
'MMMM d yyyy',
|
|
13
|
-
'MMM dd yyyy',
|
|
14
|
-
].flatMap((pattern) => [
|
|
15
|
-
pattern,
|
|
16
|
-
pattern.replaceAll('/', '-'),
|
|
17
|
-
pattern.replaceAll('/', ''),
|
|
18
|
-
]);
|
|
19
|
-
/**
|
|
20
|
-
* Parse a set of date strings that could be one of many formats to a set of Date objects.
|
|
21
|
-
*
|
|
22
|
-
* @param dates The date strings to parse
|
|
23
|
-
* @param formats The formats to try parsing the dates with, in order of preference. Optional; defaults to standard numeric
|
|
24
|
-
* @throws if the date strings were not parsable using any of the formats
|
|
25
|
-
* @returns An array of date objects representing the same dates as the date strings provided
|
|
26
|
-
*/
|
|
27
|
-
export const parseDateStrings = (dates, formats = defaultFormats) => {
|
|
28
|
-
for (const format of formats) {
|
|
29
|
-
const parsedDates = [];
|
|
30
|
-
for (const date of dates) {
|
|
31
|
-
const parsed = parse(date, format, new Date());
|
|
32
|
-
if (Number.isNaN(parsed.getTime()))
|
|
33
|
-
break;
|
|
34
|
-
parsedDates.push(new UTCDateMini(parsed.getFullYear(), parsed.getMonth(), parsed.getDate()));
|
|
35
|
-
}
|
|
36
|
-
if (parsedDates.length === dates.length)
|
|
37
|
-
return parsedDates;
|
|
38
|
-
}
|
|
39
|
-
throw new Error('Could not parse dates');
|
|
40
|
-
};
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbGl0aWVzL2RhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE1BQU0sY0FBYyxHQUFHO0lBQ3JCLFlBQVk7SUFDWixVQUFVO0lBQ1YsWUFBWTtJQUNaLFVBQVU7SUFDVixZQUFZO0lBQ1osVUFBVTtJQUNWLGFBQWE7SUFDYixhQUFhO0lBQ2IsYUFBYTtJQUNiLGFBQWE7Q0FDZCxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDckIsT0FBTztJQUNQLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUM1QixPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7Q0FDNUIsQ0FBQyxDQUFDO0FBQ0g7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQzlCLEtBQWUsRUFDZixPQUFPLEdBQUcsY0FBYyxFQUNoQixFQUFFO0lBQ1YsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM3QixNQUFNLFdBQVcsR0FBVyxFQUFFLENBQUM7UUFDL0IsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7WUFDL0MsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFBRSxNQUFNO1lBQzFDLFdBQVcsQ0FBQyxJQUFJLENBQ2QsSUFBSSxXQUFXLENBQ2IsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUNwQixNQUFNLENBQUMsUUFBUSxFQUFFLEVBQ2pCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FDakIsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtZQUFFLE9BQU8sV0FBVyxDQUFDO0lBQzlELENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDM0MsQ0FBQyxDQUFDIn0=
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const mergeOptions: <T>(defaults: T, ...overrides: (Partial<T> | undefined)[]) => T;
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export const mergeOptions = (defaults, ...overrides) => Object.assign({}, defaults, ...overrides);
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsaXRpZXMvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FDMUIsUUFBVyxFQUNYLEdBQUcsU0FBcUMsRUFDckMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDIn0=
|