@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 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 with [faker](https://fakerjs.dev/),
7
- seeds it via [Knex](https://knexjs.org/), and exposes it through
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 faker-backed random helpers.
28
+ geography stays internally consistent) and `Math.random`-backed random helpers.
29
29
 
30
- Business coherence is enforced in the builders, not by faker: sanctioned
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.
@@ -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 const pick: <T>(arr: T[]) => T;
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;
@@ -1,27 +1,38 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.round2 = exports.shuffle = exports.sample = exports.pick = exports.chance = exports.uniform = exports.randint = void 0;
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 faker_1 = require("@faker-js/faker");
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) => faker_1.faker.number.float({ min: lo, max: hi });
10
+ const uniform = (lo, hi) => lo + Math.random() * (hi - lo);
10
11
  exports.uniform = uniform;
11
- const chance = (p) => faker_1.faker.number.float() < p;
12
+ const chance = (p) => Math.random() < p;
12
13
  exports.chance = chance;
13
- const pick = (arr) => faker_1.faker.helpers.arrayElement(arr);
14
- exports.pick = pick;
15
- const sample = (arr, k) => faker_1.faker.helpers.arrayElements(arr, k);
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 = faker_1.faker.number.float({ min: 0, max: total });
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VlZC91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFnQkEsMEJBVUM7QUFNRCw4QkFNQztBQWpDRCwyQ0FBd0M7QUFFakMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFVLEVBQUUsQ0FBQyxhQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFBckYsUUFBQSxPQUFPLFdBQThFO0FBQzNGLE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBVSxFQUFFLENBQUMsYUFBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQXZGLFFBQUEsT0FBTyxXQUFnRjtBQUM3RixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQVMsRUFBVyxFQUFFLENBQUMsYUFBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFBMUQsUUFBQSxNQUFNLFVBQW9EO0FBQ2hFLE1BQU0sSUFBSSxHQUFHLENBQUksR0FBUSxFQUFLLEVBQUUsQ0FBQyxhQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUEzRCxRQUFBLElBQUksUUFBdUQ7QUFDakUsTUFBTSxNQUFNLEdBQUcsQ0FBSSxHQUFRLEVBQUUsQ0FBUyxFQUFPLEVBQUUsQ0FBQyxhQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFBOUUsUUFBQSxNQUFNLFVBQXdFO0FBQ3BGLE1BQU0sT0FBTyxHQUFHLENBQUksR0FBUSxFQUFPLEVBQUUsQ0FBQyxhQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUEzRCxRQUFBLE9BQU8sV0FBb0Q7QUFDakUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFTLEVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUExRCxRQUFBLE1BQU0sVUFBb0Q7QUFFdkUsK0VBQStFO0FBQy9FLFNBQWdCLE9BQU8sQ0FBSSxLQUFVLEVBQUUsT0FBaUI7SUFDdEQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakQsSUFBSSxDQUFDLEdBQUcsYUFBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRW5ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLFNBQVMsQ0FDN0IsSUFBVSxFQUNWLEtBQWEsRUFDYixJQUErQjtJQUUvQixJQUFJLElBQUksQ0FBQyxNQUFNO1FBQUUsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUQsQ0FBQyJ9
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.8",
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",