@forestadmin/datasource-demo-fintech 1.0.8 → 1.0.9
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/README.md +4 -4
- package/dist/seed/utils.d.ts +3 -2
- package/dist/seed/utils.js +23 -12
- package/package.json +1 -2
package/README.md
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
Demo data source for Forest Admin, themed around a fintech / compliance back
|
|
4
4
|
office (customers, cards, KYC, AML alerts, chargebacks…).
|
|
5
5
|
|
|
6
|
-
On boot it generates a throwaway SQLite database
|
|
7
|
-
|
|
6
|
+
On boot it generates a throwaway SQLite database of random data, seeds it via
|
|
7
|
+
[Knex](https://knexjs.org/), and exposes it through
|
|
8
8
|
`@forestadmin/datasource-sql`. The schema, column types and primary keys are
|
|
9
9
|
introspected from the freshly-created tables. It is used by `forest create demo`
|
|
10
10
|
to bootstrap a project with realistic sample data.
|
|
@@ -25,9 +25,9 @@ re-rolled each time), under the OS temp directory. The seed lives in `src/seed`:
|
|
|
25
25
|
- one file per domain (`customers`, `cards`, `kyc`, `aml`, `refunds`,
|
|
26
26
|
`chargebacks`) — each creates its table(s) and inserts rows.
|
|
27
27
|
- `pools.ts` / `utils.ts` — curated reference data (kept hand-written so
|
|
28
|
-
geography stays internally consistent) and
|
|
28
|
+
geography stays internally consistent) and `Math.random`-backed random helpers.
|
|
29
29
|
|
|
30
|
-
Business coherence is enforced in the builders, not by
|
|
30
|
+
Business coherence is enforced in the builders, not by the random helpers: sanctioned
|
|
31
31
|
customers never clear onboarding, alerts are weighted by customer risk, a filed
|
|
32
32
|
SAR escalates its source alert, chargebacks link back to the right card and
|
|
33
33
|
refund request, etc.
|
package/dist/seed/utils.d.ts
CHANGED
|
@@ -2,9 +2,10 @@ import type { Knex } from 'knex';
|
|
|
2
2
|
export declare const randint: (lo: number, hi: number) => number;
|
|
3
3
|
export declare const uniform: (lo: number, hi: number) => number;
|
|
4
4
|
export declare const chance: (p: number) => boolean;
|
|
5
|
-
export declare
|
|
5
|
+
export declare function pick<T>(arr: T[]): T;
|
|
6
|
+
/** Fisher-Yates on a copy, so pools shared across seeders are never mutated. */
|
|
7
|
+
export declare function shuffle<T>(arr: T[]): T[];
|
|
6
8
|
export declare const sample: <T>(arr: T[], k: number) => T[];
|
|
7
|
-
export declare const shuffle: <T>(arr: T[]) => T[];
|
|
8
9
|
export declare const round2: (n: number) => number;
|
|
9
10
|
/** Weighted pick mirroring the original generator (tolerates zero weights). */
|
|
10
11
|
export declare function choices<T>(items: T[], weights: number[]): T;
|
package/dist/seed/utils.js
CHANGED
|
@@ -1,27 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.round2 = exports.
|
|
3
|
+
exports.round2 = exports.sample = exports.chance = exports.uniform = exports.randint = void 0;
|
|
4
|
+
exports.pick = pick;
|
|
5
|
+
exports.shuffle = shuffle;
|
|
4
6
|
exports.choices = choices;
|
|
5
7
|
exports.insertAll = insertAll;
|
|
6
|
-
const
|
|
7
|
-
const randint = (lo, hi) => faker_1.faker.number.int({ min: lo, max: hi });
|
|
8
|
+
const randint = (lo, hi) => lo + Math.floor(Math.random() * (hi - lo + 1));
|
|
8
9
|
exports.randint = randint;
|
|
9
|
-
const uniform = (lo, hi) =>
|
|
10
|
+
const uniform = (lo, hi) => lo + Math.random() * (hi - lo);
|
|
10
11
|
exports.uniform = uniform;
|
|
11
|
-
const chance = (p) =>
|
|
12
|
+
const chance = (p) => Math.random() < p;
|
|
12
13
|
exports.chance = chance;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
function pick(arr) {
|
|
15
|
+
if (!arr.length)
|
|
16
|
+
throw new Error('Cannot pick from an empty array');
|
|
17
|
+
return arr[(0, exports.randint)(0, arr.length - 1)];
|
|
18
|
+
}
|
|
19
|
+
/** Fisher-Yates on a copy, so pools shared across seeders are never mutated. */
|
|
20
|
+
function shuffle(arr) {
|
|
21
|
+
const copy = [...arr];
|
|
22
|
+
for (let i = copy.length - 1; i > 0; i -= 1) {
|
|
23
|
+
const j = (0, exports.randint)(0, i);
|
|
24
|
+
[copy[i], copy[j]] = [copy[j], copy[i]];
|
|
25
|
+
}
|
|
26
|
+
return copy;
|
|
27
|
+
}
|
|
28
|
+
const sample = (arr, k) => shuffle(arr).slice(0, k);
|
|
16
29
|
exports.sample = sample;
|
|
17
|
-
const shuffle = (arr) => faker_1.faker.helpers.shuffle(arr);
|
|
18
|
-
exports.shuffle = shuffle;
|
|
19
30
|
const round2 = (n) => Math.round(n * 100) / 100;
|
|
20
31
|
exports.round2 = round2;
|
|
21
32
|
/** Weighted pick mirroring the original generator (tolerates zero weights). */
|
|
22
33
|
function choices(items, weights) {
|
|
23
34
|
const total = weights.reduce((a, b) => a + b, 0);
|
|
24
|
-
let r =
|
|
35
|
+
let r = (0, exports.uniform)(0, total);
|
|
25
36
|
for (let i = 0; i < items.length; i += 1) {
|
|
26
37
|
r -= weights[i];
|
|
27
38
|
if (r < 0)
|
|
@@ -37,4 +48,4 @@ async function insertAll(knex, table, rows) {
|
|
|
37
48
|
if (rows.length)
|
|
38
49
|
await knex.batchInsert(table, rows, 100);
|
|
39
50
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VlZC91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFVQSxvQkFJQztBQUdELDBCQVNDO0FBTUQsMEJBVUM7QUFNRCw4QkFNQztBQWpETSxNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQVUsRUFBRSxFQUFVLEVBQVUsRUFBRSxDQUN4RCxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFEcEMsUUFBQSxPQUFPLFdBQzZCO0FBQzFDLE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBVSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUE3RSxRQUFBLE9BQU8sV0FBc0U7QUFDbkYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFTLEVBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFBbkQsUUFBQSxNQUFNLFVBQTZDO0FBRWhFLFNBQWdCLElBQUksQ0FBSSxHQUFRO0lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUVwRSxPQUFPLEdBQUcsQ0FBQyxJQUFBLGVBQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsU0FBZ0IsT0FBTyxDQUFJLEdBQVE7SUFDakMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBRXRCLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDNUMsTUFBTSxDQUFDLEdBQUcsSUFBQSxlQUFPLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFTSxNQUFNLE1BQU0sR0FBRyxDQUFJLEdBQVEsRUFBRSxDQUFTLEVBQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQW5FLFFBQUEsTUFBTSxVQUE2RDtBQUN6RSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQVMsRUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQTFELFFBQUEsTUFBTSxVQUFvRDtBQUV2RSwrRUFBK0U7QUFDL0UsU0FBZ0IsT0FBTyxDQUFJLEtBQVUsRUFBRSxPQUFpQjtJQUN0RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqRCxJQUFJLENBQUMsR0FBRyxJQUFBLGVBQU8sRUFBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3pDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRDs7O0dBR0c7QUFDSSxLQUFLLFVBQVUsU0FBUyxDQUM3QixJQUFVLEVBQ1YsS0FBYSxFQUNiLElBQStCO0lBRS9CLElBQUksSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM1RCxDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/datasource-demo-fintech",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
"directory": "packages/datasource-demo-fintech"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@faker-js/faker": "^9.0.0",
|
|
16
15
|
"@forestadmin/datasource-customizer": "1.71.3",
|
|
17
16
|
"@forestadmin/datasource-sql": "1.17.14",
|
|
18
17
|
"@forestadmin/datasource-toolkit": "1.55.1",
|