ether-code 0.1.5 → 0.1.7

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 (44) hide show
  1. package/cli/ether.js +1 -1
  2. package/generators/css-generator.js +42 -55
  3. package/generators/graphql-generator.js +19 -22
  4. package/generators/html-generator.js +51 -182
  5. package/generators/js-generator.js +76 -157
  6. package/generators/node-generator.js +49 -93
  7. package/generators/php-generator.js +46 -68
  8. package/generators/python-generator.js +35 -54
  9. package/generators/react-generator.js +37 -47
  10. package/generators/ruby-generator.js +59 -119
  11. package/generators/sql-generator.js +42 -63
  12. package/generators/ts-generator.js +59 -133
  13. package/i18n/i18n-css.json +147 -147
  14. package/i18n/i18n-graphql.json +6 -6
  15. package/i18n/i18n-html.json +135 -135
  16. package/i18n/i18n-js.json +107 -107
  17. package/i18n/i18n-node.json +14 -14
  18. package/i18n/i18n-php.json +177 -177
  19. package/i18n/i18n-python.json +16 -16
  20. package/i18n/i18n-react.json +97 -97
  21. package/i18n/i18n-ruby.json +22 -22
  22. package/i18n/i18n-sql.json +153 -153
  23. package/i18n/i18n-ts.json +10 -10
  24. package/lexer/ether-lexer.js +175 -34
  25. package/lexer/tokens.js +6 -6
  26. package/package.json +1 -1
  27. package/parsers/ast-css.js +0 -545
  28. package/parsers/ast-graphql.js +0 -424
  29. package/parsers/ast-html.js +0 -886
  30. package/parsers/ast-js.js +0 -750
  31. package/parsers/ast-node.js +0 -2440
  32. package/parsers/ast-php.js +0 -957
  33. package/parsers/ast-react.js +0 -580
  34. package/parsers/ast-ruby.js +0 -895
  35. package/parsers/ast-ts.js +0 -1352
  36. package/parsers/css-parser.js +0 -1981
  37. package/parsers/graphql-parser.js +0 -2011
  38. package/parsers/html-parser.js +0 -1182
  39. package/parsers/js-parser.js +0 -2564
  40. package/parsers/node-parser.js +0 -2644
  41. package/parsers/php-parser.js +0 -3037
  42. package/parsers/react-parser.js +0 -1035
  43. package/parsers/ruby-parser.js +0 -2680
  44. package/parsers/ts-parser.js +0 -3881
@@ -5,8 +5,6 @@ class RubyGenerator {
5
5
  this.i18n = null
6
6
  this.indent = 0
7
7
  this.output = ''
8
- this.keywordMap = {}
9
- this.methodMap = {}
10
8
 
11
9
  if (i18nPath) {
12
10
  this.loadI18n(i18nPath)
@@ -58,7 +56,7 @@ class RubyGenerator {
58
56
  'jusqua': 'until',
59
57
  'faire': 'do',
60
58
  'fin': 'end',
61
- 'définir': 'def',
59
+ 'definir': 'def',
62
60
  'classe': 'class',
63
61
  'module': 'module',
64
62
  'retourner': 'return',
@@ -79,13 +77,13 @@ class RubyGenerator {
79
77
  'nul': 'nil',
80
78
  'soi': 'self',
81
79
  'super': 'super',
82
- 'hériter': '<',
80
+ 'heriter': '<',
83
81
  'inclure': 'include',
84
82
  'etendre': 'extend',
85
83
  'prepend': 'prepend',
86
84
  'public': 'public',
87
- 'privé': 'private',
88
- 'protégé': 'protected',
85
+ 'prive': 'private',
86
+ 'protege': 'protected',
89
87
  'attr lecteur': 'attr_reader',
90
88
  'attr ecrivain': 'attr_writer',
91
89
  'attr accesseur': 'attr_accessor',
@@ -106,7 +104,7 @@ class RubyGenerator {
106
104
  'pousser': 'push',
107
105
  'retirer': 'pop',
108
106
  'decaler': 'shift',
109
- 'insérer début': 'unshift',
107
+ 'inserer debut': 'unshift',
110
108
  'ajouter': '<<',
111
109
  'concatener': '+',
112
110
  'aplatir': 'flatten',
@@ -117,11 +115,11 @@ class RubyGenerator {
117
115
  'chaque': 'each',
118
116
  'mapper': 'map',
119
117
  'collecter': 'collect',
120
- 'sélectionner': 'select',
118
+ 'selectionner': 'select',
121
119
  'rejeter': 'reject',
122
120
  'trouver': 'find',
123
121
  'detecter': 'detect',
124
- 'réduire': 'reduce',
122
+ 'reduire': 'reduce',
125
123
  'injecter': 'inject',
126
124
  'tout': 'all?',
127
125
  'quelconque': 'any?',
@@ -140,7 +138,7 @@ class RubyGenerator {
140
138
  'majuscules': 'upcase',
141
139
  'minuscules': 'downcase',
142
140
  'capitaliser': 'capitalize',
143
- 'inverser chaîne': 'reverse',
141
+ 'inverser chaine': 'reverse',
144
142
  'supprimer espaces': 'strip',
145
143
  'supprimer gauche': 'lstrip',
146
144
  'supprimer droite': 'rstrip',
@@ -154,21 +152,21 @@ class RubyGenerator {
154
152
  'contient': 'include?',
155
153
  'vers entier': 'to_i',
156
154
  'vers flottant': 'to_f',
157
- 'vers chaîne': 'to_s',
155
+ 'vers chaine': 'to_s',
158
156
  'vers symbole': 'to_sym',
159
157
  'vers tableau': 'to_a',
160
158
  'vers hash': 'to_h',
161
- 'clés': 'keys',
159
+ 'cles': 'keys',
162
160
  'valeurs': 'values',
163
161
  'fusionner': 'merge',
164
162
  'chercher': 'fetch',
165
163
  'stocker': 'store',
166
- 'supprimer clé': 'delete',
167
- 'a clé': 'has_key?',
164
+ 'supprimer cle': 'delete',
165
+ 'a cle': 'has_key?',
168
166
  'a valeur': 'has_value?',
169
167
  'ouvrir': 'open',
170
168
  'lire': 'read',
171
- 'écrire': 'write',
169
+ 'ecrire': 'write',
172
170
  'fermer': 'close',
173
171
  'chaque ligne': 'each_line',
174
172
  'lire lignes': 'readlines',
@@ -181,13 +179,13 @@ class RubyGenerator {
181
179
  'aujourdhui': 'Date.today',
182
180
  'analyser date': 'parse',
183
181
  'formater': 'strftime',
184
- 'année': 'year',
182
+ 'annee': 'year',
185
183
  'mois': 'month',
186
184
  'jour': 'day',
187
185
  'heure': 'hour',
188
186
  'minute': 'min',
189
187
  'seconde': 'sec',
190
- 'aléatoire': 'rand',
188
+ 'aleatoire': 'rand',
191
189
  'absolu': 'abs',
192
190
  'arrondir': 'round',
193
191
  'plancher': 'floor',
@@ -198,7 +196,7 @@ class RubyGenerator {
198
196
  'proc': 'Proc.new',
199
197
  'appeler': 'call',
200
198
  'bloc donne': 'block_given?',
201
- 'méthode': 'method',
199
+ 'methode': 'method',
202
200
  'envoyer': 'send',
203
201
  'repondre a': 'respond_to?',
204
202
  'instance de': 'is_a?',
@@ -232,22 +230,13 @@ class RubyGenerator {
232
230
 
233
231
  if (Array.isArray(ast)) {
234
232
  for (const node of ast) {
235
- const result = this.generateNode(node)
236
- if (result !== undefined && result !== '' && this.output === '') {
237
- return result
238
- }
233
+ this.generateNode(node)
239
234
  }
240
235
  } else if (ast && ast.type) {
241
- const result = this.generateNode(ast)
242
- if (result !== undefined && result !== '' && this.output === '') {
243
- return result
244
- }
236
+ this.generateNode(ast)
245
237
  } else if (ast && ast.body) {
246
238
  for (const node of ast.body) {
247
- const result = this.generateNode(node)
248
- if (result !== undefined && result !== '' && this.output === '') {
249
- return result
250
- }
239
+ this.generateNode(node)
251
240
  }
252
241
  }
253
242
 
@@ -258,6 +247,15 @@ class RubyGenerator {
258
247
  if (!node) return ''
259
248
 
260
249
  switch (node.type) {
250
+ case 'Program':
251
+ if (node.body) {
252
+ for (const child of node.body) {
253
+ this.generateNode(child)
254
+ }
255
+ }
256
+ return
257
+ case 'VariableDeclaration':
258
+ return this.generateVariableDeclaration(node)
261
259
  case 'RequireStatement':
262
260
  return this.generateRequire(node)
263
261
  case 'ModuleDeclaration':
@@ -265,7 +263,6 @@ class RubyGenerator {
265
263
  case 'ClassDeclaration':
266
264
  return this.generateClass(node)
267
265
  case 'MethodDef':
268
- case 'MethodDeclaration':
269
266
  case 'FunctionDeclaration':
270
267
  return this.generateMethod(node)
271
268
  case 'IfStatement':
@@ -285,7 +282,6 @@ class RubyGenerator {
285
282
  case 'TimesStatement':
286
283
  return this.generateTimes(node)
287
284
  case 'BeginRescue':
288
- case 'BeginStatement':
289
285
  case 'TryStatement':
290
286
  return this.generateBeginRescue(node)
291
287
  case 'ReturnStatement':
@@ -319,71 +315,16 @@ class RubyGenerator {
319
315
  case 'SymbolExpression':
320
316
  return this.generateSymbol(node)
321
317
  case 'StringInterpolation':
322
- case 'InterpolatedString':
323
318
  return this.generateStringInterpolation(node)
324
- case 'BinaryExpression':
325
- return this.generateBinary(node)
326
- case 'UnaryExpression':
327
- return this.generateUnary(node)
328
- case 'TernaryExpression':
329
- case 'ConditionalExpression':
330
- return this.generateTernary(node)
331
- case 'MethodCallExpression':
332
- return this.generateMethodCall(node)
333
319
  case 'Identifier':
334
320
  return this.translateIdentifier(node.name)
335
321
  case 'Literal':
336
322
  return this.generateLiteral(node)
337
323
  default:
338
- if (node.name && !node.type) {
339
- return this.translateIdentifier(node.name)
340
- }
341
324
  return ''
342
325
  }
343
326
  }
344
327
 
345
- generateBinary(node) {
346
- const left = this.generateNode(node.left)
347
- const right = this.generateNode(node.right)
348
- const op = node.operator
349
- return `${left} ${op} ${right}`
350
- }
351
-
352
- generateUnary(node) {
353
- const operand = this.generateNode(node.operand || node.argument)
354
- const op = node.operator
355
- if (op === 'not' || op === '!') {
356
- return `${op === 'not' ? 'not ' : '!'}${operand}`
357
- }
358
- return `${op}${operand}`
359
- }
360
-
361
- generateTernary(node) {
362
- const test = this.generateNode(node.test)
363
- const consequent = this.generateNode(node.consequent)
364
- const alternate = this.generateNode(node.alternate)
365
- return `${test} ? ${consequent} : ${alternate}`
366
- }
367
-
368
- generateMethodCall(node) {
369
- const receiver = this.generateNode(node.receiver)
370
- const method = this.translate(node.method)
371
- const args = (node.arguments || []).map(a => this.generateNode(a)).join(', ')
372
- const safe = node.safe ? '&.' : '.'
373
- const argsStr = args ? `(${args})` : ''
374
-
375
- if (node.block) {
376
- const blockParams = node.block.params ? '|' + node.block.params.map(p => p.name || p).join(', ') + '|' : ''
377
- const blockBody = (node.block.body || []).map(s => this.generateNode(s)).join('; ')
378
- if (node.block.body?.length === 1) {
379
- return `${receiver}${safe}${method}${argsStr} { ${blockParams} ${blockBody} }`
380
- }
381
- return `${receiver}${safe}${method}${argsStr} do ${blockParams}\n${blockBody}\nend`
382
- }
383
-
384
- return `${receiver}${safe}${method}${argsStr}`
385
- }
386
-
387
328
  generateRequire(node) {
388
329
  const path = typeof node.path === 'string' ? node.path : this.generateNode(node.path)
389
330
  const method = node.relative ? 'require_relative' : 'require'
@@ -423,21 +364,24 @@ class RubyGenerator {
423
364
  this.writeLine('')
424
365
  }
425
366
 
426
- const attrs = node.attrs || node.attributes || []
427
- if (attrs.length > 0) {
428
- const accessors = attrs.filter(a => a.accessor === 'accessor')
429
- const readers = attrs.filter(a => a.accessor === 'reader')
430
- const writers = attrs.filter(a => a.accessor === 'writer')
367
+ if (node.attrs) {
368
+ const readers = node.attrs.filter(a => a.access === 'read' || a.access === 'accessor')
369
+ const writers = node.attrs.filter(a => a.access === 'write')
370
+ const accessors = node.attrs.filter(a => a.access === 'accessor')
431
371
 
432
372
  if (accessors.length > 0) {
433
373
  this.writeLine(`attr_accessor ${accessors.map(a => ':' + a.name).join(', ')}`)
434
374
  }
435
- if (readers.length > 0) {
436
- this.writeLine(`attr_reader ${readers.map(a => ':' + a.name).join(', ')}`)
375
+ if (readers.length > 0 && !accessors.some(a => readers.includes(a))) {
376
+ const onlyReaders = readers.filter(r => !accessors.includes(r))
377
+ if (onlyReaders.length > 0) {
378
+ this.writeLine(`attr_reader ${onlyReaders.map(a => ':' + a.name).join(', ')}`)
379
+ }
437
380
  }
438
381
  if (writers.length > 0) {
439
382
  this.writeLine(`attr_writer ${writers.map(a => ':' + a.name).join(', ')}`)
440
383
  }
384
+ this.writeLine('')
441
385
  }
442
386
 
443
387
  const body = node.body?.body || node.body || []
@@ -447,6 +391,7 @@ class RubyGenerator {
447
391
 
448
392
  this.indent--
449
393
  this.writeLine('end')
394
+ this.writeLine('')
450
395
  }
451
396
 
452
397
  generateMethod(node) {
@@ -459,7 +404,7 @@ class RubyGenerator {
459
404
 
460
405
  const body = node.body?.body || node.body || []
461
406
  if (body.length === 0) {
462
- this.writeLine('nil')
407
+ this.writeLine('# TODO')
463
408
  } else {
464
409
  for (const stmt of (Array.isArray(body) ? body : [body])) {
465
410
  this.generateNode(stmt)
@@ -468,6 +413,7 @@ class RubyGenerator {
468
413
 
469
414
  this.indent--
470
415
  this.writeLine('end')
416
+ this.writeLine('')
471
417
  }
472
418
 
473
419
  generateParams(params) {
@@ -692,9 +638,8 @@ class RubyGenerator {
692
638
 
693
639
  for (const handler of node.rescues || node.handlers || (node.handler ? [node.handler] : [])) {
694
640
  let rescueLine = 'rescue'
695
- const exceptions = handler.exceptions || (handler.exception ? [handler.exception] : []) || (handler.type ? [handler.type] : [])
696
- if (exceptions.length > 0) {
697
- rescueLine += ' ' + exceptions.join(', ')
641
+ if (handler.exception || handler.type) {
642
+ rescueLine += ' ' + (handler.exception || handler.type)
698
643
  if (handler.variable || handler.name) {
699
644
  rescueLine += ' => ' + (handler.variable || handler.name)
700
645
  }
@@ -775,13 +720,22 @@ class RubyGenerator {
775
720
  return `${target} ${op} ${value}`
776
721
  }
777
722
 
723
+ generateVariableDeclaration(node) {
724
+ const name = node.name || (node.id && node.id.name) || 'var'
725
+ const value = node.init ? this.generateNode(node.init) : 'nil'
726
+ this.writeLine(`${name} = ${value}`)
727
+ }
728
+
778
729
  generateCall(node) {
779
730
  const receiver = node.receiver ? this.generateNode(node.receiver) + '.' : ''
780
- const callee = node.callee?.name || node.callee || node.method || ''
781
- const method = typeof callee === 'string' ? this.translate(callee) : this.generateNode(callee)
731
+ const method = this.translate(node.method || node.callee?.name || node.callee || '')
782
732
  const args = (node.arguments || node.args || []).map(a => this.generateNode(a))
783
733
 
784
- let result = `${receiver}${method}(${args.join(', ')})`
734
+ let result = `${receiver}${method}`
735
+
736
+ if (args.length > 0 || node.parens) {
737
+ result += `(${args.join(', ')})`
738
+ }
785
739
 
786
740
  if (node.block) {
787
741
  result += ' ' + this.generateBlock(node.block)
@@ -821,22 +775,10 @@ class RubyGenerator {
821
775
 
822
776
  generateHash(node) {
823
777
  const pairs = (node.pairs || node.properties || []).map(p => {
824
- let key, value
825
-
826
- if (p.key?.type === 'SymbolExpression') {
827
- key = (p.key.name || p.key.value) + ':'
828
- } else if (typeof p.key === 'string' || p.key?.type === 'Literal') {
829
- const keyVal = typeof p.key === 'string' ? p.key : p.key.value
830
- if (typeof keyVal === 'string' && !keyVal.includes(' ')) {
831
- key = this.generateNode(p.key) + ' =>'
832
- } else {
833
- key = this.generateNode(p.key) + ' =>'
834
- }
835
- } else {
836
- key = this.generateNode(p.key) + ' =>'
837
- }
838
-
839
- value = this.generateNode(p.value)
778
+ const key = p.key?.type === 'SymbolExpression' || p.symbol
779
+ ? this.generateNode(p.key) + ':'
780
+ : this.generateNode(p.key) + ' =>'
781
+ const value = this.generateNode(p.value)
840
782
  return `${key} ${value}`
841
783
  })
842
784
  return `{ ${pairs.join(', ')} }`
@@ -858,8 +800,6 @@ class RubyGenerator {
858
800
  for (const part of node.parts || []) {
859
801
  if (part.type === 'Literal' || typeof part === 'string') {
860
802
  result += typeof part === 'string' ? part : part.value
861
- } else if (part.expression) {
862
- result += '#{' + this.generateNode(part.expression) + '}'
863
803
  } else {
864
804
  result += '#{' + this.generateNode(part) + '}'
865
805
  }
@@ -5,9 +5,6 @@ class SQLGenerator {
5
5
  this.i18n = null
6
6
  this.indent = 0
7
7
  this.output = ''
8
- this.keywordMap = {}
9
- this.functionMap = {}
10
- this.typeMap = {}
11
8
 
12
9
  if (i18nPath) {
13
10
  this.loadI18n(i18nPath)
@@ -49,7 +46,7 @@ class SQLGenerator {
49
46
 
50
47
  translateGeneric(word) {
51
48
  const translations = {
52
- 'sélectionner': 'SELECT',
49
+ 'selectionner': 'SELECT',
53
50
  'depuis': 'FROM',
54
51
  'ou': 'WHERE',
55
52
  'et': 'AND',
@@ -74,15 +71,15 @@ class SQLGenerator {
74
71
  'union': 'UNION',
75
72
  'intersection': 'INTERSECT',
76
73
  'difference': 'EXCEPT',
77
- 'insérer': 'INSERT',
74
+ 'inserer': 'INSERT',
78
75
  'dans': 'INTO',
79
76
  'valeurs': 'VALUES',
80
77
  'mettre a jour': 'UPDATE',
81
- 'définir': 'SET',
78
+ 'definir': 'SET',
82
79
  'supprimer': 'DELETE',
83
- 'créer': 'CREATE',
80
+ 'creer': 'CREATE',
84
81
  'table': 'TABLE',
85
- 'base de données': 'DATABASE',
82
+ 'base de donnees': 'DATABASE',
86
83
  'schema': 'SCHEMA',
87
84
  'index': 'INDEX',
88
85
  'vue': 'VIEW',
@@ -93,16 +90,16 @@ class SQLGenerator {
93
90
  'vers': 'TO',
94
91
  'colonne': 'COLUMN',
95
92
  'contrainte': 'CONSTRAINT',
96
- 'clé primaire': 'PRIMARY KEY',
97
- 'clé etrangere': 'FOREIGN KEY',
98
- 'références': 'REFERENCES',
93
+ 'cle primaire': 'PRIMARY KEY',
94
+ 'cle etrangere': 'FOREIGN KEY',
95
+ 'references': 'REFERENCES',
99
96
  'unique': 'UNIQUE',
100
97
  'non nul': 'NOT NULL',
101
- 'par défaut': 'DEFAULT',
98
+ 'par defaut': 'DEFAULT',
102
99
  'verification': 'CHECK',
103
100
  'cascade': 'CASCADE',
104
- 'définir null': 'SET NULL',
105
- 'définir défaut': 'SET DEFAULT',
101
+ 'definir null': 'SET NULL',
102
+ 'definir defaut': 'SET DEFAULT',
106
103
  'restreindre': 'RESTRICT',
107
104
  'pas action': 'NO ACTION',
108
105
  'avec': 'WITH',
@@ -134,7 +131,7 @@ class SQLGenerator {
134
131
  'heure actuelle': 'CURRENT_TIME',
135
132
  'horodatage actuel': 'CURRENT_TIMESTAMP',
136
133
  'extraire': 'EXTRACT',
137
- 'année': 'YEAR',
134
+ 'annee': 'YEAR',
138
135
  'mois': 'MONTH',
139
136
  'jour': 'DAY',
140
137
  'heure': 'HOUR',
@@ -145,7 +142,7 @@ class SQLGenerator {
145
142
  'majuscules': 'UPPER',
146
143
  'minuscules': 'LOWER',
147
144
  'supprimer espaces': 'TRIM',
148
- 'sous chaîne': 'SUBSTRING',
145
+ 'sous chaine': 'SUBSTRING',
149
146
  'remplacer': 'REPLACE',
150
147
  'position': 'POSITION',
151
148
  'arrondir': 'ROUND',
@@ -163,12 +160,12 @@ class SQLGenerator {
163
160
  'decimal': 'DECIMAL',
164
161
  'numerique': 'NUMERIC',
165
162
  'reel': 'REAL',
166
- 'double précision': 'DOUBLE PRECISION',
163
+ 'double precision': 'DOUBLE PRECISION',
167
164
  'texte': 'TEXT',
168
- 'caractère variable': 'VARCHAR',
169
- 'caractère': 'CHAR',
170
- 'booléen': 'BOOLEAN',
171
- 'type date': 'DATE',
165
+ 'caractere variable': 'VARCHAR',
166
+ 'caractere': 'CHAR',
167
+ 'booleen': 'BOOLEAN',
168
+ 'date': 'DATE',
172
169
  'temps': 'TIME',
173
170
  'horodatage': 'TIMESTAMP',
174
171
  'intervalle': 'INTERVAL',
@@ -185,11 +182,12 @@ class SQLGenerator {
185
182
  'transaction': 'TRANSACTION',
186
183
  'accorder': 'GRANT',
187
184
  'revoquer': 'REVOKE',
185
+ 'a': 'TO',
188
186
  'sur table': 'ON',
189
- 'type role': 'ROLE',
187
+ 'role': 'ROLE',
190
188
  'utilisateur': 'USER',
191
189
  'public': 'PUBLIC',
192
- 'sélection': 'SELECT',
190
+ 'selection': 'SELECT',
193
191
  'insertion': 'INSERT',
194
192
  'mise a jour': 'UPDATE',
195
193
  'suppression': 'DELETE',
@@ -201,7 +199,7 @@ class SQLGenerator {
201
199
  }
202
200
 
203
201
  const lower = word.toLowerCase()
204
- return translations[lower] || word
202
+ return translations[lower] || word.toUpperCase()
205
203
  }
206
204
 
207
205
  generate(ast) {
@@ -230,6 +228,11 @@ class SQLGenerator {
230
228
  if (!node) return ''
231
229
 
232
230
  switch (node.type) {
231
+ case 'SQLProgram':
232
+ if (node.statements) {
233
+ return node.statements.map(stmt => this.generateNode(stmt)).filter(s => s).join(';\n\n') + ';'
234
+ }
235
+ return ''
233
236
  case 'SelectStatement':
234
237
  return this.generateSelect(node)
235
238
  case 'InsertStatement':
@@ -273,8 +276,8 @@ class SQLGenerator {
273
276
  const columns = (node.columns || ['*']).map(c => this.generateColumn(c))
274
277
  sql += ' ' + columns.join(', ')
275
278
 
276
- if (node.from) {
277
- sql += '\nFROM ' + this.generateFrom(node.from)
279
+ if (node.from || node.table) {
280
+ sql += '\nFROM ' + this.generateFrom(node.from || node.table)
278
281
  }
279
282
 
280
283
  if (node.joins && node.joins.length > 0) {
@@ -299,11 +302,11 @@ class SQLGenerator {
299
302
  sql += '\nORDER BY ' + node.orderBy.map(o => this.generateOrderBy(o)).join(', ')
300
303
  }
301
304
 
302
- if (node.limit !== undefined) {
305
+ if (node.limit != null) {
303
306
  sql += '\nLIMIT ' + node.limit
304
307
  }
305
308
 
306
- if (node.offset !== undefined) {
309
+ if (node.offset != null) {
307
310
  sql += ' OFFSET ' + node.offset
308
311
  }
309
312
 
@@ -447,8 +450,6 @@ class SQLGenerator {
447
450
  if (typeof expr === 'number') return String(expr)
448
451
  if (typeof expr === 'boolean') return expr ? 'TRUE' : 'FALSE'
449
452
  if (typeof expr === 'string') {
450
- if (expr.toLowerCase() === 'true') return 'TRUE'
451
- if (expr.toLowerCase() === 'false') return 'FALSE'
452
453
  if (expr.startsWith("'") || expr.startsWith('"')) return expr
453
454
  if (/^\d+$/.test(expr)) return expr
454
455
  return this.translate(expr)
@@ -727,11 +728,11 @@ class SQLGenerator {
727
728
 
728
729
  switch (constraint.type?.toLowerCase()) {
729
730
  case 'primary key':
730
- case 'clé primaire':
731
+ case 'cle primaire':
731
732
  sql += 'PRIMARY KEY (' + constraint.columns.join(', ') + ')'
732
733
  break
733
734
  case 'foreign key':
734
- case 'clé etrangere':
735
+ case 'cle etrangere':
735
736
  sql += 'FOREIGN KEY (' + constraint.columns.join(', ') + ')'
736
737
  sql += ' REFERENCES ' + constraint.references.table
737
738
  sql += '(' + constraint.references.columns.join(', ') + ')'
@@ -777,8 +778,8 @@ class SQLGenerator {
777
778
  case 'alter':
778
779
  case 'modifier':
779
780
  let alter = 'ALTER COLUMN ' + action.column
780
- if (action.dataType || action.newType) {
781
- alter += ' TYPE ' + this.translate(action.dataType || action.newType)
781
+ if (action.type) {
782
+ alter += ' TYPE ' + this.translate(action.type)
782
783
  }
783
784
  if (action.setDefault !== undefined) {
784
785
  alter += ' SET DEFAULT ' + this.generateExpression(action.setDefault)
@@ -860,9 +861,6 @@ class SQLGenerator {
860
861
  }
861
862
 
862
863
  generateCreateView(node) {
863
- const savedOutput = this.output
864
- this.output = ''
865
-
866
864
  let sql = 'CREATE'
867
865
 
868
866
  if (node.orReplace) sql += ' OR REPLACE'
@@ -875,11 +873,9 @@ class SQLGenerator {
875
873
  }
876
874
 
877
875
  sql += ' AS\n'
878
- this.output = ''
879
- this.generateSelect(node.select)
880
- sql += this.output.trim()
876
+ sql += this.generateSelect(node.select)
881
877
 
882
- this.output = savedOutput + sql
878
+ this.output += sql
883
879
  return sql
884
880
  }
885
881
 
@@ -932,9 +928,6 @@ class SQLGenerator {
932
928
  }
933
929
 
934
930
  generateWith(node) {
935
- const savedOutput = this.output
936
- this.output = ''
937
-
938
931
  let sql = 'WITH '
939
932
 
940
933
  if (node.recursive) sql += 'RECURSIVE '
@@ -945,40 +938,26 @@ class SQLGenerator {
945
938
  cteSql += ' (' + cte.columns.join(', ') + ')'
946
939
  }
947
940
  cteSql += ' AS (\n'
948
- this.output = ''
949
- this.generateSelect(cte.query)
950
- cteSql += this.output.trim()
941
+ cteSql += this.generateSelect(cte.query)
951
942
  cteSql += '\n)'
952
943
  return cteSql
953
944
  })
954
945
 
955
946
  sql += ctes.join(',\n')
956
947
  sql += '\n'
957
- this.output = ''
958
- this.generateSelect(node.select)
959
- sql += this.output.trim()
948
+ sql += this.generateSelect(node.select)
960
949
 
961
- this.output = savedOutput + sql
950
+ this.output += sql
962
951
  return sql
963
952
  }
964
953
 
965
954
  generateUnion(node) {
966
- const savedOutput = this.output
967
- this.output = ''
968
-
969
955
  const queries = node.queries || [node.left, node.right]
970
956
  const type = node.all ? 'UNION ALL' : 'UNION'
971
957
 
972
- const parts = []
973
- for (const q of queries) {
974
- this.output = ''
975
- this.generateSelect(q)
976
- parts.push(this.output.trim())
977
- }
958
+ const sql = queries.map(q => this.generateSelect(q)).join('\n' + type + '\n')
978
959
 
979
- const sql = parts.join('\n' + type + '\n')
980
-
981
- this.output = savedOutput + sql
960
+ this.output += sql
982
961
  return sql
983
962
  }
984
963
  }