@semacode/cli 1.5.2 → 1.5.4

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/README.md CHANGED
@@ -58,7 +58,9 @@ sema drift ./contratos-importados --json
58
58
 
59
59
  ## Persistencia vendor-first
60
60
 
61
- A CLI 1.5.2 entende blocos `database` e recursos de persistencia no IR, no formatador, no semantico, na importacao, no drift, no impact map, na renomeacao semantica assistida e no `verificar`. O objetivo nao e esconder diferencas entre bancos, e sim capturar essas diferencas no contrato.
61
+ A CLI 1.5.4 entende blocos `database` e recursos de persistencia no IR, no formatador, no semantico, na importacao, no drift, no impact map, na renomeacao semantica assistida e no `verificar`. O objetivo nao e esconder diferencas entre bancos, e sim capturar essas diferencas no contrato.
62
+
63
+ Nesta linha, o `drift` tambem passa a resolver melhor metodos JS/TS browser-side definidos via `Object.assign(...prototype...)` e a entrada padrao da CLI para de tropeçar em `exemplos/` quando o projeto real ja tem `contratos/`, `sema/` ou arquivos `.sema` na raiz.
62
64
 
63
65
  Cobertura publica:
64
66
 
package/dist/drift.js CHANGED
@@ -202,6 +202,7 @@ function resolverRaizesExplicitasConfiguradas(contexto) {
202
202
  }
203
203
  function resolverRaizesIgnoradasPermitidas(contexto, segmentosIgnorados) {
204
204
  return [...new Set([
205
+ path.resolve(contexto.baseProjeto),
205
206
  resolverRaizEscopoReal(contexto),
206
207
  ...resolverRaizesExplicitasConfiguradas(contexto),
207
208
  ])]
@@ -1054,6 +1055,81 @@ function registrarSimboloTypeScript(simbolos, basesSimbolicas, arquivo, nome, no
1054
1055
  });
1055
1056
  }
1056
1057
  }
1058
+ function desembrulharExpressaoTypeScript(expr) {
1059
+ let atual = expr;
1060
+ while (true) {
1061
+ if (ts.isParenthesizedExpression(atual) || ts.isAsExpression(atual) || ts.isSatisfiesExpression(atual) || ts.isTypeAssertionExpression(atual)) {
1062
+ atual = atual.expression;
1063
+ continue;
1064
+ }
1065
+ if (ts.isAwaitExpression(atual)) {
1066
+ atual = atual.expression;
1067
+ continue;
1068
+ }
1069
+ return atual;
1070
+ }
1071
+ }
1072
+ function extrairNomePropriedadeTypeScript(nome, sourceFile) {
1073
+ if (ts.isIdentifier(nome) || ts.isStringLiteralLike(nome) || ts.isNumericLiteral(nome)) {
1074
+ return nome.text;
1075
+ }
1076
+ if (ts.isComputedPropertyName(nome) && ts.isStringLiteralLike(nome.expression)) {
1077
+ return nome.expression.text;
1078
+ }
1079
+ const texto = nome.getText(sourceFile).trim();
1080
+ return texto.length > 0 ? texto : undefined;
1081
+ }
1082
+ function extrairNomeClassePrototypeTypeScript(expr, sourceFile) {
1083
+ const alvo = desembrulharExpressaoTypeScript(expr);
1084
+ if (ts.isPropertyAccessExpression(alvo) && alvo.name.text === "prototype") {
1085
+ return alvo.expression.getText(sourceFile).trim() || undefined;
1086
+ }
1087
+ return undefined;
1088
+ }
1089
+ function registrarMetodoTypeScriptProtoOuObjeto(simbolos, basesSimbolicas, arquivo, nomeMetodo, nomeClasse) {
1090
+ if (!nomeMetodo) {
1091
+ return;
1092
+ }
1093
+ if (nomeClasse) {
1094
+ registrarSimboloTypeScript(simbolos, basesSimbolicas, arquivo, nomeMetodo, nomeClasse);
1095
+ }
1096
+ registrarSimboloTypeScript(simbolos, basesSimbolicas, arquivo, nomeMetodo);
1097
+ }
1098
+ function registrarMetodosObjectAssignTypeScript(simbolos, basesSimbolicas, arquivo, objeto, sourceFile, nomeClasse) {
1099
+ for (const propriedade of objeto.properties) {
1100
+ if (ts.isMethodDeclaration(propriedade) && propriedade.name) {
1101
+ const nomeMetodo = extrairNomePropriedadeTypeScript(propriedade.name, sourceFile);
1102
+ if (nomeMetodo) {
1103
+ registrarMetodoTypeScriptProtoOuObjeto(simbolos, basesSimbolicas, arquivo, nomeMetodo, nomeClasse);
1104
+ }
1105
+ continue;
1106
+ }
1107
+ if (!ts.isPropertyAssignment(propriedade)) {
1108
+ continue;
1109
+ }
1110
+ const nomeMetodo = extrairNomePropriedadeTypeScript(propriedade.name, sourceFile);
1111
+ const valor = desembrulharExpressaoTypeScript(propriedade.initializer);
1112
+ if (nomeMetodo && (ts.isFunctionExpression(valor) || ts.isArrowFunction(valor))) {
1113
+ registrarMetodoTypeScriptProtoOuObjeto(simbolos, basesSimbolicas, arquivo, nomeMetodo, nomeClasse);
1114
+ }
1115
+ }
1116
+ }
1117
+ function registrarAtribuicaoPrototypeTypeScript(simbolos, basesSimbolicas, arquivo, sourceFile, esquerda, direita) {
1118
+ const alvo = desembrulharExpressaoTypeScript(esquerda);
1119
+ const valor = desembrulharExpressaoTypeScript(direita);
1120
+ if (!ts.isPropertyAccessExpression(alvo) || !ts.isPropertyAccessExpression(alvo.expression)) {
1121
+ return;
1122
+ }
1123
+ if (alvo.expression.name.text !== "prototype") {
1124
+ return;
1125
+ }
1126
+ if (!ts.isFunctionExpression(valor) && !ts.isArrowFunction(valor)) {
1127
+ return;
1128
+ }
1129
+ const nomeClasse = alvo.expression.expression.getText(sourceFile).trim();
1130
+ const nomeMetodo = alvo.name.getText(sourceFile).trim();
1131
+ registrarMetodoTypeScriptProtoOuObjeto(simbolos, basesSimbolicas, arquivo, nomeMetodo, nomeClasse || undefined);
1132
+ }
1057
1133
  function normalizarRelacaoConsumer(relacaoArquivo) {
1058
1134
  return relacaoArquivo.replace(/\\/g, "/");
1059
1135
  }
@@ -1541,6 +1617,27 @@ async function indexarTypeScript(diretorios) {
1541
1617
  }
1542
1618
  }
1543
1619
  if (!ts.isClassDeclaration(node) || !node.name) {
1620
+ if (ts.isExpressionStatement(node)) {
1621
+ const expr = desembrulharExpressaoTypeScript(node.expression);
1622
+ if (ts.isCallExpression(expr)
1623
+ && ts.isPropertyAccessExpression(expr.expression)
1624
+ && ts.isIdentifier(expr.expression.expression)
1625
+ && expr.expression.expression.text === "Object"
1626
+ && expr.expression.name.text === "assign") {
1627
+ const nomeClasse = expr.arguments[0]
1628
+ ? extrairNomeClassePrototypeTypeScript(expr.arguments[0], sourceFile)
1629
+ : undefined;
1630
+ for (const argumento of expr.arguments.slice(1)) {
1631
+ const valor = desembrulharExpressaoTypeScript(argumento);
1632
+ if (ts.isObjectLiteralExpression(valor)) {
1633
+ registrarMetodosObjectAssignTypeScript(simbolos, basesSimbolicas, arquivo, valor, sourceFile, nomeClasse);
1634
+ }
1635
+ }
1636
+ }
1637
+ else if (ts.isBinaryExpression(expr) && expr.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
1638
+ registrarAtribuicaoPrototypeTypeScript(simbolos, basesSimbolicas, arquivo, sourceFile, expr.left, expr.right);
1639
+ }
1640
+ }
1544
1641
  continue;
1545
1642
  }
1546
1643
  const controllerDecorator = lerDecorator(node, ["Controller"]);