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.
Files changed (202) hide show
  1. package/README.md +250 -352
  2. package/dist/app.d.ts +25 -4
  3. package/dist/app.js +79 -15
  4. package/dist/app.js.map +1 -1
  5. package/dist/auth/config.d.ts +19 -0
  6. package/dist/auth/config.js +147 -0
  7. package/dist/auth/config.js.map +1 -0
  8. package/dist/auth/crypto.d.ts +27 -0
  9. package/dist/auth/crypto.js +133 -0
  10. package/dist/auth/crypto.js.map +1 -0
  11. package/dist/auth/index.d.ts +5 -0
  12. package/dist/auth/index.js +22 -0
  13. package/dist/auth/index.js.map +1 -0
  14. package/dist/auth/middleware.d.ts +14 -0
  15. package/dist/auth/middleware.js +100 -0
  16. package/dist/auth/middleware.js.map +1 -0
  17. package/dist/auth/routes.d.ts +7 -0
  18. package/dist/auth/routes.js +78 -0
  19. package/dist/auth/routes.js.map +1 -0
  20. package/dist/auth/types.d.ts +35 -0
  21. package/dist/auth/types.js +11 -0
  22. package/dist/auth/types.js.map +1 -0
  23. package/dist/cli/args.d.ts +45 -0
  24. package/dist/cli/args.js +328 -0
  25. package/dist/cli/args.js.map +1 -0
  26. package/dist/cli/config.d.ts +56 -0
  27. package/dist/cli/config.js +133 -0
  28. package/dist/cli/config.js.map +1 -0
  29. package/dist/cli/index.d.ts +4 -0
  30. package/dist/cli/index.js +21 -0
  31. package/dist/cli/index.js.map +1 -0
  32. package/dist/cli/runner.d.ts +1 -0
  33. package/dist/cli/runner.js +222 -0
  34. package/dist/cli/runner.js.map +1 -0
  35. package/dist/cli.js +2 -127
  36. package/dist/cli.js.map +1 -1
  37. package/dist/data/datasets.d.ts +17 -0
  38. package/dist/data/datasets.js +133 -0
  39. package/dist/data/datasets.js.map +1 -0
  40. package/dist/data/detector.d.ts +30 -0
  41. package/dist/data/detector.js +472 -0
  42. package/dist/data/detector.js.map +1 -0
  43. package/dist/data/engine.d.ts +10 -0
  44. package/dist/data/engine.js +211 -0
  45. package/dist/data/engine.js.map +1 -0
  46. package/dist/data/index.d.ts +5 -0
  47. package/dist/data/index.js +22 -0
  48. package/dist/data/index.js.map +1 -0
  49. package/dist/data/strategies.d.ts +30 -0
  50. package/dist/data/strategies.js +343 -0
  51. package/dist/data/strategies.js.map +1 -0
  52. package/dist/data/types.d.ts +73 -0
  53. package/dist/data/types.js +8 -0
  54. package/dist/data/types.js.map +1 -0
  55. package/dist/db/database.d.ts +14 -142
  56. package/dist/db/database.js +209 -435
  57. package/dist/db/database.js.map +1 -1
  58. package/dist/db/export.d.ts +2 -2
  59. package/dist/db/export.js +7 -2
  60. package/dist/db/export.js.map +1 -1
  61. package/dist/db/filters.d.ts +22 -0
  62. package/dist/db/filters.js +158 -0
  63. package/dist/db/filters.js.map +1 -0
  64. package/dist/db/index.d.ts +8 -0
  65. package/dist/db/index.js +25 -0
  66. package/dist/db/index.js.map +1 -0
  67. package/dist/db/introspection.d.ts +6 -0
  68. package/dist/db/introspection.js +172 -0
  69. package/dist/db/introspection.js.map +1 -0
  70. package/dist/db/manager.d.ts +32 -19
  71. package/dist/db/manager.js +203 -44
  72. package/dist/db/manager.js.map +1 -1
  73. package/dist/db/migrations.d.ts +5 -0
  74. package/dist/db/migrations.js +110 -0
  75. package/dist/db/migrations.js.map +1 -0
  76. package/dist/db/postgres.d.ts +85 -0
  77. package/dist/db/postgres.js +745 -0
  78. package/dist/db/postgres.js.map +1 -0
  79. package/dist/db/types.d.ts +206 -0
  80. package/dist/db/types.js +7 -0
  81. package/dist/db/types.js.map +1 -0
  82. package/dist/index.d.ts +9 -2
  83. package/dist/index.js +46 -4
  84. package/dist/index.js.map +1 -1
  85. package/dist/public/css/app.css +1 -1
  86. package/dist/public/css/input.css +83 -13
  87. package/dist/public/js/app.js +142 -0
  88. package/dist/public/js/browse.js +591 -104
  89. package/dist/public/js/databases.js +105 -13
  90. package/dist/public/js/designer.js +40 -2
  91. package/dist/public/js/forms.js +610 -28
  92. package/dist/public/js/icons.js +51 -0
  93. package/dist/public/js/inspector.js +638 -0
  94. package/dist/public/js/query.js +93 -3
  95. package/dist/public/js/schema.js +170 -52
  96. package/dist/public/js/seed.js +1090 -0
  97. package/dist/routes/api/helpers.d.ts +42 -0
  98. package/dist/routes/api/helpers.js +133 -0
  99. package/dist/routes/api/helpers.js.map +1 -0
  100. package/dist/routes/api/import-export.d.ts +3 -0
  101. package/dist/routes/api/import-export.js +85 -0
  102. package/dist/routes/api/import-export.js.map +1 -0
  103. package/dist/routes/api/index.d.ts +4 -0
  104. package/dist/routes/api/index.js +37 -0
  105. package/dist/routes/api/index.js.map +1 -0
  106. package/dist/routes/api/query.d.ts +3 -0
  107. package/dist/routes/api/query.js +76 -0
  108. package/dist/routes/api/query.js.map +1 -0
  109. package/dist/routes/api/rows.d.ts +3 -0
  110. package/dist/routes/api/rows.js +373 -0
  111. package/dist/routes/api/rows.js.map +1 -0
  112. package/dist/routes/api/seed.d.ts +3 -0
  113. package/dist/routes/api/seed.js +82 -0
  114. package/dist/routes/api/seed.js.map +1 -0
  115. package/dist/routes/api/tables.d.ts +3 -0
  116. package/dist/routes/api/tables.js +160 -0
  117. package/dist/routes/api/tables.js.map +1 -0
  118. package/dist/routes/databases.d.ts +8 -11
  119. package/dist/routes/databases.js +100 -66
  120. package/dist/routes/databases.js.map +1 -1
  121. package/dist/routes/index.d.ts +3 -0
  122. package/dist/routes/index.js +20 -0
  123. package/dist/routes/index.js.map +1 -0
  124. package/dist/routes/pages.d.ts +3 -3
  125. package/dist/routes/pages.js +163 -54
  126. package/dist/routes/pages.js.map +1 -1
  127. package/dist/serverless.d.ts +40 -0
  128. package/dist/serverless.js +210 -0
  129. package/dist/serverless.js.map +1 -0
  130. package/dist/sql/generator.d.ts +4 -3
  131. package/dist/sql/generator.js +103 -6
  132. package/dist/sql/generator.js.map +1 -1
  133. package/dist/sql/index.d.ts +2 -0
  134. package/dist/sql/index.js +19 -0
  135. package/dist/sql/index.js.map +1 -0
  136. package/dist/types/api.d.ts +412 -0
  137. package/dist/types/api.js +9 -0
  138. package/dist/types/api.js.map +1 -0
  139. package/dist/utils/colors.d.ts +40 -0
  140. package/dist/utils/colors.js +64 -0
  141. package/dist/utils/colors.js.map +1 -0
  142. package/dist/{util.d.ts → utils/common.d.ts} +10 -6
  143. package/dist/{util.js → utils/common.js} +80 -13
  144. package/dist/utils/common.js.map +1 -0
  145. package/dist/utils/csv.js.map +1 -0
  146. package/dist/utils/datatype.d.ts +49 -0
  147. package/dist/utils/datatype.js +222 -0
  148. package/dist/utils/datatype.js.map +1 -0
  149. package/dist/utils/icons.d.ts +11 -0
  150. package/dist/utils/icons.js +72 -0
  151. package/dist/utils/icons.js.map +1 -0
  152. package/dist/utils/index.d.ts +4 -0
  153. package/dist/utils/index.js +21 -0
  154. package/dist/utils/index.js.map +1 -0
  155. package/dist/{logger.d.ts → utils/logger.d.ts} +1 -1
  156. package/dist/utils/logger.js +40 -0
  157. package/dist/utils/logger.js.map +1 -0
  158. package/dist/views/layouts/main.hbs +33 -11
  159. package/dist/views/pages/databases.hbs +182 -74
  160. package/dist/views/pages/designer.hbs +9 -6
  161. package/dist/views/pages/error.hbs +3 -3
  162. package/dist/views/pages/form.hbs +5 -3
  163. package/dist/views/pages/home.hbs +22 -13
  164. package/dist/views/pages/login.hbs +111 -0
  165. package/dist/views/pages/query.hbs +10 -8
  166. package/dist/views/pages/schema.hbs +41 -13
  167. package/dist/views/pages/seed.hbs +232 -0
  168. package/dist/views/pages/table.hbs +155 -70
  169. package/dist/views/partials/icon.hbs +2 -0
  170. package/dist/views/partials/navbar.hbs +70 -31
  171. package/dist/views/partials/sidebar.hbs +108 -99
  172. package/package.json +12 -5
  173. package/dist/args.d.ts +0 -28
  174. package/dist/args.js +0 -187
  175. package/dist/args.js.map +0 -1
  176. package/dist/config.d.ts +0 -17
  177. package/dist/config.js +0 -23
  178. package/dist/config.js.map +0 -1
  179. package/dist/csv.js.map +0 -1
  180. package/dist/logger.js +0 -25
  181. package/dist/logger.js.map +0 -1
  182. package/dist/routes/api.d.ts +0 -9
  183. package/dist/routes/api.js +0 -786
  184. package/dist/routes/api.js.map +0 -1
  185. package/dist/test/classifier.test.d.ts +0 -1
  186. package/dist/test/classifier.test.js +0 -44
  187. package/dist/test/classifier.test.js.map +0 -1
  188. package/dist/test/csv.test.d.ts +0 -1
  189. package/dist/test/csv.test.js +0 -64
  190. package/dist/test/csv.test.js.map +0 -1
  191. package/dist/test/database.test.d.ts +0 -1
  192. package/dist/test/database.test.js +0 -402
  193. package/dist/test/database.test.js.map +0 -1
  194. package/dist/test/generator.test.d.ts +0 -1
  195. package/dist/test/generator.test.js +0 -132
  196. package/dist/test/generator.test.js.map +0 -1
  197. package/dist/test/manager.test.d.ts +0 -1
  198. package/dist/test/manager.test.js +0 -146
  199. package/dist/test/manager.test.js.map +0 -1
  200. package/dist/util.js.map +0 -1
  201. /package/dist/{csv.d.ts → utils/csv.d.ts} +0 -0
  202. /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,5 @@
1
+ export * from './types';
2
+ export * from './datasets';
3
+ export * from './strategies';
4
+ export * from './detector';
5
+ export * from './engine';
@@ -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