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
package/cli/compiler.js CHANGED
@@ -2,6 +2,7 @@ const fs = require('fs')
2
2
  const path = require('path')
3
3
 
4
4
  const { EtherLexer } = require('../lexer/ether-lexer')
5
+ const { EtherParser } = require('../ether-parser')
5
6
 
6
7
  const { CSSGenerator } = require('../generators/css-generator')
7
8
  const { HTMLGenerator } = require('../generators/html-generator')
@@ -67,9 +68,10 @@ class EtherCompiler {
67
68
 
68
69
  this.lexer = new EtherLexer()
69
70
  this.generators = {}
70
- this.parsers = {}
71
+ this.parser = null
71
72
 
72
73
  this.initGenerators()
74
+ this.initParser()
73
75
  }
74
76
 
75
77
  initGenerators() {
@@ -86,6 +88,11 @@ class EtherCompiler {
86
88
  }
87
89
  }
88
90
 
91
+ initParser() {
92
+ const i18nDir = path.join(__dirname, '..', 'i18n')
93
+ this.parser = new EtherParser(i18nDir)
94
+ }
95
+
89
96
  normalizeTarget(target) {
90
97
  const mappings = {
91
98
  javascript: 'js',
@@ -127,58 +134,7 @@ class EtherCompiler {
127
134
 
128
135
  parse(content, target) {
129
136
  const normalizedTarget = this.normalizeTarget(target)
130
-
131
- if (normalizedTarget === 'html') {
132
- return this.parseHTML(content)
133
- }
134
-
135
- const lexer = new EtherLexer(content)
136
- const tokens = lexer.tokenize()
137
-
138
- try {
139
- const ParserClass = this.loadParser(normalizedTarget)
140
- if (ParserClass) {
141
- const parser = new ParserClass(tokens, this.config)
142
- return parser.parse()
143
- }
144
- } catch (err) {
145
- }
146
-
147
- return this.buildGenericAST(tokens, target)
148
- }
149
-
150
- parseHTML(content) {
151
- const { HTMLParser } = require('../parsers/html-parser')
152
- const i18nPath = path.join(__dirname, '..', 'i18n', 'i18n-html.json')
153
- const parser = new HTMLParser(i18nPath)
154
- return parser.parse(content)
155
- }
156
-
157
- loadParser(target) {
158
- try {
159
- const parserPath = path.join(__dirname, '..', 'parsers', `${target}-parser.js`)
160
- if (fs.existsSync(parserPath)) {
161
- const module = require(parserPath)
162
- const className = `${target.charAt(0).toUpperCase()}${target.slice(1)}Parser`
163
- return module[className] || module.default || Object.values(module)[0]
164
- }
165
- } catch (err) {
166
- }
167
- return null
168
- }
169
-
170
- buildGenericAST(tokens, target) {
171
- return {
172
- type: 'Program',
173
- target,
174
- body: tokens.map(token => ({
175
- type: 'Token',
176
- tokenType: token.type,
177
- value: token.value,
178
- line: token.line,
179
- column: token.column
180
- }))
181
- }
137
+ return this.parser.parse(content, normalizedTarget)
182
138
  }
183
139
 
184
140
  generate(ast, target) {
package/cli/ether.js CHANGED
@@ -6,7 +6,7 @@ const http = require('http')
6
6
  const { EtherCompiler } = require('./compiler')
7
7
  const { Watcher } = require('./watcher')
8
8
 
9
- const VERSION = '0.1.6'
9
+ const VERSION = '0.1.8'
10
10
 
11
11
  const COLORS = {
12
12
  reset: '\x1b[0m',
@@ -5,11 +5,6 @@ class CSSGenerator {
5
5
  this.i18n = null
6
6
  this.indent = 0
7
7
  this.output = ''
8
- this.propertyMap = {}
9
- this.valueMap = {}
10
- this.unitMap = {}
11
- this.colorMap = {}
12
- this.selectorMap = {}
13
8
 
14
9
  if (i18nPath) {
15
10
  this.loadI18n(i18nPath)
@@ -127,27 +122,7 @@ class CSSGenerator {
127
122
  return mapped
128
123
  }
129
124
 
130
- let result = this.translateGeneric(val)
131
- result = this.translateColorsInValue(result)
132
- return result
133
- }
134
-
135
- translateColorsInValue(val) {
136
- if (typeof val !== 'string') return val
137
-
138
- const colorMap = {
139
- 'blanc': 'white', 'noir': 'black', 'rouge': 'red', 'vert': 'green',
140
- 'bleu': 'blue', 'jaune': 'yellow', 'orange': 'orange', 'violet': 'purple',
141
- 'rose': 'pink', 'gris': 'gray', 'cyan': 'cyan', 'magenta': 'magenta',
142
- 'marron': 'brown', 'beige': 'beige', 'or': 'gold', 'argent': 'silver'
143
- }
144
-
145
- let result = val
146
- for (const [fr, en] of Object.entries(colorMap)) {
147
- const regex = new RegExp(`\\b${fr}\\b`, 'gi')
148
- result = result.replace(regex, en)
149
- }
150
- return result
125
+ return this.translateGeneric(val)
151
126
  }
152
127
 
153
128
  translateGeneric(text) {
@@ -160,8 +135,7 @@ class CSSGenerator {
160
135
  'style': 'font-style',
161
136
  'alignement': 'text-align',
162
137
  'decoration': 'text-decoration',
163
- 'transformation texte': 'text-transform',
164
- 'transformation': 'transform',
138
+ 'transformation': 'text-transform',
165
139
  'debordement': 'overflow',
166
140
  'largeur': 'width',
167
141
  'hauteur': 'height',
@@ -184,7 +158,6 @@ class CSSGenerator {
184
158
  'animation': 'animation',
185
159
  'filtre': 'filter',
186
160
  'ajustement': 'object-fit',
187
- 'selection utilisateur': 'user-select',
188
161
  'selection': 'user-select',
189
162
  'redimensionner': 'resize',
190
163
  'visibilite': 'visibility',
@@ -210,7 +183,7 @@ class CSSGenerator {
210
183
  'rose': 'pink',
211
184
  'gris': 'gray',
212
185
  'transparent': 'transparent',
213
- 'hériter': 'inherit',
186
+ 'heriter': 'inherit',
214
187
  'initial': 'initial',
215
188
  'aucun': 'none',
216
189
  'auto': 'auto',
@@ -223,7 +196,7 @@ class CSSGenerator {
223
196
  'statique': 'static',
224
197
  'collant': 'sticky',
225
198
  'centre': 'center',
226
- 'début': 'flex-start',
199
+ 'debut': 'flex-start',
227
200
  'fin': 'flex-end',
228
201
  'entre': 'space-between',
229
202
  'autour': 'space-around',
@@ -259,32 +232,32 @@ class CSSGenerator {
259
232
  }
260
233
 
261
234
  translateSelector(selector) {
262
- if (!selector) return selector
263
235
  let result = selector
264
236
 
265
- result = result.replace(/\s+au survol/gi, ':hover')
266
- result = result.replace(/\s+au clic/gi, ':active')
267
- result = result.replace(/\s+au focus/gi, ':focus')
268
- result = result.replace(/\s+au focus dans/gi, ':focus-within')
269
- result = result.replace(/\s+visite/gi, ':visited')
270
- result = result.replace(/\s+premier enfant/gi, ':first-child')
271
- result = result.replace(/\s+dernier enfant/gi, ':last-child')
272
- result = result.replace(/\s+enfant impair/gi, ':nth-child(odd)')
273
- result = result.replace(/\s+enfant pair/gi, ':nth-child(even)')
274
- result = result.replace(/\s+avant/gi, '::before')
275
- result = result.replace(/\s+apres/gi, '::after')
276
- result = result.replace(/\s+selection/gi, '::selection')
277
- result = result.replace(/\s+placeholder/gi, '::placeholder')
278
- result = result.replace(/\s+premiere lettre/gi, '::first-letter')
279
- result = result.replace(/\s+premiere ligne/gi, '::first-line')
280
- result = result.replace(/\s+coche/gi, ':checked')
281
- result = result.replace(/\s+desactive/gi, ':disabled')
282
- result = result.replace(/\s+requis/gi, ':required')
283
- result = result.replace(/\s+optionnel/gi, ':optional')
284
- result = result.replace(/\s+valide/gi, ':valid')
285
- result = result.replace(/\s+invalide/gi, ':invalid')
286
- result = result.replace(/\s+vide/gi, ':empty')
287
- result = result.replace(/^racine$/gi, ':root')
237
+ result = result.replace(/au survol/gi, ':hover')
238
+ result = result.replace(/au clic/gi, ':active')
239
+ result = result.replace(/au focus/gi, ':focus')
240
+ result = result.replace(/au focus dans/gi, ':focus-within')
241
+ result = result.replace(/visite/gi, ':visited')
242
+ result = result.replace(/premier enfant/gi, ':first-child')
243
+ result = result.replace(/dernier enfant/gi, ':last-child')
244
+ result = result.replace(/enfant impair/gi, ':nth-child(odd)')
245
+ result = result.replace(/enfant pair/gi, ':nth-child(even)')
246
+ result = result.replace(/avant/gi, '::before')
247
+ result = result.replace(/apres/gi, '::after')
248
+ result = result.replace(/selection/gi, '::selection')
249
+ result = result.replace(/placeholder/gi, '::placeholder')
250
+ result = result.replace(/premiere lettre/gi, '::first-letter')
251
+ result = result.replace(/premiere ligne/gi, '::first-line')
252
+ result = result.replace(/coche/gi, ':checked')
253
+ result = result.replace(/desactive/gi, ':disabled')
254
+ result = result.replace(/active/gi, ':enabled')
255
+ result = result.replace(/requis/gi, ':required')
256
+ result = result.replace(/optionnel/gi, ':optional')
257
+ result = result.replace(/valide/gi, ':valid')
258
+ result = result.replace(/invalide/gi, ':invalid')
259
+ result = result.replace(/vide/gi, ':empty')
260
+ result = result.replace(/racine/gi, ':root')
288
261
 
289
262
  return result
290
263
  }
@@ -345,6 +318,14 @@ class CSSGenerator {
345
318
  if (!node) return
346
319
 
347
320
  switch (node.type) {
321
+ case 'StyleSheet':
322
+ case 'stylesheet':
323
+ if (node.rules) {
324
+ for (const rule of node.rules) {
325
+ this.generateNode(rule)
326
+ }
327
+ }
328
+ break
348
329
  case 'Rule':
349
330
  case 'rule':
350
331
  this.generateRule(node)
@@ -400,6 +381,12 @@ class CSSGenerator {
400
381
  this.indent--
401
382
  this.writeLine('}')
402
383
  this.writeLine('')
384
+
385
+ if (node.nestedRules) {
386
+ for (const nested of node.nestedRules) {
387
+ this.generateNode(nested)
388
+ }
389
+ }
403
390
  }
404
391
 
405
392
  generateDeclaration(decl) {
@@ -5,9 +5,6 @@ class GraphQLGenerator {
5
5
  this.i18n = null
6
6
  this.indent = 0
7
7
  this.output = ''
8
- this.keywordMap = {}
9
- this.typeMap = {}
10
- this.directiveMap = {}
11
8
 
12
9
  if (i18nPath) {
13
10
  this.loadI18n(i18nPath)
@@ -50,45 +47,45 @@ class GraphQLGenerator {
50
47
  translateGeneric(word) {
51
48
  const translations = {
52
49
  'type': 'type',
53
- 'requête': 'Query',
50
+ 'requete': 'Query',
54
51
  'mutation': 'Mutation',
55
52
  'abonnement': 'Subscription',
56
53
  'schema': 'schema',
57
54
  'interface': 'interface',
58
55
  'union': 'union',
59
56
  'enum': 'enum',
60
- 'énumération': 'enum',
61
- 'entrée': 'input',
57
+ 'enumeration': 'enum',
58
+ 'entree': 'input',
62
59
  'scalaire': 'scalar',
63
- 'étend': 'extend',
64
- 'implémente': 'implements',
60
+ 'etend': 'extend',
61
+ 'implemente': 'implements',
65
62
  'fragment': 'fragment',
66
63
  'sur': 'on',
67
64
  'directive': 'directive',
68
- 'répéter': '@repeatable',
69
- 'chaîne': 'String',
65
+ 'repeter': '@repeatable',
66
+ 'chaine': 'String',
70
67
  'entier': 'Int',
71
68
  'flottant': 'Float',
72
- 'booléen': 'Boolean',
69
+ 'booleen': 'Boolean',
73
70
  'identifiant': 'ID',
74
71
  'date': 'Date',
75
72
  'datetime': 'DateTime',
76
73
  'json': 'JSON',
77
74
  'url': 'URL',
78
- 'courriel': 'Email',
75
+ 'email': 'Email',
79
76
  'vrai': 'true',
80
77
  'faux': 'false',
81
78
  'nul': 'null',
82
79
  'non nul': '!',
83
80
  'liste': '[]',
84
- 'déprécié': '@deprecated',
81
+ 'deprecie': '@deprecated',
85
82
  'ignorer': '@skip',
86
83
  'inclure': '@include',
87
84
  'si': 'if',
88
85
  'raison': 'reason',
89
86
  'requiert': '@requires',
90
87
  'fournit': '@provides',
91
- 'clé': '@key',
88
+ 'cle': '@key',
92
89
  'externe': '@external',
93
90
  'champs': 'fields'
94
91
  }
@@ -101,28 +98,28 @@ class GraphQLGenerator {
101
98
  if (!type) return ''
102
99
 
103
100
  const types = {
104
- 'chaîne': 'String',
101
+ 'chaine': 'String',
105
102
  'entier': 'Int',
106
103
  'flottant': 'Float',
107
- 'booléen': 'Boolean',
104
+ 'booleen': 'Boolean',
108
105
  'identifiant': 'ID',
109
106
  'date': 'Date',
110
107
  'datetime': 'DateTime',
111
108
  'heure': 'Time',
112
109
  'json': 'JSON',
113
110
  'url': 'URL',
114
- 'courriel': 'Email',
111
+ 'email': 'Email',
115
112
  'telephone': 'Phone',
116
113
  'uuid': 'UUID',
117
114
  'grand entier': 'BigInt',
118
115
  'decimal': 'Decimal',
119
116
  'positif entier': 'PositiveInt',
120
- 'négatif entier': 'NegativeInt',
121
- 'non négatif entier': 'NonNegativeInt',
117
+ 'negatif entier': 'NegativeInt',
118
+ 'non negatif entier': 'NonNegativeInt',
122
119
  'non positif entier': 'NonPositiveInt',
123
120
  'positif flottant': 'PositiveFloat',
124
- 'négatif flottant': 'NegativeFloat',
125
- 'non vide chaîne': 'NonEmptyString',
121
+ 'negatif flottant': 'NegativeFloat',
122
+ 'non vide chaine': 'NonEmptyString',
126
123
  'upload': 'Upload',
127
124
  'vide': 'Void'
128
125
  }
@@ -659,7 +656,7 @@ class GraphQLGenerator {
659
656
  }
660
657
 
661
658
  generateVariableDefinition(variable) {
662
- const name = variable.variable?.name?.value || variable.variable?.name || variable.name
659
+ const name = variable.variable?.name?.value || variable.name
663
660
  const type = this.generateType(variable.type)
664
661
  const defaultValue = variable.defaultValue
665
662
  const directives = variable.directives || []