ether-code 0.1.6 → 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.
- package/cli/ether.js +1 -1
- package/generators/css-generator.js +42 -55
- package/generators/graphql-generator.js +19 -22
- package/generators/html-generator.js +51 -220
- package/generators/js-generator.js +76 -157
- package/generators/node-generator.js +49 -93
- package/generators/php-generator.js +46 -68
- package/generators/python-generator.js +35 -54
- package/generators/react-generator.js +37 -47
- package/generators/ruby-generator.js +59 -119
- package/generators/sql-generator.js +42 -63
- package/generators/ts-generator.js +59 -133
- package/i18n/i18n-css.json +147 -147
- package/i18n/i18n-graphql.json +6 -6
- package/i18n/i18n-html.json +135 -135
- package/i18n/i18n-js.json +107 -107
- package/i18n/i18n-node.json +14 -14
- package/i18n/i18n-php.json +177 -177
- package/i18n/i18n-python.json +16 -16
- package/i18n/i18n-react.json +97 -97
- package/i18n/i18n-ruby.json +22 -22
- package/i18n/i18n-sql.json +153 -153
- package/i18n/i18n-ts.json +10 -10
- package/lexer/ether-lexer.js +175 -34
- package/lexer/tokens.js +6 -6
- package/package.json +1 -1
- package/parsers/ast-css.js +0 -545
- package/parsers/ast-graphql.js +0 -424
- package/parsers/ast-html.js +0 -886
- package/parsers/ast-js.js +0 -750
- package/parsers/ast-node.js +0 -2440
- package/parsers/ast-php.js +0 -957
- package/parsers/ast-react.js +0 -580
- package/parsers/ast-ruby.js +0 -895
- package/parsers/ast-ts.js +0 -1352
- package/parsers/css-parser.js +0 -1981
- package/parsers/graphql-parser.js +0 -2011
- package/parsers/html-parser.js +0 -1182
- package/parsers/js-parser.js +0 -2564
- package/parsers/node-parser.js +0 -2644
- package/parsers/php-parser.js +0 -3037
- package/parsers/react-parser.js +0 -1035
- package/parsers/ruby-parser.js +0 -2680
- 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
|
-
'
|
|
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
|
-
'
|
|
80
|
+
'heriter': '<',
|
|
83
81
|
'inclure': 'include',
|
|
84
82
|
'etendre': 'extend',
|
|
85
83
|
'prepend': 'prepend',
|
|
86
84
|
'public': 'public',
|
|
87
|
-
'
|
|
88
|
-
'
|
|
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
|
-
'
|
|
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
|
-
'
|
|
118
|
+
'selectionner': 'select',
|
|
121
119
|
'rejeter': 'reject',
|
|
122
120
|
'trouver': 'find',
|
|
123
121
|
'detecter': 'detect',
|
|
124
|
-
'
|
|
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
|
|
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
|
|
155
|
+
'vers chaine': 'to_s',
|
|
158
156
|
'vers symbole': 'to_sym',
|
|
159
157
|
'vers tableau': 'to_a',
|
|
160
158
|
'vers hash': 'to_h',
|
|
161
|
-
'
|
|
159
|
+
'cles': 'keys',
|
|
162
160
|
'valeurs': 'values',
|
|
163
161
|
'fusionner': 'merge',
|
|
164
162
|
'chercher': 'fetch',
|
|
165
163
|
'stocker': 'store',
|
|
166
|
-
'supprimer
|
|
167
|
-
'a
|
|
164
|
+
'supprimer cle': 'delete',
|
|
165
|
+
'a cle': 'has_key?',
|
|
168
166
|
'a valeur': 'has_value?',
|
|
169
167
|
'ouvrir': 'open',
|
|
170
168
|
'lire': 'read',
|
|
171
|
-
'
|
|
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
|
-
'
|
|
182
|
+
'annee': 'year',
|
|
185
183
|
'mois': 'month',
|
|
186
184
|
'jour': 'day',
|
|
187
185
|
'heure': 'hour',
|
|
188
186
|
'minute': 'min',
|
|
189
187
|
'seconde': 'sec',
|
|
190
|
-
'
|
|
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
|
-
'
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
427
|
-
|
|
428
|
-
const
|
|
429
|
-
const
|
|
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
|
-
|
|
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('
|
|
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
|
-
|
|
696
|
-
|
|
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
|
|
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}
|
|
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
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
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
|
-
'
|
|
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
|
-
'
|
|
74
|
+
'inserer': 'INSERT',
|
|
78
75
|
'dans': 'INTO',
|
|
79
76
|
'valeurs': 'VALUES',
|
|
80
77
|
'mettre a jour': 'UPDATE',
|
|
81
|
-
'
|
|
78
|
+
'definir': 'SET',
|
|
82
79
|
'supprimer': 'DELETE',
|
|
83
|
-
'
|
|
80
|
+
'creer': 'CREATE',
|
|
84
81
|
'table': 'TABLE',
|
|
85
|
-
'base de
|
|
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
|
-
'
|
|
97
|
-
'
|
|
98
|
-
'
|
|
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
|
|
98
|
+
'par defaut': 'DEFAULT',
|
|
102
99
|
'verification': 'CHECK',
|
|
103
100
|
'cascade': 'CASCADE',
|
|
104
|
-
'
|
|
105
|
-
'
|
|
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
|
-
'
|
|
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
|
|
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
|
|
163
|
+
'double precision': 'DOUBLE PRECISION',
|
|
167
164
|
'texte': 'TEXT',
|
|
168
|
-
'
|
|
169
|
-
'
|
|
170
|
-
'
|
|
171
|
-
'
|
|
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
|
-
'
|
|
187
|
+
'role': 'ROLE',
|
|
190
188
|
'utilisateur': 'USER',
|
|
191
189
|
'public': 'PUBLIC',
|
|
192
|
-
'
|
|
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
|
|
305
|
+
if (node.limit != null) {
|
|
303
306
|
sql += '\nLIMIT ' + node.limit
|
|
304
307
|
}
|
|
305
308
|
|
|
306
|
-
if (node.offset
|
|
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 '
|
|
731
|
+
case 'cle primaire':
|
|
731
732
|
sql += 'PRIMARY KEY (' + constraint.columns.join(', ') + ')'
|
|
732
733
|
break
|
|
733
734
|
case 'foreign key':
|
|
734
|
-
case '
|
|
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.
|
|
781
|
-
alter += ' TYPE ' + this.translate(action.
|
|
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.
|
|
879
|
-
this.generateSelect(node.select)
|
|
880
|
-
sql += this.output.trim()
|
|
876
|
+
sql += this.generateSelect(node.select)
|
|
881
877
|
|
|
882
|
-
this.output
|
|
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.
|
|
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.
|
|
958
|
-
this.generateSelect(node.select)
|
|
959
|
-
sql += this.output.trim()
|
|
948
|
+
sql += this.generateSelect(node.select)
|
|
960
949
|
|
|
961
|
-
this.output
|
|
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
|
|
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
|
-
|
|
980
|
-
|
|
981
|
-
this.output = savedOutput + sql
|
|
960
|
+
this.output += sql
|
|
982
961
|
return sql
|
|
983
962
|
}
|
|
984
963
|
}
|