@lensmcp/cluster 1.25.36 → 1.25.38

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 (138) 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.js +1 -1
  9. package/create-webpack-dev.js +1 -1
  10. package/create-webpack-prod.js +1 -1
  11. package/dev-devtool.js +1 -1
  12. package/devserver-host.js +1 -1
  13. package/devserver-notifier.js +1 -1
  14. package/devserver-transport.js +1 -1
  15. package/error-stack-release.js +1 -1
  16. package/executors/build/build.impl.js +1 -1
  17. package/executors/gateway/body-stall.js +1 -1
  18. package/executors/gateway/canonical-path.js +1 -1
  19. package/executors/gateway/client-ip.js +1 -1
  20. package/executors/gateway/gateway-errors.js +1 -1
  21. package/executors/gateway/gateway.impl.js +1 -1
  22. package/executors/gateway/gateway.lib.js +1 -1
  23. package/executors/gateway/health-check.js +1 -1
  24. package/executors/gateway/jwks-verify.js +1 -1
  25. package/executors/gateway/jwt-claims.js +1 -1
  26. package/executors/gateway/main.prod-gateway.js +2 -2
  27. package/executors/gateway/main.rollout.js +4 -4
  28. package/executors/gateway/manifest.js +1 -1
  29. package/executors/gateway/metrics.js +1 -1
  30. package/executors/gateway/otel-tracing.js +1 -1
  31. package/executors/gateway/prod-config.js +1 -1
  32. package/executors/gateway/prod-gateway.lib.js +1 -1
  33. package/executors/gateway/prod-runtime/access-log.js +1 -1
  34. package/executors/gateway/prod-runtime/app.js +1 -1
  35. package/executors/gateway/prod-runtime/auth.js +1 -1
  36. package/executors/gateway/prod-runtime/body-stall.js +1 -1
  37. package/executors/gateway/prod-runtime/cors.js +1 -1
  38. package/executors/gateway/prod-runtime/edge.js +1 -1
  39. package/executors/gateway/prod-runtime/handler.js +1 -1
  40. package/executors/gateway/prod-runtime/hooks.js +1 -1
  41. package/executors/gateway/prod-runtime/observability.js +1 -1
  42. package/executors/gateway/prod-runtime/rollout.js +1 -1
  43. package/executors/gateway/prod-runtime/routing.js +1 -1
  44. package/executors/gateway/prod-runtime/server.js +1 -1
  45. package/executors/gateway/prod-runtime/trust.js +1 -1
  46. package/executors/gateway/prod-runtime/upgrade.js +6 -6
  47. package/executors/gateway/prod-runtime/upstream.js +1 -1
  48. package/executors/gateway/providers-prod.js +1 -1
  49. package/executors/gateway/rate-limit.js +2 -2
  50. package/executors/gateway/registry-source.js +1 -1
  51. package/executors/gateway/rollout-ops.js +2 -2
  52. package/executors/gateway/runtime/act.js +1 -1
  53. package/executors/gateway/runtime/auth.js +1 -1
  54. package/executors/gateway/runtime/chooser.js +12 -12
  55. package/executors/gateway/runtime/control.js +2 -2
  56. package/executors/gateway/runtime/dev-auth.js +1 -1
  57. package/executors/gateway/runtime/discovery.js +1 -1
  58. package/executors/gateway/runtime/edge.js +1 -1
  59. package/executors/gateway/runtime/guest-graph.js +2 -2
  60. package/executors/gateway/runtime/guest-replay.js +2 -2
  61. package/executors/gateway/runtime/handler.js +1 -1
  62. package/executors/gateway/runtime/hmr-reload.js +1 -1
  63. package/executors/gateway/runtime/hooks.js +1 -1
  64. package/executors/gateway/runtime/hosted-dashboard.js +1 -1
  65. package/executors/gateway/runtime/instance.js +2 -2
  66. package/executors/gateway/runtime/lens-children.js +1 -1
  67. package/executors/gateway/runtime/lifecycle.js +3 -3
  68. package/executors/gateway/runtime/observability.js +3 -3
  69. package/executors/gateway/runtime/orphan-reaper.js +2 -2
  70. package/executors/gateway/runtime/own-log.js +6 -6
  71. package/executors/gateway/runtime/pod-env.js +2 -2
  72. package/executors/gateway/runtime/pod-output.js +1 -1
  73. package/executors/gateway/runtime/pod-probe.js +1 -1
  74. package/executors/gateway/runtime/process-names.js +1 -1
  75. package/executors/gateway/runtime/project-graph-store.js +1 -1
  76. package/executors/gateway/runtime/proxy.js +1 -1
  77. package/executors/gateway/runtime/registration-guards.js +1 -1
  78. package/executors/gateway/runtime/route-registry.js +1 -1
  79. package/executors/gateway/runtime/scope.js +1 -1
  80. package/executors/gateway/runtime/serve-launch.js +3 -3
  81. package/executors/gateway/runtime/server.js +2 -2
  82. package/executors/gateway/runtime/service-keys.js +1 -1
  83. package/executors/gateway/runtime/shared-build.js +3 -3
  84. package/executors/gateway/runtime/source-poller.js +1 -1
  85. package/executors/gateway/runtime/types.js +1 -1
  86. package/executors/gateway/runtime/upgrade.js +1 -1
  87. package/executors/gateway/runtime/warm-start.js +1 -1
  88. package/executors/gateway/runtime/workspace-log.js +1 -1
  89. package/executors/gateway/runtime/workspace-middleware.js +1 -1
  90. package/executors/gateway/runtime/workspace-registry.js +1 -1
  91. package/executors/gateway/ssrf-guard.js +1 -1
  92. package/executors/serve/serve.impl.js +1 -1
  93. package/executors/serve/stop-on-signal.js +1 -1
  94. package/executors/trust/hostname.js +1 -1
  95. package/executors/trust/trust.impl.js +3 -3
  96. package/exit-reason.js +2 -2
  97. package/fork-ts-check-reporter.js +1 -1
  98. package/gateway.js +1 -1
  99. package/gc-notice.js +1 -1
  100. package/graph-snapshot.js +1 -1
  101. package/handoff-retire.js +1 -1
  102. package/heap-snapshot.js +1 -1
  103. package/hot-swap-registries.js +1 -1
  104. package/index.js +1 -1
  105. package/inspector-secret.js +1 -1
  106. package/main.devserver.js +11 -11
  107. package/notice-generation.js +1 -1
  108. package/package.json +4 -4
  109. package/perf/heavy-barrel-import.js +1 -1
  110. package/perf/perf-config.js +1 -1
  111. package/perf/perf-rule-events.js +2 -2
  112. package/perf/perf-rules-analysis.js +1 -1
  113. package/perf/perf-rules-plugin.js +1 -1
  114. package/perf/source-scan.js +5 -5
  115. package/perf/workspace-libraries.js +2 -2
  116. package/pod-memory-events.js +2 -2
  117. package/pod-memory.js +1 -1
  118. package/pod-sock.js +1 -1
  119. package/process-name.js +1 -1
  120. package/redis-disconnect-fix.js +1 -1
  121. package/schema-first-instance.js +1 -1
  122. package/serve-runner.js +1 -1
  123. package/service-build-events.js +2 -2
  124. package/shared-build/attach.js +2 -2
  125. package/shared-build/host.js +3 -3
  126. package/shared-build/protocol.js +1 -1
  127. package/shared-build/shared-compilation.js +3 -3
  128. package/shared-build/signature.js +1 -1
  129. package/stdio-guard.js +1 -1
  130. package/swap-mode.js +1 -1
  131. package/swap-recycle.js +1 -1
  132. package/tsgo-check-plugin.js +4 -4
  133. package/typecheck-bus.js +3 -3
  134. package/typecheck-queue.js +1 -1
  135. package/worker-guard.js +1 -1
  136. package/worker-retire.js +1 -1
  137. package/worker-supervisor.js +2 -2
  138. package/workspace-paths.js +1 -1
@@ -1 +1 @@
1
- "use strict";var X=Object.defineProperty;var $=(e,t)=>X(e,"name",{value:t,configurable:!0});var H=Object.defineProperty,M=$((e,t)=>H(e,"name",{value:t,configurable:!0}),"M"),C=Object.defineProperty,y=M((e,t)=>C(e,"name",{value:t,configurable:!0}),"y");Object.defineProperty(exports,"__esModule",{value:!0}),exports.EXECUTOR_MB_PER_MODULE=exports.DEFAULT_HEAVY_BARREL_THRESHOLDS=exports.HEAVY_BARREL_RULE=void 0,exports.analyzeBarrelImports=analyzeBarrelImports,exports.describeHeavyBarrel=describeHeavyBarrel;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),workspace_libraries_1=require("./workspace-libraries"),source_scan_1=require("./source-scan");exports.HEAVY_BARREL_RULE="bundle/heavy-barrel-import",exports.DEFAULT_HEAVY_BARREL_THRESHOLDS={minShare:.5,minModules:100,minBytes:1024*1024,maxNeededShare:.6};const MAX_IMPORTERS_LISTED=8,MAX_SYMBOLS_LISTED=12,MAX_SUBPATHS_LISTED=12,MAX_INTERNAL_LISTED=6,MAX_EXPORT_DEPTH=24,MAX_UNRESOLVED_SHARE=.1;class AliasResolver{static{$(this,"AliasResolver")}static{M(this,"AliasResolver")}static{y(this,"AliasResolver")}constructor(t,s){this.exists=s,this.exact=new Map,this.wildcards=[];for(const r of t){this.exact.set(r.name,r.rootEntry);for(const i of r.aliases)this.exact.set(i,r.rootEntry);for(const i of r.subpaths)this.exact.set(i.specifier,i.entry);for(const i of r.wildcards)this.wildcards.push(i)}this.wildcards.sort((r,i)=>i.prefix.length-r.prefix.length)}resolve(t,s){if(s.startsWith("."))return(0,workspace_libraries_1.resolveSourceFile)(path.resolve(path.dirname(t),s),this.exists);const r=this.exact.get(s);if(r)return r;const i=this.wildcards.find(u=>s.startsWith(u.prefix));return i?(0,workspace_libraries_1.resolveSourceFile)(path.join(i.dir,s.slice(i.prefix.length)),this.exists):void 0}}class ExportReader{static{$(this,"ExportReader")}static{M(this,"ExportReader")}static{y(this,"ExportReader")}constructor(t,s){this.source=t,this.aliases=s,this.cache=new Map,this.resolved=new Map}index(t){let s=this.cache.get(t);if(s===void 0){const r=this.source.read(t);s=r===void 0?null:(0,source_scan_1.scanExports)(r),this.cache.set(t,s)}return s}resolve(t,s){const r=`${t}\0${s}`;let i=this.resolved.get(r);return i===void 0&&(i=this.follow(t,s,0,new Set)??null,this.resolved.set(r,i)),i??void 0}follow(t,s,r,i){if(r>MAX_EXPORT_DEPTH)return;const u=`${t}\0${s}`;if(i.has(u))return;i.add(u);const a=this.index(t);if(!a)return;if(a.values.has(s))return{file:t,typeOnly:!1};if(a.types.has(s))return{file:t,typeOnly:!0};const l=a.namespaces.get(s);if(l!==void 0){const p=this.aliases.resolve(t,l);return p?{file:p,typeOnly:!1}:void 0}const d=a.reexports.get(s);if(d){const p=this.aliases.resolve(t,d.specifier);if(!p)return;const c=this.follow(p,d.name,r+1,i);return c?{...c,typeOnly:c.typeOnly||d.typeOnly}:void 0}if(s!=="default")for(const p of a.stars){const c=this.aliases.resolve(t,p);if(!c)continue;const h=this.follow(c,s,r+1,i);if(h)return h}}}const rel=y((e,t)=>path.relative(e,t)||t,"rel");function readRootUse(e,t,s,r){const i=y(a=>l=>r.resolve(a,l)===e.rootEntry,"toBarrel"),u=[];for(const a of t){const l=/\.(?:[cm]?[jt]sx?)$/.test(a)?s.source.read(a):void 0;if(l===void 0){u.push({file:a,values:[],typeOnly:0,wholeModule:!0});continue}const d=(0,source_scan_1.scanImports)(l,i(a));if(d.length===0){u.push({file:a,values:[],typeOnly:0,wholeModule:!0});continue}const p=new Set;let c=0,h=!1;for(const w of d){h||=w.wholeModule;for(const f of w.names)f.typeOnly?c++:p.add(f.imported)}u.push({file:a,values:[...p].sort(),typeOnly:c,wholeModule:h})}return{importers:u}}$(readRootUse,"readRootUse"),M(readRootUse,"readRootUse"),y(readRootUse,"readRootUse");function closureWithin(e,t,s,r,i){const u=new Set,a=[...t].filter(l=>l!==r&&s.has(l)&&i(l)===e);for(;a.length;){const l=a.pop();if(!u.has(l)){u.add(l);for(const d of s.get(l)?.dependencies??[])d!==r&&!u.has(d)&&i(d)===e&&s.has(d)&&a.push(d)}}return u}$(closureWithin,"closureWithin"),M(closureWithin,"closureWithin"),y(closureWithin,"closureWithin");function subpathFor(e,t,s,r,i,u,a=0){if(s===e.rootEntry)return;const l=u(s);if(l!==e)return l&&a<2?subpathFor(l,t,s,r,i,u,a+1):void 0;const d=e.subpaths.filter(f=>s.startsWith(path.dirname(f.entry)+path.sep)||s===f.entry).filter(f=>r.resolve(f.entry,t)?.file===s).sort((f,E)=>E.entry.length-f.entry.length);if(d[0])return{specifier:d[0].specifier,entry:d[0].entry,exists:!0};const p=path.dirname(e.rootEntry);for(const f of e.wildcards){if(!s.startsWith(f.dir))continue;const E=s.slice(f.dir.length).split(path.sep).join("/").replace(/\.(?:[cm]?[jt]sx?)$/,""),g=E.split("/")[0],v=(0,workspace_libraries_1.resolveSourceFile)(path.join(f.dir,g),i.exists);return v&&v!==s&&r.resolve(v,t)?.file===s?{specifier:`${f.prefix}${g}`,entry:v,exists:!0}:{specifier:`${f.prefix}${E.replace(/\/index$/,"")}`,entry:s,exists:!0}}const c=path.relative(p,s).split(path.sep),h=c.length>1?c[0]:c[0].replace(/\.(?:[cm]?[jt]sx?)$/,""),w=c.length>1?(0,workspace_libraries_1.resolveSourceFile)(path.join(p,h),i.exists)??path.join(p,h,"index.ts"):s;return{specifier:`${e.name}/${h}`,entry:w,exists:!1}}$(subpathFor,"subpathFor"),M(subpathFor,"subpathFor"),y(subpathFor,"subpathFor");function measure(e,t,s,r,i,u,a){if(!s.has(t.rootEntry))return;const l=y(o=>a(o)===t,"inLib"),d=e.modules.filter(o=>l(o.resource)),p=e.modules.filter(o=>!l(o.resource)&&o.dependencies.includes(t.rootEntry)).map(o=>o.resource).sort();if(p.length===0)return;const c=r.workspaceRoot,h=r.thresholds,w=d.filter(o=>o.resource!==t.rootEntry&&o.dependencies.includes(t.rootEntry)).map(o=>o.resource),f=new Set;for(const o of e.modules)if(!l(o.resource))for(const n of o.dependencies)n!==t.rootEntry&&l(n)&&f.add(n);const E=readRootUse(t,p,r,i),g=new Set(f),v=new Set,B=new Map,S=new Set,R=new Set;for(const o of E.importers)for(const n of o.values){if(R.add(n),B.has(n)||v.has(n)||S.has(n))continue;const m=u.resolve(t.rootEntry,n);m?m.file===t.rootEntry?S.add(n):m.typeOnly||(B.set(n,m.file),g.add(m.file)):v.add(n)}if(S.size>0)for(const o of u.index(t.rootEntry)?.valueImports??[]){const n=i.resolve(t.rootEntry,o);n&&g.add(n)}const L=E.importers.some(o=>o.wholeModule),I=L?new Set(d.map(o=>o.resource)):closureWithin(t,g,s,t.rootEntry,a),U=y(o=>{let n=0;for(const m of o)n+=s.get(m)?.size??0;return n},"sizeOf"),z=d.reduce((o,n)=>o+n.size,0),F=U(I),D=d.filter(o=>!I.has(o.resource)),O=t.files>0?Math.min(1,d.length/t.files):1,j=new Map,T=new Map,k=y((o,n)=>{let m=T.get(o);return m===void 0&&(m=subpathFor(t,o,n,u,r.source,a)??null,T.set(o,m)),m??void 0},"choose"),P=E.importers.map(o=>{const n=new Map;for(const m of o.values){const _=B.get(m);if(!_)continue;const x=k(m,_);if(!x)continue;const A=j.get(x.specifier)??{specifier:x.specifier,entry:rel(c,x.entry),symbols:[],exists:x.exists};A.symbols.includes(m)||A.symbols.push(m),j.set(x.specifier,A),n.set(x.specifier,[...n.get(x.specifier)??[],m])}return{file:rel(c,o.file),symbols:o.values.slice(0,MAX_SYMBOLS_LISTED),typeOnly:o.typeOnly,wholeModule:o.wholeModule,rewrite:[...n].sort((m,_)=>m[0].localeCompare(_[0])).map(([m,_])=>`import { ${_.join(", ")} } from '${m}';`)}}).sort((o,n)=>Number(n.wholeModule)-Number(o.wholeModule)||n.symbols.length-o.symbols.length||o.file.localeCompare(n.file)),b={project:e.project,library:t.name,libraryRoot:rel(c,t.root),rootEntry:rel(c,t.rootEntry),libraryFiles:t.files,compiledModules:d.length,compiledBytes:z,share:O,rootImporterCount:p.length,rootImporters:P.slice(0,MAX_IMPORTERS_LISTED),internalRootImporters:w.slice(0,MAX_INTERNAL_LISTED).map(o=>rel(c,o)),symbols:R.size,unresolvedSymbols:[...v].sort().slice(0,MAX_SYMBOLS_LISTED),barrelDefines:[...S].sort().slice(0,MAX_SYMBOLS_LISTED),neededModules:I.size,neededBytes:F,avoidableModules:D.length,avoidableBytes:D.reduce((o,n)=>o+n.size,0),subpaths:[...j.values()].map(o=>({...o,symbols:o.symbols.sort().slice(0,MAX_SYMBOLS_LISTED)})).sort((o,n)=>Number(o.exists)-Number(n.exists)||n.symbols.length-o.symbols.length).slice(0,MAX_SUBPATHS_LISTED),fires:!1};return O<h.minShare?b.quiet=`compiles ${pct(O)} of the library (below ${pct(h.minShare)})`:b.compiledModules<h.minModules&&b.compiledBytes<h.minBytes?b.quiet=`compiles ${b.compiledModules} modules / ${mb(b.compiledBytes)} (below ${h.minModules} modules and ${mb(h.minBytes)})`:L?b.quiet="an importer uses the whole module (a namespace passed on, require(), import(), export *) \u2014 it may need all of it":R.size>0&&v.size/R.size>MAX_UNRESOLVED_SHARE?b.quiet=`could not follow ${v.size} of ${R.size} symbols to their files`:b.neededModules>h.maxNeededShare*b.compiledModules?b.quiet=`its importers need ${b.neededModules} of the ${b.compiledModules} compiled modules (above ${pct(h.maxNeededShare)})`:b.fires=!0,b}$(measure,"measure"),M(measure,"measure"),y(measure,"measure");const pct=y(e=>`${Math.round(e*100)}%`,"pct"),mb=y(e=>`${(e/(1024*1024)).toFixed(1)} MB`,"mb");function analyzeBarrelImports(e){const t=y(l=>e.source.exists(l),"exists"),s=new AliasResolver(e.libraries,t),r=new ExportReader(e.source,s),i=new Map,u=y(l=>(i.has(l)||i.set(l,(0,workspace_libraries_1.libraryOf)(e.libraries,l)),i.get(l)),"owner"),a=[];for(const l of e.projects){const d=new Map(l.modules.map(p=>[p.resource,p]));for(const p of e.libraries){if(e.expired?.())return{complete:!1,measurements:a};const c=measure(l,p,d,e,s,r,u);c&&a.push(c)}}return{complete:!e.expired?.(),measurements:a}}$(analyzeBarrelImports,"analyzeBarrelImports"),M(analyzeBarrelImports,"analyzeBarrelImports"),y(analyzeBarrelImports,"analyzeBarrelImports"),exports.EXECUTOR_MB_PER_MODULE=.374;function describeHeavyBarrel(e,t){const s=t&&t.builtModules>=50?t.durationMs/t.builtModules:void 0,r=s!==void 0?Math.round(s*e.avoidableModules):void 0,i=Math.round(exports.EXECUTOR_MB_PER_MODULE*e.avoidableModules),u=e.rootImporters.slice(0,3),a=e.subpaths.filter(c=>!c.exists),l=u.map(c=>`${c.file}: replace its \`${e.library}\` import with ${c.rewrite.length?c.rewrite.join(" "):"imports from the subpaths that export what it uses"}`),d=[`Import ${e.library} by subpath, never by its root barrel (${e.rootEntry}). ${e.rootImporterCount} file(s) of ${e.project}'s build import the root; ${l.length?`start with \u2014 ${l.join(" | ")}`:"see evidence.rootImporters"}${e.rootImporterCount>u.length?` (+${e.rootImporterCount-u.length} more: evidence.rootImporters)`:""}.`];a.length&&d.push(`Add the missing subpath entr${a.length===1?"y":"ies"} to the library: ${a.slice(0,4).map(c=>`"${c.specifier}" \u2192 ${c.entry}`).join(", ")} \u2014 in tsconfig.base.json \`compilerOptions.paths\` and, if the library has a package.json, its \`exports\` ("./<domain>"). Add exact keys (plus "<domain>/*" for single files), never one library-wide "${e.library}/*": a bundler's resolver can rank it above the exact keys and re-route them at runtime while tsc and jest stay green.`),e.barrelDefines.length&&d.push(`${e.rootEntry} defines ${e.barrelDefines.slice(0,4).join(", ")} itself, so importing ${e.barrelDefines.length===1?"it":"them"} runs the whole barrel: move ${e.barrelDefines.length===1?"it":"them"} into a module of ${e.barrelDefines.length===1?"its":"their"} own and import that.`),e.internalRootImporters.length&&d.push(`${e.internalRootImporters.length} file(s) inside ${e.library} import its own root barrel (${e.internalRootImporters.slice(0,3).join(", ")}): make them import the module they need, or every subpath still pulls the whole library in.`),d.push(`Stop the root import from coming back: in ${e.project}'s ESLint config add \`'no-restricted-imports': ['error', { paths: [{ name: '${e.library}', message: 'Import from a domain subpath (${e.library}/<domain>), not the root barrel.' }] }]\`.`);const p=`Save a file of ${e.project} (or restart it) so its dev build recompiles: it should compile about ${e.neededModules} modules of ${e.library} instead of ${e.compiledModules}, and LensMCP retracts this finding \u2014 \`observe_current_status\` no longer lists bundle/heavy-barrel-import for ${e.project}. Then check its pods' live heap (\`memory_pods\`).`;return{subject:e.library,severity:"warning",title:`${e.project} compiles ${e.compiledModules} of the ${e.libraryFiles} files of ${e.library} through its root barrel; its imports need ${e.neededModules}`,summary:`${e.rootImporterCount} file(s) of ${e.project} import ${e.library} through its root entry and take ${e.symbols} symbol(s); those need ${e.neededModules} of the library's modules, but the barrel makes the dev build compile ${e.compiledModules} (${mb(e.compiledBytes)}) \u2014 ${e.avoidableModules} modules (${mb(e.avoidableBytes)}) nothing uses, compiled in every service that does the same and loaded into every pod.`,evidence:{library:e.library,libraryRoot:e.libraryRoot,rootEntry:e.rootEntry,libraryFiles:e.libraryFiles,compiledModules:e.compiledModules,compiledBytes:e.compiledBytes,share:Math.round(e.share*1e3)/1e3,neededModules:e.neededModules,neededBytes:e.neededBytes,avoidableModules:e.avoidableModules,avoidableBytes:e.avoidableBytes,symbols:e.symbols,unresolvedSymbols:e.unresolvedSymbols,barrelDefines:e.barrelDefines,rootImporterCount:e.rootImporterCount,rootImporters:e.rootImporters,internalRootImporters:e.internalRootImporters,subpaths:e.subpaths},cost:{modules:e.avoidableModules,bytes:e.avoidableBytes,...r!==void 0?{compileMs:r}:{},memoryMb:i,basis:`modules/bytes measured in this compilation; memoryMb = ${exports.EXECUTOR_MB_PER_MODULE} MB of webpack-executor heap per compiled module (fitted on FoodGuard's watchers)${r!==void 0?"; compileMs = the last full build's time per built module \xD7 the avoidable modules":""}. Each pod also loads them, at runtime cost the bundle cannot measure.`},fix:d,verify:p}}$(describeHeavyBarrel,"describeHeavyBarrel"),M(describeHeavyBarrel,"describeHeavyBarrel"),y(describeHeavyBarrel,"describeHeavyBarrel");
1
+ "use strict";var H=Object.defineProperty;var M=(e,o)=>H(e,"name",{value:o,configurable:!0});var C=Object.defineProperty,y=M((e,o)=>C(e,"name",{value:o,configurable:!0}),"y");Object.defineProperty(exports,"__esModule",{value:!0}),exports.EXECUTOR_MB_PER_MODULE=exports.DEFAULT_HEAVY_BARREL_THRESHOLDS=exports.HEAVY_BARREL_RULE=void 0,exports.analyzeBarrelImports=analyzeBarrelImports,exports.describeHeavyBarrel=describeHeavyBarrel;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),workspace_libraries_1=require("./workspace-libraries"),source_scan_1=require("./source-scan");exports.HEAVY_BARREL_RULE="bundle/heavy-barrel-import",exports.DEFAULT_HEAVY_BARREL_THRESHOLDS={minShare:.5,minModules:100,minBytes:1024*1024,maxNeededShare:.6};const MAX_IMPORTERS_LISTED=8,MAX_SYMBOLS_LISTED=12,MAX_SUBPATHS_LISTED=12,MAX_INTERNAL_LISTED=6,MAX_EXPORT_DEPTH=24,MAX_UNRESOLVED_SHARE=.1;class AliasResolver{static{M(this,"AliasResolver")}static{y(this,"AliasResolver")}constructor(o,r){this.exists=r,this.exact=new Map,this.wildcards=[];for(const s of o){this.exact.set(s.name,s.rootEntry);for(const i of s.aliases)this.exact.set(i,s.rootEntry);for(const i of s.subpaths)this.exact.set(i.specifier,i.entry);for(const i of s.wildcards)this.wildcards.push(i)}this.wildcards.sort((s,i)=>i.prefix.length-s.prefix.length)}resolve(o,r){if(r.startsWith("."))return(0,workspace_libraries_1.resolveSourceFile)(path.resolve(path.dirname(o),r),this.exists);const s=this.exact.get(r);if(s)return s;const i=this.wildcards.find(u=>r.startsWith(u.prefix));return i?(0,workspace_libraries_1.resolveSourceFile)(path.join(i.dir,r.slice(i.prefix.length)),this.exists):void 0}}class ExportReader{static{M(this,"ExportReader")}static{y(this,"ExportReader")}constructor(o,r){this.source=o,this.aliases=r,this.cache=new Map,this.resolved=new Map}index(o){let r=this.cache.get(o);if(r===void 0){const s=this.source.read(o);r=s===void 0?null:(0,source_scan_1.scanExports)(s),this.cache.set(o,r)}return r}resolve(o,r){const s=`${o}\0${r}`;let i=this.resolved.get(s);return i===void 0&&(i=this.follow(o,r,0,new Set)??null,this.resolved.set(s,i)),i??void 0}follow(o,r,s,i){if(s>MAX_EXPORT_DEPTH)return;const u=`${o}\0${r}`;if(i.has(u))return;i.add(u);const a=this.index(o);if(!a)return;if(a.values.has(r))return{file:o,typeOnly:!1};if(a.types.has(r))return{file:o,typeOnly:!0};const l=a.namespaces.get(r);if(l!==void 0){const p=this.aliases.resolve(o,l);return p?{file:p,typeOnly:!1}:void 0}const d=a.reexports.get(r);if(d){const p=this.aliases.resolve(o,d.specifier);if(!p)return;const c=this.follow(p,d.name,s+1,i);return c?{...c,typeOnly:c.typeOnly||d.typeOnly}:void 0}if(r!=="default")for(const p of a.stars){const c=this.aliases.resolve(o,p);if(!c)continue;const h=this.follow(c,r,s+1,i);if(h)return h}}}const rel=y((e,o)=>path.relative(e,o)||o,"rel");function readRootUse(e,o,r,s){const i=y(a=>l=>s.resolve(a,l)===e.rootEntry,"toBarrel"),u=[];for(const a of o){const l=/\.(?:[cm]?[jt]sx?)$/.test(a)?r.source.read(a):void 0;if(l===void 0){u.push({file:a,values:[],typeOnly:0,wholeModule:!0});continue}const d=(0,source_scan_1.scanImports)(l,i(a));if(d.length===0){u.push({file:a,values:[],typeOnly:0,wholeModule:!0});continue}const p=new Set;let c=0,h=!1;for(const x of d){h||=x.wholeModule;for(const f of x.names)f.typeOnly?c++:p.add(f.imported)}u.push({file:a,values:[...p].sort(),typeOnly:c,wholeModule:h})}return{importers:u}}M(readRootUse,"readRootUse"),y(readRootUse,"readRootUse");function closureWithin(e,o,r,s,i){const u=new Set,a=[...o].filter(l=>l!==s&&r.has(l)&&i(l)===e);for(;a.length;){const l=a.pop();if(!u.has(l)){u.add(l);for(const d of r.get(l)?.dependencies??[])d!==s&&!u.has(d)&&i(d)===e&&r.has(d)&&a.push(d)}}return u}M(closureWithin,"closureWithin"),y(closureWithin,"closureWithin");function subpathFor(e,o,r,s,i,u,a=0){if(r===e.rootEntry)return;const l=u(r);if(l!==e)return l&&a<2?subpathFor(l,o,r,s,i,u,a+1):void 0;const d=e.subpaths.filter(f=>r.startsWith(path.dirname(f.entry)+path.sep)||r===f.entry).filter(f=>s.resolve(f.entry,o)?.file===r).sort((f,$)=>$.entry.length-f.entry.length);if(d[0])return{specifier:d[0].specifier,entry:d[0].entry,exists:!0};const p=path.dirname(e.rootEntry);for(const f of e.wildcards){if(!r.startsWith(f.dir))continue;const $=r.slice(f.dir.length).split(path.sep).join("/").replace(/\.(?:[cm]?[jt]sx?)$/,""),w=$.split("/")[0],v=(0,workspace_libraries_1.resolveSourceFile)(path.join(f.dir,w),i.exists);return v&&v!==r&&s.resolve(v,o)?.file===r?{specifier:`${f.prefix}${w}`,entry:v,exists:!0}:{specifier:`${f.prefix}${$.replace(/\/index$/,"")}`,entry:r,exists:!0}}const c=path.relative(p,r).split(path.sep),h=c.length>1?c[0]:c[0].replace(/\.(?:[cm]?[jt]sx?)$/,""),x=c.length>1?(0,workspace_libraries_1.resolveSourceFile)(path.join(p,h),i.exists)??path.join(p,h,"index.ts"):r;return{specifier:`${e.name}/${h}`,entry:x,exists:!1}}M(subpathFor,"subpathFor"),y(subpathFor,"subpathFor");function measure(e,o,r,s,i,u,a){if(!r.has(o.rootEntry))return;const l=y(t=>a(t)===o,"inLib"),d=e.modules.filter(t=>l(t.resource)),p=e.modules.filter(t=>!l(t.resource)&&t.dependencies.includes(o.rootEntry)).map(t=>t.resource).sort();if(p.length===0)return;const c=s.workspaceRoot,h=s.thresholds,x=d.filter(t=>t.resource!==o.rootEntry&&t.dependencies.includes(o.rootEntry)).map(t=>t.resource),f=new Set;for(const t of e.modules)if(!l(t.resource))for(const n of t.dependencies)n!==o.rootEntry&&l(n)&&f.add(n);const $=readRootUse(o,p,s,i),w=new Set(f),v=new Set,S=new Map,R=new Set,_=new Set;for(const t of $.importers)for(const n of t.values){if(_.add(n),S.has(n)||v.has(n)||R.has(n))continue;const m=u.resolve(o.rootEntry,n);m?m.file===o.rootEntry?R.add(n):m.typeOnly||(S.set(n,m.file),w.add(m.file)):v.add(n)}if(R.size>0)for(const t of u.index(o.rootEntry)?.valueImports??[]){const n=i.resolve(o.rootEntry,t);n&&w.add(n)}const L=$.importers.some(t=>t.wholeModule),B=L?new Set(d.map(t=>t.resource)):closureWithin(o,w,r,o.rootEntry,a),T=y(t=>{let n=0;for(const m of t)n+=r.get(m)?.size??0;return n},"sizeOf"),U=d.reduce((t,n)=>t+n.size,0),z=T(B),A=d.filter(t=>!B.has(t.resource)),I=o.files>0?Math.min(1,d.length/o.files):1,O=new Map,D=new Map,k=y((t,n)=>{let m=D.get(t);return m===void 0&&(m=subpathFor(o,t,n,u,s.source,a)??null,D.set(t,m)),m??void 0},"choose"),F=$.importers.map(t=>{const n=new Map;for(const m of t.values){const g=S.get(m);if(!g)continue;const E=k(m,g);if(!E)continue;const j=O.get(E.specifier)??{specifier:E.specifier,entry:rel(c,E.entry),symbols:[],exists:E.exists};j.symbols.includes(m)||j.symbols.push(m),O.set(E.specifier,j),n.set(E.specifier,[...n.get(E.specifier)??[],m])}return{file:rel(c,t.file),symbols:t.values.slice(0,MAX_SYMBOLS_LISTED),typeOnly:t.typeOnly,wholeModule:t.wholeModule,rewrite:[...n].sort((m,g)=>m[0].localeCompare(g[0])).map(([m,g])=>`import { ${g.join(", ")} } from '${m}';`)}}).sort((t,n)=>Number(n.wholeModule)-Number(t.wholeModule)||n.symbols.length-t.symbols.length||t.file.localeCompare(n.file)),b={project:e.project,library:o.name,libraryRoot:rel(c,o.root),rootEntry:rel(c,o.rootEntry),libraryFiles:o.files,compiledModules:d.length,compiledBytes:U,share:I,rootImporterCount:p.length,rootImporters:F.slice(0,MAX_IMPORTERS_LISTED),internalRootImporters:x.slice(0,MAX_INTERNAL_LISTED).map(t=>rel(c,t)),symbols:_.size,unresolvedSymbols:[...v].sort().slice(0,MAX_SYMBOLS_LISTED),barrelDefines:[...R].sort().slice(0,MAX_SYMBOLS_LISTED),neededModules:B.size,neededBytes:z,avoidableModules:A.length,avoidableBytes:A.reduce((t,n)=>t+n.size,0),subpaths:[...O.values()].map(t=>({...t,symbols:t.symbols.sort().slice(0,MAX_SYMBOLS_LISTED)})).sort((t,n)=>Number(t.exists)-Number(n.exists)||n.symbols.length-t.symbols.length).slice(0,MAX_SUBPATHS_LISTED),fires:!1};return I<h.minShare?b.quiet=`compiles ${pct(I)} of the library (below ${pct(h.minShare)})`:b.compiledModules<h.minModules&&b.compiledBytes<h.minBytes?b.quiet=`compiles ${b.compiledModules} modules / ${mb(b.compiledBytes)} (below ${h.minModules} modules and ${mb(h.minBytes)})`:L?b.quiet="an importer uses the whole module (a namespace passed on, require(), import(), export *) \u2014 it may need all of it":_.size>0&&v.size/_.size>MAX_UNRESOLVED_SHARE?b.quiet=`could not follow ${v.size} of ${_.size} symbols to their files`:b.neededModules>h.maxNeededShare*b.compiledModules?b.quiet=`its importers need ${b.neededModules} of the ${b.compiledModules} compiled modules (above ${pct(h.maxNeededShare)})`:b.fires=!0,b}M(measure,"measure"),y(measure,"measure");const pct=y(e=>`${Math.round(e*100)}%`,"pct"),mb=y(e=>`${(e/(1024*1024)).toFixed(1)} MB`,"mb");function analyzeBarrelImports(e){const o=y(l=>e.source.exists(l),"exists"),r=new AliasResolver(e.libraries,o),s=new ExportReader(e.source,r),i=new Map,u=y(l=>(i.has(l)||i.set(l,(0,workspace_libraries_1.libraryOf)(e.libraries,l)),i.get(l)),"owner"),a=[];for(const l of e.projects){const d=new Map(l.modules.map(p=>[p.resource,p]));for(const p of e.libraries){if(e.expired?.())return{complete:!1,measurements:a};const c=measure(l,p,d,e,r,s,u);c&&a.push(c)}}return{complete:!e.expired?.(),measurements:a}}M(analyzeBarrelImports,"analyzeBarrelImports"),y(analyzeBarrelImports,"analyzeBarrelImports"),exports.EXECUTOR_MB_PER_MODULE=.374;function describeHeavyBarrel(e,o){const r=o&&o.builtModules>=50?o.durationMs/o.builtModules:void 0,s=r!==void 0?Math.round(r*e.avoidableModules):void 0,i=Math.round(exports.EXECUTOR_MB_PER_MODULE*e.avoidableModules),u=e.rootImporters.slice(0,3),a=e.subpaths.filter(c=>!c.exists),l=u.map(c=>`${c.file}: replace its \`${e.library}\` import with ${c.rewrite.length?c.rewrite.join(" "):"imports from the subpaths that export what it uses"}`),d=[`Import ${e.library} by subpath, never by its root barrel (${e.rootEntry}). ${e.rootImporterCount} file(s) of ${e.project}'s build import the root; ${l.length?`start with \u2014 ${l.join(" | ")}`:"see evidence.rootImporters"}${e.rootImporterCount>u.length?` (+${e.rootImporterCount-u.length} more: evidence.rootImporters)`:""}.`];a.length&&d.push(`Add the missing subpath entr${a.length===1?"y":"ies"} to the library: ${a.slice(0,4).map(c=>`"${c.specifier}" \u2192 ${c.entry}`).join(", ")} \u2014 in tsconfig.base.json \`compilerOptions.paths\` and, if the library has a package.json, its \`exports\` ("./<domain>"). Add exact keys (plus "<domain>/*" for single files), never one library-wide "${e.library}/*": a bundler's resolver can rank it above the exact keys and re-route them at runtime while tsc and jest stay green.`),e.barrelDefines.length&&d.push(`${e.rootEntry} defines ${e.barrelDefines.slice(0,4).join(", ")} itself, so importing ${e.barrelDefines.length===1?"it":"them"} runs the whole barrel: move ${e.barrelDefines.length===1?"it":"them"} into a module of ${e.barrelDefines.length===1?"its":"their"} own and import that.`),e.internalRootImporters.length&&d.push(`${e.internalRootImporters.length} file(s) inside ${e.library} import its own root barrel (${e.internalRootImporters.slice(0,3).join(", ")}): make them import the module they need, or every subpath still pulls the whole library in.`),d.push(`Stop the root import from coming back: in ${e.project}'s ESLint config add \`'no-restricted-imports': ['error', { paths: [{ name: '${e.library}', message: 'Import from a domain subpath (${e.library}/<domain>), not the root barrel.' }] }]\`.`);const p=`Save a file of ${e.project} (or restart it) so its dev build recompiles: it should compile about ${e.neededModules} modules of ${e.library} instead of ${e.compiledModules}, and LensMCP retracts this finding \u2014 \`observe_current_status\` no longer lists bundle/heavy-barrel-import for ${e.project}. Then check its pods' live heap (\`memory_pods\`).`;return{subject:e.library,severity:"warning",title:`${e.project} compiles ${e.compiledModules} of the ${e.libraryFiles} files of ${e.library} through its root barrel; its imports need ${e.neededModules}`,summary:`${e.rootImporterCount} file(s) of ${e.project} import ${e.library} through its root entry and take ${e.symbols} symbol(s); those need ${e.neededModules} of the library's modules, but the barrel makes the dev build compile ${e.compiledModules} (${mb(e.compiledBytes)}) \u2014 ${e.avoidableModules} modules (${mb(e.avoidableBytes)}) nothing uses, compiled in every service that does the same and loaded into every pod.`,evidence:{library:e.library,libraryRoot:e.libraryRoot,rootEntry:e.rootEntry,libraryFiles:e.libraryFiles,compiledModules:e.compiledModules,compiledBytes:e.compiledBytes,share:Math.round(e.share*1e3)/1e3,neededModules:e.neededModules,neededBytes:e.neededBytes,avoidableModules:e.avoidableModules,avoidableBytes:e.avoidableBytes,symbols:e.symbols,unresolvedSymbols:e.unresolvedSymbols,barrelDefines:e.barrelDefines,rootImporterCount:e.rootImporterCount,rootImporters:e.rootImporters,internalRootImporters:e.internalRootImporters,subpaths:e.subpaths},cost:{modules:e.avoidableModules,bytes:e.avoidableBytes,...s!==void 0?{compileMs:s}:{},memoryMb:i,basis:`modules/bytes measured in this compilation; memoryMb = ${exports.EXECUTOR_MB_PER_MODULE} MB of webpack-executor heap per compiled module (fitted on FoodGuard's watchers)${s!==void 0?"; compileMs = the last full build's time per built module \xD7 the avoidable modules":""}. Each pod also loads them, at runtime cost the bundle cannot measure.`},fix:d,verify:p}}M(describeHeavyBarrel,"describeHeavyBarrel"),y(describeHeavyBarrel,"describeHeavyBarrel");
@@ -1 +1 @@
1
- "use strict";var A=Object.defineProperty;var R=(r,e)=>A(r,"name",{value:e,configurable:!0});var p=Object.defineProperty,o=R((r,e)=>p(r,"name",{value:e,configurable:!0}),"o"),u=Object.defineProperty,n=o((r,e)=>u(r,"name",{value:e,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.HEAVY_BARREL_ENV=exports.DEFAULT_PERF_RULES_BUDGET_MS=exports.PERF_RULES_BUDGET_ENV=exports.PERF_RULES_ENV=void 0,exports.readPerfRulesConfig=readPerfRulesConfig,exports.resolveBundleRuleSettings=resolveBundleRuleSettings;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),heavy_barrel_import_1=require("./heavy-barrel-import");exports.PERF_RULES_ENV="LENSMCP_PERF_RULES",exports.PERF_RULES_BUDGET_ENV="LENSMCP_PERF_RULES_BUDGET_MS",exports.DEFAULT_PERF_RULES_BUDGET_MS=5e3,exports.HEAVY_BARREL_ENV={minShare:"LENSMCP_BARREL_MIN_SHARE",minModules:"LENSMCP_BARREL_MIN_MODULES",minKb:"LENSMCP_BARREL_MIN_KB",maxNeededShare:"LENSMCP_BARREL_MAX_NEEDED_SHARE"};const OFF=/^(0|off|false|no)$/i;function bounded(r,e,t){const E=typeof r=="string"&&r.trim()!==""?Number(r):r;return typeof E=="number"&&Number.isFinite(E)&&E>=e&&E<=t?E:void 0}R(bounded,"bounded"),o(bounded,"bounded"),n(bounded,"bounded");function readPerfRulesConfig(r){try{const e=JSON.parse(fs.readFileSync(path.join(r,".lensmcp","config.json"),"utf8"))?.perfRules;return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}catch{return}}R(readPerfRulesConfig,"readPerfRulesConfig"),o(readPerfRulesConfig,"readPerfRulesConfig"),n(readPerfRulesConfig,"readPerfRulesConfig");function resolveBundleRuleSettings(r,e=process.env){const t=readPerfRulesConfig(r),E=t?.[heavy_barrel_import_1.HEAVY_BARREL_RULE]&&typeof t[heavy_barrel_import_1.HEAVY_BARREL_RULE]=="object"?t[heavy_barrel_import_1.HEAVY_BARREL_RULE]:{},d=!OFF.test((e[exports.PERF_RULES_ENV]??"").trim())&&t?.enabled!==!1&&E.enabled!==!1,_=n((S,L,i,a,l)=>bounded(e[S],i,a)??bounded(L,i,a)??l,"pick"),s=heavy_barrel_import_1.DEFAULT_HEAVY_BARREL_THRESHOLDS;return{enabled:d,thresholds:{minShare:_(exports.HEAVY_BARREL_ENV.minShare,E.minShare,0,1,s.minShare),minModules:_(exports.HEAVY_BARREL_ENV.minModules,E.minModules,0,1e6,s.minModules),minBytes:Math.round(_(exports.HEAVY_BARREL_ENV.minKb,E.minKb,0,1e7,s.minBytes/1024)*1024),maxNeededShare:_(exports.HEAVY_BARREL_ENV.maxNeededShare,E.maxNeededShare,0,1,s.maxNeededShare)},budgetMs:_(exports.PERF_RULES_BUDGET_ENV,t?.budgetMs,100,12e4,exports.DEFAULT_PERF_RULES_BUDGET_MS)}}R(resolveBundleRuleSettings,"resolveBundleRuleSettings"),o(resolveBundleRuleSettings,"resolveBundleRuleSettings"),n(resolveBundleRuleSettings,"resolveBundleRuleSettings");
1
+ "use strict";var p=Object.defineProperty;var o=(r,e)=>p(r,"name",{value:e,configurable:!0});var u=Object.defineProperty,n=o((r,e)=>u(r,"name",{value:e,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.HEAVY_BARREL_ENV=exports.DEFAULT_PERF_RULES_BUDGET_MS=exports.PERF_RULES_BUDGET_ENV=exports.PERF_RULES_ENV=void 0,exports.readPerfRulesConfig=readPerfRulesConfig,exports.resolveBundleRuleSettings=resolveBundleRuleSettings;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),heavy_barrel_import_1=require("./heavy-barrel-import");exports.PERF_RULES_ENV="LENSMCP_PERF_RULES",exports.PERF_RULES_BUDGET_ENV="LENSMCP_PERF_RULES_BUDGET_MS",exports.DEFAULT_PERF_RULES_BUDGET_MS=5e3,exports.HEAVY_BARREL_ENV={minShare:"LENSMCP_BARREL_MIN_SHARE",minModules:"LENSMCP_BARREL_MIN_MODULES",minKb:"LENSMCP_BARREL_MIN_KB",maxNeededShare:"LENSMCP_BARREL_MAX_NEEDED_SHARE"};const OFF=/^(0|off|false|no)$/i;function bounded(r,e,t){const E=typeof r=="string"&&r.trim()!==""?Number(r):r;return typeof E=="number"&&Number.isFinite(E)&&E>=e&&E<=t?E:void 0}o(bounded,"bounded"),n(bounded,"bounded");function readPerfRulesConfig(r){try{const e=JSON.parse(fs.readFileSync(path.join(r,".lensmcp","config.json"),"utf8"))?.perfRules;return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}catch{return}}o(readPerfRulesConfig,"readPerfRulesConfig"),n(readPerfRulesConfig,"readPerfRulesConfig");function resolveBundleRuleSettings(r,e=process.env){const t=readPerfRulesConfig(r),E=t?.[heavy_barrel_import_1.HEAVY_BARREL_RULE]&&typeof t[heavy_barrel_import_1.HEAVY_BARREL_RULE]=="object"?t[heavy_barrel_import_1.HEAVY_BARREL_RULE]:{},S=!OFF.test((e[exports.PERF_RULES_ENV]??"").trim())&&t?.enabled!==!1&&E.enabled!==!1,_=n((a,d,s,i,L)=>bounded(e[a],s,i)??bounded(d,s,i)??L,"pick"),R=heavy_barrel_import_1.DEFAULT_HEAVY_BARREL_THRESHOLDS;return{enabled:S,thresholds:{minShare:_(exports.HEAVY_BARREL_ENV.minShare,E.minShare,0,1,R.minShare),minModules:_(exports.HEAVY_BARREL_ENV.minModules,E.minModules,0,1e6,R.minModules),minBytes:Math.round(_(exports.HEAVY_BARREL_ENV.minKb,E.minKb,0,1e7,R.minBytes/1024)*1024),maxNeededShare:_(exports.HEAVY_BARREL_ENV.maxNeededShare,E.maxNeededShare,0,1,R.maxNeededShare)},budgetMs:_(exports.PERF_RULES_BUDGET_ENV,t?.budgetMs,100,12e4,exports.DEFAULT_PERF_RULES_BUDGET_MS)}}o(resolveBundleRuleSettings,"resolveBundleRuleSettings"),n(resolveBundleRuleSettings,"resolveBundleRuleSettings");
@@ -1,2 +1,2 @@
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
+ "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 +1 @@
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
+ "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 +1 @@
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
+ "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,5 +1,5 @@
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
+ "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,2 +1,2 @@
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
+ "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,2 +1,2 @@
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");
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");
package/pod-memory.js CHANGED
@@ -1 +1 @@
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");
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");
package/pod-sock.js CHANGED
@@ -1 +1 @@
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");
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");
package/process-name.js CHANGED
@@ -1 +1 @@
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
+ "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 +1 @@
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
+ "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 +1 @@
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");
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");
package/serve-runner.js CHANGED
@@ -1 +1 @@
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();
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,2 +1,2 @@
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
+ "use strict";var f=Object.defineProperty;var c=(r,e)=>f(r,"name",{value:e,configurable:!0});var p=Object.defineProperty,s=c((r,e)=>p(r,"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)}`}c(makeId,"makeId"),s(makeId,"makeId");function workspaceRelative(r,e){return r.slice(0,MAX_FILES).map(t=>{if(!e||!path.isAbsolute(t))return t;const i=path.relative(e,t);return i&&!i.startsWith("..")&&!path.isAbsolute(i)?i.split(path.sep).join("/"):t})}c(workspaceRelative,"workspaceRelative"),s(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(i=>typeof i=="string"&&i.length>0&&i.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"),s(buildAccountOf,"buildAccountOf");function envelope(r,e,t,i,n,d,a){const o="pending";return{id:a(),sessionId:o,timestamp:e,source:"gateway",category:"cluster",severity:t,context:{sessionId:o,projectName:r.project},fingerprint:`cluster:${r.project}:${i}`,title:n,raw:{kind:i,...d,project:r.project,service:r.service,podGeneration:r.podGeneration}}}c(envelope,"envelope"),s(envelope,"envelope");const filesText=s((r,e)=>{const t=r+e;return t===0?"no source change":`${t} file${t===1?"":"s"}`},"filesText"),seconds=s(r=>r<1e3?`${r}ms`:`${(r/1e3).toFixed(1)}s`,"seconds");function buildServiceBuildEvent(r,e,t,i={}){const n=workspaceRelative(t.changedFiles,i.root),d=t.moreChanged??0,a=i.at??(e==="started"?t.startedAt:t.endedAt??Date.now()),o=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(n.length,d)}`:e==="unchanged"?`build unchanged: ${r.project} \u2014 ${filesText(n.length,d)}${o!==void 0?` \xB7 ${seconds(o)}`:""} \xB7 its bundle came out as it was, nothing to swap`:`build failed: ${r.project} \u2014 ${l??filesText(n.length,d)}${o!==void 0?` \xB7 ${seconds(o)}`:""} \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:o}:{},changedFiles:n,...d>0?{moreChanged:d}:{},...e==="failed"&&t.error?{error:t.error}:{}},i.id??makeId)}c(buildServiceBuildEvent,"buildServiceBuildEvent"),s(buildServiceBuildEvent,"buildServiceBuildEvent");function buildServiceSwapEvent(r,e,t,i={}){const n=i.at??Date.now(),d=workspaceRelative(t?.changedFiles??[],i.root),a=t?.moreChanged??0,o=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(d.length,a)}`:"")+(o!==void 0?` \xB7 compiled in ${seconds(o)}`:"")+` \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(d.length,a)}`:"")+(o!==void 0?` \xB7 compiled in ${seconds(o)}`:"")+` \xB7 swapped in ${seconds(e.swapMs)}`;return envelope(r,n,"info","service-swap",l,{pod:r.pod,pid:r.pid,generation:e.generation,swaps:e.swaps,swappedAt:n,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:o}:{}},changedFiles:d,...a>0?{moreChanged:a}:{}}:{}},i.id??makeId)}c(buildServiceSwapEvent,"buildServiceSwapEvent"),s(buildServiceSwapEvent,"buildServiceSwapEvent");
@@ -1,3 +1,3 @@
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(`
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(`
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}}}l(forkTsCheckerOnItsOwn,"forkTsCheckerOnItsOwn"),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}}}f(forkTsCheckerOnItsOwn,"forkTsCheckerOnItsOwn"),o(forkTsCheckerOnItsOwn,"forkTsCheckerOnItsOwn");