sqlite-wasm-viewer 1.0.13 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/DbViewerWorker.js +0 -1
- package/dist/DbWorker.js +11 -1
- package/dist/ListVirtualizer.js +7 -0
- package/dist/QueryRunner.js +21 -24
- package/dist/bus.js +47 -0
- package/dist/dbWorkerConnector.js +63 -0
- package/dist/index.js +7 -109
- package/dist/state.js +46 -0
- package/dist/styles.css +107 -22
- package/dist/viewer.js +76 -0
- package/dist/views/EditCellView/EditCellView.js +33 -20
- package/dist/views/EditCellView/styles.css +15 -8
- package/dist/views/ExecuteSQLView/ExecuteSQLView.js +7 -9
- package/dist/views/ExecuteSQLView/styles.css +19 -15
- package/dist/views/ExplorerView/ExplorerView.js +32 -16
- package/dist/views/ExplorerView/styles.css +24 -12
- package/dist/views/SqlLogView/SqlLogView.js +14 -5
- package/dist/views/SqlLogView/styles.css +10 -0
- package/dist/views/TableView/TableView.js +74 -42
- package/dist/views/TableView/styles.css +47 -23
- package/package.json +13 -3
|
@@ -4,10 +4,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.TableView = void 0;
|
|
7
|
-
|
|
7
|
+
exports.createTableView = createTableView;
|
|
8
|
+
var _state = require("../../state");
|
|
9
|
+
var Bus = _interopRequireWildcard(require("../../bus"));
|
|
8
10
|
var _ListVirtualizer = require("../../ListVirtualizer");
|
|
9
|
-
require("
|
|
11
|
+
var _QueryRunner = require("../../QueryRunner");
|
|
10
12
|
var _TableViewModel = require("./TableViewModel");
|
|
13
|
+
require("./styles.css");
|
|
14
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
15
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
11
16
|
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
12
17
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
13
18
|
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
@@ -16,18 +21,33 @@ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key i
|
|
|
16
21
|
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
17
22
|
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
18
23
|
var TableView = /*#__PURE__*/function () {
|
|
19
|
-
function TableView(
|
|
24
|
+
function TableView(rootElement) {
|
|
20
25
|
var _this = this;
|
|
21
26
|
_classCallCheck(this, TableView);
|
|
22
27
|
_defineProperty(this, "updateTimer", null);
|
|
23
|
-
this.viewerElem = viewerElem;
|
|
24
28
|
this.rootElement = rootElement;
|
|
25
|
-
this.queryRunner = queryRunner;
|
|
26
29
|
this.buildDomTemplate();
|
|
27
30
|
this.model = new _TableViewModel.TableViewModel();
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
Bus.listen('table-selected', function (table) {
|
|
32
|
+
_this.setTable(table.tableName);
|
|
33
|
+
});
|
|
34
|
+
Bus.listen('query-results', function (data) {
|
|
35
|
+
if ((data === null || data === void 0 ? void 0 : data.label) === 'tableViewColumns') {
|
|
36
|
+
_this.setTableColumns(data.result.resultRows || []);
|
|
37
|
+
} else if ((data === null || data === void 0 ? void 0 : data.label) === 'tableView') {
|
|
38
|
+
_this.setTableResults(data.result.resultRows || []);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
Bus.listen('cell-edited', function (_ref) {
|
|
42
|
+
var cell = _ref.cell,
|
|
43
|
+
value = _ref.value;
|
|
44
|
+
var row = _this.model.rows.find(function (r) {
|
|
45
|
+
return r.rowid === cell.cellRowId;
|
|
46
|
+
});
|
|
47
|
+
if (row) {
|
|
48
|
+
row[cell.columnName] = value;
|
|
49
|
+
_this.virtualizer.update();
|
|
50
|
+
}
|
|
31
51
|
});
|
|
32
52
|
this.virtualizer = new _ListVirtualizer.ListVirtualizer({
|
|
33
53
|
width: 500,
|
|
@@ -37,19 +57,38 @@ var TableView = /*#__PURE__*/function () {
|
|
|
37
57
|
contentRoot: this.bodyRoot,
|
|
38
58
|
container: this.container,
|
|
39
59
|
generatorFn: function generatorFn(i) {
|
|
40
|
-
var _row$rowid;
|
|
41
60
|
var row = _this.model.rows[i];
|
|
42
61
|
if (!row) {
|
|
43
62
|
return null;
|
|
44
63
|
}
|
|
45
64
|
var tr = document.createElement('tr');
|
|
46
|
-
var rowId =
|
|
65
|
+
var rowId = row.rowid;
|
|
66
|
+
tr.onclick = function (event) {
|
|
67
|
+
var _event$target;
|
|
68
|
+
var element = (_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.parentElement;
|
|
69
|
+
if (element !== null && element !== void 0 && element.id) {
|
|
70
|
+
var _selectedTable;
|
|
71
|
+
var value = row[element.id];
|
|
72
|
+
(0, _state.selectCell)({
|
|
73
|
+
value: value,
|
|
74
|
+
cellRowId: rowId,
|
|
75
|
+
columnName: element.id,
|
|
76
|
+
tableName: ((_selectedTable = (0, _state.selectedTable)()) === null || _selectedTable === void 0 ? void 0 : _selectedTable.tableName) || ''
|
|
77
|
+
});
|
|
78
|
+
if (_this.model.selectedCell) {
|
|
79
|
+
_this.model.selectedCell.classList.remove('selected');
|
|
80
|
+
}
|
|
81
|
+
element.classList.add('selected');
|
|
82
|
+
_this.model.selectedCell = element;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
47
85
|
Object.keys(row).forEach(function (columnKey) {
|
|
48
86
|
if (columnKey === 'rowid') {
|
|
49
87
|
return;
|
|
50
88
|
}
|
|
51
89
|
var value = row[columnKey];
|
|
52
90
|
var td = document.createElement('td');
|
|
91
|
+
td.id = columnKey;
|
|
53
92
|
var contentEl = document.createElement('div');
|
|
54
93
|
if (value !== null) {
|
|
55
94
|
contentEl.innerHTML = value;
|
|
@@ -57,20 +96,6 @@ var TableView = /*#__PURE__*/function () {
|
|
|
57
96
|
contentEl.innerHTML = 'NULL';
|
|
58
97
|
contentEl.className = 'nullValue';
|
|
59
98
|
}
|
|
60
|
-
td.onclick = function () {
|
|
61
|
-
var _ViewerState$instance;
|
|
62
|
-
_viewerState.ViewerState.instance.setSelectedCell({
|
|
63
|
-
value: value,
|
|
64
|
-
cellRowId: rowId,
|
|
65
|
-
columnName: columnKey,
|
|
66
|
-
tableName: ((_ViewerState$instance = _viewerState.ViewerState.instance.selectedTable) === null || _ViewerState$instance === void 0 ? void 0 : _ViewerState$instance.tableName) || ''
|
|
67
|
-
});
|
|
68
|
-
if (_this.model.selectedCell) {
|
|
69
|
-
_this.model.selectedCell.classList.remove('selected');
|
|
70
|
-
}
|
|
71
|
-
td.classList.add('selected');
|
|
72
|
-
_this.model.selectedCell = td;
|
|
73
|
-
};
|
|
74
99
|
td.appendChild(contentEl);
|
|
75
100
|
tr.appendChild(td);
|
|
76
101
|
});
|
|
@@ -139,9 +164,8 @@ var TableView = /*#__PURE__*/function () {
|
|
|
139
164
|
this.bodyRoot = table.createTBody();
|
|
140
165
|
this.container.appendChild(table);
|
|
141
166
|
this.rootElement.appendChild(this.container);
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
if (hasChanges) {
|
|
167
|
+
Bus.listen('db-dirtied', function (dirty) {
|
|
168
|
+
if (dirty) {
|
|
145
169
|
saveBtn.removeAttribute('disabled');
|
|
146
170
|
revertBtn.removeAttribute('disabled');
|
|
147
171
|
} else {
|
|
@@ -202,12 +226,12 @@ var TableView = /*#__PURE__*/function () {
|
|
|
202
226
|
value: function requestRows(refetchColumns) {
|
|
203
227
|
if (refetchColumns) {
|
|
204
228
|
var _sql = "PRAGMA table_info(".concat(this.model.tableName, ");");
|
|
205
|
-
|
|
229
|
+
_QueryRunner.queryRunner.runQuery({
|
|
206
230
|
sql: _sql,
|
|
207
231
|
parameters: []
|
|
208
232
|
}, 'tableViewColumns');
|
|
209
233
|
}
|
|
210
|
-
var sql = "SELECT \"_rowid_\",* FROM ".concat(this.model.tableName);
|
|
234
|
+
var sql = "SELECT \"_rowid_\" as rowid,* FROM ".concat(this.model.tableName);
|
|
211
235
|
var filterSql = [];
|
|
212
236
|
Object.entries(this.model.fitlers).forEach(function (filterEntry) {
|
|
213
237
|
var column = filterEntry[0];
|
|
@@ -219,7 +243,7 @@ var TableView = /*#__PURE__*/function () {
|
|
|
219
243
|
if (filterSql.length > 0) {
|
|
220
244
|
sql += " WHERE ".concat(filterSql.join(' AND '), " ESCAPE '\\'");
|
|
221
245
|
}
|
|
222
|
-
|
|
246
|
+
_QueryRunner.queryRunner.runQuery({
|
|
223
247
|
sql: sql,
|
|
224
248
|
parameters: []
|
|
225
249
|
}, 'tableView');
|
|
@@ -228,42 +252,42 @@ var TableView = /*#__PURE__*/function () {
|
|
|
228
252
|
key: "saveChanges",
|
|
229
253
|
value: function saveChanges() {
|
|
230
254
|
var sql = 'RELEASE "RESTOREPOINT";';
|
|
231
|
-
|
|
255
|
+
_QueryRunner.queryRunner.runQuery({
|
|
232
256
|
sql: sql,
|
|
233
257
|
parameters: []
|
|
234
258
|
});
|
|
235
|
-
|
|
259
|
+
(0, _state.setDirty)(false);
|
|
236
260
|
}
|
|
237
261
|
}, {
|
|
238
262
|
key: "revertChanges",
|
|
239
263
|
value: function revertChanges() {
|
|
240
264
|
var sql = 'ROLLBACK TO SAVEPOINT "RESTOREPOINT";';
|
|
241
|
-
|
|
265
|
+
_QueryRunner.queryRunner.runQuery({
|
|
242
266
|
sql: sql,
|
|
243
267
|
parameters: []
|
|
244
268
|
});
|
|
245
269
|
this.requestRows(true);
|
|
246
|
-
|
|
270
|
+
(0, _state.setDirty)(false);
|
|
247
271
|
}
|
|
248
272
|
}, {
|
|
249
273
|
key: "deleteTable",
|
|
250
274
|
value: function deleteTable() {
|
|
251
|
-
|
|
275
|
+
var table = (0, _state.selectedTable)();
|
|
276
|
+
if (!table) {
|
|
252
277
|
return;
|
|
253
278
|
}
|
|
254
|
-
if (!
|
|
255
|
-
|
|
256
|
-
(_this$queryRunner = this.queryRunner) === null || _this$queryRunner === void 0 ? void 0 : _this$queryRunner.runQuery({
|
|
279
|
+
if (!(0, _state.isDirty)()) {
|
|
280
|
+
_QueryRunner.queryRunner === null || _QueryRunner.queryRunner === void 0 ? void 0 : _QueryRunner.queryRunner.runQuery({
|
|
257
281
|
sql: 'SAVEPOINT "RESTOREPOINT"',
|
|
258
282
|
parameters: []
|
|
259
283
|
});
|
|
260
284
|
}
|
|
261
|
-
var sql = "DROP TABLE \"".concat(
|
|
262
|
-
|
|
285
|
+
var sql = "DROP TABLE \"".concat(table.tableName, "\";");
|
|
286
|
+
_QueryRunner.queryRunner.runQuery({
|
|
263
287
|
sql: sql,
|
|
264
288
|
parameters: []
|
|
265
289
|
});
|
|
266
|
-
|
|
290
|
+
(0, _state.setDirty)(true);
|
|
267
291
|
}
|
|
268
292
|
}, {
|
|
269
293
|
key: "scheduleUpdate",
|
|
@@ -280,4 +304,12 @@ var TableView = /*#__PURE__*/function () {
|
|
|
280
304
|
}]);
|
|
281
305
|
return TableView;
|
|
282
306
|
}();
|
|
283
|
-
exports.TableView = TableView;
|
|
307
|
+
exports.TableView = TableView;
|
|
308
|
+
var _tableView;
|
|
309
|
+
function createTableView(rootEl) {
|
|
310
|
+
if (!_tableView) {
|
|
311
|
+
_tableView = new TableView(rootEl);
|
|
312
|
+
} else {
|
|
313
|
+
// console.warn('TableView is already created');
|
|
314
|
+
}
|
|
315
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#table_view {
|
|
2
|
-
padding:
|
|
2
|
+
padding: 0;
|
|
3
3
|
flex: 1;
|
|
4
4
|
position: relative;
|
|
5
5
|
overflow: hidden;
|
|
@@ -8,77 +8,101 @@
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
#table_view_header {
|
|
11
|
-
max-height:
|
|
12
|
-
flex-basis:
|
|
11
|
+
max-height: 34px;
|
|
12
|
+
flex-basis: 34px;
|
|
13
13
|
left: 0;
|
|
14
14
|
right: 0;
|
|
15
15
|
position: sticky;
|
|
16
16
|
line-height: 1.1rem;
|
|
17
|
-
padding: 8px;
|
|
18
|
-
background
|
|
17
|
+
padding: 8px 10px;
|
|
18
|
+
background: linear-gradient(180deg, #ffffff 0%, #f9fafb 100%);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
#table_view_header_title {
|
|
22
|
-
padding: 8px;
|
|
22
|
+
padding-right: 8px;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
#table_container {
|
|
26
|
-
overflow
|
|
27
|
-
|
|
26
|
+
overflow: auto;
|
|
27
|
+
flex: 1;
|
|
28
|
+
background: #fff;
|
|
28
29
|
}
|
|
29
30
|
|
|
30
31
|
#table_container table {
|
|
31
|
-
flex: 1;
|
|
32
32
|
table-layout: fixed;
|
|
33
33
|
width: 100%;
|
|
34
|
-
background
|
|
34
|
+
background: #fff;
|
|
35
35
|
border-collapse: collapse;
|
|
36
36
|
border-spacing: 0;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
#table_container tbody {
|
|
40
|
-
flex: 1;
|
|
41
|
-
overflow-y: scroll;
|
|
42
40
|
position: relative;
|
|
43
41
|
}
|
|
44
42
|
|
|
45
43
|
#table_container .columnHeaderCell {
|
|
46
|
-
height:
|
|
44
|
+
height: 62px;
|
|
47
45
|
position: sticky;
|
|
48
46
|
top: 0;
|
|
49
|
-
|
|
47
|
+
padding: 6px;
|
|
48
|
+
background: #f8fafc;
|
|
50
49
|
z-index: 2;
|
|
50
|
+
color: #334155;
|
|
51
|
+
font-weight: 600;
|
|
52
|
+
text-overflow: ellipsis;
|
|
53
|
+
overflow: hidden;
|
|
51
54
|
}
|
|
52
55
|
|
|
53
56
|
#table_container .columnFilterCell {
|
|
54
|
-
padding-top:
|
|
57
|
+
padding-top: 6px;
|
|
58
|
+
text-overflow: ellipsis;
|
|
59
|
+
overflow: hidden;
|
|
55
60
|
}
|
|
56
61
|
|
|
57
62
|
#table_container .columnFilterCell input {
|
|
58
|
-
width:
|
|
63
|
+
width: 100%;
|
|
64
|
+
box-sizing: border-box;
|
|
65
|
+
font-size: 12px;
|
|
59
66
|
}
|
|
60
67
|
|
|
61
68
|
#table_container td, #table_container .columnHeaderCell {
|
|
62
|
-
border: 1px solid
|
|
69
|
+
border: 1px solid #e2e8f0;
|
|
63
70
|
}
|
|
64
71
|
|
|
65
72
|
#table_container td.selected {
|
|
66
|
-
background
|
|
67
|
-
color:
|
|
73
|
+
background: #2563eb;
|
|
74
|
+
color: #fff;
|
|
68
75
|
}
|
|
69
76
|
|
|
70
77
|
#table_container td div {
|
|
71
78
|
height: 40px;
|
|
72
79
|
box-sizing: border-box;
|
|
73
|
-
padding:
|
|
80
|
+
padding: 10px 8px;
|
|
74
81
|
text-overflow: ellipsis;
|
|
75
82
|
overflow: hidden;
|
|
76
83
|
white-space: pre;
|
|
77
|
-
font-size:
|
|
78
|
-
line-height: 1.
|
|
84
|
+
font-size: 13px;
|
|
85
|
+
line-height: 1.2em;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
#table_container tbody tr:nth-child(even) td:not(.selected) {
|
|
89
|
+
background: #fcfdff;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
#table_container tbody tr:hover td:not(.selected) {
|
|
93
|
+
background: #eff6ff;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
#table_container tbody tr:hover td.selected {
|
|
97
|
+
background: #2563eb;
|
|
79
98
|
}
|
|
80
99
|
|
|
81
100
|
#table_container .nullValue {
|
|
82
101
|
font-style: italic;
|
|
83
|
-
color:
|
|
102
|
+
color: #64748b;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
::placeholder {
|
|
106
|
+
color: #959595; /* Use any color format (HEX, RGB, Name) */
|
|
107
|
+
opacity: 1; /* Required for Firefox to show full color */
|
|
84
108
|
}
|
package/package.json
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sqlite-wasm-viewer",
|
|
3
|
-
"version": "1.0
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Browser SQLite OPFS viewer for @sqlite.org/sqlite-wasm: inspect OPFS-backed databases, run SQL, and filter tables.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
|
+
"homepage": "https://github.com/mifozski/sqlite-wasm-viewer#readme",
|
|
7
|
+
"bugs": {
|
|
8
|
+
"url": "https://github.com/mifozski/sqlite-wasm-viewer/issues"
|
|
9
|
+
},
|
|
6
10
|
"scripts": {
|
|
7
11
|
"build": "yarn build-transpile && yarn build-copy-css",
|
|
8
12
|
"build-transpile": "babel src --extensions .ts --out-dir=dist --presets=@babel/env,@babel/typescript",
|
|
@@ -11,10 +15,16 @@
|
|
|
11
15
|
},
|
|
12
16
|
"keywords": [
|
|
13
17
|
"sqlite",
|
|
18
|
+
"sqlite-wasm",
|
|
14
19
|
"opfs",
|
|
20
|
+
"opfs-viewer",
|
|
15
21
|
"wasm",
|
|
22
|
+
"viewer",
|
|
23
|
+
"browser",
|
|
16
24
|
"sql",
|
|
17
|
-
"database"
|
|
25
|
+
"database",
|
|
26
|
+
"inspector",
|
|
27
|
+
"sqlite-wasm-viewer"
|
|
18
28
|
],
|
|
19
29
|
"author": {
|
|
20
30
|
"name": "Andrey Efimov",
|