ether-code 0.1.6 → 0.1.8

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 (45) hide show
  1. package/cli/compiler.js +9 -53
  2. package/cli/ether.js +1 -1
  3. package/generators/css-generator.js +42 -55
  4. package/generators/graphql-generator.js +19 -22
  5. package/generators/html-generator.js +51 -220
  6. package/generators/js-generator.js +76 -157
  7. package/generators/node-generator.js +49 -93
  8. package/generators/php-generator.js +46 -68
  9. package/generators/python-generator.js +35 -54
  10. package/generators/react-generator.js +37 -47
  11. package/generators/ruby-generator.js +59 -119
  12. package/generators/sql-generator.js +42 -63
  13. package/generators/ts-generator.js +59 -133
  14. package/i18n/i18n-css.json +147 -147
  15. package/i18n/i18n-graphql.json +6 -6
  16. package/i18n/i18n-html.json +135 -135
  17. package/i18n/i18n-js.json +107 -107
  18. package/i18n/i18n-node.json +14 -14
  19. package/i18n/i18n-php.json +177 -177
  20. package/i18n/i18n-python.json +16 -16
  21. package/i18n/i18n-react.json +97 -97
  22. package/i18n/i18n-ruby.json +22 -22
  23. package/i18n/i18n-sql.json +153 -153
  24. package/i18n/i18n-ts.json +10 -10
  25. package/lexer/ether-lexer.js +175 -34
  26. package/lexer/tokens.js +6 -6
  27. package/package.json +1 -1
  28. package/parsers/ast-css.js +0 -545
  29. package/parsers/ast-graphql.js +0 -424
  30. package/parsers/ast-html.js +0 -886
  31. package/parsers/ast-js.js +0 -750
  32. package/parsers/ast-node.js +0 -2440
  33. package/parsers/ast-php.js +0 -957
  34. package/parsers/ast-react.js +0 -580
  35. package/parsers/ast-ruby.js +0 -895
  36. package/parsers/ast-ts.js +0 -1352
  37. package/parsers/css-parser.js +0 -1981
  38. package/parsers/graphql-parser.js +0 -2011
  39. package/parsers/html-parser.js +0 -1182
  40. package/parsers/js-parser.js +0 -2564
  41. package/parsers/node-parser.js +0 -2644
  42. package/parsers/php-parser.js +0 -3037
  43. package/parsers/react-parser.js +0 -1035
  44. package/parsers/ruby-parser.js +0 -2680
  45. package/parsers/ts-parser.js +0 -3881
@@ -12,33 +12,33 @@ class TSGenerator extends JSGenerator {
12
12
  'type': 'type',
13
13
  'interface': 'interface',
14
14
  'enum': 'enum',
15
- 'énumération': 'enum',
15
+ 'enumeration': 'enum',
16
16
  'declare': 'declare',
17
- 'déclarer': 'declare',
17
+ 'declarer': 'declare',
18
18
  'namespace': 'namespace',
19
19
  'espace de noms': 'namespace',
20
20
  'module': 'module',
21
21
  'abstract': 'abstract',
22
22
  'abstrait': 'abstract',
23
23
  'implements': 'implements',
24
- 'implémente': 'implements',
24
+ 'implemente': 'implements',
25
25
  'extends': 'extends',
26
- 'étend': 'extends',
26
+ 'etend': 'extends',
27
27
  'readonly': 'readonly',
28
28
  'lecture seule': 'readonly',
29
29
  'public': 'public',
30
30
  'private': 'private',
31
- 'privé': 'private',
31
+ 'prive': 'private',
32
32
  'protected': 'protected',
33
- 'protégé': 'protected',
33
+ 'protege': 'protected',
34
34
  'override': 'override',
35
35
  'remplacer': 'override',
36
36
  'keyof': 'keyof',
37
- 'clé de': 'keyof',
37
+ 'cle de': 'keyof',
38
38
  'typeof': 'typeof',
39
39
  'type de': 'typeof',
40
40
  'infer': 'infer',
41
- 'inférer': 'infer',
41
+ 'inferer': 'infer',
42
42
  'satisfies': 'satisfies',
43
43
  'satisfait': 'satisfies',
44
44
  'as': 'as',
@@ -47,9 +47,9 @@ class TSGenerator extends JSGenerator {
47
47
  'est': 'is',
48
48
  'asserts': 'asserts',
49
49
  'affirme': 'asserts',
50
- 'chaîne': 'string',
50
+ 'chaine': 'string',
51
51
  'nombre': 'number',
52
- 'booléen': 'boolean',
52
+ 'booleen': 'boolean',
53
53
  'symbole': 'symbol',
54
54
  'vide': 'void',
55
55
  'nul type': 'null',
@@ -80,7 +80,7 @@ class TSGenerator extends JSGenerator {
80
80
  'returntype': 'ReturnType',
81
81
  'type retour': 'ReturnType',
82
82
  'parameters': 'Parameters',
83
- 'paramètres type': 'Parameters',
83
+ 'parametres type': 'Parameters',
84
84
  'awaited': 'Awaited',
85
85
  'attendu type': 'Awaited'
86
86
  }
@@ -95,7 +95,6 @@ class TSGenerator extends JSGenerator {
95
95
 
96
96
  switch (node.type) {
97
97
  case 'TypeAlias':
98
- case 'TypeAliasDeclaration':
99
98
  return this.generateTypeAlias(node)
100
99
  case 'InterfaceDeclaration':
101
100
  return this.generateInterface(node)
@@ -131,11 +130,10 @@ class TSGenerator extends JSGenerator {
131
130
  generateTypeAlias(node) {
132
131
  const name = node.name
133
132
  const typeParams = node.typeParameters ? this.generateTypeParams(node.typeParameters) : ''
134
- const typeNode = node.aliasType || node.typeValue ||
135
- (typeof node.type === 'object' ? node.type : null)
136
- const type = this.generateType(typeNode)
133
+ const type = this.generateType(node.type)
137
134
 
138
135
  this.writeLine(`type ${name}${typeParams} = ${type};`)
136
+ this.writeLine('')
139
137
  }
140
138
 
141
139
  generateInterface(node) {
@@ -161,19 +159,17 @@ class TSGenerator extends JSGenerator {
161
159
  const readonly = member.readonly ? 'readonly ' : ''
162
160
  const optional = member.optional ? '?' : ''
163
161
  const name = member.name || member.key
162
+ const type = this.generateType(member.type || member.value)
164
163
 
165
164
  if (member.kind === 'method' || member.method) {
166
165
  const typeParams = member.typeParameters ? this.generateTypeParams(member.typeParameters) : ''
167
166
  const params = this.generateTypedParams(member.params || member.parameters || [])
168
- const returnType = this.generateType(member.returnType || member.type || 'void')
167
+ const returnType = member.returnType ? this.generateType(member.returnType) : 'void'
169
168
  this.writeLine(`${readonly}${name}${optional}${typeParams}(${params}): ${returnType};`)
170
169
  } else if (member.kind === 'index' || member.index) {
171
- const keyName = member.keyName || 'key'
172
170
  const keyType = this.generateType(member.keyType || 'string')
173
- const valueType = this.generateType(member.type || member.valueType || 'any')
174
- this.writeLine(`[${keyName}: ${keyType}]: ${valueType};`)
171
+ this.writeLine(`[key: ${keyType}]: ${type};`)
175
172
  } else {
176
- const type = this.generateType(member.type || member.value)
177
173
  this.writeLine(`${readonly}${name}${optional}: ${type};`)
178
174
  }
179
175
  }
@@ -190,59 +186,37 @@ class TSGenerator extends JSGenerator {
190
186
  const member = members[i]
191
187
  const memberName = member.name || member
192
188
  const value = member.value !== undefined ? ` = ${this.generateNode(member.value)}` : ''
193
- this.writeLine(`${memberName}${value},`)
189
+ const comma = i < members.length - 1 ? ',' : ''
190
+ this.writeLine(`${memberName}${value}${comma}`)
194
191
  }
195
192
 
196
193
  this.indent--
197
194
  this.writeLine('}')
195
+ this.writeLine('')
198
196
  }
199
197
 
200
198
  generateType(type) {
201
199
  if (!type) return 'any'
202
200
  if (typeof type === 'string') return this.translate(type)
203
201
 
204
- const typeKind = type.kind || (typeof type.type === 'string' ? type.type : null)
205
-
206
- switch (typeKind) {
207
- case 'string':
208
- case 'chaîne':
209
- return 'string'
210
- case 'number':
211
- case 'nombre':
212
- return 'number'
213
- case 'boolean':
214
- case 'booléen':
215
- return 'boolean'
216
- case 'void':
217
- return 'void'
218
- case 'null':
219
- return 'null'
220
- case 'undefined':
221
- return 'undefined'
222
- case 'any':
223
- return 'any'
224
- case 'never':
225
- return 'never'
226
- case 'unknown':
227
- return 'unknown'
228
- case 'référence':
229
- const refName = this.translate(type.name)
230
- if (type.typeArguments) {
231
- return `${refName}<${type.typeArguments.map(a => this.generateType(a)).join(', ')}>`
202
+ switch (type.type || type.kind) {
203
+ case 'TypeAnnotation':
204
+ let result = this.translate(type.name)
205
+ if (type.generic && type.generic.length > 0) {
206
+ result += '<' + type.generic.map(g => this.generateType(g)).join(', ') + '>'
232
207
  }
233
- return refName
234
- case 'literal':
235
- if (typeof type.value === 'string') return `"${type.value}"`
236
- if (typeof type.value === 'boolean') return type.value ? 'true' : 'false'
237
- return String(type.value)
208
+ if (type.isArray) {
209
+ result += '[]'
210
+ }
211
+ return result
238
212
  case 'union':
239
- return (type.types || []).map(t => this.generateType(t)).join(' | ')
213
+ return type.types.map(t => this.generateType(t)).join(' | ')
240
214
  case 'intersection':
241
- return (type.types || []).map(t => this.generateType(t)).join(' & ')
215
+ return type.types.map(t => this.generateType(t)).join(' & ')
242
216
  case 'array':
243
217
  return `${this.generateType(type.elementType)}[]`
244
218
  case 'tuple':
245
- return `[${(type.elements || type.elementTypes || []).map(e => this.generateType(e)).join(', ')}]`
219
+ return `[${type.elements.map(e => this.generateType(e)).join(', ')}]`
246
220
  case 'generic':
247
221
  const base = this.generateType(type.base)
248
222
  const args = type.arguments.map(a => this.generateType(a)).join(', ')
@@ -253,6 +227,8 @@ class TSGenerator extends JSGenerator {
253
227
  return `(${params}) => ${ret}`
254
228
  case 'object':
255
229
  return this.generateObjectType(type)
230
+ case 'literal':
231
+ return this.generateLiteralType(type)
256
232
  case 'conditional':
257
233
  const check = this.generateType(type.checkType)
258
234
  const ext = this.generateType(type.extendsType)
@@ -260,38 +236,21 @@ class TSGenerator extends JSGenerator {
260
236
  const falseT = this.generateType(type.falseType)
261
237
  return `${check} extends ${ext} ? ${trueT} : ${falseT}`
262
238
  case 'keyof':
263
- return `keyof ${this.generateType(type.type || type.operand)}`
239
+ return `keyof ${this.generateType(type.operand)}`
264
240
  case 'typeof':
265
- return `typeof ${type.expression || this.generateNode(type.operand)}`
241
+ return `typeof ${this.generateNode(type.operand)}`
266
242
  case 'indexed':
267
- return `${this.generateType(type.objectType || type.object)}[${this.generateType(type.indexType || type.index)}]`
243
+ return `${this.generateType(type.object)}[${this.generateType(type.index)}]`
268
244
  case 'mapped':
269
245
  return this.generateMappedType(type)
270
246
  case 'infer':
271
247
  return `infer ${type.name}`
272
- case 'template':
273
- return this.generateTemplateLiteralType(type)
274
248
  default:
275
- if (type.name) {
276
- const name = this.translate(type.name)
277
- if (type.typeArguments) {
278
- return `${name}<${type.typeArguments.map(a => this.generateType(a)).join(', ')}>`
279
- }
280
- return name
281
- }
249
+ if (type.name) return this.translate(type.name)
282
250
  return 'any'
283
251
  }
284
252
  }
285
253
 
286
- generateTemplateLiteralType(type) {
287
- const parts = (type.parts || []).map(p => {
288
- if (typeof p === 'string') return p
289
- if (p.name) return '${' + this.generateType(p) + '}'
290
- return this.generateType(p)
291
- })
292
- return '`' + parts.join('') + '`'
293
- }
294
-
295
254
  generateObjectType(type) {
296
255
  const members = (type.members || type.properties || []).map(m => {
297
256
  const readonly = m.readonly ? 'readonly ' : ''
@@ -312,18 +271,10 @@ class TSGenerator extends JSGenerator {
312
271
  generateMappedType(type) {
313
272
  const readonly = type.readonly ? (type.readonly === '-' ? '-readonly ' : 'readonly ') : ''
314
273
  const optional = type.optional ? (type.optional === '-' ? '-?' : '?') : ''
315
-
316
- let key, constraint
317
- if (type.typeParameter) {
318
- key = type.typeParameter.name || 'K'
319
- constraint = this.generateType(type.typeParameter.constraint)
320
- } else {
321
- key = type.key || 'K'
322
- constraint = this.generateType(type.constraint)
323
- }
324
-
274
+ const key = type.key || 'K'
275
+ const constraint = this.generateType(type.constraint)
325
276
  const as = type.as ? ` as ${this.generateType(type.as)}` : ''
326
- const valueType = this.generateType(type.valueType || type.value || type.type)
277
+ const valueType = this.generateType(type.value)
327
278
 
328
279
  return `{ ${readonly}[${key} in ${constraint}${as}]${optional}: ${valueType} }`
329
280
  }
@@ -405,11 +356,9 @@ class TSGenerator extends JSGenerator {
405
356
 
406
357
  generateTypeAssertion(node) {
407
358
  const expression = this.generateNode(node.expression)
408
- const typeNode = node.typeAnnotation || node.assertedType ||
409
- (node.type !== 'TypeAssertion' ? node.type : null)
410
- const type = this.generateType(typeNode)
359
+ const type = this.generateType(node.type)
411
360
 
412
- if (node.asStyle !== false) {
361
+ if (node.asStyle) {
413
362
  return `${expression} as ${type}`
414
363
  }
415
364
  return `<${type}>${expression}`
@@ -436,25 +385,24 @@ class TSGenerator extends JSGenerator {
436
385
  generateVariableDeclaration(node) {
437
386
  const kind = this.translate(node.kind || 'let')
438
387
 
439
- for (const decl of node.declarations || []) {
440
- let name
441
- if (typeof decl.id === 'string') {
442
- name = decl.id
443
- } else if (decl.id?.name) {
444
- name = decl.id.name
445
- } else if (typeof decl.name === 'string') {
446
- name = decl.name
447
- } else if (decl.name?.name) {
448
- name = decl.name.name
449
- } else {
450
- name = this.generateNode(decl.id || decl.name)
388
+ if (node.declarations && node.declarations.length > 0) {
389
+ for (const decl of node.declarations) {
390
+ const name = this.generateNode(decl.id || decl.name)
391
+ const type = decl.type ? ': ' + this.generateType(decl.type) : ''
392
+
393
+ if (decl.init) {
394
+ const init = this.generateNode(decl.init)
395
+ this.writeLine(`${kind} ${name}${type} = ${init};`)
396
+ } else {
397
+ this.writeLine(`${kind} ${name}${type};`)
398
+ }
451
399
  }
400
+ } else {
401
+ const name = typeof node.name === 'string' ? node.name : this.generateNode(node.name)
402
+ const type = node.typeAnnotation ? ': ' + this.generateType(node.typeAnnotation) : ''
452
403
 
453
- const typeNode = decl.typeAnnotation || decl.type
454
- const type = typeNode ? ': ' + this.generateType(typeNode) : ''
455
-
456
- if (decl.init) {
457
- const init = this.generateNode(decl.init)
404
+ if (node.init) {
405
+ const init = this.generateNode(node.init)
458
406
  this.writeLine(`${kind} ${name}${type} = ${init};`)
459
407
  } else {
460
408
  this.writeLine(`${kind} ${name}${type};`)
@@ -512,8 +460,7 @@ class TSGenerator extends JSGenerator {
512
460
  if (node.kind === 'property' || node.type === 'PropertyDefinition' || node.property) {
513
461
  const name = this.translate(node.key?.name || node.name || '')
514
462
  const optional = node.optional ? '?' : ''
515
- const typeNode = node.typeAnnotation || node.type
516
- const type = typeNode && typeof typeNode === 'object' ? ': ' + this.generateType(typeNode) : ''
463
+ const type = node.typeAnnotation ? ': ' + this.generateType(node.typeAnnotation) : ''
517
464
  const value = node.value ? ' = ' + this.generateNode(node.value) : ''
518
465
  this.writeLine(`${modifiers}${name}${optional}${type}${value};`)
519
466
  return
@@ -541,27 +488,6 @@ class TSGenerator extends JSGenerator {
541
488
  this.writeLine('}')
542
489
  this.writeLine('')
543
490
  }
544
-
545
- generateArrowFunction(node) {
546
- const async = node.async ? 'async ' : ''
547
- const params = this.generateTypedParams(node.params || [])
548
- const returnType = node.returnType ? ': ' + this.generateType(node.returnType) : ''
549
-
550
- if (node.body?.type === 'BlockStatement') {
551
- let body = ''
552
- const savedOutput = this.output
553
- this.output = ''
554
- this.indent++
555
- this.generateNode(node.body)
556
- this.indent--
557
- body = this.output.trim()
558
- this.output = savedOutput
559
- return `${async}(${params})${returnType} => {\n${body}\n${this.getIndent()}}`
560
- } else {
561
- const body = this.generateNode(node.body)
562
- return `${async}(${params})${returnType} => ${body}`
563
- }
564
- }
565
491
  }
566
492
 
567
493
  module.exports = {