@intelex-ia/sdk 0.3.0 → 0.5.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.
- package/dist/react.d.ts +43 -3
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +132 -23
- package/dist/react.js.map +1 -1
- package/package.json +63 -63
- package/dist/autoria.test.d.ts +0 -2
- package/dist/autoria.test.d.ts.map +0 -1
- package/dist/autoria.test.js +0 -85
- package/dist/autoria.test.js.map +0 -1
- package/dist/merge.test.d.ts +0 -2
- package/dist/merge.test.d.ts.map +0 -1
- package/dist/merge.test.js +0 -224
- package/dist/merge.test.js.map +0 -1
package/dist/react.d.ts
CHANGED
|
@@ -108,8 +108,14 @@ export interface AutoriaDoArtigo {
|
|
|
108
108
|
*
|
|
109
109
|
* ⚠️ `author` SÓ vale quando é `Organization`. Texto produzido com apoio de IA
|
|
110
110
|
* e assinado por uma PESSOA é o que os Termos do Google proíbem desde
|
|
111
|
-
* 30/07/2026
|
|
112
|
-
*
|
|
111
|
+
* 30/07/2026. Mas a Person NÃO é descartada: ela é o profissional cadastrado,
|
|
112
|
+
* e entra como REVISORA — com cargo e registro. Descartá-la era jogar fora o
|
|
113
|
+
* cadastro do cliente e assinar "equipe" ao lado de um corpo que dizia
|
|
114
|
+
* "Revisado por Dra. Ana Souza, CRC-SP 123456" (medido no siteIA, 21/10/2026).
|
|
115
|
+
*
|
|
116
|
+
* 🚨 O schema vem em `article.intelligence.schemaJson`, e NÃO na raiz. Lendo só
|
|
117
|
+
* a raiz, esta função nunca achava cadastro nenhum e caía na equipe em TODO
|
|
118
|
+
* site — o defeito era silencioso porque a queda é um texto válido.
|
|
113
119
|
*
|
|
114
120
|
* NUNCA devolve vazio: sem autoria no schema, assina a equipe da empresa
|
|
115
121
|
* (`empresa`, ou o `publisher.name` do próprio schema). Artigo no ar sem dizer
|
|
@@ -118,17 +124,26 @@ export interface AutoriaDoArtigo {
|
|
|
118
124
|
*/
|
|
119
125
|
export declare function autoriaDoArtigo(article: {
|
|
120
126
|
schemaJson?: unknown | null;
|
|
127
|
+
intelligence?: {
|
|
128
|
+
schemaJson?: unknown | null;
|
|
129
|
+
} | null;
|
|
121
130
|
}, opts?: {
|
|
122
131
|
empresa?: string;
|
|
123
132
|
}): AutoriaDoArtigo;
|
|
124
133
|
export interface AuthorBarProps {
|
|
125
134
|
article: {
|
|
126
135
|
schemaJson?: unknown | null;
|
|
136
|
+
publishedAt?: string | null;
|
|
137
|
+
words?: number | null;
|
|
127
138
|
};
|
|
128
139
|
/** Nome do negócio, para a queda. Sem ele, usa o `publisher` do schema. */
|
|
129
140
|
empresa?: string;
|
|
130
141
|
/** Classe do contêiner. O estilo é do SITE — o SDK não traz CSS. */
|
|
131
142
|
className?: string;
|
|
143
|
+
/** Uma linha sobre a equipe, na assinatura. Omitida quando ausente. */
|
|
144
|
+
bioEquipe?: string;
|
|
145
|
+
/** Uma linha sobre o revisor, na assinatura. Omitida quando ausente. */
|
|
146
|
+
bioRevisor?: string;
|
|
132
147
|
}
|
|
133
148
|
/**
|
|
134
149
|
* Barra de autoria, logo abaixo do `<h1>`.
|
|
@@ -145,5 +160,30 @@ export declare function AuthorBar({ article, empresa, className, }: AuthorBarPro
|
|
|
145
160
|
* Assinatura, no FIM do artigo. É aqui que o selo de IA fecha a linha do
|
|
146
161
|
* revisor — e aparece tanto com profissional cadastrado quanto sem.
|
|
147
162
|
*/
|
|
148
|
-
export declare function AuthorSignature({ article, empresa, className, }: AuthorBarProps): ReactElement;
|
|
163
|
+
export declare function AuthorSignature({ article, empresa, className, bioEquipe, bioRevisor, }: AuthorBarProps): ReactElement;
|
|
164
|
+
/**
|
|
165
|
+
* O corpo do artigo SEM a assinatura que o motor embute.
|
|
166
|
+
*
|
|
167
|
+
* O `contentHtml` traz um `<div class="authority-signature">` com nome,
|
|
168
|
+
* cargo e registro de um PROFISSIONAL. Quando o site também renderiza
|
|
169
|
+
* `<AuthorSignature>`, o artigo sai com DUAS assinaturas que se contradizem —
|
|
170
|
+
* medido no siteIA em 21/10/2026: o corpo assinava "Dra. Ana Souza, CRC-SP
|
|
171
|
+
* 123456" e o rodapé, "Equipe Editorial".
|
|
172
|
+
*
|
|
173
|
+
* Pior que a duplicata: a do corpo assina com uma PESSOA, que é justamente a
|
|
174
|
+
* atribuição que `autoriaDoArtigo` recusa (Termos do Google, 30/07/2026). A
|
|
175
|
+
* regra não alcançava ali porque aquele bloco é HTML cru, não schema.
|
|
176
|
+
*
|
|
177
|
+
* Por que remover AQUI e não no servidor: tirar do `contentHtml` mudaria o
|
|
178
|
+
* corpo para TODO consumidor, inclusive sites que não renderizam assinatura
|
|
179
|
+
* própria e ficariam sem nenhuma. Removendo no render, quem usa
|
|
180
|
+
* `<AuthorSignature>` fica consistente e quem não usa continua como estava.
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* <div dangerouslySetInnerHTML={{ __html: corpoDoArtigo(article) }} />
|
|
184
|
+
* <AuthorSignature article={article} empresa="Acme" />
|
|
185
|
+
*/
|
|
186
|
+
export declare function corpoDoArtigo(article: {
|
|
187
|
+
contentHtml?: string | null;
|
|
188
|
+
}): string;
|
|
149
189
|
//# sourceMappingURL=react.d.ts.map
|
package/dist/react.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAW,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzD,iEAAiE;AACjE,UAAU,kBAAkB;IAC1B,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,OAAO,GACR,EAAE;IACD,OAAO,EAAE,kBAAkB,CAAC;CAC7B,GAAG,YAAY,GAAG,IAAI,CAYtB;AAED,mEAAmE;AACnE,UAAU,oBAAoB;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,cAAc,CAAC,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;CACzC;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE;QACV,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAC5B,CAAC;IACF,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,qBAAqB,CAAC;QAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,oBAAoB,GAC5B,eAAe,CAiCjB;AAGD,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAMzD;;;GAGG;AACH,eAAO,MAAM,OAAO,2CAAiC,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+DAA+D;IAC/D,WAAW,EAAE,OAAO,CAAC;CACtB;AAQD
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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"}
|
package/dist/react.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* Renderiza um `<script type="application/ld+json">` com o schema JSON-LD do
|
|
4
4
|
* artigo. Pode ser colocado em qualquer lugar do `<body>` — o Google lê tanto
|
|
@@ -96,8 +96,14 @@ const texto = (v) => typeof v === "string" && v.trim() ? v.trim() : null;
|
|
|
96
96
|
*
|
|
97
97
|
* ⚠️ `author` SÓ vale quando é `Organization`. Texto produzido com apoio de IA
|
|
98
98
|
* e assinado por uma PESSOA é o que os Termos do Google proíbem desde
|
|
99
|
-
* 30/07/2026
|
|
100
|
-
*
|
|
99
|
+
* 30/07/2026. Mas a Person NÃO é descartada: ela é o profissional cadastrado,
|
|
100
|
+
* e entra como REVISORA — com cargo e registro. Descartá-la era jogar fora o
|
|
101
|
+
* cadastro do cliente e assinar "equipe" ao lado de um corpo que dizia
|
|
102
|
+
* "Revisado por Dra. Ana Souza, CRC-SP 123456" (medido no siteIA, 21/10/2026).
|
|
103
|
+
*
|
|
104
|
+
* 🚨 O schema vem em `article.intelligence.schemaJson`, e NÃO na raiz. Lendo só
|
|
105
|
+
* a raiz, esta função nunca achava cadastro nenhum e caía na equipe em TODO
|
|
106
|
+
* site — o defeito era silencioso porque a queda é um texto válido.
|
|
101
107
|
*
|
|
102
108
|
* NUNCA devolve vazio: sem autoria no schema, assina a equipe da empresa
|
|
103
109
|
* (`empresa`, ou o `publisher.name` do próprio schema). Artigo no ar sem dizer
|
|
@@ -105,7 +111,7 @@ const texto = (v) => typeof v === "string" && v.trim() ? v.trim() : null;
|
|
|
105
111
|
* que esta função existe para impedir.
|
|
106
112
|
*/
|
|
107
113
|
export function autoriaDoArtigo(article, opts) {
|
|
108
|
-
const schema = article.schemaJson;
|
|
114
|
+
const schema = article.intelligence?.schemaJson ?? article.schemaJson;
|
|
109
115
|
const nos = [];
|
|
110
116
|
if (ehNo(schema)) {
|
|
111
117
|
const grafo = schema["@graph"];
|
|
@@ -126,28 +132,53 @@ export function autoriaDoArtigo(article, opts) {
|
|
|
126
132
|
}
|
|
127
133
|
}
|
|
128
134
|
}
|
|
135
|
+
let autorOrg = "";
|
|
136
|
+
let revisor = null;
|
|
137
|
+
let revisadoEm = null;
|
|
129
138
|
for (const no of nos) {
|
|
139
|
+
if (!revisadoEm)
|
|
140
|
+
revisadoEm = texto(no.dateModified) || null;
|
|
141
|
+
// Organization em `author` é o único autor aceito.
|
|
130
142
|
const a = no.author;
|
|
131
|
-
if (!ehNo(a)
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
+
if (!autorOrg && ehNo(a) && a["@type"] === "Organization")
|
|
144
|
+
autorOrg = texto(a.name) ?? "";
|
|
145
|
+
// Pessoa é REVISORA, venha de `contributor` ou de `author`. O motor grava
|
|
146
|
+
// o profissional cadastrado em `author`; recusar a atribuição de AUTORIA
|
|
147
|
+
// não é motivo para perder o nome de quem revisou.
|
|
148
|
+
for (const cand of [no.contributor, a]) {
|
|
149
|
+
if (revisor || !ehNo(cand))
|
|
150
|
+
continue;
|
|
151
|
+
const tipo = cand["@type"];
|
|
152
|
+
if (tipo && tipo !== "Person")
|
|
153
|
+
continue;
|
|
154
|
+
const nome = texto(cand.name);
|
|
155
|
+
if (!nome)
|
|
156
|
+
continue;
|
|
157
|
+
revisor = [nome, texto(cand.jobTitle), credencialDe(cand)].filter(Boolean).join(", ");
|
|
158
|
+
}
|
|
143
159
|
}
|
|
144
160
|
return {
|
|
145
|
-
autor: empresa ? `Equipe Editorial ${empresa}` : "Equipe Editorial",
|
|
146
|
-
revisor
|
|
147
|
-
revisadoEm
|
|
148
|
-
temCadastro:
|
|
161
|
+
autor: autorOrg || (empresa ? `Equipe Editorial ${empresa}` : "Equipe Editorial"),
|
|
162
|
+
revisor,
|
|
163
|
+
revisadoEm,
|
|
164
|
+
temCadastro: Boolean(autorOrg || revisor),
|
|
149
165
|
};
|
|
150
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* Registro profissional do nó: `identifier` direto, ou o `name` de
|
|
169
|
+
* `hasCredential` — que é como o motor grava o CRC/OAB
|
|
170
|
+
* (`hasCredential: { "@type": "EducationalOccupationalCredential", name: "CRC-SP 123456" }`).
|
|
171
|
+
*/
|
|
172
|
+
function credencialDe(no) {
|
|
173
|
+
const direto = texto(no.identifier);
|
|
174
|
+
if (direto)
|
|
175
|
+
return direto;
|
|
176
|
+
const cred = no.hasCredential;
|
|
177
|
+
const primeiro = Array.isArray(cred) ? cred[0] : cred;
|
|
178
|
+
if (ehNo(primeiro))
|
|
179
|
+
return texto(primeiro.name) ?? "";
|
|
180
|
+
return texto(primeiro) ?? "";
|
|
181
|
+
}
|
|
151
182
|
/** Texto da linha de revisão, igual nos dois blocos. */
|
|
152
183
|
function linhaDeRevisao(a, empresa) {
|
|
153
184
|
const quem = a.revisor
|
|
@@ -155,6 +186,19 @@ function linhaDeRevisao(a, empresa) {
|
|
|
155
186
|
: `Revisado pela equipe ${empresa?.trim() || a.autor.replace(/^Equipe Editorial\s*/, "") || "editorial"}`;
|
|
156
187
|
return `${quem} · ${SELO_IA}`;
|
|
157
188
|
}
|
|
189
|
+
/** "21/10/2026" no fuso de quem lê. Vazio quando a data não presta. */
|
|
190
|
+
function dataPtBr(iso) {
|
|
191
|
+
if (!iso)
|
|
192
|
+
return "";
|
|
193
|
+
const d = new Date(iso);
|
|
194
|
+
return Number.isNaN(d.getTime()) ? "" : d.toLocaleDateString("pt-BR");
|
|
195
|
+
}
|
|
196
|
+
/** ~200 palavras por minuto, o mesmo arredondamento do resto do grupo. */
|
|
197
|
+
function tempoDeLeitura(words) {
|
|
198
|
+
return typeof words === "number" && words > 0
|
|
199
|
+
? `${Math.max(1, Math.round(words / 200))} min de leitura`
|
|
200
|
+
: "";
|
|
201
|
+
}
|
|
158
202
|
/**
|
|
159
203
|
* Barra de autoria, logo abaixo do `<h1>`.
|
|
160
204
|
*
|
|
@@ -167,14 +211,79 @@ function linhaDeRevisao(a, empresa) {
|
|
|
167
211
|
*/
|
|
168
212
|
export function AuthorBar({ article, empresa, className = "ia-autor", }) {
|
|
169
213
|
const a = autoriaDoArtigo(article, { empresa });
|
|
170
|
-
|
|
214
|
+
const meta = [dataPtBr(article.publishedAt), tempoDeLeitura(article.words)]
|
|
215
|
+
.filter(Boolean)
|
|
216
|
+
.join(" · ");
|
|
217
|
+
return (_jsxs("div", { className: className, children: [_jsxs("strong", { children: ["por ", a.autor] }), a.revisor ? _jsxs("span", { className: `${className}-revisao`, children: ["Revis\u00E3o: ", a.revisor] }) : null, meta ? _jsx("span", { className: `${className}-meta`, children: meta }) : null] }));
|
|
171
218
|
}
|
|
172
219
|
/**
|
|
173
220
|
* Assinatura, no FIM do artigo. É aqui que o selo de IA fecha a linha do
|
|
174
221
|
* revisor — e aparece tanto com profissional cadastrado quanto sem.
|
|
175
222
|
*/
|
|
176
|
-
export function AuthorSignature({ article, empresa, className = "ia-assinatura", }) {
|
|
223
|
+
export function AuthorSignature({ article, empresa, className = "ia-assinatura", bioEquipe, bioRevisor, }) {
|
|
177
224
|
const a = autoriaDoArtigo(article, { empresa });
|
|
178
|
-
|
|
225
|
+
const nomeRevisor = a.revisor ? a.revisor.split(",")[0].trim() : null;
|
|
226
|
+
// Dois blocos, como a referência do grupo: QUEM ESCREVEU e QUEM REVISOU.
|
|
227
|
+
// O segundo sai mesmo sem profissional cadastrado — é ele que carrega o
|
|
228
|
+
// selo de IA, e o selo é obrigatório.
|
|
229
|
+
return (_jsxs(_Fragment, { children: [_jsxs("section", { className: `${className} ${className}-equipe`, "aria-label": "Quem escreveu", children: [_jsxs("p", { className: `${className}-nome`, children: ["Escrito por ", a.autor] }), bioEquipe ? _jsx("p", { className: `${className}-bio`, children: bioEquipe }) : null] }), _jsxs("section", { className: `${className} ${className}-revisor`, "aria-label": "Quem revisou", children: [nomeRevisor ? _jsx("p", { className: `${className}-nome`, children: nomeRevisor }) : null, _jsx("p", { className: `${className}-cargo`, children: linhaDeRevisao(a, empresa) }), bioRevisor ? _jsx("p", { className: `${className}-bio`, children: bioRevisor }) : null] })] }));
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* O corpo do artigo SEM a assinatura que o motor embute.
|
|
233
|
+
*
|
|
234
|
+
* O `contentHtml` traz um `<div class="authority-signature">` com nome,
|
|
235
|
+
* cargo e registro de um PROFISSIONAL. Quando o site também renderiza
|
|
236
|
+
* `<AuthorSignature>`, o artigo sai com DUAS assinaturas que se contradizem —
|
|
237
|
+
* medido no siteIA em 21/10/2026: o corpo assinava "Dra. Ana Souza, CRC-SP
|
|
238
|
+
* 123456" e o rodapé, "Equipe Editorial".
|
|
239
|
+
*
|
|
240
|
+
* Pior que a duplicata: a do corpo assina com uma PESSOA, que é justamente a
|
|
241
|
+
* atribuição que `autoriaDoArtigo` recusa (Termos do Google, 30/07/2026). A
|
|
242
|
+
* regra não alcançava ali porque aquele bloco é HTML cru, não schema.
|
|
243
|
+
*
|
|
244
|
+
* Por que remover AQUI e não no servidor: tirar do `contentHtml` mudaria o
|
|
245
|
+
* corpo para TODO consumidor, inclusive sites que não renderizam assinatura
|
|
246
|
+
* própria e ficariam sem nenhuma. Removendo no render, quem usa
|
|
247
|
+
* `<AuthorSignature>` fica consistente e quem não usa continua como estava.
|
|
248
|
+
*
|
|
249
|
+
* @example
|
|
250
|
+
* <div dangerouslySetInnerHTML={{ __html: corpoDoArtigo(article) }} />
|
|
251
|
+
* <AuthorSignature article={article} empresa="Acme" />
|
|
252
|
+
*/
|
|
253
|
+
export function corpoDoArtigo(article) {
|
|
254
|
+
const bruto = article.contentHtml ?? "";
|
|
255
|
+
if (!bruto)
|
|
256
|
+
return "";
|
|
257
|
+
// 🚨 O motor tem DUAS formas de assinar no corpo, e a segunda escapava.
|
|
258
|
+
//
|
|
259
|
+
// Além do `<div class="authority-signature">`, ele emite
|
|
260
|
+
// `<p class='itx-eeat-signature'>` — parágrafo simples, aspas SIMPLES, sem
|
|
261
|
+
// div nenhuma. Medido no siteIA em 21/10/2026, com o artigo no ar: o corpo
|
|
262
|
+
// dizia "Revisado por Dra. Ana Souza, CRC-SP 123456…" e o rodapé, "Revisado
|
|
263
|
+
// pela equipe siteIA". Duas assinaturas, com dados diferentes.
|
|
264
|
+
//
|
|
265
|
+
// `<p>` não aninha, então o fechamento é o primeiro `</p>`.
|
|
266
|
+
const html = bruto.replace(/<p[^>]*class=["'][^"']*itx-eeat-signature[^"']*["'][^>]*>[\s\S]*?<\/p>/gi, "").trim();
|
|
267
|
+
if (!html)
|
|
268
|
+
return "";
|
|
269
|
+
// `<div class="authority-signature" …>` até o `</div>` que o fecha, contando
|
|
270
|
+
// os aninhados — o bloco tem divs dentro (avatar, textos).
|
|
271
|
+
const abre = /<div[^>]*class="[^"]*authority-signature[^"]*"[^>]*>/i;
|
|
272
|
+
const m = abre.exec(html);
|
|
273
|
+
if (!m)
|
|
274
|
+
return html;
|
|
275
|
+
let i = m.index + m[0].length;
|
|
276
|
+
let nivel = 1;
|
|
277
|
+
const tag = /<\/?div\b[^>]*>/gi;
|
|
278
|
+
tag.lastIndex = i;
|
|
279
|
+
let t;
|
|
280
|
+
while ((t = tag.exec(html)) !== null) {
|
|
281
|
+
nivel += t[0].startsWith("</") ? -1 : 1;
|
|
282
|
+
if (nivel === 0)
|
|
283
|
+
return (html.slice(0, m.index) + html.slice(t.index + t[0].length)).trim();
|
|
284
|
+
}
|
|
285
|
+
// Sem fechamento equilibrado, corta do bloco em diante: deixar pela metade
|
|
286
|
+
// seria pior que remover.
|
|
287
|
+
return html.slice(0, m.index).trim();
|
|
179
288
|
}
|
|
180
289
|
//# sourceMappingURL=react.js.map
|
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@intelex-ia/sdk",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "SDK pra consumir a Content API da IntelexIA em sites headless (Next.js, Astro, etc.). Multiplataforma Fase 2b.",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"author": "intelex-ia",
|
|
7
|
-
"homepage": "https://github.com/intelex-ia/combo_automatico/tree/main/packages/sdk",
|
|
8
|
-
"repository": {
|
|
9
|
-
"type": "git",
|
|
10
|
-
"url": "git+https://github.com/intelex-ia/combo_automatico.git",
|
|
11
|
-
"directory": "packages/sdk"
|
|
12
|
-
},
|
|
13
|
-
"bugs": {
|
|
14
|
-
"url": "https://github.com/intelex-ia/combo_automatico/issues"
|
|
15
|
-
},
|
|
16
|
-
"keywords": [
|
|
17
|
-
"intelexia",
|
|
18
|
-
"content-api",
|
|
19
|
-
"headless",
|
|
20
|
-
"cms",
|
|
21
|
-
"next",
|
|
22
|
-
"nextjs",
|
|
23
|
-
"react",
|
|
24
|
-
"sdk"
|
|
25
|
-
],
|
|
26
|
-
"type": "module",
|
|
27
|
-
"main": "./dist/index.js",
|
|
28
|
-
"module": "./dist/index.js",
|
|
29
|
-
"types": "./dist/index.d.ts",
|
|
30
|
-
"exports": {
|
|
31
|
-
".": {
|
|
32
|
-
"types": "./dist/index.d.ts",
|
|
33
|
-
"default": "./dist/index.js"
|
|
34
|
-
},
|
|
35
|
-
"./react": {
|
|
36
|
-
"types": "./dist/react.d.ts",
|
|
37
|
-
"default": "./dist/react.js"
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
"files": [
|
|
41
|
-
"dist",
|
|
42
|
-
"README.md"
|
|
43
|
-
],
|
|
44
|
-
"scripts": {
|
|
45
|
-
"build": "tsc",
|
|
46
|
-
"typecheck": "tsc --noEmit"
|
|
47
|
-
},
|
|
48
|
-
"peerDependencies": {
|
|
49
|
-
"react": ">=18"
|
|
50
|
-
},
|
|
51
|
-
"peerDependenciesMeta": {
|
|
52
|
-
"react": {
|
|
53
|
-
"optional": true
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
"devDependencies": {
|
|
57
|
-
"@types/react": "^18.3.12",
|
|
58
|
-
"typescript": "^5.6.3"
|
|
59
|
-
},
|
|
60
|
-
"publishConfig": {
|
|
61
|
-
"access": "public",
|
|
62
|
-
"provenance": true
|
|
63
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@intelex-ia/sdk",
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "SDK pra consumir a Content API da IntelexIA em sites headless (Next.js, Astro, etc.). Multiplataforma Fase 2b.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "intelex-ia",
|
|
7
|
+
"homepage": "https://github.com/intelex-ia/combo_automatico/tree/main/packages/sdk",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/intelex-ia/combo_automatico.git",
|
|
11
|
+
"directory": "packages/sdk"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/intelex-ia/combo_automatico/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"intelexia",
|
|
18
|
+
"content-api",
|
|
19
|
+
"headless",
|
|
20
|
+
"cms",
|
|
21
|
+
"next",
|
|
22
|
+
"nextjs",
|
|
23
|
+
"react",
|
|
24
|
+
"sdk"
|
|
25
|
+
],
|
|
26
|
+
"type": "module",
|
|
27
|
+
"main": "./dist/index.js",
|
|
28
|
+
"module": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
|
+
"default": "./dist/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./react": {
|
|
36
|
+
"types": "./dist/react.d.ts",
|
|
37
|
+
"default": "./dist/react.js"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist",
|
|
42
|
+
"README.md"
|
|
43
|
+
],
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsc",
|
|
46
|
+
"typecheck": "tsc --noEmit"
|
|
47
|
+
},
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"react": ">=18"
|
|
50
|
+
},
|
|
51
|
+
"peerDependenciesMeta": {
|
|
52
|
+
"react": {
|
|
53
|
+
"optional": true
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@types/react": "^18.3.12",
|
|
58
|
+
"typescript": "^5.6.3"
|
|
59
|
+
},
|
|
60
|
+
"publishConfig": {
|
|
61
|
+
"access": "public",
|
|
62
|
+
"provenance": true
|
|
63
|
+
}
|
|
64
64
|
}
|
package/dist/autoria.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"autoria.test.d.ts","sourceRoot":"","sources":["../src/autoria.test.ts"],"names":[],"mappings":""}
|
package/dist/autoria.test.js
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { autoriaDoArtigo, SELO_IA } from "./react.js";
|
|
3
|
-
/**
|
|
4
|
-
* A autoria do artigo tem duas regras duras, e as duas vêm de fora da
|
|
5
|
-
* engenharia:
|
|
6
|
-
*
|
|
7
|
-
* 1. `author` só vale quando é `Organization`. Texto produzido com apoio de IA
|
|
8
|
-
* e assinado por uma PESSOA é o que os Termos do Google proíbem desde
|
|
9
|
-
* 30/07/2026. O profissional aparece como REVISOR.
|
|
10
|
-
*
|
|
11
|
-
* 2. A autoria NUNCA some. Sem cadastro, assina a equipe da empresa — e o selo
|
|
12
|
-
* de apoio de IA sai do mesmo jeito. Artigo no ar sem dizer quem assina foi
|
|
13
|
-
* exatamente o defeito medido no siteIA em 21/10/2026.
|
|
14
|
-
*/
|
|
15
|
-
describe("autoriaDoArtigo", () => {
|
|
16
|
-
const comOrganization = {
|
|
17
|
-
schemaJson: {
|
|
18
|
-
"@graph": [
|
|
19
|
-
{
|
|
20
|
-
"@type": "BlogPosting",
|
|
21
|
-
author: { "@type": "Organization", name: "Equipe Editorial Parceria" },
|
|
22
|
-
contributor: {
|
|
23
|
-
"@type": "Person",
|
|
24
|
-
name: "Mauro Roger Pinto",
|
|
25
|
-
jobTitle: "Contador responsável técnico",
|
|
26
|
-
identifier: "CRC-SC 020357/O-4",
|
|
27
|
-
},
|
|
28
|
-
dateModified: "2026-10-21",
|
|
29
|
-
publisher: { "@type": "Organization", name: "Parceria Assessoria Contábil" },
|
|
30
|
-
},
|
|
31
|
-
],
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
it("usa a Organization como autor e o contributor como revisor", () => {
|
|
35
|
-
const a = autoriaDoArtigo(comOrganization);
|
|
36
|
-
expect(a.autor).toBe("Equipe Editorial Parceria");
|
|
37
|
-
expect(a.revisor).toBe("Mauro Roger Pinto, Contador responsável técnico, CRC-SC 020357/O-4");
|
|
38
|
-
expect(a.revisadoEm).toBe("2026-10-21");
|
|
39
|
-
expect(a.temCadastro).toBe(true);
|
|
40
|
-
});
|
|
41
|
-
it("IGNORA author do tipo Person — e cai para a equipe da empresa", () => {
|
|
42
|
-
const a = autoriaDoArtigo({
|
|
43
|
-
schemaJson: {
|
|
44
|
-
"@type": "BlogPosting",
|
|
45
|
-
author: { "@type": "Person", name: "Fulano de Tal" },
|
|
46
|
-
publisher: { "@type": "Organization", name: "Contabilidade Acme" },
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
expect(a.autor).not.toContain("Fulano");
|
|
50
|
-
expect(a.autor).toBe("Equipe Editorial Contabilidade Acme");
|
|
51
|
-
expect(a.temCadastro).toBe(false);
|
|
52
|
-
});
|
|
53
|
-
it("sem autoria no schema, assina a equipe tirada do publisher", () => {
|
|
54
|
-
const a = autoriaDoArtigo({
|
|
55
|
-
schemaJson: { "@type": "BlogPosting", publisher: { "@type": "Organization", name: "Acme" } },
|
|
56
|
-
});
|
|
57
|
-
expect(a.autor).toBe("Equipe Editorial Acme");
|
|
58
|
-
expect(a.revisor).toBeNull();
|
|
59
|
-
expect(a.temCadastro).toBe(false);
|
|
60
|
-
});
|
|
61
|
-
it("a prop `empresa` vence o publisher do schema", () => {
|
|
62
|
-
const a = autoriaDoArtigo({ schemaJson: { publisher: { "@type": "Organization", name: "Nome Velho" } } }, { empresa: "Nome Novo" });
|
|
63
|
-
expect(a.autor).toBe("Equipe Editorial Nome Novo");
|
|
64
|
-
});
|
|
65
|
-
it("sem schema nenhum ainda assina — nunca devolve vazio", () => {
|
|
66
|
-
for (const vazio of [null, undefined, "", 0, [], "texto solto"]) {
|
|
67
|
-
const a = autoriaDoArtigo({ schemaJson: vazio });
|
|
68
|
-
expect(a.autor.length).toBeGreaterThan(0);
|
|
69
|
-
expect(a.temCadastro).toBe(false);
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
it("revisor sem cargo nem registro não gera pontuação solta", () => {
|
|
73
|
-
const a = autoriaDoArtigo({
|
|
74
|
-
schemaJson: {
|
|
75
|
-
author: { "@type": "Organization", name: "Equipe" },
|
|
76
|
-
contributor: { "@type": "Person", name: "Ana Souza" },
|
|
77
|
-
},
|
|
78
|
-
});
|
|
79
|
-
expect(a.revisor).toBe("Ana Souza");
|
|
80
|
-
});
|
|
81
|
-
it("o selo é o texto único do grupo", () => {
|
|
82
|
-
expect(SELO_IA).toBe("Apoio de IA · Revisão humana");
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
//# sourceMappingURL=autoria.test.js.map
|
package/dist/autoria.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"autoria.test.js","sourceRoot":"","sources":["../src/autoria.test.ts"],"names":[],"mappings":"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"}
|
package/dist/merge.test.d.ts
DELETED
package/dist/merge.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"merge.test.d.ts","sourceRoot":"","sources":["../src/merge.test.ts"],"names":[],"mappings":""}
|
package/dist/merge.test.js
DELETED
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { mergePosts, MergeConflictError } from "./merge.js";
|
|
3
|
-
const localFixture = [
|
|
4
|
-
{
|
|
5
|
-
slug: "post-antigo-2024",
|
|
6
|
-
title: "Post antigo de 2024",
|
|
7
|
-
excerpt: "Resumo do antigo",
|
|
8
|
-
date: "2024-01-15",
|
|
9
|
-
category: "Geral",
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
slug: "post-antigo-2025",
|
|
13
|
-
title: "Post antigo de 2025",
|
|
14
|
-
excerpt: "Resumo de 2025",
|
|
15
|
-
date: "2025-06-10",
|
|
16
|
-
category: "Geral",
|
|
17
|
-
},
|
|
18
|
-
];
|
|
19
|
-
const remoteFixture = [
|
|
20
|
-
{
|
|
21
|
-
id: "uuid-1",
|
|
22
|
-
slug: "novo-post-ia",
|
|
23
|
-
title: "Novo post gerado por IA",
|
|
24
|
-
featuredImageUrl: "https://cdn.ex.com/1.jpg",
|
|
25
|
-
words: 1200,
|
|
26
|
-
publishedAt: "2026-05-20T10:00:00Z",
|
|
27
|
-
metaDescription: "Resumo SEO do post novo",
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
id: "uuid-2",
|
|
31
|
-
slug: "outro-novo-ia",
|
|
32
|
-
title: "Outro post novo",
|
|
33
|
-
featuredImageUrl: null,
|
|
34
|
-
words: 800,
|
|
35
|
-
publishedAt: "2026-04-15T10:00:00Z",
|
|
36
|
-
metaDescription: "Outro resumo",
|
|
37
|
-
},
|
|
38
|
-
];
|
|
39
|
-
const mapLocal = (p) => ({
|
|
40
|
-
slug: p.slug,
|
|
41
|
-
title: p.title,
|
|
42
|
-
excerpt: p.excerpt,
|
|
43
|
-
publishedAt: p.date,
|
|
44
|
-
category: p.category,
|
|
45
|
-
featuredImageUrl: null,
|
|
46
|
-
});
|
|
47
|
-
// ── Tests ─────────────────────────────────────────────────────────────────
|
|
48
|
-
describe("mergePosts", () => {
|
|
49
|
-
it("merge feliz — sem conflito, ordenado date-desc (default)", () => {
|
|
50
|
-
const result = mergePosts({
|
|
51
|
-
local: localFixture,
|
|
52
|
-
remote: remoteFixture,
|
|
53
|
-
mapLocal,
|
|
54
|
-
});
|
|
55
|
-
expect(result).toHaveLength(4);
|
|
56
|
-
// Mais recente primeiro
|
|
57
|
-
expect(result.map((p) => p.slug)).toEqual([
|
|
58
|
-
"novo-post-ia", // 2026-05-20 (remoto)
|
|
59
|
-
"outro-novo-ia", // 2026-04-15 (remoto)
|
|
60
|
-
"post-antigo-2025", // 2025-06-10 (local)
|
|
61
|
-
"post-antigo-2024", // 2024-01-15 (local)
|
|
62
|
-
]);
|
|
63
|
-
// Source flag preservado
|
|
64
|
-
expect(result[0]?.source).toBe("remote");
|
|
65
|
-
expect(result[3]?.source).toBe("local");
|
|
66
|
-
});
|
|
67
|
-
it("ordena date-asc quando solicitado", () => {
|
|
68
|
-
const result = mergePosts({
|
|
69
|
-
local: localFixture,
|
|
70
|
-
remote: remoteFixture,
|
|
71
|
-
mapLocal,
|
|
72
|
-
sortBy: "date-asc",
|
|
73
|
-
});
|
|
74
|
-
expect(result.map((p) => p.slug)).toEqual([
|
|
75
|
-
"post-antigo-2024",
|
|
76
|
-
"post-antigo-2025",
|
|
77
|
-
"outro-novo-ia",
|
|
78
|
-
"novo-post-ia",
|
|
79
|
-
]);
|
|
80
|
-
});
|
|
81
|
-
it("sortBy 'none' mantém ordem (locais primeiro, depois remotos)", () => {
|
|
82
|
-
const result = mergePosts({
|
|
83
|
-
local: localFixture,
|
|
84
|
-
remote: remoteFixture,
|
|
85
|
-
mapLocal,
|
|
86
|
-
sortBy: "none",
|
|
87
|
-
});
|
|
88
|
-
expect(result.map((p) => p.slug)).toEqual([
|
|
89
|
-
"post-antigo-2024",
|
|
90
|
-
"post-antigo-2025",
|
|
91
|
-
"novo-post-ia",
|
|
92
|
-
"outro-novo-ia",
|
|
93
|
-
]);
|
|
94
|
-
});
|
|
95
|
-
it("dedupe 'remote-wins' (default) — remoto substitui local com mesmo slug", () => {
|
|
96
|
-
const localCom = [...localFixture, { ...localFixture[0], slug: "novo-post-ia", title: "Versão local antiga" }];
|
|
97
|
-
const result = mergePosts({
|
|
98
|
-
local: localCom,
|
|
99
|
-
remote: remoteFixture,
|
|
100
|
-
mapLocal,
|
|
101
|
-
});
|
|
102
|
-
expect(result).toHaveLength(4);
|
|
103
|
-
const post = result.find((p) => p.slug === "novo-post-ia");
|
|
104
|
-
expect(post.title).toBe("Novo post gerado por IA");
|
|
105
|
-
expect(post.source).toBe("remote");
|
|
106
|
-
});
|
|
107
|
-
it("dedupe 'local-wins' — mantém o local, ignora o remoto", () => {
|
|
108
|
-
const localCom = [
|
|
109
|
-
...localFixture,
|
|
110
|
-
{ ...localFixture[0], slug: "novo-post-ia", title: "Versão local sagrada" },
|
|
111
|
-
];
|
|
112
|
-
const result = mergePosts({
|
|
113
|
-
local: localCom,
|
|
114
|
-
remote: remoteFixture,
|
|
115
|
-
mapLocal,
|
|
116
|
-
dedupe: "local-wins",
|
|
117
|
-
});
|
|
118
|
-
expect(result).toHaveLength(4);
|
|
119
|
-
const post = result.find((p) => p.slug === "novo-post-ia");
|
|
120
|
-
expect(post.title).toBe("Versão local sagrada");
|
|
121
|
-
expect(post.source).toBe("local");
|
|
122
|
-
});
|
|
123
|
-
it("dedupe 'throw' — lança MergeConflictError com slug do conflito", () => {
|
|
124
|
-
const localCom = [
|
|
125
|
-
...localFixture,
|
|
126
|
-
{ ...localFixture[0], slug: "novo-post-ia", title: "Conflito" },
|
|
127
|
-
];
|
|
128
|
-
expect(() => mergePosts({
|
|
129
|
-
local: localCom,
|
|
130
|
-
remote: remoteFixture,
|
|
131
|
-
mapLocal,
|
|
132
|
-
dedupe: "throw",
|
|
133
|
-
})).toThrowError(MergeConflictError);
|
|
134
|
-
});
|
|
135
|
-
it("mapLocal retornando null filtra o post (cliente quer esconder rascunhos)", () => {
|
|
136
|
-
const result = mergePosts({
|
|
137
|
-
local: localFixture,
|
|
138
|
-
remote: remoteFixture,
|
|
139
|
-
mapLocal: (p) => (p.slug === "post-antigo-2024" ? null : mapLocal(p)),
|
|
140
|
-
});
|
|
141
|
-
expect(result.find((p) => p.slug === "post-antigo-2024")).toBeUndefined();
|
|
142
|
-
expect(result).toHaveLength(3);
|
|
143
|
-
});
|
|
144
|
-
it("filtra remotos sem slug/title/publishedAt (defesa contra API inconsistente)", () => {
|
|
145
|
-
const remoteCom = [
|
|
146
|
-
...remoteFixture,
|
|
147
|
-
// sem slug
|
|
148
|
-
{ id: "x", slug: null, title: "x", featuredImageUrl: null, words: 0, publishedAt: "2026-01-01" },
|
|
149
|
-
// sem title
|
|
150
|
-
{ id: "y", slug: "y", title: null, featuredImageUrl: null, words: 0, publishedAt: "2026-01-01" },
|
|
151
|
-
// sem publishedAt
|
|
152
|
-
{ id: "z", slug: "z", title: "z", featuredImageUrl: null, words: 0, publishedAt: null },
|
|
153
|
-
];
|
|
154
|
-
const result = mergePosts({ local: [], remote: remoteCom, mapLocal });
|
|
155
|
-
expect(result).toHaveLength(2); // só os 2 válidos do fixture
|
|
156
|
-
});
|
|
157
|
-
it("lista vazia em ambos os lados retorna []", () => {
|
|
158
|
-
const result = mergePosts({ local: [], remote: [], mapLocal });
|
|
159
|
-
expect(result).toEqual([]);
|
|
160
|
-
});
|
|
161
|
-
it("só locais (cliente sem painel ainda) retorna locais ordenados", () => {
|
|
162
|
-
const result = mergePosts({ local: localFixture, remote: [], mapLocal });
|
|
163
|
-
expect(result).toHaveLength(2);
|
|
164
|
-
expect(result[0].source).toBe("local");
|
|
165
|
-
});
|
|
166
|
-
it("só remotos (cliente sem posts antigos) retorna remotos ordenados", () => {
|
|
167
|
-
const result = mergePosts({ local: [], remote: remoteFixture, mapLocal });
|
|
168
|
-
expect(result).toHaveLength(2);
|
|
169
|
-
expect(result[0].source).toBe("remote");
|
|
170
|
-
});
|
|
171
|
-
it("ArticleListItem em modo 'plain' (sem metaDescription) vira excerpt null", () => {
|
|
172
|
-
const remotePlain = [
|
|
173
|
-
{
|
|
174
|
-
id: "uuid-3",
|
|
175
|
-
slug: "post-cancelled",
|
|
176
|
-
title: "Post de site cancelado",
|
|
177
|
-
featuredImageUrl: null,
|
|
178
|
-
words: 500,
|
|
179
|
-
publishedAt: "2026-05-01T10:00:00Z",
|
|
180
|
-
// sem metaTitle/metaDescription (plain mode)
|
|
181
|
-
},
|
|
182
|
-
];
|
|
183
|
-
const result = mergePosts({ local: [], remote: remotePlain, mapLocal });
|
|
184
|
-
expect(result).toHaveLength(1);
|
|
185
|
-
expect(result[0].excerpt).toBeNull();
|
|
186
|
-
});
|
|
187
|
-
it("data inválida vai pro final do feed sem quebrar", () => {
|
|
188
|
-
const remoteInvalido = [
|
|
189
|
-
{
|
|
190
|
-
id: "good",
|
|
191
|
-
slug: "good",
|
|
192
|
-
title: "Good",
|
|
193
|
-
featuredImageUrl: null,
|
|
194
|
-
words: 100,
|
|
195
|
-
publishedAt: "2026-05-20T10:00:00Z",
|
|
196
|
-
},
|
|
197
|
-
{
|
|
198
|
-
id: "bad",
|
|
199
|
-
slug: "bad",
|
|
200
|
-
title: "Bad",
|
|
201
|
-
featuredImageUrl: null,
|
|
202
|
-
words: 100,
|
|
203
|
-
publishedAt: "not-a-date",
|
|
204
|
-
},
|
|
205
|
-
];
|
|
206
|
-
const result = mergePosts({ local: [], remote: remoteInvalido, mapLocal });
|
|
207
|
-
expect(result).toHaveLength(2);
|
|
208
|
-
expect(result[0].slug).toBe("good"); // válido primeiro
|
|
209
|
-
expect(result[1].slug).toBe("bad"); // inválido vai pro final
|
|
210
|
-
});
|
|
211
|
-
});
|
|
212
|
-
describe("UnifiedPost type", () => {
|
|
213
|
-
it("source flag permite filtrar por origem na UI", () => {
|
|
214
|
-
const result = mergePosts({
|
|
215
|
-
local: localFixture,
|
|
216
|
-
remote: remoteFixture,
|
|
217
|
-
mapLocal,
|
|
218
|
-
});
|
|
219
|
-
const onlyRemote = result.filter((p) => p.source === "remote");
|
|
220
|
-
expect(onlyRemote).toHaveLength(2);
|
|
221
|
-
onlyRemote.forEach((p) => expect(p.source).toBe("remote"));
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
//# sourceMappingURL=merge.test.js.map
|
package/dist/merge.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"merge.test.js","sourceRoot":"","sources":["../src/merge.test.ts"],"names":[],"mappings":"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"}
|