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.
@@ -4,10 +4,15 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.TableView = void 0;
7
- var _viewerState = require("../../viewerState");
7
+ exports.createTableView = createTableView;
8
+ var _state = require("../../state");
9
+ var Bus = _interopRequireWildcard(require("../../bus"));
8
10
  var _ListVirtualizer = require("../../ListVirtualizer");
9
- require("./styles.css");
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(viewerElem, rootElement, queryRunner) {
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
- this.viewerElem.addEventListener('tableSelected', function (event) {
29
- var selectedTable = event.detail;
30
- _this.setTable(selectedTable.tableName);
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 = (_row$rowid = row.rowid) !== null && _row$rowid !== void 0 ? _row$rowid : (i + 1).toString();
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
- this.viewerElem.addEventListener('dbHasChanges', function (event) {
143
- var hasChanges = event.detail;
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
- this.queryRunner.runQuery({
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
- this.queryRunner.runQuery({
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
- this.queryRunner.runQuery({
255
+ _QueryRunner.queryRunner.runQuery({
232
256
  sql: sql,
233
257
  parameters: []
234
258
  });
235
- _viewerState.ViewerState.instance.setHasChanges(false);
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
- this.queryRunner.runQuery({
265
+ _QueryRunner.queryRunner.runQuery({
242
266
  sql: sql,
243
267
  parameters: []
244
268
  });
245
269
  this.requestRows(true);
246
- _viewerState.ViewerState.instance.setHasChanges(false);
270
+ (0, _state.setDirty)(false);
247
271
  }
248
272
  }, {
249
273
  key: "deleteTable",
250
274
  value: function deleteTable() {
251
- if (!_viewerState.ViewerState.instance.selectedTable) {
275
+ var table = (0, _state.selectedTable)();
276
+ if (!table) {
252
277
  return;
253
278
  }
254
- if (!_viewerState.ViewerState.instance.hasChanges) {
255
- var _this$queryRunner;
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(_viewerState.ViewerState.instance.selectedTable.tableName, "\";");
262
- this.queryRunner.runQuery({
285
+ var sql = "DROP TABLE \"".concat(table.tableName, "\";");
286
+ _QueryRunner.queryRunner.runQuery({
263
287
  sql: sql,
264
288
  parameters: []
265
289
  });
266
- _viewerState.ViewerState.instance.setHasChanges(true);
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: 5px;
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: 20px;
12
- flex-basis: 20px;
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-color: lightgray;
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-y: scroll;
27
- display: flex;
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-color: whitesmoke;
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: 60px;
44
+ height: 62px;
47
45
  position: sticky;
48
46
  top: 0;
49
- background-color: darkgray;
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: 5px;
57
+ padding-top: 6px;
58
+ text-overflow: ellipsis;
59
+ overflow: hidden;
55
60
  }
56
61
 
57
62
  #table_container .columnFilterCell input {
58
- width: calc(100% - 8px);
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 lightgray;
69
+ border: 1px solid #e2e8f0;
63
70
  }
64
71
 
65
72
  #table_container td.selected {
66
- background-color: lightslategray;
67
- color: white;
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: 4px;
80
+ padding: 10px 8px;
74
81
  text-overflow: ellipsis;
75
82
  overflow: hidden;
76
83
  white-space: pre;
77
- font-size: 15px;
78
- line-height: 1.1em;
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: gray;
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.13",
4
- "description": "An SQLite OPFS database viewer that enables database inspection and SQL command execution.",
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",