@semacode/cli 1.3.5 → 1.3.6

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 (157) hide show
  1. package/dist/cpp-symbols.d.ts +10 -0
  2. package/dist/cpp-symbols.js.map +1 -0
  3. package/dist/dotnet-http.d.ts +23 -0
  4. package/dist/dotnet-http.js.map +1 -0
  5. package/dist/drift.d.ts +118 -0
  6. package/dist/drift.js.map +1 -0
  7. package/dist/go-http.d.ts +23 -0
  8. package/dist/go-http.js.map +1 -0
  9. package/dist/importador.d.ts +29 -0
  10. package/dist/importador.js.map +1 -0
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/java-http.d.ts +23 -0
  14. package/dist/java-http.js.map +1 -0
  15. package/dist/lua-symbols.d.ts +8 -0
  16. package/dist/lua-symbols.js.map +1 -0
  17. package/dist/projeto.d.ts +48 -0
  18. package/dist/projeto.js.map +1 -0
  19. package/dist/python-http.d.ts +23 -0
  20. package/dist/python-http.js.map +1 -0
  21. package/dist/rust-http.d.ts +23 -0
  22. package/dist/rust-http.js.map +1 -0
  23. package/dist/tipos.d.ts +3 -0
  24. package/dist/tipos.js.map +1 -0
  25. package/dist/typescript-http.d.ts +35 -0
  26. package/dist/typescript-http.js.map +1 -0
  27. package/node_modules/@sema/gerador-css/dist/index.d.ts +3 -0
  28. package/node_modules/@sema/gerador-css/dist/index.js +592 -0
  29. package/node_modules/@sema/gerador-css/dist/index.js.map +1 -0
  30. package/node_modules/@sema/gerador-css/package.json +14 -0
  31. package/node_modules/@sema/gerador-css/src/index.ts +605 -0
  32. package/node_modules/@sema/gerador-css/tsconfig.json +13 -0
  33. package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +1 -0
  34. package/node_modules/@sema/gerador-dart/dist/index.d.ts +3 -0
  35. package/node_modules/@sema/gerador-dart/dist/index.js +44 -0
  36. package/node_modules/@sema/gerador-dart/dist/index.js.map +1 -0
  37. package/node_modules/@sema/gerador-dart/package.json +14 -0
  38. package/node_modules/@sema/gerador-dart/src/index.ts +52 -0
  39. package/node_modules/@sema/gerador-dart/tsconfig.json +13 -0
  40. package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +1 -0
  41. package/node_modules/@sema/gerador-html/dist/index.d.ts +3 -0
  42. package/node_modules/@sema/gerador-html/dist/index.js +163 -0
  43. package/node_modules/@sema/gerador-html/dist/index.js.map +1 -0
  44. package/node_modules/@sema/gerador-html/package.json +14 -0
  45. package/node_modules/@sema/gerador-html/src/index.ts +185 -0
  46. package/node_modules/@sema/gerador-html/tsconfig.json +13 -0
  47. package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +1 -0
  48. package/node_modules/@sema/gerador-javascript/dist/index.d.ts +3 -0
  49. package/node_modules/@sema/gerador-javascript/dist/index.js +421 -0
  50. package/node_modules/@sema/gerador-javascript/dist/index.js.map +1 -0
  51. package/node_modules/@sema/gerador-javascript/package.json +14 -0
  52. package/node_modules/@sema/gerador-javascript/src/index.ts +461 -0
  53. package/node_modules/@sema/gerador-javascript/tsconfig.json +13 -0
  54. package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +1 -0
  55. package/node_modules/@sema/gerador-lua/dist/index.d.ts +3 -0
  56. package/node_modules/@sema/gerador-lua/dist/index.js +328 -0
  57. package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -0
  58. package/node_modules/@sema/gerador-lua/package.json +14 -0
  59. package/node_modules/@sema/gerador-lua/src/index.d.ts +3 -0
  60. package/node_modules/@sema/gerador-lua/src/index.js.map +1 -0
  61. package/node_modules/@sema/gerador-lua/src/index.ts +359 -0
  62. package/node_modules/@sema/gerador-lua/tsconfig.json +13 -0
  63. package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +1 -0
  64. package/node_modules/@sema/gerador-python/dist/index.d.ts +6 -0
  65. package/node_modules/@sema/gerador-python/dist/index.js +628 -0
  66. package/node_modules/@sema/gerador-python/dist/index.js.map +1 -0
  67. package/node_modules/@sema/gerador-python/package.json +14 -0
  68. package/node_modules/@sema/gerador-python/src/index.ts +706 -0
  69. package/node_modules/@sema/gerador-python/tsconfig.json +13 -0
  70. package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +1 -0
  71. package/node_modules/@sema/gerador-typescript/dist/index.d.ts +6 -0
  72. package/node_modules/@sema/gerador-typescript/dist/index.js +656 -0
  73. package/node_modules/@sema/gerador-typescript/dist/index.js.map +1 -0
  74. package/node_modules/@sema/gerador-typescript/package.json +14 -0
  75. package/node_modules/@sema/gerador-typescript/src/index.ts +728 -0
  76. package/node_modules/@sema/gerador-typescript/tsconfig.json +13 -0
  77. package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +1 -0
  78. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +122 -0
  79. package/node_modules/@sema/nucleo/dist/ast/tipos.js +2 -0
  80. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +1 -0
  81. package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +21 -0
  82. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +12 -0
  83. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +1 -0
  84. package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +9 -0
  85. package/node_modules/@sema/nucleo/dist/formatador/index.js +445 -0
  86. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -0
  87. package/node_modules/@sema/nucleo/dist/index.d.ts +34 -0
  88. package/node_modules/@sema/nucleo/dist/index.js +95 -0
  89. package/node_modules/@sema/nucleo/dist/index.js.map +1 -0
  90. package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +5 -0
  91. package/node_modules/@sema/nucleo/dist/ir/conversor.js +781 -0
  92. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -0
  93. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +285 -0
  94. package/node_modules/@sema/nucleo/dist/ir/modelos.js +2 -0
  95. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +1 -0
  96. package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +7 -0
  97. package/node_modules/@sema/nucleo/dist/lexer/lexer.js +122 -0
  98. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +1 -0
  99. package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +8 -0
  100. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +46 -0
  101. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -0
  102. package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +9 -0
  103. package/node_modules/@sema/nucleo/dist/parser/parser.js +656 -0
  104. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -0
  105. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +57 -0
  106. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1497 -0
  107. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -0
  108. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +104 -0
  109. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +445 -0
  110. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +1 -0
  111. package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +91 -0
  112. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +258 -0
  113. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +1 -0
  114. package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +2 -0
  115. package/node_modules/@sema/nucleo/dist/util/arquivos.js +25 -0
  116. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +1 -0
  117. package/node_modules/@sema/nucleo/package.json +10 -0
  118. package/node_modules/@sema/nucleo/src/ast/tipos.ts +191 -0
  119. package/node_modules/@sema/nucleo/src/diagnosticos/index.ts +43 -0
  120. package/node_modules/@sema/nucleo/src/formatador/index.ts +507 -0
  121. package/node_modules/@sema/nucleo/src/index.ts +133 -0
  122. package/node_modules/@sema/nucleo/src/ir/conversor.ts +912 -0
  123. package/node_modules/@sema/nucleo/src/ir/modelos.ts +331 -0
  124. package/node_modules/@sema/nucleo/src/lexer/lexer.ts +166 -0
  125. package/node_modules/@sema/nucleo/src/lexer/tokens.ts +64 -0
  126. package/node_modules/@sema/nucleo/src/parser/gramatica.ebnf +39 -0
  127. package/node_modules/@sema/nucleo/src/parser/parser.ts +790 -0
  128. package/node_modules/@sema/nucleo/src/semantico/analisador.ts +2692 -0
  129. package/node_modules/@sema/nucleo/src/semantico/estruturas.ts +632 -0
  130. package/node_modules/@sema/nucleo/src/semantico/seguranca.ts +362 -0
  131. package/node_modules/@sema/nucleo/src/util/arquivos.ts +28 -0
  132. package/node_modules/@sema/nucleo/tsconfig.json +9 -0
  133. package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +1 -0
  134. package/node_modules/@sema/padroes/dist/index.d.ts +23 -0
  135. package/node_modules/@sema/padroes/dist/index.js +210 -0
  136. package/node_modules/@sema/padroes/dist/index.js.map +1 -0
  137. package/node_modules/@sema/padroes/package.json +10 -0
  138. package/node_modules/@sema/padroes/src/index.ts +251 -0
  139. package/node_modules/@sema/padroes/tsconfig.json +9 -0
  140. package/node_modules/@sema/padroes/tsconfig.tsbuildinfo +1 -0
  141. package/package.json +1 -1
  142. package/README.md +0 -73
  143. package/logo.png +0 -0
  144. package/semacode-cli-1.3.1.tgz +0 -0
  145. package/src/cpp-symbols.ts +0 -82
  146. package/src/dotnet-http.ts +0 -355
  147. package/src/drift.ts +0 -2455
  148. package/src/go-http.ts +0 -118
  149. package/src/importador.ts +0 -3448
  150. package/src/index.ts +0 -4476
  151. package/src/java-http.ts +0 -247
  152. package/src/projeto.ts +0 -810
  153. package/src/python-http.ts +0 -258
  154. package/src/rust-http.ts +0 -125
  155. package/src/tipos.ts +0 -22
  156. package/src/typescript-http.ts +0 -1076
  157. package/tsconfig.json +0 -20
@@ -0,0 +1,331 @@
1
+ import type { Diagnostico } from "../diagnosticos/index.js";
2
+ import type {
3
+ ContratoErroRouteSemantico,
4
+ EfeitoSemantico,
5
+ EtapaFlowSemantica,
6
+ ExpressaoSemantica,
7
+ TransicaoEstadoSemantica,
8
+ } from "../semantico/estruturas.js";
9
+ import type {
10
+ ClassificacaoDadoSemantico,
11
+ ModoAuthSemantico,
12
+ MotivoAuditSemantico,
13
+ OrigemAuthSemantica,
14
+ PrincipalAuthSemantico,
15
+ RedacaoLogSemantica,
16
+ TenantAuthzSemantico,
17
+ } from "../semantico/seguranca.js";
18
+
19
+ export type PerfilCompatibilidade = "publico" | "interno" | "experimental" | "legado" | "deprecado";
20
+ export type StatusResolucaoSemantica = "nao_verificado" | "resolvido" | "parcial" | "inferido" | "quebrado" | "nao_encontrado";
21
+ export type NivelConfiancaSemantica = "alta" | "media" | "baixa";
22
+ export type NivelRiscoSemantico = "baixo" | "medio" | "alto";
23
+ export type TipoSuperficieIr = "worker" | "evento" | "fila" | "cron" | "webhook" | "cache" | "storage" | "policy";
24
+
25
+ export interface IrCampo {
26
+ nome: string;
27
+ tipo: string;
28
+ modificadores: string[];
29
+ tipoOriginal: string;
30
+ tipoBase: string;
31
+ cardinalidade: "unitario" | "lista" | "mapa" | "uniao";
32
+ opcional: boolean;
33
+ tiposAlternativos: string[];
34
+ tipoItem?: string;
35
+ chaveMapa?: string;
36
+ valorMapa?: string;
37
+ refinamentos: string[];
38
+ }
39
+
40
+ export interface IrImplementacaoTask {
41
+ origem: "ts" | "py" | "dart" | "cs" | "java" | "go" | "rust" | "cpp";
42
+ caminho: string;
43
+ origemArquivo?: string;
44
+ origemSimbolo?: string;
45
+ resolucaoImpl?: string;
46
+ statusImpl?: StatusResolucaoSemantica;
47
+ }
48
+
49
+ export interface IrVinculo {
50
+ tipo: string;
51
+ valor: string;
52
+ arquivo?: string;
53
+ simbolo?: string;
54
+ recurso?: string;
55
+ superficie?: string;
56
+ statusResolucao?: StatusResolucaoSemantica;
57
+ confianca?: NivelConfiancaSemantica;
58
+ }
59
+
60
+ export interface IrExecucao {
61
+ idempotencia: boolean;
62
+ timeout: string;
63
+ retry: string;
64
+ compensacao: string;
65
+ criticidadeOperacional: "baixa" | "media" | "alta" | "critica";
66
+ explicita: boolean;
67
+ }
68
+
69
+ export interface IrAuth {
70
+ explicita: boolean;
71
+ modo?: ModoAuthSemantico | string;
72
+ estrategia?: string;
73
+ principal?: PrincipalAuthSemantico | string;
74
+ origem?: OrigemAuthSemantica | string;
75
+ }
76
+
77
+ export interface IrAuthz {
78
+ explicita: boolean;
79
+ papeis: string[];
80
+ escopos: string[];
81
+ politica?: string;
82
+ tenant?: TenantAuthzSemantico | string;
83
+ }
84
+
85
+ export interface IrCampoDadoClassificado {
86
+ origem: string;
87
+ campo: string;
88
+ classificacao: ClassificacaoDadoSemantico | string;
89
+ }
90
+
91
+ export interface IrDados {
92
+ explicita: boolean;
93
+ classificacaoPadrao?: ClassificacaoDadoSemantico | string;
94
+ redacaoLog?: RedacaoLogSemantica | string;
95
+ retencao?: string;
96
+ campos: IrCampoDadoClassificado[];
97
+ }
98
+
99
+ export interface IrAudit {
100
+ explicita: boolean;
101
+ evento?: string;
102
+ ator?: string;
103
+ correlacao?: string;
104
+ retencao?: string;
105
+ motivo?: MotivoAuditSemantico | string;
106
+ }
107
+
108
+ export interface IrSegredo {
109
+ nome: string;
110
+ origem?: string;
111
+ escopo?: string;
112
+ acesso?: string;
113
+ rotacao?: string;
114
+ naoLogar?: boolean;
115
+ naoRetornar?: boolean;
116
+ mascarar?: boolean;
117
+ }
118
+
119
+ export interface IrSegredos {
120
+ explicita: boolean;
121
+ itens: IrSegredo[];
122
+ }
123
+
124
+ export interface IrForbidden {
125
+ explicita: boolean;
126
+ regras: string[];
127
+ }
128
+
129
+ export interface IrBlocoDeclarativo {
130
+ campos: IrCampo[];
131
+ linhas: string[];
132
+ blocos: IrBlocoDeclarativoAninhado[];
133
+ }
134
+
135
+ export interface IrBlocoDeclarativoAninhado {
136
+ nome: string;
137
+ conteudo: IrBlocoDeclarativo;
138
+ }
139
+
140
+ export interface IrCasoTeste {
141
+ nome: string;
142
+ given: IrBlocoDeclarativo;
143
+ when?: IrBlocoDeclarativo;
144
+ expect: IrBlocoDeclarativo;
145
+ error?: IrBlocoDeclarativo;
146
+ }
147
+
148
+ export interface IrResumoAgente {
149
+ riscos: string[];
150
+ checks: string[];
151
+ entidadesAfetadas: string[];
152
+ superficiesPublicas: string[];
153
+ mutacoesPrevistas: string[];
154
+ }
155
+
156
+ export interface IrType {
157
+ nome: string;
158
+ definicao: IrBlocoDeclarativo;
159
+ invariantes: ExpressaoSemantica[];
160
+ }
161
+
162
+ export interface IrEntity {
163
+ nome: string;
164
+ campos: IrCampo[];
165
+ invariantes: ExpressaoSemantica[];
166
+ }
167
+
168
+ export interface IrEnum {
169
+ nome: string;
170
+ valores: string[];
171
+ }
172
+
173
+ export interface IrUse {
174
+ origem: "sema" | "ts" | "py" | "dart" | "cs" | "java" | "go" | "rust" | "cpp";
175
+ caminho: string;
176
+ externo: boolean;
177
+ }
178
+
179
+ export interface IrInteropExterno {
180
+ origem: "ts" | "py" | "dart" | "cs" | "java" | "go" | "rust" | "cpp";
181
+ caminho: string;
182
+ }
183
+
184
+ export interface IrErroOperacional {
185
+ codigo: string;
186
+ mensagem: string;
187
+ categoria?: string;
188
+ recuperabilidade?: string;
189
+ acaoChamador?: string;
190
+ impactaEstado?: boolean;
191
+ requerCompensacao?: boolean;
192
+ origemTask?: string;
193
+ }
194
+
195
+ export interface IrTask {
196
+ nome: string;
197
+ input: IrCampo[];
198
+ output: IrCampo[];
199
+ rules: string[];
200
+ regrasEstruturadas: ExpressaoSemantica[];
201
+ effects: string[];
202
+ efeitosEstruturados: EfeitoSemantico[];
203
+ implementacoesExternas: IrImplementacaoTask[];
204
+ vinculos: IrVinculo[];
205
+ execucao: IrExecucao;
206
+ auth: IrAuth;
207
+ authz: IrAuthz;
208
+ dados: IrDados;
209
+ audit: IrAudit;
210
+ segredos: IrSegredos;
211
+ forbidden: IrForbidden;
212
+ guarantees: string[];
213
+ garantiasEstruturadas: ExpressaoSemantica[];
214
+ errors: Record<string, string>;
215
+ errosDetalhados: IrErroOperacional[];
216
+ perfilCompatibilidade: PerfilCompatibilidade;
217
+ stateContract?: IrTaskStateContract;
218
+ resumoAgente: IrResumoAgente;
219
+ tests: IrCasoTeste[];
220
+ }
221
+
222
+ export interface IrErroPublico extends IrErroOperacional {
223
+ nome: string;
224
+ }
225
+
226
+ export interface IrRoutePublica {
227
+ metodo?: string;
228
+ caminho?: string;
229
+ task?: string;
230
+ input: IrCampo[];
231
+ output: IrCampo[];
232
+ errors: IrErroPublico[];
233
+ effects: EfeitoSemantico[];
234
+ garantiasMinimas: string[];
235
+ confiancaContrato?: NivelConfiancaSemantica;
236
+ riscoRegressao?: NivelRiscoSemantico;
237
+ divergenciasPublicas?: string[];
238
+ }
239
+
240
+ export interface IrTaskStateContract {
241
+ nomeEstado?: string;
242
+ campos: IrCampo[];
243
+ linhas: string[];
244
+ transicoes: TransicaoEstadoSemantica[];
245
+ }
246
+
247
+ export interface IrFlow {
248
+ nome: string;
249
+ campos: IrCampo[];
250
+ linhas: string[];
251
+ tasksReferenciadas: string[];
252
+ etapasEstruturadas: EtapaFlowSemantica[];
253
+ effects: string[];
254
+ efeitosEstruturados: EfeitoSemantico[];
255
+ vinculos: IrVinculo[];
256
+ perfilCompatibilidade: PerfilCompatibilidade;
257
+ resumoAgente: IrResumoAgente;
258
+ }
259
+
260
+ export interface IrRoute {
261
+ nome: string;
262
+ campos: IrCampo[];
263
+ linhas: string[];
264
+ metodo?: string;
265
+ caminho?: string;
266
+ task?: string;
267
+ inputPublico: IrCampo[];
268
+ outputPublico: IrCampo[];
269
+ errosPublicos: ContratoErroRouteSemantico[];
270
+ efeitosPublicos: EfeitoSemantico[];
271
+ vinculos: IrVinculo[];
272
+ auth: IrAuth;
273
+ authz: IrAuthz;
274
+ dados: IrDados;
275
+ audit: IrAudit;
276
+ segredos: IrSegredos;
277
+ forbidden: IrForbidden;
278
+ perfilCompatibilidade: PerfilCompatibilidade;
279
+ garantiasPublicasMinimas: string[];
280
+ resumoAgente: IrResumoAgente;
281
+ publico: IrRoutePublica;
282
+ }
283
+
284
+ export interface IrSuperficie {
285
+ tipo: TipoSuperficieIr;
286
+ nome: string;
287
+ campos: IrCampo[];
288
+ linhas: string[];
289
+ task?: string;
290
+ input: IrCampo[];
291
+ output: IrCampo[];
292
+ effects: EfeitoSemantico[];
293
+ implementacoesExternas: IrImplementacaoTask[];
294
+ vinculos: IrVinculo[];
295
+ execucao: IrExecucao;
296
+ auth: IrAuth;
297
+ authz: IrAuthz;
298
+ dados: IrDados;
299
+ audit: IrAudit;
300
+ segredos: IrSegredos;
301
+ forbidden: IrForbidden;
302
+ perfilCompatibilidade: PerfilCompatibilidade;
303
+ resumoAgente: IrResumoAgente;
304
+ }
305
+
306
+ export interface IrState {
307
+ nome?: string;
308
+ campos: IrCampo[];
309
+ linhas: string[];
310
+ invariantes: ExpressaoSemantica[];
311
+ transicoes: TransicaoEstadoSemantica[];
312
+ }
313
+
314
+ export interface IrModulo {
315
+ nome: string;
316
+ uses: string[];
317
+ imports: IrUse[];
318
+ interoperabilidades: IrInteropExterno[];
319
+ vinculos: IrVinculo[];
320
+ perfilCompatibilidade: PerfilCompatibilidade;
321
+ types: IrType[];
322
+ entities: IrEntity[];
323
+ enums: IrEnum[];
324
+ tasks: IrTask[];
325
+ flows: IrFlow[];
326
+ routes: IrRoute[];
327
+ superficies: IrSuperficie[];
328
+ states: IrState[];
329
+ resumoAgente: IrResumoAgente;
330
+ diagnosticos: Diagnostico[];
331
+ }
@@ -0,0 +1,166 @@
1
+ import { criarDiagnostico, type Diagnostico, type PosicaoFonte } from "../diagnosticos/index.js";
2
+ import { PALAVRAS_CHAVE, type Token, type TipoToken } from "./tokens.js";
3
+
4
+ export interface ResultadoLexer {
5
+ tokens: Token[];
6
+ diagnosticos: Diagnostico[];
7
+ }
8
+
9
+ function avancar(posicao: PosicaoFonte, caractere: string): PosicaoFonte {
10
+ if (caractere === "\n") {
11
+ return { indice: posicao.indice + 1, linha: posicao.linha + 1, coluna: 1 };
12
+ }
13
+ return { indice: posicao.indice + 1, linha: posicao.linha, coluna: posicao.coluna + 1 };
14
+ }
15
+
16
+ function criarToken(tipo: TipoToken, valor: string, inicio: PosicaoFonte, fim: PosicaoFonte, arquivo?: string): Token {
17
+ return {
18
+ tipo,
19
+ valor,
20
+ intervalo: { inicio, fim, arquivo },
21
+ };
22
+ }
23
+
24
+ export function tokenizar(codigo: string, arquivo?: string): ResultadoLexer {
25
+ const tokens: Token[] = [];
26
+ const diagnosticos: Diagnostico[] = [];
27
+ let posicao: PosicaoFonte = { indice: 0, linha: 1, coluna: 1 };
28
+
29
+ while (posicao.indice < codigo.length) {
30
+ const inicio = { ...posicao };
31
+ const atual = codigo[posicao.indice]!;
32
+
33
+ if (atual === " " || atual === "\t" || atual === "\r") {
34
+ posicao = avancar(posicao, atual);
35
+ continue;
36
+ }
37
+
38
+ if (atual === "\n") {
39
+ posicao = avancar(posicao, atual);
40
+ tokens.push(criarToken("nova_linha", "\n", inicio, { ...posicao }, arquivo));
41
+ continue;
42
+ }
43
+
44
+ if (atual === "/" && codigo[posicao.indice + 1] === "/") {
45
+ let texto = "";
46
+ let cursor = { ...posicao };
47
+ while (cursor.indice < codigo.length && codigo[cursor.indice] !== "\n") {
48
+ texto += codigo[cursor.indice];
49
+ cursor = avancar(cursor, codigo[cursor.indice]!);
50
+ }
51
+ tokens.push(criarToken("comentario", texto, inicio, cursor, arquivo));
52
+ posicao = cursor;
53
+ continue;
54
+ }
55
+
56
+ if (atual === "\"") {
57
+ let texto = "";
58
+ let cursor = avancar(posicao, atual);
59
+ let fechado = false;
60
+ while (cursor.indice < codigo.length) {
61
+ const caractere = codigo[cursor.indice]!;
62
+ if (caractere === "\\") {
63
+ const proximo = codigo[cursor.indice + 1];
64
+ if (proximo) {
65
+ texto += caractere + proximo;
66
+ cursor = avancar(avancar(cursor, caractere), proximo);
67
+ continue;
68
+ }
69
+ }
70
+ if (caractere === "\"") {
71
+ fechado = true;
72
+ cursor = avancar(cursor, caractere);
73
+ break;
74
+ }
75
+ texto += caractere;
76
+ cursor = avancar(cursor, caractere);
77
+ }
78
+ if (!fechado) {
79
+ diagnosticos.push(
80
+ criarDiagnostico(
81
+ "LEX001",
82
+ "Texto nao foi fechado com aspas.",
83
+ "erro",
84
+ { inicio, fim: cursor, arquivo },
85
+ "Feche a string com aspas duplas.",
86
+ ),
87
+ );
88
+ posicao = cursor;
89
+ continue;
90
+ }
91
+ tokens.push(criarToken("texto", texto, inicio, cursor, arquivo));
92
+ posicao = cursor;
93
+ continue;
94
+ }
95
+
96
+ if (/[0-9]/.test(atual)) {
97
+ let texto = "";
98
+ let cursor = { ...posicao };
99
+ while (cursor.indice < codigo.length && /[0-9.]/.test(codigo[cursor.indice]!)) {
100
+ texto += codigo[cursor.indice];
101
+ cursor = avancar(cursor, codigo[cursor.indice]!);
102
+ }
103
+ tokens.push(criarToken("numero", texto, inicio, cursor, arquivo));
104
+ posicao = cursor;
105
+ continue;
106
+ }
107
+
108
+ if (/[A-Za-z_]/.test(atual)) {
109
+ let texto = "";
110
+ let cursor = { ...posicao };
111
+ while (cursor.indice < codigo.length && /[A-Za-z0-9_.-]/.test(codigo[cursor.indice]!)) {
112
+ texto += codigo[cursor.indice];
113
+ cursor = avancar(cursor, codigo[cursor.indice]!);
114
+ }
115
+ const tipo: TipoToken = PALAVRAS_CHAVE.has(texto) ? "palavra_chave" : "identificador";
116
+ tokens.push(criarToken(tipo, texto, inicio, cursor, arquivo));
117
+ posicao = cursor;
118
+ continue;
119
+ }
120
+
121
+ const doisCaracteres = codigo.slice(posicao.indice, posicao.indice + 2);
122
+ if (["==", "!=", ">=", "<=", "->"].includes(doisCaracteres)) {
123
+ const cursor = avancar(avancar(posicao, doisCaracteres[0]!), doisCaracteres[1]!);
124
+ tokens.push(criarToken("operador", doisCaracteres, inicio, cursor, arquivo));
125
+ posicao = cursor;
126
+ continue;
127
+ }
128
+
129
+ if ("{}[]():,.".includes(atual)) {
130
+ const cursor = avancar(posicao, atual);
131
+ tokens.push(criarToken("pontuacao", atual, inicio, cursor, arquivo));
132
+ posicao = cursor;
133
+ continue;
134
+ }
135
+
136
+ if ("=><+-*/|?".includes(atual)) {
137
+ const cursor = avancar(posicao, atual);
138
+ tokens.push(criarToken("operador", atual, inicio, cursor, arquivo));
139
+ posicao = cursor;
140
+ continue;
141
+ }
142
+
143
+ diagnosticos.push(
144
+ criarDiagnostico(
145
+ "LEX002",
146
+ `Caractere inesperado encontrado: "${atual}".`,
147
+ "erro",
148
+ { inicio, fim: avancar(posicao, atual), arquivo },
149
+ "Remova o caractere ou adicione suporte no lexer.",
150
+ ),
151
+ );
152
+ posicao = avancar(posicao, atual);
153
+ }
154
+
155
+ tokens.push(
156
+ criarToken(
157
+ "fim_arquivo",
158
+ "",
159
+ { ...posicao },
160
+ { ...posicao },
161
+ arquivo,
162
+ ),
163
+ );
164
+
165
+ return { tokens, diagnosticos };
166
+ }
@@ -0,0 +1,64 @@
1
+ import type { IntervaloFonte } from "../diagnosticos/index.js";
2
+
3
+ export type TipoToken =
4
+ | "palavra_chave"
5
+ | "identificador"
6
+ | "texto"
7
+ | "numero"
8
+ | "pontuacao"
9
+ | "operador"
10
+ | "nova_linha"
11
+ | "comentario"
12
+ | "fim_arquivo";
13
+
14
+ export interface Token {
15
+ tipo: TipoToken;
16
+ valor: string;
17
+ intervalo: IntervaloFonte;
18
+ }
19
+
20
+ export const PALAVRAS_CHAVE = new Set([
21
+ "module",
22
+ "use",
23
+ "type",
24
+ "entity",
25
+ "enum",
26
+ "task",
27
+ "worker",
28
+ "evento",
29
+ "fila",
30
+ "cron",
31
+ "webhook",
32
+ "cache",
33
+ "storage",
34
+ "policy",
35
+ "input",
36
+ "output",
37
+ "rules",
38
+ "effects",
39
+ "impl",
40
+ "vinculos",
41
+ "execucao",
42
+ "auth",
43
+ "authz",
44
+ "dados",
45
+ "audit",
46
+ "segredos",
47
+ "forbidden",
48
+ "guarantees",
49
+ "state",
50
+ "flow",
51
+ "route",
52
+ "tests",
53
+ "error",
54
+ "docs",
55
+ "comments",
56
+ "fields",
57
+ "invariants",
58
+ "transitions",
59
+ "given",
60
+ "when",
61
+ "expect",
62
+ "caso",
63
+ "required",
64
+ ]);
@@ -0,0 +1,39 @@
1
+ arquivo = modulo ;
2
+ modulo = "module" identificador "{" declaracao_modulo* "}" ;
3
+ declaracao_modulo = use | docs | comments | vinculos | type | entity | enum | task | flow | route | worker | evento | fila | cron | webhook | cache | storage | policy | state | tests ;
4
+ use = "use" identificador ;
5
+ type = "type" identificador bloco_generico ;
6
+ entity = "entity" identificador bloco_generico ;
7
+ enum = "enum" identificador "{" identificador ("," identificador)* "}" ;
8
+ task = "task" identificador bloco_generico ;
9
+ flow = "flow" identificador bloco_generico ;
10
+ route = "route" identificador bloco_generico ;
11
+ worker = "worker" identificador bloco_generico ;
12
+ evento = "evento" identificador bloco_generico ;
13
+ fila = "fila" identificador bloco_generico ;
14
+ cron = "cron" identificador bloco_generico ;
15
+ webhook = "webhook" identificador bloco_generico ;
16
+ cache = "cache" identificador bloco_generico ;
17
+ storage = "storage" identificador bloco_generico ;
18
+ policy = "policy" identificador bloco_generico ;
19
+ state = "state" bloco_generico ;
20
+ tests = "tests" "{" caso* "}" ;
21
+ caso = "caso" texto "{" given? when? expect? error? docs? comments? "}" ;
22
+ given = "given" bloco_generico ;
23
+ when = "when" bloco_generico ;
24
+ expect = "expect" bloco_generico ;
25
+ error = "error" bloco_generico ;
26
+ vinculos = "vinculos" bloco_generico ;
27
+ docs = "docs" bloco_generico ;
28
+ comments = "comments" bloco_generico ;
29
+ bloco_generico = "{" item_bloco* "}" ;
30
+ item_bloco = campo | linha | bloco_generico_nomeado ;
31
+ bloco_generico_nomeado = palavra_chave "{" item_bloco* "}" ;
32
+ campo = identificador ":" valor valor_modificador* ;
33
+ linha = valor+ ;
34
+ valor = identificador | numero | texto ;
35
+ valor_modificador = identificador ;
36
+ identificador = ? token de identificador ? ;
37
+ numero = ? token numerico ? ;
38
+ texto = ? token textual ? ;
39
+ palavra_chave = "input" | "output" | "rules" | "effects" | "impl" | "vinculos" | "execucao" | "auth" | "authz" | "dados" | "audit" | "segredos" | "forbidden" | "guarantees" | "state" | "fields" | "tests" | "error" | "docs" | "comments" | "given" | "when" | "expect" ;