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,100 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.modifyTableStructureSync=function(db,table,transformColumns,renamedOldCol,renamedNewCol){const rawCols=db.prepare(`PRAGMA table_info(${(0,generator_1.quoteIdentifier)(table)})`).all();if(!rawCols.length)throw new Error(`Table "${table}" does not exist.`);const fks=db.prepare(`PRAGMA foreign_key_list(${(0,generator_1.quoteIdentifier)(table)})`).all(),indexRows=db.prepare(`PRAGMA index_list(${(0,generator_1.quoteIdentifier)(table)})`).all(),uniqueCols=new Set;for(const ix of indexRows)if(ix.unique){const ixCols=db.prepare(`PRAGMA index_info(${(0,generator_1.quoteIdentifier)(ix.name)})`).all().map(c=>c.name);1===ixCols.length&&uniqueCols.add(ixCols[0])}const userIndexes=[];for(const ix of indexRows)if("c"===ix.origin){const ixCols=db.prepare(`PRAGMA index_info(${(0,generator_1.quoteIdentifier)(ix.name)})`).all().map(c=>c.name);let ixName=ix.name;renamedOldCol&&renamedNewCol&&(ixName===`idx_${table}_${renamedOldCol}`?ixName=`idx_${table}_${renamedNewCol}`:ixName===`idx_${table}_${renamedOldCol}_unique`&&(ixName=`idx_${table}_${renamedNewCol}_unique`)),userIndexes.push({name:ixName,unique:!!ix.unique,columns:ixCols.map(c=>renamedOldCol&&renamedNewCol&&c===renamedOldCol?renamedNewCol:c)})}const currentCols=rawCols.map(c=>{const existingFk=fks.find(f=>f.from===c.name);return{name:c.name,type:c.type,primaryKey:c.pk>0,notNull:!!c.notnull,unique:uniqueCols.has(c.name),defaultValue:c.dflt_value,foreignKey:existingFk?{table:existingFk.table,column:existingFk.to??""}:null}}),newCols=transformColumns(currentCols),tempTable=`_admindb_tmp_${table}_${Date.now()}`,createSql=(0,generator_1.generateCreateTable)(tempTable,newCols),oldColMap=new Set(rawCols.map(c=>c.name)),matchingOldCols=[],matchingNewCols=[];for(const nc of newCols){let sourceColName=nc.name;renamedOldCol&&renamedNewCol&&nc.name===renamedNewCol&&(sourceColName=renamedOldCol),oldColMap.has(sourceColName)&&(matchingOldCols.push((0,generator_1.quoteIdentifier)(sourceColName)),matchingNewCols.push((0,generator_1.quoteIdentifier)(nc.name)))}db.exec("PRAGMA foreign_keys = OFF;"),db.exec("BEGIN TRANSACTION;");try{db.exec(createSql),matchingOldCols.length>0&&db.exec(`INSERT INTO ${(0,generator_1.quoteIdentifier)(tempTable)} (${matchingNewCols.join(", ")}) SELECT ${matchingOldCols.join(", ")} FROM ${(0,generator_1.quoteIdentifier)(table)};`),db.exec(`DROP TABLE ${(0,generator_1.quoteIdentifier)(table)};`),db.exec(`ALTER TABLE ${(0,generator_1.quoteIdentifier)(tempTable)} RENAME TO ${(0,generator_1.quoteIdentifier)(table)};`);for(const ix of userIndexes){const uq=ix.unique?"UNIQUE ":"",ixColsStr=ix.columns.map(generator_1.quoteIdentifier).join(", ");try{db.exec(`CREATE ${uq}INDEX IF NOT EXISTS ${(0,generator_1.quoteIdentifier)(ix.name)} ON ${(0,generator_1.quoteIdentifier)(table)} (${ixColsStr});`)}catch{}}if(db.prepare("PRAGMA foreign_key_check;").all().length>0)throw new Error("Foreign key constraint check failed after schema modification.");return db.exec("COMMIT;"),{changes:1}}catch(err){try{db.exec("ROLLBACK;")}catch{}try{db.exec(`DROP TABLE IF EXISTS ${(0,generator_1.quoteIdentifier)(tempTable)};`)}catch{}throw err}finally{db.exec("PRAGMA foreign_keys = ON;")}};const generator_1=require("../sql/generator");
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.modifyTableStructureSync = modifyTableStructureSync;
4
+ const generator_1 = require("../sql/generator");
5
+ function modifyTableStructureSync(db, table, transformColumns, renamedOldCol, renamedNewCol) {
6
+ const rawCols = db.prepare(`PRAGMA table_info(${(0, generator_1.quoteIdentifier)(table)})`).all();
7
+ if (!rawCols.length)
8
+ throw new Error(`Table "${table}" does not exist.`);
9
+ const fks = db.prepare(`PRAGMA foreign_key_list(${(0, generator_1.quoteIdentifier)(table)})`).all();
10
+ const indexRows = db.prepare(`PRAGMA index_list(${(0, generator_1.quoteIdentifier)(table)})`).all();
11
+ const uniqueCols = new Set();
12
+ for (const ix of indexRows) {
13
+ if (ix.unique) {
14
+ const ixCols = db.prepare(`PRAGMA index_info(${(0, generator_1.quoteIdentifier)(ix.name)})`).all().map((c) => c.name);
15
+ if (ixCols.length === 1)
16
+ uniqueCols.add(ixCols[0]);
17
+ }
18
+ }
19
+ const userIndexes = [];
20
+ for (const ix of indexRows) {
21
+ if (ix.origin === 'c') {
22
+ const ixCols = db.prepare(`PRAGMA index_info(${(0, generator_1.quoteIdentifier)(ix.name)})`).all().map((c) => c.name);
23
+ let ixName = ix.name;
24
+ if (renamedOldCol && renamedNewCol) {
25
+ if (ixName === `idx_${table}_${renamedOldCol}`) {
26
+ ixName = `idx_${table}_${renamedNewCol}`;
27
+ }
28
+ else if (ixName === `idx_${table}_${renamedOldCol}_unique`) {
29
+ ixName = `idx_${table}_${renamedNewCol}_unique`;
30
+ }
31
+ }
32
+ userIndexes.push({
33
+ name: ixName,
34
+ unique: Boolean(ix.unique),
35
+ columns: ixCols.map((c) => (renamedOldCol && renamedNewCol && c === renamedOldCol ? renamedNewCol : c)),
36
+ });
37
+ }
38
+ }
39
+ const currentCols = rawCols.map((c) => {
40
+ const existingFk = fks.find((f) => f.from === c.name);
41
+ return {
42
+ name: c.name,
43
+ type: c.type,
44
+ primaryKey: c.pk > 0,
45
+ notNull: Boolean(c.notnull),
46
+ unique: uniqueCols.has(c.name),
47
+ defaultValue: c.dflt_value,
48
+ foreignKey: existingFk ? { table: existingFk.table, column: existingFk.to ?? '' } : null,
49
+ };
50
+ });
51
+ const newCols = transformColumns(currentCols);
52
+ const tempTable = `_admindb_tmp_${table}_${Date.now()}`;
53
+ const createSql = (0, generator_1.generateCreateTable)(tempTable, newCols);
54
+ const oldColMap = new Set(rawCols.map((c) => c.name));
55
+ const matchingOldCols = [];
56
+ const matchingNewCols = [];
57
+ for (const nc of newCols) {
58
+ const sourceColName = renamedOldCol && renamedNewCol && nc.name === renamedNewCol ? renamedOldCol : nc.name;
59
+ if (oldColMap.has(sourceColName)) {
60
+ matchingOldCols.push((0, generator_1.quoteIdentifier)(sourceColName));
61
+ matchingNewCols.push((0, generator_1.quoteIdentifier)(nc.name));
62
+ }
63
+ }
64
+ db.exec('PRAGMA foreign_keys = OFF;\nBEGIN TRANSACTION;');
65
+ try {
66
+ db.exec(createSql);
67
+ if (matchingOldCols.length > 0) {
68
+ db.exec(`INSERT INTO ${(0, generator_1.quoteIdentifier)(tempTable)} (${matchingNewCols.join(', ')}) SELECT ${matchingOldCols.join(', ')} FROM ${(0, generator_1.quoteIdentifier)(table)};`);
69
+ }
70
+ db.exec(`DROP TABLE ${(0, generator_1.quoteIdentifier)(table)};`);
71
+ db.exec(`ALTER TABLE ${(0, generator_1.quoteIdentifier)(tempTable)} RENAME TO ${(0, generator_1.quoteIdentifier)(table)};`);
72
+ for (const ix of userIndexes) {
73
+ const uq = ix.unique ? 'UNIQUE ' : '';
74
+ const ixColsStr = ix.columns.map(generator_1.quoteIdentifier).join(', ');
75
+ try {
76
+ db.exec(`CREATE ${uq}INDEX IF NOT EXISTS ${(0, generator_1.quoteIdentifier)(ix.name)} ON ${(0, generator_1.quoteIdentifier)(table)} (${ixColsStr});`);
77
+ }
78
+ catch { }
79
+ }
80
+ if (db.prepare('PRAGMA foreign_key_check;').all().length > 0) {
81
+ throw new Error('Foreign key constraint check failed after schema modification.');
82
+ }
83
+ db.exec('COMMIT;');
84
+ return { changes: 1 };
85
+ }
86
+ catch (err) {
87
+ try {
88
+ db.exec('ROLLBACK;');
89
+ }
90
+ catch { }
91
+ try {
92
+ db.exec(`DROP TABLE IF EXISTS ${(0, generator_1.quoteIdentifier)(tempTable)};`);
93
+ }
94
+ catch { }
95
+ throw err;
96
+ }
97
+ finally {
98
+ db.exec('PRAGMA foreign_keys = ON;');
99
+ }
100
+ }
@@ -1 +1 @@
1
- import type {Logger} from '../utils/logger';import{type ColumnDef,type IndexDef} from '../sql/generator';import type {DatabaseDialect,IDatabase,MutationResult,PostgresOptions,QueryOptions,ReferencingTableInfo,Result,RowFilters,SavedQuery,SchemaInfo,SQLInputValue,TableInfoData,TableListItem,WhereClause} from './types';export declare class PostgresDatabase implements IDatabase{private pool;private logger;readonly path:string;readonly isReadOnly:boolean;readonly dialect:DatabaseDialect;readonly schema:string;constructor(connection:string|PostgresOptions,logger:Logger,options?:PostgresOptions);private sanitizeConnectionString;private readonlyBlocked;close():Promise<void>;private tryRun;private transaction;private initSchema;hasMultipleStatements(sql:string):boolean;all(sql:string,params?:SQLInputValue[]):Promise<Result<unknown[]>>;run(sql:string,params?:SQLInputValue[]):Promise<Result<MutationResult>>;execResult(sql:string):Promise<Result<{changes?:number;}>>;runWrite(sql:string):Promise<Result<{changes?:number;}>>;listTables():Promise<Result<TableListItem[]>>;getTableInfo(table:string):Promise<Result<TableInfoData>>;getRowCount(table:string,filters?:RowFilters):Promise<Result<number>>;getRows(table:string,opts?:QueryOptions):Promise<Result<Record<string,unknown>[]>>;getAllRows(table:string):Promise<Result<Record<string,unknown>[]>>;getRow(table:string,where:WhereClause[]):Promise<Result<Record<string,unknown>|null>>;insertRow(table:string,fields:WhereClause[]):Promise<Result<MutationResult>>;insertRows(table:string,rows:WhereClause[][]):Promise<Result<{inserted:number;skipped:number;}>>;updateRow(table:string,fields:WhereClause[],where:WhereClause[]):Promise<Result<MutationResult>>;updateRows(table:string,rows:{fields:WhereClause[];where:WhereClause[];}[]):Promise<Result<{updated:number;}>>;deleteRow(table:string,where:WhereClause[]):Promise<Result<MutationResult>>;deleteRows(table:string,rows:WhereClause[][]):Promise<Result<{deleted:number;}>>;getRowsByPks(table:string,pks:WhereClause[][]):Promise<Result<Record<string,unknown>[]>>;getRowsByFk(table:string,column:string,value:unknown,limit?:number):Promise<Result<{rows:Record<string,unknown>[];total:number;}>>;getCreateStatement(table:string):Promise<Result<string|null>>;listSavedQueries():Promise<Result<SavedQuery[]>>;saveQuery(name:string,sql:string):Promise<Result<MutationResult>>;deleteSavedQuery(id:string|number):Promise<Result<MutationResult>>;getSchema(table:string):Promise<Result<SchemaInfo>>;getReferencingTables(table:string):Promise<Result<ReferencingTableInfo[]>>;renameTable(oldName:string,newName:string):Promise<Result<{changes?:number;}>>;addColumn(table:string,col:ColumnDef):Promise<Result<{changes?:number;}>>;modifyColumn(table:string,oldColName:string,newColDef:ColumnDef):Promise<Result<{changes?:number;}>>;renameColumn(table:string,oldName:string,newName:string):Promise<Result<{changes?:number;}>>;dropColumn(table:string,column:string):Promise<Result<{changes?:number;}>>;dropTable(table:string):Promise<Result<{changes?:number;}>>;createIndex(table:string,index:IndexDef):Promise<Result<{changes?:number;}>>;dropIndex(indexName:string):Promise<Result<{changes?:number;}>>;}
1
+ import type {Logger} from '../utils/logger';import{type ColumnDef,type IndexDef} from '../sql/generator';import type {DatabaseDialect,IDatabase,MutationResult,PostgresOptions,QueryOptions,ReferencingTableInfo,Result,RowFilters,SavedQuery,SchemaInfo,SQLInputValue,TableInfoData,TableListItem,WhereClause} from './types';export declare class PostgresDatabase implements IDatabase{private pool;private logger;readonly path:string;readonly isReadOnly:boolean;readonly dialect:DatabaseDialect;readonly schema:string;constructor(connection:string|PostgresOptions,logger:Logger,options?:PostgresOptions);private readonlyBlocked;close():Promise<void>;private tryRun;private transaction;private initSchema;hasMultipleStatements(sql:string):boolean;all(sql:string,params?:SQLInputValue[]):Promise<Result<unknown[]>>;run(sql:string,params?:SQLInputValue[]):Promise<Result<MutationResult>>;execResult(sql:string):Promise<Result<{changes?:number;}>>;runWrite(sql:string):Promise<Result<{changes?:number;}>>;listTables():Promise<Result<TableListItem[]>>;getTableInfo(table:string):Promise<Result<TableInfoData>>;getRowCount(table:string,filters?:RowFilters):Promise<Result<number>>;getRows(table:string,opts?:QueryOptions):Promise<Result<Record<string,unknown>[]>>;getAllRows(table:string):Promise<Result<Record<string,unknown>[]>>;getRow(table:string,where:WhereClause[]):Promise<Result<Record<string,unknown>|null>>;insertRow(table:string,fields:WhereClause[]):Promise<Result<MutationResult>>;insertRows(table:string,rows:WhereClause[][]):Promise<Result<{inserted:number;skipped:number;}>>;updateRow(table:string,fields:WhereClause[],where:WhereClause[]):Promise<Result<MutationResult>>;updateRows(table:string,rows:{fields:WhereClause[];where:WhereClause[];}[]):Promise<Result<{updated:number;}>>;deleteRow(table:string,where:WhereClause[]):Promise<Result<MutationResult>>;deleteRows(table:string,rows:WhereClause[][]):Promise<Result<{deleted:number;}>>;getRowsByPks(table:string,pks:WhereClause[][]):Promise<Result<Record<string,unknown>[]>>;getRowsByFk(table:string,column:string,value:unknown,limit?:number):Promise<Result<{rows:Record<string,unknown>[];total:number;}>>;getCreateStatement(table:string):Promise<Result<string|null>>;listSavedQueries():Promise<Result<SavedQuery[]>>;saveQuery(name:string,sql:string):Promise<Result<MutationResult>>;deleteSavedQuery(id:string|number):Promise<Result<MutationResult>>;getSettings():Promise<Result<Record<string,string>>>;getSchema(table:string):Promise<Result<SchemaInfo>>;getReferencingTables(table:string):Promise<Result<ReferencingTableInfo[]>>;renameTable(oldName:string,newName:string):Promise<Result<{changes?:number;}>>;addColumn(table:string,col:ColumnDef):Promise<Result<{changes?:number;}>>;modifyColumn(table:string,oldColName:string,newColDef:ColumnDef):Promise<Result<{changes?:number;}>>;renameColumn(table:string,oldName:string,newName:string):Promise<Result<{changes?:number;}>>;dropColumn(table:string,column:string):Promise<Result<{changes?:number;}>>;dropTable(table:string):Promise<Result<{changes?:number;}>>;createIndex(table:string,index:IndexDef):Promise<Result<{changes?:number;}>>;dropIndex(indexName:string):Promise<Result<{changes?:number;}>>;}