sqlui 0.1.16 → 0.1.17

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7c438724dd4d58432da2908650a10bb82c3452a2faf4f0560c5dd23a8fd6d66
4
- data.tar.gz: 949a64296520f3e7fcfec48ae1a4cc8b4a4056184d88a88ca52b5813b1ad8064
3
+ metadata.gz: db5b12190e0cde95f8a0063703cf3e0398bd8cfa862f1122b90c4f95b721c1ce
4
+ data.tar.gz: 0b9a4db845a28a5a40923e8107bf961472cf57928b197b2b610b4e957fd365aa
5
5
  SHA512:
6
- metadata.gz: ab6348bdcbeb1b2dfd7e38c206b7d72bf388f28ae992e15c40823b00db1bc3bdfb705cc3764373ca0f1de053b32ea546f84bdacf99328b5b6def0f9aea40954e
7
- data.tar.gz: a55564765cd9c90fe47ef06d521aefde3bc78f903527cd4a49b6817267364ff6cd609d47b645a9508c382fcc1798b355b414b12ea861782038b538dbaa90a861
6
+ metadata.gz: 4e74d51eccdec8b53c8e9455f555a55ab2cde80ae3e800b11efbbc57eb8f86bdcb8528faa2b70bc3589c2205baa3f3a7a08d866548257d045de89a437199c75b
7
+ data.tar.gz: 87b4226337f573e294e2f181dc9c0485bc1ab407f0585d6c3c7232c5d965f6d7315cd138656a40337169ce39a01c2f18ad16f2855f5e506db8ac0eb4222a70f0
data/.version CHANGED
@@ -1 +1 @@
1
- 0.1.16
1
+ 0.1.17
data/app/environment.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Parses and provides access to environment variables.
1
4
  class Environment
2
5
  SERVER_ENV = ENV.fetch('SERVER_ENV', 'development').to_sym
3
6
  SERVER_PORT = ENV.fetch('SERVER_PORT', 8080)
@@ -17,4 +20,4 @@ class Environment
17
20
  def self.server_port
18
21
  SERVER_PORT
19
22
  end
20
- end
23
+ end
data/app/server.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'erb'
2
4
  require 'json'
3
5
  require 'mysql2'
@@ -12,14 +14,16 @@ if ARGV.include?('-v') || ARGV.include?('--version')
12
14
  end
13
15
 
14
16
  raise 'you must specify a configuration file' unless ARGV.size == 1
15
- raise "configuration file does not exist" unless File.exist?(ARGV[0])
17
+ raise 'configuration file does not exist' unless File.exist?(ARGV[0])
16
18
 
19
+ # SQLUI Sinatra server.
17
20
  class Server < Sinatra::Base
18
21
  set :logging, true
19
22
  set :bind, '0.0.0.0'
20
23
  set :port, Environment.server_port
21
24
  set :env, Environment.server_env
22
25
 
26
+ # A MySQL client. This needs to go away.
23
27
  class Client
24
28
  def initialize(params)
25
29
  @params = params
@@ -35,30 +39,30 @@ class Server < Sinatra::Base
35
39
  end
36
40
  end
37
41
 
38
- config = YAML.load(ERB.new(File.read(ARGV[0])).result)
42
+ config = YAML.safe_load(ERB.new(File.read(ARGV[0])).result)
39
43
  saved_path_root = config['saved_path']
40
- client_map = config['databases'].values.map do |database_config|
44
+ client_map = config['databases'].values.to_h do |database_config|
41
45
  client_params = {
42
- host: database_config['db_host'],
43
- port: database_config['db_port'] || 3306,
44
- username: database_config['db_username'],
45
- password: database_config['db_password'],
46
- database: database_config['db_database'],
47
- read_timeout: 10, # seconds
48
- write_timeout: 0, # seconds
46
+ host: database_config['db_host'],
47
+ port: database_config['db_port'] || 3306,
48
+ username: database_config['db_username'],
49
+ password: database_config['db_password'],
50
+ database: database_config['db_database'],
51
+ read_timeout: 10, # seconds
52
+ write_timeout: 0, # seconds
49
53
  connect_timeout: 5 # seconds
50
54
  }
51
55
  client = Client.new(client_params)
52
56
  [
53
- database_config['url_path'],
57
+ database_config['url_path'],
54
58
  ::SQLUI.new(
55
- client: client,
59
+ client: client,
56
60
  table_schema: database_config['db_database'],
57
- name: database_config['name'],
58
- saved_path: File.join(saved_path_root, database_config['saved_path'])
61
+ name: database_config['name'],
62
+ saved_path: File.join(saved_path_root, database_config['saved_path'])
59
63
  )
60
64
  ]
61
- end.to_h
65
+ end
62
66
 
63
67
  get '/-/health' do
64
68
  status 200
@@ -66,7 +70,7 @@ class Server < Sinatra::Base
66
70
  end
67
71
 
68
72
  get '/db/?' do
69
- erb :databases, :locals => {:databases => config['databases']}
73
+ erb :databases, locals: { databases: config['databases'] }
70
74
  end
71
75
 
72
76
  get '/db/:database' do
@@ -76,7 +80,7 @@ class Server < Sinatra::Base
76
80
  get '/db/:database/:route' do
77
81
  response = client_map[params[:database]].get(params)
78
82
  status response[:status]
79
- headers "Content-Type": response[:content_type]
83
+ headers 'Content-Type': response[:content_type]
80
84
  body response[:body]
81
85
  end
82
86
 
@@ -84,7 +88,7 @@ class Server < Sinatra::Base
84
88
  post_body = JSON.parse(request.body.read)
85
89
  response = client_map[params[:database]].post(params.merge(post_body))
86
90
  status response[:status]
87
- headers "Content-Type": response[:content_type]
91
+ headers 'Content-Type': response[:content_type]
88
92
  body response[:body]
89
93
  end
90
94
 
data/app/sqlui.rb CHANGED
@@ -1,11 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
  require 'uri'
3
5
  require 'set'
4
6
 
7
+ # Main SQLUI class responsible for producing web content. This class needs to die.
5
8
  class SQLUI
6
9
  MAX_ROWS = 1_000
7
10
 
8
- def initialize(client:, table_schema: nil, name:, saved_path:, max_rows: MAX_ROWS)
11
+ def initialize(client:, name:, saved_path:, table_schema: nil, max_rows: MAX_ROWS)
9
12
  @client = client
10
13
  @table_schema = table_schema
11
14
  @name = name
@@ -65,12 +68,10 @@ class SQLUI
65
68
  end
66
69
 
67
70
  def query_file(params)
68
- if params['file']
69
- sql = File.read("#{@saved_path}/#{params['file']}")
70
- execute_query(sql).tap { |r| r[:file] = params[:file] }
71
- else
72
- raise 'missing file param'
73
- end
71
+ raise 'missing file param' unless params['file']
72
+
73
+ sql = File.read("#{@saved_path}/#{params['file']}")
74
+ execute_query(sql).tap { |r| r[:file] = params[:file] }
74
75
  end
75
76
 
76
77
  def metadata
@@ -79,21 +80,21 @@ class SQLUI
79
80
 
80
81
  def load_metadata
81
82
  result = {
82
- server: @name,
83
+ server: @name,
83
84
  schemas: {},
84
- saved: Dir.glob("#{@saved_path}/*.sql").sort.map do |path|
85
+ saved: Dir.glob("#{@saved_path}/*.sql").map do |path|
85
86
  {
86
- filename: File.basename(path),
87
+ filename: File.basename(path),
87
88
  description: File.readlines(path).take_while { |l| l.start_with?('--') }.map { |l| l.sub(/^-- */, '') }.join
88
89
  }
89
90
  end
90
91
  }
91
92
 
92
- if @table_schema
93
- where_clause = "where table_schema = '#{@table_schema}'"
94
- else
95
- where_clause = "where table_schema not in('mysql', 'sys', 'information_schema', 'performance_schema')"
96
- end
93
+ where_clause = if @table_schema
94
+ "where table_schema = '#{@table_schema}'"
95
+ else
96
+ "where table_schema not in('mysql', 'sys', 'information_schema', 'performance_schema')"
97
+ end
97
98
  column_result = @client.query(
98
99
  <<~SQL
99
100
  select
@@ -129,9 +130,7 @@ class SQLUI
129
130
  end
130
131
  columns = result[:schemas][table_schema][:tables][table_name][:columns]
131
132
  column_name = row[:column_name]
132
- unless columns[column_name]
133
- columns[column_name] = {}
134
- end
133
+ columns[column_name] = {} unless columns[column_name]
135
134
  column = columns[column_name]
136
135
  column[:name] = column_name
137
136
  column[:data_type] = row[:data_type]
@@ -142,11 +141,11 @@ class SQLUI
142
141
  column[:extra] = row[:extra]
143
142
  end
144
143
 
145
- if @table_schema
146
- where_clause = "where table_schema = '#{@table_schema}'"
147
- else
148
- where_clause = "where table_schema not in('mysql', 'sys', 'information_schema', 'performance_schema')"
149
- end
144
+ where_clause = if @table_schema
145
+ "where table_schema = '#{@table_schema}'"
146
+ else
147
+ "where table_schema not in('mysql', 'sys', 'information_schema', 'performance_schema')"
148
+ end
150
149
  stats_result = @client.query(
151
150
  <<~SQL
152
151
  select
@@ -168,9 +167,7 @@ class SQLUI
168
167
  table_name = row[:table_name]
169
168
  indexes = tables[table_name][:indexes]
170
169
  index_name = row[:index_name]
171
- unless indexes[index_name]
172
- indexes[index_name] = {}
173
- end
170
+ indexes[index_name] = {} unless indexes[index_name]
174
171
  index = indexes[index_name]
175
172
  column_name = row[:column_name]
176
173
  index[column_name] = {}
@@ -186,13 +183,13 @@ class SQLUI
186
183
 
187
184
  def execute_query(sql)
188
185
  result = @client.query(sql)
189
- rows = result.map { |row| row.values }
186
+ rows = result.map(&:values)
190
187
  columns = result.first&.keys || []
191
188
  column_types = columns.map { |_| 'string' }
192
189
  unless rows.empty?
193
190
  maybe_non_null_column_value_exemplars = columns.each_with_index.map do |_, index|
194
- row = rows.find do |row|
195
- !row[index].nil?
191
+ row = rows.find do |current|
192
+ !current[index].nil?
196
193
  end
197
194
  row.nil? ? nil : row[index]
198
195
  end
@@ -210,22 +207,24 @@ class SQLUI
210
207
  end
211
208
  end
212
209
  {
213
- query: sql,
214
- columns: columns,
210
+ query: sql,
211
+ columns: columns,
215
212
  column_types: column_types,
216
- total_rows: rows.size,
217
- rows: rows.take(@max_rows)
213
+ total_rows: rows.size,
214
+ rows: rows.take(@max_rows)
218
215
  }
219
216
  end
220
217
 
221
218
  def find_query_at_cursor(sql, cursor)
222
219
  parts_with_ranges = []
223
220
  sql.scan(/[^;]*;[ \n]*/) { |part| parts_with_ranges << [part, 0, part.size] }
224
- parts_with_ranges.inject(0) do |pos, part_with_range|
225
- part_with_range[1] += pos
226
- part_with_range[2] += pos
221
+ parts_with_ranges.inject(0) do |pos, current|
222
+ current[1] += pos
223
+ current[2] += pos
227
224
  end
228
- part_with_range = parts_with_ranges.find { |part_with_range| cursor >= part_with_range[1] && cursor < part_with_range[2] } || parts_with_ranges[-1]
225
+ part_with_range = parts_with_ranges.find do |current|
226
+ cursor >= current[1] && cursor < current[2]
227
+ end || parts_with_ranges[-1]
229
228
  part_with_range[0]
230
229
  end
231
230
  end
data/bin/sqlui CHANGED
@@ -1,3 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require_relative '../app/server'
@@ -5198,57 +5198,31 @@ var sqlui = (function (exports) {
5198
5198
  parent.length += view.length;
5199
5199
  }
5200
5200
  function coordsInChildren(view, pos, side) {
5201
- if (!view.children.length)
5202
- return fallbackRect(view);
5203
- return (side <= 0 ? coordsInChildrenBefore : coordsInChildrenAfter)(view, pos);
5204
- }
5205
- function coordsInChildrenBefore(view, pos) {
5206
- // Find the last leaf in the tree that touches pos and doesn't have getSide() > 0
5207
- let found = null, foundPos = -1;
5201
+ let before = null, beforePos = -1, after = null, afterPos = -1;
5208
5202
  function scan(view, pos) {
5209
5203
  for (let i = 0, off = 0; i < view.children.length && off <= pos; i++) {
5210
5204
  let child = view.children[i], end = off + child.length;
5211
5205
  if (end >= pos) {
5212
5206
  if (child.children.length) {
5213
- if (scan(child, pos - off))
5214
- return true;
5207
+ scan(child, pos - off);
5215
5208
  }
5216
- else if (end >= pos) {
5217
- if (end == pos && child.getSide() > 0)
5218
- return true;
5219
- found = child;
5220
- foundPos = pos - off;
5221
- }
5222
- }
5223
- off = end;
5224
- }
5225
- }
5226
- scan(view, pos);
5227
- return found ? found.coordsAt(Math.max(0, foundPos), -1) : coordsInChildrenAfter(view, pos);
5228
- }
5229
- function coordsInChildrenAfter(view, pos) {
5230
- // Find the first leaf in the tree that touches pos and doesn't have getSide() < 0
5231
- let found = null, foundPos = -1;
5232
- function scan(view, pos) {
5233
- for (let i = view.children.length - 1, off = view.length; i >= 0 && off >= pos; i--) {
5234
- let child = view.children[i];
5235
- off -= child.length;
5236
- if (off <= pos) {
5237
- if (child.children.length) {
5238
- if (scan(child, pos - off))
5239
- return true;
5209
+ else if (!after && (end > pos || off == end && child.getSide() > 0)) {
5210
+ after = child;
5211
+ afterPos = pos - off;
5240
5212
  }
5241
- else if (off <= pos) {
5242
- if (off == pos && child.getSide() < 0)
5243
- return true;
5244
- found = child;
5245
- foundPos = pos - off;
5213
+ else if (off < pos || (off == end && child.getSide() < 0)) {
5214
+ before = child;
5215
+ beforePos = pos - off;
5246
5216
  }
5247
5217
  }
5218
+ off = end;
5248
5219
  }
5249
5220
  }
5250
5221
  scan(view, pos);
5251
- return found ? found.coordsAt(Math.max(0, foundPos), 1) : coordsInChildrenBefore(view, pos);
5222
+ let target = (side < 0 ? before : after) || before || after;
5223
+ if (target)
5224
+ return target.coordsAt(Math.max(0, target == before ? beforePos : afterPos), side);
5225
+ return fallbackRect(view);
5252
5226
  }
5253
5227
  function fallbackRect(view) {
5254
5228
  let last = view.dom.lastChild;
@@ -9713,6 +9687,15 @@ var sqlui = (function (exports) {
9713
9687
  newSel = EditorSelection.single(newSel.main.anchor - 1, newSel.main.head - 1);
9714
9688
  change = { from: sel.from, to: sel.to, insert: Text.of([" "]) };
9715
9689
  }
9690
+ else if (browser.chrome && change && change.from == change.to && change.from == sel.head &&
9691
+ change.insert.toString() == "\n " && view.lineWrapping) {
9692
+ // In Chrome, if you insert a space at the start of a wrapped
9693
+ // line, it will actually insert a newline and a space, causing a
9694
+ // bogus new line to be created in CodeMirror (#968)
9695
+ if (newSel)
9696
+ newSel = EditorSelection.single(newSel.main.anchor - 1, newSel.main.head - 1);
9697
+ change = { from: sel.from, to: sel.to, insert: Text.of([" "]) };
9698
+ }
9716
9699
  if (change) {
9717
9700
  let startState = view.state;
9718
9701
  if (browser.ios && view.inputState.flushIOSKey(view))
@@ -10637,17 +10620,19 @@ var sqlui = (function (exports) {
10637
10620
  logException(this.state, e);
10638
10621
  }
10639
10622
  }
10640
- if (this.viewState.scrollTarget) {
10641
- this.docView.scrollIntoView(this.viewState.scrollTarget);
10642
- this.viewState.scrollTarget = null;
10643
- scrolled = true;
10644
- }
10645
- else {
10646
- let diff = this.viewState.lineBlockAt(refBlock.from).top - refBlock.top;
10647
- if (diff > 1 || diff < -1) {
10648
- this.scrollDOM.scrollTop += diff;
10623
+ if (this.viewState.editorHeight) {
10624
+ if (this.viewState.scrollTarget) {
10625
+ this.docView.scrollIntoView(this.viewState.scrollTarget);
10626
+ this.viewState.scrollTarget = null;
10649
10627
  scrolled = true;
10650
10628
  }
10629
+ else {
10630
+ let diff = this.viewState.lineBlockAt(refBlock.from).top - refBlock.top;
10631
+ if (diff > 1 || diff < -1) {
10632
+ this.scrollDOM.scrollTop += diff;
10633
+ scrolled = true;
10634
+ }
10635
+ }
10651
10636
  }
10652
10637
  if (redrawn)
10653
10638
  this.docView.updateSelection(true);
@@ -12129,7 +12114,10 @@ var sqlui = (function (exports) {
12129
12114
  for (let i = startLine; i <= endLine; i++) {
12130
12115
  let line = state.doc.line(i);
12131
12116
  let start = findColumn(line.text, startCol, state.tabSize, true);
12132
- if (start > -1) {
12117
+ if (start < 0) {
12118
+ ranges.push(EditorSelection.cursor(line.to));
12119
+ }
12120
+ else {
12133
12121
  let end = findColumn(line.text, endCol, state.tabSize);
12134
12122
  ranges.push(EditorSelection.range(line.from + start, line.from + end));
12135
12123
  }
@@ -12241,6 +12229,7 @@ var sqlui = (function (exports) {
12241
12229
  this.tooltipViews = this.tooltips.map(createTooltipView);
12242
12230
  }
12243
12231
  update(update) {
12232
+ var _a;
12244
12233
  let input = update.state.facet(this.facet);
12245
12234
  let tooltips = input.filter(x => x);
12246
12235
  if (input === this.input) {
@@ -12269,8 +12258,10 @@ var sqlui = (function (exports) {
12269
12258
  }
12270
12259
  }
12271
12260
  for (let t of this.tooltipViews)
12272
- if (tooltipViews.indexOf(t) < 0)
12261
+ if (tooltipViews.indexOf(t) < 0) {
12273
12262
  t.dom.remove();
12263
+ (_a = t.destroy) === null || _a === void 0 ? void 0 : _a.call(t);
12264
+ }
12274
12265
  this.input = input;
12275
12266
  this.tooltips = tooltips;
12276
12267
  this.tooltipViews = tooltipViews;
@@ -12383,11 +12374,13 @@ var sqlui = (function (exports) {
12383
12374
  return tooltipView;
12384
12375
  }
12385
12376
  destroy() {
12386
- var _a;
12377
+ var _a, _b;
12387
12378
  this.view.win.removeEventListener("resize", this.measureSoon);
12388
- for (let { dom } of this.manager.tooltipViews)
12389
- dom.remove();
12390
- (_a = this.intersectionObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
12379
+ for (let tooltipView of this.manager.tooltipViews) {
12380
+ tooltipView.dom.remove();
12381
+ (_a = tooltipView.destroy) === null || _a === void 0 ? void 0 : _a.call(tooltipView);
12382
+ }
12383
+ (_b = this.intersectionObserver) === null || _b === void 0 ? void 0 : _b.disconnect();
12391
12384
  clearTimeout(this.measureTimeout);
12392
12385
  }
12393
12386
  readMeasure() {
@@ -14811,23 +14804,25 @@ var sqlui = (function (exports) {
14811
14804
  let set = [], tag = new Tag(set, base, mods);
14812
14805
  for (let m of mods)
14813
14806
  m.instances.push(tag);
14814
- let configs = permute(mods);
14807
+ let configs = powerSet(mods);
14815
14808
  for (let parent of base.set)
14816
- for (let config of configs)
14817
- set.push(Modifier.get(parent, config));
14809
+ if (!parent.modified.length)
14810
+ for (let config of configs)
14811
+ set.push(Modifier.get(parent, config));
14818
14812
  return tag;
14819
14813
  }
14820
14814
  }
14821
14815
  function sameArray(a, b) {
14822
14816
  return a.length == b.length && a.every((x, i) => x == b[i]);
14823
14817
  }
14824
- function permute(array) {
14825
- let result = [array];
14818
+ function powerSet(array) {
14819
+ let sets = [[]];
14826
14820
  for (let i = 0; i < array.length; i++) {
14827
- for (let a of permute(array.slice(0, i).concat(array.slice(i + 1))))
14828
- result.push(a);
14821
+ for (let j = 0, e = sets.length; j < e; j++) {
14822
+ sets.push(sets[j].concat(array[i]));
14823
+ }
14829
14824
  }
14830
- return result;
14825
+ return sets.sort((a, b) => b.length - a.length);
14831
14826
  }
14832
14827
  /// This function is used to add a set of tags to a language syntax
14833
14828
  /// via [`NodeSet.extend`](#common.NodeSet.extend) or
@@ -18630,7 +18625,7 @@ var sqlui = (function (exports) {
18630
18625
  if (match) {
18631
18626
  let from = this.curLineStart + match.index, to = from + match[0].length;
18632
18627
  this.matchPos = toCharEnd(this.text, to + (from == to ? 1 : 0));
18633
- if (from == this.curLine.length)
18628
+ if (from == this.curLineStart + this.curLine.length)
18634
18629
  this.nextLine();
18635
18630
  if ((from < to || from > this.value.to) && (!this.test || this.test(from, to, match))) {
18636
18631
  this.value = { from, to, match };
@@ -19015,10 +19010,17 @@ var sqlui = (function (exports) {
19015
19010
  this.regexp = !!config.regexp;
19016
19011
  this.replace = config.replace || "";
19017
19012
  this.valid = !!this.search && (!this.regexp || validRegExp(this.search));
19018
- this.unquoted = this.literal ? this.search : this.search.replace(/\\([nrt\\])/g, (_, ch) => ch == "n" ? "\n" : ch == "r" ? "\r" : ch == "t" ? "\t" : "\\");
19013
+ this.unquoted = this.unquote(this.search);
19019
19014
  this.wholeWord = !!config.wholeWord;
19020
19015
  }
19021
19016
  /**
19017
+ @internal
19018
+ */
19019
+ unquote(text) {
19020
+ return this.literal ? text :
19021
+ text.replace(/\\([nrt\\])/g, (_, ch) => ch == "n" ? "\n" : ch == "r" ? "\r" : ch == "t" ? "\t" : "\\");
19022
+ }
19023
+ /**
19022
19024
  Compare this query to another query.
19023
19025
  */
19024
19026
  eq(other) {
@@ -19092,7 +19094,7 @@ var sqlui = (function (exports) {
19092
19094
  return this.prevMatchInRange(state, 0, curFrom) ||
19093
19095
  this.prevMatchInRange(state, curTo, state.doc.length);
19094
19096
  }
19095
- getReplacement(_result) { return this.spec.replace; }
19097
+ getReplacement(_result) { return this.spec.unquote(this.spec.replace); }
19096
19098
  matchAll(state, limit) {
19097
19099
  let cursor = stringCursor(this.spec, state, 0, state.doc.length), ranges = [];
19098
19100
  while (!cursor.next().done) {
@@ -19151,10 +19153,10 @@ var sqlui = (function (exports) {
19151
19153
  this.prevMatchInRange(state, curTo, state.doc.length);
19152
19154
  }
19153
19155
  getReplacement(result) {
19154
- return this.spec.replace.replace(/\$([$&\d+])/g, (m, i) => i == "$" ? "$"
19156
+ return this.spec.unquote(this.spec.replace.replace(/\$([$&\d+])/g, (m, i) => i == "$" ? "$"
19155
19157
  : i == "&" ? result.match[0]
19156
19158
  : i != "0" && +i < result.match.length ? result.match[i]
19157
- : m);
19159
+ : m));
19158
19160
  }
19159
19161
  matchAll(state, limit) {
19160
19162
  let cursor = regexpCursor(this.spec, state, 0, state.doc.length), ranges = [];
@@ -19446,6 +19448,7 @@ var sqlui = (function (exports) {
19446
19448
  "aria-label": phrase(view, "Find"),
19447
19449
  class: "cm-textfield",
19448
19450
  name: "search",
19451
+ form: "",
19449
19452
  "main-field": "true",
19450
19453
  onchange: this.commit,
19451
19454
  onkeyup: this.commit
@@ -19456,24 +19459,28 @@ var sqlui = (function (exports) {
19456
19459
  "aria-label": phrase(view, "Replace"),
19457
19460
  class: "cm-textfield",
19458
19461
  name: "replace",
19462
+ form: "",
19459
19463
  onchange: this.commit,
19460
19464
  onkeyup: this.commit
19461
19465
  });
19462
19466
  this.caseField = crelt("input", {
19463
19467
  type: "checkbox",
19464
19468
  name: "case",
19469
+ form: "",
19465
19470
  checked: query.caseSensitive,
19466
19471
  onchange: this.commit
19467
19472
  });
19468
19473
  this.reField = crelt("input", {
19469
19474
  type: "checkbox",
19470
19475
  name: "re",
19476
+ form: "",
19471
19477
  checked: query.regexp,
19472
19478
  onchange: this.commit
19473
19479
  });
19474
19480
  this.wordField = crelt("input", {
19475
19481
  type: "checkbox",
19476
19482
  name: "word",
19483
+ form: "",
19477
19484
  checked: query.wholeWord,
19478
19485
  onchange: this.commit
19479
19486
  });
@@ -23266,10 +23273,10 @@ var sqlui = (function (exports) {
23266
23273
  Builtin = 24;
23267
23274
 
23268
23275
  function isAlpha(ch) {
23269
- return ch >= 65 /* A */ && ch <= 90 /* Z */ || ch >= 97 /* a */ && ch <= 122 /* z */ || ch >= 48 /* _0 */ && ch <= 57 /* _9 */;
23276
+ return ch >= 65 /* Ch.A */ && ch <= 90 /* Ch.Z */ || ch >= 97 /* Ch.a */ && ch <= 122 /* Ch.z */ || ch >= 48 /* Ch._0 */ && ch <= 57 /* Ch._9 */;
23270
23277
  }
23271
23278
  function isHexDigit(ch) {
23272
- return ch >= 48 /* _0 */ && ch <= 57 /* _9 */ || ch >= 97 /* a */ && ch <= 102 /* f */ || ch >= 65 /* A */ && ch <= 70 /* F */;
23279
+ return ch >= 48 /* Ch._0 */ && ch <= 57 /* Ch._9 */ || ch >= 97 /* Ch.a */ && ch <= 102 /* Ch.f */ || ch >= 65 /* Ch.A */ && ch <= 70 /* Ch.F */;
23273
23280
  }
23274
23281
  function readLiteral(input, endQuote, backslashEscapes) {
23275
23282
  for (let escaped = false;;) {
@@ -23279,7 +23286,7 @@ var sqlui = (function (exports) {
23279
23286
  input.advance();
23280
23287
  return;
23281
23288
  }
23282
- escaped = backslashEscapes && !escaped && input.next == 92 /* Backslash */;
23289
+ escaped = backslashEscapes && !escaped && input.next == 92 /* Ch.Backslash */;
23283
23290
  input.advance();
23284
23291
  }
23285
23292
  }
@@ -23287,7 +23294,7 @@ var sqlui = (function (exports) {
23287
23294
  for (;;) {
23288
23295
  if (input.next < 0 || input.peek(1) < 0)
23289
23296
  return;
23290
- if (input.next == 36 /* Dollar */ && input.peek(1) == 36 /* Dollar */) {
23297
+ if (input.next == 36 /* Ch.Dollar */ && input.peek(1) == 36 /* Ch.Dollar */) {
23291
23298
  input.advance(2);
23292
23299
  return;
23293
23300
  }
@@ -23296,7 +23303,7 @@ var sqlui = (function (exports) {
23296
23303
  }
23297
23304
  function readWord(input, result) {
23298
23305
  for (;;) {
23299
- if (input.next != 95 /* Underscore */ && !isAlpha(input.next))
23306
+ if (input.next != 95 /* Ch.Underscore */ && !isAlpha(input.next))
23300
23307
  break;
23301
23308
  if (result != null)
23302
23309
  result += String.fromCharCode(input.next);
@@ -23305,7 +23312,7 @@ var sqlui = (function (exports) {
23305
23312
  return result;
23306
23313
  }
23307
23314
  function readWordOrQuoted(input) {
23308
- if (input.next == 39 /* SingleQuote */ || input.next == 34 /* DoubleQuote */ || input.next == 96 /* Backtick */) {
23315
+ if (input.next == 39 /* Ch.SingleQuote */ || input.next == 34 /* Ch.DoubleQuote */ || input.next == 96 /* Ch.Backtick */) {
23309
23316
  let quote = input.next;
23310
23317
  input.advance();
23311
23318
  readLiteral(input, quote, false);
@@ -23315,33 +23322,33 @@ var sqlui = (function (exports) {
23315
23322
  }
23316
23323
  }
23317
23324
  function readBits(input, endQuote) {
23318
- while (input.next == 48 /* _0 */ || input.next == 49 /* _1 */)
23325
+ while (input.next == 48 /* Ch._0 */ || input.next == 49 /* Ch._1 */)
23319
23326
  input.advance();
23320
23327
  if (endQuote && input.next == endQuote)
23321
23328
  input.advance();
23322
23329
  }
23323
23330
  function readNumber(input, sawDot) {
23324
23331
  for (;;) {
23325
- if (input.next == 46 /* Dot */) {
23332
+ if (input.next == 46 /* Ch.Dot */) {
23326
23333
  if (sawDot)
23327
23334
  break;
23328
23335
  sawDot = true;
23329
23336
  }
23330
- else if (input.next < 48 /* _0 */ || input.next > 57 /* _9 */) {
23337
+ else if (input.next < 48 /* Ch._0 */ || input.next > 57 /* Ch._9 */) {
23331
23338
  break;
23332
23339
  }
23333
23340
  input.advance();
23334
23341
  }
23335
- if (input.next == 69 /* E */ || input.next == 101 /* e */) {
23342
+ if (input.next == 69 /* Ch.E */ || input.next == 101 /* Ch.e */) {
23336
23343
  input.advance();
23337
- if (input.next == 43 /* Plus */ || input.next == 45 /* Dash */)
23344
+ if (input.next == 43 /* Ch.Plus */ || input.next == 45 /* Ch.Dash */)
23338
23345
  input.advance();
23339
- while (input.next >= 48 /* _0 */ && input.next <= 57 /* _9 */)
23346
+ while (input.next >= 48 /* Ch._0 */ && input.next <= 57 /* Ch._9 */)
23340
23347
  input.advance();
23341
23348
  }
23342
23349
  }
23343
23350
  function eol(input) {
23344
- while (!(input.next < 0 || input.next == 10 /* Newline */))
23351
+ while (!(input.next < 0 || input.next == 10 /* Ch.Newline */))
23345
23352
  input.advance();
23346
23353
  }
23347
23354
  function inString(ch, str) {
@@ -23401,31 +23408,31 @@ var sqlui = (function (exports) {
23401
23408
  input.advance();
23402
23409
  input.acceptToken(whitespace);
23403
23410
  }
23404
- else if (next == 36 /* Dollar */ && input.next == 36 /* Dollar */ && d.doubleDollarStrings) {
23411
+ else if (next == 36 /* Ch.Dollar */ && input.next == 36 /* Ch.Dollar */ && d.doubleDollarStrings) {
23405
23412
  readDoubleDollarLiteral(input);
23406
23413
  input.acceptToken(String$1);
23407
23414
  }
23408
- else if (next == 39 /* SingleQuote */ || next == 34 /* DoubleQuote */ && d.doubleQuotedStrings) {
23415
+ else if (next == 39 /* Ch.SingleQuote */ || next == 34 /* Ch.DoubleQuote */ && d.doubleQuotedStrings) {
23409
23416
  readLiteral(input, next, d.backslashEscapes);
23410
23417
  input.acceptToken(String$1);
23411
23418
  }
23412
- else if (next == 35 /* Hash */ && d.hashComments ||
23413
- next == 47 /* Slash */ && input.next == 47 /* Slash */ && d.slashComments) {
23419
+ else if (next == 35 /* Ch.Hash */ && d.hashComments ||
23420
+ next == 47 /* Ch.Slash */ && input.next == 47 /* Ch.Slash */ && d.slashComments) {
23414
23421
  eol(input);
23415
23422
  input.acceptToken(LineComment);
23416
23423
  }
23417
- else if (next == 45 /* Dash */ && input.next == 45 /* Dash */ &&
23418
- (!d.spaceAfterDashes || input.peek(2) == 32 /* Space */)) {
23424
+ else if (next == 45 /* Ch.Dash */ && input.next == 45 /* Ch.Dash */ &&
23425
+ (!d.spaceAfterDashes || input.peek(1) == 32 /* Ch.Space */)) {
23419
23426
  eol(input);
23420
23427
  input.acceptToken(LineComment);
23421
23428
  }
23422
- else if (next == 47 /* Slash */ && input.next == 42 /* Star */) {
23429
+ else if (next == 47 /* Ch.Slash */ && input.next == 42 /* Ch.Star */) {
23423
23430
  input.advance();
23424
23431
  for (let prev = -1, depth = 1;;) {
23425
23432
  if (input.next < 0)
23426
23433
  break;
23427
23434
  input.advance();
23428
- if (prev == 42 /* Star */ && input.next == 47 /* Slash */) {
23435
+ if (prev == 42 /* Ch.Star */ && input.next == 47 /* Ch.Slash */) {
23429
23436
  depth--;
23430
23437
  if (!depth) {
23431
23438
  input.advance();
@@ -23433,7 +23440,7 @@ var sqlui = (function (exports) {
23433
23440
  }
23434
23441
  prev = -1;
23435
23442
  }
23436
- else if (prev == 47 /* Slash */ && input.next == 42 /* Star */) {
23443
+ else if (prev == 47 /* Ch.Slash */ && input.next == 42 /* Ch.Star */) {
23437
23444
  depth++;
23438
23445
  prev = -1;
23439
23446
  }
@@ -23443,21 +23450,21 @@ var sqlui = (function (exports) {
23443
23450
  }
23444
23451
  input.acceptToken(BlockComment);
23445
23452
  }
23446
- else if ((next == 101 /* e */ || next == 69 /* E */) && input.next == 39 /* SingleQuote */) {
23453
+ else if ((next == 101 /* Ch.e */ || next == 69 /* Ch.E */) && input.next == 39 /* Ch.SingleQuote */) {
23447
23454
  input.advance();
23448
- readLiteral(input, 39 /* SingleQuote */, true);
23455
+ readLiteral(input, 39 /* Ch.SingleQuote */, true);
23449
23456
  }
23450
- else if ((next == 110 /* n */ || next == 78 /* N */) && input.next == 39 /* SingleQuote */ &&
23457
+ else if ((next == 110 /* Ch.n */ || next == 78 /* Ch.N */) && input.next == 39 /* Ch.SingleQuote */ &&
23451
23458
  d.charSetCasts) {
23452
23459
  input.advance();
23453
- readLiteral(input, 39 /* SingleQuote */, d.backslashEscapes);
23460
+ readLiteral(input, 39 /* Ch.SingleQuote */, d.backslashEscapes);
23454
23461
  input.acceptToken(String$1);
23455
23462
  }
23456
- else if (next == 95 /* Underscore */ && d.charSetCasts) {
23463
+ else if (next == 95 /* Ch.Underscore */ && d.charSetCasts) {
23457
23464
  for (let i = 0;; i++) {
23458
- if (input.next == 39 /* SingleQuote */ && i > 1) {
23465
+ if (input.next == 39 /* Ch.SingleQuote */ && i > 1) {
23459
23466
  input.advance();
23460
- readLiteral(input, 39 /* SingleQuote */, d.backslashEscapes);
23467
+ readLiteral(input, 39 /* Ch.SingleQuote */, d.backslashEscapes);
23461
23468
  input.acceptToken(String$1);
23462
23469
  break;
23463
23470
  }
@@ -23466,33 +23473,33 @@ var sqlui = (function (exports) {
23466
23473
  input.advance();
23467
23474
  }
23468
23475
  }
23469
- else if (next == 40 /* ParenL */) {
23476
+ else if (next == 40 /* Ch.ParenL */) {
23470
23477
  input.acceptToken(ParenL);
23471
23478
  }
23472
- else if (next == 41 /* ParenR */) {
23479
+ else if (next == 41 /* Ch.ParenR */) {
23473
23480
  input.acceptToken(ParenR);
23474
23481
  }
23475
- else if (next == 123 /* BraceL */) {
23482
+ else if (next == 123 /* Ch.BraceL */) {
23476
23483
  input.acceptToken(BraceL);
23477
23484
  }
23478
- else if (next == 125 /* BraceR */) {
23485
+ else if (next == 125 /* Ch.BraceR */) {
23479
23486
  input.acceptToken(BraceR);
23480
23487
  }
23481
- else if (next == 91 /* BracketL */) {
23488
+ else if (next == 91 /* Ch.BracketL */) {
23482
23489
  input.acceptToken(BracketL);
23483
23490
  }
23484
- else if (next == 93 /* BracketR */) {
23491
+ else if (next == 93 /* Ch.BracketR */) {
23485
23492
  input.acceptToken(BracketR);
23486
23493
  }
23487
- else if (next == 59 /* Semi */) {
23494
+ else if (next == 59 /* Ch.Semi */) {
23488
23495
  input.acceptToken(Semi);
23489
23496
  }
23490
- else if (d.unquotedBitLiterals && next == 48 /* _0 */ && input.next == 98 /* b */) {
23497
+ else if (d.unquotedBitLiterals && next == 48 /* Ch._0 */ && input.next == 98 /* Ch.b */) {
23491
23498
  input.advance();
23492
23499
  readBits(input);
23493
23500
  input.acceptToken(Bits);
23494
23501
  }
23495
- else if ((next == 98 /* b */ || next == 66 /* B */) && (input.next == 39 /* SingleQuote */ || input.next == 34 /* DoubleQuote */)) {
23502
+ else if ((next == 98 /* Ch.b */ || next == 66 /* Ch.B */) && (input.next == 39 /* Ch.SingleQuote */ || input.next == 34 /* Ch.DoubleQuote */)) {
23496
23503
  const quoteStyle = input.next;
23497
23504
  input.advance();
23498
23505
  if (d.treatBitsAsBytes) {
@@ -23504,24 +23511,24 @@ var sqlui = (function (exports) {
23504
23511
  input.acceptToken(Bits);
23505
23512
  }
23506
23513
  }
23507
- else if (next == 48 /* _0 */ && (input.next == 120 /* x */ || input.next == 88 /* X */) ||
23508
- (next == 120 /* x */ || next == 88 /* X */) && input.next == 39 /* SingleQuote */) {
23509
- let quoted = input.next == 39 /* SingleQuote */;
23514
+ else if (next == 48 /* Ch._0 */ && (input.next == 120 /* Ch.x */ || input.next == 88 /* Ch.X */) ||
23515
+ (next == 120 /* Ch.x */ || next == 88 /* Ch.X */) && input.next == 39 /* Ch.SingleQuote */) {
23516
+ let quoted = input.next == 39 /* Ch.SingleQuote */;
23510
23517
  input.advance();
23511
23518
  while (isHexDigit(input.next))
23512
23519
  input.advance();
23513
- if (quoted && input.next == 39 /* SingleQuote */)
23520
+ if (quoted && input.next == 39 /* Ch.SingleQuote */)
23514
23521
  input.advance();
23515
23522
  input.acceptToken(Number);
23516
23523
  }
23517
- else if (next == 46 /* Dot */ && input.next >= 48 /* _0 */ && input.next <= 57 /* _9 */) {
23524
+ else if (next == 46 /* Ch.Dot */ && input.next >= 48 /* Ch._0 */ && input.next <= 57 /* Ch._9 */) {
23518
23525
  readNumber(input, true);
23519
23526
  input.acceptToken(Number);
23520
23527
  }
23521
- else if (next == 46 /* Dot */) {
23528
+ else if (next == 46 /* Ch.Dot */) {
23522
23529
  input.acceptToken(Dot);
23523
23530
  }
23524
- else if (next >= 48 /* _0 */ && next <= 57 /* _9 */) {
23531
+ else if (next >= 48 /* Ch._0 */ && next <= 57 /* Ch._9 */) {
23525
23532
  readNumber(input, false);
23526
23533
  input.acceptToken(Number);
23527
23534
  }
@@ -23540,12 +23547,12 @@ var sqlui = (function (exports) {
23540
23547
  readLiteral(input, next, false);
23541
23548
  input.acceptToken(QuotedIdentifier);
23542
23549
  }
23543
- else if (next == 58 /* Colon */ || next == 44 /* Comma */) {
23550
+ else if (next == 58 /* Ch.Colon */ || next == 44 /* Ch.Comma */) {
23544
23551
  input.acceptToken(Punctuation);
23545
23552
  }
23546
23553
  else if (isAlpha(next)) {
23547
23554
  let word = readWord(input, String.fromCharCode(next));
23548
- input.acceptToken(input.next == 46 /* Dot */ ? Identifier : (_a = d.words[word.toLowerCase()]) !== null && _a !== void 0 ? _a : Identifier);
23555
+ input.acceptToken(input.next == 46 /* Ch.Dot */ ? Identifier : (_a = d.words[word.toLowerCase()]) !== null && _a !== void 0 ? _a : Identifier);
23549
23556
  }
23550
23557
  });
23551
23558
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqlui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.16
4
+ version: 0.1.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Dower
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '3.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: sinatra
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -155,7 +169,8 @@ files:
155
169
  homepage: https://github.com/nicholasdower/sqlui
156
170
  licenses:
157
171
  - MIT
158
- metadata: {}
172
+ metadata:
173
+ rubygems_mfa_required: 'true'
159
174
  post_install_message:
160
175
  rdoc_options: []
161
176
  require_paths:
@@ -164,7 +179,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
164
179
  requirements:
165
180
  - - ">="
166
181
  - !ruby/object:Gem::Version
167
- version: '0'
182
+ version: 3.0.0
168
183
  required_rubygems_version: !ruby/object:Gem::Requirement
169
184
  requirements:
170
185
  - - ">="