admindb 2.1.1 → 2.3.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 (119) hide show
  1. package/README.md +368 -335
  2. package/dist/app.js +227 -1
  3. package/dist/auth/config.d.ts +1 -1
  4. package/dist/auth/config.js +109 -1
  5. package/dist/auth/crypto.js +98 -1
  6. package/dist/auth/index.js +21 -1
  7. package/dist/auth/middleware.js +78 -1
  8. package/dist/auth/routes.js +64 -1
  9. package/dist/auth/types.js +7 -1
  10. package/dist/cli/args.d.ts +1 -1
  11. package/dist/cli/args.js +309 -1
  12. package/dist/cli/config.js +118 -1
  13. package/dist/cli/index.js +20 -1
  14. package/dist/cli/runner.js +208 -1
  15. package/dist/cli.js +4 -1
  16. package/dist/data/chain.d.ts +1 -0
  17. package/dist/data/chain.js +130 -0
  18. package/dist/data/datasets.d.ts +1 -1
  19. package/dist/data/datasets.js +171 -1
  20. package/dist/data/detector.d.ts +1 -1
  21. package/dist/data/detector.js +535 -1
  22. package/dist/data/engine.d.ts +1 -1
  23. package/dist/data/engine.js +586 -1
  24. package/dist/data/index.d.ts +1 -1
  25. package/dist/data/index.js +30 -1
  26. package/dist/data/prng.d.ts +1 -0
  27. package/dist/data/prng.js +73 -0
  28. package/dist/data/registry.d.ts +1 -0
  29. package/dist/data/registry.js +805 -0
  30. package/dist/data/schema-graph.d.ts +1 -0
  31. package/dist/data/schema-graph.js +210 -0
  32. package/dist/data/strategies.d.ts +1 -1
  33. package/dist/data/strategies.js +100 -1
  34. package/dist/data/templates.d.ts +1 -0
  35. package/dist/data/templates.js +134 -0
  36. package/dist/data/types.d.ts +1 -1
  37. package/dist/data/types.js +5 -1
  38. package/dist/data/validator.d.ts +1 -0
  39. package/dist/data/validator.js +160 -0
  40. package/dist/db/database.d.ts +1 -1
  41. package/dist/db/database.js +472 -1
  42. package/dist/db/export.d.ts +1 -1
  43. package/dist/db/export.js +67 -1
  44. package/dist/db/filters.d.ts +1 -1
  45. package/dist/db/filters.js +119 -1
  46. package/dist/db/index.js +24 -1
  47. package/dist/db/introspection.js +164 -1
  48. package/dist/db/manager.js +327 -1
  49. package/dist/db/migrations.js +100 -1
  50. package/dist/db/postgres.d.ts +1 -1
  51. package/dist/db/postgres.js +687 -1
  52. package/dist/db/types.d.ts +1 -1
  53. package/dist/db/types.js +6 -1
  54. package/dist/index.d.ts +1 -1
  55. package/dist/index.js +52 -1
  56. package/dist/public/css/app.css +1 -1
  57. package/dist/public/js/api.js +1 -1
  58. package/dist/public/js/browse.js +1 -1
  59. package/dist/public/js/common.js +1 -0
  60. package/dist/public/js/databases.js +1 -1
  61. package/dist/public/js/designer.js +1 -1
  62. package/dist/public/js/forms.js +1 -1
  63. package/dist/public/js/home.js +1 -0
  64. package/dist/public/js/inspector.js +1 -1
  65. package/dist/public/js/query.js +1 -1
  66. package/dist/public/js/schema.js +1 -1
  67. package/dist/public/js/seed.js +1 -1
  68. package/dist/routes/api/erd.d.ts +1 -0
  69. package/dist/routes/api/erd.js +45 -0
  70. package/dist/routes/api/helpers.d.ts +1 -1
  71. package/dist/routes/api/helpers.js +213 -1
  72. package/dist/routes/api/import-export.js +82 -1
  73. package/dist/routes/api/index.js +48 -1
  74. package/dist/routes/api/query.js +74 -1
  75. package/dist/routes/api/rows.js +358 -1
  76. package/dist/routes/api/seed.js +167 -1
  77. package/dist/routes/api/tables.js +216 -1
  78. package/dist/routes/databases.js +210 -1
  79. package/dist/routes/index.js +19 -1
  80. package/dist/routes/pages.js +446 -1
  81. package/dist/serverless.js +149 -1
  82. package/dist/sql/classifier.js +24 -1
  83. package/dist/sql/error-analyzer.d.ts +1 -0
  84. package/dist/sql/error-analyzer.js +550 -0
  85. package/dist/sql/generator.d.ts +1 -1
  86. package/dist/sql/generator.js +245 -1
  87. package/dist/sql/index.js +18 -1
  88. package/dist/types/api.d.ts +1 -1
  89. package/dist/types/api.js +2 -1
  90. package/dist/utils/colors.js +54 -1
  91. package/dist/utils/common.d.ts +1 -1
  92. package/dist/utils/common.js +185 -1
  93. package/dist/utils/csv.d.ts +1 -1
  94. package/dist/utils/csv.js +61 -1
  95. package/dist/utils/datatype.js +167 -1
  96. package/dist/utils/icons.js +81 -1
  97. package/dist/utils/index.js +20 -1
  98. package/dist/utils/logger.js +36 -1
  99. package/dist/views/layouts/main.hbs +1 -74
  100. package/dist/views/pages/databases.hbs +1 -233
  101. package/dist/views/pages/designer.hbs +1 -89
  102. package/dist/views/pages/erd.hbs +1 -0
  103. package/dist/views/pages/error.hbs +1 -10
  104. package/dist/views/pages/form.hbs +1 -59
  105. package/dist/views/pages/home.hbs +1 -124
  106. package/dist/views/pages/info.hbs +1 -0
  107. package/dist/views/pages/login.hbs +1 -98
  108. package/dist/views/pages/query.hbs +1 -87
  109. package/dist/views/pages/schema.hbs +1 -298
  110. package/dist/views/pages/seed-select.hbs +251 -0
  111. package/dist/views/pages/seed.hbs +273 -167
  112. package/dist/views/pages/table.hbs +1 -327
  113. package/dist/views/partials/navbar.hbs +1 -83
  114. package/dist/views/partials/sidebar.hbs +1 -117
  115. package/docs/API.md +149 -144
  116. package/docs/EXAMPLES.md +579 -576
  117. package/docs/SECURITY.md +265 -265
  118. package/package.json +79 -78
  119. package/dist/public/js/icons.js +0 -1
@@ -1 +1,208 @@
1
- var __importDefault=this&&this.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.runCli=function(){const env=(0,config_1.loadConfig)(),parsed=(0,args_1.parseArgs)(process.argv.slice(2));parsed.error&&(console.error(colors_1.c.red(colors_1.c.bold(`Error: ${parsed.error}`))),console.error(),console.error((0,args_1.helpText)()),process.exit(1));const args=parsed.args;args.help&&(console.log((0,args_1.helpText)()),process.exit(0));args.version&&(console.log((0,args_1.versionText)()),process.exit(0));const authEnabled=void 0!==args.auth?args.auth:env.auth,authUsername=args.authUsername??env.authUsername??"admin",authPassword=args.authPassword??env.authPassword,authSecret=args.authSecret??env.authSecret,serverless=void 0!==args.serverless?args.serverless:env.serverless,readonly=serverless||args.readonly||env.readonly,connections=args.connections??env.connections,hasConnections=Boolean(connections&&Object.keys(connections).length>0),config={host:args.host??env.host,port:args.port??env.port,dbPath:args.dbPath??env.dbPath,connection:args.connection??env.connection,connections:connections,dbDir:args.dbDir??env.dbDir,dbFiles:args.dbFiles??env.dbFiles,basePath:(args.basePath??env.basePath).replace(/\/+$/,""),logLevel:args.logLevel??env.logLevel,readonly:readonly,serverless:serverless,auth:!!authEnabled&&{enabled:!0,username:authUsername,password:authPassword,secret:authSecret}},logger=(0,logger_1.createLogger)(config.logLevel,"admindb"),app=(0,express_1.default)();app.disable("x-powered-by");const hasDir=Boolean(config.dbDir),hasFiles=Boolean(config.dbFiles&&config.dbFiles.length>0),explicitFile=args.connection??config.connection??args.dbPath??(process.env.ADMINDB_DB_PATH||process.env.ADMINDB_PATH||process.env.DB_PATH?config.dbPath:void 0),isPg=Boolean(explicitFile&&(explicitFile.startsWith("postgres://")||explicitFile.startsWith("postgresql://"))),useManager=!(!hasConnections&&(Boolean(explicitFile)||isPg)&&!hasDir&&!hasFiles),managerFiles=[...config.dbFiles??[]];useManager&&explicitFile&&!hasConnections&&managerFiles.push(explicitFile);const managerDir=hasDir?config.dbDir:hasFiles||explicitFile||hasConnections?void 0:process.cwd(),allowBrowse=useManager&&(hasDir||!hasFiles&&!explicitFile&&!hasConnections),browseRoot=hasDir?node_path_1.default.resolve(config.dbDir):void 0,router=useManager?(0,app_1.createRouter)({manager:new manager_1.DbManager({dir:managerDir,files:managerFiles,connections:connections,readonly:config.readonly},logger),basePath:config.basePath,logger:logger,readonly:config.readonly,serverless:config.serverless,allowBrowse:allowBrowse,browseRoot:browseRoot,auth:config.auth}):(0,app_1.createRouter)({dbPath:explicitFile,connection:explicitFile,basePath:config.basePath,logger:logger,readonly:config.readonly,serverless:config.serverless,auth:config.auth});app.use(config.basePath||"/",router);const server=app.listen(config.port,config.host,()=>{const v=(0,args_1.getPackageVersion)(),versionStr=v?` v${v}`:"",isAnyHost="0.0.0.0"===config.host||"::"===config.host||""===config.host,localUrl=`http://${isAnyHost?"localhost":config.host}:${config.port}${config.basePath}/`;if(console.log(),console.log(` ${colors_1.c.cyan(colors_1.c.bold("⚡ AdminDB"))}${colors_1.c.dim(versionStr)}`),console.log(),console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Local:")} ${colors_1.c.cyan(localUrl)}`),isAnyHost){const netIp=function(){try{const nets=node_os_1.default.networkInterfaces();for(const name of Object.keys(nets))for(const net of nets[name]??[])if("IPv4"===net.family&&!net.internal)return net.address}catch{}}();if(netIp){const netUrl=`http://${netIp}:${config.port}${config.basePath}/`;console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Network:")} ${colors_1.c.cyan(netUrl)}`)}}if(useManager){const modeDesc=config.serverless?"Manager [Serverless Read-Only]":config.readonly?"Manager [Read-Only]":"Manager";if(console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Mode:")} ${modeDesc}`),args.configPath){const count=Object.keys(connections??{}).length;console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Config:")} ${colors_1.c.cyan(args.configPath)}${count?` (${count} connection(s))`:""}`)}if(hasConnections)for(const[name,target]of Object.entries(connections)){const sanitized=target.replace(/:([^@]+)@/,":****@"),engine=target.startsWith("postgres://")||target.startsWith("postgresql://")?"PostgreSQL":"SQLite";console.log(` ${colors_1.c.dim("•")} ${colors_1.c.bold(name)}: ${colors_1.c.cyan(engine)} ${colors_1.c.dim(sanitized)}`)}else managerDir&&console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Directory:")}${colors_1.c.dim(` ${managerDir}`)}`);allowBrowse?browseRoot&&console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Browse:")} ${colors_1.c.dim(`Limited to ${browseRoot}`)}`):console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Browse:")} ${colors_1.c.dim("Disabled (configured databases only)")}`)}else{const modeDesc=config.serverless?"Single DB [Serverless Read-Only]":config.readonly?"Single DB [Read-Only]":"Single DB";if(console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Mode:")} ${modeDesc}`),args.configPath&&console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Config:")} ${colors_1.c.cyan(args.configPath)}`),isPg){const sanitized=explicitFile?.replace(/:([^@]+)@/,":****@");console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Engine:")} ${colors_1.c.cyan("PostgreSQL")}`),console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Database:")} ${sanitized}`)}else console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Engine:")} ${colors_1.c.cyan("SQLite")}`),console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Database:")} ${explicitFile}`)}if(authEnabled){"admin"===authUsername&&(!authPassword||"admin"===authPassword||authPassword===auth_1.DEFAULT_PASSWORD_HASH)?(console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Auth:")} User: ${colors_1.c.bold(authUsername)} ${colors_1.c.yellow("(default password)")}`),console.log(),console.log(` ${colors_1.c.yellow("⚠")} ${colors_1.c.yellow("Default password in use (admin).")} Generate a secure hash with:`),console.log(` ${colors_1.c.dim("npm run generatehash")} and set ${colors_1.c.cyan("ADMINDB_PASSWORD")} or ${colors_1.c.cyan("-P <hash>")}`)):console.log(` ${colors_1.c.green("➜")} ${colors_1.c.bold("Auth:")} User: ${colors_1.c.bold(authUsername)}`)}else console.log(` ${colors_1.c.yellow("➜")} ${colors_1.c.bold("Auth:")} ${colors_1.c.yellow("Disabled (--no-auth)")}`),console.log(` ${colors_1.c.dim("Warning: Anyone with network access can view and modify databases.")}`);console.log()}),shutdown=signal=>{console.log(`\n ${colors_1.c.dim(`Received ${signal}, shutting down…`)}`),server.close(()=>{console.log(` ${colors_1.c.green("✓")} ${colors_1.c.dim("AdminDB stopped.")}\n`),process.exit(0)}),setTimeout(()=>process.exit(0),2e3).unref()};process.on("SIGINT",()=>shutdown("SIGINT")),process.on("SIGTERM",()=>shutdown("SIGTERM"))};const express_1=__importDefault(require("express")),node_os_1=__importDefault(require("node:os")),node_path_1=__importDefault(require("node:path")),app_1=require("../app"),config_1=require("./config"),logger_1=require("../utils/logger"),manager_1=require("../db/manager"),args_1=require("./args"),auth_1=require("../auth"),colors_1=require("../utils/colors");
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runCli = runCli;
7
+ const express_1 = __importDefault(require("express"));
8
+ const node_os_1 = __importDefault(require("node:os"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const app_1 = require("../app");
11
+ const config_1 = require("./config");
12
+ const logger_1 = require("../utils/logger");
13
+ const manager_1 = require("../db/manager");
14
+ const args_1 = require("./args");
15
+ const auth_1 = require("../auth");
16
+ const common_1 = require("../utils/common");
17
+ const colors_1 = require("../utils/colors");
18
+ function runCli() {
19
+ const env = (0, config_1.loadConfig)();
20
+ const parsed = (0, args_1.parseArgs)(process.argv.slice(2));
21
+ if (parsed.error) {
22
+ console.error(colors_1.c.red(colors_1.c.bold(`Error: ${parsed.error}`)));
23
+ console.error();
24
+ console.error((0, args_1.helpText)());
25
+ process.exit(1);
26
+ }
27
+ const args = parsed.args;
28
+ if (args.help) {
29
+ console.log((0, args_1.helpText)());
30
+ process.exit(0);
31
+ }
32
+ if (args.version) {
33
+ console.log((0, args_1.versionText)());
34
+ process.exit(0);
35
+ }
36
+ const authEnabled = args.auth !== undefined ? args.auth : env.auth;
37
+ const authUsername = args.authUsername ?? env.authUsername ?? 'admin';
38
+ const authPassword = args.authPassword ?? env.authPassword;
39
+ const authSecret = args.authSecret ?? env.authSecret;
40
+ const serverless = args.serverless !== undefined ? args.serverless : env.serverless;
41
+ const readonly = serverless || args.readonly || env.readonly;
42
+ const connections = args.connections ?? env.connections;
43
+ const hasConnections = Boolean(connections && Object.keys(connections).length > 0);
44
+ const config = {
45
+ host: args.host ?? env.host,
46
+ port: args.port ?? env.port,
47
+ dbPath: args.dbPath ?? env.dbPath,
48
+ connection: args.connection ?? env.connection,
49
+ connections,
50
+ dbDir: args.dbDir ?? env.dbDir,
51
+ dbFiles: args.dbFiles ?? env.dbFiles,
52
+ basePath: (args.basePath ?? env.basePath).replace(/\/+$/, ''),
53
+ logLevel: args.logLevel ?? env.logLevel,
54
+ readonly,
55
+ serverless,
56
+ auth: authEnabled
57
+ ? {
58
+ enabled: true,
59
+ username: authUsername,
60
+ password: authPassword,
61
+ secret: authSecret,
62
+ }
63
+ : false,
64
+ };
65
+ const logger = (0, logger_1.createLogger)(config.logLevel, 'admindb');
66
+ const app = (0, express_1.default)();
67
+ app.disable('x-powered-by');
68
+ const hasDir = Boolean(config.dbDir);
69
+ const hasFiles = Boolean(config.dbFiles?.length);
70
+ const explicitFile = args.connection || args.dbPath || config.connection || config.dbPath;
71
+ const isPg = Boolean(explicitFile && (0, common_1.isPostgresConnectionString)(explicitFile));
72
+ const singleFileOnly = !hasConnections && (Boolean(explicitFile) || isPg) && !hasDir && !hasFiles;
73
+ const useManager = !singleFileOnly;
74
+ const managerFiles = [...(config.dbFiles ?? [])];
75
+ if (useManager && explicitFile && !hasConnections)
76
+ managerFiles.push(explicitFile);
77
+ const managerDir = hasDir ? config.dbDir : hasFiles || explicitFile || hasConnections ? undefined : process.cwd();
78
+ const allowBrowse = useManager && (hasDir || (!hasFiles && !explicitFile && !hasConnections));
79
+ const browseRoot = hasDir ? node_path_1.default.resolve(config.dbDir) : undefined;
80
+ const router = useManager
81
+ ? (0, app_1.createRouter)({
82
+ manager: new manager_1.DbManager({ dir: managerDir, files: managerFiles, connections, readonly: config.readonly }, logger),
83
+ basePath: config.basePath,
84
+ logger,
85
+ readonly: config.readonly,
86
+ serverless: config.serverless,
87
+ allowBrowse,
88
+ browseRoot,
89
+ auth: config.auth,
90
+ })
91
+ : (0, app_1.createRouter)({
92
+ dbPath: explicitFile,
93
+ connection: explicitFile,
94
+ basePath: config.basePath,
95
+ logger,
96
+ readonly: config.readonly,
97
+ serverless: config.serverless,
98
+ auth: config.auth,
99
+ });
100
+ app.use(config.basePath || '/', router);
101
+ function getNetworkIp() {
102
+ try {
103
+ const nets = node_os_1.default.networkInterfaces();
104
+ for (const name of Object.keys(nets)) {
105
+ for (const net of nets[name] ?? []) {
106
+ if (net.family === 'IPv4' && !net.internal)
107
+ return net.address;
108
+ }
109
+ }
110
+ }
111
+ catch { }
112
+ return undefined;
113
+ }
114
+ const server = app.listen(config.port, config.host, () => {
115
+ const v = (0, args_1.getPackageVersion)();
116
+ const versionStr = v ? ` v${v}` : '';
117
+ const isAnyHost = config.host === '0.0.0.0' || config.host === '::' || config.host === '';
118
+ const localHost = isAnyHost ? 'localhost' : config.host;
119
+ const localUrl = `http://${localHost}:${config.port}${config.basePath}/`;
120
+ console.log();
121
+ console.log(` ${colors_1.c.cyan(colors_1.c.bold('⚡ AdminDB'))}${colors_1.c.dim(versionStr)}`);
122
+ console.log();
123
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Local:')} ${colors_1.c.cyan(localUrl)}`);
124
+ if (isAnyHost) {
125
+ const netIp = getNetworkIp();
126
+ if (netIp) {
127
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Network:')} ${colors_1.c.cyan(`http://${netIp}:${config.port}${config.basePath}/`)}`);
128
+ }
129
+ }
130
+ if (useManager) {
131
+ const modeDesc = config.serverless
132
+ ? 'Manager [Serverless Read-Only]'
133
+ : config.readonly
134
+ ? 'Manager [Read-Only]'
135
+ : 'Manager';
136
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Mode:')} ${modeDesc}`);
137
+ if (args.configPath) {
138
+ const count = Object.keys(connections ?? {}).length;
139
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Config:')} ${colors_1.c.cyan(args.configPath)}${count ? ` (${count} connection(s))` : ''}`);
140
+ }
141
+ if (hasConnections) {
142
+ for (const [name, target] of Object.entries(connections)) {
143
+ const sanitized = (0, common_1.sanitizeConnectionString)(target);
144
+ const isTargetPg = (0, common_1.isPostgresConnectionString)(target);
145
+ const engine = isTargetPg ? 'PostgreSQL' : 'SQLite';
146
+ console.log(` ${colors_1.c.dim('•')} ${colors_1.c.bold(name)}: ${colors_1.c.cyan(engine)} ${colors_1.c.dim(sanitized)}`);
147
+ }
148
+ }
149
+ else if (managerDir) {
150
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Directory:')}${colors_1.c.dim(` ${managerDir}`)}`);
151
+ }
152
+ if (!allowBrowse) {
153
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Browse:')} ${colors_1.c.dim('Disabled (configured databases only)')}`);
154
+ }
155
+ else if (browseRoot) {
156
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Browse:')} ${colors_1.c.dim(`Limited to ${browseRoot}`)}`);
157
+ }
158
+ }
159
+ else {
160
+ const modeDesc = config.serverless
161
+ ? 'Single DB [Serverless Read-Only]'
162
+ : config.readonly
163
+ ? 'Single DB [Read-Only]'
164
+ : 'Single DB';
165
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Mode:')} ${modeDesc}`);
166
+ if (args.configPath) {
167
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Config:')} ${colors_1.c.cyan(args.configPath)}`);
168
+ }
169
+ if (isPg) {
170
+ const sanitized = (0, common_1.sanitizeConnectionString)(explicitFile || '');
171
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Engine:')} ${colors_1.c.cyan('PostgreSQL')}`);
172
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Database:')} ${sanitized}`);
173
+ }
174
+ else {
175
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Engine:')} ${colors_1.c.cyan('SQLite')}`);
176
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Database:')} ${explicitFile}`);
177
+ }
178
+ }
179
+ if (authEnabled) {
180
+ const isDefaultPass = authUsername === 'admin' &&
181
+ (!authPassword || authPassword === 'admin' || authPassword === auth_1.DEFAULT_PASSWORD_HASH);
182
+ if (isDefaultPass) {
183
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Auth:')} User: ${colors_1.c.bold(authUsername)} ${colors_1.c.yellow('(default password)')}`);
184
+ console.log();
185
+ console.log(` ${colors_1.c.yellow('⚠')} ${colors_1.c.yellow('Default password in use (admin).')} Generate a secure hash with:`);
186
+ console.log(` ${colors_1.c.dim('npm run generatehash')} and set ${colors_1.c.cyan('ADMINDB_PASSWORD')} or ${colors_1.c.cyan('-P <hash>')}`);
187
+ }
188
+ else {
189
+ console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Auth:')} User: ${colors_1.c.bold(authUsername)}`);
190
+ }
191
+ }
192
+ else {
193
+ console.log(` ${colors_1.c.yellow('➜')} ${colors_1.c.bold('Auth:')} ${colors_1.c.yellow('Disabled (--no-auth)')}`);
194
+ console.log(` ${colors_1.c.dim('Warning: Anyone with network access can view and modify databases.')}`);
195
+ }
196
+ console.log();
197
+ });
198
+ const shutdown = (signal) => {
199
+ console.log(`\n ${colors_1.c.dim(`Received ${signal}, shutting down…`)}`);
200
+ server.close(() => {
201
+ console.log(` ${colors_1.c.green('✓')} ${colors_1.c.dim('AdminDB stopped.')}\n`);
202
+ process.exit(0);
203
+ });
204
+ setTimeout(() => process.exit(0), 2000).unref();
205
+ };
206
+ process.on('SIGINT', () => shutdown('SIGINT'));
207
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
208
+ }
package/dist/cli.js CHANGED
@@ -1,2 +1,5 @@
1
1
  #!/usr/bin/env node
2
- Object.defineProperty(exports,"__esModule",{value:!0});(0,require("./cli/runner").runCli)();
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const runner_1 = require("./cli/runner");
5
+ (0, runner_1.runCli)();
@@ -0,0 +1 @@
1
+ import type {IDatabase,TableInfoData} from '../db/index';import{buildChainInsertSql} from './engine';import type {ColumnPlan,ErChainConfig,ErChainResult,ErChainScope,TableGenerationMode} from './types';export{buildChainInsertSql};export declare const buildErGraph:(tables:TableInfoData[])=>Map<string,import("./schema-graph").SchemaNode>;export declare const resolveErChain:(graph:Map<string,any>,rootTable:string,scope?:ErChainScope)=>import("./schema-graph").SchemaNode[];export declare const topologicalSort:(nodes:any[])=>{sorted:import("./schema-graph").SchemaNode[];cycleDetected:boolean;cycleTables:string[];};export declare function getErChainConfig(db:IDatabase,rootTable:string,scope?:ErChainScope):Promise<ErChainConfig>;export declare function generateChainRows(db:IDatabase,chainConfig:ErChainConfig,customPlans?:Record<string,Record<string,ColumnPlan>>,customCounts?:Record<string,number>,truncate?:boolean,modes?:Record<string,TableGenerationMode>,seed?:number|null):Promise<ErChainResult>;export declare function executeChainInsert(db:IDatabase,chainResult:ErChainResult,truncate?:boolean):Promise<{inserted:Record<string,number>;totalInserted:number;elapsedMs:number;warnings:string[];}>;
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.topologicalSort = exports.resolveErChain = exports.buildErGraph = exports.buildChainInsertSql = void 0;
4
+ exports.getErChainConfig = getErChainConfig;
5
+ exports.generateChainRows = generateChainRows;
6
+ exports.executeChainInsert = executeChainInsert;
7
+ const generator_1 = require("../sql/generator");
8
+ const engine_1 = require("./engine");
9
+ Object.defineProperty(exports, "buildChainInsertSql", { enumerable: true, get: function () { return engine_1.buildChainInsertSql; } });
10
+ const schema_graph_1 = require("./schema-graph");
11
+ const buildErGraph = (tables) => (0, schema_graph_1.buildSchemaGraph)(tables).nodes;
12
+ exports.buildErGraph = buildErGraph;
13
+ const resolveErChain = (graph, rootTable, scope = 'chain') => (0, schema_graph_1.resolveScopeTables)({ nodes: graph, relationships: [] }, rootTable, scope);
14
+ exports.resolveErChain = resolveErChain;
15
+ const topologicalSort = (nodes) => (0, schema_graph_1.sortTopologically)(nodes);
16
+ exports.topologicalSort = topologicalSort;
17
+ async function getErChainConfig(db, rootTable, scope = 'chain') {
18
+ const tableListRes = await db.listTables();
19
+ const tableNames = (tableListRes.data ?? [])
20
+ .map((t) => t.name)
21
+ .filter((name) => !name.startsWith('sqlite_') && name !== '_saved_queries');
22
+ const tables = [];
23
+ for (const name of tableNames) {
24
+ const info = await db.getTableInfo(name);
25
+ if (info.success && info.data)
26
+ tables.push(info.data);
27
+ }
28
+ const graph = (0, schema_graph_1.buildSchemaGraph)(tables);
29
+ const chainNodes = (0, schema_graph_1.resolveScopeTables)(graph, rootTable, scope);
30
+ const { sorted, cycleDetected, cycleTables } = (0, schema_graph_1.sortTopologically)(chainNodes);
31
+ const tableNodes = [];
32
+ for (let i = 0; i < sorted.length; i++) {
33
+ const node = sorted[i];
34
+ let rowCount = 0;
35
+ try {
36
+ const countRes = await db.getRowCount(node.name);
37
+ if (countRes.success && typeof countRes.data === 'number')
38
+ rowCount = countRes.data;
39
+ }
40
+ catch { }
41
+ const suggestedCount = node.depth === 0 ? 5 : node.depth === 1 ? 15 : 25;
42
+ tableNodes.push({
43
+ name: node.name,
44
+ order: i + 1,
45
+ depth: node.depth,
46
+ parents: node.parents.filter((p) => sorted.some((s) => s.name === p.table)),
47
+ children: node.children.filter((c) => sorted.some((s) => s.name === c.table)),
48
+ columns: node.columns,
49
+ suggestedCount,
50
+ rowCount,
51
+ isRoot: node.name === rootTable,
52
+ hasSelfRef: node.hasSelfRef,
53
+ isJunction: node.isJunction,
54
+ mode: 'generate',
55
+ });
56
+ }
57
+ return {
58
+ rootTable,
59
+ scope,
60
+ tables: tableNodes,
61
+ cycleDetected,
62
+ cycleTables,
63
+ maxTotalRows: 10000,
64
+ relationships: graph.relationships,
65
+ };
66
+ }
67
+ async function generateChainRows(db, chainConfig, customPlans = {}, customCounts = {}, truncate = false, modes = {}, seed) {
68
+ const planTables = {};
69
+ for (const tableNode of chainConfig.tables) {
70
+ const tableName = tableNode.name;
71
+ const mode = modes[tableName] || 'generate';
72
+ const rows = customCounts[tableName] ?? tableNode.suggestedCount ?? 10;
73
+ const columns = {};
74
+ for (const col of tableNode.columns) {
75
+ const raw = customPlans[tableName]?.[col.name];
76
+ columns[col.name] = raw && raw.strategy ? raw : col.defaultPlan;
77
+ }
78
+ planTables[tableName] = {
79
+ mode,
80
+ rows,
81
+ columns,
82
+ truncate,
83
+ };
84
+ }
85
+ const generationPlan = {
86
+ rootTable: chainConfig.rootTable,
87
+ scope: chainConfig.scope,
88
+ tables: planTables,
89
+ relationships: chainConfig.relationships,
90
+ options: {
91
+ seed: seed ?? null,
92
+ truncateAll: truncate,
93
+ },
94
+ };
95
+ return engine_1.SeedEngine.executePlan(db, generationPlan);
96
+ }
97
+ async function executeChainInsert(db, chainResult, truncate = false) {
98
+ const t0 = Date.now();
99
+ const inserted = {};
100
+ let totalInserted = 0;
101
+ if (truncate) {
102
+ const reverseOrder = [...chainResult.executionOrder].reverse();
103
+ for (const table of reverseOrder) {
104
+ const clearRes = await db.run(`DELETE FROM ${(0, generator_1.quoteIdentifier)(table)}`);
105
+ if (!clearRes.success) {
106
+ throw new Error(`Failed to truncate table "${table}": ${clearRes.error}`);
107
+ }
108
+ }
109
+ }
110
+ for (const table of chainResult.executionOrder) {
111
+ const res = chainResult.tableResults[table];
112
+ if (!res || !res.rows.length) {
113
+ inserted[table] = 0;
114
+ continue;
115
+ }
116
+ const insertRes = await db.insertRows(table, res.rows);
117
+ if (!insertRes.success) {
118
+ throw new Error(`Failed to insert seed rows into "${table}": ${insertRes.error}`);
119
+ }
120
+ const count = insertRes.data?.inserted ?? res.rows.length;
121
+ inserted[table] = count;
122
+ totalInserted += count;
123
+ }
124
+ return {
125
+ inserted,
126
+ totalInserted,
127
+ elapsedMs: Date.now() - t0,
128
+ warnings: chainResult.warnings,
129
+ };
130
+ }
@@ -1 +1 @@
1
- export declare const FIRST_NAMES:string[];export declare const LAST_NAMES:string[];export declare const CITIES:string[];export declare const COUNTRIES:string[];export declare const DOMAINS:string[];export declare const LOREM_WORDS:string[];export declare const COMPANIES:string[];export declare const JOB_TITLES:string[];export declare const US_STATES:string[];export declare const CURRENCIES:string[];export declare const COUNTRY_CODES:string[];export declare const STATUSES:string[];export declare const HEX_COLORS:string[];export declare const NAMED_COLORS:string[];
1
+ export declare const FIRST_NAMES:string[];export declare const LAST_NAMES:string[];export declare const CITIES:string[];export declare const COUNTRIES:string[];export declare const DOMAINS:string[];export declare const LOREM_WORDS:string[];export declare const COMPANIES:string[];export declare const JOB_TITLES:string[];export declare const US_STATES:string[];export declare const CURRENCIES:string[];export declare const COUNTRY_CODES:string[];export declare const STATUSES:string[];export declare const HEX_COLORS:string[];export declare const NAMED_COLORS:string[];export declare const PRODUCT_CATEGORIES:string[];export declare const PRODUCT_NAMES:string[];export declare const DEPARTMENTS:string[];export declare const PAYMENT_METHODS:string[];export declare const TRANSACTION_TYPES:string[];export declare const TECH_SKILLS:string[];export declare const ORDER_STATUSES:string[];
@@ -1 +1,171 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.NAMED_COLORS=exports.HEX_COLORS=exports.STATUSES=exports.COUNTRY_CODES=exports.CURRENCIES=exports.US_STATES=exports.JOB_TITLES=exports.COMPANIES=exports.LOREM_WORDS=exports.DOMAINS=exports.COUNTRIES=exports.CITIES=exports.LAST_NAMES=exports.FIRST_NAMES=void 0,exports.FIRST_NAMES=["Sombat","Ting","Rajan","Minh","Hiroshi","William","Made","Ravi","John","Kiran","Raj","Wayan","Chaiwat","Aarav","Sita","Zara","Ratna","Ananya","Ha-eun","Siti","Seo-yeon","Mary","Priyanka","Xu","Ali","Priya","Sakura","Ken","Ketut","Soo-hyun","Wang","Guido","Deepa","Fang","James","Mei","Binh","Takeshi","Leela","Thuy","Dewi","Layla","Vijay","Samir","Meera","Jessica","Linda","Malee","Qiang","Yuna","Richard","Margaret","Ming","Vikram","Mai","Rahul","Van","Jennifer","Suresh","Yui","Pan","Barbara","Tim","Lu","Liang","Robert","Fatima","Imran","Ajay","Ren","Liu","Dennis","Lin","Kavya","Agus","Katherine","Anita","Grace","Linus","Jun","Alan","Tarun","Omar","Michael","Dung","Ahmad","Hoa","Hui","Susan","Shinji","Zhou","Linh","Ngoc","Xin","Hassan","Nisha","Patricia","Li","Lei","Sunita","Chen","Anh","Jia","Xiao","Yang","Ji-hoon","Jing","Hedy","Elizabeth","Zhang","Arjun","Yuki","Ada","Edsger","Nong","Lynn","Anjali","Nguyen","Sora","Mieko","Nyoman","Jin","Aisha","Bayu","Tariq","Daiki","David","Rani","Tran","Haruki","Dae-hyun","Dao","Rama","Aiko","Min-jun","Zhu","Radia","Wei","Sophia","Lucas","Emma","Liam","Olivia","Noah","Elena","Mateo","Chloe","Alexander","Aria","Leo"],exports.LAST_NAMES=["Chen","Smith","Thompson","Shah","Thai","Perlman","Brown","Hsu","Turing","Sharma","Purnama","Lopez","Williams","Davis","Liao","Xu","Martin","Dhawan","Yoon","Tan","Yamamoto","Iyer","Phung","Gonzalez","Huang","Hu","Vo","Shetty","Le","Wijaya","Jackson","Ly","Anderson","Pratama","Lovelace","Martinez","Dang","Ma","Hopper","Naidu","Goh","Hamilton","Duong","Taylor","Song","Surya","Singh","Jiang","Cho","Zhang","Pham","Teo","van Rossum","Patel","Lam","Jang","Rodriguez","Miller","Torvalds","Hidayat","Menon","Thomas","Hernandez","Reddy","Wong","Tripathi","Lim","Kumar","Bhaskar","Rajan","Chang","Ong","Vu","Nair","Sun","Do","Bhatia","Garcia","Mishra","Rao","Choi","Phan","Zhu","Nguyen","Kim","Putra","Malhotra","Nakamura","Kang","Wilson","Huynh","Tanaka","Kusuma","Jung","Mehta","Perez","Arora","Chu","Moore","Li","Yang","Park","Ko","Watanabe","Bui","Liu","Ninh","Jones","Johnson","Guo","Ngo","Ito","Takahashi","Grover","Shen","Yeh","Lee","Gupta","Wang","Wu","Verma","Suzuki","White","Lu","Pillai","Lin","Joshi","Tran","Chawla","Zhou","Desai"],exports.CITIES=["Hyderabad","Yangon","Medan","Minneapolis","Faisalabad","Yokohama","Nha Trang","Hong Kong","Phoenix","Delhi","Chennai","Denver","Guangzhou","Davao City","Chiang Mai","Atlanta","Manila","Naypyidaw","Sylhet","Phuket","Incheon","New York","Daejeon","Yogyakarta","Colombo","Kanpur","Portland","Vientiane","Dublin","Mandalay","Hat Yai","Chengdu","Lisbon","Paris","Bandung","Kathmandu","Karachi","Qingdao","Da Nang","Seoul","Hanoi","Berlin","Chicago","Sydney","Quezon City","Mumbai","Vizag","Coimbatore","Lahore","Dhaka","Shenzhen","Phnom Penh","Navi Mumbai","Fuzhou","Kuala Lumpur","Taipei","Zurich","Bangkok","Makati","Chittagong","Daegu","Jaipur","Oslo","Islamabad","Dalian","Kolkata","Penang","Johor Bahru","Singapore","Ulsan","Macau","Pune","Pattaya","Siem Reap","Cebu City","Lucknow","Rome","Surabaya","Stockholm","Los Angeles","Osaka","Sapporo","Fukuoka","Rajshahi","Tokyo","Vancouver","San Francisco","Nagoya","Busan","Jakarta","Guangxi","London","Kaohsiung","Xiamen","Male","Nashville","Warsaw","Madrid","Indore","Boston","Amsterdam","Shanghai","Taichung","Raleigh","Miami","Jeju","Cheongju","Bangalore","Ahmedabad","Haiphong","Ho Chi Minh City","Gwangju","Rawalpindi","Toronto","Seville","Kyoto","Austin","Suwon","Seattle","Beijing","Nakhon Ratchasima","Nagpur"],exports.COUNTRIES=["Japan","United States","Bhutan","Belgium","Myanmar","Kazakhstan","Mexico","Bangladesh","United Kingdom","South Africa","Indonesia","Vietnam","South Korea","Germany","Romania","Italy","Spain","China","India","Taiwan","Philippines","Singapore","Canada","Pakistan","Hungary","Maldives","Switzerland","Macau","Portugal","Sri Lanka","Malaysia","Netherlands","Turkmenistan","Brunei","Brazil","Greece","Uzbekistan","Cambodia","France","Australia","Mongolia","Poland","Kyrgyzstan","Tajikistan","Norway","Sweden","Ireland","Austria","Denmark","Laos","Nepal","Thailand","Finland","Hong Kong","Czech Republic","Timor-Leste","New Zealand"],exports.DOMAINS=["outlook.com","nus.edu.sg","ust.hk","iitb.ac.in","acme.io","ac.sg","mail.ru","163.com","outlook.kr","tech.asia","startup.io","proton.me","sohu.com","gmail.com","kyoto-u.ac.jp","example.com","naver.com","protonmail.com","hanmail.net","globex.org","tudelft.nl","company.com","yahoo.com","126.com","daum.net","initech.net","hkbu.edu.hk","yahoo.co.jp","qq.com","nthu.edu.tw","sina.com","innovate.sg","zoho.com"],exports.LOREM_WORDS=["schema","nu","worker","alpha","cache","edge","async","chi","service","packet","scale","upsilon","scrum","node","peace","deploy","epsilon","lambda","record","pi","column","module","omicron","query","buffer","persistence","comet","joy","integrity","galaxy","token","spirit","socket","devops","harmony","backup","agile","render","await","field","aurora","nature","gamma","cloud","omega","mu","orbit","delta","kindness","tau","row","compassion","theta","beta","balance","wisdom","rho","kanban","kappa","session","compile","phi","stream","queue","event","pixel","resilience","nebula","iota","index","cluster","xi","eta","signal","zeta","fetch","sigma","psi","prism","nexus"],exports.COMPANIES=["Apex Solutions","Vortex Digital","Nexus Systems","Horizon Labs","Zenith Global","Quantum Dynamics","Starlight Media","Alpha Robotics","Pinnacle Financial","BlueWave Tech","Elevate Innovations","Pulse Health","Echo Stream","Stratum Capital","Beacon Analytics","Solaris Energy","Vertex Cloud","Catalyst Corp","Synergy Ventures","Omega Group","Hyperion Logic","Aegis Security","Terra Industries","Prism Data","Spectra Works","Novus Labs","Orbit Software","Forge Interactive","Crestline Global","Ironclad Partners","Acme Corp","Globex Corporation","Initech LLC","Soylent Industries","Umbrella Tech"],exports.JOB_TITLES=["Software Engineer","Product Manager","UX/UI Designer","DevOps Specialist","Data Scientist","Engineering Manager","Account Executive","Marketing Director","Content Strategist","Customer Success Lead","Financial Analyst","Operations Lead","HR Generalist","QA Automation Engineer","Solutions Architect","Security Specialist","Chief Technology Officer","VP of Product","Database Administrator","Scrum Master","Technical Writer","Brand Manager","Legal Counsel","Research Scientist","Sales Director"],exports.US_STATES=["California","New York","Texas","Florida","Washington","Illinois","Pennsylvania","Ohio","Georgia","North Carolina","Michigan","New Jersey","Virginia","Colorado","Arizona","Massachusetts","Tennessee","Indiana","Missouri","Maryland","Wisconsin","Minnesota","Oregon","South Carolina","Alabama","Louisiana","Kentucky","Utah"],exports.CURRENCIES=["USD","EUR","GBP","JPY","CAD","AUD","CHF","CNY","INR","SGD","NZD","BRL","SEK","KRW","MXN","ZAR","HKD","NOK","AED","SAR"],exports.COUNTRY_CODES=["US","GB","CA","DE","FR","JP","AU","IN","BR","SG","NL","IT","ES","SE","CH","KR","MX","NZ","ZA","AE","SA","NO","DK","FI","IE","PL","PT","BE","AT","ID"],exports.STATUSES=["active","inactive","pending","completed","cancelled","archived","suspended","draft","processing","approved","rejected"],exports.HEX_COLORS=["#3b82f6","#10b981","#ef4444","#f59e0b","#8b5cf6","#ec4899","#06b6d4","#6366f1","#14b8a6","#f97316","#84cc16","#a855f7","#0ea5e9","#64748b","#d946ef","#1e293b","#047857","#b91c1c","#1d4ed8","#4338ca"],exports.NAMED_COLORS=["Emerald","Indigo","Amber","Rose","Cyan","Violet","Sky","Slate","Teal","Fuchsia","Crimson","Navy","Coral","Bronze","Charcoal","Mint","Lavender","Ruby","Cobalt"];
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ORDER_STATUSES = exports.TECH_SKILLS = exports.TRANSACTION_TYPES = exports.PAYMENT_METHODS = exports.DEPARTMENTS = exports.PRODUCT_NAMES = exports.PRODUCT_CATEGORIES = exports.NAMED_COLORS = exports.HEX_COLORS = exports.STATUSES = exports.COUNTRY_CODES = exports.CURRENCIES = exports.US_STATES = exports.JOB_TITLES = exports.COMPANIES = exports.LOREM_WORDS = exports.DOMAINS = exports.COUNTRIES = exports.CITIES = exports.LAST_NAMES = exports.FIRST_NAMES = void 0;
4
+ exports.FIRST_NAMES = [
5
+ "Sombat", "Ting", "Rajan", "Minh", "Hiroshi", "William", "Made", "Ravi", "John", "Kiran",
6
+ "Raj", "Wayan", "Chaiwat", "Aarav", "Sita", "Zara", "Ratna", "Ananya", "Ha-eun", "Siti",
7
+ "Seo-yeon", "Mary", "Priyanka", "Xu", "Ali", "Priya", "Sakura", "Ken", "Ketut", "Soo-hyun",
8
+ "Wang", "Guido", "Deepa", "Fang", "James", "Mei", "Binh", "Takeshi", "Leela", "Thuy",
9
+ "Dewi", "Layla", "Vijay", "Samir", "Meera", "Jessica", "Linda", "Malee", "Qiang", "Yuna",
10
+ "Richard", "Margaret", "Ming", "Vikram", "Mai", "Rahul", "Van", "Jennifer", "Suresh", "Yui",
11
+ "Pan", "Barbara", "Tim", "Lu", "Liang", "Robert", "Fatima", "Imran", "Ajay", "Ren",
12
+ "Liu", "Dennis", "Lin", "Kavya", "Agus", "Katherine", "Anita", "Grace", "Linus", "Jun",
13
+ "Alan", "Tarun", "Omar", "Michael", "Dung", "Ahmad", "Hoa", "Hui", "Susan", "Shinji",
14
+ "Zhou", "Linh", "Ngoc", "Xin", "Hassan", "Nisha", "Patricia", "Li", "Lei", "Sunita",
15
+ "Chen", "Anh", "Jia", "Xiao", "Yang", "Ji-hoon", "Jing", "Hedy", "Elizabeth", "Zhang",
16
+ "Arjun", "Yuki", "Ada", "Edsger", "Nong", "Lynn", "Anjali", "Nguyen", "Sora", "Mieko",
17
+ "Nyoman", "Jin", "Aisha", "Bayu", "Tariq", "Daiki", "David", "Rani", "Tran", "Haruki",
18
+ "Dae-hyun", "Dao", "Rama", "Aiko", "Min-jun", "Zhu", "Radia", "Wei", "Sophia", "Lucas",
19
+ "Emma", "Liam", "Olivia", "Noah", "Elena", "Mateo", "Chloe", "Alexander", "Aria", "Leo"
20
+ ];
21
+ exports.LAST_NAMES = [
22
+ "Chen", "Smith", "Thompson", "Shah", "Thai", "Perlman", "Brown", "Hsu", "Turing", "Sharma",
23
+ "Purnama", "Lopez", "Williams", "Davis", "Liao", "Xu", "Martin", "Dhawan", "Yoon", "Tan",
24
+ "Yamamoto", "Iyer", "Phung", "Gonzalez", "Huang", "Hu", "Vo", "Shetty", "Le", "Wijaya",
25
+ "Jackson", "Ly", "Anderson", "Pratama", "Lovelace", "Martinez", "Dang", "Ma", "Hopper", "Naidu",
26
+ "Goh", "Hamilton", "Duong", "Taylor", "Song", "Surya", "Singh", "Jiang", "Cho", "Zhang",
27
+ "Pham", "Teo", "van Rossum", "Patel", "Lam", "Jang", "Rodriguez", "Miller", "Torvalds", "Hidayat",
28
+ "Menon", "Thomas", "Hernandez", "Reddy", "Wong", "Tripathi", "Lim", "Kumar", "Bhaskar", "Rajan",
29
+ "Chang", "Ong", "Vu", "Nair", "Sun", "Do", "Bhatia", "Garcia", "Mishra", "Rao",
30
+ "Choi", "Phan", "Zhu", "Nguyen", "Kim", "Putra", "Malhotra", "Nakamura", "Kang", "Wilson",
31
+ "Huynh", "Tanaka", "Kusuma", "Jung", "Mehta", "Perez", "Arora", "Chu", "Moore", "Li",
32
+ "Yang", "Park", "Ko", "Watanabe", "Bui", "Liu", "Ninh", "Jones", "Johnson", "Guo",
33
+ "Ngo", "Ito", "Takahashi", "Grover", "Shen", "Yeh", "Lee", "Gupta", "Wang", "Wu",
34
+ "Verma", "Suzuki", "White", "Lu", "Pillai", "Lin", "Joshi", "Tran", "Chawla", "Zhou", "Desai"
35
+ ];
36
+ exports.CITIES = [
37
+ "Hyderabad", "Yangon", "Medan", "Minneapolis", "Faisalabad", "Yokohama", "Nha Trang",
38
+ "Hong Kong", "Phoenix", "Delhi", "Chennai", "Denver", "Guangzhou", "Davao City",
39
+ "Chiang Mai", "Atlanta", "Manila", "Naypyidaw", "Sylhet", "Phuket", "Incheon",
40
+ "New York", "Daejeon", "Yogyakarta", "Colombo", "Kanpur", "Portland", "Vientiane",
41
+ "Dublin", "Mandalay", "Hat Yai", "Chengdu", "Lisbon", "Paris", "Bandung",
42
+ "Kathmandu", "Karachi", "Qingdao", "Da Nang", "Seoul", "Hanoi", "Berlin",
43
+ "Chicago", "Sydney", "Quezon City", "Mumbai", "Vizag", "Coimbatore", "Lahore",
44
+ "Dhaka", "Shenzhen", "Phnom Penh", "Navi Mumbai", "Fuzhou", "Kuala Lumpur", "Taipei",
45
+ "Zurich", "Bangkok", "Makati", "Chittagong", "Daegu", "Jaipur", "Oslo",
46
+ "Islamabad", "Dalian", "Kolkata", "Penang", "Johor Bahru", "Singapore", "Ulsan",
47
+ "Macau", "Pune", "Pattaya", "Siem Reap", "Cebu City", "Lucknow", "Rome",
48
+ "Surabaya", "Stockholm", "Los Angeles", "Osaka", "Sapporo", "Fukuoka", "Rajshahi",
49
+ "Tokyo", "Vancouver", "San Francisco", "Nagoya", "Busan", "Jakarta", "Guangxi",
50
+ "London", "Kaohsiung", "Xiamen", "Male", "Nashville", "Warsaw", "Madrid",
51
+ "Indore", "Boston", "Amsterdam", "Shanghai", "Taichung", "Raleigh", "Miami",
52
+ "Jeju", "Cheongju", "Bangalore", "Ahmedabad", "Haiphong", "Ho Chi Minh City", "Gwangju",
53
+ "Rawalpindi", "Toronto", "Seville", "Kyoto", "Austin", "Suwon", "Seattle",
54
+ "Beijing", "Nakhon Ratchasima", "Nagpur"
55
+ ];
56
+ exports.COUNTRIES = [
57
+ "Japan", "United States", "Bhutan", "Belgium", "Myanmar", "Kazakhstan", "Mexico",
58
+ "Bangladesh", "United Kingdom", "South Africa", "Indonesia", "Vietnam", "South Korea", "Germany",
59
+ "Romania", "Italy", "Spain", "China", "India", "Taiwan", "Philippines",
60
+ "Singapore", "Canada", "Pakistan", "Hungary", "Maldives", "Switzerland", "Macau",
61
+ "Portugal", "Sri Lanka", "Malaysia", "Netherlands", "Turkmenistan", "Brunei", "Brazil",
62
+ "Greece", "Uzbekistan", "Cambodia", "France", "Australia", "Mongolia", "Poland",
63
+ "Kyrgyzstan", "Tajikistan", "Norway", "Sweden", "Ireland", "Austria", "Denmark",
64
+ "Laos", "Nepal", "Thailand", "Finland", "Hong Kong", "Czech Republic", "Timor-Leste", "New Zealand"
65
+ ];
66
+ exports.DOMAINS = [
67
+ "outlook.com", "nus.edu.sg", "ust.hk", "iitb.ac.in", "acme.io", "ac.sg", "mail.ru", "163.com",
68
+ "outlook.kr", "tech.asia", "startup.io", "proton.me", "sohu.com", "gmail.com", "kyoto-u.ac.jp",
69
+ "example.com", "naver.com", "protonmail.com", "hanmail.net", "globex.org", "tudelft.nl", "company.com",
70
+ "yahoo.com", "126.com", "daum.net", "initech.net", "hkbu.edu.hk", "yahoo.co.jp", "qq.com", "nthu.edu.tw",
71
+ "sina.com", "innovate.sg", "zoho.com"
72
+ ];
73
+ exports.LOREM_WORDS = [
74
+ "schema", "nu", "worker", "alpha", "cache", "edge", "async", "chi", "service", "packet",
75
+ "scale", "upsilon", "scrum", "node", "peace", "deploy", "epsilon", "lambda", "record", "pi",
76
+ "column", "module", "omicron", "query", "buffer", "persistence", "comet", "joy", "integrity", "galaxy",
77
+ "token", "spirit", "socket", "devops", "harmony", "backup", "agile", "render", "await", "field",
78
+ "aurora", "nature", "gamma", "cloud", "omega", "mu", "orbit", "delta", "kindness", "tau",
79
+ "row", "compassion", "theta", "beta", "balance", "wisdom", "rho", "kanban", "kappa", "session",
80
+ "compile", "phi", "stream", "queue", "event", "pixel", "resilience", "nebula", "iota", "index",
81
+ "cluster", "xi", "eta", "signal", "zeta", "fetch", "sigma", "psi", "prism", "nexus"
82
+ ];
83
+ exports.COMPANIES = [
84
+ "Apex Solutions", "Vortex Digital", "Nexus Systems", "Horizon Labs", "Zenith Global",
85
+ "Quantum Dynamics", "Starlight Media", "Alpha Robotics", "Pinnacle Financial", "BlueWave Tech",
86
+ "Elevate Innovations", "Pulse Health", "Echo Stream", "Stratum Capital", "Beacon Analytics",
87
+ "Solaris Energy", "Vertex Cloud", "Catalyst Corp", "Synergy Ventures", "Omega Group",
88
+ "Hyperion Logic", "Aegis Security", "Terra Industries", "Prism Data", "Spectra Works",
89
+ "Novus Labs", "Orbit Software", "Forge Interactive", "Crestline Global", "Ironclad Partners",
90
+ "Acme Corp", "Globex Corporation", "Initech LLC", "Soylent Industries", "Umbrella Tech"
91
+ ];
92
+ exports.JOB_TITLES = [
93
+ "Software Engineer", "Product Manager", "UX/UI Designer", "DevOps Specialist",
94
+ "Data Scientist", "Engineering Manager", "Account Executive", "Marketing Director",
95
+ "Content Strategist", "Customer Success Lead", "Financial Analyst", "Operations Lead",
96
+ "HR Generalist", "QA Automation Engineer", "Solutions Architect", "Security Specialist",
97
+ "Chief Technology Officer", "VP of Product", "Database Administrator", "Scrum Master",
98
+ "Technical Writer", "Brand Manager", "Legal Counsel", "Research Scientist", "Sales Director"
99
+ ];
100
+ exports.US_STATES = [
101
+ "California", "New York", "Texas", "Florida", "Washington", "Illinois", "Pennsylvania",
102
+ "Ohio", "Georgia", "North Carolina", "Michigan", "New Jersey", "Virginia", "Colorado",
103
+ "Arizona", "Massachusetts", "Tennessee", "Indiana", "Missouri", "Maryland", "Wisconsin",
104
+ "Minnesota", "Oregon", "South Carolina", "Alabama", "Louisiana", "Kentucky", "Utah"
105
+ ];
106
+ exports.CURRENCIES = [
107
+ "USD", "EUR", "GBP", "JPY", "CAD", "AUD", "CHF", "CNY", "INR", "SGD",
108
+ "NZD", "BRL", "SEK", "KRW", "MXN", "ZAR", "HKD", "NOK", "AED", "SAR"
109
+ ];
110
+ exports.COUNTRY_CODES = [
111
+ "US", "GB", "CA", "DE", "FR", "JP", "AU", "IN", "BR", "SG",
112
+ "NL", "IT", "ES", "SE", "CH", "KR", "MX", "NZ", "ZA", "AE",
113
+ "SA", "NO", "DK", "FI", "IE", "PL", "PT", "BE", "AT", "ID"
114
+ ];
115
+ exports.STATUSES = [
116
+ "active", "inactive", "pending", "completed", "cancelled",
117
+ "archived", "suspended", "draft", "processing", "approved", "rejected"
118
+ ];
119
+ exports.HEX_COLORS = [
120
+ "#3b82f6", "#10b981", "#ef4444", "#f59e0b", "#8b5cf6",
121
+ "#ec4899", "#06b6d4", "#6366f1", "#14b8a6", "#f97316",
122
+ "#84cc16", "#a855f7", "#0ea5e9", "#64748b", "#d946ef",
123
+ "#1e293b", "#047857", "#b91c1c", "#1d4ed8", "#4338ca"
124
+ ];
125
+ exports.NAMED_COLORS = [
126
+ "Emerald", "Indigo", "Amber", "Rose", "Cyan", "Violet",
127
+ "Sky", "Slate", "Teal", "Fuchsia", "Crimson", "Navy",
128
+ "Coral", "Bronze", "Charcoal", "Mint", "Lavender", "Ruby", "Cobalt"
129
+ ];
130
+ exports.PRODUCT_CATEGORIES = [
131
+ "Electronics", "Computers & Accessories", "Apparel & Footwear", "Home & Kitchen",
132
+ "Health & Wellness", "Books & Media", "Sports & Outdoors", "Beauty & Personal Care",
133
+ "Toys & Games", "Automotive & Industrial", "Groceries & Gourmet", "Office Products"
134
+ ];
135
+ exports.PRODUCT_NAMES = [
136
+ "Wireless Noise-Canceling Earbuds", "Ergonomic Mechanical Keyboard", "Ultra HD 4K IPS Monitor",
137
+ "Organic Fair-Trade Coffee Beans", "Stainless Steel Thermal Tumbler", "Merino Wool Athletic Socks",
138
+ "Waterproof Smart Fitness Watch", "Non-Stick Ceramic Frying Pan", "Hydrating Hyaluronic Facial Serum",
139
+ "Portable Bluetooth Outdoor Speaker", "Compact Cordless Handheld Vacuum", "Memory Foam Contoured Pillow",
140
+ "Natural Soy Aromatherapy Candle", "Adjustable Standing Desk Converter", "High-Speed 65W GaN Fast Charger",
141
+ "Full-Grain Leather Bi-Fold Wallet", "Polarized Lightweight Sunglasses", "Recycled Aluminum Laptop Stand",
142
+ "Organic Green Matcha Tea Powder", "Precision Kitchen Digital Scale", "Active Noise Canceling Headphones",
143
+ "Tempered Glass Screen Protector", "Braided Nylon Heavy-Duty Cable", "Plant-Based Protein Powder",
144
+ "Ceramic Essential Oil Diffuser", "Stainless Steel Chef Knife 8-Inch", "Resistance Band Exercise Set",
145
+ "Double-Wall Insulated Mug", "Minimalist Water-Resistant Backpack", "Rechargeable LED Desk Lamp"
146
+ ];
147
+ exports.DEPARTMENTS = [
148
+ "Engineering", "Product Management", "Design & UX", "Marketing & Growth",
149
+ "Sales & Business Development", "Customer Support", "Human Resources",
150
+ "Finance & Accounting", "Legal & Compliance", "Operations & Logistics",
151
+ "Data & Analytics", "Quality Assurance", "Information Security", "Corporate Strategy"
152
+ ];
153
+ exports.PAYMENT_METHODS = [
154
+ "Credit Card", "Debit Card", "PayPal", "Apple Pay", "Google Pay",
155
+ "Bank Transfer", "Stripe Checkout", "Klarna Pay in 4", "Cash on Delivery",
156
+ "Affirm", "Afterpay", "Wire Transfer", "Venmo"
157
+ ];
158
+ exports.TRANSACTION_TYPES = [
159
+ "purchase", "refund", "subscription", "authorization", "capture",
160
+ "chargeback", "payout", "transfer", "adjustment", "deposit", "withdrawal"
161
+ ];
162
+ exports.TECH_SKILLS = [
163
+ "TypeScript", "JavaScript", "Python", "Rust", "Go", "SQL", "PostgreSQL",
164
+ "SQLite", "MySQL", "React", "Vue", "Next.js", "Node.js", "GraphQL",
165
+ "Redis", "Docker", "Kubernetes", "AWS", "Cloudflare", "Linux", "Git",
166
+ "TailwindCSS", "Terraform", "Kafka", "Elasticsearch", "Prometheus"
167
+ ];
168
+ exports.ORDER_STATUSES = [
169
+ "pending", "confirmed", "processing", "shipped", "out_for_delivery",
170
+ "delivered", "cancelled", "refunded", "on_hold", "failed"
171
+ ];
@@ -1 +1 @@
1
- import type {ColumnInfo,ForeignKeyInfo,TableInfoData} from '../db/index';import{type ColumnGeneratorConfig,type ColumnPlan} from './types';export interface OrderingConstraint{after?:{column:string;orEqual:boolean;};before?:{column:string;orEqual:boolean;};}export interface NumericConstraint{min?:number;max?:number;}export interface CheckInfo{columnAllowed:Map<string,string[]>;columnRange:Map<string,NumericConstraint>;jsonAllowed:Map<string,Map<string,string[]>>;ordering:Map<string,OrderingConstraint>;}export declare const normName:(s:string)=>string;export declare function isTimestampName(name:string):boolean;export declare function findInMap<T>(map:Map<string,T>,colName:string):T|undefined;export declare function extractCheckExprs(sql:string):string[];export declare function parseChecks(sql:string|null):CheckInfo;export declare function detectPlan(col:ColumnInfo,fk:ForeignKeyInfo|null):ColumnPlan;export declare function buildColumnConfigs(info:TableInfoData):ColumnGeneratorConfig[];export declare function sanitizeColumnPlan(raw:unknown):ColumnPlan|null;
1
+ import type {ColumnInfo,ForeignKeyInfo,TableInfoData} from '../db/index';import{type ColumnGeneratorConfig,type ColumnPlan} from './types';export interface OrderingConstraint{after?:{column:string;orEqual:boolean;};before?:{column:string;orEqual:boolean;};}export interface NumericConstraint{min?:number;max?:number;}export interface LengthConstraint{min?:number;max?:number;exact?:number;}export interface CheckInfo{columnAllowed:Map<string,string[]>;columnRange:Map<string,NumericConstraint>;columnLength:Map<string,LengthConstraint>;jsonAllowed:Map<string,Map<string,string[]>>;ordering:Map<string,OrderingConstraint>;}export declare const normName:(s:string)=>string;export declare function isTimestampName(name:string):boolean;export declare function findInMap<T>(map:Map<string,T>,colName:string):T|undefined;export declare function extractCheckExprs(sql:string):string[];export declare function parseChecks(sql:string|null):CheckInfo;export declare function detectPlan(col:ColumnInfo,fk:ForeignKeyInfo|null):ColumnPlan;export declare function buildColumnConfigs(info:TableInfoData):ColumnGeneratorConfig[];export declare function sanitizeColumnPlan(raw:unknown):ColumnPlan|null;