@lensmcp/cluster 1.25.34 → 1.25.36

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 (144) hide show
  1. package/basic-ssl.js +1 -1
  2. package/build-host.js +1 -1
  3. package/build-scope-patterns.js +1 -1
  4. package/bundle-parent.js +1 -1
  5. package/checkout-cache.js +1 -1
  6. package/child-process-env.js +1 -1
  7. package/compile-retry.js +1 -1
  8. package/config-files.d.ts +34 -0
  9. package/config-files.js +1 -0
  10. package/create-webpack-dev.js +1 -1
  11. package/create-webpack-prod.js +1 -1
  12. package/dev-devtool.js +1 -1
  13. package/devserver-host.js +1 -1
  14. package/devserver-notifier.d.ts +3 -1
  15. package/devserver-notifier.js +1 -1
  16. package/devserver-transport.js +1 -1
  17. package/error-stack-release.js +1 -1
  18. package/executors/build/build.impl.js +1 -1
  19. package/executors/gateway/body-stall.js +1 -1
  20. package/executors/gateway/canonical-path.js +1 -1
  21. package/executors/gateway/client-ip.js +1 -1
  22. package/executors/gateway/gateway-errors.js +1 -1
  23. package/executors/gateway/gateway.impl.js +1 -1
  24. package/executors/gateway/gateway.lib.js +1 -1
  25. package/executors/gateway/health-check.js +1 -1
  26. package/executors/gateway/jwks-verify.d.ts +15 -0
  27. package/executors/gateway/jwks-verify.js +1 -1
  28. package/executors/gateway/jwt-claims.js +1 -1
  29. package/executors/gateway/main.prod-gateway.js +2 -2
  30. package/executors/gateway/main.rollout.js +4 -4
  31. package/executors/gateway/manifest.js +1 -1
  32. package/executors/gateway/metrics.js +1 -1
  33. package/executors/gateway/otel-tracing.js +1 -1
  34. package/executors/gateway/prod-config.js +1 -1
  35. package/executors/gateway/prod-gateway.lib.js +1 -1
  36. package/executors/gateway/prod-runtime/access-log.js +1 -1
  37. package/executors/gateway/prod-runtime/app.js +1 -1
  38. package/executors/gateway/prod-runtime/auth.js +1 -1
  39. package/executors/gateway/prod-runtime/body-stall.js +1 -1
  40. package/executors/gateway/prod-runtime/cors.js +1 -1
  41. package/executors/gateway/prod-runtime/edge.js +1 -1
  42. package/executors/gateway/prod-runtime/handler.js +1 -1
  43. package/executors/gateway/prod-runtime/hooks.js +1 -1
  44. package/executors/gateway/prod-runtime/observability.js +1 -1
  45. package/executors/gateway/prod-runtime/rollout.js +1 -1
  46. package/executors/gateway/prod-runtime/routing.js +1 -1
  47. package/executors/gateway/prod-runtime/server.js +1 -1
  48. package/executors/gateway/prod-runtime/trust.js +1 -1
  49. package/executors/gateway/prod-runtime/types.d.ts +6 -2
  50. package/executors/gateway/prod-runtime/upgrade.js +7 -7
  51. package/executors/gateway/prod-runtime/upstream.js +1 -1
  52. package/executors/gateway/providers-prod.js +1 -1
  53. package/executors/gateway/rate-limit.js +2 -2
  54. package/executors/gateway/registry-source.js +1 -1
  55. package/executors/gateway/rollout-ops.js +2 -2
  56. package/executors/gateway/runtime/act.js +1 -1
  57. package/executors/gateway/runtime/auth.js +1 -1
  58. package/executors/gateway/runtime/chooser.js +12 -12
  59. package/executors/gateway/runtime/control.js +2 -2
  60. package/executors/gateway/runtime/dev-auth.js +1 -1
  61. package/executors/gateway/runtime/discovery.js +1 -1
  62. package/executors/gateway/runtime/edge.js +1 -1
  63. package/executors/gateway/runtime/guest-graph.js +2 -2
  64. package/executors/gateway/runtime/guest-replay.js +2 -2
  65. package/executors/gateway/runtime/handler.js +1 -1
  66. package/executors/gateway/runtime/hmr-reload.js +1 -1
  67. package/executors/gateway/runtime/hooks.js +1 -1
  68. package/executors/gateway/runtime/hosted-dashboard.js +1 -1
  69. package/executors/gateway/runtime/instance.js +2 -2
  70. package/executors/gateway/runtime/lens-children.js +1 -1
  71. package/executors/gateway/runtime/lifecycle.js +3 -3
  72. package/executors/gateway/runtime/observability.js +3 -3
  73. package/executors/gateway/runtime/orphan-reaper.js +2 -2
  74. package/executors/gateway/runtime/own-log.js +6 -6
  75. package/executors/gateway/runtime/pod-env.js +2 -2
  76. package/executors/gateway/runtime/pod-output.js +1 -1
  77. package/executors/gateway/runtime/pod-probe.js +1 -1
  78. package/executors/gateway/runtime/process-names.js +1 -1
  79. package/executors/gateway/runtime/project-graph-store.js +1 -1
  80. package/executors/gateway/runtime/proxy.js +1 -1
  81. package/executors/gateway/runtime/registration-guards.js +1 -1
  82. package/executors/gateway/runtime/route-registry.js +1 -1
  83. package/executors/gateway/runtime/scope.js +1 -1
  84. package/executors/gateway/runtime/serve-launch.js +3 -3
  85. package/executors/gateway/runtime/server.js +2 -2
  86. package/executors/gateway/runtime/service-keys.js +1 -1
  87. package/executors/gateway/runtime/shared-build.js +3 -3
  88. package/executors/gateway/runtime/source-poller.js +1 -1
  89. package/executors/gateway/runtime/types.js +1 -1
  90. package/executors/gateway/runtime/upgrade.js +1 -1
  91. package/executors/gateway/runtime/warm-start.js +1 -1
  92. package/executors/gateway/runtime/workspace-log.js +1 -1
  93. package/executors/gateway/runtime/workspace-middleware.js +1 -1
  94. package/executors/gateway/runtime/workspace-registry.js +1 -1
  95. package/executors/gateway/ssrf-guard.js +1 -1
  96. package/executors/serve/serve.impl.js +1 -1
  97. package/executors/serve/stop-on-signal.js +1 -1
  98. package/executors/trust/hostname.js +1 -1
  99. package/executors/trust/trust.impl.js +3 -3
  100. package/exit-reason.js +2 -2
  101. package/fork-ts-check-reporter.js +1 -1
  102. package/gateway.js +1 -1
  103. package/gc-notice.js +1 -1
  104. package/graph-snapshot.js +1 -1
  105. package/handoff-retire.js +1 -1
  106. package/heap-snapshot.js +1 -1
  107. package/hot-swap-registries.js +1 -1
  108. package/index.js +1 -1
  109. package/inspector-secret.js +1 -1
  110. package/main.devserver.js +11 -11
  111. package/notice-generation.js +1 -1
  112. package/package.json +4 -4
  113. package/perf/heavy-barrel-import.js +1 -1
  114. package/perf/perf-config.js +1 -1
  115. package/perf/perf-rule-events.js +2 -2
  116. package/perf/perf-rules-analysis.js +1 -1
  117. package/perf/perf-rules-plugin.js +1 -1
  118. package/perf/source-scan.js +5 -5
  119. package/perf/workspace-libraries.js +2 -2
  120. package/pod-memory-events.js +2 -2
  121. package/pod-memory.js +1 -1
  122. package/pod-sock.js +1 -1
  123. package/process-name.js +1 -1
  124. package/redis-disconnect-fix.js +1 -1
  125. package/schema-first-instance.js +1 -1
  126. package/serve-runner.js +1 -1
  127. package/service-build-events.d.ts +2 -2
  128. package/service-build-events.js +2 -2
  129. package/shared-build/attach.js +2 -2
  130. package/shared-build/host.d.ts +14 -1
  131. package/shared-build/host.js +3 -4
  132. package/shared-build/protocol.js +1 -1
  133. package/shared-build/shared-compilation.js +3 -3
  134. package/shared-build/signature.js +1 -1
  135. package/stdio-guard.js +1 -1
  136. package/swap-mode.js +1 -1
  137. package/swap-recycle.js +1 -1
  138. package/tsgo-check-plugin.js +4 -4
  139. package/typecheck-bus.js +3 -3
  140. package/typecheck-queue.js +1 -1
  141. package/worker-guard.js +1 -1
  142. package/worker-retire.js +1 -1
  143. package/worker-supervisor.js +2 -2
  144. package/workspace-paths.js +1 -1
@@ -1,2 +1,2 @@
1
- "use strict";var d=Object.defineProperty;var o=(r,e)=>d(r,"name",{value:e,configurable:!0});var c=Object.defineProperty,u=o((r,e)=>c(r,"name",{value:e,configurable:!0}),"u");Object.defineProperty(exports,"__esModule",{value:!0}),exports.PERF_RULES_DOC=void 0,exports.perfRuleFingerprint=perfRuleFingerprint,exports.perfRuleScanFingerprint=perfRuleScanFingerprint,exports.buildPerfFindingEvent=buildPerfFindingEvent,exports.buildPerfRetractedEvent=buildPerfRetractedEvent,exports.buildPerfScanEvent=buildPerfScanEvent,exports.createPerfRulePublisher=createPerfRulePublisher;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path"));exports.PERF_RULES_DOC="https://github.com/kiwiapps-ltd/lensmcp/blob/main/docs/lensmcp/concepts/memory-and-build-cost.mdx";let idCounter=0;function makeId(){return idCounter=(idCounter+1)%65535,`${Date.now().toString(36)}${idCounter.toString(36)}${Math.random().toString(36).slice(2,8)}`}o(makeId,"makeId"),u(makeId,"makeId");function perfRuleFingerprint(r,e,t){return`perf-rule:${r}:${e}:${t}`}o(perfRuleFingerprint,"perfRuleFingerprint"),u(perfRuleFingerprint,"perfRuleFingerprint");function perfRuleScanFingerprint(r,e){return`perf-rule-scan:${r}:${e}`}o(perfRuleScanFingerprint,"perfRuleScanFingerprint"),u(perfRuleScanFingerprint,"perfRuleScanFingerprint");function envelope(r,e,t,s,n,i,p){const l="pending";return{id:p(),sessionId:l,timestamp:e,source:"perf",category:"performance",severity:t,context:{sessionId:l,projectName:r},fingerprint:s,title:n,raw:i}}o(envelope,"envelope"),u(envelope,"envelope");function buildPerfFindingEvent(r,e,t,s=makeId){const n=envelope(r,t,e.severity,perfRuleFingerprint(e.rule,r,e.subject),`${e.rule}: ${e.title}`,{kind:"perf-rule-finding",rule:e.rule,project:r,subject:e.subject,severity:e.severity,title:e.title,summary:e.summary,evidence:e.evidence,cost:e.cost,fix:e.fix,verify:e.verify,docs:e.docs,detectedAt:t},s);return n.message=e.summary,n}o(buildPerfFindingEvent,"buildPerfFindingEvent"),u(buildPerfFindingEvent,"buildPerfFindingEvent");function buildPerfRetractedEvent(r,e,t,s,n,i=makeId){return envelope(e,n,"info",perfRuleFingerprint(r,e,t),`${r}: cleared for ${e} (${t})`,{kind:"perf-rule-retracted",rule:r,project:e,subject:t,reason:s,at:n},i)}o(buildPerfRetractedEvent,"buildPerfRetractedEvent"),u(buildPerfRetractedEvent,"buildPerfRetractedEvent");function buildPerfScanEvent(r,e,t,s,n=makeId,i){return envelope(e,s,"info",perfRuleScanFingerprint(r,e),`${r}: scanned ${e} \u2014 ${t.length} open`,{kind:"perf-rule-scan",rule:r,project:e,open:t,at:s,...i!==void 0?{elapsedMs:i}:{}},n)}o(buildPerfScanEvent,"buildPerfScanEvent"),u(buildPerfScanEvent,"buildPerfScanEvent");function createPerfRulePublisher(r,e){if(!r)return{publish:u(()=>!1,"publish")};const t=e??(()=>{try{return require("@lensmcp/node-instrumentation")}catch{return}})(),s=t?.createEventFloodGuard({burst:30,perSec:5});let n=!1;return{publish(i){const p=s?.admit(i.fingerprint)??{ok:!0,suppressed:0};if(!p.ok)return!1;const l=JSON.stringify(p.suppressed>0?{...i,raw:{...i.raw,floodSuppressed:p.suppressed}}:i)+`
2
- `;try{return n||(fs.mkdirSync(path.dirname(r),{recursive:!0}),n=!0),t?.maybeRotateEventFile(r,l.length),fs.appendFileSync(r,l),!0}catch{return n=!1,!1}}}}o(createPerfRulePublisher,"createPerfRulePublisher"),u(createPerfRulePublisher,"createPerfRulePublisher");
1
+ "use strict";var f=Object.defineProperty;var l=(r,e)=>f(r,"name",{value:e,configurable:!0});var d=Object.defineProperty,o=l((r,e)=>d(r,"name",{value:e,configurable:!0}),"o"),c=Object.defineProperty,u=o((r,e)=>c(r,"name",{value:e,configurable:!0}),"u");Object.defineProperty(exports,"__esModule",{value:!0}),exports.PERF_RULES_DOC=void 0,exports.perfRuleFingerprint=perfRuleFingerprint,exports.perfRuleScanFingerprint=perfRuleScanFingerprint,exports.buildPerfFindingEvent=buildPerfFindingEvent,exports.buildPerfRetractedEvent=buildPerfRetractedEvent,exports.buildPerfScanEvent=buildPerfScanEvent,exports.createPerfRulePublisher=createPerfRulePublisher;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path"));exports.PERF_RULES_DOC="https://github.com/kiwiapps-ltd/lensmcp/blob/main/docs/lensmcp/concepts/memory-and-build-cost.mdx";let idCounter=0;function makeId(){return idCounter=(idCounter+1)%65535,`${Date.now().toString(36)}${idCounter.toString(36)}${Math.random().toString(36).slice(2,8)}`}l(makeId,"makeId"),o(makeId,"makeId"),u(makeId,"makeId");function perfRuleFingerprint(r,e,t){return`perf-rule:${r}:${e}:${t}`}l(perfRuleFingerprint,"perfRuleFingerprint"),o(perfRuleFingerprint,"perfRuleFingerprint"),u(perfRuleFingerprint,"perfRuleFingerprint");function perfRuleScanFingerprint(r,e){return`perf-rule-scan:${r}:${e}`}l(perfRuleScanFingerprint,"perfRuleScanFingerprint"),o(perfRuleScanFingerprint,"perfRuleScanFingerprint"),u(perfRuleScanFingerprint,"perfRuleScanFingerprint");function envelope(r,e,t,s,n,i,p){const a="pending";return{id:p(),sessionId:a,timestamp:e,source:"perf",category:"performance",severity:t,context:{sessionId:a,projectName:r},fingerprint:s,title:n,raw:i}}l(envelope,"envelope"),o(envelope,"envelope"),u(envelope,"envelope");function buildPerfFindingEvent(r,e,t,s=makeId){const n=envelope(r,t,e.severity,perfRuleFingerprint(e.rule,r,e.subject),`${e.rule}: ${e.title}`,{kind:"perf-rule-finding",rule:e.rule,project:r,subject:e.subject,severity:e.severity,title:e.title,summary:e.summary,evidence:e.evidence,cost:e.cost,fix:e.fix,verify:e.verify,docs:e.docs,detectedAt:t},s);return n.message=e.summary,n}l(buildPerfFindingEvent,"buildPerfFindingEvent"),o(buildPerfFindingEvent,"buildPerfFindingEvent"),u(buildPerfFindingEvent,"buildPerfFindingEvent");function buildPerfRetractedEvent(r,e,t,s,n,i=makeId){return envelope(e,n,"info",perfRuleFingerprint(r,e,t),`${r}: cleared for ${e} (${t})`,{kind:"perf-rule-retracted",rule:r,project:e,subject:t,reason:s,at:n},i)}l(buildPerfRetractedEvent,"buildPerfRetractedEvent"),o(buildPerfRetractedEvent,"buildPerfRetractedEvent"),u(buildPerfRetractedEvent,"buildPerfRetractedEvent");function buildPerfScanEvent(r,e,t,s,n=makeId,i){return envelope(e,s,"info",perfRuleScanFingerprint(r,e),`${r}: scanned ${e} \u2014 ${t.length} open`,{kind:"perf-rule-scan",rule:r,project:e,open:t,at:s,...i!==void 0?{elapsedMs:i}:{}},n)}l(buildPerfScanEvent,"buildPerfScanEvent"),o(buildPerfScanEvent,"buildPerfScanEvent"),u(buildPerfScanEvent,"buildPerfScanEvent");function createPerfRulePublisher(r,e){if(!r)return{publish:u(()=>!1,"publish")};const t=e??(()=>{try{return require("@lensmcp/node-instrumentation")}catch{return}})(),s=t?.createEventFloodGuard({burst:30,perSec:5});let n=!1;return{publish(i){const p=s?.admit(i.fingerprint)??{ok:!0,suppressed:0};if(!p.ok)return!1;const a=JSON.stringify(p.suppressed>0?{...i,raw:{...i.raw,floodSuppressed:p.suppressed}}:i)+`
2
+ `;try{return n||(fs.mkdirSync(path.dirname(r),{recursive:!0}),n=!0),t?.maybeRotateEventFile(r,a.length),fs.appendFileSync(r,a),!0}catch{return n=!1,!1}}}}l(createPerfRulePublisher,"createPerfRulePublisher"),o(createPerfRulePublisher,"createPerfRulePublisher"),u(createPerfRulePublisher,"createPerfRulePublisher");
@@ -1 +1 @@
1
- "use strict";var u=Object.defineProperty;var l=(e,t)=>u(e,"name",{value:t,configurable:!0});var c=Object.defineProperty,i=l((e,t)=>c(e,"name",{value:t,configurable:!0}),"i");Object.defineProperty(exports,"__esModule",{value:!0}),exports.fileReader=fileReader,exports.runBarrelAnalysis=runBarrelAnalysis,exports.runBarrelAnalysisOffThread=runBarrelAnalysisOffThread;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),node_worker_threads_1=require("node:worker_threads"),heavy_barrel_import_1=require("./heavy-barrel-import"),workspace_libraries_1=require("./workspace-libraries"),MAX_SOURCE_BYTES=1024*1024;function fileReader(){const e=new Map,t=new Map;return{read(r){if(e.has(r))return e.get(r);let s;try{fs.statSync(r).size<=MAX_SOURCE_BYTES&&(s=fs.readFileSync(r,"utf8"))}catch{s=void 0}return e.set(r,s),s},exists(r){let s=t.get(r);if(s===void 0){try{s=fs.statSync(r).isFile()}catch{s=!1}t.set(r,s)}return s}}}l(fileReader,"fileReader"),i(fileReader,"fileReader");function runBarrelAnalysis(e,t="main"){const r=Date.now(),s=r+e.budgetMs;try{const a=(0,workspace_libraries_1.discoverWorkspaceLibraries)(e.workspaceRoot,{tsConfig:e.tsConfig}),n=(0,heavy_barrel_import_1.analyzeBarrelImports)({workspaceRoot:e.workspaceRoot,libraries:a,projects:e.projects,thresholds:e.thresholds,source:fileReader(),expired:i(()=>Date.now()>s,"expired")});return{complete:n.complete,measurements:n.measurements,elapsedMs:Date.now()-r,thread:t}}catch(a){return{complete:!1,measurements:[],elapsedMs:Date.now()-r,error:a?.message??String(a),thread:t}}}l(runBarrelAnalysis,"runBarrelAnalysis"),i(runBarrelAnalysis,"runBarrelAnalysis");function workerScript(){const e=path.join(__dirname,"perf-rules-worker.js");if(fs.existsSync(e))return{file:e,eval:!1};const t=path.join(__dirname,"perf-rules-worker.ts");if(fs.existsSync(t))try{const r=require.resolve("@swc-node/register");return{file:`require(${JSON.stringify(r)}); require(${JSON.stringify(t)});`,eval:!0}}catch{return}}l(workerScript,"workerScript"),i(workerScript,"workerScript");function runBarrelAnalysisOffThread(e){const t=workerScript();return t?new Promise(r=>{let s=!1;const a=i(o=>{s||(s=!0,r(o))},"settle");let n;try{n=new node_worker_threads_1.Worker(t.file,{eval:t.eval,workerData:e})}catch{a(runBarrelAnalysis(e,"main"));return}n.unref(),n.once("message",o=>a(o)),n.once("error",o=>a({complete:!1,measurements:[],elapsedMs:0,error:o.message,thread:"worker"})),n.once("exit",o=>a({complete:!1,measurements:[],elapsedMs:0,error:`the analysis worker exited (${o}) without an answer`,thread:"worker"}))}):Promise.resolve(runBarrelAnalysis(e,"main"))}l(runBarrelAnalysisOffThread,"runBarrelAnalysisOffThread"),i(runBarrelAnalysisOffThread,"runBarrelAnalysisOffThread");
1
+ "use strict";var p=Object.defineProperty;var d=(e,r)=>p(e,"name",{value:r,configurable:!0});var u=Object.defineProperty,l=d((e,r)=>u(e,"name",{value:r,configurable:!0}),"l"),c=Object.defineProperty,i=l((e,r)=>c(e,"name",{value:r,configurable:!0}),"i");Object.defineProperty(exports,"__esModule",{value:!0}),exports.fileReader=fileReader,exports.runBarrelAnalysis=runBarrelAnalysis,exports.runBarrelAnalysisOffThread=runBarrelAnalysisOffThread;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),node_worker_threads_1=require("node:worker_threads"),heavy_barrel_import_1=require("./heavy-barrel-import"),workspace_libraries_1=require("./workspace-libraries"),MAX_SOURCE_BYTES=1024*1024;function fileReader(){const e=new Map,r=new Map;return{read(t){if(e.has(t))return e.get(t);let s;try{fs.statSync(t).size<=MAX_SOURCE_BYTES&&(s=fs.readFileSync(t,"utf8"))}catch{s=void 0}return e.set(t,s),s},exists(t){let s=r.get(t);if(s===void 0){try{s=fs.statSync(t).isFile()}catch{s=!1}r.set(t,s)}return s}}}d(fileReader,"fileReader"),l(fileReader,"fileReader"),i(fileReader,"fileReader");function runBarrelAnalysis(e,r="main"){const t=Date.now(),s=t+e.budgetMs;try{const a=(0,workspace_libraries_1.discoverWorkspaceLibraries)(e.workspaceRoot,{tsConfig:e.tsConfig}),n=(0,heavy_barrel_import_1.analyzeBarrelImports)({workspaceRoot:e.workspaceRoot,libraries:a,projects:e.projects,thresholds:e.thresholds,source:fileReader(),expired:i(()=>Date.now()>s,"expired")});return{complete:n.complete,measurements:n.measurements,elapsedMs:Date.now()-t,thread:r}}catch(a){return{complete:!1,measurements:[],elapsedMs:Date.now()-t,error:a?.message??String(a),thread:r}}}d(runBarrelAnalysis,"runBarrelAnalysis"),l(runBarrelAnalysis,"runBarrelAnalysis"),i(runBarrelAnalysis,"runBarrelAnalysis");function workerScript(){const e=path.join(__dirname,"perf-rules-worker.js");if(fs.existsSync(e))return{file:e,eval:!1};const r=path.join(__dirname,"perf-rules-worker.ts");if(fs.existsSync(r))try{const t=require.resolve("@swc-node/register");return{file:`require(${JSON.stringify(t)}); require(${JSON.stringify(r)});`,eval:!0}}catch{return}}d(workerScript,"workerScript"),l(workerScript,"workerScript"),i(workerScript,"workerScript");function runBarrelAnalysisOffThread(e){const r=workerScript();return r?new Promise(t=>{let s=!1;const a=i(o=>{s||(s=!0,t(o))},"settle");let n;try{n=new node_worker_threads_1.Worker(r.file,{eval:r.eval,workerData:e})}catch{a(runBarrelAnalysis(e,"main"));return}n.unref(),n.once("message",o=>a(o)),n.once("error",o=>a({complete:!1,measurements:[],elapsedMs:0,error:o.message,thread:"worker"})),n.once("exit",o=>a({complete:!1,measurements:[],elapsedMs:0,error:`the analysis worker exited (${o}) without an answer`,thread:"worker"}))}):Promise.resolve(runBarrelAnalysis(e,"main"))}d(runBarrelAnalysisOffThread,"runBarrelAnalysisOffThread"),l(runBarrelAnalysisOffThread,"runBarrelAnalysisOffThread"),i(runBarrelAnalysisOffThread,"runBarrelAnalysisOffThread");
@@ -1 +1 @@
1
- "use strict";var E=Object.defineProperty;var g=(l,e)=>E(l,"name",{value:e,configurable:!0});var _=Object.defineProperty,p=g((l,e)=>_(l,"name",{value:e,configurable:!0}),"p");Object.defineProperty(exports,"__esModule",{value:!0}),exports.PerfRulesPlugin=void 0;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),heavy_barrel_import_1=require("./heavy-barrel-import"),perf_config_1=require("./perf-config"),perf_rule_events_1=require("./perf-rule-events"),perf_rules_analysis_1=require("./perf-rules-analysis"),NAME="LensmcpPerfRulesPlugin",DEFAULT_DELAY_MS=1e3;function fnv(l){let e=2166136261;for(let t=0;t<l.length;t++)e^=l.charCodeAt(t),e=Math.imul(e,16777619);return e>>>0}g(fnv,"fnv"),p(fnv,"fnv");const resourceOf=p(l=>{if(typeof l.resource!="string"||!l.resource)return;const e=l.resource.search(/[?#]/);return e===-1?l.resource:l.resource.slice(0,e)},"resourceOf");class PerfRulesPlugin{static{g(this,"PerfRulesPlugin")}static{p(this,"PerfRulesPlugin")}constructor(e){this.options=e,this.signatures=new Map,this.open=new Map,this.logged=new Map,this.pending=new Map,this.closed=!1;const t=e.env??process.env;this.settings=(0,perf_config_1.resolveBundleRuleSettings)(e.workspaceRoot,t),this.publisher=e.publisher??(0,perf_rule_events_1.createPerfRulePublisher)(e.eventFile??(t.LENSMCP_EVENT_FILE||path.join(e.workspaceRoot,".lensmcp","events.jsonl"))),this.now=e.now??Date.now,this.log=e.log??(s=>console.log(s))}apply(e){if(!this.settings.enabled)return;const t=new WeakMap;e.hooks.thisCompilation.tap(NAME,s=>{t.set(s,0),s.hooks.buildModule.tap(NAME,()=>t.set(s,(t.get(s)??0)+1))}),e.hooks.done.tap(NAME,s=>{try{if(s.hasErrors())return;const i=s.compilation,o={durationMs:Math.max(0,(s.endTime??0)-(s.startTime??0)),builtModules:t.get(i)??0};this.collect(i,o)}catch{}}),e.hooks.watchClose?.tap(NAME,()=>{this.closed=!0,this.timer&&clearTimeout(this.timer),this.timer=void 0,this.pending.clear()})}projectModules(e){const t=new Map,s=typeof this.options.entries=="function"?this.options.entries():this.options.entries;if(!s)return t.set(this.options.project,e.modules),t;const i=new Map;for(const[o,r]of Object.entries(s)){const c=e.entrypoints?.get(o);if(!c)continue;const h=i.get(r)??new Set;for(const u of c.chunks??[])for(const n of e.chunkGraph.getChunkModulesIterable(u))h.add(n);i.set(r,h)}for(const[o,r]of i)t.set(o,r);return t}collect(e,t){t.builtModules>=50&&(this.estimateBasis=t);let s=!1;for(const[i,o]of this.projectModules(e)){let r=0,c=0,h=0;const u=[];for(const a of o){const f=resourceOf(a);if(!f)continue;const d=fnv(f);r=r+d>>>0,c=(c^Math.imul(d,2654435761))>>>0,h++,u.push(a)}const n=`${h}:${r.toString(36)}:${c.toString(36)}`;if(this.signatures.get(i)===n)continue;this.signatures.set(i,n);const j=e.moduleGraph,M=u.map(a=>{const f=new Set;for(const m of j.getOutgoingConnections(a)){const b=m.module?resourceOf(m.module):void 0;b&&f.add(b)}let d;try{d=typeof a.size=="function"?a.size():0}catch{d=0}return{resource:resourceOf(a),size:d,dependencies:[...f]}});this.pending.set(i,{modules:M,compile:t}),s=!0}s&&this.schedule()}schedule(){this.timer&&clearTimeout(this.timer),this.timer=setTimeout(()=>{this.timer=void 0,this.analyzeOffThread()},this.options.delayMs??DEFAULT_DELAY_MS),this.timer.unref?.()}takeJob(){if(this.pending.size===0)return;const e=[...this.pending].map(([t,s])=>({project:t,modules:s.modules,compile:s.compile}));return this.pending.clear(),{workspaceRoot:this.options.workspaceRoot,tsConfig:this.options.tsConfig,projects:e,thresholds:this.settings.thresholds,budgetMs:this.settings.budgetMs}}analyze(){const e=this.takeJob();return e?this.conclude(e,(0,perf_rules_analysis_1.runBarrelAnalysis)(e,"main")):void 0}analyzeOffThread(){if(this.running)return this.running.then(()=>this.analyzeOffThread());const e=this.takeJob();if(!e)return Promise.resolve(void 0);const t=(0,perf_rules_analysis_1.runBarrelAnalysisOffThread)(e).then(s=>this.closed?void 0:this.conclude(e,s)).finally(()=>{this.running=void 0,this.pending.size>0&&!this.closed&&!this.timer&&this.schedule()});return this.running=t,t}conclude(e,t){const{projects:s}=e;if(t.error){this.log(`[perf-rules] analysis failed: ${t.error}`);for(const o of s)this.signatures.delete(o.project);return}const i={complete:t.complete,elapsedMs:t.elapsedMs,thread:t.thread,measurements:t.measurements,open:{},published:0};if(!t.complete){this.log(`[perf-rules] ${s.map(o=>o.project).join(", ")}: the analysis ran past its ${this.settings.budgetMs} ms budget \u2014 nothing concluded (LENSMCP_PERF_RULES_BUDGET_MS)`);for(const o of s)this.signatures.delete(o.project);return this.options.onAnalysis?.(i),i}try{for(const o of s)i.published+=this.publishProject(o,t.measurements.filter(r=>r.project===o.project&&r.fires),i)}catch(o){this.log(`[perf-rules] publishing failed: ${o?.message??String(o)}`);for(const r of s)this.signatures.delete(r.project);return}return this.options.onAnalysis?.(i),i}publishProject(e,t,s){const i=this.now(),o=this.open.get(e.project)??new Set,r=new Set,c=this.logged.get(e.project)??new Map;let h=0;for(const u of t){const n=(0,heavy_barrel_import_1.describeHeavyBarrel)(u,e.compile.builtModules>=50?e.compile:this.estimateBasis);r.add(n.subject),this.publisher.publish((0,perf_rule_events_1.buildPerfFindingEvent)(e.project,{...n,rule:heavy_barrel_import_1.HEAVY_BARREL_RULE,docs:`${perf_rule_events_1.PERF_RULES_DOC}#bundleheavy-barrel-import`},i))&&h++,c.get(n.subject)!==n.title&&(c.set(n.subject,n.title),this.log(`[perf-rules] ${heavy_barrel_import_1.HEAVY_BARREL_RULE}: ${n.title} \u2014 ${n.cost.modules} modules (${(n.cost.bytes/(1024*1024)).toFixed(1)} MB) compiled for nothing; import ${n.subject} by subpath (the files and lines: perf://rules)`))}for(const u of o)r.has(u)||(this.publisher.publish((0,perf_rule_events_1.buildPerfRetractedEvent)(heavy_barrel_import_1.HEAVY_BARREL_RULE,e.project,u,"cleared",i))&&h++,c.delete(u),this.log(`[perf-rules] ${heavy_barrel_import_1.HEAVY_BARREL_RULE}: cleared for ${e.project} \u2014 it no longer compiles ${u} through its root barrel`));return(!this.open.has(e.project)||o.size>0||r.size>0)&&this.publisher.publish((0,perf_rule_events_1.buildPerfScanEvent)(heavy_barrel_import_1.HEAVY_BARREL_RULE,e.project,[...r].sort(),i,void 0,s.elapsedMs))&&h++,this.open.set(e.project,r),this.logged.set(e.project,c),s.open[e.project]=[...r].sort(),h}}exports.PerfRulesPlugin=PerfRulesPlugin;
1
+ "use strict";var R=Object.defineProperty;var m=(n,e)=>R(n,"name",{value:e,configurable:!0});var E=Object.defineProperty,g=m((n,e)=>E(n,"name",{value:e,configurable:!0}),"g"),_=Object.defineProperty,p=g((n,e)=>_(n,"name",{value:e,configurable:!0}),"p");Object.defineProperty(exports,"__esModule",{value:!0}),exports.PerfRulesPlugin=void 0;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),heavy_barrel_import_1=require("./heavy-barrel-import"),perf_config_1=require("./perf-config"),perf_rule_events_1=require("./perf-rule-events"),perf_rules_analysis_1=require("./perf-rules-analysis"),NAME="LensmcpPerfRulesPlugin",DEFAULT_DELAY_MS=1e3;function fnv(n){let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619);return e>>>0}m(fnv,"fnv"),g(fnv,"fnv"),p(fnv,"fnv");const resourceOf=p(n=>{if(typeof n.resource!="string"||!n.resource)return;const e=n.resource.search(/[?#]/);return e===-1?n.resource:n.resource.slice(0,e)},"resourceOf");class PerfRulesPlugin{static{m(this,"PerfRulesPlugin")}static{g(this,"PerfRulesPlugin")}static{p(this,"PerfRulesPlugin")}constructor(e){this.options=e,this.signatures=new Map,this.open=new Map,this.logged=new Map,this.pending=new Map,this.closed=!1;const t=e.env??process.env;this.settings=(0,perf_config_1.resolveBundleRuleSettings)(e.workspaceRoot,t),this.publisher=e.publisher??(0,perf_rule_events_1.createPerfRulePublisher)(e.eventFile??(t.LENSMCP_EVENT_FILE||path.join(e.workspaceRoot,".lensmcp","events.jsonl"))),this.now=e.now??Date.now,this.log=e.log??(s=>console.log(s))}apply(e){if(!this.settings.enabled)return;const t=new WeakMap;e.hooks.thisCompilation.tap(NAME,s=>{t.set(s,0),s.hooks.buildModule.tap(NAME,()=>t.set(s,(t.get(s)??0)+1))}),e.hooks.done.tap(NAME,s=>{try{if(s.hasErrors())return;const i=s.compilation,o={durationMs:Math.max(0,(s.endTime??0)-(s.startTime??0)),builtModules:t.get(i)??0};this.collect(i,o)}catch{}}),e.hooks.watchClose?.tap(NAME,()=>{this.closed=!0,this.timer&&clearTimeout(this.timer),this.timer=void 0,this.pending.clear()})}projectModules(e){const t=new Map,s=typeof this.options.entries=="function"?this.options.entries():this.options.entries;if(!s)return t.set(this.options.project,e.modules),t;const i=new Map;for(const[o,r]of Object.entries(s)){const c=e.entrypoints?.get(o);if(!c)continue;const h=i.get(r)??new Set;for(const u of c.chunks??[])for(const l of e.chunkGraph.getChunkModulesIterable(u))h.add(l);i.set(r,h)}for(const[o,r]of i)t.set(o,r);return t}collect(e,t){t.builtModules>=50&&(this.estimateBasis=t);let s=!1;for(const[i,o]of this.projectModules(e)){let r=0,c=0,h=0;const u=[];for(const a of o){const f=resourceOf(a);if(!f)continue;const d=fnv(f);r=r+d>>>0,c=(c^Math.imul(d,2654435761))>>>0,h++,u.push(a)}const l=`${h}:${r.toString(36)}:${c.toString(36)}`;if(this.signatures.get(i)===l)continue;this.signatures.set(i,l);const M=e.moduleGraph,v=u.map(a=>{const f=new Set;for(const b of M.getOutgoingConnections(a)){const j=b.module?resourceOf(b.module):void 0;j&&f.add(j)}let d;try{d=typeof a.size=="function"?a.size():0}catch{d=0}return{resource:resourceOf(a),size:d,dependencies:[...f]}});this.pending.set(i,{modules:v,compile:t}),s=!0}s&&this.schedule()}schedule(){this.timer&&clearTimeout(this.timer),this.timer=setTimeout(()=>{this.timer=void 0,this.analyzeOffThread()},this.options.delayMs??DEFAULT_DELAY_MS),this.timer.unref?.()}takeJob(){if(this.pending.size===0)return;const e=[...this.pending].map(([t,s])=>({project:t,modules:s.modules,compile:s.compile}));return this.pending.clear(),{workspaceRoot:this.options.workspaceRoot,tsConfig:this.options.tsConfig,projects:e,thresholds:this.settings.thresholds,budgetMs:this.settings.budgetMs}}analyze(){const e=this.takeJob();return e?this.conclude(e,(0,perf_rules_analysis_1.runBarrelAnalysis)(e,"main")):void 0}analyzeOffThread(){if(this.running)return this.running.then(()=>this.analyzeOffThread());const e=this.takeJob();if(!e)return Promise.resolve(void 0);const t=(0,perf_rules_analysis_1.runBarrelAnalysisOffThread)(e).then(s=>this.closed?void 0:this.conclude(e,s)).finally(()=>{this.running=void 0,this.pending.size>0&&!this.closed&&!this.timer&&this.schedule()});return this.running=t,t}conclude(e,t){const{projects:s}=e;if(t.error){this.log(`[perf-rules] analysis failed: ${t.error}`);for(const o of s)this.signatures.delete(o.project);return}const i={complete:t.complete,elapsedMs:t.elapsedMs,thread:t.thread,measurements:t.measurements,open:{},published:0};if(!t.complete){this.log(`[perf-rules] ${s.map(o=>o.project).join(", ")}: the analysis ran past its ${this.settings.budgetMs} ms budget \u2014 nothing concluded (LENSMCP_PERF_RULES_BUDGET_MS)`);for(const o of s)this.signatures.delete(o.project);return this.options.onAnalysis?.(i),i}try{for(const o of s)i.published+=this.publishProject(o,t.measurements.filter(r=>r.project===o.project&&r.fires),i)}catch(o){this.log(`[perf-rules] publishing failed: ${o?.message??String(o)}`);for(const r of s)this.signatures.delete(r.project);return}return this.options.onAnalysis?.(i),i}publishProject(e,t,s){const i=this.now(),o=this.open.get(e.project)??new Set,r=new Set,c=this.logged.get(e.project)??new Map;let h=0;for(const u of t){const l=(0,heavy_barrel_import_1.describeHeavyBarrel)(u,e.compile.builtModules>=50?e.compile:this.estimateBasis);r.add(l.subject),this.publisher.publish((0,perf_rule_events_1.buildPerfFindingEvent)(e.project,{...l,rule:heavy_barrel_import_1.HEAVY_BARREL_RULE,docs:`${perf_rule_events_1.PERF_RULES_DOC}#bundleheavy-barrel-import`},i))&&h++,c.get(l.subject)!==l.title&&(c.set(l.subject,l.title),this.log(`[perf-rules] ${heavy_barrel_import_1.HEAVY_BARREL_RULE}: ${l.title} \u2014 ${l.cost.modules} modules (${(l.cost.bytes/(1024*1024)).toFixed(1)} MB) compiled for nothing; import ${l.subject} by subpath (the files and lines: perf://rules)`))}for(const u of o)r.has(u)||(this.publisher.publish((0,perf_rule_events_1.buildPerfRetractedEvent)(heavy_barrel_import_1.HEAVY_BARREL_RULE,e.project,u,"cleared",i))&&h++,c.delete(u),this.log(`[perf-rules] ${heavy_barrel_import_1.HEAVY_BARREL_RULE}: cleared for ${e.project} \u2014 it no longer compiles ${u} through its root barrel`));return(!this.open.has(e.project)||o.size>0||r.size>0)&&this.publisher.publish((0,perf_rule_events_1.buildPerfScanEvent)(heavy_barrel_import_1.HEAVY_BARREL_RULE,e.project,[...r].sort(),i,void 0,s.elapsedMs))&&h++,this.open.set(e.project,r),this.logged.set(e.project,c),s.open[e.project]=[...r].sort(),h}}exports.PerfRulesPlugin=PerfRulesPlugin;
@@ -1,5 +1,5 @@
1
- "use strict";var y=Object.defineProperty;var d=(o,r)=>y(o,"name",{value:r,configurable:!0});var u=Object.defineProperty,m=d((o,r)=>u(o,"name",{value:r,configurable:!0}),"m");Object.defineProperty(exports,"__esModule",{value:!0}),exports.blankComments=blankComments,exports.scanImports=scanImports,exports.scanExports=scanExports;const KEYWORDS_BEFORE_REGEX=new Set(["return","typeof","case","do","else","in","of","void","delete","throw","new","yield","await","instanceof"]),PUNCT_BEFORE_REGEX=new Set(["(",",","=",":","[","!","&","|","?","{","}",";","+","-","*","%","<",">","~","^"]);function regexAllowedAt(o,r){let s=r-1;for(;s>=0&&(o[s]===" "||o[s]===" "||o[s]===`
2
- `||o[s]==="\r");)s--;if(s<0)return!0;const a=o[s];if(PUNCT_BEFORE_REGEX.has(a))return!0;if(!/[\w$]/.test(a))return!1;let l=s;for(;l>0&&/[\w$]/.test(o[l-1]);)l--;return KEYWORDS_BEFORE_REGEX.has(o.slice(l,s+1))}d(regexAllowedAt,"regexAllowedAt"),m(regexAllowedAt,"regexAllowedAt");function stringEnd(o,r){const s=o[r];let a=r+1;for(;a<o.length&&o[a]!==s;){if(o[a]==="\\")a++;else if(s!=="`"&&o[a]===`
3
- `)return a;a++}return Math.min(a+1,o.length)}d(stringEnd,"stringEnd"),m(stringEnd,"stringEnd");function regexEnd(o,r){let s=r+1,a=!1;for(;s<o.length&&o[s]!==`
4
- `;){const l=o[s];if(l==="\\")s++;else if(l==="[")a=!0;else if(l==="]")a=!1;else if(l==="/"&&!a)return s+1;s++}return s}d(regexEnd,"regexEnd"),m(regexEnd,"regexEnd");function blankComments(o){const r=[],s=/[/"'`]/g;let a=0,l=0;for(;;){s.lastIndex=l;const t=s.exec(o);if(!t)break;const c=t.index;if(o[c]!=="/"){l=stringEnd(o,c);continue}const e=o[c+1];if(e==="/"||e==="*"){const n=e==="/"?o.indexOf(`
5
- `,c):o.indexOf("*/",c+2),i=n===-1?o.length:e==="/"?n:n+2;r.push(o.slice(a,c),o.slice(c,i).replace(/[^\n]/g," ")),a=l=i;continue}l=regexAllowedAt(o,c)?regexEnd(o,c):c+1}return r.push(o.slice(a)),r.join("")}d(blankComments,"blankComments"),m(blankComments,"blankComments");const SPEC=String.raw`['"]([^'"\n]+)['"]`,IMPORT_NAMED=new RegExp(String.raw`\bimport\s+(type\s+)?(?:([\w$]+)\s*,\s*)?\{([^}]*)\}\s*from\s*${SPEC}`,"g"),IMPORT_NAMESPACE=new RegExp(String.raw`\bimport\s+(type\s+)?(?:([\w$]+)\s*,\s*)?\*\s*as\s+([\w$]+)\s+from\s*${SPEC}`,"g"),IMPORT_DEFAULT=new RegExp(String.raw`\bimport\s+(type\s+)?([\w$]+)\s+from\s*${SPEC}`,"g"),IMPORT_EQUALS=new RegExp(String.raw`\bimport\s+(type\s+)?([\w$]+)\s*=\s*require\s*\(\s*${SPEC}\s*\)`,"g"),IMPORT_BARE=new RegExp(String.raw`\bimport\s*${SPEC}`,"g"),EXPORT_FROM=new RegExp(String.raw`\bexport\s+(type\s+)?\{([^}]*)\}\s*from\s*${SPEC}`,"g"),EXPORT_STAR=new RegExp(String.raw`\bexport\s+(type\s+)?\*\s*(?:as\s+([\w$]+)\s+)?from\s*${SPEC}`,"g"),DYNAMIC=new RegExp(String.raw`\b(?:require|import)\s*\(\s*${SPEC}\s*\)`,"g"),EXPORT_LOCAL=/\bexport\s+(type\s+)?\{([^}]*)\}(?!\s*from)/g,EXPORT_VALUE_DECL=/\bexport\s+(?:declare\s+)?(?:default\s+)?(?:async\s+)?(?:function\s*\*?\s*|(?:abstract\s+class|class|const\s+enum|enum|const|let|var)\s+)([\w$]+)/g,EXPORT_DESTRUCTURED=/\bexport\s+(?:declare\s+)?(?:const|let|var)\s+[{[]([^}\]]*)[}\]]/g,EXPORT_TYPE_DECL=/\bexport\s+(?:declare\s+)?(?:interface|type)\s+([\w$]+)/g,EXPORT_DEFAULT=/\bexport\s+default\b/,EXPORT_NAMESPACE_DECL=/\bexport\s+(?:declare\s+)?namespace\s+([\w$]+)/g;function parseSpecifiers(o,r){const s=[];for(const a of o.split(",")){const l=a.trim();if(!l)continue;const t=/^(type\s+)?([\w$]+)(?:\s+as\s+([\w$]+))?$/.exec(l);t&&s.push({imported:t[2],local:t[3]??t[2],typeOnly:r||!!t[1]})}return s}d(parseSpecifiers,"parseSpecifiers"),m(parseSpecifiers,"parseSpecifiers");function reEscape(o){return o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}d(reEscape,"reEscape"),m(reEscape,"reEscape");function scanImports(o,r){const s=blankComments(o),a=new Map,l=m(e=>{let n=a.get(e);return n||(n={specifier:e,names:[],wholeModule:!1,sideEffect:!1},a.set(e,n)),n},"of"),t=new Set,c=[];for(const e of s.matchAll(IMPORT_NAMED)){const n=e[4];if(t.add(e.index),!r(n))continue;const i=l(n),p=!!e[1];e[2]&&i.names.push({imported:"default",typeOnly:p});for(const f of parseSpecifiers(e[3],p))i.names.push({imported:f.imported,typeOnly:f.typeOnly})}for(const e of s.matchAll(IMPORT_NAMESPACE)){const n=e[4];if(t.add(e.index),!r(n))continue;const i=l(n);e[2]&&i.names.push({imported:"default",typeOnly:!!e[1]}),c.push({local:e[3],specifier:n,typeOnly:!!e[1]})}for(const e of s.matchAll(IMPORT_EQUALS)){const n=e[3];t.add(e.index),r(n)&&(l(n),c.push({local:e[2],specifier:n,typeOnly:!!e[1]}))}for(const e of s.matchAll(IMPORT_DEFAULT)){const n=e[3];t.add(e.index),r(n)&&l(n).names.push({imported:"default",typeOnly:!!e[1]})}for(const e of s.matchAll(EXPORT_FROM)){const n=e[3];if(!r(n))continue;const i=l(n);for(const p of parseSpecifiers(e[2],!!e[1]))i.names.push({imported:p.imported,typeOnly:p.typeOnly})}for(const e of s.matchAll(EXPORT_STAR)){const n=e[3];if(!r(n)||e[1])continue;const i=l(n);i.wholeModule=!0,i.sideEffect=!0}for(const e of s.matchAll(IMPORT_BARE)){if(t.has(e.index))continue;const n=e[1];r(n)&&(l(n).sideEffect=!0)}for(const e of s.matchAll(DYNAMIC)){const n=e[1];if(!r(n))continue;const i=s.slice(Math.max(0,e.index-64),e.index);/\bimport\s+(?:type\s+)?[\w$]+\s*=\s*$/.test(i)||(l(n).wholeModule=!0)}for(const e of c){const n=l(e.specifier),i=new RegExp(String.raw`(?<![\w$.])${reEscape(e.local)}\s*(\.|\?\.|\[)?\s*([\w$]+)?`,"g");let p=0;for(const f of s.matchAll(i)){if(f[1]==="."||f[1]==="?."){f[2]&&n.names.push({imported:f[2],typeOnly:e.typeOnly});continue}p++,p>1&&(n.wholeModule=!0)}}for(const e of a.values()){const n=new Set;e.names=e.names.filter(p=>{const f=`${p.imported}:${p.typeOnly}`;return n.has(f)?!1:(n.add(f),!0)});const i=new Set(e.names.filter(p=>!p.typeOnly).map(p=>p.imported));e.names=e.names.filter(p=>!p.typeOnly||!i.has(p.imported))}return[...a.values()]}d(scanImports,"scanImports"),m(scanImports,"scanImports");function scanExports(o){const r=blankComments(o),s={values:new Set,types:new Set,reexports:new Map,stars:[],namespaces:new Map,valueImports:[]},a=new Map,l=new Set;for(const t of r.matchAll(IMPORT_NAMED)){const c=!!t[1];t[2]&&a.set(t[2],{specifier:t[4],name:"default",typeOnly:c});const e=parseSpecifiers(t[3],c);for(const n of e)a.set(n.local,{specifier:t[4],name:n.imported,typeOnly:n.typeOnly});!c&&(t[2]||e.some(n=>!n.typeOnly))&&l.add(t[4])}for(const t of r.matchAll(IMPORT_NAMESPACE))a.set(t[3],{specifier:t[4],name:"*",typeOnly:!!t[1]}),t[1]||l.add(t[4]);for(const t of r.matchAll(IMPORT_EQUALS))a.set(t[2],{specifier:t[3],name:"*",typeOnly:!!t[1]}),t[1]||l.add(t[3]);for(const t of r.matchAll(IMPORT_DEFAULT))a.set(t[2],{specifier:t[3],name:"default",typeOnly:!!t[1]}),t[1]||l.add(t[3]);for(const t of r.matchAll(IMPORT_BARE))l.add(t[1]);for(const t of r.matchAll(DYNAMIC))l.add(t[1]);s.valueImports=[...l];for(const t of r.matchAll(EXPORT_VALUE_DECL))s.values.add(t[1]);for(const t of r.matchAll(EXPORT_DESTRUCTURED))for(const c of t[1].split(",")){const e=/([\w$]+)\s*(?:=.*)?$/.exec(c.split(":").pop().trim())?.[1];e&&s.values.add(e)}for(const t of r.matchAll(EXPORT_NAMESPACE_DECL))s.values.add(t[1]);for(const t of r.matchAll(EXPORT_TYPE_DECL))s.types.add(t[1]);EXPORT_DEFAULT.test(r)&&s.values.add("default");for(const t of r.matchAll(EXPORT_FROM))for(const c of parseSpecifiers(t[2],!!t[1]))s.reexports.set(c.local,{specifier:t[3],name:c.imported,typeOnly:c.typeOnly});for(const t of r.matchAll(EXPORT_STAR))t[1]||(t[2]?s.namespaces.set(t[2],t[3]):s.stars.push(t[3]));for(const t of r.matchAll(EXPORT_LOCAL))for(const c of parseSpecifiers(t[2],!!t[1])){const e=a.get(c.imported);e&&e.name==="*"?s.namespaces.set(c.local,e.specifier):e?s.reexports.set(c.local,{specifier:e.specifier,name:e.name,typeOnly:c.typeOnly||e.typeOnly}):c.typeOnly?s.types.add(c.local):s.values.add(c.local)}return s}d(scanExports,"scanExports"),m(scanExports,"scanExports");
1
+ "use strict";var w=Object.defineProperty;var E=(o,r)=>w(o,"name",{value:r,configurable:!0});var y=Object.defineProperty,d=E((o,r)=>y(o,"name",{value:r,configurable:!0}),"d"),u=Object.defineProperty,m=d((o,r)=>u(o,"name",{value:r,configurable:!0}),"m");Object.defineProperty(exports,"__esModule",{value:!0}),exports.blankComments=blankComments,exports.scanImports=scanImports,exports.scanExports=scanExports;const KEYWORDS_BEFORE_REGEX=new Set(["return","typeof","case","do","else","in","of","void","delete","throw","new","yield","await","instanceof"]),PUNCT_BEFORE_REGEX=new Set(["(",",","=",":","[","!","&","|","?","{","}",";","+","-","*","%","<",">","~","^"]);function regexAllowedAt(o,r){let s=r-1;for(;s>=0&&(o[s]===" "||o[s]===" "||o[s]===`
2
+ `||o[s]==="\r");)s--;if(s<0)return!0;const a=o[s];if(PUNCT_BEFORE_REGEX.has(a))return!0;if(!/[\w$]/.test(a))return!1;let c=s;for(;c>0&&/[\w$]/.test(o[c-1]);)c--;return KEYWORDS_BEFORE_REGEX.has(o.slice(c,s+1))}E(regexAllowedAt,"regexAllowedAt"),d(regexAllowedAt,"regexAllowedAt"),m(regexAllowedAt,"regexAllowedAt");function stringEnd(o,r){const s=o[r];let a=r+1;for(;a<o.length&&o[a]!==s;){if(o[a]==="\\")a++;else if(s!=="`"&&o[a]===`
3
+ `)return a;a++}return Math.min(a+1,o.length)}E(stringEnd,"stringEnd"),d(stringEnd,"stringEnd"),m(stringEnd,"stringEnd");function regexEnd(o,r){let s=r+1,a=!1;for(;s<o.length&&o[s]!==`
4
+ `;){const c=o[s];if(c==="\\")s++;else if(c==="[")a=!0;else if(c==="]")a=!1;else if(c==="/"&&!a)return s+1;s++}return s}E(regexEnd,"regexEnd"),d(regexEnd,"regexEnd"),m(regexEnd,"regexEnd");function blankComments(o){const r=[],s=/[/"'`]/g;let a=0,c=0;for(;;){s.lastIndex=c;const t=s.exec(o);if(!t)break;const l=t.index;if(o[l]!=="/"){c=stringEnd(o,l);continue}const e=o[l+1];if(e==="/"||e==="*"){const n=e==="/"?o.indexOf(`
5
+ `,l):o.indexOf("*/",l+2),i=n===-1?o.length:e==="/"?n:n+2;r.push(o.slice(a,l),o.slice(l,i).replace(/[^\n]/g," ")),a=c=i;continue}c=regexAllowedAt(o,l)?regexEnd(o,l):l+1}return r.push(o.slice(a)),r.join("")}E(blankComments,"blankComments"),d(blankComments,"blankComments"),m(blankComments,"blankComments");const SPEC=String.raw`['"]([^'"\n]+)['"]`,IMPORT_NAMED=new RegExp(String.raw`\bimport\s+(type\s+)?(?:([\w$]+)\s*,\s*)?\{([^}]*)\}\s*from\s*${SPEC}`,"g"),IMPORT_NAMESPACE=new RegExp(String.raw`\bimport\s+(type\s+)?(?:([\w$]+)\s*,\s*)?\*\s*as\s+([\w$]+)\s+from\s*${SPEC}`,"g"),IMPORT_DEFAULT=new RegExp(String.raw`\bimport\s+(type\s+)?([\w$]+)\s+from\s*${SPEC}`,"g"),IMPORT_EQUALS=new RegExp(String.raw`\bimport\s+(type\s+)?([\w$]+)\s*=\s*require\s*\(\s*${SPEC}\s*\)`,"g"),IMPORT_BARE=new RegExp(String.raw`\bimport\s*${SPEC}`,"g"),EXPORT_FROM=new RegExp(String.raw`\bexport\s+(type\s+)?\{([^}]*)\}\s*from\s*${SPEC}`,"g"),EXPORT_STAR=new RegExp(String.raw`\bexport\s+(type\s+)?\*\s*(?:as\s+([\w$]+)\s+)?from\s*${SPEC}`,"g"),DYNAMIC=new RegExp(String.raw`\b(?:require|import)\s*\(\s*${SPEC}\s*\)`,"g"),EXPORT_LOCAL=/\bexport\s+(type\s+)?\{([^}]*)\}(?!\s*from)/g,EXPORT_VALUE_DECL=/\bexport\s+(?:declare\s+)?(?:default\s+)?(?:async\s+)?(?:function\s*\*?\s*|(?:abstract\s+class|class|const\s+enum|enum|const|let|var)\s+)([\w$]+)/g,EXPORT_DESTRUCTURED=/\bexport\s+(?:declare\s+)?(?:const|let|var)\s+[{[]([^}\]]*)[}\]]/g,EXPORT_TYPE_DECL=/\bexport\s+(?:declare\s+)?(?:interface|type)\s+([\w$]+)/g,EXPORT_DEFAULT=/\bexport\s+default\b/,EXPORT_NAMESPACE_DECL=/\bexport\s+(?:declare\s+)?namespace\s+([\w$]+)/g;function parseSpecifiers(o,r){const s=[];for(const a of o.split(",")){const c=a.trim();if(!c)continue;const t=/^(type\s+)?([\w$]+)(?:\s+as\s+([\w$]+))?$/.exec(c);t&&s.push({imported:t[2],local:t[3]??t[2],typeOnly:r||!!t[1]})}return s}E(parseSpecifiers,"parseSpecifiers"),d(parseSpecifiers,"parseSpecifiers"),m(parseSpecifiers,"parseSpecifiers");function reEscape(o){return o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}E(reEscape,"reEscape"),d(reEscape,"reEscape"),m(reEscape,"reEscape");function scanImports(o,r){const s=blankComments(o),a=new Map,c=m(e=>{let n=a.get(e);return n||(n={specifier:e,names:[],wholeModule:!1,sideEffect:!1},a.set(e,n)),n},"of"),t=new Set,l=[];for(const e of s.matchAll(IMPORT_NAMED)){const n=e[4];if(t.add(e.index),!r(n))continue;const i=c(n),p=!!e[1];e[2]&&i.names.push({imported:"default",typeOnly:p});for(const f of parseSpecifiers(e[3],p))i.names.push({imported:f.imported,typeOnly:f.typeOnly})}for(const e of s.matchAll(IMPORT_NAMESPACE)){const n=e[4];if(t.add(e.index),!r(n))continue;const i=c(n);e[2]&&i.names.push({imported:"default",typeOnly:!!e[1]}),l.push({local:e[3],specifier:n,typeOnly:!!e[1]})}for(const e of s.matchAll(IMPORT_EQUALS)){const n=e[3];t.add(e.index),r(n)&&(c(n),l.push({local:e[2],specifier:n,typeOnly:!!e[1]}))}for(const e of s.matchAll(IMPORT_DEFAULT)){const n=e[3];t.add(e.index),r(n)&&c(n).names.push({imported:"default",typeOnly:!!e[1]})}for(const e of s.matchAll(EXPORT_FROM)){const n=e[3];if(!r(n))continue;const i=c(n);for(const p of parseSpecifiers(e[2],!!e[1]))i.names.push({imported:p.imported,typeOnly:p.typeOnly})}for(const e of s.matchAll(EXPORT_STAR)){const n=e[3];if(!r(n)||e[1])continue;const i=c(n);i.wholeModule=!0,i.sideEffect=!0}for(const e of s.matchAll(IMPORT_BARE)){if(t.has(e.index))continue;const n=e[1];r(n)&&(c(n).sideEffect=!0)}for(const e of s.matchAll(DYNAMIC)){const n=e[1];if(!r(n))continue;const i=s.slice(Math.max(0,e.index-64),e.index);/\bimport\s+(?:type\s+)?[\w$]+\s*=\s*$/.test(i)||(c(n).wholeModule=!0)}for(const e of l){const n=c(e.specifier),i=new RegExp(String.raw`(?<![\w$.])${reEscape(e.local)}\s*(\.|\?\.|\[)?\s*([\w$]+)?`,"g");let p=0;for(const f of s.matchAll(i)){if(f[1]==="."||f[1]==="?."){f[2]&&n.names.push({imported:f[2],typeOnly:e.typeOnly});continue}p++,p>1&&(n.wholeModule=!0)}}for(const e of a.values()){const n=new Set;e.names=e.names.filter(p=>{const f=`${p.imported}:${p.typeOnly}`;return n.has(f)?!1:(n.add(f),!0)});const i=new Set(e.names.filter(p=>!p.typeOnly).map(p=>p.imported));e.names=e.names.filter(p=>!p.typeOnly||!i.has(p.imported))}return[...a.values()]}E(scanImports,"scanImports"),d(scanImports,"scanImports"),m(scanImports,"scanImports");function scanExports(o){const r=blankComments(o),s={values:new Set,types:new Set,reexports:new Map,stars:[],namespaces:new Map,valueImports:[]},a=new Map,c=new Set;for(const t of r.matchAll(IMPORT_NAMED)){const l=!!t[1];t[2]&&a.set(t[2],{specifier:t[4],name:"default",typeOnly:l});const e=parseSpecifiers(t[3],l);for(const n of e)a.set(n.local,{specifier:t[4],name:n.imported,typeOnly:n.typeOnly});!l&&(t[2]||e.some(n=>!n.typeOnly))&&c.add(t[4])}for(const t of r.matchAll(IMPORT_NAMESPACE))a.set(t[3],{specifier:t[4],name:"*",typeOnly:!!t[1]}),t[1]||c.add(t[4]);for(const t of r.matchAll(IMPORT_EQUALS))a.set(t[2],{specifier:t[3],name:"*",typeOnly:!!t[1]}),t[1]||c.add(t[3]);for(const t of r.matchAll(IMPORT_DEFAULT))a.set(t[2],{specifier:t[3],name:"default",typeOnly:!!t[1]}),t[1]||c.add(t[3]);for(const t of r.matchAll(IMPORT_BARE))c.add(t[1]);for(const t of r.matchAll(DYNAMIC))c.add(t[1]);s.valueImports=[...c];for(const t of r.matchAll(EXPORT_VALUE_DECL))s.values.add(t[1]);for(const t of r.matchAll(EXPORT_DESTRUCTURED))for(const l of t[1].split(",")){const e=/([\w$]+)\s*(?:=.*)?$/.exec(l.split(":").pop().trim())?.[1];e&&s.values.add(e)}for(const t of r.matchAll(EXPORT_NAMESPACE_DECL))s.values.add(t[1]);for(const t of r.matchAll(EXPORT_TYPE_DECL))s.types.add(t[1]);EXPORT_DEFAULT.test(r)&&s.values.add("default");for(const t of r.matchAll(EXPORT_FROM))for(const l of parseSpecifiers(t[2],!!t[1]))s.reexports.set(l.local,{specifier:t[3],name:l.imported,typeOnly:l.typeOnly});for(const t of r.matchAll(EXPORT_STAR))t[1]||(t[2]?s.namespaces.set(t[2],t[3]):s.stars.push(t[3]));for(const t of r.matchAll(EXPORT_LOCAL))for(const l of parseSpecifiers(t[2],!!t[1])){const e=a.get(l.imported);e&&e.name==="*"?s.namespaces.set(l.local,e.specifier):e?s.reexports.set(l.local,{specifier:e.specifier,name:e.name,typeOnly:l.typeOnly||e.typeOnly}):l.typeOnly?s.types.add(l.local):s.values.add(l.local)}return s}E(scanExports,"scanExports"),d(scanExports,"scanExports"),m(scanExports,"scanExports");
@@ -1,2 +1,2 @@
1
- "use strict";var g=Object.defineProperty;var l=(t,e)=>g(t,"name",{value:e,configurable:!0});var y=Object.defineProperty,u=l((t,e)=>y(t,"name",{value:e,configurable:!0}),"u");Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseJsonc=parseJsonc,exports.readTsconfigPaths=readTsconfigPaths,exports.resolveSourceFile=resolveSourceFile,exports.countSourceFiles=countSourceFiles,exports.discoverWorkspaceLibraries=discoverWorkspaceLibraries,exports.libraryOf=libraryOf,exports.belongsTo=belongsTo;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),SOURCE_FILE=/\.(?:ts|tsx|mts|cts|js|jsx|mjs|cjs)$/,NOT_SOURCE=/(?:\.d\.[cm]?ts|\.(?:spec|test|stories|e2e-spec)\.[cm]?[jt]sx?)$/,SKIP_DIRS=new Set(["node_modules","dist","build","coverage",".git","__tests__","__mocks__","__fixtures__",".nx"]),RESOLVE_EXTENSIONS=["",".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"],INDEX_FILES=["index.ts","index.tsx","index.mts","index.js","index.mjs","index.cjs"];function parseJsonc(t){let e="",s=0;const o=t.length;for(;s<o;){const n=t[s];if(n==='"'){let r=s+1;for(;r<o&&t[r]!=='"';)t[r]==="\\"&&r++,r++;e+=t.slice(s,r+1),s=r+1;continue}if(n==="/"&&t[s+1]==="/"){const r=t.indexOf(`
2
- `,s);s=r===-1?o:r;continue}if(n==="/"&&t[s+1]==="*"){const r=t.indexOf("*/",s+2);s=r===-1?o:r+2;continue}e+=n,s++}try{return JSON.parse(e.replace(/,(\s*[}\]])/g,"$1"))}catch{return}}l(parseJsonc,"parseJsonc"),u(parseJsonc,"parseJsonc");function readJson(t){try{return parseJsonc(fs.readFileSync(t,"utf8"))}catch{return}}l(readJson,"readJson"),u(readJson,"readJson");function readTsconfigPaths(t){let e=t;const s=new Set;for(;e&&!s.has(e)&&s.size<8;){s.add(e);const o=readJson(e);if(!o)return;const n=o.compilerOptions?.paths;if(n&&typeof n=="object"){const f=path.resolve(path.dirname(e),o.compilerOptions?.baseUrl??"."),d=new Map;for(const[m,b]of Object.entries(n))Array.isArray(b)&&d.set(m,b.filter(i=>typeof i=="string").map(i=>path.resolve(f,i)));return d}const r=Array.isArray(o.extends)?o.extends[o.extends.length-1]:o.extends;e=r&&(r.startsWith(".")||path.isAbsolute(r))?path.resolve(path.dirname(e),r.endsWith(".json")?r:`${r}.json`):void 0}}l(readTsconfigPaths,"readTsconfigPaths"),u(readTsconfigPaths,"readTsconfigPaths");function resolveSourceFile(t,e=isFile){for(const o of RESOLVE_EXTENSIONS)if(o&&e(t+o))return t+o;if(e(t))return t;for(const o of INDEX_FILES){const n=path.join(t,o);if(e(n))return n}const s=/\.(c|m)?js$/.exec(t);if(s){const o=t.slice(0,-s[0].length);for(const n of[".ts",".tsx",".mts",".cts"])if(e(o+n))return o+n}}l(resolveSourceFile,"resolveSourceFile"),u(resolveSourceFile,"resolveSourceFile");function asDir(t){return t.endsWith(path.sep)?t:t+path.sep}l(asDir,"asDir"),u(asDir,"asDir");function isFile(t){try{return fs.statSync(t).isFile()}catch{return!1}}l(isFile,"isFile"),u(isFile,"isFile");function libraryRootOf(t,e){let s=path.dirname(t);for(;s.startsWith(e)&&s!==e;){if(isFile(path.join(s,"project.json"))||isFile(path.join(s,"package.json")))return s;const o=path.dirname(s);if(o===s)break;s=o}return path.dirname(t)}l(libraryRootOf,"libraryRootOf"),u(libraryRootOf,"libraryRootOf");function countSourceFiles(t,e){let s=0;const o=[t];for(;o.length&&s<e;){const n=o.pop();let r;try{r=fs.readdirSync(n,{withFileTypes:!0})}catch{continue}for(const f of r)if(f.isDirectory())!SKIP_DIRS.has(f.name)&&!f.name.startsWith(".")&&o.push(path.join(n,f.name));else if(f.isFile()&&SOURCE_FILE.test(f.name)&&!NOT_SOURCE.test(f.name)&&(s++,s>=e))break}return s}l(countSourceFiles,"countSourceFiles"),u(countSourceFiles,"countSourceFiles");function exportTarget(t,e){if(typeof t=="string")return resolveSourceFile(path.resolve(e,t));if(!t||typeof t!="object"||Array.isArray(t))return;const s=t,o=["source","development","require","import","node","default",...Object.keys(s)];for(const n of o){if(n==="types")continue;const r=exportTarget(s[n],e);if(r&&SOURCE_FILE.test(r)&&!/\.d\.[cm]?ts$/.test(r))return r}}l(exportTarget,"exportTarget"),u(exportTarget,"exportTarget");function packageEntries(t){const e=readJson(path.join(t.root,"package.json"))?.exports;if(!(!e||typeof e!="object"||Array.isArray(e)))for(const[s,o]of Object.entries(e)){if(!s.startsWith("./")||s==="./package.json")continue;const n=s.slice(2);if(n.includes("*")){const d=typeof o=="string"?o:void 0;d&&d.includes("*")&&n.endsWith("*")&&t.wildcards.push({prefix:`${t.name}/${n.slice(0,-1)}`,dir:asDir(path.resolve(t.root,d.slice(0,d.indexOf("*"))))});continue}const r=`${t.name}/${n}`;if(t.subpaths.some(d=>d.specifier===r))continue;const f=exportTarget(o,t.root);f&&t.subpaths.push({specifier:r,entry:f})}}l(packageEntries,"packageEntries"),u(packageEntries,"packageEntries");function discoverWorkspaceLibraries(t,e={}){const s=e.tsConfig??path.join(t,"tsconfig.base.json"),o=readTsconfigPaths(s)??(s.endsWith("tsconfig.base.json")?void 0:readTsconfigPaths(path.join(t,"tsconfig.base.json")));if(!o)return[];const n=new Map,r=[];for(const[i,p]of o){if(i.endsWith("/*")){const h=p.find(a=>a.endsWith("*"));h&&r.push({key:i.slice(0,-1),dir:asDir(h.slice(0,-1))});continue}if(!i.includes("*"))for(const h of p){const a=resolveSourceFile(h);if(a){n.set(i,a);break}}}const f=[...n.keys()],d=[];for(const[i,p]of n){if(p.includes(`${path.sep}node_modules${path.sep}`)||f.some(c=>c!==i&&i.startsWith(`${c}/`)))continue;const h=libraryRootOf(p,t),a={name:i,aliases:[],root:h,rootEntry:p,subpaths:f.filter(c=>c.startsWith(`${i}/`)).map(c=>({specifier:c,entry:n.get(c)})),wildcards:r.filter(c=>c.key.startsWith(`${i}/`)).map(c=>({prefix:c.key,dir:c.dir})),files:0};packageEntries(a),d.push(a)}const m=new Map;for(const i of d)m.set(i.rootEntry,[...m.get(i.rootEntry)??[],i]);const b=[];for(const i of m.values()){i.sort((a,c)=>c.subpaths.length+c.wildcards.length-(a.subpaths.length+a.wildcards.length)||a.name.length-c.name.length||a.name.localeCompare(c.name));const[p,...h]=i;for(const a of h)p.aliases.push(a.name),p.subpaths.push(...a.subpaths),p.wildcards.push(...a.wildcards);p.files=countSourceFiles(p.root,e.maxFilesPerLibrary??2e4),b.push(p)}return b}l(discoverWorkspaceLibraries,"discoverWorkspaceLibraries"),u(discoverWorkspaceLibraries,"discoverWorkspaceLibraries");function libraryOf(t,e){let s;for(const o of t)belongsTo(o,e)&&(!s||o.root.length>s.root.length)&&(s=o);return s}l(libraryOf,"libraryOf"),u(libraryOf,"libraryOf");function belongsTo(t,e){return e.startsWith(t.root+path.sep)&&!e.includes(`${path.sep}node_modules${path.sep}`)}l(belongsTo,"belongsTo"),u(belongsTo,"belongsTo");
1
+ "use strict";var x=Object.defineProperty;var p=(e,r)=>x(e,"name",{value:r,configurable:!0});var g=Object.defineProperty,l=p((e,r)=>g(e,"name",{value:r,configurable:!0}),"l"),y=Object.defineProperty,u=l((e,r)=>y(e,"name",{value:r,configurable:!0}),"u");Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseJsonc=parseJsonc,exports.readTsconfigPaths=readTsconfigPaths,exports.resolveSourceFile=resolveSourceFile,exports.countSourceFiles=countSourceFiles,exports.discoverWorkspaceLibraries=discoverWorkspaceLibraries,exports.libraryOf=libraryOf,exports.belongsTo=belongsTo;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),SOURCE_FILE=/\.(?:ts|tsx|mts|cts|js|jsx|mjs|cjs)$/,NOT_SOURCE=/(?:\.d\.[cm]?ts|\.(?:spec|test|stories|e2e-spec)\.[cm]?[jt]sx?)$/,SKIP_DIRS=new Set(["node_modules","dist","build","coverage",".git","__tests__","__mocks__","__fixtures__",".nx"]),RESOLVE_EXTENSIONS=["",".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"],INDEX_FILES=["index.ts","index.tsx","index.mts","index.js","index.mjs","index.cjs"];function parseJsonc(e){let r="",s=0;const t=e.length;for(;s<t;){const n=e[s];if(n==='"'){let o=s+1;for(;o<t&&e[o]!=='"';)e[o]==="\\"&&o++,o++;r+=e.slice(s,o+1),s=o+1;continue}if(n==="/"&&e[s+1]==="/"){const o=e.indexOf(`
2
+ `,s);s=o===-1?t:o;continue}if(n==="/"&&e[s+1]==="*"){const o=e.indexOf("*/",s+2);s=o===-1?t:o+2;continue}r+=n,s++}try{return JSON.parse(r.replace(/,(\s*[}\]])/g,"$1"))}catch{return}}p(parseJsonc,"parseJsonc"),l(parseJsonc,"parseJsonc"),u(parseJsonc,"parseJsonc");function readJson(e){try{return parseJsonc(fs.readFileSync(e,"utf8"))}catch{return}}p(readJson,"readJson"),l(readJson,"readJson"),u(readJson,"readJson");function readTsconfigPaths(e){let r=e;const s=new Set;for(;r&&!s.has(r)&&s.size<8;){s.add(r);const t=readJson(r);if(!t)return;const n=t.compilerOptions?.paths;if(n&&typeof n=="object"){const f=path.resolve(path.dirname(r),t.compilerOptions?.baseUrl??"."),h=new Map;for(const[b,j]of Object.entries(n))Array.isArray(j)&&h.set(b,j.filter(i=>typeof i=="string").map(i=>path.resolve(f,i)));return h}const o=Array.isArray(t.extends)?t.extends[t.extends.length-1]:t.extends;r=o&&(o.startsWith(".")||path.isAbsolute(o))?path.resolve(path.dirname(r),o.endsWith(".json")?o:`${o}.json`):void 0}}p(readTsconfigPaths,"readTsconfigPaths"),l(readTsconfigPaths,"readTsconfigPaths"),u(readTsconfigPaths,"readTsconfigPaths");function resolveSourceFile(e,r=isFile){for(const t of RESOLVE_EXTENSIONS)if(t&&r(e+t))return e+t;if(r(e))return e;for(const t of INDEX_FILES){const n=path.join(e,t);if(r(n))return n}const s=/\.(c|m)?js$/.exec(e);if(s){const t=e.slice(0,-s[0].length);for(const n of[".ts",".tsx",".mts",".cts"])if(r(t+n))return t+n}}p(resolveSourceFile,"resolveSourceFile"),l(resolveSourceFile,"resolveSourceFile"),u(resolveSourceFile,"resolveSourceFile");function asDir(e){return e.endsWith(path.sep)?e:e+path.sep}p(asDir,"asDir"),l(asDir,"asDir"),u(asDir,"asDir");function isFile(e){try{return fs.statSync(e).isFile()}catch{return!1}}p(isFile,"isFile"),l(isFile,"isFile"),u(isFile,"isFile");function libraryRootOf(e,r){let s=path.dirname(e);for(;s.startsWith(r)&&s!==r;){if(isFile(path.join(s,"project.json"))||isFile(path.join(s,"package.json")))return s;const t=path.dirname(s);if(t===s)break;s=t}return path.dirname(e)}p(libraryRootOf,"libraryRootOf"),l(libraryRootOf,"libraryRootOf"),u(libraryRootOf,"libraryRootOf");function countSourceFiles(e,r){let s=0;const t=[e];for(;t.length&&s<r;){const n=t.pop();let o;try{o=fs.readdirSync(n,{withFileTypes:!0})}catch{continue}for(const f of o)if(f.isDirectory())!SKIP_DIRS.has(f.name)&&!f.name.startsWith(".")&&t.push(path.join(n,f.name));else if(f.isFile()&&SOURCE_FILE.test(f.name)&&!NOT_SOURCE.test(f.name)&&(s++,s>=r))break}return s}p(countSourceFiles,"countSourceFiles"),l(countSourceFiles,"countSourceFiles"),u(countSourceFiles,"countSourceFiles");function exportTarget(e,r){if(typeof e=="string")return resolveSourceFile(path.resolve(r,e));if(!e||typeof e!="object"||Array.isArray(e))return;const s=e,t=["source","development","require","import","node","default",...Object.keys(s)];for(const n of t){if(n==="types")continue;const o=exportTarget(s[n],r);if(o&&SOURCE_FILE.test(o)&&!/\.d\.[cm]?ts$/.test(o))return o}}p(exportTarget,"exportTarget"),l(exportTarget,"exportTarget"),u(exportTarget,"exportTarget");function packageEntries(e){const r=readJson(path.join(e.root,"package.json"))?.exports;if(!(!r||typeof r!="object"||Array.isArray(r)))for(const[s,t]of Object.entries(r)){if(!s.startsWith("./")||s==="./package.json")continue;const n=s.slice(2);if(n.includes("*")){const h=typeof t=="string"?t:void 0;h&&h.includes("*")&&n.endsWith("*")&&e.wildcards.push({prefix:`${e.name}/${n.slice(0,-1)}`,dir:asDir(path.resolve(e.root,h.slice(0,h.indexOf("*"))))});continue}const o=`${e.name}/${n}`;if(e.subpaths.some(h=>h.specifier===o))continue;const f=exportTarget(t,e.root);f&&e.subpaths.push({specifier:o,entry:f})}}p(packageEntries,"packageEntries"),l(packageEntries,"packageEntries"),u(packageEntries,"packageEntries");function discoverWorkspaceLibraries(e,r={}){const s=r.tsConfig??path.join(e,"tsconfig.base.json"),t=readTsconfigPaths(s)??(s.endsWith("tsconfig.base.json")?void 0:readTsconfigPaths(path.join(e,"tsconfig.base.json")));if(!t)return[];const n=new Map,o=[];for(const[i,d]of t){if(i.endsWith("/*")){const m=d.find(a=>a.endsWith("*"));m&&o.push({key:i.slice(0,-1),dir:asDir(m.slice(0,-1))});continue}if(!i.includes("*"))for(const m of d){const a=resolveSourceFile(m);if(a){n.set(i,a);break}}}const f=[...n.keys()],h=[];for(const[i,d]of n){if(d.includes(`${path.sep}node_modules${path.sep}`)||f.some(c=>c!==i&&i.startsWith(`${c}/`)))continue;const m=libraryRootOf(d,e),a={name:i,aliases:[],root:m,rootEntry:d,subpaths:f.filter(c=>c.startsWith(`${i}/`)).map(c=>({specifier:c,entry:n.get(c)})),wildcards:o.filter(c=>c.key.startsWith(`${i}/`)).map(c=>({prefix:c.key,dir:c.dir})),files:0};packageEntries(a),h.push(a)}const b=new Map;for(const i of h)b.set(i.rootEntry,[...b.get(i.rootEntry)??[],i]);const j=[];for(const i of b.values()){i.sort((a,c)=>c.subpaths.length+c.wildcards.length-(a.subpaths.length+a.wildcards.length)||a.name.length-c.name.length||a.name.localeCompare(c.name));const[d,...m]=i;for(const a of m)d.aliases.push(a.name),d.subpaths.push(...a.subpaths),d.wildcards.push(...a.wildcards);d.files=countSourceFiles(d.root,r.maxFilesPerLibrary??2e4),j.push(d)}return j}p(discoverWorkspaceLibraries,"discoverWorkspaceLibraries"),l(discoverWorkspaceLibraries,"discoverWorkspaceLibraries"),u(discoverWorkspaceLibraries,"discoverWorkspaceLibraries");function libraryOf(e,r){let s;for(const t of e)belongsTo(t,r)&&(!s||t.root.length>s.root.length)&&(s=t);return s}p(libraryOf,"libraryOf"),l(libraryOf,"libraryOf"),u(libraryOf,"libraryOf");function belongsTo(e,r){return r.startsWith(e.root+path.sep)&&!r.includes(`${path.sep}node_modules${path.sep}`)}p(belongsTo,"belongsTo"),l(belongsTo,"belongsTo"),u(belongsTo,"belongsTo");
@@ -1,2 +1,2 @@
1
- "use strict";var u=Object.defineProperty;var i=(e,r)=>u(e,"name",{value:r,configurable:!0});var p=Object.defineProperty,n=i((e,r)=>p(e,"name",{value:r,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.buildPodMemoryEvent=buildPodMemoryEvent,exports.buildPodRetainedEvent=buildPodRetainedEvent,exports.buildPodReleasedEvent=buildPodReleasedEvent,exports.buildPodExitedEvent=buildPodExitedEvent,exports.createPodMemoryPublisher=createPodMemoryPublisher;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),pod_memory_1=require("./pod-memory"),MB=1024*1024,mb=n(e=>Math.round(e/MB),"mb");let idCounter=0;function makeId(){return idCounter=(idCounter+1)%65535,`${Date.now().toString(36)}${idCounter.toString(36)}${Math.random().toString(36).slice(2,8)}`}i(makeId,"makeId"),n(makeId,"makeId");function envelope(e,r,o,t,d,s,a){const l="pending";return{id:a(),sessionId:l,timestamp:r,source:"memory",category:"memory",severity:o,context:{sessionId:l,projectName:e.project},fingerprint:t,title:d,raw:{...s,project:e.project,service:e.service,pod:e.pod,pid:e.pid,podGeneration:e.podGeneration}}}i(envelope,"envelope"),n(envelope,"envelope");function buildPodMemoryEvent(e,r,o=makeId){return envelope(e,r.at,"info",`pod-memory:${e.project}`,`${e.service} pod #${e.pod}: ${mb(r.live)} MB live after GC (${r.trigger}, generation ${r.gen})`,{kind:"pod-memory",...r},o)}i(buildPodMemoryEvent,"buildPodMemoryEvent"),n(buildPodMemoryEvent,"buildPodMemoryEvent");function buildPodRetainedEvent(e,r,o,t=makeId){const d=envelope(e,o,"warning",`pod-memory-retained:${e.project}`,`${e.service} pod #${e.pod}: generation ${r.gen} still in memory ${(0,pod_memory_1.ageLabel)(r.ageMs)} after close`,{kind:"pod-memory-retained",...r},t);return d.message=`Its app was closed ${(0,pod_memory_1.ageLabel)(r.ageMs)} ago, ${r.swapsSinceClose} swap(s) and ${r.gcs} full GC(s) since, and ${r.alive.join(", ")} ${r.alive.length===1?"is":"are"} still alive: something still points into it.`,d}i(buildPodRetainedEvent,"buildPodRetainedEvent"),n(buildPodRetainedEvent,"buildPodRetainedEvent");function buildPodReleasedEvent(e,r,o,t=makeId){return envelope(e,o,"info",`pod-memory-retained:${e.project}`,r.reason==="pod-exited"?`${e.service} pod #${e.pod}: generation ${r.gen} went with its pod`:`${e.service} pod #${e.pod}: generation ${r.gen} was collected after all`,{kind:"pod-memory-released",...r},t)}i(buildPodReleasedEvent,"buildPodReleasedEvent"),n(buildPodReleasedEvent,"buildPodReleasedEvent");function buildPodExitedEvent(e,r,o,t=makeId){return envelope(e,o,"info",`pod-memory:${e.project}`,`${e.service} pod #${e.pod} exited`,{kind:"pod-memory-exited",code:r.code,signal:r.signal},t)}i(buildPodExitedEvent,"buildPodExitedEvent"),n(buildPodExitedEvent,"buildPodExitedEvent");function createPodMemoryPublisher(e,r){if(!e)return{publish:n(()=>!1,"publish")};const o=r??(()=>{try{return require("@lensmcp/node-instrumentation")}catch{return}})(),t=o?.createEventFloodGuard({burst:30,perSec:5});let d=!1;return{publish(s){const a=t?.admit(s.fingerprint)??{ok:!0,suppressed:0};if(!a.ok)return!1;const l=JSON.stringify(a.suppressed>0?{...s,raw:{...s.raw,floodSuppressed:a.suppressed}}:s)+`
2
- `;try{return d||(fs.mkdirSync(path.dirname(e),{recursive:!0}),d=!0),o?.maybeRotateEventFile(e,l.length),fs.appendFileSync(e,l),!0}catch{return d=!1,!1}}}}i(createPodMemoryPublisher,"createPodMemoryPublisher"),n(createPodMemoryPublisher,"createPodMemoryPublisher");
1
+ "use strict";var m=Object.defineProperty;var d=(e,t)=>m(e,"name",{value:t,configurable:!0});var u=Object.defineProperty,i=d((e,t)=>u(e,"name",{value:t,configurable:!0}),"i"),p=Object.defineProperty,n=i((e,t)=>p(e,"name",{value:t,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.buildPodMemoryEvent=buildPodMemoryEvent,exports.buildPodRetainedEvent=buildPodRetainedEvent,exports.buildPodReleasedEvent=buildPodReleasedEvent,exports.buildPodExitedEvent=buildPodExitedEvent,exports.createPodMemoryPublisher=createPodMemoryPublisher;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),pod_memory_1=require("./pod-memory"),MB=1024*1024,mb=n(e=>Math.round(e/MB),"mb");let idCounter=0;function makeId(){return idCounter=(idCounter+1)%65535,`${Date.now().toString(36)}${idCounter.toString(36)}${Math.random().toString(36).slice(2,8)}`}d(makeId,"makeId"),i(makeId,"makeId"),n(makeId,"makeId");function envelope(e,t,o,r,a,s,l){const c="pending";return{id:l(),sessionId:c,timestamp:t,source:"memory",category:"memory",severity:o,context:{sessionId:c,projectName:e.project},fingerprint:r,title:a,raw:{...s,project:e.project,service:e.service,pod:e.pod,pid:e.pid,podGeneration:e.podGeneration}}}d(envelope,"envelope"),i(envelope,"envelope"),n(envelope,"envelope");function buildPodMemoryEvent(e,t,o=makeId){return envelope(e,t.at,"info",`pod-memory:${e.project}`,`${e.service} pod #${e.pod}: ${mb(t.live)} MB live after GC (${t.trigger}, generation ${t.gen})`,{kind:"pod-memory",...t},o)}d(buildPodMemoryEvent,"buildPodMemoryEvent"),i(buildPodMemoryEvent,"buildPodMemoryEvent"),n(buildPodMemoryEvent,"buildPodMemoryEvent");function buildPodRetainedEvent(e,t,o,r=makeId){const a=envelope(e,o,"warning",`pod-memory-retained:${e.project}`,`${e.service} pod #${e.pod}: generation ${t.gen} still in memory ${(0,pod_memory_1.ageLabel)(t.ageMs)} after close`,{kind:"pod-memory-retained",...t},r);return a.message=`Its app was closed ${(0,pod_memory_1.ageLabel)(t.ageMs)} ago, ${t.swapsSinceClose} swap(s) and ${t.gcs} full GC(s) since, and ${t.alive.join(", ")} ${t.alive.length===1?"is":"are"} still alive: something still points into it.`,a}d(buildPodRetainedEvent,"buildPodRetainedEvent"),i(buildPodRetainedEvent,"buildPodRetainedEvent"),n(buildPodRetainedEvent,"buildPodRetainedEvent");function buildPodReleasedEvent(e,t,o,r=makeId){return envelope(e,o,"info",`pod-memory-retained:${e.project}`,t.reason==="pod-exited"?`${e.service} pod #${e.pod}: generation ${t.gen} went with its pod`:`${e.service} pod #${e.pod}: generation ${t.gen} was collected after all`,{kind:"pod-memory-released",...t},r)}d(buildPodReleasedEvent,"buildPodReleasedEvent"),i(buildPodReleasedEvent,"buildPodReleasedEvent"),n(buildPodReleasedEvent,"buildPodReleasedEvent");function buildPodExitedEvent(e,t,o,r=makeId){return envelope(e,o,"info",`pod-memory:${e.project}`,`${e.service} pod #${e.pod} exited`,{kind:"pod-memory-exited",code:t.code,signal:t.signal},r)}d(buildPodExitedEvent,"buildPodExitedEvent"),i(buildPodExitedEvent,"buildPodExitedEvent"),n(buildPodExitedEvent,"buildPodExitedEvent");function createPodMemoryPublisher(e,t){if(!e)return{publish:n(()=>!1,"publish")};const o=t??(()=>{try{return require("@lensmcp/node-instrumentation")}catch{return}})(),r=o?.createEventFloodGuard({burst:30,perSec:5});let a=!1;return{publish(s){const l=r?.admit(s.fingerprint)??{ok:!0,suppressed:0};if(!l.ok)return!1;const c=JSON.stringify(l.suppressed>0?{...s,raw:{...s.raw,floodSuppressed:l.suppressed}}:s)+`
2
+ `;try{return a||(fs.mkdirSync(path.dirname(e),{recursive:!0}),a=!0),o?.maybeRotateEventFile(e,c.length),fs.appendFileSync(e,c),!0}catch{return a=!1,!1}}}}d(createPodMemoryPublisher,"createPodMemoryPublisher"),i(createPodMemoryPublisher,"createPodMemoryPublisher"),n(createPodMemoryPublisher,"createPodMemoryPublisher");
package/pod-memory.js CHANGED
@@ -1 +1 @@
1
- "use strict";var O=Object.defineProperty;var d=(s,e)=>O(s,"name",{value:e,configurable:!0});var I=Object.defineProperty,i=d((s,e)=>I(s,"name",{value:e,configurable:!0}),"i");Object.defineProperty(exports,"__esModule",{value:!0}),exports.GenerationTracker=exports.LensmcpClosedGeneration=exports.RETAINED_MIN_GCS=void 0,exports.podMemoryPolicy=podMemoryPolicy,exports.fullGc=fullGc,exports.countLiveInstances=countLiveInstances,exports.createLiveObjectCounter=createLiveObjectCounter,exports.delayLabel=delayLabel,exports.createPodMemoryMonitor=createPodMemoryMonitor,exports.ageLabel=ageLabel,exports.describePodMemory=describePodMemory,exports.describeRetained=describeRetained,exports.describeReleased=describeReleased;const tslib_1=require("tslib"),node_module_1=require("node:module"),v8=tslib_1.__importStar(require("node:v8")),vm=tslib_1.__importStar(require("node:vm"));exports.RETAINED_MIN_GCS=2;const numberFrom=i((s,e,t)=>{if(s===void 0||s.trim()==="")return e;const r=Number(s);return Number.isFinite(r)&&r>=t?r:e},"numberFrom");function podMemoryPolicy(s=process.env){const e=["0","false","no","off"].includes((s.LENSMCP_POD_GC??"").trim().toLowerCase()),t=(s.LENSMCP_POD_GC_SCHEDULE_MS??"").split(",").map(r=>Number(r.trim())).filter(r=>Number.isFinite(r)&&r>0).map(Math.floor).sort((r,a)=>r-a);return{enabled:!e,scheduleMs:t.length?t:[3e4,12e4,3e5],idleMs:Math.floor(numberFrom(s.LENSMCP_POD_GC_IDLE_MS,6e4,0)),idleEveryMs:Math.floor(numberFrom(s.LENSMCP_POD_GC_IDLE_EVERY_MS,3e5,0)),retainedAfterMs:Math.floor(numberFrom(s.LENSMCP_POD_RETAINED_AFTER_MS,3e5,0)),settleMs:Math.floor(numberFrom(s.LENSMCP_POD_GC_SETTLE_MS,2e3,0)),countMaxBytes:Math.floor(numberFrom(s.LENSMCP_POD_COUNT_MAX_MB,64,0)*1024*1024)}}d(podMemoryPolicy,"podMemoryPolicy"),i(podMemoryPolicy,"podMemoryPolicy");let collector;function fullGc(){if(collector===void 0)try{v8.setFlagsFromString("--expose-gc");const s=vm.runInNewContext("gc");collector=typeof s=="function"?s:null}catch{collector=null}if(!collector)return!1;try{return collector(),!0}catch{return!1}}d(fullGc,"fullGc"),i(fullGc,"fullGc");function countLiveInstances(s){const e=v8.queryObjects;if(typeof e!="function"||typeof s!="function")return;const t=process.emitWarning;process.emitWarning=i(function(r,...a){const l=typeof a[0]=="string"?a[0]:a[0]?.type,n=typeof r=="string"?r:r?.message;if(!(l==="ExperimentalWarning"&&/queryObjects/.test(n??"")))return t.call(process,r,...a)},"quiet");try{const r=e(s,{format:"count"});return typeof r=="number"&&Number.isFinite(r)?r:void 0}catch{return}finally{process.emitWarning=t}}d(countLiveInstances,"countLiveInstances"),i(countLiveInstances,"countLiveInstances");const LEAK_CLASSES=[{name:"NestContainer",pkg:"@nestjs/core",pick:i(s=>s.NestContainer,"pick")},{name:"ZodObject",pkg:"zod",pick:i(s=>s.ZodObject,"pick")},{name:"DataSource",pkg:"typeorm",pick:i(s=>s.DataSource,"pick")},{name:"Redis",pkg:"ioredis",pick:i(s=>typeof s=="function"?s:s.default??s.Redis,"pick")},{name:"Worker",pkg:"bullmq",pick:i(s=>s.Worker,"pick")}];function createLiveObjectCounter(s,e=require.cache){let t;try{t=(0,node_module_1.createRequire)(s)}catch{t=void 0}const r=new Map,a=i(l=>{if(!t)return;let n=r.get(l.pkg);if(n===void 0){try{n=t.resolve(l.pkg)}catch{n=null}r.set(l.pkg,n)}if(!n)return;const p=e[n]?.exports;if(!(!p||typeof p!="object"&&typeof p!="function"))try{return l.pick(p)}catch{return}},"classOf");return{containers:i(()=>countLiveInstances(a(LEAK_CLASSES[0])),"containers"),all:i(()=>{const l={};for(const n of LEAK_CLASSES){const p=countLiveInstances(a(n));p!==void 0&&(l[n.name]=p)}return Object.keys(l).length?l:void 0},"all")}}d(createLiveObjectCounter,"createLiveObjectCounter"),i(createLiveObjectCounter,"createLiveObjectCounter");class LensmcpClosedGeneration{static{d(this,"LensmcpClosedGeneration")}static{i(this,"LensmcpClosedGeneration")}constructor(e,t){this.gen=e,this.refs={},this.label=`lensmcp closed generation ${e}`;for(const[r,a]of Object.entries(t))a&&(typeof a=="object"||typeof a=="function")&&(this.refs[r]=new WeakRef(a))}}exports.LensmcpClosedGeneration=LensmcpClosedGeneration;class GenerationTracker{static{d(this,"GenerationTracker")}static{i(this,"GenerationTracker")}constructor(e={}){this.opts=e,this.closed=new Map,this.freed=new Map,this.now=e.now??Date.now,this.registry=new FinalizationRegistry(t=>this.collected(t))}close(e,t,r){if(this.closed.has(e)||this.freed.has(e))return;const a=new LensmcpClosedGeneration(e,r),l=new Set(Object.keys(a.refs));if(l.size===0){this.markFreed(e);return}this.closed.set(e,{marker:a,closedAt:this.now(),swapsAtClose:t,gcs:0,alive:l});for(const[n,p]of Object.entries(a.refs)){const m=p.deref();m?this.registry.register(m,{gen:e,name:n}):l.delete(n)}l.size===0&&this.drop(e)}noteGc(){for(const e of this.closed.values())e.gcs+=1}isAlive(e){if(this.closed.has(e))return!0;if(this.freed.has(e))return!1}views(){return[...this.closed.entries()].map(([e,t])=>this.view(e,t))}dueForReport(e,t=this.now()){return this.views().filter(r=>r.reportedAt===void 0&&r.gcs>=exports.RETAINED_MIN_GCS&&t-r.closedAt>=e)}retainedCount(e,t=this.now()){return this.views().filter(r=>r.gcs>=exports.RETAINED_MIN_GCS&&t-r.closedAt>=e).length}markReported(e,t=this.now()){const r=this.closed.get(e);r&&(r.reportedAt=t)}oldestRetained(e,t=this.now()){return this.views().filter(r=>r.gcs>=exports.RETAINED_MIN_GCS&&t-r.closedAt>=e).sort((r,a)=>r.closedAt-a.closedAt)[0]}markers(){return[...this.closed.values()].map(e=>e.marker)}forgetAll(){const e=this.views().filter(t=>t.reportedAt!==void 0);for(const t of[...this.closed.keys()])this.drop(t);return e}collected(e){const t=this.closed.get(e.gen);if(!t||(t.alive.delete(e.name),t.alive.size>0))return;const r=this.view(e.gen,t);this.drop(e.gen);try{this.opts.onFreed?.(r,r.reportedAt!==void 0)}catch{}}drop(e){this.closed.delete(e),this.markFreed(e)}markFreed(e){this.freed.set(e,this.now()),this.freed.size>64&&this.freed.delete(this.freed.keys().next().value)}view(e,t){return{gen:e,closedAt:t.closedAt,swapsAtClose:t.swapsAtClose,gcs:t.gcs,alive:[...t.alive],...t.reportedAt!==void 0?{reportedAt:t.reportedAt}:{}}}}exports.GenerationTracker=GenerationTracker;const MB=1024*1024;function delayLabel(s){return s%6e4===0?`${s/6e4}m`:s%1e3===0?`${s/1e3}s`:`${s}ms`}d(delayLabel,"delayLabel"),i(delayLabel,"delayLabel");const turn=i(()=>new Promise(s=>setImmediate(s)),"turn");function createPodMemoryMonitor(s){const e=s.now??Date.now,t=s.policy,r=new GenerationTracker({now:e,onFreed:i((o,u)=>{u&&s.send({type:"pod-memory-released",released:{gen:o.gen,closedAt:o.closedAt,ageMs:e()-o.closedAt,reason:"collected"}})},"onFreed")});let a=Promise.resolve(),l=!1,n,p,m,w=0,A=!1,C=0;const M=i((o,u)=>{const c=setTimeout(o,Math.max(0,u));return c.unref?.(),c},"unrefTimer");function E(){return!n||n.previousGen===void 0?null:n.previousClosed()?r.isAlive(n.previousGen)!==!1:!0}d(E,"S"),i(E,"previousAlive");async function S(o){const u=process.memoryUsage().heapUsed,c=process.hrtime.bigint();(s.gc??fullGc)();const f=Number(process.hrtime.bigint()-c)/1e6;r.noteGc(),await turn(),await turn();let h=s.containers?.();const v=process.memoryUsage(),g=v8.getHeapStatistics(),R=v8.getHeapSpaceStatistics().find(P=>P.space_name==="new_space"),$=s.state(),L=r.views(),N=e();return h!==void 0&&h<0&&(h=void 0),{trigger:o,at:N,gen:$.gen,swaps:$.swaps,live:v.heapUsed,used:u,reserved:v.heapTotal,rss:v.rss,external:v.external,youngGen:R?.space_size??0,limit:g.heap_size_limit,...$.baseline!==void 0?{baseline:$.baseline}:{},gcMs:Math.round(f),...n?.previousGen!==void 0?{previousGen:n.previousGen}:{},previousAlive:E(),closedAlive:L.length,retained:r.retainedCount(t.retainedAfterMs,N),...h!==void 0?{containers:h}:{},sourceMaps:process.sourceMapsEnabled===!0}}d(S,"k"),i(S,"collect");function G(o){for(const c of r.dueForReport(t.retainedAfterMs,o.at)){r.markReported(c.gen,o.at);const f=o.live<=t.countMaxBytes?s.counter?.all():void 0;s.send({type:"pod-memory-retained",retained:{gen:c.gen,closedAt:c.closedAt,ageMs:o.at-c.closedAt,swapsSinceClose:Math.max(0,o.swaps-c.swapsAtClose),gcs:c.gcs,alive:c.alive,...f?{counts:f}:{},live:o.live}})}const u=r.oldestRetained(t.retainedAfterMs,o.at);if(u)try{s.onRetained?.(u)}catch{}n&&!n.done&&o.previousAlive===!1&&_(),k()}d(G,"G"),i(G,"afterCollect");function y(o){const u=a.then(async()=>{const c=await S(o);return A=!1,l||(s.send({type:"pod-memory",report:c}),G(c)),c});return a=u.catch(()=>{}),u}d(y,"_"),i(y,"measure");function b(o){if(!l){if(s.state().busy){M(()=>b(o),1e3);return}y(o).catch(()=>{})}}d(b,"b"),i(b,"measureWhenFree");function _(){if(n){n.done=!0;for(const o of n.timers)clearTimeout(o);n.timers=[]}}d(_,"$"),i(_,"finishSchedule");function k(){if(p&&clearTimeout(p),p=void 0,l||!t.enabled)return;const o=r.views().filter(f=>f.reportedAt===void 0);if(o.length===0)return;const u=e(),c=Math.min(...o.map(f=>Math.max(f.closedAt+t.retainedAfterMs,u+1e3)));p=M(()=>{p=void 0,b("retention-check")},c-u)}d(k,"C"),i(k,"armRetentionCheck");function x(){if(l||!t.enabled||t.idleMs<=0||m)return;const o=Math.max(t.idleMs-(e()-w),C+t.idleEveryMs-e(),250);m=M(()=>{if(m=void 0,!!A){if(e()-w<t.idleMs||e()-C<t.idleEveryMs||s.state().busy){x();return}C=e(),b("idle")}},o)}return d(x,"x"),i(x,"armIdle"),{tracker:r,booted:i(()=>y("boot"),"booted"),swapped(o,u){if(l||(_(),w=e(),A=!0,!t.enabled))return;const c={...o!==void 0?{previousGen:o}:{},previousClosed:u,timers:[],done:!1};n=c;const f=e(),h=t.scheduleMs[0]??Number.POSITIVE_INFINITY,v=i(()=>{if(c.done||n!==c)return;const g=s.state();if(!g.busy&&u()&&e()-g.lastBusyAt>=t.settleMs){y("swap-settled").catch(()=>{});return}e()-f+500<h&&c.timers.push(M(v,500))},"settledCheck");c.timers.push(M(v,Math.min(t.settleMs,500)));for(const g of t.scheduleMs)c.timers.push(M(()=>{c.done||n!==c||b(`swap+${delayLabel(g)}`)},g))},closed(o,u,c){r.close(o,u,c),k()},activity(){w=e(),A=!0,x()},measure:y,oldestRetained:i(()=>r.oldestRetained(t.retainedAfterMs),"oldestRetained"),stop(){l=!0,_(),p&&clearTimeout(p),m&&clearTimeout(m)}}}d(createPodMemoryMonitor,"createPodMemoryMonitor"),i(createPodMemoryMonitor,"createPodMemoryMonitor");const mbOf=i(s=>s===void 0?"?":`${Math.round(s/MB)} MB`,"mbOf");function ageLabel(s){return s<9e4?`${Math.max(0,Math.round(s/1e3))}s`:`${Math.round(s/6e4)} min`}d(ageLabel,"ageLabel"),i(ageLabel,"ageLabel");function describePodMemory(s,e){const t=e.trigger==="boot"?`${s} memory at boot: ${mbOf(e.live)} live after a full GC \u2014 the baseline later readings compare with`:`${s} memory (${e.trigger}): ${mbOf(e.live)} live after a full GC`+(e.used-e.live>=MB?` (${mbOf(e.used)} before it)`:"")+(e.baseline?`, ${(e.live/e.baseline).toFixed(1)}\xD7 its ${mbOf(e.baseline)} boot baseline`:""),r=[`${mbOf(e.reserved)} reserved`,`rss ${mbOf(e.rss)}`,`generation ${e.gen}, ${e.swaps} swap${e.swaps===1?"":"s"}`,`GC ${e.gcMs} ms`];return e.previousAlive===!1?r.push(`generation ${e.previousGen} freed`):e.previousAlive===!0&&r.push(`generation ${e.previousGen} still in memory`),e.containers!==void 0&&r.push(`${e.containers} Nest container${e.containers===1?"":"s"}`),e.retained>0&&r.push(`${e.retained} closed generation${e.retained===1?"":"s"} RETAINED`),`${t} \xB7 ${r.join(" \xB7 ")}`}d(describePodMemory,"describePodMemory"),i(describePodMemory,"describePodMemory");function describeRetained(s,e,t){const r=t.counts&&Object.keys(t.counts).length?` Live now: ${Object.entries(t.counts).map(([a,l])=>`${a} ${l}`).join(", ")}.`:"";return`${s} ${e}: generation ${t.gen} still in memory ${ageLabel(t.ageMs)} after its app was closed (${t.swapsSinceClose} swap${t.swapsSinceClose===1?"":"s"} since, ${t.gcs} full GCs; still alive: ${t.alive.join(", ")}) \u2014 something still points into it.${r} See what with \`lensmcp mem ${e} --snapshot --analyze\`.`}d(describeRetained,"describeRetained"),i(describeRetained,"describeRetained");function describeReleased(s,e,t){return t.reason==="pod-exited"?`${s} ${e}: generation ${t.gen} went with its pod`:`${s} ${e}: generation ${t.gen} was collected after all, ${ageLabel(t.ageMs)} after its app was closed`}d(describeReleased,"describeReleased"),i(describeReleased,"describeReleased");
1
+ "use strict";var j=Object.defineProperty;var u=(r,e)=>j(r,"name",{value:e,configurable:!0});var O=Object.defineProperty,d=u((r,e)=>O(r,"name",{value:e,configurable:!0}),"d"),I=Object.defineProperty,i=d((r,e)=>I(r,"name",{value:e,configurable:!0}),"i");Object.defineProperty(exports,"__esModule",{value:!0}),exports.GenerationTracker=exports.LensmcpClosedGeneration=exports.RETAINED_MIN_GCS=void 0,exports.podMemoryPolicy=podMemoryPolicy,exports.fullGc=fullGc,exports.countLiveInstances=countLiveInstances,exports.createLiveObjectCounter=createLiveObjectCounter,exports.delayLabel=delayLabel,exports.createPodMemoryMonitor=createPodMemoryMonitor,exports.ageLabel=ageLabel,exports.describePodMemory=describePodMemory,exports.describeRetained=describeRetained,exports.describeReleased=describeReleased;const tslib_1=require("tslib"),node_module_1=require("node:module"),v8=tslib_1.__importStar(require("node:v8")),vm=tslib_1.__importStar(require("node:vm"));exports.RETAINED_MIN_GCS=2;const numberFrom=i((r,e,t)=>{if(r===void 0||r.trim()==="")return e;const s=Number(r);return Number.isFinite(s)&&s>=t?s:e},"numberFrom");function podMemoryPolicy(r=process.env){const e=["0","false","no","off"].includes((r.LENSMCP_POD_GC??"").trim().toLowerCase()),t=(r.LENSMCP_POD_GC_SCHEDULE_MS??"").split(",").map(s=>Number(s.trim())).filter(s=>Number.isFinite(s)&&s>0).map(Math.floor).sort((s,c)=>s-c);return{enabled:!e,scheduleMs:t.length?t:[3e4,12e4,3e5],idleMs:Math.floor(numberFrom(r.LENSMCP_POD_GC_IDLE_MS,6e4,0)),idleEveryMs:Math.floor(numberFrom(r.LENSMCP_POD_GC_IDLE_EVERY_MS,3e5,0)),retainedAfterMs:Math.floor(numberFrom(r.LENSMCP_POD_RETAINED_AFTER_MS,3e5,0)),settleMs:Math.floor(numberFrom(r.LENSMCP_POD_GC_SETTLE_MS,2e3,0)),countMaxBytes:Math.floor(numberFrom(r.LENSMCP_POD_COUNT_MAX_MB,64,0)*1024*1024)}}u(podMemoryPolicy,"podMemoryPolicy"),d(podMemoryPolicy,"podMemoryPolicy"),i(podMemoryPolicy,"podMemoryPolicy");let collector;function fullGc(){if(collector===void 0)try{v8.setFlagsFromString("--expose-gc");const r=vm.runInNewContext("gc");collector=typeof r=="function"?r:null}catch{collector=null}if(!collector)return!1;try{return collector(),!0}catch{return!1}}u(fullGc,"fullGc"),d(fullGc,"fullGc"),i(fullGc,"fullGc");function countLiveInstances(r){const e=v8.queryObjects;if(typeof e!="function"||typeof r!="function")return;const t=process.emitWarning;process.emitWarning=i(function(s,...c){const l=typeof c[0]=="string"?c[0]:c[0]?.type,n=typeof s=="string"?s:s?.message;if(!(l==="ExperimentalWarning"&&/queryObjects/.test(n??"")))return t.call(process,s,...c)},"quiet");try{const s=e(r,{format:"count"});return typeof s=="number"&&Number.isFinite(s)?s:void 0}catch{return}finally{process.emitWarning=t}}u(countLiveInstances,"countLiveInstances"),d(countLiveInstances,"countLiveInstances"),i(countLiveInstances,"countLiveInstances");const LEAK_CLASSES=[{name:"NestContainer",pkg:"@nestjs/core",pick:i(r=>r.NestContainer,"pick")},{name:"ZodObject",pkg:"zod",pick:i(r=>r.ZodObject,"pick")},{name:"DataSource",pkg:"typeorm",pick:i(r=>r.DataSource,"pick")},{name:"Redis",pkg:"ioredis",pick:i(r=>typeof r=="function"?r:r.default??r.Redis,"pick")},{name:"Worker",pkg:"bullmq",pick:i(r=>r.Worker,"pick")}];function createLiveObjectCounter(r,e=require.cache){let t;try{t=(0,node_module_1.createRequire)(r)}catch{t=void 0}const s=new Map,c=i(l=>{if(!t)return;let n=s.get(l.pkg);if(n===void 0){try{n=t.resolve(l.pkg)}catch{n=null}s.set(l.pkg,n)}if(!n)return;const f=e[n]?.exports;if(!(!f||typeof f!="object"&&typeof f!="function"))try{return l.pick(f)}catch{return}},"classOf");return{containers:i(()=>countLiveInstances(c(LEAK_CLASSES[0])),"containers"),all:i(()=>{const l={};for(const n of LEAK_CLASSES){const f=countLiveInstances(c(n));f!==void 0&&(l[n.name]=f)}return Object.keys(l).length?l:void 0},"all")}}u(createLiveObjectCounter,"createLiveObjectCounter"),d(createLiveObjectCounter,"createLiveObjectCounter"),i(createLiveObjectCounter,"createLiveObjectCounter");class LensmcpClosedGeneration{static{u(this,"LensmcpClosedGeneration")}static{d(this,"LensmcpClosedGeneration")}static{i(this,"LensmcpClosedGeneration")}constructor(e,t){this.gen=e,this.refs={},this.label=`lensmcp closed generation ${e}`;for(const[s,c]of Object.entries(t))c&&(typeof c=="object"||typeof c=="function")&&(this.refs[s]=new WeakRef(c))}}exports.LensmcpClosedGeneration=LensmcpClosedGeneration;class GenerationTracker{static{u(this,"GenerationTracker")}static{d(this,"GenerationTracker")}static{i(this,"GenerationTracker")}constructor(e={}){this.opts=e,this.closed=new Map,this.freed=new Map,this.now=e.now??Date.now,this.registry=new FinalizationRegistry(t=>this.collected(t))}close(e,t,s){if(this.closed.has(e)||this.freed.has(e))return;const c=new LensmcpClosedGeneration(e,s),l=new Set(Object.keys(c.refs));if(l.size===0){this.markFreed(e);return}this.closed.set(e,{marker:c,closedAt:this.now(),swapsAtClose:t,gcs:0,alive:l});for(const[n,f]of Object.entries(c.refs)){const h=f.deref();h?this.registry.register(h,{gen:e,name:n}):l.delete(n)}l.size===0&&this.drop(e)}noteGc(){for(const e of this.closed.values())e.gcs+=1}isAlive(e){if(this.closed.has(e))return!0;if(this.freed.has(e))return!1}views(){return[...this.closed.entries()].map(([e,t])=>this.view(e,t))}dueForReport(e,t=this.now()){return this.views().filter(s=>s.reportedAt===void 0&&s.gcs>=exports.RETAINED_MIN_GCS&&t-s.closedAt>=e)}retainedCount(e,t=this.now()){return this.views().filter(s=>s.gcs>=exports.RETAINED_MIN_GCS&&t-s.closedAt>=e).length}markReported(e,t=this.now()){const s=this.closed.get(e);s&&(s.reportedAt=t)}oldestRetained(e,t=this.now()){return this.views().filter(s=>s.gcs>=exports.RETAINED_MIN_GCS&&t-s.closedAt>=e).sort((s,c)=>s.closedAt-c.closedAt)[0]}markers(){return[...this.closed.values()].map(e=>e.marker)}forgetAll(){const e=this.views().filter(t=>t.reportedAt!==void 0);for(const t of[...this.closed.keys()])this.drop(t);return e}collected(e){const t=this.closed.get(e.gen);if(!t||(t.alive.delete(e.name),t.alive.size>0))return;const s=this.view(e.gen,t);this.drop(e.gen);try{this.opts.onFreed?.(s,s.reportedAt!==void 0)}catch{}}drop(e){this.closed.delete(e),this.markFreed(e)}markFreed(e){this.freed.set(e,this.now()),this.freed.size>64&&this.freed.delete(this.freed.keys().next().value)}view(e,t){return{gen:e,closedAt:t.closedAt,swapsAtClose:t.swapsAtClose,gcs:t.gcs,alive:[...t.alive],...t.reportedAt!==void 0?{reportedAt:t.reportedAt}:{}}}}exports.GenerationTracker=GenerationTracker;const MB=1024*1024;function delayLabel(r){return r%6e4===0?`${r/6e4}m`:r%1e3===0?`${r/1e3}s`:`${r}ms`}u(delayLabel,"delayLabel"),d(delayLabel,"delayLabel"),i(delayLabel,"delayLabel");const turn=i(()=>new Promise(r=>setImmediate(r)),"turn");function createPodMemoryMonitor(r){const e=r.now??Date.now,t=r.policy,s=new GenerationTracker({now:e,onFreed:i((o,p)=>{p&&r.send({type:"pod-memory-released",released:{gen:o.gen,closedAt:o.closedAt,ageMs:e()-o.closedAt,reason:"collected"}})},"onFreed")});let c=Promise.resolve(),l=!1,n,f,h,_=0,C=!1,G=0;const b=i((o,p)=>{const a=setTimeout(o,Math.max(0,p));return a.unref?.(),a},"unrefTimer");function E(){return!n||n.previousGen===void 0?null:n.previousClosed()?s.isAlive(n.previousGen)!==!1:!0}u(E,"E"),d(E,"S"),i(E,"previousAlive");async function S(o){const p=process.memoryUsage().heapUsed,a=process.hrtime.bigint();(r.gc??fullGc)();const m=Number(process.hrtime.bigint()-a)/1e6;s.noteGc(),await turn(),await turn();let v=r.containers?.();const g=process.memoryUsage(),M=v8.getHeapStatistics(),R=v8.getHeapSpaceStatistics().find(T=>T.space_name==="new_space"),x=r.state(),P=s.views(),N=e();return v!==void 0&&v<0&&(v=void 0),{trigger:o,at:N,gen:x.gen,swaps:x.swaps,live:g.heapUsed,used:p,reserved:g.heapTotal,rss:g.rss,external:g.external,youngGen:R?.space_size??0,limit:M.heap_size_limit,...x.baseline!==void 0?{baseline:x.baseline}:{},gcMs:Math.round(m),...n?.previousGen!==void 0?{previousGen:n.previousGen}:{},previousAlive:E(),closedAlive:P.length,retained:s.retainedCount(t.retainedAfterMs,N),...v!==void 0?{containers:v}:{},sourceMaps:process.sourceMapsEnabled===!0}}u(S,"S"),d(S,"k"),i(S,"collect");function L(o){for(const a of s.dueForReport(t.retainedAfterMs,o.at)){s.markReported(a.gen,o.at);const m=o.live<=t.countMaxBytes?r.counter?.all():void 0;r.send({type:"pod-memory-retained",retained:{gen:a.gen,closedAt:a.closedAt,ageMs:o.at-a.closedAt,swapsSinceClose:Math.max(0,o.swaps-a.swapsAtClose),gcs:a.gcs,alive:a.alive,...m?{counts:m}:{},live:o.live}})}const p=s.oldestRetained(t.retainedAfterMs,o.at);if(p)try{r.onRetained?.(p)}catch{}n&&!n.done&&o.previousAlive===!1&&A(),$()}u(L,"G"),d(L,"G"),i(L,"afterCollect");function y(o){const p=c.then(async()=>{const a=await S(o);return C=!1,l||(r.send({type:"pod-memory",report:a}),L(a)),a});return c=p.catch(()=>{}),p}u(y,"y"),d(y,"_"),i(y,"measure");function w(o){if(!l){if(r.state().busy){b(()=>w(o),1e3);return}y(o).catch(()=>{})}}u(w,"b"),d(w,"b"),i(w,"measureWhenFree");function A(){if(n){n.done=!0;for(const o of n.timers)clearTimeout(o);n.timers=[]}}u(A,"_"),d(A,"$"),i(A,"finishSchedule");function $(){if(f&&clearTimeout(f),f=void 0,l||!t.enabled)return;const o=s.views().filter(m=>m.reportedAt===void 0);if(o.length===0)return;const p=e(),a=Math.min(...o.map(m=>Math.max(m.closedAt+t.retainedAfterMs,p+1e3)));f=b(()=>{f=void 0,w("retention-check")},a-p)}u($,"k"),d($,"C"),i($,"armRetentionCheck");function k(){if(l||!t.enabled||t.idleMs<=0||h)return;const o=Math.max(t.idleMs-(e()-_),G+t.idleEveryMs-e(),250);h=b(()=>{if(h=void 0,!!C){if(e()-_<t.idleMs||e()-G<t.idleEveryMs||r.state().busy){k();return}G=e(),w("idle")}},o)}return u(k,"x"),d(k,"x"),i(k,"armIdle"),{tracker:s,booted:i(()=>y("boot"),"booted"),swapped(o,p){if(l||(A(),_=e(),C=!0,!t.enabled))return;const a={...o!==void 0?{previousGen:o}:{},previousClosed:p,timers:[],done:!1};n=a;const m=e(),v=t.scheduleMs[0]??Number.POSITIVE_INFINITY,g=i(()=>{if(a.done||n!==a)return;const M=r.state();if(!M.busy&&p()&&e()-M.lastBusyAt>=t.settleMs){y("swap-settled").catch(()=>{});return}e()-m+500<v&&a.timers.push(b(g,500))},"settledCheck");a.timers.push(b(g,Math.min(t.settleMs,500)));for(const M of t.scheduleMs)a.timers.push(b(()=>{a.done||n!==a||w(`swap+${delayLabel(M)}`)},M))},closed(o,p,a){s.close(o,p,a),$()},activity(){_=e(),C=!0,k()},measure:y,oldestRetained:i(()=>s.oldestRetained(t.retainedAfterMs),"oldestRetained"),stop(){l=!0,A(),f&&clearTimeout(f),h&&clearTimeout(h)}}}u(createPodMemoryMonitor,"createPodMemoryMonitor"),d(createPodMemoryMonitor,"createPodMemoryMonitor"),i(createPodMemoryMonitor,"createPodMemoryMonitor");const mbOf=i(r=>r===void 0?"?":`${Math.round(r/MB)} MB`,"mbOf");function ageLabel(r){return r<9e4?`${Math.max(0,Math.round(r/1e3))}s`:`${Math.round(r/6e4)} min`}u(ageLabel,"ageLabel"),d(ageLabel,"ageLabel"),i(ageLabel,"ageLabel");function describePodMemory(r,e){const t=e.trigger==="boot"?`${r} memory at boot: ${mbOf(e.live)} live after a full GC \u2014 the baseline later readings compare with`:`${r} memory (${e.trigger}): ${mbOf(e.live)} live after a full GC`+(e.used-e.live>=MB?` (${mbOf(e.used)} before it)`:"")+(e.baseline?`, ${(e.live/e.baseline).toFixed(1)}\xD7 its ${mbOf(e.baseline)} boot baseline`:""),s=[`${mbOf(e.reserved)} reserved`,`rss ${mbOf(e.rss)}`,`generation ${e.gen}, ${e.swaps} swap${e.swaps===1?"":"s"}`,`GC ${e.gcMs} ms`];return e.previousAlive===!1?s.push(`generation ${e.previousGen} freed`):e.previousAlive===!0&&s.push(`generation ${e.previousGen} still in memory`),e.containers!==void 0&&s.push(`${e.containers} Nest container${e.containers===1?"":"s"}`),e.retained>0&&s.push(`${e.retained} closed generation${e.retained===1?"":"s"} RETAINED`),`${t} \xB7 ${s.join(" \xB7 ")}`}u(describePodMemory,"describePodMemory"),d(describePodMemory,"describePodMemory"),i(describePodMemory,"describePodMemory");function describeRetained(r,e,t){const s=t.counts&&Object.keys(t.counts).length?` Live now: ${Object.entries(t.counts).map(([c,l])=>`${c} ${l}`).join(", ")}.`:"";return`${r} ${e}: generation ${t.gen} still in memory ${ageLabel(t.ageMs)} after its app was closed (${t.swapsSinceClose} swap${t.swapsSinceClose===1?"":"s"} since, ${t.gcs} full GCs; still alive: ${t.alive.join(", ")}) \u2014 something still points into it.${s} See what with \`lensmcp mem ${e} --snapshot --analyze\`.`}u(describeRetained,"describeRetained"),d(describeRetained,"describeRetained"),i(describeRetained,"describeRetained");function describeReleased(r,e,t){return t.reason==="pod-exited"?`${r} ${e}: generation ${t.gen} went with its pod`:`${r} ${e}: generation ${t.gen} was collected after all, ${ageLabel(t.ageMs)} after its app was closed`}u(describeReleased,"describeReleased"),d(describeReleased,"describeReleased"),i(describeReleased,"describeReleased");
package/pod-sock.js CHANGED
@@ -1 +1 @@
1
- "use strict";var n=Object.defineProperty;var r=(o,e)=>n(o,"name",{value:e,configurable:!0});var c=Object.defineProperty,t=r((o,e)=>c(o,"name",{value:e,configurable:!0}),"t");Object.defineProperty(exports,"__esModule",{value:!0}),exports.podSockName=podSockName,exports.isPodSockName=isPodSockName,exports.podSockGeneration=podSockGeneration;const POD_SOCK=/^child-(\d+)(?:-g(\d+))?\.sock$/;function podSockName(o,e){return e>1?`child-${o}-g${e}.sock`:`child-${o}.sock`}r(podSockName,"podSockName"),t(podSockName,"podSockName");function isPodSockName(o){return POD_SOCK.test(o)}r(isPodSockName,"isPodSockName"),t(isPodSockName,"isPodSockName");function podSockGeneration(o){const e=POD_SOCK.exec(o);if(e)return e[2]===void 0?1:Number(e[2])}r(podSockGeneration,"podSockGeneration"),t(podSockGeneration,"podSockGeneration");
1
+ "use strict";var d=Object.defineProperty;var a=(e,o)=>d(e,"name",{value:o,configurable:!0});var n=Object.defineProperty,r=a((e,o)=>n(e,"name",{value:o,configurable:!0}),"r"),c=Object.defineProperty,t=r((e,o)=>c(e,"name",{value:o,configurable:!0}),"t");Object.defineProperty(exports,"__esModule",{value:!0}),exports.podSockName=podSockName,exports.isPodSockName=isPodSockName,exports.podSockGeneration=podSockGeneration;const POD_SOCK=/^child-(\d+)(?:-g(\d+))?\.sock$/;function podSockName(e,o){return o>1?`child-${e}-g${o}.sock`:`child-${e}.sock`}a(podSockName,"podSockName"),r(podSockName,"podSockName"),t(podSockName,"podSockName");function isPodSockName(e){return POD_SOCK.test(e)}a(isPodSockName,"isPodSockName"),r(isPodSockName,"isPodSockName"),t(isPodSockName,"isPodSockName");function podSockGeneration(e){const o=POD_SOCK.exec(e);if(o)return o[2]===void 0?1:Number(o[2])}a(podSockGeneration,"podSockGeneration"),r(podSockGeneration,"podSockGeneration"),t(podSockGeneration,"podSockGeneration");
package/process-name.js CHANGED
@@ -1 +1 @@
1
- "use strict";var _=Object.defineProperty;var p=(t,e)=>_(t,"name",{value:e,configurable:!0});var d=Object.defineProperty,a=p((t,e)=>d(t,"name",{value:e,configurable:!0}),"a");Object.defineProperty(exports,"__esModule",{value:!0}),exports.SWEEP_MAX_REMOVALS=exports.SWEEP_DELAY_MS=exports.SWEEP_INTERVAL_MS=exports.STALE_AFTER_MS=exports.PROCESS_NAME_MAX=void 0,exports.processName=processName,exports.legacyProcessName=legacyProcessName,exports.defaultLinkDirs=defaultLinkDirs,exports.processNamesEnabled=processNamesEnabled,exports.namedExecPath=namedExecPath,exports.prelinkProcessNames=prelinkProcessNames,exports.sweepProcessNames=sweepProcessNames;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),os=tslib_1.__importStar(require("node:os")),path=tslib_1.__importStar(require("node:path"));exports.PROCESS_NAME_MAX=31,exports.STALE_AFTER_MS=336*60*6e4,exports.SWEEP_INTERVAL_MS=1440*6e4,exports.SWEEP_DELAY_MS=6e4,exports.SWEEP_MAX_REMOVALS=512;const USED_DIR=".used",SWEPT_STAMP=".swept",sanitize=a(t=>(t??"").replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,""),"sanitize"),MIN_PART_CHARS=4;function processName(...t){const e=t.map(sanitize).filter(Boolean),r=e.pop();if(r===void 0)return"";if(e.length===0)return r.slice(0,exports.PROCESS_NAME_MAX);const s=r.slice(0,exports.PROCESS_NAME_MAX-2),l=exports.PROCESS_NAME_MAX-s.length-1,c=e.map(()=>0);let S=0;for(let n=e.length-1;n>=0;n-=1){const i=Math.min(e[n].length,MIN_PART_CHARS),o=i+(S>0?1:0);if(S+o>l)break;c[n]=i,S+=o}for(let n=e.length-1;n>=0&&c[n]>0;n-=1){const i=Math.min(e[n].length-c[n],l-S);c[n]=c[n]+i,S+=i}const u=e.map((n,i)=>n.slice(0,c[i]).replace(/-+$/,"")).filter(Boolean).join("-");return u?`${u}-${s}`:s}p(processName,"processName"),a(processName,"processName");function legacyProcessName(...t){const e=t.map(sanitize).filter(Boolean),r=e.pop();if(r===void 0)return"";if(e.length===0)return r.slice(0,exports.PROCESS_NAME_MAX);const s=r.slice(0,exports.PROCESS_NAME_MAX-2),l=e.join("-").slice(0,exports.PROCESS_NAME_MAX-s.length-1).replace(/-+$/,"");return l?`${l}-${s}`:s}p(legacyProcessName,"legacyProcessName"),a(legacyProcessName,"legacyProcessName");function defaultLinkDirs(t=process.env){const e=t.LENSMCP_HOME||os.homedir();return[path.join(os.tmpdir(),"lensmcp-process-names"),path.join(e,".lensmcp","process-names")]}p(defaultLinkDirs,"defaultLinkDirs"),a(defaultLinkDirs,"defaultLinkDirs");function processNamesEnabled(t=process.env){const e=(t.LENSMCP_PROCESS_NAMES??"").trim().toLowerCase();return!(e==="0"||e==="false"||e==="no"||e==="off")}p(processNamesEnabled,"processNamesEnabled"),a(processNamesEnabled,"processNamesEnabled");const ownedByMe=a(t=>typeof process.getuid!="function"||t.uid===process.getuid(),"ownedByMe");function privateDir(t){try{fs.mkdirSync(t,{recursive:!0,mode:448});const e=fs.lstatSync(t);return!e.isDirectory()||!ownedByMe(e)?!1:((e.mode&63)!==0&&fs.chmodSync(t,448),!0)}catch{return!1}}p(privateDir,"privateDir"),a(privateDir,"privateDir");function isPrivateDir(t){try{const e=fs.lstatSync(t);return e.isDirectory()&&ownedByMe(e)&&(e.mode&18)===0}catch{return!1}}p(isPrivateDir,"isPrivateDir"),a(isPrivateDir,"isPrivateDir");function isSameFile(t,e){try{const r=fs.lstatSync(t);return r.isFile()&&r.dev===e.dev&&r.ino===e.ino}catch{return!1}}p(isSameFile,"isSameFile"),a(isSameFile,"isSameFile");function noteUse(t,e,r=new Date){const s=path.join(t,USED_DIR,e);try{fs.utimesSync(s,r,r)}catch{try{fs.mkdirSync(path.dirname(s),{recursive:!0,mode:448}),fs.writeFileSync(s,"",{mode:384})}catch{}}}p(noteUse,"noteUse"),a(noteUse,"noteUse");const resolved=new Map;function namedExecPath(t,e={}){const r=e.execPath??process.execPath,s=e.env??process.env,l=e.platform??process.platform,c=processName(t);if(!c||l==="win32"||!processNamesEnabled(s))return r;const S=e.dirs??defaultLinkDirs(s),u=`${r}|${c}|${S.join("|")}`;scheduleSweep(S);let n,i;try{n=fs.realpathSync(r),i=fs.statSync(n)}catch{return r}const o=resolved.get(u);if(o&&isSameFile(o.link,i))return noteUse(o.dir,o.name),o.link;for(const m of S){if(!privateDir(m))continue;const f=path.join(m,`${i.dev}-${i.ino}`);if(!privateDir(f))continue;const E=path.join(f,c);if(!isSameFile(E,i)){try{fs.unlinkSync(E)}catch{}try{fs.linkSync(n,E)}catch{}}if(isSameFile(E,i))return resolved.set(u,{link:E,dir:f,name:c}),noteUse(f,c),E}return r}p(namedExecPath,"namedExecPath"),a(namedExecPath,"namedExecPath");function prelinkProcessNames(t,e={}){const r=[];for(const s of new Set([...t].filter(Boolean)))r.push(namedExecPath(s,e));return r}p(prelinkProcessNames,"prelinkProcessNames"),a(prelinkProcessNames,"prelinkProcessNames");function sweepProcessNames(t={}){const e={removed:[],adopted:0,skipped:0},r=t.now??Date.now(),s=t.staleAfterMs??exports.STALE_AFTER_MS,l=t.maxRemovals??exports.SWEEP_MAX_REMOVALS;for(const c of t.dirs??defaultLinkDirs()){if(!isPrivateDir(c))continue;const S=path.join(c,SWEPT_STAMP);if(!t.force)try{if(r-fs.statSync(S).mtimeMs<exports.SWEEP_INTERVAL_MS){e.skipped+=1;continue}}catch{}try{fs.writeFileSync(S,"",{mode:384}),fs.utimesSync(S,new Date(r),new Date(r))}catch{continue}let u;try{u=fs.readdirSync(c).filter(n=>/^\d+-\d+$/.test(n)).map(n=>path.join(c,n))}catch{continue}for(const n of u){if(!isPrivateDir(n))continue;let i;try{i=fs.readdirSync(n).filter(o=>o!==USED_DIR)}catch{continue}for(const o of i){const m=path.join(n,o);try{if(!fs.lstatSync(m).isFile())continue}catch{continue}let f;try{f=fs.statSync(path.join(n,USED_DIR,o)).mtimeMs}catch{noteUse(n,o,new Date(r)),e.adopted+=1;continue}if(!(r-f<s||e.removed.length>=l))try{fs.unlinkSync(m),e.removed.push(m),fs.rmSync(path.join(n,USED_DIR,o),{force:!0})}catch{}}try{for(const o of fs.readdirSync(path.join(n,USED_DIR)))fs.existsSync(path.join(n,o))||fs.rmSync(path.join(n,USED_DIR,o),{force:!0})}catch{}try{fs.readdirSync(n).every(o=>o===USED_DIR)&&(fs.rmSync(path.join(n,USED_DIR),{recursive:!0,force:!0}),fs.rmdirSync(n))}catch{}}}return e}p(sweepProcessNames,"sweepProcessNames"),a(sweepProcessNames,"sweepProcessNames");const sweepScheduled=new Set;function scheduleSweep(t){const e=t.join("|");sweepScheduled.has(e)||(sweepScheduled.add(e),setTimeout(()=>{try{sweepProcessNames({dirs:t})}catch{}},exports.SWEEP_DELAY_MS).unref?.())}p(scheduleSweep,"scheduleSweep"),a(scheduleSweep,"scheduleSweep");
1
+ "use strict";var h=Object.defineProperty;var l=(t,e)=>h(t,"name",{value:e,configurable:!0});var _=Object.defineProperty,p=l((t,e)=>_(t,"name",{value:e,configurable:!0}),"p"),d=Object.defineProperty,a=p((t,e)=>d(t,"name",{value:e,configurable:!0}),"a");Object.defineProperty(exports,"__esModule",{value:!0}),exports.SWEEP_MAX_REMOVALS=exports.SWEEP_DELAY_MS=exports.SWEEP_INTERVAL_MS=exports.STALE_AFTER_MS=exports.PROCESS_NAME_MAX=void 0,exports.processName=processName,exports.legacyProcessName=legacyProcessName,exports.defaultLinkDirs=defaultLinkDirs,exports.processNamesEnabled=processNamesEnabled,exports.namedExecPath=namedExecPath,exports.prelinkProcessNames=prelinkProcessNames,exports.sweepProcessNames=sweepProcessNames;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),os=tslib_1.__importStar(require("node:os")),path=tslib_1.__importStar(require("node:path"));exports.PROCESS_NAME_MAX=31,exports.STALE_AFTER_MS=336*60*6e4,exports.SWEEP_INTERVAL_MS=1440*6e4,exports.SWEEP_DELAY_MS=6e4,exports.SWEEP_MAX_REMOVALS=512;const USED_DIR=".used",SWEPT_STAMP=".swept",sanitize=a(t=>(t??"").replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,""),"sanitize"),MIN_PART_CHARS=4;function processName(...t){const e=t.map(sanitize).filter(Boolean),n=e.pop();if(n===void 0)return"";if(e.length===0)return n.slice(0,exports.PROCESS_NAME_MAX);const o=n.slice(0,exports.PROCESS_NAME_MAX-2),u=exports.PROCESS_NAME_MAX-o.length-1,c=e.map(()=>0);let S=0;for(let r=e.length-1;r>=0;r-=1){const i=Math.min(e[r].length,MIN_PART_CHARS),s=i+(S>0?1:0);if(S+s>u)break;c[r]=i,S+=s}for(let r=e.length-1;r>=0&&c[r]>0;r-=1){const i=Math.min(e[r].length-c[r],u-S);c[r]=c[r]+i,S+=i}const m=e.map((r,i)=>r.slice(0,c[i]).replace(/-+$/,"")).filter(Boolean).join("-");return m?`${m}-${o}`:o}l(processName,"processName"),p(processName,"processName"),a(processName,"processName");function legacyProcessName(...t){const e=t.map(sanitize).filter(Boolean),n=e.pop();if(n===void 0)return"";if(e.length===0)return n.slice(0,exports.PROCESS_NAME_MAX);const o=n.slice(0,exports.PROCESS_NAME_MAX-2),u=e.join("-").slice(0,exports.PROCESS_NAME_MAX-o.length-1).replace(/-+$/,"");return u?`${u}-${o}`:o}l(legacyProcessName,"legacyProcessName"),p(legacyProcessName,"legacyProcessName"),a(legacyProcessName,"legacyProcessName");function defaultLinkDirs(t=process.env){const e=t.LENSMCP_HOME||os.homedir();return[path.join(os.tmpdir(),"lensmcp-process-names"),path.join(e,".lensmcp","process-names")]}l(defaultLinkDirs,"defaultLinkDirs"),p(defaultLinkDirs,"defaultLinkDirs"),a(defaultLinkDirs,"defaultLinkDirs");function processNamesEnabled(t=process.env){const e=(t.LENSMCP_PROCESS_NAMES??"").trim().toLowerCase();return!(e==="0"||e==="false"||e==="no"||e==="off")}l(processNamesEnabled,"processNamesEnabled"),p(processNamesEnabled,"processNamesEnabled"),a(processNamesEnabled,"processNamesEnabled");const ownedByMe=a(t=>typeof process.getuid!="function"||t.uid===process.getuid(),"ownedByMe");function privateDir(t){try{fs.mkdirSync(t,{recursive:!0,mode:448});const e=fs.lstatSync(t);return!e.isDirectory()||!ownedByMe(e)?!1:((e.mode&63)!==0&&fs.chmodSync(t,448),!0)}catch{return!1}}l(privateDir,"privateDir"),p(privateDir,"privateDir"),a(privateDir,"privateDir");function isPrivateDir(t){try{const e=fs.lstatSync(t);return e.isDirectory()&&ownedByMe(e)&&(e.mode&18)===0}catch{return!1}}l(isPrivateDir,"isPrivateDir"),p(isPrivateDir,"isPrivateDir"),a(isPrivateDir,"isPrivateDir");function isSameFile(t,e){try{const n=fs.lstatSync(t);return n.isFile()&&n.dev===e.dev&&n.ino===e.ino}catch{return!1}}l(isSameFile,"isSameFile"),p(isSameFile,"isSameFile"),a(isSameFile,"isSameFile");function noteUse(t,e,n=new Date){const o=path.join(t,USED_DIR,e);try{fs.utimesSync(o,n,n)}catch{try{fs.mkdirSync(path.dirname(o),{recursive:!0,mode:448}),fs.writeFileSync(o,"",{mode:384})}catch{}}}l(noteUse,"noteUse"),p(noteUse,"noteUse"),a(noteUse,"noteUse");const resolved=new Map;function namedExecPath(t,e={}){const n=e.execPath??process.execPath,o=e.env??process.env,u=e.platform??process.platform,c=processName(t);if(!c||u==="win32"||!processNamesEnabled(o))return n;const S=e.dirs??defaultLinkDirs(o),m=`${n}|${c}|${S.join("|")}`;scheduleSweep(S);let r,i;try{r=fs.realpathSync(n),i=fs.statSync(r)}catch{return n}const s=resolved.get(m);if(s&&isSameFile(s.link,i))return noteUse(s.dir,s.name),s.link;for(const E of S){if(!privateDir(E))continue;const f=path.join(E,`${i.dev}-${i.ino}`);if(!privateDir(f))continue;const y=path.join(f,c);if(!isSameFile(y,i)){try{fs.unlinkSync(y)}catch{}try{fs.linkSync(r,y)}catch{}}if(isSameFile(y,i))return resolved.set(m,{link:y,dir:f,name:c}),noteUse(f,c),y}return n}l(namedExecPath,"namedExecPath"),p(namedExecPath,"namedExecPath"),a(namedExecPath,"namedExecPath");function prelinkProcessNames(t,e={}){const n=[];for(const o of new Set([...t].filter(Boolean)))n.push(namedExecPath(o,e));return n}l(prelinkProcessNames,"prelinkProcessNames"),p(prelinkProcessNames,"prelinkProcessNames"),a(prelinkProcessNames,"prelinkProcessNames");function sweepProcessNames(t={}){const e={removed:[],adopted:0,skipped:0},n=t.now??Date.now(),o=t.staleAfterMs??exports.STALE_AFTER_MS,u=t.maxRemovals??exports.SWEEP_MAX_REMOVALS;for(const c of t.dirs??defaultLinkDirs()){if(!isPrivateDir(c))continue;const S=path.join(c,SWEPT_STAMP);if(!t.force)try{if(n-fs.statSync(S).mtimeMs<exports.SWEEP_INTERVAL_MS){e.skipped+=1;continue}}catch{}try{fs.writeFileSync(S,"",{mode:384}),fs.utimesSync(S,new Date(n),new Date(n))}catch{continue}let m;try{m=fs.readdirSync(c).filter(r=>/^\d+-\d+$/.test(r)).map(r=>path.join(c,r))}catch{continue}for(const r of m){if(!isPrivateDir(r))continue;let i;try{i=fs.readdirSync(r).filter(s=>s!==USED_DIR)}catch{continue}for(const s of i){const E=path.join(r,s);try{if(!fs.lstatSync(E).isFile())continue}catch{continue}let f;try{f=fs.statSync(path.join(r,USED_DIR,s)).mtimeMs}catch{noteUse(r,s,new Date(n)),e.adopted+=1;continue}if(!(n-f<o||e.removed.length>=u))try{fs.unlinkSync(E),e.removed.push(E),fs.rmSync(path.join(r,USED_DIR,s),{force:!0})}catch{}}try{for(const s of fs.readdirSync(path.join(r,USED_DIR)))fs.existsSync(path.join(r,s))||fs.rmSync(path.join(r,USED_DIR,s),{force:!0})}catch{}try{fs.readdirSync(r).every(s=>s===USED_DIR)&&(fs.rmSync(path.join(r,USED_DIR),{recursive:!0,force:!0}),fs.rmdirSync(r))}catch{}}}return e}l(sweepProcessNames,"sweepProcessNames"),p(sweepProcessNames,"sweepProcessNames"),a(sweepProcessNames,"sweepProcessNames");const sweepScheduled=new Set;function scheduleSweep(t){const e=t.join("|");sweepScheduled.has(e)||(sweepScheduled.add(e),setTimeout(()=>{try{sweepProcessNames({dirs:t})}catch{}},exports.SWEEP_DELAY_MS).unref?.())}l(scheduleSweep,"scheduleSweep"),p(scheduleSweep,"scheduleSweep"),a(scheduleSweep,"scheduleSweep");
@@ -1 +1 @@
1
- "use strict";var h=Object.defineProperty;var r=(t,e)=>h(t,"name",{value:e,configurable:!0});var d=Object.defineProperty,f=r((t,e)=>d(t,"name",{value:e,configurable:!0}),"f");Object.defineProperty(exports,"__esModule",{value:!0}),exports.redisDisconnectFixEnabled=redisDisconnectFixEnabled,exports.finishStrandedDisconnect=finishStrandedDisconnect,exports.finishStrandedDisconnectsFor=finishStrandedDisconnectsFor;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path"));function redisDisconnectFixEnabled(t=process.env){const e=(t.LENSMCP_SWAP_FIX_IOREDIS_DISCONNECT??"").trim().toLowerCase();return!(e==="0"||e==="false"||e==="no"||e==="off")}r(redisDisconnectFixEnabled,"redisDisconnectFixEnabled"),f(redisDisconnectFixEnabled,"redisDisconnectFixEnabled");const failAll=f((t,e)=>{if(!(!t||typeof t.shift!="function"))for(let n=t.shift();n;n=t.shift())try{n.command?.reject?.(e)}catch{}},"failAll");function finishStrandedDisconnect(t){const e=t,n=(typeof e?.Redis=="function"?e.Redis:typeof e?.default=="function"?e.default:e)?.prototype,i=n?.disconnect;if(typeof i!="function"||i.__lensmcpEnds||typeof n.setStatus!="function")return!1;const o=f(function(c=!1){const a=!c&&this.status==="reconnecting",u=i.call(this,c);if(a&&this.status==="reconnecting")try{const s=new Error("Connection is closed.");this.setStatus("end"),typeof this.flushQueue=="function"&&this.flushQueue(s),failAll(this.prevCommandQueue,s),this.prevCommandQueue=null}catch{}return u},"wrapped");return o.__lensmcpEnds=!0,n.disconnect=o,!0}r(finishStrandedDisconnect,"finishStrandedDisconnect"),f(finishStrandedDisconnect,"finishStrandedDisconnect");function finishStrandedDisconnectsFor(t,e=require){const n=[path.dirname(t)],i=[n];try{i.push([path.dirname(e.resolve("bullmq/package.json",{paths:n}))])}catch{}const o=new Set,c=[];let a=0;for(const u of i){let s;try{s=e.resolve("ioredis",{paths:u})}catch{continue}if(!o.has(s)&&(o.add(s),!!finishStrandedDisconnect(e(s)))){a+=1;try{const l=e(e.resolve("ioredis/package.json",{paths:u})).version;l&&!c.includes(l)&&c.push(l)}catch{}}}return o.size===0?void 0:{patched:a,versions:c}}r(finishStrandedDisconnectsFor,"finishStrandedDisconnectsFor"),f(finishStrandedDisconnectsFor,"finishStrandedDisconnectsFor");
1
+ "use strict";var S=Object.defineProperty;var a=(n,e)=>S(n,"name",{value:e,configurable:!0});var h=Object.defineProperty,r=a((n,e)=>h(n,"name",{value:e,configurable:!0}),"r"),d=Object.defineProperty,f=r((n,e)=>d(n,"name",{value:e,configurable:!0}),"f");Object.defineProperty(exports,"__esModule",{value:!0}),exports.redisDisconnectFixEnabled=redisDisconnectFixEnabled,exports.finishStrandedDisconnect=finishStrandedDisconnect,exports.finishStrandedDisconnectsFor=finishStrandedDisconnectsFor;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path"));function redisDisconnectFixEnabled(n=process.env){const e=(n.LENSMCP_SWAP_FIX_IOREDIS_DISCONNECT??"").trim().toLowerCase();return!(e==="0"||e==="false"||e==="no"||e==="off")}a(redisDisconnectFixEnabled,"redisDisconnectFixEnabled"),r(redisDisconnectFixEnabled,"redisDisconnectFixEnabled"),f(redisDisconnectFixEnabled,"redisDisconnectFixEnabled");const failAll=f((n,e)=>{if(!(!n||typeof n.shift!="function"))for(let t=n.shift();t;t=n.shift())try{t.command?.reject?.(e)}catch{}},"failAll");function finishStrandedDisconnect(n){const e=n,t=(typeof e?.Redis=="function"?e.Redis:typeof e?.default=="function"?e.default:e)?.prototype,i=t?.disconnect;if(typeof i!="function"||i.__lensmcpEnds||typeof t.setStatus!="function")return!1;const o=f(function(c=!1){const u=!c&&this.status==="reconnecting",l=i.call(this,c);if(u&&this.status==="reconnecting")try{const s=new Error("Connection is closed.");this.setStatus("end"),typeof this.flushQueue=="function"&&this.flushQueue(s),failAll(this.prevCommandQueue,s),this.prevCommandQueue=null}catch{}return l},"wrapped");return o.__lensmcpEnds=!0,t.disconnect=o,!0}a(finishStrandedDisconnect,"finishStrandedDisconnect"),r(finishStrandedDisconnect,"finishStrandedDisconnect"),f(finishStrandedDisconnect,"finishStrandedDisconnect");function finishStrandedDisconnectsFor(n,e=require){const t=[path.dirname(n)],i=[t];try{i.push([path.dirname(e.resolve("bullmq/package.json",{paths:t}))])}catch{}const o=new Set,c=[];let u=0;for(const l of i){let s;try{s=e.resolve("ioredis",{paths:l})}catch{continue}if(!o.has(s)&&(o.add(s),!!finishStrandedDisconnect(e(s)))){u+=1;try{const p=e(e.resolve("ioredis/package.json",{paths:l})).version;p&&!c.includes(p)&&c.push(p)}catch{}}}return o.size===0?void 0:{patched:u,versions:c}}a(finishStrandedDisconnectsFor,"finishStrandedDisconnectsFor"),r(finishStrandedDisconnectsFor,"finishStrandedDisconnectsFor"),f(finishStrandedDisconnectsFor,"finishStrandedDisconnectsFor");
@@ -1 +1 @@
1
- "use strict";var c=Object.defineProperty;var r=(n,e)=>c(n,"name",{value:e,configurable:!0});var u=Object.defineProperty,t=r((n,e)=>u(n,"name",{value:e,configurable:!0}),"t");Object.defineProperty(exports,"__esModule",{value:!0}),exports.schemaPrewarmEnabled=schemaPrewarmEnabled,exports.prewarmZod=prewarmZod,exports.prewarmZodFor=prewarmZodFor;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path"));function schemaPrewarmEnabled(n=process.env){const e=(n.LENSMCP_SWAP_PREWARM_ZOD??"").trim().toLowerCase();return!(e==="0"||e==="false"||e==="no"||e==="off")}r(schemaPrewarmEnabled,"schemaPrewarmEnabled"),t(schemaPrewarmEnabled,"schemaPrewarmEnabled");const identity=t(n=>n,"identity"),BUILDERS=[n=>n.string(),n=>n.number(),n=>n.bigint(),n=>n.boolean(),n=>n.date(),n=>n.symbol(),n=>n.undefined(),n=>n.null(),n=>n.any(),n=>n.unknown(),n=>n.never(),n=>n.void(),n=>n.nan(),n=>n.int(),n=>n.float32(),n=>n.float64(),n=>n.int32(),n=>n.uint32(),n=>n.int64(),n=>n.uint64(),n=>n.email(),n=>n.guid(),n=>n.uuid(),n=>n.url(),n=>n.emoji(),n=>n.nanoid(),n=>n.cuid(),n=>n.cuid2(),n=>n.ulid(),n=>n.xid(),n=>n.ksuid(),n=>n.ipv4(),n=>n.ipv6(),n=>n.mac(),n=>n.cidrv4(),n=>n.cidrv6(),n=>n.base64(),n=>n.base64url(),n=>n.e164(),n=>n.jwt(),n=>n.hostname(),n=>n.hex(),n=>n.httpUrl(),n=>n.stringFormat("lensmcp",identity),n=>n.iso.datetime(),n=>n.iso.date(),n=>n.iso.time(),n=>n.iso.duration(),n=>n.array(n.unknown()),n=>n.object({}),n=>n.strictObject({}),n=>n.looseObject({}),n=>n.union([n.unknown(),n.unknown()]),n=>n.xor([n.string(),n.number()]),n=>n.discriminatedUnion("kind",[n.object({kind:n.literal("a")}),n.object({kind:n.literal("b")})]),n=>n.intersection(n.unknown(),n.unknown()),n=>n.tuple([n.unknown()]),n=>n.record(n.string(),n.unknown()),n=>n.partialRecord(n.string(),n.unknown()),n=>n.map(n.unknown(),n.unknown()),n=>n.set(n.unknown()),n=>n.enum(["a"]),n=>n.nativeEnum({A:"a"}),n=>n.literal("a"),n=>n.file(),n=>n.templateLiteral(["a"]),n=>n.transform(identity),n=>n.unknown().transform(identity),n=>n.unknown().pipe(n.unknown()),n=>n.unknown().optional(),n=>n.exactOptional(n.unknown()),n=>n.unknown().nullable(),n=>n.unknown().nullish(),n=>n.unknown().default(0),n=>n.unknown().prefault(0),n=>n.unknown().nonoptional(),n=>n.success(n.unknown()),n=>n.unknown().catch(0),n=>n.unknown().readonly(),n=>n.lazy(()=>n.unknown()),n=>n.promise(n.unknown()),n=>n.custom(()=>!0),n=>n.unknown().refine(()=>!0),n=>n.unknown().superRefine(()=>{}),n=>n.instanceof(Object),n=>n.function(),n=>n.json(),n=>n.stringbool(),n=>n.preprocess(identity,n.unknown()),n=>n.codec(n.unknown(),n.unknown(),{decode:identity,encode:identity}),n=>n.coerce.string(),n=>n.coerce.number(),n=>n.coerce.boolean(),n=>n.coerce.bigint(),n=>n.coerce.date()];function prewarmZod(n){const e=n?.z??n;if(!e||typeof e.object!="function")return 0;let o=0;for(const i of BUILDERS)try{i(e)!==void 0&&(o+=1)}catch{}return o}r(prewarmZod,"prewarmZod"),t(prewarmZod,"prewarmZod");function prewarmZodFor(n,e=require){let o;try{o=e.resolve("zod",{paths:[path.dirname(n)]})}catch{return}const i=prewarmZod(e(o));let a;try{a=e(e.resolve("zod/package.json",{paths:[path.dirname(n)]})).version}catch{}return{created:i,...a?{version:a}:{}}}r(prewarmZodFor,"prewarmZodFor"),t(prewarmZodFor,"prewarmZodFor");
1
+ "use strict";var d=Object.defineProperty;var i=(n,e)=>d(n,"name",{value:e,configurable:!0});var c=Object.defineProperty,r=i((n,e)=>c(n,"name",{value:e,configurable:!0}),"r"),u=Object.defineProperty,t=r((n,e)=>u(n,"name",{value:e,configurable:!0}),"t");Object.defineProperty(exports,"__esModule",{value:!0}),exports.schemaPrewarmEnabled=schemaPrewarmEnabled,exports.prewarmZod=prewarmZod,exports.prewarmZodFor=prewarmZodFor;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path"));function schemaPrewarmEnabled(n=process.env){const e=(n.LENSMCP_SWAP_PREWARM_ZOD??"").trim().toLowerCase();return!(e==="0"||e==="false"||e==="no"||e==="off")}i(schemaPrewarmEnabled,"schemaPrewarmEnabled"),r(schemaPrewarmEnabled,"schemaPrewarmEnabled"),t(schemaPrewarmEnabled,"schemaPrewarmEnabled");const identity=t(n=>n,"identity"),BUILDERS=[n=>n.string(),n=>n.number(),n=>n.bigint(),n=>n.boolean(),n=>n.date(),n=>n.symbol(),n=>n.undefined(),n=>n.null(),n=>n.any(),n=>n.unknown(),n=>n.never(),n=>n.void(),n=>n.nan(),n=>n.int(),n=>n.float32(),n=>n.float64(),n=>n.int32(),n=>n.uint32(),n=>n.int64(),n=>n.uint64(),n=>n.email(),n=>n.guid(),n=>n.uuid(),n=>n.url(),n=>n.emoji(),n=>n.nanoid(),n=>n.cuid(),n=>n.cuid2(),n=>n.ulid(),n=>n.xid(),n=>n.ksuid(),n=>n.ipv4(),n=>n.ipv6(),n=>n.mac(),n=>n.cidrv4(),n=>n.cidrv6(),n=>n.base64(),n=>n.base64url(),n=>n.e164(),n=>n.jwt(),n=>n.hostname(),n=>n.hex(),n=>n.httpUrl(),n=>n.stringFormat("lensmcp",identity),n=>n.iso.datetime(),n=>n.iso.date(),n=>n.iso.time(),n=>n.iso.duration(),n=>n.array(n.unknown()),n=>n.object({}),n=>n.strictObject({}),n=>n.looseObject({}),n=>n.union([n.unknown(),n.unknown()]),n=>n.xor([n.string(),n.number()]),n=>n.discriminatedUnion("kind",[n.object({kind:n.literal("a")}),n.object({kind:n.literal("b")})]),n=>n.intersection(n.unknown(),n.unknown()),n=>n.tuple([n.unknown()]),n=>n.record(n.string(),n.unknown()),n=>n.partialRecord(n.string(),n.unknown()),n=>n.map(n.unknown(),n.unknown()),n=>n.set(n.unknown()),n=>n.enum(["a"]),n=>n.nativeEnum({A:"a"}),n=>n.literal("a"),n=>n.file(),n=>n.templateLiteral(["a"]),n=>n.transform(identity),n=>n.unknown().transform(identity),n=>n.unknown().pipe(n.unknown()),n=>n.unknown().optional(),n=>n.exactOptional(n.unknown()),n=>n.unknown().nullable(),n=>n.unknown().nullish(),n=>n.unknown().default(0),n=>n.unknown().prefault(0),n=>n.unknown().nonoptional(),n=>n.success(n.unknown()),n=>n.unknown().catch(0),n=>n.unknown().readonly(),n=>n.lazy(()=>n.unknown()),n=>n.promise(n.unknown()),n=>n.custom(()=>!0),n=>n.unknown().refine(()=>!0),n=>n.unknown().superRefine(()=>{}),n=>n.instanceof(Object),n=>n.function(),n=>n.json(),n=>n.stringbool(),n=>n.preprocess(identity,n.unknown()),n=>n.codec(n.unknown(),n.unknown(),{decode:identity,encode:identity}),n=>n.coerce.string(),n=>n.coerce.number(),n=>n.coerce.boolean(),n=>n.coerce.bigint(),n=>n.coerce.date()];function prewarmZod(n){const e=n?.z??n;if(!e||typeof e.object!="function")return 0;let o=0;for(const a of BUILDERS)try{a(e)!==void 0&&(o+=1)}catch{}return o}i(prewarmZod,"prewarmZod"),r(prewarmZod,"prewarmZod"),t(prewarmZod,"prewarmZod");function prewarmZodFor(n,e=require){let o;try{o=e.resolve("zod",{paths:[path.dirname(n)]})}catch{return}const a=prewarmZod(e(o));let s;try{s=e(e.resolve("zod/package.json",{paths:[path.dirname(n)]})).version}catch{}return{created:a,...s?{version:s}:{}}}i(prewarmZodFor,"prewarmZodFor"),r(prewarmZodFor,"prewarmZodFor"),t(prewarmZodFor,"prewarmZodFor");
package/serve-runner.js CHANGED
@@ -1 +1 @@
1
- "use strict";var p=Object.defineProperty;var t=(s,r)=>p(s,"name",{value:r,configurable:!0});var u=Object.defineProperty,o=t((s,r)=>u(s,"name",{value:r,configurable:!0}),"o");Object.defineProperty(exports,"__esModule",{value:!0}),exports.exitCodeForSignal=void 0;const devserver_host_1=require("./devserver-host");Object.defineProperty(exports,"exitCodeForSignal",{enumerable:!0,get:o(function(){return devserver_host_1.exitCodeForSignal},"get")});const TASK_WAIT_MS=3e4,STOP_SIGNALS=["SIGTERM","SIGINT","SIGHUP"];function main(){process.env.NX_CLI_SET="true";const s=process.env.NX_WORKSPACE_ROOT;(!s||typeof process.send!="function")&&(console.error("[serve-runner] started without a task channel \u2014 only the dev gateway starts this process"),process.exit(1)),(0,devserver_host_1.markServeRunner)();let r=!1;const i=o(e=>{r||(r=!0,!(0,devserver_host_1.devserverOwnsExit)()&&setImmediate(()=>process.exit((0,devserver_host_1.exitCodeForSignal)(e))))},"stop");for(const e of STOP_SIGNALS)process.on(e,()=>i(e));process.on("disconnect",()=>{r||(console.error("[serve-runner] the gateway is gone \u2014 stopping the service"),process.kill(process.pid,"SIGTERM"))});const c=setTimeout(()=>{console.error(`[serve-runner] no task arrived within ${TASK_WAIT_MS/1e3}s \u2014 exiting`),process.exit(1)},TASK_WAIT_MS);process.once("message",e=>{clearTimeout(c),(async()=>{let n=1;try{n=await require(e.nxRunModule).run(process.cwd(),s,e.targetDescription,e.overrides,e.isVerbose,e.taskGraph)}catch(a){console.error(a)}process.exit(n)})()})}t(main,"main"),o(main,"main"),require.main===module&&main();
1
+ "use strict";var l=Object.defineProperty;var n=(s,r)=>l(s,"name",{value:r,configurable:!0});var p=Object.defineProperty,t=n((s,r)=>p(s,"name",{value:r,configurable:!0}),"t"),u=Object.defineProperty,o=t((s,r)=>u(s,"name",{value:r,configurable:!0}),"o");Object.defineProperty(exports,"__esModule",{value:!0}),exports.exitCodeForSignal=void 0;const devserver_host_1=require("./devserver-host");Object.defineProperty(exports,"exitCodeForSignal",{enumerable:!0,get:o(function(){return devserver_host_1.exitCodeForSignal},"get")});const TASK_WAIT_MS=3e4,STOP_SIGNALS=["SIGTERM","SIGINT","SIGHUP"];function main(){process.env.NX_CLI_SET="true";const s=process.env.NX_WORKSPACE_ROOT;(!s||typeof process.send!="function")&&(console.error("[serve-runner] started without a task channel \u2014 only the dev gateway starts this process"),process.exit(1)),(0,devserver_host_1.markServeRunner)();let r=!1;const c=o(e=>{r||(r=!0,!(0,devserver_host_1.devserverOwnsExit)()&&setImmediate(()=>process.exit((0,devserver_host_1.exitCodeForSignal)(e))))},"stop");for(const e of STOP_SIGNALS)process.on(e,()=>c(e));process.on("disconnect",()=>{r||(console.error("[serve-runner] the gateway is gone \u2014 stopping the service"),process.kill(process.pid,"SIGTERM"))});const a=setTimeout(()=>{console.error(`[serve-runner] no task arrived within ${TASK_WAIT_MS/1e3}s \u2014 exiting`),process.exit(1)},TASK_WAIT_MS);process.once("message",e=>{clearTimeout(a),(async()=>{let i=1;try{i=await require(e.nxRunModule).run(process.cwd(),s,e.targetDescription,e.overrides,e.isVerbose,e.taskGraph)}catch(d){console.error(d)}process.exit(i)})()})}n(main,"main"),t(main,"main"),o(main,"main"),require.main===module&&main();
@@ -45,8 +45,8 @@ export interface SwapReport {
45
45
  export declare function workspaceRelative(files: readonly string[], root: string | undefined): string[];
46
46
  /** Parse what arrived over HTTP into a build account, or nothing: never trust a body's shape. */
47
47
  export declare function buildAccountOf(raw: unknown): BuildAccount | undefined;
48
- /** A build of this service started (`phase: 'started'`) or ended with errors (`'failed'`). */
49
- export declare function buildServiceBuildEvent(who: Pick<PodIdentity, 'project' | 'service' | 'podGeneration'>, phase: 'started' | 'failed', build: BuildAccount, opts?: {
48
+ /** A build of this service started (`phase: 'started'`), ended with errors (`'failed'`), or ended leaving its bundle as it was (`'unchanged'`). */
49
+ export declare function buildServiceBuildEvent(who: Pick<PodIdentity, 'project' | 'service' | 'podGeneration'>, phase: 'started' | 'failed' | 'unchanged', build: BuildAccount, opts?: {
50
50
  root?: string;
51
51
  at?: number;
52
52
  id?: () => string;
@@ -1,2 +1,2 @@
1
- "use strict";var f=Object.defineProperty;var c=(r,e)=>f(r,"name",{value:e,configurable:!0});var p=Object.defineProperty,i=c((r,e)=>p(r,"name",{value:e,configurable:!0}),"i");Object.defineProperty(exports,"__esModule",{value:!0}),exports.workspaceRelative=workspaceRelative,exports.buildAccountOf=buildAccountOf,exports.buildServiceBuildEvent=buildServiceBuildEvent,exports.buildServiceSwapEvent=buildServiceSwapEvent;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),MAX_FILES=50,MAX_ERROR_CHARS=500;let idCounter=0;function makeId(){return idCounter=(idCounter+1)%65535,`${Date.now().toString(36)}${idCounter.toString(36)}${Math.random().toString(36).slice(2,8)}`}c(makeId,"makeId"),i(makeId,"makeId");function workspaceRelative(r,e){return r.slice(0,MAX_FILES).map(t=>{if(!e||!path.isAbsolute(t))return t;const o=path.relative(e,t);return o&&!o.startsWith("..")&&!path.isAbsolute(o)?o.split(path.sep).join("/"):t})}c(workspaceRelative,"workspaceRelative"),i(workspaceRelative,"workspaceRelative");function buildAccountOf(r){if(!r||typeof r!="object")return;const e=r;if(typeof e.startedAt!="number"||!Number.isFinite(e.startedAt)||e.startedAt<=0)return;const t=Array.isArray(e.changedFiles)?e.changedFiles.filter(o=>typeof o=="string"&&o.length>0&&o.length<1024).slice(0,MAX_FILES):[];return{startedAt:e.startedAt,...typeof e.endedAt=="number"&&Number.isFinite(e.endedAt)?{endedAt:e.endedAt}:{},changedFiles:t,...typeof e.moreChanged=="number"&&e.moreChanged>0?{moreChanged:Math.floor(e.moreChanged)}:{},...typeof e.error=="string"&&e.error.trim()?{error:e.error.trim().slice(0,MAX_ERROR_CHARS)}:{}}}c(buildAccountOf,"buildAccountOf"),i(buildAccountOf,"buildAccountOf");function envelope(r,e,t,o,s,n,a){const d="pending";return{id:a(),sessionId:d,timestamp:e,source:"gateway",category:"cluster",severity:t,context:{sessionId:d,projectName:r.project},fingerprint:`cluster:${r.project}:${o}`,title:s,raw:{kind:o,...n,project:r.project,service:r.service,podGeneration:r.podGeneration}}}c(envelope,"envelope"),i(envelope,"envelope");const filesText=i((r,e)=>{const t=r+e;return t===0?"no source change":`${t} file${t===1?"":"s"}`},"filesText"),seconds=i(r=>r<1e3?`${r}ms`:`${(r/1e3).toFixed(1)}s`,"seconds");function buildServiceBuildEvent(r,e,t,o={}){const s=workspaceRelative(t.changedFiles,o.root),n=t.moreChanged??0,a=o.at??(e==="failed"?t.endedAt??Date.now():t.startedAt),d=t.endedAt!==void 0?Math.max(0,t.endedAt-t.startedAt):void 0,l=e==="failed"&&t.error?t.error.split(`
2
- `)[0].slice(0,160):void 0,u=e==="started"?`build started: ${r.project} \u2014 ${filesText(s.length,n)}`:`build failed: ${r.project} \u2014 ${l??filesText(s.length,n)}${d!==void 0?` \xB7 ${seconds(d)}`:""} \xB7 nothing was swapped, the pod serves the last good build`;return envelope(r,a,e==="failed"?"warning":"info","service-build",u,{phase:e,startedAt:t.startedAt,...t.endedAt!==void 0?{endedAt:t.endedAt,compileMs:d}:{},changedFiles:s,...n>0?{moreChanged:n}:{},...e==="failed"&&t.error?{error:t.error}:{}},o.id??makeId)}c(buildServiceBuildEvent,"buildServiceBuildEvent"),i(buildServiceBuildEvent,"buildServiceBuildEvent");function buildServiceSwapEvent(r,e,t,o={}){const s=o.at??Date.now(),n=workspaceRelative(t?.changedFiles??[],o.root),a=t?.moreChanged??0,d=t?.endedAt!==void 0?Math.max(0,t.endedAt-t.startedAt):void 0,l=e.handoff?`swap: ${r.project} \u2014 a fresh pod on the new build`+(t?` \xB7 ${filesText(n.length,a)}`:"")+(d!==void 0?` \xB7 compiled in ${seconds(d)}`:"")+` \xB7 ready in ${seconds(e.swapMs)} while the previous pod served`:`swap: ${r.project} \u2014 generation ${e.generation} (${e.swaps} swap${e.swaps===1?"":"s"})`+(t?` \xB7 ${filesText(n.length,a)}`:"")+(d!==void 0?` \xB7 compiled in ${seconds(d)}`:"")+` \xB7 swapped in ${seconds(e.swapMs)}`;return envelope(r,s,"info","service-swap",l,{pod:r.pod,pid:r.pid,generation:e.generation,swaps:e.swaps,swappedAt:s,swapMs:e.swapMs,draining:e.draining,...e.handoff?{handoff:{fromPid:e.handoff.fromPid}}:{},...t?{compile:{startedAt:t.startedAt,...t.endedAt!==void 0?{endedAt:t.endedAt,ms:d}:{}},changedFiles:n,...a>0?{moreChanged:a}:{}}:{}},o.id??makeId)}c(buildServiceSwapEvent,"buildServiceSwapEvent"),i(buildServiceSwapEvent,"buildServiceSwapEvent");
1
+ "use strict";var g=Object.defineProperty;var l=(n,e)=>g(n,"name",{value:e,configurable:!0});var f=Object.defineProperty,c=l((n,e)=>f(n,"name",{value:e,configurable:!0}),"c"),p=Object.defineProperty,s=c((n,e)=>p(n,"name",{value:e,configurable:!0}),"s");Object.defineProperty(exports,"__esModule",{value:!0}),exports.workspaceRelative=workspaceRelative,exports.buildAccountOf=buildAccountOf,exports.buildServiceBuildEvent=buildServiceBuildEvent,exports.buildServiceSwapEvent=buildServiceSwapEvent;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),MAX_FILES=50,MAX_ERROR_CHARS=500;let idCounter=0;function makeId(){return idCounter=(idCounter+1)%65535,`${Date.now().toString(36)}${idCounter.toString(36)}${Math.random().toString(36).slice(2,8)}`}l(makeId,"makeId"),c(makeId,"makeId"),s(makeId,"makeId");function workspaceRelative(n,e){return n.slice(0,MAX_FILES).map(t=>{if(!e||!path.isAbsolute(t))return t;const r=path.relative(e,t);return r&&!r.startsWith("..")&&!path.isAbsolute(r)?r.split(path.sep).join("/"):t})}l(workspaceRelative,"workspaceRelative"),c(workspaceRelative,"workspaceRelative"),s(workspaceRelative,"workspaceRelative");function buildAccountOf(n){if(!n||typeof n!="object")return;const e=n;if(typeof e.startedAt!="number"||!Number.isFinite(e.startedAt)||e.startedAt<=0)return;const t=Array.isArray(e.changedFiles)?e.changedFiles.filter(r=>typeof r=="string"&&r.length>0&&r.length<1024).slice(0,MAX_FILES):[];return{startedAt:e.startedAt,...typeof e.endedAt=="number"&&Number.isFinite(e.endedAt)?{endedAt:e.endedAt}:{},changedFiles:t,...typeof e.moreChanged=="number"&&e.moreChanged>0?{moreChanged:Math.floor(e.moreChanged)}:{},...typeof e.error=="string"&&e.error.trim()?{error:e.error.trim().slice(0,MAX_ERROR_CHARS)}:{}}}l(buildAccountOf,"buildAccountOf"),c(buildAccountOf,"buildAccountOf"),s(buildAccountOf,"buildAccountOf");function envelope(n,e,t,r,o,d,a){const i="pending";return{id:a(),sessionId:i,timestamp:e,source:"gateway",category:"cluster",severity:t,context:{sessionId:i,projectName:n.project},fingerprint:`cluster:${n.project}:${r}`,title:o,raw:{kind:r,...d,project:n.project,service:n.service,podGeneration:n.podGeneration}}}l(envelope,"envelope"),c(envelope,"envelope"),s(envelope,"envelope");const filesText=s((n,e)=>{const t=n+e;return t===0?"no source change":`${t} file${t===1?"":"s"}`},"filesText"),seconds=s(n=>n<1e3?`${n}ms`:`${(n/1e3).toFixed(1)}s`,"seconds");function buildServiceBuildEvent(n,e,t,r={}){const o=workspaceRelative(t.changedFiles,r.root),d=t.moreChanged??0,a=r.at??(e==="started"?t.startedAt:t.endedAt??Date.now()),i=t.endedAt!==void 0?Math.max(0,t.endedAt-t.startedAt):void 0,u=e==="failed"&&t.error?t.error.split(`
2
+ `)[0].slice(0,160):void 0,v=e==="started"?`build started: ${n.project} \u2014 ${filesText(o.length,d)}`:e==="unchanged"?`build unchanged: ${n.project} \u2014 ${filesText(o.length,d)}${i!==void 0?` \xB7 ${seconds(i)}`:""} \xB7 its bundle came out as it was, nothing to swap`:`build failed: ${n.project} \u2014 ${u??filesText(o.length,d)}${i!==void 0?` \xB7 ${seconds(i)}`:""} \xB7 nothing was swapped, the pod serves the last good build`;return envelope(n,a,e==="failed"?"warning":"info","service-build",v,{phase:e,startedAt:t.startedAt,...t.endedAt!==void 0?{endedAt:t.endedAt,compileMs:i}:{},changedFiles:o,...d>0?{moreChanged:d}:{},...e==="failed"&&t.error?{error:t.error}:{}},r.id??makeId)}l(buildServiceBuildEvent,"buildServiceBuildEvent"),c(buildServiceBuildEvent,"buildServiceBuildEvent"),s(buildServiceBuildEvent,"buildServiceBuildEvent");function buildServiceSwapEvent(n,e,t,r={}){const o=r.at??Date.now(),d=workspaceRelative(t?.changedFiles??[],r.root),a=t?.moreChanged??0,i=t?.endedAt!==void 0?Math.max(0,t.endedAt-t.startedAt):void 0,u=e.handoff?`swap: ${n.project} \u2014 a fresh pod on the new build`+(t?` \xB7 ${filesText(d.length,a)}`:"")+(i!==void 0?` \xB7 compiled in ${seconds(i)}`:"")+` \xB7 ready in ${seconds(e.swapMs)} while the previous pod served`:`swap: ${n.project} \u2014 generation ${e.generation} (${e.swaps} swap${e.swaps===1?"":"s"})`+(t?` \xB7 ${filesText(d.length,a)}`:"")+(i!==void 0?` \xB7 compiled in ${seconds(i)}`:"")+` \xB7 swapped in ${seconds(e.swapMs)}`;return envelope(n,o,"info","service-swap",u,{pod:n.pod,pid:n.pid,generation:e.generation,swaps:e.swaps,swappedAt:o,swapMs:e.swapMs,draining:e.draining,...e.handoff?{handoff:{fromPid:e.handoff.fromPid}}:{},...t?{compile:{startedAt:t.startedAt,...t.endedAt!==void 0?{endedAt:t.endedAt,ms:i}:{}},changedFiles:d,...a>0?{moreChanged:a}:{}}:{}},r.id??makeId)}l(buildServiceSwapEvent,"buildServiceSwapEvent"),c(buildServiceSwapEvent,"buildServiceSwapEvent"),s(buildServiceSwapEvent,"buildServiceSwapEvent");
@@ -1,3 +1,3 @@
1
- "use strict";var T=Object.defineProperty;var f=(e,t)=>T(e,"name",{value:t,configurable:!0});var _=Object.defineProperty,o=f((e,t)=>_(e,"name",{value:t,configurable:!0}),"o");Object.defineProperty(exports,"__esModule",{value:!0}),exports.JOIN_TIMEOUT_MS=void 0,exports.sharedBuildOffered=sharedBuildOffered,exports.joinSharedBuild=joinSharedBuild,exports.createAttachedTypecheck=createAttachedTypecheck;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),fork_ts_check_reporter_1=require("../fork-ts-check-reporter"),tsgo_check_plugin_1=require("../tsgo-check-plugin"),protocol_1=require("./protocol");exports.JOIN_TIMEOUT_MS=12e4;function sharedBuildOffered(e=process.env,t=process){return e[protocol_1.SHARED_BUILD_ENV]==="1"&&typeof t.send=="function"}f(sharedBuildOffered,"sharedBuildOffered"),o(sharedBuildOffered,"sharedBuildOffered");function joinSharedBuild(e,t={}){const i=t.proc??process,c=t.timeoutMs??exports.JOIN_TIMEOUT_MS;return new Promise(n=>{const p=[];let d,s=!1;const u=o(r=>{if(!(0,protocol_1.isRunnerInbound)(r))return;const a=r.event;if(!s)return a.type==="refused"?l({kind:"refused",reason:a.reason}):a.type!=="accepted"?void 0:l({kind:"attached",session:m(a)});d?d(a):p.push(a)},"onMessage"),h=o(()=>{i.removeListener("message",u)},"close"),m=o(r=>({accepted:r,listen(a){d=a;for(const w of p.splice(0))a(w)},close:h}),"makeSession"),l=o(r=>{s||(s=!0,clearTimeout(k),r.kind==="refused"&&h(),n(r))},"finish"),k=setTimeout(()=>l({kind:"refused",reason:`the build host did not answer within ${Math.round(c/1e3)} s`}),c);k.unref?.(),i.on("message",u);const g={channel:protocol_1.SHARED_BUILD_CHANNEL,type:"join",join:e};try{i.send?.(g,void 0,void 0,r=>{r&&l({kind:"refused",reason:`could not reach the gateway (${r.message})`})})}catch(r){l({kind:"refused",reason:`could not reach the gateway (${r.message})`})}})}f(joinSharedBuild,"joinSharedBuild"),o(joinSharedBuild,"joinSharedBuild");function createAttachedTypecheck(e){const t=e.env??process.env,i=t.LENSMCP_TYPECHECK;if(i==="off")return{built:o(()=>{},"built"),dispose:o(()=>{},"dispose")};if(i==="tsgo"){if((0,tsgo_check_plugin_1.resolveTsgoBin)(e.workspaceRoot,t.LENSMCP_TSGO_BIN)){const n=new tsgo_check_plugin_1.TsgoCheckPlugin({appName:e.appName,tsConfig:e.tsConfig,workspaceRoot:e.workspaceRoot,...t.LENSMCP_TSGO_BIN?{binPath:t.LENSMCP_TSGO_BIN}:{}}),p=[];return n.apply({hooks:{done:{tap:o((d,s)=>p.push(s),"tap")}}}),{built:o(d=>{for(const s of p)s({hasErrors:o(()=>!d.ok,"hasErrors")})},"built"),dispose:o(()=>n.dispose(),"dispose")}}const c=`${tsgo_check_plugin_1.TSGO_MISSING_CAUSE}. Fell back to fork-ts-checker, which reports to the console only \u2014 so typecheck:// has no producer for this project until it is fixed`;console.warn(`[serve] ${e.appName}: LENSMCP_TYPECHECK=tsgo but ${c}.`),(0,tsgo_check_plugin_1.reportTsgoUnavailable)({appName:e.appName,tsConfig:e.tsConfig,workspaceRoot:e.workspaceRoot,detail:c})}return forkTsCheckerOnItsOwn(e)}f(createAttachedTypecheck,"createAttachedTypecheck"),o(createAttachedTypecheck,"createAttachedTypecheck");function forkTsCheckerOnItsOwn(e){const t=(0,fork_ts_check_reporter_1.loadForkTsChecker)(e.workspaceRoot),i=t?.default??t;if(typeof i!="function")return console.warn(`[serve] ${e.appName}: fork-ts-checker-webpack-plugin is not installed \u2014 this service is not type-checked`),{built:o(()=>{},"built"),dispose:o(()=>{},"dispose")};let c=[],n,p=!1;const d=o(()=>{n=require("webpack")({mode:"development",context:e.workspaceRoot,entry:{},infrastructureLogging:{level:"info"},plugins:[{apply(s){s.hooks.afterCompile.tapPromise("LensmcpAttachedTypecheck",()=>new Promise(u=>setTimeout(u,0))),s.hooks.afterCompile.tap("LensmcpAttachedTypecheck",u=>{for(const h of c)u.fileDependencies.add(h)})}},new i({async:!0,typescript:{configFile:e.tsConfig,memoryLimit:e.memoryLimit}}),new fork_ts_check_reporter_1.ForkTsCheckReporterPlugin({appName:e.appName,tsConfig:e.tsConfig,workspaceRoot:e.workspaceRoot})]}).watch({ignored:["**/node_modules/**",`${path.join(e.workspaceRoot,"dist")}/**`]},()=>{})},"start");return{built(s){if(p)return;const u=s.files&&s.files.join(`
1
+ "use strict";var C=Object.defineProperty;var l=(e,t)=>C(e,"name",{value:t,configurable:!0});var T=Object.defineProperty,f=l((e,t)=>T(e,"name",{value:t,configurable:!0}),"f"),_=Object.defineProperty,o=f((e,t)=>_(e,"name",{value:t,configurable:!0}),"o");Object.defineProperty(exports,"__esModule",{value:!0}),exports.JOIN_TIMEOUT_MS=void 0,exports.sharedBuildOffered=sharedBuildOffered,exports.joinSharedBuild=joinSharedBuild,exports.createAttachedTypecheck=createAttachedTypecheck;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),fork_ts_check_reporter_1=require("../fork-ts-check-reporter"),tsgo_check_plugin_1=require("../tsgo-check-plugin"),protocol_1=require("./protocol");exports.JOIN_TIMEOUT_MS=12e4;function sharedBuildOffered(e=process.env,t=process){return e[protocol_1.SHARED_BUILD_ENV]==="1"&&typeof t.send=="function"}l(sharedBuildOffered,"sharedBuildOffered"),f(sharedBuildOffered,"sharedBuildOffered"),o(sharedBuildOffered,"sharedBuildOffered");function joinSharedBuild(e,t={}){const i=t.proc??process,c=t.timeoutMs??exports.JOIN_TIMEOUT_MS;return new Promise(n=>{const p=[];let d,s=!1;const u=o(r=>{if(!(0,protocol_1.isRunnerInbound)(r))return;const a=r.event;if(!s)return a.type==="refused"?h({kind:"refused",reason:a.reason}):a.type!=="accepted"?void 0:h({kind:"attached",session:g(a)});d?d(a):p.push(a)},"onMessage"),k=o(()=>{i.removeListener("message",u)},"close"),g=o(r=>({accepted:r,listen(a){d=a;for(const y of p.splice(0))a(y)},close:k}),"makeSession"),h=o(r=>{s||(s=!0,clearTimeout(m),r.kind==="refused"&&k(),n(r))},"finish"),m=setTimeout(()=>h({kind:"refused",reason:`the build host did not answer within ${Math.round(c/1e3)} s`}),c);m.unref?.(),i.on("message",u);const w={channel:protocol_1.SHARED_BUILD_CHANNEL,type:"join",join:e};try{i.send?.(w,void 0,void 0,r=>{r&&h({kind:"refused",reason:`could not reach the gateway (${r.message})`})})}catch(r){h({kind:"refused",reason:`could not reach the gateway (${r.message})`})}})}l(joinSharedBuild,"joinSharedBuild"),f(joinSharedBuild,"joinSharedBuild"),o(joinSharedBuild,"joinSharedBuild");function createAttachedTypecheck(e){const t=e.env??process.env,i=t.LENSMCP_TYPECHECK;if(i==="off")return{built:o(()=>{},"built"),dispose:o(()=>{},"dispose")};if(i==="tsgo"){if((0,tsgo_check_plugin_1.resolveTsgoBin)(e.workspaceRoot,t.LENSMCP_TSGO_BIN)){const n=new tsgo_check_plugin_1.TsgoCheckPlugin({appName:e.appName,tsConfig:e.tsConfig,workspaceRoot:e.workspaceRoot,...t.LENSMCP_TSGO_BIN?{binPath:t.LENSMCP_TSGO_BIN}:{}}),p=[];return n.apply({hooks:{done:{tap:o((d,s)=>p.push(s),"tap")}}}),{built:o(d=>{for(const s of p)s({hasErrors:o(()=>!d.ok,"hasErrors")})},"built"),dispose:o(()=>n.dispose(),"dispose")}}const c=`${tsgo_check_plugin_1.TSGO_MISSING_CAUSE}. Fell back to fork-ts-checker, which reports to the console only \u2014 so typecheck:// has no producer for this project until it is fixed`;console.warn(`[serve] ${e.appName}: LENSMCP_TYPECHECK=tsgo but ${c}.`),(0,tsgo_check_plugin_1.reportTsgoUnavailable)({appName:e.appName,tsConfig:e.tsConfig,workspaceRoot:e.workspaceRoot,detail:c})}return forkTsCheckerOnItsOwn(e)}l(createAttachedTypecheck,"createAttachedTypecheck"),f(createAttachedTypecheck,"createAttachedTypecheck"),o(createAttachedTypecheck,"createAttachedTypecheck");function forkTsCheckerOnItsOwn(e){const t=(0,fork_ts_check_reporter_1.loadForkTsChecker)(e.workspaceRoot),i=t?.default??t;if(typeof i!="function")return console.warn(`[serve] ${e.appName}: fork-ts-checker-webpack-plugin is not installed \u2014 this service is not type-checked`),{built:o(()=>{},"built"),dispose:o(()=>{},"dispose")};let c=[],n,p=!1;const d=o(()=>{n=require("webpack")({mode:"development",context:e.workspaceRoot,entry:{},infrastructureLogging:{level:"info"},plugins:[{apply(s){s.hooks.afterCompile.tapPromise("LensmcpAttachedTypecheck",()=>new Promise(u=>setTimeout(u,0))),s.hooks.afterCompile.tap("LensmcpAttachedTypecheck",u=>{for(const k of c)u.fileDependencies.add(k)})}},new i({async:!0,typescript:{configFile:e.tsConfig,memoryLimit:e.memoryLimit}}),new fork_ts_check_reporter_1.ForkTsCheckReporterPlugin({appName:e.appName,tsConfig:e.tsConfig,workspaceRoot:e.workspaceRoot})]}).watch({ignored:["**/node_modules/**",`${path.join(e.workspaceRoot,"dist")}/**`]},()=>{})},"start");return{built(s){if(p)return;const u=s.files&&s.files.join(`
2
2
  `)!==c.join(`
3
- `);s.files&&(c=[...s.files]),n?u&&n.invalidate():d()},dispose(){p=!0;try{n?.close(()=>{})}catch{}n=void 0}}}f(forkTsCheckerOnItsOwn,"forkTsCheckerOnItsOwn"),o(forkTsCheckerOnItsOwn,"forkTsCheckerOnItsOwn");
3
+ `);s.files&&(c=[...s.files]),n?u&&n.invalidate():d()},dispose(){p=!0;try{n?.close(()=>{})}catch{}n=void 0}}}l(forkTsCheckerOnItsOwn,"forkTsCheckerOnItsOwn"),f(forkTsCheckerOnItsOwn,"forkTsCheckerOnItsOwn"),o(forkTsCheckerOnItsOwn,"forkTsCheckerOnItsOwn");
@@ -21,7 +21,7 @@ export declare function buildTargetString(join: Pick<MemberJoinRequest, 'project
21
21
  export declare class BuildHost {
22
22
  private readonly opts;
23
23
  private readonly groups;
24
- /** member → its project and group. */
24
+ /** member → its project, its group, and what it joined with (evaluated again when a config file changes). */
25
25
  private readonly members;
26
26
  private readonly pauseMs;
27
27
  private readonly webpack;
@@ -36,6 +36,8 @@ export declare class BuildHost {
36
36
  /** Build a member's config the way the shared compilation will, and its signature. Throws what the config throws. */
37
37
  private evaluate;
38
38
  join(member: string, join: MemberJoinRequest): void;
39
+ /** Put an evaluated member into the group of its signature — a new group when none has it. */
40
+ private admit;
39
41
  leave(member: string, opts?: {
40
42
  quiet?: boolean;
41
43
  }): void;
@@ -51,6 +53,17 @@ export declare class BuildHost {
51
53
  */
52
54
  private compileAgain;
53
55
  private onBuild;
56
+ /**
57
+ * A file the group's configs were read from changed (config-files.ts): every member is evaluated again, and one
58
+ * whose signature changed — a `paths` alias added or retargeted, an emit option, its override — leaves for the group
59
+ * of its new signature, a compiler made from the files as they are now. One whose signature did not change stays: a
60
+ * type-check-only edit compiles nothing again. One whose config cannot be built from the files now (a tsconfig saved
61
+ * half-written) stays too, compiling as before, and the next save evaluates it again. Returns whether this group still
62
+ * has a member.
63
+ */
64
+ private reconfigure;
65
+ /** Take a member out of its group at once — its project's entries too, when it was the last to hold them. */
66
+ private detach;
54
67
  private tellBuilt;
55
68
  private closeGroup;
56
69
  /** Stop every group. Resolves once each watcher has closed and stored its cache, or after `timeoutMs`. */
@@ -1,4 +1,3 @@
1
- "use strict";var j=Object.defineProperty;var f=(p,e)=>j(p,"name",{value:e,configurable:!0});var v=Object.defineProperty,h=f((p,e)=>v(p,"name",{value:e,configurable:!0}),"h");Object.defineProperty(exports,"__esModule",{value:!0}),exports.BuildHost=exports.DEFAULT_PAUSE_MS=void 0,exports.withEnv=withEnv,exports.buildTargetString=buildTargetString;const tslib_1=require("tslib"),node_crypto_1=require("node:crypto"),path=tslib_1.__importStar(require("node:path")),checkout_cache_1=require("../checkout-cache"),compile_retry_1=require("../compile-retry"),dev_devtool_1=require("../dev-devtool"),create_webpack_dev_1=require("../create-webpack-dev"),perf_rules_plugin_1=require("../perf/perf-rules-plugin"),signature_1=require("./signature"),shared_compilation_1=require("./shared-compilation");exports.DEFAULT_PAUSE_MS=5e3;function withEnv(p,e){const t={...process.env};for(const r of Object.keys(process.env))delete process.env[r];for(const[r,o]of Object.entries(p))o!==void 0&&(process.env[r]=o);try{return e()}finally{for(const r of Object.keys(process.env))delete process.env[r];Object.assign(process.env,t)}}f(withEnv,"withEnv"),h(withEnv,"withEnv");function buildTargetString(p){return`${p.project}:${p.target}${p.configuration?`:${p.configuration}`:""}`}f(buildTargetString,"buildTargetString"),h(buildTargetString,"buildTargetString");const shortHash=h(p=>(0,node_crypto_1.createHash)("sha256").update(p).digest("hex").slice(0,16),"shortHash");class BuildHost{static{f(this,"BuildHost")}static{h(this,"BuildHost")}constructor(e){this.opts=e,this.groups=new Map,this.members=new Map,this.stopped=!1,this.pauseMs=e.pauseMs??exports.DEFAULT_PAUSE_MS,this.webpack=e.webpack??require("webpack")}tell(e,t){this.opts.send({type:"member",member:e,event:t})}describe(){return[...this.groups.values()].map(e=>({group:e.key,projects:e.registry.projects()}))}evaluate(e){const t=e.options;if(t.webpackConfigPath)try{delete require.cache[require.resolve(path.resolve(t.appRoot,t.webpackConfigPath))]}catch{}const r={...e.env,NODE_ENV:"development",NX_BUILD_TARGET:buildTargetString(e),NX_WORKSPACE_ROOT:this.opts.root,LENSMCP_TYPECHECK:"off"},o=withEnv(r,()=>(0,create_webpack_dev_1.createDevWebpackConfig)(t)),s=(0,signature_1.transpileCompilerOptions)(t.tsConfig,this.opts.root),n=(0,signature_1.memberSignature)({join:e,devtool:o.devtool,config:o,compilerOptions:s});return{config:o,signature:n}}join(e,t){if(this.stopped)return this.tell(e,{type:"refused",reason:"the build host is stopping"});this.leave(e,{quiet:!0});const r=(0,signature_1.refusalOf)(t,this.opts.root);if(r)return this.opts.log(`${t.project}: compiles on its own \u2014 ${r}`),this.tell(e,{type:"refused",reason:r});let o;try{o=this.evaluate(t)}catch(c){const i=`its webpack config could not be built here (${(c?.message??String(c)).split(`
2
- `)[0]})`;return this.opts.log(`${t.project}: compiles on its own \u2014 ${i}`),this.tell(e,{type:"refused",reason:i})}let s=this.groups.get(o.signature.key);if(!s){for(const c of this.groups.values()){const i=(0,signature_1.describeDifference)(o.signature,c.signature);this.opts.log(`${t.project}: compiled apart from ${c.registry.projects().sort().join(", ")||"the other group"} \u2014 ${i??"its compile signature differs"}`);break}try{s=this.createGroup(o,t)}catch(c){const i=`the shared compiler could not be created (${(c?.message??String(c)).split(`
3
- `)[0]})`;return this.opts.log(`${t.project}: compiles on its own \u2014 ${i}`),this.tell(e,{type:"refused",reason:i})}this.groups.set(s.key,s)}this.members.set(e,{project:t.project,group:s});const n=s.projects.get(t.project)??new Set;n.add(e);const a=!s.projects.has(t.project);s.projects.set(t.project,n);const l=s.pausing.get(t.project);if(l&&(clearTimeout(l),s.pausing.delete(t.project)),this.tell(e,{type:"accepted",group:s.key,projects:[...s.projects.keys()]}),a)s.registry.set(t.project,(0,shared_compilation_1.memberEntries)(t.project,t.options)),this.opts.log(`shared compilation ${s.key.slice(0,8)}: ${s.registry.projects().sort().join(", ")}`),this.kick(s);else{const c=s.last.get(t.project);c&&this.tellBuilt(s,e,c)}}leave(e,t={}){const r=this.members.get(e);if(!r)return;this.members.delete(e);const{project:o,group:s}=r;s.told.delete(e),s.toldFiles.delete(e);const n=s.projects.get(o);if(n?.delete(e),n&&n.size>0)return;t.quiet||this.opts.log(`${o}: no member left \u2014 its entries pause in ${Math.round(this.pauseMs/1e3)} s`);const a=setTimeout(()=>this.pause(s,o),this.pauseMs);a.unref?.(),s.pausing.set(o,a)}pause(e,t){if(e.pausing.delete(t),!((e.projects.get(t)?.size??0)>0)){if(e.projects.delete(t),e.registry.delete(t),e.last.delete(t),e.projects.size===0){this.opts.log(`shared compilation ${e.key.slice(0,8)}: no service left \u2014 closed`),this.groups.delete(e.key),this.closeGroup(e);return}this.opts.log(`shared compilation ${e.key.slice(0,8)}: ${t} paused \u2014 ${e.registry.projects().sort().join(", ")}`),this.kick(e)}}kick(e){if(e.watching){e.watching.invalidate();return}e.watching=e.compiler.watch(e.watchOptions,(t,r)=>this.onBuild(e,t,r))}createGroup(e,t){const r=e.signature.key,o=new shared_compilation_1.EntryRegistry,s=t.options,n=e.config,a=n.devtool,l=path.join((0,checkout_cache_1.checkoutCacheDir)(this.opts.root,"lensmcp-build"),r,"out"),c=(0,create_webpack_dev_1.devCacheOptions)(s,a),i={key:r,signature:e.signature,registry:o,projects:new Map,pausing:new Map,last:new Map,told:new Map,toldFiles:new Map,compiler:void 0,watching:void 0,watchOptions:{},sourceMaps:!1,webpackVersion:"",retry:(0,compile_retry_1.createFailureRetry)(()=>this.compileAgain(i),this.opts.retryDelaysMs??compile_retry_1.RETRY_AFTER_FAILURE_MS)},u=n.plugins.filter(m=>!signature_1.PER_SERVICE_PLUGINS.has(m?.constructor?.name));u.push(new perf_rules_plugin_1.PerfRulesPlugin({project:t.project,workspaceRoot:this.opts.root,tsConfig:s.tsConfig,entries:h(()=>o.entryProjects(),"entries")}),new shared_compilation_1.SharedEntriesPlugin({registry:o,workspaceRoot:this.opts.root,outputPath:l,cache:{...c,name:`shared-${r}`,version:`${c.version}-${r}`}}),{apply:h(m=>{m.hooks.watchRun.tap("LensmcpSharedBuild",y=>{const w=[...y.modifiedFiles??[],...y.removedFiles??[]].filter(b=>typeof b=="string").slice(-32);for(const b of this.membersOf(i))this.tell(b,{type:"watch-run",paths:w})}),m.hooks.watchClose.tap("LensmcpSharedBuild",()=>{for(const y of this.membersOf(i))this.tell(y,{type:"watch-closed"})})},"apply")});const g={...n,plugins:u};delete g.watch,i.watchOptions=n.watchOptions??{};const d={...t.env,NODE_ENV:"development",NX_BUILD_TARGET:buildTargetString(t),NX_WORKSPACE_ROOT:this.opts.root,LENSMCP_TYPECHECK:"off"};return i.compiler=withEnv(d,()=>this.webpack(g)),i.sourceMaps=(0,dev_devtool_1.bundleCarriesSourceMaps)(i.compiler.options.devtool),i.webpackVersion=String(i.compiler.webpack?.version??"5"),i}membersOf(e){const t=[];for(const r of e.projects.values())t.push(...r);return t}compileAgain(e){this.stopped||this.groups.get(e.key)!==e||!e.watching||(this.opts.log(`shared compilation ${e.key.slice(0,8)}: compiling again after the failure`),e.watching.invalidate())}onBuild(e,t,r){if(this.stopped)return;if(t){const i=t?.message??String(t),{delayMs:u,retry:g}=e.retry.failed();this.opts.log(`shared compilation ${e.key.slice(0,8)} failed: ${i} \u2014 compiling again in ${Math.round(u/1e3)} s (retry ${g})`);for(const d of this.membersOf(e))this.tell(d,{type:"failed",message:i});return}const o=e.retry.succeeded();o>0&&this.opts.log(`shared compilation ${e.key.slice(0,8)}: compiled again after ${o} failure${o===1?"":"s"} \u2014 watching again`);const s=r,n=Math.max(0,(s.endTime??0)-(s.startTime??0)),a=(0,shared_compilation_1.attributeCompilation)(s.compilation,e.registry),l=[];for(const[i,u]of a){e.last.get(i)?.attribution.hash!==u.hash&&l.push(i);const g={attribution:u,durationMs:n};e.last.set(i,g);for(const d of e.projects.get(i)??[])this.tellBuilt(e,d,g)}const c=[...a.values()].filter(i=>i.errorCount>0).map(i=>i.project);this.opts.log(`built ${[...a.keys()].sort().join(", ")||"nothing"} in ${n} ms \u2014 ${l.length?`changed: ${l.sort().join(", ")}`:"no bundle changed"}${c.length?`; errors in: ${c.sort().join(", ")}`:""}`)}tellBuilt(e,t,r){const o=r.attribution,s=e.told.get(t)!==o.hash;e.told.set(t,o.hash);const n=shortHash([...o.files].sort().join(`
4
- `)),a=e.toldFiles.get(t)!==n;e.toldFiles.set(t,n),this.tell(t,{type:"built",ok:o.errorCount===0,changed:s,hash:o.hash,text:(0,shared_compilation_1.describeBuild)(o,{webpackVersion:e.webpackVersion,durationMs:r.durationMs,changed:s}),errors:o.errorCount,warnings:o.warningCount,durationMs:r.durationMs,sourceMaps:e.sourceMaps,...a?{files:o.files}:{}})}closeGroup(e){e.retry.dispose();for(const s of e.pausing.values())clearTimeout(s);e.pausing.clear();const t=e.compiler,r=e.watching;e.watching=void 0;const o=h(()=>{try{t?.close?.(()=>{})}catch{}},"closeCompiler");r?r.close(o):o()}stop(e=5e3){this.stopped=!0;const t=[...this.groups.values()];return this.groups.clear(),this.members.clear(),new Promise(r=>{let o=t.length;if(o===0)return r();const s=setTimeout(r,e);s.unref?.();for(const n of t){n.retry.dispose();for(const i of n.pausing.values())clearTimeout(i);const a=h(()=>{--o===0&&(clearTimeout(s),r())},"done"),l=n.compiler,c=h(()=>{try{l.close(()=>a())}catch{a()}},"closeCompiler");n.watching?n.watching.close(c):c()}})}}exports.BuildHost=BuildHost;
1
+ "use strict";var $=Object.defineProperty;var b=(l,e)=>$(l,"name",{value:e,configurable:!0});var j=Object.defineProperty,y=b((l,e)=>j(l,"name",{value:e,configurable:!0}),"y"),k=Object.defineProperty,h=y((l,e)=>k(l,"name",{value:e,configurable:!0}),"h");Object.defineProperty(exports,"__esModule",{value:!0}),exports.BuildHost=exports.DEFAULT_PAUSE_MS=void 0,exports.withEnv=withEnv,exports.buildTargetString=buildTargetString;const tslib_1=require("tslib"),node_crypto_1=require("node:crypto"),path=tslib_1.__importStar(require("node:path")),checkout_cache_1=require("../checkout-cache"),config_files_1=require("../config-files"),compile_retry_1=require("../compile-retry"),dev_devtool_1=require("../dev-devtool"),create_webpack_dev_1=require("../create-webpack-dev"),perf_rules_plugin_1=require("../perf/perf-rules-plugin"),signature_1=require("./signature"),shared_compilation_1=require("./shared-compilation");exports.DEFAULT_PAUSE_MS=5e3;function withEnv(l,e){const t={...process.env};for(const o of Object.keys(process.env))delete process.env[o];for(const[o,s]of Object.entries(l))s!==void 0&&(process.env[o]=s);try{return e()}finally{for(const o of Object.keys(process.env))delete process.env[o];Object.assign(process.env,t)}}b(withEnv,"withEnv"),y(withEnv,"withEnv"),h(withEnv,"withEnv");function buildTargetString(l){return`${l.project}:${l.target}${l.configuration?`:${l.configuration}`:""}`}b(buildTargetString,"buildTargetString"),y(buildTargetString,"buildTargetString"),h(buildTargetString,"buildTargetString");const shortHash=h(l=>(0,node_crypto_1.createHash)("sha256").update(l).digest("hex").slice(0,16),"shortHash"),firstLine=h(l=>(l?.message??String(l)).split(`
2
+ `)[0],"firstLine");class BuildHost{static{b(this,"BuildHost")}static{y(this,"BuildHost")}static{h(this,"BuildHost")}constructor(e){this.opts=e,this.groups=new Map,this.members=new Map,this.stopped=!1,this.pauseMs=e.pauseMs??exports.DEFAULT_PAUSE_MS,this.webpack=e.webpack??require("webpack")}tell(e,t){this.opts.send({type:"member",member:e,event:t})}describe(){return[...this.groups.values()].map(e=>({group:e.key,projects:e.registry.projects()}))}evaluate(e){const t=e.options;if(t.webpackConfigPath)try{delete require.cache[require.resolve(path.resolve(t.appRoot,t.webpackConfigPath))]}catch{}const o={...e.env,NODE_ENV:"development",NX_BUILD_TARGET:buildTargetString(e),NX_WORKSPACE_ROOT:this.opts.root,LENSMCP_TYPECHECK:"off"},s=withEnv(o,()=>(0,create_webpack_dev_1.createDevWebpackConfig)(t)),i=(0,signature_1.transpileCompilerOptions)(t.tsConfig,this.opts.root),r=(0,signature_1.memberSignature)({join:e,devtool:s.devtool,config:s,compilerOptions:i});return{config:s,signature:r,configFiles:(0,config_files_1.configFilesOf)({...t,workspaceRoot:this.opts.root})}}join(e,t){if(this.stopped)return this.tell(e,{type:"refused",reason:"the build host is stopping"});this.leave(e,{quiet:!0});const o=(0,signature_1.refusalOf)(t,this.opts.root);if(o)return this.opts.log(`${t.project}: compiles on its own \u2014 ${o}`),this.tell(e,{type:"refused",reason:o});let s;try{s=this.evaluate(t)}catch(i){const r=`its webpack config could not be built here (${firstLine(i)})`;return this.opts.log(`${t.project}: compiles on its own \u2014 ${r}`),this.tell(e,{type:"refused",reason:r})}this.admit(e,t,s)}admit(e,t,o){let s=this.groups.get(o.signature.key);if(!s){for(const a of this.groups.values()){const p=(0,signature_1.describeDifference)(o.signature,a.signature);this.opts.log(`${t.project}: compiled apart from ${a.registry.projects().sort().join(", ")||"the other group"} \u2014 ${p??"its compile signature differs"}`);break}try{s=this.createGroup(o,t)}catch(a){const p=`the shared compiler could not be created (${firstLine(a)})`;return this.opts.log(`${t.project}: compiles on its own \u2014 ${p}`),this.tell(e,{type:"refused",reason:p})}this.groups.set(s.key,s)}this.members.set(e,{project:t.project,group:s,join:t});for(const a of o.configFiles)s.configFiles.add(a);const i=s.projects.get(t.project)??new Set;i.add(e);const r=!s.projects.has(t.project);s.projects.set(t.project,i);const c=s.pausing.get(t.project);if(c&&(clearTimeout(c),s.pausing.delete(t.project)),this.tell(e,{type:"accepted",group:s.key,projects:[...s.projects.keys()]}),r)s.registry.set(t.project,(0,shared_compilation_1.memberEntries)(t.project,t.options)),this.opts.log(`shared compilation ${s.key.slice(0,8)}: ${s.registry.projects().sort().join(", ")}`),this.kick(s);else{const a=s.last.get(t.project);a&&this.tellBuilt(s,e,a)}}leave(e,t={}){const o=this.members.get(e);if(!o)return;this.members.delete(e);const{project:s,group:i}=o;i.told.delete(e),i.toldFiles.delete(e);const r=i.projects.get(s);if(r?.delete(e),r&&r.size>0)return;t.quiet||this.opts.log(`${s}: no member left \u2014 its entries pause in ${Math.round(this.pauseMs/1e3)} s`);const c=setTimeout(()=>this.pause(i,s),this.pauseMs);c.unref?.(),i.pausing.set(s,c)}pause(e,t){if(e.pausing.delete(t),!((e.projects.get(t)?.size??0)>0)){if(e.projects.delete(t),e.registry.delete(t),e.last.delete(t),e.projects.size===0){this.opts.log(`shared compilation ${e.key.slice(0,8)}: no service left \u2014 closed`),this.groups.delete(e.key),this.closeGroup(e);return}this.opts.log(`shared compilation ${e.key.slice(0,8)}: ${t} paused \u2014 ${e.registry.projects().sort().join(", ")}`),this.kick(e)}}kick(e){if(e.watching){e.watching.invalidate();return}e.watching=e.compiler.watch(e.watchOptions,(t,o)=>this.onBuild(e,t,o))}createGroup(e,t){const o=e.signature.key,s=new shared_compilation_1.EntryRegistry,i=t.options,r=e.config,c=r.devtool,a=path.join((0,checkout_cache_1.checkoutCacheDir)(this.opts.root,"lensmcp-build"),o,"out"),p=(0,create_webpack_dev_1.devCacheOptions)(i,c),n={key:o,signature:e.signature,registry:s,projects:new Map,pausing:new Map,last:new Map,told:new Map,toldFiles:new Map,compiler:void 0,watching:void 0,watchOptions:{},sourceMaps:!1,webpackVersion:"",retry:(0,compile_retry_1.createFailureRetry)(()=>this.compileAgain(n),this.opts.retryDelaysMs??compile_retry_1.RETRY_AFTER_FAILURE_MS),configFiles:new Set(e.configFiles),configChanged:new Set},u=r.plugins.filter(d=>!signature_1.PER_SERVICE_PLUGINS.has(d?.constructor?.name));u.push(new perf_rules_plugin_1.PerfRulesPlugin({project:t.project,workspaceRoot:this.opts.root,tsConfig:i.tsConfig,entries:h(()=>s.entryProjects(),"entries")}),new shared_compilation_1.SharedEntriesPlugin({registry:s,workspaceRoot:this.opts.root,outputPath:a,cache:{...p,name:`shared-${o}`,version:`${p.version}-${o}`}}),new config_files_1.ConfigFilesPlugin({files:h(()=>n.configFiles,"files"),changed:h(d=>{for(const f of d)n.configChanged.add(f)},"changed")}),{apply:h(d=>{d.hooks.watchRun.tap("LensmcpSharedBuild",f=>{const v=[...f.modifiedFiles??[],...f.removedFiles??[]].filter(w=>typeof w=="string").slice(-32);for(const w of this.membersOf(n))this.tell(w,{type:"watch-run",paths:v})}),d.hooks.watchClose.tap("LensmcpSharedBuild",()=>{for(const f of this.membersOf(n))this.tell(f,{type:"watch-closed"})})},"apply")});const g={...r,plugins:u};delete g.watch,n.watchOptions=r.watchOptions??{};const m={...t.env,NODE_ENV:"development",NX_BUILD_TARGET:buildTargetString(t),NX_WORKSPACE_ROOT:this.opts.root,LENSMCP_TYPECHECK:"off"};return n.compiler=withEnv(m,()=>this.webpack(g)),n.sourceMaps=(0,dev_devtool_1.bundleCarriesSourceMaps)(n.compiler.options.devtool),n.webpackVersion=String(n.compiler.webpack?.version??"5"),n}membersOf(e){const t=[];for(const o of e.projects.values())t.push(...o);return t}compileAgain(e){this.stopped||this.groups.get(e.key)!==e||!e.watching||(this.opts.log(`shared compilation ${e.key.slice(0,8)}: compiling again after the failure`),e.watching.invalidate())}onBuild(e,t,o){if(this.stopped||e.configChanged.size>0&&!this.reconfigure(e))return;if(t){const n=t?.message??String(t),{delayMs:u,retry:g}=e.retry.failed();this.opts.log(`shared compilation ${e.key.slice(0,8)} failed: ${n} \u2014 compiling again in ${Math.round(u/1e3)} s (retry ${g})`);for(const m of this.membersOf(e))this.tell(m,{type:"failed",message:n});return}const s=e.retry.succeeded();s>0&&this.opts.log(`shared compilation ${e.key.slice(0,8)}: compiled again after ${s} failure${s===1?"":"s"} \u2014 watching again`);const i=o,r=Math.max(0,(i.endTime??0)-(i.startTime??0)),c=(0,shared_compilation_1.attributeCompilation)(i.compilation,e.registry),a=[];for(const[n,u]of c){e.last.get(n)?.attribution.hash!==u.hash&&a.push(n);const g={attribution:u,durationMs:r};e.last.set(n,g);for(const m of e.projects.get(n)??[])this.tellBuilt(e,m,g)}const p=[...c.values()].filter(n=>n.errorCount>0).map(n=>n.project);this.opts.log(`built ${[...c.keys()].sort().join(", ")||"nothing"} in ${r} ms \u2014 ${a.length?`changed: ${a.sort().join(", ")}`:"no bundle changed"}${p.length?`; errors in: ${p.sort().join(", ")}`:""}`)}reconfigure(e){const t=[...e.configChanged].map(c=>path.relative(this.opts.root,c)).sort().join(", ");e.configChanged.clear();const o=[];for(const[c,a]of this.members){if(a.group!==e)continue;let p;try{p=this.evaluate(a.join)}catch(n){this.opts.log(`${a.project}: ${t} changed, but its webpack config could not be built from it (${firstLine(n)}) \u2014 it compiles as before`);continue}for(const n of p.configFiles)e.configFiles.add(n);p.signature.key!==e.key&&o.push({member:c,join:a.join,evaluated:p})}const s=`shared compilation ${e.key.slice(0,8)}`;if(o.length===0)return this.opts.log(`${s}: ${t} changed \u2014 nothing it compiles with did`),!0;const i=[...new Set(o.map(c=>c.join.project))].sort();for(const c of o)this.detach(c.member);const r=e.projects.size>0;this.opts.log(`${s}: ${t} changed what ${i.join(", ")} compile${i.length===1?"s":""} with \u2014 a new compiler reads it${r?"":"; this one closes"}`),r||(this.groups.delete(e.key),setImmediate(()=>this.closeGroup(e)));for(const c of o)this.admit(c.member,c.join,c.evaluated);return r}detach(e){const t=this.members.get(e);if(!t)return;this.members.delete(e);const{project:o,group:s}=t;s.told.delete(e),s.toldFiles.delete(e);const i=s.projects.get(o);if(i?.delete(e),i&&i.size>0)return;s.projects.delete(o),s.registry.delete(o),s.last.delete(o);const r=s.pausing.get(o);r&&(clearTimeout(r),s.pausing.delete(o))}tellBuilt(e,t,o){const s=o.attribution,i=e.told.get(t)!==s.hash;e.told.set(t,s.hash);const r=shortHash([...s.files].sort().join(`
3
+ `)),c=e.toldFiles.get(t)!==r;e.toldFiles.set(t,r),this.tell(t,{type:"built",ok:s.errorCount===0,changed:i,hash:s.hash,text:(0,shared_compilation_1.describeBuild)(s,{webpackVersion:e.webpackVersion,durationMs:o.durationMs,changed:i}),errors:s.errorCount,warnings:s.warningCount,durationMs:o.durationMs,sourceMaps:e.sourceMaps,...c?{files:s.files}:{}})}closeGroup(e){e.retry.dispose();for(const i of e.pausing.values())clearTimeout(i);e.pausing.clear();const t=e.compiler,o=e.watching;e.watching=void 0;const s=h(()=>{try{t?.close?.(()=>{})}catch{}},"closeCompiler");o?o.close(s):s()}stop(e=5e3){this.stopped=!0;const t=[...this.groups.values()];return this.groups.clear(),this.members.clear(),new Promise(o=>{let s=t.length;if(s===0)return o();const i=setTimeout(o,e);i.unref?.();for(const r of t){r.retry.dispose();for(const n of r.pausing.values())clearTimeout(n);const c=h(()=>{--s===0&&(clearTimeout(i),o())},"done"),a=r.compiler,p=h(()=>{try{a.close(()=>c())}catch{c()}},"closeCompiler");r.watching?r.watching.close(p):p()}})}}exports.BuildHost=BuildHost;