@griddo/cx 11.14.0 → 11.14.1-rc.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/build/commands/end-render.js +1 -1
- package/build/commands/end-render.js.map +2 -2
- package/build/commands/notify-indexnow.js +1 -1
- package/build/commands/notify-indexnow.js.map +2 -2
- package/build/commands/prepare-assets-directory.js +1 -1
- package/build/commands/prepare-assets-directory.js.map +2 -2
- package/build/commands/prepare-domains-render.js +1 -1
- package/build/commands/prepare-domains-render.js.map +2 -2
- package/build/commands/reset-render.js +1 -1
- package/build/commands/reset-render.js.map +2 -2
- package/build/commands/start-render.js +1 -1
- package/build/commands/start-render.js.map +2 -2
- package/build/commands/upload-search-content.js +1 -1
- package/build/commands/upload-search-content.js.map +2 -2
- package/build/index.js +3 -3
- package/package.json +3 -3
|
@@ -135,7 +135,7 @@ ${r}
|
|
|
135
135
|
${i}
|
|
136
136
|
|
|
137
137
|
${QA.red("stack")}
|
|
138
|
-
${JSON.stringify(A,null,2)}`),new Zt(A)}async function oQ(e){try{await e()}catch(A){A instanceof Zt?m.error("Internal Griddo RenderError"):A instanceof Error?m.error(A.message):m.error(`An unexpected error occurred ${A}`);try{let t=await KA(),r=t.currentRenderingDomain;r?(t.needsRollbackOnError?(m.info("Cleaning exports dir..."),await nQ(r)):m.info("No rollback needed, skipping..."),t.domains[r].isRendering=!1,t.domains[r].renderMode=_t.ERROR,await $s(t)):m.warn("No currentRenderingDomain set, skipping cleanup")}catch{m.info("Early render stage, no db.json created yet...")}throw A}}var Fy=rA(my());function Uy(e={}){let{timeoutMs:A}=e;return{async request(t){let{statusCode:r,headers:s,body:n}=await(0,Fy.request)(t.url,{method:t.method,headers:t.headers,body:t.body,signal:A?AbortSignal.timeout(A):void 0}),o={};for(let[g,c]of Object.entries(s))c!==void 0&&(o[g]=Array.isArray(c)?c.join(", "):String(c));let i,a=async()=>(i===void 0&&(i=await n.text()),i);return{status:r,statusText:"",ok:r>=200&&r<300,headers:o,json:async()=>JSON.parse(await a()),text:a}}}}var zo=class extends Error{constructor(A){super(`Circuit breaker is open. Cooldown: ${A}ms`),this.name="CircuitOpenError"}};function ME(e,A){let{failureThreshold:t,cooldownMs:r,onOpen:s,onClose:n}=A,o="closed",i=0,a=0;function g(){o==="half-open"?(o="closed",i=0,n?.()):i=0}function c(){i++,i>=t&&(o="open",a=Date.now(),s?.())}function B(){return o==="closed"?!0:o==="open"&&Date.now()-a>=r?(o="half-open",!0):o==="half-open"}return{async request(I){if(!B())throw new zo(r);try{let Q=await e.request(I);return g(),Q}catch(Q){throw c(),Q}}}}function by(e){return new Promise(A=>setTimeout(A,e))}function My(e,A,t,r){let s=t==="exponential"?e*2**(A-1):e;return r&&(s=Math.round(s*(.5+Math.random()))),s}function kE(e,A){let{attempts:t,delayMs:r,backoff:s="fixed",jitter:n=!1,retryOn:o,onRetry:i}=A;return{async request(a){let g;for(let c=1;c<=t;c++)try{let B=await e.request(a);if(o?.(B)&&c<t){let I=My(r,c,s,n);i?.({request:a,attempt:c,delayMs:I,response:B}),await by(I);continue}return B}catch(B){if(g=B,c<t){let I=My(r,c,s,n);i?.({request:a,attempt:c,delayMs:I,error:g}),await by(I)}}throw g}}}var TE;function Ps(){return TE||(TE=ME(kE(Uy({timeoutMs:$E}),{attempts:ti,delayMs:zE*1e3,backoff:"exponential",jitter:!0,retryOn:e=>e.status>=500,onRetry:({request:e,attempt:A,delayMs:t,error:r,response:s})=>{let n=s?`HTTP ${s.status}`:r?.message;m.warn(`Retry ${A}/${ti}: ${e.method} ${e.url} \u2014 ${n} (next in ${t}ms)`)}}),{failureThreshold:AQ,cooldownMs:eQ,onOpen:()=>m.warn("Circuit breaker OPEN \u2014 requests will fail fast"),onClose:()=>m.info("Circuit breaker CLOSED \u2014 recovered")}),m.verbose("HTTP adapter: undici (timeout + retry + circuit breaker)")),TE}var se=process.env.GRIDDO_API_URL,pY=process.env.GRIDDO_PUBLIC_API_URL,aO=`${se}/ai/embeddings`,gO=`${pY}/alert`,cO=`${se}/domains`,wY=`${se}/sites/all`,RY=`${se}/page`,ky=`${se}/login_check`,EO=`${se}/debug/reset-render`,QO=`${se}/domains/robots`,lO=`${se}/search`,IO=`${se}/settings`,BO=`${se}/domains/`;var SY=`${se}/site/`,Ty=[SY,"/build/end"];var Ly={name:"@griddo/cx",description:"Griddo SSG based on Gatsby",version:"11.14.0",authors:["Hisco <francis.vega@griddo.io>"],license:"UNLICENSED",homepage:"https://griddo.io",repository:{type:"git",url:"https://github.com/griddo/griddo"},bin:{"griddo-render":"cli.mjs"},exports:{".":{types:"./build/index.d.ts",import:"./build/index.js",require:"./build/index.js"},"./react":{types:"./build/react/index.d.ts",import:"./build/react/index.js",require:"./build/react/index.js"}},scripts:{"// NPM":"",prepare:"yarn run build","// BUILD":"",build:"rm -rf build && sh ./exporter/build.sh","build:debug":"rm -rf build && sh ./exporter/build.sh --debug","// TESTS":"",test:"vitest run","test:watch":"vitest","// INFRA SCRIPTS":"","prepare-domains-render":"node ./build/commands/prepare-domains-render","start-render":"node ./build/commands/start-render","end-render":"node ./build/commands/end-render","upload-search-content":"node ./build/commands/upload-search-content","notify-indexnow":"node ./build/commands/notify-indexnow","reset-render":"node ./build/commands/reset-render","// ONLY LOCAL SCRIPTS":"","prepare-assets-directory":"node ./build/commands/prepare-assets-directory","create-rollback-copy":"rm -rf ../../exports-backup && cp -r ../../exports ../../exports-backup",render:"npm run build && node --env-file=.env cli.mjs render","// LINTER & FORMATTER":"",lint:"biome check --write",format:"biome format --write",flint:"npm run lint && npm run format","ts-lint":"tsgo --noEmit","watch:ts-lint":"tsc --noEmit --watch"},dependencies:{"@kreuzberg/html-to-markdown":"2.24.5",gatsby:"5.15.0","html-react-parser":"5.2.11",jiti:"^2.6.1",undici:"7.24.6"},devDependencies:{"@biomejs/biome":"2.3.4","@griddo/core":"11.14.0","@types/node":"20.19.4","@typescript/native-preview":"7.0.0-dev.20260401.1",cheerio:"1.1.2",esbuild:"0.25.12","p-limit":"7.2.0",typescript:"6.0.2",vitest:"^4.0.18"},peerDependencies:{react:">=18 <19","react-dom":">=18 <19"},engines:{node:">=20.19"},files:["build","exporter","src","gatsby-browser.tsx","gatsby-config.ts","gatsby-node.ts","gatsby-ssr.tsx","global.d.ts","tsconfig.commands.json","tsconfig.exporter.json","tsconfig.json","plugins","cli.mjs"],publishConfig:{access:"public"},gitHead:"
|
|
138
|
+
${JSON.stringify(A,null,2)}`),new Zt(A)}async function oQ(e){try{await e()}catch(A){A instanceof Zt?m.error("Internal Griddo RenderError"):A instanceof Error?m.error(A.message):m.error(`An unexpected error occurred ${A}`);try{let t=await KA(),r=t.currentRenderingDomain;r?(t.needsRollbackOnError?(m.info("Cleaning exports dir..."),await nQ(r)):m.info("No rollback needed, skipping..."),t.domains[r].isRendering=!1,t.domains[r].renderMode=_t.ERROR,await $s(t)):m.warn("No currentRenderingDomain set, skipping cleanup")}catch{m.info("Early render stage, no db.json created yet...")}throw A}}var Fy=rA(my());function Uy(e={}){let{timeoutMs:A}=e;return{async request(t){let{statusCode:r,headers:s,body:n}=await(0,Fy.request)(t.url,{method:t.method,headers:t.headers,body:t.body,signal:A?AbortSignal.timeout(A):void 0}),o={};for(let[g,c]of Object.entries(s))c!==void 0&&(o[g]=Array.isArray(c)?c.join(", "):String(c));let i,a=async()=>(i===void 0&&(i=await n.text()),i);return{status:r,statusText:"",ok:r>=200&&r<300,headers:o,json:async()=>JSON.parse(await a()),text:a}}}}var zo=class extends Error{constructor(A){super(`Circuit breaker is open. Cooldown: ${A}ms`),this.name="CircuitOpenError"}};function ME(e,A){let{failureThreshold:t,cooldownMs:r,onOpen:s,onClose:n}=A,o="closed",i=0,a=0;function g(){o==="half-open"?(o="closed",i=0,n?.()):i=0}function c(){i++,i>=t&&(o="open",a=Date.now(),s?.())}function B(){return o==="closed"?!0:o==="open"&&Date.now()-a>=r?(o="half-open",!0):o==="half-open"}return{async request(I){if(!B())throw new zo(r);try{let Q=await e.request(I);return g(),Q}catch(Q){throw c(),Q}}}}function by(e){return new Promise(A=>setTimeout(A,e))}function My(e,A,t,r){let s=t==="exponential"?e*2**(A-1):e;return r&&(s=Math.round(s*(.5+Math.random()))),s}function kE(e,A){let{attempts:t,delayMs:r,backoff:s="fixed",jitter:n=!1,retryOn:o,onRetry:i}=A;return{async request(a){let g;for(let c=1;c<=t;c++)try{let B=await e.request(a);if(o?.(B)&&c<t){let I=My(r,c,s,n);i?.({request:a,attempt:c,delayMs:I,response:B}),await by(I);continue}return B}catch(B){if(g=B,c<t){let I=My(r,c,s,n);i?.({request:a,attempt:c,delayMs:I,error:g}),await by(I)}}throw g}}}var TE;function Ps(){return TE||(TE=ME(kE(Uy({timeoutMs:$E}),{attempts:ti,delayMs:zE*1e3,backoff:"exponential",jitter:!0,retryOn:e=>e.status>=500,onRetry:({request:e,attempt:A,delayMs:t,error:r,response:s})=>{let n=s?`HTTP ${s.status}`:r?.message;m.warn(`Retry ${A}/${ti}: ${e.method} ${e.url} \u2014 ${n} (next in ${t}ms)`)}}),{failureThreshold:AQ,cooldownMs:eQ,onOpen:()=>m.warn("Circuit breaker OPEN \u2014 requests will fail fast"),onClose:()=>m.info("Circuit breaker CLOSED \u2014 recovered")}),m.verbose("HTTP adapter: undici (timeout + retry + circuit breaker)")),TE}var se=process.env.GRIDDO_API_URL,pY=process.env.GRIDDO_PUBLIC_API_URL,aO=`${se}/ai/embeddings`,gO=`${pY}/alert`,cO=`${se}/domains`,wY=`${se}/sites/all`,RY=`${se}/page`,ky=`${se}/login_check`,EO=`${se}/debug/reset-render`,QO=`${se}/domains/robots`,lO=`${se}/search`,IO=`${se}/settings`,BO=`${se}/domains/`;var SY=`${se}/site/`,Ty=[SY,"/build/end"];var Ly={name:"@griddo/cx",description:"Griddo SSG based on Gatsby",version:"11.14.1-rc.0",authors:["Hisco <francis.vega@griddo.io>"],license:"UNLICENSED",homepage:"https://griddo.io",repository:{type:"git",url:"https://github.com/griddo/griddo"},bin:{"griddo-render":"cli.mjs"},exports:{".":{types:"./build/index.d.ts",import:"./build/index.js",require:"./build/index.js"},"./react":{types:"./build/react/index.d.ts",import:"./build/react/index.js",require:"./build/react/index.js"}},scripts:{"// NPM":"",prepare:"yarn run build","// BUILD":"",build:"rm -rf build && sh ./exporter/build.sh","build:debug":"rm -rf build && sh ./exporter/build.sh --debug","// TESTS":"",test:"vitest run","test:watch":"vitest","// INFRA SCRIPTS":"","prepare-domains-render":"node ./build/commands/prepare-domains-render","start-render":"node ./build/commands/start-render","end-render":"node ./build/commands/end-render","upload-search-content":"node ./build/commands/upload-search-content","notify-indexnow":"node ./build/commands/notify-indexnow","reset-render":"node ./build/commands/reset-render","// ONLY LOCAL SCRIPTS":"","prepare-assets-directory":"node ./build/commands/prepare-assets-directory","create-rollback-copy":"rm -rf ../../exports-backup && cp -r ../../exports ../../exports-backup",render:"npm run build && node --env-file=.env cli.mjs render","// LINTER & FORMATTER":"",lint:"biome check --write",format:"biome format --write",flint:"npm run lint && npm run format","ts-lint":"tsgo --noEmit","watch:ts-lint":"tsc --noEmit --watch"},dependencies:{"@kreuzberg/html-to-markdown":"2.24.5",gatsby:"5.15.0","html-react-parser":"5.2.11",jiti:"^2.6.1",undici:"7.24.6"},devDependencies:{"@biomejs/biome":"2.3.4","@griddo/core":"11.14.1-rc.0","@types/node":"20.19.4","@typescript/native-preview":"7.0.0-dev.20260401.1",cheerio:"1.1.2",esbuild:"0.25.12","p-limit":"7.2.0",typescript:"6.0.2",vitest:"^4.0.18"},peerDependencies:{react:">=18 <19","react-dom":">=18 <19"},engines:{node:">=20.19"},files:["build","exporter","src","gatsby-browser.tsx","gatsby-config.ts","gatsby-node.ts","gatsby-ssr.tsx","global.d.ts","tsconfig.commands.json","tsconfig.exporter.json","tsconfig.json","plugins","cli.mjs"],publishConfig:{access:"public"},gitHead:"8ab9d78cd6b63b616acdd9b504964cda77d5076c"};var $o={"x-application-id":"griddo-cx","x-client-version":Ly.version,"x-client-name":"CX"};var mY=Ps(),LE=class{headers;async login(){try{let A=await mY.request({url:ky,method:"POST",headers:Object.assign({},$o,{"Content-Type":"application/json",Connection:"close"}),body:JSON.stringify({username:ZE,password:XE})});if(!A.ok)throw new Error("Error while login in the API");let{token:t}=await A.json();if(!t||typeof t!="string")throw new Error("Login response missing valid token");return this.headers={Authorization:`bearer ${t}`,"Cache-Control":"no-store"},this.headers}catch(A){lt(rQ,A)}}},_s=new LE;var HE=rA(require("node:fs/promises")),Jy=rA(require("node:path"));var Gy=require("node:crypto");var Zs=rA(require("node:path"));async function Hy(e){let A=await KA();if(!A.domains[e])throw new Error(QA.red(`[!] Error: Domain ${e} not found in DB`));if(!A.domains[e].renderMode)throw new Error(QA.red(`[!] Error: Render mode not found for domain ${e}`));return{renderMode:A.domains[e].renderMode,reason:A.domains[e].renderModeReason}}async function Et(e){let{domain:A,dbFilePath:t}=e||{},s=(await KA(t)).paths;return{__root:s.root,__cache:Zs.default.join(s.cxCache,A||""),__components:s.components,__cx:s.cx,__sites:s.exportsDir,__exports:Zs.default.join(s.exportsDir,A||""),__exports_backup:Zs.default.join(s.exportsDirBackup,A||""),__ssg:s.ssg,__exports_dist:Zs.default.join(s.exportsDir,A||"","dist")}}async function Yy(e){return!!(await KA()).domains[e]?.dryRun}async function xy(){let e=await KA();return{griddoVersion:e.griddoVersion,buildReportFileName:e.buildReportFileName}}var FY=32;function Oy(e){return(0,Gy.createHash)("sha256").update(e,"utf-8").digest("hex").slice(0,FY)}var UY="https://api.indexnow.org/indexnow",bY=1e4;async function MY(e){let{domain:A,key:t}=e,{__cache:r}=await Et({domain:A}),s=Jy.default.join(r,"indexnow-payload.json"),n=await xY(s);if(!n)return m.verbose(`indexnow: no payload for ${A}, skipping`),null;let o=n.upsert.length,i=n.delete.length,a=kY(n);if(a.length===0)return m.verbose(`indexnow: empty payload for ${A}, removing file`),await Vy(s),{domain:A,sent:0,upsertCount:o,deleteCount:i,requests:0,succeeded:!0};let g=TY(a),c=0,B=!0;for(let[I,Q]of g)for(let l of LY(Q,bY))c++,await HY({host:I,key:t,urlList:l})||(B=!1);return B&&await Vy(s),{domain:A,sent:a.length,upsertCount:o,deleteCount:i,requests:c,succeeded:B}}function kY(e){let A=new Set;for(let t of e.upsert)A.add(t.url);for(let t of e.delete)A.add(t.url);return Array.from(A)}function TY(e){let A=new Map;for(let t of e){let r;try{r=new URL(t).host}catch{m.warn(`indexnow: invalid URL skipped: ${t}`);continue}let s=A.get(r);s?s.push(t):A.set(r,[t])}return A}function*LY(e,A){for(let t=0;t<e.length;t+=A)yield e.slice(t,t+A)}async function HY(e){let{host:A,key:t,urlList:r}=e,s={host:A,key:t,keyLocation:`https://${A}/${t}.txt`,urlList:r};try{let n=await fetch(UY,{method:"POST",headers:{"Content-Type":"application/json; charset=utf-8"},body:JSON.stringify(s)});if(!n.ok){let o=await YY(n);return m.warn(`indexnow: ${A} HTTP ${n.status} (${r.length} urls)${o?`: ${o}`:""}`),!1}return m.verbose(`indexnow: ${A} pinged (${r.length} urls, HTTP ${n.status})`),!0}catch(n){return m.warn(`indexnow: ${A} request failed: ${n?.message??String(n)}`),!1}}async function YY(e){try{return(await e.text()).slice(0,200)}catch{return""}}async function xY(e){try{let A=await HE.default.readFile(e,"utf-8");return JSON.parse(A)}catch{return null}}async function Vy(e){try{await HE.default.unlink(e)}catch{}}async function vy(e){let{slug:A,dryRun:t}=e;if(!ei){m.info("indexnow: feature disabled (GRIDDO_INDEXNOW_ENABLED), skipping");return}if(t){m.verbose(`indexnow: domain ${A} ignored by dry-render`);return}let r=Oy(A),s=await MY({domain:A,key:r});if(!s)return;let n=s.succeeded?"ok":"partial failure";m.info(`indexnow: ${s.domain} -> ${s.sent} urls (${s.upsertCount} upsert, ${s.deleteCount} delete) in ${s.requests} request(s) [${n}]`)}var Zy=rA(require("node:crypto")),Ai=rA(require("node:fs/promises")),xE=rA(require("node:path"));var Wy=rA(require("node:fs/promises"));var Hr=[],qy=null,Xs=null,GY=KE;var OY=!js;function YE(e){OY||(Hr.push(e.toString()),Hr.length>=GY&&VY().catch(A=>{m.error("Background log flush failed:",A)}))}async function VY(){if(Xs&&await Xs,Hr.length===0||!qy)return;Xs=(async()=>{let A=[...Hr];Hr.length=0;try{await Wy.default.appendFile(qy,`${A.join(`
|
|
139
139
|
`)}
|
|
140
140
|
`)}catch(t){Hr.unshift(...A),m.error("Error flushing logs:",t)}})();try{await Xs}finally{Xs=null}}var JY=Ps();async function vY(e,A,t=""){let{endpoint:r,body:s,cacheKey:n="",headers:o,useApiCacheDir:i=!0,logToFile:a=!0}=e,g={endpoint:r,body:s,headers:o,cacheKey:n};if(n&&i){let c=new Date,B=await PY(g);if(B){if(a){let I=Py(B),Q=I?`site: ${I}`:"",l=_y(Date.now()-c.getTime());YE(`${A} (cache) ${Q} ${r} - ${l}s ${t}`)}return B}}try{let c=new Date,B=Object.assign({},$o,o,_s.headers),I=A.toLowerCase()!=="get"&&s;I&&(B["Content-Type"]="application/json");let Q=await JY.request({url:r,method:A.toUpperCase(),headers:B,body:I?JSON.stringify(s):void 0});if(!Q.ok){if(Q.status===404)return null;throw new Error(`HTTP ${Q.status}: ${Q.statusText}`)}let l=await Q.json();if(a){let h=Py(l),D=h?`site: ${h}`:"",C=_y(Date.now()-c.getTime());YE(`${A} (fetch) ${D} ${r} - ${C}s ${t}`)}return i&&await WY(g,l),l}catch(c){let B=c;throw qY(B,{callInfo:{endpoint:r,body:s}}),new Zt(B)}}async function Xy(e){let{endpoint:A,body:t,headers:r}=e,s=A.endsWith("/distributor")&&`# ReferenceField body: ${JSON.stringify(t)} lang: ${JSON.stringify(r?.lang)}`;return vY(e,"post",s||"")}function qY(e,A){let{message:t,stack:r}=e,{callInfo:s}=A,n=[];for(let a of Object.keys(s))n.push(`${a}: ${typeof s[a]=="object"?JSON.stringify(s[a]):s[a]}`);let o=n.join(`
|
|
141
141
|
`),i=`${t}
|