From a334caa73493217ab372d2208cdc6efeec66f931 Mon Sep 17 00:00:00 2001 From: Vitor Date: Fri, 24 Apr 2026 19:43:37 -0300 Subject: [PATCH 1/4] feat(cli,feeds): smart rewrites merge and generic xml handler CLI: when store conf/firebase.json defines a rewrite for a function already present in base config, the merge replaces that entry instead of appending a duplicate. Falls back to adding a new entry if function is not found in base rewrites. Feeds: catalog handler now matches any .xml path (except sitemap), so store-specific routing prefixes work without code changes. --- packages/cli/src/cli.ts | 33 ++++++++++++++++++---- packages/feeds/src/firebase/serve-feeds.ts | 8 +++--- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 054c8097b..975ee9848 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -80,11 +80,34 @@ const run = async () => { const baseFirebaseConfig = JSON.parse( fs.readFileSync(joinPath(baseConfigDir, 'firebase.json'), 'utf8'), ); - const mergedConfig = deepmerge(baseFirebaseConfig, userFirebaseConfig); - fs.writeFileSync( - joinPath(pwd, 'firebase.json'), - JSON.stringify(mergedConfig, null, 2), - ); + const userRewrites: Array> | undefined = userFirebaseConfig?.hosting?.rewrites; + if (Array.isArray(userRewrites) && Array.isArray(baseFirebaseConfig.hosting?.rewrites)) { + const { rewrites: _omit, ...hostingRest } = userFirebaseConfig.hosting as Record; + const mergedConfig = deepmerge(baseFirebaseConfig, { + ...userFirebaseConfig, + hosting: hostingRest, + }); + const mergedRewrites: Array> = [...baseFirebaseConfig.hosting.rewrites]; + for (const userRewrite of userRewrites) { + const matchIdx = mergedRewrites.findIndex((r) => r.function === userRewrite.function); + if (matchIdx >= 0) { + mergedRewrites[matchIdx] = { ...mergedRewrites[matchIdx], ...userRewrite }; + } else { + mergedRewrites.push(userRewrite); + } + } + mergedConfig.hosting.rewrites = mergedRewrites; + fs.writeFileSync( + joinPath(pwd, 'firebase.json'), + JSON.stringify(mergedConfig, null, 2), + ); + } else { + const mergedConfig = deepmerge(baseFirebaseConfig, userFirebaseConfig); + fs.writeFileSync( + joinPath(pwd, 'firebase.json'), + JSON.stringify(mergedConfig, null, 2), + ); + } } } } diff --git a/packages/feeds/src/firebase/serve-feeds.ts b/packages/feeds/src/firebase/serve-feeds.ts index 350d8ac31..056f33e94 100644 --- a/packages/feeds/src/firebase/serve-feeds.ts +++ b/packages/feeds/src/firebase/serve-feeds.ts @@ -106,10 +106,6 @@ const serveFeeds = async (req: Request, res: Response) => { } } switch (req.path) { - case '/_feeds/catalog.xml': - case '/catalog.xml': - await renderCatalog(req, res, products); - break; case '/sitemap-catalog.xml': await renderSitemap(req, res, products); break; @@ -122,6 +118,10 @@ const serveFeeds = async (req: Request, res: Response) => { await proxyGithubApi(req, res); break; } + if (req.path.endsWith('.xml')) { + await renderCatalog(req, res, products); + break; + } res.sendStatus(404); } }; From 6047e8d05b54b5c046aa4f83ebc5e4ad3789e529 Mon Sep 17 00:00:00 2001 From: Vitor Date: Fri, 24 Apr 2026 19:48:25 -0300 Subject: [PATCH 2/4] fix(cli): replace for-of with forEach and remove unused destructuring var --- packages/cli/src/cli.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 975ee9848..e341b27d8 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -82,20 +82,21 @@ const run = async () => { ); const userRewrites: Array> | undefined = userFirebaseConfig?.hosting?.rewrites; if (Array.isArray(userRewrites) && Array.isArray(baseFirebaseConfig.hosting?.rewrites)) { - const { rewrites: _omit, ...hostingRest } = userFirebaseConfig.hosting as Record; + const hostingRest: Record = { ...userFirebaseConfig.hosting }; + delete hostingRest.rewrites; const mergedConfig = deepmerge(baseFirebaseConfig, { ...userFirebaseConfig, hosting: hostingRest, }); const mergedRewrites: Array> = [...baseFirebaseConfig.hosting.rewrites]; - for (const userRewrite of userRewrites) { + userRewrites.forEach((userRewrite) => { const matchIdx = mergedRewrites.findIndex((r) => r.function === userRewrite.function); if (matchIdx >= 0) { mergedRewrites[matchIdx] = { ...mergedRewrites[matchIdx], ...userRewrite }; } else { mergedRewrites.push(userRewrite); } - } + }); mergedConfig.hosting.rewrites = mergedRewrites; fs.writeFileSync( joinPath(pwd, 'firebase.json'), From 6489005cfc9164372102a78a402d13719d69d407 Mon Sep 17 00:00:00 2001 From: Vitor Date: Wed, 29 Apr 2026 10:08:46 -0300 Subject: [PATCH 3/4] fix(tiny-erp): add cpf_cnpj and tipo_pessoa to endereco_entrega The delivery address (endereco_entrega) was missing cpf_cnpj and tipo_pessoa fields required by the Tiny ERP API v2 for NF issuance. These fields were only being sent in the cliente (billing) object, causing NF generation errors when Tiny stopped inferring the document number from the customer record for the delivery address. Co-Authored-By: Claude Sonnet 4.6 --- .../apps/tiny-erp/src/integration/parsers/order-to-tiny.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/apps/tiny-erp/src/integration/parsers/order-to-tiny.ts b/packages/apps/tiny-erp/src/integration/parsers/order-to-tiny.ts index 5dd23e673..3abe18b17 100644 --- a/packages/apps/tiny-erp/src/integration/parsers/order-to-tiny.ts +++ b/packages/apps/tiny-erp/src/integration/parsers/order-to-tiny.ts @@ -83,6 +83,10 @@ export default async (order: Orders, appData) => { if (shippingAddress.name) { tinyOrder.endereco_entrega.nome_destinatario = shippingAddress.name.substring(0, 60); } + if (buyer && buyer.doc_number && buyer.doc_number.length <= 18) { + tinyOrder.endereco_entrega.cpf_cnpj = buyer.doc_number; + tinyOrder.endereco_entrega.tipo_pessoa = buyer.registry_type === 'j' ? 'J' : 'F'; + } } if (order.items) { From 3846ac5b0822e0ab2d8d0a79ac6dd8ca90f828ec Mon Sep 17 00:00:00 2001 From: Leonardo Matos Date: Wed, 29 Apr 2026 14:16:12 -0300 Subject: [PATCH 4/4] chore(feeds): Fallback no catalog rendering for any /catalog.xml route --- packages/feeds/src/firebase/serve-feeds.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/feeds/src/firebase/serve-feeds.ts b/packages/feeds/src/firebase/serve-feeds.ts index 056f33e94..ae5df08c6 100644 --- a/packages/feeds/src/firebase/serve-feeds.ts +++ b/packages/feeds/src/firebase/serve-feeds.ts @@ -118,7 +118,7 @@ const serveFeeds = async (req: Request, res: Response) => { await proxyGithubApi(req, res); break; } - if (req.path.endsWith('.xml')) { + if (req.path.endsWith('/catalog.xml')) { await renderCatalog(req, res, products); break; }