admindb 1.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +250 -352
- package/dist/app.d.ts +25 -4
- package/dist/app.js +79 -15
- package/dist/app.js.map +1 -1
- package/dist/auth/config.d.ts +19 -0
- package/dist/auth/config.js +147 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/crypto.d.ts +27 -0
- package/dist/auth/crypto.js +133 -0
- package/dist/auth/crypto.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.js +22 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +14 -0
- package/dist/auth/middleware.js +100 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/routes.d.ts +7 -0
- package/dist/auth/routes.js +78 -0
- package/dist/auth/routes.js.map +1 -0
- package/dist/auth/types.d.ts +35 -0
- package/dist/auth/types.js +11 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli/args.d.ts +45 -0
- package/dist/cli/args.js +328 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config.d.ts +56 -0
- package/dist/cli/config.js +133 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.js +21 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/runner.d.ts +1 -0
- package/dist/cli/runner.js +222 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli.js +2 -127
- package/dist/cli.js.map +1 -1
- package/dist/data/datasets.d.ts +17 -0
- package/dist/data/datasets.js +133 -0
- package/dist/data/datasets.js.map +1 -0
- package/dist/data/detector.d.ts +30 -0
- package/dist/data/detector.js +472 -0
- package/dist/data/detector.js.map +1 -0
- package/dist/data/engine.d.ts +10 -0
- package/dist/data/engine.js +211 -0
- package/dist/data/engine.js.map +1 -0
- package/dist/data/index.d.ts +5 -0
- package/dist/data/index.js +22 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/strategies.d.ts +30 -0
- package/dist/data/strategies.js +343 -0
- package/dist/data/strategies.js.map +1 -0
- package/dist/data/types.d.ts +73 -0
- package/dist/data/types.js +8 -0
- package/dist/data/types.js.map +1 -0
- package/dist/db/database.d.ts +14 -142
- package/dist/db/database.js +209 -435
- package/dist/db/database.js.map +1 -1
- package/dist/db/export.d.ts +2 -2
- package/dist/db/export.js +7 -2
- package/dist/db/export.js.map +1 -1
- package/dist/db/filters.d.ts +22 -0
- package/dist/db/filters.js +158 -0
- package/dist/db/filters.js.map +1 -0
- package/dist/db/index.d.ts +8 -0
- package/dist/db/index.js +25 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/introspection.d.ts +6 -0
- package/dist/db/introspection.js +172 -0
- package/dist/db/introspection.js.map +1 -0
- package/dist/db/manager.d.ts +32 -19
- package/dist/db/manager.js +203 -44
- package/dist/db/manager.js.map +1 -1
- package/dist/db/migrations.d.ts +5 -0
- package/dist/db/migrations.js +110 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/postgres.d.ts +85 -0
- package/dist/db/postgres.js +745 -0
- package/dist/db/postgres.js.map +1 -0
- package/dist/db/types.d.ts +206 -0
- package/dist/db/types.js +7 -0
- package/dist/db/types.js.map +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.js +46 -4
- package/dist/index.js.map +1 -1
- package/dist/public/css/app.css +1 -1
- package/dist/public/css/input.css +83 -13
- package/dist/public/js/app.js +142 -0
- package/dist/public/js/browse.js +591 -104
- package/dist/public/js/databases.js +105 -13
- package/dist/public/js/designer.js +40 -2
- package/dist/public/js/forms.js +610 -28
- package/dist/public/js/icons.js +51 -0
- package/dist/public/js/inspector.js +638 -0
- package/dist/public/js/query.js +93 -3
- package/dist/public/js/schema.js +170 -52
- package/dist/public/js/seed.js +1090 -0
- package/dist/routes/api/helpers.d.ts +42 -0
- package/dist/routes/api/helpers.js +133 -0
- package/dist/routes/api/helpers.js.map +1 -0
- package/dist/routes/api/import-export.d.ts +3 -0
- package/dist/routes/api/import-export.js +85 -0
- package/dist/routes/api/import-export.js.map +1 -0
- package/dist/routes/api/index.d.ts +4 -0
- package/dist/routes/api/index.js +37 -0
- package/dist/routes/api/index.js.map +1 -0
- package/dist/routes/api/query.d.ts +3 -0
- package/dist/routes/api/query.js +76 -0
- package/dist/routes/api/query.js.map +1 -0
- package/dist/routes/api/rows.d.ts +3 -0
- package/dist/routes/api/rows.js +373 -0
- package/dist/routes/api/rows.js.map +1 -0
- package/dist/routes/api/seed.d.ts +3 -0
- package/dist/routes/api/seed.js +82 -0
- package/dist/routes/api/seed.js.map +1 -0
- package/dist/routes/api/tables.d.ts +3 -0
- package/dist/routes/api/tables.js +160 -0
- package/dist/routes/api/tables.js.map +1 -0
- package/dist/routes/databases.d.ts +8 -11
- package/dist/routes/databases.js +100 -66
- package/dist/routes/databases.js.map +1 -1
- package/dist/routes/index.d.ts +3 -0
- package/dist/routes/index.js +20 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/pages.d.ts +3 -3
- package/dist/routes/pages.js +163 -54
- package/dist/routes/pages.js.map +1 -1
- package/dist/serverless.d.ts +40 -0
- package/dist/serverless.js +210 -0
- package/dist/serverless.js.map +1 -0
- package/dist/sql/generator.d.ts +4 -3
- package/dist/sql/generator.js +103 -6
- package/dist/sql/generator.js.map +1 -1
- package/dist/sql/index.d.ts +2 -0
- package/dist/sql/index.js +19 -0
- package/dist/sql/index.js.map +1 -0
- package/dist/types/api.d.ts +412 -0
- package/dist/types/api.js +9 -0
- package/dist/types/api.js.map +1 -0
- package/dist/utils/colors.d.ts +40 -0
- package/dist/utils/colors.js +64 -0
- package/dist/utils/colors.js.map +1 -0
- package/dist/{util.d.ts → utils/common.d.ts} +10 -6
- package/dist/{util.js → utils/common.js} +80 -13
- package/dist/utils/common.js.map +1 -0
- package/dist/utils/csv.js.map +1 -0
- package/dist/utils/datatype.d.ts +49 -0
- package/dist/utils/datatype.js +222 -0
- package/dist/utils/datatype.js.map +1 -0
- package/dist/utils/icons.d.ts +11 -0
- package/dist/utils/icons.js +72 -0
- package/dist/utils/icons.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/{logger.d.ts → utils/logger.d.ts} +1 -1
- package/dist/utils/logger.js +40 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/views/layouts/main.hbs +33 -11
- package/dist/views/pages/databases.hbs +182 -74
- package/dist/views/pages/designer.hbs +9 -6
- package/dist/views/pages/error.hbs +3 -3
- package/dist/views/pages/form.hbs +5 -3
- package/dist/views/pages/home.hbs +22 -13
- package/dist/views/pages/login.hbs +111 -0
- package/dist/views/pages/query.hbs +10 -8
- package/dist/views/pages/schema.hbs +41 -13
- package/dist/views/pages/seed.hbs +232 -0
- package/dist/views/pages/table.hbs +155 -70
- package/dist/views/partials/icon.hbs +2 -0
- package/dist/views/partials/navbar.hbs +70 -31
- package/dist/views/partials/sidebar.hbs +108 -99
- package/package.json +12 -5
- package/dist/args.d.ts +0 -28
- package/dist/args.js +0 -187
- package/dist/args.js.map +0 -1
- package/dist/config.d.ts +0 -17
- package/dist/config.js +0 -23
- package/dist/config.js.map +0 -1
- package/dist/csv.js.map +0 -1
- package/dist/logger.js +0 -25
- package/dist/logger.js.map +0 -1
- package/dist/routes/api.d.ts +0 -9
- package/dist/routes/api.js +0 -786
- package/dist/routes/api.js.map +0 -1
- package/dist/test/classifier.test.d.ts +0 -1
- package/dist/test/classifier.test.js +0 -44
- package/dist/test/classifier.test.js.map +0 -1
- package/dist/test/csv.test.d.ts +0 -1
- package/dist/test/csv.test.js +0 -64
- package/dist/test/csv.test.js.map +0 -1
- package/dist/test/database.test.d.ts +0 -1
- package/dist/test/database.test.js +0 -402
- package/dist/test/database.test.js.map +0 -1
- package/dist/test/generator.test.d.ts +0 -1
- package/dist/test/generator.test.js +0 -132
- package/dist/test/generator.test.js.map +0 -1
- package/dist/test/manager.test.d.ts +0 -1
- package/dist/test/manager.test.js +0 -146
- package/dist/test/manager.test.js.map +0 -1
- package/dist/util.js.map +0 -1
- /package/dist/{csv.d.ts → utils/csv.d.ts} +0 -0
- /package/dist/{csv.js → utils/csv.js} +0 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateRows = generateRows;
|
|
4
|
+
exports.buildSeedInsertSql = buildSeedInsertSql;
|
|
5
|
+
const generator_1 = require("../sql/generator");
|
|
6
|
+
const types_1 = require("./types");
|
|
7
|
+
const detector_1 = require("./detector");
|
|
8
|
+
const strategies_1 = require("./strategies");
|
|
9
|
+
/** Distinct non-null values of a foreign key's referenced column. */
|
|
10
|
+
async function sampleFkValues(db, fk) {
|
|
11
|
+
if (!fk)
|
|
12
|
+
return [];
|
|
13
|
+
try {
|
|
14
|
+
const ref = await db.getTableInfo(fk.table);
|
|
15
|
+
if (!ref.success || !ref.data || !ref.data.columns.length)
|
|
16
|
+
return [];
|
|
17
|
+
const refCol = fk.to || ref.data.primaryKey[0] || ref.data.columns[0].name;
|
|
18
|
+
if (!refCol)
|
|
19
|
+
return [];
|
|
20
|
+
const r = await db.all(`SELECT DISTINCT ${(0, generator_1.quoteIdentifier)(refCol)} AS v FROM ${(0, generator_1.quoteIdentifier)(fk.table)} WHERE ${(0, generator_1.quoteIdentifier)(refCol)} IS NOT NULL LIMIT 1000`);
|
|
21
|
+
return (r.data ?? []).map((row) => row.v).filter((v) => v != null);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function stringifyKey(v) {
|
|
28
|
+
if (v instanceof Uint8Array || Buffer.isBuffer(v))
|
|
29
|
+
return `buf:${Buffer.from(v).toString('hex')}`;
|
|
30
|
+
return `${typeof v}:${String(v)}`;
|
|
31
|
+
}
|
|
32
|
+
function uniqueSuffix(base, seen) {
|
|
33
|
+
if (typeof base === 'number' && Number.isFinite(base)) {
|
|
34
|
+
let n = Number(base);
|
|
35
|
+
while (seen.has(stringifyKey(n)))
|
|
36
|
+
n += 1;
|
|
37
|
+
return n;
|
|
38
|
+
}
|
|
39
|
+
let i = 1;
|
|
40
|
+
let cand = `${String(base)}-${i}`;
|
|
41
|
+
while (seen.has(stringifyKey(cand))) {
|
|
42
|
+
i += 1;
|
|
43
|
+
cand = `${String(base)}-${i}`;
|
|
44
|
+
}
|
|
45
|
+
return cand;
|
|
46
|
+
}
|
|
47
|
+
function orderedValue(value, base, dir, orEqual) {
|
|
48
|
+
const v = value;
|
|
49
|
+
const b = base;
|
|
50
|
+
if (typeof v === 'string' && typeof b === 'string') {
|
|
51
|
+
const tv = Date.parse(v);
|
|
52
|
+
const tb = Date.parse(b);
|
|
53
|
+
if (Number.isFinite(tv) && Number.isFinite(tb)) {
|
|
54
|
+
if (dir === 'after') {
|
|
55
|
+
if (orEqual ? tv < tb : tv <= tb)
|
|
56
|
+
return new Date(tb + 1000).toISOString();
|
|
57
|
+
}
|
|
58
|
+
else if (orEqual ? tv > tb : tv >= tb) {
|
|
59
|
+
return new Date(tb - 1000).toISOString();
|
|
60
|
+
}
|
|
61
|
+
return v;
|
|
62
|
+
}
|
|
63
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(v) && /^\d{4}-\d{2}-\d{2}$/.test(b)) {
|
|
64
|
+
const dv = Date.parse(`${v}T00:00:00Z`);
|
|
65
|
+
const db = Date.parse(`${b}T00:00:00Z`);
|
|
66
|
+
if (dir === 'after') {
|
|
67
|
+
if (orEqual ? dv < db : dv <= db)
|
|
68
|
+
return new Date(db + 86400_000).toISOString().slice(0, 10);
|
|
69
|
+
}
|
|
70
|
+
else if (orEqual ? dv > db : dv >= db) {
|
|
71
|
+
return new Date(db - 86400_000).toISOString().slice(0, 10);
|
|
72
|
+
}
|
|
73
|
+
return v;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (typeof v === 'number' && typeof b === 'number') {
|
|
77
|
+
if (dir === 'after')
|
|
78
|
+
return orEqual ? Math.max(v, b) : Math.max(v, b + 1);
|
|
79
|
+
return orEqual ? Math.min(v, b) : Math.min(v, b - 1);
|
|
80
|
+
}
|
|
81
|
+
return v;
|
|
82
|
+
}
|
|
83
|
+
function applyOrdering(fields, ordering) {
|
|
84
|
+
if (!ordering.size)
|
|
85
|
+
return;
|
|
86
|
+
const byCol = new Map(fields.map((f) => [f.column, f]));
|
|
87
|
+
for (const f of fields) {
|
|
88
|
+
const rel = ordering.get(f.column);
|
|
89
|
+
if (!rel)
|
|
90
|
+
continue;
|
|
91
|
+
if (rel.after && f.value != null) {
|
|
92
|
+
const other = byCol.get(rel.after.column);
|
|
93
|
+
if (other && other.value != null)
|
|
94
|
+
f.value = orderedValue(f.value, other.value, 'after', rel.after.orEqual);
|
|
95
|
+
}
|
|
96
|
+
if (rel.before && f.value != null) {
|
|
97
|
+
const other = byCol.get(rel.before.column);
|
|
98
|
+
if (other && other.value != null)
|
|
99
|
+
f.value = orderedValue(f.value, other.value, 'before', rel.before.orEqual);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Generate `count` rows for a table with structured previews.
|
|
105
|
+
*/
|
|
106
|
+
async function generateRows(db, info, configs, count, plan = {}) {
|
|
107
|
+
const fkByColumn = new Map();
|
|
108
|
+
for (const fk of info.foreignKeys)
|
|
109
|
+
fkByColumn.set(fk.from, fk);
|
|
110
|
+
const uniqueCols = new Set();
|
|
111
|
+
for (const cfg of configs)
|
|
112
|
+
if (cfg.unique)
|
|
113
|
+
uniqueCols.add(cfg.name);
|
|
114
|
+
const checkInfo = (0, detector_1.parseChecks)(info.sql ?? null);
|
|
115
|
+
const warnings = [];
|
|
116
|
+
const prepared = [];
|
|
117
|
+
const fkPools = new Map();
|
|
118
|
+
const fkOmit = new Set();
|
|
119
|
+
for (const col of info.columns) {
|
|
120
|
+
const cfg = configs.find((c) => c.name === col.name);
|
|
121
|
+
const raw = plan[col.name];
|
|
122
|
+
const p = raw && raw.strategy ? raw : (cfg?.defaultPlan ?? { strategy: 'skip' });
|
|
123
|
+
if (p.strategy === 'list' && (!p.values || !p.values.length)) {
|
|
124
|
+
const allowed = (0, detector_1.findInMap)(checkInfo.columnAllowed, col.name);
|
|
125
|
+
if (allowed && allowed.length) {
|
|
126
|
+
p.values = [...allowed];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (!cfg || !cfg.strategies.some((s) => s.id === p.strategy)) {
|
|
130
|
+
throw new Error(`Unsupported generator strategy "${p.strategy}" for column "${col.name}".`);
|
|
131
|
+
}
|
|
132
|
+
if (p.strategy === 'list' && !(p.values ?? []).some((v) => String(v).trim() !== '')) {
|
|
133
|
+
warnings.push(`Column "${col.name}": the list is empty, so it will be skipped (DB default applies).`);
|
|
134
|
+
}
|
|
135
|
+
if ((p.strategy === 'skip' || p.strategy === 'null') && !col.pk && col.notnull && col.dflt_value == null) {
|
|
136
|
+
warnings.push(`Column "${col.name}" is NOT NULL without a default — "${p.strategy}" rows may fail to insert.`);
|
|
137
|
+
}
|
|
138
|
+
if (p.strategy === 'fk') {
|
|
139
|
+
const pool = await sampleFkValues(db, fkByColumn.get(col.name) ?? null);
|
|
140
|
+
fkPools.set(col.name, pool);
|
|
141
|
+
const refTable = fkByColumn.get(col.name)?.table ?? '?';
|
|
142
|
+
if (!pool.length) {
|
|
143
|
+
if (col.notnull && !col.pk) {
|
|
144
|
+
fkOmit.add(col.name);
|
|
145
|
+
warnings.push(`Column "${col.name}" is a NOT NULL foreign key to "${refTable}", which has no rows. It is omitted from generated rows — seed "${refTable}" first so the insert can reference real values.`);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
warnings.push(`Column "${col.name}": "${refTable}" is empty, so NULL will be inserted.`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
prepared.push({ col, plan: p });
|
|
153
|
+
}
|
|
154
|
+
const rows = [];
|
|
155
|
+
const previewRows = [];
|
|
156
|
+
const uniqueSeen = new Map();
|
|
157
|
+
for (let i = 0; i < count; i++) {
|
|
158
|
+
const fields = [];
|
|
159
|
+
const previewRow = {};
|
|
160
|
+
for (const { col, plan: p } of prepared) {
|
|
161
|
+
if (p.strategy === 'fk' && fkOmit.has(col.name)) {
|
|
162
|
+
previewRow[col.name] = null;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
let v = (0, strategies_1.generateOne)(col, p, fkPools.get(col.name), i);
|
|
166
|
+
if (v === types_1.SKIP) {
|
|
167
|
+
previewRow[col.name] = '(default)';
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (uniqueCols.has(col.name)) {
|
|
171
|
+
const seen = uniqueSeen.get(col.name) ?? new Set();
|
|
172
|
+
let attempts = 0;
|
|
173
|
+
while (seen.has(stringifyKey(v)) && attempts < 20) {
|
|
174
|
+
v = (0, strategies_1.generateOne)(col, p, fkPools.get(col.name), i);
|
|
175
|
+
attempts += 1;
|
|
176
|
+
}
|
|
177
|
+
if (seen.has(stringifyKey(v))) {
|
|
178
|
+
warnings.push(`Column "${col.name}" is UNIQUE but the generator kept colliding — appended a suffix to keep rows insertable.`);
|
|
179
|
+
v = uniqueSuffix(v, seen);
|
|
180
|
+
}
|
|
181
|
+
seen.add(stringifyKey(v));
|
|
182
|
+
uniqueSeen.set(col.name, seen);
|
|
183
|
+
}
|
|
184
|
+
fields.push({ column: col.name, value: v });
|
|
185
|
+
previewRow[col.name] = v;
|
|
186
|
+
}
|
|
187
|
+
// Honor CHECK ordering constraints
|
|
188
|
+
applyOrdering(fields, checkInfo.ordering);
|
|
189
|
+
for (const f of fields) {
|
|
190
|
+
previewRow[f.column] = f.value;
|
|
191
|
+
}
|
|
192
|
+
rows.push(fields);
|
|
193
|
+
if (previewRows.length < 50) {
|
|
194
|
+
previewRows.push(previewRow);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return { rows, previewRows, warnings };
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Render generated rows as a sequence of INSERT statements for preview.
|
|
201
|
+
*/
|
|
202
|
+
function buildSeedInsertSql(table, rows) {
|
|
203
|
+
return rows
|
|
204
|
+
.map((fields) => {
|
|
205
|
+
const cols = fields.map((f) => (0, generator_1.quoteIdentifier)(f.column));
|
|
206
|
+
const vals = fields.map((f) => (0, generator_1.sqlValue)(f.value));
|
|
207
|
+
return `INSERT INTO ${(0, generator_1.quoteIdentifier)(table)} (${cols.join(', ')}) VALUES (${vals.join(', ')});`;
|
|
208
|
+
})
|
|
209
|
+
.join('\n');
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/data/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./types"), exports);
|
|
18
|
+
__exportStar(require("./datasets"), exports);
|
|
19
|
+
__exportStar(require("./strategies"), exports);
|
|
20
|
+
__exportStar(require("./detector"), exports);
|
|
21
|
+
__exportStar(require("./engine"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,6CAA2B;AAC3B,+CAA6B;AAC7B,6CAA2B;AAC3B,2CAAyB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ColumnInfo, ForeignKeyInfo } from '../db/index';
|
|
2
|
+
import { type ColumnPlan, type StrategyDescriptor } from './types';
|
|
3
|
+
export declare const randInt: (min: number, max: number) => number;
|
|
4
|
+
export declare const randFloat: (min: number, max: number) => number;
|
|
5
|
+
export declare const pick: <T>(arr: T[]) => T;
|
|
6
|
+
export declare const makeSlug: () => string;
|
|
7
|
+
export declare const makeEmail: () => string;
|
|
8
|
+
export declare const makeUsername: () => string;
|
|
9
|
+
export declare const makePhone: () => string;
|
|
10
|
+
export declare const makeAddress: () => string;
|
|
11
|
+
export declare const makeIp: () => string;
|
|
12
|
+
export declare function makeMacAddress(): string;
|
|
13
|
+
export declare const makeCreditCard: () => string;
|
|
14
|
+
export declare const makeAvatar: (seedVal?: string) => string;
|
|
15
|
+
export declare const makeColor: (format?: string) => string;
|
|
16
|
+
export declare function makeUuid(): string;
|
|
17
|
+
export declare function makeWords(minLen: number, maxLen: number): string;
|
|
18
|
+
export declare function makeSentences(minLen: number, maxLen: number): string;
|
|
19
|
+
export declare const makeParagraph: () => string;
|
|
20
|
+
export declare function formatPattern(pattern: string): string;
|
|
21
|
+
export declare function randomDate(from?: string, to?: string, kind?: 'date' | 'datetime'): string;
|
|
22
|
+
export declare const randomTime: () => string;
|
|
23
|
+
export declare function randomUnixTimestamp(format?: string, from?: string, to?: string): number;
|
|
24
|
+
export declare function randomAlnum(minLen: number, maxLen: number): string;
|
|
25
|
+
export declare function makeJsonObject(keys?: string[], jsonValues?: Record<string, string[]>): string;
|
|
26
|
+
export declare function isTextishType(type: string): boolean;
|
|
27
|
+
export declare function strategiesFor(col: ColumnInfo, fk: ForeignKeyInfo | null): StrategyDescriptor[];
|
|
28
|
+
export declare function fallbackPlanFor(col: ColumnInfo): ColumnPlan;
|
|
29
|
+
export declare function generateOne(col: ColumnInfo, p: ColumnPlan, fkPool?: unknown[], rowIndex?: number): unknown;
|
|
30
|
+
export declare function generateSampleValue(col: ColumnInfo, plan: ColumnPlan, fkPool?: unknown[]): unknown;
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.randomTime = exports.makeParagraph = exports.makeColor = exports.makeAvatar = exports.makeCreditCard = exports.makeIp = exports.makeAddress = exports.makePhone = exports.makeUsername = exports.makeEmail = exports.makeSlug = exports.pick = exports.randFloat = exports.randInt = void 0;
|
|
4
|
+
exports.makeMacAddress = makeMacAddress;
|
|
5
|
+
exports.makeUuid = makeUuid;
|
|
6
|
+
exports.makeWords = makeWords;
|
|
7
|
+
exports.makeSentences = makeSentences;
|
|
8
|
+
exports.formatPattern = formatPattern;
|
|
9
|
+
exports.randomDate = randomDate;
|
|
10
|
+
exports.randomUnixTimestamp = randomUnixTimestamp;
|
|
11
|
+
exports.randomAlnum = randomAlnum;
|
|
12
|
+
exports.makeJsonObject = makeJsonObject;
|
|
13
|
+
exports.isTextishType = isTextishType;
|
|
14
|
+
exports.strategiesFor = strategiesFor;
|
|
15
|
+
exports.fallbackPlanFor = fallbackPlanFor;
|
|
16
|
+
exports.generateOne = generateOne;
|
|
17
|
+
exports.generateSampleValue = generateSampleValue;
|
|
18
|
+
const node_crypto_1 = require("node:crypto");
|
|
19
|
+
const common_1 = require("../utils/common");
|
|
20
|
+
const datasets_1 = require("./datasets");
|
|
21
|
+
const types_1 = require("./types");
|
|
22
|
+
// ---- Random helpers -------------------------------------------------------
|
|
23
|
+
const randInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
|
|
24
|
+
exports.randInt = randInt;
|
|
25
|
+
const randFloat = (min, max) => Math.random() * (max - min) + min;
|
|
26
|
+
exports.randFloat = randFloat;
|
|
27
|
+
const pick = (arr) => arr[(0, exports.randInt)(0, arr.length - 1)];
|
|
28
|
+
exports.pick = pick;
|
|
29
|
+
const makeSlug = () => `${(0, exports.pick)(datasets_1.LOREM_WORDS)}-${(0, exports.pick)(datasets_1.LOREM_WORDS)}-${(0, exports.randInt)(100, 999)}`;
|
|
30
|
+
exports.makeSlug = makeSlug;
|
|
31
|
+
const makeEmail = () => `${(0, exports.pick)(datasets_1.FIRST_NAMES).toLowerCase()}.${(0, exports.pick)(datasets_1.LAST_NAMES).toLowerCase()}${(0, exports.randInt)(1, 99)}@${(0, exports.pick)(datasets_1.DOMAINS)}`;
|
|
32
|
+
exports.makeEmail = makeEmail;
|
|
33
|
+
const makeUsername = () => `${(0, exports.pick)(datasets_1.FIRST_NAMES).toLowerCase()}${(0, exports.pick)(datasets_1.LAST_NAMES).toLowerCase()}${(0, exports.randInt)(1, 9999)}`;
|
|
34
|
+
exports.makeUsername = makeUsername;
|
|
35
|
+
const makePhone = () => `+1 (${(0, exports.randInt)(200, 999)}) ${(0, exports.randInt)(200, 999)}-${String((0, exports.randInt)(0, 9999)).padStart(4, '0')}`;
|
|
36
|
+
exports.makePhone = makePhone;
|
|
37
|
+
const makeAddress = () => `${(0, exports.randInt)(10, 9999)} ${(0, exports.pick)(datasets_1.LOREM_WORDS)} ${(0, exports.pick)(['St', 'Ave', 'Rd', 'Blvd', 'Ln', 'Dr'])}, ${(0, exports.pick)(datasets_1.CITIES)}`;
|
|
38
|
+
exports.makeAddress = makeAddress;
|
|
39
|
+
const makeIp = () => `${(0, exports.randInt)(1, 223)}.${(0, exports.randInt)(0, 255)}.${(0, exports.randInt)(0, 255)}.${(0, exports.randInt)(1, 254)}`;
|
|
40
|
+
exports.makeIp = makeIp;
|
|
41
|
+
function makeMacAddress() {
|
|
42
|
+
const b = () => (0, exports.randInt)(0, 255).toString(16).padStart(2, '0').toUpperCase();
|
|
43
|
+
return `${b()}:${b()}:${b()}:${b()}:${b()}:${b()}`;
|
|
44
|
+
}
|
|
45
|
+
const makeCreditCard = () => `4532-${(0, exports.randInt)(1000, 9999)}-${(0, exports.randInt)(1000, 9999)}-${(0, exports.randInt)(1000, 9999)}`;
|
|
46
|
+
exports.makeCreditCard = makeCreditCard;
|
|
47
|
+
const makeAvatar = (seedVal) => `https://api.dicebear.com/7.x/avataaars/svg?seed=${encodeURIComponent(seedVal || (0, exports.makeUsername)())}`;
|
|
48
|
+
exports.makeAvatar = makeAvatar;
|
|
49
|
+
const makeColor = (format = 'hex') => (format === 'name' ? (0, exports.pick)(datasets_1.NAMED_COLORS) : (0, exports.pick)(datasets_1.HEX_COLORS));
|
|
50
|
+
exports.makeColor = makeColor;
|
|
51
|
+
function makeUuid() {
|
|
52
|
+
const h = (n) => (0, exports.randInt)(0, 0xffffffff).toString(16).padStart(n, '0');
|
|
53
|
+
return `${h(8)}-${h(4).slice(0, 4)}-4${h(3).slice(0, 3)}-${['8', '9', 'a', 'b'][(0, exports.randInt)(0, 3)]}${h(3).slice(0, 3)}-${h(12).slice(0, 12)}`;
|
|
54
|
+
}
|
|
55
|
+
function makeWords(minLen, maxLen) {
|
|
56
|
+
const n = (0, exports.randInt)(minLen, maxLen);
|
|
57
|
+
const parts = [];
|
|
58
|
+
for (let i = 0; i < n; i++)
|
|
59
|
+
parts.push((0, exports.pick)(datasets_1.LOREM_WORDS));
|
|
60
|
+
return parts.join(' ');
|
|
61
|
+
}
|
|
62
|
+
function makeSentences(minLen, maxLen) {
|
|
63
|
+
const n = (0, exports.randInt)(minLen, maxLen);
|
|
64
|
+
const sentences = [];
|
|
65
|
+
for (let i = 0; i < n; i++) {
|
|
66
|
+
const words = makeWords(6, 14).split(' ');
|
|
67
|
+
words[0] = words[0].charAt(0).toUpperCase() + words[0].slice(1);
|
|
68
|
+
sentences.push(words.join(' ') + '.');
|
|
69
|
+
}
|
|
70
|
+
return sentences.join(' ');
|
|
71
|
+
}
|
|
72
|
+
const makeParagraph = () => makeSentences(3, 5);
|
|
73
|
+
exports.makeParagraph = makeParagraph;
|
|
74
|
+
function formatPattern(pattern) {
|
|
75
|
+
if (!pattern)
|
|
76
|
+
return '';
|
|
77
|
+
const now = new Date();
|
|
78
|
+
const year = String(now.getFullYear());
|
|
79
|
+
const s = pattern
|
|
80
|
+
.replace(/\{YYYY\}/g, year)
|
|
81
|
+
.replace(/\{YY\}/g, year.slice(-2))
|
|
82
|
+
.replace(/\{MM\}/g, String((0, exports.randInt)(1, 12)).padStart(2, '0'))
|
|
83
|
+
.replace(/\{DD\}/g, String((0, exports.randInt)(1, 28)).padStart(2, '0'));
|
|
84
|
+
const upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
85
|
+
const lower = 'abcdefghijklmnopqrstuvwxyz';
|
|
86
|
+
let res = '';
|
|
87
|
+
for (let i = 0; i < s.length; i++) {
|
|
88
|
+
const ch = s[i];
|
|
89
|
+
if (ch === '#')
|
|
90
|
+
res += (0, exports.randInt)(0, 9);
|
|
91
|
+
else if (ch === 'A' || ch === '?')
|
|
92
|
+
res += upper[(0, exports.randInt)(0, 25)];
|
|
93
|
+
else if (ch === 'a')
|
|
94
|
+
res += lower[(0, exports.randInt)(0, 25)];
|
|
95
|
+
else
|
|
96
|
+
res += ch;
|
|
97
|
+
}
|
|
98
|
+
return res;
|
|
99
|
+
}
|
|
100
|
+
function randomDate(from, to, kind = 'date') {
|
|
101
|
+
const now = Date.now();
|
|
102
|
+
const lo = from ? Date.parse(from) : now - 730 * 86400_000;
|
|
103
|
+
const hi = to ? Date.parse(to) : now;
|
|
104
|
+
const d = new Date((0, exports.randInt)(Number.isFinite(lo) ? lo : now - 730 * 86400_000, Number.isFinite(hi) ? hi : now));
|
|
105
|
+
if (kind === 'datetime')
|
|
106
|
+
return d.toISOString();
|
|
107
|
+
const p = (n) => String(n).padStart(2, '0');
|
|
108
|
+
return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;
|
|
109
|
+
}
|
|
110
|
+
const randomTime = () => `${String((0, exports.randInt)(0, 23)).padStart(2, '0')}:${String((0, exports.randInt)(0, 59)).padStart(2, '0')}:${String((0, exports.randInt)(0, 59)).padStart(2, '0')}`;
|
|
111
|
+
exports.randomTime = randomTime;
|
|
112
|
+
function randomUnixTimestamp(format = 'sec', from, to) {
|
|
113
|
+
const now = Date.now();
|
|
114
|
+
const lo = from ? Date.parse(from) : now - 730 * 86400_000;
|
|
115
|
+
const hi = to ? Date.parse(to) : now;
|
|
116
|
+
const t = (0, exports.randInt)(Number.isFinite(lo) ? lo : now - 730 * 86400_000, Number.isFinite(hi) ? hi : now);
|
|
117
|
+
return format === 'ms' ? t : Math.floor(t / 1000);
|
|
118
|
+
}
|
|
119
|
+
const ALNUM = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
120
|
+
function randomAlnum(minLen, maxLen) {
|
|
121
|
+
const len = (0, exports.randInt)(minLen, maxLen);
|
|
122
|
+
let s = '';
|
|
123
|
+
for (let i = 0; i < len; i++)
|
|
124
|
+
s += ALNUM[(0, exports.randInt)(0, ALNUM.length - 1)];
|
|
125
|
+
return s;
|
|
126
|
+
}
|
|
127
|
+
const JSON_ROLES = ['admin', 'editor', 'viewer', 'billing', 'member', 'owner', 'guest'];
|
|
128
|
+
const JSON_APPS = ['dashboard', 'api', 'mobile', 'cli', 'webhook', 'cron', 'importer'];
|
|
129
|
+
function jsonValueForKey(key) {
|
|
130
|
+
const lk = key.toLowerCase();
|
|
131
|
+
if (lk.includes('role'))
|
|
132
|
+
return (0, exports.pick)(JSON_ROLES);
|
|
133
|
+
if (lk.includes('app'))
|
|
134
|
+
return [(0, exports.pick)(JSON_APPS)];
|
|
135
|
+
const roll = Math.random();
|
|
136
|
+
if (roll < 0.45)
|
|
137
|
+
return (0, exports.pick)(['alpha', 'beta', 'stable', 'draft', 'on', 'off', 'default', 'custom']);
|
|
138
|
+
if (roll < 0.6)
|
|
139
|
+
return (0, exports.randInt)(0, 1000);
|
|
140
|
+
if (roll < 0.75)
|
|
141
|
+
return Math.random() < 0.5;
|
|
142
|
+
if (roll < 0.9)
|
|
143
|
+
return null;
|
|
144
|
+
return makeUuid();
|
|
145
|
+
}
|
|
146
|
+
function makeJsonObject(keys, jsonValues) {
|
|
147
|
+
const k = (keys && keys.length ? keys : ['scope', 'enabled', 'flags']).slice(0, 16);
|
|
148
|
+
const obj = {};
|
|
149
|
+
for (const key of k) {
|
|
150
|
+
const allowed = jsonValues ? jsonValues[key] : undefined;
|
|
151
|
+
obj[key] = allowed && allowed.length ? (0, exports.pick)(allowed) : jsonValueForKey(key);
|
|
152
|
+
}
|
|
153
|
+
return JSON.stringify(obj);
|
|
154
|
+
}
|
|
155
|
+
function isTextishType(type) {
|
|
156
|
+
const t = (type || '').toUpperCase();
|
|
157
|
+
return t === 'TEXT' || t === '' || t.includes('JSON') || t.includes('CHAR') || t.includes('CLOB') || t.includes('VARCHAR');
|
|
158
|
+
}
|
|
159
|
+
/** Registry of strategy descriptors and their supported type categories. */
|
|
160
|
+
const STRATEGY_METADATA = [
|
|
161
|
+
['skip', 'Skip (DB default or NULL applies)', 'custom_control', 'all'],
|
|
162
|
+
['null', 'Set NULL explicitly', 'custom_control', 'all'],
|
|
163
|
+
['fixed', 'Fixed constant value', 'custom_control', 'all'],
|
|
164
|
+
['list', 'Random item from custom list', 'custom_control', 'all'],
|
|
165
|
+
['pattern', 'Custom pattern template (e.g. INV-####)', 'custom_control', 'all'],
|
|
166
|
+
['fullname', 'Full name (e.g. John Smith)', 'identity', 'text'],
|
|
167
|
+
['first', 'First name', 'identity', 'text'],
|
|
168
|
+
['last', 'Last name / Surname', 'identity', 'text'],
|
|
169
|
+
['username', 'Username handle', 'identity', 'text'],
|
|
170
|
+
['job', 'Job title / Profession', 'identity', 'text'],
|
|
171
|
+
['email', 'Email address', 'contact_web', 'text'],
|
|
172
|
+
['phone', 'Phone number', 'contact_web', 'text'],
|
|
173
|
+
['url', 'Website URL', 'contact_web', 'text'],
|
|
174
|
+
['domain', 'Domain name', 'contact_web', 'text'],
|
|
175
|
+
['ip', 'IPv4 address', 'contact_web', 'text'],
|
|
176
|
+
['avatar', 'Avatar image URL', 'contact_web', 'text'],
|
|
177
|
+
['company', 'Company / Organization name', 'commerce', 'text'],
|
|
178
|
+
['currency', 'Currency code (USD, EUR...)', 'commerce', 'text'],
|
|
179
|
+
['status', 'Status badge (active, pending...)', 'commerce', 'text'],
|
|
180
|
+
['creditCard', 'Masked test credit card', 'commerce', 'text'],
|
|
181
|
+
['address', 'Street address', 'location', 'text'],
|
|
182
|
+
['city', 'City name', 'location', 'text'],
|
|
183
|
+
['state', 'State / Province', 'location', 'text'],
|
|
184
|
+
['country', 'Country name', 'location', 'text'],
|
|
185
|
+
['countryCode', 'Country code (ISO-2 e.g. US)', 'location', 'text'],
|
|
186
|
+
['postal', 'Postal / Zip code', 'location', 'text'],
|
|
187
|
+
['latitude', 'Latitude (-90 to 90)', 'location', 'all'],
|
|
188
|
+
['longitude', 'Longitude (-180 to 180)', 'location', 'all'],
|
|
189
|
+
['int', 'Random integer in range', 'numeric', 'numeric'],
|
|
190
|
+
['decimal', 'Random decimal / price', 'numeric', 'numeric'],
|
|
191
|
+
['sequence', 'Sequential numbering (1, 2, 3...)', 'numeric', 'numeric'],
|
|
192
|
+
['date', 'Random date (YYYY-MM-DD)', 'datetime', 'all'],
|
|
193
|
+
['datetime', 'Random datetime (ISO-8601)', 'datetime', 'all'],
|
|
194
|
+
['time', 'Random time (HH:MM:SS)', 'datetime', 'all'],
|
|
195
|
+
['timestampUnix', 'Unix timestamp (epoch)', 'datetime', 'all'],
|
|
196
|
+
['words', 'Short words / Tags', 'system_crypto', 'text'],
|
|
197
|
+
['sentence', 'Sentences', 'system_crypto', 'text'],
|
|
198
|
+
['paragraph', 'Paragraph (multi-sentence text)', 'system_crypto', 'text'],
|
|
199
|
+
['slug', 'URL slug (e.g. tech-news-402)', 'system_crypto', 'text'],
|
|
200
|
+
['bool', 'Boolean flag (1/0 or true/false)', 'system_crypto', 'all'],
|
|
201
|
+
['bytes', 'Random hex bytes (BLOB)', 'system_crypto', 'blob'],
|
|
202
|
+
['uuid', 'UUID v4', 'system_crypto', 'text'],
|
|
203
|
+
['token', 'Short alphanumeric token', 'system_crypto', 'text'],
|
|
204
|
+
['hash', 'Hexadecimal hash (MD5/SHA)', 'system_crypto', 'text'],
|
|
205
|
+
['json', 'Valid JSON object', 'system_crypto', 'text'],
|
|
206
|
+
['color', 'Color (Hex code or name)', 'system_crypto', 'text'],
|
|
207
|
+
['mac', 'MAC network address', 'system_crypto', 'text'],
|
|
208
|
+
];
|
|
209
|
+
function strategiesFor(col, fk) {
|
|
210
|
+
const type = (col.type || '').toUpperCase();
|
|
211
|
+
const isText = isTextishType(type);
|
|
212
|
+
const isNum = type.startsWith('INTEGER') || type === 'REAL' || type.includes('DECIMAL') || type.includes('NUMERIC') || isText;
|
|
213
|
+
const isBlob = type === 'BLOB' || isText;
|
|
214
|
+
const out = [];
|
|
215
|
+
if (fk) {
|
|
216
|
+
out.push({ id: 'fk', label: `Foreign Key: Sample from ${fk.table}${fk.to ? `.${fk.to}` : ''}`, category: 'relational' });
|
|
217
|
+
}
|
|
218
|
+
for (const [id, label, category, target] of STRATEGY_METADATA) {
|
|
219
|
+
if (target === 'all' || (target === 'text' && isText) || (target === 'numeric' && isNum) || (target === 'blob' && isBlob)) {
|
|
220
|
+
out.push({ id, label, category });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return out;
|
|
224
|
+
}
|
|
225
|
+
function fallbackPlanFor(col) {
|
|
226
|
+
const type = (col.type || '').toUpperCase();
|
|
227
|
+
if (type === 'BOOLEAN' || type === 'BOOL')
|
|
228
|
+
return { strategy: 'bool' };
|
|
229
|
+
if (type === 'UUID')
|
|
230
|
+
return { strategy: 'uuid' };
|
|
231
|
+
if (type === 'JSON' || type === 'JSONB')
|
|
232
|
+
return { strategy: 'json' };
|
|
233
|
+
if (type.startsWith('INT') || type === 'BIGINT' || type === 'SMALLINT' || type === 'SERIAL' || type === 'BIGSERIAL')
|
|
234
|
+
return { strategy: 'int', min: 1, max: 1000 };
|
|
235
|
+
if (type === 'REAL' || type.includes('DECIMAL') || type === 'NUMERIC' || type.includes('FLOAT') || type.includes('DOUBLE'))
|
|
236
|
+
return { strategy: 'decimal', min: 1, max: 1000, precision: 2 };
|
|
237
|
+
if (type === 'DATE')
|
|
238
|
+
return { strategy: 'date', from: '2020-01-01', to: '2026-12-31' };
|
|
239
|
+
if (type.includes('TIMESTAMP') || type === 'DATETIME')
|
|
240
|
+
return { strategy: 'datetime', from: '2024-01-01T00:00:00', to: '2026-12-31T23:59:59' };
|
|
241
|
+
if (type === 'TIME')
|
|
242
|
+
return { strategy: 'time' };
|
|
243
|
+
if (type === 'BLOB' || type === 'BYTEA')
|
|
244
|
+
return { strategy: 'bytes', minLen: 8, maxLen: 32 };
|
|
245
|
+
if (type === 'INET')
|
|
246
|
+
return { strategy: 'ip' };
|
|
247
|
+
return { strategy: 'words', minLen: 1, maxLen: 4 };
|
|
248
|
+
}
|
|
249
|
+
/** Dispatch table for simple strategy generators. */
|
|
250
|
+
const BASIC_STRATEGIES = {
|
|
251
|
+
first: () => (0, exports.pick)(datasets_1.FIRST_NAMES),
|
|
252
|
+
last: () => (0, exports.pick)(datasets_1.LAST_NAMES),
|
|
253
|
+
fullname: () => `${(0, exports.pick)(datasets_1.FIRST_NAMES)} ${(0, exports.pick)(datasets_1.LAST_NAMES)}`,
|
|
254
|
+
email: () => (0, exports.makeEmail)(),
|
|
255
|
+
username: () => (0, exports.makeUsername)(),
|
|
256
|
+
job: () => (0, exports.pick)(datasets_1.JOB_TITLES),
|
|
257
|
+
company: () => (0, exports.pick)(datasets_1.COMPANIES),
|
|
258
|
+
currency: () => (0, exports.pick)(datasets_1.CURRENCIES),
|
|
259
|
+
status: () => (0, exports.pick)(datasets_1.STATUSES),
|
|
260
|
+
creditCard: () => (0, exports.makeCreditCard)(),
|
|
261
|
+
avatar: () => (0, exports.makeAvatar)(),
|
|
262
|
+
color: (p) => (0, exports.makeColor)(p.format),
|
|
263
|
+
phone: () => (0, exports.makePhone)(),
|
|
264
|
+
city: () => (0, exports.pick)(datasets_1.CITIES),
|
|
265
|
+
state: () => (0, exports.pick)(datasets_1.US_STATES),
|
|
266
|
+
country: () => (0, exports.pick)(datasets_1.COUNTRIES),
|
|
267
|
+
countryCode: () => (0, exports.pick)(datasets_1.COUNTRY_CODES),
|
|
268
|
+
postal: () => String((0, exports.randInt)(10000, 99999)),
|
|
269
|
+
address: () => (0, exports.makeAddress)(),
|
|
270
|
+
url: () => `https://www.${(0, exports.pick)(datasets_1.DOMAINS)}/${(0, exports.makeSlug)()}`,
|
|
271
|
+
domain: () => (0, exports.pick)(datasets_1.DOMAINS),
|
|
272
|
+
ip: () => (0, exports.makeIp)(),
|
|
273
|
+
mac: () => makeMacAddress(),
|
|
274
|
+
uuid: () => makeUuid(),
|
|
275
|
+
slug: () => (0, exports.makeSlug)(),
|
|
276
|
+
paragraph: () => (0, exports.makeParagraph)(),
|
|
277
|
+
time: () => (0, exports.randomTime)(),
|
|
278
|
+
bool: () => (0, exports.pick)(['1', '0']),
|
|
279
|
+
json: (p) => makeJsonObject(p.jsonKeys, p.jsonValues),
|
|
280
|
+
words: (p) => makeWords(p.minLen ?? 1, p.maxLen ?? 4),
|
|
281
|
+
sentence: (p) => makeSentences(p.minLen ?? 1, p.maxLen ?? 2),
|
|
282
|
+
date: (p) => randomDate(p.from, p.to, 'date'),
|
|
283
|
+
datetime: (p) => randomDate(p.from, p.to, 'datetime'),
|
|
284
|
+
timestampUnix: (p) => randomUnixTimestamp(p.format, p.from, p.to),
|
|
285
|
+
latitude: (p) => Number((0, exports.randFloat)(p.min ?? -90, p.max ?? 90).toFixed(6)),
|
|
286
|
+
longitude: (p) => Number((0, exports.randFloat)(p.min ?? -180, p.max ?? 180).toFixed(6)),
|
|
287
|
+
sequence: (p, idx) => (p.start ?? 1) + idx * (p.step ?? 1),
|
|
288
|
+
int: (p) => (0, exports.randInt)(p.min ?? 1, Math.max(p.min ?? 1, p.max ?? 1000)),
|
|
289
|
+
decimal: (p) => (0, exports.randFloat)(p.min ?? 1, Math.max(p.min ?? 1, p.max ?? 1000)).toFixed(Math.max(0, Math.min(10, p.precision ?? 2))),
|
|
290
|
+
pattern: (p) => formatPattern(p.pattern || 'INV-2026-####'),
|
|
291
|
+
fixed: (p) => p.value ?? '',
|
|
292
|
+
token: (p) => randomAlnum(Math.max(2, p.minLen ?? 6), Math.max(2, p.maxLen ?? 12)),
|
|
293
|
+
hash: (p) => {
|
|
294
|
+
const len = (0, exports.randInt)(Math.max(8, p.minLen ?? 32), Math.max(8, p.maxLen ?? 64));
|
|
295
|
+
return (0, node_crypto_1.randomBytes)(Math.ceil(len / 2)).toString('hex').slice(0, len);
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
function generateOne(col, p, fkPool, rowIndex = 0) {
|
|
299
|
+
const type = (col.type || '').toUpperCase();
|
|
300
|
+
if (!col.pk && !col.notnull && p.nullPct && p.nullPct > 0) {
|
|
301
|
+
if (Math.random() * 100 < p.nullPct)
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
if (p.strategy === 'skip')
|
|
305
|
+
return types_1.SKIP;
|
|
306
|
+
if (p.strategy === 'null')
|
|
307
|
+
return null;
|
|
308
|
+
if (p.strategy === 'list') {
|
|
309
|
+
const vals = (p.values ?? []).filter((v) => String(v).trim() !== '');
|
|
310
|
+
if (!vals.length)
|
|
311
|
+
return types_1.SKIP;
|
|
312
|
+
return (0, common_1.coerceFormValue)(String((0, exports.pick)(vals)), type || 'TEXT');
|
|
313
|
+
}
|
|
314
|
+
if (p.strategy === 'fk') {
|
|
315
|
+
return fkPool && fkPool.length ? fkPool[(0, exports.randInt)(0, fkPool.length - 1)] : null;
|
|
316
|
+
}
|
|
317
|
+
if (p.strategy === 'bytes') {
|
|
318
|
+
const len = (0, exports.randInt)(Math.max(0, p.minLen ?? 8), Math.max(1, p.maxLen ?? 32));
|
|
319
|
+
const buf = Buffer.alloc(len);
|
|
320
|
+
for (let i = 0; i < len; i++)
|
|
321
|
+
buf[i] = (0, exports.randInt)(0, 255);
|
|
322
|
+
return (0, common_1.coerceFormValue)(`0x${buf.toString('hex')}`, type || 'BLOB');
|
|
323
|
+
}
|
|
324
|
+
const gen = BASIC_STRATEGIES[p.strategy];
|
|
325
|
+
if (!gen)
|
|
326
|
+
return types_1.SKIP;
|
|
327
|
+
let rawVal = gen(p, rowIndex);
|
|
328
|
+
if (rawVal != null && (p.prefix || p.suffix) && typeof rawVal === 'string') {
|
|
329
|
+
rawVal = `${p.prefix || ''}${rawVal}${p.suffix || ''}`;
|
|
330
|
+
}
|
|
331
|
+
return (0, common_1.coerceFormValue)(String(rawVal), type || 'TEXT');
|
|
332
|
+
}
|
|
333
|
+
function generateSampleValue(col, plan, fkPool) {
|
|
334
|
+
const v = generateOne(col, plan, fkPool || ['[FK sample]'], 0);
|
|
335
|
+
if (v === types_1.SKIP)
|
|
336
|
+
return '(omitted / default)';
|
|
337
|
+
if (v === null)
|
|
338
|
+
return 'NULL';
|
|
339
|
+
if (v instanceof Uint8Array || Buffer.isBuffer(v))
|
|
340
|
+
return `0x${Buffer.from(v).toString('hex').slice(0, 16)}...`;
|
|
341
|
+
return v;
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=strategies.js.map
|