farming-code 2.2.30 → 2.2.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.md +7 -0
- package/backend/acp/{client-services.js → client-services.cjs} +132 -134
- package/backend/acp/packaged-claude-acp.cjs +37 -0
- package/backend/acp/packaged-codex-acp.cjs +37 -0
- package/backend/acp/patch-decisions.cjs +182 -0
- package/backend/acp/permission-security.cjs +131 -0
- package/backend/{acp-checkpoint-store.js → acp-checkpoint-store.cjs} +90 -59
- package/backend/{acp-runtime.js → acp-runtime.cjs} +1220 -1112
- package/backend/acp-session-state.cjs +622 -0
- package/backend/acp-transcript.cjs +525 -0
- package/backend/agent-env.cjs +257 -0
- package/backend/agent-extension-discovery.cjs +452 -0
- package/backend/agent-extension-inventory.cjs +116 -0
- package/backend/agent-json-stream.cjs +283 -0
- package/backend/agent-lifecycle-journal.cjs +185 -0
- package/backend/{agent-manager.js → agent-manager.cjs} +3116 -4275
- package/backend/agent-order-transaction.cjs +85 -0
- package/backend/agent-order.cjs +159 -0
- package/backend/agent-provider-session.cjs +98 -0
- package/backend/agent-runtime-binding.cjs +179 -0
- package/backend/agent-session-history.cjs +1022 -0
- package/backend/agent-session-inventory.cjs +291 -0
- package/backend/async-cache.cjs +104 -0
- package/backend/atomic-json-store.cjs +67 -0
- package/backend/auth.cjs +261 -0
- package/backend/authoritative-inventory-cache.cjs +383 -0
- package/backend/business-health.cjs +68 -0
- package/backend/chat-runtime.cjs +50 -0
- package/backend/claude-settings.cjs +132 -0
- package/backend/cli-agents.cjs +435 -0
- package/backend/codex-context-window.cjs +196 -0
- package/backend/codex-models.cjs +228 -0
- package/backend/codex-session-archive.cjs +82 -0
- package/backend/codex-session-history.cjs +590 -0
- package/backend/{codex-terminal-profile.js → codex-terminal-profile.cjs} +149 -155
- package/backend/codex-transcript-sanitizer.cjs +130 -0
- package/backend/codex-transcript.cjs +2107 -0
- package/backend/command-runner-child.cjs +105 -0
- package/backend/config-manager.cjs +1263 -0
- package/backend/control-api.cjs +439 -0
- package/backend/data/LICENSE.cua +21 -0
- package/backend/executable-discovery.cjs +204 -0
- package/backend/farming-agent-bootstrap.cjs +81 -0
- package/backend/farming-agent-bootstrap.zh_cn.md +6 -2
- package/backend/{farming-app-cli.js → farming-app-cli.cjs} +441 -493
- package/backend/farming-cli.cjs +414 -0
- package/backend/farming-net-pass.cjs +319 -0
- package/backend/farming-net-registry.cjs +123 -0
- package/backend/farming-net-server.cjs +309 -0
- package/backend/farming-session-store.cjs +651 -0
- package/backend/git-worktree-info.cjs +181 -0
- package/backend/haiku-token.cjs +828 -0
- package/backend/index-html.cjs +96 -0
- package/backend/input-parts.cjs +68 -0
- package/backend/input-routing.cjs +40 -0
- package/backend/{local-session-engine.js → local-session-engine.cjs} +276 -282
- package/backend/main-agent-skills.cjs +309 -0
- package/backend/main-page-session.cjs +132 -0
- package/backend/native-pty-controller-generation.cjs +139 -0
- package/backend/{native-pty-host-client.js → native-pty-host-client.cjs} +338 -346
- package/backend/native-pty-host-identity.cjs +125 -0
- package/backend/native-pty-host-path.cjs +68 -0
- package/backend/{native-pty-host.js → native-pty-host.cjs} +480 -569
- package/backend/native-session-engine.cjs +296 -0
- package/backend/network.cjs +57 -0
- package/backend/npm-update-helper.cjs +399 -0
- package/backend/packaged-node-pty.cjs +120 -0
- package/backend/preview-session-manager.cjs +89 -0
- package/backend/provider-adapters.cjs +492 -0
- package/backend/provider-home-configuration.cjs +211 -0
- package/backend/provider-session-id.cjs +79 -0
- package/backend/provider-session-service.cjs +333 -0
- package/backend/qr-share-tickets.cjs +119 -0
- package/backend/resource-broadcast-protocol.cjs +50 -0
- package/backend/review-diff-router.cjs +202 -0
- package/backend/review-diff-service.cjs +1267 -0
- package/backend/review-session-router.cjs +93 -0
- package/backend/review-session-service.cjs +470 -0
- package/backend/review-session-store.cjs +161 -0
- package/backend/review-state-router.cjs +132 -0
- package/backend/review-state-store.cjs +299 -0
- package/backend/run-history-store.cjs +97 -0
- package/backend/runtime-dependency-manager.cjs +893 -0
- package/backend/runtime-executable-invocation.cjs +37 -0
- package/backend/runtime-observation.cjs +96 -0
- package/backend/server-process-identity.cjs +70 -0
- package/backend/server.cjs +3356 -0
- package/backend/session-engine-bridge.cjs +144 -0
- package/backend/session-engine-router.cjs +105 -0
- package/backend/session-engine.cjs +64 -0
- package/backend/session-stream-protocol.cjs +181 -0
- package/backend/shell-busy-integration.cjs +442 -0
- package/backend/slash-command-discovery.cjs +423 -0
- package/backend/storage-layout.cjs +263 -0
- package/backend/system-monitor.cjs +96 -0
- package/backend/terminal-attach-checkpoint.cjs +73 -0
- package/backend/terminal-exit-quiescence.cjs +57 -0
- package/backend/{terminal-reducer-flow-control.js → terminal-reducer-flow-control.cjs} +45 -22
- package/backend/terminal-runtime-cleanup.cjs +99 -0
- package/backend/{terminal-screen-state.js → terminal-screen-state.cjs} +100 -108
- package/backend/{terminal-screen-worker-pool.js → terminal-screen-worker-pool.cjs} +89 -79
- package/backend/{terminal-screen-worker-thread.js → terminal-screen-worker-thread.cjs} +64 -65
- package/backend/terminal-screen-worker.cjs +352 -0
- package/backend/terminal-state-serialization.cjs +147 -0
- package/backend/{terminal-status.js → terminal-status.cjs} +137 -187
- package/backend/theme-manager.cjs +185 -0
- package/backend/{update-service.js → update-service.cjs} +258 -248
- package/backend/usage-forecast.cjs +95 -0
- package/backend/{usage-history-client.js → usage-history-client.cjs} +144 -94
- package/backend/usage-history-smoke.cjs +85 -0
- package/backend/usage-history-worker.cjs +60 -0
- package/backend/{usage-monitor.js → usage-monitor.cjs} +363 -390
- package/backend/workspace-directory.cjs +239 -0
- package/backend/workspace-discovery.cjs +271 -0
- package/backend/{workspace-file-router.js → workspace-file-router.cjs} +213 -282
- package/backend/{workspace-file-service.js → workspace-file-service.cjs} +1139 -1318
- package/backend/workspace-root-registry.cjs +192 -0
- package/bin/farming +1 -1
- package/dist/acp/codex-acp-1.1.4.mjs +18 -1
- package/dist/assets/App-BCkdpWB6.css +1 -0
- package/dist/assets/App-CRjKpaGp.js +697 -0
- package/dist/assets/CodeSelect-Ci8sKZPU.js +1 -0
- package/dist/assets/CodeSelect-T2eNzrOc.css +1 -0
- package/dist/assets/{FileEditorMarkdownPreview-Cs9cLv8a.js → FileEditorMarkdownPreview-V06QHlAg.js} +55 -55
- package/dist/assets/FileEditorPane-BX-Wjg9U.js +2 -0
- package/dist/assets/IconGlyphs-YhV7tqd4.js +1 -0
- package/dist/assets/ProjectFilesSection-BDT2_r0o.js +12 -0
- package/dist/assets/ReviewPage-BqAs5sG1.js +3 -0
- package/dist/assets/code-dark-B7eM_9G9.css +1 -0
- package/dist/assets/{cssMode-Bdg5RpcJ.js → cssMode-ADdAlxTO.js} +1 -1
- package/dist/assets/{editor.api2-D74ufkbr.js → editor.api2-BFLAr0YF.js} +162 -162
- package/dist/assets/file-icons-BpeqWkIB.js +1 -0
- package/dist/assets/{freemarker2-DfMDJfnE.js → freemarker2-C90q5jrp.js} +1 -1
- package/dist/assets/{handlebars-BEdPtzMT.js → handlebars-BwUQcEDq.js} +1 -1
- package/dist/assets/{html-B1fPb1QD.js → html-1s3uPKfh.js} +1 -1
- package/dist/assets/{htmlMode-CY2ZjHxH.js → htmlMode-xtKD99de.js} +1 -1
- package/dist/assets/{index-D-zetSol.js → index-C8MchCem.js} +3 -3
- package/dist/assets/{javascript-BV2OsWA0.js → javascript-Ph7ijyny.js} +1 -1
- package/dist/assets/{jsonMode-zd07aeuX.js → jsonMode-D-jGAnFH.js} +1 -1
- package/dist/assets/linkComputer-CbGyI_qx.js +1 -0
- package/dist/assets/{liquid-BParI24X.js → liquid-0IamE_cI.js} +1 -1
- package/dist/assets/{lspLanguageFeatures-BzredkoV.js → lspLanguageFeatures-BxnQunWF.js} +1 -1
- package/dist/assets/main-CLKXa6hf.css +1 -0
- package/dist/assets/{mdx-vGzUJN98.js → mdx-DdNmfivn.js} +1 -1
- package/dist/assets/{monaco.contribution-BmaeBQEc.js → monaco.contribution-B43jsUs1.js} +2 -2
- package/dist/assets/{python-CUwdLgsI.js → python-IAt4X5TS.js} +1 -1
- package/dist/assets/{razor-BScebUxU.js → razor-DRkFYW0S.js} +1 -1
- package/dist/assets/review-C8-oPKXk.css +1 -0
- package/dist/assets/{tsMode-DzUAibXK.js → tsMode-_d_4U2gf.js} +1 -1
- package/dist/assets/{typescript-D9EOeM7N.js → typescript-C7zcMq9l.js} +1 -1
- package/dist/assets/{workers-DAiomYZM.js → workers-D0nOyJzf.js} +1 -1
- package/dist/assets/workspace-editor-model-DND_Y-Bj.js +1 -0
- package/dist/assets/workspace-editor-monaco-BPWhgcIB.js +4 -0
- package/dist/assets/workspace-editor-monaco-N641qPjX.js +1 -0
- package/dist/assets/workspace-view-state-k1bTlJ_Z.js +13 -0
- package/dist/assets/{xml-wWl1dhkQ.js → xml-BR-HvxT8.js} +1 -1
- package/dist/assets/{yaml-Dc2WDaOZ.js → yaml-YtFQwh4q.js} +1 -1
- package/dist/index.html +1 -1
- package/extensions/browser/backend/agent-browser-runtime.cjs +1040 -0
- package/extensions/browser/backend/agent-capability.cjs +85 -0
- package/extensions/browser/backend/browser-mcp-server.cjs +655 -0
- package/extensions/browser/backend/browser-resource-manager.cjs +1486 -0
- package/extensions/browser/backend/browser-resource-store.cjs +228 -0
- package/extensions/browser/backend/browser-router.cjs +203 -0
- package/extensions/browser/backend/executable-discovery.cjs +248 -0
- package/extensions/browser/backend/farming-browser-client.cjs +116 -0
- package/extensions/browser/backend/index.cjs +32 -0
- package/extensions/browser/backend/managed-chromium-installer.cjs +833 -0
- package/extensions/browser/bin/farming-browser +16 -7
- package/extensions/computer/backend/agent-capability.cjs +72 -0
- package/extensions/computer/backend/computer-constants.cjs +59 -0
- package/extensions/computer/backend/computer-mcp-server.cjs +182 -0
- package/extensions/computer/backend/computer-resource-manager.cjs +1219 -0
- package/extensions/computer/backend/computer-resource-store.cjs +190 -0
- package/extensions/computer/backend/computer-router.cjs +257 -0
- package/extensions/computer/backend/cua-tools.json +3067 -0
- package/extensions/computer/backend/farming-computer-client.cjs +84 -0
- package/extensions/computer/backend/index.cjs +35 -0
- package/extensions/computer/backend/isolated-browser-provider.cjs +157 -0
- package/extensions/computer/bin/farming-computer +131 -0
- package/frontend/farming-net/app.js +255 -262
- package/frontend/ghostty-loader.js +24 -20
- package/frontend/reading-anchor.js +210 -193
- package/frontend/runtime-paths.js +24 -26
- package/frontend/session-bridge.js +90 -111
- package/frontend/session-modal-bridge.js +184 -302
- package/frontend/skin-bridge.js +20 -23
- package/frontend/skins/crt/app.js +7686 -7901
- package/frontend/skins/crt/effects.js +7 -6
- package/frontend/skins/crt/index.html +6 -6
- package/frontend/skins/crt/styles/markdown.css +4 -4
- package/frontend/terminal-bridge.js +174 -181
- package/frontend/terminal-replay.js +320 -345
- package/frontend/theme-loader.js +55 -71
- package/package.json +64 -37
- package/shared/backend-connection-status.js +38 -69
- package/shared/browser-protocol.js +235 -110
- package/shared/websocket-liveness.js +40 -0
- package/backend/acp/packaged-claude-acp.js +0 -13
- package/backend/acp/packaged-codex-acp.js +0 -13
- package/backend/acp/patch-decisions.js +0 -153
- package/backend/acp/permission-security.js +0 -108
- package/backend/acp-session-state.js +0 -634
- package/backend/acp-transcript.js +0 -512
- package/backend/agent-env.js +0 -250
- package/backend/agent-json-stream.js +0 -268
- package/backend/agent-lifecycle-journal.js +0 -133
- package/backend/agent-order.js +0 -166
- package/backend/agent-provider-session.js +0 -76
- package/backend/agent-runtime-binding.js +0 -174
- package/backend/agent-session-history.js +0 -986
- package/backend/async-cache.js +0 -94
- package/backend/atomic-json-store.js +0 -37
- package/backend/auth.js +0 -251
- package/backend/chat-runtime.js +0 -28
- package/backend/claude-settings.js +0 -121
- package/backend/cli-agents.js +0 -486
- package/backend/codex-context-window.js +0 -189
- package/backend/codex-models.js +0 -226
- package/backend/codex-session-archive.js +0 -65
- package/backend/codex-session-history.js +0 -647
- package/backend/codex-transcript-sanitizer.js +0 -115
- package/backend/codex-transcript.js +0 -2362
- package/backend/command-runner-child.js +0 -67
- package/backend/config-manager.js +0 -1117
- package/backend/control-api.js +0 -455
- package/backend/executable-discovery.js +0 -216
- package/backend/farming-agent-bootstrap.js +0 -49
- package/backend/farming-cli.js +0 -403
- package/backend/farming-net-pass.js +0 -285
- package/backend/farming-net-registry.js +0 -112
- package/backend/farming-net-server.js +0 -298
- package/backend/farming-session-store.js +0 -677
- package/backend/git-worktree-info.js +0 -181
- package/backend/haiku-token.js +0 -772
- package/backend/index-html.js +0 -80
- package/backend/input-parts.js +0 -54
- package/backend/input-routing.js +0 -24
- package/backend/json-cli-runtime.js +0 -275
- package/backend/main-agent-skills.js +0 -288
- package/backend/main-page-session.js +0 -122
- package/backend/native-pty-controller-generation.js +0 -106
- package/backend/native-pty-host-identity.js +0 -86
- package/backend/native-pty-host-path.js +0 -42
- package/backend/native-session-engine.js +0 -268
- package/backend/network.js +0 -23
- package/backend/npm-update-helper.js +0 -374
- package/backend/packaged-node-pty.js +0 -99
- package/backend/preview-session-manager.js +0 -68
- package/backend/provider-adapters.js +0 -399
- package/backend/provider-session-id.js +0 -47
- package/backend/provider-session-service.js +0 -345
- package/backend/qr-share-tickets.js +0 -100
- package/backend/review-diff-router.js +0 -180
- package/backend/review-diff-service.js +0 -1270
- package/backend/review-session-router.js +0 -74
- package/backend/review-session-service.js +0 -446
- package/backend/review-session-store.js +0 -151
- package/backend/review-state-router.js +0 -116
- package/backend/review-state-store.js +0 -286
- package/backend/run-history-store.js +0 -67
- package/backend/runtime-dependency-manager.js +0 -759
- package/backend/runtime-executable-invocation.js +0 -20
- package/backend/runtime-observation.js +0 -81
- package/backend/server-process-identity.js +0 -47
- package/backend/server.js +0 -3225
- package/backend/session-engine-bridge.js +0 -129
- package/backend/session-engine-router.js +0 -66
- package/backend/session-engine.js +0 -39
- package/backend/session-stream-protocol.js +0 -185
- package/backend/shell-busy-integration.js +0 -472
- package/backend/slash-command-discovery.js +0 -433
- package/backend/storage-layout.js +0 -205
- package/backend/system-monitor.js +0 -77
- package/backend/terminal-attach-checkpoint.js +0 -74
- package/backend/terminal-exit-quiescence.js +0 -39
- package/backend/terminal-runtime-cleanup.js +0 -80
- package/backend/terminal-screen-worker.js +0 -337
- package/backend/terminal-state-serialization.js +0 -127
- package/backend/theme-manager.js +0 -163
- package/backend/usage-forecast.js +0 -86
- package/backend/usage-history-scanner.ts +0 -2718
- package/backend/usage-history-smoke.js +0 -64
- package/backend/usage-history-worker.js +0 -34
- package/backend/workspace-directory.js +0 -232
- package/backend/workspace-discovery.js +0 -311
- package/backend/workspace-root-registry.js +0 -166
- package/dist/assets/App-BKNUILuL.css +0 -1
- package/dist/assets/App-Z1N7T0eM.js +0 -695
- package/dist/assets/FileEditorPane-CNtuGjQ3.js +0 -2
- package/dist/assets/IconGlyphs-BClgag6E.js +0 -1
- package/dist/assets/ProjectFilesSection-K3GHuQ4U.js +0 -12
- package/dist/assets/ReviewPage-BRuxFaH5.js +0 -3
- package/dist/assets/code-dark-kLsQLvpf.css +0 -1
- package/dist/assets/file-icons-BOlcJ0ZF.js +0 -1
- package/dist/assets/main-DUTz-Rd2.css +0 -1
- package/dist/assets/review-BcnwQtJv.css +0 -1
- package/dist/assets/workspace-editor-model-CSGCl21x.js +0 -1
- package/dist/assets/workspace-editor-monaco-CJNwbpCy.js +0 -4
- package/dist/assets/workspace-editor-monaco-CO9w8YV0.js +0 -1
- package/dist/assets/workspace-view-state-BjKPYp0E.js +0 -7
- package/extensions/browser/backend/agent-browser-runtime.js +0 -1041
- package/extensions/browser/backend/agent-capability.js +0 -55
- package/extensions/browser/backend/browser-mcp-server.js +0 -621
- package/extensions/browser/backend/browser-resource-manager.js +0 -1331
- package/extensions/browser/backend/browser-resource-store.js +0 -190
- package/extensions/browser/backend/browser-router.js +0 -141
- package/extensions/browser/backend/executable-discovery.js +0 -238
- package/extensions/browser/backend/farming-browser-client.js +0 -83
- package/extensions/browser/backend/index.js +0 -7
- package/extensions/browser/backend/managed-chromium-installer.js +0 -593
- package/extensions/browser/frontend/BrowserSidebarPortals.tsx +0 -360
- package/extensions/browser/frontend/BrowserViewer.tsx +0 -500
- package/extensions/browser/frontend/browser-resource-state.ts +0 -60
- package/extensions/browser/frontend/browser.css +0 -567
- package/extensions/browser/frontend/types.ts +0 -38
- package/extensions/browser/frontend/useBrowserResources.ts +0 -166
- package/frontend/vendor/ghostty-web/index.d.ts +0 -1842
- package/shared/backend-connection-status.d.ts +0 -37
- package/shared/browser-protocol.d.ts +0 -5
- /package/dist/assets/{api-w2x5QfxB.js → api-ByCV9MEr.js} +0 -0
- /package/dist/assets/{core-vPkV8P_m.js → core-Czwdx12k.js} +0 -0
- /package/dist/assets/{fsharp-DNZNZyEE.js → fsharp-BjPpkoJe.js} +0 -0
- /package/dist/assets/{go-_kPJjNc_.js → go-BkIDmSUP.js} +0 -0
- /package/dist/assets/{graphql-4HCNVt5g.js → graphql-CCJTpqi1.js} +0 -0
- /package/dist/assets/{hcl-C87ymY0o.js → hcl-s4z8lUFg.js} +0 -0
- /package/dist/assets/{ini-BYrrGNTc.js → ini-CyUW1I7Z.js} +0 -0
- /package/dist/assets/{java-B211rJbk.js → java-CFCcGRiM.js} +0 -0
- /package/dist/assets/{julia-DVPsRtBm.js → julia-DQyH_EYb.js} +0 -0
- /package/dist/assets/{kotlin-BYyNerjp.js → kotlin-B8hA5O51.js} +0 -0
- /package/dist/assets/{less-EC9UblGE.js → less-DaVdaas0.js} +0 -0
- /package/dist/assets/{lexon-B1yuUdqW.js → lexon-DLBhPd3y.js} +0 -0
- /package/dist/assets/{lua-Bo6GFzxT.js → lua-gB1c_cif.js} +0 -0
- /package/dist/assets/{m3-C-Y9cBVI.js → m3-C2T3z3gB.js} +0 -0
- /package/dist/assets/{markdown-BHu-wLbe.js → markdown-CKq-Euj1.js} +0 -0
- /package/dist/assets/{mips-Dkds26rX.js → mips-Bcs5qIDX.js} +0 -0
- /package/dist/assets/{msdax-PU4g-8_g.js → msdax-CBP48FHF.js} +0 -0
- /package/dist/assets/{mysql-fPpuGpS7.js → mysql-c7tiPcFj.js} +0 -0
- /package/dist/assets/{objective-c-Wy1e5JUf.js → objective-c-D4BZkeEV.js} +0 -0
- /package/dist/assets/{pascal-BIXwvrqU.js → pascal-CJDZg0MN.js} +0 -0
- /package/dist/assets/{pascaligo-DwR0AtL_.js → pascaligo-Bygi8Ynl.js} +0 -0
- /package/dist/assets/{perl-CGHAl8my.js → perl-aS8bkf7E.js} +0 -0
- /package/dist/assets/{pgsql-B91M73E2.js → pgsql-CzNAYFYl.js} +0 -0
- /package/dist/assets/{php-C70ttrCx.js → php-DOtoEFTT.js} +0 -0
- /package/dist/assets/{pla-BNrXaRh0.js → pla-DugRnao1.js} +0 -0
- /package/dist/assets/{postiats-Dv2IAZR9.js → postiats-DsXwusKh.js} +0 -0
- /package/dist/assets/{powerquery-CkY5Wq7J.js → powerquery-DL3o72oD.js} +0 -0
- /package/dist/assets/{powershell-uGIYLU3C.js → powershell-C1qHekys.js} +0 -0
- /package/dist/assets/{protobuf-CavfmJu-.js → protobuf-DHgsc-cH.js} +0 -0
- /package/dist/assets/{pug-Drqnyitx.js → pug-FZXlE_Iu.js} +0 -0
- /package/dist/assets/{qrcode-7uGsTEmi.js → qrcode-DJDTdjL7.js} +0 -0
- /package/dist/assets/{qsharp-C7yF-Dti.js → qsharp-bLyhI3DT.js} +0 -0
- /package/dist/assets/{r-HXLGP0_-.js → r-DjFGXbAa.js} +0 -0
- /package/dist/assets/{redis-C4y6mf2p.js → redis-DSoZ_V6u.js} +0 -0
- /package/dist/assets/{redshift-DdQrFPrv.js → redshift-CzkdCsrg.js} +0 -0
- /package/dist/assets/{restructuredtext-CBrf2PNj.js → restructuredtext-B_XPrGCQ.js} +0 -0
- /package/dist/assets/{ruby-CVtMoX2B.js → ruby-Cry2RneJ.js} +0 -0
- /package/dist/assets/{rust-Ckq4sbMP.js → rust-CWzdbFq1.js} +0 -0
- /package/dist/assets/{sb-er66OpE3.js → sb-DmofU59h.js} +0 -0
- /package/dist/assets/{scala-BdWZz-hH.js → scala-BUC2l-vN.js} +0 -0
- /package/dist/assets/{scheme-kTV_s2kP.js → scheme-CNIB_72f.js} +0 -0
- /package/dist/assets/{scss-Bymy2VJQ.js → scss-DcL4-NbX.js} +0 -0
- /package/dist/assets/{shell-bwEP1LQ1.js → shell-CgAGvSSA.js} +0 -0
- /package/dist/assets/{solidity-DCddeBgL.js → solidity-DSkt6O_P.js} +0 -0
- /package/dist/assets/{sophia-BMN3AQig.js → sophia--5ytcjDN.js} +0 -0
- /package/dist/assets/{sparql-CSXOLjzi.js → sparql-C1Srr7cD.js} +0 -0
- /package/dist/assets/{sql-COg8ewmK.js → sql-2k_O5fj7.js} +0 -0
- /package/dist/assets/{st-CIaZtBS_.js → st-DCCCPqfz.js} +0 -0
- /package/dist/assets/{swift-DXiOhUHu.js → swift-Dd8mAfOt.js} +0 -0
- /package/dist/assets/{systemverilog-BTDE6Dr2.js → systemverilog-B0-aZYXu.js} +0 -0
- /package/dist/assets/{tcl-B0zy9NvV.js → tcl-CZAZwPVX.js} +0 -0
- /package/dist/assets/{twig-D594l4Z1.js → twig-D-Ag0tdS.js} +0 -0
- /package/dist/assets/{typespec-XKVjaPqo.js → typespec-B7kTFp0Z.js} +0 -0
- /package/dist/assets/{useWorkspaceMenuKeyboard-Bpy_s69Z.js → useWorkspaceMenuKeyboard-uYZpDxhU.js} +0 -0
- /package/dist/assets/{vb-B2wYoKRV.js → vb-20w1JPum.js} +0 -0
- /package/dist/assets/{wgsl-D0Yf2LbK.js → wgsl-CLJfqFt0.js} +0 -0
- /package/dist/assets/{workspace-working-copy-C3FSR3N6.js → workspace-working-copy-Cfz07cOd.js} +0 -0
|
@@ -1,41 +1,82 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
// Generated by scripts/build-backend-runtime.ts. Do not edit.
|
|
2
|
+
"use strict";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var update_service_exports = {};
|
|
31
|
+
__export(update_service_exports, {
|
|
32
|
+
FarmingUpdateService: () => FarmingUpdateService,
|
|
33
|
+
compareVersions: () => compareVersions,
|
|
34
|
+
detectInstallMethod: () => detectInstallMethod,
|
|
35
|
+
normalizeVersion: () => normalizeVersion,
|
|
36
|
+
npmPackageMetadataUrl: () => npmPackageMetadataUrl,
|
|
37
|
+
npmPackageRoot: () => npmPackageRoot,
|
|
38
|
+
npmPrefixForPackageRoot: () => npmPrefixForPackageRoot,
|
|
39
|
+
npmVersionsFromMetadata: () => npmVersionsFromMetadata,
|
|
40
|
+
readNpmGlobalRoot: () => readNpmGlobalRoot
|
|
41
|
+
});
|
|
42
|
+
module.exports = __toCommonJS(update_service_exports);
|
|
43
|
+
var storageLayout = __toESM(require("./storage-layout.cjs"));
|
|
44
|
+
const childProcess = require("child_process");
|
|
45
|
+
const fs = require("fs");
|
|
46
|
+
const http = require("http");
|
|
47
|
+
const https = require("https");
|
|
48
|
+
const os = require("os");
|
|
49
|
+
const path = require("path");
|
|
50
|
+
const { readServerProcessIdentity } = require("./server-process-identity.cjs");
|
|
51
|
+
function errorMessage(error) {
|
|
52
|
+
if (typeof error === "object" && error !== null && "message" in error) {
|
|
53
|
+
const message = error.message;
|
|
54
|
+
if (message) return String(message);
|
|
55
|
+
}
|
|
56
|
+
return String(error);
|
|
57
|
+
}
|
|
58
|
+
const CACHE_TTL_MS = 5 * 60 * 1e3;
|
|
59
|
+
const NPM_PACKAGE_NAME = "farming-code";
|
|
60
|
+
const DEFAULT_NPM_REGISTRY = "https://registry.npmjs.org";
|
|
14
61
|
function readJsonFile(filePath) {
|
|
15
62
|
try {
|
|
16
|
-
return JSON.parse(fs.readFileSync(filePath,
|
|
63
|
+
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
17
64
|
} catch {
|
|
18
65
|
return null;
|
|
19
66
|
}
|
|
20
67
|
}
|
|
21
|
-
|
|
22
68
|
function normalizeVersion(value) {
|
|
23
|
-
const raw = String(value ||
|
|
24
|
-
if (!raw) return
|
|
25
|
-
const withoutPrefix = raw
|
|
26
|
-
.replace(/^refs\/tags\//i, '')
|
|
27
|
-
.replace(/^farming[-_]/i, '')
|
|
28
|
-
.replace(/^v/i, '');
|
|
69
|
+
const raw = String(value || "").trim();
|
|
70
|
+
if (!raw) return "";
|
|
71
|
+
const withoutPrefix = raw.replace(/^refs\/tags\//i, "").replace(/^farming[-_]/i, "").replace(/^v/i, "");
|
|
29
72
|
const match = withoutPrefix.match(/\d+(?:\.\d+)*/);
|
|
30
73
|
return match ? match[0] : withoutPrefix;
|
|
31
74
|
}
|
|
32
|
-
|
|
33
75
|
function versionParts(value) {
|
|
34
76
|
const normalized = normalizeVersion(value);
|
|
35
77
|
if (!normalized) return [];
|
|
36
|
-
return normalized.split(
|
|
78
|
+
return normalized.split(".").map((part) => Number(part)).filter((part) => Number.isFinite(part));
|
|
37
79
|
}
|
|
38
|
-
|
|
39
80
|
function compareVersions(left, right) {
|
|
40
81
|
const leftParts = versionParts(left);
|
|
41
82
|
const rightParts = versionParts(right);
|
|
@@ -48,60 +89,53 @@ function compareVersions(left, right) {
|
|
|
48
89
|
}
|
|
49
90
|
return 0;
|
|
50
91
|
}
|
|
51
|
-
|
|
52
92
|
function detectInstallMethod(rootDir, options = {}) {
|
|
53
|
-
if (options.packagedRuntime) return
|
|
54
|
-
const release = readJsonFile(path.join(rootDir,
|
|
55
|
-
if (release.updateMethod ===
|
|
93
|
+
if (options.packagedRuntime) return "standalone-cli";
|
|
94
|
+
const release = readJsonFile(path.join(rootDir, "RELEASE.json")) || {};
|
|
95
|
+
if (release.updateMethod === "npm") return "npm";
|
|
56
96
|
if (release.type) return String(release.type);
|
|
57
|
-
if (fs.existsSync(path.join(rootDir,
|
|
58
|
-
return
|
|
97
|
+
if (fs.existsSync(path.join(rootDir, ".farming.pid")) || fs.existsSync(path.join(rootDir, ".farming-launcher.sh"))) {
|
|
98
|
+
return "app-bundle";
|
|
59
99
|
}
|
|
60
|
-
const pkg = readJsonFile(path.join(rootDir,
|
|
61
|
-
if (pkg.name === NPM_PACKAGE_NAME && !fs.existsSync(path.join(rootDir,
|
|
62
|
-
return
|
|
100
|
+
const pkg = readJsonFile(path.join(rootDir, "package.json")) || {};
|
|
101
|
+
if (pkg.name === NPM_PACKAGE_NAME && !fs.existsSync(path.join(rootDir, ".git"))) return "npm";
|
|
102
|
+
return "source";
|
|
63
103
|
}
|
|
64
|
-
|
|
65
104
|
function installMethodBlockedReason(method) {
|
|
66
|
-
if (method ===
|
|
67
|
-
if (method ===
|
|
68
|
-
if (method ===
|
|
69
|
-
if (method ===
|
|
70
|
-
return `In-app updates require an npm installation; reinstall ${method ||
|
|
105
|
+
if (method === "source") return "Source checkouts update through Git, not the in-app updater";
|
|
106
|
+
if (method === "source-deploy") return "Source deployments update through their deployment workflow, not the in-app updater";
|
|
107
|
+
if (method === "app-bundle") return "App bundles update by reinstalling a release package or switching to npm";
|
|
108
|
+
if (method === "standalone-cli") return "Standalone CLI updates must reinstall the matching release asset";
|
|
109
|
+
return `In-app updates require an npm installation; reinstall ${method || "this installation"} through npm`;
|
|
71
110
|
}
|
|
72
|
-
|
|
73
111
|
function hasComparableVersion(value) {
|
|
74
112
|
return versionParts(value).length > 0;
|
|
75
113
|
}
|
|
76
|
-
|
|
77
114
|
function normalizePlatform(value) {
|
|
78
|
-
const raw = String(value ||
|
|
79
|
-
if (raw ===
|
|
80
|
-
if (raw ===
|
|
115
|
+
const raw = String(value || "").trim().toLowerCase();
|
|
116
|
+
if (raw === "darwin" || raw === "macos" || raw === "macosx" || raw === "osx") return "darwin";
|
|
117
|
+
if (raw === "linux") return "linux";
|
|
81
118
|
return raw;
|
|
82
119
|
}
|
|
83
|
-
|
|
84
120
|
function normalizeArch(value) {
|
|
85
|
-
const raw = String(value ||
|
|
86
|
-
if (raw ===
|
|
87
|
-
if (raw ===
|
|
121
|
+
const raw = String(value || "").trim().toLowerCase();
|
|
122
|
+
if (raw === "x64" || raw === "amd64" || raw === "x86_64") return "x64";
|
|
123
|
+
if (raw === "arm64" || raw === "aarch64") return "arm64";
|
|
88
124
|
return raw;
|
|
89
125
|
}
|
|
90
|
-
|
|
91
126
|
function requestWithRedirects(url, options = {}, redirectCount = 0, authOrigin = null) {
|
|
92
127
|
if (redirectCount > 5) {
|
|
93
128
|
return Promise.reject(new Error(`too many redirects for ${url}`));
|
|
94
129
|
}
|
|
95
|
-
|
|
96
130
|
return new Promise((resolve, reject) => {
|
|
97
131
|
const parsed = new URL(url);
|
|
98
|
-
const allowedAuthOrigin = authOrigin === false ?
|
|
132
|
+
const allowedAuthOrigin = authOrigin === false ? "" : authOrigin || parsed.origin;
|
|
99
133
|
const sameAuthOrigin = Boolean(allowedAuthOrigin) && parsed.origin === allowedAuthOrigin;
|
|
100
|
-
const client = parsed.protocol ===
|
|
134
|
+
const client = parsed.protocol === "http:" ? http : https;
|
|
101
135
|
const headers = {
|
|
102
|
-
|
|
103
|
-
Accept: options.accept ||
|
|
104
|
-
...
|
|
136
|
+
"User-Agent": "Farming-Update-Check",
|
|
137
|
+
Accept: options.accept || "application/json",
|
|
138
|
+
...options.headers || {}
|
|
105
139
|
};
|
|
106
140
|
if (!sameAuthOrigin) {
|
|
107
141
|
delete headers.Authorization;
|
|
@@ -109,7 +143,6 @@ function requestWithRedirects(url, options = {}, redirectCount = 0, authOrigin =
|
|
|
109
143
|
} else if (options.authToken) {
|
|
110
144
|
headers.Authorization = `Bearer ${options.authToken}`;
|
|
111
145
|
}
|
|
112
|
-
|
|
113
146
|
const request = client.get(parsed, { headers }, (response) => {
|
|
114
147
|
const status = response.statusCode || 0;
|
|
115
148
|
const location = response.headers.location;
|
|
@@ -119,8 +152,6 @@ function requestWithRedirects(url, options = {}, redirectCount = 0, authOrigin =
|
|
|
119
152
|
const nextParsed = new URL(nextUrl);
|
|
120
153
|
const nextOptions = { ...options };
|
|
121
154
|
if (nextParsed.origin !== allowedAuthOrigin) {
|
|
122
|
-
// Update-source tokens are scoped to the configured origin. Never
|
|
123
|
-
// forward them to a redirect target on another origin.
|
|
124
155
|
delete nextOptions.authToken;
|
|
125
156
|
if (nextOptions.headers) {
|
|
126
157
|
nextOptions.headers = { ...nextOptions.headers };
|
|
@@ -132,7 +163,7 @@ function requestWithRedirects(url, options = {}, redirectCount = 0, authOrigin =
|
|
|
132
163
|
nextUrl,
|
|
133
164
|
nextOptions,
|
|
134
165
|
redirectCount + 1,
|
|
135
|
-
nextParsed.origin === allowedAuthOrigin ? allowedAuthOrigin : false
|
|
166
|
+
nextParsed.origin === allowedAuthOrigin ? allowedAuthOrigin : false
|
|
136
167
|
).then(resolve, reject);
|
|
137
168
|
return;
|
|
138
169
|
}
|
|
@@ -143,37 +174,33 @@ function requestWithRedirects(url, options = {}, redirectCount = 0, authOrigin =
|
|
|
143
174
|
}
|
|
144
175
|
resolve(response);
|
|
145
176
|
});
|
|
146
|
-
request.on(
|
|
147
|
-
request.setTimeout(options.timeoutMs ||
|
|
177
|
+
request.on("error", reject);
|
|
178
|
+
request.setTimeout(options.timeoutMs || 3e4, () => {
|
|
148
179
|
request.destroy(new Error(`request timed out for ${url}`));
|
|
149
180
|
});
|
|
150
181
|
});
|
|
151
182
|
}
|
|
152
|
-
|
|
153
183
|
async function requestJson(url, options = {}) {
|
|
154
184
|
const response = await requestWithRedirects(url, options);
|
|
155
185
|
const chunks = [];
|
|
156
186
|
for await (const chunk of response) {
|
|
157
187
|
chunks.push(chunk);
|
|
158
188
|
}
|
|
159
|
-
return JSON.parse(Buffer.concat(chunks).toString(
|
|
189
|
+
return JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
160
190
|
}
|
|
161
|
-
|
|
162
191
|
function nodeScriptInvocation(nodePath, scriptPath, env = process.env) {
|
|
163
192
|
if (env.FARMING_NODE_LD && env.FARMING_NODE_LIBRARY_PATH) {
|
|
164
193
|
return {
|
|
165
194
|
command: env.FARMING_NODE_LD,
|
|
166
|
-
args: [
|
|
195
|
+
args: ["--library-path", env.FARMING_NODE_LIBRARY_PATH, nodePath, scriptPath]
|
|
167
196
|
};
|
|
168
197
|
}
|
|
169
198
|
return { command: nodePath, args: [scriptPath] };
|
|
170
199
|
}
|
|
171
|
-
|
|
172
200
|
function npmPackageMetadataUrl(registryUrl, packageName) {
|
|
173
|
-
const registry = String(registryUrl || DEFAULT_NPM_REGISTRY).replace(/\/+$/,
|
|
174
|
-
return `${registry}/${encodeURIComponent(packageName).replace(/^%40/,
|
|
201
|
+
const registry = String(registryUrl || DEFAULT_NPM_REGISTRY).replace(/\/+$/, "");
|
|
202
|
+
return `${registry}/${encodeURIComponent(String(packageName)).replace(/^%40/, "@")}`;
|
|
175
203
|
}
|
|
176
|
-
|
|
177
204
|
function normalizePathForCompare(filePath) {
|
|
178
205
|
try {
|
|
179
206
|
return fs.realpathSync(filePath);
|
|
@@ -181,175 +208,168 @@ function normalizePathForCompare(filePath) {
|
|
|
181
208
|
return path.resolve(filePath);
|
|
182
209
|
}
|
|
183
210
|
}
|
|
184
|
-
|
|
185
211
|
function pathIsInside(parentPath, childPath) {
|
|
186
212
|
const relative = path.relative(path.resolve(parentPath), path.resolve(childPath));
|
|
187
|
-
return relative !==
|
|
213
|
+
return relative !== "" && !relative.startsWith("..") && !path.isAbsolute(relative);
|
|
188
214
|
}
|
|
189
|
-
|
|
190
215
|
function npmPackageRoot(npmRoot, packageName) {
|
|
191
|
-
return path.join(npmRoot, ...String(packageName ||
|
|
216
|
+
return path.join(npmRoot, ...String(packageName || "").split("/").filter(Boolean));
|
|
192
217
|
}
|
|
193
|
-
|
|
194
218
|
function npmPrefixForPackageRoot(packageRoot, packageName) {
|
|
195
|
-
const segments = String(packageName ||
|
|
196
|
-
if (!path.isAbsolute(packageRoot) || segments.length === 0) return
|
|
219
|
+
const segments = String(packageName || "").split("/").filter(Boolean);
|
|
220
|
+
if (!path.isAbsolute(packageRoot) || segments.length === 0) return "";
|
|
197
221
|
let npmRoot = packageRoot;
|
|
198
222
|
for (let index = 0; index < segments.length; index += 1) npmRoot = path.dirname(npmRoot);
|
|
199
223
|
return path.dirname(path.dirname(npmRoot));
|
|
200
224
|
}
|
|
201
|
-
|
|
202
225
|
function readNpmGlobalRoot(npmCommand, npmPrefix, execFile = childProcess.execFile) {
|
|
203
|
-
const args = [
|
|
204
|
-
if (npmPrefix) args.push(
|
|
226
|
+
const args = ["root", "--global"];
|
|
227
|
+
if (npmPrefix) args.push("--prefix", npmPrefix);
|
|
205
228
|
return new Promise((resolve, reject) => {
|
|
206
229
|
execFile(npmCommand, args, (error, stdout) => {
|
|
207
230
|
if (error) {
|
|
208
231
|
reject(error);
|
|
209
232
|
return;
|
|
210
233
|
}
|
|
211
|
-
const root = String(stdout ||
|
|
234
|
+
const root = String(stdout || "").split(/\r?\n/).map((value) => value.trim()).find(Boolean);
|
|
212
235
|
if (!root) {
|
|
213
|
-
reject(new Error(
|
|
236
|
+
reject(new Error("npm root --global returned no path"));
|
|
214
237
|
return;
|
|
215
238
|
}
|
|
216
239
|
resolve(root);
|
|
217
240
|
});
|
|
218
241
|
});
|
|
219
242
|
}
|
|
220
|
-
|
|
221
243
|
function npmVersionsFromMetadata(metadata, currentVersion) {
|
|
222
|
-
const
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
blockedReason: '',
|
|
233
|
-
installable: true,
|
|
234
|
-
available: compareVersions(version, currentVersion) > 0,
|
|
235
|
-
}));
|
|
244
|
+
const versionMetadata = metadata?.versions;
|
|
245
|
+
const versions = versionMetadata && typeof versionMetadata === "object" ? Object.keys(versionMetadata) : [];
|
|
246
|
+
return versions.filter((version) => hasComparableVersion(version) && !version.includes("-")).sort((left, right) => compareVersions(right, left)).map((version) => ({
|
|
247
|
+
version,
|
|
248
|
+
assetName: version,
|
|
249
|
+
assetSize: Number(versionMetadata?.[version]?.dist?.unpackedSize || 0),
|
|
250
|
+
blockedReason: "",
|
|
251
|
+
installable: true,
|
|
252
|
+
available: compareVersions(version, currentVersion) > 0
|
|
253
|
+
}));
|
|
236
254
|
}
|
|
237
|
-
|
|
238
255
|
class FarmingUpdateService {
|
|
256
|
+
rootDir;
|
|
257
|
+
installMethod;
|
|
258
|
+
npmPackageName;
|
|
259
|
+
npmRegistryUrl;
|
|
260
|
+
npmPackageRoot;
|
|
261
|
+
npmPrefix;
|
|
262
|
+
runtime;
|
|
263
|
+
configDir;
|
|
264
|
+
now;
|
|
265
|
+
fetchJson;
|
|
266
|
+
execFile;
|
|
267
|
+
getNpmGlobalRoot;
|
|
268
|
+
spawn;
|
|
269
|
+
npmCache;
|
|
270
|
+
installState;
|
|
271
|
+
installStartPromise;
|
|
272
|
+
updateStateFile;
|
|
273
|
+
updateLogFile;
|
|
274
|
+
updateStagingDir;
|
|
239
275
|
constructor(options = {}) {
|
|
240
|
-
this.rootDir = options.rootDir || path.join(__dirname,
|
|
276
|
+
this.rootDir = options.rootDir || path.join(__dirname, "..");
|
|
241
277
|
this.installMethod = options.installMethod || detectInstallMethod(this.rootDir, {
|
|
242
|
-
packagedRuntime: options.packagedRuntime === true
|
|
278
|
+
packagedRuntime: options.packagedRuntime === true
|
|
243
279
|
});
|
|
244
280
|
this.npmPackageName = options.npmPackageName || NPM_PACKAGE_NAME;
|
|
245
281
|
this.npmRegistryUrl = options.npmRegistryUrl || process.env.FARMING_NPM_REGISTRY || DEFAULT_NPM_REGISTRY;
|
|
246
|
-
this.npmPackageRoot = options.npmPackageRoot || process.env.FARMING_MANAGED_PACKAGE_ROOT ||
|
|
247
|
-
this.npmPrefix = options.npmPrefix || process.env.FARMING_NPM_PREFIX ||
|
|
248
|
-
this.runtime = options.platform || options.arch
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
: null;
|
|
254
|
-
this.configDir = options.configDir || path.join(os.homedir(), '.farming');
|
|
282
|
+
this.npmPackageRoot = options.npmPackageRoot || process.env.FARMING_MANAGED_PACKAGE_ROOT || "";
|
|
283
|
+
this.npmPrefix = options.npmPrefix || process.env.FARMING_NPM_PREFIX || "";
|
|
284
|
+
this.runtime = options.platform || options.arch ? {
|
|
285
|
+
platform: normalizePlatform(options.platform || process.platform),
|
|
286
|
+
arch: normalizeArch(options.arch || process.arch)
|
|
287
|
+
} : null;
|
|
288
|
+
this.configDir = options.configDir || path.join(os.homedir(), ".farming");
|
|
255
289
|
this.now = options.now || (() => Date.now());
|
|
256
290
|
this.fetchJson = options.fetchJson || requestJson;
|
|
257
291
|
this.execFile = options.execFile || childProcess.execFile;
|
|
258
|
-
this.getNpmGlobalRoot = options.getNpmGlobalRoot
|
|
259
|
-
|| ((npmCommand, npmPrefix) => readNpmGlobalRoot(npmCommand, npmPrefix, this.execFile));
|
|
292
|
+
this.getNpmGlobalRoot = options.getNpmGlobalRoot || ((npmCommand, npmPrefix) => readNpmGlobalRoot(npmCommand, npmPrefix, this.execFile));
|
|
260
293
|
this.spawn = options.spawn || childProcess.spawn;
|
|
261
294
|
this.npmCache = null;
|
|
262
|
-
this.installState = { phase:
|
|
295
|
+
this.installState = { phase: "idle" };
|
|
263
296
|
this.installStartPromise = null;
|
|
264
297
|
this.updateStateFile = options.updateStateFile || storageLayout.updateStateFile(this.configDir);
|
|
265
298
|
this.updateLogFile = options.updateLogFile || storageLayout.updateLogFile(this.configDir);
|
|
266
299
|
this.updateStagingDir = options.updateStagingDir || storageLayout.updateStagingDir(this.configDir);
|
|
267
300
|
}
|
|
268
|
-
|
|
269
301
|
currentVersion() {
|
|
270
|
-
const release = readJsonFile(path.join(this.rootDir,
|
|
271
|
-
const pkg = readJsonFile(path.join(this.rootDir,
|
|
272
|
-
const packageVersion = String(release.packageVersion || pkg.version ||
|
|
273
|
-
const releaseVersion = String(release.releaseVersion || normalizeVersion(packageVersion) ||
|
|
302
|
+
const release = readJsonFile(path.join(this.rootDir, "RELEASE.json")) || {};
|
|
303
|
+
const pkg = readJsonFile(path.join(this.rootDir, "package.json")) || {};
|
|
304
|
+
const packageVersion = String(release.packageVersion || pkg.version || "");
|
|
305
|
+
const releaseVersion = String(release.releaseVersion || normalizeVersion(packageVersion) || "");
|
|
274
306
|
return {
|
|
275
307
|
releaseVersion,
|
|
276
308
|
packageVersion,
|
|
277
|
-
gitSha: release.gitSha ||
|
|
278
|
-
compatibilityProfile: String(release.compatibilityProfile ||
|
|
309
|
+
gitSha: release.gitSha || "",
|
|
310
|
+
compatibilityProfile: String(release.compatibilityProfile || ""),
|
|
279
311
|
bundledGlibcRuntime: release.bundledGlibcRuntime === true,
|
|
280
312
|
type: this.installMethod,
|
|
281
|
-
installDir: this.rootDir
|
|
313
|
+
installDir: this.rootDir
|
|
282
314
|
};
|
|
283
315
|
}
|
|
284
|
-
|
|
285
316
|
currentInstallState() {
|
|
286
317
|
const persisted = readJsonFile(this.updateStateFile);
|
|
287
318
|
if (persisted && persisted.method === this.installMethod) return persisted;
|
|
288
319
|
const current = this.currentVersion();
|
|
289
320
|
const currentVersion = normalizeVersion(current.releaseVersion || current.packageVersion);
|
|
290
|
-
if (
|
|
291
|
-
persisted
|
|
292
|
-
&& persisted.targetMethod === this.installMethod
|
|
293
|
-
&& normalizeVersion(persisted.version) === currentVersion
|
|
294
|
-
) {
|
|
321
|
+
if (persisted && persisted.targetMethod === this.installMethod && normalizeVersion(persisted.version) === currentVersion) {
|
|
295
322
|
return persisted;
|
|
296
323
|
}
|
|
297
324
|
return this.installState;
|
|
298
325
|
}
|
|
299
|
-
|
|
300
326
|
persistInstallState(state) {
|
|
301
327
|
this.installState = state;
|
|
302
328
|
fs.mkdirSync(this.configDir, { recursive: true });
|
|
303
329
|
const temporaryPath = `${this.updateStateFile}.${process.pid}.tmp`;
|
|
304
|
-
fs.writeFileSync(temporaryPath, `${JSON.stringify(state, null, 2)}
|
|
330
|
+
fs.writeFileSync(temporaryPath, `${JSON.stringify(state, null, 2)}
|
|
331
|
+
`, { mode: 384 });
|
|
305
332
|
fs.renameSync(temporaryPath, this.updateStateFile);
|
|
306
333
|
return state;
|
|
307
334
|
}
|
|
308
|
-
|
|
309
335
|
async npmMetadata(options = {}) {
|
|
310
336
|
const source = npmPackageMetadataUrl(this.npmRegistryUrl, this.npmPackageName);
|
|
311
337
|
if (!options.force && this.npmCache && this.npmCache.source === source && this.now() - this.npmCache.checkedAt < CACHE_TTL_MS) {
|
|
312
338
|
return this.npmCache.metadata;
|
|
313
339
|
}
|
|
314
|
-
const metadata = await this.fetchJson(source, { accept:
|
|
340
|
+
const metadata = await this.fetchJson(source, { accept: "application/json" });
|
|
315
341
|
this.npmCache = { checkedAt: this.now(), source, metadata };
|
|
316
342
|
return metadata;
|
|
317
343
|
}
|
|
318
|
-
|
|
319
344
|
async npmStatus(options = {}) {
|
|
320
345
|
const current = this.currentVersion();
|
|
321
346
|
const currentVersion = normalizeVersion(current.releaseVersion || current.packageVersion);
|
|
322
347
|
const metadata = await this.npmMetadata(options);
|
|
323
348
|
const target = await this.npmUpdateTarget();
|
|
324
349
|
const versions = npmVersionsFromMetadata(metadata, currentVersion);
|
|
325
|
-
const latestVersion = normalizeVersion(metadata && metadata[
|
|
326
|
-
|| versions[0]?.version
|
|
327
|
-
|| '';
|
|
350
|
+
const latestVersion = normalizeVersion(metadata && metadata["dist-tags"] && metadata["dist-tags"].latest) || versions[0]?.version || "";
|
|
328
351
|
const requestedVersion = normalizeVersion(options.assetName);
|
|
329
|
-
const selected = versions.find(version => version.version === requestedVersion)
|
|
330
|
-
|
|
331
|
-
|| versions[0]
|
|
332
|
-
|| null;
|
|
333
|
-
const blockedReason = target.proven ? '' : target.error;
|
|
352
|
+
const selected = versions.find((version) => version.version === requestedVersion) || versions.find((version) => version.version === latestVersion) || versions[0] || null;
|
|
353
|
+
const blockedReason = target.proven ? "" : target.error;
|
|
334
354
|
const available = Boolean(selected && selected.available && target.proven);
|
|
335
355
|
return {
|
|
336
|
-
method:
|
|
356
|
+
method: "npm",
|
|
337
357
|
current,
|
|
338
358
|
latest: {
|
|
339
359
|
version: latestVersion,
|
|
340
|
-
tag: latestVersion ? `v${latestVersion}` :
|
|
341
|
-
name: latestVersion ? `${this.npmPackageName}@${latestVersion}` :
|
|
342
|
-
publishedAt:
|
|
360
|
+
tag: latestVersion ? `v${latestVersion}` : "",
|
|
361
|
+
name: latestVersion ? `${this.npmPackageName}@${latestVersion}` : "",
|
|
362
|
+
publishedAt: "",
|
|
343
363
|
assetName: latestVersion,
|
|
344
364
|
assetSize: 0,
|
|
345
365
|
blockedReason,
|
|
346
|
-
source: npmPackageMetadataUrl(this.npmRegistryUrl, this.npmPackageName)
|
|
366
|
+
source: npmPackageMetadataUrl(this.npmRegistryUrl, this.npmPackageName)
|
|
347
367
|
},
|
|
348
368
|
selected: {
|
|
349
|
-
version: selected?.version ||
|
|
350
|
-
assetName: selected?.assetName ||
|
|
369
|
+
version: selected?.version || "",
|
|
370
|
+
assetName: selected?.assetName || "",
|
|
351
371
|
assetSize: selected?.assetSize || 0,
|
|
352
|
-
blockedReason: selected?.blockedReason || blockedReason
|
|
372
|
+
blockedReason: selected?.blockedReason || blockedReason
|
|
353
373
|
},
|
|
354
374
|
versions,
|
|
355
375
|
runtime: this.runtime,
|
|
@@ -357,24 +377,23 @@ class FarmingUpdateService {
|
|
|
357
377
|
available,
|
|
358
378
|
installable: Boolean(selected && target.proven),
|
|
359
379
|
checkedAt: new Date(this.now()).toISOString(),
|
|
360
|
-
state: this.currentInstallState()
|
|
380
|
+
state: this.currentInstallState()
|
|
361
381
|
};
|
|
362
382
|
}
|
|
363
|
-
|
|
364
383
|
async npmUpdateTarget() {
|
|
365
|
-
const runningPackageRoot = String(this.npmPackageRoot ||
|
|
384
|
+
const runningPackageRoot = String(this.npmPackageRoot || "").trim();
|
|
366
385
|
if (!path.isAbsolute(runningPackageRoot)) {
|
|
367
386
|
return {
|
|
368
387
|
proven: false,
|
|
369
|
-
error:
|
|
388
|
+
error: "npm update target could not be proven: the running package has no managed package-root provenance"
|
|
370
389
|
};
|
|
371
390
|
}
|
|
372
|
-
const npmCommand = process.env.FARMING_NPM_COMMAND ||
|
|
391
|
+
const npmCommand = process.env.FARMING_NPM_COMMAND || "npm";
|
|
373
392
|
const npmPrefix = this.npmPrefix || npmPrefixForPackageRoot(runningPackageRoot, this.npmPackageName);
|
|
374
393
|
if (!npmPrefix) {
|
|
375
394
|
return {
|
|
376
395
|
proven: false,
|
|
377
|
-
error:
|
|
396
|
+
error: "npm update target could not be proven: the running package has no npm prefix"
|
|
378
397
|
};
|
|
379
398
|
}
|
|
380
399
|
try {
|
|
@@ -383,22 +402,21 @@ class FarmingUpdateService {
|
|
|
383
402
|
if (normalizePathForCompare(runningPackageRoot) !== normalizePathForCompare(targetPackageRoot)) {
|
|
384
403
|
return {
|
|
385
404
|
proven: false,
|
|
386
|
-
error: `npm update would target a different installation: running ${runningPackageRoot}; npm ${targetPackageRoot}
|
|
405
|
+
error: `npm update would target a different installation: running ${runningPackageRoot}; npm ${targetPackageRoot}`
|
|
387
406
|
};
|
|
388
407
|
}
|
|
389
408
|
return {
|
|
390
409
|
proven: true,
|
|
391
410
|
npmPrefix,
|
|
392
|
-
packageRoot: targetPackageRoot
|
|
411
|
+
packageRoot: targetPackageRoot
|
|
393
412
|
};
|
|
394
413
|
} catch (error) {
|
|
395
414
|
return {
|
|
396
415
|
proven: false,
|
|
397
|
-
error: `npm update target could not be inspected: ${
|
|
416
|
+
error: `npm update target could not be inspected: ${errorMessage(error)}`
|
|
398
417
|
};
|
|
399
418
|
}
|
|
400
419
|
}
|
|
401
|
-
|
|
402
420
|
unsupportedStatus() {
|
|
403
421
|
const current = this.currentVersion();
|
|
404
422
|
const reason = installMethodBlockedReason(this.installMethod);
|
|
@@ -406,30 +424,28 @@ class FarmingUpdateService {
|
|
|
406
424
|
method: this.installMethod,
|
|
407
425
|
current,
|
|
408
426
|
latest: {
|
|
409
|
-
version:
|
|
410
|
-
tag:
|
|
411
|
-
name:
|
|
412
|
-
publishedAt:
|
|
413
|
-
assetName:
|
|
427
|
+
version: "",
|
|
428
|
+
tag: "",
|
|
429
|
+
name: "",
|
|
430
|
+
publishedAt: "",
|
|
431
|
+
assetName: "",
|
|
414
432
|
assetSize: 0,
|
|
415
433
|
blockedReason: reason,
|
|
416
|
-
source:
|
|
434
|
+
source: ""
|
|
417
435
|
},
|
|
418
|
-
selected: { version:
|
|
436
|
+
selected: { version: "", assetName: "", assetSize: 0, blockedReason: reason },
|
|
419
437
|
versions: [],
|
|
420
438
|
runtime: this.runtime,
|
|
421
439
|
available: false,
|
|
422
440
|
installable: false,
|
|
423
441
|
checkedAt: new Date(this.now()).toISOString(),
|
|
424
|
-
state: this.currentInstallState()
|
|
442
|
+
state: this.currentInstallState()
|
|
425
443
|
};
|
|
426
444
|
}
|
|
427
|
-
|
|
428
445
|
async check(options = {}) {
|
|
429
|
-
if (this.installMethod ===
|
|
446
|
+
if (this.installMethod === "npm") return this.npmStatus(options);
|
|
430
447
|
return this.unsupportedStatus();
|
|
431
448
|
}
|
|
432
|
-
|
|
433
449
|
async startInstall(options = {}) {
|
|
434
450
|
if (this.installStartPromise) return this.installStartPromise;
|
|
435
451
|
const startPromise = this.startInstallUnreserved(options);
|
|
@@ -440,82 +456,79 @@ class FarmingUpdateService {
|
|
|
440
456
|
if (this.installStartPromise === startPromise) this.installStartPromise = null;
|
|
441
457
|
}
|
|
442
458
|
}
|
|
443
|
-
|
|
444
459
|
async startInstallUnreserved(options = {}) {
|
|
445
460
|
const currentState = this.currentInstallState();
|
|
446
|
-
if ([
|
|
461
|
+
if (["downloading", "extracting", "installing", "restarting", "rolling-back"].includes(currentState.phase)) {
|
|
447
462
|
return currentState;
|
|
448
463
|
}
|
|
449
|
-
if (currentState.phase ===
|
|
450
|
-
|
|
451
|
-
if (this.installMethod === 'npm') return this.startNpmInstall(options);
|
|
464
|
+
if (currentState.phase === "ready-to-restart") return currentState;
|
|
465
|
+
if (this.installMethod === "npm") return this.startNpmInstall(options);
|
|
452
466
|
throw new Error(installMethodBlockedReason(this.installMethod));
|
|
453
467
|
}
|
|
454
|
-
|
|
455
468
|
async startNpmInstall(options = {}) {
|
|
456
469
|
const status = await this.npmStatus({ force: true, assetName: options.assetName });
|
|
457
470
|
if (!status.available) {
|
|
458
471
|
return this.persistInstallState({
|
|
459
|
-
method:
|
|
460
|
-
phase: status.installable ?
|
|
472
|
+
method: "npm",
|
|
473
|
+
phase: status.installable ? "succeeded" : "failed",
|
|
461
474
|
version: status.selected.version,
|
|
462
|
-
error: status.installable ?
|
|
463
|
-
completedAt: new Date(this.now()).toISOString()
|
|
475
|
+
error: status.installable ? "" : status.selected.blockedReason || "No installable npm update is available",
|
|
476
|
+
completedAt: new Date(this.now()).toISOString()
|
|
464
477
|
});
|
|
465
478
|
}
|
|
466
|
-
|
|
479
|
+
const target = status.target;
|
|
467
480
|
const startedAt = new Date(this.now()).toISOString();
|
|
468
481
|
fs.mkdirSync(this.updateStagingDir, { recursive: true });
|
|
469
482
|
const stagingPrefix = fs.mkdtempSync(path.join(this.updateStagingDir, `npm-${status.selected.version}.`));
|
|
470
483
|
const stagingPackageRoot = npmPackageRoot(
|
|
471
|
-
path.join(stagingPrefix,
|
|
472
|
-
this.npmPackageName
|
|
484
|
+
path.join(stagingPrefix, "lib", "node_modules"),
|
|
485
|
+
this.npmPackageName
|
|
473
486
|
);
|
|
474
487
|
const state = this.persistInstallState({
|
|
475
|
-
method:
|
|
476
|
-
phase:
|
|
488
|
+
method: "npm",
|
|
489
|
+
phase: "installing",
|
|
477
490
|
version: status.selected.version,
|
|
478
491
|
previousVersion: status.current.releaseVersion || status.current.packageVersion,
|
|
479
492
|
packageName: this.npmPackageName,
|
|
480
493
|
stagingPrefix,
|
|
481
494
|
stagingPackageRoot,
|
|
482
495
|
startedAt,
|
|
483
|
-
logPath: this.updateLogFile
|
|
496
|
+
logPath: this.updateLogFile
|
|
484
497
|
});
|
|
485
|
-
const helperPath = path.join(__dirname,
|
|
498
|
+
const helperPath = path.join(__dirname, "npm-update-helper.cjs");
|
|
486
499
|
const nodePath = process.env.FARMING_NODE_BIN || process.execPath;
|
|
487
500
|
const payload = {
|
|
488
|
-
action:
|
|
501
|
+
action: "prepare",
|
|
489
502
|
packageName: this.npmPackageName,
|
|
490
503
|
targetVersion: status.selected.version,
|
|
491
504
|
previousVersion: status.current.releaseVersion || status.current.packageVersion,
|
|
492
505
|
startedAt,
|
|
493
506
|
stateFile: this.updateStateFile,
|
|
494
507
|
logPath: this.updateLogFile,
|
|
495
|
-
cliPath: path.join(this.rootDir,
|
|
496
|
-
packageRoot:
|
|
508
|
+
cliPath: path.join(this.rootDir, "bin", "farming"),
|
|
509
|
+
packageRoot: target.packageRoot,
|
|
497
510
|
nodePath,
|
|
498
|
-
npmCommand: process.env.FARMING_NPM_COMMAND ||
|
|
499
|
-
npmPrefix:
|
|
511
|
+
npmCommand: process.env.FARMING_NPM_COMMAND || "npm",
|
|
512
|
+
npmPrefix: target.npmPrefix,
|
|
500
513
|
stagingPrefix,
|
|
501
514
|
stagingPackageRoot,
|
|
502
515
|
npmFallbackRegistryUrl: this.npmRegistryUrl,
|
|
503
516
|
serverPid: process.pid,
|
|
504
517
|
configDir: this.configDir,
|
|
505
|
-
port: process.env.FARMING_PORT || process.env.PORT ||
|
|
506
|
-
basePath: process.env.FARMING_BASE_PATH ||
|
|
507
|
-
serverHome: process.env.FARMING_SERVER_HOME ||
|
|
508
|
-
disableAuth: /^(1|true|yes|on)$/i.test(String(process.env.FARMING_DISABLE_AUTH ||
|
|
518
|
+
port: process.env.FARMING_PORT || process.env.PORT || "6694",
|
|
519
|
+
basePath: process.env.FARMING_BASE_PATH || "/farming",
|
|
520
|
+
serverHome: process.env.FARMING_SERVER_HOME || "",
|
|
521
|
+
disableAuth: /^(1|true|yes|on)$/i.test(String(process.env.FARMING_DISABLE_AUTH || ""))
|
|
509
522
|
};
|
|
510
523
|
const helperInvocation = nodeScriptInvocation(nodePath, helperPath);
|
|
511
524
|
const spawnOptions = {
|
|
512
525
|
cwd: this.configDir,
|
|
513
526
|
detached: true,
|
|
514
|
-
stdio:
|
|
527
|
+
stdio: "ignore",
|
|
515
528
|
env: {
|
|
516
529
|
...process.env,
|
|
517
|
-
FARMING_NPM_UPDATE_PAYLOAD: JSON.stringify(payload)
|
|
518
|
-
}
|
|
530
|
+
FARMING_NPM_UPDATE_PAYLOAD: JSON.stringify(payload)
|
|
531
|
+
}
|
|
519
532
|
};
|
|
520
533
|
let child;
|
|
521
534
|
try {
|
|
@@ -524,27 +537,26 @@ class FarmingUpdateService {
|
|
|
524
537
|
fs.rmSync(stagingPrefix, { recursive: true, force: true });
|
|
525
538
|
this.persistInstallState({
|
|
526
539
|
...state,
|
|
527
|
-
phase:
|
|
528
|
-
error:
|
|
529
|
-
completedAt: new Date(this.now()).toISOString()
|
|
540
|
+
phase: "failed",
|
|
541
|
+
error: errorMessage(error),
|
|
542
|
+
completedAt: new Date(this.now()).toISOString()
|
|
530
543
|
});
|
|
531
544
|
throw error;
|
|
532
545
|
}
|
|
533
|
-
if (child && typeof child.once ===
|
|
534
|
-
child.once(
|
|
546
|
+
if (child && typeof child.once === "function") {
|
|
547
|
+
child.once("error", (error) => {
|
|
535
548
|
fs.rmSync(stagingPrefix, { recursive: true, force: true });
|
|
536
549
|
this.persistInstallState({
|
|
537
550
|
...state,
|
|
538
|
-
phase:
|
|
539
|
-
error:
|
|
540
|
-
completedAt: new Date(this.now()).toISOString()
|
|
551
|
+
phase: "failed",
|
|
552
|
+
error: errorMessage(error),
|
|
553
|
+
completedAt: new Date(this.now()).toISOString()
|
|
541
554
|
});
|
|
542
555
|
});
|
|
543
556
|
}
|
|
544
|
-
if (child && typeof child.unref ===
|
|
557
|
+
if (child && typeof child.unref === "function") child.unref();
|
|
545
558
|
return state;
|
|
546
559
|
}
|
|
547
|
-
|
|
548
560
|
async applyPreparedUpdate() {
|
|
549
561
|
if (this.installStartPromise) return this.installStartPromise;
|
|
550
562
|
const applyPromise = this.applyPreparedUpdateUnreserved();
|
|
@@ -555,51 +567,51 @@ class FarmingUpdateService {
|
|
|
555
567
|
if (this.installStartPromise === applyPromise) this.installStartPromise = null;
|
|
556
568
|
}
|
|
557
569
|
}
|
|
558
|
-
|
|
559
570
|
async applyPreparedUpdateUnreserved() {
|
|
560
|
-
if (this.installMethod !==
|
|
571
|
+
if (this.installMethod !== "npm") {
|
|
561
572
|
throw new Error(installMethodBlockedReason(this.installMethod));
|
|
562
573
|
}
|
|
563
574
|
const prepared = this.currentInstallState();
|
|
564
|
-
if (prepared.phase !==
|
|
565
|
-
throw new Error(
|
|
575
|
+
if (prepared.phase !== "ready-to-restart") {
|
|
576
|
+
throw new Error("No prepared Farming update is ready to restart");
|
|
566
577
|
}
|
|
567
578
|
const current = this.currentVersion();
|
|
568
579
|
const currentVersion = normalizeVersion(current.releaseVersion || current.packageVersion);
|
|
569
580
|
if (normalizeVersion(prepared.previousVersion) !== currentVersion) {
|
|
570
|
-
const error =
|
|
571
|
-
this.persistInstallState({ ...prepared, phase:
|
|
581
|
+
const error = "Prepared update no longer matches the running Farming version";
|
|
582
|
+
this.persistInstallState({ ...prepared, phase: "failed", error, completedAt: new Date(this.now()).toISOString() });
|
|
572
583
|
throw new Error(error);
|
|
573
584
|
}
|
|
574
|
-
|
|
575
585
|
const nodePath = process.env.FARMING_NODE_BIN || process.execPath;
|
|
576
586
|
const serverProcessIdentity = await readServerProcessIdentity(process.pid);
|
|
577
587
|
if (!serverProcessIdentity) {
|
|
578
|
-
throw new Error(
|
|
588
|
+
throw new Error("Running Farming server process identity could not be verified");
|
|
579
589
|
}
|
|
580
590
|
const target = await this.npmUpdateTarget();
|
|
581
591
|
if (!target.proven) throw new Error(target.error);
|
|
582
|
-
if (!path.isAbsolute(String(prepared.stagingPrefix ||
|
|
583
|
-
throw new Error(
|
|
592
|
+
if (!path.isAbsolute(String(prepared.stagingPrefix || "")) || !path.isAbsolute(String(prepared.stagingPackageRoot || ""))) {
|
|
593
|
+
throw new Error("Prepared npm update is missing its staging identity");
|
|
584
594
|
}
|
|
585
|
-
const
|
|
595
|
+
const preparedStagingPrefix = prepared.stagingPrefix;
|
|
596
|
+
const preparedStagingPackageRoot = prepared.stagingPackageRoot;
|
|
597
|
+
const stagingPrefix = normalizePathForCompare(preparedStagingPrefix);
|
|
586
598
|
if (!pathIsInside(normalizePathForCompare(this.updateStagingDir), stagingPrefix)) {
|
|
587
|
-
throw new Error(
|
|
599
|
+
throw new Error("Prepared npm update is outside the Farming staging directory");
|
|
588
600
|
}
|
|
589
|
-
if (path.resolve(
|
|
590
|
-
path.join(
|
|
591
|
-
this.npmPackageName
|
|
601
|
+
if (path.resolve(preparedStagingPackageRoot) !== path.resolve(npmPackageRoot(
|
|
602
|
+
path.join(preparedStagingPrefix, "lib", "node_modules"),
|
|
603
|
+
this.npmPackageName
|
|
592
604
|
))) {
|
|
593
|
-
throw new Error(
|
|
605
|
+
throw new Error("Prepared npm update has an invalid package root");
|
|
594
606
|
}
|
|
595
|
-
const stagingPackageRoot = normalizePathForCompare(
|
|
596
|
-
const stagedMetadata = readJsonFile(path.join(stagingPackageRoot,
|
|
607
|
+
const stagingPackageRoot = normalizePathForCompare(preparedStagingPackageRoot);
|
|
608
|
+
const stagedMetadata = readJsonFile(path.join(stagingPackageRoot, "package.json")) || {};
|
|
597
609
|
if (normalizeVersion(stagedMetadata.version) !== normalizeVersion(prepared.version)) {
|
|
598
|
-
throw new Error(
|
|
610
|
+
throw new Error("Prepared npm update is no longer available; prepare it again");
|
|
599
611
|
}
|
|
600
|
-
const helperPath = path.join(__dirname,
|
|
612
|
+
const helperPath = path.join(__dirname, "npm-update-helper.cjs");
|
|
601
613
|
const payload = {
|
|
602
|
-
action:
|
|
614
|
+
action: "apply",
|
|
603
615
|
packageName: this.npmPackageName,
|
|
604
616
|
targetVersion: prepared.version,
|
|
605
617
|
previousVersion: prepared.previousVersion,
|
|
@@ -607,10 +619,10 @@ class FarmingUpdateService {
|
|
|
607
619
|
preparedAt: prepared.preparedAt,
|
|
608
620
|
stateFile: this.updateStateFile,
|
|
609
621
|
logPath: prepared.logPath || this.updateLogFile,
|
|
610
|
-
cliPath: path.join(this.rootDir,
|
|
622
|
+
cliPath: path.join(this.rootDir, "bin", "farming"),
|
|
611
623
|
packageRoot: target.packageRoot,
|
|
612
624
|
nodePath,
|
|
613
|
-
npmCommand: process.env.FARMING_NPM_COMMAND ||
|
|
625
|
+
npmCommand: process.env.FARMING_NPM_COMMAND || "npm",
|
|
614
626
|
npmPrefix: target.npmPrefix,
|
|
615
627
|
npmFallbackRegistryUrl: this.npmRegistryUrl,
|
|
616
628
|
stagingPrefix,
|
|
@@ -618,48 +630,46 @@ class FarmingUpdateService {
|
|
|
618
630
|
serverPid: process.pid,
|
|
619
631
|
serverProcessIdentity,
|
|
620
632
|
configDir: this.configDir,
|
|
621
|
-
port: process.env.FARMING_PORT || process.env.PORT ||
|
|
622
|
-
basePath: process.env.FARMING_BASE_PATH ||
|
|
623
|
-
serverHome: process.env.FARMING_SERVER_HOME ||
|
|
624
|
-
disableAuth: /^(1|true|yes|on)$/i.test(String(process.env.FARMING_DISABLE_AUTH ||
|
|
633
|
+
port: process.env.FARMING_PORT || process.env.PORT || "6694",
|
|
634
|
+
basePath: process.env.FARMING_BASE_PATH || "/farming",
|
|
635
|
+
serverHome: process.env.FARMING_SERVER_HOME || "",
|
|
636
|
+
disableAuth: /^(1|true|yes|on)$/i.test(String(process.env.FARMING_DISABLE_AUTH || ""))
|
|
625
637
|
};
|
|
626
638
|
const env = { ...process.env, FARMING_NPM_UPDATE_PAYLOAD: JSON.stringify(payload) };
|
|
627
|
-
|
|
628
|
-
const state = this.persistInstallState({ ...prepared, phase: 'restarting', error: '' });
|
|
639
|
+
const state = this.persistInstallState({ ...prepared, phase: "restarting", error: "" });
|
|
629
640
|
const helperInvocation = nodeScriptInvocation(nodePath, helperPath);
|
|
630
641
|
const spawnOptions = {
|
|
631
642
|
cwd: this.configDir,
|
|
632
643
|
detached: true,
|
|
633
|
-
stdio:
|
|
634
|
-
env
|
|
644
|
+
stdio: "ignore",
|
|
645
|
+
env
|
|
635
646
|
};
|
|
636
647
|
const restorePreparedState = (error) => this.persistInstallState({
|
|
637
648
|
...prepared,
|
|
638
|
-
phase:
|
|
639
|
-
error:
|
|
649
|
+
phase: "ready-to-restart",
|
|
650
|
+
error: errorMessage(error)
|
|
640
651
|
});
|
|
641
652
|
let child;
|
|
642
653
|
try {
|
|
643
654
|
child = this.spawn(helperInvocation.command, helperInvocation.args, spawnOptions);
|
|
644
655
|
} catch (error) {
|
|
645
|
-
restorePreparedState(error);
|
|
656
|
+
restorePreparedState(error instanceof Error ? error : new Error(String(error)));
|
|
646
657
|
throw error;
|
|
647
658
|
}
|
|
648
|
-
if (child && typeof child.once ===
|
|
649
|
-
if (child && typeof child.unref ===
|
|
659
|
+
if (child && typeof child.once === "function") child.once("error", restorePreparedState);
|
|
660
|
+
if (child && typeof child.unref === "function") child.unref();
|
|
650
661
|
return state;
|
|
651
662
|
}
|
|
652
|
-
|
|
653
663
|
}
|
|
654
|
-
|
|
655
|
-
module.exports = {
|
|
664
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
665
|
+
0 && (module.exports = {
|
|
656
666
|
FarmingUpdateService,
|
|
657
667
|
compareVersions,
|
|
658
668
|
detectInstallMethod,
|
|
659
669
|
normalizeVersion,
|
|
660
670
|
npmPackageMetadataUrl,
|
|
661
|
-
npmPrefixForPackageRoot,
|
|
662
671
|
npmPackageRoot,
|
|
672
|
+
npmPrefixForPackageRoot,
|
|
663
673
|
npmVersionsFromMetadata,
|
|
664
|
-
readNpmGlobalRoot
|
|
665
|
-
};
|
|
674
|
+
readNpmGlobalRoot
|
|
675
|
+
});
|