sqlite-wasm-viewer 1.0.5 → 1.0.9

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 CHANGED
@@ -37,7 +37,8 @@ showViewer();
37
37
  ```
38
38
 
39
39
  # Development
40
- A testing app will be available on `http://localhost:9000` after running:
40
+ Run:
41
41
  ```
42
42
  yarn start
43
- ```
43
+ ```
44
+ to start the testing app at `http://localhost:9000`
package/dist/index.js CHANGED
@@ -98,9 +98,13 @@ function showViewer() {
98
98
  dbs[message.data.dbName].tables = tables;
99
99
  (_explorerView = explorerView) === null || _explorerView === void 0 ? void 0 : _explorerView.addDatabaseItem(dbs[message.data.dbName]);
100
100
  } else if (message.data.type === 'onQuery') {
101
- if (message.data.label === 'tableView') {
101
+ if (message.data.label === 'tableViewColumns') {
102
102
  var _tableViewer;
103
- (_tableViewer = tableViewer) === null || _tableViewer === void 0 ? void 0 : _tableViewer.setTableResults(message.data.result.resultRows || []);
103
+ (_tableViewer = tableViewer) === null || _tableViewer === void 0 ? void 0 : _tableViewer.setTableColumns(message.data.result.resultRows || []);
104
+ }
105
+ if (message.data.label === 'tableView') {
106
+ var _tableViewer2;
107
+ (_tableViewer2 = tableViewer) === null || _tableViewer2 === void 0 ? void 0 : _tableViewer2.setTableResults(message.data.result.resultRows || []);
104
108
  }
105
109
  }
106
110
  };
@@ -13,8 +13,10 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
13
13
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
14
14
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
15
15
  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); }
16
+ var EXPANDED_EXPLORER_ITEMS_KEY = 'expanded_explorer_items';
16
17
  var ExplorerView = /*#__PURE__*/function () {
17
18
  function ExplorerView(rootEl) {
19
+ var _localStorage$getItem;
18
20
  _classCallCheck(this, ExplorerView);
19
21
  _defineProperty(this, "expandedItems", {});
20
22
  _defineProperty(this, "selectedItem", null);
@@ -26,60 +28,102 @@ var ExplorerView = /*#__PURE__*/function () {
26
28
  this.containerEl = document.createElement('div');
27
29
  this.containerEl.id = 'explorer_tree';
28
30
  rootEl.appendChild(this.containerEl);
31
+ this.expandedItems = JSON.parse((_localStorage$getItem = localStorage.getItem(EXPANDED_EXPLORER_ITEMS_KEY)) !== null && _localStorage$getItem !== void 0 ? _localStorage$getItem : '{}');
29
32
  }
30
33
  _createClass(ExplorerView, [{
31
34
  key: "addDatabaseItem",
32
35
  value: function addDatabaseItem(databaseItem) {
33
36
  this.dbs.push(databaseItem);
34
- this.addDbToDom(databaseItem);
37
+ this.buildDom();
35
38
  if (this.selectedItem === null) {
36
- var firstTable = document.querySelector('#explorer_tree > .table');
39
+ var firstTable = document.querySelector('#explorer_tree .table');
37
40
  if (firstTable) {
38
41
  this.selectTable(firstTable, databaseItem);
39
42
  }
40
43
  }
41
44
  }
42
45
  }, {
43
- key: "addDbToDom",
44
- value: function addDbToDom(databaseItem) {
46
+ key: "buildDom",
47
+ value: function buildDom() {
45
48
  var _this = this;
49
+ this.containerEl.innerHTML = '';
50
+ this.dbs.forEach(function (db) {
51
+ _this.buildDbGroupDom(db);
52
+ });
53
+ }
54
+ }, {
55
+ key: "buildDbGroupDom",
56
+ value: function buildDbGroupDom(db) {
57
+ var _this2 = this;
46
58
  var dbRoot = document.createDocumentFragment();
47
59
  var dbItem = document.createElement('div');
48
- dbItem.innerText = databaseItem.filename;
60
+ dbItem.innerText = db.filename;
49
61
  dbItem.className = 'db';
62
+ var tablesContainer = document.createElement('div');
63
+ var isExpanded = !(this.expandedItems[db.filename] === false);
64
+ this.buildExpandArrowDom(dbItem, tablesContainer, db, isExpanded);
65
+ dbRoot.appendChild(dbItem);
66
+ db.tables.forEach(function (table) {
67
+ _this2.buildTableDom(tablesContainer, table, db);
68
+ });
69
+ tablesContainer.style.display = isExpanded ? 'block' : 'none';
70
+ dbRoot.appendChild(tablesContainer);
71
+ this.containerEl.appendChild(dbRoot);
72
+ }
73
+ }, {
74
+ key: "buildExpandArrowDom",
75
+ value: function buildExpandArrowDom(itemElem, tablesContainer, db, isExpanded) {
76
+ var _this3 = this;
50
77
  var expandArrow = document.createElement('div');
51
78
  expandArrow.className = 'expand';
52
79
  expandArrow.innerText = '>';
53
80
  expandArrow.style.cursor = 'pointer';
81
+ if (isExpanded) {
82
+ expandArrow.classList.add('expanded');
83
+ }
54
84
  expandArrow.onclick = function () {
55
- _this.expandedItems[databaseItem.filename] = !_this.expandedItems[databaseItem.filename];
85
+ _this3.expandedItems[db.filename] = !_this3.expandedItems[db.filename];
86
+
87
+ // eslint-disable-next-line no-param-reassign
88
+ tablesContainer.style.display = _this3.expandedItems[db.filename] ? 'block' : 'none';
56
89
  expandArrow.classList.toggle('expanded');
90
+ localStorage.setItem(EXPANDED_EXPLORER_ITEMS_KEY, JSON.stringify(_this3.expandedItems));
57
91
  };
58
- expandArrow.classList.add('expanded');
59
- dbItem.appendChild(expandArrow);
60
- dbRoot.appendChild(dbItem);
61
- databaseItem.tables.forEach(function (table) {
62
- var tableItem = document.createElement('div');
63
- tableItem.className = 'table';
64
- tableItem.onclick = function () {
65
- _this.selectTable(tableItem, databaseItem);
66
- };
67
- var tableItemInner = document.createElement('div');
68
- tableItemInner.innerText = table;
69
- tableItem.appendChild(tableItemInner);
70
- dbRoot.appendChild(tableItem);
71
- });
72
- this.containerEl.appendChild(dbRoot);
92
+ itemElem.appendChild(expandArrow);
93
+ }
94
+ }, {
95
+ key: "buildTableDom",
96
+ value: function buildTableDom(tablesContainer, tableName, db) {
97
+ var _this4 = this,
98
+ _this$selectedItem,
99
+ _this$selectedItem2;
100
+ var tableItem = document.createElement('div');
101
+ tableItem.className = 'table';
102
+ tableItem.onclick = function () {
103
+ _this4.selectTable(tableItem, db);
104
+ };
105
+ if (((_this$selectedItem = this.selectedItem) === null || _this$selectedItem === void 0 ? void 0 : _this$selectedItem.tableName) === tableName && ((_this$selectedItem2 = this.selectedItem) === null || _this$selectedItem2 === void 0 ? void 0 : _this$selectedItem2.dbName) === db.filename) {
106
+ this.selectedItem.tableElem = tableItem;
107
+ tableItem.classList.add('selected');
108
+ }
109
+ var tableItemInner = document.createElement('div');
110
+ tableItemInner.innerText = tableName;
111
+ tableItem.appendChild(tableItemInner);
112
+ tablesContainer.appendChild(tableItem);
73
113
  }
74
114
  }, {
75
115
  key: "selectTable",
76
116
  value: function selectTable(tableEl, databaseItem) {
77
117
  if (tableEl) {
78
- var _this$selectedItem;
118
+ var _this$selectedItem3;
79
119
  var tableName = tableEl.innerText;
80
- (_this$selectedItem = this.selectedItem) === null || _this$selectedItem === void 0 ? void 0 : _this$selectedItem.classList.remove('selected');
120
+ (_this$selectedItem3 = this.selectedItem) === null || _this$selectedItem3 === void 0 ? void 0 : _this$selectedItem3.tableElem.classList.remove('selected');
81
121
  tableEl.classList.add('selected');
82
- this.selectedItem = tableEl;
122
+ this.selectedItem = {
123
+ dbName: databaseItem.filename,
124
+ tableName: tableEl.innerText,
125
+ tableElem: tableEl
126
+ };
83
127
  var databasePath = databaseItem.filename;
84
128
  _viewerState.ViewerState.instance.setSelectedTable({
85
129
  tableName: tableName,
@@ -16,24 +16,24 @@
16
16
  position: absolute;
17
17
  top: 0;
18
18
  left: -15px;
19
- transition: all .3s ease-in;
19
+ transition: all .1s ease-in;
20
20
  }
21
21
 
22
22
  #explorer_tree .expanded {
23
23
  transform: rotate(90deg);
24
24
  }
25
25
 
26
- #explorer_tree > .table {
26
+ #explorer_tree .table {
27
27
  margin-left: 20px;
28
28
  height: 20px;
29
29
  cursor: pointer;
30
30
  }
31
31
 
32
- #explorer_tree > .table > div {
32
+ #explorer_tree .table > div {
33
33
  text-overflow: ellipsis;
34
34
  overflow-x: hidden;
35
35
  }
36
36
 
37
- #explorer_tree > .table.selected {
37
+ #explorer_tree .table.selected {
38
38
  background-color: rgb(128, 128, 128);
39
39
  }
@@ -13,6 +13,7 @@ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _ty
13
13
  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); }
14
14
  var SqlLogView = /*#__PURE__*/function () {
15
15
  function SqlLogView(rootEl, queryRunner) {
16
+ var _this = this;
16
17
  _classCallCheck(this, SqlLogView);
17
18
  queryRunner.addListener(this.handleQueryRun.bind(this));
18
19
  var container = document.createElement('div');
@@ -20,6 +21,13 @@ var SqlLogView = /*#__PURE__*/function () {
20
21
  var header = document.createElement('div');
21
22
  header.className = 'viewHeader';
22
23
  header.innerText = 'SQL Log';
24
+ var clearBtn = document.createElement('button');
25
+ clearBtn.style.marginLeft = 'auto';
26
+ clearBtn.innerText = 'Clear';
27
+ clearBtn.onclick = function () {
28
+ _this.textArea.value = '';
29
+ };
30
+ header.appendChild(clearBtn);
23
31
  container.appendChild(header);
24
32
  this.textArea = document.createElement('textarea');
25
33
  this.textArea.id = 'query_log_text';
@@ -7,6 +7,7 @@ exports.TableView = void 0;
7
7
  var _viewerState = require("../../viewerState");
8
8
  var _ListVirtualizer = require("../../ListVirtualizer");
9
9
  require("./styles.css");
10
+ var _TableViewModel = require("./TableViewModel");
10
11
  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); }
11
12
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
12
13
  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); } }
@@ -18,14 +19,12 @@ var TableView = /*#__PURE__*/function () {
18
19
  function TableView(viewerElem, rootElement, queryRunner) {
19
20
  var _this = this;
20
21
  _classCallCheck(this, TableView);
21
- _defineProperty(this, "columnNames", []);
22
- _defineProperty(this, "fitlers", {});
23
22
  _defineProperty(this, "updateTimer", null);
24
- _defineProperty(this, "selectedCell", null);
25
23
  this.viewerElem = viewerElem;
26
24
  this.rootElement = rootElement;
27
25
  this.queryRunner = queryRunner;
28
26
  this.buildDomTemplate();
27
+ this.model = new _TableViewModel.TableViewModel();
29
28
  this.viewerElem.addEventListener('tableSelected', function (event) {
30
29
  var selectedTable = event.detail;
31
30
  _this.setTable(selectedTable.tableName);
@@ -39,7 +38,7 @@ var TableView = /*#__PURE__*/function () {
39
38
  container: this.container,
40
39
  generatorFn: function generatorFn(i) {
41
40
  var _row$rowid;
42
- var row = _this.rows[i];
41
+ var row = _this.model.rows[i];
43
42
  if (!row) {
44
43
  return null;
45
44
  }
@@ -66,11 +65,11 @@ var TableView = /*#__PURE__*/function () {
66
65
  columnName: columnKey,
67
66
  tableName: ((_ViewerState$instance = _viewerState.ViewerState.instance.selectedTable) === null || _ViewerState$instance === void 0 ? void 0 : _ViewerState$instance.tableName) || ''
68
67
  });
69
- if (_this.selectedCell) {
70
- _this.selectedCell.classList.remove('selected');
68
+ if (_this.model.selectedCell) {
69
+ _this.model.selectedCell.classList.remove('selected');
71
70
  }
72
71
  td.classList.add('selected');
73
- _this.selectedCell = td;
72
+ _this.model.selectedCell = td;
74
73
  };
75
74
  td.appendChild(contentEl);
76
75
  tr.appendChild(td);
@@ -83,11 +82,18 @@ var TableView = /*#__PURE__*/function () {
83
82
  _createClass(TableView, [{
84
83
  key: "setTableResults",
85
84
  value: function setTableResults(rows) {
86
- this.rows = rows;
87
- this.viewHeaderTitle.innerHTML = this.tableName;
88
- this.buildHeader(rows);
85
+ this.model.rows = rows;
86
+ this.viewHeaderTitle.innerHTML = this.model.tableName;
89
87
  this.virtualizer.setRowCount(rows.length);
90
88
  }
89
+ }, {
90
+ key: "setTableColumns",
91
+ value: function setTableColumns(columns) {
92
+ this.model.columnNames = columns.map(function (column) {
93
+ return column.name;
94
+ });
95
+ this.buildHeader();
96
+ }
91
97
  }, {
92
98
  key: "buildDomTemplate",
93
99
  value: function buildDomTemplate() {
@@ -100,7 +106,7 @@ var TableView = /*#__PURE__*/function () {
100
106
  var updateBtn = document.createElement('button');
101
107
  updateBtn.innerText = 'Update';
102
108
  updateBtn.onclick = function () {
103
- _this2.requestRows();
109
+ _this2.requestRows(true);
104
110
  };
105
111
  this.viewHeader.appendChild(updateBtn);
106
112
  var saveBtn = document.createElement('button');
@@ -140,27 +146,31 @@ var TableView = /*#__PURE__*/function () {
140
146
  }
141
147
  }, {
142
148
  key: "buildHeader",
143
- value: function buildHeader(rows) {
149
+ value: function buildHeader() {
144
150
  var _this3 = this;
145
- if (this.columnNames.length !== 0) {
151
+ if (this.model.columnNames.length === 0) {
146
152
  return;
147
153
  }
148
- var schema = rows.length > 0 ? Object.keys(rows[0]).filter(function (column) {
149
- return column !== 'rowid';
150
- }) : [];
151
- if (schema.length > 0) {
152
- this.columnNames = schema;
153
- }
154
154
  this.headerRow.innerHTML = '';
155
- this.columnNames.forEach(function (column) {
155
+ this.model.columnNames.forEach(function (column) {
156
156
  var columnHeader = document.createElement('th');
157
157
  columnHeader.className = 'columnHeaderCell';
158
158
  columnHeader.innerHTML = column;
159
159
  var filterFieldCell = document.createElement('th');
160
160
  filterFieldCell.className = 'columnFilterCell';
161
161
  var filterField = document.createElement('input');
162
+ if (_this3.model.fitlers[column]) {
163
+ filterField.value = _this3.model.fitlers[column];
164
+ }
165
+ filterField.onkeydown = function (event) {
166
+ if (event.key === 'Escape') {
167
+ filterField.value = '';
168
+ _this3.model.fitlers[column] = '';
169
+ _this3.scheduleUpdate();
170
+ }
171
+ };
162
172
  filterField.oninput = function () {
163
- _this3.fitlers[column] = filterField.value;
173
+ _this3.model.fitlers[column] = filterField.value;
164
174
  _this3.scheduleUpdate();
165
175
  };
166
176
  filterField.placeholder = 'Filter';
@@ -172,20 +182,27 @@ var TableView = /*#__PURE__*/function () {
172
182
  }, {
173
183
  key: "setTable",
174
184
  value: function setTable(name) {
175
- if (this.tableName === name) {
185
+ if (this.model.tableName === name) {
176
186
  return;
177
187
  }
178
- this.tableName = name;
179
- this.columnNames = [];
180
- this.fitlers = {};
181
- this.requestRows();
188
+ this.model.tableName = name;
189
+ this.model.columnNames = [];
190
+ this.model.fitlers = {};
191
+ this.requestRows(true);
182
192
  }
183
193
  }, {
184
194
  key: "requestRows",
185
- value: function requestRows() {
186
- var sql = "SELECT \"_rowid_\",* FROM ".concat(this.tableName);
195
+ value: function requestRows(refetchColumns) {
196
+ if (refetchColumns) {
197
+ var _sql = "PRAGMA table_info(".concat(this.model.tableName, ");");
198
+ this.queryRunner.runQuery({
199
+ sql: _sql,
200
+ parameters: []
201
+ }, 'tableViewColumns');
202
+ }
203
+ var sql = "SELECT \"_rowid_\",* FROM ".concat(this.model.tableName);
187
204
  var filterSql = [];
188
- Object.entries(this.fitlers).forEach(function (filterEntry) {
205
+ Object.entries(this.model.fitlers).forEach(function (filterEntry) {
189
206
  var column = filterEntry[0];
190
207
  var filter = filterEntry[1];
191
208
  if (filter) {
@@ -218,7 +235,7 @@ var TableView = /*#__PURE__*/function () {
218
235
  sql: sql,
219
236
  parameters: []
220
237
  });
221
- this.requestRows();
238
+ this.requestRows(true);
222
239
  _viewerState.ViewerState.instance.setHasChanges(false);
223
240
  }
224
241
  }, {
@@ -229,7 +246,7 @@ var TableView = /*#__PURE__*/function () {
229
246
  window.clearTimeout(this.updateTimer);
230
247
  }
231
248
  this.updateTimer = window.setTimeout(function () {
232
- _this4.requestRows();
249
+ _this4.requestRows(false);
233
250
  _this4.updateTimer = null;
234
251
  }, 300);
235
252
  }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TableViewModel = void 0;
7
+ 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); }
8
+ 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); } }
9
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
10
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
11
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
12
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
13
+ 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); }
14
+ var TableViewModel = /*#__PURE__*/_createClass(function TableViewModel() {
15
+ _classCallCheck(this, TableViewModel);
16
+ _defineProperty(this, "columnNames", []);
17
+ _defineProperty(this, "fitlers", {});
18
+ _defineProperty(this, "selectedCell", null);
19
+ });
20
+ exports.TableViewModel = TableViewModel;
@@ -73,6 +73,7 @@
73
73
  white-space: pre;
74
74
  -webkit-line-clamp: 2;
75
75
  -webkit-box-orient: vertical;
76
+ line-height: 1.2em;
76
77
  }
77
78
 
78
79
  #table_container .nullValue {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sqlite-wasm-viewer",
3
- "version": "1.0.5",
3
+ "version": "1.0.9",
4
4
  "description": "An SQLite OPFS database viewer that enables database inspection and SQL command execution.",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -52,4 +52,4 @@
52
52
  "peerDependencies": {
53
53
  "@sqlite.org/sqlite-wasm": "^3.x.x"
54
54
  }
55
- }
55
+ }