ether-code 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +130 -0
  3. package/cli/compiler.js +298 -0
  4. package/cli/ether.js +532 -0
  5. package/cli/watcher.js +106 -0
  6. package/generators/css-generator.js +583 -0
  7. package/generators/graphql-generator.js +868 -0
  8. package/generators/html-generator.js +745 -0
  9. package/generators/js-generator.js +909 -0
  10. package/generators/node-generator.js +467 -0
  11. package/generators/php-generator.js +706 -0
  12. package/generators/python-generator.js +913 -0
  13. package/generators/react-generator.js +599 -0
  14. package/generators/ruby-generator.js +904 -0
  15. package/generators/sql-generator.js +988 -0
  16. package/generators/ts-generator.js +569 -0
  17. package/i18n/i18n-css.json +743 -0
  18. package/i18n/i18n-graphql.json +1531 -0
  19. package/i18n/i18n-html.json +572 -0
  20. package/i18n/i18n-js.json +2790 -0
  21. package/i18n/i18n-node.json +2442 -0
  22. package/i18n/i18n-php.json +4306 -0
  23. package/i18n/i18n-python.json +3080 -0
  24. package/i18n/i18n-react.json +1784 -0
  25. package/i18n/i18n-ruby.json +1858 -0
  26. package/i18n/i18n-sql.json +3466 -0
  27. package/i18n/i18n-ts.json +442 -0
  28. package/lexer/ether-lexer.js +728 -0
  29. package/lexer/tokens.js +292 -0
  30. package/package.json +45 -0
  31. package/parsers/ast-css.js +545 -0
  32. package/parsers/ast-graphql.js +424 -0
  33. package/parsers/ast-html.js +886 -0
  34. package/parsers/ast-js.js +750 -0
  35. package/parsers/ast-node.js +2440 -0
  36. package/parsers/ast-php.js +957 -0
  37. package/parsers/ast-react.js +580 -0
  38. package/parsers/ast-ruby.js +895 -0
  39. package/parsers/ast-ts.js +1352 -0
  40. package/parsers/css-parser.js +1981 -0
  41. package/parsers/graphql-parser.js +2011 -0
  42. package/parsers/html-parser.js +1181 -0
  43. package/parsers/js-parser.js +2564 -0
  44. package/parsers/node-parser.js +2644 -0
  45. package/parsers/php-parser.js +3037 -0
  46. package/parsers/react-parser.js +1035 -0
  47. package/parsers/ruby-parser.js +2680 -0
  48. package/parsers/ts-parser.js +3881 -0
@@ -0,0 +1,467 @@
1
+ const fs = require('fs')
2
+ const { JSGenerator } = require('./js-generator')
3
+
4
+ class NodeGenerator extends JSGenerator {
5
+ constructor(i18nPath = null) {
6
+ super(i18nPath)
7
+ this.extendMaps()
8
+ }
9
+
10
+ extendMaps() {
11
+ const nodeTranslations = {
12
+ 'requiert': 'require',
13
+ 'module': 'module',
14
+ 'exports': 'exports',
15
+ 'exporter': 'module.exports',
16
+ 'processus': 'process',
17
+ 'global': 'global',
18
+ 'nom fichier': '__filename',
19
+ 'nom dossier': '__dirname',
20
+ 'tampon': 'Buffer',
21
+ 'chemin': 'path',
22
+ 'système fichiers': 'fs',
23
+ 'http': 'http',
24
+ 'https': 'https',
25
+ 'url': 'url',
26
+ 'chaîne requête': 'querystring',
27
+ 'événements': 'events',
28
+ 'flux': 'stream',
29
+ 'utilitaires': 'util',
30
+ 'os': 'os',
31
+ 'crypto': 'crypto',
32
+ 'enfant processus': 'child_process',
33
+ 'cluster': 'cluster',
34
+ 'net': 'net',
35
+ 'dns': 'dns',
36
+ 'zlib': 'zlib',
37
+ 'créer serveur': 'createServer',
38
+ 'écouter': 'listen',
39
+ 'requête': 'request',
40
+ 'réponse': 'response',
41
+ 'entêtes': 'headers',
42
+ 'méthode': 'method',
43
+ 'url requête': 'url',
44
+ 'écrire tête': 'writeHead',
45
+ 'terminer': 'end',
46
+ 'sur': 'on',
47
+ 'émettre': 'emit',
48
+ 'une fois': 'once',
49
+ 'retirer écouteur': 'removeListener',
50
+ 'lire fichier': 'readFile',
51
+ 'lire fichier sync': 'readFileSync',
52
+ 'écrire fichier': 'writeFile',
53
+ 'écrire fichier sync': 'writeFileSync',
54
+ 'ajouter fichier': 'appendFile',
55
+ 'supprimer fichier': 'unlink',
56
+ 'renommer': 'rename',
57
+ 'existe': 'existsSync',
58
+ 'statistiques': 'stat',
59
+ 'créer dossier': 'mkdir',
60
+ 'lire dossier': 'readdir',
61
+ 'supprimer dossier': 'rmdir',
62
+ 'joindre': 'join',
63
+ 'joindre chemin': 'join',
64
+ 'de': 'from',
65
+ 'temporiser': 'setTimeout',
66
+ 'intervalle': 'setInterval',
67
+ 'promettifier': 'promisify',
68
+ 'résoudre': 'resolve',
69
+ 'base': 'basename',
70
+ 'dossier': 'dirname',
71
+ 'extension': 'extname',
72
+ 'analyser': 'parse',
73
+ 'formater': 'format',
74
+ 'normaliser': 'normalize',
75
+ 'arguments': 'argv',
76
+ 'environnement': 'env',
77
+ 'sortie': 'exit',
78
+ 'répertoire travail': 'cwd',
79
+ 'changer dossier': 'chdir',
80
+ 'mémoire': 'memoryUsage',
81
+ 'temps fonctionnement': 'uptime',
82
+ 'prochain tick': 'nextTick',
83
+ 'plateforme': 'platform',
84
+ 'architecture': 'arch',
85
+ 'cpus': 'cpus',
86
+ 'mémoire totale': 'totalmem',
87
+ 'mémoire libre': 'freemem',
88
+ 'dossier maison': 'homedir',
89
+ 'dossier temp': 'tmpdir',
90
+ 'nom hote': 'hostname',
91
+ 'exécuter': 'exec',
92
+ 'spawn': 'spawn',
93
+ 'fork': 'fork',
94
+ 'pid': 'pid',
95
+ 'tuer': 'kill',
96
+ 'connecter': 'connect',
97
+ 'socket': 'Socket',
98
+ 'serveur': 'Server',
99
+ 'chercher': 'lookup',
100
+ 'résoudre dns': 'resolve',
101
+ 'compresser': 'gzip',
102
+ 'decompresser': 'gunzip',
103
+ 'degonfler': 'deflate',
104
+ 'gonfler': 'inflate',
105
+ 'hash': 'createHash',
106
+ 'hmac': 'createHmac',
107
+ 'chiffrer': 'createCipher',
108
+ 'déchiffrer': 'createDecipher',
109
+ 'aléatoire octets': 'randomBytes',
110
+ 'promisifier': 'promisify',
111
+ 'inspecter': 'inspect',
112
+ 'hériter': 'inherits',
113
+ 'formater chaîne': 'format',
114
+ 'deboguer': 'debuglog',
115
+ 'express': 'express',
116
+ 'application': 'app',
117
+ 'routeur': 'Router',
118
+ 'utiliser': 'use',
119
+ 'obtenir route': 'get',
120
+ 'poster route': 'post',
121
+ 'mettre route': 'put',
122
+ 'supprimer route': 'delete',
123
+ 'patch route': 'patch',
124
+ 'middleware': 'middleware',
125
+ 'corps': 'body',
126
+ 'params': 'params',
127
+ 'requête query': 'query',
128
+ 'cookies': 'cookies',
129
+ 'session': 'session',
130
+ 'json': 'json',
131
+ 'statique': 'static',
132
+ 'envoyer': 'send',
133
+ 'rendu': 'render',
134
+ 'rediriger': 'redirect',
135
+ 'statut': 'status',
136
+ 'telecharger': 'download',
137
+ 'fichier envoyer': 'sendFile',
138
+ 'mongoose': 'mongoose',
139
+ 'connecter db': 'connect',
140
+ 'schema': 'Schema',
141
+ 'modele': 'model',
142
+ 'trouver': 'find',
143
+ 'trouver un': 'findOne',
144
+ 'trouver par id': 'findById',
145
+ 'créer': 'create',
146
+ 'mettre a jour un': 'updateOne',
147
+ 'supprimer un': 'deleteOne',
148
+ 'sauvegarder': 'save',
149
+ 'peupler': 'populate',
150
+ 'trier': 'sort',
151
+ 'limiter': 'limit',
152
+ 'sauter': 'skip',
153
+ 'compter documents': 'countDocuments'
154
+ }
155
+
156
+ for (const [fr, node] of Object.entries(nodeTranslations)) {
157
+ this.keywordMap[fr] = node
158
+ }
159
+ }
160
+
161
+ generate(ast) {
162
+ this.output = ''
163
+ this.indent = 0
164
+
165
+ if (Array.isArray(ast)) {
166
+ for (const node of ast) {
167
+ const result = this.generateNode(node)
168
+ if (result !== undefined && result !== '' && this.output === '') {
169
+ return result
170
+ }
171
+ }
172
+ } else if (ast && ast.type) {
173
+ const result = this.generateNode(ast)
174
+ if (result !== undefined && result !== '' && this.output === '') {
175
+ return result
176
+ }
177
+ } else if (ast && ast.body) {
178
+ for (const node of ast.body) {
179
+ const result = this.generateNode(node)
180
+ if (result !== undefined && result !== '' && this.output === '') {
181
+ return result
182
+ }
183
+ }
184
+ }
185
+
186
+ return this.output.trim()
187
+ }
188
+
189
+ generateNode(node) {
190
+ if (!node) return ''
191
+
192
+ switch (node.type) {
193
+ case 'RequireStatement':
194
+ return this.generateRequire(node)
195
+ case 'ModuleExports':
196
+ case 'ModuleExportsStatement':
197
+ return this.generateModuleExports(node)
198
+ case 'ExportsStatement':
199
+ return this.generateExportsStatement(node)
200
+ case 'ServerCreation':
201
+ return this.generateServerCreation(node)
202
+ case 'RouteHandler':
203
+ return this.generateRouteHandler(node)
204
+ case 'MiddlewareUse':
205
+ return this.generateMiddlewareUse(node)
206
+ case 'FileOperation':
207
+ return this.generateFileOperation(node)
208
+ case 'EventListener':
209
+ return this.generateEventListener(node)
210
+ case 'StreamOperation':
211
+ return this.generateStreamOperation(node)
212
+ default:
213
+ return super.generateNode(node)
214
+ }
215
+ }
216
+
217
+ generateRequire(node) {
218
+ const module = node.source || node.module
219
+ const modulePath = typeof module === 'string' ? module : this.generateNode(module)
220
+
221
+ const id = node.id || node.variable || node.name
222
+
223
+ if (id?.type === 'ObjectPattern') {
224
+ const props = (id.properties || []).map(p => {
225
+ const key = p.key?.name || p.key
226
+ return this.translate(key)
227
+ }).join(', ')
228
+ this.writeLine(`const { ${props} } = require('${modulePath}');`)
229
+ } else if (node.destructure && node.destructure.length > 0) {
230
+ const props = node.destructure.map(p => this.translate(p)).join(', ')
231
+ this.writeLine(`const { ${props} } = require('${modulePath}');`)
232
+ } else if (id) {
233
+ const varName = typeof id === 'string' ? id : (id.name || this.generateNode(id))
234
+ this.writeLine(`const ${this.translate(varName)} = require('${modulePath}');`)
235
+ } else {
236
+ this.writeLine(`require('${modulePath}');`)
237
+ }
238
+ }
239
+
240
+ generateModuleExports(node) {
241
+ const exports = node.exports || node.default
242
+
243
+ if (exports?.type === 'ObjectExpression') {
244
+ const props = (exports.properties || []).map(p => {
245
+ const key = p.key?.name || p.key
246
+ if (p.shorthand) {
247
+ return this.translate(key)
248
+ }
249
+ const value = this.generateNode(p.value)
250
+ return `${this.translate(key)}: ${value}`
251
+ })
252
+ this.writeLine(`module.exports = { ${props.join(', ')} };`)
253
+ } else if (exports) {
254
+ const value = this.generateNode(exports)
255
+ this.writeLine(`module.exports = ${value};`)
256
+ } else if (node.named && Object.keys(node.named).length > 0) {
257
+ const exportsList = Object.entries(node.named).map(([key, value]) => {
258
+ const translatedKey = this.translate(key)
259
+ const translatedValue = this.generateNode(value)
260
+ return translatedKey === translatedValue ? translatedKey : `${translatedKey}: ${translatedValue}`
261
+ })
262
+ this.writeLine(`module.exports = { ${exportsList.join(', ')} };`)
263
+ }
264
+ }
265
+
266
+ generateExportsStatement(node) {
267
+ const name = this.translate(node.name)
268
+ const value = this.generateNode(node.value)
269
+ this.writeLine(`exports.${name} = ${value};`)
270
+ }
271
+
272
+ generateServerCreation(node) {
273
+ const framework = node.framework || 'http'
274
+
275
+ if (framework === 'express') {
276
+ this.writeLine("const express = require('express');")
277
+ this.writeLine('const app = express();')
278
+ this.writeLine('')
279
+
280
+ if (node.middleware) {
281
+ for (const mw of node.middleware) {
282
+ this.generateMiddlewareUse(mw)
283
+ }
284
+ this.writeLine('')
285
+ }
286
+
287
+ if (node.routes) {
288
+ for (const route of node.routes) {
289
+ this.generateRouteHandler(route)
290
+ }
291
+ this.writeLine('')
292
+ }
293
+
294
+ const port = node.port || 3000
295
+ this.writeLine(`app.listen(${port}, () => {`)
296
+ this.indent++
297
+ this.writeLine(`console.log('Serveur démarré sur le port ${port}');`)
298
+ this.indent--
299
+ this.writeLine('});')
300
+ } else {
301
+ this.writeLine("const http = require('http');")
302
+ this.writeLine('')
303
+ this.writeLine('const server = http.createServer((req, res) => {')
304
+ this.indent++
305
+
306
+ if (node.handler) {
307
+ this.generateNode(node.handler)
308
+ } else {
309
+ this.writeLine("res.writeHead(200, { 'Content-Type': 'text/plain' });")
310
+ this.writeLine("res.end('Hello World');")
311
+ }
312
+
313
+ this.indent--
314
+ this.writeLine('});')
315
+ this.writeLine('')
316
+
317
+ const port = node.port || 3000
318
+ this.writeLine(`server.listen(${port}, () => {`)
319
+ this.indent++
320
+ this.writeLine(`console.log('Serveur démarré sur le port ${port}');`)
321
+ this.indent--
322
+ this.writeLine('});')
323
+ }
324
+ }
325
+
326
+ generateRouteHandler(node) {
327
+ const method = this.translate(node.method || 'get').toLowerCase()
328
+ const path = node.path || '/'
329
+ const async = node.async ? 'async ' : ''
330
+
331
+ this.writeLine(`app.${method}('${path}', ${async}(req, res) => {`)
332
+ this.indent++
333
+
334
+ if (node.body) {
335
+ if (Array.isArray(node.body)) {
336
+ for (const stmt of node.body) {
337
+ this.generateNode(stmt)
338
+ }
339
+ } else {
340
+ this.generateNode(node.body)
341
+ }
342
+ }
343
+
344
+ this.indent--
345
+ this.writeLine('});')
346
+ }
347
+
348
+ generateMiddlewareUse(node) {
349
+ if (typeof node === 'string') {
350
+ this.writeLine(`app.use(${this.translate(node)});`)
351
+ return
352
+ }
353
+
354
+ const middleware = node.middleware || node.name
355
+
356
+ if (node.path) {
357
+ this.writeLine(`app.use('${node.path}', ${this.translate(middleware)});`)
358
+ } else if (node.call) {
359
+ const args = (node.arguments || []).map(a => this.generateNode(a)).join(', ')
360
+ this.writeLine(`app.use(${this.translate(middleware)}(${args}));`)
361
+ } else {
362
+ this.writeLine(`app.use(${this.translate(middleware)});`)
363
+ }
364
+ }
365
+
366
+ generateFileOperation(node) {
367
+ const operation = this.translate(node.operation)
368
+ const path = this.generateNode(node.path)
369
+
370
+ switch (node.operation) {
371
+ case 'lire':
372
+ case 'read':
373
+ if (node.sync) {
374
+ this.writeLine(`const ${node.variable || 'data'} = fs.readFileSync(${path}, 'utf-8');`)
375
+ } else {
376
+ this.writeLine(`fs.readFile(${path}, 'utf-8', (err, data) => {`)
377
+ this.indent++
378
+ if (node.callback) {
379
+ this.generateNode(node.callback)
380
+ }
381
+ this.indent--
382
+ this.writeLine('});')
383
+ }
384
+ break
385
+
386
+ case 'écrire':
387
+ case 'write':
388
+ const content = this.generateNode(node.content)
389
+ if (node.sync) {
390
+ this.writeLine(`fs.writeFileSync(${path}, ${content});`)
391
+ } else {
392
+ this.writeLine(`fs.writeFile(${path}, ${content}, (err) => {`)
393
+ this.indent++
394
+ if (node.callback) {
395
+ this.generateNode(node.callback)
396
+ }
397
+ this.indent--
398
+ this.writeLine('});')
399
+ }
400
+ break
401
+
402
+ case 'supprimer':
403
+ case 'delete':
404
+ this.writeLine(`fs.unlink(${path}, (err) => {`)
405
+ this.indent++
406
+ if (node.callback) {
407
+ this.generateNode(node.callback)
408
+ }
409
+ this.indent--
410
+ this.writeLine('});')
411
+ break
412
+
413
+ case 'existe':
414
+ case 'exists':
415
+ this.writeLine(`const ${node.variable || 'exists'} = fs.existsSync(${path});`)
416
+ break
417
+ }
418
+ }
419
+
420
+ generateEventListener(node) {
421
+ const emitter = this.generateNode(node.emitter || { name: 'emitter' })
422
+ const event = typeof node.event === 'string' ? `'${node.event}'` : this.generateNode(node.event)
423
+ const method = node.once ? 'once' : 'on'
424
+
425
+ this.writeLine(`${emitter}.${method}(${event}, (${node.params || ''}) => {`)
426
+ this.indent++
427
+
428
+ if (node.body) {
429
+ if (Array.isArray(node.body)) {
430
+ for (const stmt of node.body) {
431
+ this.generateNode(stmt)
432
+ }
433
+ } else {
434
+ this.generateNode(node.body)
435
+ }
436
+ }
437
+
438
+ this.indent--
439
+ this.writeLine('});')
440
+ }
441
+
442
+ generateStreamOperation(node) {
443
+ const source = this.generateNode(node.source)
444
+ const destination = node.destination ? this.generateNode(node.destination) : null
445
+
446
+ switch (node.operation) {
447
+ case 'pipe':
448
+ case 'canaliser':
449
+ this.writeLine(`${source}.pipe(${destination});`)
450
+ break
451
+
452
+ case 'lire flux':
453
+ case 'createReadStream':
454
+ this.writeLine(`const ${node.variable || 'readStream'} = fs.createReadStream(${source});`)
455
+ break
456
+
457
+ case 'écrire flux':
458
+ case 'createWriteStream':
459
+ this.writeLine(`const ${node.variable || 'writeStream'} = fs.createWriteStream(${source});`)
460
+ break
461
+ }
462
+ }
463
+ }
464
+
465
+ module.exports = {
466
+ NodeGenerator
467
+ }