From 82c6631a57ec0348c1df6c04d270a36be7cb865b Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 11:21:18 +0100 Subject: [PATCH 01/60] Adopt monorepo structure --- .buildkite/commands/build-for-windows.ps1 | 2 +- .../commands/install-node-dependencies.sh | 8 - .buildkite/commands/run-e2e-tests.sh | 3 +- .buildkite/commands/run-metrics-tests.sh | 18 +- .buildkite/commands/should-skip-job.sh | 18 +- .gitignore | 4 +- {cli => apps/cli}/__mocks__/cli-table3.ts | 0 .../cli/__mocks__}/lib/pm2-manager.ts | 0 {cli => apps/cli}/__mocks__/pm2-axon.ts | 0 {__mocks__ => apps/cli/__mocks__}/pm2.ts | 0 {cli => apps/cli}/commands/_events.ts | 6 +- {cli => apps/cli}/commands/auth/login.ts | 6 +- {cli => apps/cli}/commands/auth/logout.ts | 2 +- {cli => apps/cli}/commands/auth/status.ts | 2 +- .../cli}/commands/auth/tests/login.test.ts | 4 +- .../cli}/commands/auth/tests/logout.test.ts | 0 .../cli}/commands/auth/tests/status.test.ts | 0 {cli => apps/cli}/commands/preview/create.ts | 4 +- {cli => apps/cli}/commands/preview/delete.ts | 2 +- {cli => apps/cli}/commands/preview/list.ts | 2 +- .../commands/preview/tests/create.test.ts | 4 +- .../commands/preview/tests/delete.test.ts | 0 .../cli}/commands/preview/tests/list.test.ts | 0 .../commands/preview/tests/update.test.ts | 6 +- {cli => apps/cli}/commands/preview/update.ts | 8 +- {cli => apps/cli}/commands/site/create.ts | 24 +- {cli => apps/cli}/commands/site/delete.ts | 6 +- {cli => apps/cli}/commands/site/list.ts | 2 +- {cli => apps/cli}/commands/site/set.ts | 14 +- {cli => apps/cli}/commands/site/start.ts | 2 +- {cli => apps/cli}/commands/site/status.ts | 6 +- {cli => apps/cli}/commands/site/stop.ts | 2 +- .../cli}/commands/site/tests/create.test.ts | 18 +- .../cli}/commands/site/tests/delete.test.ts | 4 +- .../cli}/commands/site/tests/list.test.ts | 0 .../cli}/commands/site/tests/set.test.ts | 10 +- .../cli}/commands/site/tests/start.test.ts | 0 .../cli}/commands/site/tests/status.test.ts | 4 +- .../cli}/commands/site/tests/stop.test.ts | 0 {cli => apps/cli}/commands/wp.ts | 0 {cli => apps/cli}/index.ts | 10 +- {cli => apps/cli}/lib/api.ts | 0 {cli => apps/cli}/lib/appdata.ts | 14 +- {cli => apps/cli}/lib/archive.ts | 0 {cli => apps/cli}/lib/browser.ts | 0 {cli => apps/cli}/lib/certificate-manager.ts | 0 {cli => apps/cli}/lib/cli-args-sanitizer.ts | 0 {cli => apps/cli}/lib/hosts-file.ts | 2 +- {cli => apps/cli}/lib/i18n.ts | 2 +- {cli => apps/cli}/lib/pm2-manager.ts | 8 +- {cli => apps/cli}/lib/proxy-server.ts | 0 {cli => apps/cli}/lib/run-wp-cli-command.ts | 4 +- {cli => apps/cli}/lib/server-files.ts | 0 {cli => apps/cli}/lib/site-language.ts | 2 +- {cli => apps/cli}/lib/site-utils.ts | 4 +- {cli => apps/cli}/lib/snapshots.ts | 4 +- {cli => apps/cli}/lib/sqlite-integration.ts | 2 +- {cli => apps/cli}/lib/sudo-exec.ts | 0 {cli => apps/cli}/lib/tests/api.test.ts | 0 {cli => apps/cli}/lib/tests/appdata.test.ts | 6 +- {cli => apps/cli}/lib/tests/archive.test.ts | 0 .../cli}/lib/tests/pm2-manager.test.ts | 2 +- .../cli}/lib/tests/site-utils.test.ts | 2 +- {cli => apps/cli}/lib/tests/snapshots.test.ts | 2 +- {cli => apps/cli}/lib/tests/utils.test.ts | 0 .../cli}/lib/tests/validation.test.ts | 4 +- .../tests/wordpress-server-manager.test.ts | 0 {cli => apps/cli}/lib/types/pm2.ts | 0 .../cli}/lib/types/wordpress-server-ipc.ts | 0 {cli => apps/cli}/lib/utils.ts | 0 {cli => apps/cli}/lib/validation-error.ts | 0 {cli => apps/cli}/lib/validation.ts | 4 +- .../cli}/lib/wordpress-server-manager.ts | 4 +- {cli => apps/cli}/logger.ts | 0 apps/cli/package.json | 39 + {cli => apps/cli}/proxy-daemon.ts | 0 {cli => apps/cli}/tests/test-utils.ts | 0 apps/cli/tsconfig.json | 21 + {cli => apps/cli}/types.ts | 0 vite.cli.config.ts => apps/cli/vite.config.ts | 53 +- {cli => apps/cli}/wordpress-server-child.ts | 14 +- {assets => apps/studio/assets}/ai-icon.riv | Bin .../studio/assets}/appx/AppList.png | Bin .../studio/assets}/appx/AppList.scale-125.png | Bin .../studio/assets}/appx/AppList.scale-150.png | Bin .../studio/assets}/appx/AppList.scale-200.png | Bin .../studio/assets}/appx/AppList.scale-400.png | Bin .../assets}/appx/AppList.targetsize-16.png | Bin ...st.targetsize-16_altform-lightunplated.png | Bin ...AppList.targetsize-16_altform-unplated.png | Bin .../assets}/appx/AppList.targetsize-20.png | Bin ...st.targetsize-20_altform-lightunplated.png | Bin ...AppList.targetsize-20_altform-unplated.png | Bin .../assets}/appx/AppList.targetsize-24.png | Bin ...st.targetsize-24_altform-lightunplated.png | Bin ...AppList.targetsize-24_altform-unplated.png | Bin .../assets}/appx/AppList.targetsize-256.png | Bin ...t.targetsize-256_altform-lightunplated.png | Bin ...ppList.targetsize-256_altform-unplated.png | Bin .../assets}/appx/AppList.targetsize-30.png | Bin ...st.targetsize-30_altform-lightunplated.png | Bin ...AppList.targetsize-30_altform-unplated.png | Bin .../assets}/appx/AppList.targetsize-32.png | Bin ...st.targetsize-32_altform-lightunplated.png | Bin ...AppList.targetsize-32_altform-unplated.png | Bin .../assets}/appx/AppList.targetsize-36.png | Bin ...st.targetsize-36_altform-lightunplated.png | Bin ...AppList.targetsize-36_altform-unplated.png | Bin .../assets}/appx/AppList.targetsize-40.png | Bin ...st.targetsize-40_altform-lightunplated.png | Bin ...AppList.targetsize-40_altform-unplated.png | Bin .../assets}/appx/AppList.targetsize-48.png | Bin ...st.targetsize-48_altform-lightunplated.png | Bin ...AppList.targetsize-48_altform-unplated.png | Bin .../assets}/appx/AppList.targetsize-60.png | Bin ...st.targetsize-60_altform-lightunplated.png | Bin ...AppList.targetsize-60_altform-unplated.png | Bin .../assets}/appx/AppList.targetsize-64.png | Bin ...st.targetsize-64_altform-lightunplated.png | Bin ...AppList.targetsize-64_altform-unplated.png | Bin .../assets}/appx/AppList.targetsize-72.png | Bin ...st.targetsize-72_altform-lightunplated.png | Bin ...AppList.targetsize-72_altform-unplated.png | Bin .../assets}/appx/AppList.targetsize-80.png | Bin ...st.targetsize-80_altform-lightunplated.png | Bin ...AppList.targetsize-80_altform-unplated.png | Bin .../assets}/appx/AppList.targetsize-96.png | Bin ...st.targetsize-96_altform-lightunplated.png | Bin ...AppList.targetsize-96_altform-unplated.png | Bin .../assets}/appx/LargeTile.scale-100.png | Bin ...scale-100_altform-colorful_theme-light.png | Bin .../assets}/appx/LargeTile.scale-125.png | Bin ...scale-125_altform-colorful_theme-light.png | Bin .../assets}/appx/LargeTile.scale-150.png | Bin ...scale-150_altform-colorful_theme-light.png | Bin .../assets}/appx/LargeTile.scale-200.png | Bin ...scale-200_altform-colorful_theme-light.png | Bin .../assets}/appx/LargeTile.scale-400.png | Bin ...scale-400_altform-colorful_theme-light.png | Bin .../studio/assets}/appx/MedTile.scale-100.png | Bin ...scale-100_altform-colorful_theme-light.png | Bin .../studio/assets}/appx/MedTile.scale-125.png | Bin ...scale-125_altform-colorful_theme-light.png | Bin .../studio/assets}/appx/MedTile.scale-150.png | Bin ...scale-150_altform-colorful_theme-light.png | Bin .../studio/assets}/appx/MedTile.scale-200.png | Bin ...scale-200_altform-colorful_theme-light.png | Bin .../studio/assets}/appx/MedTile.scale-400.png | Bin ...scale-400_altform-colorful_theme-light.png | Bin .../assets}/appx/SmallTile.scale-100.png | Bin ...scale-100_altform-colorful_theme-light.png | Bin .../assets}/appx/SmallTile.scale-125.png | Bin ...scale-125_altform-colorful_theme-light.png | Bin .../assets}/appx/SmallTile.scale-150.png | Bin ...scale-150_altform-colorful_theme-light.png | Bin .../assets}/appx/SmallTile.scale-200.png | Bin ...scale-200_altform-colorful_theme-light.png | Bin .../assets}/appx/SmallTile.scale-400.png | Bin ...scale-400_altform-colorful_theme-light.png | Bin .../assets}/appx/SplashScreen.scale-100.png | Bin ....scale-100_altform-colorful_theme-dark.png | Bin ...scale-100_altform-colorful_theme-light.png | Bin .../assets}/appx/SplashScreen.scale-125.png | Bin ....scale-125_altform-colorful_theme-dark.png | Bin ...scale-125_altform-colorful_theme-light.png | Bin .../assets}/appx/SplashScreen.scale-150.png | Bin ....scale-150_altform-colorful_theme-dark.png | Bin ...scale-150_altform-colorful_theme-light.png | Bin .../assets}/appx/SplashScreen.scale-200.png | Bin ....scale-200_altform-colorful_theme-dark.png | Bin ...scale-200_altform-colorful_theme-light.png | Bin .../assets}/appx/SplashScreen.scale-400.png | Bin ....scale-400_altform-colorful_theme-dark.png | Bin ...scale-400_altform-colorful_theme-light.png | Bin .../studio/assets}/appx/Square150x150Logo.png | Bin .../studio/assets}/appx/Square44x44Logo.png | Bin .../studio/assets}/appx/StoreLogo.png | Bin .../assets}/appx/StoreLogo.scale-100.png | Bin ...scale-100_altform-colorful_theme-light.png | Bin .../assets}/appx/StoreLogo.scale-125.png | Bin ...scale-125_altform-colorful_theme-light.png | Bin .../assets}/appx/StoreLogo.scale-150.png | Bin ...scale-150_altform-colorful_theme-light.png | Bin .../assets}/appx/StoreLogo.scale-200.png | Bin ...scale-200_altform-colorful_theme-light.png | Bin .../assets}/appx/StoreLogo.scale-400.png | Bin ...scale-400_altform-colorful_theme-light.png | Bin .../studio/assets}/appx/Wide310x150Logo.png | Bin .../assets}/appx/WideTile.scale-100.png | Bin ...scale-100_altform-colorful_theme-light.png | Bin .../assets}/appx/WideTile.scale-125.png | Bin ...scale-125_altform-colorful_theme-light.png | Bin .../assets}/appx/WideTile.scale-150.png | Bin ...scale-150_altform-colorful_theme-light.png | Bin .../assets}/appx/WideTile.scale-200.png | Bin ...scale-200_altform-colorful_theme-light.png | Bin .../assets}/appx/WideTile.scale-400.png | Bin ...scale-400_altform-colorful_theme-light.png | Bin .../studio/assets}/dmg-background.png | Bin .../studio/assets}/dmg-background@2x.png | Bin .../studio/assets}/studio-app-icon.icns | Bin .../studio/assets}/studio-app-icon.ico | Bin .../studio/assets}/studio-app-icon.png | Bin .../studio/assets}/titlebar-icon.svg | 0 .../studio/bin}/install-studio-cli.sh | 0 {bin => apps/studio/bin}/studio-cli.bat | 0 {bin => apps/studio/bin}/studio-cli.sh | 0 .../studio/bin}/uninstall-studio-cli.sh | 0 {e2e => apps/studio/e2e}/app.test.ts | 0 {e2e => apps/studio/e2e}/blueprints.test.ts | 0 {e2e => apps/studio/e2e}/constants.ts | 0 {e2e => apps/studio/e2e}/e2e-helpers.ts | 0 .../fixtures/blueprints/activate-plugin.json | 0 .../fixtures/blueprints/activate-theme.json | 0 .../fixtures/blueprints/install-plugin.json | 0 .../fixtures/blueprints/install-theme.json | 0 .../fixtures/blueprints/run-php-code.json | 0 .../fixtures/blueprints/wp-cli-command.json | 0 .../e2e}/fixtures/sql/invalid-database.sql | 0 .../studio/e2e}/import-export.test.ts | 0 {e2e => apps/studio/e2e}/import.test.ts | 0 {e2e => apps/studio/e2e}/imports/readme.md | 0 {e2e => apps/studio/e2e}/localization.test.ts | 0 .../e2e}/overview-customize-links.test.ts | 0 .../e2e}/page-objects/add-site-modal.ts | 0 .../e2e}/page-objects/import-export-tab.ts | 0 .../studio/e2e}/page-objects/main-sidebar.ts | 0 .../studio/e2e}/page-objects/onboarding.ts | 0 .../studio/e2e}/page-objects/settings-tab.ts | 0 .../studio/e2e}/page-objects/site-content.ts | 0 .../studio/e2e}/page-objects/site-form.ts | 0 .../e2e}/page-objects/user-settings-modal.ts | 0 .../e2e}/page-objects/whats-new-modal.ts | 0 .../studio/e2e}/site-navigation.test.ts | 0 {e2e => apps/studio/e2e}/sites.test.ts | 4 +- {e2e => apps/studio/e2e}/utils.ts | 0 .../studio/electron.vite.config.ts | 49 +- .../studio/entitlements}/node.plist | 0 .../studio/forge.config.ts | 58 +- index.html => apps/studio/index.html | 0 .../studio/installers}/loading.gif | Bin apps/studio/package.json | 122 + apps/studio/postcss.config.js | 9 + .../src}/__mocks__/@sentry/electron/main.ts | 0 .../studio/src}/__mocks__/atomically.ts | 0 .../studio/src}/__mocks__/electron.ts | 0 .../studio/src}/__mocks__/fs-extra.ts | 0 {src => apps/studio/src}/__mocks__/fs.ts | 0 .../studio/src}/__mocks__/lockfile.ts | 0 .../studio/src}/__mocks__/react-markdown.ts | 0 .../studio/src}/__mocks__/rehype-raw.ts | 0 .../studio/src}/__mocks__/remark-gfm.ts | 0 .../studio/src}/__mocks__/strip-ansi.ts | 0 .../studio/src}/about-menu/about-menu.html | 0 .../studio/src}/about-menu/open-about-menu.ts | 0 .../src}/about-menu/studio-app-icon.png | Bin .../about-menu/tests/open-about-menu.test.tsx | 0 .../studio/src}/additional-phrases.ts | 0 .../studio/src}/components/action-button.tsx | 0 .../add-site-with-blueprint-button.tsx | 2 +- .../components/ai-clear-history-reminder.tsx | 0 .../studio/src}/components/ai-input.tsx | 0 {src => apps/studio/src}/components/app.tsx | 0 .../studio/src}/components/arrow-icon.tsx | 0 .../src}/components/assistant-anchor.tsx | 0 .../src}/components/assistant-code-block.tsx | 0 .../src}/components/assistant-thinking.tsx | 0 .../studio/src}/components/auth-provider.tsx | 0 {src => apps/studio/src}/components/badge.tsx | 0 .../studio/src}/components/button.tsx | 0 .../src}/components/buttons-section.tsx | 0 .../studio/src}/components/chat-message.tsx | 0 .../studio/src}/components/chat-rating.tsx | 0 .../studio/src}/components/check-icon.tsx | 0 .../studio/src}/components/clear-action.tsx | 0 .../src}/components/content-tab-assistant.tsx | 0 .../components/content-tab-import-export.tsx | 0 .../src}/components/content-tab-overview.tsx | 0 .../src}/components/content-tab-previews.tsx | 0 .../src}/components/content-tab-settings.tsx | 2 +- .../src}/components/copy-text-button.tsx | 0 .../studio/src}/components/crash-tester.tsx | 0 .../components/default-error-fallback.tsx | 2 +- .../src}/components/dynamic-stylesheet.tsx | 0 .../studio/src}/components/error-boundary.tsx | 0 .../studio/src}/components/error-icon.tsx | 0 .../src}/components/error-information.tsx | 0 .../studio/src}/components/folder-icon.tsx | 0 .../src}/components/fullscreen-modal.tsx | 0 .../studio/src}/components/gravatar.tsx | 0 .../studio/src}/components/header.tsx | 0 .../components/icons/circle-red-cross.tsx | 0 .../studio/src}/components/icons/execute.tsx | 0 .../studio/src}/components/icons/pause.tsx | 0 .../studio/src}/components/icons/play.tsx | 0 .../src}/components/icons/right-arrow.tsx | 0 .../src}/components/icons/xdebug-icon.tsx | 0 .../studio/src}/components/learn-more.tsx | 0 .../studio/src}/components/link-button.tsx | 0 .../studio/src}/components/mac-titlebar.tsx | 0 .../studio/src}/components/main-sidebar.tsx | 0 {src => apps/studio/src}/components/modal.tsx | 0 .../src}/components/no-studio-sites/index.tsx | 0 .../studio/src}/components/offline-icon.tsx | 0 .../studio/src}/components/pressable-logo.tsx | 0 .../src}/components/profile-icon-detailed.tsx | 0 .../studio/src}/components/progress-bar.tsx | 0 .../src}/components/publish-site-button.tsx | 0 {src => apps/studio/src}/components/root.tsx | 0 .../studio/src}/components/running-sites.tsx | 0 .../src}/components/screenshot-demo-site.tsx | 0 .../src}/components/settings-site-menu.tsx | 0 .../src}/components/site-content-tabs.tsx | 0 .../src}/components/site-is-being-created.tsx | 0 .../components/site-management-actions.tsx | 0 .../studio/src}/components/site-menu.tsx | 0 .../studio/src}/components/studio-logo.tsx | 0 .../tests/ai-clear-history-reminder.test.tsx | 0 .../src}/components/tests/ai-input.test.tsx | 0 .../studio/src}/components/tests/app.test.tsx | 0 .../tests/assistant-anchor.test.tsx | 0 .../tests/assistant-code-block.test.tsx | 0 .../tests/content-tab-assistant.test.tsx | 0 .../tests/content-tab-import-export.test.tsx | 0 ...nt-tab-overview-shortcuts-section.test.tsx | 0 .../tests/content-tab-overview.test.tsx | 0 .../tests/content-tab-settings.test.tsx | 2 +- .../tests/copy-text-button.test.tsx | 0 .../tests/dynamic-stylesheet.test.tsx | 0 .../src}/components/tests/gravatar.test.tsx | 0 .../src}/components/tests/header.test.tsx | 0 .../components/tests/mac-titlebar.test.tsx | 0 .../components/tests/main-sidebar.test.tsx | 0 .../src}/components/tests/onboarding.test.tsx | 0 .../components/tests/running-sites.test.tsx | 0 .../tests/site-content-tabs.test.tsx | 0 .../tests/site-management-actions.test.tsx | 0 .../src}/components/tests/topbar.test.tsx | 0 .../studio/src}/components/text-control.tsx | 0 .../studio/src}/components/tooltip.tsx | 0 .../studio/src}/components/top-bar.tsx | 0 .../studio/src}/components/tree-view.tsx | 0 .../components/welcome-message-prompt.tsx | 0 .../src}/components/windows-titlebar.tsx | 0 .../src}/components/wordpress-logo-circle.tsx | 0 .../studio/src}/components/wordpress-logo.tsx | 0 .../src}/components/wordpress-short-logo.tsx | 0 .../src}/components/wordpress-styles.tsx | 6 +- .../add-wp-version-to-list.test.ts | 0 .../add-wp-version-to-list.ts | 0 .../components/wp-version-selector/index.tsx | 4 +- {src => apps/studio/src}/constants.ts | 16 +- .../src}/custom-package-definitions.d.ts | 0 .../studio/src}/hooks/sync-sites/index.ts | 0 .../hooks/sync-sites/sync-sites-context.tsx | 0 .../tests/use-pull-push-states.test.ts | 0 .../use-listen-deep-link-connection.ts | 0 .../hooks/sync-sites/use-pull-push-states.ts | 0 .../src}/hooks/sync-sites/use-sync-pull.ts | 0 .../src}/hooks/sync-sites/use-sync-push.ts | 0 .../src}/hooks/tests/get-sync-support.test.ts | 0 .../tests/reconcile-connected-sites.test.ts | 0 .../src}/hooks/tests/use-add-site.test.tsx | 0 .../tests/use-drag-and-drop-file.test.tsx | 0 .../hooks/tests/use-expiration-date.test.ts | 0 .../src}/hooks/tests/use-fullscreen.test.ts | 0 .../hooks/tests/use-import-export.test.tsx | 0 .../tests/use-is-valid-wp-cli-inline.test.ts | 0 .../hooks/tests/use-site-details.test.tsx | 0 .../studio/src}/hooks/use-add-site.ts | 8 +- {src => apps/studio/src}/hooks/use-ai-icon.ts | 3 +- {src => apps/studio/src}/hooks/use-auth.ts | 0 .../src}/hooks/use-confirmation-dialog.ts | 0 .../studio/src}/hooks/use-content-tabs.tsx | 0 .../studio/src}/hooks/use-delete-site.ts | 0 .../src}/hooks/use-drag-and-drop-file.ts | 0 .../studio/src}/hooks/use-effective-tab.tsx | 0 .../studio/src}/hooks/use-execute-cli.ts | 0 .../studio/src}/hooks/use-expiration-date.ts | 4 +- .../studio/src}/hooks/use-feature-flags.tsx | 0 .../hooks/use-format-localized-timestamps.tsx | 0 .../studio/src}/hooks/use-fullscreen.ts | 0 .../studio/src}/hooks/use-get-wp-version.ts | 0 .../studio/src}/hooks/use-gravatar-url.ts | 0 .../studio/src}/hooks/use-import-export.tsx | 0 .../studio/src}/hooks/use-ipc-listener.ts | 0 .../src}/hooks/use-is-valid-blueprint.ts | 0 .../src}/hooks/use-is-valid-wp-cli-inline.ts | 0 .../src}/hooks/use-localization-support.ts | 0 {src => apps/studio/src}/hooks/use-offline.ts | 0 .../studio/src}/hooks/use-progress.tsx | 0 {src => apps/studio/src}/hooks/use-sha256.ts | 0 .../src}/hooks/use-sidebar-visibility.ts | 0 .../studio/src}/hooks/use-site-details.tsx | 4 +- .../studio/src}/hooks/use-site-size.ts | 2 +- .../hooks/use-sync-states-progress-info.ts | 0 .../studio/src}/hooks/use-theme-details.tsx | 0 .../studio/src}/hooks/use-window-listener.ts | 0 {src => apps/studio/src}/index.css | 2 +- {src => apps/studio/src}/index.ts | 10 +- {src => apps/studio/src}/ipc-handlers.ts | 24 +- {src => apps/studio/src}/ipc-types.d.ts | 0 {src => apps/studio/src}/ipc-utils.ts | 6 +- .../studio/src}/lib/active-sync-operations.ts | 0 {src => apps/studio/src}/lib/app-globals.ts | 0 {src => apps/studio/src}/lib/beta-features.ts | 0 .../studio/src}/lib/bump-stats/lib.ts | 2 +- .../studio/src}/lib/certificate-manager.ts | 0 {src => apps/studio/src}/lib/cx.ts | 0 {src => apps/studio/src}/lib/date.ts | 0 .../src}/lib/deeplink/deeplink-handler.ts | 0 .../handlers/add-site-with-blueprint.ts | 2 +- .../studio/src}/lib/deeplink/handlers/auth.ts | 0 .../deeplink/handlers/sync-connect-site.ts | 0 .../studio/src}/lib/deeplink/index.ts | 0 .../src}/lib/deeplink/tests/add-site.test.ts | 4 +- .../src}/lib/deeplink/tests/auth.test.ts | 0 .../deeplink/tests/sync-connect-site.test.ts | 0 .../studio/src}/lib/download-utils.ts | 2 +- {src => apps/studio/src}/lib/download.ts | 0 .../studio/src}/lib/error-formatting.ts | 0 {src => apps/studio/src}/lib/feature-flags.ts | 0 .../studio/src}/lib/generate-checkout-url.ts | 2 +- .../studio/src}/lib/generate-site-name.ts | 2 +- .../studio/src}/lib/get-image-data.ts | 0 {src => apps/studio/src}/lib/get-ipc-api.ts | 0 .../studio/src}/lib/get-localized-link.ts | 2 +- {src => apps/studio/src}/lib/get-site-url.ts | 0 .../src}/lib/get-sync-backup-temp-path.ts | 0 {src => apps/studio/src}/lib/hosts-file.ts | 2 +- .../src}/lib/import-export/export/events.ts | 0 .../import-export/export/export-database.ts | 0 .../import-export/export/export-manager.ts | 0 .../export/exporters/default-exporter.ts | 0 .../import-export/export/exporters/index.ts | 0 .../export/exporters/sql-exporter.ts | 0 .../export/generate-backup-filename.ts | 0 .../src}/lib/import-export/export/types.ts | 0 .../src}/lib/import-export/handle-events.ts | 0 .../src}/lib/import-export/import/events.ts | 0 .../import/handlers/backup-handler-factory.ts | 0 .../import/handlers/backup-handler-sql.ts | 0 .../import/handlers/backup-handler-tar-gz.ts | 0 .../import/handlers/backup-handler-wpress.ts | 0 .../import/handlers/backup-handler-zip.ts | 0 .../import-export/import/import-manager.ts | 0 .../import/importers/importer.ts | 4 +- .../import-export/import/importers/index.ts | 0 .../src}/lib/import-export/import/types.ts | 0 .../import-export/import/validators/index.ts | 0 .../import/validators/jetpack-validator.ts | 0 .../import/validators/local-validator.ts | 0 .../import/validators/playground-validator.ts | 0 .../import/validators/sql-validator.ts | 0 .../import/validators/validator.ts | 0 .../import/validators/wpress-validator.ts | 0 .../tests/export/export-manager.test.ts | 0 .../export/exporters/default-exporter.test.ts | 0 .../export/exporters/sql-exporter.test.ts | 0 .../import/handlers/backup-handler.test.ts | 0 .../tests/import/import-manager.test.ts | 0 .../import/importer/jetpack-importer.test.ts | 0 .../import/importer/local-importer.test.ts | 0 .../importer/playground-importer.test.ts | 0 .../validators/jetpack-validator.test.ts | 0 .../import/validators/local-validator.test.ts | 0 .../validators/playground-validator.test.ts | 0 .../import/validators/sql-validator.test.ts | 0 .../validators/wpress-validator.test.ts | 0 {src => apps/studio/src}/lib/is-installed.ts | 0 .../src}/lib/is-invalid-oauth-token-error.ts | 0 .../studio/src}/lib/is-window-frame-rtl.ts | 0 .../studio/src}/lib/is-wpcom-network-error.ts | 0 {src => apps/studio/src}/lib/locale-node.ts | 2 +- {src => apps/studio/src}/lib/oauth.ts | 6 +- .../studio/src}/lib/sanitize-for-logging.ts | 0 .../studio/src}/lib/sentry-release.ts | 0 .../studio/src}/lib/serialize-plugins.ts | 0 .../studio/src}/lib/server-files-paths.ts | 0 .../src}/lib/shell-open-external-wrapper.ts | 0 {src => apps/studio/src}/lib/site-language.ts | 2 +- .../studio/src}/lib/sqlite-command-release.ts | 0 .../src}/lib/sqlite-command-versions.ts | 0 .../studio/src}/lib/sqlite-versions.ts | 4 +- {src => apps/studio/src}/lib/sudo-exec.ts | 0 {src => apps/studio/src}/lib/test-utils.tsx | 0 .../studio/src}/lib/tests/bump-stats.test.ts | 4 +- .../src}/lib/tests/generate-site-name.test.ts | 0 .../src}/lib/tests/get-localized-link.test.ts | 0 .../src}/lib/tests/get-site-url.test.ts | 0 .../studio/src}/lib/tests/hosts-file.test.ts | 0 .../src}/lib/tests/is-installed.test.ts | 0 .../is-invalid-oauth-token-error.test.ts | 0 .../studio/src}/lib/tests/locale.test.ts | 2 +- .../studio/src}/lib/tests/oauth.test.ts | 2 +- .../lib/tests/sanitize-for-logging.test.ts | 0 .../src}/lib/tests/serialize-plugins.test.ts | 0 .../src}/lib/tests/site-language.test.ts | 0 .../studio/src}/lib/tests/url-utils.test.ts | 0 .../src}/lib/tests/windows-helpers.test.ts | 0 .../studio/src}/lib/update-site-url.ts | 0 {src => apps/studio/src}/lib/url-utils.ts | 0 .../studio/src}/lib/user-data-watcher.ts | 0 {src => apps/studio/src}/lib/version-utils.ts | 0 .../studio/src}/lib/windows-helpers.ts | 0 .../studio/src}/lib/wordpress-server-types.ts | 0 .../studio/src}/lib/wordpress-setup.ts | 2 +- {src => apps/studio/src}/lib/wp-versions.ts | 2 +- {src => apps/studio/src}/lib/wpcom-factory.ts | 0 .../src}/lib/wpcom-xhr-request-factory.ts | 0 {src => apps/studio/src}/logging.ts | 0 {src => apps/studio/src}/main-window.ts | 2 +- {src => apps/studio/src}/menu.ts | 0 .../migrations/migrate-from-wp-now-folder.ts | 2 +- .../remove-sites-with-empty-dirs.ts | 2 +- .../migrations/rename-launch-uniques-stat.ts | 2 +- .../components/blueprint-deeplink.tsx | 2 +- .../add-site/components/blueprint-icon.tsx | 0 .../components/blueprint-warning-notice.tsx | 2 +- .../add-site/components/blueprints.css | 0 .../add-site/components/blueprints.tsx | 0 .../add-site/components/create-site-form.tsx | 8 +- .../add-site/components/create-site.tsx | 2 +- .../add-site/components/import-backup.tsx | 0 .../src}/modules/add-site/components/index.ts | 0 .../modules/add-site/components/options.tsx | 0 .../add-site/components/pull-remote-site.tsx | 0 .../modules/add-site/components/stepper.tsx | 0 .../tests/use-blueprint-deeplink.test.tsx | 0 .../use-find-available-site-name.test.ts | 0 .../add-site/hooks/use-blueprint-deeplink.ts | 4 +- .../hooks/use-find-available-site-name.ts | 0 .../modules/add-site/hooks/use-stepper.ts | 0 .../studio/src}/modules/add-site/index.tsx | 10 +- .../modules/add-site/tests/add-site.test.tsx | 0 .../modules/cli/lib/cli-events-subscriber.ts | 4 +- .../modules/cli/lib/cli-server-process.ts | 2 +- .../src}/modules/cli/lib/cli-site-creator.ts | 4 +- .../src}/modules/cli/lib/cli-site-editor.ts | 2 +- .../src}/modules/cli/lib/execute-command.ts | 0 .../cli/lib/execute-preview-command.ts | 2 +- .../src}/modules/cli/lib/ipc-handlers.ts | 0 .../cli/lib/macos-installation-manager.ts | 2 +- .../cli/lib/windows-installation-manager.ts | 0 .../components/connect-to-wpcom.tsx | 0 .../onboarding/hooks/use-onboarding.tsx | 0 .../studio/src}/modules/onboarding/index.tsx | 0 .../components/create-preview-button.tsx | 2 +- .../components/delete-progress-row.tsx | 0 .../preview-action-buttons-menu.tsx | 2 +- .../components/preview-site-row.tsx | 2 +- .../components/preview-sites-table-header.tsx | 0 .../preview-site/components/progress-row.tsx | 0 .../components/rename-preview-modal.tsx | 0 .../preview-action-buttons-menu.test.tsx | 2 +- .../tests/preview-site-row.test.tsx | 0 .../tests/rename-preview-modal.test.tsx | 0 .../hooks/use-update-button-tooltip.ts | 2 +- .../modules/preview-site/lib/ipc-handlers.ts | 0 .../lib/tests/version-comparison.test.ts | 2 +- .../preview-site/lib/version-comparison.ts | 2 +- .../site-settings/edit-site-details.tsx | 8 +- .../tests/edit-site-details.test.tsx | 0 .../sync/components/connect-button.tsx | 0 .../modules/sync/components/create-button.tsx | 0 .../sync/components/environment-badge.tsx | 0 .../components/no-wpcom-sites-content.tsx | 0 .../sync/components/no-wpcom-sites-modal.tsx | 0 .../modules/sync/components/site-name-box.tsx | 0 .../sync/components/sync-connected-sites.tsx | 0 .../modules/sync/components/sync-dialog.tsx | 0 .../components/sync-sites-modal-selector.tsx | 0 .../sync/components/sync-tab-image.tsx | 0 .../components/tree-view-loading-skeleton.tsx | 0 .../studio/src}/modules/sync/constants.ts | 0 .../hooks/use-selected-items-push-size.ts | 0 .../sync/hooks/use-sync-dialog-texts.tsx | 0 .../sync/hooks/use-top-level-sync-tree.tsx | 0 .../studio/src}/modules/sync/index.tsx | 0 .../sync/lib/convert-tree-to-sync-options.ts | 0 .../modules/sync/lib/environment-utils.ts | 0 .../src}/modules/sync/lib/ipc-handlers.ts | 2 +- .../sync/lib/reconcile-connected-sites.tsx | 0 .../src}/modules/sync/lib/sync-support.ts | 0 .../src}/modules/sync/lib/tree-utils.ts | 0 .../tests/convert-tree-to-options-to-sync.tsx | 0 .../sync/tests/environment-badge.test.tsx | 0 .../src}/modules/sync/tests/index.test.tsx | 0 .../use-selected-items-push-size.test.ts | 0 .../studio/src}/modules/sync/types.ts | 0 .../user-settings/components/account-tab.tsx | 0 .../components/editor-picker.tsx | 0 .../components/language-picker.tsx | 2 +- .../non-authenticated-account-tab.tsx | 0 .../components/preferences-tab.tsx | 2 +- .../user-settings/components/prompt-info.tsx | 0 .../components/settings-form-field.tsx | 0 .../components/snapshot-info.tsx | 0 .../components/studio-cli-toggle.tsx | 0 .../components/terminal-picker.tsx | 0 .../components/tests/terminal-picker.test.tsx | 0 .../components/tests/user-settings.test.tsx | 0 .../user-settings/components/usage-tab.tsx | 0 .../components/user-settings.tsx | 0 .../src}/modules/user-settings/index.ts | 0 .../src}/modules/user-settings/lib/editor.ts | 0 .../modules/user-settings/lib/ipc-handlers.ts | 0 .../modules/user-settings/lib/terminal.ts | 0 .../user-settings/lib/win-editor-path.ts | 2 +- .../user-settings/user-settings-types.ts | 0 .../assets/blueprints-illustration.svg | 0 .../whats-new/assets/cli-illustration.svg | 0 .../assets/pressable-sync-illustration.svg | 0 .../assets/selective-sync-illustration.svg | 0 .../whats-new/assets/studio-illustration.svg | 0 .../whats-new/components/whats-new-modal.tsx | 0 .../whats-new/hooks/use-last-seen-version.tsx | 0 .../modules/whats-new/hooks/use-whats-new.tsx | 0 .../studio/src}/modules/whats-new/index.ts | 0 {src => apps/studio/src}/preload.ts | 0 {src => apps/studio/src}/renderer.ts | 0 {src => apps/studio/src}/screenshot-window.ts | 0 .../studio/src}/setup-wp-server-files.ts | 2 +- {src => apps/studio/src}/site-server.ts | 2 +- {src => apps/studio/src}/storage/paths.ts | 2 +- .../studio/src}/storage/storage-types.ts | 2 +- .../src}/storage/tests/user-data.test.ts | 0 {src => apps/studio/src}/storage/user-data.ts | 10 +- .../studio/src}/stores/app-version-api.ts | 0 .../studio/src}/stores/beta-features-slice.ts | 0 .../src}/stores/certificate-trust-api.ts | 0 {src => apps/studio/src}/stores/chat-slice.ts | 2 +- .../studio/src}/stores/format-rtk-error.tsx | 0 {src => apps/studio/src}/stores/i18n-slice.ts | 2 +- {src => apps/studio/src}/stores/index.ts | 2 +- .../studio/src}/stores/installed-apps-api.ts | 0 .../studio/src}/stores/onboarding-slice.ts | 0 .../src}/stores/provider-constants-slice.ts | 4 +- .../studio/src}/stores/snapshot-slice.ts | 4 +- .../src}/stores/sync/connected-sites.ts | 0 {src => apps/studio/src}/stores/sync/index.ts | 0 .../studio/src}/stores/sync/sync-api.ts | 0 .../studio/src}/stores/sync/sync-hooks.ts | 0 .../studio/src}/stores/sync/sync-slice.ts | 0 .../studio/src}/stores/sync/sync-types.ts | 0 .../studio/src}/stores/sync/wpcom-sites.ts | 0 .../src}/stores/tests/app-version-api.test.ts | 0 .../src}/stores/tests/chat-slice.test.ts | 0 .../stores/tests/installed-apps-api.test.ts | 0 .../stores/tests/onboarding-slice.test.ts | 0 .../src}/stores/tests/snapshot-slice.test.ts | 4 +- .../src}/stores/tests/utils/test-reducer.ts | 0 .../tests/wordpress-versions-api.test.ts | 0 {src => apps/studio/src}/stores/ui-slice.ts | 0 .../src}/stores/utils/with-offline-check.ts | 0 .../src}/stores/wordpress-versions-api.ts | 2 +- {src => apps/studio/src}/stores/wpcom-api.ts | 2 +- .../studio/src}/tests/execute-wp-cli.test.ts | 0 {src => apps/studio/src}/tests/index.test.ts | 2 +- .../studio/src}/tests/ipc-handlers.test.ts | 10 +- .../studio/src}/tests/main-window.test.ts | 0 .../src}/tests/show-site-context-menu.test.ts | 0 .../studio/src}/tests/site-server.test.ts | 2 +- .../src}/tests/utils/platform-test-suite.ts | 0 .../studio/src}/tests/utils/style-mock.js | 0 {src => apps/studio/src}/types.ts | 0 {src => apps/studio/src}/updates.ts | 0 {src => apps/studio/src}/utility-types.d.ts | 0 .../studio/tailwind.config.js | 6 +- apps/studio/tsconfig.json | 23 + cli/__mocks__/pm2.ts | 39 - cli/package-lock.json | 6060 ----------------- cli/package.json | 23 - .../@wp-playground+wordpress+3.0.46.patch | 25 - common/translations/index.ts | 42 - docs/ai-instructions.md | 30 +- docs/code-contributions.md | 48 +- docs/testing-with-local-playground.md | 14 +- eslint.config.mjs | 11 +- package-lock.json | 2834 +++++++- package.json | 136 +- {cli/patches => patches}/pm2+6.0.14.patch | 0 {cli/patches => patches}/ps-man+1.1.8.patch | 0 playwright.config.ts | 2 +- postcss.config.js | 5 - scripts/compare-perf/package-lock.json | 886 --- scripts/download-node-binary.ts | 4 +- scripts/download-wp-server-files.ts | 6 +- scripts/make-dmg.mjs | 4 +- scripts/make-pot.mjs | 2 +- scripts/package-appx.mjs | 2 +- {common => tools/common}/constants.ts | 0 .../common}/lib/blueprint-settings.ts | 0 .../common}/lib/blueprint-validation.ts | 0 {common => tools/common}/lib/bump-stat.ts | 2 +- .../common}/lib/cache-function-ttl.ts | 0 {common => tools/common}/lib/cli-error.ts | 0 {common => tools/common}/lib/domains.ts | 2 +- {common => tools/common}/lib/escape-regex.ts | 0 {common => tools/common}/lib/extract-zip.ts | 0 {common => tools/common}/lib/fs-utils.ts | 0 .../common}/lib/get-wordpress-version.ts | 0 .../common}/lib/is-errno-exception.ts | 0 {common => tools/common}/lib/locale.ts | 2 +- {common => tools/common}/lib/lockfile.ts | 0 {common => tools/common}/lib/mu-plugins.ts | 0 {common => tools/common}/lib/network-utils.ts | 0 {common => tools/common}/lib/oauth.ts | 4 +- {common => tools/common}/lib/passwords.ts | 0 .../common}/lib/playground-cli-messages.ts | 0 {common => tools/common}/lib/port-finder.ts | 0 .../common}/lib/sanitize-folder-name.ts | 0 {common => tools/common}/lib/sequential.ts | 0 {common => tools/common}/lib/site-events.ts | 0 .../common}/lib/site-needs-restart.ts | 0 {common => tools/common}/lib/sort-sites.ts | 0 .../common}/lib/sqlite-integration.ts | 0 .../common}/lib/suppress-punycode-warning.ts | 0 .../lib/tests/blueprint-settings.test.ts | 0 .../lib/tests/blueprint-validation.test.ts | 0 .../lib/tests/cache-function-ttl.test.ts | 2 +- .../common}/lib/tests/oauth.test.ts | 0 .../common}/lib/tests/passwords.test.ts | 2 +- .../lib/tests/site-needs-restart.test.ts | 0 .../common}/lib/tests/sort-sites.test.ts | 2 +- .../lib/tests/sqlite-integration.test.ts | 2 +- .../lib/tests/wordpress-version-utils.test.ts | 0 .../common}/lib/wordpress-version-utils.ts | 0 {common => tools/common}/logger-actions.ts | 0 tools/common/package.json | 27 + tools/common/translations/index.ts | 42 + .../common}/translations/studio-ar.jed.json | 0 .../common}/translations/studio-de.jed.json | 0 .../common}/translations/studio-es.jed.json | 0 .../common}/translations/studio-fr.jed.json | 0 .../common}/translations/studio-he.jed.json | 0 .../common}/translations/studio-id.jed.json | 0 .../common}/translations/studio-it.jed.json | 0 .../common}/translations/studio-ja.jed.json | 0 .../common}/translations/studio-ko.jed.json | 0 .../common}/translations/studio-nl.jed.json | 0 .../common}/translations/studio-pl.jed.json | 0 .../translations/studio-pt-br.jed.json | 0 .../common}/translations/studio-ru.jed.json | 0 .../common}/translations/studio-sv.jed.json | 0 .../common}/translations/studio-tr.jed.json | 0 .../common}/translations/studio-uk.jed.json | 0 .../common}/translations/studio-vi.jed.json | 0 .../translations/studio-zh-cn.jed.json | 0 .../translations/studio-zh-tw.jed.json | 0 tools/common/tsconfig.json | 21 + .../common}/types/php-versions.ts | 0 {common => tools/common}/types/snapshot.ts | 0 {common => tools/common}/types/stats.ts | 0 {scripts => tools}/compare-perf/config.ts | 4 +- {scripts => tools}/compare-perf/index.ts | 0 .../compare-perf/log-to-codevitals.ts | 0 {scripts => tools}/compare-perf/package.json | 1 + .../compare-perf/performance.ts | 0 .../compare-perf/post-to-github.ts | 0 {scripts => tools}/compare-perf/tsconfig.json | 0 {scripts => tools}/compare-perf/utils.ts | 0 .../eslint-plugin-studio/package.json | 0 .../eslint-plugin-studio/src/index.js | 0 .../src/rules/require-lock-before-save.js | 0 .../tests/require-lock-before-save.test.ts | 0 {metrics => tools/metrics}/README.md | 4 +- .../metrics}/performance-reporter.ts | 0 .../metrics}/playwright.metrics.config.ts | 0 .../metrics}/tests/site-editor.test.ts | 0 .../metrics}/tests/site-startup.test.ts | 0 {metrics => tools/metrics}/utils.ts | 0 tsconfig.base.json | 16 + tsconfig.json | 27 +- vitest.config.mts | 16 +- 775 files changed, 3328 insertions(+), 7967 deletions(-) rename {cli => apps/cli}/__mocks__/cli-table3.ts (100%) rename {__mocks__/cli => apps/cli/__mocks__}/lib/pm2-manager.ts (100%) rename {cli => apps/cli}/__mocks__/pm2-axon.ts (100%) rename {__mocks__ => apps/cli/__mocks__}/pm2.ts (100%) rename {cli => apps/cli}/commands/_events.ts (95%) rename {cli => apps/cli}/commands/auth/login.ts (92%) rename {cli => apps/cli}/commands/auth/logout.ts (94%) rename {cli => apps/cli}/commands/auth/status.ts (93%) rename {cli => apps/cli}/commands/auth/tests/login.test.ts (98%) rename {cli => apps/cli}/commands/auth/tests/logout.test.ts (100%) rename {cli => apps/cli}/commands/auth/tests/status.test.ts (100%) rename {cli => apps/cli}/commands/preview/create.ts (93%) rename {cli => apps/cli}/commands/preview/delete.ts (95%) rename {cli => apps/cli}/commands/preview/list.ts (97%) rename {cli => apps/cli}/commands/preview/tests/create.test.ts (98%) rename {cli => apps/cli}/commands/preview/tests/delete.test.ts (100%) rename {cli => apps/cli}/commands/preview/tests/list.test.ts (100%) rename {cli => apps/cli}/commands/preview/tests/update.test.ts (97%) rename {cli => apps/cli}/commands/preview/update.ts (93%) rename {cli => apps/cli}/commands/site/create.ts (95%) rename {cli => apps/cli}/commands/site/delete.ts (95%) rename {cli => apps/cli}/commands/site/list.ts (97%) rename {cli => apps/cli}/commands/site/set.ts (95%) rename {cli => apps/cli}/commands/site/start.ts (97%) rename {cli => apps/cli}/commands/site/status.ts (94%) rename {cli => apps/cli}/commands/site/stop.ts (97%) rename {cli => apps/cli}/commands/site/tests/create.test.ts (98%) rename {cli => apps/cli}/commands/site/tests/delete.test.ts (99%) rename {cli => apps/cli}/commands/site/tests/list.test.ts (100%) rename {cli => apps/cli}/commands/site/tests/set.test.ts (98%) rename {cli => apps/cli}/commands/site/tests/start.test.ts (100%) rename {cli => apps/cli}/commands/site/tests/status.test.ts (97%) rename {cli => apps/cli}/commands/site/tests/stop.test.ts (100%) rename {cli => apps/cli}/commands/wp.ts (100%) rename {cli => apps/cli}/index.ts (94%) rename {cli => apps/cli}/lib/api.ts (100%) rename {cli => apps/cli}/lib/appdata.ts (93%) rename {cli => apps/cli}/lib/archive.ts (100%) rename {cli => apps/cli}/lib/browser.ts (100%) rename {cli => apps/cli}/lib/certificate-manager.ts (100%) rename {cli => apps/cli}/lib/cli-args-sanitizer.ts (100%) rename {cli => apps/cli}/lib/hosts-file.ts (99%) rename {cli => apps/cli}/lib/i18n.ts (97%) rename {cli => apps/cli}/lib/pm2-manager.ts (97%) rename {cli => apps/cli}/lib/proxy-server.ts (100%) rename {cli => apps/cli}/lib/run-wp-cli-command.ts (96%) rename {cli => apps/cli}/lib/server-files.ts (100%) rename {cli => apps/cli}/lib/site-language.ts (98%) rename {cli => apps/cli}/lib/site-utils.ts (96%) rename {cli => apps/cli}/lib/snapshots.ts (96%) rename {cli => apps/cli}/lib/sqlite-integration.ts (90%) rename {cli => apps/cli}/lib/sudo-exec.ts (100%) rename {cli => apps/cli}/lib/tests/api.test.ts (100%) rename {cli => apps/cli}/lib/tests/appdata.test.ts (97%) rename {cli => apps/cli}/lib/tests/archive.test.ts (100%) rename {cli => apps/cli}/lib/tests/pm2-manager.test.ts (99%) rename {cli => apps/cli}/lib/tests/site-utils.test.ts (98%) rename {cli => apps/cli}/lib/tests/snapshots.test.ts (99%) rename {cli => apps/cli}/lib/tests/utils.test.ts (100%) rename {cli => apps/cli}/lib/tests/validation.test.ts (92%) rename {cli => apps/cli}/lib/tests/wordpress-server-manager.test.ts (100%) rename {cli => apps/cli}/lib/types/pm2.ts (100%) rename {cli => apps/cli}/lib/types/wordpress-server-ipc.ts (100%) rename {cli => apps/cli}/lib/utils.ts (100%) rename {cli => apps/cli}/lib/validation-error.ts (100%) rename {cli => apps/cli}/lib/validation.ts (87%) rename {cli => apps/cli}/lib/wordpress-server-manager.ts (99%) rename {cli => apps/cli}/logger.ts (100%) create mode 100644 apps/cli/package.json rename {cli => apps/cli}/proxy-daemon.ts (100%) rename {cli => apps/cli}/tests/test-utils.ts (100%) create mode 100644 apps/cli/tsconfig.json rename {cli => apps/cli}/types.ts (100%) rename vite.cli.config.ts => apps/cli/vite.config.ts (59%) rename {cli => apps/cli}/wordpress-server-child.ts (96%) rename {assets => apps/studio/assets}/ai-icon.riv (100%) rename {assets => apps/studio/assets}/appx/AppList.png (100%) rename {assets => apps/studio/assets}/appx/AppList.scale-125.png (100%) rename {assets => apps/studio/assets}/appx/AppList.scale-150.png (100%) rename {assets => apps/studio/assets}/appx/AppList.scale-200.png (100%) rename {assets => apps/studio/assets}/appx/AppList.scale-400.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-16.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-16_altform-lightunplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-16_altform-unplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-20.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-20_altform-lightunplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-20_altform-unplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-24.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-24_altform-lightunplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-24_altform-unplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-256.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-256_altform-lightunplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-256_altform-unplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-30.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-30_altform-lightunplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-30_altform-unplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-32.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-32_altform-lightunplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-32_altform-unplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-36.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-36_altform-lightunplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-36_altform-unplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-40.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-40_altform-lightunplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-40_altform-unplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-48.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-48_altform-lightunplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-48_altform-unplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-60.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-60_altform-lightunplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-60_altform-unplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-64.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-64_altform-lightunplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-64_altform-unplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-72.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-72_altform-lightunplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-72_altform-unplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-80.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-80_altform-lightunplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-80_altform-unplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-96.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-96_altform-lightunplated.png (100%) rename {assets => apps/studio/assets}/appx/AppList.targetsize-96_altform-unplated.png (100%) rename {assets => apps/studio/assets}/appx/LargeTile.scale-100.png (100%) rename {assets => apps/studio/assets}/appx/LargeTile.scale-100_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/LargeTile.scale-125.png (100%) rename {assets => apps/studio/assets}/appx/LargeTile.scale-125_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/LargeTile.scale-150.png (100%) rename {assets => apps/studio/assets}/appx/LargeTile.scale-150_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/LargeTile.scale-200.png (100%) rename {assets => apps/studio/assets}/appx/LargeTile.scale-200_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/LargeTile.scale-400.png (100%) rename {assets => apps/studio/assets}/appx/LargeTile.scale-400_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/MedTile.scale-100.png (100%) rename {assets => apps/studio/assets}/appx/MedTile.scale-100_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/MedTile.scale-125.png (100%) rename {assets => apps/studio/assets}/appx/MedTile.scale-125_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/MedTile.scale-150.png (100%) rename {assets => apps/studio/assets}/appx/MedTile.scale-150_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/MedTile.scale-200.png (100%) rename {assets => apps/studio/assets}/appx/MedTile.scale-200_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/MedTile.scale-400.png (100%) rename {assets => apps/studio/assets}/appx/MedTile.scale-400_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/SmallTile.scale-100.png (100%) rename {assets => apps/studio/assets}/appx/SmallTile.scale-100_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/SmallTile.scale-125.png (100%) rename {assets => apps/studio/assets}/appx/SmallTile.scale-125_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/SmallTile.scale-150.png (100%) rename {assets => apps/studio/assets}/appx/SmallTile.scale-150_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/SmallTile.scale-200.png (100%) rename {assets => apps/studio/assets}/appx/SmallTile.scale-200_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/SmallTile.scale-400.png (100%) rename {assets => apps/studio/assets}/appx/SmallTile.scale-400_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-100.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-100_altform-colorful_theme-dark.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-100_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-125.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-125_altform-colorful_theme-dark.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-125_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-150.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-150_altform-colorful_theme-dark.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-150_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-200.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-200_altform-colorful_theme-dark.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-200_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-400.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-400_altform-colorful_theme-dark.png (100%) rename {assets => apps/studio/assets}/appx/SplashScreen.scale-400_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/Square150x150Logo.png (100%) rename {assets => apps/studio/assets}/appx/Square44x44Logo.png (100%) rename {assets => apps/studio/assets}/appx/StoreLogo.png (100%) rename {assets => apps/studio/assets}/appx/StoreLogo.scale-100.png (100%) rename {assets => apps/studio/assets}/appx/StoreLogo.scale-100_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/StoreLogo.scale-125.png (100%) rename {assets => apps/studio/assets}/appx/StoreLogo.scale-125_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/StoreLogo.scale-150.png (100%) rename {assets => apps/studio/assets}/appx/StoreLogo.scale-150_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/StoreLogo.scale-200.png (100%) rename {assets => apps/studio/assets}/appx/StoreLogo.scale-200_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/StoreLogo.scale-400.png (100%) rename {assets => apps/studio/assets}/appx/StoreLogo.scale-400_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/Wide310x150Logo.png (100%) rename {assets => apps/studio/assets}/appx/WideTile.scale-100.png (100%) rename {assets => apps/studio/assets}/appx/WideTile.scale-100_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/WideTile.scale-125.png (100%) rename {assets => apps/studio/assets}/appx/WideTile.scale-125_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/WideTile.scale-150.png (100%) rename {assets => apps/studio/assets}/appx/WideTile.scale-150_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/WideTile.scale-200.png (100%) rename {assets => apps/studio/assets}/appx/WideTile.scale-200_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/appx/WideTile.scale-400.png (100%) rename {assets => apps/studio/assets}/appx/WideTile.scale-400_altform-colorful_theme-light.png (100%) rename {assets => apps/studio/assets}/dmg-background.png (100%) rename {assets => apps/studio/assets}/dmg-background@2x.png (100%) rename {assets => apps/studio/assets}/studio-app-icon.icns (100%) rename {assets => apps/studio/assets}/studio-app-icon.ico (100%) rename {assets => apps/studio/assets}/studio-app-icon.png (100%) rename {assets => apps/studio/assets}/titlebar-icon.svg (100%) rename {bin => apps/studio/bin}/install-studio-cli.sh (100%) rename {bin => apps/studio/bin}/studio-cli.bat (100%) rename {bin => apps/studio/bin}/studio-cli.sh (100%) rename {bin => apps/studio/bin}/uninstall-studio-cli.sh (100%) rename {e2e => apps/studio/e2e}/app.test.ts (100%) rename {e2e => apps/studio/e2e}/blueprints.test.ts (100%) rename {e2e => apps/studio/e2e}/constants.ts (100%) rename {e2e => apps/studio/e2e}/e2e-helpers.ts (100%) rename {e2e => apps/studio/e2e}/fixtures/blueprints/activate-plugin.json (100%) rename {e2e => apps/studio/e2e}/fixtures/blueprints/activate-theme.json (100%) rename {e2e => apps/studio/e2e}/fixtures/blueprints/install-plugin.json (100%) rename {e2e => apps/studio/e2e}/fixtures/blueprints/install-theme.json (100%) rename {e2e => apps/studio/e2e}/fixtures/blueprints/run-php-code.json (100%) rename {e2e => apps/studio/e2e}/fixtures/blueprints/wp-cli-command.json (100%) rename {e2e => apps/studio/e2e}/fixtures/sql/invalid-database.sql (100%) rename {e2e => apps/studio/e2e}/import-export.test.ts (100%) rename {e2e => apps/studio/e2e}/import.test.ts (100%) rename {e2e => apps/studio/e2e}/imports/readme.md (100%) rename {e2e => apps/studio/e2e}/localization.test.ts (100%) rename {e2e => apps/studio/e2e}/overview-customize-links.test.ts (100%) rename {e2e => apps/studio/e2e}/page-objects/add-site-modal.ts (100%) rename {e2e => apps/studio/e2e}/page-objects/import-export-tab.ts (100%) rename {e2e => apps/studio/e2e}/page-objects/main-sidebar.ts (100%) rename {e2e => apps/studio/e2e}/page-objects/onboarding.ts (100%) rename {e2e => apps/studio/e2e}/page-objects/settings-tab.ts (100%) rename {e2e => apps/studio/e2e}/page-objects/site-content.ts (100%) rename {e2e => apps/studio/e2e}/page-objects/site-form.ts (100%) rename {e2e => apps/studio/e2e}/page-objects/user-settings-modal.ts (100%) rename {e2e => apps/studio/e2e}/page-objects/whats-new-modal.ts (100%) rename {e2e => apps/studio/e2e}/site-navigation.test.ts (100%) rename {e2e => apps/studio/e2e}/sites.test.ts (98%) rename {e2e => apps/studio/e2e}/utils.ts (100%) rename electron.vite.config.ts => apps/studio/electron.vite.config.ts (73%) rename {entitlements => apps/studio/entitlements}/node.plist (100%) rename forge.config.ts => apps/studio/forge.config.ts (66%) rename index.html => apps/studio/index.html (100%) rename {installers => apps/studio/installers}/loading.gif (100%) create mode 100644 apps/studio/package.json create mode 100644 apps/studio/postcss.config.js rename {src => apps/studio/src}/__mocks__/@sentry/electron/main.ts (100%) rename {src => apps/studio/src}/__mocks__/atomically.ts (100%) rename {src => apps/studio/src}/__mocks__/electron.ts (100%) rename {src => apps/studio/src}/__mocks__/fs-extra.ts (100%) rename {src => apps/studio/src}/__mocks__/fs.ts (100%) rename {src => apps/studio/src}/__mocks__/lockfile.ts (100%) rename {src => apps/studio/src}/__mocks__/react-markdown.ts (100%) rename {src => apps/studio/src}/__mocks__/rehype-raw.ts (100%) rename {src => apps/studio/src}/__mocks__/remark-gfm.ts (100%) rename {src => apps/studio/src}/__mocks__/strip-ansi.ts (100%) rename {src => apps/studio/src}/about-menu/about-menu.html (100%) rename {src => apps/studio/src}/about-menu/open-about-menu.ts (100%) rename {src => apps/studio/src}/about-menu/studio-app-icon.png (100%) rename {src => apps/studio/src}/about-menu/tests/open-about-menu.test.tsx (100%) rename {src => apps/studio/src}/additional-phrases.ts (100%) rename {src => apps/studio/src}/components/action-button.tsx (100%) rename {src => apps/studio/src}/components/add-site-with-blueprint-button.tsx (94%) rename {src => apps/studio/src}/components/ai-clear-history-reminder.tsx (100%) rename {src => apps/studio/src}/components/ai-input.tsx (100%) rename {src => apps/studio/src}/components/app.tsx (100%) rename {src => apps/studio/src}/components/arrow-icon.tsx (100%) rename {src => apps/studio/src}/components/assistant-anchor.tsx (100%) rename {src => apps/studio/src}/components/assistant-code-block.tsx (100%) rename {src => apps/studio/src}/components/assistant-thinking.tsx (100%) rename {src => apps/studio/src}/components/auth-provider.tsx (100%) rename {src => apps/studio/src}/components/badge.tsx (100%) rename {src => apps/studio/src}/components/button.tsx (100%) rename {src => apps/studio/src}/components/buttons-section.tsx (100%) rename {src => apps/studio/src}/components/chat-message.tsx (100%) rename {src => apps/studio/src}/components/chat-rating.tsx (100%) rename {src => apps/studio/src}/components/check-icon.tsx (100%) rename {src => apps/studio/src}/components/clear-action.tsx (100%) rename {src => apps/studio/src}/components/content-tab-assistant.tsx (100%) rename {src => apps/studio/src}/components/content-tab-import-export.tsx (100%) rename {src => apps/studio/src}/components/content-tab-overview.tsx (100%) rename {src => apps/studio/src}/components/content-tab-previews.tsx (100%) rename {src => apps/studio/src}/components/content-tab-settings.tsx (99%) rename {src => apps/studio/src}/components/copy-text-button.tsx (100%) rename {src => apps/studio/src}/components/crash-tester.tsx (100%) rename {src => apps/studio/src}/components/default-error-fallback.tsx (98%) rename {src => apps/studio/src}/components/dynamic-stylesheet.tsx (100%) rename {src => apps/studio/src}/components/error-boundary.tsx (100%) rename {src => apps/studio/src}/components/error-icon.tsx (100%) rename {src => apps/studio/src}/components/error-information.tsx (100%) rename {src => apps/studio/src}/components/folder-icon.tsx (100%) rename {src => apps/studio/src}/components/fullscreen-modal.tsx (100%) rename {src => apps/studio/src}/components/gravatar.tsx (100%) rename {src => apps/studio/src}/components/header.tsx (100%) rename {src => apps/studio/src}/components/icons/circle-red-cross.tsx (100%) rename {src => apps/studio/src}/components/icons/execute.tsx (100%) rename {src => apps/studio/src}/components/icons/pause.tsx (100%) rename {src => apps/studio/src}/components/icons/play.tsx (100%) rename {src => apps/studio/src}/components/icons/right-arrow.tsx (100%) rename {src => apps/studio/src}/components/icons/xdebug-icon.tsx (100%) rename {src => apps/studio/src}/components/learn-more.tsx (100%) rename {src => apps/studio/src}/components/link-button.tsx (100%) rename {src => apps/studio/src}/components/mac-titlebar.tsx (100%) rename {src => apps/studio/src}/components/main-sidebar.tsx (100%) rename {src => apps/studio/src}/components/modal.tsx (100%) rename {src => apps/studio/src}/components/no-studio-sites/index.tsx (100%) rename {src => apps/studio/src}/components/offline-icon.tsx (100%) rename {src => apps/studio/src}/components/pressable-logo.tsx (100%) rename {src => apps/studio/src}/components/profile-icon-detailed.tsx (100%) rename {src => apps/studio/src}/components/progress-bar.tsx (100%) rename {src => apps/studio/src}/components/publish-site-button.tsx (100%) rename {src => apps/studio/src}/components/root.tsx (100%) rename {src => apps/studio/src}/components/running-sites.tsx (100%) rename {src => apps/studio/src}/components/screenshot-demo-site.tsx (100%) rename {src => apps/studio/src}/components/settings-site-menu.tsx (100%) rename {src => apps/studio/src}/components/site-content-tabs.tsx (100%) rename {src => apps/studio/src}/components/site-is-being-created.tsx (100%) rename {src => apps/studio/src}/components/site-management-actions.tsx (100%) rename {src => apps/studio/src}/components/site-menu.tsx (100%) rename {src => apps/studio/src}/components/studio-logo.tsx (100%) rename {src => apps/studio/src}/components/tests/ai-clear-history-reminder.test.tsx (100%) rename {src => apps/studio/src}/components/tests/ai-input.test.tsx (100%) rename {src => apps/studio/src}/components/tests/app.test.tsx (100%) rename {src => apps/studio/src}/components/tests/assistant-anchor.test.tsx (100%) rename {src => apps/studio/src}/components/tests/assistant-code-block.test.tsx (100%) rename {src => apps/studio/src}/components/tests/content-tab-assistant.test.tsx (100%) rename {src => apps/studio/src}/components/tests/content-tab-import-export.test.tsx (100%) rename {src => apps/studio/src}/components/tests/content-tab-overview-shortcuts-section.test.tsx (100%) rename {src => apps/studio/src}/components/tests/content-tab-overview.test.tsx (100%) rename {src => apps/studio/src}/components/tests/content-tab-settings.test.tsx (99%) rename {src => apps/studio/src}/components/tests/copy-text-button.test.tsx (100%) rename {src => apps/studio/src}/components/tests/dynamic-stylesheet.test.tsx (100%) rename {src => apps/studio/src}/components/tests/gravatar.test.tsx (100%) rename {src => apps/studio/src}/components/tests/header.test.tsx (100%) rename {src => apps/studio/src}/components/tests/mac-titlebar.test.tsx (100%) rename {src => apps/studio/src}/components/tests/main-sidebar.test.tsx (100%) rename {src => apps/studio/src}/components/tests/onboarding.test.tsx (100%) rename {src => apps/studio/src}/components/tests/running-sites.test.tsx (100%) rename {src => apps/studio/src}/components/tests/site-content-tabs.test.tsx (100%) rename {src => apps/studio/src}/components/tests/site-management-actions.test.tsx (100%) rename {src => apps/studio/src}/components/tests/topbar.test.tsx (100%) rename {src => apps/studio/src}/components/text-control.tsx (100%) rename {src => apps/studio/src}/components/tooltip.tsx (100%) rename {src => apps/studio/src}/components/top-bar.tsx (100%) rename {src => apps/studio/src}/components/tree-view.tsx (100%) rename {src => apps/studio/src}/components/welcome-message-prompt.tsx (100%) rename {src => apps/studio/src}/components/windows-titlebar.tsx (100%) rename {src => apps/studio/src}/components/wordpress-logo-circle.tsx (100%) rename {src => apps/studio/src}/components/wordpress-logo.tsx (100%) rename {src => apps/studio/src}/components/wordpress-short-logo.tsx (100%) rename {src => apps/studio/src}/components/wordpress-styles.tsx (71%) rename {src => apps/studio/src}/components/wp-version-selector/add-wp-version-to-list.test.ts (100%) rename {src => apps/studio/src}/components/wp-version-selector/add-wp-version-to-list.ts (100%) rename {src => apps/studio/src}/components/wp-version-selector/index.tsx (97%) rename {src => apps/studio/src}/constants.ts (89%) rename {src => apps/studio/src}/custom-package-definitions.d.ts (100%) rename {src => apps/studio/src}/hooks/sync-sites/index.ts (100%) rename {src => apps/studio/src}/hooks/sync-sites/sync-sites-context.tsx (100%) rename {src => apps/studio/src}/hooks/sync-sites/tests/use-pull-push-states.test.ts (100%) rename {src => apps/studio/src}/hooks/sync-sites/use-listen-deep-link-connection.ts (100%) rename {src => apps/studio/src}/hooks/sync-sites/use-pull-push-states.ts (100%) rename {src => apps/studio/src}/hooks/sync-sites/use-sync-pull.ts (100%) rename {src => apps/studio/src}/hooks/sync-sites/use-sync-push.ts (100%) rename {src => apps/studio/src}/hooks/tests/get-sync-support.test.ts (100%) rename {src => apps/studio/src}/hooks/tests/reconcile-connected-sites.test.ts (100%) rename {src => apps/studio/src}/hooks/tests/use-add-site.test.tsx (100%) rename {src => apps/studio/src}/hooks/tests/use-drag-and-drop-file.test.tsx (100%) rename {src => apps/studio/src}/hooks/tests/use-expiration-date.test.ts (100%) rename {src => apps/studio/src}/hooks/tests/use-fullscreen.test.ts (100%) rename {src => apps/studio/src}/hooks/tests/use-import-export.test.tsx (100%) rename {src => apps/studio/src}/hooks/tests/use-is-valid-wp-cli-inline.test.ts (100%) rename {src => apps/studio/src}/hooks/tests/use-site-details.test.tsx (100%) rename {src => apps/studio/src}/hooks/use-add-site.ts (96%) rename {src => apps/studio/src}/hooks/use-ai-icon.ts (94%) rename {src => apps/studio/src}/hooks/use-auth.ts (100%) rename {src => apps/studio/src}/hooks/use-confirmation-dialog.ts (100%) rename {src => apps/studio/src}/hooks/use-content-tabs.tsx (100%) rename {src => apps/studio/src}/hooks/use-delete-site.ts (100%) rename {src => apps/studio/src}/hooks/use-drag-and-drop-file.ts (100%) rename {src => apps/studio/src}/hooks/use-effective-tab.tsx (100%) rename {src => apps/studio/src}/hooks/use-execute-cli.ts (100%) rename {src => apps/studio/src}/hooks/use-expiration-date.ts (92%) rename {src => apps/studio/src}/hooks/use-feature-flags.tsx (100%) rename {src => apps/studio/src}/hooks/use-format-localized-timestamps.tsx (100%) rename {src => apps/studio/src}/hooks/use-fullscreen.ts (100%) rename {src => apps/studio/src}/hooks/use-get-wp-version.ts (100%) rename {src => apps/studio/src}/hooks/use-gravatar-url.ts (100%) rename {src => apps/studio/src}/hooks/use-import-export.tsx (100%) rename {src => apps/studio/src}/hooks/use-ipc-listener.ts (100%) rename {src => apps/studio/src}/hooks/use-is-valid-blueprint.ts (100%) rename {src => apps/studio/src}/hooks/use-is-valid-wp-cli-inline.ts (100%) rename {src => apps/studio/src}/hooks/use-localization-support.ts (100%) rename {src => apps/studio/src}/hooks/use-offline.ts (100%) rename {src => apps/studio/src}/hooks/use-progress.tsx (100%) rename {src => apps/studio/src}/hooks/use-sha256.ts (100%) rename {src => apps/studio/src}/hooks/use-sidebar-visibility.ts (100%) rename {src => apps/studio/src}/hooks/use-site-details.tsx (99%) rename {src => apps/studio/src}/hooks/use-site-size.ts (92%) rename {src => apps/studio/src}/hooks/use-sync-states-progress-info.ts (100%) rename {src => apps/studio/src}/hooks/use-theme-details.tsx (100%) rename {src => apps/studio/src}/hooks/use-window-listener.ts (100%) rename {src => apps/studio/src}/index.css (99%) rename {src => apps/studio/src}/index.ts (98%) rename {src => apps/studio/src}/ipc-handlers.ts (98%) rename {src => apps/studio/src}/ipc-types.d.ts (100%) rename {src => apps/studio/src}/ipc-utils.ts (93%) rename {src => apps/studio/src}/lib/active-sync-operations.ts (100%) rename {src => apps/studio/src}/lib/app-globals.ts (100%) rename {src => apps/studio/src}/lib/beta-features.ts (100%) rename {src => apps/studio/src}/lib/bump-stats/lib.ts (95%) rename {src => apps/studio/src}/lib/certificate-manager.ts (100%) rename {src => apps/studio/src}/lib/cx.ts (100%) rename {src => apps/studio/src}/lib/date.ts (100%) rename {src => apps/studio/src}/lib/deeplink/deeplink-handler.ts (100%) rename {src => apps/studio/src}/lib/deeplink/handlers/add-site-with-blueprint.ts (97%) rename {src => apps/studio/src}/lib/deeplink/handlers/auth.ts (100%) rename {src => apps/studio/src}/lib/deeplink/handlers/sync-connect-site.ts (100%) rename {src => apps/studio/src}/lib/deeplink/index.ts (100%) rename {src => apps/studio/src}/lib/deeplink/tests/add-site.test.ts (98%) rename {src => apps/studio/src}/lib/deeplink/tests/auth.test.ts (100%) rename {src => apps/studio/src}/lib/deeplink/tests/sync-connect-site.test.ts (100%) rename {src => apps/studio/src}/lib/download-utils.ts (99%) rename {src => apps/studio/src}/lib/download.ts (100%) rename {src => apps/studio/src}/lib/error-formatting.ts (100%) rename {src => apps/studio/src}/lib/feature-flags.ts (100%) rename {src => apps/studio/src}/lib/generate-checkout-url.ts (91%) rename {src => apps/studio/src}/lib/generate-site-name.ts (96%) rename {src => apps/studio/src}/lib/get-image-data.ts (100%) rename {src => apps/studio/src}/lib/get-ipc-api.ts (100%) rename {src => apps/studio/src}/lib/get-localized-link.ts (98%) rename {src => apps/studio/src}/lib/get-site-url.ts (100%) rename {src => apps/studio/src}/lib/get-sync-backup-temp-path.ts (100%) rename {src => apps/studio/src}/lib/hosts-file.ts (99%) rename {src => apps/studio/src}/lib/import-export/export/events.ts (100%) rename {src => apps/studio/src}/lib/import-export/export/export-database.ts (100%) rename {src => apps/studio/src}/lib/import-export/export/export-manager.ts (100%) rename {src => apps/studio/src}/lib/import-export/export/exporters/default-exporter.ts (100%) rename {src => apps/studio/src}/lib/import-export/export/exporters/index.ts (100%) rename {src => apps/studio/src}/lib/import-export/export/exporters/sql-exporter.ts (100%) rename {src => apps/studio/src}/lib/import-export/export/generate-backup-filename.ts (100%) rename {src => apps/studio/src}/lib/import-export/export/types.ts (100%) rename {src => apps/studio/src}/lib/import-export/handle-events.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/events.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/handlers/backup-handler-factory.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/handlers/backup-handler-sql.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/handlers/backup-handler-tar-gz.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/handlers/backup-handler-wpress.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/handlers/backup-handler-zip.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/import-manager.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/importers/importer.ts (99%) rename {src => apps/studio/src}/lib/import-export/import/importers/index.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/types.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/validators/index.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/validators/jetpack-validator.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/validators/local-validator.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/validators/playground-validator.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/validators/sql-validator.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/validators/validator.ts (100%) rename {src => apps/studio/src}/lib/import-export/import/validators/wpress-validator.ts (100%) rename {src => apps/studio/src}/lib/import-export/tests/export/export-manager.test.ts (100%) rename {src => apps/studio/src}/lib/import-export/tests/export/exporters/default-exporter.test.ts (100%) rename {src => apps/studio/src}/lib/import-export/tests/export/exporters/sql-exporter.test.ts (100%) rename {src => apps/studio/src}/lib/import-export/tests/import/handlers/backup-handler.test.ts (100%) rename {src => apps/studio/src}/lib/import-export/tests/import/import-manager.test.ts (100%) rename {src => apps/studio/src}/lib/import-export/tests/import/importer/jetpack-importer.test.ts (100%) rename {src => apps/studio/src}/lib/import-export/tests/import/importer/local-importer.test.ts (100%) rename {src => apps/studio/src}/lib/import-export/tests/import/importer/playground-importer.test.ts (100%) rename {src => apps/studio/src}/lib/import-export/tests/import/validators/jetpack-validator.test.ts (100%) rename {src => apps/studio/src}/lib/import-export/tests/import/validators/local-validator.test.ts (100%) rename {src => apps/studio/src}/lib/import-export/tests/import/validators/playground-validator.test.ts (100%) rename {src => apps/studio/src}/lib/import-export/tests/import/validators/sql-validator.test.ts (100%) rename {src => apps/studio/src}/lib/import-export/tests/import/validators/wpress-validator.test.ts (100%) rename {src => apps/studio/src}/lib/is-installed.ts (100%) rename {src => apps/studio/src}/lib/is-invalid-oauth-token-error.ts (100%) rename {src => apps/studio/src}/lib/is-window-frame-rtl.ts (100%) rename {src => apps/studio/src}/lib/is-wpcom-network-error.ts (100%) rename {src => apps/studio/src}/lib/locale-node.ts (95%) rename {src => apps/studio/src}/lib/oauth.ts (87%) rename {src => apps/studio/src}/lib/sanitize-for-logging.ts (100%) rename {src => apps/studio/src}/lib/sentry-release.ts (100%) rename {src => apps/studio/src}/lib/serialize-plugins.ts (100%) rename {src => apps/studio/src}/lib/server-files-paths.ts (100%) rename {src => apps/studio/src}/lib/shell-open-external-wrapper.ts (100%) rename {src => apps/studio/src}/lib/site-language.ts (98%) rename {src => apps/studio/src}/lib/sqlite-command-release.ts (100%) rename {src => apps/studio/src}/lib/sqlite-command-versions.ts (100%) rename {src => apps/studio/src}/lib/sqlite-versions.ts (82%) rename {src => apps/studio/src}/lib/sudo-exec.ts (100%) rename {src => apps/studio/src}/lib/test-utils.tsx (100%) rename {src => apps/studio/src}/lib/tests/bump-stats.test.ts (98%) rename {src => apps/studio/src}/lib/tests/generate-site-name.test.ts (100%) rename {src => apps/studio/src}/lib/tests/get-localized-link.test.ts (100%) rename {src => apps/studio/src}/lib/tests/get-site-url.test.ts (100%) rename {src => apps/studio/src}/lib/tests/hosts-file.test.ts (100%) rename {src => apps/studio/src}/lib/tests/is-installed.test.ts (100%) rename {src => apps/studio/src}/lib/tests/is-invalid-oauth-token-error.test.ts (100%) rename {src => apps/studio/src}/lib/tests/locale.test.ts (97%) rename {src => apps/studio/src}/lib/tests/oauth.test.ts (98%) rename {src => apps/studio/src}/lib/tests/sanitize-for-logging.test.ts (100%) rename {src => apps/studio/src}/lib/tests/serialize-plugins.test.ts (100%) rename {src => apps/studio/src}/lib/tests/site-language.test.ts (100%) rename {src => apps/studio/src}/lib/tests/url-utils.test.ts (100%) rename {src => apps/studio/src}/lib/tests/windows-helpers.test.ts (100%) rename {src => apps/studio/src}/lib/update-site-url.ts (100%) rename {src => apps/studio/src}/lib/url-utils.ts (100%) rename {src => apps/studio/src}/lib/user-data-watcher.ts (100%) rename {src => apps/studio/src}/lib/version-utils.ts (100%) rename {src => apps/studio/src}/lib/windows-helpers.ts (100%) rename {src => apps/studio/src}/lib/wordpress-server-types.ts (100%) rename {src => apps/studio/src}/lib/wordpress-setup.ts (89%) rename {src => apps/studio/src}/lib/wp-versions.ts (97%) rename {src => apps/studio/src}/lib/wpcom-factory.ts (100%) rename {src => apps/studio/src}/lib/wpcom-xhr-request-factory.ts (100%) rename {src => apps/studio/src}/logging.ts (100%) rename {src => apps/studio/src}/main-window.ts (99%) rename {src => apps/studio/src}/menu.ts (100%) rename {src => apps/studio/src}/migrations/migrate-from-wp-now-folder.ts (92%) rename {src => apps/studio/src}/migrations/remove-sites-with-empty-dirs.ts (92%) rename {src => apps/studio/src}/migrations/rename-launch-uniques-stat.ts (91%) rename {src => apps/studio/src}/modules/add-site/components/blueprint-deeplink.tsx (96%) rename {src => apps/studio/src}/modules/add-site/components/blueprint-icon.tsx (100%) rename {src => apps/studio/src}/modules/add-site/components/blueprint-warning-notice.tsx (97%) rename {src => apps/studio/src}/modules/add-site/components/blueprints.css (100%) rename {src => apps/studio/src}/modules/add-site/components/blueprints.tsx (100%) rename {src => apps/studio/src}/modules/add-site/components/create-site-form.tsx (98%) rename {src => apps/studio/src}/modules/add-site/components/create-site.tsx (95%) rename {src => apps/studio/src}/modules/add-site/components/import-backup.tsx (100%) rename {src => apps/studio/src}/modules/add-site/components/index.ts (100%) rename {src => apps/studio/src}/modules/add-site/components/options.tsx (100%) rename {src => apps/studio/src}/modules/add-site/components/pull-remote-site.tsx (100%) rename {src => apps/studio/src}/modules/add-site/components/stepper.tsx (100%) rename {src => apps/studio/src}/modules/add-site/hooks/tests/use-blueprint-deeplink.test.tsx (100%) rename {src => apps/studio/src}/modules/add-site/hooks/tests/use-find-available-site-name.test.ts (100%) rename {src => apps/studio/src}/modules/add-site/hooks/use-blueprint-deeplink.ts (95%) rename {src => apps/studio/src}/modules/add-site/hooks/use-find-available-site-name.ts (100%) rename {src => apps/studio/src}/modules/add-site/hooks/use-stepper.ts (100%) rename {src => apps/studio/src}/modules/add-site/index.tsx (97%) rename {src => apps/studio/src}/modules/add-site/tests/add-site.test.tsx (100%) rename {src => apps/studio/src}/modules/cli/lib/cli-events-subscriber.ts (96%) rename {src => apps/studio/src}/modules/cli/lib/cli-server-process.ts (97%) rename {src => apps/studio/src}/modules/cli/lib/cli-site-creator.ts (96%) rename {src => apps/studio/src}/modules/cli/lib/cli-site-editor.ts (96%) rename {src => apps/studio/src}/modules/cli/lib/execute-command.ts (100%) rename {src => apps/studio/src}/modules/cli/lib/execute-preview-command.ts (96%) rename {src => apps/studio/src}/modules/cli/lib/ipc-handlers.ts (100%) rename {src => apps/studio/src}/modules/cli/lib/macos-installation-manager.ts (98%) rename {src => apps/studio/src}/modules/cli/lib/windows-installation-manager.ts (100%) rename {src => apps/studio/src}/modules/onboarding/components/connect-to-wpcom.tsx (100%) rename {src => apps/studio/src}/modules/onboarding/hooks/use-onboarding.tsx (100%) rename {src => apps/studio/src}/modules/onboarding/index.tsx (100%) rename {src => apps/studio/src}/modules/preview-site/components/create-preview-button.tsx (98%) rename {src => apps/studio/src}/modules/preview-site/components/delete-progress-row.tsx (100%) rename {src => apps/studio/src}/modules/preview-site/components/preview-action-buttons-menu.tsx (98%) rename {src => apps/studio/src}/modules/preview-site/components/preview-site-row.tsx (99%) rename {src => apps/studio/src}/modules/preview-site/components/preview-sites-table-header.tsx (100%) rename {src => apps/studio/src}/modules/preview-site/components/progress-row.tsx (100%) rename {src => apps/studio/src}/modules/preview-site/components/rename-preview-modal.tsx (100%) rename {src => apps/studio/src}/modules/preview-site/components/tests/preview-action-buttons-menu.test.tsx (98%) rename {src => apps/studio/src}/modules/preview-site/components/tests/preview-site-row.test.tsx (100%) rename {src => apps/studio/src}/modules/preview-site/components/tests/rename-preview-modal.test.tsx (100%) rename {src => apps/studio/src}/modules/preview-site/hooks/use-update-button-tooltip.ts (94%) rename {src => apps/studio/src}/modules/preview-site/lib/ipc-handlers.ts (100%) rename {src => apps/studio/src}/modules/preview-site/lib/tests/version-comparison.test.ts (93%) rename {src => apps/studio/src}/modules/preview-site/lib/version-comparison.ts (89%) rename {src => apps/studio/src}/modules/site-settings/edit-site-details.tsx (98%) rename {src => apps/studio/src}/modules/site-settings/tests/edit-site-details.test.tsx (100%) rename {src => apps/studio/src}/modules/sync/components/connect-button.tsx (100%) rename {src => apps/studio/src}/modules/sync/components/create-button.tsx (100%) rename {src => apps/studio/src}/modules/sync/components/environment-badge.tsx (100%) rename {src => apps/studio/src}/modules/sync/components/no-wpcom-sites-content.tsx (100%) rename {src => apps/studio/src}/modules/sync/components/no-wpcom-sites-modal.tsx (100%) rename {src => apps/studio/src}/modules/sync/components/site-name-box.tsx (100%) rename {src => apps/studio/src}/modules/sync/components/sync-connected-sites.tsx (100%) rename {src => apps/studio/src}/modules/sync/components/sync-dialog.tsx (100%) rename {src => apps/studio/src}/modules/sync/components/sync-sites-modal-selector.tsx (100%) rename {src => apps/studio/src}/modules/sync/components/sync-tab-image.tsx (100%) rename {src => apps/studio/src}/modules/sync/components/tree-view-loading-skeleton.tsx (100%) rename {src => apps/studio/src}/modules/sync/constants.ts (100%) rename {src => apps/studio/src}/modules/sync/hooks/use-selected-items-push-size.ts (100%) rename {src => apps/studio/src}/modules/sync/hooks/use-sync-dialog-texts.tsx (100%) rename {src => apps/studio/src}/modules/sync/hooks/use-top-level-sync-tree.tsx (100%) rename {src => apps/studio/src}/modules/sync/index.tsx (100%) rename {src => apps/studio/src}/modules/sync/lib/convert-tree-to-sync-options.ts (100%) rename {src => apps/studio/src}/modules/sync/lib/environment-utils.ts (100%) rename {src => apps/studio/src}/modules/sync/lib/ipc-handlers.ts (99%) rename {src => apps/studio/src}/modules/sync/lib/reconcile-connected-sites.tsx (100%) rename {src => apps/studio/src}/modules/sync/lib/sync-support.ts (100%) rename {src => apps/studio/src}/modules/sync/lib/tree-utils.ts (100%) rename {src => apps/studio/src}/modules/sync/tests/convert-tree-to-options-to-sync.tsx (100%) rename {src => apps/studio/src}/modules/sync/tests/environment-badge.test.tsx (100%) rename {src => apps/studio/src}/modules/sync/tests/index.test.tsx (100%) rename {src => apps/studio/src}/modules/sync/tests/use-selected-items-push-size.test.ts (100%) rename {src => apps/studio/src}/modules/sync/types.ts (100%) rename {src => apps/studio/src}/modules/user-settings/components/account-tab.tsx (100%) rename {src => apps/studio/src}/modules/user-settings/components/editor-picker.tsx (100%) rename {src => apps/studio/src}/modules/user-settings/components/language-picker.tsx (90%) rename {src => apps/studio/src}/modules/user-settings/components/non-authenticated-account-tab.tsx (100%) rename {src => apps/studio/src}/modules/user-settings/components/preferences-tab.tsx (98%) rename {src => apps/studio/src}/modules/user-settings/components/prompt-info.tsx (100%) rename {src => apps/studio/src}/modules/user-settings/components/settings-form-field.tsx (100%) rename {src => apps/studio/src}/modules/user-settings/components/snapshot-info.tsx (100%) rename {src => apps/studio/src}/modules/user-settings/components/studio-cli-toggle.tsx (100%) rename {src => apps/studio/src}/modules/user-settings/components/terminal-picker.tsx (100%) rename {src => apps/studio/src}/modules/user-settings/components/tests/terminal-picker.test.tsx (100%) rename {src => apps/studio/src}/modules/user-settings/components/tests/user-settings.test.tsx (100%) rename {src => apps/studio/src}/modules/user-settings/components/usage-tab.tsx (100%) rename {src => apps/studio/src}/modules/user-settings/components/user-settings.tsx (100%) rename {src => apps/studio/src}/modules/user-settings/index.ts (100%) rename {src => apps/studio/src}/modules/user-settings/lib/editor.ts (100%) rename {src => apps/studio/src}/modules/user-settings/lib/ipc-handlers.ts (100%) rename {src => apps/studio/src}/modules/user-settings/lib/terminal.ts (100%) rename {src => apps/studio/src}/modules/user-settings/lib/win-editor-path.ts (95%) rename {src => apps/studio/src}/modules/user-settings/user-settings-types.ts (100%) rename {src => apps/studio/src}/modules/whats-new/assets/blueprints-illustration.svg (100%) rename {src => apps/studio/src}/modules/whats-new/assets/cli-illustration.svg (100%) rename {src => apps/studio/src}/modules/whats-new/assets/pressable-sync-illustration.svg (100%) rename {src => apps/studio/src}/modules/whats-new/assets/selective-sync-illustration.svg (100%) rename {src => apps/studio/src}/modules/whats-new/assets/studio-illustration.svg (100%) rename {src => apps/studio/src}/modules/whats-new/components/whats-new-modal.tsx (100%) rename {src => apps/studio/src}/modules/whats-new/hooks/use-last-seen-version.tsx (100%) rename {src => apps/studio/src}/modules/whats-new/hooks/use-whats-new.tsx (100%) rename {src => apps/studio/src}/modules/whats-new/index.ts (100%) rename {src => apps/studio/src}/preload.ts (100%) rename {src => apps/studio/src}/renderer.ts (100%) rename {src => apps/studio/src}/screenshot-window.ts (100%) rename {src => apps/studio/src}/setup-wp-server-files.ts (98%) rename {src => apps/studio/src}/site-server.ts (99%) rename {src => apps/studio/src}/storage/paths.ts (98%) rename {src => apps/studio/src}/storage/storage-types.ts (96%) rename {src => apps/studio/src}/storage/tests/user-data.test.ts (100%) rename {src => apps/studio/src}/storage/user-data.ts (94%) rename {src => apps/studio/src}/stores/app-version-api.ts (100%) rename {src => apps/studio/src}/stores/beta-features-slice.ts (100%) rename {src => apps/studio/src}/stores/certificate-trust-api.ts (100%) rename {src => apps/studio/src}/stores/chat-slice.ts (99%) rename {src => apps/studio/src}/stores/format-rtk-error.tsx (100%) rename {src => apps/studio/src}/stores/i18n-slice.ts (98%) rename {src => apps/studio/src}/stores/index.ts (98%) rename {src => apps/studio/src}/stores/installed-apps-api.ts (100%) rename {src => apps/studio/src}/stores/onboarding-slice.ts (100%) rename {src => apps/studio/src}/stores/provider-constants-slice.ts (92%) rename {src => apps/studio/src}/stores/snapshot-slice.ts (99%) rename {src => apps/studio/src}/stores/sync/connected-sites.ts (100%) rename {src => apps/studio/src}/stores/sync/index.ts (100%) rename {src => apps/studio/src}/stores/sync/sync-api.ts (100%) rename {src => apps/studio/src}/stores/sync/sync-hooks.ts (100%) rename {src => apps/studio/src}/stores/sync/sync-slice.ts (100%) rename {src => apps/studio/src}/stores/sync/sync-types.ts (100%) rename {src => apps/studio/src}/stores/sync/wpcom-sites.ts (100%) rename {src => apps/studio/src}/stores/tests/app-version-api.test.ts (100%) rename {src => apps/studio/src}/stores/tests/chat-slice.test.ts (100%) rename {src => apps/studio/src}/stores/tests/installed-apps-api.test.ts (100%) rename {src => apps/studio/src}/stores/tests/onboarding-slice.test.ts (100%) rename {src => apps/studio/src}/stores/tests/snapshot-slice.test.ts (97%) rename {src => apps/studio/src}/stores/tests/utils/test-reducer.ts (100%) rename {src => apps/studio/src}/stores/tests/wordpress-versions-api.test.ts (100%) rename {src => apps/studio/src}/stores/ui-slice.ts (100%) rename {src => apps/studio/src}/stores/utils/with-offline-check.ts (100%) rename {src => apps/studio/src}/stores/wordpress-versions-api.ts (97%) rename {src => apps/studio/src}/stores/wpcom-api.ts (99%) rename {src => apps/studio/src}/tests/execute-wp-cli.test.ts (100%) rename {src => apps/studio/src}/tests/index.test.ts (99%) rename {src => apps/studio/src}/tests/ipc-handlers.test.ts (97%) rename {src => apps/studio/src}/tests/main-window.test.ts (100%) rename {src => apps/studio/src}/tests/show-site-context-menu.test.ts (100%) rename {src => apps/studio/src}/tests/site-server.test.ts (98%) rename {src => apps/studio/src}/tests/utils/platform-test-suite.ts (100%) rename {src => apps/studio/src}/tests/utils/style-mock.js (100%) rename {src => apps/studio/src}/types.ts (100%) rename {src => apps/studio/src}/updates.ts (100%) rename {src => apps/studio/src}/utility-types.d.ts (100%) rename tailwind.config.js => apps/studio/tailwind.config.js (97%) create mode 100644 apps/studio/tsconfig.json delete mode 100644 cli/__mocks__/pm2.ts delete mode 100644 cli/package-lock.json delete mode 100644 cli/package.json delete mode 100644 cli/patches/@wp-playground+wordpress+3.0.46.patch delete mode 100644 common/translations/index.ts rename {cli/patches => patches}/pm2+6.0.14.patch (100%) rename {cli/patches => patches}/ps-man+1.1.8.patch (100%) delete mode 100644 postcss.config.js delete mode 100644 scripts/compare-perf/package-lock.json rename {common => tools/common}/constants.ts (100%) rename {common => tools/common}/lib/blueprint-settings.ts (100%) rename {common => tools/common}/lib/blueprint-validation.ts (100%) rename {common => tools/common}/lib/bump-stat.ts (97%) rename {common => tools/common}/lib/cache-function-ttl.ts (100%) rename {common => tools/common}/lib/cli-error.ts (100%) rename {common => tools/common}/lib/domains.ts (94%) rename {common => tools/common}/lib/escape-regex.ts (100%) rename {common => tools/common}/lib/extract-zip.ts (100%) rename {common => tools/common}/lib/fs-utils.ts (100%) rename {common => tools/common}/lib/get-wordpress-version.ts (100%) rename {common => tools/common}/lib/is-errno-exception.ts (100%) rename {common => tools/common}/lib/locale.ts (94%) rename {common => tools/common}/lib/lockfile.ts (100%) rename {common => tools/common}/lib/mu-plugins.ts (100%) rename {common => tools/common}/lib/network-utils.ts (100%) rename {common => tools/common}/lib/oauth.ts (79%) rename {common => tools/common}/lib/passwords.ts (100%) rename {common => tools/common}/lib/playground-cli-messages.ts (100%) rename {common => tools/common}/lib/port-finder.ts (100%) rename {common => tools/common}/lib/sanitize-folder-name.ts (100%) rename {common => tools/common}/lib/sequential.ts (100%) rename {common => tools/common}/lib/site-events.ts (100%) rename {common => tools/common}/lib/site-needs-restart.ts (100%) rename {common => tools/common}/lib/sort-sites.ts (100%) rename {common => tools/common}/lib/sqlite-integration.ts (100%) rename {common => tools/common}/lib/suppress-punycode-warning.ts (100%) rename {common => tools/common}/lib/tests/blueprint-settings.test.ts (100%) rename {common => tools/common}/lib/tests/blueprint-validation.test.ts (100%) rename {common => tools/common}/lib/tests/cache-function-ttl.test.ts (99%) rename {common => tools/common}/lib/tests/oauth.test.ts (100%) rename {common => tools/common}/lib/tests/passwords.test.ts (89%) rename {common => tools/common}/lib/tests/site-needs-restart.test.ts (100%) rename {common => tools/common}/lib/tests/sort-sites.test.ts (89%) rename {common => tools/common}/lib/tests/sqlite-integration.test.ts (98%) rename {common => tools/common}/lib/tests/wordpress-version-utils.test.ts (100%) rename {common => tools/common}/lib/wordpress-version-utils.ts (100%) rename {common => tools/common}/logger-actions.ts (100%) create mode 100644 tools/common/package.json create mode 100644 tools/common/translations/index.ts rename {common => tools/common}/translations/studio-ar.jed.json (100%) rename {common => tools/common}/translations/studio-de.jed.json (100%) rename {common => tools/common}/translations/studio-es.jed.json (100%) rename {common => tools/common}/translations/studio-fr.jed.json (100%) rename {common => tools/common}/translations/studio-he.jed.json (100%) rename {common => tools/common}/translations/studio-id.jed.json (100%) rename {common => tools/common}/translations/studio-it.jed.json (100%) rename {common => tools/common}/translations/studio-ja.jed.json (100%) rename {common => tools/common}/translations/studio-ko.jed.json (100%) rename {common => tools/common}/translations/studio-nl.jed.json (100%) rename {common => tools/common}/translations/studio-pl.jed.json (100%) rename {common => tools/common}/translations/studio-pt-br.jed.json (100%) rename {common => tools/common}/translations/studio-ru.jed.json (100%) rename {common => tools/common}/translations/studio-sv.jed.json (100%) rename {common => tools/common}/translations/studio-tr.jed.json (100%) rename {common => tools/common}/translations/studio-uk.jed.json (100%) rename {common => tools/common}/translations/studio-vi.jed.json (100%) rename {common => tools/common}/translations/studio-zh-cn.jed.json (100%) rename {common => tools/common}/translations/studio-zh-tw.jed.json (100%) create mode 100644 tools/common/tsconfig.json rename {common => tools/common}/types/php-versions.ts (100%) rename {common => tools/common}/types/snapshot.ts (100%) rename {common => tools/common}/types/stats.ts (100%) rename {scripts => tools}/compare-perf/config.ts (84%) rename {scripts => tools}/compare-perf/index.ts (100%) rename {scripts => tools}/compare-perf/log-to-codevitals.ts (100%) rename {scripts => tools}/compare-perf/package.json (97%) rename {scripts => tools}/compare-perf/performance.ts (100%) rename {scripts => tools}/compare-perf/post-to-github.ts (100%) rename {scripts => tools}/compare-perf/tsconfig.json (100%) rename {scripts => tools}/compare-perf/utils.ts (100%) rename {packages => tools}/eslint-plugin-studio/package.json (100%) rename {packages => tools}/eslint-plugin-studio/src/index.js (100%) rename {packages => tools}/eslint-plugin-studio/src/rules/require-lock-before-save.js (100%) rename {packages => tools}/eslint-plugin-studio/tests/require-lock-before-save.test.ts (100%) rename {metrics => tools/metrics}/README.md (91%) rename {metrics => tools/metrics}/performance-reporter.ts (100%) rename {metrics => tools/metrics}/playwright.metrics.config.ts (100%) rename {metrics => tools/metrics}/tests/site-editor.test.ts (100%) rename {metrics => tools/metrics}/tests/site-startup.test.ts (100%) rename {metrics => tools/metrics}/utils.ts (100%) create mode 100644 tsconfig.base.json diff --git a/.buildkite/commands/build-for-windows.ps1 b/.buildkite/commands/build-for-windows.ps1 index 1bede06d4b..44f7a264b1 100644 --- a/.buildkite/commands/build-for-windows.ps1 +++ b/.buildkite/commands/build-for-windows.ps1 @@ -54,7 +54,7 @@ if ($BuildType -eq $BUILD_TYPE_DEV) { $env:FILE_ARCHITECTURE=$Architecture Write-Host "Building for architecture: $Architecture" -npm run "make:windows-$Architecture" +npm -w studio-app run "make:windows-$Architecture" If ($LastExitCode -ne 0) { Exit $LastExitCode } # Rename NuGet package files with generic name diff --git a/.buildkite/commands/install-node-dependencies.sh b/.buildkite/commands/install-node-dependencies.sh index 0359e4617f..e62a07099f 100755 --- a/.buildkite/commands/install-node-dependencies.sh +++ b/.buildkite/commands/install-node-dependencies.sh @@ -44,14 +44,6 @@ npm ci \ --maxsockets "$MAX_SOCKETS" \ "$@" -cd cli -npm ci \ - --prefer-offline \ - --no-audit \ - --no-progress \ - --maxsockets "$MAX_SOCKETS" -cd - - echo "--- :npm: Save cache if necessary" # Notice that we don't cache the local node_modules. # Those get regenerated by npm ci as per Node reccomendations. diff --git a/.buildkite/commands/run-e2e-tests.sh b/.buildkite/commands/run-e2e-tests.sh index 5355662ece..38b626683e 100644 --- a/.buildkite/commands/run-e2e-tests.sh +++ b/.buildkite/commands/run-e2e-tests.sh @@ -31,8 +31,7 @@ esac # `make` creates signed distributables (installers), which requires code signing setup. # `package` creates an unsigned app bundle, sufficient for E2E testing. echo "--- :package: Package app for testing ($PLATFORM-$ARCH)" -npx electron-vite build --outDir=dist -npx electron-forge package --arch="$ARCH" --platform="$FORGE_PLATFORM" +npm -w studio-app run package -- --arch="$ARCH" --platform="$FORGE_PLATFORM" echo '--- :playwright: Run End To End Tests' diff --git a/.buildkite/commands/run-metrics-tests.sh b/.buildkite/commands/run-metrics-tests.sh index 72dae7c6c1..f11eec8641 100755 --- a/.buildkite/commands/run-metrics-tests.sh +++ b/.buildkite/commands/run-metrics-tests.sh @@ -9,38 +9,32 @@ echo '--- :package: Install main dependencies' bash .buildkite/commands/install-node-dependencies.sh echo '--- :package: Install compare-perf dependencies' -cd scripts/compare-perf -npm ci -cd - +npm -w compare-perf install export IS_DEV_BUILD=true -export ARTIFACTS_PATH=${PWD}/artifacts +export ARTIFACTS_PATH=${PWD}/tools/metrics/artifacts export SKIP_WORKER_THREAD_BUILD='true' # Detect if this is a PR or trunk push if [ "${BUILDKITE_PULL_REQUEST}" != "false" ]; then # PR context - compare against trunk echo "--- :chart_with_upwards_trend: Running performance comparison against trunk" - cd scripts/compare-perf - npm run compare -- perf $BUILDKITE_COMMIT trunk --tests-branch $BUILDKITE_COMMIT --rounds 3 + npm -w compare-perf run compare -- perf $BUILDKITE_COMMIT trunk --tests-branch $BUILDKITE_COMMIT --rounds 3 echo "--- :github: Posting results to PR" # Parse repo from git@github.com:owner/repo.git or https://github.com/owner/repo.git format REPO_PATH=$(echo $BUILDKITE_REPO | sed 's|^git@github\.com:||' | sed 's|^https://github\.com/||' | sed 's|\.git$||') - npm run post-to-github -- $GITHUB_TOKEN $REPO_PATH $BUILDKITE_PULL_REQUEST trunk $BUILDKITE_COMMIT - cd - + npm -w compare-perf run post-to-github -- $GITHUB_TOKEN $REPO_PATH $BUILDKITE_PULL_REQUEST trunk $BUILDKITE_COMMIT elif [ "${BUILDKITE_BRANCH}" == "trunk" ]; then # Trunk push context - compare against baseline BASELINE_COMMIT="58c52bfee7e585614ced202f43f217a01f94f029" echo "--- :chart_with_upwards_trend: Running performance comparison against baseline" - cd scripts/compare-perf - npm run compare -- perf $BUILDKITE_COMMIT $BASELINE_COMMIT --tests-branch $BUILDKITE_COMMIT --rounds 3 + npm -w compare-perf run compare -- perf $BUILDKITE_COMMIT $BASELINE_COMMIT --tests-branch $BUILDKITE_COMMIT --rounds 3 echo "--- :bar_chart: Logging metrics to CodeVitals" COMMITTED_AT=$(git show -s $BUILDKITE_COMMIT --format="%cI") - npm run log-to-codevitals -- $CODEVITALS_AUTH_TOKEN trunk $BUILDKITE_COMMIT $BASELINE_COMMIT $COMMITTED_AT - cd - + npm -w compare-perf run log-to-codevitals -- $CODEVITALS_AUTH_TOKEN trunk $BUILDKITE_COMMIT $BASELINE_COMMIT $COMMITTED_AT else # Other branches - skip metrics echo "--- :information_source: Skipping metrics for non-trunk branch" diff --git a/.buildkite/commands/should-skip-job.sh b/.buildkite/commands/should-skip-job.sh index a81a09d50a..c2fcb47a4e 100755 --- a/.buildkite/commands/should-skip-job.sh +++ b/.buildkite/commands/should-skip-job.sh @@ -10,7 +10,7 @@ set -eu # Job types: # - validation: Skip if changes are limited to documentation, config, localization, and non-code files. # Used for lint, unit tests, and e2e tests. -# - metrics: Same as validation, but also skips on test-only changes (e2e/**, *.test.ts). +# - metrics: Same as validation, but also skips on test-only changes (apps/studio/e2e/**, *.test.ts). # Since metrics measure app performance, test file changes don't affect them. # - build: Skip if changes are limited to documentation and config files. # Does NOT skip on localization changes since builds should include translation updates. @@ -53,7 +53,7 @@ COMMON_NON_CODE_PATTERNS=( # Installer assets and configuration "installers/**" - "assets/appx/**" + "apps/studio/assets/appx/**" # Claude AI configuration ".claude/**" @@ -62,17 +62,17 @@ COMMON_NON_CODE_PATTERNS=( # Localization files - changes here don't affect runtime behavior or performance LOCALIZATION_PATTERNS=( - "common/translations/**" + "tools/common/translations/**" ) # Test files - changes here don't affect app performance (for metrics) TEST_PATTERNS=( - "e2e/**" - "src/tests/**" - "src/**/*.test.ts" - "src/**/*.test.tsx" - "cli/**/*.test.ts" - "common/**/*.test.ts" + "apps/studio/e2e/**" + "apps/studio/src/tests/**" + "apps/studio/src/**/*.test.ts" + "apps/studio/src/**/*.test.tsx" + "apps/cli/**/*.test.ts" + "tools/common/**/*.test.ts" "metrics/**" ) diff --git a/.gitignore b/.gitignore index 5905471891..a1aff37cc3 100644 --- a/.gitignore +++ b/.gitignore @@ -126,5 +126,5 @@ artifacts CLAUDE.md # Bundled Node binary (downloaded during build) -bin/node -bin/node.exe +apps/studio/bin/node +apps/studio/bin/node.exe diff --git a/cli/__mocks__/cli-table3.ts b/apps/cli/__mocks__/cli-table3.ts similarity index 100% rename from cli/__mocks__/cli-table3.ts rename to apps/cli/__mocks__/cli-table3.ts diff --git a/__mocks__/cli/lib/pm2-manager.ts b/apps/cli/__mocks__/lib/pm2-manager.ts similarity index 100% rename from __mocks__/cli/lib/pm2-manager.ts rename to apps/cli/__mocks__/lib/pm2-manager.ts diff --git a/cli/__mocks__/pm2-axon.ts b/apps/cli/__mocks__/pm2-axon.ts similarity index 100% rename from cli/__mocks__/pm2-axon.ts rename to apps/cli/__mocks__/pm2-axon.ts diff --git a/__mocks__/pm2.ts b/apps/cli/__mocks__/pm2.ts similarity index 100% rename from __mocks__/pm2.ts rename to apps/cli/__mocks__/pm2.ts diff --git a/cli/commands/_events.ts b/apps/cli/commands/_events.ts similarity index 95% rename from cli/commands/_events.ts rename to apps/cli/commands/_events.ts index c9a060c081..93cffcbc05 100644 --- a/cli/commands/_events.ts +++ b/apps/cli/commands/_events.ts @@ -8,9 +8,9 @@ */ import fs from 'fs'; import { __ } from '@wordpress/i18n'; -import { sequential } from 'common/lib/sequential'; -import { SITE_EVENTS, siteDetailsSchema, SiteEvent } from 'common/lib/site-events'; -import { SiteCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +import { sequential } from '@studio/common/lib/sequential'; +import { SITE_EVENTS, siteDetailsSchema, SiteEvent } from '@studio/common/lib/site-events'; +import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import axon from 'pm2-axon'; import { z } from 'zod'; import { getSiteUrl, readAppdata, SiteData } from 'cli/lib/appdata'; diff --git a/cli/commands/auth/login.ts b/apps/cli/commands/auth/login.ts similarity index 92% rename from cli/commands/auth/login.ts rename to apps/cli/commands/auth/login.ts index e94f84f0c6..f7e085fd1c 100644 --- a/cli/commands/auth/login.ts +++ b/apps/cli/commands/auth/login.ts @@ -1,8 +1,8 @@ import { input } from '@inquirer/prompts'; import { __, sprintf } from '@wordpress/i18n'; -import { DEFAULT_TOKEN_LIFETIME_MS } from 'common/constants'; -import { getAuthenticationUrl } from 'common/lib/oauth'; -import { AuthCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +import { DEFAULT_TOKEN_LIFETIME_MS } from '@studio/common/constants'; +import { getAuthenticationUrl } from '@studio/common/lib/oauth'; +import { AuthCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { getUserInfo } from 'cli/lib/api'; import { getAuthToken, diff --git a/cli/commands/auth/logout.ts b/apps/cli/commands/auth/logout.ts similarity index 94% rename from cli/commands/auth/logout.ts rename to apps/cli/commands/auth/logout.ts index 2659b04f66..fc05240695 100644 --- a/cli/commands/auth/logout.ts +++ b/apps/cli/commands/auth/logout.ts @@ -1,5 +1,5 @@ import { __ } from '@wordpress/i18n'; -import { AuthCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +import { AuthCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { revokeAuthToken } from 'cli/lib/api'; import { readAppdata, diff --git a/cli/commands/auth/status.ts b/apps/cli/commands/auth/status.ts similarity index 93% rename from cli/commands/auth/status.ts rename to apps/cli/commands/auth/status.ts index f108f85cb0..24ffca44e6 100644 --- a/cli/commands/auth/status.ts +++ b/apps/cli/commands/auth/status.ts @@ -1,5 +1,5 @@ import { __, sprintf } from '@wordpress/i18n'; -import { AuthCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +import { AuthCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { getUserInfo } from 'cli/lib/api'; import { getAuthToken } from 'cli/lib/appdata'; import { Logger, LoggerError } from 'cli/logger'; diff --git a/cli/commands/auth/tests/login.test.ts b/apps/cli/commands/auth/tests/login.test.ts similarity index 98% rename from cli/commands/auth/tests/login.test.ts rename to apps/cli/commands/auth/tests/login.test.ts index e673f216ac..1497a0c5c0 100644 --- a/cli/commands/auth/tests/login.test.ts +++ b/apps/cli/commands/auth/tests/login.test.ts @@ -1,5 +1,5 @@ import { input } from '@inquirer/prompts'; -import { getAuthenticationUrl } from 'common/lib/oauth'; +import { getAuthenticationUrl } from '@studio/common/lib/oauth'; import { vi } from 'vitest'; import { getUserInfo } from 'cli/lib/api'; import { @@ -23,7 +23,7 @@ import { import { runCommand } from '../login'; vi.mock( '@inquirer/prompts' ); -vi.mock( 'common/lib/oauth' ); +vi.mock( '@studio/common/lib/oauth' ); vi.mock( 'cli/lib/api' ); vi.mock( 'cli/lib/appdata' ); vi.mock( 'cli/lib/browser' ); diff --git a/cli/commands/auth/tests/logout.test.ts b/apps/cli/commands/auth/tests/logout.test.ts similarity index 100% rename from cli/commands/auth/tests/logout.test.ts rename to apps/cli/commands/auth/tests/logout.test.ts diff --git a/cli/commands/auth/tests/status.test.ts b/apps/cli/commands/auth/tests/status.test.ts similarity index 100% rename from cli/commands/auth/tests/status.test.ts rename to apps/cli/commands/auth/tests/status.test.ts diff --git a/cli/commands/preview/create.ts b/apps/cli/commands/preview/create.ts similarity index 93% rename from cli/commands/preview/create.ts rename to apps/cli/commands/preview/create.ts index 201db946b2..1c3e5342d2 100644 --- a/cli/commands/preview/create.ts +++ b/apps/cli/commands/preview/create.ts @@ -1,8 +1,8 @@ import os from 'os'; import path from 'path'; import { __, sprintf } from '@wordpress/i18n'; -import { getWordPressVersion } from 'common/lib/get-wordpress-version'; -import { PreviewCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +import { getWordPressVersion } from '@studio/common/lib/get-wordpress-version'; +import { PreviewCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { uploadArchive, waitForSiteReady } from 'cli/lib/api'; import { getAuthToken, getSiteByFolder } from 'cli/lib/appdata'; import { archiveSiteContent, cleanup } from 'cli/lib/archive'; diff --git a/cli/commands/preview/delete.ts b/apps/cli/commands/preview/delete.ts similarity index 95% rename from cli/commands/preview/delete.ts rename to apps/cli/commands/preview/delete.ts index 529da34f6b..3b5a3e368e 100644 --- a/cli/commands/preview/delete.ts +++ b/apps/cli/commands/preview/delete.ts @@ -1,5 +1,5 @@ import { __ } from '@wordpress/i18n'; -import { PreviewCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +import { PreviewCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { deleteSnapshot } from 'cli/lib/api'; import { getAuthToken } from 'cli/lib/appdata'; import { deleteSnapshotFromAppdata, getSnapshotsFromAppdata } from 'cli/lib/snapshots'; diff --git a/cli/commands/preview/list.ts b/apps/cli/commands/preview/list.ts similarity index 97% rename from cli/commands/preview/list.ts rename to apps/cli/commands/preview/list.ts index 57bd9b1760..32454c7529 100644 --- a/cli/commands/preview/list.ts +++ b/apps/cli/commands/preview/list.ts @@ -1,6 +1,6 @@ import { __, _n, sprintf } from '@wordpress/i18n'; import Table from 'cli-table3'; -import { PreviewCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +import { PreviewCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { format } from 'date-fns'; import { getAuthToken, getSiteByFolder } from 'cli/lib/appdata'; import { diff --git a/cli/commands/preview/tests/create.test.ts b/apps/cli/commands/preview/tests/create.test.ts similarity index 98% rename from cli/commands/preview/tests/create.test.ts rename to apps/cli/commands/preview/tests/create.test.ts index 11b4518b76..ca73a7c280 100644 --- a/cli/commands/preview/tests/create.test.ts +++ b/apps/cli/commands/preview/tests/create.test.ts @@ -1,6 +1,6 @@ import os from 'os'; import path from 'path'; -import { getWordPressVersion } from 'common/lib/get-wordpress-version'; +import { getWordPressVersion } from '@studio/common/lib/get-wordpress-version'; import { vi } from 'vitest'; import { uploadArchive, waitForSiteReady } from 'cli/lib/api'; import { getAuthToken, getSiteByFolder } from 'cli/lib/appdata'; @@ -17,7 +17,7 @@ const mockReportProgress = vi.fn(); const mockReportWarning = vi.fn(); const mockReportKeyValuePair = vi.fn(); -vi.mock( 'common/lib/get-wordpress-version' ); +vi.mock( '@studio/common/lib/get-wordpress-version' ); vi.mock( 'cli/lib/appdata', async () => ( { ...( await vi.importActual( 'cli/lib/appdata' ) ), getAppdataDirectory: vi.fn().mockReturnValue( '/test/appdata' ), diff --git a/cli/commands/preview/tests/delete.test.ts b/apps/cli/commands/preview/tests/delete.test.ts similarity index 100% rename from cli/commands/preview/tests/delete.test.ts rename to apps/cli/commands/preview/tests/delete.test.ts diff --git a/cli/commands/preview/tests/list.test.ts b/apps/cli/commands/preview/tests/list.test.ts similarity index 100% rename from cli/commands/preview/tests/list.test.ts rename to apps/cli/commands/preview/tests/list.test.ts diff --git a/cli/commands/preview/tests/update.test.ts b/apps/cli/commands/preview/tests/update.test.ts similarity index 97% rename from cli/commands/preview/tests/update.test.ts rename to apps/cli/commands/preview/tests/update.test.ts index f72e7d05a1..a35df8a3f2 100644 --- a/cli/commands/preview/tests/update.test.ts +++ b/apps/cli/commands/preview/tests/update.test.ts @@ -1,8 +1,8 @@ import os from 'os'; import path from 'path'; import { Archiver } from 'archiver'; -import { DEMO_SITE_EXPIRATION_DAYS } from 'common/constants'; -import { getWordPressVersion } from 'common/lib/get-wordpress-version'; +import { DEMO_SITE_EXPIRATION_DAYS } from '@studio/common/constants'; +import { getWordPressVersion } from '@studio/common/lib/get-wordpress-version'; import { vi } from 'vitest'; import { uploadArchive, waitForSiteReady } from 'cli/lib/api'; import { getAuthToken, getSiteByFolder } from 'cli/lib/appdata'; @@ -12,7 +12,7 @@ import { LoggerError } from 'cli/logger'; import { mockReportStart, mockReportSuccess, mockReportError } from 'cli/tests/test-utils'; import { runCommand } from '../update'; -vi.mock( 'common/lib/get-wordpress-version' ); +vi.mock( '@studio/common/lib/get-wordpress-version' ); vi.mock( 'cli/lib/appdata', async () => { const actual = await vi.importActual( 'cli/lib/appdata' ); return { diff --git a/cli/commands/preview/update.ts b/apps/cli/commands/preview/update.ts similarity index 93% rename from cli/commands/preview/update.ts rename to apps/cli/commands/preview/update.ts index 0005429a6c..9d4ca6a209 100644 --- a/cli/commands/preview/update.ts +++ b/apps/cli/commands/preview/update.ts @@ -1,10 +1,10 @@ import os from 'node:os'; import path from 'node:path'; import { __, _n, sprintf } from '@wordpress/i18n'; -import { DEMO_SITE_EXPIRATION_DAYS } from 'common/constants'; -import { getWordPressVersion } from 'common/lib/get-wordpress-version'; -import { PreviewCommandLoggerAction as LoggerAction } from 'common/logger-actions'; -import { Snapshot } from 'common/types/snapshot'; +import { DEMO_SITE_EXPIRATION_DAYS } from '@studio/common/constants'; +import { getWordPressVersion } from '@studio/common/lib/get-wordpress-version'; +import { PreviewCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; +import { Snapshot } from '@studio/common/types/snapshot'; import { addDays } from 'date-fns'; import { uploadArchive, waitForSiteReady } from 'cli/lib/api'; import { getAuthToken, getSiteByFolder } from 'cli/lib/appdata'; diff --git a/cli/commands/site/create.ts b/apps/cli/commands/site/create.ts similarity index 95% rename from cli/commands/site/create.ts rename to apps/cli/commands/site/create.ts index 09fcffc23b..388728bf91 100644 --- a/cli/commands/site/create.ts +++ b/apps/cli/commands/site/create.ts @@ -9,30 +9,30 @@ import { DEFAULT_PHP_VERSION, DEFAULT_WORDPRESS_VERSION, MINIMUM_WORDPRESS_VERSION, -} from 'common/constants'; +} from '@studio/common/constants'; import { filterUnsupportedBlueprintFeatures, validateBlueprintData, -} from 'common/lib/blueprint-validation'; -import { getDomainNameValidationError } from 'common/lib/domains'; +} from '@studio/common/lib/blueprint-validation'; +import { getDomainNameValidationError } from '@studio/common/lib/domains'; import { arePathsEqual, isEmptyDir, isWordPressDirectory, pathExists, recursiveCopyDirectory, -} from 'common/lib/fs-utils'; -import { DEFAULT_LOCALE } from 'common/lib/locale'; -import { isOnline } from 'common/lib/network-utils'; -import { createPassword } from 'common/lib/passwords'; -import { portFinder } from 'common/lib/port-finder'; -import { SITE_EVENTS } from 'common/lib/site-events'; -import { sortSites } from 'common/lib/sort-sites'; +} from '@studio/common/lib/fs-utils'; +import { DEFAULT_LOCALE } from '@studio/common/lib/locale'; +import { isOnline } from '@studio/common/lib/network-utils'; +import { createPassword } from '@studio/common/lib/passwords'; +import { portFinder } from '@studio/common/lib/port-finder'; +import { SITE_EVENTS } from '@studio/common/lib/site-events'; +import { sortSites } from '@studio/common/lib/sort-sites'; import { isValidWordPressVersion, isWordPressVersionAtLeast, -} from 'common/lib/wordpress-version-utils'; -import { SiteCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +} from '@studio/common/lib/wordpress-version-utils'; +import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { lockAppdata, readAppdata, diff --git a/cli/commands/site/delete.ts b/apps/cli/commands/site/delete.ts similarity index 95% rename from cli/commands/site/delete.ts rename to apps/cli/commands/site/delete.ts index 1aadca62ec..57628ba66d 100644 --- a/cli/commands/site/delete.ts +++ b/apps/cli/commands/site/delete.ts @@ -1,7 +1,7 @@ import { __, _n, sprintf } from '@wordpress/i18n'; -import { arePathsEqual } from 'common/lib/fs-utils'; -import { SITE_EVENTS } from 'common/lib/site-events'; -import { SiteCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +import { arePathsEqual } from '@studio/common/lib/fs-utils'; +import { SITE_EVENTS } from '@studio/common/lib/site-events'; +import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { deleteSnapshot } from 'cli/lib/api'; import { getSiteByFolder, diff --git a/cli/commands/site/list.ts b/apps/cli/commands/site/list.ts similarity index 97% rename from cli/commands/site/list.ts rename to apps/cli/commands/site/list.ts index bc2facccdc..0ed71d2b42 100644 --- a/cli/commands/site/list.ts +++ b/apps/cli/commands/site/list.ts @@ -1,6 +1,6 @@ import { __, _n, sprintf } from '@wordpress/i18n'; import Table from 'cli-table3'; -import { SiteCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { getSiteUrl, readAppdata, type SiteData } from 'cli/lib/appdata'; import { connect, disconnect } from 'cli/lib/pm2-manager'; import { isSiteRunning } from 'cli/lib/site-utils'; diff --git a/cli/commands/site/set.ts b/apps/cli/commands/site/set.ts similarity index 95% rename from cli/commands/site/set.ts rename to apps/cli/commands/site/set.ts index 79fcd1a24d..5c714b67ba 100644 --- a/cli/commands/site/set.ts +++ b/apps/cli/commands/site/set.ts @@ -1,16 +1,16 @@ import { SupportedPHPVersions } from '@php-wasm/universal'; import { __, sprintf } from '@wordpress/i18n'; -import { DEFAULT_WORDPRESS_VERSION, MINIMUM_WORDPRESS_VERSION } from 'common/constants'; -import { getDomainNameValidationError } from 'common/lib/domains'; -import { arePathsEqual } from 'common/lib/fs-utils'; -import { SITE_EVENTS } from 'common/lib/site-events'; -import { siteNeedsRestart } from 'common/lib/site-needs-restart'; +import { DEFAULT_WORDPRESS_VERSION, MINIMUM_WORDPRESS_VERSION } from '@studio/common/constants'; +import { getDomainNameValidationError } from '@studio/common/lib/domains'; +import { arePathsEqual } from '@studio/common/lib/fs-utils'; +import { SITE_EVENTS } from '@studio/common/lib/site-events'; +import { siteNeedsRestart } from '@studio/common/lib/site-needs-restart'; import { getWordPressVersionUrl, isValidWordPressVersion, isWordPressVersionAtLeast, -} from 'common/lib/wordpress-version-utils'; -import { SiteCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +} from '@studio/common/lib/wordpress-version-utils'; +import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { getSiteByFolder, lockAppdata, diff --git a/cli/commands/site/start.ts b/apps/cli/commands/site/start.ts similarity index 97% rename from cli/commands/site/start.ts rename to apps/cli/commands/site/start.ts index bdc785b0b4..1e7f411954 100644 --- a/cli/commands/site/start.ts +++ b/apps/cli/commands/site/start.ts @@ -1,5 +1,5 @@ import { __ } from '@wordpress/i18n'; -import { SiteCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { getSiteByFolder, updateSiteAutoStart, updateSiteLatestCliPid } from 'cli/lib/appdata'; import { connect, disconnect } from 'cli/lib/pm2-manager'; import { logSiteDetails, openSiteInBrowser, setupCustomDomain } from 'cli/lib/site-utils'; diff --git a/cli/commands/site/status.ts b/apps/cli/commands/site/status.ts similarity index 94% rename from cli/commands/site/status.ts rename to apps/cli/commands/site/status.ts index 739ae65629..02ffc37cf0 100644 --- a/cli/commands/site/status.ts +++ b/apps/cli/commands/site/status.ts @@ -1,8 +1,8 @@ import { __, _n } from '@wordpress/i18n'; import CliTable3 from 'cli-table3'; -import { getWordPressVersion } from 'common/lib/get-wordpress-version'; -import { decodePassword } from 'common/lib/passwords'; -import { SiteCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +import { getWordPressVersion } from '@studio/common/lib/get-wordpress-version'; +import { decodePassword } from '@studio/common/lib/passwords'; +import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { getSiteByFolder, getSiteUrl } from 'cli/lib/appdata'; import { connect, disconnect } from 'cli/lib/pm2-manager'; import { getPrettyPath } from 'cli/lib/utils'; diff --git a/cli/commands/site/stop.ts b/apps/cli/commands/site/stop.ts similarity index 97% rename from cli/commands/site/stop.ts rename to apps/cli/commands/site/stop.ts index 106e6b2ae4..84151ba612 100644 --- a/cli/commands/site/stop.ts +++ b/apps/cli/commands/site/stop.ts @@ -1,5 +1,5 @@ import { __, _n, sprintf } from '@wordpress/i18n'; -import { SiteCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { clearSiteLatestCliPid, getSiteByFolder, diff --git a/cli/commands/site/tests/create.test.ts b/apps/cli/commands/site/tests/create.test.ts similarity index 98% rename from cli/commands/site/tests/create.test.ts rename to apps/cli/commands/site/tests/create.test.ts index 7a5f366356..6c69d6ba83 100644 --- a/cli/commands/site/tests/create.test.ts +++ b/apps/cli/commands/site/tests/create.test.ts @@ -3,16 +3,16 @@ import { Blueprint, StepDefinition } from '@wp-playground/blueprints'; import { filterUnsupportedBlueprintFeatures, validateBlueprintData, -} from 'common/lib/blueprint-validation'; +} from '@studio/common/lib/blueprint-validation'; import { isEmptyDir, isWordPressDirectory, pathExists, arePathsEqual, recursiveCopyDirectory, -} from 'common/lib/fs-utils'; -import { isOnline } from 'common/lib/network-utils'; -import { portFinder } from 'common/lib/port-finder'; +} from '@studio/common/lib/fs-utils'; +import { isOnline } from '@studio/common/lib/network-utils'; +import { portFinder } from '@studio/common/lib/port-finder'; import { vi, type MockInstance } from 'vitest'; import { lockAppdata, @@ -32,18 +32,18 @@ import { runBlueprint, startWordPressServer } from 'cli/lib/wordpress-server-man import { Logger } from 'cli/logger'; import { runCommand } from '../create'; -vi.mock( 'common/lib/fs-utils' ); -vi.mock( 'common/lib/network-utils' ); -vi.mock( 'common/lib/port-finder', () => ( { +vi.mock( '@studio/common/lib/fs-utils' ); +vi.mock( '@studio/common/lib/network-utils' ); +vi.mock( '@studio/common/lib/port-finder', () => ( { portFinder: { addUnavailablePort: vi.fn(), getOpenPort: vi.fn(), }, } ) ); -vi.mock( 'common/lib/passwords', () => ( { +vi.mock( '@studio/common/lib/passwords', () => ( { createPassword: vi.fn().mockReturnValue( 'generated-password-123' ), } ) ); -vi.mock( 'common/lib/blueprint-validation' ); +vi.mock( '@studio/common/lib/blueprint-validation' ); vi.mock( 'cli/lib/appdata', async () => { const actual = await vi.importActual( 'cli/lib/appdata' ); return { diff --git a/cli/commands/site/tests/delete.test.ts b/apps/cli/commands/site/tests/delete.test.ts similarity index 99% rename from cli/commands/site/tests/delete.test.ts rename to apps/cli/commands/site/tests/delete.test.ts index f6a60ffa8c..d49d0cbbdb 100644 --- a/cli/commands/site/tests/delete.test.ts +++ b/apps/cli/commands/site/tests/delete.test.ts @@ -1,4 +1,4 @@ -import { arePathsEqual } from 'common/lib/fs-utils'; +import { arePathsEqual } from '@studio/common/lib/fs-utils'; import trash from 'trash'; import { vi } from 'vitest'; import { deleteSnapshot } from 'cli/lib/api'; @@ -39,7 +39,7 @@ vi.mock( 'cli/lib/pm2-manager' ); vi.mock( 'cli/lib/site-utils' ); vi.mock( 'cli/lib/snapshots' ); vi.mock( 'cli/lib/wordpress-server-manager' ); -vi.mock( 'common/lib/fs-utils' ); +vi.mock( '@studio/common/lib/fs-utils' ); vi.mock( 'trash' ); describe( 'CLI: studio site delete', () => { diff --git a/cli/commands/site/tests/list.test.ts b/apps/cli/commands/site/tests/list.test.ts similarity index 100% rename from cli/commands/site/tests/list.test.ts rename to apps/cli/commands/site/tests/list.test.ts diff --git a/cli/commands/site/tests/set.test.ts b/apps/cli/commands/site/tests/set.test.ts similarity index 98% rename from cli/commands/site/tests/set.test.ts rename to apps/cli/commands/site/tests/set.test.ts index c764c87f33..7cabcf1701 100644 --- a/cli/commands/site/tests/set.test.ts +++ b/apps/cli/commands/site/tests/set.test.ts @@ -1,6 +1,6 @@ import { StreamedPHPResponse } from '@php-wasm/universal'; -import { getDomainNameValidationError } from 'common/lib/domains'; -import { arePathsEqual } from 'common/lib/fs-utils'; +import { getDomainNameValidationError } from '@studio/common/lib/domains'; +import { arePathsEqual } from '@studio/common/lib/fs-utils'; import { vi } from 'vitest'; import { getSiteByFolder, @@ -20,9 +20,9 @@ import { } from 'cli/lib/wordpress-server-manager'; import { runCommand } from '../set'; -vi.mock( 'common/lib/domains' ); -vi.mock( 'common/lib/fs-utils', async () => { - const actual = await vi.importActual( 'common/lib/fs-utils' ); +vi.mock( '@studio/common/lib/domains' ); +vi.mock( '@studio/common/lib/fs-utils', async () => { + const actual = await vi.importActual( '@studio/common/lib/fs-utils' ); return { ...actual, arePathsEqual: vi.fn(), diff --git a/cli/commands/site/tests/start.test.ts b/apps/cli/commands/site/tests/start.test.ts similarity index 100% rename from cli/commands/site/tests/start.test.ts rename to apps/cli/commands/site/tests/start.test.ts diff --git a/cli/commands/site/tests/status.test.ts b/apps/cli/commands/site/tests/status.test.ts similarity index 97% rename from cli/commands/site/tests/status.test.ts rename to apps/cli/commands/site/tests/status.test.ts index 3076bf1201..f736001675 100644 --- a/cli/commands/site/tests/status.test.ts +++ b/apps/cli/commands/site/tests/status.test.ts @@ -1,4 +1,4 @@ -import { getWordPressVersion } from 'common/lib/get-wordpress-version'; +import { getWordPressVersion } from '@studio/common/lib/get-wordpress-version'; import { vi } from 'vitest'; import { getSiteByFolder, getSiteUrl } from 'cli/lib/appdata'; import { connect, disconnect } from 'cli/lib/pm2-manager'; @@ -15,7 +15,7 @@ vi.mock( 'cli/lib/appdata', async () => { } ); vi.mock( 'cli/lib/pm2-manager' ); vi.mock( 'cli/lib/wordpress-server-manager' ); -vi.mock( 'common/lib/get-wordpress-version' ); +vi.mock( '@studio/common/lib/get-wordpress-version' ); describe( 'CLI: studio site status', () => { // Simple test data diff --git a/cli/commands/site/tests/stop.test.ts b/apps/cli/commands/site/tests/stop.test.ts similarity index 100% rename from cli/commands/site/tests/stop.test.ts rename to apps/cli/commands/site/tests/stop.test.ts diff --git a/cli/commands/wp.ts b/apps/cli/commands/wp.ts similarity index 100% rename from cli/commands/wp.ts rename to apps/cli/commands/wp.ts diff --git a/cli/index.ts b/apps/cli/index.ts similarity index 94% rename from cli/index.ts rename to apps/cli/index.ts index 97b7ea4a71..2c6b3bb37d 100644 --- a/cli/index.ts +++ b/apps/cli/index.ts @@ -1,8 +1,8 @@ import path from 'node:path'; import { __ } from '@wordpress/i18n'; -import { bumpAggregatedUniqueStat, AppdataProvider, LastBumpStatsData } from 'common/lib/bump-stat'; -import { suppressPunycodeWarning } from 'common/lib/suppress-punycode-warning'; -import { StatsGroup, StatsMetric } from 'common/types/stats'; +import { bumpAggregatedUniqueStat, AppdataProvider, LastBumpStatsData } from '@studio/common/lib/bump-stat'; +import { suppressPunycodeWarning } from '@studio/common/lib/suppress-punycode-warning'; +import { StatsGroup, StatsMetric } from '@studio/common/types/stats'; import yargs from 'yargs'; import { commandHandler as eventsCommandHandler } from 'cli/commands/_events'; import { registerCommand as registerAuthLoginCommand } from 'cli/commands/auth/login'; @@ -24,7 +24,7 @@ import { readAppdata, lockAppdata, unlockAppdata, saveAppdata } from 'cli/lib/ap import { loadTranslations } from 'cli/lib/i18n'; import { untildify } from 'cli/lib/utils'; import { StudioArgv } from 'cli/types'; -import { version } from '../package.json'; +const version = __STUDIO_CLI_VERSION__; suppressPunycodeWarning(); @@ -34,7 +34,7 @@ const cliAppdataProvider: AppdataProvider< LastBumpStatsData > = { unlock: unlockAppdata, save: async ( data ) => { // Cast is safe: data comes from readAppdata() which returns the full UserData type. - // The lock/unlock is already handled by the caller (updateLastBump in common/lib/bump-stat.ts) + // The lock/unlock is already handled by the caller (updateLastBump in /common/lib/bump-stat.ts) // eslint-disable-next-line studio/require-lock-before-save await saveAppdata( data as never ); }, diff --git a/cli/lib/api.ts b/apps/cli/lib/api.ts similarity index 100% rename from cli/lib/api.ts rename to apps/cli/lib/api.ts diff --git a/cli/lib/appdata.ts b/apps/cli/lib/appdata.ts similarity index 93% rename from cli/lib/appdata.ts rename to apps/cli/lib/appdata.ts index d96a472464..9742709ff9 100644 --- a/cli/lib/appdata.ts +++ b/apps/cli/lib/appdata.ts @@ -3,13 +3,13 @@ import os from 'os'; import path from 'path'; import { __, sprintf } from '@wordpress/i18n'; import { readFile, writeFile } from 'atomically'; -import { LOCKFILE_NAME, LOCKFILE_STALE_TIME, LOCKFILE_WAIT_TIME } from 'common/constants'; -import { arePathsEqual, isWordPressDirectory } from 'common/lib/fs-utils'; -import { lockFileAsync, unlockFileAsync } from 'common/lib/lockfile'; -import { getAuthenticationUrl } from 'common/lib/oauth'; -import { siteDetailsSchema } from 'common/lib/site-events'; -import { snapshotSchema } from 'common/types/snapshot'; -import { StatsMetric } from 'common/types/stats'; +import { LOCKFILE_NAME, LOCKFILE_STALE_TIME, LOCKFILE_WAIT_TIME } from '@studio/common/constants'; +import { arePathsEqual, isWordPressDirectory } from '@studio/common/lib/fs-utils'; +import { lockFileAsync, unlockFileAsync } from '@studio/common/lib/lockfile'; +import { getAuthenticationUrl } from '@studio/common/lib/oauth'; +import { siteDetailsSchema } from '@studio/common/lib/site-events'; +import { snapshotSchema } from '@studio/common/types/snapshot'; +import { StatsMetric } from '@studio/common/types/stats'; import { z } from 'zod'; import { validateAccessToken } from 'cli/lib/api'; import { LoggerError } from 'cli/logger'; diff --git a/cli/lib/archive.ts b/apps/cli/lib/archive.ts similarity index 100% rename from cli/lib/archive.ts rename to apps/cli/lib/archive.ts diff --git a/cli/lib/browser.ts b/apps/cli/lib/browser.ts similarity index 100% rename from cli/lib/browser.ts rename to apps/cli/lib/browser.ts diff --git a/cli/lib/certificate-manager.ts b/apps/cli/lib/certificate-manager.ts similarity index 100% rename from cli/lib/certificate-manager.ts rename to apps/cli/lib/certificate-manager.ts diff --git a/cli/lib/cli-args-sanitizer.ts b/apps/cli/lib/cli-args-sanitizer.ts similarity index 100% rename from cli/lib/cli-args-sanitizer.ts rename to apps/cli/lib/cli-args-sanitizer.ts diff --git a/cli/lib/hosts-file.ts b/apps/cli/lib/hosts-file.ts similarity index 99% rename from cli/lib/hosts-file.ts rename to apps/cli/lib/hosts-file.ts index 233a0ee4de..ebc9e68ceb 100644 --- a/cli/lib/hosts-file.ts +++ b/apps/cli/lib/hosts-file.ts @@ -3,7 +3,7 @@ import { domainToASCII } from 'node:url'; import { platform, tmpdir } from 'os'; import path from 'path'; import { promisify } from 'util'; -import { escapeRegex } from 'common/lib/escape-regex'; +import { escapeRegex } from '@studio/common/lib/escape-regex'; import { sudoExec } from 'cli/lib/sudo-exec'; const readFile = promisify( fs.readFile ); diff --git a/cli/lib/i18n.ts b/apps/cli/lib/i18n.ts similarity index 97% rename from cli/lib/i18n.ts rename to apps/cli/lib/i18n.ts index e06896288a..3d0d784428 100644 --- a/cli/lib/i18n.ts +++ b/apps/cli/lib/i18n.ts @@ -4,7 +4,7 @@ import { getLocaleData, DEFAULT_LOCALE, isSupportedLocale, -} from 'common/lib/locale'; +} from '@studio/common/lib/locale'; import { readAppdata } from 'cli/lib/appdata'; async function getLocaleFromAppdata(): Promise< SupportedLocale | undefined > { diff --git a/cli/lib/pm2-manager.ts b/apps/cli/lib/pm2-manager.ts similarity index 97% rename from cli/lib/pm2-manager.ts rename to apps/cli/lib/pm2-manager.ts index 4e7a8d2b2e..b369003414 100644 --- a/cli/lib/pm2-manager.ts +++ b/apps/cli/lib/pm2-manager.ts @@ -1,10 +1,10 @@ import fs from 'fs'; import os from 'os'; import path from 'path'; -import { LOCKFILE_STALE_TIME, LOCKFILE_WAIT_TIME } from 'common/constants'; -import { cacheFunctionTTL } from 'common/lib/cache-function-ttl'; -import { lockFileAsync, unlockFileAsync } from 'common/lib/lockfile'; -import { SITE_EVENTS } from 'common/lib/site-events'; +import { LOCKFILE_STALE_TIME, LOCKFILE_WAIT_TIME } from '@studio/common/constants'; +import { cacheFunctionTTL } from '@studio/common/lib/cache-function-ttl'; +import { lockFileAsync, unlockFileAsync } from '@studio/common/lib/lockfile'; +import { SITE_EVENTS } from '@studio/common/lib/site-events'; import { custom as PM2, StartOptions } from 'pm2'; import axon from 'pm2-axon'; import { getAppdataPath } from 'cli/lib/appdata'; diff --git a/cli/lib/proxy-server.ts b/apps/cli/lib/proxy-server.ts similarity index 100% rename from cli/lib/proxy-server.ts rename to apps/cli/lib/proxy-server.ts diff --git a/cli/lib/run-wp-cli-command.ts b/apps/cli/lib/run-wp-cli-command.ts similarity index 96% rename from cli/lib/run-wp-cli-command.ts rename to apps/cli/lib/run-wp-cli-command.ts index cf2f09d54b..3609d74729 100644 --- a/cli/lib/run-wp-cli-command.ts +++ b/apps/cli/lib/run-wp-cli-command.ts @@ -9,8 +9,8 @@ import { import { createSpawnHandler } from '@php-wasm/util'; import { __ } from '@wordpress/i18n'; import { setupPlatformLevelMuPlugins } from '@wp-playground/wordpress'; -import { getMuPlugins } from 'common/lib/mu-plugins'; -import { LatestSupportedPHPVersion } from 'common/types/php-versions'; +import { getMuPlugins } from '@studio/common/lib/mu-plugins'; +import { LatestSupportedPHPVersion } from '@studio/common/types/php-versions'; import { getSqliteCommandPath, getWpCliPharPath } from 'cli/lib/server-files'; const PLAYGROUND_INTERNAL_SHARED_FOLDER = '/internal/shared'; diff --git a/cli/lib/server-files.ts b/apps/cli/lib/server-files.ts similarity index 100% rename from cli/lib/server-files.ts rename to apps/cli/lib/server-files.ts diff --git a/cli/lib/site-language.ts b/apps/cli/lib/site-language.ts similarity index 98% rename from cli/lib/site-language.ts rename to apps/cli/lib/site-language.ts index 72717e27e9..add7b591f7 100644 --- a/cli/lib/site-language.ts +++ b/apps/cli/lib/site-language.ts @@ -2,7 +2,7 @@ import fs from 'fs'; import path from 'path'; import { Locale } from '@formatjs/intl-locale'; import { match } from '@formatjs/intl-localematcher'; -import { DEFAULT_LOCALE } from 'common/lib/locale'; +import { DEFAULT_LOCALE } from '@studio/common/lib/locale'; import { getAppLocale } from 'cli/lib/i18n'; import { getServerFilesPath } from 'cli/lib/server-files'; diff --git a/cli/lib/site-utils.ts b/apps/cli/lib/site-utils.ts similarity index 96% rename from cli/lib/site-utils.ts rename to apps/cli/lib/site-utils.ts index 6991d396ac..b00c6c184a 100644 --- a/cli/lib/site-utils.ts +++ b/apps/cli/lib/site-utils.ts @@ -1,6 +1,6 @@ import { __ } from '@wordpress/i18n'; -import { decodePassword } from 'common/lib/passwords'; -import { SiteCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +import { decodePassword } from '@studio/common/lib/passwords'; +import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { getSiteUrl, readAppdata, SiteData } from 'cli/lib/appdata'; import { openBrowser } from 'cli/lib/browser'; import { generateSiteCertificate } from 'cli/lib/certificate-manager'; diff --git a/cli/lib/snapshots.ts b/apps/cli/lib/snapshots.ts similarity index 96% rename from cli/lib/snapshots.ts rename to apps/cli/lib/snapshots.ts index 374e29646d..68fa936a76 100644 --- a/cli/lib/snapshots.ts +++ b/apps/cli/lib/snapshots.ts @@ -1,6 +1,6 @@ import { __, sprintf } from '@wordpress/i18n'; -import { HOUR_MS, DAY_MS, DEMO_SITE_EXPIRATION_DAYS } from 'common/constants'; -import { Snapshot } from 'common/types/snapshot'; +import { HOUR_MS, DAY_MS, DEMO_SITE_EXPIRATION_DAYS } from '@studio/common/constants'; +import { Snapshot } from '@studio/common/types/snapshot'; import { addDays, addHours, DurationUnit, formatDuration, intervalToDuration } from 'date-fns'; import { getAuthToken, diff --git a/cli/lib/sqlite-integration.ts b/apps/cli/lib/sqlite-integration.ts similarity index 90% rename from cli/lib/sqlite-integration.ts rename to apps/cli/lib/sqlite-integration.ts index 1c69aa248e..3f80d9a548 100644 --- a/cli/lib/sqlite-integration.ts +++ b/apps/cli/lib/sqlite-integration.ts @@ -1,4 +1,4 @@ -import { SqliteIntegrationProvider } from 'common/lib/sqlite-integration'; +import { SqliteIntegrationProvider } from '@studio/common/lib/sqlite-integration'; import { getServerFilesPath } from 'cli/lib/server-files'; const SQLITE_FILENAME = 'sqlite-database-integration'; diff --git a/cli/lib/sudo-exec.ts b/apps/cli/lib/sudo-exec.ts similarity index 100% rename from cli/lib/sudo-exec.ts rename to apps/cli/lib/sudo-exec.ts diff --git a/cli/lib/tests/api.test.ts b/apps/cli/lib/tests/api.test.ts similarity index 100% rename from cli/lib/tests/api.test.ts rename to apps/cli/lib/tests/api.test.ts diff --git a/cli/lib/tests/appdata.test.ts b/apps/cli/lib/tests/appdata.test.ts similarity index 97% rename from cli/lib/tests/appdata.test.ts rename to apps/cli/lib/tests/appdata.test.ts index 6a5d9f058a..1a7915218b 100644 --- a/cli/lib/tests/appdata.test.ts +++ b/apps/cli/lib/tests/appdata.test.ts @@ -2,8 +2,8 @@ import fs from 'fs'; import os from 'os'; import path from 'path'; import { readFile, writeFile } from 'atomically'; -import { arePathsEqual } from 'common/lib/fs-utils'; -import { StatsMetric } from 'common/types/stats'; +import { arePathsEqual } from '@studio/common/lib/fs-utils'; +import { StatsMetric } from '@studio/common/types/stats'; import { vi } from 'vitest'; import { readAppdata, @@ -21,7 +21,7 @@ vi.mock( 'atomically', () => ( { writeFile: vi.fn(), } ) ); -vi.mock( 'common/lib/fs-utils' ); +vi.mock( '@studio/common/lib/fs-utils' ); vi.mock( 'cli/lib/api', () => ( { validateAccessToken: vi.fn().mockResolvedValue( undefined ), } ) ); diff --git a/cli/lib/tests/archive.test.ts b/apps/cli/lib/tests/archive.test.ts similarity index 100% rename from cli/lib/tests/archive.test.ts rename to apps/cli/lib/tests/archive.test.ts diff --git a/cli/lib/tests/pm2-manager.test.ts b/apps/cli/lib/tests/pm2-manager.test.ts similarity index 99% rename from cli/lib/tests/pm2-manager.test.ts rename to apps/cli/lib/tests/pm2-manager.test.ts index 73352dfcb1..9d714ffa58 100644 --- a/cli/lib/tests/pm2-manager.test.ts +++ b/apps/cli/lib/tests/pm2-manager.test.ts @@ -1,5 +1,5 @@ import os from 'os'; -import { clearCache } from 'common/lib/cache-function-ttl'; +import { clearCache } from '@studio/common/lib/cache-function-ttl'; import { vi } from 'vitest'; import { getAppdataPath } from 'cli/lib/appdata'; import { ManagerMessage } from '../types/wordpress-server-ipc'; diff --git a/cli/lib/tests/site-utils.test.ts b/apps/cli/lib/tests/site-utils.test.ts similarity index 98% rename from cli/lib/tests/site-utils.test.ts rename to apps/cli/lib/tests/site-utils.test.ts index 47ec3c3885..2cfee4dca3 100644 --- a/cli/lib/tests/site-utils.test.ts +++ b/apps/cli/lib/tests/site-utils.test.ts @@ -1,4 +1,4 @@ -import { SiteCommandLoggerAction as LoggerAction } from 'common/logger-actions'; +import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { vi, type Mock } from 'vitest'; import { SiteData, readAppdata } from 'cli/lib/appdata'; import { isProxyProcessRunning, stopProxyProcess } from 'cli/lib/pm2-manager'; diff --git a/cli/lib/tests/snapshots.test.ts b/apps/cli/lib/tests/snapshots.test.ts similarity index 99% rename from cli/lib/tests/snapshots.test.ts rename to apps/cli/lib/tests/snapshots.test.ts index 4e82b6dfd2..8328870548 100644 --- a/cli/lib/tests/snapshots.test.ts +++ b/apps/cli/lib/tests/snapshots.test.ts @@ -42,7 +42,7 @@ vi.mock( 'lockfile', () => ( { lock: mocks.lockfileLock, unlock: mocks.lockfileUnlock, } ) ); -vi.mock( 'common/lib/fs-utils', () => ( { +vi.mock( '@studio/common/lib/fs-utils', () => ( { arePathsEqual: mocks.arePathsEqual, isWordPressDirectory: mocks.isWordPressDirectory, } ) ); diff --git a/cli/lib/tests/utils.test.ts b/apps/cli/lib/tests/utils.test.ts similarity index 100% rename from cli/lib/tests/utils.test.ts rename to apps/cli/lib/tests/utils.test.ts diff --git a/cli/lib/tests/validation.test.ts b/apps/cli/lib/tests/validation.test.ts similarity index 92% rename from cli/lib/tests/validation.test.ts rename to apps/cli/lib/tests/validation.test.ts index 259379275b..49004a3766 100644 --- a/cli/lib/tests/validation.test.ts +++ b/apps/cli/lib/tests/validation.test.ts @@ -1,12 +1,12 @@ import fs from 'fs'; import path from 'path'; -import { calculateDirectorySize, isWordPressDirectory } from 'common/lib/fs-utils'; +import { calculateDirectorySize, isWordPressDirectory } from '@studio/common/lib/fs-utils'; import { vi } from 'vitest'; import { validateSiteSize } from 'cli/lib/validation'; import { LoggerError } from 'cli/logger'; vi.mock( 'fs' ); vi.mock( 'path' ); -vi.mock( 'common/lib/fs-utils', () => ( { +vi.mock( '@studio/common/lib/fs-utils', () => ( { calculateDirectorySize: vi.fn(), isWordPressDirectory: vi.fn(), } ) ); diff --git a/cli/lib/tests/wordpress-server-manager.test.ts b/apps/cli/lib/tests/wordpress-server-manager.test.ts similarity index 100% rename from cli/lib/tests/wordpress-server-manager.test.ts rename to apps/cli/lib/tests/wordpress-server-manager.test.ts diff --git a/cli/lib/types/pm2.ts b/apps/cli/lib/types/pm2.ts similarity index 100% rename from cli/lib/types/pm2.ts rename to apps/cli/lib/types/pm2.ts diff --git a/cli/lib/types/wordpress-server-ipc.ts b/apps/cli/lib/types/wordpress-server-ipc.ts similarity index 100% rename from cli/lib/types/wordpress-server-ipc.ts rename to apps/cli/lib/types/wordpress-server-ipc.ts diff --git a/cli/lib/utils.ts b/apps/cli/lib/utils.ts similarity index 100% rename from cli/lib/utils.ts rename to apps/cli/lib/utils.ts diff --git a/cli/lib/validation-error.ts b/apps/cli/lib/validation-error.ts similarity index 100% rename from cli/lib/validation-error.ts rename to apps/cli/lib/validation-error.ts diff --git a/cli/lib/validation.ts b/apps/cli/lib/validation.ts similarity index 87% rename from cli/lib/validation.ts rename to apps/cli/lib/validation.ts index fdd8d89ec1..411ff1607c 100644 --- a/cli/lib/validation.ts +++ b/apps/cli/lib/validation.ts @@ -1,7 +1,7 @@ import path from 'path'; import { __, sprintf } from '@wordpress/i18n'; -import { DEMO_SITE_SIZE_LIMIT_BYTES, DEMO_SITE_SIZE_LIMIT_GB } from 'common/constants'; -import { calculateDirectorySize } from 'common/lib/fs-utils'; +import { DEMO_SITE_SIZE_LIMIT_BYTES, DEMO_SITE_SIZE_LIMIT_GB } from '@studio/common/constants'; +import { calculateDirectorySize } from '@studio/common/lib/fs-utils'; import { LoggerError } from 'cli/logger'; export async function validateSiteSize( siteFolder: string ): Promise< true > { diff --git a/cli/lib/wordpress-server-manager.ts b/apps/cli/lib/wordpress-server-manager.ts similarity index 99% rename from cli/lib/wordpress-server-manager.ts rename to apps/cli/lib/wordpress-server-manager.ts index bbf89f1ce0..41c35097d0 100644 --- a/cli/lib/wordpress-server-manager.ts +++ b/apps/cli/lib/wordpress-server-manager.ts @@ -9,8 +9,8 @@ import { PLAYGROUND_CLI_ACTIVITY_CHECK_INTERVAL, PLAYGROUND_CLI_INACTIVITY_TIMEOUT, PLAYGROUND_CLI_MAX_TIMEOUT, -} from 'common/constants'; -import { SITE_EVENTS } from 'common/lib/site-events'; +} from '@studio/common/constants'; +import { SITE_EVENTS } from '@studio/common/lib/site-events'; import { z } from 'zod'; import { SiteData, readAppdata } from 'cli/lib/appdata'; import { diff --git a/cli/logger.ts b/apps/cli/logger.ts similarity index 100% rename from cli/logger.ts rename to apps/cli/logger.ts diff --git a/apps/cli/package.json b/apps/cli/package.json new file mode 100644 index 0000000000..a911e84a1f --- /dev/null +++ b/apps/cli/package.json @@ -0,0 +1,39 @@ +{ + "name": "studio-cli", + "author": "Automattic Inc.", + "private": true, + "productName": "Studio CLI", + "description": "WordPress Studio CLI", + "license": "GPL-2.0-or-later", + "main": "index.js", + "dependencies": { + "@php-wasm/universal": "^3.0.46", + "@studio/common": "file:../../tools/common", + "@wp-playground/blueprints": "^3.0.46", + "@wp-playground/cli": "^3.0.46", + "@wp-playground/common": "^3.0.46", + "@wp-playground/storage": "^3.0.46", + "cli-table3": "^0.6.5", + "http-proxy": "^1.18.1", + "pm2": "^6.0.14", + "pm2-axon": "^4.0.1", + "trash": "^10.0.1", + "yargs": "^18.0.0", + "yargs-parser": "^22.0.0" + }, + "scripts": { + "build": "vite build --config ./vite.config.ts", + "watch": "vite build --config ./vite.config.ts --watch", + "install:bundle": "npm install --no-package-lock --install-links --no-workspaces", + "postinstall": "patch-package --patch-dir ../../patches" + }, + "devDependencies": { + "@types/archiver": "^6.0.4", + "@types/http-proxy": "^1.17.17", + "@types/node-forge": "^1.3.14", + "@types/yargs": "^17.0.35", + "patch-package": "^8.0.1", + "vite": "^7.3.1", + "vite-plugin-static-copy": "^3.1.5" + } +} diff --git a/cli/proxy-daemon.ts b/apps/cli/proxy-daemon.ts similarity index 100% rename from cli/proxy-daemon.ts rename to apps/cli/proxy-daemon.ts diff --git a/cli/tests/test-utils.ts b/apps/cli/tests/test-utils.ts similarity index 100% rename from cli/tests/test-utils.ts rename to apps/cli/tests/test-utils.ts diff --git a/apps/cli/tsconfig.json b/apps/cli/tsconfig.json new file mode 100644 index 0000000000..a284cdce19 --- /dev/null +++ b/apps/cli/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "baseUrl": "../..", + "paths": { + "*": [ "node_modules/*" ], + "cli/*": [ "apps/cli/*" ], + "src/*": [ "apps/studio/src/*" ], + "vendor/*": [ "vendor/*" ], + "@studio/common/*": [ "tools/common/*" ] + } + }, + "include": [ + "**/*" + ], + "exclude": [ "**/__mocks__/**/*", "**/node_modules/**/*", "**/dist/**/*", "**/out/**/*" ], + "references": [ + { "path": "../../tools/common" } + ] +} diff --git a/cli/types.ts b/apps/cli/types.ts similarity index 100% rename from cli/types.ts rename to apps/cli/types.ts diff --git a/vite.cli.config.ts b/apps/cli/vite.config.ts similarity index 59% rename from vite.cli.config.ts rename to apps/cli/vite.config.ts index 412c9e8f6c..0574fbad0b 100644 --- a/vite.cli.config.ts +++ b/apps/cli/vite.config.ts @@ -2,43 +2,47 @@ import { resolve } from 'path'; import { defineConfig } from 'vite'; import { viteStaticCopy } from 'vite-plugin-static-copy'; import { existsSync } from 'fs'; +import { readFileSync } from 'fs'; -const yargsLocalesPath = resolve( __dirname, 'node_modules/yargs/locales' ); -const cliNodeModulesPath = resolve( __dirname, 'cli/node_modules' ); +const yargsLocalesPath = resolve( __dirname, '../../node_modules/yargs/locales' ); +const cliNodeModulesPath = resolve( __dirname, 'node_modules' ); +const packageVersion = JSON.parse( + readFileSync( resolve( __dirname, 'package.json' ), 'utf-8' ) +).version; export default defineConfig( { plugins: [ ...( existsSync( yargsLocalesPath ) ? [ viteStaticCopy( { - targets: [ - { - src: 'node_modules/yargs/locales/*', - dest: '../locales', - }, - ], - } ), + targets: [ + { + src: `${ yargsLocalesPath }/*`, + dest: '../locales', + }, + ], + } ), ] : [] ), ...( existsSync( cliNodeModulesPath ) ? [ viteStaticCopy( { - targets: [ - { - src: 'cli/node_modules', - dest: '.', - }, - ], - } ), + targets: [ + { + src: cliNodeModulesPath, + dest: '.', + }, + ], + } ), ] : [] ), ], build: { lib: { entry: { - main: resolve( __dirname, 'cli/index.ts' ), - 'proxy-daemon': resolve( __dirname, 'cli/proxy-daemon.ts' ), - 'wordpress-server-child': resolve( __dirname, 'cli/wordpress-server-child.ts' ), + main: resolve( __dirname, 'index.ts' ), + 'proxy-daemon': resolve( __dirname, 'proxy-daemon.ts' ), + 'wordpress-server-child': resolve( __dirname, 'wordpress-server-child.ts' ), }, name: 'StudioCLI', formats: [ 'cjs' ], @@ -77,12 +81,15 @@ export default defineConfig( { }, resolve: { alias: { - cli: resolve( __dirname, 'cli' ), - src: resolve( __dirname, 'src' ), - vendor: resolve( __dirname, 'vendor' ), - common: resolve( __dirname, 'common' ), + cli: resolve( __dirname, '.' ), + src: resolve( __dirname, '../studio/src' ), + vendor: resolve( __dirname, '../../vendor' ), + '@studio/common': resolve( __dirname, '../../tools/common' ), }, conditions: [ 'node' ], mainFields: [ 'main' ], }, + define: { + __STUDIO_CLI_VERSION__: JSON.stringify( packageVersion ), + }, } ); diff --git a/cli/wordpress-server-child.ts b/apps/cli/wordpress-server-child.ts similarity index 96% rename from cli/wordpress-server-child.ts rename to apps/cli/wordpress-server-child.ts index f439e33aeb..a6b7260414 100644 --- a/cli/wordpress-server-child.ts +++ b/apps/cli/wordpress-server-child.ts @@ -21,13 +21,13 @@ import { InMemoryFilesystem, } from '@wp-playground/storage'; import { WordPressInstallMode } from '@wp-playground/wordpress'; -import { DEFAULT_PHP_VERSION } from 'common/constants'; -import { isWordPressDirectory } from 'common/lib/fs-utils'; -import { getMuPlugins } from 'common/lib/mu-plugins'; -import { decodePassword } from 'common/lib/passwords'; -import { formatPlaygroundCliMessage } from 'common/lib/playground-cli-messages'; -import { sequential } from 'common/lib/sequential'; -import { isWordPressDevVersion } from 'common/lib/wordpress-version-utils'; +import { DEFAULT_PHP_VERSION } from '@studio/common/constants'; +import { isWordPressDirectory } from '@studio/common/lib/fs-utils'; +import { getMuPlugins } from '@studio/common/lib/mu-plugins'; +import { decodePassword } from '@studio/common/lib/passwords'; +import { formatPlaygroundCliMessage } from '@studio/common/lib/playground-cli-messages'; +import { sequential } from '@studio/common/lib/sequential'; +import { isWordPressDevVersion } from '@studio/common/lib/wordpress-version-utils'; import { isSqliteInstalled } from 'src/lib/sqlite-versions'; import { z } from 'zod'; import { sanitizeRunCLIArgs } from 'cli/lib/cli-args-sanitizer'; diff --git a/assets/ai-icon.riv b/apps/studio/assets/ai-icon.riv similarity index 100% rename from assets/ai-icon.riv rename to apps/studio/assets/ai-icon.riv diff --git a/assets/appx/AppList.png b/apps/studio/assets/appx/AppList.png similarity index 100% rename from assets/appx/AppList.png rename to apps/studio/assets/appx/AppList.png diff --git a/assets/appx/AppList.scale-125.png b/apps/studio/assets/appx/AppList.scale-125.png similarity index 100% rename from assets/appx/AppList.scale-125.png rename to apps/studio/assets/appx/AppList.scale-125.png diff --git a/assets/appx/AppList.scale-150.png b/apps/studio/assets/appx/AppList.scale-150.png similarity index 100% rename from assets/appx/AppList.scale-150.png rename to apps/studio/assets/appx/AppList.scale-150.png diff --git a/assets/appx/AppList.scale-200.png b/apps/studio/assets/appx/AppList.scale-200.png similarity index 100% rename from assets/appx/AppList.scale-200.png rename to apps/studio/assets/appx/AppList.scale-200.png diff --git a/assets/appx/AppList.scale-400.png b/apps/studio/assets/appx/AppList.scale-400.png similarity index 100% rename from assets/appx/AppList.scale-400.png rename to apps/studio/assets/appx/AppList.scale-400.png diff --git a/assets/appx/AppList.targetsize-16.png b/apps/studio/assets/appx/AppList.targetsize-16.png similarity index 100% rename from assets/appx/AppList.targetsize-16.png rename to apps/studio/assets/appx/AppList.targetsize-16.png diff --git a/assets/appx/AppList.targetsize-16_altform-lightunplated.png b/apps/studio/assets/appx/AppList.targetsize-16_altform-lightunplated.png similarity index 100% rename from assets/appx/AppList.targetsize-16_altform-lightunplated.png rename to apps/studio/assets/appx/AppList.targetsize-16_altform-lightunplated.png diff --git a/assets/appx/AppList.targetsize-16_altform-unplated.png b/apps/studio/assets/appx/AppList.targetsize-16_altform-unplated.png similarity index 100% rename from assets/appx/AppList.targetsize-16_altform-unplated.png rename to apps/studio/assets/appx/AppList.targetsize-16_altform-unplated.png diff --git a/assets/appx/AppList.targetsize-20.png b/apps/studio/assets/appx/AppList.targetsize-20.png similarity index 100% rename from assets/appx/AppList.targetsize-20.png rename to apps/studio/assets/appx/AppList.targetsize-20.png diff --git a/assets/appx/AppList.targetsize-20_altform-lightunplated.png b/apps/studio/assets/appx/AppList.targetsize-20_altform-lightunplated.png similarity index 100% rename from assets/appx/AppList.targetsize-20_altform-lightunplated.png rename to apps/studio/assets/appx/AppList.targetsize-20_altform-lightunplated.png diff --git a/assets/appx/AppList.targetsize-20_altform-unplated.png b/apps/studio/assets/appx/AppList.targetsize-20_altform-unplated.png similarity index 100% rename from assets/appx/AppList.targetsize-20_altform-unplated.png rename to apps/studio/assets/appx/AppList.targetsize-20_altform-unplated.png diff --git a/assets/appx/AppList.targetsize-24.png b/apps/studio/assets/appx/AppList.targetsize-24.png similarity index 100% rename from assets/appx/AppList.targetsize-24.png rename to apps/studio/assets/appx/AppList.targetsize-24.png diff --git a/assets/appx/AppList.targetsize-24_altform-lightunplated.png b/apps/studio/assets/appx/AppList.targetsize-24_altform-lightunplated.png similarity index 100% rename from assets/appx/AppList.targetsize-24_altform-lightunplated.png rename to apps/studio/assets/appx/AppList.targetsize-24_altform-lightunplated.png diff --git a/assets/appx/AppList.targetsize-24_altform-unplated.png b/apps/studio/assets/appx/AppList.targetsize-24_altform-unplated.png similarity index 100% rename from assets/appx/AppList.targetsize-24_altform-unplated.png rename to apps/studio/assets/appx/AppList.targetsize-24_altform-unplated.png diff --git a/assets/appx/AppList.targetsize-256.png b/apps/studio/assets/appx/AppList.targetsize-256.png similarity index 100% rename from assets/appx/AppList.targetsize-256.png rename to apps/studio/assets/appx/AppList.targetsize-256.png diff --git a/assets/appx/AppList.targetsize-256_altform-lightunplated.png b/apps/studio/assets/appx/AppList.targetsize-256_altform-lightunplated.png similarity index 100% rename from assets/appx/AppList.targetsize-256_altform-lightunplated.png rename to apps/studio/assets/appx/AppList.targetsize-256_altform-lightunplated.png diff --git a/assets/appx/AppList.targetsize-256_altform-unplated.png b/apps/studio/assets/appx/AppList.targetsize-256_altform-unplated.png similarity index 100% rename from assets/appx/AppList.targetsize-256_altform-unplated.png rename to apps/studio/assets/appx/AppList.targetsize-256_altform-unplated.png diff --git a/assets/appx/AppList.targetsize-30.png b/apps/studio/assets/appx/AppList.targetsize-30.png similarity index 100% rename from assets/appx/AppList.targetsize-30.png rename to apps/studio/assets/appx/AppList.targetsize-30.png diff --git a/assets/appx/AppList.targetsize-30_altform-lightunplated.png b/apps/studio/assets/appx/AppList.targetsize-30_altform-lightunplated.png similarity index 100% rename from assets/appx/AppList.targetsize-30_altform-lightunplated.png rename to apps/studio/assets/appx/AppList.targetsize-30_altform-lightunplated.png diff --git a/assets/appx/AppList.targetsize-30_altform-unplated.png b/apps/studio/assets/appx/AppList.targetsize-30_altform-unplated.png similarity index 100% rename from assets/appx/AppList.targetsize-30_altform-unplated.png rename to apps/studio/assets/appx/AppList.targetsize-30_altform-unplated.png diff --git a/assets/appx/AppList.targetsize-32.png b/apps/studio/assets/appx/AppList.targetsize-32.png similarity index 100% rename from assets/appx/AppList.targetsize-32.png rename to apps/studio/assets/appx/AppList.targetsize-32.png diff --git a/assets/appx/AppList.targetsize-32_altform-lightunplated.png b/apps/studio/assets/appx/AppList.targetsize-32_altform-lightunplated.png similarity index 100% rename from assets/appx/AppList.targetsize-32_altform-lightunplated.png rename to apps/studio/assets/appx/AppList.targetsize-32_altform-lightunplated.png diff --git a/assets/appx/AppList.targetsize-32_altform-unplated.png b/apps/studio/assets/appx/AppList.targetsize-32_altform-unplated.png similarity index 100% rename from assets/appx/AppList.targetsize-32_altform-unplated.png rename to apps/studio/assets/appx/AppList.targetsize-32_altform-unplated.png diff --git a/assets/appx/AppList.targetsize-36.png b/apps/studio/assets/appx/AppList.targetsize-36.png similarity index 100% rename from assets/appx/AppList.targetsize-36.png rename to apps/studio/assets/appx/AppList.targetsize-36.png diff --git a/assets/appx/AppList.targetsize-36_altform-lightunplated.png b/apps/studio/assets/appx/AppList.targetsize-36_altform-lightunplated.png similarity index 100% rename from assets/appx/AppList.targetsize-36_altform-lightunplated.png rename to apps/studio/assets/appx/AppList.targetsize-36_altform-lightunplated.png diff --git a/assets/appx/AppList.targetsize-36_altform-unplated.png b/apps/studio/assets/appx/AppList.targetsize-36_altform-unplated.png similarity index 100% rename from assets/appx/AppList.targetsize-36_altform-unplated.png rename to apps/studio/assets/appx/AppList.targetsize-36_altform-unplated.png diff --git a/assets/appx/AppList.targetsize-40.png b/apps/studio/assets/appx/AppList.targetsize-40.png similarity index 100% rename from assets/appx/AppList.targetsize-40.png rename to apps/studio/assets/appx/AppList.targetsize-40.png diff --git a/assets/appx/AppList.targetsize-40_altform-lightunplated.png b/apps/studio/assets/appx/AppList.targetsize-40_altform-lightunplated.png similarity index 100% rename from assets/appx/AppList.targetsize-40_altform-lightunplated.png rename to apps/studio/assets/appx/AppList.targetsize-40_altform-lightunplated.png diff --git a/assets/appx/AppList.targetsize-40_altform-unplated.png b/apps/studio/assets/appx/AppList.targetsize-40_altform-unplated.png similarity index 100% rename from assets/appx/AppList.targetsize-40_altform-unplated.png rename to apps/studio/assets/appx/AppList.targetsize-40_altform-unplated.png diff --git a/assets/appx/AppList.targetsize-48.png b/apps/studio/assets/appx/AppList.targetsize-48.png similarity index 100% rename from assets/appx/AppList.targetsize-48.png rename to apps/studio/assets/appx/AppList.targetsize-48.png diff --git a/assets/appx/AppList.targetsize-48_altform-lightunplated.png b/apps/studio/assets/appx/AppList.targetsize-48_altform-lightunplated.png similarity index 100% rename from assets/appx/AppList.targetsize-48_altform-lightunplated.png rename to apps/studio/assets/appx/AppList.targetsize-48_altform-lightunplated.png diff --git a/assets/appx/AppList.targetsize-48_altform-unplated.png b/apps/studio/assets/appx/AppList.targetsize-48_altform-unplated.png similarity index 100% rename from assets/appx/AppList.targetsize-48_altform-unplated.png rename to apps/studio/assets/appx/AppList.targetsize-48_altform-unplated.png diff --git a/assets/appx/AppList.targetsize-60.png b/apps/studio/assets/appx/AppList.targetsize-60.png similarity index 100% rename from assets/appx/AppList.targetsize-60.png rename to apps/studio/assets/appx/AppList.targetsize-60.png diff --git a/assets/appx/AppList.targetsize-60_altform-lightunplated.png b/apps/studio/assets/appx/AppList.targetsize-60_altform-lightunplated.png similarity index 100% rename from assets/appx/AppList.targetsize-60_altform-lightunplated.png rename to apps/studio/assets/appx/AppList.targetsize-60_altform-lightunplated.png diff --git a/assets/appx/AppList.targetsize-60_altform-unplated.png b/apps/studio/assets/appx/AppList.targetsize-60_altform-unplated.png similarity index 100% rename from assets/appx/AppList.targetsize-60_altform-unplated.png rename to apps/studio/assets/appx/AppList.targetsize-60_altform-unplated.png diff --git a/assets/appx/AppList.targetsize-64.png b/apps/studio/assets/appx/AppList.targetsize-64.png similarity index 100% rename from assets/appx/AppList.targetsize-64.png rename to apps/studio/assets/appx/AppList.targetsize-64.png diff --git a/assets/appx/AppList.targetsize-64_altform-lightunplated.png b/apps/studio/assets/appx/AppList.targetsize-64_altform-lightunplated.png similarity index 100% rename from assets/appx/AppList.targetsize-64_altform-lightunplated.png rename to apps/studio/assets/appx/AppList.targetsize-64_altform-lightunplated.png diff --git a/assets/appx/AppList.targetsize-64_altform-unplated.png b/apps/studio/assets/appx/AppList.targetsize-64_altform-unplated.png similarity index 100% rename from assets/appx/AppList.targetsize-64_altform-unplated.png rename to apps/studio/assets/appx/AppList.targetsize-64_altform-unplated.png diff --git a/assets/appx/AppList.targetsize-72.png b/apps/studio/assets/appx/AppList.targetsize-72.png similarity index 100% rename from assets/appx/AppList.targetsize-72.png rename to apps/studio/assets/appx/AppList.targetsize-72.png diff --git a/assets/appx/AppList.targetsize-72_altform-lightunplated.png b/apps/studio/assets/appx/AppList.targetsize-72_altform-lightunplated.png similarity index 100% rename from assets/appx/AppList.targetsize-72_altform-lightunplated.png rename to apps/studio/assets/appx/AppList.targetsize-72_altform-lightunplated.png diff --git a/assets/appx/AppList.targetsize-72_altform-unplated.png b/apps/studio/assets/appx/AppList.targetsize-72_altform-unplated.png similarity index 100% rename from assets/appx/AppList.targetsize-72_altform-unplated.png rename to apps/studio/assets/appx/AppList.targetsize-72_altform-unplated.png diff --git a/assets/appx/AppList.targetsize-80.png b/apps/studio/assets/appx/AppList.targetsize-80.png similarity index 100% rename from assets/appx/AppList.targetsize-80.png rename to apps/studio/assets/appx/AppList.targetsize-80.png diff --git a/assets/appx/AppList.targetsize-80_altform-lightunplated.png b/apps/studio/assets/appx/AppList.targetsize-80_altform-lightunplated.png similarity index 100% rename from assets/appx/AppList.targetsize-80_altform-lightunplated.png rename to apps/studio/assets/appx/AppList.targetsize-80_altform-lightunplated.png diff --git a/assets/appx/AppList.targetsize-80_altform-unplated.png b/apps/studio/assets/appx/AppList.targetsize-80_altform-unplated.png similarity index 100% rename from assets/appx/AppList.targetsize-80_altform-unplated.png rename to apps/studio/assets/appx/AppList.targetsize-80_altform-unplated.png diff --git a/assets/appx/AppList.targetsize-96.png b/apps/studio/assets/appx/AppList.targetsize-96.png similarity index 100% rename from assets/appx/AppList.targetsize-96.png rename to apps/studio/assets/appx/AppList.targetsize-96.png diff --git a/assets/appx/AppList.targetsize-96_altform-lightunplated.png b/apps/studio/assets/appx/AppList.targetsize-96_altform-lightunplated.png similarity index 100% rename from assets/appx/AppList.targetsize-96_altform-lightunplated.png rename to apps/studio/assets/appx/AppList.targetsize-96_altform-lightunplated.png diff --git a/assets/appx/AppList.targetsize-96_altform-unplated.png b/apps/studio/assets/appx/AppList.targetsize-96_altform-unplated.png similarity index 100% rename from assets/appx/AppList.targetsize-96_altform-unplated.png rename to apps/studio/assets/appx/AppList.targetsize-96_altform-unplated.png diff --git a/assets/appx/LargeTile.scale-100.png b/apps/studio/assets/appx/LargeTile.scale-100.png similarity index 100% rename from assets/appx/LargeTile.scale-100.png rename to apps/studio/assets/appx/LargeTile.scale-100.png diff --git a/assets/appx/LargeTile.scale-100_altform-colorful_theme-light.png b/apps/studio/assets/appx/LargeTile.scale-100_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/LargeTile.scale-100_altform-colorful_theme-light.png rename to apps/studio/assets/appx/LargeTile.scale-100_altform-colorful_theme-light.png diff --git a/assets/appx/LargeTile.scale-125.png b/apps/studio/assets/appx/LargeTile.scale-125.png similarity index 100% rename from assets/appx/LargeTile.scale-125.png rename to apps/studio/assets/appx/LargeTile.scale-125.png diff --git a/assets/appx/LargeTile.scale-125_altform-colorful_theme-light.png b/apps/studio/assets/appx/LargeTile.scale-125_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/LargeTile.scale-125_altform-colorful_theme-light.png rename to apps/studio/assets/appx/LargeTile.scale-125_altform-colorful_theme-light.png diff --git a/assets/appx/LargeTile.scale-150.png b/apps/studio/assets/appx/LargeTile.scale-150.png similarity index 100% rename from assets/appx/LargeTile.scale-150.png rename to apps/studio/assets/appx/LargeTile.scale-150.png diff --git a/assets/appx/LargeTile.scale-150_altform-colorful_theme-light.png b/apps/studio/assets/appx/LargeTile.scale-150_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/LargeTile.scale-150_altform-colorful_theme-light.png rename to apps/studio/assets/appx/LargeTile.scale-150_altform-colorful_theme-light.png diff --git a/assets/appx/LargeTile.scale-200.png b/apps/studio/assets/appx/LargeTile.scale-200.png similarity index 100% rename from assets/appx/LargeTile.scale-200.png rename to apps/studio/assets/appx/LargeTile.scale-200.png diff --git a/assets/appx/LargeTile.scale-200_altform-colorful_theme-light.png b/apps/studio/assets/appx/LargeTile.scale-200_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/LargeTile.scale-200_altform-colorful_theme-light.png rename to apps/studio/assets/appx/LargeTile.scale-200_altform-colorful_theme-light.png diff --git a/assets/appx/LargeTile.scale-400.png b/apps/studio/assets/appx/LargeTile.scale-400.png similarity index 100% rename from assets/appx/LargeTile.scale-400.png rename to apps/studio/assets/appx/LargeTile.scale-400.png diff --git a/assets/appx/LargeTile.scale-400_altform-colorful_theme-light.png b/apps/studio/assets/appx/LargeTile.scale-400_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/LargeTile.scale-400_altform-colorful_theme-light.png rename to apps/studio/assets/appx/LargeTile.scale-400_altform-colorful_theme-light.png diff --git a/assets/appx/MedTile.scale-100.png b/apps/studio/assets/appx/MedTile.scale-100.png similarity index 100% rename from assets/appx/MedTile.scale-100.png rename to apps/studio/assets/appx/MedTile.scale-100.png diff --git a/assets/appx/MedTile.scale-100_altform-colorful_theme-light.png b/apps/studio/assets/appx/MedTile.scale-100_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/MedTile.scale-100_altform-colorful_theme-light.png rename to apps/studio/assets/appx/MedTile.scale-100_altform-colorful_theme-light.png diff --git a/assets/appx/MedTile.scale-125.png b/apps/studio/assets/appx/MedTile.scale-125.png similarity index 100% rename from assets/appx/MedTile.scale-125.png rename to apps/studio/assets/appx/MedTile.scale-125.png diff --git a/assets/appx/MedTile.scale-125_altform-colorful_theme-light.png b/apps/studio/assets/appx/MedTile.scale-125_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/MedTile.scale-125_altform-colorful_theme-light.png rename to apps/studio/assets/appx/MedTile.scale-125_altform-colorful_theme-light.png diff --git a/assets/appx/MedTile.scale-150.png b/apps/studio/assets/appx/MedTile.scale-150.png similarity index 100% rename from assets/appx/MedTile.scale-150.png rename to apps/studio/assets/appx/MedTile.scale-150.png diff --git a/assets/appx/MedTile.scale-150_altform-colorful_theme-light.png b/apps/studio/assets/appx/MedTile.scale-150_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/MedTile.scale-150_altform-colorful_theme-light.png rename to apps/studio/assets/appx/MedTile.scale-150_altform-colorful_theme-light.png diff --git a/assets/appx/MedTile.scale-200.png b/apps/studio/assets/appx/MedTile.scale-200.png similarity index 100% rename from assets/appx/MedTile.scale-200.png rename to apps/studio/assets/appx/MedTile.scale-200.png diff --git a/assets/appx/MedTile.scale-200_altform-colorful_theme-light.png b/apps/studio/assets/appx/MedTile.scale-200_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/MedTile.scale-200_altform-colorful_theme-light.png rename to apps/studio/assets/appx/MedTile.scale-200_altform-colorful_theme-light.png diff --git a/assets/appx/MedTile.scale-400.png b/apps/studio/assets/appx/MedTile.scale-400.png similarity index 100% rename from assets/appx/MedTile.scale-400.png rename to apps/studio/assets/appx/MedTile.scale-400.png diff --git a/assets/appx/MedTile.scale-400_altform-colorful_theme-light.png b/apps/studio/assets/appx/MedTile.scale-400_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/MedTile.scale-400_altform-colorful_theme-light.png rename to apps/studio/assets/appx/MedTile.scale-400_altform-colorful_theme-light.png diff --git a/assets/appx/SmallTile.scale-100.png b/apps/studio/assets/appx/SmallTile.scale-100.png similarity index 100% rename from assets/appx/SmallTile.scale-100.png rename to apps/studio/assets/appx/SmallTile.scale-100.png diff --git a/assets/appx/SmallTile.scale-100_altform-colorful_theme-light.png b/apps/studio/assets/appx/SmallTile.scale-100_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/SmallTile.scale-100_altform-colorful_theme-light.png rename to apps/studio/assets/appx/SmallTile.scale-100_altform-colorful_theme-light.png diff --git a/assets/appx/SmallTile.scale-125.png b/apps/studio/assets/appx/SmallTile.scale-125.png similarity index 100% rename from assets/appx/SmallTile.scale-125.png rename to apps/studio/assets/appx/SmallTile.scale-125.png diff --git a/assets/appx/SmallTile.scale-125_altform-colorful_theme-light.png b/apps/studio/assets/appx/SmallTile.scale-125_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/SmallTile.scale-125_altform-colorful_theme-light.png rename to apps/studio/assets/appx/SmallTile.scale-125_altform-colorful_theme-light.png diff --git a/assets/appx/SmallTile.scale-150.png b/apps/studio/assets/appx/SmallTile.scale-150.png similarity index 100% rename from assets/appx/SmallTile.scale-150.png rename to apps/studio/assets/appx/SmallTile.scale-150.png diff --git a/assets/appx/SmallTile.scale-150_altform-colorful_theme-light.png b/apps/studio/assets/appx/SmallTile.scale-150_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/SmallTile.scale-150_altform-colorful_theme-light.png rename to apps/studio/assets/appx/SmallTile.scale-150_altform-colorful_theme-light.png diff --git a/assets/appx/SmallTile.scale-200.png b/apps/studio/assets/appx/SmallTile.scale-200.png similarity index 100% rename from assets/appx/SmallTile.scale-200.png rename to apps/studio/assets/appx/SmallTile.scale-200.png diff --git a/assets/appx/SmallTile.scale-200_altform-colorful_theme-light.png b/apps/studio/assets/appx/SmallTile.scale-200_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/SmallTile.scale-200_altform-colorful_theme-light.png rename to apps/studio/assets/appx/SmallTile.scale-200_altform-colorful_theme-light.png diff --git a/assets/appx/SmallTile.scale-400.png b/apps/studio/assets/appx/SmallTile.scale-400.png similarity index 100% rename from assets/appx/SmallTile.scale-400.png rename to apps/studio/assets/appx/SmallTile.scale-400.png diff --git a/assets/appx/SmallTile.scale-400_altform-colorful_theme-light.png b/apps/studio/assets/appx/SmallTile.scale-400_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/SmallTile.scale-400_altform-colorful_theme-light.png rename to apps/studio/assets/appx/SmallTile.scale-400_altform-colorful_theme-light.png diff --git a/assets/appx/SplashScreen.scale-100.png b/apps/studio/assets/appx/SplashScreen.scale-100.png similarity index 100% rename from assets/appx/SplashScreen.scale-100.png rename to apps/studio/assets/appx/SplashScreen.scale-100.png diff --git a/assets/appx/SplashScreen.scale-100_altform-colorful_theme-dark.png b/apps/studio/assets/appx/SplashScreen.scale-100_altform-colorful_theme-dark.png similarity index 100% rename from assets/appx/SplashScreen.scale-100_altform-colorful_theme-dark.png rename to apps/studio/assets/appx/SplashScreen.scale-100_altform-colorful_theme-dark.png diff --git a/assets/appx/SplashScreen.scale-100_altform-colorful_theme-light.png b/apps/studio/assets/appx/SplashScreen.scale-100_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/SplashScreen.scale-100_altform-colorful_theme-light.png rename to apps/studio/assets/appx/SplashScreen.scale-100_altform-colorful_theme-light.png diff --git a/assets/appx/SplashScreen.scale-125.png b/apps/studio/assets/appx/SplashScreen.scale-125.png similarity index 100% rename from assets/appx/SplashScreen.scale-125.png rename to apps/studio/assets/appx/SplashScreen.scale-125.png diff --git a/assets/appx/SplashScreen.scale-125_altform-colorful_theme-dark.png b/apps/studio/assets/appx/SplashScreen.scale-125_altform-colorful_theme-dark.png similarity index 100% rename from assets/appx/SplashScreen.scale-125_altform-colorful_theme-dark.png rename to apps/studio/assets/appx/SplashScreen.scale-125_altform-colorful_theme-dark.png diff --git a/assets/appx/SplashScreen.scale-125_altform-colorful_theme-light.png b/apps/studio/assets/appx/SplashScreen.scale-125_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/SplashScreen.scale-125_altform-colorful_theme-light.png rename to apps/studio/assets/appx/SplashScreen.scale-125_altform-colorful_theme-light.png diff --git a/assets/appx/SplashScreen.scale-150.png b/apps/studio/assets/appx/SplashScreen.scale-150.png similarity index 100% rename from assets/appx/SplashScreen.scale-150.png rename to apps/studio/assets/appx/SplashScreen.scale-150.png diff --git a/assets/appx/SplashScreen.scale-150_altform-colorful_theme-dark.png b/apps/studio/assets/appx/SplashScreen.scale-150_altform-colorful_theme-dark.png similarity index 100% rename from assets/appx/SplashScreen.scale-150_altform-colorful_theme-dark.png rename to apps/studio/assets/appx/SplashScreen.scale-150_altform-colorful_theme-dark.png diff --git a/assets/appx/SplashScreen.scale-150_altform-colorful_theme-light.png b/apps/studio/assets/appx/SplashScreen.scale-150_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/SplashScreen.scale-150_altform-colorful_theme-light.png rename to apps/studio/assets/appx/SplashScreen.scale-150_altform-colorful_theme-light.png diff --git a/assets/appx/SplashScreen.scale-200.png b/apps/studio/assets/appx/SplashScreen.scale-200.png similarity index 100% rename from assets/appx/SplashScreen.scale-200.png rename to apps/studio/assets/appx/SplashScreen.scale-200.png diff --git a/assets/appx/SplashScreen.scale-200_altform-colorful_theme-dark.png b/apps/studio/assets/appx/SplashScreen.scale-200_altform-colorful_theme-dark.png similarity index 100% rename from assets/appx/SplashScreen.scale-200_altform-colorful_theme-dark.png rename to apps/studio/assets/appx/SplashScreen.scale-200_altform-colorful_theme-dark.png diff --git a/assets/appx/SplashScreen.scale-200_altform-colorful_theme-light.png b/apps/studio/assets/appx/SplashScreen.scale-200_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/SplashScreen.scale-200_altform-colorful_theme-light.png rename to apps/studio/assets/appx/SplashScreen.scale-200_altform-colorful_theme-light.png diff --git a/assets/appx/SplashScreen.scale-400.png b/apps/studio/assets/appx/SplashScreen.scale-400.png similarity index 100% rename from assets/appx/SplashScreen.scale-400.png rename to apps/studio/assets/appx/SplashScreen.scale-400.png diff --git a/assets/appx/SplashScreen.scale-400_altform-colorful_theme-dark.png b/apps/studio/assets/appx/SplashScreen.scale-400_altform-colorful_theme-dark.png similarity index 100% rename from assets/appx/SplashScreen.scale-400_altform-colorful_theme-dark.png rename to apps/studio/assets/appx/SplashScreen.scale-400_altform-colorful_theme-dark.png diff --git a/assets/appx/SplashScreen.scale-400_altform-colorful_theme-light.png b/apps/studio/assets/appx/SplashScreen.scale-400_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/SplashScreen.scale-400_altform-colorful_theme-light.png rename to apps/studio/assets/appx/SplashScreen.scale-400_altform-colorful_theme-light.png diff --git a/assets/appx/Square150x150Logo.png b/apps/studio/assets/appx/Square150x150Logo.png similarity index 100% rename from assets/appx/Square150x150Logo.png rename to apps/studio/assets/appx/Square150x150Logo.png diff --git a/assets/appx/Square44x44Logo.png b/apps/studio/assets/appx/Square44x44Logo.png similarity index 100% rename from assets/appx/Square44x44Logo.png rename to apps/studio/assets/appx/Square44x44Logo.png diff --git a/assets/appx/StoreLogo.png b/apps/studio/assets/appx/StoreLogo.png similarity index 100% rename from assets/appx/StoreLogo.png rename to apps/studio/assets/appx/StoreLogo.png diff --git a/assets/appx/StoreLogo.scale-100.png b/apps/studio/assets/appx/StoreLogo.scale-100.png similarity index 100% rename from assets/appx/StoreLogo.scale-100.png rename to apps/studio/assets/appx/StoreLogo.scale-100.png diff --git a/assets/appx/StoreLogo.scale-100_altform-colorful_theme-light.png b/apps/studio/assets/appx/StoreLogo.scale-100_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/StoreLogo.scale-100_altform-colorful_theme-light.png rename to apps/studio/assets/appx/StoreLogo.scale-100_altform-colorful_theme-light.png diff --git a/assets/appx/StoreLogo.scale-125.png b/apps/studio/assets/appx/StoreLogo.scale-125.png similarity index 100% rename from assets/appx/StoreLogo.scale-125.png rename to apps/studio/assets/appx/StoreLogo.scale-125.png diff --git a/assets/appx/StoreLogo.scale-125_altform-colorful_theme-light.png b/apps/studio/assets/appx/StoreLogo.scale-125_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/StoreLogo.scale-125_altform-colorful_theme-light.png rename to apps/studio/assets/appx/StoreLogo.scale-125_altform-colorful_theme-light.png diff --git a/assets/appx/StoreLogo.scale-150.png b/apps/studio/assets/appx/StoreLogo.scale-150.png similarity index 100% rename from assets/appx/StoreLogo.scale-150.png rename to apps/studio/assets/appx/StoreLogo.scale-150.png diff --git a/assets/appx/StoreLogo.scale-150_altform-colorful_theme-light.png b/apps/studio/assets/appx/StoreLogo.scale-150_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/StoreLogo.scale-150_altform-colorful_theme-light.png rename to apps/studio/assets/appx/StoreLogo.scale-150_altform-colorful_theme-light.png diff --git a/assets/appx/StoreLogo.scale-200.png b/apps/studio/assets/appx/StoreLogo.scale-200.png similarity index 100% rename from assets/appx/StoreLogo.scale-200.png rename to apps/studio/assets/appx/StoreLogo.scale-200.png diff --git a/assets/appx/StoreLogo.scale-200_altform-colorful_theme-light.png b/apps/studio/assets/appx/StoreLogo.scale-200_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/StoreLogo.scale-200_altform-colorful_theme-light.png rename to apps/studio/assets/appx/StoreLogo.scale-200_altform-colorful_theme-light.png diff --git a/assets/appx/StoreLogo.scale-400.png b/apps/studio/assets/appx/StoreLogo.scale-400.png similarity index 100% rename from assets/appx/StoreLogo.scale-400.png rename to apps/studio/assets/appx/StoreLogo.scale-400.png diff --git a/assets/appx/StoreLogo.scale-400_altform-colorful_theme-light.png b/apps/studio/assets/appx/StoreLogo.scale-400_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/StoreLogo.scale-400_altform-colorful_theme-light.png rename to apps/studio/assets/appx/StoreLogo.scale-400_altform-colorful_theme-light.png diff --git a/assets/appx/Wide310x150Logo.png b/apps/studio/assets/appx/Wide310x150Logo.png similarity index 100% rename from assets/appx/Wide310x150Logo.png rename to apps/studio/assets/appx/Wide310x150Logo.png diff --git a/assets/appx/WideTile.scale-100.png b/apps/studio/assets/appx/WideTile.scale-100.png similarity index 100% rename from assets/appx/WideTile.scale-100.png rename to apps/studio/assets/appx/WideTile.scale-100.png diff --git a/assets/appx/WideTile.scale-100_altform-colorful_theme-light.png b/apps/studio/assets/appx/WideTile.scale-100_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/WideTile.scale-100_altform-colorful_theme-light.png rename to apps/studio/assets/appx/WideTile.scale-100_altform-colorful_theme-light.png diff --git a/assets/appx/WideTile.scale-125.png b/apps/studio/assets/appx/WideTile.scale-125.png similarity index 100% rename from assets/appx/WideTile.scale-125.png rename to apps/studio/assets/appx/WideTile.scale-125.png diff --git a/assets/appx/WideTile.scale-125_altform-colorful_theme-light.png b/apps/studio/assets/appx/WideTile.scale-125_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/WideTile.scale-125_altform-colorful_theme-light.png rename to apps/studio/assets/appx/WideTile.scale-125_altform-colorful_theme-light.png diff --git a/assets/appx/WideTile.scale-150.png b/apps/studio/assets/appx/WideTile.scale-150.png similarity index 100% rename from assets/appx/WideTile.scale-150.png rename to apps/studio/assets/appx/WideTile.scale-150.png diff --git a/assets/appx/WideTile.scale-150_altform-colorful_theme-light.png b/apps/studio/assets/appx/WideTile.scale-150_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/WideTile.scale-150_altform-colorful_theme-light.png rename to apps/studio/assets/appx/WideTile.scale-150_altform-colorful_theme-light.png diff --git a/assets/appx/WideTile.scale-200.png b/apps/studio/assets/appx/WideTile.scale-200.png similarity index 100% rename from assets/appx/WideTile.scale-200.png rename to apps/studio/assets/appx/WideTile.scale-200.png diff --git a/assets/appx/WideTile.scale-200_altform-colorful_theme-light.png b/apps/studio/assets/appx/WideTile.scale-200_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/WideTile.scale-200_altform-colorful_theme-light.png rename to apps/studio/assets/appx/WideTile.scale-200_altform-colorful_theme-light.png diff --git a/assets/appx/WideTile.scale-400.png b/apps/studio/assets/appx/WideTile.scale-400.png similarity index 100% rename from assets/appx/WideTile.scale-400.png rename to apps/studio/assets/appx/WideTile.scale-400.png diff --git a/assets/appx/WideTile.scale-400_altform-colorful_theme-light.png b/apps/studio/assets/appx/WideTile.scale-400_altform-colorful_theme-light.png similarity index 100% rename from assets/appx/WideTile.scale-400_altform-colorful_theme-light.png rename to apps/studio/assets/appx/WideTile.scale-400_altform-colorful_theme-light.png diff --git a/assets/dmg-background.png b/apps/studio/assets/dmg-background.png similarity index 100% rename from assets/dmg-background.png rename to apps/studio/assets/dmg-background.png diff --git a/assets/dmg-background@2x.png b/apps/studio/assets/dmg-background@2x.png similarity index 100% rename from assets/dmg-background@2x.png rename to apps/studio/assets/dmg-background@2x.png diff --git a/assets/studio-app-icon.icns b/apps/studio/assets/studio-app-icon.icns similarity index 100% rename from assets/studio-app-icon.icns rename to apps/studio/assets/studio-app-icon.icns diff --git a/assets/studio-app-icon.ico b/apps/studio/assets/studio-app-icon.ico similarity index 100% rename from assets/studio-app-icon.ico rename to apps/studio/assets/studio-app-icon.ico diff --git a/assets/studio-app-icon.png b/apps/studio/assets/studio-app-icon.png similarity index 100% rename from assets/studio-app-icon.png rename to apps/studio/assets/studio-app-icon.png diff --git a/assets/titlebar-icon.svg b/apps/studio/assets/titlebar-icon.svg similarity index 100% rename from assets/titlebar-icon.svg rename to apps/studio/assets/titlebar-icon.svg diff --git a/bin/install-studio-cli.sh b/apps/studio/bin/install-studio-cli.sh similarity index 100% rename from bin/install-studio-cli.sh rename to apps/studio/bin/install-studio-cli.sh diff --git a/bin/studio-cli.bat b/apps/studio/bin/studio-cli.bat similarity index 100% rename from bin/studio-cli.bat rename to apps/studio/bin/studio-cli.bat diff --git a/bin/studio-cli.sh b/apps/studio/bin/studio-cli.sh similarity index 100% rename from bin/studio-cli.sh rename to apps/studio/bin/studio-cli.sh diff --git a/bin/uninstall-studio-cli.sh b/apps/studio/bin/uninstall-studio-cli.sh similarity index 100% rename from bin/uninstall-studio-cli.sh rename to apps/studio/bin/uninstall-studio-cli.sh diff --git a/e2e/app.test.ts b/apps/studio/e2e/app.test.ts similarity index 100% rename from e2e/app.test.ts rename to apps/studio/e2e/app.test.ts diff --git a/e2e/blueprints.test.ts b/apps/studio/e2e/blueprints.test.ts similarity index 100% rename from e2e/blueprints.test.ts rename to apps/studio/e2e/blueprints.test.ts diff --git a/e2e/constants.ts b/apps/studio/e2e/constants.ts similarity index 100% rename from e2e/constants.ts rename to apps/studio/e2e/constants.ts diff --git a/e2e/e2e-helpers.ts b/apps/studio/e2e/e2e-helpers.ts similarity index 100% rename from e2e/e2e-helpers.ts rename to apps/studio/e2e/e2e-helpers.ts diff --git a/e2e/fixtures/blueprints/activate-plugin.json b/apps/studio/e2e/fixtures/blueprints/activate-plugin.json similarity index 100% rename from e2e/fixtures/blueprints/activate-plugin.json rename to apps/studio/e2e/fixtures/blueprints/activate-plugin.json diff --git a/e2e/fixtures/blueprints/activate-theme.json b/apps/studio/e2e/fixtures/blueprints/activate-theme.json similarity index 100% rename from e2e/fixtures/blueprints/activate-theme.json rename to apps/studio/e2e/fixtures/blueprints/activate-theme.json diff --git a/e2e/fixtures/blueprints/install-plugin.json b/apps/studio/e2e/fixtures/blueprints/install-plugin.json similarity index 100% rename from e2e/fixtures/blueprints/install-plugin.json rename to apps/studio/e2e/fixtures/blueprints/install-plugin.json diff --git a/e2e/fixtures/blueprints/install-theme.json b/apps/studio/e2e/fixtures/blueprints/install-theme.json similarity index 100% rename from e2e/fixtures/blueprints/install-theme.json rename to apps/studio/e2e/fixtures/blueprints/install-theme.json diff --git a/e2e/fixtures/blueprints/run-php-code.json b/apps/studio/e2e/fixtures/blueprints/run-php-code.json similarity index 100% rename from e2e/fixtures/blueprints/run-php-code.json rename to apps/studio/e2e/fixtures/blueprints/run-php-code.json diff --git a/e2e/fixtures/blueprints/wp-cli-command.json b/apps/studio/e2e/fixtures/blueprints/wp-cli-command.json similarity index 100% rename from e2e/fixtures/blueprints/wp-cli-command.json rename to apps/studio/e2e/fixtures/blueprints/wp-cli-command.json diff --git a/e2e/fixtures/sql/invalid-database.sql b/apps/studio/e2e/fixtures/sql/invalid-database.sql similarity index 100% rename from e2e/fixtures/sql/invalid-database.sql rename to apps/studio/e2e/fixtures/sql/invalid-database.sql diff --git a/e2e/import-export.test.ts b/apps/studio/e2e/import-export.test.ts similarity index 100% rename from e2e/import-export.test.ts rename to apps/studio/e2e/import-export.test.ts diff --git a/e2e/import.test.ts b/apps/studio/e2e/import.test.ts similarity index 100% rename from e2e/import.test.ts rename to apps/studio/e2e/import.test.ts diff --git a/e2e/imports/readme.md b/apps/studio/e2e/imports/readme.md similarity index 100% rename from e2e/imports/readme.md rename to apps/studio/e2e/imports/readme.md diff --git a/e2e/localization.test.ts b/apps/studio/e2e/localization.test.ts similarity index 100% rename from e2e/localization.test.ts rename to apps/studio/e2e/localization.test.ts diff --git a/e2e/overview-customize-links.test.ts b/apps/studio/e2e/overview-customize-links.test.ts similarity index 100% rename from e2e/overview-customize-links.test.ts rename to apps/studio/e2e/overview-customize-links.test.ts diff --git a/e2e/page-objects/add-site-modal.ts b/apps/studio/e2e/page-objects/add-site-modal.ts similarity index 100% rename from e2e/page-objects/add-site-modal.ts rename to apps/studio/e2e/page-objects/add-site-modal.ts diff --git a/e2e/page-objects/import-export-tab.ts b/apps/studio/e2e/page-objects/import-export-tab.ts similarity index 100% rename from e2e/page-objects/import-export-tab.ts rename to apps/studio/e2e/page-objects/import-export-tab.ts diff --git a/e2e/page-objects/main-sidebar.ts b/apps/studio/e2e/page-objects/main-sidebar.ts similarity index 100% rename from e2e/page-objects/main-sidebar.ts rename to apps/studio/e2e/page-objects/main-sidebar.ts diff --git a/e2e/page-objects/onboarding.ts b/apps/studio/e2e/page-objects/onboarding.ts similarity index 100% rename from e2e/page-objects/onboarding.ts rename to apps/studio/e2e/page-objects/onboarding.ts diff --git a/e2e/page-objects/settings-tab.ts b/apps/studio/e2e/page-objects/settings-tab.ts similarity index 100% rename from e2e/page-objects/settings-tab.ts rename to apps/studio/e2e/page-objects/settings-tab.ts diff --git a/e2e/page-objects/site-content.ts b/apps/studio/e2e/page-objects/site-content.ts similarity index 100% rename from e2e/page-objects/site-content.ts rename to apps/studio/e2e/page-objects/site-content.ts diff --git a/e2e/page-objects/site-form.ts b/apps/studio/e2e/page-objects/site-form.ts similarity index 100% rename from e2e/page-objects/site-form.ts rename to apps/studio/e2e/page-objects/site-form.ts diff --git a/e2e/page-objects/user-settings-modal.ts b/apps/studio/e2e/page-objects/user-settings-modal.ts similarity index 100% rename from e2e/page-objects/user-settings-modal.ts rename to apps/studio/e2e/page-objects/user-settings-modal.ts diff --git a/e2e/page-objects/whats-new-modal.ts b/apps/studio/e2e/page-objects/whats-new-modal.ts similarity index 100% rename from e2e/page-objects/whats-new-modal.ts rename to apps/studio/e2e/page-objects/whats-new-modal.ts diff --git a/e2e/site-navigation.test.ts b/apps/studio/e2e/site-navigation.test.ts similarity index 100% rename from e2e/site-navigation.test.ts rename to apps/studio/e2e/site-navigation.test.ts diff --git a/e2e/sites.test.ts b/apps/studio/e2e/sites.test.ts similarity index 98% rename from e2e/sites.test.ts rename to apps/studio/e2e/sites.test.ts index e5ce3ee033..38a463e177 100644 --- a/e2e/sites.test.ts +++ b/apps/studio/e2e/sites.test.ts @@ -1,11 +1,11 @@ import path from 'path'; import { test, expect } from '@playwright/test'; import fs from 'fs-extra'; -import { pathExists } from '../common/lib/fs-utils'; +import { pathExists } from '@studio/common/lib/fs-utils'; import { RecommendedPHPVersion as DEFAULT_PHP_VERSION, SupportedPHPVersions as ALLOWED_PHP_VERSIONS, -} from '../common/types/php-versions'; +} from '@studio/common/types/php-versions'; import { DEFAULT_SITE_NAME } from './constants'; import { E2ESession } from './e2e-helpers'; import MainSidebar from './page-objects/main-sidebar'; diff --git a/e2e/utils.ts b/apps/studio/e2e/utils.ts similarity index 100% rename from e2e/utils.ts rename to apps/studio/e2e/utils.ts diff --git a/electron.vite.config.ts b/apps/studio/electron.vite.config.ts similarity index 73% rename from electron.vite.config.ts rename to apps/studio/electron.vite.config.ts index 607264db8a..36550a8f4a 100644 --- a/electron.vite.config.ts +++ b/apps/studio/electron.vite.config.ts @@ -17,10 +17,10 @@ export default defineConfig( { plugins: [], resolve: { alias: { - src: resolve( 'src' ), - common: resolve( 'common' ), - cli: resolve( 'cli' ), - vendor: resolve( 'vendor' ), + src: resolve( __dirname, 'src' ), + '@studio/common': resolve( __dirname, '../../tools/common' ), + cli: resolve( __dirname, '../cli' ), + vendor: resolve( __dirname, '../../vendor' ), }, }, define: { @@ -30,6 +30,9 @@ export default defineConfig( { ), }, build: { + externalizeDeps: { + exclude: [ '@studio/common' ], + }, rollupOptions: { input: { index: resolve( __dirname, 'src/index.ts' ), @@ -53,13 +56,16 @@ export default defineConfig( { }, }, renderer: { - root: '.', + root: __dirname, + define: { + 'import.meta.env.VITE_REPO_ROOT': JSON.stringify( resolve( __dirname, '../..' ) ), + }, resolve: { alias: { - src: resolve( 'src' ), - common: resolve( 'common' ), - cli: resolve( 'cli' ), - vendor: resolve( 'vendor' ), + src: resolve( __dirname, 'src' ), + '@studio/common': resolve( __dirname, '../../tools/common' ), + cli: resolve( __dirname, '../cli' ), + vendor: resolve( __dirname, '../../vendor' ), }, }, plugins: [ @@ -69,29 +75,38 @@ export default defineConfig( { viteStaticCopy( { targets: [ { - src: 'node_modules/@wordpress/components/build-style/style.css', + src: resolve( + __dirname, + '../../node_modules/@wordpress/components/build-style/style.css' + ), dest: 'main_window/styles', rename: 'wordpress-components-style.css', }, { - src: 'node_modules/@wordpress/components/build-style/style-rtl.css', + src: resolve( + __dirname, + '../../node_modules/@wordpress/components/build-style/style-rtl.css' + ), dest: 'main_window/styles', rename: 'wordpress-components-style-rtl.css', }, { - src: 'node_modules/@rive-app/canvas/rive.wasm', + src: resolve( __dirname, '../../node_modules/@rive-app/canvas/rive.wasm' ), dest: 'assets', }, { - src: 'node_modules/@rive-app/canvas/rive_fallback.wasm', + src: resolve( + __dirname, + '../../node_modules/@rive-app/canvas/rive_fallback.wasm' + ), dest: 'assets', }, { - src: 'src/about-menu/about-menu.html', + src: resolve( __dirname, 'src/about-menu/about-menu.html' ), dest: '.', }, { - src: 'src/about-menu/studio-app-icon.png', + src: resolve( __dirname, 'src/about-menu/studio-app-icon.png' ), dest: '.', }, ], @@ -111,7 +126,7 @@ export default defineConfig( { css: { // Ensure CSS injection order is preserved - WordPress styles first, then custom styles devSourcemap: true, - postcss: './postcss.config.js', + postcss: resolve( __dirname, 'postcss.config.js' ), }, assetsInclude: [ '**/*.riv', '**/*.wasm' ], optimizeDeps: { @@ -122,7 +137,7 @@ export default defineConfig( { }, server: { fs: { - allow: [ '..' ], + allow: [ '..', '../..' ], }, }, build: { diff --git a/entitlements/node.plist b/apps/studio/entitlements/node.plist similarity index 100% rename from entitlements/node.plist rename to apps/studio/entitlements/node.plist diff --git a/forge.config.ts b/apps/studio/forge.config.ts similarity index 66% rename from forge.config.ts rename to apps/studio/forge.config.ts index 38bf683e75..23f79a6361 100644 --- a/forge.config.ts +++ b/apps/studio/forge.config.ts @@ -5,24 +5,31 @@ import { MakerDMG } from '@electron-forge/maker-dmg'; import { MakerSquirrel } from '@electron-forge/maker-squirrel'; import { MakerZIP } from '@electron-forge/maker-zip'; import { AutoUnpackNativesPlugin } from '@electron-forge/plugin-auto-unpack-natives'; -import { isErrnoException } from './common/lib/is-errno-exception'; +import { isErrnoException } from '@studio/common/lib/is-errno-exception'; import { exec } from 'child_process'; import { promisify } from 'util'; import type { ForgeConfig } from '@electron-forge/shared-types'; +const repoRoot = path.resolve( __dirname, '../..' ); + const config: ForgeConfig = { packagerConfig: { asar: true, - extraResource: [ './wp-files', './assets', './bin', './dist/cli' ], + extraResource: [ + path.join( repoRoot, 'wp-files' ), + path.join( __dirname, 'assets' ), + path.join( __dirname, 'bin' ), + path.join( repoRoot, 'apps', 'cli', 'dist', 'cli' ), + ], executableName: process.platform === 'linux' ? 'studio' : undefined, - icon: './assets/studio-app-icon', + icon: path.join( __dirname, 'assets', 'studio-app-icon' ), osxSign: { optionsForFile: ( filePath ) => { // The bundled Node binary requires specific entitlements for V8 JIT compilation. // Without these, V8 crashes with SIGTRAP when trying to allocate executable memory. if ( filePath.endsWith( 'bin/node' ) ) { return { - entitlements: path.join( __dirname, 'entitlements', 'node.plist' ), + entitlements: path.join( repoRoot, 'apps', 'studio', 'entitlements', 'node.plist' ), }; } return {}; @@ -31,20 +38,20 @@ const config: ForgeConfig = { ignore: [ // Exclude major development directories /^\/\..*/, // All dotfiles and dot directories - /^\/src/, - /^\/common/, - /^\/cli/, + /^\/apps\/studio\/src/, + /^\/apps\/studio\/e2e/, + /^\/apps\/cli/, + /^\/tools\/common/, /^\/vendor/, /^\/fastlane/, /^\/docs/, - /^\/e2e/, /^\/scripts/, - /^\/packages/, + /^\/tools/, /^\/patches/, - /^\/metrics/, + /^\/tools\/metrics/, /^\/test-results/, /^\/webpack-loaders/, - /^\/installers/, + /^\/apps\/studio\/installers/, // Config files /^\/webpack\./, /^\/tsconfig\./, @@ -54,7 +61,10 @@ const config: ForgeConfig = { /^\/tailwind\./, /^\/forge\./, /^\/electron\./, - /^\/index\.html$/, + /^\/apps\/studio\/.*\\.config\\./, + /^\/apps\/studio\/tailwind\\.config\\.js$/, + /^\/apps\/studio\/postcss\\.config\\.js$/, + /^\/apps\/studio\/index\.html$/, /^\/Gemfile/, /^\/.*\.md$/, /^\/.*\.txt$/, @@ -63,7 +73,7 @@ const config: ForgeConfig = { /^\/assets/, /^\/bin/, /^\/wp-files/, - /^\/dist\/cli/, + /^\/apps\/cli\/dist\/cli/, /^\/dist\/playground-cli/, ], }, @@ -79,8 +89,8 @@ const config: ForgeConfig = { } ), new MakerSquirrel( { - loadingGif: './installers/loading.gif', - setupIcon: './assets/studio-app-icon.ico', + loadingGif: path.join( __dirname, 'installers', 'loading.gif' ), + setupIcon: path.join( __dirname, 'assets', 'studio-app-icon.ico' ), // This icon is shown in Control Panel -> Programs and Features // Windows Explorer caches the icon agressively; use the cache busting param when necessary. iconUrl: 'https://s0.wp.com/i/studio-app/studio-app-icon.ico?v=3', @@ -97,8 +107,8 @@ const config: ForgeConfig = { : [ new MakerDMG( { - icon: 'assets/studio-app-icon.icns', - background: 'assets/dmg-background.png', + icon: path.join( __dirname, 'assets', 'studio-app-icon.icns' ), + background: path.join( __dirname, 'assets', 'dmg-background.png' ), contents: [ { x: 533, @@ -129,18 +139,24 @@ const config: ForgeConfig = { const execAsync = promisify( exec ); console.log( "Ensuring latest WordPress zip isn't included in production build ..." ); - const zipPath = path.join( __dirname, 'wp-files', 'latest.zip' ); + const zipPath = path.join( repoRoot, 'wp-files', 'latest.zip' ); try { fs.unlinkSync( zipPath ); } catch ( err ) { if ( isErrnoException( err ) && err.code !== 'ENOENT' ) throw err; } - console.log( 'Building CLI ...' ); - await execAsync( 'npm run cli:build' ); + console.log( 'Installing Studio app dependencies for bundling ...' ); + await execAsync( 'npm run app:install:bundle', { cwd: repoRoot } ); + + console.log( 'Building CLI (with bundled node_modules) ...' ); + await execAsync( 'npm run cli:build:bundle', { cwd: repoRoot } ); console.log( `Downloading Node.js binary for ${ platform }-${ arch }...` ); - await execAsync( `npx ts-node ./scripts/download-node-binary.ts ${ platform } ${ arch }` ); + await execAsync( + `npx ts-node ${ path.join( repoRoot, 'scripts', 'download-node-binary.ts' ) } ${ platform } ${ arch }`, + { cwd: repoRoot } + ); }, }, }; diff --git a/index.html b/apps/studio/index.html similarity index 100% rename from index.html rename to apps/studio/index.html diff --git a/installers/loading.gif b/apps/studio/installers/loading.gif similarity index 100% rename from installers/loading.gif rename to apps/studio/installers/loading.gif diff --git a/apps/studio/package.json b/apps/studio/package.json new file mode 100644 index 0000000000..28ec5d36b6 --- /dev/null +++ b/apps/studio/package.json @@ -0,0 +1,122 @@ +{ + "name": "studio-app", + "author": "Automattic Inc.", + "private": true, + "productName": "Studio", + "version": "1.7.3", + "description": "Local WordPress development environment using Playgrounds", + "license": "GPL-2.0-or-later", + "main": "dist/main/index.js", + "config": { + "forge": "./forge.config.ts" + }, + "scripts": { + "prestart": "npm -w studio-cli run build", + "make": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge make .", + "make:windows-x64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge make . --arch=x64 --platform=win32", + "make:windows-arm64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge make . --arch=arm64 --platform=win32", + "make:macos-x64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && SKIP_DMG=true FILE_ARCHITECTURE=x64 electron-forge make . --arch=x64 --platform=darwin", + "make:macos-arm64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && SKIP_DMG=true FILE_ARCHITECTURE=arm64 electron-forge make . --arch=arm64 --platform=darwin", + "install:bundle": "npm install --no-package-lock --install-links --no-workspaces", + "postinstall": "patch-package --patch-dir ../../patches && npx @electron/rebuild -o fs-ext", + "package": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge package .", + "publish": "electron-forge publish .", + "start-wayland": "npm -w studio-cli run build && electron-forge start . -- --enable-features=UseOzonePlatform --ozone-platform=wayland" + }, + "dependencies": { + "@automattic/generate-password": "^0.1.0", + "@automattic/interpolate-components": "^1.2.1", + "@formatjs/intl-locale": "^3.4.5", + "@formatjs/intl-localematcher": "^0.5.4", + "@inquirer/prompts": "^7.10.1", + "@reduxjs/toolkit": "^2.11.2", + "@rive-app/react-canvas": "^4.12.0", + "@sentry/electron": "^6.5.0", + "@sentry/react": "^7.120.3", + "@studio/common": "file:../../tools/common", + "@vscode/sudo-prompt": "^9.3.1", + "@wordpress/components": "^32.1.0", + "@wordpress/compose": "^7.36.0", + "@wordpress/dataviews": "^11.3.0", + "@wordpress/element": "^6.39.0", + "@wordpress/i18n": "^6.9.0", + "@wordpress/icons": "^11.4.0", + "@wordpress/react-i18n": "^4.39.0", + "@wp-playground/blueprints": "^3.0.46", + "archiver": "^6.0.2", + "atomically": "^2.1.0", + "cli-table3": "^0.6.5", + "compressible": "2.0.18", + "compression": "^1.8.1", + "cross-port-killer": "^1.4.0", + "date-fns": "^3.3.1", + "electron-squirrel-startup": "^1.0.1", + "electron2appx": "^2.1.2", + "express": "4.21.2", + "fast-deep-equal": "^3.1.3", + "file-stream-rotator": "^1.0.0", + "follow-redirects": "^1.15.11", + "fs-extra": "^11.3.2", + "hpagent": "1.2.0", + "http-proxy": "^1.18.1", + "lockfile": "^1.0.4", + "node-forge": "^1.3.3", + "ora": "^8.2.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-markdown": "^9.0.1", + "react-redux": "^9.2.0", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "resize-observer-polyfill": "^1.5.1", + "semver": "^7.7.3", + "shell-quote": "^1.8.3", + "strip-ansi": "^7.1.2", + "tar": "^7.5.2", + "tus-js-client": "^4.3.1", + "winreg": "1.2.4", + "wpcom": "^7.1.1", + "wpcom-xhr-request": "^1.3.0", + "yargs": "^18.0.0", + "yargs-parser": "^22.0.0", + "yauzl": "^3.2.0", + "zod": "^4.0.0" + }, + "devDependencies": { + "@automattic/color-studio": "^4.1.0", + "@electron-forge/cli": "^7.11.1", + "@electron-forge/maker-deb": "^7.11.1", + "@electron-forge/maker-dmg": "^7.11.1", + "@electron-forge/maker-squirrel": "^7.11.1", + "@electron-forge/maker-zip": "^7.11.1", + "@electron-forge/plugin-auto-unpack-natives": "^7.11.1", + "@sentry/vite-plugin": "^4.3.0", + "@types/archiver": "^6.0.4", + "@types/follow-redirects": "^1.14.4", + "@types/fs-extra": "^11.0.4", + "@types/http-proxy": "^1.17.17", + "@types/node-forge": "^1.3.14", + "@types/react": "^18.3.27", + "@types/react-dom": "^18.3.7", + "@types/semver": "^7.7.1", + "@types/shell-quote": "^1.7.5", + "@types/winreg": "^1.2.36", + "@types/yauzl": "^2.10.3", + "@vitejs/plugin-react": "^5.1.2", + "electron": "^39.2.7", + "electron-devtools-installer": "^4.0.0", + "electron-vite": "^5.0.0", + "patch-package": "^8.0.1", + "postcss": "^8.4.32", + "tailwindcss": "^3.3.6", + "vite": "^7.3.1", + "vite-plugin-static-copy": "^3.1.5", + "vite-plugin-top-level-await": "^1.6.0", + "vite-plugin-wasm": "^3.5.0" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "^4.50.2", + "@rollup/rollup-win32-x64-msvc": "^4.50.2", + "appdmg": "^0.6.6" + } +} diff --git a/apps/studio/postcss.config.js b/apps/studio/postcss.config.js new file mode 100644 index 0000000000..4b65759eb7 --- /dev/null +++ b/apps/studio/postcss.config.js @@ -0,0 +1,9 @@ +const path = require( 'path' ); + +module.exports = { + plugins: { + tailwindcss: { + config: path.join( __dirname, 'tailwind.config.js' ), + }, + }, +}; diff --git a/src/__mocks__/@sentry/electron/main.ts b/apps/studio/src/__mocks__/@sentry/electron/main.ts similarity index 100% rename from src/__mocks__/@sentry/electron/main.ts rename to apps/studio/src/__mocks__/@sentry/electron/main.ts diff --git a/src/__mocks__/atomically.ts b/apps/studio/src/__mocks__/atomically.ts similarity index 100% rename from src/__mocks__/atomically.ts rename to apps/studio/src/__mocks__/atomically.ts diff --git a/src/__mocks__/electron.ts b/apps/studio/src/__mocks__/electron.ts similarity index 100% rename from src/__mocks__/electron.ts rename to apps/studio/src/__mocks__/electron.ts diff --git a/src/__mocks__/fs-extra.ts b/apps/studio/src/__mocks__/fs-extra.ts similarity index 100% rename from src/__mocks__/fs-extra.ts rename to apps/studio/src/__mocks__/fs-extra.ts diff --git a/src/__mocks__/fs.ts b/apps/studio/src/__mocks__/fs.ts similarity index 100% rename from src/__mocks__/fs.ts rename to apps/studio/src/__mocks__/fs.ts diff --git a/src/__mocks__/lockfile.ts b/apps/studio/src/__mocks__/lockfile.ts similarity index 100% rename from src/__mocks__/lockfile.ts rename to apps/studio/src/__mocks__/lockfile.ts diff --git a/src/__mocks__/react-markdown.ts b/apps/studio/src/__mocks__/react-markdown.ts similarity index 100% rename from src/__mocks__/react-markdown.ts rename to apps/studio/src/__mocks__/react-markdown.ts diff --git a/src/__mocks__/rehype-raw.ts b/apps/studio/src/__mocks__/rehype-raw.ts similarity index 100% rename from src/__mocks__/rehype-raw.ts rename to apps/studio/src/__mocks__/rehype-raw.ts diff --git a/src/__mocks__/remark-gfm.ts b/apps/studio/src/__mocks__/remark-gfm.ts similarity index 100% rename from src/__mocks__/remark-gfm.ts rename to apps/studio/src/__mocks__/remark-gfm.ts diff --git a/src/__mocks__/strip-ansi.ts b/apps/studio/src/__mocks__/strip-ansi.ts similarity index 100% rename from src/__mocks__/strip-ansi.ts rename to apps/studio/src/__mocks__/strip-ansi.ts diff --git a/src/about-menu/about-menu.html b/apps/studio/src/about-menu/about-menu.html similarity index 100% rename from src/about-menu/about-menu.html rename to apps/studio/src/about-menu/about-menu.html diff --git a/src/about-menu/open-about-menu.ts b/apps/studio/src/about-menu/open-about-menu.ts similarity index 100% rename from src/about-menu/open-about-menu.ts rename to apps/studio/src/about-menu/open-about-menu.ts diff --git a/src/about-menu/studio-app-icon.png b/apps/studio/src/about-menu/studio-app-icon.png similarity index 100% rename from src/about-menu/studio-app-icon.png rename to apps/studio/src/about-menu/studio-app-icon.png diff --git a/src/about-menu/tests/open-about-menu.test.tsx b/apps/studio/src/about-menu/tests/open-about-menu.test.tsx similarity index 100% rename from src/about-menu/tests/open-about-menu.test.tsx rename to apps/studio/src/about-menu/tests/open-about-menu.test.tsx diff --git a/src/additional-phrases.ts b/apps/studio/src/additional-phrases.ts similarity index 100% rename from src/additional-phrases.ts rename to apps/studio/src/additional-phrases.ts diff --git a/src/components/action-button.tsx b/apps/studio/src/components/action-button.tsx similarity index 100% rename from src/components/action-button.tsx rename to apps/studio/src/components/action-button.tsx diff --git a/src/components/add-site-with-blueprint-button.tsx b/apps/studio/src/components/add-site-with-blueprint-button.tsx similarity index 94% rename from src/components/add-site-with-blueprint-button.tsx rename to apps/studio/src/components/add-site-with-blueprint-button.tsx index 08497b967b..ef2331c53f 100644 --- a/src/components/add-site-with-blueprint-button.tsx +++ b/apps/studio/src/components/add-site-with-blueprint-button.tsx @@ -1,6 +1,6 @@ import { __ } from '@wordpress/i18n'; import { plus } from '@wordpress/icons'; -import { PROTOCOL_PREFIX } from 'common/constants'; +import { PROTOCOL_PREFIX } from '@studio/common/constants'; import Button, { ButtonProps } from 'src/components/button'; import { getIpcApi } from 'src/lib/get-ipc-api'; diff --git a/src/components/ai-clear-history-reminder.tsx b/apps/studio/src/components/ai-clear-history-reminder.tsx similarity index 100% rename from src/components/ai-clear-history-reminder.tsx rename to apps/studio/src/components/ai-clear-history-reminder.tsx diff --git a/src/components/ai-input.tsx b/apps/studio/src/components/ai-input.tsx similarity index 100% rename from src/components/ai-input.tsx rename to apps/studio/src/components/ai-input.tsx diff --git a/src/components/app.tsx b/apps/studio/src/components/app.tsx similarity index 100% rename from src/components/app.tsx rename to apps/studio/src/components/app.tsx diff --git a/src/components/arrow-icon.tsx b/apps/studio/src/components/arrow-icon.tsx similarity index 100% rename from src/components/arrow-icon.tsx rename to apps/studio/src/components/arrow-icon.tsx diff --git a/src/components/assistant-anchor.tsx b/apps/studio/src/components/assistant-anchor.tsx similarity index 100% rename from src/components/assistant-anchor.tsx rename to apps/studio/src/components/assistant-anchor.tsx diff --git a/src/components/assistant-code-block.tsx b/apps/studio/src/components/assistant-code-block.tsx similarity index 100% rename from src/components/assistant-code-block.tsx rename to apps/studio/src/components/assistant-code-block.tsx diff --git a/src/components/assistant-thinking.tsx b/apps/studio/src/components/assistant-thinking.tsx similarity index 100% rename from src/components/assistant-thinking.tsx rename to apps/studio/src/components/assistant-thinking.tsx diff --git a/src/components/auth-provider.tsx b/apps/studio/src/components/auth-provider.tsx similarity index 100% rename from src/components/auth-provider.tsx rename to apps/studio/src/components/auth-provider.tsx diff --git a/src/components/badge.tsx b/apps/studio/src/components/badge.tsx similarity index 100% rename from src/components/badge.tsx rename to apps/studio/src/components/badge.tsx diff --git a/src/components/button.tsx b/apps/studio/src/components/button.tsx similarity index 100% rename from src/components/button.tsx rename to apps/studio/src/components/button.tsx diff --git a/src/components/buttons-section.tsx b/apps/studio/src/components/buttons-section.tsx similarity index 100% rename from src/components/buttons-section.tsx rename to apps/studio/src/components/buttons-section.tsx diff --git a/src/components/chat-message.tsx b/apps/studio/src/components/chat-message.tsx similarity index 100% rename from src/components/chat-message.tsx rename to apps/studio/src/components/chat-message.tsx diff --git a/src/components/chat-rating.tsx b/apps/studio/src/components/chat-rating.tsx similarity index 100% rename from src/components/chat-rating.tsx rename to apps/studio/src/components/chat-rating.tsx diff --git a/src/components/check-icon.tsx b/apps/studio/src/components/check-icon.tsx similarity index 100% rename from src/components/check-icon.tsx rename to apps/studio/src/components/check-icon.tsx diff --git a/src/components/clear-action.tsx b/apps/studio/src/components/clear-action.tsx similarity index 100% rename from src/components/clear-action.tsx rename to apps/studio/src/components/clear-action.tsx diff --git a/src/components/content-tab-assistant.tsx b/apps/studio/src/components/content-tab-assistant.tsx similarity index 100% rename from src/components/content-tab-assistant.tsx rename to apps/studio/src/components/content-tab-assistant.tsx diff --git a/src/components/content-tab-import-export.tsx b/apps/studio/src/components/content-tab-import-export.tsx similarity index 100% rename from src/components/content-tab-import-export.tsx rename to apps/studio/src/components/content-tab-import-export.tsx diff --git a/src/components/content-tab-overview.tsx b/apps/studio/src/components/content-tab-overview.tsx similarity index 100% rename from src/components/content-tab-overview.tsx rename to apps/studio/src/components/content-tab-overview.tsx diff --git a/src/components/content-tab-previews.tsx b/apps/studio/src/components/content-tab-previews.tsx similarity index 100% rename from src/components/content-tab-previews.tsx rename to apps/studio/src/components/content-tab-previews.tsx diff --git a/src/components/content-tab-settings.tsx b/apps/studio/src/components/content-tab-settings.tsx similarity index 99% rename from src/components/content-tab-settings.tsx rename to apps/studio/src/components/content-tab-settings.tsx index 54034af04c..9f1945cfbc 100644 --- a/src/components/content-tab-settings.tsx +++ b/apps/studio/src/components/content-tab-settings.tsx @@ -2,7 +2,7 @@ import { DropdownMenu, MenuGroup, Button } from '@wordpress/components'; import { moreVertical } from '@wordpress/icons'; import { useI18n } from '@wordpress/react-i18n'; import { PropsWithChildren } from 'react'; -import { decodePassword } from 'common/lib/passwords'; +import { decodePassword } from '@studio/common/lib/passwords'; import { CopyTextButton } from 'src/components/copy-text-button'; import { LearnHowLink } from 'src/components/learn-more'; import { SettingsMenuItem } from 'src/components/settings-site-menu'; diff --git a/src/components/copy-text-button.tsx b/apps/studio/src/components/copy-text-button.tsx similarity index 100% rename from src/components/copy-text-button.tsx rename to apps/studio/src/components/copy-text-button.tsx diff --git a/src/components/crash-tester.tsx b/apps/studio/src/components/crash-tester.tsx similarity index 100% rename from src/components/crash-tester.tsx rename to apps/studio/src/components/crash-tester.tsx diff --git a/src/components/default-error-fallback.tsx b/apps/studio/src/components/default-error-fallback.tsx similarity index 98% rename from src/components/default-error-fallback.tsx rename to apps/studio/src/components/default-error-fallback.tsx index 236887bc7b..e457ab40ff 100644 --- a/src/components/default-error-fallback.tsx +++ b/apps/studio/src/components/default-error-fallback.tsx @@ -3,7 +3,7 @@ import { __experimentalHStack as HStack, } from '@wordpress/components'; import { useI18n } from '@wordpress/react-i18n'; -import { DEFAULT_LOCALE } from 'common/lib/locale'; +import { DEFAULT_LOCALE } from '@studio/common/lib/locale'; import Button from 'src/components/button'; import { DynamicStylesheet } from 'src/components/dynamic-stylesheet'; import { isMac, isWindows } from 'src/lib/app-globals'; diff --git a/src/components/dynamic-stylesheet.tsx b/apps/studio/src/components/dynamic-stylesheet.tsx similarity index 100% rename from src/components/dynamic-stylesheet.tsx rename to apps/studio/src/components/dynamic-stylesheet.tsx diff --git a/src/components/error-boundary.tsx b/apps/studio/src/components/error-boundary.tsx similarity index 100% rename from src/components/error-boundary.tsx rename to apps/studio/src/components/error-boundary.tsx diff --git a/src/components/error-icon.tsx b/apps/studio/src/components/error-icon.tsx similarity index 100% rename from src/components/error-icon.tsx rename to apps/studio/src/components/error-icon.tsx diff --git a/src/components/error-information.tsx b/apps/studio/src/components/error-information.tsx similarity index 100% rename from src/components/error-information.tsx rename to apps/studio/src/components/error-information.tsx diff --git a/src/components/folder-icon.tsx b/apps/studio/src/components/folder-icon.tsx similarity index 100% rename from src/components/folder-icon.tsx rename to apps/studio/src/components/folder-icon.tsx diff --git a/src/components/fullscreen-modal.tsx b/apps/studio/src/components/fullscreen-modal.tsx similarity index 100% rename from src/components/fullscreen-modal.tsx rename to apps/studio/src/components/fullscreen-modal.tsx diff --git a/src/components/gravatar.tsx b/apps/studio/src/components/gravatar.tsx similarity index 100% rename from src/components/gravatar.tsx rename to apps/studio/src/components/gravatar.tsx diff --git a/src/components/header.tsx b/apps/studio/src/components/header.tsx similarity index 100% rename from src/components/header.tsx rename to apps/studio/src/components/header.tsx diff --git a/src/components/icons/circle-red-cross.tsx b/apps/studio/src/components/icons/circle-red-cross.tsx similarity index 100% rename from src/components/icons/circle-red-cross.tsx rename to apps/studio/src/components/icons/circle-red-cross.tsx diff --git a/src/components/icons/execute.tsx b/apps/studio/src/components/icons/execute.tsx similarity index 100% rename from src/components/icons/execute.tsx rename to apps/studio/src/components/icons/execute.tsx diff --git a/src/components/icons/pause.tsx b/apps/studio/src/components/icons/pause.tsx similarity index 100% rename from src/components/icons/pause.tsx rename to apps/studio/src/components/icons/pause.tsx diff --git a/src/components/icons/play.tsx b/apps/studio/src/components/icons/play.tsx similarity index 100% rename from src/components/icons/play.tsx rename to apps/studio/src/components/icons/play.tsx diff --git a/src/components/icons/right-arrow.tsx b/apps/studio/src/components/icons/right-arrow.tsx similarity index 100% rename from src/components/icons/right-arrow.tsx rename to apps/studio/src/components/icons/right-arrow.tsx diff --git a/src/components/icons/xdebug-icon.tsx b/apps/studio/src/components/icons/xdebug-icon.tsx similarity index 100% rename from src/components/icons/xdebug-icon.tsx rename to apps/studio/src/components/icons/xdebug-icon.tsx diff --git a/src/components/learn-more.tsx b/apps/studio/src/components/learn-more.tsx similarity index 100% rename from src/components/learn-more.tsx rename to apps/studio/src/components/learn-more.tsx diff --git a/src/components/link-button.tsx b/apps/studio/src/components/link-button.tsx similarity index 100% rename from src/components/link-button.tsx rename to apps/studio/src/components/link-button.tsx diff --git a/src/components/mac-titlebar.tsx b/apps/studio/src/components/mac-titlebar.tsx similarity index 100% rename from src/components/mac-titlebar.tsx rename to apps/studio/src/components/mac-titlebar.tsx diff --git a/src/components/main-sidebar.tsx b/apps/studio/src/components/main-sidebar.tsx similarity index 100% rename from src/components/main-sidebar.tsx rename to apps/studio/src/components/main-sidebar.tsx diff --git a/src/components/modal.tsx b/apps/studio/src/components/modal.tsx similarity index 100% rename from src/components/modal.tsx rename to apps/studio/src/components/modal.tsx diff --git a/src/components/no-studio-sites/index.tsx b/apps/studio/src/components/no-studio-sites/index.tsx similarity index 100% rename from src/components/no-studio-sites/index.tsx rename to apps/studio/src/components/no-studio-sites/index.tsx diff --git a/src/components/offline-icon.tsx b/apps/studio/src/components/offline-icon.tsx similarity index 100% rename from src/components/offline-icon.tsx rename to apps/studio/src/components/offline-icon.tsx diff --git a/src/components/pressable-logo.tsx b/apps/studio/src/components/pressable-logo.tsx similarity index 100% rename from src/components/pressable-logo.tsx rename to apps/studio/src/components/pressable-logo.tsx diff --git a/src/components/profile-icon-detailed.tsx b/apps/studio/src/components/profile-icon-detailed.tsx similarity index 100% rename from src/components/profile-icon-detailed.tsx rename to apps/studio/src/components/profile-icon-detailed.tsx diff --git a/src/components/progress-bar.tsx b/apps/studio/src/components/progress-bar.tsx similarity index 100% rename from src/components/progress-bar.tsx rename to apps/studio/src/components/progress-bar.tsx diff --git a/src/components/publish-site-button.tsx b/apps/studio/src/components/publish-site-button.tsx similarity index 100% rename from src/components/publish-site-button.tsx rename to apps/studio/src/components/publish-site-button.tsx diff --git a/src/components/root.tsx b/apps/studio/src/components/root.tsx similarity index 100% rename from src/components/root.tsx rename to apps/studio/src/components/root.tsx diff --git a/src/components/running-sites.tsx b/apps/studio/src/components/running-sites.tsx similarity index 100% rename from src/components/running-sites.tsx rename to apps/studio/src/components/running-sites.tsx diff --git a/src/components/screenshot-demo-site.tsx b/apps/studio/src/components/screenshot-demo-site.tsx similarity index 100% rename from src/components/screenshot-demo-site.tsx rename to apps/studio/src/components/screenshot-demo-site.tsx diff --git a/src/components/settings-site-menu.tsx b/apps/studio/src/components/settings-site-menu.tsx similarity index 100% rename from src/components/settings-site-menu.tsx rename to apps/studio/src/components/settings-site-menu.tsx diff --git a/src/components/site-content-tabs.tsx b/apps/studio/src/components/site-content-tabs.tsx similarity index 100% rename from src/components/site-content-tabs.tsx rename to apps/studio/src/components/site-content-tabs.tsx diff --git a/src/components/site-is-being-created.tsx b/apps/studio/src/components/site-is-being-created.tsx similarity index 100% rename from src/components/site-is-being-created.tsx rename to apps/studio/src/components/site-is-being-created.tsx diff --git a/src/components/site-management-actions.tsx b/apps/studio/src/components/site-management-actions.tsx similarity index 100% rename from src/components/site-management-actions.tsx rename to apps/studio/src/components/site-management-actions.tsx diff --git a/src/components/site-menu.tsx b/apps/studio/src/components/site-menu.tsx similarity index 100% rename from src/components/site-menu.tsx rename to apps/studio/src/components/site-menu.tsx diff --git a/src/components/studio-logo.tsx b/apps/studio/src/components/studio-logo.tsx similarity index 100% rename from src/components/studio-logo.tsx rename to apps/studio/src/components/studio-logo.tsx diff --git a/src/components/tests/ai-clear-history-reminder.test.tsx b/apps/studio/src/components/tests/ai-clear-history-reminder.test.tsx similarity index 100% rename from src/components/tests/ai-clear-history-reminder.test.tsx rename to apps/studio/src/components/tests/ai-clear-history-reminder.test.tsx diff --git a/src/components/tests/ai-input.test.tsx b/apps/studio/src/components/tests/ai-input.test.tsx similarity index 100% rename from src/components/tests/ai-input.test.tsx rename to apps/studio/src/components/tests/ai-input.test.tsx diff --git a/src/components/tests/app.test.tsx b/apps/studio/src/components/tests/app.test.tsx similarity index 100% rename from src/components/tests/app.test.tsx rename to apps/studio/src/components/tests/app.test.tsx diff --git a/src/components/tests/assistant-anchor.test.tsx b/apps/studio/src/components/tests/assistant-anchor.test.tsx similarity index 100% rename from src/components/tests/assistant-anchor.test.tsx rename to apps/studio/src/components/tests/assistant-anchor.test.tsx diff --git a/src/components/tests/assistant-code-block.test.tsx b/apps/studio/src/components/tests/assistant-code-block.test.tsx similarity index 100% rename from src/components/tests/assistant-code-block.test.tsx rename to apps/studio/src/components/tests/assistant-code-block.test.tsx diff --git a/src/components/tests/content-tab-assistant.test.tsx b/apps/studio/src/components/tests/content-tab-assistant.test.tsx similarity index 100% rename from src/components/tests/content-tab-assistant.test.tsx rename to apps/studio/src/components/tests/content-tab-assistant.test.tsx diff --git a/src/components/tests/content-tab-import-export.test.tsx b/apps/studio/src/components/tests/content-tab-import-export.test.tsx similarity index 100% rename from src/components/tests/content-tab-import-export.test.tsx rename to apps/studio/src/components/tests/content-tab-import-export.test.tsx diff --git a/src/components/tests/content-tab-overview-shortcuts-section.test.tsx b/apps/studio/src/components/tests/content-tab-overview-shortcuts-section.test.tsx similarity index 100% rename from src/components/tests/content-tab-overview-shortcuts-section.test.tsx rename to apps/studio/src/components/tests/content-tab-overview-shortcuts-section.test.tsx diff --git a/src/components/tests/content-tab-overview.test.tsx b/apps/studio/src/components/tests/content-tab-overview.test.tsx similarity index 100% rename from src/components/tests/content-tab-overview.test.tsx rename to apps/studio/src/components/tests/content-tab-overview.test.tsx diff --git a/src/components/tests/content-tab-settings.test.tsx b/apps/studio/src/components/tests/content-tab-settings.test.tsx similarity index 99% rename from src/components/tests/content-tab-settings.test.tsx rename to apps/studio/src/components/tests/content-tab-settings.test.tsx index 332e6e5479..0fca3f1394 100644 --- a/src/components/tests/content-tab-settings.test.tsx +++ b/apps/studio/src/components/tests/content-tab-settings.test.tsx @@ -5,7 +5,7 @@ import { userEvent } from '@testing-library/user-event'; import { produce } from 'immer'; import { Provider } from 'react-redux'; import { vi } from 'vitest'; -import { Snapshot } from 'common/types/snapshot'; +import { Snapshot } from '@studio/common/types/snapshot'; import { ContentTabSettings } from 'src/components/content-tab-settings'; import { useGetWpVersion } from 'src/hooks/use-get-wp-version'; import { useSiteDetails } from 'src/hooks/use-site-details'; diff --git a/src/components/tests/copy-text-button.test.tsx b/apps/studio/src/components/tests/copy-text-button.test.tsx similarity index 100% rename from src/components/tests/copy-text-button.test.tsx rename to apps/studio/src/components/tests/copy-text-button.test.tsx diff --git a/src/components/tests/dynamic-stylesheet.test.tsx b/apps/studio/src/components/tests/dynamic-stylesheet.test.tsx similarity index 100% rename from src/components/tests/dynamic-stylesheet.test.tsx rename to apps/studio/src/components/tests/dynamic-stylesheet.test.tsx diff --git a/src/components/tests/gravatar.test.tsx b/apps/studio/src/components/tests/gravatar.test.tsx similarity index 100% rename from src/components/tests/gravatar.test.tsx rename to apps/studio/src/components/tests/gravatar.test.tsx diff --git a/src/components/tests/header.test.tsx b/apps/studio/src/components/tests/header.test.tsx similarity index 100% rename from src/components/tests/header.test.tsx rename to apps/studio/src/components/tests/header.test.tsx diff --git a/src/components/tests/mac-titlebar.test.tsx b/apps/studio/src/components/tests/mac-titlebar.test.tsx similarity index 100% rename from src/components/tests/mac-titlebar.test.tsx rename to apps/studio/src/components/tests/mac-titlebar.test.tsx diff --git a/src/components/tests/main-sidebar.test.tsx b/apps/studio/src/components/tests/main-sidebar.test.tsx similarity index 100% rename from src/components/tests/main-sidebar.test.tsx rename to apps/studio/src/components/tests/main-sidebar.test.tsx diff --git a/src/components/tests/onboarding.test.tsx b/apps/studio/src/components/tests/onboarding.test.tsx similarity index 100% rename from src/components/tests/onboarding.test.tsx rename to apps/studio/src/components/tests/onboarding.test.tsx diff --git a/src/components/tests/running-sites.test.tsx b/apps/studio/src/components/tests/running-sites.test.tsx similarity index 100% rename from src/components/tests/running-sites.test.tsx rename to apps/studio/src/components/tests/running-sites.test.tsx diff --git a/src/components/tests/site-content-tabs.test.tsx b/apps/studio/src/components/tests/site-content-tabs.test.tsx similarity index 100% rename from src/components/tests/site-content-tabs.test.tsx rename to apps/studio/src/components/tests/site-content-tabs.test.tsx diff --git a/src/components/tests/site-management-actions.test.tsx b/apps/studio/src/components/tests/site-management-actions.test.tsx similarity index 100% rename from src/components/tests/site-management-actions.test.tsx rename to apps/studio/src/components/tests/site-management-actions.test.tsx diff --git a/src/components/tests/topbar.test.tsx b/apps/studio/src/components/tests/topbar.test.tsx similarity index 100% rename from src/components/tests/topbar.test.tsx rename to apps/studio/src/components/tests/topbar.test.tsx diff --git a/src/components/text-control.tsx b/apps/studio/src/components/text-control.tsx similarity index 100% rename from src/components/text-control.tsx rename to apps/studio/src/components/text-control.tsx diff --git a/src/components/tooltip.tsx b/apps/studio/src/components/tooltip.tsx similarity index 100% rename from src/components/tooltip.tsx rename to apps/studio/src/components/tooltip.tsx diff --git a/src/components/top-bar.tsx b/apps/studio/src/components/top-bar.tsx similarity index 100% rename from src/components/top-bar.tsx rename to apps/studio/src/components/top-bar.tsx diff --git a/src/components/tree-view.tsx b/apps/studio/src/components/tree-view.tsx similarity index 100% rename from src/components/tree-view.tsx rename to apps/studio/src/components/tree-view.tsx diff --git a/src/components/welcome-message-prompt.tsx b/apps/studio/src/components/welcome-message-prompt.tsx similarity index 100% rename from src/components/welcome-message-prompt.tsx rename to apps/studio/src/components/welcome-message-prompt.tsx diff --git a/src/components/windows-titlebar.tsx b/apps/studio/src/components/windows-titlebar.tsx similarity index 100% rename from src/components/windows-titlebar.tsx rename to apps/studio/src/components/windows-titlebar.tsx diff --git a/src/components/wordpress-logo-circle.tsx b/apps/studio/src/components/wordpress-logo-circle.tsx similarity index 100% rename from src/components/wordpress-logo-circle.tsx rename to apps/studio/src/components/wordpress-logo-circle.tsx diff --git a/src/components/wordpress-logo.tsx b/apps/studio/src/components/wordpress-logo.tsx similarity index 100% rename from src/components/wordpress-logo.tsx rename to apps/studio/src/components/wordpress-logo.tsx diff --git a/src/components/wordpress-short-logo.tsx b/apps/studio/src/components/wordpress-short-logo.tsx similarity index 100% rename from src/components/wordpress-short-logo.tsx rename to apps/studio/src/components/wordpress-short-logo.tsx diff --git a/src/components/wordpress-styles.tsx b/apps/studio/src/components/wordpress-styles.tsx similarity index 71% rename from src/components/wordpress-styles.tsx rename to apps/studio/src/components/wordpress-styles.tsx index 8b6173d7d3..dc9637d72e 100644 --- a/src/components/wordpress-styles.tsx +++ b/apps/studio/src/components/wordpress-styles.tsx @@ -7,12 +7,14 @@ const WORDPRESS_STYLES_ID = 'wordpress-components-style'; // but Vite handles this at build time and replaces it with the actual value const isDevelopment = import.meta.env.DEV; +const repoRoot = import.meta.env.VITE_REPO_ROOT as string | undefined; +const repoRootNormalized = repoRoot ? repoRoot.replace( /\/$/, '' ) : ''; const WORDPRESS_STYLES_LTR = isDevelopment - ? '/node_modules/@wordpress/components/build-style/style.css' + ? `/@fs${ repoRootNormalized }/node_modules/@wordpress/components/build-style/style.css` : './main_window/styles/wordpress-components-style.css'; const WORDPRESS_STYLES_RTL = isDevelopment - ? '/node_modules/@wordpress/components/build-style/style-rtl.css' + ? `/@fs${ repoRootNormalized }/node_modules/@wordpress/components/build-style/style-rtl.css` : './main_window/styles/wordpress-components-style-rtl.css'; export const WordPressStyles = () => { diff --git a/src/components/wp-version-selector/add-wp-version-to-list.test.ts b/apps/studio/src/components/wp-version-selector/add-wp-version-to-list.test.ts similarity index 100% rename from src/components/wp-version-selector/add-wp-version-to-list.test.ts rename to apps/studio/src/components/wp-version-selector/add-wp-version-to-list.test.ts diff --git a/src/components/wp-version-selector/add-wp-version-to-list.ts b/apps/studio/src/components/wp-version-selector/add-wp-version-to-list.ts similarity index 100% rename from src/components/wp-version-selector/add-wp-version-to-list.ts rename to apps/studio/src/components/wp-version-selector/add-wp-version-to-list.ts diff --git a/src/components/wp-version-selector/index.tsx b/apps/studio/src/components/wp-version-selector/index.tsx similarity index 97% rename from src/components/wp-version-selector/index.tsx rename to apps/studio/src/components/wp-version-selector/index.tsx index ded3cb9258..cd4475e7bd 100644 --- a/src/components/wp-version-selector/index.tsx +++ b/apps/studio/src/components/wp-version-selector/index.tsx @@ -2,8 +2,8 @@ import { SelectControl, Icon } from '@wordpress/components'; import { info } from '@wordpress/icons'; import { useI18n } from '@wordpress/react-i18n'; import { useEffect } from 'react'; -import { DEFAULT_WORDPRESS_VERSION, MINIMUM_WORDPRESS_VERSION } from 'common/constants'; -import { isWordPressBetaVersion } from 'common/lib/wordpress-version-utils'; +import { DEFAULT_WORDPRESS_VERSION, MINIMUM_WORDPRESS_VERSION } from '@studio/common/constants'; +import { isWordPressBetaVersion } from '@studio/common/lib/wordpress-version-utils'; import offlineIcon from 'src/components/offline-icon'; import { Tooltip } from 'src/components/tooltip'; import { useOffline } from 'src/hooks/use-offline'; diff --git a/src/constants.ts b/apps/studio/src/constants.ts similarity index 89% rename from src/constants.ts rename to apps/studio/src/constants.ts index ad2836e06d..dcfb05bb59 100644 --- a/src/constants.ts +++ b/apps/studio/src/constants.ts @@ -1,11 +1,4 @@ -// This needs to be a relative import due to the postinstall scripts. -import { - HOUR_MS, - PLAYGROUND_CLI_ACTIVITY_CHECK_INTERVAL, - PLAYGROUND_CLI_INACTIVITY_TIMEOUT, - PLAYGROUND_CLI_MAX_TIMEOUT, -} from '../common/constants'; - +import { HOUR_MS } from '@studio/common/constants'; export const DEFAULT_WIDTH = 900; export const MAIN_MIN_HEIGHT = 600; export const SIDEBAR_WIDTH = 208; @@ -80,13 +73,6 @@ export const WP_CLI_IMPORT_EXPORT_RESPONSE_TIMEOUT_IN_HRS = 6; export const WP_CLI_IMPORT_EXPORT_RESPONSE_TIMEOUT = WP_CLI_IMPORT_EXPORT_RESPONSE_TIMEOUT_IN_HRS * 60 * 60 * 1000; // 6hr -// Playground CLI constants are re-exported from common/constants.ts -export { - PLAYGROUND_CLI_ACTIVITY_CHECK_INTERVAL, - PLAYGROUND_CLI_INACTIVITY_TIMEOUT, - PLAYGROUND_CLI_MAX_TIMEOUT, -}; - // SQLite export const SQLITE_DATABASE_INTEGRATION_VERSION = 'v2.2.17'; diff --git a/src/custom-package-definitions.d.ts b/apps/studio/src/custom-package-definitions.d.ts similarity index 100% rename from src/custom-package-definitions.d.ts rename to apps/studio/src/custom-package-definitions.d.ts diff --git a/src/hooks/sync-sites/index.ts b/apps/studio/src/hooks/sync-sites/index.ts similarity index 100% rename from src/hooks/sync-sites/index.ts rename to apps/studio/src/hooks/sync-sites/index.ts diff --git a/src/hooks/sync-sites/sync-sites-context.tsx b/apps/studio/src/hooks/sync-sites/sync-sites-context.tsx similarity index 100% rename from src/hooks/sync-sites/sync-sites-context.tsx rename to apps/studio/src/hooks/sync-sites/sync-sites-context.tsx diff --git a/src/hooks/sync-sites/tests/use-pull-push-states.test.ts b/apps/studio/src/hooks/sync-sites/tests/use-pull-push-states.test.ts similarity index 100% rename from src/hooks/sync-sites/tests/use-pull-push-states.test.ts rename to apps/studio/src/hooks/sync-sites/tests/use-pull-push-states.test.ts diff --git a/src/hooks/sync-sites/use-listen-deep-link-connection.ts b/apps/studio/src/hooks/sync-sites/use-listen-deep-link-connection.ts similarity index 100% rename from src/hooks/sync-sites/use-listen-deep-link-connection.ts rename to apps/studio/src/hooks/sync-sites/use-listen-deep-link-connection.ts diff --git a/src/hooks/sync-sites/use-pull-push-states.ts b/apps/studio/src/hooks/sync-sites/use-pull-push-states.ts similarity index 100% rename from src/hooks/sync-sites/use-pull-push-states.ts rename to apps/studio/src/hooks/sync-sites/use-pull-push-states.ts diff --git a/src/hooks/sync-sites/use-sync-pull.ts b/apps/studio/src/hooks/sync-sites/use-sync-pull.ts similarity index 100% rename from src/hooks/sync-sites/use-sync-pull.ts rename to apps/studio/src/hooks/sync-sites/use-sync-pull.ts diff --git a/src/hooks/sync-sites/use-sync-push.ts b/apps/studio/src/hooks/sync-sites/use-sync-push.ts similarity index 100% rename from src/hooks/sync-sites/use-sync-push.ts rename to apps/studio/src/hooks/sync-sites/use-sync-push.ts diff --git a/src/hooks/tests/get-sync-support.test.ts b/apps/studio/src/hooks/tests/get-sync-support.test.ts similarity index 100% rename from src/hooks/tests/get-sync-support.test.ts rename to apps/studio/src/hooks/tests/get-sync-support.test.ts diff --git a/src/hooks/tests/reconcile-connected-sites.test.ts b/apps/studio/src/hooks/tests/reconcile-connected-sites.test.ts similarity index 100% rename from src/hooks/tests/reconcile-connected-sites.test.ts rename to apps/studio/src/hooks/tests/reconcile-connected-sites.test.ts diff --git a/src/hooks/tests/use-add-site.test.tsx b/apps/studio/src/hooks/tests/use-add-site.test.tsx similarity index 100% rename from src/hooks/tests/use-add-site.test.tsx rename to apps/studio/src/hooks/tests/use-add-site.test.tsx diff --git a/src/hooks/tests/use-drag-and-drop-file.test.tsx b/apps/studio/src/hooks/tests/use-drag-and-drop-file.test.tsx similarity index 100% rename from src/hooks/tests/use-drag-and-drop-file.test.tsx rename to apps/studio/src/hooks/tests/use-drag-and-drop-file.test.tsx diff --git a/src/hooks/tests/use-expiration-date.test.ts b/apps/studio/src/hooks/tests/use-expiration-date.test.ts similarity index 100% rename from src/hooks/tests/use-expiration-date.test.ts rename to apps/studio/src/hooks/tests/use-expiration-date.test.ts diff --git a/src/hooks/tests/use-fullscreen.test.ts b/apps/studio/src/hooks/tests/use-fullscreen.test.ts similarity index 100% rename from src/hooks/tests/use-fullscreen.test.ts rename to apps/studio/src/hooks/tests/use-fullscreen.test.ts diff --git a/src/hooks/tests/use-import-export.test.tsx b/apps/studio/src/hooks/tests/use-import-export.test.tsx similarity index 100% rename from src/hooks/tests/use-import-export.test.tsx rename to apps/studio/src/hooks/tests/use-import-export.test.tsx diff --git a/src/hooks/tests/use-is-valid-wp-cli-inline.test.ts b/apps/studio/src/hooks/tests/use-is-valid-wp-cli-inline.test.ts similarity index 100% rename from src/hooks/tests/use-is-valid-wp-cli-inline.test.ts rename to apps/studio/src/hooks/tests/use-is-valid-wp-cli-inline.test.ts diff --git a/src/hooks/tests/use-site-details.test.tsx b/apps/studio/src/hooks/tests/use-site-details.test.tsx similarity index 100% rename from src/hooks/tests/use-site-details.test.tsx rename to apps/studio/src/hooks/tests/use-site-details.test.tsx diff --git a/src/hooks/use-add-site.ts b/apps/studio/src/hooks/use-add-site.ts similarity index 96% rename from src/hooks/use-add-site.ts rename to apps/studio/src/hooks/use-add-site.ts index 92350b5f31..bb74a8feb0 100644 --- a/src/hooks/use-add-site.ts +++ b/apps/studio/src/hooks/use-add-site.ts @@ -1,9 +1,9 @@ import * as Sentry from '@sentry/electron/renderer'; import { useI18n } from '@wordpress/react-i18n'; import { useCallback, useMemo, useState } from 'react'; -import { updateBlueprintWithFormValues } from 'common/lib/blueprint-settings'; -import { BlueprintValidationWarning } from 'common/lib/blueprint-validation'; -import { generateCustomDomainFromSiteName } from 'common/lib/domains'; +import { updateBlueprintWithFormValues } from '@studio/common/lib/blueprint-settings'; +import { BlueprintValidationWarning } from '@studio/common/lib/blueprint-validation'; +import { generateCustomDomainFromSiteName } from '@studio/common/lib/domains'; import { useSyncSites } from 'src/hooks/sync-sites'; import { useContentTabs } from 'src/hooks/use-content-tabs'; import { useImportExport } from 'src/hooks/use-import-export'; @@ -16,7 +16,7 @@ import { } from 'src/stores/provider-constants-slice'; import { useConnectSiteMutation } from 'src/stores/sync/connected-sites'; import { Blueprint } from 'src/stores/wpcom-api'; -import type { BlueprintPreferredVersions } from 'common/lib/blueprint-validation'; +import type { BlueprintPreferredVersions } from '@studio/common/lib/blueprint-validation'; import type { AllowedPHPVersion } from 'src/lib/wordpress-server-types'; import type { SyncSite } from 'src/modules/sync/types'; import type { SyncOption } from 'src/types'; diff --git a/src/hooks/use-ai-icon.ts b/apps/studio/src/hooks/use-ai-icon.ts similarity index 94% rename from src/hooks/use-ai-icon.ts rename to apps/studio/src/hooks/use-ai-icon.ts index ed9c1b9ceb..d58d5453e7 100644 --- a/src/hooks/use-ai-icon.ts +++ b/apps/studio/src/hooks/use-ai-icon.ts @@ -1,8 +1,7 @@ import { RuntimeLoader } from '@rive-app/canvas'; import { useRive, useStateMachineInput } from '@rive-app/react-canvas'; import { useCallback, useEffect } from '@wordpress/element'; -// eslint-disable-next-line import/no-unresolved -import aiImage from '/assets/ai-icon.riv'; +import aiImage from '../../assets/ai-icon.riv'; const useAiIcon = () => { const stateMachineName = 'State Machine A'; diff --git a/src/hooks/use-auth.ts b/apps/studio/src/hooks/use-auth.ts similarity index 100% rename from src/hooks/use-auth.ts rename to apps/studio/src/hooks/use-auth.ts diff --git a/src/hooks/use-confirmation-dialog.ts b/apps/studio/src/hooks/use-confirmation-dialog.ts similarity index 100% rename from src/hooks/use-confirmation-dialog.ts rename to apps/studio/src/hooks/use-confirmation-dialog.ts diff --git a/src/hooks/use-content-tabs.tsx b/apps/studio/src/hooks/use-content-tabs.tsx similarity index 100% rename from src/hooks/use-content-tabs.tsx rename to apps/studio/src/hooks/use-content-tabs.tsx diff --git a/src/hooks/use-delete-site.ts b/apps/studio/src/hooks/use-delete-site.ts similarity index 100% rename from src/hooks/use-delete-site.ts rename to apps/studio/src/hooks/use-delete-site.ts diff --git a/src/hooks/use-drag-and-drop-file.ts b/apps/studio/src/hooks/use-drag-and-drop-file.ts similarity index 100% rename from src/hooks/use-drag-and-drop-file.ts rename to apps/studio/src/hooks/use-drag-and-drop-file.ts diff --git a/src/hooks/use-effective-tab.tsx b/apps/studio/src/hooks/use-effective-tab.tsx similarity index 100% rename from src/hooks/use-effective-tab.tsx rename to apps/studio/src/hooks/use-effective-tab.tsx diff --git a/src/hooks/use-execute-cli.ts b/apps/studio/src/hooks/use-execute-cli.ts similarity index 100% rename from src/hooks/use-execute-cli.ts rename to apps/studio/src/hooks/use-execute-cli.ts diff --git a/src/hooks/use-expiration-date.ts b/apps/studio/src/hooks/use-expiration-date.ts similarity index 92% rename from src/hooks/use-expiration-date.ts rename to apps/studio/src/hooks/use-expiration-date.ts index e69bced883..9e817bea78 100644 --- a/src/hooks/use-expiration-date.ts +++ b/apps/studio/src/hooks/use-expiration-date.ts @@ -1,7 +1,7 @@ import { useI18n } from '@wordpress/react-i18n'; import { intervalToDuration, formatDuration, addDays, DurationUnit, addHours } from 'date-fns'; -import { HOUR_MS, DAY_MS, DEMO_SITE_EXPIRATION_DAYS } from 'common/constants'; -import { SupportedLocale } from 'common/lib/locale'; +import { HOUR_MS, DAY_MS, DEMO_SITE_EXPIRATION_DAYS } from '@studio/common/constants'; +import { SupportedLocale } from '@studio/common/lib/locale'; import { formatDistance } from 'src/lib/date'; import { useI18nLocale } from 'src/stores'; diff --git a/src/hooks/use-feature-flags.tsx b/apps/studio/src/hooks/use-feature-flags.tsx similarity index 100% rename from src/hooks/use-feature-flags.tsx rename to apps/studio/src/hooks/use-feature-flags.tsx diff --git a/src/hooks/use-format-localized-timestamps.tsx b/apps/studio/src/hooks/use-format-localized-timestamps.tsx similarity index 100% rename from src/hooks/use-format-localized-timestamps.tsx rename to apps/studio/src/hooks/use-format-localized-timestamps.tsx diff --git a/src/hooks/use-fullscreen.ts b/apps/studio/src/hooks/use-fullscreen.ts similarity index 100% rename from src/hooks/use-fullscreen.ts rename to apps/studio/src/hooks/use-fullscreen.ts diff --git a/src/hooks/use-get-wp-version.ts b/apps/studio/src/hooks/use-get-wp-version.ts similarity index 100% rename from src/hooks/use-get-wp-version.ts rename to apps/studio/src/hooks/use-get-wp-version.ts diff --git a/src/hooks/use-gravatar-url.ts b/apps/studio/src/hooks/use-gravatar-url.ts similarity index 100% rename from src/hooks/use-gravatar-url.ts rename to apps/studio/src/hooks/use-gravatar-url.ts diff --git a/src/hooks/use-import-export.tsx b/apps/studio/src/hooks/use-import-export.tsx similarity index 100% rename from src/hooks/use-import-export.tsx rename to apps/studio/src/hooks/use-import-export.tsx diff --git a/src/hooks/use-ipc-listener.ts b/apps/studio/src/hooks/use-ipc-listener.ts similarity index 100% rename from src/hooks/use-ipc-listener.ts rename to apps/studio/src/hooks/use-ipc-listener.ts diff --git a/src/hooks/use-is-valid-blueprint.ts b/apps/studio/src/hooks/use-is-valid-blueprint.ts similarity index 100% rename from src/hooks/use-is-valid-blueprint.ts rename to apps/studio/src/hooks/use-is-valid-blueprint.ts diff --git a/src/hooks/use-is-valid-wp-cli-inline.ts b/apps/studio/src/hooks/use-is-valid-wp-cli-inline.ts similarity index 100% rename from src/hooks/use-is-valid-wp-cli-inline.ts rename to apps/studio/src/hooks/use-is-valid-wp-cli-inline.ts diff --git a/src/hooks/use-localization-support.ts b/apps/studio/src/hooks/use-localization-support.ts similarity index 100% rename from src/hooks/use-localization-support.ts rename to apps/studio/src/hooks/use-localization-support.ts diff --git a/src/hooks/use-offline.ts b/apps/studio/src/hooks/use-offline.ts similarity index 100% rename from src/hooks/use-offline.ts rename to apps/studio/src/hooks/use-offline.ts diff --git a/src/hooks/use-progress.tsx b/apps/studio/src/hooks/use-progress.tsx similarity index 100% rename from src/hooks/use-progress.tsx rename to apps/studio/src/hooks/use-progress.tsx diff --git a/src/hooks/use-sha256.ts b/apps/studio/src/hooks/use-sha256.ts similarity index 100% rename from src/hooks/use-sha256.ts rename to apps/studio/src/hooks/use-sha256.ts diff --git a/src/hooks/use-sidebar-visibility.ts b/apps/studio/src/hooks/use-sidebar-visibility.ts similarity index 100% rename from src/hooks/use-sidebar-visibility.ts rename to apps/studio/src/hooks/use-sidebar-visibility.ts diff --git a/src/hooks/use-site-details.tsx b/apps/studio/src/hooks/use-site-details.tsx similarity index 99% rename from src/hooks/use-site-details.tsx rename to apps/studio/src/hooks/use-site-details.tsx index 9fbca106a2..62802a62ed 100644 --- a/src/hooks/use-site-details.tsx +++ b/apps/studio/src/hooks/use-site-details.tsx @@ -8,8 +8,8 @@ import { useMemo, useState, } from 'react'; -import { SITE_EVENTS, SiteEvent } from 'common/lib/site-events'; -import { sortSites } from 'common/lib/sort-sites'; +import { SITE_EVENTS, SiteEvent } from '@studio/common/lib/site-events'; +import { sortSites } from '@studio/common/lib/sort-sites'; import { useAuth } from 'src/hooks/use-auth'; import { useContentTabs } from 'src/hooks/use-content-tabs'; import { useIpcListener } from 'src/hooks/use-ipc-listener'; diff --git a/src/hooks/use-site-size.ts b/apps/studio/src/hooks/use-site-size.ts similarity index 92% rename from src/hooks/use-site-size.ts rename to apps/studio/src/hooks/use-site-size.ts index fc73503204..c2c9b18664 100644 --- a/src/hooks/use-site-size.ts +++ b/apps/studio/src/hooks/use-site-size.ts @@ -1,5 +1,5 @@ import { useState, useEffect, useCallback } from 'react'; -import { DEMO_SITE_SIZE_LIMIT_BYTES } from 'common/constants'; +import { DEMO_SITE_SIZE_LIMIT_BYTES } from '@studio/common/constants'; import { useWindowListener } from 'src/hooks/use-window-listener'; import { getIpcApi } from 'src/lib/get-ipc-api'; diff --git a/src/hooks/use-sync-states-progress-info.ts b/apps/studio/src/hooks/use-sync-states-progress-info.ts similarity index 100% rename from src/hooks/use-sync-states-progress-info.ts rename to apps/studio/src/hooks/use-sync-states-progress-info.ts diff --git a/src/hooks/use-theme-details.tsx b/apps/studio/src/hooks/use-theme-details.tsx similarity index 100% rename from src/hooks/use-theme-details.tsx rename to apps/studio/src/hooks/use-theme-details.tsx diff --git a/src/hooks/use-window-listener.ts b/apps/studio/src/hooks/use-window-listener.ts similarity index 100% rename from src/hooks/use-window-listener.ts rename to apps/studio/src/hooks/use-window-listener.ts diff --git a/src/index.css b/apps/studio/src/index.css similarity index 99% rename from src/index.css rename to apps/studio/src/index.css index 4f2ed3b72a..e8a62af924 100644 --- a/src/index.css +++ b/apps/studio/src/index.css @@ -52,7 +52,7 @@ blockquote { .components-tab-panel__tabs { padding: 0 theme( 'spacing.4' ); - border-bottom: 1px solid theme( 'colors.a8c-gray.5' ); + border-bottom: 1px solid theme( 'colors.a8c-gray-5' ); } .components-tab-panel__tabs-item { diff --git a/src/index.ts b/apps/studio/src/index.ts similarity index 98% rename from src/index.ts rename to apps/studio/src/index.ts index 64db916882..fa86e35e9f 100644 --- a/src/index.ts +++ b/apps/studio/src/index.ts @@ -18,15 +18,15 @@ import { REACT_DEVELOPER_TOOLS, REDUX_DEVTOOLS, } from 'electron-devtools-installer'; -import { PROTOCOL_PREFIX } from 'common/constants'; +import { PROTOCOL_PREFIX } from '@studio/common/constants'; import { bumpStat, bumpAggregatedUniqueStat, AppdataProvider, LastBumpStatsData, -} from 'common/lib/bump-stat'; -import { suppressPunycodeWarning } from 'common/lib/suppress-punycode-warning'; -import { StatsGroup } from 'common/types/stats'; +} from '@studio/common/lib/bump-stat'; +import { suppressPunycodeWarning } from '@studio/common/lib/suppress-punycode-warning'; +import { StatsGroup } from '@studio/common/types/stats'; import { IPC_VOID_HANDLERS } from 'src/constants'; import * as ipcHandlers from 'src/ipc-handlers'; import { @@ -95,7 +95,7 @@ const appAppdataProvider: AppdataProvider< LastBumpStatsData > = { unlock: unlockAppdata, save: async ( data ) => { // Cast is safe: data comes from loadUserData() which returns the full UserData type. - // The lock/unlock is already handled by the caller (updateLastBump in common/lib/bump-stat.ts) + // The lock/unlock is already handled by the caller (updateLastBump in /common/lib/bump-stat.ts) // eslint-disable-next-line studio/require-lock-before-save await saveUserData( data as never ); }, diff --git a/src/ipc-handlers.ts b/apps/studio/src/ipc-handlers.ts similarity index 98% rename from src/ipc-handlers.ts rename to apps/studio/src/ipc-handlers.ts index 4f7c2f278f..d35b7d6c03 100644 --- a/src/ipc-handlers.ts +++ b/apps/studio/src/ipc-handlers.ts @@ -18,9 +18,9 @@ import os from 'os'; import nodePath from 'path'; import * as Sentry from '@sentry/electron/main'; import { __, sprintf, LocaleData, defaultI18n } from '@wordpress/i18n'; -import { validateBlueprintData } from 'common/lib/blueprint-validation'; -import { bumpStat } from 'common/lib/bump-stat'; -import { parseCliError, errorMessageContains } from 'common/lib/cli-error'; +import { validateBlueprintData } from '@studio/common/lib/blueprint-validation'; +import { bumpStat } from '@studio/common/lib/bump-stat'; +import { parseCliError, errorMessageContains } from '@studio/common/lib/cli-error'; import { calculateDirectorySize, isWordPressDirectory, @@ -28,15 +28,15 @@ import { isEmptyDir, pathExists, recursiveCopyDirectory, -} from 'common/lib/fs-utils'; -import { getWordPressVersion } from 'common/lib/get-wordpress-version'; -import { isErrnoException } from 'common/lib/is-errno-exception'; -import { getAuthenticationUrl } from 'common/lib/oauth'; -import { portFinder } from 'common/lib/port-finder'; -import { sanitizeFolderName } from 'common/lib/sanitize-folder-name'; -import { isWordPressDevVersion } from 'common/lib/wordpress-version-utils'; -import { Snapshot } from 'common/types/snapshot'; -import { StatsGroup, StatsMetric } from 'common/types/stats'; +} from '@studio/common/lib/fs-utils'; +import { getWordPressVersion } from '@studio/common/lib/get-wordpress-version'; +import { isErrnoException } from '@studio/common/lib/is-errno-exception'; +import { getAuthenticationUrl } from '@studio/common/lib/oauth'; +import { portFinder } from '@studio/common/lib/port-finder'; +import { sanitizeFolderName } from '@studio/common/lib/sanitize-folder-name'; +import { isWordPressDevVersion } from '@studio/common/lib/wordpress-version-utils'; +import { Snapshot } from '@studio/common/types/snapshot'; +import { StatsGroup, StatsMetric } from '@studio/common/types/stats'; import { MAIN_MIN_WIDTH, SIDEBAR_WIDTH } from 'src/constants'; import { sendIpcEventToRendererWithWindow } from 'src/ipc-utils'; import { getBetaFeatures as getBetaFeaturesFromLib } from 'src/lib/beta-features'; diff --git a/src/ipc-types.d.ts b/apps/studio/src/ipc-types.d.ts similarity index 100% rename from src/ipc-types.d.ts rename to apps/studio/src/ipc-types.d.ts diff --git a/src/ipc-utils.ts b/apps/studio/src/ipc-utils.ts similarity index 93% rename from src/ipc-utils.ts rename to apps/studio/src/ipc-utils.ts index ec17a1eb51..25cbc40425 100644 --- a/src/ipc-utils.ts +++ b/apps/studio/src/ipc-utils.ts @@ -1,8 +1,8 @@ import crypto from 'crypto'; import { BrowserWindow } from 'electron'; -import { BlueprintValidationWarning } from 'common/lib/blueprint-validation'; -import { SiteEvent } from 'common/lib/site-events'; -import { PreviewCommandLoggerAction } from 'common/logger-actions'; +import { BlueprintValidationWarning } from '@studio/common/lib/blueprint-validation'; +import { SiteEvent } from '@studio/common/lib/site-events'; +import { PreviewCommandLoggerAction } from '@studio/common/logger-actions'; import { ImportExportEventData } from 'src/lib/import-export/handle-events'; import { StoredToken } from 'src/lib/oauth'; import { getMainWindow } from 'src/main-window'; diff --git a/src/lib/active-sync-operations.ts b/apps/studio/src/lib/active-sync-operations.ts similarity index 100% rename from src/lib/active-sync-operations.ts rename to apps/studio/src/lib/active-sync-operations.ts diff --git a/src/lib/app-globals.ts b/apps/studio/src/lib/app-globals.ts similarity index 100% rename from src/lib/app-globals.ts rename to apps/studio/src/lib/app-globals.ts diff --git a/src/lib/beta-features.ts b/apps/studio/src/lib/beta-features.ts similarity index 100% rename from src/lib/beta-features.ts rename to apps/studio/src/lib/beta-features.ts diff --git a/src/lib/bump-stats/lib.ts b/apps/studio/src/lib/bump-stats/lib.ts similarity index 95% rename from src/lib/bump-stats/lib.ts rename to apps/studio/src/lib/bump-stats/lib.ts index 060b54e2ee..c6b3f71df3 100644 --- a/src/lib/bump-stats/lib.ts +++ b/apps/studio/src/lib/bump-stats/lib.ts @@ -1,4 +1,4 @@ -import { StatsMetric } from 'common/types/stats'; +import { StatsMetric } from '@studio/common/types/stats'; import { JetpackImporter, LocalImporter, diff --git a/src/lib/certificate-manager.ts b/apps/studio/src/lib/certificate-manager.ts similarity index 100% rename from src/lib/certificate-manager.ts rename to apps/studio/src/lib/certificate-manager.ts diff --git a/src/lib/cx.ts b/apps/studio/src/lib/cx.ts similarity index 100% rename from src/lib/cx.ts rename to apps/studio/src/lib/cx.ts diff --git a/src/lib/date.ts b/apps/studio/src/lib/date.ts similarity index 100% rename from src/lib/date.ts rename to apps/studio/src/lib/date.ts diff --git a/src/lib/deeplink/deeplink-handler.ts b/apps/studio/src/lib/deeplink/deeplink-handler.ts similarity index 100% rename from src/lib/deeplink/deeplink-handler.ts rename to apps/studio/src/lib/deeplink/deeplink-handler.ts diff --git a/src/lib/deeplink/handlers/add-site-with-blueprint.ts b/apps/studio/src/lib/deeplink/handlers/add-site-with-blueprint.ts similarity index 97% rename from src/lib/deeplink/handlers/add-site-with-blueprint.ts rename to apps/studio/src/lib/deeplink/handlers/add-site-with-blueprint.ts index 07eae6bf42..674a2ce43f 100644 --- a/src/lib/deeplink/handlers/add-site-with-blueprint.ts +++ b/apps/studio/src/lib/deeplink/handlers/add-site-with-blueprint.ts @@ -2,7 +2,7 @@ import { app, dialog, shell } from 'electron'; import nodePath from 'path'; import { __ } from '@wordpress/i18n'; import fs from 'fs-extra'; -import { validateBlueprintData } from 'common/lib/blueprint-validation'; +import { validateBlueprintData } from '@studio/common/lib/blueprint-validation'; import { sendIpcEventToRenderer } from 'src/ipc-utils'; import { download } from 'src/lib/download'; import { getLogsFilePath } from 'src/logging'; diff --git a/src/lib/deeplink/handlers/auth.ts b/apps/studio/src/lib/deeplink/handlers/auth.ts similarity index 100% rename from src/lib/deeplink/handlers/auth.ts rename to apps/studio/src/lib/deeplink/handlers/auth.ts diff --git a/src/lib/deeplink/handlers/sync-connect-site.ts b/apps/studio/src/lib/deeplink/handlers/sync-connect-site.ts similarity index 100% rename from src/lib/deeplink/handlers/sync-connect-site.ts rename to apps/studio/src/lib/deeplink/handlers/sync-connect-site.ts diff --git a/src/lib/deeplink/index.ts b/apps/studio/src/lib/deeplink/index.ts similarity index 100% rename from src/lib/deeplink/index.ts rename to apps/studio/src/lib/deeplink/index.ts diff --git a/src/lib/deeplink/tests/add-site.test.ts b/apps/studio/src/lib/deeplink/tests/add-site.test.ts similarity index 98% rename from src/lib/deeplink/tests/add-site.test.ts rename to apps/studio/src/lib/deeplink/tests/add-site.test.ts index e49a49e1a4..cdd2f6d662 100644 --- a/src/lib/deeplink/tests/add-site.test.ts +++ b/apps/studio/src/lib/deeplink/tests/add-site.test.ts @@ -1,7 +1,7 @@ import { app, dialog, shell, BrowserWindow } from 'electron'; import fs from 'fs-extra'; import { vi, beforeAll, afterAll } from 'vitest'; -import { validateBlueprintData } from 'common/lib/blueprint-validation'; +import { validateBlueprintData } from '@studio/common/lib/blueprint-validation'; import { sendIpcEventToRenderer } from 'src/ipc-utils'; import { handleAddSiteWithBlueprint } from 'src/lib/deeplink/handlers/add-site-with-blueprint'; import { download } from 'src/lib/download'; @@ -15,7 +15,7 @@ vi.mock( 'src/main-window' ); vi.mock( 'src/logging', () => ( { getLogsFilePath: vi.fn( () => '/mock/path/to/logs.log' ), } ) ); -vi.mock( 'common/lib/blueprint-validation', () => ( { +vi.mock( '@studio/common/lib/blueprint-validation', () => ( { validateBlueprintData: vi.fn(), } ) ); diff --git a/src/lib/deeplink/tests/auth.test.ts b/apps/studio/src/lib/deeplink/tests/auth.test.ts similarity index 100% rename from src/lib/deeplink/tests/auth.test.ts rename to apps/studio/src/lib/deeplink/tests/auth.test.ts diff --git a/src/lib/deeplink/tests/sync-connect-site.test.ts b/apps/studio/src/lib/deeplink/tests/sync-connect-site.test.ts similarity index 100% rename from src/lib/deeplink/tests/sync-connect-site.test.ts rename to apps/studio/src/lib/deeplink/tests/sync-connect-site.test.ts diff --git a/src/lib/download-utils.ts b/apps/studio/src/lib/download-utils.ts similarity index 99% rename from src/lib/download-utils.ts rename to apps/studio/src/lib/download-utils.ts index 20f4566b56..0c90fcf1c8 100644 --- a/src/lib/download-utils.ts +++ b/apps/studio/src/lib/download-utils.ts @@ -9,7 +9,7 @@ import path from 'path'; import followRedirects, { FollowResponse } from 'follow-redirects'; import fs from 'fs-extra'; import { HttpProxyAgent, HttpsProxyAgent } from 'hpagent'; -import { extractZip } from 'common/lib/extract-zip'; +import { extractZip } from '@studio/common/lib/extract-zip'; import { getWordPressVersionPath, getWpCliPath } from './server-files-paths'; const { https } = followRedirects; diff --git a/src/lib/download.ts b/apps/studio/src/lib/download.ts similarity index 100% rename from src/lib/download.ts rename to apps/studio/src/lib/download.ts diff --git a/src/lib/error-formatting.ts b/apps/studio/src/lib/error-formatting.ts similarity index 100% rename from src/lib/error-formatting.ts rename to apps/studio/src/lib/error-formatting.ts diff --git a/src/lib/feature-flags.ts b/apps/studio/src/lib/feature-flags.ts similarity index 100% rename from src/lib/feature-flags.ts rename to apps/studio/src/lib/feature-flags.ts diff --git a/src/lib/generate-checkout-url.ts b/apps/studio/src/lib/generate-checkout-url.ts similarity index 91% rename from src/lib/generate-checkout-url.ts rename to apps/studio/src/lib/generate-checkout-url.ts index e6749151c4..b5e455fd75 100644 --- a/src/lib/generate-checkout-url.ts +++ b/apps/studio/src/lib/generate-checkout-url.ts @@ -1,4 +1,4 @@ -import { DEFAULT_CUSTOM_DOMAIN_SUFFIX } from 'common/constants'; +import { DEFAULT_CUSTOM_DOMAIN_SUFFIX } from '@studio/common/constants'; export function generateCheckoutUrl( selectedSite?: SiteDetails, diff --git a/src/lib/generate-site-name.ts b/apps/studio/src/lib/generate-site-name.ts similarity index 96% rename from src/lib/generate-site-name.ts rename to apps/studio/src/lib/generate-site-name.ts index 88038ee94e..db297932aa 100644 --- a/src/lib/generate-site-name.ts +++ b/apps/studio/src/lib/generate-site-name.ts @@ -1,7 +1,7 @@ import { __ } from '@wordpress/i18n'; import { getIpcApi } from 'src/lib/get-ipc-api'; -export { sanitizeFolderName } from 'common/lib/sanitize-folder-name'; +export { sanitizeFolderName } from '@studio/common/lib/sanitize-folder-name'; async function isNameAvailable( name: string, usedSites: SiteDetails[] ): Promise< boolean > { const isNameUnique = ! usedSites.some( ( site ) => site.name === name ); diff --git a/src/lib/get-image-data.ts b/apps/studio/src/lib/get-image-data.ts similarity index 100% rename from src/lib/get-image-data.ts rename to apps/studio/src/lib/get-image-data.ts diff --git a/src/lib/get-ipc-api.ts b/apps/studio/src/lib/get-ipc-api.ts similarity index 100% rename from src/lib/get-ipc-api.ts rename to apps/studio/src/lib/get-ipc-api.ts diff --git a/src/lib/get-localized-link.ts b/apps/studio/src/lib/get-localized-link.ts similarity index 98% rename from src/lib/get-localized-link.ts rename to apps/studio/src/lib/get-localized-link.ts index 7ed1c5a7b5..cefbfee99c 100644 --- a/src/lib/get-localized-link.ts +++ b/apps/studio/src/lib/get-localized-link.ts @@ -1,4 +1,4 @@ -import { SupportedLocale } from 'common/lib/locale'; +import { SupportedLocale } from '@studio/common/lib/locale'; // English is always required, and the other locales are optional. type TranslatedLink = Partial< Record< SupportedLocale, string > > & { en: string }; diff --git a/src/lib/get-site-url.ts b/apps/studio/src/lib/get-site-url.ts similarity index 100% rename from src/lib/get-site-url.ts rename to apps/studio/src/lib/get-site-url.ts diff --git a/src/lib/get-sync-backup-temp-path.ts b/apps/studio/src/lib/get-sync-backup-temp-path.ts similarity index 100% rename from src/lib/get-sync-backup-temp-path.ts rename to apps/studio/src/lib/get-sync-backup-temp-path.ts diff --git a/src/lib/hosts-file.ts b/apps/studio/src/lib/hosts-file.ts similarity index 99% rename from src/lib/hosts-file.ts rename to apps/studio/src/lib/hosts-file.ts index 3d64c7d026..6cdbbeac21 100644 --- a/src/lib/hosts-file.ts +++ b/apps/studio/src/lib/hosts-file.ts @@ -4,7 +4,7 @@ import { platform, tmpdir } from 'os'; import path from 'path'; import { promisify } from 'util'; import * as Sentry from '@sentry/electron/main'; -import { escapeRegex } from 'common/lib/escape-regex'; +import { escapeRegex } from '@studio/common/lib/escape-regex'; import { sudoExec } from 'src/lib/sudo-exec'; const readFile = promisify( fs.readFile ); diff --git a/src/lib/import-export/export/events.ts b/apps/studio/src/lib/import-export/export/events.ts similarity index 100% rename from src/lib/import-export/export/events.ts rename to apps/studio/src/lib/import-export/export/events.ts diff --git a/src/lib/import-export/export/export-database.ts b/apps/studio/src/lib/import-export/export/export-database.ts similarity index 100% rename from src/lib/import-export/export/export-database.ts rename to apps/studio/src/lib/import-export/export/export-database.ts diff --git a/src/lib/import-export/export/export-manager.ts b/apps/studio/src/lib/import-export/export/export-manager.ts similarity index 100% rename from src/lib/import-export/export/export-manager.ts rename to apps/studio/src/lib/import-export/export/export-manager.ts diff --git a/src/lib/import-export/export/exporters/default-exporter.ts b/apps/studio/src/lib/import-export/export/exporters/default-exporter.ts similarity index 100% rename from src/lib/import-export/export/exporters/default-exporter.ts rename to apps/studio/src/lib/import-export/export/exporters/default-exporter.ts diff --git a/src/lib/import-export/export/exporters/index.ts b/apps/studio/src/lib/import-export/export/exporters/index.ts similarity index 100% rename from src/lib/import-export/export/exporters/index.ts rename to apps/studio/src/lib/import-export/export/exporters/index.ts diff --git a/src/lib/import-export/export/exporters/sql-exporter.ts b/apps/studio/src/lib/import-export/export/exporters/sql-exporter.ts similarity index 100% rename from src/lib/import-export/export/exporters/sql-exporter.ts rename to apps/studio/src/lib/import-export/export/exporters/sql-exporter.ts diff --git a/src/lib/import-export/export/generate-backup-filename.ts b/apps/studio/src/lib/import-export/export/generate-backup-filename.ts similarity index 100% rename from src/lib/import-export/export/generate-backup-filename.ts rename to apps/studio/src/lib/import-export/export/generate-backup-filename.ts diff --git a/src/lib/import-export/export/types.ts b/apps/studio/src/lib/import-export/export/types.ts similarity index 100% rename from src/lib/import-export/export/types.ts rename to apps/studio/src/lib/import-export/export/types.ts diff --git a/src/lib/import-export/handle-events.ts b/apps/studio/src/lib/import-export/handle-events.ts similarity index 100% rename from src/lib/import-export/handle-events.ts rename to apps/studio/src/lib/import-export/handle-events.ts diff --git a/src/lib/import-export/import/events.ts b/apps/studio/src/lib/import-export/import/events.ts similarity index 100% rename from src/lib/import-export/import/events.ts rename to apps/studio/src/lib/import-export/import/events.ts diff --git a/src/lib/import-export/import/handlers/backup-handler-factory.ts b/apps/studio/src/lib/import-export/import/handlers/backup-handler-factory.ts similarity index 100% rename from src/lib/import-export/import/handlers/backup-handler-factory.ts rename to apps/studio/src/lib/import-export/import/handlers/backup-handler-factory.ts diff --git a/src/lib/import-export/import/handlers/backup-handler-sql.ts b/apps/studio/src/lib/import-export/import/handlers/backup-handler-sql.ts similarity index 100% rename from src/lib/import-export/import/handlers/backup-handler-sql.ts rename to apps/studio/src/lib/import-export/import/handlers/backup-handler-sql.ts diff --git a/src/lib/import-export/import/handlers/backup-handler-tar-gz.ts b/apps/studio/src/lib/import-export/import/handlers/backup-handler-tar-gz.ts similarity index 100% rename from src/lib/import-export/import/handlers/backup-handler-tar-gz.ts rename to apps/studio/src/lib/import-export/import/handlers/backup-handler-tar-gz.ts diff --git a/src/lib/import-export/import/handlers/backup-handler-wpress.ts b/apps/studio/src/lib/import-export/import/handlers/backup-handler-wpress.ts similarity index 100% rename from src/lib/import-export/import/handlers/backup-handler-wpress.ts rename to apps/studio/src/lib/import-export/import/handlers/backup-handler-wpress.ts diff --git a/src/lib/import-export/import/handlers/backup-handler-zip.ts b/apps/studio/src/lib/import-export/import/handlers/backup-handler-zip.ts similarity index 100% rename from src/lib/import-export/import/handlers/backup-handler-zip.ts rename to apps/studio/src/lib/import-export/import/handlers/backup-handler-zip.ts diff --git a/src/lib/import-export/import/import-manager.ts b/apps/studio/src/lib/import-export/import/import-manager.ts similarity index 100% rename from src/lib/import-export/import/import-manager.ts rename to apps/studio/src/lib/import-export/import/import-manager.ts diff --git a/src/lib/import-export/import/importers/importer.ts b/apps/studio/src/lib/import-export/import/importers/importer.ts similarity index 99% rename from src/lib/import-export/import/importers/importer.ts rename to apps/studio/src/lib/import-export/import/importers/importer.ts index 57d5154e2e..f57249ea10 100644 --- a/src/lib/import-export/import/importers/importer.ts +++ b/apps/studio/src/lib/import-export/import/importers/importer.ts @@ -6,8 +6,8 @@ import path from 'path'; import { createInterface } from 'readline'; import { lstat, move } from 'fs-extra'; import semver from 'semver'; -import { DEFAULT_PHP_VERSION } from 'common/constants'; -import { SupportedPHPVersionsList } from 'common/types/php-versions'; +import { DEFAULT_PHP_VERSION } from '@studio/common/constants'; +import { SupportedPHPVersionsList } from '@studio/common/types/php-versions'; import { getSiteUrl } from 'src/lib/get-site-url'; import { generateBackupFilename } from 'src/lib/import-export/export/generate-backup-filename'; import { ImportEvents } from 'src/lib/import-export/import/events'; diff --git a/src/lib/import-export/import/importers/index.ts b/apps/studio/src/lib/import-export/import/importers/index.ts similarity index 100% rename from src/lib/import-export/import/importers/index.ts rename to apps/studio/src/lib/import-export/import/importers/index.ts diff --git a/src/lib/import-export/import/types.ts b/apps/studio/src/lib/import-export/import/types.ts similarity index 100% rename from src/lib/import-export/import/types.ts rename to apps/studio/src/lib/import-export/import/types.ts diff --git a/src/lib/import-export/import/validators/index.ts b/apps/studio/src/lib/import-export/import/validators/index.ts similarity index 100% rename from src/lib/import-export/import/validators/index.ts rename to apps/studio/src/lib/import-export/import/validators/index.ts diff --git a/src/lib/import-export/import/validators/jetpack-validator.ts b/apps/studio/src/lib/import-export/import/validators/jetpack-validator.ts similarity index 100% rename from src/lib/import-export/import/validators/jetpack-validator.ts rename to apps/studio/src/lib/import-export/import/validators/jetpack-validator.ts diff --git a/src/lib/import-export/import/validators/local-validator.ts b/apps/studio/src/lib/import-export/import/validators/local-validator.ts similarity index 100% rename from src/lib/import-export/import/validators/local-validator.ts rename to apps/studio/src/lib/import-export/import/validators/local-validator.ts diff --git a/src/lib/import-export/import/validators/playground-validator.ts b/apps/studio/src/lib/import-export/import/validators/playground-validator.ts similarity index 100% rename from src/lib/import-export/import/validators/playground-validator.ts rename to apps/studio/src/lib/import-export/import/validators/playground-validator.ts diff --git a/src/lib/import-export/import/validators/sql-validator.ts b/apps/studio/src/lib/import-export/import/validators/sql-validator.ts similarity index 100% rename from src/lib/import-export/import/validators/sql-validator.ts rename to apps/studio/src/lib/import-export/import/validators/sql-validator.ts diff --git a/src/lib/import-export/import/validators/validator.ts b/apps/studio/src/lib/import-export/import/validators/validator.ts similarity index 100% rename from src/lib/import-export/import/validators/validator.ts rename to apps/studio/src/lib/import-export/import/validators/validator.ts diff --git a/src/lib/import-export/import/validators/wpress-validator.ts b/apps/studio/src/lib/import-export/import/validators/wpress-validator.ts similarity index 100% rename from src/lib/import-export/import/validators/wpress-validator.ts rename to apps/studio/src/lib/import-export/import/validators/wpress-validator.ts diff --git a/src/lib/import-export/tests/export/export-manager.test.ts b/apps/studio/src/lib/import-export/tests/export/export-manager.test.ts similarity index 100% rename from src/lib/import-export/tests/export/export-manager.test.ts rename to apps/studio/src/lib/import-export/tests/export/export-manager.test.ts diff --git a/src/lib/import-export/tests/export/exporters/default-exporter.test.ts b/apps/studio/src/lib/import-export/tests/export/exporters/default-exporter.test.ts similarity index 100% rename from src/lib/import-export/tests/export/exporters/default-exporter.test.ts rename to apps/studio/src/lib/import-export/tests/export/exporters/default-exporter.test.ts diff --git a/src/lib/import-export/tests/export/exporters/sql-exporter.test.ts b/apps/studio/src/lib/import-export/tests/export/exporters/sql-exporter.test.ts similarity index 100% rename from src/lib/import-export/tests/export/exporters/sql-exporter.test.ts rename to apps/studio/src/lib/import-export/tests/export/exporters/sql-exporter.test.ts diff --git a/src/lib/import-export/tests/import/handlers/backup-handler.test.ts b/apps/studio/src/lib/import-export/tests/import/handlers/backup-handler.test.ts similarity index 100% rename from src/lib/import-export/tests/import/handlers/backup-handler.test.ts rename to apps/studio/src/lib/import-export/tests/import/handlers/backup-handler.test.ts diff --git a/src/lib/import-export/tests/import/import-manager.test.ts b/apps/studio/src/lib/import-export/tests/import/import-manager.test.ts similarity index 100% rename from src/lib/import-export/tests/import/import-manager.test.ts rename to apps/studio/src/lib/import-export/tests/import/import-manager.test.ts diff --git a/src/lib/import-export/tests/import/importer/jetpack-importer.test.ts b/apps/studio/src/lib/import-export/tests/import/importer/jetpack-importer.test.ts similarity index 100% rename from src/lib/import-export/tests/import/importer/jetpack-importer.test.ts rename to apps/studio/src/lib/import-export/tests/import/importer/jetpack-importer.test.ts diff --git a/src/lib/import-export/tests/import/importer/local-importer.test.ts b/apps/studio/src/lib/import-export/tests/import/importer/local-importer.test.ts similarity index 100% rename from src/lib/import-export/tests/import/importer/local-importer.test.ts rename to apps/studio/src/lib/import-export/tests/import/importer/local-importer.test.ts diff --git a/src/lib/import-export/tests/import/importer/playground-importer.test.ts b/apps/studio/src/lib/import-export/tests/import/importer/playground-importer.test.ts similarity index 100% rename from src/lib/import-export/tests/import/importer/playground-importer.test.ts rename to apps/studio/src/lib/import-export/tests/import/importer/playground-importer.test.ts diff --git a/src/lib/import-export/tests/import/validators/jetpack-validator.test.ts b/apps/studio/src/lib/import-export/tests/import/validators/jetpack-validator.test.ts similarity index 100% rename from src/lib/import-export/tests/import/validators/jetpack-validator.test.ts rename to apps/studio/src/lib/import-export/tests/import/validators/jetpack-validator.test.ts diff --git a/src/lib/import-export/tests/import/validators/local-validator.test.ts b/apps/studio/src/lib/import-export/tests/import/validators/local-validator.test.ts similarity index 100% rename from src/lib/import-export/tests/import/validators/local-validator.test.ts rename to apps/studio/src/lib/import-export/tests/import/validators/local-validator.test.ts diff --git a/src/lib/import-export/tests/import/validators/playground-validator.test.ts b/apps/studio/src/lib/import-export/tests/import/validators/playground-validator.test.ts similarity index 100% rename from src/lib/import-export/tests/import/validators/playground-validator.test.ts rename to apps/studio/src/lib/import-export/tests/import/validators/playground-validator.test.ts diff --git a/src/lib/import-export/tests/import/validators/sql-validator.test.ts b/apps/studio/src/lib/import-export/tests/import/validators/sql-validator.test.ts similarity index 100% rename from src/lib/import-export/tests/import/validators/sql-validator.test.ts rename to apps/studio/src/lib/import-export/tests/import/validators/sql-validator.test.ts diff --git a/src/lib/import-export/tests/import/validators/wpress-validator.test.ts b/apps/studio/src/lib/import-export/tests/import/validators/wpress-validator.test.ts similarity index 100% rename from src/lib/import-export/tests/import/validators/wpress-validator.test.ts rename to apps/studio/src/lib/import-export/tests/import/validators/wpress-validator.test.ts diff --git a/src/lib/is-installed.ts b/apps/studio/src/lib/is-installed.ts similarity index 100% rename from src/lib/is-installed.ts rename to apps/studio/src/lib/is-installed.ts diff --git a/src/lib/is-invalid-oauth-token-error.ts b/apps/studio/src/lib/is-invalid-oauth-token-error.ts similarity index 100% rename from src/lib/is-invalid-oauth-token-error.ts rename to apps/studio/src/lib/is-invalid-oauth-token-error.ts diff --git a/src/lib/is-window-frame-rtl.ts b/apps/studio/src/lib/is-window-frame-rtl.ts similarity index 100% rename from src/lib/is-window-frame-rtl.ts rename to apps/studio/src/lib/is-window-frame-rtl.ts diff --git a/src/lib/is-wpcom-network-error.ts b/apps/studio/src/lib/is-wpcom-network-error.ts similarity index 100% rename from src/lib/is-wpcom-network-error.ts rename to apps/studio/src/lib/is-wpcom-network-error.ts diff --git a/src/lib/locale-node.ts b/apps/studio/src/lib/locale-node.ts similarity index 95% rename from src/lib/locale-node.ts rename to apps/studio/src/lib/locale-node.ts index 3de5d6f3b6..8d5421bc09 100644 --- a/src/lib/locale-node.ts +++ b/apps/studio/src/lib/locale-node.ts @@ -5,7 +5,7 @@ import { isSupportedLocale, SupportedLocale, supportedLocales, -} from 'common/lib/locale'; +} from '@studio/common/lib/locale'; import { loadUserData } from 'src/storage/user-data'; export function getSupportedLocale() { diff --git a/src/lib/oauth.ts b/apps/studio/src/lib/oauth.ts similarity index 87% rename from src/lib/oauth.ts rename to apps/studio/src/lib/oauth.ts index 6c984cbffc..c42ee6ac85 100644 --- a/src/lib/oauth.ts +++ b/apps/studio/src/lib/oauth.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; -import { CLIENT_ID } from 'common/constants'; -import { SupportedLocale } from 'common/lib/locale'; -import { getAuthenticationUrl } from 'common/lib/oauth'; +import { CLIENT_ID } from '@studio/common/constants'; +import { SupportedLocale } from '@studio/common/lib/locale'; +import { getAuthenticationUrl } from '@studio/common/lib/oauth'; import { loadUserData } from 'src/storage/user-data'; const authTokenSchema = z.object( { diff --git a/src/lib/sanitize-for-logging.ts b/apps/studio/src/lib/sanitize-for-logging.ts similarity index 100% rename from src/lib/sanitize-for-logging.ts rename to apps/studio/src/lib/sanitize-for-logging.ts diff --git a/src/lib/sentry-release.ts b/apps/studio/src/lib/sentry-release.ts similarity index 100% rename from src/lib/sentry-release.ts rename to apps/studio/src/lib/sentry-release.ts diff --git a/src/lib/serialize-plugins.ts b/apps/studio/src/lib/serialize-plugins.ts similarity index 100% rename from src/lib/serialize-plugins.ts rename to apps/studio/src/lib/serialize-plugins.ts diff --git a/src/lib/server-files-paths.ts b/apps/studio/src/lib/server-files-paths.ts similarity index 100% rename from src/lib/server-files-paths.ts rename to apps/studio/src/lib/server-files-paths.ts diff --git a/src/lib/shell-open-external-wrapper.ts b/apps/studio/src/lib/shell-open-external-wrapper.ts similarity index 100% rename from src/lib/shell-open-external-wrapper.ts rename to apps/studio/src/lib/shell-open-external-wrapper.ts diff --git a/src/lib/site-language.ts b/apps/studio/src/lib/site-language.ts similarity index 98% rename from src/lib/site-language.ts rename to apps/studio/src/lib/site-language.ts index 4fa19c4f22..3188e08777 100644 --- a/src/lib/site-language.ts +++ b/apps/studio/src/lib/site-language.ts @@ -2,7 +2,7 @@ import path from 'path'; import { Locale } from '@formatjs/intl-locale'; import { match } from '@formatjs/intl-localematcher'; import fs from 'fs-extra'; -import { DEFAULT_LOCALE } from 'common/lib/locale'; +import { DEFAULT_LOCALE } from '@studio/common/lib/locale'; import { getUserLocaleWithFallback } from 'src/lib/locale-node'; import { getResourcesPath } from 'src/storage/paths'; diff --git a/src/lib/sqlite-command-release.ts b/apps/studio/src/lib/sqlite-command-release.ts similarity index 100% rename from src/lib/sqlite-command-release.ts rename to apps/studio/src/lib/sqlite-command-release.ts diff --git a/src/lib/sqlite-command-versions.ts b/apps/studio/src/lib/sqlite-command-versions.ts similarity index 100% rename from src/lib/sqlite-command-versions.ts rename to apps/studio/src/lib/sqlite-command-versions.ts diff --git a/src/lib/sqlite-versions.ts b/apps/studio/src/lib/sqlite-versions.ts similarity index 82% rename from src/lib/sqlite-versions.ts rename to apps/studio/src/lib/sqlite-versions.ts index 96679cbd3b..c4f8d5ab5a 100644 --- a/src/lib/sqlite-versions.ts +++ b/apps/studio/src/lib/sqlite-versions.ts @@ -1,5 +1,5 @@ -import { SQLITE_FILENAME } from 'common/constants'; -import { SqliteIntegrationProvider } from 'common/lib/sqlite-integration'; +import { SQLITE_FILENAME } from '@studio/common/constants'; +import { SqliteIntegrationProvider } from '@studio/common/lib/sqlite-integration'; import { getServerFilesPath } from 'src/storage/paths'; class ElectronSqliteProvider extends SqliteIntegrationProvider { diff --git a/src/lib/sudo-exec.ts b/apps/studio/src/lib/sudo-exec.ts similarity index 100% rename from src/lib/sudo-exec.ts rename to apps/studio/src/lib/sudo-exec.ts diff --git a/src/lib/test-utils.tsx b/apps/studio/src/lib/test-utils.tsx similarity index 100% rename from src/lib/test-utils.tsx rename to apps/studio/src/lib/test-utils.tsx diff --git a/src/lib/tests/bump-stats.test.ts b/apps/studio/src/lib/tests/bump-stats.test.ts similarity index 98% rename from src/lib/tests/bump-stats.test.ts rename to apps/studio/src/lib/tests/bump-stats.test.ts index 471e91c144..b4e5cc0889 100644 --- a/src/lib/tests/bump-stats.test.ts +++ b/apps/studio/src/lib/tests/bump-stats.test.ts @@ -6,8 +6,8 @@ import { bumpAggregatedUniqueStat, AppdataProvider, LastBumpStatsData, -} from 'common/lib/bump-stat'; -import { AggregateInterval, StatsGroup, StatsMetric } from 'common/types/stats'; +} from '@studio/common/lib/bump-stat'; +import { AggregateInterval, StatsGroup, StatsMetric } from '@studio/common/types/stats'; vi.mock( 'atomically', () => ( { readFile: vi.fn(), diff --git a/src/lib/tests/generate-site-name.test.ts b/apps/studio/src/lib/tests/generate-site-name.test.ts similarity index 100% rename from src/lib/tests/generate-site-name.test.ts rename to apps/studio/src/lib/tests/generate-site-name.test.ts diff --git a/src/lib/tests/get-localized-link.test.ts b/apps/studio/src/lib/tests/get-localized-link.test.ts similarity index 100% rename from src/lib/tests/get-localized-link.test.ts rename to apps/studio/src/lib/tests/get-localized-link.test.ts diff --git a/src/lib/tests/get-site-url.test.ts b/apps/studio/src/lib/tests/get-site-url.test.ts similarity index 100% rename from src/lib/tests/get-site-url.test.ts rename to apps/studio/src/lib/tests/get-site-url.test.ts diff --git a/src/lib/tests/hosts-file.test.ts b/apps/studio/src/lib/tests/hosts-file.test.ts similarity index 100% rename from src/lib/tests/hosts-file.test.ts rename to apps/studio/src/lib/tests/hosts-file.test.ts diff --git a/src/lib/tests/is-installed.test.ts b/apps/studio/src/lib/tests/is-installed.test.ts similarity index 100% rename from src/lib/tests/is-installed.test.ts rename to apps/studio/src/lib/tests/is-installed.test.ts diff --git a/src/lib/tests/is-invalid-oauth-token-error.test.ts b/apps/studio/src/lib/tests/is-invalid-oauth-token-error.test.ts similarity index 100% rename from src/lib/tests/is-invalid-oauth-token-error.test.ts rename to apps/studio/src/lib/tests/is-invalid-oauth-token-error.test.ts diff --git a/src/lib/tests/locale.test.ts b/apps/studio/src/lib/tests/locale.test.ts similarity index 97% rename from src/lib/tests/locale.test.ts rename to apps/studio/src/lib/tests/locale.test.ts index c7612abb1f..801f140bd9 100644 --- a/src/lib/tests/locale.test.ts +++ b/apps/studio/src/lib/tests/locale.test.ts @@ -4,7 +4,7 @@ import { app } from 'electron'; import { createI18n } from '@wordpress/i18n'; import { vi } from 'vitest'; -import { getLocaleData } from 'common/lib/locale'; +import { getLocaleData } from '@studio/common/lib/locale'; import { getSupportedLocale } from 'src/lib/locale-node'; vi.mocked( app ).getLocale = vi.fn(); diff --git a/src/lib/tests/oauth.test.ts b/apps/studio/src/lib/tests/oauth.test.ts similarity index 98% rename from src/lib/tests/oauth.test.ts rename to apps/studio/src/lib/tests/oauth.test.ts index 3faaa2c675..141b1d2b07 100644 --- a/src/lib/tests/oauth.test.ts +++ b/apps/studio/src/lib/tests/oauth.test.ts @@ -1,6 +1,6 @@ import { readFile } from 'atomically'; import { vi } from 'vitest'; -import { SupportedLocale } from 'common/lib/locale'; +import { SupportedLocale } from '@studio/common/lib/locale'; import { getAuthenticationToken, getSignUpUrl } from 'src/lib/oauth'; vi.mock( 'src/lib/certificate-manager', () => ( {} ) ); diff --git a/src/lib/tests/sanitize-for-logging.test.ts b/apps/studio/src/lib/tests/sanitize-for-logging.test.ts similarity index 100% rename from src/lib/tests/sanitize-for-logging.test.ts rename to apps/studio/src/lib/tests/sanitize-for-logging.test.ts diff --git a/src/lib/tests/serialize-plugins.test.ts b/apps/studio/src/lib/tests/serialize-plugins.test.ts similarity index 100% rename from src/lib/tests/serialize-plugins.test.ts rename to apps/studio/src/lib/tests/serialize-plugins.test.ts diff --git a/src/lib/tests/site-language.test.ts b/apps/studio/src/lib/tests/site-language.test.ts similarity index 100% rename from src/lib/tests/site-language.test.ts rename to apps/studio/src/lib/tests/site-language.test.ts diff --git a/src/lib/tests/url-utils.test.ts b/apps/studio/src/lib/tests/url-utils.test.ts similarity index 100% rename from src/lib/tests/url-utils.test.ts rename to apps/studio/src/lib/tests/url-utils.test.ts diff --git a/src/lib/tests/windows-helpers.test.ts b/apps/studio/src/lib/tests/windows-helpers.test.ts similarity index 100% rename from src/lib/tests/windows-helpers.test.ts rename to apps/studio/src/lib/tests/windows-helpers.test.ts diff --git a/src/lib/update-site-url.ts b/apps/studio/src/lib/update-site-url.ts similarity index 100% rename from src/lib/update-site-url.ts rename to apps/studio/src/lib/update-site-url.ts diff --git a/src/lib/url-utils.ts b/apps/studio/src/lib/url-utils.ts similarity index 100% rename from src/lib/url-utils.ts rename to apps/studio/src/lib/url-utils.ts diff --git a/src/lib/user-data-watcher.ts b/apps/studio/src/lib/user-data-watcher.ts similarity index 100% rename from src/lib/user-data-watcher.ts rename to apps/studio/src/lib/user-data-watcher.ts diff --git a/src/lib/version-utils.ts b/apps/studio/src/lib/version-utils.ts similarity index 100% rename from src/lib/version-utils.ts rename to apps/studio/src/lib/version-utils.ts diff --git a/src/lib/windows-helpers.ts b/apps/studio/src/lib/windows-helpers.ts similarity index 100% rename from src/lib/windows-helpers.ts rename to apps/studio/src/lib/windows-helpers.ts diff --git a/src/lib/wordpress-server-types.ts b/apps/studio/src/lib/wordpress-server-types.ts similarity index 100% rename from src/lib/wordpress-server-types.ts rename to apps/studio/src/lib/wordpress-server-types.ts diff --git a/src/lib/wordpress-setup.ts b/apps/studio/src/lib/wordpress-setup.ts similarity index 89% rename from src/lib/wordpress-setup.ts rename to apps/studio/src/lib/wordpress-setup.ts index 9432cd4961..75a576fea0 100644 --- a/src/lib/wordpress-setup.ts +++ b/apps/studio/src/lib/wordpress-setup.ts @@ -4,7 +4,7 @@ */ import nodePath from 'path'; -import { pathExists, recursiveCopyDirectory } from 'common/lib/fs-utils'; +import { pathExists, recursiveCopyDirectory } from '@studio/common/lib/fs-utils'; import { getResourcesPath } from 'src/storage/paths'; /** diff --git a/src/lib/wp-versions.ts b/apps/studio/src/lib/wp-versions.ts similarity index 97% rename from src/lib/wp-versions.ts rename to apps/studio/src/lib/wp-versions.ts index 618fa979ae..f9304c2305 100644 --- a/src/lib/wp-versions.ts +++ b/apps/studio/src/lib/wp-versions.ts @@ -1,7 +1,7 @@ import path from 'path'; import fs from 'fs-extra'; import semver from 'semver'; -import { recursiveCopyDirectory } from 'common/lib/fs-utils'; +import { recursiveCopyDirectory } from '@studio/common/lib/fs-utils'; import { downloadWordPress } from 'src/lib/download-utils'; import { getWordPressVersionPath } from 'src/lib/server-files-paths'; diff --git a/src/lib/wpcom-factory.ts b/apps/studio/src/lib/wpcom-factory.ts similarity index 100% rename from src/lib/wpcom-factory.ts rename to apps/studio/src/lib/wpcom-factory.ts diff --git a/src/lib/wpcom-xhr-request-factory.ts b/apps/studio/src/lib/wpcom-xhr-request-factory.ts similarity index 100% rename from src/lib/wpcom-xhr-request-factory.ts rename to apps/studio/src/lib/wpcom-xhr-request-factory.ts diff --git a/src/logging.ts b/apps/studio/src/logging.ts similarity index 100% rename from src/logging.ts rename to apps/studio/src/logging.ts diff --git a/src/main-window.ts b/apps/studio/src/main-window.ts similarity index 99% rename from src/main-window.ts rename to apps/studio/src/main-window.ts index 714dd51ba3..f80bc47393 100644 --- a/src/main-window.ts +++ b/apps/studio/src/main-window.ts @@ -1,6 +1,6 @@ import { BrowserWindow, type BrowserWindowConstructorOptions, screen, app } from 'electron'; import * as path from 'path'; -import { portFinder } from 'common/lib/port-finder'; +import { portFinder } from '@studio/common/lib/port-finder'; import { DEFAULT_WIDTH, MAIN_MIN_HEIGHT, diff --git a/src/menu.ts b/apps/studio/src/menu.ts similarity index 100% rename from src/menu.ts rename to apps/studio/src/menu.ts diff --git a/src/migrations/migrate-from-wp-now-folder.ts b/apps/studio/src/migrations/migrate-from-wp-now-folder.ts similarity index 92% rename from src/migrations/migrate-from-wp-now-folder.ts rename to apps/studio/src/migrations/migrate-from-wp-now-folder.ts index 96ae5f1f4c..6384e5901e 100644 --- a/src/migrations/migrate-from-wp-now-folder.ts +++ b/apps/studio/src/migrations/migrate-from-wp-now-folder.ts @@ -1,6 +1,6 @@ import { app } from 'electron'; import path from 'path'; -import { pathExists, recursiveCopyDirectory } from 'common/lib/fs-utils'; +import { pathExists, recursiveCopyDirectory } from '@studio/common/lib/fs-utils'; import { getServerFilesPath } from 'src/storage/paths'; import { loadUserData } from 'src/storage/user-data'; diff --git a/src/migrations/remove-sites-with-empty-dirs.ts b/apps/studio/src/migrations/remove-sites-with-empty-dirs.ts similarity index 92% rename from src/migrations/remove-sites-with-empty-dirs.ts rename to apps/studio/src/migrations/remove-sites-with-empty-dirs.ts index 694b47c4dc..75893b13da 100644 --- a/src/migrations/remove-sites-with-empty-dirs.ts +++ b/apps/studio/src/migrations/remove-sites-with-empty-dirs.ts @@ -1,4 +1,4 @@ -import { isEmptyDir } from 'common/lib/fs-utils'; +import { isEmptyDir } from '@studio/common/lib/fs-utils'; import { loadUserData, lockAppdata, saveUserData, unlockAppdata } from 'src/storage/user-data'; export async function removeSitesWithEmptyDirectories() { diff --git a/src/migrations/rename-launch-uniques-stat.ts b/apps/studio/src/migrations/rename-launch-uniques-stat.ts similarity index 91% rename from src/migrations/rename-launch-uniques-stat.ts rename to apps/studio/src/migrations/rename-launch-uniques-stat.ts index d204330e33..01f05cfcbb 100644 --- a/src/migrations/rename-launch-uniques-stat.ts +++ b/apps/studio/src/migrations/rename-launch-uniques-stat.ts @@ -1,4 +1,4 @@ -import { StatsGroup } from 'common/types/stats'; +import { StatsGroup } from '@studio/common/types/stats'; import { loadUserData, lockAppdata, saveUserData, unlockAppdata } from 'src/storage/user-data'; export async function renameLaunchUniquesStat() { diff --git a/src/modules/add-site/components/blueprint-deeplink.tsx b/apps/studio/src/modules/add-site/components/blueprint-deeplink.tsx similarity index 96% rename from src/modules/add-site/components/blueprint-deeplink.tsx rename to apps/studio/src/modules/add-site/components/blueprint-deeplink.tsx index 7008e572bb..26ea4d248d 100644 --- a/src/modules/add-site/components/blueprint-deeplink.tsx +++ b/apps/studio/src/modules/add-site/components/blueprint-deeplink.tsx @@ -7,7 +7,7 @@ import { } from '@wordpress/components'; import { check, link } from '@wordpress/icons'; import { useI18n } from '@wordpress/react-i18n'; -import { BlueprintValidationWarning } from 'common/lib/blueprint-validation'; +import { BlueprintValidationWarning } from '@studio/common/lib/blueprint-validation'; import { Blueprint } from 'src/stores/wpcom-api'; import { BlueprintWarningNotice } from './blueprint-warning-notice'; diff --git a/src/modules/add-site/components/blueprint-icon.tsx b/apps/studio/src/modules/add-site/components/blueprint-icon.tsx similarity index 100% rename from src/modules/add-site/components/blueprint-icon.tsx rename to apps/studio/src/modules/add-site/components/blueprint-icon.tsx diff --git a/src/modules/add-site/components/blueprint-warning-notice.tsx b/apps/studio/src/modules/add-site/components/blueprint-warning-notice.tsx similarity index 97% rename from src/modules/add-site/components/blueprint-warning-notice.tsx rename to apps/studio/src/modules/add-site/components/blueprint-warning-notice.tsx index 0af5a30158..677af870a3 100644 --- a/src/modules/add-site/components/blueprint-warning-notice.tsx +++ b/apps/studio/src/modules/add-site/components/blueprint-warning-notice.tsx @@ -9,7 +9,7 @@ import { import { Icon, caution, check } from '@wordpress/icons'; import { useI18n } from '@wordpress/react-i18n'; import { useState } from 'react'; -import { BlueprintValidationWarning } from 'common/lib/blueprint-validation'; +import { BlueprintValidationWarning } from '@studio/common/lib/blueprint-validation'; interface BlueprintIssuesModalProps { warnings: BlueprintValidationWarning[] | undefined; diff --git a/src/modules/add-site/components/blueprints.css b/apps/studio/src/modules/add-site/components/blueprints.css similarity index 100% rename from src/modules/add-site/components/blueprints.css rename to apps/studio/src/modules/add-site/components/blueprints.css diff --git a/src/modules/add-site/components/blueprints.tsx b/apps/studio/src/modules/add-site/components/blueprints.tsx similarity index 100% rename from src/modules/add-site/components/blueprints.tsx rename to apps/studio/src/modules/add-site/components/blueprints.tsx diff --git a/src/modules/add-site/components/create-site-form.tsx b/apps/studio/src/modules/add-site/components/create-site-form.tsx similarity index 98% rename from src/modules/add-site/components/create-site-form.tsx rename to apps/studio/src/modules/add-site/components/create-site-form.tsx index afa7c5b89d..02d0e4fba3 100644 --- a/src/modules/add-site/components/create-site-form.tsx +++ b/apps/studio/src/modules/add-site/components/create-site-form.tsx @@ -4,9 +4,9 @@ import { __, sprintf, _n } from '@wordpress/i18n'; import { tip, cautionFilled, chevronRight, chevronDown, chevronLeft } from '@wordpress/icons'; import { useI18n } from '@wordpress/react-i18n'; import { FormEvent, useState, useEffect, useCallback, useMemo, useRef, RefObject } from 'react'; -import { DEFAULT_WORDPRESS_VERSION } from 'common/constants'; -import { generateCustomDomainFromSiteName, getDomainNameValidationError } from 'common/lib/domains'; -import { SupportedPHPVersions } from 'common/types/php-versions'; +import { DEFAULT_WORDPRESS_VERSION } from '@studio/common/constants'; +import { generateCustomDomainFromSiteName, getDomainNameValidationError } from '@studio/common/lib/domains'; +import { SupportedPHPVersions } from '@studio/common/types/php-versions'; import Button from 'src/components/button'; import FolderIcon from 'src/components/folder-icon'; import { LearnMoreLink, LearnHowLink } from 'src/components/learn-more'; @@ -19,7 +19,7 @@ import { selectDefaultWordPressVersion, selectAllowedPhpVersions, } from 'src/stores/provider-constants-slice'; -import type { BlueprintPreferredVersions } from 'common/lib/blueprint-validation'; +import type { BlueprintPreferredVersions } from '@studio/common/lib/blueprint-validation'; import type { CreateSiteFormValues, PathValidationResult } from 'src/hooks/use-add-site'; import type { AllowedPHPVersion } from 'src/lib/wordpress-server-types'; diff --git a/src/modules/add-site/components/create-site.tsx b/apps/studio/src/modules/add-site/components/create-site.tsx similarity index 95% rename from src/modules/add-site/components/create-site.tsx rename to apps/studio/src/modules/add-site/components/create-site.tsx index d35eab063c..ea12804183 100644 --- a/src/modules/add-site/components/create-site.tsx +++ b/apps/studio/src/modules/add-site/components/create-site.tsx @@ -6,7 +6,7 @@ import { useI18n } from '@wordpress/react-i18n'; import { RefObject } from 'react'; import { AllowedPHPVersion } from 'src/lib/wordpress-server-types'; import { CreateSiteForm } from 'src/modules/add-site/components/create-site-form'; -import type { BlueprintPreferredVersions } from 'common/lib/blueprint-validation'; +import type { BlueprintPreferredVersions } from '@studio/common/lib/blueprint-validation'; import type { CreateSiteFormValues, PathValidationResult } from 'src/hooks/use-add-site'; export interface CreateSiteProps { diff --git a/src/modules/add-site/components/import-backup.tsx b/apps/studio/src/modules/add-site/components/import-backup.tsx similarity index 100% rename from src/modules/add-site/components/import-backup.tsx rename to apps/studio/src/modules/add-site/components/import-backup.tsx diff --git a/src/modules/add-site/components/index.ts b/apps/studio/src/modules/add-site/components/index.ts similarity index 100% rename from src/modules/add-site/components/index.ts rename to apps/studio/src/modules/add-site/components/index.ts diff --git a/src/modules/add-site/components/options.tsx b/apps/studio/src/modules/add-site/components/options.tsx similarity index 100% rename from src/modules/add-site/components/options.tsx rename to apps/studio/src/modules/add-site/components/options.tsx diff --git a/src/modules/add-site/components/pull-remote-site.tsx b/apps/studio/src/modules/add-site/components/pull-remote-site.tsx similarity index 100% rename from src/modules/add-site/components/pull-remote-site.tsx rename to apps/studio/src/modules/add-site/components/pull-remote-site.tsx diff --git a/src/modules/add-site/components/stepper.tsx b/apps/studio/src/modules/add-site/components/stepper.tsx similarity index 100% rename from src/modules/add-site/components/stepper.tsx rename to apps/studio/src/modules/add-site/components/stepper.tsx diff --git a/src/modules/add-site/hooks/tests/use-blueprint-deeplink.test.tsx b/apps/studio/src/modules/add-site/hooks/tests/use-blueprint-deeplink.test.tsx similarity index 100% rename from src/modules/add-site/hooks/tests/use-blueprint-deeplink.test.tsx rename to apps/studio/src/modules/add-site/hooks/tests/use-blueprint-deeplink.test.tsx diff --git a/src/modules/add-site/hooks/tests/use-find-available-site-name.test.ts b/apps/studio/src/modules/add-site/hooks/tests/use-find-available-site-name.test.ts similarity index 100% rename from src/modules/add-site/hooks/tests/use-find-available-site-name.test.ts rename to apps/studio/src/modules/add-site/hooks/tests/use-find-available-site-name.test.ts diff --git a/src/modules/add-site/hooks/use-blueprint-deeplink.ts b/apps/studio/src/modules/add-site/hooks/use-blueprint-deeplink.ts similarity index 95% rename from src/modules/add-site/hooks/use-blueprint-deeplink.ts rename to apps/studio/src/modules/add-site/hooks/use-blueprint-deeplink.ts index ca649e320e..73685281f9 100644 --- a/src/modules/add-site/hooks/use-blueprint-deeplink.ts +++ b/apps/studio/src/modules/add-site/hooks/use-blueprint-deeplink.ts @@ -1,10 +1,10 @@ import { useI18n } from '@wordpress/react-i18n'; import { useCallback } from 'react'; -import { extractFormValuesFromBlueprint } from 'common/lib/blueprint-settings'; +import { extractFormValuesFromBlueprint } from '@studio/common/lib/blueprint-settings'; import { BlueprintValidationWarning, BlueprintPreferredVersions, -} from 'common/lib/blueprint-validation'; +} from '@studio/common/lib/blueprint-validation'; import { useIpcListener } from 'src/hooks/use-ipc-listener'; import { getIpcApi } from 'src/lib/get-ipc-api'; import { Blueprint } from 'src/stores/wpcom-api'; diff --git a/src/modules/add-site/hooks/use-find-available-site-name.ts b/apps/studio/src/modules/add-site/hooks/use-find-available-site-name.ts similarity index 100% rename from src/modules/add-site/hooks/use-find-available-site-name.ts rename to apps/studio/src/modules/add-site/hooks/use-find-available-site-name.ts diff --git a/src/modules/add-site/hooks/use-stepper.ts b/apps/studio/src/modules/add-site/hooks/use-stepper.ts similarity index 100% rename from src/modules/add-site/hooks/use-stepper.ts rename to apps/studio/src/modules/add-site/hooks/use-stepper.ts diff --git a/src/modules/add-site/index.tsx b/apps/studio/src/modules/add-site/index.tsx similarity index 97% rename from src/modules/add-site/index.tsx rename to apps/studio/src/modules/add-site/index.tsx index 2272b48ac3..535bfb665a 100644 --- a/src/modules/add-site/index.tsx +++ b/apps/studio/src/modules/add-site/index.tsx @@ -3,10 +3,10 @@ import { Navigator, useNavigator } from '@wordpress/components'; import { sprintf } from '@wordpress/i18n'; import { useI18n } from '@wordpress/react-i18n'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { MINIMUM_WORDPRESS_VERSION } from 'common/constants'; -import { extractFormValuesFromBlueprint } from 'common/lib/blueprint-settings'; -import { BlueprintPreferredVersions } from 'common/lib/blueprint-validation'; -import { SupportedPHPVersionsList } from 'common/types/php-versions'; +import { MINIMUM_WORDPRESS_VERSION } from '@studio/common/constants'; +import { extractFormValuesFromBlueprint } from '@studio/common/lib/blueprint-settings'; +import { BlueprintPreferredVersions } from '@studio/common/lib/blueprint-validation'; +import { SupportedPHPVersionsList } from '@studio/common/types/php-versions'; import Button from 'src/components/button'; import { FullscreenModal } from 'src/components/fullscreen-modal'; import { useAddSite, CreateSiteFormValues } from 'src/hooks/use-add-site'; @@ -67,7 +67,7 @@ interface NavigationContentProps { selectedBlueprint?: Blueprint; blueprintPreferredVersions?: BlueprintPreferredVersions; setBlueprintPreferredVersions?: ( versions: BlueprintPreferredVersions | undefined ) => void; - blueprintDeeplinkWarnings?: import('common/lib/blueprint-validation').BlueprintValidationWarning[]; + blueprintDeeplinkWarnings?: import('@studio/common/lib/blueprint-validation').BlueprintValidationWarning[]; blueprintSuggestedDomain?: string; setBlueprintSuggestedDomain?: ( domain: string | undefined ) => void; blueprintSuggestedHttps?: boolean; diff --git a/src/modules/add-site/tests/add-site.test.tsx b/apps/studio/src/modules/add-site/tests/add-site.test.tsx similarity index 100% rename from src/modules/add-site/tests/add-site.test.tsx rename to apps/studio/src/modules/add-site/tests/add-site.test.tsx diff --git a/src/modules/cli/lib/cli-events-subscriber.ts b/apps/studio/src/modules/cli/lib/cli-events-subscriber.ts similarity index 96% rename from src/modules/cli/lib/cli-events-subscriber.ts rename to apps/studio/src/modules/cli/lib/cli-events-subscriber.ts index 55a0a8a46a..06df10c359 100644 --- a/src/modules/cli/lib/cli-events-subscriber.ts +++ b/apps/studio/src/modules/cli/lib/cli-events-subscriber.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import { sequential } from 'common/lib/sequential'; -import { siteEventSchema, SiteEvent, SITE_EVENTS, SiteDetails } from 'common/lib/site-events'; +import { sequential } from '@studio/common/lib/sequential'; +import { siteEventSchema, SiteEvent, SITE_EVENTS, SiteDetails } from '@studio/common/lib/site-events'; import { sendIpcEventToRenderer } from 'src/ipc-utils'; import { executeCliCommand } from 'src/modules/cli/lib/execute-command'; import { SiteServer } from 'src/site-server'; diff --git a/src/modules/cli/lib/cli-server-process.ts b/apps/studio/src/modules/cli/lib/cli-server-process.ts similarity index 97% rename from src/modules/cli/lib/cli-server-process.ts rename to apps/studio/src/modules/cli/lib/cli-server-process.ts index a7f3d24755..3987965505 100644 --- a/src/modules/cli/lib/cli-server-process.ts +++ b/apps/studio/src/modules/cli/lib/cli-server-process.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { SiteCommandLoggerAction } from 'common/logger-actions'; +import { SiteCommandLoggerAction } from '@studio/common/logger-actions'; import { executeCliCommand } from './execute-command'; import type { WordPressServerProcess } from 'src/lib/wordpress-server-types'; diff --git a/src/modules/cli/lib/cli-site-creator.ts b/apps/studio/src/modules/cli/lib/cli-site-creator.ts similarity index 96% rename from src/modules/cli/lib/cli-site-creator.ts rename to apps/studio/src/modules/cli/lib/cli-site-creator.ts index 0f20f8d7d3..3f1e95659b 100644 --- a/src/modules/cli/lib/cli-site-creator.ts +++ b/apps/studio/src/modules/cli/lib/cli-site-creator.ts @@ -2,8 +2,8 @@ import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; import { z } from 'zod'; -import { isWordPressDevVersion } from 'common/lib/wordpress-version-utils'; -import { SiteCommandLoggerAction } from 'common/logger-actions'; +import { isWordPressDevVersion } from '@studio/common/lib/wordpress-version-utils'; +import { SiteCommandLoggerAction } from '@studio/common/logger-actions'; import { sendIpcEventToRenderer } from 'src/ipc-utils'; import { executeCliCommand } from './execute-command'; import type { Blueprint } from '@wp-playground/blueprints'; diff --git a/src/modules/cli/lib/cli-site-editor.ts b/apps/studio/src/modules/cli/lib/cli-site-editor.ts similarity index 96% rename from src/modules/cli/lib/cli-site-editor.ts rename to apps/studio/src/modules/cli/lib/cli-site-editor.ts index a027c51a31..48a005ab44 100644 --- a/src/modules/cli/lib/cli-site-editor.ts +++ b/apps/studio/src/modules/cli/lib/cli-site-editor.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { SiteCommandLoggerAction } from 'common/logger-actions'; +import { SiteCommandLoggerAction } from '@studio/common/logger-actions'; import { executeCliCommand } from './execute-command'; const cliEventSchema = z.object( { diff --git a/src/modules/cli/lib/execute-command.ts b/apps/studio/src/modules/cli/lib/execute-command.ts similarity index 100% rename from src/modules/cli/lib/execute-command.ts rename to apps/studio/src/modules/cli/lib/execute-command.ts diff --git a/src/modules/cli/lib/execute-preview-command.ts b/apps/studio/src/modules/cli/lib/execute-preview-command.ts similarity index 96% rename from src/modules/cli/lib/execute-preview-command.ts rename to apps/studio/src/modules/cli/lib/execute-preview-command.ts index 0187c8d1ad..e83585063d 100644 --- a/src/modules/cli/lib/execute-preview-command.ts +++ b/apps/studio/src/modules/cli/lib/execute-preview-command.ts @@ -1,6 +1,6 @@ import crypto from 'crypto'; import { z } from 'zod'; -import { PreviewCommandLoggerAction } from 'common/logger-actions'; +import { PreviewCommandLoggerAction } from '@studio/common/logger-actions'; import { sendIpcEventToRendererWithWindow } from 'src/ipc-utils'; import { executeCliCommand } from 'src/modules/cli/lib/execute-command'; diff --git a/src/modules/cli/lib/ipc-handlers.ts b/apps/studio/src/modules/cli/lib/ipc-handlers.ts similarity index 100% rename from src/modules/cli/lib/ipc-handlers.ts rename to apps/studio/src/modules/cli/lib/ipc-handlers.ts diff --git a/src/modules/cli/lib/macos-installation-manager.ts b/apps/studio/src/modules/cli/lib/macos-installation-manager.ts similarity index 98% rename from src/modules/cli/lib/macos-installation-manager.ts rename to apps/studio/src/modules/cli/lib/macos-installation-manager.ts index 2cca3adf6c..88522c9ee7 100644 --- a/src/modules/cli/lib/macos-installation-manager.ts +++ b/apps/studio/src/modules/cli/lib/macos-installation-manager.ts @@ -3,7 +3,7 @@ import { mkdir, readlink, symlink, unlink, lstat } from 'node:fs/promises'; import path from 'node:path'; import * as Sentry from '@sentry/electron/main'; import { __, sprintf } from '@wordpress/i18n'; -import { isErrnoException } from 'common/lib/is-errno-exception'; +import { isErrnoException } from '@studio/common/lib/is-errno-exception'; import { sudoExec } from 'src/lib/sudo-exec'; import { getMainWindow } from 'src/main-window'; import { StudioCliInstallationManager } from 'src/modules/cli/lib/ipc-handlers'; diff --git a/src/modules/cli/lib/windows-installation-manager.ts b/apps/studio/src/modules/cli/lib/windows-installation-manager.ts similarity index 100% rename from src/modules/cli/lib/windows-installation-manager.ts rename to apps/studio/src/modules/cli/lib/windows-installation-manager.ts diff --git a/src/modules/onboarding/components/connect-to-wpcom.tsx b/apps/studio/src/modules/onboarding/components/connect-to-wpcom.tsx similarity index 100% rename from src/modules/onboarding/components/connect-to-wpcom.tsx rename to apps/studio/src/modules/onboarding/components/connect-to-wpcom.tsx diff --git a/src/modules/onboarding/hooks/use-onboarding.tsx b/apps/studio/src/modules/onboarding/hooks/use-onboarding.tsx similarity index 100% rename from src/modules/onboarding/hooks/use-onboarding.tsx rename to apps/studio/src/modules/onboarding/hooks/use-onboarding.tsx diff --git a/src/modules/onboarding/index.tsx b/apps/studio/src/modules/onboarding/index.tsx similarity index 100% rename from src/modules/onboarding/index.tsx rename to apps/studio/src/modules/onboarding/index.tsx diff --git a/src/modules/preview-site/components/create-preview-button.tsx b/apps/studio/src/modules/preview-site/components/create-preview-button.tsx similarity index 98% rename from src/modules/preview-site/components/create-preview-button.tsx rename to apps/studio/src/modules/preview-site/components/create-preview-button.tsx index ab16085558..a65dc64a6a 100644 --- a/src/modules/preview-site/components/create-preview-button.tsx +++ b/apps/studio/src/modules/preview-site/components/create-preview-button.tsx @@ -1,6 +1,6 @@ import { __, sprintf } from '@wordpress/i18n'; import { useI18n } from '@wordpress/react-i18n'; -import { DEMO_SITE_SIZE_LIMIT_GB } from 'common/constants'; +import { DEMO_SITE_SIZE_LIMIT_GB } from '@studio/common/constants'; import { AuthContextType } from 'src/components/auth-provider'; import Button from 'src/components/button'; import offlineIcon from 'src/components/offline-icon'; diff --git a/src/modules/preview-site/components/delete-progress-row.tsx b/apps/studio/src/modules/preview-site/components/delete-progress-row.tsx similarity index 100% rename from src/modules/preview-site/components/delete-progress-row.tsx rename to apps/studio/src/modules/preview-site/components/delete-progress-row.tsx diff --git a/src/modules/preview-site/components/preview-action-buttons-menu.tsx b/apps/studio/src/modules/preview-site/components/preview-action-buttons-menu.tsx similarity index 98% rename from src/modules/preview-site/components/preview-action-buttons-menu.tsx rename to apps/studio/src/modules/preview-site/components/preview-action-buttons-menu.tsx index 4ea17ef181..90ac2c1d75 100644 --- a/src/modules/preview-site/components/preview-action-buttons-menu.tsx +++ b/apps/studio/src/modules/preview-site/components/preview-action-buttons-menu.tsx @@ -3,7 +3,7 @@ import { __ } from '@wordpress/i18n'; import { moreVertical } from '@wordpress/icons'; import { useI18n } from '@wordpress/react-i18n'; import { useState } from 'react'; -import { Snapshot } from 'common/types/snapshot'; +import { Snapshot } from '@studio/common/types/snapshot'; import offlineIcon from 'src/components/offline-icon'; import { Tooltip, TooltipProps } from 'src/components/tooltip'; import { useConfirmationDialog } from 'src/hooks/use-confirmation-dialog'; diff --git a/src/modules/preview-site/components/preview-site-row.tsx b/apps/studio/src/modules/preview-site/components/preview-site-row.tsx similarity index 99% rename from src/modules/preview-site/components/preview-site-row.tsx rename to apps/studio/src/modules/preview-site/components/preview-site-row.tsx index 174213ca39..4d01b96f68 100644 --- a/src/modules/preview-site/components/preview-site-row.tsx +++ b/apps/studio/src/modules/preview-site/components/preview-site-row.tsx @@ -3,7 +3,7 @@ import { sprintf } from '@wordpress/i18n'; import { Icon, published, cautionFilled } from '@wordpress/icons'; import { useI18n } from '@wordpress/react-i18n'; import { useEffect, useState, useRef } from 'react'; -import { Snapshot } from 'common/types/snapshot'; +import { Snapshot } from '@studio/common/types/snapshot'; import { ArrowIcon } from 'src/components/arrow-icon'; import Button from 'src/components/button'; import { TooltipProps, Tooltip } from 'src/components/tooltip'; diff --git a/src/modules/preview-site/components/preview-sites-table-header.tsx b/apps/studio/src/modules/preview-site/components/preview-sites-table-header.tsx similarity index 100% rename from src/modules/preview-site/components/preview-sites-table-header.tsx rename to apps/studio/src/modules/preview-site/components/preview-sites-table-header.tsx diff --git a/src/modules/preview-site/components/progress-row.tsx b/apps/studio/src/modules/preview-site/components/progress-row.tsx similarity index 100% rename from src/modules/preview-site/components/progress-row.tsx rename to apps/studio/src/modules/preview-site/components/progress-row.tsx diff --git a/src/modules/preview-site/components/rename-preview-modal.tsx b/apps/studio/src/modules/preview-site/components/rename-preview-modal.tsx similarity index 100% rename from src/modules/preview-site/components/rename-preview-modal.tsx rename to apps/studio/src/modules/preview-site/components/rename-preview-modal.tsx diff --git a/src/modules/preview-site/components/tests/preview-action-buttons-menu.test.tsx b/apps/studio/src/modules/preview-site/components/tests/preview-action-buttons-menu.test.tsx similarity index 98% rename from src/modules/preview-site/components/tests/preview-action-buttons-menu.test.tsx rename to apps/studio/src/modules/preview-site/components/tests/preview-action-buttons-menu.test.tsx index d0b2031386..ac7ae38ed8 100644 --- a/src/modules/preview-site/components/tests/preview-action-buttons-menu.test.tsx +++ b/apps/studio/src/modules/preview-site/components/tests/preview-action-buttons-menu.test.tsx @@ -4,7 +4,7 @@ import userEvent from '@testing-library/user-event'; import { produce } from 'immer'; import { Provider } from 'react-redux'; import { vi } from 'vitest'; -import { Snapshot } from 'common/types/snapshot'; +import { Snapshot } from '@studio/common/types/snapshot'; import { PreviewActionButtonsMenu } from 'src/modules/preview-site/components/preview-action-buttons-menu'; import { store, RootState } from 'src/stores'; import { testActions, testReducer } from 'src/stores/tests/utils/test-reducer'; diff --git a/src/modules/preview-site/components/tests/preview-site-row.test.tsx b/apps/studio/src/modules/preview-site/components/tests/preview-site-row.test.tsx similarity index 100% rename from src/modules/preview-site/components/tests/preview-site-row.test.tsx rename to apps/studio/src/modules/preview-site/components/tests/preview-site-row.test.tsx diff --git a/src/modules/preview-site/components/tests/rename-preview-modal.test.tsx b/apps/studio/src/modules/preview-site/components/tests/rename-preview-modal.test.tsx similarity index 100% rename from src/modules/preview-site/components/tests/rename-preview-modal.test.tsx rename to apps/studio/src/modules/preview-site/components/tests/rename-preview-modal.test.tsx diff --git a/src/modules/preview-site/hooks/use-update-button-tooltip.ts b/apps/studio/src/modules/preview-site/hooks/use-update-button-tooltip.ts similarity index 94% rename from src/modules/preview-site/hooks/use-update-button-tooltip.ts rename to apps/studio/src/modules/preview-site/hooks/use-update-button-tooltip.ts index c6d7c5ab1d..ffe711003d 100644 --- a/src/modules/preview-site/hooks/use-update-button-tooltip.ts +++ b/apps/studio/src/modules/preview-site/hooks/use-update-button-tooltip.ts @@ -2,7 +2,7 @@ import { TooltipProps } from '@wordpress/components/build-types/tooltip/types'; import { sprintf } from '@wordpress/i18n'; import { useI18n } from '@wordpress/react-i18n'; import { useMemo } from 'react'; -import { DEMO_SITE_SIZE_LIMIT_GB } from 'common/constants'; +import { DEMO_SITE_SIZE_LIMIT_GB } from '@studio/common/constants'; import offlineIcon from 'src/components/offline-icon'; export function useUpdateButtonTooltip( { diff --git a/src/modules/preview-site/lib/ipc-handlers.ts b/apps/studio/src/modules/preview-site/lib/ipc-handlers.ts similarity index 100% rename from src/modules/preview-site/lib/ipc-handlers.ts rename to apps/studio/src/modules/preview-site/lib/ipc-handlers.ts diff --git a/src/modules/preview-site/lib/tests/version-comparison.test.ts b/apps/studio/src/modules/preview-site/lib/tests/version-comparison.test.ts similarity index 93% rename from src/modules/preview-site/lib/tests/version-comparison.test.ts rename to apps/studio/src/modules/preview-site/lib/tests/version-comparison.test.ts index d2fbc417f8..d0615e13a7 100644 --- a/src/modules/preview-site/lib/tests/version-comparison.test.ts +++ b/apps/studio/src/modules/preview-site/lib/tests/version-comparison.test.ts @@ -1,4 +1,4 @@ -import { RecommendedPHPVersion as DEFAULT_PHP_VERSION } from 'common/types/php-versions'; +import { RecommendedPHPVersion as DEFAULT_PHP_VERSION } from '@studio/common/types/php-versions'; import { hasVersionMismatch } from 'src/modules/preview-site/lib/version-comparison'; describe( 'hasVersionMismatch', () => { diff --git a/src/modules/preview-site/lib/version-comparison.ts b/apps/studio/src/modules/preview-site/lib/version-comparison.ts similarity index 89% rename from src/modules/preview-site/lib/version-comparison.ts rename to apps/studio/src/modules/preview-site/lib/version-comparison.ts index 0df153d471..91dc1ed33f 100644 --- a/src/modules/preview-site/lib/version-comparison.ts +++ b/apps/studio/src/modules/preview-site/lib/version-comparison.ts @@ -1,5 +1,5 @@ import semver from 'semver'; -import { RecommendedPHPVersion as DEFAULT_PHP_VERSION } from 'common/types/php-versions'; +import { RecommendedPHPVersion as DEFAULT_PHP_VERSION } from '@studio/common/types/php-versions'; /** * Compares the WordPress and PHP versions of the current site with the versions supported by Jurassic Ninja preview sites. diff --git a/src/modules/site-settings/edit-site-details.tsx b/apps/studio/src/modules/site-settings/edit-site-details.tsx similarity index 98% rename from src/modules/site-settings/edit-site-details.tsx rename to apps/studio/src/modules/site-settings/edit-site-details.tsx index b0377d36da..ec195e4caa 100644 --- a/src/modules/site-settings/edit-site-details.tsx +++ b/apps/studio/src/modules/site-settings/edit-site-details.tsx @@ -3,10 +3,10 @@ import { createInterpolateElement } from '@wordpress/element'; import { sprintf } from '@wordpress/i18n'; import { useI18n } from '@wordpress/react-i18n'; import { FormEvent, useCallback, useEffect, useState } from 'react'; -import { DEFAULT_PHP_VERSION } from 'common/constants'; -import { generateCustomDomainFromSiteName, getDomainNameValidationError } from 'common/lib/domains'; -import { siteNeedsRestart } from 'common/lib/site-needs-restart'; -import { SupportedPHPVersions } from 'common/types/php-versions'; +import { DEFAULT_PHP_VERSION } from '@studio/common/constants'; +import { generateCustomDomainFromSiteName, getDomainNameValidationError } from '@studio/common/lib/domains'; +import { siteNeedsRestart } from '@studio/common/lib/site-needs-restart'; +import { SupportedPHPVersions } from '@studio/common/types/php-versions'; import Button from 'src/components/button'; import { ErrorInformation } from 'src/components/error-information'; import { LearnMoreLink, LearnHowLink } from 'src/components/learn-more'; diff --git a/src/modules/site-settings/tests/edit-site-details.test.tsx b/apps/studio/src/modules/site-settings/tests/edit-site-details.test.tsx similarity index 100% rename from src/modules/site-settings/tests/edit-site-details.test.tsx rename to apps/studio/src/modules/site-settings/tests/edit-site-details.test.tsx diff --git a/src/modules/sync/components/connect-button.tsx b/apps/studio/src/modules/sync/components/connect-button.tsx similarity index 100% rename from src/modules/sync/components/connect-button.tsx rename to apps/studio/src/modules/sync/components/connect-button.tsx diff --git a/src/modules/sync/components/create-button.tsx b/apps/studio/src/modules/sync/components/create-button.tsx similarity index 100% rename from src/modules/sync/components/create-button.tsx rename to apps/studio/src/modules/sync/components/create-button.tsx diff --git a/src/modules/sync/components/environment-badge.tsx b/apps/studio/src/modules/sync/components/environment-badge.tsx similarity index 100% rename from src/modules/sync/components/environment-badge.tsx rename to apps/studio/src/modules/sync/components/environment-badge.tsx diff --git a/src/modules/sync/components/no-wpcom-sites-content.tsx b/apps/studio/src/modules/sync/components/no-wpcom-sites-content.tsx similarity index 100% rename from src/modules/sync/components/no-wpcom-sites-content.tsx rename to apps/studio/src/modules/sync/components/no-wpcom-sites-content.tsx diff --git a/src/modules/sync/components/no-wpcom-sites-modal.tsx b/apps/studio/src/modules/sync/components/no-wpcom-sites-modal.tsx similarity index 100% rename from src/modules/sync/components/no-wpcom-sites-modal.tsx rename to apps/studio/src/modules/sync/components/no-wpcom-sites-modal.tsx diff --git a/src/modules/sync/components/site-name-box.tsx b/apps/studio/src/modules/sync/components/site-name-box.tsx similarity index 100% rename from src/modules/sync/components/site-name-box.tsx rename to apps/studio/src/modules/sync/components/site-name-box.tsx diff --git a/src/modules/sync/components/sync-connected-sites.tsx b/apps/studio/src/modules/sync/components/sync-connected-sites.tsx similarity index 100% rename from src/modules/sync/components/sync-connected-sites.tsx rename to apps/studio/src/modules/sync/components/sync-connected-sites.tsx diff --git a/src/modules/sync/components/sync-dialog.tsx b/apps/studio/src/modules/sync/components/sync-dialog.tsx similarity index 100% rename from src/modules/sync/components/sync-dialog.tsx rename to apps/studio/src/modules/sync/components/sync-dialog.tsx diff --git a/src/modules/sync/components/sync-sites-modal-selector.tsx b/apps/studio/src/modules/sync/components/sync-sites-modal-selector.tsx similarity index 100% rename from src/modules/sync/components/sync-sites-modal-selector.tsx rename to apps/studio/src/modules/sync/components/sync-sites-modal-selector.tsx diff --git a/src/modules/sync/components/sync-tab-image.tsx b/apps/studio/src/modules/sync/components/sync-tab-image.tsx similarity index 100% rename from src/modules/sync/components/sync-tab-image.tsx rename to apps/studio/src/modules/sync/components/sync-tab-image.tsx diff --git a/src/modules/sync/components/tree-view-loading-skeleton.tsx b/apps/studio/src/modules/sync/components/tree-view-loading-skeleton.tsx similarity index 100% rename from src/modules/sync/components/tree-view-loading-skeleton.tsx rename to apps/studio/src/modules/sync/components/tree-view-loading-skeleton.tsx diff --git a/src/modules/sync/constants.ts b/apps/studio/src/modules/sync/constants.ts similarity index 100% rename from src/modules/sync/constants.ts rename to apps/studio/src/modules/sync/constants.ts diff --git a/src/modules/sync/hooks/use-selected-items-push-size.ts b/apps/studio/src/modules/sync/hooks/use-selected-items-push-size.ts similarity index 100% rename from src/modules/sync/hooks/use-selected-items-push-size.ts rename to apps/studio/src/modules/sync/hooks/use-selected-items-push-size.ts diff --git a/src/modules/sync/hooks/use-sync-dialog-texts.tsx b/apps/studio/src/modules/sync/hooks/use-sync-dialog-texts.tsx similarity index 100% rename from src/modules/sync/hooks/use-sync-dialog-texts.tsx rename to apps/studio/src/modules/sync/hooks/use-sync-dialog-texts.tsx diff --git a/src/modules/sync/hooks/use-top-level-sync-tree.tsx b/apps/studio/src/modules/sync/hooks/use-top-level-sync-tree.tsx similarity index 100% rename from src/modules/sync/hooks/use-top-level-sync-tree.tsx rename to apps/studio/src/modules/sync/hooks/use-top-level-sync-tree.tsx diff --git a/src/modules/sync/index.tsx b/apps/studio/src/modules/sync/index.tsx similarity index 100% rename from src/modules/sync/index.tsx rename to apps/studio/src/modules/sync/index.tsx diff --git a/src/modules/sync/lib/convert-tree-to-sync-options.ts b/apps/studio/src/modules/sync/lib/convert-tree-to-sync-options.ts similarity index 100% rename from src/modules/sync/lib/convert-tree-to-sync-options.ts rename to apps/studio/src/modules/sync/lib/convert-tree-to-sync-options.ts diff --git a/src/modules/sync/lib/environment-utils.ts b/apps/studio/src/modules/sync/lib/environment-utils.ts similarity index 100% rename from src/modules/sync/lib/environment-utils.ts rename to apps/studio/src/modules/sync/lib/environment-utils.ts diff --git a/src/modules/sync/lib/ipc-handlers.ts b/apps/studio/src/modules/sync/lib/ipc-handlers.ts similarity index 99% rename from src/modules/sync/lib/ipc-handlers.ts rename to apps/studio/src/modules/sync/lib/ipc-handlers.ts index 0528e5c98e..8e0d8cec2e 100644 --- a/src/modules/sync/lib/ipc-handlers.ts +++ b/apps/studio/src/modules/sync/lib/ipc-handlers.ts @@ -5,7 +5,7 @@ import path from 'node:path'; import * as Sentry from '@sentry/electron/main'; import { Upload } from 'tus-js-client'; import { z } from 'zod'; -import { isErrnoException } from 'common/lib/is-errno-exception'; +import { isErrnoException } from '@studio/common/lib/is-errno-exception'; import { PullStateProgressInfo, PushStateProgressInfo, diff --git a/src/modules/sync/lib/reconcile-connected-sites.tsx b/apps/studio/src/modules/sync/lib/reconcile-connected-sites.tsx similarity index 100% rename from src/modules/sync/lib/reconcile-connected-sites.tsx rename to apps/studio/src/modules/sync/lib/reconcile-connected-sites.tsx diff --git a/src/modules/sync/lib/sync-support.ts b/apps/studio/src/modules/sync/lib/sync-support.ts similarity index 100% rename from src/modules/sync/lib/sync-support.ts rename to apps/studio/src/modules/sync/lib/sync-support.ts diff --git a/src/modules/sync/lib/tree-utils.ts b/apps/studio/src/modules/sync/lib/tree-utils.ts similarity index 100% rename from src/modules/sync/lib/tree-utils.ts rename to apps/studio/src/modules/sync/lib/tree-utils.ts diff --git a/src/modules/sync/tests/convert-tree-to-options-to-sync.tsx b/apps/studio/src/modules/sync/tests/convert-tree-to-options-to-sync.tsx similarity index 100% rename from src/modules/sync/tests/convert-tree-to-options-to-sync.tsx rename to apps/studio/src/modules/sync/tests/convert-tree-to-options-to-sync.tsx diff --git a/src/modules/sync/tests/environment-badge.test.tsx b/apps/studio/src/modules/sync/tests/environment-badge.test.tsx similarity index 100% rename from src/modules/sync/tests/environment-badge.test.tsx rename to apps/studio/src/modules/sync/tests/environment-badge.test.tsx diff --git a/src/modules/sync/tests/index.test.tsx b/apps/studio/src/modules/sync/tests/index.test.tsx similarity index 100% rename from src/modules/sync/tests/index.test.tsx rename to apps/studio/src/modules/sync/tests/index.test.tsx diff --git a/src/modules/sync/tests/use-selected-items-push-size.test.ts b/apps/studio/src/modules/sync/tests/use-selected-items-push-size.test.ts similarity index 100% rename from src/modules/sync/tests/use-selected-items-push-size.test.ts rename to apps/studio/src/modules/sync/tests/use-selected-items-push-size.test.ts diff --git a/src/modules/sync/types.ts b/apps/studio/src/modules/sync/types.ts similarity index 100% rename from src/modules/sync/types.ts rename to apps/studio/src/modules/sync/types.ts diff --git a/src/modules/user-settings/components/account-tab.tsx b/apps/studio/src/modules/user-settings/components/account-tab.tsx similarity index 100% rename from src/modules/user-settings/components/account-tab.tsx rename to apps/studio/src/modules/user-settings/components/account-tab.tsx diff --git a/src/modules/user-settings/components/editor-picker.tsx b/apps/studio/src/modules/user-settings/components/editor-picker.tsx similarity index 100% rename from src/modules/user-settings/components/editor-picker.tsx rename to apps/studio/src/modules/user-settings/components/editor-picker.tsx diff --git a/src/modules/user-settings/components/language-picker.tsx b/apps/studio/src/modules/user-settings/components/language-picker.tsx similarity index 90% rename from src/modules/user-settings/components/language-picker.tsx rename to apps/studio/src/modules/user-settings/components/language-picker.tsx index 5cbfa56dbe..d79efd7ed4 100644 --- a/src/modules/user-settings/components/language-picker.tsx +++ b/apps/studio/src/modules/user-settings/components/language-picker.tsx @@ -1,6 +1,6 @@ import { SelectControl } from '@wordpress/components'; import { useI18n } from '@wordpress/react-i18n'; -import { SupportedLocale, supportedLocaleNames } from 'common/lib/locale'; +import { SupportedLocale, supportedLocaleNames } from '@studio/common/lib/locale'; import { SettingsFormField } from './settings-form-field'; interface LanguagePickerProps { diff --git a/src/modules/user-settings/components/non-authenticated-account-tab.tsx b/apps/studio/src/modules/user-settings/components/non-authenticated-account-tab.tsx similarity index 100% rename from src/modules/user-settings/components/non-authenticated-account-tab.tsx rename to apps/studio/src/modules/user-settings/components/non-authenticated-account-tab.tsx diff --git a/src/modules/user-settings/components/preferences-tab.tsx b/apps/studio/src/modules/user-settings/components/preferences-tab.tsx similarity index 98% rename from src/modules/user-settings/components/preferences-tab.tsx rename to apps/studio/src/modules/user-settings/components/preferences-tab.tsx index 85b568d83d..eaf9b4ef84 100644 --- a/src/modules/user-settings/components/preferences-tab.tsx +++ b/apps/studio/src/modules/user-settings/components/preferences-tab.tsx @@ -1,6 +1,6 @@ import { useI18n } from '@wordpress/react-i18n'; import { useState } from 'react'; -import { SupportedLocale } from 'common/lib/locale'; +import { SupportedLocale } from '@studio/common/lib/locale'; import Button from 'src/components/button'; import { EditorPicker } from 'src/modules/user-settings/components/editor-picker'; import { LanguagePicker } from 'src/modules/user-settings/components/language-picker'; diff --git a/src/modules/user-settings/components/prompt-info.tsx b/apps/studio/src/modules/user-settings/components/prompt-info.tsx similarity index 100% rename from src/modules/user-settings/components/prompt-info.tsx rename to apps/studio/src/modules/user-settings/components/prompt-info.tsx diff --git a/src/modules/user-settings/components/settings-form-field.tsx b/apps/studio/src/modules/user-settings/components/settings-form-field.tsx similarity index 100% rename from src/modules/user-settings/components/settings-form-field.tsx rename to apps/studio/src/modules/user-settings/components/settings-form-field.tsx diff --git a/src/modules/user-settings/components/snapshot-info.tsx b/apps/studio/src/modules/user-settings/components/snapshot-info.tsx similarity index 100% rename from src/modules/user-settings/components/snapshot-info.tsx rename to apps/studio/src/modules/user-settings/components/snapshot-info.tsx diff --git a/src/modules/user-settings/components/studio-cli-toggle.tsx b/apps/studio/src/modules/user-settings/components/studio-cli-toggle.tsx similarity index 100% rename from src/modules/user-settings/components/studio-cli-toggle.tsx rename to apps/studio/src/modules/user-settings/components/studio-cli-toggle.tsx diff --git a/src/modules/user-settings/components/terminal-picker.tsx b/apps/studio/src/modules/user-settings/components/terminal-picker.tsx similarity index 100% rename from src/modules/user-settings/components/terminal-picker.tsx rename to apps/studio/src/modules/user-settings/components/terminal-picker.tsx diff --git a/src/modules/user-settings/components/tests/terminal-picker.test.tsx b/apps/studio/src/modules/user-settings/components/tests/terminal-picker.test.tsx similarity index 100% rename from src/modules/user-settings/components/tests/terminal-picker.test.tsx rename to apps/studio/src/modules/user-settings/components/tests/terminal-picker.test.tsx diff --git a/src/modules/user-settings/components/tests/user-settings.test.tsx b/apps/studio/src/modules/user-settings/components/tests/user-settings.test.tsx similarity index 100% rename from src/modules/user-settings/components/tests/user-settings.test.tsx rename to apps/studio/src/modules/user-settings/components/tests/user-settings.test.tsx diff --git a/src/modules/user-settings/components/usage-tab.tsx b/apps/studio/src/modules/user-settings/components/usage-tab.tsx similarity index 100% rename from src/modules/user-settings/components/usage-tab.tsx rename to apps/studio/src/modules/user-settings/components/usage-tab.tsx diff --git a/src/modules/user-settings/components/user-settings.tsx b/apps/studio/src/modules/user-settings/components/user-settings.tsx similarity index 100% rename from src/modules/user-settings/components/user-settings.tsx rename to apps/studio/src/modules/user-settings/components/user-settings.tsx diff --git a/src/modules/user-settings/index.ts b/apps/studio/src/modules/user-settings/index.ts similarity index 100% rename from src/modules/user-settings/index.ts rename to apps/studio/src/modules/user-settings/index.ts diff --git a/src/modules/user-settings/lib/editor.ts b/apps/studio/src/modules/user-settings/lib/editor.ts similarity index 100% rename from src/modules/user-settings/lib/editor.ts rename to apps/studio/src/modules/user-settings/lib/editor.ts diff --git a/src/modules/user-settings/lib/ipc-handlers.ts b/apps/studio/src/modules/user-settings/lib/ipc-handlers.ts similarity index 100% rename from src/modules/user-settings/lib/ipc-handlers.ts rename to apps/studio/src/modules/user-settings/lib/ipc-handlers.ts diff --git a/src/modules/user-settings/lib/terminal.ts b/apps/studio/src/modules/user-settings/lib/terminal.ts similarity index 100% rename from src/modules/user-settings/lib/terminal.ts rename to apps/studio/src/modules/user-settings/lib/terminal.ts diff --git a/src/modules/user-settings/lib/win-editor-path.ts b/apps/studio/src/modules/user-settings/lib/win-editor-path.ts similarity index 95% rename from src/modules/user-settings/lib/win-editor-path.ts rename to apps/studio/src/modules/user-settings/lib/win-editor-path.ts index e8c54275f3..e0f52fd524 100644 --- a/src/modules/user-settings/lib/win-editor-path.ts +++ b/apps/studio/src/modules/user-settings/lib/win-editor-path.ts @@ -1,6 +1,6 @@ import fs from 'fs'; import nodePath from 'path'; -import { escapeRegex } from 'common/lib/escape-regex'; +import { escapeRegex } from '@studio/common/lib/escape-regex'; import { SupportedEditor, supportedEditorConfig } from 'src/modules/user-settings/lib/editor'; /** diff --git a/src/modules/user-settings/user-settings-types.ts b/apps/studio/src/modules/user-settings/user-settings-types.ts similarity index 100% rename from src/modules/user-settings/user-settings-types.ts rename to apps/studio/src/modules/user-settings/user-settings-types.ts diff --git a/src/modules/whats-new/assets/blueprints-illustration.svg b/apps/studio/src/modules/whats-new/assets/blueprints-illustration.svg similarity index 100% rename from src/modules/whats-new/assets/blueprints-illustration.svg rename to apps/studio/src/modules/whats-new/assets/blueprints-illustration.svg diff --git a/src/modules/whats-new/assets/cli-illustration.svg b/apps/studio/src/modules/whats-new/assets/cli-illustration.svg similarity index 100% rename from src/modules/whats-new/assets/cli-illustration.svg rename to apps/studio/src/modules/whats-new/assets/cli-illustration.svg diff --git a/src/modules/whats-new/assets/pressable-sync-illustration.svg b/apps/studio/src/modules/whats-new/assets/pressable-sync-illustration.svg similarity index 100% rename from src/modules/whats-new/assets/pressable-sync-illustration.svg rename to apps/studio/src/modules/whats-new/assets/pressable-sync-illustration.svg diff --git a/src/modules/whats-new/assets/selective-sync-illustration.svg b/apps/studio/src/modules/whats-new/assets/selective-sync-illustration.svg similarity index 100% rename from src/modules/whats-new/assets/selective-sync-illustration.svg rename to apps/studio/src/modules/whats-new/assets/selective-sync-illustration.svg diff --git a/src/modules/whats-new/assets/studio-illustration.svg b/apps/studio/src/modules/whats-new/assets/studio-illustration.svg similarity index 100% rename from src/modules/whats-new/assets/studio-illustration.svg rename to apps/studio/src/modules/whats-new/assets/studio-illustration.svg diff --git a/src/modules/whats-new/components/whats-new-modal.tsx b/apps/studio/src/modules/whats-new/components/whats-new-modal.tsx similarity index 100% rename from src/modules/whats-new/components/whats-new-modal.tsx rename to apps/studio/src/modules/whats-new/components/whats-new-modal.tsx diff --git a/src/modules/whats-new/hooks/use-last-seen-version.tsx b/apps/studio/src/modules/whats-new/hooks/use-last-seen-version.tsx similarity index 100% rename from src/modules/whats-new/hooks/use-last-seen-version.tsx rename to apps/studio/src/modules/whats-new/hooks/use-last-seen-version.tsx diff --git a/src/modules/whats-new/hooks/use-whats-new.tsx b/apps/studio/src/modules/whats-new/hooks/use-whats-new.tsx similarity index 100% rename from src/modules/whats-new/hooks/use-whats-new.tsx rename to apps/studio/src/modules/whats-new/hooks/use-whats-new.tsx diff --git a/src/modules/whats-new/index.ts b/apps/studio/src/modules/whats-new/index.ts similarity index 100% rename from src/modules/whats-new/index.ts rename to apps/studio/src/modules/whats-new/index.ts diff --git a/src/preload.ts b/apps/studio/src/preload.ts similarity index 100% rename from src/preload.ts rename to apps/studio/src/preload.ts diff --git a/src/renderer.ts b/apps/studio/src/renderer.ts similarity index 100% rename from src/renderer.ts rename to apps/studio/src/renderer.ts diff --git a/src/screenshot-window.ts b/apps/studio/src/screenshot-window.ts similarity index 100% rename from src/screenshot-window.ts rename to apps/studio/src/screenshot-window.ts diff --git a/src/setup-wp-server-files.ts b/apps/studio/src/setup-wp-server-files.ts similarity index 98% rename from src/setup-wp-server-files.ts rename to apps/studio/src/setup-wp-server-files.ts index a307f707dd..6e64b66a44 100644 --- a/src/setup-wp-server-files.ts +++ b/apps/studio/src/setup-wp-server-files.ts @@ -1,7 +1,7 @@ import path from 'path'; import fs from 'fs-extra'; import semver from 'semver'; -import { recursiveCopyDirectory } from 'common/lib/fs-utils'; +import { recursiveCopyDirectory } from '@studio/common/lib/fs-utils'; import { updateLatestWPCliVersion } from 'src/lib/download-utils'; import { getWordPressVersionPath, getSqlitePath, getWpCliPath } from 'src/lib/server-files-paths'; import { diff --git a/src/site-server.ts b/apps/studio/src/site-server.ts similarity index 99% rename from src/site-server.ts rename to apps/studio/src/site-server.ts index d05865a387..7cb2881f14 100644 --- a/src/site-server.ts +++ b/apps/studio/src/site-server.ts @@ -4,7 +4,7 @@ import * as Sentry from '@sentry/electron/main'; import fsExtra from 'fs-extra'; import { parse } from 'shell-quote'; import { z } from 'zod'; -import { SQLITE_FILENAME } from 'common/constants'; +import { SQLITE_FILENAME } from '@studio/common/constants'; import { WP_CLI_DEFAULT_RESPONSE_TIMEOUT, WP_CLI_IMPORT_EXPORT_RESPONSE_TIMEOUT, diff --git a/src/storage/paths.ts b/apps/studio/src/storage/paths.ts similarity index 98% rename from src/storage/paths.ts rename to apps/studio/src/storage/paths.ts index b68a9d5cfa..dfc3a7839a 100644 --- a/src/storage/paths.ts +++ b/apps/studio/src/storage/paths.ts @@ -1,5 +1,5 @@ import path from 'path'; -import { LOCKFILE_NAME } from 'common/constants'; +import { LOCKFILE_NAME } from '@studio/common/constants'; function inChildProcess() { return process.env.STUDIO_IN_CHILD_PROCESS === 'true'; diff --git a/src/storage/storage-types.ts b/apps/studio/src/storage/storage-types.ts similarity index 96% rename from src/storage/storage-types.ts rename to apps/studio/src/storage/storage-types.ts index ee37cde824..199c7b7719 100644 --- a/src/storage/storage-types.ts +++ b/apps/studio/src/storage/storage-types.ts @@ -1,4 +1,4 @@ -import { Snapshot } from 'common/types/snapshot'; +import { Snapshot } from '@studio/common/types/snapshot'; import { StoredToken } from 'src/lib/oauth'; import { SupportedEditor } from 'src/modules/user-settings/lib/editor'; import type { SyncSite } from 'src/modules/sync/types'; diff --git a/src/storage/tests/user-data.test.ts b/apps/studio/src/storage/tests/user-data.test.ts similarity index 100% rename from src/storage/tests/user-data.test.ts rename to apps/studio/src/storage/tests/user-data.test.ts diff --git a/src/storage/user-data.ts b/apps/studio/src/storage/user-data.ts similarity index 94% rename from src/storage/user-data.ts rename to apps/studio/src/storage/user-data.ts index f1fd70038f..26378d91e7 100644 --- a/src/storage/user-data.ts +++ b/apps/studio/src/storage/user-data.ts @@ -4,11 +4,11 @@ import nodePath from 'node:path'; import * as Sentry from '@sentry/electron/main'; import { readFile, writeFile } from 'atomically'; import semver from 'semver'; -import { LOCKFILE_STALE_TIME, LOCKFILE_WAIT_TIME } from 'common/constants'; -import { isErrnoException } from 'common/lib/is-errno-exception'; -import { lockFileAsync, unlockFileAsync } from 'common/lib/lockfile'; -import { sortSites } from 'common/lib/sort-sites'; -import { SupportedPHPVersion, SupportedPHPVersions } from 'common/types/php-versions'; +import { LOCKFILE_STALE_TIME, LOCKFILE_WAIT_TIME } from '@studio/common/constants'; +import { isErrnoException } from '@studio/common/lib/is-errno-exception'; +import { lockFileAsync, unlockFileAsync } from '@studio/common/lib/lockfile'; +import { sortSites } from '@studio/common/lib/sort-sites'; +import { SupportedPHPVersion, SupportedPHPVersions } from '@studio/common/types/php-versions'; import { sanitizeUnstructuredData, sanitizeUserpath } from 'src/lib/sanitize-for-logging'; import { getUserDataFilePath, getUserDataLockFilePath } from 'src/storage/paths'; import type { PersistedUserData, UserData, WindowBounds } from 'src/storage/storage-types'; diff --git a/src/stores/app-version-api.ts b/apps/studio/src/stores/app-version-api.ts similarity index 100% rename from src/stores/app-version-api.ts rename to apps/studio/src/stores/app-version-api.ts diff --git a/src/stores/beta-features-slice.ts b/apps/studio/src/stores/beta-features-slice.ts similarity index 100% rename from src/stores/beta-features-slice.ts rename to apps/studio/src/stores/beta-features-slice.ts diff --git a/src/stores/certificate-trust-api.ts b/apps/studio/src/stores/certificate-trust-api.ts similarity index 100% rename from src/stores/certificate-trust-api.ts rename to apps/studio/src/stores/certificate-trust-api.ts diff --git a/src/stores/chat-slice.ts b/apps/studio/src/stores/chat-slice.ts similarity index 99% rename from src/stores/chat-slice.ts rename to apps/studio/src/stores/chat-slice.ts index aa64318766..c0effb1eb3 100644 --- a/src/stores/chat-slice.ts +++ b/apps/studio/src/stores/chat-slice.ts @@ -2,7 +2,7 @@ import { createSlice, createAsyncThunk, PayloadAction, isAnyOf } from '@reduxjs/ import * as Sentry from '@sentry/electron/renderer'; import { WPCOM } from 'wpcom/types'; import { z } from 'zod'; -import { DEFAULT_PHP_VERSION } from 'common/constants'; +import { DEFAULT_PHP_VERSION } from '@studio/common/constants'; import { LOCAL_STORAGE_CHAT_API_IDS_KEY, LOCAL_STORAGE_CHAT_MESSAGES_KEY } from 'src/constants'; import { getIpcApi } from 'src/lib/get-ipc-api'; import { AppDispatch, RootState } from 'src/stores'; diff --git a/src/stores/format-rtk-error.tsx b/apps/studio/src/stores/format-rtk-error.tsx similarity index 100% rename from src/stores/format-rtk-error.tsx rename to apps/studio/src/stores/format-rtk-error.tsx diff --git a/src/stores/i18n-slice.ts b/apps/studio/src/stores/i18n-slice.ts similarity index 98% rename from src/stores/i18n-slice.ts rename to apps/studio/src/stores/i18n-slice.ts index d7d1d37fa9..f01c0d1756 100644 --- a/src/stores/i18n-slice.ts +++ b/apps/studio/src/stores/i18n-slice.ts @@ -5,7 +5,7 @@ import { getLocaleData, DEFAULT_LOCALE, isSupportedLocale, -} from 'common/lib/locale'; +} from '@studio/common/lib/locale'; import { getIpcApi } from 'src/lib/get-ipc-api'; interface I18nState { diff --git a/src/stores/index.ts b/apps/studio/src/stores/index.ts similarity index 98% rename from src/stores/index.ts rename to apps/studio/src/stores/index.ts index ff06025a95..ba0eced546 100644 --- a/src/stores/index.ts +++ b/apps/studio/src/stores/index.ts @@ -27,7 +27,7 @@ import { wpcomSitesApi } from 'src/stores/sync/wpcom-sites'; import uiReducer from 'src/stores/ui-slice'; import { wpcomApi, wpcomPublicApi } from 'src/stores/wpcom-api'; import { wordpressVersionsApi } from './wordpress-versions-api'; -import type { SupportedLocale } from 'common/lib/locale'; +import type { SupportedLocale } from '@studio/common/lib/locale'; export type RootState = { appVersionApi: ReturnType< typeof appVersionApi.reducer >; diff --git a/src/stores/installed-apps-api.ts b/apps/studio/src/stores/installed-apps-api.ts similarity index 100% rename from src/stores/installed-apps-api.ts rename to apps/studio/src/stores/installed-apps-api.ts diff --git a/src/stores/onboarding-slice.ts b/apps/studio/src/stores/onboarding-slice.ts similarity index 100% rename from src/stores/onboarding-slice.ts rename to apps/studio/src/stores/onboarding-slice.ts diff --git a/src/stores/provider-constants-slice.ts b/apps/studio/src/stores/provider-constants-slice.ts similarity index 92% rename from src/stores/provider-constants-slice.ts rename to apps/studio/src/stores/provider-constants-slice.ts index 99b5ec172d..b016936d91 100644 --- a/src/stores/provider-constants-slice.ts +++ b/apps/studio/src/stores/provider-constants-slice.ts @@ -3,8 +3,8 @@ import { DEFAULT_PHP_VERSION, DEFAULT_WORDPRESS_VERSION, MINIMUM_WORDPRESS_VERSION, -} from 'common/constants'; -import { SupportedPHPVersionsList } from 'common/types/php-versions'; +} from '@studio/common/constants'; +import { SupportedPHPVersionsList } from '@studio/common/types/php-versions'; import { RootState } from 'src/stores'; interface ProviderConstantsState { diff --git a/src/stores/snapshot-slice.ts b/apps/studio/src/stores/snapshot-slice.ts similarity index 99% rename from src/stores/snapshot-slice.ts rename to apps/studio/src/stores/snapshot-slice.ts index 5cfc9f4720..ecd635181d 100644 --- a/src/stores/snapshot-slice.ts +++ b/apps/studio/src/stores/snapshot-slice.ts @@ -8,8 +8,8 @@ import { } from '@reduxjs/toolkit'; import { __, sprintf } from '@wordpress/i18n'; import fastDeepEqual from 'fast-deep-equal'; -import { PreviewCommandLoggerAction } from 'common/logger-actions'; -import { Snapshot } from 'common/types/snapshot'; +import { PreviewCommandLoggerAction } from '@studio/common/logger-actions'; +import { Snapshot } from '@studio/common/types/snapshot'; import { LIMIT_OF_ZIP_SITES_PER_USER } from 'src/constants'; import { getIpcApi } from 'src/lib/get-ipc-api'; import { RootState, store } from 'src/stores/index'; diff --git a/src/stores/sync/connected-sites.ts b/apps/studio/src/stores/sync/connected-sites.ts similarity index 100% rename from src/stores/sync/connected-sites.ts rename to apps/studio/src/stores/sync/connected-sites.ts diff --git a/src/stores/sync/index.ts b/apps/studio/src/stores/sync/index.ts similarity index 100% rename from src/stores/sync/index.ts rename to apps/studio/src/stores/sync/index.ts diff --git a/src/stores/sync/sync-api.ts b/apps/studio/src/stores/sync/sync-api.ts similarity index 100% rename from src/stores/sync/sync-api.ts rename to apps/studio/src/stores/sync/sync-api.ts diff --git a/src/stores/sync/sync-hooks.ts b/apps/studio/src/stores/sync/sync-hooks.ts similarity index 100% rename from src/stores/sync/sync-hooks.ts rename to apps/studio/src/stores/sync/sync-hooks.ts diff --git a/src/stores/sync/sync-slice.ts b/apps/studio/src/stores/sync/sync-slice.ts similarity index 100% rename from src/stores/sync/sync-slice.ts rename to apps/studio/src/stores/sync/sync-slice.ts diff --git a/src/stores/sync/sync-types.ts b/apps/studio/src/stores/sync/sync-types.ts similarity index 100% rename from src/stores/sync/sync-types.ts rename to apps/studio/src/stores/sync/sync-types.ts diff --git a/src/stores/sync/wpcom-sites.ts b/apps/studio/src/stores/sync/wpcom-sites.ts similarity index 100% rename from src/stores/sync/wpcom-sites.ts rename to apps/studio/src/stores/sync/wpcom-sites.ts diff --git a/src/stores/tests/app-version-api.test.ts b/apps/studio/src/stores/tests/app-version-api.test.ts similarity index 100% rename from src/stores/tests/app-version-api.test.ts rename to apps/studio/src/stores/tests/app-version-api.test.ts diff --git a/src/stores/tests/chat-slice.test.ts b/apps/studio/src/stores/tests/chat-slice.test.ts similarity index 100% rename from src/stores/tests/chat-slice.test.ts rename to apps/studio/src/stores/tests/chat-slice.test.ts diff --git a/src/stores/tests/installed-apps-api.test.ts b/apps/studio/src/stores/tests/installed-apps-api.test.ts similarity index 100% rename from src/stores/tests/installed-apps-api.test.ts rename to apps/studio/src/stores/tests/installed-apps-api.test.ts diff --git a/src/stores/tests/onboarding-slice.test.ts b/apps/studio/src/stores/tests/onboarding-slice.test.ts similarity index 100% rename from src/stores/tests/onboarding-slice.test.ts rename to apps/studio/src/stores/tests/onboarding-slice.test.ts diff --git a/src/stores/tests/snapshot-slice.test.ts b/apps/studio/src/stores/tests/snapshot-slice.test.ts similarity index 97% rename from src/stores/tests/snapshot-slice.test.ts rename to apps/studio/src/stores/tests/snapshot-slice.test.ts index 494c34b69a..05be467f50 100644 --- a/src/stores/tests/snapshot-slice.test.ts +++ b/apps/studio/src/stores/tests/snapshot-slice.test.ts @@ -2,8 +2,8 @@ import crypto from 'crypto'; import { UnknownAction } from '@reduxjs/toolkit'; import { produce } from 'immer'; import { vi } from 'vitest'; -import { PreviewCommandLoggerAction } from 'common/logger-actions'; -import { Snapshot } from 'common/types/snapshot'; +import { PreviewCommandLoggerAction } from '@studio/common/logger-actions'; +import { Snapshot } from '@studio/common/types/snapshot'; import { getIpcApi } from 'src/lib/get-ipc-api'; import { RootState, store } from 'src/stores'; import { diff --git a/src/stores/tests/utils/test-reducer.ts b/apps/studio/src/stores/tests/utils/test-reducer.ts similarity index 100% rename from src/stores/tests/utils/test-reducer.ts rename to apps/studio/src/stores/tests/utils/test-reducer.ts diff --git a/src/stores/tests/wordpress-versions-api.test.ts b/apps/studio/src/stores/tests/wordpress-versions-api.test.ts similarity index 100% rename from src/stores/tests/wordpress-versions-api.test.ts rename to apps/studio/src/stores/tests/wordpress-versions-api.test.ts diff --git a/src/stores/ui-slice.ts b/apps/studio/src/stores/ui-slice.ts similarity index 100% rename from src/stores/ui-slice.ts rename to apps/studio/src/stores/ui-slice.ts diff --git a/src/stores/utils/with-offline-check.ts b/apps/studio/src/stores/utils/with-offline-check.ts similarity index 100% rename from src/stores/utils/with-offline-check.ts rename to apps/studio/src/stores/utils/with-offline-check.ts diff --git a/src/stores/wordpress-versions-api.ts b/apps/studio/src/stores/wordpress-versions-api.ts similarity index 97% rename from src/stores/wordpress-versions-api.ts rename to apps/studio/src/stores/wordpress-versions-api.ts index d87027984c..acb88f428a 100644 --- a/src/stores/wordpress-versions-api.ts +++ b/apps/studio/src/stores/wordpress-versions-api.ts @@ -2,7 +2,7 @@ import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; import * as Sentry from '@sentry/electron/renderer'; import { __ } from '@wordpress/i18n'; import { z } from 'zod'; -import { isWordPressDevVersion, isWordPressBetaVersion } from 'common/lib/wordpress-version-utils'; +import { isWordPressDevVersion, isWordPressBetaVersion } from '@studio/common/lib/wordpress-version-utils'; import { withOfflineCheck } from 'src/stores/utils/with-offline-check'; const wordPressApiResponseSchema = z.object( { diff --git a/src/stores/wpcom-api.ts b/apps/studio/src/stores/wpcom-api.ts similarity index 99% rename from src/stores/wpcom-api.ts rename to apps/studio/src/stores/wpcom-api.ts index 73b271a843..e058ca5bd6 100644 --- a/src/stores/wpcom-api.ts +++ b/apps/studio/src/stores/wpcom-api.ts @@ -2,7 +2,7 @@ import { createApi, TypedUseQuery, TypedUseMutation } from '@reduxjs/toolkit/que import * as Sentry from '@sentry/electron/renderer'; import { WPCOM } from 'wpcom/types'; import { z } from 'zod'; -import { DAY_MS } from 'common/constants'; +import { DAY_MS } from '@studio/common/constants'; import wpcomFactory from 'src/lib/wpcom-factory'; import wpcomXhrRequest from 'src/lib/wpcom-xhr-request-factory'; import { withOfflineCheck, withOfflineCheckMutation } from 'src/stores/utils/with-offline-check'; diff --git a/src/tests/execute-wp-cli.test.ts b/apps/studio/src/tests/execute-wp-cli.test.ts similarity index 100% rename from src/tests/execute-wp-cli.test.ts rename to apps/studio/src/tests/execute-wp-cli.test.ts diff --git a/src/tests/index.test.ts b/apps/studio/src/tests/index.test.ts similarity index 99% rename from src/tests/index.test.ts rename to apps/studio/src/tests/index.test.ts index e0cb403f8a..01619d8d12 100644 --- a/src/tests/index.test.ts +++ b/apps/studio/src/tests/index.test.ts @@ -17,7 +17,7 @@ vi.mock( '@sentry/electron/main', () => ( { captureMessage: vi.fn(), setUser: vi.fn(), } ) ); -vi.mock( 'common/lib/bump-stat', () => ( { +vi.mock( '@studio/common/lib/bump-stat', () => ( { bumpStat: vi.fn(), bumpAggregatedUniqueStat: vi.fn( () => Promise.resolve() ), } ) ); diff --git a/src/tests/ipc-handlers.test.ts b/apps/studio/src/tests/ipc-handlers.test.ts similarity index 97% rename from src/tests/ipc-handlers.test.ts rename to apps/studio/src/tests/ipc-handlers.test.ts index 1850da8863..fc2b61b825 100644 --- a/src/tests/ipc-handlers.test.ts +++ b/apps/studio/src/tests/ipc-handlers.test.ts @@ -7,8 +7,8 @@ import { normalize } from 'path'; import * as Sentry from '@sentry/electron/main'; import { readFile } from 'atomically'; import { vi } from 'vitest'; -import { bumpStat } from 'common/lib/bump-stat'; -import { StatsGroup, StatsMetric } from 'common/types/stats'; +import { bumpStat } from '@studio/common/lib/bump-stat'; +import { StatsGroup, StatsMetric } from '@studio/common/types/stats'; import { createSite, isFullscreen, @@ -23,7 +23,7 @@ import { SiteServer } from 'src/site-server'; vi.mock( 'fs' ); vi.mock( 'fs-extra' ); -vi.mock( 'common/lib/fs-utils' ); +vi.mock( '@studio/common/lib/fs-utils' ); vi.mock( '@sentry/electron/main', () => ( { captureException: vi.fn(), captureMessage: vi.fn(), @@ -45,13 +45,13 @@ vi.mock( 'src/lib/wordpress-setup', () => ( { } ) ); vi.mock( 'src/main-window' ); vi.mock( 'src/lib/import-export/import/import-manager' ); -vi.mock( 'common/lib/bump-stat' ); +vi.mock( '@studio/common/lib/bump-stat' ); vi.mock( 'atomically' ); vi.mock( 'src/lib/get-image-data', () => ( { getImageData: vi.fn().mockResolvedValue( 'data:image/png;base64,mock' ), } ) ); -vi.mock( 'common/lib/port-finder', () => ( { +vi.mock( '@studio/common/lib/port-finder', () => ( { portFinder: { getOpenPort: vi.fn().mockResolvedValue( 9999 ), }, diff --git a/src/tests/main-window.test.ts b/apps/studio/src/tests/main-window.test.ts similarity index 100% rename from src/tests/main-window.test.ts rename to apps/studio/src/tests/main-window.test.ts diff --git a/src/tests/show-site-context-menu.test.ts b/apps/studio/src/tests/show-site-context-menu.test.ts similarity index 100% rename from src/tests/show-site-context-menu.test.ts rename to apps/studio/src/tests/show-site-context-menu.test.ts diff --git a/src/tests/site-server.test.ts b/apps/studio/src/tests/site-server.test.ts similarity index 98% rename from src/tests/site-server.test.ts rename to apps/studio/src/tests/site-server.test.ts index c65edb07dc..49695b3f1e 100644 --- a/src/tests/site-server.test.ts +++ b/apps/studio/src/tests/site-server.test.ts @@ -5,7 +5,7 @@ import { vi } from 'vitest'; import { SiteServer } from 'src/site-server'; // Electron's Node.js environment provides `btoa`/`atob`, but Vitest's does not -vi.mock( 'common/lib/passwords' ); +vi.mock( '@studio/common/lib/passwords' ); // `SiteServer::start` uses `getPreferredSiteLanguage` to set the site language vi.mock( 'src/lib/site-language', () => ( { diff --git a/src/tests/utils/platform-test-suite.ts b/apps/studio/src/tests/utils/platform-test-suite.ts similarity index 100% rename from src/tests/utils/platform-test-suite.ts rename to apps/studio/src/tests/utils/platform-test-suite.ts diff --git a/src/tests/utils/style-mock.js b/apps/studio/src/tests/utils/style-mock.js similarity index 100% rename from src/tests/utils/style-mock.js rename to apps/studio/src/tests/utils/style-mock.js diff --git a/src/types.ts b/apps/studio/src/types.ts similarity index 100% rename from src/types.ts rename to apps/studio/src/types.ts diff --git a/src/updates.ts b/apps/studio/src/updates.ts similarity index 100% rename from src/updates.ts rename to apps/studio/src/updates.ts diff --git a/src/utility-types.d.ts b/apps/studio/src/utility-types.d.ts similarity index 100% rename from src/utility-types.d.ts rename to apps/studio/src/utility-types.d.ts diff --git a/tailwind.config.js b/apps/studio/tailwind.config.js similarity index 97% rename from tailwind.config.js rename to apps/studio/tailwind.config.js index 8c116db68b..930453cc59 100644 --- a/tailwind.config.js +++ b/apps/studio/tailwind.config.js @@ -1,6 +1,7 @@ /** @type {import('tailwindcss').Config} */ import palette from '@automattic/color-studio'; import plugin from 'tailwindcss/plugin'; +import path from 'node:path'; import { WINDOWS_TITLEBAR_HEIGHT, MAIN_MIN_WIDTH, APP_CHROME_SPACING } from './src/constants.ts'; const BASE_FONT_SIZE = 16; // 1 rem @@ -138,7 +139,10 @@ a8cToTailwindColors[ `${ PREFIX }-gray-100` ] = '#f0f0f0'; // Gray 100 a8cToTailwindColors[ `${ PREFIX }-gray-5` ] = '#DCDCDE'; // Gray 5 module.exports = { - content: [ './src/**/*.{html,js,jsx,ts,tsx}' ], + content: [ + path.join( __dirname, 'index.html' ), + path.join( __dirname, 'src/**/*.{html,js,jsx,ts,tsx}' ), + ], theme: { extend: { colors: { diff --git a/apps/studio/tsconfig.json b/apps/studio/tsconfig.json new file mode 100644 index 0000000000..94ea38964b --- /dev/null +++ b/apps/studio/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "baseUrl": "../..", + "paths": { + "*": [ "node_modules/*" ], + "cli/*": [ "apps/cli/*" ], + "src/*": [ "apps/studio/src/*" ], + "vendor/*": [ "vendor/*" ], + "@studio/common/*": [ "tools/common/*" ] + } + }, + "include": [ + "src/**/*", + "e2e/**/*" + ], + "exclude": [ "**/__mocks__/**/*", "**/node_modules/**/*", "**/dist/**/*", "**/out/**/*" ], + "references": [ + { "path": "../cli" }, + { "path": "../../tools/common" } + ] +} diff --git a/cli/__mocks__/pm2.ts b/cli/__mocks__/pm2.ts deleted file mode 100644 index 1945d9dbd0..0000000000 --- a/cli/__mocks__/pm2.ts +++ /dev/null @@ -1,39 +0,0 @@ -class API { - connect( callback: ( error: Error | null ) => void ) { - setTimeout( () => { - callback( null ); - }, 0 ); - } - disconnect( callback: ( error: Error | null ) => void ) { - setTimeout( () => { - callback( null ); - }, 0 ); - } - list( callback: ( error: Error | null, processes: any[] ) => void ) { - setTimeout( () => { - callback( null, [] ); - }, 0 ); - } - launchBus( callback: ( error: Error | null, bus: any ) => void ) { - setTimeout( () => { - callback( null, {} ); - }, 0 ); - } - sendDataToProcessId( id: string, data: any, callback: ( error: Error | null ) => void ) { - setTimeout( () => { - callback( null ); - }, 0 ); - } - start( config: any, callback: ( error: Error | null, apps: any[] ) => void ) { - setTimeout( () => { - callback( null, [] ); - }, 0 ); - } - delete( callback: ( error: Error | null ) => void ) { - setTimeout( () => { - callback( null ); - }, 0 ); - } -} - -exports.custom = API; diff --git a/cli/package-lock.json b/cli/package-lock.json deleted file mode 100644 index 1fa8b6645d..0000000000 --- a/cli/package-lock.json +++ /dev/null @@ -1,6060 +0,0 @@ -{ - "name": "studio-cli", - "version": "1.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "studio-cli", - "hasInstallScript": true, - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "^3.0.46", - "@wp-playground/blueprints": "^3.0.46", - "@wp-playground/cli": "^3.0.46", - "@wp-playground/common": "^3.0.46", - "@wp-playground/storage": "^3.0.46", - "http-proxy": "^1.18.1", - "pm2": "^6.0.14", - "pm2-axon": "^4.0.1", - "trash": "^10.0.1" - } - }, - "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/app": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/app/-/app-14.1.0.tgz", - "integrity": "sha512-g3uEsGOQCBl1+W1rgfwoRFUIR6PtvB2T1E4RpygeUU5LrLvlOqcxrt5lfykIeRpUPpupreGJUYl70fqMDXdTpw==", - "license": "MIT", - "dependencies": { - "@octokit/auth-app": "^6.0.0", - "@octokit/auth-unauthenticated": "^5.0.0", - "@octokit/core": "^5.0.0", - "@octokit/oauth-app": "^6.0.0", - "@octokit/plugin-paginate-rest": "^9.0.0", - "@octokit/types": "^12.0.0", - "@octokit/webhooks": "^12.0.4" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/auth-app": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-6.1.4.tgz", - "integrity": "sha512-QkXkSOHZK4dA5oUqY5Dk3S+5pN2s1igPjEASNQV8/vgJgW034fQWR16u7VsNOK/EljA00eyjYF5mWNxWKWhHRQ==", - "license": "MIT", - "dependencies": { - "@octokit/auth-oauth-app": "^7.1.0", - "@octokit/auth-oauth-user": "^4.1.0", - "@octokit/request": "^8.3.1", - "@octokit/request-error": "^5.1.0", - "@octokit/types": "^13.1.0", - "deprecation": "^2.3.1", - "lru-cache": "npm:@wolfy1339/lru-cache@^11.0.2-patch.1", - "universal-github-app-jwt": "^1.1.2", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/auth-app/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/auth-app/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/auth-oauth-app": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-7.1.0.tgz", - "integrity": "sha512-w+SyJN/b0l/HEb4EOPRudo7uUOSW51jcK1jwLa+4r7PA8FPFpoxEnHBHMITqCsc/3Vo2qqFjgQfz/xUUvsSQnA==", - "license": "MIT", - "dependencies": { - "@octokit/auth-oauth-device": "^6.1.0", - "@octokit/auth-oauth-user": "^4.1.0", - "@octokit/request": "^8.3.1", - "@octokit/types": "^13.0.0", - "@types/btoa-lite": "^1.0.0", - "btoa-lite": "^1.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/auth-oauth-device": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-6.1.0.tgz", - "integrity": "sha512-FNQ7cb8kASufd6Ej4gnJ3f1QB5vJitkoV1O0/g6e6lUsQ7+VsSNRHRmFScN2tV4IgKA12frrr/cegUs0t+0/Lw==", - "license": "MIT", - "dependencies": { - "@octokit/oauth-methods": "^4.1.0", - "@octokit/request": "^8.3.1", - "@octokit/types": "^13.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/auth-oauth-user": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-4.1.0.tgz", - "integrity": "sha512-FrEp8mtFuS/BrJyjpur+4GARteUCrPeR/tZJzD8YourzoVhRics7u7we/aDcKv+yywRNwNi/P4fRi631rG/OyQ==", - "license": "MIT", - "dependencies": { - "@octokit/auth-oauth-device": "^6.1.0", - "@octokit/oauth-methods": "^4.1.0", - "@octokit/request": "^8.3.1", - "@octokit/types": "^13.0.0", - "btoa-lite": "^1.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/auth-unauthenticated": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-5.0.1.tgz", - "integrity": "sha512-oxeWzmBFxWd+XolxKTc4zr+h3mt+yofn4r7OfoIkR/Cj/o70eEGmPsFbueyJE2iBAGpjgTnEOKM3pnuEGVmiqg==", - "license": "MIT", - "dependencies": { - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", - "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.1.0", - "@octokit/request": "^8.4.1", - "@octokit/request-error": "^5.1.1", - "@octokit/types": "^13.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/core/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/endpoint": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", - "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/endpoint/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/graphql": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", - "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", - "license": "MIT", - "dependencies": { - "@octokit/request": "^8.4.1", - "@octokit/types": "^13.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/graphql/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/oauth-app": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-6.1.0.tgz", - "integrity": "sha512-nIn/8eUJ/BKUVzxUXd5vpzl1rwaVxMyYbQkNZjHrF7Vk/yu98/YDF/N2KeWO7uZ0g3b5EyiFXFkZI8rJ+DH1/g==", - "license": "MIT", - "dependencies": { - "@octokit/auth-oauth-app": "^7.0.0", - "@octokit/auth-oauth-user": "^4.0.0", - "@octokit/auth-unauthenticated": "^5.0.0", - "@octokit/core": "^5.0.0", - "@octokit/oauth-authorization-url": "^6.0.2", - "@octokit/oauth-methods": "^4.0.0", - "@types/aws-lambda": "^8.10.83", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/oauth-authorization-url": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-6.0.2.tgz", - "integrity": "sha512-CdoJukjXXxqLNK4y/VOiVzQVjibqoj/xHgInekviUJV73y/BSIcwvJ/4aNHPBPKcPWFnd4/lO9uqRV65jXhcLA==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/oauth-methods": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-4.1.0.tgz", - "integrity": "sha512-4tuKnCRecJ6CG6gr0XcEXdZtkTDbfbnD5oaHBmLERTjTMZNi2CbfEHZxPU41xXLDG4DfKf+sonu00zvKI9NSbw==", - "license": "MIT", - "dependencies": { - "@octokit/oauth-authorization-url": "^6.0.2", - "@octokit/request": "^8.3.1", - "@octokit/request-error": "^5.1.0", - "@octokit/types": "^13.0.0", - "btoa-lite": "^1.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/oauth-methods/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/oauth-methods/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-graphql": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-4.0.1.tgz", - "integrity": "sha512-R8ZQNmrIKKpHWC6V2gum4x9LG2qF1RxRjo27gjQcG3j+vf2tLsEfE7I/wRWEPzYMaenr1M+qDAtNcwZve1ce1A==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=5" - } - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz", - "integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^12.6.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz", - "integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^12.6.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-retry": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-6.1.0.tgz", - "integrity": "sha512-WrO3bvq4E1Xh1r2mT9w6SDFg01gFmP81nIG77+p/MqW1JeXXgL++6umim3t6x0Zj5pZm3rXAN+0HEjmmdhIRig==", - "license": "MIT", - "dependencies": { - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^13.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-retry/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-retry/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/plugin-throttling": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.2.0.tgz", - "integrity": "sha512-nOpWtLayKFpgqmgD0y3GqXafMFuKcA4tRPZIfu7BArd2lEZeb1988nhWhwx4aZWmjDmUfdgVf7W+Tt4AmvRmMQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^12.2.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "^5.0.0" - } - }, - "node_modules/@octokit/request": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", - "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^9.0.6", - "@octokit/request-error": "^5.1.1", - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.1.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/request-error/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "license": "MIT" - }, - "node_modules/@octokit/request/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@octokit/types": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^20.0.0" - } - }, - "node_modules/@octokit/webhooks": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-12.3.2.tgz", - "integrity": "sha512-exj1MzVXoP7xnAcAB3jZ97pTvVPkQF9y6GA/dvYC47HV7vLv+24XRS6b/v/XnyikpEuvMhugEXdGtAlU086WkQ==", - "license": "MIT", - "dependencies": { - "@octokit/request-error": "^5.0.0", - "@octokit/webhooks-methods": "^4.1.0", - "@octokit/webhooks-types": "7.6.1", - "aggregate-error": "^3.1.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/webhooks-methods": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-4.1.0.tgz", - "integrity": "sha512-zoQyKw8h9STNPqtm28UGOYFE7O6D4Il8VJwhAtMHFt2C4L0VQT1qGKLeefUOqHNs1mNRYSadVv7x0z8U2yyeWQ==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/webhooks-types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-7.6.1.tgz", - "integrity": "sha512-S8u2cJzklBC0FgTwWVLaM8tMrDuDMVE4xiTK4EYXM9GntyvrdbSoxqDQa+Fh57CCNApyIpyeqPhhFEmHPfrXgw==", - "license": "MIT" - }, - "node_modules/@peculiar/asn1-cms": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.0.tgz", - "integrity": "sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-cms/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@peculiar/asn1-csr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.0.tgz", - "integrity": "sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-csr/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@peculiar/asn1-ecc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.0.tgz", - "integrity": "sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-ecc/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@peculiar/asn1-pfx": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.0.tgz", - "integrity": "sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pfx/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.0.tgz", - "integrity": "sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pkcs8/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.0.tgz", - "integrity": "sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pfx": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pkcs9/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@peculiar/asn1-rsa": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.0.tgz", - "integrity": "sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-rsa/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", - "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", - "license": "MIT", - "dependencies": { - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-schema/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@peculiar/asn1-x509": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.0.tgz", - "integrity": "sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-x509-attr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.0.tgz", - "integrity": "sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-x509-attr/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@peculiar/asn1-x509/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@peculiar/x509": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", - "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-csr": "^2.6.0", - "@peculiar/asn1-ecc": "^2.6.0", - "@peculiar/asn1-pkcs9": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "pvtsutils": "^1.3.6", - "reflect-metadata": "^0.2.2", - "tslib": "^2.8.1", - "tsyringe": "^4.10.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@peculiar/x509/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@php-wasm/cli-util": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/cli-util/-/cli-util-3.0.46.tgz", - "integrity": "sha512-FL9O1/B6x4rfoGI1yVFdEWaIfkKf+0TC91B188VOGAkZ12kASPktUwaS3xLKIFDXI3rysvv2afuoZx7/IoP4hg==", - "license": "GPL-2.0-or-later", - "dependencies": { - "fast-xml-parser": "5.3.0", - "jsonc-parser": "3.3.1" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/fs-journal": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/fs-journal/-/fs-journal-3.0.46.tgz", - "integrity": "sha512-OxIBbPCXB4XRa9Jdqy1hGG80pmAZduKabpQqwtQEuvlTAeBdOjN4b40FxhbctNQ6zRG6xMr5tD9wGoGh0cLLTQ==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/logger": "3.0.46", - "@php-wasm/node": "3.0.46", - "@php-wasm/universal": "3.0.46", - "@php-wasm/util": "3.0.46", - "express": "4.22.0", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3", - "yargs": "17.7.2" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/fs-journal/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/fs-journal/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@php-wasm/logger": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/logger/-/logger-3.0.46.tgz", - "integrity": "sha512-zLn+ebH8xqQUhDnCPPgQyw7MP7hKV49QgkhnFWlthy4b6DrUhLwEXrNLM94gezQAq+h793SIgciNBLoOVzNsgw==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/node-polyfills": "3.0.46" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/node": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/node/-/node-3.0.46.tgz", - "integrity": "sha512-Iw3zyKR7x7sMOFAuDYivdKhoxsV3jYyVcL4LeKFfh9xsWohoQ6iN6h36vD/eNjAEG7b3zt27yX4bfObydGXirw==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/logger": "3.0.46", - "@php-wasm/node-7-4": "3.0.46", - "@php-wasm/node-8-0": "3.0.46", - "@php-wasm/node-8-1": "3.0.46", - "@php-wasm/node-8-2": "3.0.46", - "@php-wasm/node-8-3": "3.0.46", - "@php-wasm/node-8-4": "3.0.46", - "@php-wasm/node-8-5": "3.0.46", - "@php-wasm/node-polyfills": "3.0.46", - "@php-wasm/universal": "3.0.46", - "@php-wasm/util": "3.0.46", - "@wp-playground/common": "3.0.46", - "express": "4.22.0", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3", - "yargs": "17.7.2" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/node-7-4": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/node-7-4/-/node-7-4-3.0.46.tgz", - "integrity": "sha512-ad6mxdkXMoOWtZn+5/4shwb6Xc8VgH996B4BSQlPJePVGaJf+tArO5cdiDGQ0P91scmwB2QzB+HMEEfIYUkdtA==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/node-7-4/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/node-7-4/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@php-wasm/node-8-0": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/node-8-0/-/node-8-0-3.0.46.tgz", - "integrity": "sha512-0jAhJcgz2nlL6cp0I+inrW6hzKHs99gCAfBjIaj8MO97hU5BQdKeWxkFADDs9nrzgFHJ58OVgAMYIom6pdw07w==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/node-8-0/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/node-8-0/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@php-wasm/node-8-1": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/node-8-1/-/node-8-1-3.0.46.tgz", - "integrity": "sha512-CnFi6ePtTpE0+IsuhffenzRAUc1ZN32XmJaV1PPkpPNL//cyUQ+rIqNHDjOhRqI/yrYeNPEsxgqP7jHxfjPybg==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/node-8-1/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/node-8-1/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@php-wasm/node-8-2": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/node-8-2/-/node-8-2-3.0.46.tgz", - "integrity": "sha512-g35LhoLkNWUXa2sIxZE8K56/FjmP3e8ZbJQ9a8RFYGjMwtoJbZS1SuQuIRZOIfuEMf8jr9EUVGHNgeU75o/Vxg==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/node-8-2/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/node-8-2/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@php-wasm/node-8-3": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/node-8-3/-/node-8-3-3.0.46.tgz", - "integrity": "sha512-WOQv4PfbzBmqdO/UBkdFNso57aEhr7TPQ5bYBVJfIE06kU5hmhGL/6aAVGT1xta11Uuu1TmR9+P2utcvfwYrpg==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/node-8-3/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/node-8-3/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@php-wasm/node-8-4": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/node-8-4/-/node-8-4-3.0.46.tgz", - "integrity": "sha512-c9Rv2XqMnSaFca108zOblQkUiIHHorGc/QM7/CxLrukwVOVBQfovN+K3KLlcyy0jUvLhZU7FLnhJQbT04q1TOA==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/node-8-4/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/node-8-4/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@php-wasm/node-8-5": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/node-8-5/-/node-8-5-3.0.46.tgz", - "integrity": "sha512-wJKyGoJRSArec91pukIy0Z0C0/VCX4UirtptnOOJSRxgIPJpRsByytswkDulATVsgNBW8unAJuNJyF82kR7MYw==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/node-8-5/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/node-8-5/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@php-wasm/node-polyfills": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/node-polyfills/-/node-polyfills-3.0.46.tgz", - "integrity": "sha512-whgu+3t3EMU+LV6A0z/hB2FcMtNY3s3FSbNUrA1EmGa4XRy1wwpI0/ghTwukG/3+znB5zW2Ss99K6Xvr9lbnRg==", - "license": "GPL-2.0-or-later", - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/node/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/node/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@php-wasm/progress": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/progress/-/progress-3.0.46.tgz", - "integrity": "sha512-jZze71Q2lOXM/z3aptRLlLnwid2EfQ+m0U+oJT6j4ZH+41H3sXbM8wAagVZyMwpbZEB9NYohXMjs69vbYUL47w==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/logger": "3.0.46", - "@php-wasm/node-polyfills": "3.0.46" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/scopes": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/scopes/-/scopes-3.0.46.tgz", - "integrity": "sha512-BVkyX+m1SmhKTbYh2imIk5KsTCpQ4RDMUJ6g9qpO+zyJR/KCqOvn6eLKbHmblLE48VO86GYqn8YcVKQnaq1laA==", - "license": "GPL-2.0-or-later", - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/stream-compression": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/stream-compression/-/stream-compression-3.0.46.tgz", - "integrity": "sha512-L3RMhlC2QeugDgH20sZSWmwIH6HSYONvtDlE08VBuMM4YAHXN6JuN+Byq5tgBFjKOH/y6Ljp3Nm3vqhyzoNC7g==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/node-polyfills": "3.0.46", - "@php-wasm/util": "3.0.46" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/universal": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/universal/-/universal-3.0.46.tgz", - "integrity": "sha512-d3wJHtm2IpZM0dIuAkEEAvjnK27QsxS7SsxtBtKOq/EtU/pWZ5WF+OAg/DaFWJWcLz9ULByynkSh7Qg4BUm8YQ==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/logger": "3.0.46", - "@php-wasm/node-polyfills": "3.0.46", - "@php-wasm/progress": "3.0.46", - "@php-wasm/stream-compression": "3.0.46", - "@php-wasm/util": "3.0.46", - "ini": "4.1.2" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/universal/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/util": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/util/-/util-3.0.46.tgz", - "integrity": "sha512-dZ139Xt56VPbpUOqyC2OXeLGHJ0xmpzW92YPeenZiDSlEhzDYEecqmzeAHTrCYx1o5Rr3LiN6zoQTifkAGU5cg==", - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/web": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/web/-/web-3.0.46.tgz", - "integrity": "sha512-y8H0iaCa6sH7p2kZ+/kDw3SoYFw88ASQm/d2IrVipQNG/PKPYucvuHaBRk4wmal8M98Ch/TeAcLH0ajNfGrpxg==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/fs-journal": "3.0.46", - "@php-wasm/logger": "3.0.46", - "@php-wasm/universal": "3.0.46", - "@php-wasm/util": "3.0.46", - "@php-wasm/web-7-4": "3.0.46", - "@php-wasm/web-8-0": "3.0.46", - "@php-wasm/web-8-1": "3.0.46", - "@php-wasm/web-8-2": "3.0.46", - "@php-wasm/web-8-3": "3.0.46", - "@php-wasm/web-8-4": "3.0.46", - "@php-wasm/web-8-5": "3.0.46", - "@php-wasm/web-service-worker": "3.0.46", - "@wp-playground/common": "3.0.46", - "express": "4.22.0", - "ini": "4.1.2", - "selfsigned": "5.5.0", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3", - "yargs": "17.7.2" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/web-7-4": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/web-7-4/-/web-7-4-3.0.46.tgz", - "integrity": "sha512-Zecgap62KTlFF0AikpnSjYxEbfd2vBGwjYDxnMz7RX9aLvdVcA/W+4QJTRH9Sg2mU7CXghU5fJMpoQ9Whfc6pw==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/web-7-4/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/web-8-0": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/web-8-0/-/web-8-0-3.0.46.tgz", - "integrity": "sha512-YfOZLbbCajcbEd/3cgAWqVJnMdPa/a+B8d+TCvNvc+OFADcIWZ1ZcJt9Qjnf6QDJep8rB68a7Z6lPLGhVaHt2w==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/web-8-0/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/web-8-1": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/web-8-1/-/web-8-1-3.0.46.tgz", - "integrity": "sha512-At1Jp9KCiOu7caHoCSPLiiTb8Uj+qMhUR+E1Gecl9hHosgEdQrQj9/RmhEDVjTRL/njytIQVcOJr/oIxk/ZYAQ==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/web-8-1/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/web-8-2": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/web-8-2/-/web-8-2-3.0.46.tgz", - "integrity": "sha512-mBd+BEDJ6HTZdXu/VjSKS0gBeHvUsN4ybJnWAUVCewXaSkdkAgjDEbfyUOHd7as/QD1FtpXkzThTYkaw4FZEhQ==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/web-8-2/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/web-8-3": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/web-8-3/-/web-8-3-3.0.46.tgz", - "integrity": "sha512-FC8dpxFTe9B/oVL4X8uW4SkyPklQ15McMqJ6qFFMtsgJWoewsw5euElBZwgbhXuitrsyQjN3UIkTgaCfc5LxkQ==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/web-8-3/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/web-8-4": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/web-8-4/-/web-8-4-3.0.46.tgz", - "integrity": "sha512-vHvlKQt5WKXBtHPfJwIgN3mFdJ0RyHoFiPPuqKnK+ANNZeMGCy2RJEFZ0FTUa64DNeyWIuUs+ruiZYwuaumPiQ==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/web-8-4/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/web-8-5": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/web-8-5/-/web-8-5-3.0.46.tgz", - "integrity": "sha512-UVOW+91ITJaio59ReFO+1fNPfqCI+yp26vVWESl/PseccQtNuWl7DVEpcnJg9MrrRzyXWej5qqXpHxMNQfU1lg==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/web-8-5/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/web-service-worker": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/web-service-worker/-/web-service-worker-3.0.46.tgz", - "integrity": "sha512-j6hw2XiansczBiL709lDf8I86XlpGcwWaHwswkaeYCyUdYVfxDgChnnPK9T5+QvVzgQ0qmw6rfUkkHg/yQlZWQ==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/scopes": "3.0.46" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/web/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/web/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@php-wasm/xdebug-bridge": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@php-wasm/xdebug-bridge/-/xdebug-bridge-3.0.46.tgz", - "integrity": "sha512-0KSeyQN/JMOCQsbu+W51LkmmW9UhVIkDf+qsginj8fQPOhX3iJSwaQR6x/utMz6wMcEDrktRIUZ8X9x0f7aOlg==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/logger": "3.0.46", - "@php-wasm/node": "3.0.46", - "@php-wasm/universal": "3.0.46", - "@wp-playground/common": "3.0.46", - "express": "4.22.0", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3", - "xml2js": "0.6.2", - "yargs": "17.7.2" - }, - "bin": { - "xdebug-bridge": "xdebug-bridge.js" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@php-wasm/xdebug-bridge/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@php-wasm/xdebug-bridge/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@pm2/agent": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.1.1.tgz", - "integrity": "sha512-0V9ckHWd/HSC8BgAbZSoq8KXUG81X97nSkAxmhKDhmF8vanyaoc1YXwc2KVkbWz82Rg4gjd2n9qiT3i7bdvGrQ==", - "license": "AGPL-3.0", - "dependencies": { - "async": "~3.2.0", - "chalk": "~3.0.0", - "dayjs": "~1.8.24", - "debug": "~4.3.1", - "eventemitter2": "~5.0.1", - "fast-json-patch": "^3.1.0", - "fclone": "~1.0.11", - "pm2-axon": "~4.0.1", - "pm2-axon-rpc": "~0.7.0", - "proxy-agent": "~6.4.0", - "semver": "~7.5.0", - "ws": "~7.5.10" - } - }, - "node_modules/@pm2/agent/node_modules/dayjs": { - "version": "1.8.36", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz", - "integrity": "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==", - "license": "MIT" - }, - "node_modules/@pm2/agent/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@pm2/agent/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pm2/agent/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pm2/blessed": { - "version": "0.1.81", - "resolved": "https://registry.npmjs.org/@pm2/blessed/-/blessed-0.1.81.tgz", - "integrity": "sha512-ZcNHqQjMuNRcQ7Z1zJbFIQZO/BDKV3KbiTckWdfbUaYhj7uNmUwb+FbdDWSCkvxNr9dBJQwvV17o6QBkAvgO0g==", - "license": "MIT", - "bin": { - "blessed": "bin/tput.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@pm2/io": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@pm2/io/-/io-6.1.0.tgz", - "integrity": "sha512-IxHuYURa3+FQ6BKePlgChZkqABUKFYH6Bwbw7V/pWU1pP6iR1sCI26l7P9ThUEB385ruZn/tZS3CXDUF5IA1NQ==", - "license": "Apache-2", - "dependencies": { - "async": "~2.6.1", - "debug": "~4.3.1", - "eventemitter2": "^6.3.1", - "require-in-the-middle": "^5.0.0", - "semver": "~7.5.4", - "shimmer": "^1.2.0", - "signal-exit": "^3.0.3", - "tslib": "1.9.3" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/@pm2/io/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/@pm2/io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@pm2/io/node_modules/eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", - "license": "MIT" - }, - "node_modules/@pm2/io/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pm2/io/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pm2/js-api": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.8.0.tgz", - "integrity": "sha512-nmWzrA/BQZik3VBz+npRcNIu01kdBhWL0mxKmP1ciF/gTcujPTQqt027N9fc1pK9ERM8RipFhymw7RcmCyOEYA==", - "license": "Apache-2", - "dependencies": { - "async": "^2.6.3", - "debug": "~4.3.1", - "eventemitter2": "^6.3.1", - "extrareqp2": "^1.0.0", - "ws": "^7.0.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@pm2/js-api/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/@pm2/js-api/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@pm2/js-api/node_modules/eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", - "license": "MIT" - }, - "node_modules/@pm2/pm2-version-check": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz", - "integrity": "sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.1" - } - }, - "node_modules/@sindresorhus/df": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/df/-/df-3.1.1.tgz", - "integrity": "sha512-SME/vtXaJcnQ/HpeV6P82Egy+jThn11IKfwW8+/XVoRD0rmPHVTeKMtww1oWdVnMykzVPjmrDN9S8NBndPEHCQ==", - "license": "MIT", - "dependencies": { - "execa": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@stroncium/procfs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@stroncium/procfs/-/procfs-1.2.1.tgz", - "integrity": "sha512-X1Iui3FUNZP18EUvysTHxt+Avu2nlVzyf90YM8OYgP6SGzTzzX/0JgObfO1AQQDzuZtNNz29bVh8h5R97JrjxA==", - "license": "CC0-1.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "license": "MIT" - }, - "node_modules/@types/aws-lambda": { - "version": "8.10.159", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.159.tgz", - "integrity": "sha512-SAP22WSGNN12OQ8PlCzGzRCZ7QDCwI85dQZbmpz7+mAk+L7j+wI7qnvmdKh+o7A5LaOp6QnOZ2NJphAZQTTHQg==", - "license": "MIT" - }, - "node_modules/@types/btoa-lite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.2.tgz", - "integrity": "sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==", - "license": "MIT" - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", - "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", - "license": "MIT", - "dependencies": { - "@types/ms": "*", - "@types/node": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@wp-playground/blueprints": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@wp-playground/blueprints/-/blueprints-3.0.46.tgz", - "integrity": "sha512-OPrvoCTvpvQXMp6lJWwWJttZmF6pIMO8iIzdJWfkuxcS8QE3aaLKgSz6lB5Fdu345erFR8GeUmkSim98pt5fMQ==", - "dependencies": { - "@php-wasm/logger": "3.0.46", - "@php-wasm/node": "3.0.46", - "@php-wasm/node-polyfills": "3.0.46", - "@php-wasm/progress": "3.0.46", - "@php-wasm/scopes": "3.0.46", - "@php-wasm/stream-compression": "3.0.46", - "@php-wasm/universal": "3.0.46", - "@php-wasm/util": "3.0.46", - "@php-wasm/web": "3.0.46", - "@wp-playground/common": "3.0.46", - "@wp-playground/storage": "3.0.46", - "@wp-playground/wordpress": "3.0.46", - "@zip.js/zip.js": "2.7.57", - "ajv": "8.12.0", - "async-lock": "1.4.1", - "clean-git-ref": "2.0.1", - "crc-32": "1.2.2", - "diff3": "0.0.4", - "express": "4.22.0", - "ignore": "5.3.2", - "ini": "4.1.2", - "minimisted": "2.0.1", - "octokit": "3.1.2", - "pako": "1.0.10", - "pify": "2.3.0", - "readable-stream": "3.6.2", - "selfsigned": "5.5.0", - "sha.js": "2.4.12", - "simple-get": "4.0.1", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3", - "yargs": "17.7.2" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@wp-playground/blueprints/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wp-playground/blueprints/node_modules/pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/@wp-playground/blueprints/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@wp-playground/cli": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@wp-playground/cli/-/cli-3.0.46.tgz", - "integrity": "sha512-jf7LoA7skprotXCQjTw6K6o3yfnBUxlEFqPP7C9iSRViTpgnQ1A7UiGz+2klt5vlVCfVGix9YspnW1OT5ReT4A==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/cli-util": "3.0.46", - "@php-wasm/logger": "3.0.46", - "@php-wasm/node": "3.0.46", - "@php-wasm/progress": "3.0.46", - "@php-wasm/universal": "3.0.46", - "@php-wasm/util": "3.0.46", - "@php-wasm/xdebug-bridge": "3.0.46", - "@wp-playground/blueprints": "3.0.46", - "@wp-playground/common": "3.0.46", - "@wp-playground/storage": "3.0.46", - "@wp-playground/wordpress": "3.0.46", - "@zip.js/zip.js": "2.7.57", - "ajv": "8.12.0", - "async-lock": "1.4.1", - "clean-git-ref": "2.0.1", - "crc-32": "1.2.2", - "diff3": "0.0.4", - "express": "4.22.0", - "fast-xml-parser": "5.3.0", - "fs-extra": "11.1.1", - "ignore": "5.3.2", - "ini": "4.1.2", - "jsonc-parser": "3.3.1", - "minimisted": "2.0.1", - "octokit": "3.1.2", - "pako": "1.0.10", - "pify": "2.3.0", - "ps-man": "1.1.8", - "readable-stream": "3.6.2", - "selfsigned": "5.5.0", - "sha.js": "2.4.12", - "simple-get": "4.0.1", - "tmp-promise": "3.0.3", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3", - "xml2js": "0.6.2", - "yargs": "17.7.2" - }, - "bin": { - "wp-playground-cli": "wp-playground.js" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@wp-playground/cli/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wp-playground/cli/node_modules/pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/@wp-playground/cli/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@wp-playground/common": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@wp-playground/common/-/common-3.0.46.tgz", - "integrity": "sha512-ugA98s7LChqLLqsISiKpV1Rl+XfS3KZBgL1J6gYUfXf7gcceAZ4KzyFw5LOctvuo7IPInakzIISq3Q4efaO0kw==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/universal": "3.0.46", - "@php-wasm/util": "3.0.46", - "ini": "4.1.2" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@wp-playground/common/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wp-playground/storage": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@wp-playground/storage/-/storage-3.0.46.tgz", - "integrity": "sha512-QZDJlXz/G8usnBI/TWoqVPHR6qFpIqqBf+QWU7SzXO7aukTiyRBVfMn85AKMDkMPZymn15xyLqmP0vpFEmsHCw==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/stream-compression": "3.0.46", - "@php-wasm/universal": "3.0.46", - "@php-wasm/util": "3.0.46", - "@php-wasm/web": "3.0.46", - "@zip.js/zip.js": "2.7.57", - "async-lock": "^1.4.1", - "clean-git-ref": "^2.0.1", - "crc-32": "^1.2.0", - "diff3": "0.0.3", - "express": "4.22.0", - "ignore": "^5.1.4", - "ini": "4.1.2", - "minimisted": "^2.0.0", - "octokit": "3.1.2", - "pako": "^1.0.10", - "pify": "^4.0.1", - "readable-stream": "^3.4.0", - "selfsigned": "5.5.0", - "sha.js": "^2.4.9", - "simple-get": "^4.0.1", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3", - "yargs": "17.7.2" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@wp-playground/storage/node_modules/diff3": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", - "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", - "license": "MIT" - }, - "node_modules/@wp-playground/storage/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wp-playground/storage/node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/@wp-playground/storage/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@wp-playground/storage/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@wp-playground/wordpress": { - "version": "3.0.46", - "resolved": "https://registry.npmjs.org/@wp-playground/wordpress/-/wordpress-3.0.46.tgz", - "integrity": "sha512-GCbsxV7+wCpbyxSRnFrGtiorUS/bTeUu1mIVFSiPxdWIY0hIvsYd8HWdfsvhN0jYlDY3eBxvQ+4mq0YT0N6TDg==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@php-wasm/logger": "3.0.46", - "@php-wasm/node": "3.0.46", - "@php-wasm/universal": "3.0.46", - "@php-wasm/util": "3.0.46", - "@wp-playground/common": "3.0.46", - "express": "4.22.0", - "ini": "4.1.2", - "wasm-feature-detect": "1.8.0", - "ws": "8.18.3", - "yargs": "17.7.2" - }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" - }, - "optionalDependencies": { - "fs-ext": "2.1.1" - } - }, - "node_modules/@wp-playground/wordpress/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wp-playground/wordpress/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@zip.js/zip.js": { - "version": "2.7.57", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.57.tgz", - "integrity": "sha512-BtonQ1/jDnGiMed6OkV6rZYW78gLmLswkHOzyMrMb+CAR7CZO8phOHO6c2qw6qb1g1betN7kwEHhhZk30dv+NA==", - "license": "BSD-3-Clause", - "engines": { - "bun": ">=0.7.0", - "deno": ">=1.0.0", - "node": ">=16.5.0" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/amp": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz", - "integrity": "sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==", - "license": "MIT" - }, - "node_modules/amp-message": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz", - "integrity": "sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg==", - "license": "MIT", - "dependencies": { - "amp": "0.3.1" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansis": { - "version": "4.0.0-node10", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.0.0-node10.tgz", - "integrity": "sha512-BRrU0Bo1X9dFGw6KgGz6hWrqQuOlVEDOzkb0QSLZY9sXHqA7pNj7yHPVJRz7y/rj4EOJ3d/D5uxH+ee9leYgsg==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/asn1js": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", - "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", - "license": "BSD-3-Clause", - "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/asn1js/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ast-types/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/async-lock": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "license": "Apache-2.0" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bodec": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz", - "integrity": "sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.14.0", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "license": "MIT" - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/btoa-lite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", - "integrity": "sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==", - "license": "MIT" - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bytestreamjs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/charm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", - "integrity": "sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==", - "license": "MIT/X11" - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chunkify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chunkify/-/chunkify-5.0.0.tgz", - "integrity": "sha512-G8dj/3/Gm+1yL4oWSdwIxihZWFlgC4V2zYtIApacI0iPIRKBHlBGOGAiDUBZgrj4H8MBA8g8fPFwnJrWF3wl7Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clean-git-ref": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", - "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==", - "license": "Apache-2.0" - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-tableau": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz", - "integrity": "sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==", - "dependencies": { - "chalk": "3.0.0" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "license": "MIT" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/croner": { - "version": "4.1.97", - "resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz", - "integrity": "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==", - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/culvert": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz", - "integrity": "sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==", - "license": "MIT" - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/dayjs": { - "version": "1.11.15", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.15.tgz", - "integrity": "sha512-MC+DfnSWiM9APs7fpiurHGCoeIx0Gdl6QZBy+5lu8MbYKN5FZEXqOgrundfibdfhGZ15o9hzmZ2xJjZnbvgKXQ==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "license": "ISC" - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/diff3": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.4.tgz", - "integrity": "sha512-f1rQ7jXDn/3i37hdwRk9ohqcvLRH3+gEIgmA6qEM280WUOh7cOr3GXV8Jm5sPwUs46Nzl48SE8YNLGJoaLuodg==", - "license": "MIT" - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter2": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", - "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==", - "license": "MIT" - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, - "node_modules/execa": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", - "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^3.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": "^8.12.0 || >=9.7.0" - } - }, - "node_modules/express": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.0.tgz", - "integrity": "sha512-c2iPh3xp5vvCLgaHK03+mWLFPhox7j1LwyxcZwFVApEv5i0X+IjPpbT50SJJwwLpdBVfp45AkK/v+AFgv/XlfQ==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/extrareqp2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/extrareqp2/-/extrareqp2-1.0.0.tgz", - "integrity": "sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-patch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", - "license": "MIT" - }, - "node_modules/fast-xml-parser": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.0.tgz", - "integrity": "sha512-gkWGshjYcQCF+6qtlrqBqELqNqnt4CxruY6UVAWWnqb3DQ6qaNFEIKqzYep1XzHLM/QtrHVCxyPOtTk4LTQ7Aw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fclone": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", - "integrity": "sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==", - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-ext": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fs-ext/-/fs-ext-2.1.1.tgz", - "integrity": "sha512-/TrISPOFhCkbgIRWK9lzscRzwPCu0PqtCcvMc9jsHKBgZGoqA0VzhspVht5Zu8lxaXjIYIBWILHpRotYkCCcQA==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.21.0" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", - "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", - "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/git-node-fs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz", - "integrity": "sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ==", - "license": "MIT" - }, - "node_modules/git-sha1": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz", - "integrity": "sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==", - "license": "MIT" - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/js-git": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz", - "integrity": "sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==", - "license": "MIT", - "dependencies": { - "bodec": "^0.1.0", - "culvert": "^0.1.2", - "git-sha1": "^0.1.2", - "pako": "^0.2.5" - } - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC", - "optional": true - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "license": "MIT", - "dependencies": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "license": "MIT" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT" - }, - "node_modules/lru-cache": { - "name": "@wolfy1339/lru-cache", - "version": "11.0.2-patch.1", - "resolved": "https://registry.npmjs.org/@wolfy1339/lru-cache/-/lru-cache-11.0.2-patch.1.tgz", - "integrity": "sha512-BgYZfL2ADCXKOw2wJtkM3slhHotawWkgIRRxq4wEybnZQPjvAp71SPX35xepMykTw8gXlzWcWPTY31hlbnRsDA==", - "license": "ISC", - "engines": { - "node": "18 >=18.20 || 20 || >=22" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimisted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", - "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/module-details-from-path": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", - "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", - "license": "MIT" - }, - "node_modules/mount-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mount-point/-/mount-point-3.0.0.tgz", - "integrity": "sha512-jAhfD7ZCG+dbESZjcY1SdFVFqSJkh/yGbdsifHcPkvuLRO5ugK0Ssmd9jdATu29BTd4JiN+vkpMzVvsUgP3SZA==", - "license": "MIT", - "dependencies": { - "@sindresorhus/df": "^1.0.1", - "pify": "^2.3.0", - "pinkie-promise": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mount-point/node_modules/@sindresorhus/df": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/df/-/df-1.0.1.tgz", - "integrity": "sha512-1Hyp7NQnD/u4DSxR2DGW78TF9k7R0wZ8ev0BpMAIzA6yTQSHqNb5wTuvtcPYf4FWbVse2rW7RgDsyL8ua2vXHw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/move-file": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/move-file/-/move-file-3.1.0.tgz", - "integrity": "sha512-4aE3U7CCBWgrQlQDMq8da4woBWDGHioJFiOZ8Ie6Yq2uwYQ9V2kGhTz4x3u6Wc+OU17nw0yc3rJ/lQ4jIiPe3A==", - "license": "MIT", - "dependencies": { - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "license": "ISC" - }, - "node_modules/nan": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.24.0.tgz", - "integrity": "sha512-Vpf9qnVW1RaDkoNKFUvfxqAbtI8ncb8OJlqZ9wwpXzWPEsvsB1nvdUi6oYrHIkQ1Y/tMDnr1h4nczS0VB9Xykg==", - "license": "MIT", - "optional": true - }, - "node_modules/needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "license": "MIT", - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", - "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/octokit": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/octokit/-/octokit-3.1.2.tgz", - "integrity": "sha512-MG5qmrTL5y8KYwFgE1A4JWmgfQBaIETE/lOlfwNYx1QOtCQHGVxkRJmdUJltFc1HVn73d61TlMhMyNTOtMl+ng==", - "license": "MIT", - "dependencies": { - "@octokit/app": "^14.0.2", - "@octokit/core": "^5.0.0", - "@octokit/oauth-app": "^6.0.0", - "@octokit/plugin-paginate-graphql": "^4.0.0", - "@octokit/plugin-paginate-rest": "^9.0.0", - "@octokit/plugin-rest-endpoint-methods": "^10.0.0", - "@octokit/plugin-retry": "^6.0.0", - "@octokit/plugin-throttling": "^8.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "license": "MIT", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "license": "MIT" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidusage": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-3.0.2.tgz", - "integrity": "sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "license": "MIT", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkijs": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz", - "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==", - "license": "BSD-3-Clause", - "dependencies": { - "@noble/hashes": "1.4.0", - "asn1js": "^3.0.6", - "bytestreamjs": "^2.0.1", - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/pkijs/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/pm2": { - "version": "6.0.14", - "resolved": "https://registry.npmjs.org/pm2/-/pm2-6.0.14.tgz", - "integrity": "sha512-wX1FiFkzuT2H/UUEA8QNXDAA9MMHDsK/3UHj6Dkd5U7kxyigKDA5gyDw78ycTQZAuGCLWyUX5FiXEuVQWafukA==", - "license": "AGPL-3.0", - "dependencies": { - "@pm2/agent": "~2.1.1", - "@pm2/blessed": "0.1.81", - "@pm2/io": "~6.1.0", - "@pm2/js-api": "~0.8.0", - "@pm2/pm2-version-check": "^1.0.4", - "ansis": "4.0.0-node10", - "async": "3.2.6", - "chokidar": "3.6.0", - "cli-tableau": "2.0.1", - "commander": "2.15.1", - "croner": "4.1.97", - "dayjs": "1.11.15", - "debug": "4.4.3", - "enquirer": "2.3.6", - "eventemitter2": "5.0.1", - "fclone": "1.0.11", - "js-yaml": "4.1.1", - "mkdirp": "1.0.4", - "needle": "2.4.0", - "pidusage": "3.0.2", - "pm2-axon": "~4.0.1", - "pm2-axon-rpc": "~0.7.1", - "pm2-deploy": "~1.0.2", - "pm2-multimeter": "^0.1.2", - "promptly": "2.2.0", - "semver": "7.7.2", - "source-map-support": "0.5.21", - "sprintf-js": "1.1.2", - "vizion": "~2.2.1" - }, - "bin": { - "pm2": "bin/pm2", - "pm2-dev": "bin/pm2-dev", - "pm2-docker": "bin/pm2-docker", - "pm2-runtime": "bin/pm2-runtime" - }, - "engines": { - "node": ">=16.0.0" - }, - "optionalDependencies": { - "pm2-sysmonit": "^1.2.8" - } - }, - "node_modules/pm2-axon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz", - "integrity": "sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==", - "license": "MIT", - "dependencies": { - "amp": "~0.3.1", - "amp-message": "~0.1.1", - "debug": "^4.3.1", - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=5" - } - }, - "node_modules/pm2-axon-rpc": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz", - "integrity": "sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.1" - }, - "engines": { - "node": ">=5" - } - }, - "node_modules/pm2-deploy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz", - "integrity": "sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==", - "license": "MIT", - "dependencies": { - "run-series": "^1.1.8", - "tv4": "^1.3.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pm2-multimeter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz", - "integrity": "sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA==", - "license": "MIT/X11", - "dependencies": { - "charm": "~0.1.1" - } - }, - "node_modules/pm2-sysmonit": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz", - "integrity": "sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==", - "license": "Apache", - "optional": true, - "dependencies": { - "async": "^3.2.0", - "debug": "^4.3.1", - "pidusage": "^2.0.21", - "systeminformation": "^5.7", - "tx2": "~1.0.4" - } - }, - "node_modules/pm2-sysmonit/node_modules/pidusage": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", - "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/promptly": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz", - "integrity": "sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==", - "license": "MIT", - "dependencies": { - "read": "^1.0.4" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/ps-man": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ps-man/-/ps-man-1.1.8.tgz", - "integrity": "sha512-ZKDPZwHLYVWIk/Q75N7jCFbuQyokSg2+3WBlt8l35S/uBvxoc+LiRUbb3RUt83pwW82dzwiCpoQIHd9PAxUzHg==", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pvtsutils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.8.1" - } - }, - "node_modules/pvtsutils/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/pvutils": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-in-the-middle": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", - "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-series": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", - "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", - "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", - "license": "BlueOak-1.0.0" - }, - "node_modules/selfsigned": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", - "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", - "license": "MIT", - "dependencies": { - "@peculiar/x509": "^1.14.2", - "pkijs": "^3.3.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", - "license": "BSD-2-Clause" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "license": "MIT", - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "license": "BSD-3-Clause" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/systeminformation": { - "version": "5.27.14", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.27.14.tgz", - "integrity": "sha512-3DoNDYSZBLxBwaJtQGWNpq0fonga/VZ47HY1+7/G3YoIPaPz93Df6egSzzTKbEMmlzUpy3eQ0nR9REuYIycXGg==", - "license": "MIT", - "optional": true, - "os": [ - "darwin", - "linux", - "win32", - "freebsd", - "openbsd", - "netbsd", - "sunos", - "android" - ], - "bin": { - "systeminformation": "lib/cli.js" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "Buy me a coffee", - "url": "https://www.buymeacoffee.com/systeminfo" - } - }, - "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "license": "MIT", - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/trash": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/trash/-/trash-10.0.1.tgz", - "integrity": "sha512-WSh7WXBRkudzQMXRh61vyT/f3mjVnn+3conu5DdvMGzRPsc3mtviPLIwCK1OtwfgR2gr4+9+EE/eWwPlDj5NcA==", - "license": "MIT", - "dependencies": { - "@stroncium/procfs": "^1.2.1", - "chunkify": "^5.0.0", - "globby": "^14.1.0", - "is-path-inside": "^4.0.0", - "move-file": "^3.1.0", - "p-map": "^7.0.3", - "xdg-trashdir": "^3.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "license": "Apache-2.0" - }, - "node_modules/tsyringe": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", - "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", - "license": "MIT", - "dependencies": { - "tslib": "^1.9.3" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/tv4": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", - "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==", - "license": [ - { - "type": "Public Domain", - "url": "http://geraintluff.github.io/tv4/LICENSE.txt" - }, - { - "type": "MIT", - "url": "http://jsonary.com/LICENSE.txt" - } - ], - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tx2": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tx2/-/tx2-1.0.5.tgz", - "integrity": "sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==", - "license": "MIT", - "optional": true, - "dependencies": { - "json-stringify-safe": "^5.0.1" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT" - }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universal-github-app-jwt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-1.2.0.tgz", - "integrity": "sha512-dncpMpnsKBk0eetwfN8D8OUHGfiDhhJ+mtsbMl+7PfW7mYjiH8LIcqRmYMtzYLgSh47HjfdBtrBwIQ/gizKR3g==", - "license": "MIT", - "dependencies": { - "@types/jsonwebtoken": "^9.0.0", - "jsonwebtoken": "^9.0.2" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "license": "ISC" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==", - "license": "MIT", - "dependencies": { - "os-homedir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vizion": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz", - "integrity": "sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==", - "license": "Apache-2.0", - "dependencies": { - "async": "^2.6.3", - "git-node-fs": "^1.0.0", - "ini": "^1.3.5", - "js-git": "^0.7.8" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/vizion/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/wasm-feature-detect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/wasm-feature-detect/-/wasm-feature-detect-1.8.0.tgz", - "integrity": "sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==", - "license": "Apache-2.0" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/xdg-trashdir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/xdg-trashdir/-/xdg-trashdir-3.1.0.tgz", - "integrity": "sha512-N1XQngeqMBoj9wM4ZFadVV2MymImeiFfYD+fJrNlcVcOHsJFFQe7n3b+aBoTPwARuq2HQxukfzVpQmAk1gN4sQ==", - "license": "MIT", - "dependencies": { - "@sindresorhus/df": "^3.1.1", - "mount-point": "^3.0.0", - "user-home": "^2.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - } - } -} diff --git a/cli/package.json b/cli/package.json deleted file mode 100644 index c886a9754a..0000000000 --- a/cli/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "studio-cli", - "author": "Automattic Inc.", - "private": true, - "productName": "Studio CLI", - "description": "WordPress Studio CLI", - "license": "GPL-2.0-or-later", - "main": "index.js", - "dependencies": { - "@php-wasm/universal": "^3.0.46", - "@wp-playground/blueprints": "^3.0.46", - "@wp-playground/cli": "^3.0.46", - "@wp-playground/common": "^3.0.46", - "@wp-playground/storage": "^3.0.46", - "http-proxy": "^1.18.1", - "pm2": "^6.0.14", - "pm2-axon": "^4.0.1", - "trash": "^10.0.1" - }, - "scripts": { - "postinstall": "patch-package" - } -} diff --git a/cli/patches/@wp-playground+wordpress+3.0.46.patch b/cli/patches/@wp-playground+wordpress+3.0.46.patch deleted file mode 100644 index d4e8942d35..0000000000 --- a/cli/patches/@wp-playground+wordpress+3.0.46.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff --git a/node_modules/@wp-playground/wordpress/index.cjs b/node_modules/@wp-playground/wordpress/index.cjs -index 0cd5fbc..5ba580d 100644 ---- a/node_modules/@wp-playground/wordpress/index.cjs -+++ b/node_modules/@wp-playground/wordpress/index.cjs -@@ -352,7 +352,7 @@ function skip_whitespace($tokens) { - ob_clean(); - echo false === $return_value ? '0' : '1'; - ob_end_flush(); -- `})).text!=="1")throw new Error("Failed to rewrite constants in wp-config.php.")}async function $(e,n){const t=a.joinPaths(n,"wp-config.php"),i={DB_NAME:"wordpress"};!e.fileExists(t)&&e.fileExists(a.joinPaths(n,"wp-config-sample.php"))&&await e.writeFile(t,await e.readFileAsBuffer(a.joinPaths(n,"wp-config-sample.php"))),await g(e,t,i,"skip")}async function I(e){const n=await m(e);return await w(n,e),n}async function w(e,n){var d,s;const t=await e.getPrimaryPhp();if((d=n.hooks)!=null&&d.beforeWordPressFiles&&await n.hooks.beforeWordPressFiles(t),n.wordPressZip&&await S(t,await n.wordPressZip),n.constants)for(const l in n.constants)t.defineConstant(l,n.constants[l]);n.dataSqlPath&&(t.defineConstant("DB_DIR",a.dirname(n.dataSqlPath)),t.defineConstant("DB_FILE",a.basename(n.dataSqlPath))),t.defineConstant("WP_HOME",n.siteUrl),t.defineConstant("WP_SITEURL",n.siteUrl),await $(t,e.documentRoot),(s=n.hooks)!=null&&s.beforeDatabaseSetup&&await n.hooks.beforeDatabaseSetup(t);let i=!1;n.sqliteIntegrationPluginZip&&(i=!0,await T(t,await n.sqliteIntegrationPluginZip));const r=n.wordpressInstallMode??"download-and-install",o=!!n.dataSqlPath;if(["download-and-install","install-from-existing-files"].includes(r)){await f(e,{usesSqlite:i,hasCustomDatabasePath:o});try{await _(t)}catch(l){throw o||await p(e),l}o||await p(e)}else if(r==="install-from-existing-files-if-needed"){if(await f(e,{usesSqlite:i,hasCustomDatabasePath:o}),!await b(t))try{await _(t)}catch(l){throw o||await p(e),l}o||await p(e)}return e}async function f(e,{usesSqlite:n,hasCustomDatabasePath:t}){const i=await e.getPrimaryPhp();if(i.isFile("/internal/shared/preload/0-sqlite.php"))return;const r=a.joinPaths(e.documentRoot,"wp-content/mu-plugins/sqlite-database-integration");if(!i.isDir(r)&&!n&&!t)throw new Error("Error connecting to the MySQL database.")}async function p(e){const n=await e.getPrimaryPhp();if(await L(n))return;if(n.isFile("/internal/shared/preload/0-sqlite.php"))throw new Error("Error connecting to the SQLite database.");const i=a.joinPaths(e.documentRoot,"wp-content/mu-plugins/sqlite-database-integration");throw n.isDir(i)?new Error("Error connecting to the SQLite database."):new Error("Error connecting to the MySQL database.")}async function m(e){const n=e.spawnHandler??u.sandboxedSpawnHandlerFactory;async function t(r,o=!1){const d=await e.createPhpRuntime(o),s=new u.PHP(d);if(e.sapiName&&s.setSapiName(e.sapiName),r&&(s.requestHandler=r),e.phpIniEntries&&u.setPhpIniEntries(s,e.phpIniEntries),s.defineConstant("WP_SQLITE_AST_DRIVER",!0),e.constants)for(const l in e.constants)s.defineConstant(l,e.constants[l]);return o&&!s.isFile("/internal/.boot-files-written")&&(await E(s),await u.writeFiles(s,"/",e.createFiles||{}),await R(s,a.joinPaths(new URL(e.siteUrl).pathname,"phpinfo.php")),await u.writeFiles(s,"/internal",{".boot-files-written":""})),n&&await s.setSpawnHandler(n(r?()=>r.instanceManager.acquirePHPInstance({considerPrimary:!1}):void 0)),s.enableRuntimeRotation({recreateRuntime:e.createPhpRuntime,maxRequests:400}),e.onPHPInstanceCreated&&await e.onPHPInstanceCreated(s,{isPrimary:o}),s}const i=new u.PHPRequestHandler({documentRoot:e.documentRoot||"/wordpress",absoluteUrl:e.siteUrl,rewriteRules:k,getFileNotFoundAction:e.getFileNotFoundAction??P,cookieStore:e.cookieStore,php:e.maxPhpInstances===1?await t(void 0,!0):void 0,phpFactory:e.maxPhpInstances!==1?async({isPrimary:r})=>t(i,r):void 0,maxPhpInstances:e.maxPhpInstances});return i}async function b(e){return(await e.run({code:`r.instanceManager.acquirePHPInstance({considerPrimary:!1}):void 0)),s.enableRuntimeRotation({recreateRuntime:e.createPhpRuntime,maxRequests:400}),e.onPHPInstanceCreated&&await e.onPHPInstanceCreated(s,{isPrimary:o}),s}const i=new u.PHPRequestHandler({documentRoot:e.documentRoot||"/wordpress",absoluteUrl:e.siteUrl,rewriteRules:k,getFileNotFoundAction:e.getFileNotFoundAction??P,cookieStore:e.cookieStore,php:e.maxPhpInstances===1?await t(void 0,!0):void 0,phpFactory:e.maxPhpInstances!==1?async({isPrimary:r})=>t(i,r):void 0,maxPhpInstances:e.maxPhpInstances});return i}async function b(e){return(await e.run({code:`` - **Auth**: `auth login|logout|status` - WordPress.com OAuth (tokens valid 2 weeks) -- **Preview Sites**: See `cli/commands/preview/` -- **Local Sites**: See `cli/commands/site/` +- **Preview Sites**: See `apps/cli/commands/preview/` +- **Local Sites**: See `apps/cli/commands/site/` ## Architecture **Electron 3-Process**: Main (Node.js) → Preload (IPC bridge) → Renderer (React) -**Main Process** (`src/`): IPC handlers, site servers, storage, OAuth, sync, migrations -**Renderer** (`src/components`, `src/hooks`): React UI, Redux stores, TailwindCSS -**CLI** (`cli/`): WordPress Playground (PHP WASM), yargs commands, child process of desktop app +**Main Process** (`apps/studio/src/`): IPC handlers, site servers, storage, OAuth, sync, migrations +**Renderer** (`apps/studio/src/components`, `apps/studio/src/hooks`): React UI, Redux stores, TailwindCSS +**CLI** (`apps/cli/`): WordPress Playground (PHP WASM), yargs commands, child process of desktop app ## Directory Structure -**`/src`**: Main (index.ts, ipc-handlers.ts, site-server.ts, storage/, lib/) | Renderer (components/, hooks/, stores/) | modules/ (sync, cli, user-settings, preview-site) -**`/cli`**: index.ts, commands/ (auth, preview, site), lib/ (appdata, i18n, browser) -**`/common`**: Shared lib/ (fs-utils, port-finder, oauth), types/, translations/ -**`/packages`**: eslint-plugin-studio +**`/apps/studio/src`**: Main (index.ts, ipc-handlers.ts, site-server.ts, storage/, lib/) | Renderer (components/, hooks/, stores/) | modules/ (sync, cli, user-settings, preview-site) +**`/apps/cli`**: index.ts, commands/ (auth, preview, site), lib/ (appdata, i18n, browser) +**`/tools/common`**: Shared lib/ (fs-utils, port-finder, oauth), types/, translations/ +**`/tools/eslint-plugin-studio`**: eslint-plugin-studio ## Key Patterns **IPC**: Renderer → `window.ipcApi.*` → Preload (contextBridge) → Main `ipc-handlers.ts` → Business logic -**CliServerProcess**: Desktop spawns CLI as child process (`src/modules/cli/lib/cli-server-process.ts`) +**CliServerProcess**: Desktop spawns CLI as child process (`apps/studio/src/modules/cli/lib/cli-server-process.ts`) **Redux Stores**: chat, sync, connectedSites, snapshot, onboarding | RTK Query APIs: wpcomApi, installedAppsApi, wordpressVersionsApi -**SiteServer** (`src/site-server.ts`): Manages site instances, server start/stop, SSL certs, ports +**SiteServer** (`apps/studio/src/site-server.ts`): Manages site instances, server start/stop, SSL certs, ports ## Tech Stack @@ -49,16 +49,16 @@ CLI pattern: `npm run cli:build && node dist/cli/main.js ` ## Build & Distribution -**Build**: CLI (`vite build --config vite.cli.config.ts`) → Electron (`electron-vite build`) → Package (`electron-forge make`) +**Build**: CLI (`vite build --config apps/cli/vite.config.ts`) → Electron (`electron-vite build --config apps/studio/electron.vite.config.ts`) → Package (`electron-forge make --config apps/studio/forge.config.ts`) **Platforms**: macOS (x64/ARM64 DMG), Windows (x64/ARM64 MSIX), Linux (DEB) **Bundling**: Rollup (main), Vite (renderer with code splitting), ASAR (resources) ## Conventions **Files**: React components (PascalCase), utils (camelCase), tests (.test.ts/.tsx) -**IPC Handlers** (`src/ipc-handlers.ts`): `export async function handlerName(event, ...args): Promise` | Handler names in `src/constants.ts` +**IPC Handlers** (`apps/studio/src/ipc-handlers.ts`): `export async function handlerName(event, ...args): Promise` | Handler names in `apps/studio/src/constants.ts` **Storage**: `~/Library/Application Support/WordPress Studio/appdata-v1.json` (macOS), `%APPDATA%/...` (Win), `~/.config/...` (Linux) | File locking: `lockAppdata()` / `unlockAppdata()` -**i18n**: `@wordpress/i18n` (`__()` function), `common/translations/`, `` (renderer), `loadTranslations()` (CLI) +**i18n**: `@wordpress/i18n` (`__()` function), `tools/common/translations/`, `` (renderer), `loadTranslations()` (CLI) ## Detailed Documentation @@ -72,7 +72,7 @@ For in-depth information, see these docs: ## Quick Reference **WP Playground**: CLI runs WordPress via PHP WASM, Blueprints for config, `filterUnsupportedBlueprintFeatures()` for compatibility -**Sync**: OAuth via `common/lib/oauth.ts`, Redux `sync` slice, pull/push WordPress.com sites +**Sync**: OAuth via `tools/common/lib/oauth.ts`, Redux `sync` slice, pull/push WordPress.com sites **Security**: Renderer sandboxed, IPC validation, strict CSP, no Node integration, self-signed HTTPS certs --- diff --git a/docs/code-contributions.md b/docs/code-contributions.md index 86f8af8d38..d89f117798 100644 --- a/docs/code-contributions.md +++ b/docs/code-contributions.md @@ -25,6 +25,8 @@ nvm use npm install ``` +Studio now uses npm workspaces. Run installs from the repo root (this also runs the nested CLI install required for packaging). + ### Running the App Once all required dependencies are installed, you can run the app with the following command: @@ -38,13 +40,13 @@ This command starts the app in dev mode and opens it automatically, with the Chr As with any Electron app, the code is split into two processes: 1. **Renderer Process** (reloads automatically): - - All React components and UI code in `src/components/`, `src/modules/*/components/` - - Hooks, stores, and utilities used by the UI (`src/hooks/`, `src/stores/`, etc.) + - All React components and UI code in `apps/studio/src/components/`, `apps/studio/src/modules/*/components/` + - Hooks, stores, and utilities used by the UI (`apps/studio/src/hooks/`, `apps/studio/src/stores/`, etc.) - Any code that runs in the browser window context 2. **Main Process** (requires restart): - - IPC handlers in `src/ipc-handlers.ts` - - Electron main process code in `src/index.ts` + - IPC handlers in `apps/studio/src/ipc-handlers.ts` + - Electron main process code in `apps/studio/src/index.ts` - Node.js operations like file system access - PHP server management code @@ -76,34 +78,36 @@ The project follows a modular architecture with both global and feature-specific #### Global Directories -| Directory | Description | -|-------------------|-------------| -| `cli/` | Root directory for CLI code | -| `common/` | Shared code between CLI and Studio (constants, types, utility functions, etc) | -| `src/` | Root directory for Studio code | -| `src/components/` | Reusable UI components used across the application | -| `src/hooks/` | Global React hooks | -| `src/lib/` | Utility functions and helper libraries | -| `src/modules/` | Feature-specific code | -| `src/stores/` | Global state management (Redux stores) | -| `src/api/` | API interfaces and implementations | +| Directory | Description | +|--------------------------|-------------| +| `apps/cli/` | Root directory for CLI code | +| `apps/studio/src/` | Root directory for Studio code | +| `apps/studio/src/components/` | Reusable UI components used across the application | +| `apps/studio/src/hooks/` | Global React hooks | +| `apps/studio/src/lib/` | Utility functions and helper libraries | +| `apps/studio/src/modules/` | Feature-specific code | +| `apps/studio/src/stores/` | Global state management (Redux stores) | +| `apps/studio/src/api/` | API interfaces and implementations | +| `tools/common/` | Shared code between CLI and Studio (constants, types, utility functions, etc) | +| `tools/compare-perf/` | Compare-perf tooling workspace | +| `tools/eslint-plugin-studio/` | Custom ESLint rules | #### Important Entry Points | File | Description | |------|-------------| -| `cli/index.ts` | The entry point for the CLI bundle | -| `scripts/` | Scripts for building and testing the app | -| `src/index.ts` | The entry point for the main process | -| `src/renderer.ts` | The entry point for the "renderer," the code running in the Chromium window | +| `apps/cli/index.ts` | The entry point for the CLI bundle | +| `scripts/` | Scripts for building and testing the app | +| `apps/studio/src/index.ts` | The entry point for the main process | +| `apps/studio/src/renderer.ts` | The entry point for the "renderer," the code running in the Chromium window | | `vendor/wp-now` | The modified `wp-now` source code | #### Feature Modules -Feature-specific code is organized in the `src/modules/` directory. Each module follows a consistent internal structure: +Feature-specific code is organized in the `apps/studio/src/modules/` directory. Each module follows a consistent internal structure: ``` -src/modules/ +apps/studio/src/modules/ ├── preview-site/ # Preview sites feature │ ├── components/ # Feature-specific components │ ├── hooks/ # Feature-specific hooks @@ -127,7 +131,7 @@ Code formatting is set up to make merging pull requests easier. It uses the same The CLI relies upon a separate instance of the app to run. When developing the CLI, the CLI can be invoked with the following steps: - Run `npm start` to launch the first instance of the app. -- Within the `forge.config.ts` file, change the `WebpackPlugin` ports used for the second instance: +- Within `apps/studio/forge.config.ts`, change the `WebpackPlugin` ports used for the second instance: - Set the development `port` to `3457`. - Add a `loggerPort` property set to `9001`. - Run `npm start -- -- --cli"="` in separate terminal session. diff --git a/docs/testing-with-local-playground.md b/docs/testing-with-local-playground.md index 0b0ecbfc65..1749428dea 100644 --- a/docs/testing-with-local-playground.md +++ b/docs/testing-with-local-playground.md @@ -33,7 +33,7 @@ npm run build ### 2. Update CLI's package.json -Replace the existing Playground dependencies in `cli/package.json` with local file references: +Replace the existing Playground dependencies in `apps/cli/package.json` with local file references: ```json { @@ -73,8 +73,8 @@ done ```bash cd /path/to/studio -rm -rf cli/node_modules -cd cli && npm install && cd .. +rm -rf apps/cli/node_modules +npm --prefix apps/cli install npm install ``` @@ -115,14 +115,14 @@ After making changes to Playground: To go back to using the published npm packages: -1. Restore `cli/package.json`: +1. Restore `apps/cli/package.json`: ```bash - git checkout cli/package.json + git checkout apps/cli/package.json ``` 2. Reinstall CLI dependencies: ```bash - rm -rf cli/node_modules - cd cli && npm install && cd .. + rm -rf apps/cli/node_modules + npm --prefix apps/cli install ``` 3. In the Playground repo, restore the original `node_modules` symlinks: ```bash diff --git a/eslint.config.mjs b/eslint.config.mjs index f7f9699084..4ff3151f47 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -16,8 +16,8 @@ export default defineConfig( 'out/', 'wp-files/', 'vendor/', - 'cli/__mocks__', - 'src/__mocks__', + 'apps/cli/__mocks__', + 'apps/studio/src/__mocks__', ] ), js.configs.recommended, tsEslint.configs.recommended, @@ -45,7 +45,12 @@ export default defineConfig( 'import/resolver': { typescript: { alwaysTryTypes: true, - project: path.join( import.meta.dirname, 'tsconfig.json' ), + project: [ + path.join( import.meta.dirname, 'tsconfig.json' ), + path.join( import.meta.dirname, 'apps/cli/tsconfig.json' ), + path.join( import.meta.dirname, 'apps/studio/tsconfig.json' ), + path.join( import.meta.dirname, 'tools/common/tsconfig.json' ), + ], }, }, }, diff --git a/package-lock.json b/package-lock.json index 5770bc9645..3ef717a3aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,80 @@ "version": "1.7.3", "hasInstallScript": true, "license": "GPL-2.0-or-later", + "workspaces": [ + "apps/*", + "tools/*" + ], + "devDependencies": { + "@automattic/wp-babel-makepot": "^1.2.0", + "@eslint/js": "^9.39.2", + "@playwright/test": "^1.58.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.1", + "@testing-library/user-event": "^14.6.1", + "@types/fs-extra": "^11.0.4", + "@vitest/ui": "^2.1.8", + "electron": "^39.2.7", + "electron-playwright-helpers": "^2.1.0", + "eslint": "^9.39.2", + "eslint-import-resolver-typescript": "^4.4.4", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jest-dom": "^5.5.0", + "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-studio": "file:tools/eslint-plugin-studio", + "fs-extra": "^11.3.3", + "isomorphic-fetch": "^3.0.0", + "jsdom": "^24.0.0", + "nock": "^13.5.6", + "patch-package": "^8.0.1", + "prettier": "npm:wp-prettier@3.0.3", + "rimraf": "^6.1.2", + "ts-node": "^10.9.2", + "typescript": "~5.9.3", + "typescript-eslint": "^8.53.0", + "vitest": "^2.1.8", + "web-streams-polyfill": "^4.2.0" + }, + "engines": { + "node": ">=22.0.0 <23.0.0", + "npm": ">=10.0.0 <11.0.0" + } + }, + "apps/cli": { + "name": "studio-cli", + "hasInstallScript": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/universal": "^3.0.46", + "@studio/common": "file:../../tools/common", + "@wp-playground/blueprints": "^3.0.46", + "@wp-playground/cli": "^3.0.46", + "@wp-playground/common": "^3.0.46", + "@wp-playground/storage": "^3.0.46", + "cli-table3": "^0.6.5", + "http-proxy": "^1.18.1", + "pm2": "^6.0.14", + "pm2-axon": "^4.0.1", + "trash": "^10.0.1", + "yargs": "^18.0.0", + "yargs-parser": "^22.0.0" + }, + "devDependencies": { + "@types/archiver": "^6.0.4", + "@types/http-proxy": "^1.17.17", + "@types/node-forge": "^1.3.14", + "@types/yargs": "^17.0.35", + "patch-package": "^8.0.1", + "vite": "^7.3.1", + "vite-plugin-static-copy": "^3.1.5" + } + }, + "apps/studio": { + "name": "studio-app", + "version": "1.7.3", + "hasInstallScript": true, + "license": "GPL-2.0-or-later", "dependencies": { "@automattic/generate-password": "^0.1.0", "@automattic/interpolate-components": "^1.2.1", @@ -18,11 +92,16 @@ "@reduxjs/toolkit": "^2.11.2", "@rive-app/react-canvas": "^4.12.0", "@sentry/electron": "^6.5.0", + "@sentry/react": "^7.120.3", + "@studio/common": "file:../../tools/common", "@vscode/sudo-prompt": "^9.3.1", + "@wordpress/components": "^32.1.0", "@wordpress/compose": "^7.36.0", "@wordpress/dataviews": "^11.3.0", + "@wordpress/element": "^6.39.0", "@wordpress/i18n": "^6.9.0", "@wordpress/icons": "^11.4.0", + "@wordpress/react-i18n": "^4.39.0", "@wp-playground/blueprints": "^3.0.46", "archiver": "^6.0.2", "atomically": "^2.1.0", @@ -33,7 +112,6 @@ "date-fns": "^3.3.1", "electron-squirrel-startup": "^1.0.1", "electron2appx": "^2.1.2", - "eslint-config-prettier": "^10.1.8", "express": "4.21.2", "fast-deep-equal": "^3.1.3", "file-stream-rotator": "^1.0.0", @@ -44,15 +122,17 @@ "lockfile": "^1.0.4", "node-forge": "^1.3.3", "ora": "^8.2.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-markdown": "^9.0.1", "react-redux": "^9.2.0", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", + "resize-observer-polyfill": "^1.5.1", "semver": "^7.7.3", "shell-quote": "^1.8.3", "strip-ansi": "^7.1.2", "tar": "^7.5.2", - "ts-node": "^10.9.2", "tus-js-client": "^4.3.1", "winreg": "1.2.4", "wpcom": "^7.1.1", @@ -64,72 +144,35 @@ }, "devDependencies": { "@automattic/color-studio": "^4.1.0", - "@automattic/wp-babel-makepot": "^1.2.0", "@electron-forge/cli": "^7.11.1", "@electron-forge/maker-deb": "^7.11.1", "@electron-forge/maker-dmg": "^7.11.1", "@electron-forge/maker-squirrel": "^7.11.1", "@electron-forge/maker-zip": "^7.11.1", "@electron-forge/plugin-auto-unpack-natives": "^7.11.1", - "@eslint/js": "^9.39.2", - "@playwright/test": "^1.58.1", - "@sentry/react": "^7.120.3", "@sentry/vite-plugin": "^4.3.0", - "@testing-library/jest-dom": "^6.9.1", - "@testing-library/react": "^16.3.1", - "@testing-library/user-event": "^14.6.1", "@types/archiver": "^6.0.4", "@types/follow-redirects": "^1.14.4", "@types/fs-extra": "^11.0.4", "@types/http-proxy": "^1.17.17", - "@types/lockfile": "^1.0.4", "@types/node-forge": "^1.3.14", "@types/react": "^18.3.27", "@types/react-dom": "^18.3.7", "@types/semver": "^7.7.1", "@types/shell-quote": "^1.7.5", "@types/winreg": "^1.2.36", - "@types/yargs": "^17.0.35", "@types/yauzl": "^2.10.3", "@vitejs/plugin-react": "^5.1.2", - "@vitest/ui": "^2.1.8", - "@wordpress/components": "^32.1.0", - "@wordpress/element": "^6.39.0", - "@wordpress/react-i18n": "^4.39.0", "electron": "^39.2.7", "electron-devtools-installer": "^4.0.0", - "electron-playwright-helpers": "^2.1.0", "electron-vite": "^5.0.0", - "eslint": "^9.39.2", - "eslint-import-resolver-typescript": "^4.4.4", - "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jest-dom": "^5.5.0", - "eslint-plugin-prettier": "^5.5.4", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-studio": "file:packages/eslint-plugin-studio", - "isomorphic-fetch": "^3.0.0", - "jsdom": "^24.0.0", - "nock": "^13.5.6", - "patch-package": "^8.0.0", + "patch-package": "^8.0.1", "postcss": "^8.4.32", - "prettier": "npm:wp-prettier@3.0.3", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "resize-observer-polyfill": "^1.5.1", - "rimraf": "^6.1.2", "tailwindcss": "^3.3.6", - "typescript": "~5.9.3", - "typescript-eslint": "^8.53.0", "vite": "^7.3.1", "vite-plugin-static-copy": "^3.1.5", "vite-plugin-top-level-await": "^1.6.0", - "vite-plugin-wasm": "^3.5.0", - "vitest": "^2.1.8", - "web-streams-polyfill": "^4.2.0" - }, - "engines": { - "node": ">=22.0.0 <23.0.0", - "npm": ">=10.0.0 <11.0.0" + "vite-plugin-wasm": "^3.5.0" }, "optionalDependencies": { "@rollup/rollup-linux-x64-gnu": "^4.50.2", @@ -4296,6 +4339,21 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "license": "MIT" + }, "node_modules/@listr2/prompt-adapter-inquirer": { "version": "2.0.22", "dev": true, @@ -4368,7 +4426,6 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -4380,7 +4437,6 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -4388,7 +4444,6 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -5461,6 +5516,23 @@ "node": ">=20.0.0" } }, + "node_modules/@php-wasm/cli-util": { + "version": "3.0.46", + "resolved": "https://registry.npmjs.org/@php-wasm/cli-util/-/cli-util-3.0.46.tgz", + "integrity": "sha512-FL9O1/B6x4rfoGI1yVFdEWaIfkKf+0TC91B188VOGAkZ12kASPktUwaS3xLKIFDXI3rysvv2afuoZx7/IoP4hg==", + "license": "GPL-2.0-or-later", + "dependencies": { + "fast-xml-parser": "5.3.0", + "jsonc-parser": "3.3.1" + }, + "engines": { + "node": ">=20.18.3", + "npm": ">=10.1.0" + }, + "optionalDependencies": { + "fs-ext": "2.1.1" + } + }, "node_modules/@php-wasm/fs-journal": { "version": "3.0.46", "license": "GPL-2.0-or-later", @@ -6378,134 +6450,618 @@ "node": ">=12" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@playwright/test": { - "version": "1.58.1", - "dev": true, - "license": "Apache-2.0", + "node_modules/@php-wasm/xdebug-bridge": { + "version": "3.0.46", + "resolved": "https://registry.npmjs.org/@php-wasm/xdebug-bridge/-/xdebug-bridge-3.0.46.tgz", + "integrity": "sha512-0KSeyQN/JMOCQsbu+W51LkmmW9UhVIkDf+qsginj8fQPOhX3iJSwaQR6x/utMz6wMcEDrktRIUZ8X9x0f7aOlg==", + "license": "GPL-2.0-or-later", "dependencies": { - "playwright": "1.58.1" + "@php-wasm/logger": "3.0.46", + "@php-wasm/node": "3.0.46", + "@php-wasm/universal": "3.0.46", + "@wp-playground/common": "3.0.46", + "express": "4.22.0", + "ini": "4.1.2", + "wasm-feature-detect": "1.8.0", + "ws": "8.18.3", + "xml2js": "0.6.2", + "yargs": "17.7.2" }, "bin": { - "playwright": "cli.js" + "xdebug-bridge": "xdebug-bridge.js" }, "engines": { - "node": ">=18" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "dev": true, - "license": "MIT" - }, - "node_modules/@prisma/instrumentation": { - "version": "6.11.1", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" + "node": ">=20.18.3", + "npm": ">=10.1.0" }, - "peerDependencies": { - "@opentelemetry/api": "^1.8" + "optionalDependencies": { + "fs-ext": "2.1.1" } }, - "node_modules/@reduxjs/toolkit": { - "version": "2.11.2", - "license": "MIT", + "node_modules/@php-wasm/xdebug-bridge/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@standard-schema/utils": "^0.3.0", - "immer": "^11.0.0", - "redux": "^5.0.1", - "redux-thunk": "^3.1.0", - "reselect": "^5.1.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } + "engines": { + "node": ">=12" } }, - "node_modules/@rive-app/canvas": { - "version": "2.18.0", - "license": "MIT" - }, - "node_modules/@rive-app/react-canvas": { - "version": "4.12.0", + "node_modules/@php-wasm/xdebug-bridge/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { - "@rive-app/canvas": "2.18.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "ms": "2.0.0" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.53", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/plugin-virtual": { - "version": "3.0.2", - "dev": true, + "node_modules/@php-wasm/xdebug-bridge/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "node": ">= 0.8" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.50.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.2.tgz", - "integrity": "sha512-uLN8NAiFVIRKX9ZQha8wy6UUs06UNSZ32xj6giK/rmMXAgKahwExvK6SsmgU5/brh4w/nSgj8e0k3c1HBQpa0A==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@php-wasm/xdebug-bridge/node_modules/express": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.0.tgz", + "integrity": "sha512-c2iPh3xp5vvCLgaHK03+mWLFPhox7j1LwyxcZwFVApEv5i0X+IjPpbT50SJJwwLpdBVfp45AkK/v+AFgv/XlfQ==", "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.50.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.2.tgz", - "integrity": "sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g==", - "cpu": [ - "arm64" + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@php-wasm/xdebug-bridge/node_modules/ini": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", + "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@php-wasm/xdebug-bridge/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/@php-wasm/xdebug-bridge/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/@php-wasm/xdebug-bridge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@php-wasm/xdebug-bridge/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@php-wasm/xdebug-bridge/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@playwright/test": { + "version": "1.58.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.58.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@pm2/agent": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.1.1.tgz", + "integrity": "sha512-0V9ckHWd/HSC8BgAbZSoq8KXUG81X97nSkAxmhKDhmF8vanyaoc1YXwc2KVkbWz82Rg4gjd2n9qiT3i7bdvGrQ==", + "license": "AGPL-3.0", + "dependencies": { + "async": "~3.2.0", + "chalk": "~3.0.0", + "dayjs": "~1.8.24", + "debug": "~4.3.1", + "eventemitter2": "~5.0.1", + "fast-json-patch": "^3.1.0", + "fclone": "~1.0.11", + "pm2-axon": "~4.0.1", + "pm2-axon-rpc": "~0.7.0", + "proxy-agent": "~6.4.0", + "semver": "~7.5.0", + "ws": "~7.5.10" + } + }, + "node_modules/@pm2/agent/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@pm2/agent/node_modules/dayjs": { + "version": "1.8.36", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz", + "integrity": "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==", + "license": "MIT" + }, + "node_modules/@pm2/agent/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@pm2/agent/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/agent/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/agent/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@pm2/agent/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/@pm2/blessed": { + "version": "0.1.81", + "resolved": "https://registry.npmjs.org/@pm2/blessed/-/blessed-0.1.81.tgz", + "integrity": "sha512-ZcNHqQjMuNRcQ7Z1zJbFIQZO/BDKV3KbiTckWdfbUaYhj7uNmUwb+FbdDWSCkvxNr9dBJQwvV17o6QBkAvgO0g==", + "license": "MIT", + "bin": { + "blessed": "bin/tput.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@pm2/io": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@pm2/io/-/io-6.1.0.tgz", + "integrity": "sha512-IxHuYURa3+FQ6BKePlgChZkqABUKFYH6Bwbw7V/pWU1pP6iR1sCI26l7P9ThUEB385ruZn/tZS3CXDUF5IA1NQ==", + "license": "Apache-2", + "dependencies": { + "async": "~2.6.1", + "debug": "~4.3.1", + "eventemitter2": "^6.3.1", + "require-in-the-middle": "^5.0.0", + "semver": "~7.5.4", + "shimmer": "^1.2.0", + "signal-exit": "^3.0.3", + "tslib": "1.9.3" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@pm2/io/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/@pm2/io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@pm2/io/node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", + "license": "MIT" + }, + "node_modules/@pm2/io/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/io/node_modules/require-in-the-middle": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", + "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@pm2/io/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/io/node_modules/tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "license": "Apache-2.0" + }, + "node_modules/@pm2/io/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/@pm2/js-api": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.8.0.tgz", + "integrity": "sha512-nmWzrA/BQZik3VBz+npRcNIu01kdBhWL0mxKmP1ciF/gTcujPTQqt027N9fc1pK9ERM8RipFhymw7RcmCyOEYA==", + "license": "Apache-2", + "dependencies": { + "async": "^2.6.3", + "debug": "~4.3.1", + "eventemitter2": "^6.3.1", + "extrareqp2": "^1.0.0", + "ws": "^7.0.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@pm2/js-api/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/@pm2/js-api/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@pm2/js-api/node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", + "license": "MIT" + }, + "node_modules/@pm2/js-api/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@pm2/pm2-version-check": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz", + "integrity": "sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.1" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@prisma/instrumentation": { + "version": "6.11.1", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.8" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.11.2", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@rive-app/canvas": { + "version": "2.18.0", + "license": "MIT" + }, + "node_modules/@rive-app/react-canvas": { + "version": "4.12.0", + "license": "MIT", + "dependencies": { + "@rive-app/canvas": "2.18.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-virtual": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.2.tgz", + "integrity": "sha512-uLN8NAiFVIRKX9ZQha8wy6UUs06UNSZ32xj6giK/rmMXAgKahwExvK6SsmgU5/brh4w/nSgj8e0k3c1HBQpa0A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.2.tgz", + "integrity": "sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g==", + "cpu": [ + "arm64" ], "dev": true, "license": "MIT", @@ -6814,7 +7370,6 @@ }, "node_modules/@sentry-internal/replay-canvas": { "version": "7.120.3", - "dev": true, "license": "MIT", "dependencies": { "@sentry/core": "7.120.3", @@ -6828,7 +7383,6 @@ }, "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry-internal/tracing": { "version": "7.120.3", - "dev": true, "license": "MIT", "dependencies": { "@sentry/core": "7.120.3", @@ -6841,7 +7395,6 @@ }, "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/core": { "version": "7.120.3", - "dev": true, "license": "MIT", "dependencies": { "@sentry/types": "7.120.3", @@ -6853,7 +7406,6 @@ }, "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/replay": { "version": "7.120.3", - "dev": true, "license": "MIT", "dependencies": { "@sentry-internal/tracing": "7.120.3", @@ -6867,7 +7419,6 @@ }, "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/types": { "version": "7.120.3", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6875,7 +7426,6 @@ }, "node_modules/@sentry-internal/replay-canvas/node_modules/@sentry/utils": { "version": "7.120.3", - "dev": true, "license": "MIT", "dependencies": { "@sentry/types": "7.120.3" @@ -7151,7 +7701,6 @@ }, "node_modules/@sentry/react": { "version": "7.120.3", - "dev": true, "license": "MIT", "dependencies": { "@sentry/browser": "7.120.3", @@ -7169,7 +7718,6 @@ }, "node_modules/@sentry/react/node_modules/@sentry-internal/feedback": { "version": "7.120.3", - "dev": true, "license": "MIT", "dependencies": { "@sentry/core": "7.120.3", @@ -7182,7 +7730,6 @@ }, "node_modules/@sentry/react/node_modules/@sentry-internal/tracing": { "version": "7.120.3", - "dev": true, "license": "MIT", "dependencies": { "@sentry/core": "7.120.3", @@ -7195,7 +7742,6 @@ }, "node_modules/@sentry/react/node_modules/@sentry/browser": { "version": "7.120.3", - "dev": true, "license": "MIT", "dependencies": { "@sentry-internal/feedback": "7.120.3", @@ -7213,7 +7759,6 @@ }, "node_modules/@sentry/react/node_modules/@sentry/core": { "version": "7.120.3", - "dev": true, "license": "MIT", "dependencies": { "@sentry/types": "7.120.3", @@ -7225,61 +7770,137 @@ }, "node_modules/@sentry/react/node_modules/@sentry/integrations": { "version": "7.120.3", + "license": "MIT", + "dependencies": { + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3", + "localforage": "^1.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/react/node_modules/@sentry/replay": { + "version": "7.120.3", + "license": "MIT", + "dependencies": { + "@sentry-internal/tracing": "7.120.3", + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sentry/react/node_modules/@sentry/types": { + "version": "7.120.3", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/react/node_modules/@sentry/utils": { + "version": "7.120.3", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.120.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/vite-plugin": { + "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { - "@sentry/core": "7.120.3", - "@sentry/types": "7.120.3", - "@sentry/utils": "7.120.3", - "localforage": "^1.8.1" + "@sentry/bundler-plugin-core": "4.3.0", + "unplugin": "1.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@sindresorhus/df": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/df/-/df-3.1.1.tgz", + "integrity": "sha512-SME/vtXaJcnQ/HpeV6P82Egy+jThn11IKfwW8+/XVoRD0rmPHVTeKMtww1oWdVnMykzVPjmrDN9S8NBndPEHCQ==", + "license": "MIT", + "dependencies": { + "execa": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sindresorhus/df/node_modules/execa": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=8" + "node": "^8.12.0 || >=9.7.0" } }, - "node_modules/@sentry/react/node_modules/@sentry/replay": { - "version": "7.120.3", - "dev": true, + "node_modules/@sindresorhus/df/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "license": "MIT", "dependencies": { - "@sentry-internal/tracing": "7.120.3", - "@sentry/core": "7.120.3", - "@sentry/types": "7.120.3", - "@sentry/utils": "7.120.3" + "pump": "^3.0.0" }, "engines": { - "node": ">=12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@sentry/react/node_modules/@sentry/types": { - "version": "7.120.3", - "dev": true, + "node_modules/@sindresorhus/df/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@sentry/react/node_modules/@sentry/utils": { - "version": "7.120.3", - "dev": true, + "node_modules/@sindresorhus/df/node_modules/npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", "license": "MIT", "dependencies": { - "@sentry/types": "7.120.3" + "path-key": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/@sentry/vite-plugin": { - "version": "4.3.0", - "dev": true, + "node_modules/@sindresorhus/df/node_modules/p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", "license": "MIT", - "dependencies": { - "@sentry/bundler-plugin-core": "4.3.0", - "unplugin": "1.0.1" - }, "engines": { - "node": ">= 14" + "node": ">=8" } }, "node_modules/@sindresorhus/is": { @@ -7293,6 +7914,18 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@standard-schema/spec": { "version": "1.0.0", "license": "MIT" @@ -7301,6 +7934,19 @@ "version": "0.3.0", "license": "MIT" }, + "node_modules/@stroncium/procfs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@stroncium/procfs/-/procfs-1.2.1.tgz", + "integrity": "sha512-X1Iui3FUNZP18EUvysTHxt+Avu2nlVzyf90YM8OYgP6SGzTzzX/0JgObfO1AQQDzuZtNNz29bVh8h5R97JrjxA==", + "license": "CC0-1.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/@studio/common": { + "resolved": "tools/common", + "link": true + }, "node_modules/@swc/core": { "version": "1.13.5", "devOptional": true, @@ -7343,12 +7989,12 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=10" } @@ -7497,6 +8143,12 @@ "node": ">= 10" } }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "license": "MIT" @@ -7645,6 +8297,8 @@ }, "node_modules/@types/fs-extra": { "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7701,6 +8355,8 @@ }, "node_modules/@types/jsonfile": { "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8782,7 +9438,6 @@ "version": "4.39.0", "resolved": "https://registry.npmjs.org/@wordpress/react-i18n/-/react-i18n-4.39.0.tgz", "integrity": "sha512-HWtv+KgBbiWbqVIGdNOUXMjI+fW0/ZARfHXIKGJnKLOHza/a0paulRmtYV6JazcNXs1kWNGG4GVKycM5kdNsLA==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/element": "^6.39.0", @@ -8844,85 +9499,285 @@ "memize": "^2.1.0" }, "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0", - "stylelint": "^16.8.2" + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0", + "stylelint": "^16.8.2" + }, + "peerDependenciesMeta": { + "stylelint": { + "optional": true + } + } + }, + "node_modules/@wordpress/ui": { + "version": "0.6.0", + "license": "GPL-2.0-or-later", + "dependencies": { + "@base-ui/react": "^1.0.0", + "@wordpress/a11y": "^4.39.0", + "@wordpress/element": "^6.39.0", + "@wordpress/i18n": "^6.12.0", + "@wordpress/icons": "^11.6.0", + "@wordpress/primitives": "^4.39.0", + "@wordpress/private-apis": "^1.39.0", + "@wordpress/theme": "^0.6.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/undo-manager": { + "version": "1.39.0", + "license": "GPL-2.0-or-later", + "dependencies": { + "@wordpress/is-shallow-equal": "^5.39.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/url": { + "version": "4.39.0", + "license": "GPL-2.0-or-later", + "dependencies": { + "remove-accents": "^0.5.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/warning": { + "version": "3.39.0", + "license": "GPL-2.0-or-later", + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wp-playground/blueprints": { + "version": "3.0.46", + "dependencies": { + "@php-wasm/logger": "3.0.46", + "@php-wasm/node": "3.0.46", + "@php-wasm/node-polyfills": "3.0.46", + "@php-wasm/progress": "3.0.46", + "@php-wasm/scopes": "3.0.46", + "@php-wasm/stream-compression": "3.0.46", + "@php-wasm/universal": "3.0.46", + "@php-wasm/util": "3.0.46", + "@php-wasm/web": "3.0.46", + "@wp-playground/common": "3.0.46", + "@wp-playground/storage": "3.0.46", + "@wp-playground/wordpress": "3.0.46", + "@zip.js/zip.js": "2.7.57", + "ajv": "8.12.0", + "async-lock": "1.4.1", + "clean-git-ref": "2.0.1", + "crc-32": "1.2.2", + "diff3": "0.0.4", + "express": "4.22.0", + "ignore": "5.3.2", + "ini": "4.1.2", + "minimisted": "2.0.1", + "octokit": "3.1.2", + "pako": "1.0.10", + "pify": "2.3.0", + "readable-stream": "3.6.2", + "selfsigned": "5.5.0", + "sha.js": "2.4.12", + "simple-get": "4.0.1", + "wasm-feature-detect": "1.8.0", + "ws": "8.18.3", + "yargs": "17.7.2" + }, + "engines": { + "node": ">=20.18.3", + "npm": ">=10.1.0" + }, + "optionalDependencies": { + "fs-ext": "2.1.1" + } + }, + "node_modules/@wp-playground/blueprints/node_modules/ajv": { + "version": "8.12.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@wp-playground/blueprints/node_modules/cliui": { + "version": "8.0.1", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@wp-playground/blueprints/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@wp-playground/blueprints/node_modules/encodeurl": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@wp-playground/blueprints/node_modules/express": { + "version": "4.22.0", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" }, - "peerDependenciesMeta": { - "stylelint": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@wordpress/ui": { - "version": "0.6.0", - "license": "GPL-2.0-or-later", - "dependencies": { - "@base-ui/react": "^1.0.0", - "@wordpress/a11y": "^4.39.0", - "@wordpress/element": "^6.39.0", - "@wordpress/i18n": "^6.12.0", - "@wordpress/icons": "^11.6.0", - "@wordpress/primitives": "^4.39.0", - "@wordpress/private-apis": "^1.39.0", - "@wordpress/theme": "^0.6.0", - "clsx": "^2.1.1" - }, + "node_modules/@wp-playground/blueprints/node_modules/ini": { + "version": "4.1.2", + "license": "ISC", "engines": { - "node": ">=20.10.0", - "npm": ">=10.2.3" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@wordpress/undo-manager": { - "version": "1.39.0", - "license": "GPL-2.0-or-later", + "node_modules/@wp-playground/blueprints/node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/@wp-playground/blueprints/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/@wp-playground/blueprints/node_modules/pako": { + "version": "1.0.10", + "license": "(MIT AND Zlib)" + }, + "node_modules/@wp-playground/blueprints/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/@wp-playground/blueprints/node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", "dependencies": { - "@wordpress/is-shallow-equal": "^5.39.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" + "node": ">=8" } }, - "node_modules/@wordpress/url": { - "version": "4.39.0", - "license": "GPL-2.0-or-later", + "node_modules/@wp-playground/blueprints/node_modules/yargs": { + "version": "17.7.2", + "license": "MIT", "dependencies": { - "remove-accents": "^0.5.0" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" + "node": ">=12" } }, - "node_modules/@wordpress/warning": { - "version": "3.39.0", - "license": "GPL-2.0-or-later", + "node_modules/@wp-playground/blueprints/node_modules/yargs-parser": { + "version": "21.1.1", + "license": "ISC", "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" + "node": ">=12" } }, - "node_modules/@wp-playground/blueprints": { + "node_modules/@wp-playground/cli": { "version": "3.0.46", + "resolved": "https://registry.npmjs.org/@wp-playground/cli/-/cli-3.0.46.tgz", + "integrity": "sha512-jf7LoA7skprotXCQjTw6K6o3yfnBUxlEFqPP7C9iSRViTpgnQ1A7UiGz+2klt5vlVCfVGix9YspnW1OT5ReT4A==", + "license": "GPL-2.0-or-later", "dependencies": { + "@php-wasm/cli-util": "3.0.46", "@php-wasm/logger": "3.0.46", "@php-wasm/node": "3.0.46", - "@php-wasm/node-polyfills": "3.0.46", "@php-wasm/progress": "3.0.46", - "@php-wasm/scopes": "3.0.46", - "@php-wasm/stream-compression": "3.0.46", "@php-wasm/universal": "3.0.46", "@php-wasm/util": "3.0.46", - "@php-wasm/web": "3.0.46", + "@php-wasm/xdebug-bridge": "3.0.46", + "@wp-playground/blueprints": "3.0.46", "@wp-playground/common": "3.0.46", "@wp-playground/storage": "3.0.46", "@wp-playground/wordpress": "3.0.46", @@ -8933,30 +9788,37 @@ "crc-32": "1.2.2", "diff3": "0.0.4", "express": "4.22.0", + "fast-xml-parser": "5.3.0", + "fs-extra": "11.1.1", "ignore": "5.3.2", "ini": "4.1.2", + "jsonc-parser": "3.3.1", "minimisted": "2.0.1", "octokit": "3.1.2", "pako": "1.0.10", "pify": "2.3.0", + "ps-man": "1.1.8", "readable-stream": "3.6.2", "selfsigned": "5.5.0", "sha.js": "2.4.12", "simple-get": "4.0.1", + "tmp-promise": "3.0.3", "wasm-feature-detect": "1.8.0", "ws": "8.18.3", + "xml2js": "0.6.2", "yargs": "17.7.2" }, - "engines": { - "node": ">=20.18.3", - "npm": ">=10.1.0" + "bin": { + "wp-playground-cli": "wp-playground.js" }, "optionalDependencies": { "fs-ext": "2.1.1" } }, - "node_modules/@wp-playground/blueprints/node_modules/ajv": { + "node_modules/@wp-playground/cli/node_modules/ajv": { "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -8969,8 +9831,10 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@wp-playground/blueprints/node_modules/cliui": { + "node_modules/@wp-playground/cli/node_modules/cliui": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -8981,22 +9845,28 @@ "node": ">=12" } }, - "node_modules/@wp-playground/blueprints/node_modules/debug": { + "node_modules/@wp-playground/cli/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" } }, - "node_modules/@wp-playground/blueprints/node_modules/encodeurl": { + "node_modules/@wp-playground/cli/node_modules/encodeurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/@wp-playground/blueprints/node_modules/express": { + "node_modules/@wp-playground/cli/node_modules/express": { "version": "4.22.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.0.tgz", + "integrity": "sha512-c2iPh3xp5vvCLgaHK03+mWLFPhox7j1LwyxcZwFVApEv5i0X+IjPpbT50SJJwwLpdBVfp45AkK/v+AFgv/XlfQ==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -9039,27 +9909,51 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@wp-playground/blueprints/node_modules/ini": { + "node_modules/@wp-playground/cli/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@wp-playground/cli/node_modules/ini": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", + "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@wp-playground/blueprints/node_modules/json-schema-traverse": { + "node_modules/@wp-playground/cli/node_modules/json-schema-traverse": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, - "node_modules/@wp-playground/blueprints/node_modules/ms": { + "node_modules/@wp-playground/cli/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/@wp-playground/blueprints/node_modules/pako": { + "node_modules/@wp-playground/cli/node_modules/pako": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", "license": "(MIT AND Zlib)" }, - "node_modules/@wp-playground/blueprints/node_modules/safe-buffer": { + "node_modules/@wp-playground/cli/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -9076,8 +9970,10 @@ ], "license": "MIT" }, - "node_modules/@wp-playground/blueprints/node_modules/strip-ansi": { + "node_modules/@wp-playground/cli/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -9086,8 +9982,10 @@ "node": ">=8" } }, - "node_modules/@wp-playground/blueprints/node_modules/yargs": { + "node_modules/@wp-playground/cli/node_modules/yargs": { "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -9102,8 +10000,10 @@ "node": ">=12" } }, - "node_modules/@wp-playground/blueprints/node_modules/yargs-parser": { + "node_modules/@wp-playground/cli/node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "license": "ISC", "engines": { "node": ">=12" @@ -9635,6 +10535,30 @@ "dev": true, "license": "MIT" }, + "node_modules/amp": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz", + "integrity": "sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==", + "license": "MIT" + }, + "node_modules/amp-message": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz", + "integrity": "sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg==", + "license": "MIT", + "dependencies": { + "amp": "0.3.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "dev": true, @@ -9680,6 +10604,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/ansis": { + "version": "4.0.0-node10", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.0.0-node10.tgz", + "integrity": "sha512-BRrU0Bo1X9dFGw6KgGz6hWrqQuOlVEDOzkb0QSLZY9sXHqA7pNj7yHPVJRz7y/rj4EOJ3d/D5uxH+ee9leYgsg==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/any-promise": { "version": "1.3.0", "dev": true, @@ -9687,7 +10620,6 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -9979,6 +10911,18 @@ "node": ">=12" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/async": { "version": "3.2.5", "license": "MIT" @@ -10136,13 +11080,21 @@ "baseline-browser-mapping": "dist/cli.js" } }, + "node_modules/basic-ftp": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.1.0.tgz", + "integrity": "sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/before-after-hook": { "version": "2.2.3", "license": "Apache-2.0" }, "node_modules/binary-extensions": { "version": "2.2.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -10163,6 +11115,12 @@ "dev": true, "license": "MIT" }, + "node_modules/bodec": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz", + "integrity": "sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==", + "license": "MIT" + }, "node_modules/body-parser": { "version": "1.20.3", "license": "MIT", @@ -10237,7 +11195,6 @@ }, "node_modules/braces": { "version": "3.0.3", - "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -10723,6 +11680,12 @@ "version": "0.7.0", "license": "MIT" }, + "node_modules/charm": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", + "integrity": "sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==", + "license": "MIT/X11" + }, "node_modules/check-error": { "version": "2.1.3", "dev": true, @@ -10733,7 +11696,6 @@ }, "node_modules/chokidar": { "version": "3.6.0", - "dev": true, "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -10756,7 +11718,6 @@ }, "node_modules/chokidar/node_modules/glob-parent": { "version": "5.1.2", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -10787,6 +11748,18 @@ "license": "MIT", "optional": true }, + "node_modules/chunkify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chunkify/-/chunkify-5.0.0.tgz", + "integrity": "sha512-G8dj/3/Gm+1yL4oWSdwIxihZWFlgC4V2zYtIApacI0iPIRKBHlBGOGAiDUBZgrj4H8MBA8g8fPFwnJrWF3wl7Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ci-info": { "version": "3.9.0", "dev": true, @@ -10853,6 +11826,30 @@ "@colors/colors": "1.5.0" } }, + "node_modules/cli-tableau": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz", + "integrity": "sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==", + "dependencies": { + "chalk": "3.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/cli-tableau/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cli-truncate": { "version": "3.1.0", "dev": true, @@ -11048,6 +12045,10 @@ "node": ">=16" } }, + "node_modules/compare-perf": { + "resolved": "tools/compare-perf", + "link": true + }, "node_modules/compare-version": { "version": "0.1.2", "dev": true, @@ -11268,6 +12269,12 @@ "version": "1.1.1", "license": "MIT" }, + "node_modules/croner": { + "version": "4.1.97", + "resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz", + "integrity": "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==", + "license": "MIT" + }, "node_modules/cross-dirname": { "version": "0.1.0", "dev": true, @@ -11351,10 +12358,25 @@ "version": "3.2.3", "license": "MIT" }, + "node_modules/culvert": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz", + "integrity": "sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==", + "license": "MIT" + }, "node_modules/custom-error-instance": { "version": "2.1.1", "license": "ISC" }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/data-urls": { "version": "5.0.0", "dev": true, @@ -11427,6 +12449,12 @@ "version": "4.1.0-0", "license": "MIT" }, + "node_modules/dayjs": { + "version": "1.11.15", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.15.tgz", + "integrity": "sha512-MC+DfnSWiM9APs7fpiurHGCoeIx0Gdl6QZBy+5lu8MbYKN5FZEXqOgrundfibdfhGZ15o9hzmZ2xJjZnbvgKXQ==", + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.3", "license": "MIT", @@ -11550,6 +12578,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "license": "MIT", @@ -12269,7 +13311,6 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", - "devOptional": true, "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -12287,6 +13328,18 @@ "node": ">=10.13.0" } }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/entities": { "version": "6.0.1", "license": "BSD-2-Clause", @@ -12524,6 +13577,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/eslint": { "version": "9.39.2", "license": "MIT", @@ -12583,7 +13666,10 @@ }, "node_modules/eslint-config-prettier": { "version": "10.1.8", + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -12833,7 +13919,7 @@ } }, "node_modules/eslint-plugin-studio": { - "resolved": "packages/eslint-plugin-studio", + "resolved": "tools/eslint-plugin-studio", "link": true }, "node_modules/eslint-scope": { @@ -12914,6 +14000,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.5.0", "license": "BSD-3-Clause", @@ -12986,6 +14085,12 @@ "node": ">= 0.6" } }, + "node_modules/eventemitter2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", + "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==", + "license": "MIT" + }, "node_modules/eventemitter3": { "version": "4.0.7", "license": "MIT" @@ -13273,6 +14378,15 @@ "fd-slicer": "~1.1.0" } }, + "node_modules/extrareqp2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/extrareqp2/-/extrareqp2-1.0.0.tgz", + "integrity": "sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" @@ -13287,15 +14401,16 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "dev": true, + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -13303,7 +14418,6 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -13312,6 +14426,12 @@ "node": ">= 6" } }, + "node_modules/fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", + "license": "MIT" + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "license": "MIT" @@ -13339,14 +14459,37 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fast-xml-parser": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.0.tgz", + "integrity": "sha512-gkWGshjYcQCF+6qtlrqBqELqNqnt4CxruY6UVAWWnqb3DQ6qaNFEIKqzYep1XzHLM/QtrHVCxyPOtTk4LTQ7Aw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.16.0", - "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, + "node_modules/fclone": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", + "integrity": "sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==", + "license": "MIT" + }, "node_modules/fd-slicer": { "version": "1.1.0", "dev": true, @@ -13417,7 +14560,6 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -13682,7 +14824,9 @@ } }, "node_modules/fs-extra": { - "version": "11.3.2", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -13719,6 +14863,7 @@ }, "node_modules/fs-xattr": { "version": "0.3.1", + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -13734,7 +14879,6 @@ }, "node_modules/fsevents": { "version": "2.3.3", - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -13962,6 +15106,20 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/gettext-parser": { "version": "1.4.0", "license": "MIT", @@ -13970,6 +15128,18 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/git-node-fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz", + "integrity": "sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ==", + "license": "MIT" + }, + "node_modules/git-sha1": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz", + "integrity": "sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==", + "license": "MIT" + }, "node_modules/glob": { "version": "7.2.3", "dev": true, @@ -14060,6 +15230,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/globby/node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/good-listener": { "version": "1.2.2", "license": "MIT", @@ -14523,7 +15734,6 @@ }, "node_modules/immediate": { "version": "3.0.6", - "dev": true, "license": "MIT" }, "node_modules/immer": { @@ -14822,7 +16032,6 @@ }, "node_modules/ip-address": { "version": "10.1.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 12" @@ -14908,7 +16117,6 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -15079,6 +16287,39 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "2.0.0", "license": "MIT", @@ -15135,7 +16376,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -15156,6 +16396,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-object": { "version": "5.0.0", "license": "MIT", @@ -15390,6 +16642,24 @@ "version": "3.7.8", "license": "BSD-3-Clause" }, + "node_modules/js-git": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz", + "integrity": "sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==", + "license": "MIT", + "dependencies": { + "bodec": "^0.1.0", + "culvert": "^0.1.2", + "git-sha1": "^0.1.2", + "pako": "^0.2.5" + } + }, + "node_modules/js-git/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" + }, "node_modules/js-tokens": { "version": "4.0.0", "license": "MIT" @@ -15520,7 +16790,7 @@ }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/json5": { @@ -15534,6 +16804,12 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, "node_modules/jsonfile": { "version": "6.1.0", "license": "MIT", @@ -15839,7 +17115,6 @@ }, "node_modules/localforage": { "version": "1.10.0", - "dev": true, "license": "Apache-2.0", "dependencies": { "lie": "3.1.1" @@ -15847,7 +17122,6 @@ }, "node_modules/localforage/node_modules/lie": { "version": "3.1.1", - "dev": true, "license": "MIT", "dependencies": { "immediate": "~3.0.5" @@ -16137,6 +17411,7 @@ }, "node_modules/macos-alias": { "version": "0.2.12", + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -16516,12 +17791,10 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "dev": true, "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -17043,7 +18316,6 @@ }, "node_modules/micromatch": { "version": "4.0.8", - "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -17082,7 +18354,6 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -17233,7 +18504,6 @@ }, "node_modules/mkdirp": { "version": "1.0.4", - "dev": true, "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" @@ -17274,10 +18544,45 @@ "version": "11.18.1", "license": "MIT" }, + "node_modules/mount-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mount-point/-/mount-point-3.0.0.tgz", + "integrity": "sha512-jAhfD7ZCG+dbESZjcY1SdFVFqSJkh/yGbdsifHcPkvuLRO5ugK0Ssmd9jdATu29BTd4JiN+vkpMzVvsUgP3SZA==", + "license": "MIT", + "dependencies": { + "@sindresorhus/df": "^1.0.1", + "pify": "^2.3.0", + "pinkie-promise": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mount-point/node_modules/@sindresorhus/df": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/df/-/df-1.0.1.tgz", + "integrity": "sha512-1Hyp7NQnD/u4DSxR2DGW78TF9k7R0wZ8ev0BpMAIzA6yTQSHqNb5wTuvtcPYf4FWbVse2rW7RgDsyL8ua2vXHw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/mousetrap": { "version": "1.6.5", "license": "Apache-2.0 WITH LLVM-exception" }, + "node_modules/move-file": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/move-file/-/move-file-4.1.0.tgz", + "integrity": "sha512-YE06K9XLIvMlqSfoZTl32qvbZLPgL70Za41wS8pEhsSOhy71xz2fn8J07nuz/LEEtPSuUzLUFGAJSx499eKDSw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mrmime": { "version": "2.0.1", "dev": true, @@ -17371,6 +18676,32 @@ "version": "1.4.0", "license": "MIT" }, + "node_modules/needle": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/negotiator": { "version": "0.6.3", "license": "MIT", @@ -17383,6 +18714,15 @@ "dev": true, "license": "MIT" }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/nice-try": { "version": "1.0.5", "devOptional": true, @@ -17698,7 +19038,6 @@ }, "node_modules/onetime": { "version": "5.1.2", - "dev": true, "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -17859,6 +19198,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", "license": "MIT", @@ -17934,24 +19282,105 @@ "p-limit": "^3.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/p-map": { - "version": "4.0.0", - "dev": true, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", "license": "MIT", "dependencies": { - "aggregate-error": "^3.0.0" + "degenerator": "^5.0.0", + "netmask": "^2.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 14" } }, "node_modules/package-json-from-dist": { @@ -18069,6 +19498,8 @@ }, "node_modules/patch-package": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz", + "integrity": "sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==", "dev": true, "license": "MIT", "dependencies": { @@ -18268,7 +19699,6 @@ }, "node_modules/picomatch": { "version": "2.3.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -18277,6 +19707,38 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidusage": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-3.0.2.tgz", + "integrity": "sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pidusage/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/pify": { "version": "2.3.0", "license": "MIT", @@ -18284,6 +19746,27 @@ "node": ">=0.10.0" } }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pirates": { "version": "4.0.7", "dev": true, @@ -18370,6 +19853,182 @@ "node": ">=10.4.0" } }, + "node_modules/pm2": { + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/pm2/-/pm2-6.0.14.tgz", + "integrity": "sha512-wX1FiFkzuT2H/UUEA8QNXDAA9MMHDsK/3UHj6Dkd5U7kxyigKDA5gyDw78ycTQZAuGCLWyUX5FiXEuVQWafukA==", + "license": "AGPL-3.0", + "dependencies": { + "@pm2/agent": "~2.1.1", + "@pm2/blessed": "0.1.81", + "@pm2/io": "~6.1.0", + "@pm2/js-api": "~0.8.0", + "@pm2/pm2-version-check": "^1.0.4", + "ansis": "4.0.0-node10", + "async": "3.2.6", + "chokidar": "3.6.0", + "cli-tableau": "2.0.1", + "commander": "2.15.1", + "croner": "4.1.97", + "dayjs": "1.11.15", + "debug": "4.4.3", + "enquirer": "2.3.6", + "eventemitter2": "5.0.1", + "fclone": "1.0.11", + "js-yaml": "4.1.1", + "mkdirp": "1.0.4", + "needle": "2.4.0", + "pidusage": "3.0.2", + "pm2-axon": "~4.0.1", + "pm2-axon-rpc": "~0.7.1", + "pm2-deploy": "~1.0.2", + "pm2-multimeter": "^0.1.2", + "promptly": "2.2.0", + "semver": "7.7.2", + "source-map-support": "0.5.21", + "sprintf-js": "1.1.2", + "vizion": "~2.2.1" + }, + "bin": { + "pm2": "bin/pm2", + "pm2-dev": "bin/pm2-dev", + "pm2-docker": "bin/pm2-docker", + "pm2-runtime": "bin/pm2-runtime" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "pm2-sysmonit": "^1.2.8" + } + }, + "node_modules/pm2-axon": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz", + "integrity": "sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==", + "license": "MIT", + "dependencies": { + "amp": "~0.3.1", + "amp-message": "~0.1.1", + "debug": "^4.3.1", + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=5" + } + }, + "node_modules/pm2-axon-rpc": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz", + "integrity": "sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.1" + }, + "engines": { + "node": ">=5" + } + }, + "node_modules/pm2-deploy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz", + "integrity": "sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==", + "license": "MIT", + "dependencies": { + "run-series": "^1.1.8", + "tv4": "^1.3.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pm2-multimeter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz", + "integrity": "sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA==", + "license": "MIT/X11", + "dependencies": { + "charm": "~0.1.1" + } + }, + "node_modules/pm2-sysmonit": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz", + "integrity": "sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==", + "license": "Apache", + "optional": true, + "dependencies": { + "async": "^3.2.0", + "debug": "^4.3.1", + "pidusage": "^2.0.21", + "systeminformation": "^5.7", + "tx2": "~1.0.4" + } + }, + "node_modules/pm2-sysmonit/node_modules/pidusage": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", + "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", + "license": "MIT", + "optional": true, + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pm2-sysmonit/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true + }, + "node_modules/pm2/node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/pm2/node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "license": "MIT" + }, + "node_modules/pm2/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pm2/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "license": "BSD-3-Clause" + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "license": "MIT", @@ -18568,6 +20227,18 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/powershell-utils": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.0.tgz", + "integrity": "sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "license": "MIT", @@ -18670,6 +20341,15 @@ "node": ">=10" } }, + "node_modules/promptly": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz", + "integrity": "sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==", + "license": "MIT", + "dependencies": { + "read": "^1.0.4" + } + }, "node_modules/propagate": { "version": "2.0.1", "dev": true, @@ -18706,9 +20386,91 @@ "node": ">= 0.10" } }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-agent/node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", - "dev": true, + "license": "MIT" + }, + "node_modules/ps-man": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ps-man/-/ps-man-1.1.8.tgz", + "integrity": "sha512-ZKDPZwHLYVWIk/Q75N7jCFbuQyokSg2+3WBlt8l35S/uBvxoc+LiRUbb3RUt83pwW82dzwiCpoQIHd9PAxUzHg==", "license": "MIT" }, "node_modules/psl": { @@ -18724,7 +20486,6 @@ }, "node_modules/pump": { "version": "3.0.0", - "devOptional": true, "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -18771,7 +20532,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "dev": true, "funding": [ { "type": "github", @@ -18961,6 +20721,18 @@ "node": ">=0.10.0" } }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/read-binary-file-arch": { "version": "1.0.6", "dev": true, @@ -19115,7 +20887,6 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -19412,7 +21183,6 @@ }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", - "dev": true, "license": "MIT" }, "node_modules/resolve": { @@ -19488,7 +21258,6 @@ }, "node_modules/reusify": { "version": "1.0.4", - "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -19677,7 +21446,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "dev": true, "funding": [ { "type": "github", @@ -19697,10 +21465,39 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/run-series": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", + "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/rungen": { "version": "0.3.2", "license": "MIT" }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-array-concat": { "version": "1.1.3", "dev": true, @@ -19754,10 +21551,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" - }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, "node_modules/saxes": { "version": "6.0.0", "dev": true, @@ -20185,6 +21991,21 @@ "simple-concat": "^1.0.0" } }, + "node_modules/simple-git": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz", + "integrity": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==", + "license": "MIT", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, "node_modules/sirv": { "version": "3.0.2", "dev": true, @@ -20198,6 +22019,18 @@ "node": ">=18" } }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/slice-ansi": { "version": "5.0.0", "dev": true, @@ -20237,7 +22070,6 @@ }, "node_modules/smart-buffer": { "version": "4.2.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 6.0.0", @@ -20254,7 +22086,6 @@ }, "node_modules/socks": { "version": "2.8.7", - "dev": true, "license": "MIT", "dependencies": { "ip-address": "^10.0.1", @@ -20280,7 +22111,6 @@ }, "node_modules/source-map": { "version": "0.6.1", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -20296,7 +22126,6 @@ }, "node_modules/source-map-support": { "version": "0.5.21", - "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -20599,6 +22428,15 @@ "node": ">=0.10.0" } }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/strip-indent": { "version": "3.0.0", "dev": true, @@ -20639,6 +22477,18 @@ "node": ">=0.8.0" } }, + "node_modules/strnum": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", + "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/stubborn-fs": { "version": "2.0.0", "license": "MIT", @@ -20650,6 +22500,14 @@ "version": "1.0.2", "license": "MIT" }, + "node_modules/studio-app": { + "resolved": "apps/studio", + "link": true + }, + "node_modules/studio-cli": { + "resolved": "apps/cli", + "link": true + }, "node_modules/style-to-object": { "version": "1.0.6", "license": "MIT", @@ -20819,6 +22677,33 @@ "url": "https://opencollective.com/synckit" } }, + "node_modules/systeminformation": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.30.7.tgz", + "integrity": "sha512-33B/cftpaWdpvH+Ho9U1b08ss8GQuLxrWHelbJT1yw4M48Taj8W3ezcPuaLoIHZz5V6tVHuQPr5BprEfnBLBMw==", + "license": "MIT", + "optional": true, + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, "node_modules/tabbable": { "version": "6.4.0", "license": "MIT" @@ -21162,7 +23047,6 @@ }, "node_modules/tmp": { "version": "0.2.5", - "dev": true, "license": "MIT", "engines": { "node": ">=14.14" @@ -21170,9 +23054,7 @@ }, "node_modules/tmp-promise": { "version": "3.0.3", - "dev": true, "license": "MIT", - "optional": true, "dependencies": { "tmp": "^0.2.0" } @@ -21225,7 +23107,6 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -21282,6 +23163,41 @@ "node": ">=18" } }, + "node_modules/trash": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/trash/-/trash-10.1.0.tgz", + "integrity": "sha512-gOs9Hd1XMiJfORccP8KJNDmrSJ7YqO1CNt9lGOiBiydyBJab7Eaefkc/wj50b8lTtpB/4/VgezREs9NULOm42A==", + "license": "MIT", + "dependencies": { + "@stroncium/procfs": "^1.2.1", + "chunkify": "^5.0.0", + "globby": "^14.1.0", + "is-path-inside": "^4.0.0", + "move-file": "^4.1.0", + "p-map": "^7.0.3", + "powershell-utils": "^0.2.0", + "wsl-utils": "^0.4.0", + "xdg-trashdir": "^3.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/trash/node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/trim-lines": { "version": "3.0.1", "license": "MIT", @@ -21335,6 +23251,8 @@ }, "node_modules/ts-node": { "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -21452,6 +23370,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tv4": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", + "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==", + "license": [ + { + "type": "Public Domain", + "url": "http://geraintluff.github.io/tv4/LICENSE.txt" + }, + { + "type": "MIT", + "url": "http://jsonary.com/LICENSE.txt" + } + ], + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tx2": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tx2/-/tx2-1.0.5.tgz", + "integrity": "sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==", + "license": "MIT", + "optional": true, + "dependencies": { + "json-stringify-safe": "^5.0.1" + } + }, "node_modules/type-check": { "version": "0.4.0", "license": "MIT", @@ -21632,6 +23578,18 @@ "node": ">=4" } }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unified": { "version": "11.0.4", "license": "MIT", @@ -21936,6 +23894,18 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==", + "license": "MIT", + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/username": { "version": "5.1.0", "dev": true, @@ -21954,7 +23924,6 @@ }, "node_modules/utility-types": { "version": "3.11.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -22594,6 +24563,36 @@ } } }, + "node_modules/vizion": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz", + "integrity": "sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==", + "license": "Apache-2.0", + "dependencies": { + "async": "^2.6.3", + "git-node-fs": "^1.0.0", + "ini": "^1.3.5", + "js-git": "^0.7.8" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vizion/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/vizion/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "dev": true, @@ -23042,6 +25041,73 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.4.0.tgz", + "integrity": "sha512-9YmF+2sFEd+T7TkwlmE337F0IVzfDvDknhtpBQxxXzEOfgPphGlFYpyx0cTuCIFj8/p+sqwBYAeGxOMNSzPPDA==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/xdg-trashdir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/xdg-trashdir/-/xdg-trashdir-3.1.0.tgz", + "integrity": "sha512-N1XQngeqMBoj9wM4ZFadVV2MymImeiFfYD+fJrNlcVcOHsJFFQe7n3b+aBoTPwARuq2HQxukfzVpQmAk1gN4sQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/df": "^3.1.1", + "mount-point": "^3.0.0", + "user-home": "^2.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/xml-name-validator": { "version": "5.0.0", "dev": true, @@ -23050,6 +25116,28 @@ "node": ">=18" } }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, "node_modules/xmlbuilder": { "version": "15.1.1", "dev": true, @@ -23204,9 +25292,107 @@ "url": "https://github.com/sponsors/wooorm" } }, - "packages/eslint-plugin-studio": { + "tools/common": { + "name": "@studio/common", + "version": "1.0.0", + "dependencies": { + "@automattic/generate-password": "^0.1.0", + "@wordpress/i18n": "^6.9.0", + "@wp-playground/blueprints": "^3.0.46", + "cross-port-killer": "^1.4.0", + "date-fns": "^3.3.1", + "fast-deep-equal": "^3.1.3", + "fs-extra": "^11.3.2", + "lockfile": "^1.0.4", + "yauzl": "^3.2.0", + "zod": "^4.0.0" + }, + "devDependencies": { + "@types/fs-extra": "^11.0.4", + "@types/lockfile": "^1.0.4", + "@types/yauzl": "^2.10.3" + } + }, + "tools/compare-perf": { + "version": "0.0.1", + "license": "GPLv2", + "dependencies": { + "chalk": "^4.1.2", + "commander": "^13.1.0", + "inquirer": "^12.5.0", + "simple-git": "^3.27.0", + "ts-node": "^10.9.2" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "typescript": "^5.0.0" + } + }, + "tools/compare-perf/node_modules/@types/node": { + "version": "20.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", + "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "tools/compare-perf/node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "tools/compare-perf/node_modules/inquirer": { + "version": "12.11.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.11.1.tgz", + "integrity": "sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/prompts": "^7.10.1", + "@inquirer/type": "^3.0.10", + "mute-stream": "^2.0.0", + "run-async": "^4.0.6", + "rxjs": "^7.8.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "tools/compare-perf/node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "tools/compare-perf/node_modules/run-async": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz", + "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "tools/eslint-plugin-studio": { "version": "1.0.0", - "dev": true, "dependencies": { "eslint": "^9.0.0" } diff --git a/package.json b/package.json index ee31dd0a32..a2c7a0ef90 100644 --- a/package.json +++ b/package.json @@ -17,153 +17,69 @@ "url": "https://github.com/Automattic/studio.git", "directory": "/" }, + "workspaces": [ + "apps/*", + "tools/*" + ], "scripts": { "prestart": "npm run cli:build", - "start": "electron-vite dev --outDir=dist --watch", - "start-wayland": "npm run prestart && electron-forge start -- --enable-features=UseOzonePlatform --ozone-platform=wayland .", - "postinstall": "cd cli && npm install && cd .. && patch-package && ts-node ./scripts/download-wp-server-files.ts && node ./scripts/download-available-site-translations.mjs && npx @electron/rebuild -o fs-ext", - "package": "electron-vite build --outDir=dist && electron-forge package", - "make": "electron-vite build --outDir=dist && electron-forge make", - "make:windows-x64": "electron-vite build --outDir=dist && electron-forge make --arch=x64 --platform=win32", - "make:windows-arm64": "electron-vite build --outDir=dist && electron-forge make --arch=arm64 --platform=win32", - "make:macos-x64": "electron-vite build --outDir=dist && SKIP_DMG=true FILE_ARCHITECTURE=x64 electron-forge make --arch=x64 --platform=darwin", - "make:macos-arm64": "electron-vite build --outDir=dist && SKIP_DMG=true FILE_ARCHITECTURE=arm64 electron-forge make --arch=arm64 --platform=darwin", + "start": "electron-vite dev --config apps/studio/electron.vite.config.ts --outDir=dist --watch", + "start-wayland": "npm -w studio-app run start-wayland", + "postinstall": "patch-package && ts-node ./scripts/download-wp-server-files.ts && node ./scripts/download-available-site-translations.mjs && npx @electron/rebuild -o fs-ext", + "package": "npm -w studio-app run package", + "make": "npm -w studio-app run make", + "make:windows-x64": "npm -w studio-app run make:windows-x64", + "make:windows-arm64": "npm -w studio-app run make:windows-arm64", + "make:macos-x64": "npm -w studio-app run make:macos-x64", + "make:macos-arm64": "npm -w studio-app run make:macos-arm64", "make:dmg-x64": "FILE_ARCHITECTURE=x64 node ./scripts/make-dmg.mjs", "make:dmg-arm64": "FILE_ARCHITECTURE=arm64 node ./scripts/make-dmg.mjs", - "publish": "electron-forge publish", - "cli:build": "vite build --config vite.cli.config.ts", - "cli:watch": "vite build --config vite.cli.config.ts --watch", - "lint": "eslint {cli,common,src,e2e}", + "publish": "npm -w studio-app run publish", + "cli:build": "npm -w studio-cli run build", + "cli:watch": "npm -w studio-cli run watch", + "cli:install:bundle": "npm -w studio-cli run install:bundle", + "cli:build:bundle": "npm run cli:install:bundle && npm run cli:build", + "app:install:bundle": "npm -w studio-app run install:bundle", + "compare:perf": "npm -w compare-perf run compare", + "lint": "eslint {apps/cli,apps/studio/src,apps/studio/e2e,tools/common,tools/eslint-plugin-studio}", "format": "prettier . --write", "test": "vitest run", "test:watch": "vitest", "e2e": "npx playwright install && npx playwright test", - "test:metrics": "npx playwright test --config=./metrics/playwright.metrics.config.ts", + "test:metrics": "npx playwright test --config=./tools/metrics/playwright.metrics.config.ts", "make-pot": "node ./scripts/make-pot.mjs" }, "devDependencies": { - "@automattic/color-studio": "^4.1.0", "@automattic/wp-babel-makepot": "^1.2.0", - "@electron-forge/cli": "^7.11.1", - "@electron-forge/maker-deb": "^7.11.1", - "@electron-forge/maker-dmg": "^7.11.1", - "@electron-forge/maker-squirrel": "^7.11.1", - "@electron-forge/maker-zip": "^7.11.1", - "@electron-forge/plugin-auto-unpack-natives": "^7.11.1", "@eslint/js": "^9.39.2", "@playwright/test": "^1.58.1", - "@sentry/react": "^7.120.3", - "@sentry/vite-plugin": "^4.3.0", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.1", "@testing-library/user-event": "^14.6.1", - "@types/archiver": "^6.0.4", - "@types/follow-redirects": "^1.14.4", "@types/fs-extra": "^11.0.4", - "@types/http-proxy": "^1.17.17", - "@types/lockfile": "^1.0.4", - "@types/node-forge": "^1.3.14", - "@types/react": "^18.3.27", - "@types/react-dom": "^18.3.7", - "@types/semver": "^7.7.1", - "@types/shell-quote": "^1.7.5", - "@types/winreg": "^1.2.36", - "@types/yargs": "^17.0.35", - "@types/yauzl": "^2.10.3", - "@vitejs/plugin-react": "^5.1.2", "@vitest/ui": "^2.1.8", - "@wordpress/components": "^32.1.0", - "@wordpress/element": "^6.39.0", - "@wordpress/react-i18n": "^4.39.0", "electron": "^39.2.7", - "electron-devtools-installer": "^4.0.0", "electron-playwright-helpers": "^2.1.0", - "electron-vite": "^5.0.0", "eslint": "^9.39.2", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest-dom": "^5.5.0", "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-studio": "file:packages/eslint-plugin-studio", + "eslint-plugin-studio": "file:tools/eslint-plugin-studio", + "fs-extra": "^11.3.3", "isomorphic-fetch": "^3.0.0", "jsdom": "^24.0.0", "nock": "^13.5.6", - "patch-package": "^8.0.0", - "postcss": "^8.4.32", + "patch-package": "^8.0.1", "prettier": "npm:wp-prettier@3.0.3", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "resize-observer-polyfill": "^1.5.1", "rimraf": "^6.1.2", - "tailwindcss": "^3.3.6", + "ts-node": "^10.9.2", "typescript": "~5.9.3", "typescript-eslint": "^8.53.0", - "vite": "^7.3.1", - "vite-plugin-static-copy": "^3.1.5", - "vite-plugin-top-level-await": "^1.6.0", - "vite-plugin-wasm": "^3.5.0", "vitest": "^2.1.8", "web-streams-polyfill": "^4.2.0" }, - "dependencies": { - "@automattic/generate-password": "^0.1.0", - "@automattic/interpolate-components": "^1.2.1", - "@formatjs/intl-locale": "^3.4.5", - "@formatjs/intl-localematcher": "^0.5.4", - "@inquirer/prompts": "^7.10.1", - "@reduxjs/toolkit": "^2.11.2", - "@rive-app/react-canvas": "^4.12.0", - "@sentry/electron": "^6.5.0", - "@vscode/sudo-prompt": "^9.3.1", - "@wordpress/compose": "^7.36.0", - "@wordpress/dataviews": "^11.3.0", - "@wordpress/i18n": "^6.9.0", - "@wordpress/icons": "^11.4.0", - "archiver": "^6.0.2", - "atomically": "^2.1.0", - "cli-table3": "^0.6.5", - "compressible": "2.0.18", - "compression": "^1.8.1", - "cross-port-killer": "^1.4.0", - "date-fns": "^3.3.1", - "electron-squirrel-startup": "^1.0.1", - "electron2appx": "^2.1.2", - "eslint-config-prettier": "^10.1.8", - "express": "4.21.2", - "fast-deep-equal": "^3.1.3", - "file-stream-rotator": "^1.0.0", - "follow-redirects": "^1.15.11", - "fs-extra": "^11.3.2", - "hpagent": "1.2.0", - "http-proxy": "^1.18.1", - "lockfile": "^1.0.4", - "node-forge": "^1.3.3", - "ora": "^8.2.0", - "react-markdown": "^9.0.1", - "react-redux": "^9.2.0", - "rehype-raw": "^7.0.0", - "remark-gfm": "^4.0.1", - "semver": "^7.7.3", - "shell-quote": "^1.8.3", - "strip-ansi": "^7.1.2", - "tar": "^7.5.2", - "ts-node": "^10.9.2", - "tus-js-client": "^4.3.1", - "winreg": "1.2.4", - "wpcom": "^7.1.1", - "wpcom-xhr-request": "^1.3.0", - "yargs": "^18.0.0", - "@wp-playground/blueprints": "^3.0.46", - "yargs-parser": "^22.0.0", - "yauzl": "^3.2.0", - "zod": "^4.0.0" - }, - "optionalDependencies": { - "appdmg": "^0.6.6", - "@rollup/rollup-win32-x64-msvc": "^4.50.2", - "@rollup/rollup-linux-x64-gnu": "^4.50.2" - }, "overrides": { "fs-ext": { "nan": "2.24.0" diff --git a/cli/patches/pm2+6.0.14.patch b/patches/pm2+6.0.14.patch similarity index 100% rename from cli/patches/pm2+6.0.14.patch rename to patches/pm2+6.0.14.patch diff --git a/cli/patches/ps-man+1.1.8.patch b/patches/ps-man+1.1.8.patch similarity index 100% rename from cli/patches/ps-man+1.1.8.patch rename to patches/ps-man+1.1.8.patch diff --git a/playwright.config.ts b/playwright.config.ts index 784c677243..a1ca088201 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from '@playwright/test'; export default defineConfig( { - testDir: './e2e', + testDir: './apps/studio/e2e', snapshotPathTemplate: '{testDir}/__screenshots__/{testFilePath}/{arg}{ext}', // The app only allows a single instance to be running at a time, so we can diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index b0c1e3b539..0000000000 --- a/postcss.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - }, -}; diff --git a/scripts/compare-perf/package-lock.json b/scripts/compare-perf/package-lock.json deleted file mode 100644 index 4a1b607478..0000000000 --- a/scripts/compare-perf/package-lock.json +++ /dev/null @@ -1,886 +0,0 @@ -{ - "name": "compare-perf", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "compare-perf", - "version": "0.0.1", - "license": "GPLv2", - "dependencies": { - "chalk": "^4.1.2", - "commander": "^13.1.0", - "inquirer": "^12.5.0", - "simple-git": "^3.27.0", - "ts-node": "^10.9.2" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "typescript": "^5.0.0" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@inquirer/checkbox": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.4.tgz", - "integrity": "sha512-d30576EZdApjAMceijXA5jDzRQHT/MygbC+J8I7EqA6f/FRpYxlRtRJbHF8gHeWYeSdOuTEJqonn7QLB1ELezA==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.5", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/confirm": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.8.tgz", - "integrity": "sha512-dNLWCYZvXDjO3rnQfk2iuJNL4Ivwz/T2+C3+WnNfJKsNGSuOs3wAo2F6e0p946gtSAk31nZMfW+MRmYaplPKsg==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/type": "^3.0.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.0.tgz", - "integrity": "sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==", - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/editor": { - "version": "4.2.18", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.18.tgz", - "integrity": "sha512-yeQN3AXjCm7+Hmq5L6Dm2wEDeBRdAZuyZ4I7tWSSanbxDzqM0KqzoDbKM7p4ebllAYdoQuPJS6N71/3L281i6w==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/external-editor": "^1.0.1", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/expand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.11.tgz", - "integrity": "sha512-OZSUW4hFMW2TYvX/Sv+NnOZgO8CHT2TU1roUCUIF2T+wfw60XFRRp9MRUPCT06cRnKL+aemt2YmTWwt7rOrNEA==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/type": "^3.0.5", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.1.tgz", - "integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==", - "license": "MIT", - "dependencies": { - "chardet": "^2.1.0", - "iconv-lite": "^0.6.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", - "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/input": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.8.tgz", - "integrity": "sha512-WXJI16oOZ3/LiENCAxe8joniNp8MQxF6Wi5V+EBbVA0ZIOpFcL4I9e7f7cXse0HJeIPCWO8Lcgnk98juItCi7Q==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/type": "^3.0.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/number": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.11.tgz", - "integrity": "sha512-pQK68CsKOgwvU2eA53AG/4npRTH2pvs/pZ2bFvzpBhrznh8Mcwt19c+nMO7LHRr3Vreu1KPhNBF3vQAKrjIulw==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/type": "^3.0.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/password": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.11.tgz", - "integrity": "sha512-dH6zLdv+HEv1nBs96Case6eppkRggMe8LoOTl30+Gq5Wf27AO/vHFgStTVz4aoevLdNXqwE23++IXGw4eiOXTg==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/type": "^3.0.5", - "ansi-escapes": "^4.3.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/prompts": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.4.0.tgz", - "integrity": "sha512-EZiJidQOT4O5PYtqnu1JbF0clv36oW2CviR66c7ma4LsupmmQlUwmdReGKRp456OWPWMz3PdrPiYg3aCk3op2w==", - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^4.1.4", - "@inquirer/confirm": "^5.1.8", - "@inquirer/editor": "^4.2.9", - "@inquirer/expand": "^4.0.11", - "@inquirer/input": "^4.1.8", - "@inquirer/number": "^3.0.11", - "@inquirer/password": "^4.0.11", - "@inquirer/rawlist": "^4.0.11", - "@inquirer/search": "^3.0.11", - "@inquirer/select": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/rawlist": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.11.tgz", - "integrity": "sha512-uAYtTx0IF/PqUAvsRrF3xvnxJV516wmR6YVONOmCWJbbt87HcDHLfL9wmBQFbNJRv5kCjdYKrZcavDkH3sVJPg==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/type": "^3.0.5", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/search": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.11.tgz", - "integrity": "sha512-9CWQT0ikYcg6Ls3TOa7jljsD7PgjcsYEM0bYE+Gkz+uoW9u8eaJCRHJKkucpRE5+xKtaaDbrND+nPDoxzjYyew==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.5", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/select": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.1.0.tgz", - "integrity": "sha512-z0a2fmgTSRN+YBuiK1ROfJ2Nvrpij5lVN3gPDkQGhavdvIVGHGW29LwYZfM/j42Ai2hUghTI/uoBuTbrJk42bA==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.5", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/type": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", - "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1" - } - }, - "node_modules/@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "license": "MIT" - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.19.tgz", - "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "license": "MIT" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", - "license": "MIT" - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/diff": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inquirer": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.5.0.tgz", - "integrity": "sha512-aiBBq5aKF1k87MTxXDylLfwpRwToShiHrSv4EmB07EYyLgmnjEz5B3rn0aGw1X3JA/64Ngf2T54oGwc+BCsPIQ==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.9", - "@inquirer/prompts": "^7.4.0", - "@inquirer/type": "^3.0.5", - "ansi-escapes": "^4.3.2", - "mute-stream": "^2.0.0", - "run-async": "^3.0.0", - "rxjs": "^7.8.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "license": "ISC" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-git": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.27.0.tgz", - "integrity": "sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==", - "license": "MIT", - "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.5" - }, - "funding": { - "type": "github", - "url": "https://github.com/steveukx/git-js?sponsor=1" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/scripts/download-node-binary.ts b/scripts/download-node-binary.ts index 9acdbaa58e..6b219fbd1e 100644 --- a/scripts/download-node-binary.ts +++ b/scripts/download-node-binary.ts @@ -9,7 +9,7 @@ import fs from 'fs'; import os from 'os'; import path from 'path'; import { extract } from 'tar'; -import { extractZip } from '../common/lib/extract-zip'; +import { extractZip } from '../tools/common/lib/extract-zip'; // Node.js version to bundle with the CLI // This is separate from .nvmrc which controls the development environment @@ -43,7 +43,7 @@ if ( ! nodeArch ) { process.exit( 1 ); } -const binDir = path.join( __dirname, '..', 'bin' ); +const binDir = path.join( __dirname, '..', 'apps', 'studio', 'bin' ); const tmpDir = os.tmpdir(); if ( ! fs.existsSync( binDir ) ) { diff --git a/scripts/download-wp-server-files.ts b/scripts/download-wp-server-files.ts index d79fbafa29..48973a317c 100644 --- a/scripts/download-wp-server-files.ts +++ b/scripts/download-wp-server-files.ts @@ -1,9 +1,9 @@ import os from 'os'; import path from 'path'; import fs from 'fs-extra'; -import { extractZip } from '../common/lib/extract-zip'; -import { getLatestSQLiteCommandRelease } from '../src/lib/sqlite-command-release'; -import { SQLITE_DATABASE_INTEGRATION_RELEASE_URL } from '../src/constants'; +import { extractZip } from '../tools/common/lib/extract-zip'; +import { getLatestSQLiteCommandRelease } from '../apps/studio/src/lib/sqlite-command-release'; +import { SQLITE_DATABASE_INTEGRATION_RELEASE_URL } from '../apps/studio/src/constants'; const WP_SERVER_FILES_PATH = path.join( __dirname, '..', 'wp-files' ); diff --git a/scripts/make-dmg.mjs b/scripts/make-dmg.mjs index 4e9b34ef24..018ad2b0ff 100644 --- a/scripts/make-dmg.mjs +++ b/scripts/make-dmg.mjs @@ -19,8 +19,8 @@ const dmgPath = path.resolve( `${ packageJson.productName }-darwin-${ process.env.FILE_ARCHITECTURE }.dmg` ); -const volumeIconPath = path.resolve( __dirname, '../assets/studio-app-icon.icns' ); -const backgroundPath = path.resolve( __dirname, '../assets/dmg-background.png' ); +const volumeIconPath = path.resolve( __dirname, '../apps/studio/assets/studio-app-icon.icns' ); +const backgroundPath = path.resolve( __dirname, '../apps/studio/assets/dmg-background.png' ); const dmgSpecs = { title: packageJson.productName, diff --git a/scripts/make-pot.mjs b/scripts/make-pot.mjs index 5b337f4732..e3f13dee43 100755 --- a/scripts/make-pot.mjs +++ b/scripts/make-pot.mjs @@ -30,7 +30,7 @@ const commands = [ }, { command: - 'npx wp-babel-makepot "{src,cli,common}/**/*.{js,jsx,ts,tsx}" --ignore "cli/node_modules/**/*,**/*.d.ts" --base "." --dir "./out/pots" --output "./out/pots/bundle-strings.pot"', + 'npx wp-babel-makepot "{apps/studio/src,apps/cli,tools/common}/**/*.{js,jsx,ts,tsx}" --ignore "apps/cli/node_modules/**/*,**/*.d.ts" --base "." --dir "./out/pots" --output "./out/pots/bundle-strings.pot"', description: 'Generating pot file with wp-babel-makepot', }, { diff --git a/scripts/package-appx.mjs b/scripts/package-appx.mjs index 1a90b8fef3..157a44d4a7 100644 --- a/scripts/package-appx.mjs +++ b/scripts/package-appx.mjs @@ -49,7 +49,7 @@ const packageJsonText = await fs.readFile( packageJsonPath, 'utf-8' ); const packageJson = JSON.parse( packageJsonText ); const outPath = path.join( __dirname, '..', 'out' ); -const assetsPath = path.join( __dirname, '..', 'assets', 'appx' ); +const assetsPath = path.join( __dirname, '..', 'apps', 'studio', 'assets', 'appx' ); console.log( `~~~ Packaging AppX for architecture: ${ architecture }` ); diff --git a/common/constants.ts b/tools/common/constants.ts similarity index 100% rename from common/constants.ts rename to tools/common/constants.ts diff --git a/common/lib/blueprint-settings.ts b/tools/common/lib/blueprint-settings.ts similarity index 100% rename from common/lib/blueprint-settings.ts rename to tools/common/lib/blueprint-settings.ts diff --git a/common/lib/blueprint-validation.ts b/tools/common/lib/blueprint-validation.ts similarity index 100% rename from common/lib/blueprint-validation.ts rename to tools/common/lib/blueprint-validation.ts diff --git a/common/lib/bump-stat.ts b/tools/common/lib/bump-stat.ts similarity index 97% rename from common/lib/bump-stat.ts rename to tools/common/lib/bump-stat.ts index 65e513c684..1129e90553 100644 --- a/common/lib/bump-stat.ts +++ b/tools/common/lib/bump-stat.ts @@ -1,5 +1,5 @@ import { isSameDay, isSameMonth, isSameWeek } from 'date-fns'; -import { AggregateInterval, StatsGroup, StatsMetric } from 'common/types/stats'; +import { AggregateInterval, StatsGroup, StatsMetric } from '@studio/common/types/stats'; // Database columns are varchar(32). Group limit is 27 to account for the '-a11n' suffix // added by the backend for Automattic requests (27 + 5 = 32). diff --git a/common/lib/cache-function-ttl.ts b/tools/common/lib/cache-function-ttl.ts similarity index 100% rename from common/lib/cache-function-ttl.ts rename to tools/common/lib/cache-function-ttl.ts diff --git a/common/lib/cli-error.ts b/tools/common/lib/cli-error.ts similarity index 100% rename from common/lib/cli-error.ts rename to tools/common/lib/cli-error.ts diff --git a/common/lib/domains.ts b/tools/common/lib/domains.ts similarity index 94% rename from common/lib/domains.ts rename to tools/common/lib/domains.ts index 195691345c..4f7b0ef85e 100644 --- a/common/lib/domains.ts +++ b/tools/common/lib/domains.ts @@ -1,5 +1,5 @@ import { __ } from '@wordpress/i18n'; -import { DEFAULT_CUSTOM_DOMAIN_SUFFIX } from 'common/constants'; +import { DEFAULT_CUSTOM_DOMAIN_SUFFIX } from '@studio/common/constants'; import { sanitizeFolderName } from './sanitize-folder-name'; const DOMAIN_PATTERN = diff --git a/common/lib/escape-regex.ts b/tools/common/lib/escape-regex.ts similarity index 100% rename from common/lib/escape-regex.ts rename to tools/common/lib/escape-regex.ts diff --git a/common/lib/extract-zip.ts b/tools/common/lib/extract-zip.ts similarity index 100% rename from common/lib/extract-zip.ts rename to tools/common/lib/extract-zip.ts diff --git a/common/lib/fs-utils.ts b/tools/common/lib/fs-utils.ts similarity index 100% rename from common/lib/fs-utils.ts rename to tools/common/lib/fs-utils.ts diff --git a/common/lib/get-wordpress-version.ts b/tools/common/lib/get-wordpress-version.ts similarity index 100% rename from common/lib/get-wordpress-version.ts rename to tools/common/lib/get-wordpress-version.ts diff --git a/common/lib/is-errno-exception.ts b/tools/common/lib/is-errno-exception.ts similarity index 100% rename from common/lib/is-errno-exception.ts rename to tools/common/lib/is-errno-exception.ts diff --git a/common/lib/locale.ts b/tools/common/lib/locale.ts similarity index 94% rename from common/lib/locale.ts rename to tools/common/lib/locale.ts index d5a290a29e..3d0070e014 100644 --- a/common/lib/locale.ts +++ b/tools/common/lib/locale.ts @@ -1,5 +1,5 @@ // This file can be used in React and Node -import { localeDataDictionary } from 'common/translations'; +import { localeDataDictionary } from '@studio/common/translations'; export const DEFAULT_LOCALE = 'en'; diff --git a/common/lib/lockfile.ts b/tools/common/lib/lockfile.ts similarity index 100% rename from common/lib/lockfile.ts rename to tools/common/lib/lockfile.ts diff --git a/common/lib/mu-plugins.ts b/tools/common/lib/mu-plugins.ts similarity index 100% rename from common/lib/mu-plugins.ts rename to tools/common/lib/mu-plugins.ts diff --git a/common/lib/network-utils.ts b/tools/common/lib/network-utils.ts similarity index 100% rename from common/lib/network-utils.ts rename to tools/common/lib/network-utils.ts diff --git a/common/lib/oauth.ts b/tools/common/lib/oauth.ts similarity index 79% rename from common/lib/oauth.ts rename to tools/common/lib/oauth.ts index 3407e99413..c935fa1c50 100644 --- a/common/lib/oauth.ts +++ b/tools/common/lib/oauth.ts @@ -1,5 +1,5 @@ -import { PROTOCOL_PREFIX, CLIENT_ID } from 'common/constants'; -import { SupportedLocale } from 'common/lib/locale'; +import { PROTOCOL_PREFIX, CLIENT_ID } from '@studio/common/constants'; +import { SupportedLocale } from '@studio/common/lib/locale'; const SCOPES = 'global'; const REDIRECT_URI = `${ PROTOCOL_PREFIX }://auth`; diff --git a/common/lib/passwords.ts b/tools/common/lib/passwords.ts similarity index 100% rename from common/lib/passwords.ts rename to tools/common/lib/passwords.ts diff --git a/common/lib/playground-cli-messages.ts b/tools/common/lib/playground-cli-messages.ts similarity index 100% rename from common/lib/playground-cli-messages.ts rename to tools/common/lib/playground-cli-messages.ts diff --git a/common/lib/port-finder.ts b/tools/common/lib/port-finder.ts similarity index 100% rename from common/lib/port-finder.ts rename to tools/common/lib/port-finder.ts diff --git a/common/lib/sanitize-folder-name.ts b/tools/common/lib/sanitize-folder-name.ts similarity index 100% rename from common/lib/sanitize-folder-name.ts rename to tools/common/lib/sanitize-folder-name.ts diff --git a/common/lib/sequential.ts b/tools/common/lib/sequential.ts similarity index 100% rename from common/lib/sequential.ts rename to tools/common/lib/sequential.ts diff --git a/common/lib/site-events.ts b/tools/common/lib/site-events.ts similarity index 100% rename from common/lib/site-events.ts rename to tools/common/lib/site-events.ts diff --git a/common/lib/site-needs-restart.ts b/tools/common/lib/site-needs-restart.ts similarity index 100% rename from common/lib/site-needs-restart.ts rename to tools/common/lib/site-needs-restart.ts diff --git a/common/lib/sort-sites.ts b/tools/common/lib/sort-sites.ts similarity index 100% rename from common/lib/sort-sites.ts rename to tools/common/lib/sort-sites.ts diff --git a/common/lib/sqlite-integration.ts b/tools/common/lib/sqlite-integration.ts similarity index 100% rename from common/lib/sqlite-integration.ts rename to tools/common/lib/sqlite-integration.ts diff --git a/common/lib/suppress-punycode-warning.ts b/tools/common/lib/suppress-punycode-warning.ts similarity index 100% rename from common/lib/suppress-punycode-warning.ts rename to tools/common/lib/suppress-punycode-warning.ts diff --git a/common/lib/tests/blueprint-settings.test.ts b/tools/common/lib/tests/blueprint-settings.test.ts similarity index 100% rename from common/lib/tests/blueprint-settings.test.ts rename to tools/common/lib/tests/blueprint-settings.test.ts diff --git a/common/lib/tests/blueprint-validation.test.ts b/tools/common/lib/tests/blueprint-validation.test.ts similarity index 100% rename from common/lib/tests/blueprint-validation.test.ts rename to tools/common/lib/tests/blueprint-validation.test.ts diff --git a/common/lib/tests/cache-function-ttl.test.ts b/tools/common/lib/tests/cache-function-ttl.test.ts similarity index 99% rename from common/lib/tests/cache-function-ttl.test.ts rename to tools/common/lib/tests/cache-function-ttl.test.ts index ac4060c2d0..b930293fa3 100644 --- a/common/lib/tests/cache-function-ttl.test.ts +++ b/tools/common/lib/tests/cache-function-ttl.test.ts @@ -1,5 +1,5 @@ import { vi } from 'vitest'; -import { cacheFunctionTTL, clearCache } from 'common/lib/cache-function-ttl'; +import { cacheFunctionTTL, clearCache } from '@studio/common/lib/cache-function-ttl'; describe( 'cacheFunctionTTL', () => { beforeEach( () => { diff --git a/common/lib/tests/oauth.test.ts b/tools/common/lib/tests/oauth.test.ts similarity index 100% rename from common/lib/tests/oauth.test.ts rename to tools/common/lib/tests/oauth.test.ts diff --git a/common/lib/tests/passwords.test.ts b/tools/common/lib/tests/passwords.test.ts similarity index 89% rename from common/lib/tests/passwords.test.ts rename to tools/common/lib/tests/passwords.test.ts index 0eabd17567..2a0bd1da0a 100644 --- a/common/lib/tests/passwords.test.ts +++ b/tools/common/lib/tests/passwords.test.ts @@ -1,5 +1,5 @@ // Removed: globals are now available via vitest/globals in tsconfig -import { createPassword, decodePassword } from 'common/lib/passwords'; +import { createPassword, decodePassword } from '@studio/common/lib/passwords'; describe( 'createPassword', () => { it( 'should return a Base64-encoded string', () => { diff --git a/common/lib/tests/site-needs-restart.test.ts b/tools/common/lib/tests/site-needs-restart.test.ts similarity index 100% rename from common/lib/tests/site-needs-restart.test.ts rename to tools/common/lib/tests/site-needs-restart.test.ts diff --git a/common/lib/tests/sort-sites.test.ts b/tools/common/lib/tests/sort-sites.test.ts similarity index 89% rename from common/lib/tests/sort-sites.test.ts rename to tools/common/lib/tests/sort-sites.test.ts index d8e487e0e4..bf89b88f24 100644 --- a/common/lib/tests/sort-sites.test.ts +++ b/tools/common/lib/tests/sort-sites.test.ts @@ -2,7 +2,7 @@ * @vitest-environment node */ // To run tests, execute `npm run test -- common/lib/tests/sort-sites.test.ts` from the root directory -import { sortSites } from 'common/lib/sort-sites'; +import { sortSites } from '@studio/common/lib/sort-sites'; describe( 'sortSites', () => { it( 'should sort sites by name in ascending order', () => { diff --git a/common/lib/tests/sqlite-integration.test.ts b/tools/common/lib/tests/sqlite-integration.test.ts similarity index 98% rename from common/lib/tests/sqlite-integration.test.ts rename to tools/common/lib/tests/sqlite-integration.test.ts index aa05b9a43b..84e6747324 100644 --- a/common/lib/tests/sqlite-integration.test.ts +++ b/tools/common/lib/tests/sqlite-integration.test.ts @@ -1,6 +1,6 @@ import fs from 'fs-extra'; import { vi } from 'vitest'; -import { SqliteIntegrationProvider } from 'common/lib/sqlite-integration'; +import { SqliteIntegrationProvider } from '@studio/common/lib/sqlite-integration'; import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; const SQLITE_DIRNAME = 'sqlite-database-integration'; diff --git a/common/lib/tests/wordpress-version-utils.test.ts b/tools/common/lib/tests/wordpress-version-utils.test.ts similarity index 100% rename from common/lib/tests/wordpress-version-utils.test.ts rename to tools/common/lib/tests/wordpress-version-utils.test.ts diff --git a/common/lib/wordpress-version-utils.ts b/tools/common/lib/wordpress-version-utils.ts similarity index 100% rename from common/lib/wordpress-version-utils.ts rename to tools/common/lib/wordpress-version-utils.ts diff --git a/common/logger-actions.ts b/tools/common/logger-actions.ts similarity index 100% rename from common/logger-actions.ts rename to tools/common/logger-actions.ts diff --git a/tools/common/package.json b/tools/common/package.json new file mode 100644 index 0000000000..34ce7bafc5 --- /dev/null +++ b/tools/common/package.json @@ -0,0 +1,27 @@ +{ + "name": "@studio/common", + "private": true, + "version": "1.0.0", + "description": "Shared code between Studio app and CLI", + "scripts": { + "build": "tsc -p tsconfig.json", + "typecheck": "tsc -p tsconfig.json --noEmit" + }, + "dependencies": { + "@automattic/generate-password": "^0.1.0", + "@wordpress/i18n": "^6.9.0", + "@wp-playground/blueprints": "^3.0.46", + "cross-port-killer": "^1.4.0", + "date-fns": "^3.3.1", + "fast-deep-equal": "^3.1.3", + "fs-extra": "^11.3.2", + "lockfile": "^1.0.4", + "yauzl": "^3.2.0", + "zod": "^4.0.0" + }, + "devDependencies": { + "@types/fs-extra": "^11.0.4", + "@types/lockfile": "^1.0.4", + "@types/yauzl": "^2.10.3" + } +} diff --git a/tools/common/translations/index.ts b/tools/common/translations/index.ts new file mode 100644 index 0000000000..0e35577273 --- /dev/null +++ b/tools/common/translations/index.ts @@ -0,0 +1,42 @@ +import { locale_data as ar } from '@studio/common/translations/studio-ar.jed.json'; +import { locale_data as de } from '@studio/common/translations/studio-de.jed.json'; +import { locale_data as es } from '@studio/common/translations/studio-es.jed.json'; +import { locale_data as fr } from '@studio/common/translations/studio-fr.jed.json'; +import { locale_data as he } from '@studio/common/translations/studio-he.jed.json'; +import { locale_data as id } from '@studio/common/translations/studio-id.jed.json'; +import { locale_data as it } from '@studio/common/translations/studio-it.jed.json'; +import { locale_data as ja } from '@studio/common/translations/studio-ja.jed.json'; +import { locale_data as ko } from '@studio/common/translations/studio-ko.jed.json'; +import { locale_data as nl } from '@studio/common/translations/studio-nl.jed.json'; +import { locale_data as pl } from '@studio/common/translations/studio-pl.jed.json'; +import { locale_data as ptBR } from '@studio/common/translations/studio-pt-br.jed.json'; +import { locale_data as ru } from '@studio/common/translations/studio-ru.jed.json'; +import { locale_data as sv } from '@studio/common/translations/studio-sv.jed.json'; +import { locale_data as tr } from '@studio/common/translations/studio-tr.jed.json'; +import { locale_data as uk } from '@studio/common/translations/studio-uk.jed.json'; +import { locale_data as vi } from '@studio/common/translations/studio-vi.jed.json'; +import { locale_data as zhCN } from '@studio/common/translations/studio-zh-cn.jed.json'; +import { locale_data as zhTW } from '@studio/common/translations/studio-zh-tw.jed.json'; + +export const localeDataDictionary = { + ar, + de, + en: null, + es, + fr, + he, + id, + it, + ja, + ko, + nl, + pl, + 'pt-br': ptBR, + ru, + sv, + tr, + uk, + vi, + 'zh-cn': zhCN, + 'zh-tw': zhTW, +} as const; diff --git a/common/translations/studio-ar.jed.json b/tools/common/translations/studio-ar.jed.json similarity index 100% rename from common/translations/studio-ar.jed.json rename to tools/common/translations/studio-ar.jed.json diff --git a/common/translations/studio-de.jed.json b/tools/common/translations/studio-de.jed.json similarity index 100% rename from common/translations/studio-de.jed.json rename to tools/common/translations/studio-de.jed.json diff --git a/common/translations/studio-es.jed.json b/tools/common/translations/studio-es.jed.json similarity index 100% rename from common/translations/studio-es.jed.json rename to tools/common/translations/studio-es.jed.json diff --git a/common/translations/studio-fr.jed.json b/tools/common/translations/studio-fr.jed.json similarity index 100% rename from common/translations/studio-fr.jed.json rename to tools/common/translations/studio-fr.jed.json diff --git a/common/translations/studio-he.jed.json b/tools/common/translations/studio-he.jed.json similarity index 100% rename from common/translations/studio-he.jed.json rename to tools/common/translations/studio-he.jed.json diff --git a/common/translations/studio-id.jed.json b/tools/common/translations/studio-id.jed.json similarity index 100% rename from common/translations/studio-id.jed.json rename to tools/common/translations/studio-id.jed.json diff --git a/common/translations/studio-it.jed.json b/tools/common/translations/studio-it.jed.json similarity index 100% rename from common/translations/studio-it.jed.json rename to tools/common/translations/studio-it.jed.json diff --git a/common/translations/studio-ja.jed.json b/tools/common/translations/studio-ja.jed.json similarity index 100% rename from common/translations/studio-ja.jed.json rename to tools/common/translations/studio-ja.jed.json diff --git a/common/translations/studio-ko.jed.json b/tools/common/translations/studio-ko.jed.json similarity index 100% rename from common/translations/studio-ko.jed.json rename to tools/common/translations/studio-ko.jed.json diff --git a/common/translations/studio-nl.jed.json b/tools/common/translations/studio-nl.jed.json similarity index 100% rename from common/translations/studio-nl.jed.json rename to tools/common/translations/studio-nl.jed.json diff --git a/common/translations/studio-pl.jed.json b/tools/common/translations/studio-pl.jed.json similarity index 100% rename from common/translations/studio-pl.jed.json rename to tools/common/translations/studio-pl.jed.json diff --git a/common/translations/studio-pt-br.jed.json b/tools/common/translations/studio-pt-br.jed.json similarity index 100% rename from common/translations/studio-pt-br.jed.json rename to tools/common/translations/studio-pt-br.jed.json diff --git a/common/translations/studio-ru.jed.json b/tools/common/translations/studio-ru.jed.json similarity index 100% rename from common/translations/studio-ru.jed.json rename to tools/common/translations/studio-ru.jed.json diff --git a/common/translations/studio-sv.jed.json b/tools/common/translations/studio-sv.jed.json similarity index 100% rename from common/translations/studio-sv.jed.json rename to tools/common/translations/studio-sv.jed.json diff --git a/common/translations/studio-tr.jed.json b/tools/common/translations/studio-tr.jed.json similarity index 100% rename from common/translations/studio-tr.jed.json rename to tools/common/translations/studio-tr.jed.json diff --git a/common/translations/studio-uk.jed.json b/tools/common/translations/studio-uk.jed.json similarity index 100% rename from common/translations/studio-uk.jed.json rename to tools/common/translations/studio-uk.jed.json diff --git a/common/translations/studio-vi.jed.json b/tools/common/translations/studio-vi.jed.json similarity index 100% rename from common/translations/studio-vi.jed.json rename to tools/common/translations/studio-vi.jed.json diff --git a/common/translations/studio-zh-cn.jed.json b/tools/common/translations/studio-zh-cn.jed.json similarity index 100% rename from common/translations/studio-zh-cn.jed.json rename to tools/common/translations/studio-zh-cn.jed.json diff --git a/common/translations/studio-zh-tw.jed.json b/tools/common/translations/studio-zh-tw.jed.json similarity index 100% rename from common/translations/studio-zh-tw.jed.json rename to tools/common/translations/studio-zh-tw.jed.json diff --git a/tools/common/tsconfig.json b/tools/common/tsconfig.json new file mode 100644 index 0000000000..2c6e4c99fe --- /dev/null +++ b/tools/common/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "baseUrl": "../..", + "paths": { + "*": [ "node_modules/*" ], + "cli/*": [ "apps/cli/*" ], + "src/*": [ "apps/studio/src/*" ], + "vendor/*": [ "vendor/*" ], + "@studio/common/*": [ "tools/common/*" ] + }, + "outDir": "dist", + "declaration": true, + "emitDeclarationOnly": true + }, + "include": [ + "**/*" + ], + "exclude": [ "**/__mocks__/**/*", "**/node_modules/**/*", "**/dist/**/*", "**/out/**/*" ] +} diff --git a/common/types/php-versions.ts b/tools/common/types/php-versions.ts similarity index 100% rename from common/types/php-versions.ts rename to tools/common/types/php-versions.ts diff --git a/common/types/snapshot.ts b/tools/common/types/snapshot.ts similarity index 100% rename from common/types/snapshot.ts rename to tools/common/types/snapshot.ts diff --git a/common/types/stats.ts b/tools/common/types/stats.ts similarity index 100% rename from common/types/stats.ts rename to tools/common/types/stats.ts diff --git a/scripts/compare-perf/config.ts b/tools/compare-perf/config.ts similarity index 84% rename from scripts/compare-perf/config.ts rename to tools/compare-perf/config.ts index 767d53a5c9..e1fd4fe4e5 100644 --- a/scripts/compare-perf/config.ts +++ b/tools/compare-perf/config.ts @@ -1,6 +1,6 @@ import path from 'path'; -const metricsPath = path.resolve( __dirname, '../../metrics' ); +const metricsPath = path.resolve( __dirname, '../metrics' ); const artifactsPath = process.env.ARTIFACTS_PATH ?? path.join( metricsPath, 'artifacts' ); const config = { @@ -8,7 +8,7 @@ const config = { setupTestRunner: 'npm ci && npx playwright install chromium', testCommand: 'npm run test:metrics', setupCommand: 'npm ci && npm ci --prefix cli && npm run package', - testsPath: 'metrics/tests', + testsPath: 'tools/metrics/tests', testFileSuffix: '.test.ts', artifactsPath, resultsFileSuffix: '.results.json', diff --git a/scripts/compare-perf/index.ts b/tools/compare-perf/index.ts similarity index 100% rename from scripts/compare-perf/index.ts rename to tools/compare-perf/index.ts diff --git a/scripts/compare-perf/log-to-codevitals.ts b/tools/compare-perf/log-to-codevitals.ts similarity index 100% rename from scripts/compare-perf/log-to-codevitals.ts rename to tools/compare-perf/log-to-codevitals.ts diff --git a/scripts/compare-perf/package.json b/tools/compare-perf/package.json similarity index 97% rename from scripts/compare-perf/package.json rename to tools/compare-perf/package.json index 741aa7b978..cc74482cc9 100644 --- a/scripts/compare-perf/package.json +++ b/tools/compare-perf/package.json @@ -1,5 +1,6 @@ { "name": "compare-perf", + "private": true, "version": "0.0.1", "description": "A tool to compare performance accross tow branches in Studio Monorepo.", "author": "Automattic", diff --git a/scripts/compare-perf/performance.ts b/tools/compare-perf/performance.ts similarity index 100% rename from scripts/compare-perf/performance.ts rename to tools/compare-perf/performance.ts diff --git a/scripts/compare-perf/post-to-github.ts b/tools/compare-perf/post-to-github.ts similarity index 100% rename from scripts/compare-perf/post-to-github.ts rename to tools/compare-perf/post-to-github.ts diff --git a/scripts/compare-perf/tsconfig.json b/tools/compare-perf/tsconfig.json similarity index 100% rename from scripts/compare-perf/tsconfig.json rename to tools/compare-perf/tsconfig.json diff --git a/scripts/compare-perf/utils.ts b/tools/compare-perf/utils.ts similarity index 100% rename from scripts/compare-perf/utils.ts rename to tools/compare-perf/utils.ts diff --git a/packages/eslint-plugin-studio/package.json b/tools/eslint-plugin-studio/package.json similarity index 100% rename from packages/eslint-plugin-studio/package.json rename to tools/eslint-plugin-studio/package.json diff --git a/packages/eslint-plugin-studio/src/index.js b/tools/eslint-plugin-studio/src/index.js similarity index 100% rename from packages/eslint-plugin-studio/src/index.js rename to tools/eslint-plugin-studio/src/index.js diff --git a/packages/eslint-plugin-studio/src/rules/require-lock-before-save.js b/tools/eslint-plugin-studio/src/rules/require-lock-before-save.js similarity index 100% rename from packages/eslint-plugin-studio/src/rules/require-lock-before-save.js rename to tools/eslint-plugin-studio/src/rules/require-lock-before-save.js diff --git a/packages/eslint-plugin-studio/tests/require-lock-before-save.test.ts b/tools/eslint-plugin-studio/tests/require-lock-before-save.test.ts similarity index 100% rename from packages/eslint-plugin-studio/tests/require-lock-before-save.test.ts rename to tools/eslint-plugin-studio/tests/require-lock-before-save.test.ts diff --git a/metrics/README.md b/tools/metrics/README.md similarity index 91% rename from metrics/README.md rename to tools/metrics/README.md index be95dcb15c..a6023a63fc 100644 --- a/metrics/README.md +++ b/tools/metrics/README.md @@ -18,7 +18,7 @@ This will: 1. Package the application (to ensure testing against the production build) 2. Run the performance tests using Playwright -3. Generate a performance reports in `artifacts/performance-metrics.json` at the project root and output the results to the console +3. Generate a performance reports in `tools/metrics/artifacts/performance-metrics.json` and output the results to the console ## How It Works @@ -33,7 +33,7 @@ The performance tests simulate key user workflows and measure the time they take You can compare performance metrics between different commits or branches: ```bash -cd scripts/compare-perf && npm run compare -- perf +npm -w compare-perf run compare -- perf ``` This tool is useful for: diff --git a/metrics/performance-reporter.ts b/tools/metrics/performance-reporter.ts similarity index 100% rename from metrics/performance-reporter.ts rename to tools/metrics/performance-reporter.ts diff --git a/metrics/playwright.metrics.config.ts b/tools/metrics/playwright.metrics.config.ts similarity index 100% rename from metrics/playwright.metrics.config.ts rename to tools/metrics/playwright.metrics.config.ts diff --git a/metrics/tests/site-editor.test.ts b/tools/metrics/tests/site-editor.test.ts similarity index 100% rename from metrics/tests/site-editor.test.ts rename to tools/metrics/tests/site-editor.test.ts diff --git a/metrics/tests/site-startup.test.ts b/tools/metrics/tests/site-startup.test.ts similarity index 100% rename from metrics/tests/site-startup.test.ts rename to tools/metrics/tests/site-startup.test.ts diff --git a/metrics/utils.ts b/tools/metrics/utils.ts similarity index 100% rename from metrics/utils.ts rename to tools/metrics/utils.ts diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000000..e8f2cfc57c --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES6", + "allowJs": true, + "module": "commonjs", + "skipLibCheck": true, + "esModuleInterop": true, + "noImplicitAny": true, + "sourceMap": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "jsx": "react-jsx", + "strict": true, + "types": [ "vitest/globals" ] + } +} diff --git a/tsconfig.json b/tsconfig.json index 526747147a..e1c3f05619 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,27 +1,22 @@ { + "extends": "./tsconfig.base.json", "compilerOptions": { - "target": "ES6", - "allowJs": true, - "module": "commonjs", - "skipLibCheck": true, - "esModuleInterop": true, - "noImplicitAny": true, - "sourceMap": true, "baseUrl": ".", "outDir": "dist", - "moduleResolution": "node", - "resolveJsonModule": true, - "jsx": "react-jsx", - "strict": true, - "types": [ "vitest/globals" ], "paths": { "*": [ "node_modules/*" ], - "cli/*": [ "cli/*" ], - "src/*": [ "src/*" ], + "cli/*": [ "apps/cli/*" ], + "src/*": [ "apps/studio/src/*" ], "vendor/*": [ "vendor/*" ], - "common/*": [ "common/*" ] + "@studio/common/*": [ "tools/common/*" ] } }, - "include": [ "src/**/*", "cli/**/*", "common/**/*", "e2e/**/*", "./vitest.setup.ts" ], + "include": [ + "apps/studio/src/**/*", + "apps/studio/e2e/**/*", + "apps/cli/**/*", + "tools/common/**/*", + "./vitest.setup.ts" + ], "exclude": [ "**/__mocks__/**/*", "**/node_modules/**/*", "**/dist/**/*", "**/out/**/*" ] } diff --git a/vitest.config.mts b/vitest.config.mts index e1213bd886..b95c168210 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -10,10 +10,10 @@ export default defineConfig( { customExportConditions: [ 'node', 'node-addons' ], }, include: [ - 'src/**/*.{test,spec}.{ts,tsx}', - 'cli/**/*.{test,spec}.{ts,tsx}', - 'common/**/*.{test,spec}.{ts,tsx}', - 'packages/**/*.{test,spec}.{ts,tsx,js}', + 'apps/studio/src/**/*.{test,spec}.{ts,tsx}', + 'apps/cli/**/*.{test,spec}.{ts,tsx}', + 'tools/common/**/*.{test,spec}.{ts,tsx}', + 'tools/**/*.{test,spec}.{ts,tsx,js}', ], exclude: [ '**/node_modules/**', @@ -39,11 +39,11 @@ export default defineConfig( { }, resolve: { alias: { - pm2: path.resolve( __dirname, './__mocks__/pm2.ts' ), - cli: path.resolve( __dirname, './cli' ), - src: path.resolve( __dirname, './src' ), + pm2: path.resolve( __dirname, './apps/cli/__mocks__/pm2.ts' ), + cli: path.resolve( __dirname, './apps/cli' ), + src: path.resolve( __dirname, './apps/studio/src' ), vendor: path.resolve( __dirname, './vendor' ), - common: path.resolve( __dirname, './common' ), + '@studio/common': path.resolve( __dirname, './tools/common' ), }, }, } ); From 5ea011d01d7fd5458332c3d58278fe53a5178d04 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 11:31:02 +0100 Subject: [PATCH 02/60] Linting and formatting --- .prettierignore | 3 +- apps/cli/__mocks__/pm2.ts | 4 +- apps/cli/commands/_events.ts | 2 +- apps/cli/commands/auth/login.ts | 2 +- apps/cli/commands/auth/logout.ts | 2 +- apps/cli/commands/auth/status.ts | 2 +- apps/cli/commands/preview/create.ts | 2 +- apps/cli/commands/preview/delete.ts | 2 +- apps/cli/commands/preview/list.ts | 2 +- .../cli/commands/preview/tests/update.test.ts | 2 +- apps/cli/commands/preview/update.ts | 2 +- apps/cli/commands/site/create.ts | 4 +- apps/cli/commands/site/delete.ts | 2 +- apps/cli/commands/site/list.ts | 2 +- apps/cli/commands/site/set.ts | 2 +- apps/cli/commands/site/start.ts | 2 +- apps/cli/commands/site/status.ts | 4 +- apps/cli/commands/site/stop.ts | 2 +- apps/cli/commands/site/tests/create.test.ts | 2 +- apps/cli/index.ts | 8 +- apps/cli/lib/appdata.ts | 4 +- apps/cli/lib/i18n.ts | 2 +- apps/cli/lib/run-wp-cli-command.ts | 4 +- apps/cli/lib/site-utils.ts | 2 +- apps/cli/lib/snapshots.ts | 2 +- apps/cli/lib/tests/appdata.test.ts | 2 +- apps/cli/lib/validation.ts | 2 +- apps/cli/tsconfig.json | 8 +- apps/cli/vite.config.ts | 31 ++- apps/cli/wordpress-server-child.ts | 14 +- .../e2e/fixtures/blueprints/run-php-code.json | 2 +- .../fixtures/blueprints/wp-cli-command.json | 2 +- apps/studio/e2e/sites.test.ts | 2 +- apps/studio/electron.vite.config.ts | 10 +- apps/studio/forge.config.ts | 6 +- apps/studio/src/about-menu/about-menu.html | 210 ++++++++++-------- .../add-site-with-blueprint-button.tsx | 2 +- .../src/components/content-tab-settings.tsx | 2 +- .../src/components/default-error-fallback.tsx | 2 +- .../tests/content-tab-settings.test.tsx | 2 +- .../components/wp-version-selector/index.tsx | 4 +- apps/studio/src/hooks/use-add-site.ts | 4 +- apps/studio/src/hooks/use-expiration-date.ts | 4 +- apps/studio/src/hooks/use-site-details.tsx | 4 +- apps/studio/src/hooks/use-site-size.ts | 2 +- apps/studio/src/index.css | 15 +- apps/studio/src/index.ts | 12 +- apps/studio/src/ipc-handlers.ts | 2 +- .../handlers/add-site-with-blueprint.ts | 2 +- .../src/lib/deeplink/tests/add-site.test.ts | 2 +- apps/studio/src/lib/download-utils.ts | 2 +- .../import/importers/importer.ts | 4 +- apps/studio/src/lib/oauth.ts | 2 +- apps/studio/src/lib/site-language.ts | 2 +- apps/studio/src/lib/tests/bump-stats.test.ts | 6 +- apps/studio/src/lib/tests/locale.test.ts | 2 +- apps/studio/src/lib/tests/oauth.test.ts | 2 +- apps/studio/src/lib/wp-versions.ts | 2 +- .../components/blueprint-deeplink.tsx | 2 +- .../components/blueprint-warning-notice.tsx | 2 +- .../add-site/components/create-site-form.tsx | 9 +- .../add-site/hooks/use-blueprint-deeplink.ts | 4 +- apps/studio/src/modules/add-site/index.tsx | 8 +- .../modules/cli/lib/cli-events-subscriber.ts | 9 +- .../src/modules/cli/lib/cli-server-process.ts | 2 +- .../src/modules/cli/lib/cli-site-creator.ts | 2 +- .../src/modules/cli/lib/cli-site-editor.ts | 2 +- .../cli/lib/execute-preview-command.ts | 2 +- .../cli/lib/macos-installation-manager.ts | 2 +- .../components/create-preview-button.tsx | 2 +- .../preview-action-buttons-menu.tsx | 2 +- .../components/preview-site-row.tsx | 2 +- .../preview-action-buttons-menu.test.tsx | 2 +- .../hooks/use-update-button-tooltip.ts | 2 +- .../preview-site/lib/version-comparison.ts | 2 +- .../site-settings/edit-site-details.tsx | 11 +- .../src/modules/sync/lib/ipc-handlers.ts | 2 +- .../components/language-picker.tsx | 2 +- .../components/preferences-tab.tsx | 2 +- apps/studio/src/setup-wp-server-files.ts | 2 +- apps/studio/src/site-server.ts | 2 +- apps/studio/src/storage/user-data.ts | 4 +- apps/studio/src/stores/chat-slice.ts | 2 +- apps/studio/src/stores/i18n-slice.ts | 2 +- apps/studio/src/stores/snapshot-slice.ts | 4 +- .../src/stores/tests/snapshot-slice.test.ts | 4 +- .../src/stores/wordpress-versions-api.ts | 5 +- apps/studio/src/stores/wpcom-api.ts | 2 +- apps/studio/src/tests/ipc-handlers.test.ts | 4 +- apps/studio/tsconfig.json | 10 +- docs/code-contributions.md | 47 ++-- docs/design-docs/cli.md | 22 +- eslint.config.mjs | 1 + scripts/prepare-dev-build-version.mjs | 2 +- tools/common/lib/bump-stat.ts | 2 +- tools/common/lib/domains.ts | 2 +- .../lib/tests/cache-function-ttl.test.ts | 2 +- .../lib/tests/sqlite-integration.test.ts | 4 +- tools/common/tsconfig.json | 4 +- tools/compare-perf/post-to-github.ts | 13 +- tools/compare-perf/tsconfig.json | 10 +- tools/metrics/README.md | 2 +- tools/metrics/tests/site-editor.test.ts | 21 +- 103 files changed, 359 insertions(+), 324 deletions(-) diff --git a/.prettierignore b/.prettierignore index b0f142ae26..f1b06af7b4 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1 @@ -src/translations -common/translations +tools/common/translations diff --git a/apps/cli/__mocks__/pm2.ts b/apps/cli/__mocks__/pm2.ts index 5c39290358..bb02149803 100644 --- a/apps/cli/__mocks__/pm2.ts +++ b/apps/cli/__mocks__/pm2.ts @@ -12,8 +12,8 @@ export class custom { launchBus = vi.fn( ( callback: ( error?: Error, bus?: any ) => void ) => callback( undefined, {} ) ); - sendDataToProcessId = vi.fn( ( processId: number, data: any, callback: ( error?: Error ) => void ) => - callback() + sendDataToProcessId = vi.fn( + ( processId: number, data: any, callback: ( error?: Error ) => void ) => callback() ); } diff --git a/apps/cli/commands/_events.ts b/apps/cli/commands/_events.ts index 93cffcbc05..5b144352dc 100644 --- a/apps/cli/commands/_events.ts +++ b/apps/cli/commands/_events.ts @@ -7,10 +7,10 @@ * */ import fs from 'fs'; -import { __ } from '@wordpress/i18n'; import { sequential } from '@studio/common/lib/sequential'; import { SITE_EVENTS, siteDetailsSchema, SiteEvent } from '@studio/common/lib/site-events'; import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; +import { __ } from '@wordpress/i18n'; import axon from 'pm2-axon'; import { z } from 'zod'; import { getSiteUrl, readAppdata, SiteData } from 'cli/lib/appdata'; diff --git a/apps/cli/commands/auth/login.ts b/apps/cli/commands/auth/login.ts index f7e085fd1c..2dfe80b41e 100644 --- a/apps/cli/commands/auth/login.ts +++ b/apps/cli/commands/auth/login.ts @@ -1,8 +1,8 @@ import { input } from '@inquirer/prompts'; -import { __, sprintf } from '@wordpress/i18n'; import { DEFAULT_TOKEN_LIFETIME_MS } from '@studio/common/constants'; import { getAuthenticationUrl } from '@studio/common/lib/oauth'; import { AuthCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; +import { __, sprintf } from '@wordpress/i18n'; import { getUserInfo } from 'cli/lib/api'; import { getAuthToken, diff --git a/apps/cli/commands/auth/logout.ts b/apps/cli/commands/auth/logout.ts index fc05240695..a3d50613a1 100644 --- a/apps/cli/commands/auth/logout.ts +++ b/apps/cli/commands/auth/logout.ts @@ -1,5 +1,5 @@ -import { __ } from '@wordpress/i18n'; import { AuthCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; +import { __ } from '@wordpress/i18n'; import { revokeAuthToken } from 'cli/lib/api'; import { readAppdata, diff --git a/apps/cli/commands/auth/status.ts b/apps/cli/commands/auth/status.ts index 24ffca44e6..f15227de8a 100644 --- a/apps/cli/commands/auth/status.ts +++ b/apps/cli/commands/auth/status.ts @@ -1,5 +1,5 @@ -import { __, sprintf } from '@wordpress/i18n'; import { AuthCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; +import { __, sprintf } from '@wordpress/i18n'; import { getUserInfo } from 'cli/lib/api'; import { getAuthToken } from 'cli/lib/appdata'; import { Logger, LoggerError } from 'cli/logger'; diff --git a/apps/cli/commands/preview/create.ts b/apps/cli/commands/preview/create.ts index 1c3e5342d2..de350dd12c 100644 --- a/apps/cli/commands/preview/create.ts +++ b/apps/cli/commands/preview/create.ts @@ -1,8 +1,8 @@ import os from 'os'; import path from 'path'; -import { __, sprintf } from '@wordpress/i18n'; import { getWordPressVersion } from '@studio/common/lib/get-wordpress-version'; import { PreviewCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; +import { __, sprintf } from '@wordpress/i18n'; import { uploadArchive, waitForSiteReady } from 'cli/lib/api'; import { getAuthToken, getSiteByFolder } from 'cli/lib/appdata'; import { archiveSiteContent, cleanup } from 'cli/lib/archive'; diff --git a/apps/cli/commands/preview/delete.ts b/apps/cli/commands/preview/delete.ts index 3b5a3e368e..5fd43dd21e 100644 --- a/apps/cli/commands/preview/delete.ts +++ b/apps/cli/commands/preview/delete.ts @@ -1,5 +1,5 @@ -import { __ } from '@wordpress/i18n'; import { PreviewCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; +import { __ } from '@wordpress/i18n'; import { deleteSnapshot } from 'cli/lib/api'; import { getAuthToken } from 'cli/lib/appdata'; import { deleteSnapshotFromAppdata, getSnapshotsFromAppdata } from 'cli/lib/snapshots'; diff --git a/apps/cli/commands/preview/list.ts b/apps/cli/commands/preview/list.ts index 32454c7529..ae14e691ca 100644 --- a/apps/cli/commands/preview/list.ts +++ b/apps/cli/commands/preview/list.ts @@ -1,6 +1,6 @@ +import { PreviewCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { __, _n, sprintf } from '@wordpress/i18n'; import Table from 'cli-table3'; -import { PreviewCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { format } from 'date-fns'; import { getAuthToken, getSiteByFolder } from 'cli/lib/appdata'; import { diff --git a/apps/cli/commands/preview/tests/update.test.ts b/apps/cli/commands/preview/tests/update.test.ts index a35df8a3f2..58bf753caa 100644 --- a/apps/cli/commands/preview/tests/update.test.ts +++ b/apps/cli/commands/preview/tests/update.test.ts @@ -1,8 +1,8 @@ import os from 'os'; import path from 'path'; -import { Archiver } from 'archiver'; import { DEMO_SITE_EXPIRATION_DAYS } from '@studio/common/constants'; import { getWordPressVersion } from '@studio/common/lib/get-wordpress-version'; +import { Archiver } from 'archiver'; import { vi } from 'vitest'; import { uploadArchive, waitForSiteReady } from 'cli/lib/api'; import { getAuthToken, getSiteByFolder } from 'cli/lib/appdata'; diff --git a/apps/cli/commands/preview/update.ts b/apps/cli/commands/preview/update.ts index 9d4ca6a209..146db4e4d7 100644 --- a/apps/cli/commands/preview/update.ts +++ b/apps/cli/commands/preview/update.ts @@ -1,10 +1,10 @@ import os from 'node:os'; import path from 'node:path'; -import { __, _n, sprintf } from '@wordpress/i18n'; import { DEMO_SITE_EXPIRATION_DAYS } from '@studio/common/constants'; import { getWordPressVersion } from '@studio/common/lib/get-wordpress-version'; import { PreviewCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { Snapshot } from '@studio/common/types/snapshot'; +import { __, _n, sprintf } from '@wordpress/i18n'; import { addDays } from 'date-fns'; import { uploadArchive, waitForSiteReady } from 'cli/lib/api'; import { getAuthToken, getSiteByFolder } from 'cli/lib/appdata'; diff --git a/apps/cli/commands/site/create.ts b/apps/cli/commands/site/create.ts index 388728bf91..59effb8360 100644 --- a/apps/cli/commands/site/create.ts +++ b/apps/cli/commands/site/create.ts @@ -3,8 +3,6 @@ import fs from 'fs'; import os from 'os'; import path from 'path'; import { SupportedPHPVersions } from '@php-wasm/universal'; -import { __, sprintf } from '@wordpress/i18n'; -import { Blueprint, StepDefinition } from '@wp-playground/blueprints'; import { DEFAULT_PHP_VERSION, DEFAULT_WORDPRESS_VERSION, @@ -33,6 +31,8 @@ import { isWordPressVersionAtLeast, } from '@studio/common/lib/wordpress-version-utils'; import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; +import { __, sprintf } from '@wordpress/i18n'; +import { Blueprint, StepDefinition } from '@wp-playground/blueprints'; import { lockAppdata, readAppdata, diff --git a/apps/cli/commands/site/delete.ts b/apps/cli/commands/site/delete.ts index 57628ba66d..0849ef1928 100644 --- a/apps/cli/commands/site/delete.ts +++ b/apps/cli/commands/site/delete.ts @@ -1,7 +1,7 @@ -import { __, _n, sprintf } from '@wordpress/i18n'; import { arePathsEqual } from '@studio/common/lib/fs-utils'; import { SITE_EVENTS } from '@studio/common/lib/site-events'; import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; +import { __, _n, sprintf } from '@wordpress/i18n'; import { deleteSnapshot } from 'cli/lib/api'; import { getSiteByFolder, diff --git a/apps/cli/commands/site/list.ts b/apps/cli/commands/site/list.ts index 0ed71d2b42..e343ad3f81 100644 --- a/apps/cli/commands/site/list.ts +++ b/apps/cli/commands/site/list.ts @@ -1,6 +1,6 @@ +import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { __, _n, sprintf } from '@wordpress/i18n'; import Table from 'cli-table3'; -import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { getSiteUrl, readAppdata, type SiteData } from 'cli/lib/appdata'; import { connect, disconnect } from 'cli/lib/pm2-manager'; import { isSiteRunning } from 'cli/lib/site-utils'; diff --git a/apps/cli/commands/site/set.ts b/apps/cli/commands/site/set.ts index 5c714b67ba..f466f683e1 100644 --- a/apps/cli/commands/site/set.ts +++ b/apps/cli/commands/site/set.ts @@ -1,5 +1,4 @@ import { SupportedPHPVersions } from '@php-wasm/universal'; -import { __, sprintf } from '@wordpress/i18n'; import { DEFAULT_WORDPRESS_VERSION, MINIMUM_WORDPRESS_VERSION } from '@studio/common/constants'; import { getDomainNameValidationError } from '@studio/common/lib/domains'; import { arePathsEqual } from '@studio/common/lib/fs-utils'; @@ -11,6 +10,7 @@ import { isWordPressVersionAtLeast, } from '@studio/common/lib/wordpress-version-utils'; import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; +import { __, sprintf } from '@wordpress/i18n'; import { getSiteByFolder, lockAppdata, diff --git a/apps/cli/commands/site/start.ts b/apps/cli/commands/site/start.ts index 1e7f411954..ac7e114cd0 100644 --- a/apps/cli/commands/site/start.ts +++ b/apps/cli/commands/site/start.ts @@ -1,5 +1,5 @@ -import { __ } from '@wordpress/i18n'; import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; +import { __ } from '@wordpress/i18n'; import { getSiteByFolder, updateSiteAutoStart, updateSiteLatestCliPid } from 'cli/lib/appdata'; import { connect, disconnect } from 'cli/lib/pm2-manager'; import { logSiteDetails, openSiteInBrowser, setupCustomDomain } from 'cli/lib/site-utils'; diff --git a/apps/cli/commands/site/status.ts b/apps/cli/commands/site/status.ts index 02ffc37cf0..0711e1671c 100644 --- a/apps/cli/commands/site/status.ts +++ b/apps/cli/commands/site/status.ts @@ -1,8 +1,8 @@ -import { __, _n } from '@wordpress/i18n'; -import CliTable3 from 'cli-table3'; import { getWordPressVersion } from '@studio/common/lib/get-wordpress-version'; import { decodePassword } from '@studio/common/lib/passwords'; import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; +import { __, _n } from '@wordpress/i18n'; +import CliTable3 from 'cli-table3'; import { getSiteByFolder, getSiteUrl } from 'cli/lib/appdata'; import { connect, disconnect } from 'cli/lib/pm2-manager'; import { getPrettyPath } from 'cli/lib/utils'; diff --git a/apps/cli/commands/site/stop.ts b/apps/cli/commands/site/stop.ts index 84151ba612..dcab8a32be 100644 --- a/apps/cli/commands/site/stop.ts +++ b/apps/cli/commands/site/stop.ts @@ -1,5 +1,5 @@ -import { __, _n, sprintf } from '@wordpress/i18n'; import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; +import { __, _n, sprintf } from '@wordpress/i18n'; import { clearSiteLatestCliPid, getSiteByFolder, diff --git a/apps/cli/commands/site/tests/create.test.ts b/apps/cli/commands/site/tests/create.test.ts index 6c69d6ba83..823ac674fa 100644 --- a/apps/cli/commands/site/tests/create.test.ts +++ b/apps/cli/commands/site/tests/create.test.ts @@ -1,5 +1,4 @@ import fs from 'fs'; -import { Blueprint, StepDefinition } from '@wp-playground/blueprints'; import { filterUnsupportedBlueprintFeatures, validateBlueprintData, @@ -13,6 +12,7 @@ import { } from '@studio/common/lib/fs-utils'; import { isOnline } from '@studio/common/lib/network-utils'; import { portFinder } from '@studio/common/lib/port-finder'; +import { Blueprint, StepDefinition } from '@wp-playground/blueprints'; import { vi, type MockInstance } from 'vitest'; import { lockAppdata, diff --git a/apps/cli/index.ts b/apps/cli/index.ts index 2c6b3bb37d..25b5994256 100644 --- a/apps/cli/index.ts +++ b/apps/cli/index.ts @@ -1,8 +1,12 @@ import path from 'node:path'; -import { __ } from '@wordpress/i18n'; -import { bumpAggregatedUniqueStat, AppdataProvider, LastBumpStatsData } from '@studio/common/lib/bump-stat'; +import { + bumpAggregatedUniqueStat, + AppdataProvider, + LastBumpStatsData, +} from '@studio/common/lib/bump-stat'; import { suppressPunycodeWarning } from '@studio/common/lib/suppress-punycode-warning'; import { StatsGroup, StatsMetric } from '@studio/common/types/stats'; +import { __ } from '@wordpress/i18n'; import yargs from 'yargs'; import { commandHandler as eventsCommandHandler } from 'cli/commands/_events'; import { registerCommand as registerAuthLoginCommand } from 'cli/commands/auth/login'; diff --git a/apps/cli/lib/appdata.ts b/apps/cli/lib/appdata.ts index 9742709ff9..a2599f305c 100644 --- a/apps/cli/lib/appdata.ts +++ b/apps/cli/lib/appdata.ts @@ -1,8 +1,6 @@ import fs from 'fs'; import os from 'os'; import path from 'path'; -import { __, sprintf } from '@wordpress/i18n'; -import { readFile, writeFile } from 'atomically'; import { LOCKFILE_NAME, LOCKFILE_STALE_TIME, LOCKFILE_WAIT_TIME } from '@studio/common/constants'; import { arePathsEqual, isWordPressDirectory } from '@studio/common/lib/fs-utils'; import { lockFileAsync, unlockFileAsync } from '@studio/common/lib/lockfile'; @@ -10,6 +8,8 @@ import { getAuthenticationUrl } from '@studio/common/lib/oauth'; import { siteDetailsSchema } from '@studio/common/lib/site-events'; import { snapshotSchema } from '@studio/common/types/snapshot'; import { StatsMetric } from '@studio/common/types/stats'; +import { __, sprintf } from '@wordpress/i18n'; +import { readFile, writeFile } from 'atomically'; import { z } from 'zod'; import { validateAccessToken } from 'cli/lib/api'; import { LoggerError } from 'cli/logger'; diff --git a/apps/cli/lib/i18n.ts b/apps/cli/lib/i18n.ts index 3d0d784428..225d8c40aa 100644 --- a/apps/cli/lib/i18n.ts +++ b/apps/cli/lib/i18n.ts @@ -1,10 +1,10 @@ -import { defaultI18n } from '@wordpress/i18n'; import { SupportedLocale, getLocaleData, DEFAULT_LOCALE, isSupportedLocale, } from '@studio/common/lib/locale'; +import { defaultI18n } from '@wordpress/i18n'; import { readAppdata } from 'cli/lib/appdata'; async function getLocaleFromAppdata(): Promise< SupportedLocale | undefined > { diff --git a/apps/cli/lib/run-wp-cli-command.ts b/apps/cli/lib/run-wp-cli-command.ts index 3609d74729..8ccd7bd8de 100644 --- a/apps/cli/lib/run-wp-cli-command.ts +++ b/apps/cli/lib/run-wp-cli-command.ts @@ -7,10 +7,10 @@ import { setPhpIniEntries, } from '@php-wasm/universal'; import { createSpawnHandler } from '@php-wasm/util'; -import { __ } from '@wordpress/i18n'; -import { setupPlatformLevelMuPlugins } from '@wp-playground/wordpress'; import { getMuPlugins } from '@studio/common/lib/mu-plugins'; import { LatestSupportedPHPVersion } from '@studio/common/types/php-versions'; +import { __ } from '@wordpress/i18n'; +import { setupPlatformLevelMuPlugins } from '@wp-playground/wordpress'; import { getSqliteCommandPath, getWpCliPharPath } from 'cli/lib/server-files'; const PLAYGROUND_INTERNAL_SHARED_FOLDER = '/internal/shared'; diff --git a/apps/cli/lib/site-utils.ts b/apps/cli/lib/site-utils.ts index b00c6c184a..a6fcd8e42c 100644 --- a/apps/cli/lib/site-utils.ts +++ b/apps/cli/lib/site-utils.ts @@ -1,6 +1,6 @@ -import { __ } from '@wordpress/i18n'; import { decodePassword } from '@studio/common/lib/passwords'; import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; +import { __ } from '@wordpress/i18n'; import { getSiteUrl, readAppdata, SiteData } from 'cli/lib/appdata'; import { openBrowser } from 'cli/lib/browser'; import { generateSiteCertificate } from 'cli/lib/certificate-manager'; diff --git a/apps/cli/lib/snapshots.ts b/apps/cli/lib/snapshots.ts index 68fa936a76..9205ab9b08 100644 --- a/apps/cli/lib/snapshots.ts +++ b/apps/cli/lib/snapshots.ts @@ -1,6 +1,6 @@ -import { __, sprintf } from '@wordpress/i18n'; import { HOUR_MS, DAY_MS, DEMO_SITE_EXPIRATION_DAYS } from '@studio/common/constants'; import { Snapshot } from '@studio/common/types/snapshot'; +import { __, sprintf } from '@wordpress/i18n'; import { addDays, addHours, DurationUnit, formatDuration, intervalToDuration } from 'date-fns'; import { getAuthToken, diff --git a/apps/cli/lib/tests/appdata.test.ts b/apps/cli/lib/tests/appdata.test.ts index 1a7915218b..ff43ecc878 100644 --- a/apps/cli/lib/tests/appdata.test.ts +++ b/apps/cli/lib/tests/appdata.test.ts @@ -1,9 +1,9 @@ import fs from 'fs'; import os from 'os'; import path from 'path'; -import { readFile, writeFile } from 'atomically'; import { arePathsEqual } from '@studio/common/lib/fs-utils'; import { StatsMetric } from '@studio/common/types/stats'; +import { readFile, writeFile } from 'atomically'; import { vi } from 'vitest'; import { readAppdata, diff --git a/apps/cli/lib/validation.ts b/apps/cli/lib/validation.ts index 411ff1607c..61f28f7cf2 100644 --- a/apps/cli/lib/validation.ts +++ b/apps/cli/lib/validation.ts @@ -1,7 +1,7 @@ import path from 'path'; -import { __, sprintf } from '@wordpress/i18n'; import { DEMO_SITE_SIZE_LIMIT_BYTES, DEMO_SITE_SIZE_LIMIT_GB } from '@studio/common/constants'; import { calculateDirectorySize } from '@studio/common/lib/fs-utils'; +import { __, sprintf } from '@wordpress/i18n'; import { LoggerError } from 'cli/logger'; export async function validateSiteSize( siteFolder: string ): Promise< true > { diff --git a/apps/cli/tsconfig.json b/apps/cli/tsconfig.json index a284cdce19..992b90670d 100644 --- a/apps/cli/tsconfig.json +++ b/apps/cli/tsconfig.json @@ -11,11 +11,7 @@ "@studio/common/*": [ "tools/common/*" ] } }, - "include": [ - "**/*" - ], + "include": [ "**/*" ], "exclude": [ "**/__mocks__/**/*", "**/node_modules/**/*", "**/dist/**/*", "**/out/**/*" ], - "references": [ - { "path": "../../tools/common" } - ] + "references": [ { "path": "../../tools/common" } ] } diff --git a/apps/cli/vite.config.ts b/apps/cli/vite.config.ts index 0574fbad0b..adeaa3e709 100644 --- a/apps/cli/vite.config.ts +++ b/apps/cli/vite.config.ts @@ -1,8 +1,7 @@ +import { existsSync, readFileSync } from 'fs'; import { resolve } from 'path'; import { defineConfig } from 'vite'; import { viteStaticCopy } from 'vite-plugin-static-copy'; -import { existsSync } from 'fs'; -import { readFileSync } from 'fs'; const yargsLocalesPath = resolve( __dirname, '../../node_modules/yargs/locales' ); const cliNodeModulesPath = resolve( __dirname, 'node_modules' ); @@ -15,25 +14,25 @@ export default defineConfig( { ...( existsSync( yargsLocalesPath ) ? [ viteStaticCopy( { - targets: [ - { - src: `${ yargsLocalesPath }/*`, - dest: '../locales', - }, - ], - } ), + targets: [ + { + src: `${ yargsLocalesPath }/*`, + dest: '../locales', + }, + ], + } ), ] : [] ), ...( existsSync( cliNodeModulesPath ) ? [ viteStaticCopy( { - targets: [ - { - src: cliNodeModulesPath, - dest: '.', - }, - ], - } ), + targets: [ + { + src: cliNodeModulesPath, + dest: '.', + }, + ], + } ), ] : [] ), ], diff --git a/apps/cli/wordpress-server-child.ts b/apps/cli/wordpress-server-child.ts index a6b7260414..5b35e1d552 100644 --- a/apps/cli/wordpress-server-child.ts +++ b/apps/cli/wordpress-server-child.ts @@ -12,6 +12,13 @@ */ import { cpus } from 'os'; import { dirname } from 'path'; +import { DEFAULT_PHP_VERSION } from '@studio/common/constants'; +import { isWordPressDirectory } from '@studio/common/lib/fs-utils'; +import { getMuPlugins } from '@studio/common/lib/mu-plugins'; +import { decodePassword } from '@studio/common/lib/passwords'; +import { formatPlaygroundCliMessage } from '@studio/common/lib/playground-cli-messages'; +import { sequential } from '@studio/common/lib/sequential'; +import { isWordPressDevVersion } from '@studio/common/lib/wordpress-version-utils'; import { BlueprintBundle } from '@wp-playground/blueprints'; import { runCLI, RunCLIArgs, RunCLIServer, internalsKeyForTesting } from '@wp-playground/cli'; import { @@ -21,13 +28,6 @@ import { InMemoryFilesystem, } from '@wp-playground/storage'; import { WordPressInstallMode } from '@wp-playground/wordpress'; -import { DEFAULT_PHP_VERSION } from '@studio/common/constants'; -import { isWordPressDirectory } from '@studio/common/lib/fs-utils'; -import { getMuPlugins } from '@studio/common/lib/mu-plugins'; -import { decodePassword } from '@studio/common/lib/passwords'; -import { formatPlaygroundCliMessage } from '@studio/common/lib/playground-cli-messages'; -import { sequential } from '@studio/common/lib/sequential'; -import { isWordPressDevVersion } from '@studio/common/lib/wordpress-version-utils'; import { isSqliteInstalled } from 'src/lib/sqlite-versions'; import { z } from 'zod'; import { sanitizeRunCLIArgs } from 'cli/lib/cli-args-sanitizer'; diff --git a/apps/studio/e2e/fixtures/blueprints/run-php-code.json b/apps/studio/e2e/fixtures/blueprints/run-php-code.json index d839811b99..427e8e42ed 100644 --- a/apps/studio/e2e/fixtures/blueprints/run-php-code.json +++ b/apps/studio/e2e/fixtures/blueprints/run-php-code.json @@ -7,4 +7,4 @@ "code": " + - - - About WordPress Studio - - -
- - Studio App Icon -

WordPress Studio

-

x.y.z (...)

- -
-
-

Preview sites powered by
WordPress.com hosting ↗

-
-
-

Local sites powered by
WordPress Playground ↗

-
- - \ No newline at end of file + Studio App Icon +

WordPress Studio

+

x.y.z (...)

+ + +
+

+ Preview sites powered by
WordPress.com hosting ↗ +

+
+
+

+ Local sites powered by
WordPress Playground ↗ +

+
+ + diff --git a/apps/studio/src/components/add-site-with-blueprint-button.tsx b/apps/studio/src/components/add-site-with-blueprint-button.tsx index ef2331c53f..528e527887 100644 --- a/apps/studio/src/components/add-site-with-blueprint-button.tsx +++ b/apps/studio/src/components/add-site-with-blueprint-button.tsx @@ -1,6 +1,6 @@ +import { PROTOCOL_PREFIX } from '@studio/common/constants'; import { __ } from '@wordpress/i18n'; import { plus } from '@wordpress/icons'; -import { PROTOCOL_PREFIX } from '@studio/common/constants'; import Button, { ButtonProps } from 'src/components/button'; import { getIpcApi } from 'src/lib/get-ipc-api'; diff --git a/apps/studio/src/components/content-tab-settings.tsx b/apps/studio/src/components/content-tab-settings.tsx index 9f1945cfbc..d219956734 100644 --- a/apps/studio/src/components/content-tab-settings.tsx +++ b/apps/studio/src/components/content-tab-settings.tsx @@ -1,8 +1,8 @@ +import { decodePassword } from '@studio/common/lib/passwords'; import { DropdownMenu, MenuGroup, Button } from '@wordpress/components'; import { moreVertical } from '@wordpress/icons'; import { useI18n } from '@wordpress/react-i18n'; import { PropsWithChildren } from 'react'; -import { decodePassword } from '@studio/common/lib/passwords'; import { CopyTextButton } from 'src/components/copy-text-button'; import { LearnHowLink } from 'src/components/learn-more'; import { SettingsMenuItem } from 'src/components/settings-site-menu'; diff --git a/apps/studio/src/components/default-error-fallback.tsx b/apps/studio/src/components/default-error-fallback.tsx index e457ab40ff..0fda037efa 100644 --- a/apps/studio/src/components/default-error-fallback.tsx +++ b/apps/studio/src/components/default-error-fallback.tsx @@ -1,9 +1,9 @@ +import { DEFAULT_LOCALE } from '@studio/common/lib/locale'; import { __experimentalVStack as VStack, __experimentalHStack as HStack, } from '@wordpress/components'; import { useI18n } from '@wordpress/react-i18n'; -import { DEFAULT_LOCALE } from '@studio/common/lib/locale'; import Button from 'src/components/button'; import { DynamicStylesheet } from 'src/components/dynamic-stylesheet'; import { isMac, isWindows } from 'src/lib/app-globals'; diff --git a/apps/studio/src/components/tests/content-tab-settings.test.tsx b/apps/studio/src/components/tests/content-tab-settings.test.tsx index 0fca3f1394..b60de18599 100644 --- a/apps/studio/src/components/tests/content-tab-settings.test.tsx +++ b/apps/studio/src/components/tests/content-tab-settings.test.tsx @@ -1,11 +1,11 @@ // To run tests, execute `npm run test -- src/components/tests/content-tab-settings.test.tsx` from the root directory import { UnknownAction } from '@reduxjs/toolkit'; +import { Snapshot } from '@studio/common/types/snapshot'; import { render, screen, waitFor, within } from '@testing-library/react'; import { userEvent } from '@testing-library/user-event'; import { produce } from 'immer'; import { Provider } from 'react-redux'; import { vi } from 'vitest'; -import { Snapshot } from '@studio/common/types/snapshot'; import { ContentTabSettings } from 'src/components/content-tab-settings'; import { useGetWpVersion } from 'src/hooks/use-get-wp-version'; import { useSiteDetails } from 'src/hooks/use-site-details'; diff --git a/apps/studio/src/components/wp-version-selector/index.tsx b/apps/studio/src/components/wp-version-selector/index.tsx index cd4475e7bd..2f17ba3229 100644 --- a/apps/studio/src/components/wp-version-selector/index.tsx +++ b/apps/studio/src/components/wp-version-selector/index.tsx @@ -1,9 +1,9 @@ +import { DEFAULT_WORDPRESS_VERSION, MINIMUM_WORDPRESS_VERSION } from '@studio/common/constants'; +import { isWordPressBetaVersion } from '@studio/common/lib/wordpress-version-utils'; import { SelectControl, Icon } from '@wordpress/components'; import { info } from '@wordpress/icons'; import { useI18n } from '@wordpress/react-i18n'; import { useEffect } from 'react'; -import { DEFAULT_WORDPRESS_VERSION, MINIMUM_WORDPRESS_VERSION } from '@studio/common/constants'; -import { isWordPressBetaVersion } from '@studio/common/lib/wordpress-version-utils'; import offlineIcon from 'src/components/offline-icon'; import { Tooltip } from 'src/components/tooltip'; import { useOffline } from 'src/hooks/use-offline'; diff --git a/apps/studio/src/hooks/use-add-site.ts b/apps/studio/src/hooks/use-add-site.ts index bb74a8feb0..332153a15e 100644 --- a/apps/studio/src/hooks/use-add-site.ts +++ b/apps/studio/src/hooks/use-add-site.ts @@ -1,9 +1,9 @@ import * as Sentry from '@sentry/electron/renderer'; -import { useI18n } from '@wordpress/react-i18n'; -import { useCallback, useMemo, useState } from 'react'; import { updateBlueprintWithFormValues } from '@studio/common/lib/blueprint-settings'; import { BlueprintValidationWarning } from '@studio/common/lib/blueprint-validation'; import { generateCustomDomainFromSiteName } from '@studio/common/lib/domains'; +import { useI18n } from '@wordpress/react-i18n'; +import { useCallback, useMemo, useState } from 'react'; import { useSyncSites } from 'src/hooks/sync-sites'; import { useContentTabs } from 'src/hooks/use-content-tabs'; import { useImportExport } from 'src/hooks/use-import-export'; diff --git a/apps/studio/src/hooks/use-expiration-date.ts b/apps/studio/src/hooks/use-expiration-date.ts index 9e817bea78..47afaf72d2 100644 --- a/apps/studio/src/hooks/use-expiration-date.ts +++ b/apps/studio/src/hooks/use-expiration-date.ts @@ -1,7 +1,7 @@ -import { useI18n } from '@wordpress/react-i18n'; -import { intervalToDuration, formatDuration, addDays, DurationUnit, addHours } from 'date-fns'; import { HOUR_MS, DAY_MS, DEMO_SITE_EXPIRATION_DAYS } from '@studio/common/constants'; import { SupportedLocale } from '@studio/common/lib/locale'; +import { useI18n } from '@wordpress/react-i18n'; +import { intervalToDuration, formatDuration, addDays, DurationUnit, addHours } from 'date-fns'; import { formatDistance } from 'src/lib/date'; import { useI18nLocale } from 'src/stores'; diff --git a/apps/studio/src/hooks/use-site-details.tsx b/apps/studio/src/hooks/use-site-details.tsx index 62802a62ed..50d147ac57 100644 --- a/apps/studio/src/hooks/use-site-details.tsx +++ b/apps/studio/src/hooks/use-site-details.tsx @@ -1,3 +1,5 @@ +import { SITE_EVENTS, SiteEvent } from '@studio/common/lib/site-events'; +import { sortSites } from '@studio/common/lib/sort-sites'; import { __, sprintf } from '@wordpress/i18n'; import { ReactNode, @@ -8,8 +10,6 @@ import { useMemo, useState, } from 'react'; -import { SITE_EVENTS, SiteEvent } from '@studio/common/lib/site-events'; -import { sortSites } from '@studio/common/lib/sort-sites'; import { useAuth } from 'src/hooks/use-auth'; import { useContentTabs } from 'src/hooks/use-content-tabs'; import { useIpcListener } from 'src/hooks/use-ipc-listener'; diff --git a/apps/studio/src/hooks/use-site-size.ts b/apps/studio/src/hooks/use-site-size.ts index c2c9b18664..8fb3c8d07f 100644 --- a/apps/studio/src/hooks/use-site-size.ts +++ b/apps/studio/src/hooks/use-site-size.ts @@ -1,5 +1,5 @@ -import { useState, useEffect, useCallback } from 'react'; import { DEMO_SITE_SIZE_LIMIT_BYTES } from '@studio/common/constants'; +import { useState, useEffect, useCallback } from 'react'; import { useWindowListener } from 'src/hooks/use-window-listener'; import { getIpcApi } from 'src/lib/get-ipc-api'; diff --git a/apps/studio/src/index.css b/apps/studio/src/index.css index e8a62af924..b4d5e8ca62 100644 --- a/apps/studio/src/index.css +++ b/apps/studio/src/index.css @@ -11,11 +11,16 @@ body { font-family: - -apple-system, BlinkMacSystemFont, /* macOS/iOS system UI */ - 'Segoe UI', Roboto, /* Windows + Android system UI */ - 'Apple Color Emoji', 'Segoe UI Emoji', 'Noto Color Emoji', /* emoji */ - 'Noto Sans', 'Arial Unicode MS', /* broad Unicode coverage */ - sans-serif; + -apple-system, + BlinkMacSystemFont, + /* macOS/iOS system UI */ 'Segoe UI', + Roboto, + /* Windows + Android system UI */ 'Apple Color Emoji', + 'Segoe UI Emoji', + 'Noto Color Emoji', + /* emoji */ 'Noto Sans', + 'Arial Unicode MS', + /* broad Unicode coverage */ sans-serif; } .app-drag-region { diff --git a/apps/studio/src/index.ts b/apps/studio/src/index.ts index fa86e35e9f..bb5e137d97 100644 --- a/apps/studio/src/index.ts +++ b/apps/studio/src/index.ts @@ -12,12 +12,6 @@ import { import path from 'path'; import { pathToFileURL } from 'url'; import * as Sentry from '@sentry/electron/main'; -import { __, _n, sprintf } from '@wordpress/i18n'; -import { - installExtension, - REACT_DEVELOPER_TOOLS, - REDUX_DEVTOOLS, -} from 'electron-devtools-installer'; import { PROTOCOL_PREFIX } from '@studio/common/constants'; import { bumpStat, @@ -27,6 +21,12 @@ import { } from '@studio/common/lib/bump-stat'; import { suppressPunycodeWarning } from '@studio/common/lib/suppress-punycode-warning'; import { StatsGroup } from '@studio/common/types/stats'; +import { __, _n, sprintf } from '@wordpress/i18n'; +import { + installExtension, + REACT_DEVELOPER_TOOLS, + REDUX_DEVTOOLS, +} from 'electron-devtools-installer'; import { IPC_VOID_HANDLERS } from 'src/constants'; import * as ipcHandlers from 'src/ipc-handlers'; import { diff --git a/apps/studio/src/ipc-handlers.ts b/apps/studio/src/ipc-handlers.ts index d35b7d6c03..f967e0faa1 100644 --- a/apps/studio/src/ipc-handlers.ts +++ b/apps/studio/src/ipc-handlers.ts @@ -17,7 +17,6 @@ import https from 'node:https'; import os from 'os'; import nodePath from 'path'; import * as Sentry from '@sentry/electron/main'; -import { __, sprintf, LocaleData, defaultI18n } from '@wordpress/i18n'; import { validateBlueprintData } from '@studio/common/lib/blueprint-validation'; import { bumpStat } from '@studio/common/lib/bump-stat'; import { parseCliError, errorMessageContains } from '@studio/common/lib/cli-error'; @@ -37,6 +36,7 @@ import { sanitizeFolderName } from '@studio/common/lib/sanitize-folder-name'; import { isWordPressDevVersion } from '@studio/common/lib/wordpress-version-utils'; import { Snapshot } from '@studio/common/types/snapshot'; import { StatsGroup, StatsMetric } from '@studio/common/types/stats'; +import { __, sprintf, LocaleData, defaultI18n } from '@wordpress/i18n'; import { MAIN_MIN_WIDTH, SIDEBAR_WIDTH } from 'src/constants'; import { sendIpcEventToRendererWithWindow } from 'src/ipc-utils'; import { getBetaFeatures as getBetaFeaturesFromLib } from 'src/lib/beta-features'; diff --git a/apps/studio/src/lib/deeplink/handlers/add-site-with-blueprint.ts b/apps/studio/src/lib/deeplink/handlers/add-site-with-blueprint.ts index 674a2ce43f..2ee8b65d11 100644 --- a/apps/studio/src/lib/deeplink/handlers/add-site-with-blueprint.ts +++ b/apps/studio/src/lib/deeplink/handlers/add-site-with-blueprint.ts @@ -1,8 +1,8 @@ import { app, dialog, shell } from 'electron'; import nodePath from 'path'; +import { validateBlueprintData } from '@studio/common/lib/blueprint-validation'; import { __ } from '@wordpress/i18n'; import fs from 'fs-extra'; -import { validateBlueprintData } from '@studio/common/lib/blueprint-validation'; import { sendIpcEventToRenderer } from 'src/ipc-utils'; import { download } from 'src/lib/download'; import { getLogsFilePath } from 'src/logging'; diff --git a/apps/studio/src/lib/deeplink/tests/add-site.test.ts b/apps/studio/src/lib/deeplink/tests/add-site.test.ts index cdd2f6d662..1b8369d568 100644 --- a/apps/studio/src/lib/deeplink/tests/add-site.test.ts +++ b/apps/studio/src/lib/deeplink/tests/add-site.test.ts @@ -1,7 +1,7 @@ import { app, dialog, shell, BrowserWindow } from 'electron'; +import { validateBlueprintData } from '@studio/common/lib/blueprint-validation'; import fs from 'fs-extra'; import { vi, beforeAll, afterAll } from 'vitest'; -import { validateBlueprintData } from '@studio/common/lib/blueprint-validation'; import { sendIpcEventToRenderer } from 'src/ipc-utils'; import { handleAddSiteWithBlueprint } from 'src/lib/deeplink/handlers/add-site-with-blueprint'; import { download } from 'src/lib/download'; diff --git a/apps/studio/src/lib/download-utils.ts b/apps/studio/src/lib/download-utils.ts index 0c90fcf1c8..c3bb09d248 100644 --- a/apps/studio/src/lib/download-utils.ts +++ b/apps/studio/src/lib/download-utils.ts @@ -6,10 +6,10 @@ import { IncomingMessage } from 'http'; import os from 'os'; import path from 'path'; +import { extractZip } from '@studio/common/lib/extract-zip'; import followRedirects, { FollowResponse } from 'follow-redirects'; import fs from 'fs-extra'; import { HttpProxyAgent, HttpsProxyAgent } from 'hpagent'; -import { extractZip } from '@studio/common/lib/extract-zip'; import { getWordPressVersionPath, getWpCliPath } from './server-files-paths'; const { https } = followRedirects; diff --git a/apps/studio/src/lib/import-export/import/importers/importer.ts b/apps/studio/src/lib/import-export/import/importers/importer.ts index f57249ea10..ee56f87369 100644 --- a/apps/studio/src/lib/import-export/import/importers/importer.ts +++ b/apps/studio/src/lib/import-export/import/importers/importer.ts @@ -4,10 +4,10 @@ import fs, { createReadStream, createWriteStream } from 'fs'; import fsPromises from 'fs/promises'; import path from 'path'; import { createInterface } from 'readline'; -import { lstat, move } from 'fs-extra'; -import semver from 'semver'; import { DEFAULT_PHP_VERSION } from '@studio/common/constants'; import { SupportedPHPVersionsList } from '@studio/common/types/php-versions'; +import { lstat, move } from 'fs-extra'; +import semver from 'semver'; import { getSiteUrl } from 'src/lib/get-site-url'; import { generateBackupFilename } from 'src/lib/import-export/export/generate-backup-filename'; import { ImportEvents } from 'src/lib/import-export/import/events'; diff --git a/apps/studio/src/lib/oauth.ts b/apps/studio/src/lib/oauth.ts index c42ee6ac85..e59f151520 100644 --- a/apps/studio/src/lib/oauth.ts +++ b/apps/studio/src/lib/oauth.ts @@ -1,7 +1,7 @@ -import { z } from 'zod'; import { CLIENT_ID } from '@studio/common/constants'; import { SupportedLocale } from '@studio/common/lib/locale'; import { getAuthenticationUrl } from '@studio/common/lib/oauth'; +import { z } from 'zod'; import { loadUserData } from 'src/storage/user-data'; const authTokenSchema = z.object( { diff --git a/apps/studio/src/lib/site-language.ts b/apps/studio/src/lib/site-language.ts index 3188e08777..1645d9722d 100644 --- a/apps/studio/src/lib/site-language.ts +++ b/apps/studio/src/lib/site-language.ts @@ -1,8 +1,8 @@ import path from 'path'; import { Locale } from '@formatjs/intl-locale'; import { match } from '@formatjs/intl-localematcher'; -import fs from 'fs-extra'; import { DEFAULT_LOCALE } from '@studio/common/lib/locale'; +import fs from 'fs-extra'; import { getUserLocaleWithFallback } from 'src/lib/locale-node'; import { getResourcesPath } from 'src/storage/paths'; diff --git a/apps/studio/src/lib/tests/bump-stats.test.ts b/apps/studio/src/lib/tests/bump-stats.test.ts index b4e5cc0889..3468147df2 100644 --- a/apps/studio/src/lib/tests/bump-stats.test.ts +++ b/apps/studio/src/lib/tests/bump-stats.test.ts @@ -1,6 +1,3 @@ -import { waitFor } from '@testing-library/react'; -import { readFile, writeFile } from 'atomically'; -import { vi } from 'vitest'; import { bumpStat, bumpAggregatedUniqueStat, @@ -8,6 +5,9 @@ import { LastBumpStatsData, } from '@studio/common/lib/bump-stat'; import { AggregateInterval, StatsGroup, StatsMetric } from '@studio/common/types/stats'; +import { waitFor } from '@testing-library/react'; +import { readFile, writeFile } from 'atomically'; +import { vi } from 'vitest'; vi.mock( 'atomically', () => ( { readFile: vi.fn(), diff --git a/apps/studio/src/lib/tests/locale.test.ts b/apps/studio/src/lib/tests/locale.test.ts index 801f140bd9..8144a5fe3f 100644 --- a/apps/studio/src/lib/tests/locale.test.ts +++ b/apps/studio/src/lib/tests/locale.test.ts @@ -2,9 +2,9 @@ * @vitest-environment node */ import { app } from 'electron'; +import { getLocaleData } from '@studio/common/lib/locale'; import { createI18n } from '@wordpress/i18n'; import { vi } from 'vitest'; -import { getLocaleData } from '@studio/common/lib/locale'; import { getSupportedLocale } from 'src/lib/locale-node'; vi.mocked( app ).getLocale = vi.fn(); diff --git a/apps/studio/src/lib/tests/oauth.test.ts b/apps/studio/src/lib/tests/oauth.test.ts index 141b1d2b07..ceb4db103a 100644 --- a/apps/studio/src/lib/tests/oauth.test.ts +++ b/apps/studio/src/lib/tests/oauth.test.ts @@ -1,6 +1,6 @@ +import { SupportedLocale } from '@studio/common/lib/locale'; import { readFile } from 'atomically'; import { vi } from 'vitest'; -import { SupportedLocale } from '@studio/common/lib/locale'; import { getAuthenticationToken, getSignUpUrl } from 'src/lib/oauth'; vi.mock( 'src/lib/certificate-manager', () => ( {} ) ); diff --git a/apps/studio/src/lib/wp-versions.ts b/apps/studio/src/lib/wp-versions.ts index f9304c2305..0c759c31c3 100644 --- a/apps/studio/src/lib/wp-versions.ts +++ b/apps/studio/src/lib/wp-versions.ts @@ -1,7 +1,7 @@ import path from 'path'; +import { recursiveCopyDirectory } from '@studio/common/lib/fs-utils'; import fs from 'fs-extra'; import semver from 'semver'; -import { recursiveCopyDirectory } from '@studio/common/lib/fs-utils'; import { downloadWordPress } from 'src/lib/download-utils'; import { getWordPressVersionPath } from 'src/lib/server-files-paths'; diff --git a/apps/studio/src/modules/add-site/components/blueprint-deeplink.tsx b/apps/studio/src/modules/add-site/components/blueprint-deeplink.tsx index 26ea4d248d..17d77917ee 100644 --- a/apps/studio/src/modules/add-site/components/blueprint-deeplink.tsx +++ b/apps/studio/src/modules/add-site/components/blueprint-deeplink.tsx @@ -1,3 +1,4 @@ +import { BlueprintValidationWarning } from '@studio/common/lib/blueprint-validation'; import { __experimentalVStack as VStack, __experimentalHStack as HStack, @@ -7,7 +8,6 @@ import { } from '@wordpress/components'; import { check, link } from '@wordpress/icons'; import { useI18n } from '@wordpress/react-i18n'; -import { BlueprintValidationWarning } from '@studio/common/lib/blueprint-validation'; import { Blueprint } from 'src/stores/wpcom-api'; import { BlueprintWarningNotice } from './blueprint-warning-notice'; diff --git a/apps/studio/src/modules/add-site/components/blueprint-warning-notice.tsx b/apps/studio/src/modules/add-site/components/blueprint-warning-notice.tsx index 677af870a3..35876b38b2 100644 --- a/apps/studio/src/modules/add-site/components/blueprint-warning-notice.tsx +++ b/apps/studio/src/modules/add-site/components/blueprint-warning-notice.tsx @@ -1,3 +1,4 @@ +import { BlueprintValidationWarning } from '@studio/common/lib/blueprint-validation'; import { __experimentalVStack as VStack, __experimentalHStack as HStack, @@ -9,7 +10,6 @@ import { import { Icon, caution, check } from '@wordpress/icons'; import { useI18n } from '@wordpress/react-i18n'; import { useState } from 'react'; -import { BlueprintValidationWarning } from '@studio/common/lib/blueprint-validation'; interface BlueprintIssuesModalProps { warnings: BlueprintValidationWarning[] | undefined; diff --git a/apps/studio/src/modules/add-site/components/create-site-form.tsx b/apps/studio/src/modules/add-site/components/create-site-form.tsx index 02d0e4fba3..f2002019b9 100644 --- a/apps/studio/src/modules/add-site/components/create-site-form.tsx +++ b/apps/studio/src/modules/add-site/components/create-site-form.tsx @@ -1,12 +1,15 @@ +import { DEFAULT_WORDPRESS_VERSION } from '@studio/common/constants'; +import { + generateCustomDomainFromSiteName, + getDomainNameValidationError, +} from '@studio/common/lib/domains'; +import { SupportedPHPVersions } from '@studio/common/types/php-versions'; import { Icon, SelectControl, Notice } from '@wordpress/components'; import { createInterpolateElement } from '@wordpress/element'; import { __, sprintf, _n } from '@wordpress/i18n'; import { tip, cautionFilled, chevronRight, chevronDown, chevronLeft } from '@wordpress/icons'; import { useI18n } from '@wordpress/react-i18n'; import { FormEvent, useState, useEffect, useCallback, useMemo, useRef, RefObject } from 'react'; -import { DEFAULT_WORDPRESS_VERSION } from '@studio/common/constants'; -import { generateCustomDomainFromSiteName, getDomainNameValidationError } from '@studio/common/lib/domains'; -import { SupportedPHPVersions } from '@studio/common/types/php-versions'; import Button from 'src/components/button'; import FolderIcon from 'src/components/folder-icon'; import { LearnMoreLink, LearnHowLink } from 'src/components/learn-more'; diff --git a/apps/studio/src/modules/add-site/hooks/use-blueprint-deeplink.ts b/apps/studio/src/modules/add-site/hooks/use-blueprint-deeplink.ts index 73685281f9..c6379a016a 100644 --- a/apps/studio/src/modules/add-site/hooks/use-blueprint-deeplink.ts +++ b/apps/studio/src/modules/add-site/hooks/use-blueprint-deeplink.ts @@ -1,10 +1,10 @@ -import { useI18n } from '@wordpress/react-i18n'; -import { useCallback } from 'react'; import { extractFormValuesFromBlueprint } from '@studio/common/lib/blueprint-settings'; import { BlueprintValidationWarning, BlueprintPreferredVersions, } from '@studio/common/lib/blueprint-validation'; +import { useI18n } from '@wordpress/react-i18n'; +import { useCallback } from 'react'; import { useIpcListener } from 'src/hooks/use-ipc-listener'; import { getIpcApi } from 'src/lib/get-ipc-api'; import { Blueprint } from 'src/stores/wpcom-api'; diff --git a/apps/studio/src/modules/add-site/index.tsx b/apps/studio/src/modules/add-site/index.tsx index 535bfb665a..6f26c3f3dd 100644 --- a/apps/studio/src/modules/add-site/index.tsx +++ b/apps/studio/src/modules/add-site/index.tsx @@ -1,12 +1,12 @@ +import { MINIMUM_WORDPRESS_VERSION } from '@studio/common/constants'; +import { extractFormValuesFromBlueprint } from '@studio/common/lib/blueprint-settings'; +import { BlueprintPreferredVersions } from '@studio/common/lib/blueprint-validation'; +import { SupportedPHPVersionsList } from '@studio/common/types/php-versions'; import { speak } from '@wordpress/a11y'; import { Navigator, useNavigator } from '@wordpress/components'; import { sprintf } from '@wordpress/i18n'; import { useI18n } from '@wordpress/react-i18n'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { MINIMUM_WORDPRESS_VERSION } from '@studio/common/constants'; -import { extractFormValuesFromBlueprint } from '@studio/common/lib/blueprint-settings'; -import { BlueprintPreferredVersions } from '@studio/common/lib/blueprint-validation'; -import { SupportedPHPVersionsList } from '@studio/common/types/php-versions'; import Button from 'src/components/button'; import { FullscreenModal } from 'src/components/fullscreen-modal'; import { useAddSite, CreateSiteFormValues } from 'src/hooks/use-add-site'; diff --git a/apps/studio/src/modules/cli/lib/cli-events-subscriber.ts b/apps/studio/src/modules/cli/lib/cli-events-subscriber.ts index 06df10c359..f5338f73af 100644 --- a/apps/studio/src/modules/cli/lib/cli-events-subscriber.ts +++ b/apps/studio/src/modules/cli/lib/cli-events-subscriber.ts @@ -1,6 +1,11 @@ -import { z } from 'zod'; import { sequential } from '@studio/common/lib/sequential'; -import { siteEventSchema, SiteEvent, SITE_EVENTS, SiteDetails } from '@studio/common/lib/site-events'; +import { + siteEventSchema, + SiteEvent, + SITE_EVENTS, + SiteDetails, +} from '@studio/common/lib/site-events'; +import { z } from 'zod'; import { sendIpcEventToRenderer } from 'src/ipc-utils'; import { executeCliCommand } from 'src/modules/cli/lib/execute-command'; import { SiteServer } from 'src/site-server'; diff --git a/apps/studio/src/modules/cli/lib/cli-server-process.ts b/apps/studio/src/modules/cli/lib/cli-server-process.ts index 3987965505..18d2b2f65c 100644 --- a/apps/studio/src/modules/cli/lib/cli-server-process.ts +++ b/apps/studio/src/modules/cli/lib/cli-server-process.ts @@ -1,5 +1,5 @@ -import { z } from 'zod'; import { SiteCommandLoggerAction } from '@studio/common/logger-actions'; +import { z } from 'zod'; import { executeCliCommand } from './execute-command'; import type { WordPressServerProcess } from 'src/lib/wordpress-server-types'; diff --git a/apps/studio/src/modules/cli/lib/cli-site-creator.ts b/apps/studio/src/modules/cli/lib/cli-site-creator.ts index 3f1e95659b..553f123ffc 100644 --- a/apps/studio/src/modules/cli/lib/cli-site-creator.ts +++ b/apps/studio/src/modules/cli/lib/cli-site-creator.ts @@ -1,9 +1,9 @@ import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; -import { z } from 'zod'; import { isWordPressDevVersion } from '@studio/common/lib/wordpress-version-utils'; import { SiteCommandLoggerAction } from '@studio/common/logger-actions'; +import { z } from 'zod'; import { sendIpcEventToRenderer } from 'src/ipc-utils'; import { executeCliCommand } from './execute-command'; import type { Blueprint } from '@wp-playground/blueprints'; diff --git a/apps/studio/src/modules/cli/lib/cli-site-editor.ts b/apps/studio/src/modules/cli/lib/cli-site-editor.ts index 48a005ab44..67da71d8fd 100644 --- a/apps/studio/src/modules/cli/lib/cli-site-editor.ts +++ b/apps/studio/src/modules/cli/lib/cli-site-editor.ts @@ -1,5 +1,5 @@ -import { z } from 'zod'; import { SiteCommandLoggerAction } from '@studio/common/logger-actions'; +import { z } from 'zod'; import { executeCliCommand } from './execute-command'; const cliEventSchema = z.object( { diff --git a/apps/studio/src/modules/cli/lib/execute-preview-command.ts b/apps/studio/src/modules/cli/lib/execute-preview-command.ts index e83585063d..e210f24cc3 100644 --- a/apps/studio/src/modules/cli/lib/execute-preview-command.ts +++ b/apps/studio/src/modules/cli/lib/execute-preview-command.ts @@ -1,6 +1,6 @@ import crypto from 'crypto'; -import { z } from 'zod'; import { PreviewCommandLoggerAction } from '@studio/common/logger-actions'; +import { z } from 'zod'; import { sendIpcEventToRendererWithWindow } from 'src/ipc-utils'; import { executeCliCommand } from 'src/modules/cli/lib/execute-command'; diff --git a/apps/studio/src/modules/cli/lib/macos-installation-manager.ts b/apps/studio/src/modules/cli/lib/macos-installation-manager.ts index 88522c9ee7..a33e317897 100644 --- a/apps/studio/src/modules/cli/lib/macos-installation-manager.ts +++ b/apps/studio/src/modules/cli/lib/macos-installation-manager.ts @@ -2,8 +2,8 @@ import { dialog } from 'electron'; import { mkdir, readlink, symlink, unlink, lstat } from 'node:fs/promises'; import path from 'node:path'; import * as Sentry from '@sentry/electron/main'; -import { __, sprintf } from '@wordpress/i18n'; import { isErrnoException } from '@studio/common/lib/is-errno-exception'; +import { __, sprintf } from '@wordpress/i18n'; import { sudoExec } from 'src/lib/sudo-exec'; import { getMainWindow } from 'src/main-window'; import { StudioCliInstallationManager } from 'src/modules/cli/lib/ipc-handlers'; diff --git a/apps/studio/src/modules/preview-site/components/create-preview-button.tsx b/apps/studio/src/modules/preview-site/components/create-preview-button.tsx index a65dc64a6a..9b8cf12ccd 100644 --- a/apps/studio/src/modules/preview-site/components/create-preview-button.tsx +++ b/apps/studio/src/modules/preview-site/components/create-preview-button.tsx @@ -1,6 +1,6 @@ +import { DEMO_SITE_SIZE_LIMIT_GB } from '@studio/common/constants'; import { __, sprintf } from '@wordpress/i18n'; import { useI18n } from '@wordpress/react-i18n'; -import { DEMO_SITE_SIZE_LIMIT_GB } from '@studio/common/constants'; import { AuthContextType } from 'src/components/auth-provider'; import Button from 'src/components/button'; import offlineIcon from 'src/components/offline-icon'; diff --git a/apps/studio/src/modules/preview-site/components/preview-action-buttons-menu.tsx b/apps/studio/src/modules/preview-site/components/preview-action-buttons-menu.tsx index 90ac2c1d75..b3b3d51c65 100644 --- a/apps/studio/src/modules/preview-site/components/preview-action-buttons-menu.tsx +++ b/apps/studio/src/modules/preview-site/components/preview-action-buttons-menu.tsx @@ -1,9 +1,9 @@ +import { Snapshot } from '@studio/common/types/snapshot'; import { DropdownMenu, MenuGroup, MenuItem } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; import { moreVertical } from '@wordpress/icons'; import { useI18n } from '@wordpress/react-i18n'; import { useState } from 'react'; -import { Snapshot } from '@studio/common/types/snapshot'; import offlineIcon from 'src/components/offline-icon'; import { Tooltip, TooltipProps } from 'src/components/tooltip'; import { useConfirmationDialog } from 'src/hooks/use-confirmation-dialog'; diff --git a/apps/studio/src/modules/preview-site/components/preview-site-row.tsx b/apps/studio/src/modules/preview-site/components/preview-site-row.tsx index 4d01b96f68..d2fae0f02e 100644 --- a/apps/studio/src/modules/preview-site/components/preview-site-row.tsx +++ b/apps/studio/src/modules/preview-site/components/preview-site-row.tsx @@ -1,9 +1,9 @@ +import { Snapshot } from '@studio/common/types/snapshot'; import { Spinner } from '@wordpress/components'; import { sprintf } from '@wordpress/i18n'; import { Icon, published, cautionFilled } from '@wordpress/icons'; import { useI18n } from '@wordpress/react-i18n'; import { useEffect, useState, useRef } from 'react'; -import { Snapshot } from '@studio/common/types/snapshot'; import { ArrowIcon } from 'src/components/arrow-icon'; import Button from 'src/components/button'; import { TooltipProps, Tooltip } from 'src/components/tooltip'; diff --git a/apps/studio/src/modules/preview-site/components/tests/preview-action-buttons-menu.test.tsx b/apps/studio/src/modules/preview-site/components/tests/preview-action-buttons-menu.test.tsx index ac7ae38ed8..98744405f2 100644 --- a/apps/studio/src/modules/preview-site/components/tests/preview-action-buttons-menu.test.tsx +++ b/apps/studio/src/modules/preview-site/components/tests/preview-action-buttons-menu.test.tsx @@ -1,10 +1,10 @@ import { UnknownAction } from '@reduxjs/toolkit'; +import { Snapshot } from '@studio/common/types/snapshot'; import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { produce } from 'immer'; import { Provider } from 'react-redux'; import { vi } from 'vitest'; -import { Snapshot } from '@studio/common/types/snapshot'; import { PreviewActionButtonsMenu } from 'src/modules/preview-site/components/preview-action-buttons-menu'; import { store, RootState } from 'src/stores'; import { testActions, testReducer } from 'src/stores/tests/utils/test-reducer'; diff --git a/apps/studio/src/modules/preview-site/hooks/use-update-button-tooltip.ts b/apps/studio/src/modules/preview-site/hooks/use-update-button-tooltip.ts index ffe711003d..d8462dd5c5 100644 --- a/apps/studio/src/modules/preview-site/hooks/use-update-button-tooltip.ts +++ b/apps/studio/src/modules/preview-site/hooks/use-update-button-tooltip.ts @@ -1,8 +1,8 @@ +import { DEMO_SITE_SIZE_LIMIT_GB } from '@studio/common/constants'; import { TooltipProps } from '@wordpress/components/build-types/tooltip/types'; import { sprintf } from '@wordpress/i18n'; import { useI18n } from '@wordpress/react-i18n'; import { useMemo } from 'react'; -import { DEMO_SITE_SIZE_LIMIT_GB } from '@studio/common/constants'; import offlineIcon from 'src/components/offline-icon'; export function useUpdateButtonTooltip( { diff --git a/apps/studio/src/modules/preview-site/lib/version-comparison.ts b/apps/studio/src/modules/preview-site/lib/version-comparison.ts index 91dc1ed33f..904be6e83e 100644 --- a/apps/studio/src/modules/preview-site/lib/version-comparison.ts +++ b/apps/studio/src/modules/preview-site/lib/version-comparison.ts @@ -1,5 +1,5 @@ -import semver from 'semver'; import { RecommendedPHPVersion as DEFAULT_PHP_VERSION } from '@studio/common/types/php-versions'; +import semver from 'semver'; /** * Compares the WordPress and PHP versions of the current site with the versions supported by Jurassic Ninja preview sites. diff --git a/apps/studio/src/modules/site-settings/edit-site-details.tsx b/apps/studio/src/modules/site-settings/edit-site-details.tsx index ec195e4caa..bc0a189b97 100644 --- a/apps/studio/src/modules/site-settings/edit-site-details.tsx +++ b/apps/studio/src/modules/site-settings/edit-site-details.tsx @@ -1,12 +1,15 @@ +import { DEFAULT_PHP_VERSION } from '@studio/common/constants'; +import { + generateCustomDomainFromSiteName, + getDomainNameValidationError, +} from '@studio/common/lib/domains'; +import { siteNeedsRestart } from '@studio/common/lib/site-needs-restart'; +import { SupportedPHPVersions } from '@studio/common/types/php-versions'; import { SelectControl } from '@wordpress/components'; import { createInterpolateElement } from '@wordpress/element'; import { sprintf } from '@wordpress/i18n'; import { useI18n } from '@wordpress/react-i18n'; import { FormEvent, useCallback, useEffect, useState } from 'react'; -import { DEFAULT_PHP_VERSION } from '@studio/common/constants'; -import { generateCustomDomainFromSiteName, getDomainNameValidationError } from '@studio/common/lib/domains'; -import { siteNeedsRestart } from '@studio/common/lib/site-needs-restart'; -import { SupportedPHPVersions } from '@studio/common/types/php-versions'; import Button from 'src/components/button'; import { ErrorInformation } from 'src/components/error-information'; import { LearnMoreLink, LearnHowLink } from 'src/components/learn-more'; diff --git a/apps/studio/src/modules/sync/lib/ipc-handlers.ts b/apps/studio/src/modules/sync/lib/ipc-handlers.ts index 8e0d8cec2e..6d5242cb35 100644 --- a/apps/studio/src/modules/sync/lib/ipc-handlers.ts +++ b/apps/studio/src/modules/sync/lib/ipc-handlers.ts @@ -3,9 +3,9 @@ import fs from 'fs'; import fsPromises from 'fs/promises'; import path from 'node:path'; import * as Sentry from '@sentry/electron/main'; +import { isErrnoException } from '@studio/common/lib/is-errno-exception'; import { Upload } from 'tus-js-client'; import { z } from 'zod'; -import { isErrnoException } from '@studio/common/lib/is-errno-exception'; import { PullStateProgressInfo, PushStateProgressInfo, diff --git a/apps/studio/src/modules/user-settings/components/language-picker.tsx b/apps/studio/src/modules/user-settings/components/language-picker.tsx index d79efd7ed4..0ec9535f8a 100644 --- a/apps/studio/src/modules/user-settings/components/language-picker.tsx +++ b/apps/studio/src/modules/user-settings/components/language-picker.tsx @@ -1,6 +1,6 @@ +import { SupportedLocale, supportedLocaleNames } from '@studio/common/lib/locale'; import { SelectControl } from '@wordpress/components'; import { useI18n } from '@wordpress/react-i18n'; -import { SupportedLocale, supportedLocaleNames } from '@studio/common/lib/locale'; import { SettingsFormField } from './settings-form-field'; interface LanguagePickerProps { diff --git a/apps/studio/src/modules/user-settings/components/preferences-tab.tsx b/apps/studio/src/modules/user-settings/components/preferences-tab.tsx index eaf9b4ef84..dd6363816e 100644 --- a/apps/studio/src/modules/user-settings/components/preferences-tab.tsx +++ b/apps/studio/src/modules/user-settings/components/preferences-tab.tsx @@ -1,6 +1,6 @@ +import { SupportedLocale } from '@studio/common/lib/locale'; import { useI18n } from '@wordpress/react-i18n'; import { useState } from 'react'; -import { SupportedLocale } from '@studio/common/lib/locale'; import Button from 'src/components/button'; import { EditorPicker } from 'src/modules/user-settings/components/editor-picker'; import { LanguagePicker } from 'src/modules/user-settings/components/language-picker'; diff --git a/apps/studio/src/setup-wp-server-files.ts b/apps/studio/src/setup-wp-server-files.ts index 6e64b66a44..c772b0f274 100644 --- a/apps/studio/src/setup-wp-server-files.ts +++ b/apps/studio/src/setup-wp-server-files.ts @@ -1,7 +1,7 @@ import path from 'path'; +import { recursiveCopyDirectory } from '@studio/common/lib/fs-utils'; import fs from 'fs-extra'; import semver from 'semver'; -import { recursiveCopyDirectory } from '@studio/common/lib/fs-utils'; import { updateLatestWPCliVersion } from 'src/lib/download-utils'; import { getWordPressVersionPath, getSqlitePath, getWpCliPath } from 'src/lib/server-files-paths'; import { diff --git a/apps/studio/src/site-server.ts b/apps/studio/src/site-server.ts index 7cb2881f14..c8b967269e 100644 --- a/apps/studio/src/site-server.ts +++ b/apps/studio/src/site-server.ts @@ -1,10 +1,10 @@ import fs from 'fs'; import nodePath from 'path'; import * as Sentry from '@sentry/electron/main'; +import { SQLITE_FILENAME } from '@studio/common/constants'; import fsExtra from 'fs-extra'; import { parse } from 'shell-quote'; import { z } from 'zod'; -import { SQLITE_FILENAME } from '@studio/common/constants'; import { WP_CLI_DEFAULT_RESPONSE_TIMEOUT, WP_CLI_IMPORT_EXPORT_RESPONSE_TIMEOUT, diff --git a/apps/studio/src/storage/user-data.ts b/apps/studio/src/storage/user-data.ts index 26378d91e7..0a6acb49f3 100644 --- a/apps/studio/src/storage/user-data.ts +++ b/apps/studio/src/storage/user-data.ts @@ -2,13 +2,13 @@ import { app } from 'electron'; import fs from 'fs'; import nodePath from 'node:path'; import * as Sentry from '@sentry/electron/main'; -import { readFile, writeFile } from 'atomically'; -import semver from 'semver'; import { LOCKFILE_STALE_TIME, LOCKFILE_WAIT_TIME } from '@studio/common/constants'; import { isErrnoException } from '@studio/common/lib/is-errno-exception'; import { lockFileAsync, unlockFileAsync } from '@studio/common/lib/lockfile'; import { sortSites } from '@studio/common/lib/sort-sites'; import { SupportedPHPVersion, SupportedPHPVersions } from '@studio/common/types/php-versions'; +import { readFile, writeFile } from 'atomically'; +import semver from 'semver'; import { sanitizeUnstructuredData, sanitizeUserpath } from 'src/lib/sanitize-for-logging'; import { getUserDataFilePath, getUserDataLockFilePath } from 'src/storage/paths'; import type { PersistedUserData, UserData, WindowBounds } from 'src/storage/storage-types'; diff --git a/apps/studio/src/stores/chat-slice.ts b/apps/studio/src/stores/chat-slice.ts index c0effb1eb3..1d44aa4159 100644 --- a/apps/studio/src/stores/chat-slice.ts +++ b/apps/studio/src/stores/chat-slice.ts @@ -1,8 +1,8 @@ import { createSlice, createAsyncThunk, PayloadAction, isAnyOf } from '@reduxjs/toolkit'; import * as Sentry from '@sentry/electron/renderer'; +import { DEFAULT_PHP_VERSION } from '@studio/common/constants'; import { WPCOM } from 'wpcom/types'; import { z } from 'zod'; -import { DEFAULT_PHP_VERSION } from '@studio/common/constants'; import { LOCAL_STORAGE_CHAT_API_IDS_KEY, LOCAL_STORAGE_CHAT_MESSAGES_KEY } from 'src/constants'; import { getIpcApi } from 'src/lib/get-ipc-api'; import { AppDispatch, RootState } from 'src/stores'; diff --git a/apps/studio/src/stores/i18n-slice.ts b/apps/studio/src/stores/i18n-slice.ts index f01c0d1756..c5ccfb6425 100644 --- a/apps/studio/src/stores/i18n-slice.ts +++ b/apps/studio/src/stores/i18n-slice.ts @@ -1,11 +1,11 @@ import { createSlice, PayloadAction, createAsyncThunk } from '@reduxjs/toolkit'; -import { defaultI18n } from '@wordpress/i18n'; import { SupportedLocale, getLocaleData, DEFAULT_LOCALE, isSupportedLocale, } from '@studio/common/lib/locale'; +import { defaultI18n } from '@wordpress/i18n'; import { getIpcApi } from 'src/lib/get-ipc-api'; interface I18nState { diff --git a/apps/studio/src/stores/snapshot-slice.ts b/apps/studio/src/stores/snapshot-slice.ts index ecd635181d..c1c5a060f9 100644 --- a/apps/studio/src/stores/snapshot-slice.ts +++ b/apps/studio/src/stores/snapshot-slice.ts @@ -6,10 +6,10 @@ import { isAnyOf, PayloadAction, } from '@reduxjs/toolkit'; -import { __, sprintf } from '@wordpress/i18n'; -import fastDeepEqual from 'fast-deep-equal'; import { PreviewCommandLoggerAction } from '@studio/common/logger-actions'; import { Snapshot } from '@studio/common/types/snapshot'; +import { __, sprintf } from '@wordpress/i18n'; +import fastDeepEqual from 'fast-deep-equal'; import { LIMIT_OF_ZIP_SITES_PER_USER } from 'src/constants'; import { getIpcApi } from 'src/lib/get-ipc-api'; import { RootState, store } from 'src/stores/index'; diff --git a/apps/studio/src/stores/tests/snapshot-slice.test.ts b/apps/studio/src/stores/tests/snapshot-slice.test.ts index 05be467f50..1d4fd5af7a 100644 --- a/apps/studio/src/stores/tests/snapshot-slice.test.ts +++ b/apps/studio/src/stores/tests/snapshot-slice.test.ts @@ -1,9 +1,9 @@ import crypto from 'crypto'; import { UnknownAction } from '@reduxjs/toolkit'; -import { produce } from 'immer'; -import { vi } from 'vitest'; import { PreviewCommandLoggerAction } from '@studio/common/logger-actions'; import { Snapshot } from '@studio/common/types/snapshot'; +import { produce } from 'immer'; +import { vi } from 'vitest'; import { getIpcApi } from 'src/lib/get-ipc-api'; import { RootState, store } from 'src/stores'; import { diff --git a/apps/studio/src/stores/wordpress-versions-api.ts b/apps/studio/src/stores/wordpress-versions-api.ts index acb88f428a..b6cc32a7be 100644 --- a/apps/studio/src/stores/wordpress-versions-api.ts +++ b/apps/studio/src/stores/wordpress-versions-api.ts @@ -1,8 +1,11 @@ import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; import * as Sentry from '@sentry/electron/renderer'; +import { + isWordPressDevVersion, + isWordPressBetaVersion, +} from '@studio/common/lib/wordpress-version-utils'; import { __ } from '@wordpress/i18n'; import { z } from 'zod'; -import { isWordPressDevVersion, isWordPressBetaVersion } from '@studio/common/lib/wordpress-version-utils'; import { withOfflineCheck } from 'src/stores/utils/with-offline-check'; const wordPressApiResponseSchema = z.object( { diff --git a/apps/studio/src/stores/wpcom-api.ts b/apps/studio/src/stores/wpcom-api.ts index e058ca5bd6..7817f0c52f 100644 --- a/apps/studio/src/stores/wpcom-api.ts +++ b/apps/studio/src/stores/wpcom-api.ts @@ -1,8 +1,8 @@ import { createApi, TypedUseQuery, TypedUseMutation } from '@reduxjs/toolkit/query/react'; import * as Sentry from '@sentry/electron/renderer'; +import { DAY_MS } from '@studio/common/constants'; import { WPCOM } from 'wpcom/types'; import { z } from 'zod'; -import { DAY_MS } from '@studio/common/constants'; import wpcomFactory from 'src/lib/wpcom-factory'; import wpcomXhrRequest from 'src/lib/wpcom-xhr-request-factory'; import { withOfflineCheck, withOfflineCheckMutation } from 'src/stores/utils/with-offline-check'; diff --git a/apps/studio/src/tests/ipc-handlers.test.ts b/apps/studio/src/tests/ipc-handlers.test.ts index fc2b61b825..a2ef6ecf57 100644 --- a/apps/studio/src/tests/ipc-handlers.test.ts +++ b/apps/studio/src/tests/ipc-handlers.test.ts @@ -5,10 +5,10 @@ import { IpcMainInvokeEvent } from 'electron'; import fs from 'fs'; import { normalize } from 'path'; import * as Sentry from '@sentry/electron/main'; -import { readFile } from 'atomically'; -import { vi } from 'vitest'; import { bumpStat } from '@studio/common/lib/bump-stat'; import { StatsGroup, StatsMetric } from '@studio/common/types/stats'; +import { readFile } from 'atomically'; +import { vi } from 'vitest'; import { createSite, isFullscreen, diff --git a/apps/studio/tsconfig.json b/apps/studio/tsconfig.json index 94ea38964b..39fb40d46b 100644 --- a/apps/studio/tsconfig.json +++ b/apps/studio/tsconfig.json @@ -11,13 +11,7 @@ "@studio/common/*": [ "tools/common/*" ] } }, - "include": [ - "src/**/*", - "e2e/**/*" - ], + "include": [ "src/**/*", "e2e/**/*" ], "exclude": [ "**/__mocks__/**/*", "**/node_modules/**/*", "**/dist/**/*", "**/out/**/*" ], - "references": [ - { "path": "../cli" }, - { "path": "../../tools/common" } - ] + "references": [ { "path": "../cli" }, { "path": "../../tools/common" } ] } diff --git a/docs/code-contributions.md b/docs/code-contributions.md index d89f117798..28062417ed 100644 --- a/docs/code-contributions.md +++ b/docs/code-contributions.md @@ -40,6 +40,7 @@ This command starts the app in dev mode and opens it automatically, with the Chr As with any Electron app, the code is split into two processes: 1. **Renderer Process** (reloads automatically): + - All React components and UI code in `apps/studio/src/components/`, `apps/studio/src/modules/*/components/` - Hooks, stores, and utilities used by the UI (`apps/studio/src/hooks/`, `apps/studio/src/stores/`, etc.) - Any code that runs in the browser window context @@ -51,6 +52,7 @@ As with any Electron app, the code is split into two processes: - PHP server management code When editing main process code, you can either: + - Restart the app manually, or - Type `rs` in the terminal where you ran `npm start` to restart the server @@ -78,29 +80,29 @@ The project follows a modular architecture with both global and feature-specific #### Global Directories -| Directory | Description | -|--------------------------|-------------| -| `apps/cli/` | Root directory for CLI code | -| `apps/studio/src/` | Root directory for Studio code | -| `apps/studio/src/components/` | Reusable UI components used across the application | -| `apps/studio/src/hooks/` | Global React hooks | -| `apps/studio/src/lib/` | Utility functions and helper libraries | -| `apps/studio/src/modules/` | Feature-specific code | -| `apps/studio/src/stores/` | Global state management (Redux stores) | -| `apps/studio/src/api/` | API interfaces and implementations | -| `tools/common/` | Shared code between CLI and Studio (constants, types, utility functions, etc) | -| `tools/compare-perf/` | Compare-perf tooling workspace | -| `tools/eslint-plugin-studio/` | Custom ESLint rules | +| Directory | Description | +| ----------------------------- | ----------------------------------------------------------------------------- | +| `apps/cli/` | Root directory for CLI code | +| `apps/studio/src/` | Root directory for Studio code | +| `apps/studio/src/components/` | Reusable UI components used across the application | +| `apps/studio/src/hooks/` | Global React hooks | +| `apps/studio/src/lib/` | Utility functions and helper libraries | +| `apps/studio/src/modules/` | Feature-specific code | +| `apps/studio/src/stores/` | Global state management (Redux stores) | +| `apps/studio/src/api/` | API interfaces and implementations | +| `tools/common/` | Shared code between CLI and Studio (constants, types, utility functions, etc) | +| `tools/compare-perf/` | Compare-perf tooling workspace | +| `tools/eslint-plugin-studio/` | Custom ESLint rules | #### Important Entry Points -| File | Description | -|------|-------------| -| `apps/cli/index.ts` | The entry point for the CLI bundle | -| `scripts/` | Scripts for building and testing the app | -| `apps/studio/src/index.ts` | The entry point for the main process | +| File | Description | +| ----------------------------- | --------------------------------------------------------------------------- | +| `apps/cli/index.ts` | The entry point for the CLI bundle | +| `scripts/` | Scripts for building and testing the app | +| `apps/studio/src/index.ts` | The entry point for the main process | | `apps/studio/src/renderer.ts` | The entry point for the "renderer," the code running in the Chromium window | -| `vendor/wp-now` | The modified `wp-now` source code | +| `vendor/wp-now` | The modified `wp-now` source code | #### Feature Modules @@ -202,6 +204,7 @@ npm run package After building, the executable will be located at `out/Studio-linux-x64/studio`. **Important considerations:** + - The auto-update feature is not currently supported on Linux builds. - For Wayland systems, you may need to use additional flags when running the application. - Some features may not work as expected due to platform-specific implementations. @@ -218,6 +221,6 @@ See [Versioning and Updates](./versioning-and-updates.md) documentation. ## Design Docs - - [Custom Domains and SSL](./design-docs/custom-domains-and-ssl.md) - - [What's New modal](./design-docs/whats-new-modal.md) - - [Sync](./design-docs/sync.md) +- [Custom Domains and SSL](./design-docs/custom-domains-and-ssl.md) +- [What's New modal](./design-docs/whats-new-modal.md) +- [Sync](./design-docs/sync.md) diff --git a/docs/design-docs/cli.md b/docs/design-docs/cli.md index ba41ad5960..fd1a82f8ae 100644 --- a/docs/design-docs/cli.md +++ b/docs/design-docs/cli.md @@ -19,20 +19,22 @@ The first iteration of the CLI shipped commands to create, read, update, and del ## Data flow 1. When calling the CLI: - - `yargs` is used to parse commands and options and to auto-generate help pages. - - The appropriate command is called. - - Progress is pretty-printed and the command runs until completion or failure. + + - `yargs` is used to parse commands and options and to auto-generate help pages. + - The appropriate command is called. + - Progress is pretty-printed and the command runs until completion or failure. 2. When Studio instantiates the CLI: - - The node.js `child_process` module is used to fork a process that runs the CLI. - - When running in forked mode, the CLI process uses the `process.send` API to communicate back to Studio. - - IPC messages received from the CLI are parsed and validated. The results are emitted as Electron IPC events to the renderer process. - - The renderer process uses "logger action" definitions from the `common` folder to determine command progress based on incoming IPC events. + + - The node.js `child_process` module is used to fork a process that runs the CLI. + - When running in forked mode, the CLI process uses the `process.send` API to communicate back to Studio. + - IPC messages received from the CLI are parsed and validated. The results are emitted as Electron IPC events to the renderer process. + - The renderer process uses "logger action" definitions from the `common` folder to determine command progress based on incoming IPC events. 3. Studio reacts when the CLI modifies preview sites: - - `src/lib/user-data-watcher.ts` watches the Studio config file and emits `user-data-updated` IPC renderer events. - - State handlers (primarily Redux slices) listen to `user-data-updated` events and update the state accordingly. - - Because state changes trigger writes to the Studio config file, event handlers have to first run a deep diff on the incoming payload to ensure that the data has truly changed. Without this, there'd be infinite watch/write loops. + - `src/lib/user-data-watcher.ts` watches the Studio config file and emits `user-data-updated` IPC renderer events. + - State handlers (primarily Redux slices) listen to `user-data-updated` events and update the state accordingly. + - Because state changes trigger writes to the Studio config file, event handlers have to first run a deep diff on the incoming payload to ensure that the data has truly changed. Without this, there'd be infinite watch/write loops. ## Implementation details diff --git a/eslint.config.mjs b/eslint.config.mjs index 4ff3151f47..14b2623d4b 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -12,6 +12,7 @@ import path from 'node:path'; export default defineConfig( globalIgnores( [ '**/node_modules/', + 'cli/dist/', 'dist/', 'out/', 'wp-files/', diff --git a/scripts/prepare-dev-build-version.mjs b/scripts/prepare-dev-build-version.mjs index 9617cc9e62..cd8bcfed8f 100644 --- a/scripts/prepare-dev-build-version.mjs +++ b/scripts/prepare-dev-build-version.mjs @@ -24,7 +24,7 @@ const packageJsonText = await fs.readFile( packageJsonPath, 'utf-8' ); const packageJson = JSON.parse( packageJsonText ); // Use version from latestTag (strip leading 'v' if present) -const tagVersion = latestTag.startsWith('v') ? latestTag.slice(1) : latestTag; +const tagVersion = latestTag.startsWith( 'v' ) ? latestTag.slice( 1 ) : latestTag; const parsedVersion = semver.parse( tagVersion ); if ( ! parsedVersion ) { throw new Error( `Invalid version in latestTag: ${ latestTag }` ); diff --git a/tools/common/lib/bump-stat.ts b/tools/common/lib/bump-stat.ts index 1129e90553..d312208fe5 100644 --- a/tools/common/lib/bump-stat.ts +++ b/tools/common/lib/bump-stat.ts @@ -1,5 +1,5 @@ -import { isSameDay, isSameMonth, isSameWeek } from 'date-fns'; import { AggregateInterval, StatsGroup, StatsMetric } from '@studio/common/types/stats'; +import { isSameDay, isSameMonth, isSameWeek } from 'date-fns'; // Database columns are varchar(32). Group limit is 27 to account for the '-a11n' suffix // added by the backend for Automattic requests (27 + 5 = 32). diff --git a/tools/common/lib/domains.ts b/tools/common/lib/domains.ts index 4f7b0ef85e..c954f1eeb6 100644 --- a/tools/common/lib/domains.ts +++ b/tools/common/lib/domains.ts @@ -1,5 +1,5 @@ -import { __ } from '@wordpress/i18n'; import { DEFAULT_CUSTOM_DOMAIN_SUFFIX } from '@studio/common/constants'; +import { __ } from '@wordpress/i18n'; import { sanitizeFolderName } from './sanitize-folder-name'; const DOMAIN_PATTERN = diff --git a/tools/common/lib/tests/cache-function-ttl.test.ts b/tools/common/lib/tests/cache-function-ttl.test.ts index b930293fa3..3633065c44 100644 --- a/tools/common/lib/tests/cache-function-ttl.test.ts +++ b/tools/common/lib/tests/cache-function-ttl.test.ts @@ -1,5 +1,5 @@ -import { vi } from 'vitest'; import { cacheFunctionTTL, clearCache } from '@studio/common/lib/cache-function-ttl'; +import { vi } from 'vitest'; describe( 'cacheFunctionTTL', () => { beforeEach( () => { diff --git a/tools/common/lib/tests/sqlite-integration.test.ts b/tools/common/lib/tests/sqlite-integration.test.ts index 84e6747324..d5bb7777cd 100644 --- a/tools/common/lib/tests/sqlite-integration.test.ts +++ b/tools/common/lib/tests/sqlite-integration.test.ts @@ -1,7 +1,7 @@ -import fs from 'fs-extra'; -import { vi } from 'vitest'; import { SqliteIntegrationProvider } from '@studio/common/lib/sqlite-integration'; +import fs from 'fs-extra'; import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; +import { vi } from 'vitest'; const SQLITE_DIRNAME = 'sqlite-database-integration'; const MOCK_SITE_PATH = 'mock-site-path'; diff --git a/tools/common/tsconfig.json b/tools/common/tsconfig.json index 2c6e4c99fe..ee0df91243 100644 --- a/tools/common/tsconfig.json +++ b/tools/common/tsconfig.json @@ -14,8 +14,6 @@ "declaration": true, "emitDeclarationOnly": true }, - "include": [ - "**/*" - ], + "include": [ "**/*" ], "exclude": [ "**/__mocks__/**/*", "**/node_modules/**/*", "**/dist/**/*", "**/out/**/*" ] } diff --git a/tools/compare-perf/post-to-github.ts b/tools/compare-perf/post-to-github.ts index 4098828753..7d2df3dac2 100644 --- a/tools/compare-perf/post-to-github.ts +++ b/tools/compare-perf/post-to-github.ts @@ -82,8 +82,8 @@ async function findOrCreateComment( res.on( 'end', () => { if ( res.statusCode === 200 ) { const comments = JSON.parse( data ); - const existingComment = comments.find( ( c: { body?: string } ) => - c.body?.includes( commentIdentifier ) + const existingComment = comments.find( + ( c: { body?: string } ) => c.body?.includes( commentIdentifier ) ); resolve( existingComment?.id || null ); } else { @@ -130,9 +130,7 @@ async function postOrUpdateComment( context: GitHubContext, body: string ): Prom res.on( 'data', ( chunk ) => ( data += chunk ) ); res.on( 'end', () => { if ( res.statusCode === 200 || res.statusCode === 201 ) { - console.log( - `✅ Successfully ${ existingCommentId ? 'updated' : 'posted' } PR comment` - ); + console.log( `✅ Successfully ${ existingCommentId ? 'updated' : 'posted' } PR comment` ); resolve(); } else { reject( new Error( `Failed to post comment: ${ res.statusCode } ${ data }` ) ); @@ -166,7 +164,9 @@ async function main() { }; const resultsPath = artifactsPath || process.env.ARTIFACTS_PATH || 'artifacts'; - const summaryFiles = fs.readdirSync( resultsPath ).filter( ( f ) => f.endsWith( '.summary.json' ) ); + const summaryFiles = fs + .readdirSync( resultsPath ) + .filter( ( f ) => f.endsWith( '.summary.json' ) ); if ( summaryFiles.length === 0 ) { console.error( `No summary files found in ${ resultsPath }` ); @@ -188,4 +188,3 @@ main().catch( ( error ) => { console.error( 'Error posting to GitHub:', error ); process.exit( 1 ); } ); - diff --git a/tools/compare-perf/tsconfig.json b/tools/compare-perf/tsconfig.json index d8adec6c0d..b964aa883b 100644 --- a/tools/compare-perf/tsconfig.json +++ b/tools/compare-perf/tsconfig.json @@ -1,17 +1,15 @@ { "compilerOptions": { "target": "ES2017", - "lib": ["ES2017"], + "lib": [ "ES2017" ], "module": "commonjs", "moduleResolution": "node", "esModuleInterop": true, "skipLibCheck": true, "strict": true, "resolveJsonModule": true, - "types": ["node"] + "types": [ "node" ] }, - "include": ["*.ts"], - "exclude": ["node_modules"] + "include": [ "*.ts" ], + "exclude": [ "node_modules" ] } - - diff --git a/tools/metrics/README.md b/tools/metrics/README.md index a6023a63fc..0ffddf57e5 100644 --- a/tools/metrics/README.md +++ b/tools/metrics/README.md @@ -60,7 +60,7 @@ The `performance-metrics.json` output file contains a summary of the results, ex ```json { "siteCreation": 6150, - "siteStartup": 3946, + "siteStartup": 3946 } ``` diff --git a/tools/metrics/tests/site-editor.test.ts b/tools/metrics/tests/site-editor.test.ts index 35587e668a..bbd6df5322 100644 --- a/tools/metrics/tests/site-editor.test.ts +++ b/tools/metrics/tests/site-editor.test.ts @@ -72,7 +72,7 @@ test.describe( 'Site Editor Load Metrics', () => { // First wait for the iframe to appear with explicit timeout await page.waitForSelector( 'iframe[name="editor-canvas"]', { state: 'visible', - timeout: 120_000 // 2 minutes, half of the default action timeout + timeout: 120_000, // 2 minutes, half of the default action timeout } ); const frame = page.frame( { name: 'editor-canvas' } ); if ( ! frame ) { @@ -84,14 +84,17 @@ test.describe( 'Site Editor Load Metrics', () => { await frame.waitForSelector( '[data-block]', { timeout: 60_000 } ); // Make sure blocks are loaded and spinners are gone - await frame.waitForFunction( () => { - return ( - document.querySelectorAll( '[data-block]' ).length > 0 && - ! document.querySelector( '.components-spinner' ) && - ! document.querySelector( '.is-loading' ) && - ! document.querySelector( '.wp-block-editor__loading' ) - ); - }, { timeout: 60_000 } ); + await frame.waitForFunction( + () => { + return ( + document.querySelectorAll( '[data-block]' ).length > 0 && + ! document.querySelector( '.components-spinner' ) && + ! document.querySelector( '.is-loading' ) && + ! document.querySelector( '.wp-block-editor__loading' ) + ); + }, + { timeout: 60_000 } + ); const endTime = Date.now(); const duration = endTime - startTime; From 6b07929a0ca5e2c3d82959a649f82ac0a0c4413a Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 11:47:42 +0100 Subject: [PATCH 03/60] Fix tests --- apps/studio/forge.config.ts | 4 ++++ package.json | 1 + tools/metrics/tests/site-editor.test.ts | 10 +++++----- tools/metrics/tests/site-startup.test.ts | 8 ++++---- vitest.config.mts | 2 ++ vitest.setup.ts | 2 +- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/apps/studio/forge.config.ts b/apps/studio/forge.config.ts index fb34705962..381d6dc87f 100644 --- a/apps/studio/forge.config.ts +++ b/apps/studio/forge.config.ts @@ -162,6 +162,10 @@ const config: ForgeConfig = { { cwd: repoRoot } ); }, + postPackage: async (forgeConfig, options) => { + fs.rmSync( path.join( repoRoot, 'apps', 'cli', 'node_modules' ), { recursive: true } ); + fs.rmSync( path.join( repoRoot, 'apps', 'studio', 'node_modules' ), { recursive: true } ); + }, }, }; diff --git a/package.json b/package.json index a2c7a0ef90..ba5d177baf 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "tools/*" ], "scripts": { + "pretest": "rimraf apps/studio/node_modules apps/cli/node_modules", "prestart": "npm run cli:build", "start": "electron-vite dev --config apps/studio/electron.vite.config.ts --outDir=dist --watch", "start-wayland": "npm -w studio-app run start-wayland", diff --git a/tools/metrics/tests/site-editor.test.ts b/tools/metrics/tests/site-editor.test.ts index bbd6df5322..77c2bdfaa1 100644 --- a/tools/metrics/tests/site-editor.test.ts +++ b/tools/metrics/tests/site-editor.test.ts @@ -1,9 +1,9 @@ import { test, expect, chromium } from '@playwright/test'; -import { E2ESession } from '../../e2e/e2e-helpers'; -import Onboarding from '../../e2e/page-objects/onboarding'; -import SiteContent from '../../e2e/page-objects/site-content'; -import WhatsNewModal from '../../e2e/page-objects/whats-new-modal'; -import { getUrlWithAutoLogin } from '../../e2e/utils'; +import { E2ESession } from '../../../apps/studio/e2e/e2e-helpers'; +import Onboarding from '../../../apps/studio/e2e/page-objects/onboarding'; +import SiteContent from '../../../apps/studio/e2e/page-objects/site-content'; +import WhatsNewModal from '../../../apps/studio/e2e/page-objects/whats-new-modal'; +import { getUrlWithAutoLogin } from '../../../apps/studio/e2e/utils'; import { median } from '../utils'; test.describe( 'Site Editor Load Metrics', () => { diff --git a/tools/metrics/tests/site-startup.test.ts b/tools/metrics/tests/site-startup.test.ts index 16cf057054..440385efb4 100644 --- a/tools/metrics/tests/site-startup.test.ts +++ b/tools/metrics/tests/site-startup.test.ts @@ -1,8 +1,8 @@ import { test, expect } from '@playwright/test'; -import { E2ESession } from '../../e2e/e2e-helpers'; -import Onboarding from '../../e2e/page-objects/onboarding'; -import SiteContent from '../../e2e/page-objects/site-content'; -import WhatsNewModal from '../../e2e/page-objects/whats-new-modal'; +import { E2ESession } from '../../../apps/studio/e2e/e2e-helpers'; +import Onboarding from '../../../apps/studio/e2e/page-objects/onboarding'; +import SiteContent from '../../../apps/studio/e2e/page-objects/site-content'; +import WhatsNewModal from '../../../apps/studio/e2e/page-objects/whats-new-modal'; import { median } from '../utils'; test.describe( 'Startup Metrics', () => { diff --git a/vitest.config.mts b/vitest.config.mts index b95c168210..5f34ebe30f 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -2,6 +2,7 @@ import { defineConfig } from 'vitest/config'; import path from 'path'; export default defineConfig( { + assetsInclude: [ '**/*.riv' ], test: { pool: 'threads', globals: true, @@ -20,6 +21,7 @@ export default defineConfig( { '**/tests/utils/**', '**/stores/tests/utils/**', '**/vendor/**', + 'tools/metrics/tests/**', ], globalSetup: './vitest.global-setup.ts', setupFiles: [ './vitest.setup.ts' ], diff --git a/vitest.setup.ts b/vitest.setup.ts index 8131bd3df5..92fe136d63 100644 --- a/vitest.setup.ts +++ b/vitest.setup.ts @@ -126,7 +126,7 @@ vi.mock( './src/hooks/use-offline', () => ( { useOffline: vi.fn().mockReturnValue( false ), } ) ); -vi.mock( './src/hooks/use-ai-icon', () => ( { +vi.mock( 'src/hooks/use-ai-icon', () => ( { __esModule: true, default: () => ( { rive: null, From 114131ce80b9d66214b6a1168997061dcdca35e3 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 12:05:41 +0100 Subject: [PATCH 04/60] Touch-ups after merge --- apps/cli/vite.config.ts | 2 +- apps/studio/electron.vite.config.ts | 9 +++++++-- apps/studio/package.json | 2 +- package-lock.json | 4 +++- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/apps/cli/vite.config.ts b/apps/cli/vite.config.ts index c404bc0614..e249ac0d51 100644 --- a/apps/cli/vite.config.ts +++ b/apps/cli/vite.config.ts @@ -86,7 +86,7 @@ export default defineConfig( { '@studio/common': resolve( __dirname, '../../tools/common' ), '@wp-playground/blueprints/blueprint-schema-validator': resolve( __dirname, - 'node_modules/@wp-playground/blueprints/blueprint-schema-validator.js' + '../../node_modules/@wp-playground/blueprints/blueprint-schema-validator.js' ), }, conditions: [ 'node' ], diff --git a/apps/studio/electron.vite.config.ts b/apps/studio/electron.vite.config.ts index cd9817542a..4eb21dc53a 100644 --- a/apps/studio/electron.vite.config.ts +++ b/apps/studio/electron.vite.config.ts @@ -22,7 +22,8 @@ export default defineConfig( { cli: resolve( __dirname, '../cli' ), vendor: resolve( __dirname, '../../vendor' ), '@wp-playground/blueprints/blueprint-schema-validator': resolve( - 'node_modules/@wp-playground/blueprints/blueprint-schema-validator.js' + __dirname, + '../../node_modules/@wp-playground/blueprints/blueprint-schema-validator.js' ), }, }, @@ -43,7 +44,7 @@ export default defineConfig( { output: { entryFileNames: '[name].js', }, - external: [ /^@php-wasm\/.*/, /^@wp-playground\/.*/ ], + external: [ /^@php-wasm\/.*/ ], }, }, }, @@ -66,6 +67,10 @@ export default defineConfig( { '@studio/common': resolve( __dirname, '../../tools/common' ), cli: resolve( __dirname, '../cli' ), vendor: resolve( __dirname, '../../vendor' ), + '@wp-playground/blueprints/blueprint-schema-validator': resolve( + __dirname, + '../../node_modules/@wp-playground/blueprints/blueprint-schema-validator.js' + ), }, }, plugins: [ diff --git a/apps/studio/package.json b/apps/studio/package.json index 28ec5d36b6..f2015d8b45 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -42,7 +42,6 @@ "@wordpress/i18n": "^6.9.0", "@wordpress/icons": "^11.4.0", "@wordpress/react-i18n": "^4.39.0", - "@wp-playground/blueprints": "^3.0.46", "archiver": "^6.0.2", "atomically": "^2.1.0", "cli-table3": "^0.6.5", @@ -103,6 +102,7 @@ "@types/winreg": "^1.2.36", "@types/yauzl": "^2.10.3", "@vitejs/plugin-react": "^5.1.2", + "@wp-playground/blueprints": "^3.0.46", "electron": "^39.2.7", "electron-devtools-installer": "^4.0.0", "electron-vite": "^5.0.0", diff --git a/package-lock.json b/package-lock.json index 3ef717a3aa..f5a5f96020 100644 --- a/package-lock.json +++ b/package-lock.json @@ -102,7 +102,6 @@ "@wordpress/i18n": "^6.9.0", "@wordpress/icons": "^11.4.0", "@wordpress/react-i18n": "^4.39.0", - "@wp-playground/blueprints": "^3.0.46", "archiver": "^6.0.2", "atomically": "^2.1.0", "cli-table3": "^0.6.5", @@ -163,6 +162,7 @@ "@types/winreg": "^1.2.36", "@types/yauzl": "^2.10.3", "@vitejs/plugin-react": "^5.1.2", + "@wp-playground/blueprints": "^3.0.46", "electron": "^39.2.7", "electron-devtools-installer": "^4.0.0", "electron-vite": "^5.0.0", @@ -9568,6 +9568,8 @@ }, "node_modules/@wp-playground/blueprints": { "version": "3.0.46", + "resolved": "https://registry.npmjs.org/@wp-playground/blueprints/-/blueprints-3.0.46.tgz", + "integrity": "sha512-OPrvoCTvpvQXMp6lJWwWJttZmF6pIMO8iIzdJWfkuxcS8QE3aaLKgSz6lB5Fdu345erFR8GeUmkSim98pt5fMQ==", "dependencies": { "@php-wasm/logger": "3.0.46", "@php-wasm/node": "3.0.46", From a073b577b86cda563be00c437dc974f01a858884 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 12:57:33 +0100 Subject: [PATCH 05/60] New patch-package strategy --- apps/cli/package.json | 2 +- {patches => apps/cli/patches}/pm2+6.0.14.patch | 0 {patches => apps/cli/patches}/ps-man+1.1.8.patch | 0 apps/studio/package.json | 2 +- .../studio/patches}/@automattic+generate-password+0.1.0.patch | 0 {patches => apps/studio/patches}/@types+archiver+6.0.4.patch | 0 .../studio/patches}/@wordpress+components+32.1.0.patch | 0 .../studio/patches}/@wp-playground+wordpress+3.0.46.patch | 0 {patches => apps/studio/patches}/archiver+6.0.2.patch | 0 .../studio/patches}/electron-devtools-installer+4.0.0.patch | 0 {patches => apps/studio/patches}/electron2appx+2.1.2.patch | 0 package.json | 2 +- 12 files changed, 3 insertions(+), 3 deletions(-) rename {patches => apps/cli/patches}/pm2+6.0.14.patch (100%) rename {patches => apps/cli/patches}/ps-man+1.1.8.patch (100%) rename {patches => apps/studio/patches}/@automattic+generate-password+0.1.0.patch (100%) rename {patches => apps/studio/patches}/@types+archiver+6.0.4.patch (100%) rename {patches => apps/studio/patches}/@wordpress+components+32.1.0.patch (100%) rename {patches => apps/studio/patches}/@wp-playground+wordpress+3.0.46.patch (100%) rename {patches => apps/studio/patches}/archiver+6.0.2.patch (100%) rename {patches => apps/studio/patches}/electron-devtools-installer+4.0.0.patch (100%) rename {patches => apps/studio/patches}/electron2appx+2.1.2.patch (100%) diff --git a/apps/cli/package.json b/apps/cli/package.json index a911e84a1f..d8bcc349a8 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -25,7 +25,7 @@ "build": "vite build --config ./vite.config.ts", "watch": "vite build --config ./vite.config.ts --watch", "install:bundle": "npm install --no-package-lock --install-links --no-workspaces", - "postinstall": "patch-package --patch-dir ../../patches" + "postinstall": "patch-package" }, "devDependencies": { "@types/archiver": "^6.0.4", diff --git a/patches/pm2+6.0.14.patch b/apps/cli/patches/pm2+6.0.14.patch similarity index 100% rename from patches/pm2+6.0.14.patch rename to apps/cli/patches/pm2+6.0.14.patch diff --git a/patches/ps-man+1.1.8.patch b/apps/cli/patches/ps-man+1.1.8.patch similarity index 100% rename from patches/ps-man+1.1.8.patch rename to apps/cli/patches/ps-man+1.1.8.patch diff --git a/apps/studio/package.json b/apps/studio/package.json index f2015d8b45..04696969de 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -18,7 +18,7 @@ "make:macos-x64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && SKIP_DMG=true FILE_ARCHITECTURE=x64 electron-forge make . --arch=x64 --platform=darwin", "make:macos-arm64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && SKIP_DMG=true FILE_ARCHITECTURE=arm64 electron-forge make . --arch=arm64 --platform=darwin", "install:bundle": "npm install --no-package-lock --install-links --no-workspaces", - "postinstall": "patch-package --patch-dir ../../patches && npx @electron/rebuild -o fs-ext", + "postinstall": "patch-package && npx @electron/rebuild -o fs-ext", "package": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge package .", "publish": "electron-forge publish .", "start-wayland": "npm -w studio-cli run build && electron-forge start . -- --enable-features=UseOzonePlatform --ozone-platform=wayland" diff --git a/patches/@automattic+generate-password+0.1.0.patch b/apps/studio/patches/@automattic+generate-password+0.1.0.patch similarity index 100% rename from patches/@automattic+generate-password+0.1.0.patch rename to apps/studio/patches/@automattic+generate-password+0.1.0.patch diff --git a/patches/@types+archiver+6.0.4.patch b/apps/studio/patches/@types+archiver+6.0.4.patch similarity index 100% rename from patches/@types+archiver+6.0.4.patch rename to apps/studio/patches/@types+archiver+6.0.4.patch diff --git a/patches/@wordpress+components+32.1.0.patch b/apps/studio/patches/@wordpress+components+32.1.0.patch similarity index 100% rename from patches/@wordpress+components+32.1.0.patch rename to apps/studio/patches/@wordpress+components+32.1.0.patch diff --git a/patches/@wp-playground+wordpress+3.0.46.patch b/apps/studio/patches/@wp-playground+wordpress+3.0.46.patch similarity index 100% rename from patches/@wp-playground+wordpress+3.0.46.patch rename to apps/studio/patches/@wp-playground+wordpress+3.0.46.patch diff --git a/patches/archiver+6.0.2.patch b/apps/studio/patches/archiver+6.0.2.patch similarity index 100% rename from patches/archiver+6.0.2.patch rename to apps/studio/patches/archiver+6.0.2.patch diff --git a/patches/electron-devtools-installer+4.0.0.patch b/apps/studio/patches/electron-devtools-installer+4.0.0.patch similarity index 100% rename from patches/electron-devtools-installer+4.0.0.patch rename to apps/studio/patches/electron-devtools-installer+4.0.0.patch diff --git a/patches/electron2appx+2.1.2.patch b/apps/studio/patches/electron2appx+2.1.2.patch similarity index 100% rename from patches/electron2appx+2.1.2.patch rename to apps/studio/patches/electron2appx+2.1.2.patch diff --git a/package.json b/package.json index ba5d177baf..06d0c82b93 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "prestart": "npm run cli:build", "start": "electron-vite dev --config apps/studio/electron.vite.config.ts --outDir=dist --watch", "start-wayland": "npm -w studio-app run start-wayland", - "postinstall": "patch-package && ts-node ./scripts/download-wp-server-files.ts && node ./scripts/download-available-site-translations.mjs && npx @electron/rebuild -o fs-ext", + "postinstall": "patch-package --patch-dir apps/cli/patches && patch-package --patch-dir apps/studio/patches && ts-node ./scripts/download-wp-server-files.ts && node ./scripts/download-available-site-translations.mjs && npx @electron/rebuild -o fs-ext", "package": "npm -w studio-app run package", "make": "npm -w studio-app run make", "make:windows-x64": "npm -w studio-app run make:windows-x64", From f4be0deedda8c061cd561bd7d64ae08a45096f1b Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 13:23:41 +0100 Subject: [PATCH 06/60] Fix PATCHES_HASH --- .buildkite/commands/install-node-dependencies.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.buildkite/commands/install-node-dependencies.sh b/.buildkite/commands/install-node-dependencies.sh index e62a07099f..f14b99eb6f 100755 --- a/.buildkite/commands/install-node-dependencies.sh +++ b/.buildkite/commands/install-node-dependencies.sh @@ -7,10 +7,11 @@ ARCHITECTURE=$(uname -m) NODE_VERSION=$(node --version) PACKAGE_HASH=$(hash_file package-lock.json) -if [ -d patches ]; then - PATCHES_HASH=$(hash_directory patches/) -else - PATCHES_HASH=nopatch +PATCHES_HASH=nopatch +if [ -d apps/cli/patches ] || [ -d apps/studio/patches ]; then + CLI_PATCHES_HASH=$( [ -d apps/cli/patches ] && hash_directory apps/cli/patches || echo none ) + STUDIO_PATCHES_HASH=$( [ -d apps/studio/patches ] && hash_directory apps/studio/patches || echo none ) + PATCHES_HASH="${CLI_PATCHES_HASH}-${STUDIO_PATCHES_HASH}" fi CACHEKEY="$BUILDKITE_PIPELINE_SLUG-npm-$PLATFORM-$ARCHITECTURE-node-$NODE_VERSION-$PACKAGE_HASH-$PATCHES_HASH" From f97e7408c812c6360d623de7d0faa143e9a4e25b Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 13:33:05 +0100 Subject: [PATCH 07/60] Debug install-node-dependencies.sh --- .buildkite/commands/install-node-dependencies.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.buildkite/commands/install-node-dependencies.sh b/.buildkite/commands/install-node-dependencies.sh index f14b99eb6f..635825ec1f 100755 --- a/.buildkite/commands/install-node-dependencies.sh +++ b/.buildkite/commands/install-node-dependencies.sh @@ -27,6 +27,16 @@ restore_cache "$CACHEKEY" echo "--- :npm: Install Node dependencies" +echo "Install debug:" +echo " pwd=$(pwd)" +echo " node=$(node -v)" +echo " npm=$(npm -v)" +echo " npm prefix=$(npm config get prefix)" +echo " npm workspaces=$(npm config get workspaces)" +echo " npm ignore-scripts=$(npm config get ignore-scripts)" +echo " npm user-config=$(npm config get userconfig)" +echo " npm global-config=$(npm config get globalconfig)" + MAX_SOCKETS=15 # Default value from npm # To avoid constant ECONNRESET errors a limit is set for Linux, From 10dc912b076ab4042c66c49c2be63aa976f76c8b Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 13:38:59 +0100 Subject: [PATCH 08/60] More debug --- .buildkite/commands/install-node-dependencies.sh | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.buildkite/commands/install-node-dependencies.sh b/.buildkite/commands/install-node-dependencies.sh index 635825ec1f..338eac6457 100755 --- a/.buildkite/commands/install-node-dependencies.sh +++ b/.buildkite/commands/install-node-dependencies.sh @@ -31,11 +31,20 @@ echo "Install debug:" echo " pwd=$(pwd)" echo " node=$(node -v)" echo " npm=$(npm -v)" -echo " npm prefix=$(npm config get prefix)" echo " npm workspaces=$(npm config get workspaces)" echo " npm ignore-scripts=$(npm config get ignore-scripts)" echo " npm user-config=$(npm config get userconfig)" -echo " npm global-config=$(npm config get globalconfig)" +echo " npm_config_workspaces=${NPM_CONFIG_WORKSPACES-}" +echo " npm_config_workspace=${NPM_CONFIG_WORKSPACE-}" +echo " npm_config_ignore_scripts=${NPM_CONFIG_IGNORE_SCRIPTS-}" +echo " npm_config_production=${NPM_CONFIG_PRODUCTION-}" +echo " npm_config_legacy_workspace_install=${NPM_CONFIG_LEGACY_WORKSPACE_INSTALL-}" + +USER_NPMRC=$(npm config get userconfig 2>/dev/null || true) +if [ -n "${USER_NPMRC}" ] && [ -f "${USER_NPMRC}" ]; then + echo " npm user config contents:" + cat "${USER_NPMRC}" +fi MAX_SOCKETS=15 # Default value from npm From 826ac807bac598dec6fd48215ac8be8cdcd3d8c6 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 13:50:08 +0100 Subject: [PATCH 09/60] No postinstall scripts in apps/ --- .../commands/install-node-dependencies.sh | 19 ------------------- apps/cli/package.json | 3 +-- apps/studio/package.json | 3 +-- 3 files changed, 2 insertions(+), 23 deletions(-) diff --git a/.buildkite/commands/install-node-dependencies.sh b/.buildkite/commands/install-node-dependencies.sh index 338eac6457..f14b99eb6f 100755 --- a/.buildkite/commands/install-node-dependencies.sh +++ b/.buildkite/commands/install-node-dependencies.sh @@ -27,25 +27,6 @@ restore_cache "$CACHEKEY" echo "--- :npm: Install Node dependencies" -echo "Install debug:" -echo " pwd=$(pwd)" -echo " node=$(node -v)" -echo " npm=$(npm -v)" -echo " npm workspaces=$(npm config get workspaces)" -echo " npm ignore-scripts=$(npm config get ignore-scripts)" -echo " npm user-config=$(npm config get userconfig)" -echo " npm_config_workspaces=${NPM_CONFIG_WORKSPACES-}" -echo " npm_config_workspace=${NPM_CONFIG_WORKSPACE-}" -echo " npm_config_ignore_scripts=${NPM_CONFIG_IGNORE_SCRIPTS-}" -echo " npm_config_production=${NPM_CONFIG_PRODUCTION-}" -echo " npm_config_legacy_workspace_install=${NPM_CONFIG_LEGACY_WORKSPACE_INSTALL-}" - -USER_NPMRC=$(npm config get userconfig 2>/dev/null || true) -if [ -n "${USER_NPMRC}" ] && [ -f "${USER_NPMRC}" ]; then - echo " npm user config contents:" - cat "${USER_NPMRC}" -fi - MAX_SOCKETS=15 # Default value from npm # To avoid constant ECONNRESET errors a limit is set for Linux, diff --git a/apps/cli/package.json b/apps/cli/package.json index d8bcc349a8..e424a110af 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -24,8 +24,7 @@ "scripts": { "build": "vite build --config ./vite.config.ts", "watch": "vite build --config ./vite.config.ts --watch", - "install:bundle": "npm install --no-package-lock --install-links --no-workspaces", - "postinstall": "patch-package" + "install:bundle": "npm install --no-package-lock --install-links --no-workspaces && patch-package" }, "devDependencies": { "@types/archiver": "^6.0.4", diff --git a/apps/studio/package.json b/apps/studio/package.json index 04696969de..36a285d632 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -17,8 +17,7 @@ "make:windows-arm64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge make . --arch=arm64 --platform=win32", "make:macos-x64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && SKIP_DMG=true FILE_ARCHITECTURE=x64 electron-forge make . --arch=x64 --platform=darwin", "make:macos-arm64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && SKIP_DMG=true FILE_ARCHITECTURE=arm64 electron-forge make . --arch=arm64 --platform=darwin", - "install:bundle": "npm install --no-package-lock --install-links --no-workspaces", - "postinstall": "patch-package && npx @electron/rebuild -o fs-ext", + "install:bundle": "npm install --no-package-lock --install-links --no-workspaces && patch-package && npx @electron/rebuild -o fs-ext", "package": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge package .", "publish": "electron-forge publish .", "start-wayland": "npm -w studio-cli run build && electron-forge start . -- --enable-features=UseOzonePlatform --ozone-platform=wayland" From e6c7afc6c2614f8cc2bd1330f3381e55b9660759 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 13:55:24 +0100 Subject: [PATCH 10/60] Fix linter --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 06d0c82b93..3e7632eb0d 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "cli:build:bundle": "npm run cli:install:bundle && npm run cli:build", "app:install:bundle": "npm -w studio-app run install:bundle", "compare:perf": "npm -w compare-perf run compare", - "lint": "eslint {apps/cli,apps/studio/src,apps/studio/e2e,tools/common,tools/eslint-plugin-studio}", + "lint": "eslint {apps/cli,apps/studio/src,apps/studio/e2e,tools/common}", "format": "prettier . --write", "test": "vitest run", "test:watch": "vitest", From 2a59909bd0a6e75559a33f42d5fff2a7b9eb14bd Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 14:06:51 +0100 Subject: [PATCH 11/60] Fix compare-perf setup command --- tools/compare-perf/config.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/compare-perf/config.ts b/tools/compare-perf/config.ts index e1fd4fe4e5..6c52d25005 100644 --- a/tools/compare-perf/config.ts +++ b/tools/compare-perf/config.ts @@ -7,7 +7,8 @@ const config = { gitRepositoryURL: 'https://github.com/Automattic/studio.git', setupTestRunner: 'npm ci && npx playwright install chromium', testCommand: 'npm run test:metrics', - setupCommand: 'npm ci && npm ci --prefix cli && npm run package', + setupCommand: + 'npm ci && npm -w studio-cli run install:bundle && npm -w studio-app run install:bundle && npm run package', testsPath: 'tools/metrics/tests', testFileSuffix: '.test.ts', artifactsPath, From c0e30cec2609361f7d7fd5cd4ae49ad1786c6ccf Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 14:08:04 +0100 Subject: [PATCH 12/60] Attempt to fix E2E tests --- apps/studio/e2e/e2e-helpers.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/studio/e2e/e2e-helpers.ts b/apps/studio/e2e/e2e-helpers.ts index 687f70e094..34893addf8 100644 --- a/apps/studio/e2e/e2e-helpers.ts +++ b/apps/studio/e2e/e2e-helpers.ts @@ -82,7 +82,8 @@ export class E2ESession { } private async launchFirstWindow( testEnv: NodeJS.ProcessEnv = {} ) { - const latestBuild = findLatestBuild(); + const buildDir = path.join( __dirname, '..', 'out' ); + const latestBuild = findLatestBuild( buildDir ); const appInfo = parseElectronApp( latestBuild ); let executablePath = appInfo.executable; From 1e76006a50efe742d6f2c013eedf0cc46d050c48 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 15:13:11 +0100 Subject: [PATCH 13/60] New approach to loading wordpress/components styles --- apps/studio/electron.vite.config.ts | 19 ------------------- .../src/components/default-error-fallback.tsx | 5 ++--- .../src/components/wordpress-styles.tsx | 19 +++++-------------- .../src/custom-package-definitions.d.ts | 5 +++++ 4 files changed, 12 insertions(+), 36 deletions(-) diff --git a/apps/studio/electron.vite.config.ts b/apps/studio/electron.vite.config.ts index 4eb21dc53a..e8cc82d666 100644 --- a/apps/studio/electron.vite.config.ts +++ b/apps/studio/electron.vite.config.ts @@ -58,9 +58,6 @@ export default defineConfig( { }, renderer: { root: __dirname, - define: { - 'import.meta.env.VITE_REPO_ROOT': JSON.stringify( resolve( __dirname, '../..' ) ), - }, resolve: { alias: { src: resolve( __dirname, 'src' ), @@ -79,22 +76,6 @@ export default defineConfig( { wasm(), viteStaticCopy( { targets: [ - { - src: resolve( - __dirname, - '../../node_modules/@wordpress/components/build-style/style.css' - ), - dest: 'main_window/styles', - rename: 'wordpress-components-style.css', - }, - { - src: resolve( - __dirname, - '../../node_modules/@wordpress/components/build-style/style-rtl.css' - ), - dest: 'main_window/styles', - rename: 'wordpress-components-style-rtl.css', - }, { src: resolve( __dirname, '../../node_modules/@rive-app/canvas/rive.wasm' ), dest: 'assets', diff --git a/apps/studio/src/components/default-error-fallback.tsx b/apps/studio/src/components/default-error-fallback.tsx index 0fda037efa..8e2c63aade 100644 --- a/apps/studio/src/components/default-error-fallback.tsx +++ b/apps/studio/src/components/default-error-fallback.tsx @@ -6,6 +6,7 @@ import { import { useI18n } from '@wordpress/react-i18n'; import Button from 'src/components/button'; import { DynamicStylesheet } from 'src/components/dynamic-stylesheet'; +import { getWordpressStylesHref } from 'src/components/wordpress-styles'; import { isMac, isWindows } from 'src/lib/app-globals'; import { cx } from 'src/lib/cx'; import { getIpcApi } from 'src/lib/get-ipc-api'; @@ -92,9 +93,7 @@ export default function DefaultErrorFallback() { const { isRTL } = useI18n(); const isRtl = isRTL(); - const href = isRtl - ? './main_window/styles/wordpress-components-style-rtl.css' - : './main_window/styles/wordpress-components-style.css'; + const href = getWordpressStylesHref( isRtl ); return (
diff --git a/apps/studio/src/components/wordpress-styles.tsx b/apps/studio/src/components/wordpress-styles.tsx index dc9637d72e..31c83f7469 100644 --- a/apps/studio/src/components/wordpress-styles.tsx +++ b/apps/studio/src/components/wordpress-styles.tsx @@ -1,27 +1,18 @@ import { useI18n } from '@wordpress/react-i18n'; import { DynamicStylesheet } from 'src/components/dynamic-stylesheet'; +import wordpressStylesUrl from '@wordpress/components/build-style/style.css?url'; +import wordpressStylesRtlUrl from '@wordpress/components/build-style/style-rtl.css?url'; const WORDPRESS_STYLES_ID = 'wordpress-components-style'; -// @ts-expect-error - import.meta syntax is not supported by TypeScript's commonjs module setting, -// but Vite handles this at build time and replaces it with the actual value -const isDevelopment = import.meta.env.DEV; - -const repoRoot = import.meta.env.VITE_REPO_ROOT as string | undefined; -const repoRootNormalized = repoRoot ? repoRoot.replace( /\/$/, '' ) : ''; -const WORDPRESS_STYLES_LTR = isDevelopment - ? `/@fs${ repoRootNormalized }/node_modules/@wordpress/components/build-style/style.css` - : './main_window/styles/wordpress-components-style.css'; - -const WORDPRESS_STYLES_RTL = isDevelopment - ? `/@fs${ repoRootNormalized }/node_modules/@wordpress/components/build-style/style-rtl.css` - : './main_window/styles/wordpress-components-style-rtl.css'; +export const getWordpressStylesHref = ( isRtl: boolean ) => + isRtl ? wordpressStylesRtlUrl : wordpressStylesUrl; export const WordPressStyles = () => { const { isRTL } = useI18n(); const isRtl = isRTL(); - const href = isRtl ? WORDPRESS_STYLES_RTL : WORDPRESS_STYLES_LTR; + const href = getWordpressStylesHref( isRtl ); return ; }; diff --git a/apps/studio/src/custom-package-definitions.d.ts b/apps/studio/src/custom-package-definitions.d.ts index d9dbef9e12..a973ac33fd 100644 --- a/apps/studio/src/custom-package-definitions.d.ts +++ b/apps/studio/src/custom-package-definitions.d.ts @@ -33,6 +33,11 @@ declare module '*.riv?url' { export default url; } +declare module '*.css?url' { + const url: string; + export default url; +} + declare module '*.wasm' { const dataUri: function; export default dataUri; From f43fe64494bf9106cdec1c769304bfc5f6263599 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 15:20:34 +0100 Subject: [PATCH 14/60] Clean up after trunk merge --- apps/cli/commands/site/create.ts | 5 ++++- apps/cli/commands/site/tests/create.test.ts | 2 +- .../import-export/export/exporters/default-exporter.ts | 5 ++++- .../tests/export/exporters/default-exporter.test.ts | 8 ++++---- .../common/lib}/remove-default-db-constants.ts | 0 .../common/lib}/tests/remove-default-db-constants.test.ts | 2 +- 6 files changed, 14 insertions(+), 8 deletions(-) rename {apps/studio/src/migrations => tools/common/lib}/remove-default-db-constants.ts (100%) rename {apps/studio/src/migrations => tools/common/lib}/tests/remove-default-db-constants.test.ts (99%) diff --git a/apps/cli/commands/site/create.ts b/apps/cli/commands/site/create.ts index 42dbeda63b..28749162bd 100644 --- a/apps/cli/commands/site/create.ts +++ b/apps/cli/commands/site/create.ts @@ -24,6 +24,10 @@ import { DEFAULT_LOCALE } from '@studio/common/lib/locale'; import { isOnline } from '@studio/common/lib/network-utils'; import { createPassword } from '@studio/common/lib/passwords'; import { portFinder } from '@studio/common/lib/port-finder'; +import { + hasDefaultDbBlock, + removeDbConstants, +} from '@studio/common/lib/remove-default-db-constants'; import { SITE_EVENTS } from '@studio/common/lib/site-events'; import { sortSites } from '@studio/common/lib/sort-sites'; import { @@ -33,7 +37,6 @@ import { import { SiteCommandLoggerAction as LoggerAction } from '@studio/common/logger-actions'; import { __, sprintf } from '@wordpress/i18n'; import { Blueprint, StepDefinition } from '@wp-playground/blueprints'; -import { hasDefaultDbBlock, removeDbConstants } from 'src/migrations/remove-default-db-constants'; import { lockAppdata, readAppdata, diff --git a/apps/cli/commands/site/tests/create.test.ts b/apps/cli/commands/site/tests/create.test.ts index 242f45a7ef..0227c9527e 100644 --- a/apps/cli/commands/site/tests/create.test.ts +++ b/apps/cli/commands/site/tests/create.test.ts @@ -12,8 +12,8 @@ import { } from '@studio/common/lib/fs-utils'; import { isOnline } from '@studio/common/lib/network-utils'; import { portFinder } from '@studio/common/lib/port-finder'; +import { normalizeLineEndings } from '@studio/common/lib/remove-default-db-constants'; import { Blueprint, StepDefinition } from '@wp-playground/blueprints'; -import { normalizeLineEndings } from 'src/migrations/remove-default-db-constants'; import { vi, type MockInstance } from 'vitest'; import { lockAppdata, diff --git a/apps/studio/src/lib/import-export/export/exporters/default-exporter.ts b/apps/studio/src/lib/import-export/export/exporters/default-exporter.ts index 2dec605f32..ef1c33fa1d 100644 --- a/apps/studio/src/lib/import-export/export/exporters/default-exporter.ts +++ b/apps/studio/src/lib/import-export/export/exporters/default-exporter.ts @@ -3,6 +3,10 @@ import fs from 'fs'; import fsPromises from 'fs/promises'; import os from 'os'; import path from 'path'; +import { + hasDefaultDbBlock, + removeDbConstants, +} from '@studio/common/lib/remove-default-db-constants'; import archiver from 'archiver'; import { ARCHIVER_OPTIONS } from 'src/constants'; import { getSiteUrl } from 'src/lib/get-site-url'; @@ -20,7 +24,6 @@ import { StudioJson, } from 'src/lib/import-export/export/types'; import { getWordPressVersionFromInstallation } from 'src/lib/wp-versions'; -import { hasDefaultDbBlock, removeDbConstants } from 'src/migrations/remove-default-db-constants'; import { SiteServer } from 'src/site-server'; export class DefaultExporter extends EventEmitter implements Exporter { diff --git a/apps/studio/src/lib/import-export/tests/export/exporters/default-exporter.test.ts b/apps/studio/src/lib/import-export/tests/export/exporters/default-exporter.test.ts index 329a23ebdb..48b156bc31 100644 --- a/apps/studio/src/lib/import-export/tests/export/exporters/default-exporter.test.ts +++ b/apps/studio/src/lib/import-export/tests/export/exporters/default-exporter.test.ts @@ -2,16 +2,16 @@ import fs from 'fs'; import fsPromises from 'fs/promises'; import os from 'os'; import path from 'path'; +import { + normalizeLineEndings, + removeDbConstants, +} from '@studio/common/lib/remove-default-db-constants'; import archiver from 'archiver'; import { format } from 'date-fns'; import { vi, beforeAll, afterAll, Mock, MockedFunction, Mocked } from 'vitest'; import { DefaultExporter } from 'src/lib/import-export/export/exporters'; import { ExportOptions, BackupContents } from 'src/lib/import-export/export/types'; import { getWordPressVersionFromInstallation } from 'src/lib/wp-versions'; -import { - normalizeLineEndings, - removeDbConstants, -} from 'src/migrations/remove-default-db-constants'; import { SiteServer } from 'src/site-server'; import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; diff --git a/apps/studio/src/migrations/remove-default-db-constants.ts b/tools/common/lib/remove-default-db-constants.ts similarity index 100% rename from apps/studio/src/migrations/remove-default-db-constants.ts rename to tools/common/lib/remove-default-db-constants.ts diff --git a/apps/studio/src/migrations/tests/remove-default-db-constants.test.ts b/tools/common/lib/tests/remove-default-db-constants.test.ts similarity index 99% rename from apps/studio/src/migrations/tests/remove-default-db-constants.test.ts rename to tools/common/lib/tests/remove-default-db-constants.test.ts index e033165d26..d858169a87 100644 --- a/apps/studio/src/migrations/tests/remove-default-db-constants.test.ts +++ b/tools/common/lib/tests/remove-default-db-constants.test.ts @@ -2,7 +2,7 @@ import { hasDefaultDbBlock, normalizeLineEndings, removeDbConstants, -} from 'src/migrations/remove-default-db-constants'; +} from '../remove-default-db-constants'; const WP_CONFIG_WITH_DEFAULTS = normalizeLineEndings( ` Date: Wed, 11 Feb 2026 15:22:41 +0100 Subject: [PATCH 15/60] require.resolve --- apps/studio/electron.vite.config.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/studio/electron.vite.config.ts b/apps/studio/electron.vite.config.ts index e8cc82d666..73f6e609db 100644 --- a/apps/studio/electron.vite.config.ts +++ b/apps/studio/electron.vite.config.ts @@ -1,4 +1,5 @@ import { resolve } from 'path'; +import { createRequire } from 'module'; import { defineConfig } from 'electron-vite'; import react from '@vitejs/plugin-react'; import topLevelAwait from 'vite-plugin-top-level-await'; @@ -12,7 +13,9 @@ const { sentryRelease, isDevEnvironment } = getSentryReleaseInfo( version ); console.log( 'Sentry release version:', sentryRelease ); console.log( 'Sentry environment:', isDevEnvironment ? 'development' : 'production' ); -export default defineConfig( { +const require = createRequire( import.meta.url ); + +export default defineConfig({ main: { plugins: [], resolve: { @@ -77,11 +80,11 @@ export default defineConfig( { viteStaticCopy( { targets: [ { - src: resolve( __dirname, '../../node_modules/@rive-app/canvas/rive.wasm' ), + src: require.resolve( '@rive-app/canvas/rive.wasm') , dest: 'assets', }, { - src: resolve( __dirname, '../../node_modules/@rive-app/canvas/rive_fallback.wasm' ), + src: require.resolve( '@rive-app/canvas/rive_fallback.wasm' ), dest: 'assets', }, { From 28b444dc8c7351177071cd81be487e93ea5aad81 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 15:32:00 +0100 Subject: [PATCH 16/60] Lint --- apps/studio/src/components/wordpress-styles.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/studio/src/components/wordpress-styles.tsx b/apps/studio/src/components/wordpress-styles.tsx index 31c83f7469..12daccb95f 100644 --- a/apps/studio/src/components/wordpress-styles.tsx +++ b/apps/studio/src/components/wordpress-styles.tsx @@ -1,7 +1,7 @@ +import wordpressStylesRtlUrl from '@wordpress/components/build-style/style-rtl.css?url'; +import wordpressStylesUrl from '@wordpress/components/build-style/style.css?url'; import { useI18n } from '@wordpress/react-i18n'; import { DynamicStylesheet } from 'src/components/dynamic-stylesheet'; -import wordpressStylesUrl from '@wordpress/components/build-style/style.css?url'; -import wordpressStylesRtlUrl from '@wordpress/components/build-style/style-rtl.css?url'; const WORDPRESS_STYLES_ID = 'wordpress-components-style'; From f310242c50ad458e4dedd6ba41d9086f30e3cb43 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 15:34:22 +0100 Subject: [PATCH 17/60] Debugging --- apps/studio/electron.vite.config.ts | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/apps/studio/electron.vite.config.ts b/apps/studio/electron.vite.config.ts index 73f6e609db..7dceb8e477 100644 --- a/apps/studio/electron.vite.config.ts +++ b/apps/studio/electron.vite.config.ts @@ -1,4 +1,5 @@ -import { resolve } from 'path'; +import { resolve, dirname } from 'path'; +import fs from 'fs'; import { createRequire } from 'module'; import { defineConfig } from 'electron-vite'; import react from '@vitejs/plugin-react'; @@ -14,6 +15,22 @@ console.log( 'Sentry release version:', sentryRelease ); console.log( 'Sentry environment:', isDevEnvironment ? 'development' : 'production' ); const require = createRequire( import.meta.url ); +function resolvePackageFile( pkgName: string, fileName: string ) { + let pkgJsonPath: string; + try { + pkgJsonPath = require.resolve( `${ pkgName }/package.json` ); + } catch ( error ) { + throw new Error( `Failed to resolve ${ pkgName }/package.json: ${ String( error ) }` ); + } + const pkgDir = dirname( pkgJsonPath ); + const filePath = resolve( pkgDir, fileName ); + if ( ! fs.existsSync( filePath ) ) { + throw new Error( `Required file does not exist: ${ filePath }` ); + } + return filePath; +} +const riveWasm = resolvePackageFile( '@rive-app/canvas', 'rive.wasm' ); +const riveFallbackWasm = resolvePackageFile( '@rive-app/canvas', 'rive_fallback.wasm' ); export default defineConfig({ main: { @@ -80,11 +97,11 @@ export default defineConfig({ viteStaticCopy( { targets: [ { - src: require.resolve( '@rive-app/canvas/rive.wasm') , + src: riveWasm, dest: 'assets', }, { - src: require.resolve( '@rive-app/canvas/rive_fallback.wasm' ), + src: riveFallbackWasm, dest: 'assets', }, { From 50ea2f82aaa06d3be513c1b15cb48fcce502a0c3 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 15:56:03 +0100 Subject: [PATCH 18/60] normalizePath --- apps/studio/electron.vite.config.ts | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/apps/studio/electron.vite.config.ts b/apps/studio/electron.vite.config.ts index 7dceb8e477..92617bb2d8 100644 --- a/apps/studio/electron.vite.config.ts +++ b/apps/studio/electron.vite.config.ts @@ -1,7 +1,7 @@ -import { resolve, dirname } from 'path'; -import fs from 'fs'; +import { resolve } from 'path'; import { createRequire } from 'module'; import { defineConfig } from 'electron-vite'; +import { normalizePath } from 'vite'; import react from '@vitejs/plugin-react'; import topLevelAwait from 'vite-plugin-top-level-await'; import { viteStaticCopy } from 'vite-plugin-static-copy'; @@ -15,22 +15,6 @@ console.log( 'Sentry release version:', sentryRelease ); console.log( 'Sentry environment:', isDevEnvironment ? 'development' : 'production' ); const require = createRequire( import.meta.url ); -function resolvePackageFile( pkgName: string, fileName: string ) { - let pkgJsonPath: string; - try { - pkgJsonPath = require.resolve( `${ pkgName }/package.json` ); - } catch ( error ) { - throw new Error( `Failed to resolve ${ pkgName }/package.json: ${ String( error ) }` ); - } - const pkgDir = dirname( pkgJsonPath ); - const filePath = resolve( pkgDir, fileName ); - if ( ! fs.existsSync( filePath ) ) { - throw new Error( `Required file does not exist: ${ filePath }` ); - } - return filePath; -} -const riveWasm = resolvePackageFile( '@rive-app/canvas', 'rive.wasm' ); -const riveFallbackWasm = resolvePackageFile( '@rive-app/canvas', 'rive_fallback.wasm' ); export default defineConfig({ main: { @@ -97,19 +81,19 @@ export default defineConfig({ viteStaticCopy( { targets: [ { - src: riveWasm, + src: normalizePath( require.resolve( '@rive-app/canvas/rive.wasm') ), dest: 'assets', }, { - src: riveFallbackWasm, + src: normalizePath( require.resolve( '@rive-app/canvas/rive_fallback.wasm' ) ), dest: 'assets', }, { - src: resolve( __dirname, 'src/about-menu/about-menu.html' ), + src: normalizePath( resolve( __dirname, 'src/about-menu/about-menu.html' ) ), dest: '.', }, { - src: resolve( __dirname, 'src/about-menu/studio-app-icon.png' ), + src: normalizePath( resolve( __dirname, 'src/about-menu/studio-app-icon.png' ) ), dest: '.', }, ], From 28d0ea8d39b4a499534d5318ea9d7802ae7fb1f6 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 15:58:23 +0100 Subject: [PATCH 19/60] Update @vitejs/plugin-react@^5.1.4 --- apps/studio/package.json | 2 +- package-lock.json | 276 +++++++++++++++++++++++++++++++++++---- 2 files changed, 250 insertions(+), 28 deletions(-) diff --git a/apps/studio/package.json b/apps/studio/package.json index 36a285d632..c66ae1cfae 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -100,7 +100,7 @@ "@types/shell-quote": "^1.7.5", "@types/winreg": "^1.2.36", "@types/yauzl": "^2.10.3", - "@vitejs/plugin-react": "^5.1.2", + "@vitejs/plugin-react": "^5.1.4", "@wp-playground/blueprints": "^3.0.46", "electron": "^39.2.7", "electron-devtools-installer": "^4.0.0", diff --git a/package-lock.json b/package-lock.json index f5a5f96020..3747762b42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,6 @@ }, "apps/cli": { "name": "studio-cli", - "hasInstallScript": true, "license": "GPL-2.0-or-later", "dependencies": { "@php-wasm/universal": "^3.0.46", @@ -81,7 +80,6 @@ "apps/studio": { "name": "studio-app", "version": "1.7.3", - "hasInstallScript": true, "license": "GPL-2.0-or-later", "dependencies": { "@automattic/generate-password": "^0.1.0", @@ -161,7 +159,7 @@ "@types/shell-quote": "^1.7.5", "@types/winreg": "^1.2.36", "@types/yauzl": "^2.10.3", - "@vitejs/plugin-react": "^5.1.2", + "@vitejs/plugin-react": "^5.1.4", "@wp-playground/blueprints": "^3.0.46", "electron": "^39.2.7", "electron-devtools-installer": "^4.0.0", @@ -180,6 +178,254 @@ "appdmg": "^0.6.6" } }, + "apps/studio/node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "apps/studio/node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "apps/studio/node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "apps/studio/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "apps/studio/node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "apps/studio/node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "apps/studio/node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "apps/studio/node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "apps/studio/node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "apps/studio/node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "apps/studio/node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "apps/studio/node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "apps/studio/node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "apps/studio/node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "apps/studio/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "dev": true, + "license": "MIT" + }, + "apps/studio/node_modules/@vitejs/plugin-react": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz", + "integrity": "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, "node_modules/@adobe/css-tools": { "version": "4.4.4", "dev": true, @@ -7021,11 +7267,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.53", - "dev": true, - "license": "MIT" - }, "node_modules/@rollup/plugin-virtual": { "version": "3.0.2", "dev": true, @@ -8821,25 +9062,6 @@ "react": ">= 16.8.0" } }, - "node_modules/@vitejs/plugin-react": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.5", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.53", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.18.0" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, "node_modules/@vitest/expect": { "version": "2.1.8", "dev": true, From 39508fb585050e9f739f9ff46d37ea6ed292203f Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Wed, 11 Feb 2026 16:28:23 +0100 Subject: [PATCH 20/60] Tweak --- apps/cli/vite.config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/cli/vite.config.ts b/apps/cli/vite.config.ts index e249ac0d51..494f68c6dd 100644 --- a/apps/cli/vite.config.ts +++ b/apps/cli/vite.config.ts @@ -16,7 +16,7 @@ export default defineConfig( { viteStaticCopy( { targets: [ { - src: `${ yargsLocalesPath }/*`, + src: `../../node_modules/yargs/locales/*`, dest: '../locales', }, ], @@ -28,7 +28,7 @@ export default defineConfig( { viteStaticCopy( { targets: [ { - src: cliNodeModulesPath, + src: 'node_modules', dest: '.', }, ], From 5053f4cddb7d9e004196149f09d6b7cb94d91e3d Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Thu, 12 Feb 2026 09:29:37 +0100 Subject: [PATCH 21/60] Clean up and move `platformTestSuite` to tools/common/ --- .../import-export/export/export-database.ts | 2 +- .../export/exporters/default-exporter.ts | 2 +- .../export/exporters/default-exporter.test.ts | 2 +- .../export/exporters/sql-exporter.test.ts | 2 +- .../import/importer/jetpack-importer.test.ts | 2 +- .../import/importer/local-importer.test.ts | 2 +- .../importer/playground-importer.test.ts | 2 +- .../validators/jetpack-validator.test.ts | 2 +- .../import/validators/local-validator.test.ts | 2 +- .../validators/playground-validator.test.ts | 2 +- .../import/validators/sql-validator.test.ts | 2 +- .../validators/wpress-validator.test.ts | 2 +- .../src/storage/tests/user-data.test.ts | 2 +- tools/common/lib/tests/sequential.test.ts | 2 +- .../lib/tests/sqlite-integration.test.ts | 10 +-- tools/common/lib/tests/utils/fs-extra-mock.ts | 79 +++++++++++++++++++ .../lib}/tests/utils/platform-test-suite.ts | 0 17 files changed, 96 insertions(+), 21 deletions(-) create mode 100644 tools/common/lib/tests/utils/fs-extra-mock.ts rename {apps/studio/src => tools/common/lib}/tests/utils/platform-test-suite.ts (100%) diff --git a/apps/studio/src/lib/import-export/export/export-database.ts b/apps/studio/src/lib/import-export/export/export-database.ts index 073179223f..50bf4dd3f0 100644 --- a/apps/studio/src/lib/import-export/export/export-database.ts +++ b/apps/studio/src/lib/import-export/export/export-database.ts @@ -1,6 +1,6 @@ import path from 'path'; +import { parseJsonFromPhpOutput } from '@studio/common/lib/php-output-parser'; import { move } from 'fs-extra'; -import { parseJsonFromPhpOutput } from 'common/lib/php-output-parser'; import { generateBackupFilename } from 'src/lib/import-export/export/generate-backup-filename'; import { SiteServer } from 'src/site-server'; diff --git a/apps/studio/src/lib/import-export/export/exporters/default-exporter.ts b/apps/studio/src/lib/import-export/export/exporters/default-exporter.ts index 572a9e9ef5..e303aa3d66 100644 --- a/apps/studio/src/lib/import-export/export/exporters/default-exporter.ts +++ b/apps/studio/src/lib/import-export/export/exporters/default-exporter.ts @@ -3,12 +3,12 @@ import fs from 'fs'; import fsPromises from 'fs/promises'; import os from 'os'; import path from 'path'; +import { parseJsonFromPhpOutput } from '@studio/common/lib/php-output-parser'; import { hasDefaultDbBlock, removeDbConstants, } from '@studio/common/lib/remove-default-db-constants'; import archiver from 'archiver'; -import { parseJsonFromPhpOutput } from 'common/lib/php-output-parser'; import { ARCHIVER_OPTIONS } from 'src/constants'; import { getSiteUrl } from 'src/lib/get-site-url'; import { ExportEvents } from 'src/lib/import-export/export/events'; diff --git a/apps/studio/src/lib/import-export/tests/export/exporters/default-exporter.test.ts b/apps/studio/src/lib/import-export/tests/export/exporters/default-exporter.test.ts index 48b156bc31..7170a5f363 100644 --- a/apps/studio/src/lib/import-export/tests/export/exporters/default-exporter.test.ts +++ b/apps/studio/src/lib/import-export/tests/export/exporters/default-exporter.test.ts @@ -6,6 +6,7 @@ import { normalizeLineEndings, removeDbConstants, } from '@studio/common/lib/remove-default-db-constants'; +import { platformTestSuite } from '@studio/common/lib/tests/utils/platform-test-suite'; import archiver from 'archiver'; import { format } from 'date-fns'; import { vi, beforeAll, afterAll, Mock, MockedFunction, Mocked } from 'vitest'; @@ -13,7 +14,6 @@ import { DefaultExporter } from 'src/lib/import-export/export/exporters'; import { ExportOptions, BackupContents } from 'src/lib/import-export/export/types'; import { getWordPressVersionFromInstallation } from 'src/lib/wp-versions'; import { SiteServer } from 'src/site-server'; -import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; vi.mock( 'fs' ); vi.mock( 'fs/promises' ); diff --git a/apps/studio/src/lib/import-export/tests/export/exporters/sql-exporter.test.ts b/apps/studio/src/lib/import-export/tests/export/exporters/sql-exporter.test.ts index 5c9b95cc63..e30c5ab626 100644 --- a/apps/studio/src/lib/import-export/tests/export/exporters/sql-exporter.test.ts +++ b/apps/studio/src/lib/import-export/tests/export/exporters/sql-exporter.test.ts @@ -1,9 +1,9 @@ +import { platformTestSuite } from '@studio/common/lib/tests/utils/platform-test-suite'; import { move } from 'fs-extra'; import { vi } from 'vitest'; import { SqlExporter } from 'src/lib/import-export/export/exporters'; import { ExportOptions } from 'src/lib/import-export/export/types'; import { SiteServer } from 'src/site-server'; -import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; vi.mock( 'fs' ); vi.mock( 'fs/promises' ); diff --git a/apps/studio/src/lib/import-export/tests/import/importer/jetpack-importer.test.ts b/apps/studio/src/lib/import-export/tests/import/importer/jetpack-importer.test.ts index a2a51b0200..23937dc769 100644 --- a/apps/studio/src/lib/import-export/tests/import/importer/jetpack-importer.test.ts +++ b/apps/studio/src/lib/import-export/tests/import/importer/jetpack-importer.test.ts @@ -1,10 +1,10 @@ import * as fs from 'fs/promises'; +import { platformTestSuite } from '@studio/common/lib/tests/utils/platform-test-suite'; import { lstat, move, Stats } from 'fs-extra'; import { vi } from 'vitest'; import { JetpackImporter, SQLImporter } from 'src/lib/import-export/import/importers'; import { BackupContents } from 'src/lib/import-export/import/types'; import { SiteServer } from 'src/site-server'; -import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; vi.mock( 'fs/promises' ); vi.mock( 'src/site-server' ); diff --git a/apps/studio/src/lib/import-export/tests/import/importer/local-importer.test.ts b/apps/studio/src/lib/import-export/tests/import/importer/local-importer.test.ts index ed8ab77018..c1830b0a80 100644 --- a/apps/studio/src/lib/import-export/tests/import/importer/local-importer.test.ts +++ b/apps/studio/src/lib/import-export/tests/import/importer/local-importer.test.ts @@ -1,10 +1,10 @@ import * as fs from 'fs/promises'; +import { platformTestSuite } from '@studio/common/lib/tests/utils/platform-test-suite'; import { lstat, move, Stats } from 'fs-extra'; import { vi } from 'vitest'; import { LocalImporter } from 'src/lib/import-export/import/importers'; import { BackupContents } from 'src/lib/import-export/import/types'; import { SiteServer } from 'src/site-server'; -import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; vi.mock( 'fs/promises' ); vi.mock( 'src/site-server' ); diff --git a/apps/studio/src/lib/import-export/tests/import/importer/playground-importer.test.ts b/apps/studio/src/lib/import-export/tests/import/importer/playground-importer.test.ts index ea1b7b8471..52f33442a9 100644 --- a/apps/studio/src/lib/import-export/tests/import/importer/playground-importer.test.ts +++ b/apps/studio/src/lib/import-export/tests/import/importer/playground-importer.test.ts @@ -1,10 +1,10 @@ import * as fs from 'fs/promises'; +import { platformTestSuite } from '@studio/common/lib/tests/utils/platform-test-suite'; import { lstat, move, Stats } from 'fs-extra'; import { vi } from 'vitest'; import { PlaygroundImporter } from 'src/lib/import-export/import/importers'; import { BackupContents } from 'src/lib/import-export/import/types'; import { SiteServer } from 'src/site-server'; -import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; vi.mock( 'fs/promises' ); vi.mock( 'src/site-server' ); diff --git a/apps/studio/src/lib/import-export/tests/import/validators/jetpack-validator.test.ts b/apps/studio/src/lib/import-export/tests/import/validators/jetpack-validator.test.ts index bb1a88ec1f..7d6c788369 100644 --- a/apps/studio/src/lib/import-export/tests/import/validators/jetpack-validator.test.ts +++ b/apps/studio/src/lib/import-export/tests/import/validators/jetpack-validator.test.ts @@ -1,5 +1,5 @@ +import { platformTestSuite } from '@studio/common/lib/tests/utils/platform-test-suite'; import { JetpackValidator } from 'src/lib/import-export/import/validators/jetpack-validator'; -import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; platformTestSuite( 'JetpackValidator', ( { normalize } ) => { let validator: JetpackValidator; diff --git a/apps/studio/src/lib/import-export/tests/import/validators/local-validator.test.ts b/apps/studio/src/lib/import-export/tests/import/validators/local-validator.test.ts index 5e671273c4..ff4936ebee 100644 --- a/apps/studio/src/lib/import-export/tests/import/validators/local-validator.test.ts +++ b/apps/studio/src/lib/import-export/tests/import/validators/local-validator.test.ts @@ -1,5 +1,5 @@ +import { platformTestSuite } from '@studio/common/lib/tests/utils/platform-test-suite'; import { LocalValidator } from 'src/lib/import-export/import/validators/local-validator'; -import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; platformTestSuite( 'LocalValidator', ( { normalize } ) => { let validator: LocalValidator; diff --git a/apps/studio/src/lib/import-export/tests/import/validators/playground-validator.test.ts b/apps/studio/src/lib/import-export/tests/import/validators/playground-validator.test.ts index f51afa307e..13f7aeb304 100644 --- a/apps/studio/src/lib/import-export/tests/import/validators/playground-validator.test.ts +++ b/apps/studio/src/lib/import-export/tests/import/validators/playground-validator.test.ts @@ -1,5 +1,5 @@ +import { platformTestSuite } from '@studio/common/lib/tests/utils/platform-test-suite'; import { PlaygroundValidator } from 'src/lib/import-export/import/validators/playground-validator'; -import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; platformTestSuite( 'PlaygroundValidator', ( { normalize } ) => { const validator = new PlaygroundValidator(); diff --git a/apps/studio/src/lib/import-export/tests/import/validators/sql-validator.test.ts b/apps/studio/src/lib/import-export/tests/import/validators/sql-validator.test.ts index f7948085e0..bb442e5f75 100644 --- a/apps/studio/src/lib/import-export/tests/import/validators/sql-validator.test.ts +++ b/apps/studio/src/lib/import-export/tests/import/validators/sql-validator.test.ts @@ -1,5 +1,5 @@ +import { platformTestSuite } from '@studio/common/lib/tests/utils/platform-test-suite'; import { SqlValidator } from 'src/lib/import-export/import/validators/sql-validator'; -import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; platformTestSuite( 'SqlValidator', ( { normalize } ) => { let validator: SqlValidator; diff --git a/apps/studio/src/lib/import-export/tests/import/validators/wpress-validator.test.ts b/apps/studio/src/lib/import-export/tests/import/validators/wpress-validator.test.ts index b41817c958..3686d3d13c 100644 --- a/apps/studio/src/lib/import-export/tests/import/validators/wpress-validator.test.ts +++ b/apps/studio/src/lib/import-export/tests/import/validators/wpress-validator.test.ts @@ -1,7 +1,7 @@ +import { platformTestSuite } from '@studio/common/lib/tests/utils/platform-test-suite'; import { vi } from 'vitest'; import { ImportEvents } from 'src/lib/import-export/import/events'; import { WpressValidator } from 'src/lib/import-export/import/validators/wpress-validator'; -import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; platformTestSuite( 'WpressValidator', ( { sep: separator } ) => { let validator: WpressValidator; diff --git a/apps/studio/src/storage/tests/user-data.test.ts b/apps/studio/src/storage/tests/user-data.test.ts index 1135a5bbe3..d684fe4551 100644 --- a/apps/studio/src/storage/tests/user-data.test.ts +++ b/apps/studio/src/storage/tests/user-data.test.ts @@ -2,10 +2,10 @@ * @vitest-environment node */ // To run tests, execute `npm run test -- src/storage/user-data.test.ts` from the root directory +import { platformTestSuite } from '@studio/common/lib/tests/utils/platform-test-suite'; import { readFile, writeFile } from 'atomically'; import { vi } from 'vitest'; import { loadUserData, lockAppdata, unlockAppdata, saveUserData } from 'src/storage/user-data'; -import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; import { UserData } from '../storage-types'; const { diff --git a/tools/common/lib/tests/sequential.test.ts b/tools/common/lib/tests/sequential.test.ts index 47163f39b4..a62a9c62bb 100644 --- a/tools/common/lib/tests/sequential.test.ts +++ b/tools/common/lib/tests/sequential.test.ts @@ -1,4 +1,4 @@ -import { sequential } from 'common/lib/sequential'; +import { sequential } from '../sequential'; describe( 'sequential', () => { describe( 'concurrency', () => { diff --git a/tools/common/lib/tests/sqlite-integration.test.ts b/tools/common/lib/tests/sqlite-integration.test.ts index d5bb7777cd..30f50d2361 100644 --- a/tools/common/lib/tests/sqlite-integration.test.ts +++ b/tools/common/lib/tests/sqlite-integration.test.ts @@ -1,16 +1,12 @@ -import { SqliteIntegrationProvider } from '@studio/common/lib/sqlite-integration'; import fs from 'fs-extra'; -import { platformTestSuite } from 'src/tests/utils/platform-test-suite'; import { vi } from 'vitest'; +import { SqliteIntegrationProvider } from '../sqlite-integration'; +import { platformTestSuite } from './utils/platform-test-suite'; const SQLITE_DIRNAME = 'sqlite-database-integration'; const MOCK_SITE_PATH = 'mock-site-path'; -// Use the global fs-extra mock from src/__mocks__/fs-extra.ts -vi.mock( 'fs-extra', async () => { - const mockModule = await import( 'src/__mocks__/fs-extra' ); - return mockModule; -} ); +vi.mock( 'fs-extra', async () => await import( './utils/fs-extra-mock' ) ); // Import the mock helpers directly from the mocked fs-extra module const mockFs = fs as typeof fs & { diff --git a/tools/common/lib/tests/utils/fs-extra-mock.ts b/tools/common/lib/tests/utils/fs-extra-mock.ts new file mode 100644 index 0000000000..dbf972eb01 --- /dev/null +++ b/tools/common/lib/tests/utils/fs-extra-mock.ts @@ -0,0 +1,79 @@ +import { vi } from 'vitest'; + +// Extend globalThis to include our mock file system +declare global { + // eslint-disable-next-line no-var + var __fsExtraMockFiles: Record< string, string | string[] > | undefined; +} + +// Use globalThis to share state between mock and tests +// This allows tests to directly access and modify the mock file system +if ( ! globalThis.__fsExtraMockFiles ) { + globalThis.__fsExtraMockFiles = {}; +} +const mockFiles = globalThis.__fsExtraMockFiles; + +const readFile = vi.fn( async ( path: string ): Promise< string > => { + const fileContents = mockFiles[ path ]; + if ( typeof fileContents === 'string' ) { + return fileContents; + } + return ''; +} ); + +const readFileSync = vi.fn( ( path: string ): string => { + const fileContents = mockFiles[ path ]; + if ( typeof fileContents === 'string' ) { + return fileContents; + } + return ''; +} ); + +const readdir = vi.fn( async ( path: string ): Promise< Array< string > > => { + const dirContents = mockFiles[ path ]; + if ( Array.isArray( dirContents ) ) { + return dirContents; + } + return []; +} ); + +const pathExists = vi.fn( async ( path: string ): Promise< boolean > => { + return !! mockFiles[ path ]; +} ); + +const mkdir = vi.fn(); +const writeFile = vi.fn(); +const copy = vi.fn(); + +const __setFileContents = ( path: string, fileContents: string | string[] ) => { + mockFiles[ path ] = fileContents; +}; + +const __clearMockFiles = () => { + Object.keys( mockFiles ).forEach( ( key ) => delete mockFiles[ key ] ); +}; + +export default { + __mockFiles: mockFiles, + __setFileContents, + __clearMockFiles, + readFile, + readFileSync, + readdir, + pathExists, + mkdir, + writeFile, + copy, +}; + +export { + readFile, + readFileSync, + readdir, + pathExists, + mkdir, + writeFile, + copy, + __setFileContents, + __clearMockFiles, +}; diff --git a/apps/studio/src/tests/utils/platform-test-suite.ts b/tools/common/lib/tests/utils/platform-test-suite.ts similarity index 100% rename from apps/studio/src/tests/utils/platform-test-suite.ts rename to tools/common/lib/tests/utils/platform-test-suite.ts From 06fc0e1f1a65eea1f6107a3d96fcd90d0813122a Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Thu, 12 Feb 2026 11:19:29 +0100 Subject: [PATCH 22/60] Improve post-packaging cleanup --- apps/cli/package.json | 6 ++++-- apps/studio/forge.config.ts | 6 +----- apps/studio/package.json | 1 + package.json | 3 +-- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index e424a110af..701050d62c 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -23,8 +23,10 @@ }, "scripts": { "build": "vite build --config ./vite.config.ts", - "watch": "vite build --config ./vite.config.ts --watch", - "install:bundle": "npm install --no-package-lock --install-links --no-workspaces && patch-package" + "install:bundle": "npm install --omit=dev --no-package-lock --install-links --no-workspaces && patch-package", + "package": "npm run install:bundle && npm run build", + "postpackage": "rimraf node_modules", + "watch": "vite build --config ./vite.config.ts --watch" }, "devDependencies": { "@types/archiver": "^6.0.4", diff --git a/apps/studio/forge.config.ts b/apps/studio/forge.config.ts index 381d6dc87f..234eff94e5 100644 --- a/apps/studio/forge.config.ts +++ b/apps/studio/forge.config.ts @@ -150,7 +150,7 @@ const config: ForgeConfig = { await execAsync( 'npm run app:install:bundle', { cwd: repoRoot } ); console.log( 'Building CLI (with bundled node_modules) ...' ); - await execAsync( 'npm run cli:build:bundle', { cwd: repoRoot } ); + await execAsync( 'npm run cli:package', { cwd: repoRoot } ); console.log( `Downloading Node.js binary for ${ platform }-${ arch }...` ); await execAsync( @@ -162,10 +162,6 @@ const config: ForgeConfig = { { cwd: repoRoot } ); }, - postPackage: async (forgeConfig, options) => { - fs.rmSync( path.join( repoRoot, 'apps', 'cli', 'node_modules' ), { recursive: true } ); - fs.rmSync( path.join( repoRoot, 'apps', 'studio', 'node_modules' ), { recursive: true } ); - }, }, }; diff --git a/apps/studio/package.json b/apps/studio/package.json index c66ae1cfae..99d8a59f5b 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -19,6 +19,7 @@ "make:macos-arm64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && SKIP_DMG=true FILE_ARCHITECTURE=arm64 electron-forge make . --arch=arm64 --platform=darwin", "install:bundle": "npm install --no-package-lock --install-links --no-workspaces && patch-package && npx @electron/rebuild -o fs-ext", "package": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge package .", + "postpackage": "rimraf node_modules", "publish": "electron-forge publish .", "start-wayland": "npm -w studio-cli run build && electron-forge start . -- --enable-features=UseOzonePlatform --ozone-platform=wayland" }, diff --git a/package.json b/package.json index 3e7632eb0d..117c176b9c 100644 --- a/package.json +++ b/package.json @@ -37,9 +37,8 @@ "make:dmg-arm64": "FILE_ARCHITECTURE=arm64 node ./scripts/make-dmg.mjs", "publish": "npm -w studio-app run publish", "cli:build": "npm -w studio-cli run build", + "cli:package": "npm -w studio-cli run package", "cli:watch": "npm -w studio-cli run watch", - "cli:install:bundle": "npm -w studio-cli run install:bundle", - "cli:build:bundle": "npm run cli:install:bundle && npm run cli:build", "app:install:bundle": "npm -w studio-app run install:bundle", "compare:perf": "npm -w compare-perf run compare", "lint": "eslint {apps/cli,apps/studio/src,apps/studio/e2e,tools/common}", From 8a30a785e0cc50e268c19f3744e932bbfb98ba4a Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Thu, 12 Feb 2026 11:53:20 +0100 Subject: [PATCH 23/60] New approach to packaging: do it in isolation --- apps/cli/package.json | 1 - apps/studio/forge.config.ts | 4 ++ apps/studio/package.json | 1 - package.json | 12 ++-- scripts/package-in-isolation.ts | 123 ++++++++++++++++++++++++++++++++ 5 files changed, 133 insertions(+), 8 deletions(-) create mode 100644 scripts/package-in-isolation.ts diff --git a/apps/cli/package.json b/apps/cli/package.json index 701050d62c..926979b11c 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -25,7 +25,6 @@ "build": "vite build --config ./vite.config.ts", "install:bundle": "npm install --omit=dev --no-package-lock --install-links --no-workspaces && patch-package", "package": "npm run install:bundle && npm run build", - "postpackage": "rimraf node_modules", "watch": "vite build --config ./vite.config.ts --watch" }, "devDependencies": { diff --git a/apps/studio/forge.config.ts b/apps/studio/forge.config.ts index 234eff94e5..cb2e81f14a 100644 --- a/apps/studio/forge.config.ts +++ b/apps/studio/forge.config.ts @@ -147,9 +147,13 @@ const config: ForgeConfig = { } console.log( 'Installing Studio app dependencies for bundling ...' ); + // NOTE: The `app:install:bundle` script mutates the `apps/studio/node_modules` directory. You + // may need to rerun `npm ci` from the repo root to reset the dependency tree after packaging. await execAsync( 'npm run app:install:bundle', { cwd: repoRoot } ); console.log( 'Building CLI (with bundled node_modules) ...' ); + // NOTE: The `cli:package` script mutates the `apps/cli/node_modules` directory. You may need to + // rerun `npm ci` from the repo root to reset the dependency tree after packaging. await execAsync( 'npm run cli:package', { cwd: repoRoot } ); console.log( `Downloading Node.js binary for ${ platform }-${ arch }...` ); diff --git a/apps/studio/package.json b/apps/studio/package.json index 99d8a59f5b..c66ae1cfae 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -19,7 +19,6 @@ "make:macos-arm64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && SKIP_DMG=true FILE_ARCHITECTURE=arm64 electron-forge make . --arch=arm64 --platform=darwin", "install:bundle": "npm install --no-package-lock --install-links --no-workspaces && patch-package && npx @electron/rebuild -o fs-ext", "package": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge package .", - "postpackage": "rimraf node_modules", "publish": "electron-forge publish .", "start-wayland": "npm -w studio-cli run build && electron-forge start . -- --enable-features=UseOzonePlatform --ozone-platform=wayland" }, diff --git a/package.json b/package.json index 117c176b9c..a4b2e32197 100644 --- a/package.json +++ b/package.json @@ -27,12 +27,12 @@ "start": "electron-vite dev --config apps/studio/electron.vite.config.ts --outDir=dist --watch", "start-wayland": "npm -w studio-app run start-wayland", "postinstall": "patch-package --patch-dir apps/cli/patches && patch-package --patch-dir apps/studio/patches && ts-node ./scripts/download-wp-server-files.ts && node ./scripts/download-available-site-translations.mjs && npx @electron/rebuild -o fs-ext", - "package": "npm -w studio-app run package", - "make": "npm -w studio-app run make", - "make:windows-x64": "npm -w studio-app run make:windows-x64", - "make:windows-arm64": "npm -w studio-app run make:windows-arm64", - "make:macos-x64": "npm -w studio-app run make:macos-x64", - "make:macos-arm64": "npm -w studio-app run make:macos-arm64", + "package": "ts-node ./scripts/package-in-isolation.ts package", + "make": "ts-node ./scripts/package-in-isolation.ts make", + "make:windows-x64": "ts-node ./scripts/package-in-isolation.ts make:windows-x64", + "make:windows-arm64": "ts-node ./scripts/package-in-isolation.ts make:windows-arm64", + "make:macos-x64": "ts-node ./scripts/package-in-isolation.ts make:macos-x64", + "make:macos-arm64": "ts-node ./scripts/package-in-isolation.ts make:macos-arm64", "make:dmg-x64": "FILE_ARCHITECTURE=x64 node ./scripts/make-dmg.mjs", "make:dmg-arm64": "FILE_ARCHITECTURE=arm64 node ./scripts/make-dmg.mjs", "publish": "npm -w studio-app run publish", diff --git a/scripts/package-in-isolation.ts b/scripts/package-in-isolation.ts new file mode 100644 index 0000000000..e489315417 --- /dev/null +++ b/scripts/package-in-isolation.ts @@ -0,0 +1,123 @@ +/** + * This script packages the Studio app in isolation by copying the repo to a temporary directory, + * installing dependencies, and running the relevant make/package script. + * + * Why is this needed? With npm workspaces, most dependencies are hoisted to the top-level + * `node_modules` directory, but there's no guarantee that all of them are. This behavior conflicts + * with our requirement of having self-contained `node_modules` directories for each package that + * are copied to the package output. + * + * In other words, when we run `npm run install:bundle` in `apps/studio`, that mutates the + * `apps/studio/node_modules` directory so the npm workspace-powered dependency tree gets messed + * up. We need to run `npm run install:bundle` as part of the packaging process, so that's why we + * do it in isolation. + */ + +import fs from 'fs'; +import os from 'os'; +import path from 'path'; +import { spawnSync, type SpawnSyncOptions } from 'child_process'; +import { z } from 'zod'; + +const REPO_ROOT = path.resolve( __dirname, '..' ); +const STUDIO_APP_PACKAGE_JSON = path.join( REPO_ROOT, 'apps', 'studio', 'package.json' ); + +const STUDIO_APP_PACKAGE_JSON_SCHEMA = z.object( { + scripts: z.record( z.string(), z.string() ), +} ); + +function getStudioAppScripts(): Record< string, string > { + const studioAppPackage = JSON.parse( fs.readFileSync( STUDIO_APP_PACKAGE_JSON, 'utf-8' ) ); + const parsedPackage = STUDIO_APP_PACKAGE_JSON_SCHEMA.parse( studioAppPackage ); + return Object.fromEntries( + Object.entries( parsedPackage.scripts ).filter( + ( [ scriptName ] ) => scriptName === 'package' || scriptName.startsWith( 'make' ) + ) + ); +} + +function runOrFail( command: string, args: string[], cwd: string, env = process.env ) { + const options: SpawnSyncOptions = { + cwd, + env, + stdio: 'inherit', + shell: process.platform === 'win32', + }; + + const result = spawnSync( command, args, options ); + if ( result.status !== 0 ) { + process.exit( result.status ?? 1 ); + } +} + +function shouldCopyToStaging( sourcePath: string ): boolean { + const relativePath = path.relative( REPO_ROOT, sourcePath ); + if ( relativePath === '' ) return true; + + const pathSegments = relativePath.split( path.sep ); + if ( pathSegments.includes( '.git' ) ) return false; + if ( pathSegments.includes( 'node_modules' ) ) return false; + + const topLevelDir = pathSegments[ 0 ]; + return topLevelDir !== 'out' && topLevelDir !== 'dist' && topLevelDir !== 'test-results'; +} + +function copyArtifactsBack( stagingRoot: string ) { + const artifactPaths = [ + [ path.join( stagingRoot, 'out' ), path.join( REPO_ROOT, 'out' ) ], + [ + path.join( stagingRoot, 'apps', 'studio', 'out' ), + path.join( REPO_ROOT, 'apps', 'studio', 'out' ), + ], + [ + path.join( stagingRoot, 'apps', 'studio', 'dist' ), + path.join( REPO_ROOT, 'apps', 'studio', 'dist' ), + ], + ] as const; + + for ( const [ from, to ] of artifactPaths ) { + if ( ! fs.existsSync( from ) ) continue; + fs.rmSync( to, { recursive: true, force: true } ); + fs.mkdirSync( path.dirname( to ), { recursive: true } ); + fs.cpSync( from, to, { recursive: true, force: true } ); + } +} + +function main() { + const studioAppScripts = getStudioAppScripts(); + const scriptName = process.argv[ 2 ]; + + if ( ! studioAppScripts.hasOwnProperty( scriptName ) ) { + throw new Error( + `Unsupported script "${ scriptName }". Supported studio-app packaging scripts: ${ Object.keys( + studioAppScripts + ).join( ', ' ) }` + ); + } + + const stagingParent = fs.mkdtempSync( path.join( os.tmpdir(), 'studio-package-' ) ); + const stagingRoot = path.join( stagingParent, 'repo' ); + + try { + console.log( `Creating staging workspace at ${ stagingRoot }` ); + fs.mkdirSync( stagingRoot, { recursive: true } ); + fs.cpSync( REPO_ROOT, stagingRoot, { + recursive: true, + filter: shouldCopyToStaging, + } ); + + console.log( 'Installing workspace dependencies in staging ...' ); + runOrFail( 'npm', [ 'ci' ], stagingRoot ); + + console.log( `Running script "${ scriptName }" in staging ...` ); + runOrFail( 'npm', [ '-w', 'studio-app', 'run', scriptName ], stagingRoot ); + + console.log( 'Syncing packaging artifacts back to workspace ...' ); + copyArtifactsBack( stagingRoot ); + } finally { + console.log( `Removing staging workspace ${ stagingParent }` ); + fs.rmSync( stagingParent, { recursive: true, force: true } ); + } +} + +main(); From b47482665eb68c06fee5bfd779dd055726864904 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Thu, 12 Feb 2026 12:05:24 +0100 Subject: [PATCH 24/60] Short-circuit script in CI --- scripts/package-in-isolation.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/scripts/package-in-isolation.ts b/scripts/package-in-isolation.ts index e489315417..672373b271 100644 --- a/scripts/package-in-isolation.ts +++ b/scripts/package-in-isolation.ts @@ -1,6 +1,7 @@ /** * This script packages the Studio app in isolation by copying the repo to a temporary directory, - * installing dependencies, and running the relevant make/package script. + * installing dependencies, running the relevant make/package script, copying the output back to + * the repo and then cleaning up. * * Why is this needed? With npm workspaces, most dependencies are hoisted to the top-level * `node_modules` directory, but there's no guarantee that all of them are. This behavior conflicts @@ -9,8 +10,11 @@ * * In other words, when we run `npm run install:bundle` in `apps/studio`, that mutates the * `apps/studio/node_modules` directory so the npm workspace-powered dependency tree gets messed - * up. We need to run `npm run install:bundle` as part of the packaging process, so that's why we - * do it in isolation. + * up. We can't avoid running `npm run install:bundle`, because we need that self-contained + * `node_modules` directory for packaging, so that's why we do it in isolation. + * + * In CI, where we have a clean, ephemeral environment, we short-circuit the behavior and run the + * relevant script in place. */ import fs from 'fs'; @@ -95,6 +99,13 @@ function main() { ); } + const isCi = process.env.CI && process.env.CI !== 'false'; + if ( isCi ) { + console.log( `Detected CI environment; running script "${ scriptName }" in place.` ); + runOrFail( 'npm', [ '-w', 'studio-app', 'run', scriptName ], REPO_ROOT ); + return; + } + const stagingParent = fs.mkdtempSync( path.join( os.tmpdir(), 'studio-package-' ) ); const stagingRoot = path.join( stagingParent, 'repo' ); From 099e741c6461ec641ebb26c10d8e1170f7f631ea Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Thu, 12 Feb 2026 12:12:08 +0100 Subject: [PATCH 25/60] Adjust paths in maker scripts --- scripts/make-dmg.mjs | 19 +++++++++++-------- scripts/make-pot.mjs | 7 ++++--- scripts/package-appx.mjs | 2 +- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/scripts/make-dmg.mjs b/scripts/make-dmg.mjs index 018ad2b0ff..572b515383 100644 --- a/scripts/make-dmg.mjs +++ b/scripts/make-dmg.mjs @@ -5,19 +5,21 @@ import { fileURLToPath } from 'url'; import packageJson from '../package.json' with { type: 'json' }; const __dirname = path.dirname( fileURLToPath( import.meta.url ) ); +const fileArchitecture = process.env.FILE_ARCHITECTURE; + +if ( ! fileArchitecture ) { + throw new Error( 'FILE_ARCHITECTURE environment variable is required (for example: x64 or arm64).' ); +} + +const outDir = path.resolve( __dirname, '../apps/studio/out' ); const appPath = path.resolve( - __dirname, - '../out', - `${ packageJson.productName }-darwin-${ process.env.FILE_ARCHITECTURE }`, + outDir, + `${ packageJson.productName }-darwin-${ fileArchitecture }`, `${ packageJson.productName }.app` ); -const dmgPath = path.resolve( - __dirname, - '../out', - `${ packageJson.productName }-darwin-${ process.env.FILE_ARCHITECTURE }.dmg` -); +const dmgPath = path.resolve( outDir, `${ packageJson.productName }-darwin-${ fileArchitecture }.dmg` ); const volumeIconPath = path.resolve( __dirname, '../apps/studio/assets/studio-app-icon.icns' ); const backgroundPath = path.resolve( __dirname, '../apps/studio/assets/dmg-background.png' ); @@ -37,6 +39,7 @@ const dmgSpecs = { if ( fs.existsSync( dmgPath ) ) { fs.unlinkSync( dmgPath ); } +fs.mkdirSync( path.dirname( dmgPath ), { recursive: true } ); const specsFile = path.resolve( __dirname, '..', 'appdmg-specs.json' ); fs.writeFileSync( specsFile, JSON.stringify( dmgSpecs ) ); diff --git a/scripts/make-pot.mjs b/scripts/make-pot.mjs index e3f13dee43..079c784765 100755 --- a/scripts/make-pot.mjs +++ b/scripts/make-pot.mjs @@ -6,7 +6,8 @@ const __filename = fileURLToPath( import.meta.url ); const __dirname = dirname( __filename ); const projectRoot = dirname( __dirname ); -const POT_FILE = join( projectRoot, 'out', 'pots', 'bundle-strings.pot' ); +const POT_DIR = join( projectRoot, 'apps', 'studio', 'out', 'pots' ); +const POT_FILE = join( POT_DIR, 'bundle-strings.pot' ); const IMPORT_PAGE = 'https://translate.wordpress.com/projects/studio/import-originals/'; function executeCommand( command, description ) { @@ -25,12 +26,12 @@ console.log( '✨ Starting pot files generation...\n' ); const commands = [ { - command: 'rm -rf ./out/pots', + command: 'rm -rf ./apps/studio/out/pots', description: 'Removing existing pot files', }, { command: - 'npx wp-babel-makepot "{apps/studio/src,apps/cli,tools/common}/**/*.{js,jsx,ts,tsx}" --ignore "apps/cli/node_modules/**/*,**/*.d.ts" --base "." --dir "./out/pots" --output "./out/pots/bundle-strings.pot"', + 'npx wp-babel-makepot "{apps/studio/src,apps/cli,tools/common}/**/*.{js,jsx,ts,tsx}" --ignore "apps/cli/node_modules/**/*,**/*.d.ts" --base "." --dir "./apps/studio/out/pots" --output "./apps/studio/out/pots/bundle-strings.pot"', description: 'Generating pot file with wp-babel-makepot', }, { diff --git a/scripts/package-appx.mjs b/scripts/package-appx.mjs index 157a44d4a7..dfc1eaa3f1 100644 --- a/scripts/package-appx.mjs +++ b/scripts/package-appx.mjs @@ -48,7 +48,7 @@ const packageJsonPath = path.resolve( __dirname, '..', 'package.json' ); const packageJsonText = await fs.readFile( packageJsonPath, 'utf-8' ); const packageJson = JSON.parse( packageJsonText ); -const outPath = path.join( __dirname, '..', 'out' ); +const outPath = path.join( __dirname, '..', 'apps', 'studio', 'out' ); const assetsPath = path.join( __dirname, '..', 'apps', 'studio', 'assets', 'appx' ); console.log( `~~~ Packaging AppX for architecture: ${ architecture }` ); From ed11b23ca76e9f03de3c6c8bc70c7be401c07e86 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Thu, 12 Feb 2026 13:34:16 +0100 Subject: [PATCH 26/60] Move start script to studio-app workspace --- apps/studio/package.json | 1 + apps/studio/src/storage/paths.ts | 2 +- package.json | 5 +---- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/studio/package.json b/apps/studio/package.json index c66ae1cfae..db9a99ff0b 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -11,6 +11,7 @@ "forge": "./forge.config.ts" }, "scripts": { + "start": "electron-vite dev --config ./electron.vite.config.ts --outDir=dist --watch", "prestart": "npm -w studio-cli run build", "make": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge make .", "make:windows-x64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge make . --arch=x64 --platform=win32", diff --git a/apps/studio/src/storage/paths.ts b/apps/studio/src/storage/paths.ts index dfc3a7839a..65d180fbf6 100644 --- a/apps/studio/src/storage/paths.ts +++ b/apps/studio/src/storage/paths.ts @@ -62,7 +62,7 @@ export function getResourcesPath(): string { export function getCliPath(): string { return process.env.NODE_ENV === 'development' - ? path.join( getResourcesPath(), 'dist', 'cli', 'main.js' ) + ? path.join( getResourcesPath(), '..', 'cli', 'dist', 'cli', 'main.js' ) : path.join( getResourcesPath(), 'cli', 'main.js' ); } diff --git a/package.json b/package.json index a4b2e32197..3c6f5b5031 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,6 @@ "version": "1.7.3", "description": "Local WordPress development environment using Playgrounds", "license": "GPL-2.0-or-later", - "main": "dist/main/index.js", "packageManager": "npm@10.9.4", "engines": { "npm": ">=10.0.0 <11.0.0", @@ -22,9 +21,7 @@ "tools/*" ], "scripts": { - "pretest": "rimraf apps/studio/node_modules apps/cli/node_modules", - "prestart": "npm run cli:build", - "start": "electron-vite dev --config apps/studio/electron.vite.config.ts --outDir=dist --watch", + "start": "npm -w studio-app run start", "start-wayland": "npm -w studio-app run start-wayland", "postinstall": "patch-package --patch-dir apps/cli/patches && patch-package --patch-dir apps/studio/patches && ts-node ./scripts/download-wp-server-files.ts && node ./scripts/download-available-site-translations.mjs && npx @electron/rebuild -o fs-ext", "package": "ts-node ./scripts/package-in-isolation.ts package", From 6d441081e207e1a025d25b64e203d3c3184ce8f0 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Thu, 12 Feb 2026 13:36:06 +0100 Subject: [PATCH 27/60] Fix artifact paths --- .buildkite/pipeline.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index cb7188b063..b3fa882347 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -131,8 +131,8 @@ steps: bundle exec fastlane notarize_binary plugins: [$CI_TOOLKIT_PLUGIN, $NVM_PLUGIN] artifact_paths: - - out/**/*.app.zip - - out/*.dmg + - apps/studio/out/**/*.app.zip + - apps/studio/out/*.dmg matrix: - x64 - arm64 @@ -230,8 +230,8 @@ steps: bundle exec fastlane notarize_binary plugins: [$CI_TOOLKIT_PLUGIN, $NVM_PLUGIN] artifact_paths: - - out/**/*.app.zip - - out/*.dmg + - apps/studio/out/**/*.app.zip + - apps/studio/out/*.dmg matrix: - x64 - arm64 From 772859f4a4fe9c6a2a8af33a8860e8bfc014c2b6 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Thu, 12 Feb 2026 15:28:46 +0100 Subject: [PATCH 28/60] Update .gitignore --- .gitignore | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 0137c3b473..410796ef76 100644 --- a/.gitignore +++ b/.gitignore @@ -112,9 +112,9 @@ dist test-results # E2E test import files (not versioned) -e2e/imports/*.tar.gz -e2e/imports/*.zip -e2e/imports/*.wpress +apps/studio/e2e/imports/*.tar.gz +apps/studio/e2e/imports/*.zip +apps/studio/e2e/imports/*.wpress # Metrics traces artifacts From 155f93bdbbe226b9f68be374d4f9f034c01270b4 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Thu, 12 Feb 2026 15:29:50 +0100 Subject: [PATCH 29/60] Canonical version definition in apps/studio --- apps/cli/vite.config.ts | 29 +++++++++++++---------------- package-lock.json | 1 - package.json | 1 - 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/apps/cli/vite.config.ts b/apps/cli/vite.config.ts index 494f68c6dd..bbf3b1c7de 100644 --- a/apps/cli/vite.config.ts +++ b/apps/cli/vite.config.ts @@ -1,28 +1,25 @@ import { existsSync, readFileSync } from 'fs'; -import { resolve } from 'path'; -import { defineConfig } from 'vite'; +import { dirname, join, resolve } from 'path'; +import { defineConfig, normalizePath } from 'vite'; import { viteStaticCopy } from 'vite-plugin-static-copy'; -const yargsLocalesPath = resolve( __dirname, '../../node_modules/yargs/locales' ); +const yargsPath = dirname( require.resolve( 'yargs' ) ); +const yargsLocalesPath = join( yargsPath, 'locales' ); const cliNodeModulesPath = resolve( __dirname, 'node_modules' ); const packageVersion = JSON.parse( - readFileSync( resolve( __dirname, 'package.json' ), 'utf-8' ) + readFileSync( resolve( __dirname, '..', 'studio', 'package.json' ), 'utf-8' ) ).version; export default defineConfig( { plugins: [ - ...( existsSync( yargsLocalesPath ) - ? [ - viteStaticCopy( { - targets: [ - { - src: `../../node_modules/yargs/locales/*`, - dest: '../locales', - }, - ], - } ), - ] - : [] ), + viteStaticCopy( { + targets: [ + { + src: normalizePath( join( yargsLocalesPath, '*' ) ), + dest: '../locales', + }, + ], + } ), ...( existsSync( cliNodeModulesPath ) ? [ viteStaticCopy( { diff --git a/package-lock.json b/package-lock.json index 1fad74cc39..a1a34fc2b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,6 @@ "packages": { "": { "name": "studio", - "version": "1.7.3", "hasInstallScript": true, "license": "GPL-2.0-or-later", "workspaces": [ diff --git a/package.json b/package.json index fe3a1af3e0..5c06cd4494 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,6 @@ "author": "Automattic Inc.", "private": true, "productName": "Studio", - "version": "1.7.3", "description": "Local WordPress development environment using Playgrounds", "license": "GPL-2.0-or-later", "packageManager": "npm@10.9.4", From 69fa703f57118fbd27f9fc7eca090513eb55828c Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Thu, 12 Feb 2026 15:36:31 +0100 Subject: [PATCH 30/60] Move wpcom wrappers to common --- apps/cli/lib/api.ts | 4 ++-- apps/cli/lib/tests/api.test.ts | 4 ++-- apps/cli/vite.config.ts | 2 -- apps/studio/electron.vite.config.ts | 2 -- apps/studio/package.json | 2 -- apps/studio/src/components/auth-provider.tsx | 4 ++-- apps/studio/src/lib/deeplink/handlers/auth.ts | 4 ++-- apps/studio/src/lib/deeplink/tests/auth.test.ts | 4 ++-- apps/studio/src/lib/tests/oauth.test.ts | 2 +- apps/studio/src/modules/sync/lib/ipc-handlers.ts | 4 ++-- apps/studio/src/stores/wpcom-api.ts | 4 ++-- apps/studio/src/tests/site-server.test.ts | 10 ---------- package-lock.json | 4 ++-- {apps/studio/src => tools/common}/lib/wpcom-factory.ts | 0 .../common}/lib/wpcom-xhr-request-factory.ts | 0 tools/common/package.json | 2 ++ 16 files changed, 19 insertions(+), 33 deletions(-) rename {apps/studio/src => tools/common}/lib/wpcom-factory.ts (100%) rename {apps/studio/src => tools/common}/lib/wpcom-xhr-request-factory.ts (100%) diff --git a/apps/cli/lib/api.ts b/apps/cli/lib/api.ts index 403db832cf..8ff4357d94 100644 --- a/apps/cli/lib/api.ts +++ b/apps/cli/lib/api.ts @@ -1,7 +1,7 @@ import fs from 'fs'; +import wpcomFactory from '@studio/common/lib/wpcom-factory'; +import wpcomXhrRequest from '@studio/common/lib/wpcom-xhr-request-factory'; import { __ } from '@wordpress/i18n'; -import wpcomFactory from 'src/lib/wpcom-factory'; -import wpcomXhrRequest from 'src/lib/wpcom-xhr-request-factory'; import { z } from 'zod'; import { LoggerError } from 'cli/logger'; diff --git a/apps/cli/lib/tests/api.test.ts b/apps/cli/lib/tests/api.test.ts index ad3cc26c55..3f3c1b2565 100644 --- a/apps/cli/lib/tests/api.test.ts +++ b/apps/cli/lib/tests/api.test.ts @@ -1,13 +1,13 @@ import fs from 'fs'; +import wpcomFactory from '@studio/common/lib/wpcom-factory'; import { createMock } from 'src/lib/test-utils'; -import wpcomFactory from 'src/lib/wpcom-factory'; import { vi } from 'vitest'; import { uploadArchive, waitForSiteReady, SnapshotStatus } from 'cli/lib/api'; import { LoggerError } from 'cli/logger'; vi.mock( 'fs' ); vi.mock( 'wpcom' ); vi.mock( 'wpcom-xhr-request' ); -vi.mock( 'src/lib/wpcom-factory', () => ( { +vi.mock( '@studio/common/lib/wpcom-factory', () => ( { __esModule: true, default: vi.fn(), } ) ); diff --git a/apps/cli/vite.config.ts b/apps/cli/vite.config.ts index bbf3b1c7de..330afec297 100644 --- a/apps/cli/vite.config.ts +++ b/apps/cli/vite.config.ts @@ -78,8 +78,6 @@ export default defineConfig( { resolve: { alias: { cli: resolve( __dirname, '.' ), - src: resolve( __dirname, '../studio/src' ), - vendor: resolve( __dirname, '../../vendor' ), '@studio/common': resolve( __dirname, '../../tools/common' ), '@wp-playground/blueprints/blueprint-schema-validator': resolve( __dirname, diff --git a/apps/studio/electron.vite.config.ts b/apps/studio/electron.vite.config.ts index 92617bb2d8..8d6bfc45d2 100644 --- a/apps/studio/electron.vite.config.ts +++ b/apps/studio/electron.vite.config.ts @@ -23,8 +23,6 @@ export default defineConfig({ alias: { src: resolve( __dirname, 'src' ), '@studio/common': resolve( __dirname, '../../tools/common' ), - cli: resolve( __dirname, '../cli' ), - vendor: resolve( __dirname, '../../vendor' ), '@wp-playground/blueprints/blueprint-schema-validator': resolve( __dirname, '../../node_modules/@wp-playground/blueprints/blueprint-schema-validator.js' diff --git a/apps/studio/package.json b/apps/studio/package.json index db9a99ff0b..946d7ac197 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -74,8 +74,6 @@ "tar": "^7.5.2", "tus-js-client": "^4.3.1", "winreg": "1.2.4", - "wpcom": "^7.1.1", - "wpcom-xhr-request": "^1.3.0", "yargs": "^18.0.0", "yargs-parser": "^22.0.0", "yauzl": "^3.2.0", diff --git a/apps/studio/src/components/auth-provider.tsx b/apps/studio/src/components/auth-provider.tsx index 1d78a620ee..1c92f0c48c 100644 --- a/apps/studio/src/components/auth-provider.tsx +++ b/apps/studio/src/components/auth-provider.tsx @@ -1,4 +1,6 @@ import * as Sentry from '@sentry/electron/renderer'; +import wpcomFactory from '@studio/common/lib/wpcom-factory'; +import wpcomXhrRequest from '@studio/common/lib/wpcom-xhr-request-factory'; import { useI18n } from '@wordpress/react-i18n'; import { createContext, useState, useEffect, useMemo, useCallback, ReactNode } from 'react'; import { WPCOM } from 'wpcom/types'; @@ -6,8 +8,6 @@ import { useIpcListener } from 'src/hooks/use-ipc-listener'; import { useOffline } from 'src/hooks/use-offline'; import { getIpcApi } from 'src/lib/get-ipc-api'; import { isInvalidTokenError } from 'src/lib/is-invalid-oauth-token-error'; -import wpcomFactory from 'src/lib/wpcom-factory'; -import wpcomXhrRequest from 'src/lib/wpcom-xhr-request-factory'; import { useI18nLocale } from 'src/stores'; import { setWpcomClient } from 'src/stores/wpcom-api'; diff --git a/apps/studio/src/lib/deeplink/handlers/auth.ts b/apps/studio/src/lib/deeplink/handlers/auth.ts index c655adbc02..82456aab60 100644 --- a/apps/studio/src/lib/deeplink/handlers/auth.ts +++ b/apps/studio/src/lib/deeplink/handlers/auth.ts @@ -1,8 +1,8 @@ import * as Sentry from '@sentry/electron/main'; +import wpcomFactory from '@studio/common/lib/wpcom-factory'; +import wpcomXhrRequest from '@studio/common/lib/wpcom-xhr-request-factory'; import { z } from 'zod'; import { sendIpcEventToRenderer } from 'src/ipc-utils'; -import wpcomFactory from 'src/lib/wpcom-factory'; -import wpcomXhrRequest from 'src/lib/wpcom-xhr-request-factory'; import { updateAppdata } from 'src/storage/user-data'; const authTokenSchema = z.object( { diff --git a/apps/studio/src/lib/deeplink/tests/auth.test.ts b/apps/studio/src/lib/deeplink/tests/auth.test.ts index 3e961cd8fd..00cb23fbbf 100644 --- a/apps/studio/src/lib/deeplink/tests/auth.test.ts +++ b/apps/studio/src/lib/deeplink/tests/auth.test.ts @@ -10,12 +10,12 @@ const mockWpcomGet = vi.fn(); vi.mock( 'src/lib/certificate-manager', () => ( {} ) ); vi.mock( 'src/ipc-utils' ); -vi.mock( 'src/lib/wpcom-factory', () => ( { +vi.mock( '@studio/common/lib/wpcom-factory', () => ( { default: () => ( { req: { get: mockWpcomGet }, } ), } ) ); -vi.mock( 'src/lib/wpcom-xhr-request-factory', () => ( { +vi.mock( '@studio/common/lib/wpcom-xhr-request-factory', () => ( { default: vi.fn(), } ) ); diff --git a/apps/studio/src/lib/tests/oauth.test.ts b/apps/studio/src/lib/tests/oauth.test.ts index ceb4db103a..ddc1cd22df 100644 --- a/apps/studio/src/lib/tests/oauth.test.ts +++ b/apps/studio/src/lib/tests/oauth.test.ts @@ -7,7 +7,7 @@ vi.mock( 'src/lib/certificate-manager', () => ( {} ) ); vi.mock( 'atomically', () => ( { readFile: vi.fn(), } ) ); -vi.mock( 'src/lib/wpcom-factory', () => ( { +vi.mock( '@studio/common/lib/wpcom-factory', () => ( { __esModule: true, default: vi.fn(), } ) ); diff --git a/apps/studio/src/modules/sync/lib/ipc-handlers.ts b/apps/studio/src/modules/sync/lib/ipc-handlers.ts index 6d5242cb35..fbffc2b499 100644 --- a/apps/studio/src/modules/sync/lib/ipc-handlers.ts +++ b/apps/studio/src/modules/sync/lib/ipc-handlers.ts @@ -4,6 +4,8 @@ import fsPromises from 'fs/promises'; import path from 'node:path'; import * as Sentry from '@sentry/electron/main'; import { isErrnoException } from '@studio/common/lib/is-errno-exception'; +import wpcomFactory from '@studio/common/lib/wpcom-factory'; +import wpcomXhrRequest from '@studio/common/lib/wpcom-xhr-request-factory'; import { Upload } from 'tus-js-client'; import { z } from 'zod'; import { @@ -18,8 +20,6 @@ import { exportBackup } from 'src/lib/import-export/export/export-manager'; import { ExportOptions } from 'src/lib/import-export/export/types'; import { getAuthenticationToken } from 'src/lib/oauth'; import { keepSqliteIntegrationUpdated } from 'src/lib/sqlite-versions'; -import wpcomFactory from 'src/lib/wpcom-factory'; -import wpcomXhrRequest from 'src/lib/wpcom-xhr-request-factory'; import { SyncSite } from 'src/modules/sync/types'; import { SiteServer } from 'src/site-server'; import { loadUserData, lockAppdata, saveUserData, unlockAppdata } from 'src/storage/user-data'; diff --git a/apps/studio/src/stores/wpcom-api.ts b/apps/studio/src/stores/wpcom-api.ts index 7817f0c52f..5ae6f43f55 100644 --- a/apps/studio/src/stores/wpcom-api.ts +++ b/apps/studio/src/stores/wpcom-api.ts @@ -1,10 +1,10 @@ import { createApi, TypedUseQuery, TypedUseMutation } from '@reduxjs/toolkit/query/react'; import * as Sentry from '@sentry/electron/renderer'; import { DAY_MS } from '@studio/common/constants'; +import wpcomFactory from '@studio/common/lib/wpcom-factory'; +import wpcomXhrRequest from '@studio/common/lib/wpcom-xhr-request-factory'; import { WPCOM } from 'wpcom/types'; import { z } from 'zod'; -import wpcomFactory from 'src/lib/wpcom-factory'; -import wpcomXhrRequest from 'src/lib/wpcom-xhr-request-factory'; import { withOfflineCheck, withOfflineCheckMutation } from 'src/stores/utils/with-offline-check'; import type { BaseQueryFn, FetchBaseQueryError } from '@reduxjs/toolkit/query'; diff --git a/apps/studio/src/tests/site-server.test.ts b/apps/studio/src/tests/site-server.test.ts index 49695b3f1e..fc878199b7 100644 --- a/apps/studio/src/tests/site-server.test.ts +++ b/apps/studio/src/tests/site-server.test.ts @@ -57,12 +57,6 @@ vi.mock( 'src/lib/wordpress-provider', () => { }; } ); -// Mock the wp-now config that the provider uses internally - -vi.mock( 'vendor/wp-now/src', () => ( { - getWpNowConfig: vi.fn( () => ( { mode: 'wordpress', port: 1234 } ) ), -} ) ); - // Mock CliServerProcess with a start method that calls startServer vi.mock( 'src/modules/cli/lib/cli-server-process', () => ( { CliServerProcess: vi.fn().mockImplementation( () => ( { @@ -82,10 +76,6 @@ vi.mock( 'src/storage/user-data' ); describe( 'SiteServer', () => { describe( 'start', () => { it( 'should throw if the server starts with a non-WordPress mode', async () => { - // eslint-disable-next-line import/no-unresolved - const { getWpNowConfig } = await import( 'vendor/wp-now/src' ); - vi.mocked( getWpNowConfig ).mockReturnValue( { mode: 'theme', port: 1234 } ); - // eslint-disable-next-line import/no-unresolved const { startServer } = await import( 'src/lib/wordpress-provider' ); vi.mocked( startServer ).mockRejectedValue( diff --git a/package-lock.json b/package-lock.json index a1a34fc2b2..06feef0335 100644 --- a/package-lock.json +++ b/package-lock.json @@ -132,8 +132,6 @@ "tar": "^7.5.2", "tus-js-client": "^4.3.1", "winreg": "1.2.4", - "wpcom": "^7.1.1", - "wpcom-xhr-request": "^1.3.0", "yargs": "^18.0.0", "yargs-parser": "^22.0.0", "yauzl": "^3.2.0", @@ -28218,6 +28216,8 @@ "fast-deep-equal": "^3.1.3", "fs-extra": "^11.3.2", "lockfile": "^1.0.4", + "wpcom": "^7.1.1", + "wpcom-xhr-request": "^1.3.0", "yauzl": "^3.2.0", "zod": "^4.0.0" }, diff --git a/apps/studio/src/lib/wpcom-factory.ts b/tools/common/lib/wpcom-factory.ts similarity index 100% rename from apps/studio/src/lib/wpcom-factory.ts rename to tools/common/lib/wpcom-factory.ts diff --git a/apps/studio/src/lib/wpcom-xhr-request-factory.ts b/tools/common/lib/wpcom-xhr-request-factory.ts similarity index 100% rename from apps/studio/src/lib/wpcom-xhr-request-factory.ts rename to tools/common/lib/wpcom-xhr-request-factory.ts diff --git a/tools/common/package.json b/tools/common/package.json index 34ce7bafc5..eb413f2aef 100644 --- a/tools/common/package.json +++ b/tools/common/package.json @@ -16,6 +16,8 @@ "fast-deep-equal": "^3.1.3", "fs-extra": "^11.3.2", "lockfile": "^1.0.4", + "wpcom": "^7.1.1", + "wpcom-xhr-request": "^1.3.0", "yauzl": "^3.2.0", "zod": "^4.0.0" }, From 5de318579a6c9d720366342d51b2d9de07d6f5bb Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Thu, 12 Feb 2026 15:36:48 +0100 Subject: [PATCH 31/60] No src/ imports in apps/cli --- apps/cli/lib/sqlite-integration.ts | 4 ++++ apps/cli/wordpress-server-child.ts | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/cli/lib/sqlite-integration.ts b/apps/cli/lib/sqlite-integration.ts index 3f80d9a548..2fc32ba61b 100644 --- a/apps/cli/lib/sqlite-integration.ts +++ b/apps/cli/lib/sqlite-integration.ts @@ -30,3 +30,7 @@ export async function installSqliteIntegration( sitePath: string ) { export async function keepSqliteIntegrationUpdated( sitePath: string ) { return provider.keepSqliteIntegrationUpdated( sitePath ); } + +export async function isSqliteIntegrationInstalled( sitePath: string ) { + return provider.isSqliteInstalled( sitePath ); +} diff --git a/apps/cli/wordpress-server-child.ts b/apps/cli/wordpress-server-child.ts index ab4e3cece8..554d518638 100644 --- a/apps/cli/wordpress-server-child.ts +++ b/apps/cli/wordpress-server-child.ts @@ -28,10 +28,10 @@ import { InMemoryFilesystem, } from '@wp-playground/storage'; import { WordPressInstallMode } from '@wp-playground/wordpress'; -import { isSqliteInstalled } from 'src/lib/sqlite-versions'; import { z } from 'zod'; import { sanitizeRunCLIArgs } from 'cli/lib/cli-args-sanitizer'; import { getSqliteCommandPath, getWpCliPharPath } from 'cli/lib/server-files'; +import { isSqliteIntegrationInstalled } from 'cli/lib/sqlite-integration'; import { ServerConfig, managerMessageSchema, @@ -112,7 +112,7 @@ async function setAdminPassword( server: RunCLIServer, adminPassword: string ): */ async function getWordPressInstallMode( sitePath: string ): Promise< WordPressInstallMode > { const hasWordPress = isWordPressDirectory( sitePath ); - const hasSqlite = await isSqliteInstalled( sitePath ); + const hasSqlite = await isSqliteIntegrationInstalled( sitePath ); if ( ! hasWordPress ) { return 'download-and-install'; From 8e081e316b5fe6f26889025f9092be375c6b27cb Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Thu, 12 Feb 2026 15:44:14 +0100 Subject: [PATCH 32/60] Make @wp-playground/blueprints a devDependency in tools/common --- eslint.config.mjs | 7 +++---- package-lock.json | 4 ++-- tools/common/package.json | 4 ++-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 14b2623d4b..65df187f4c 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -12,13 +12,12 @@ import path from 'node:path'; export default defineConfig( globalIgnores( [ '**/node_modules/', - 'cli/dist/', + '**/__mocks__', + 'apps/cli/dist/', 'dist/', 'out/', - 'wp-files/', 'vendor/', - 'apps/cli/__mocks__', - 'apps/studio/src/__mocks__', + 'wp-files/', ] ), js.configs.recommended, tsEslint.configs.recommended, diff --git a/package-lock.json b/package-lock.json index 06feef0335..8695576b6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28210,7 +28210,6 @@ "dependencies": { "@automattic/generate-password": "^0.1.0", "@wordpress/i18n": "^6.9.0", - "@wp-playground/blueprints": "^3.0.46", "cross-port-killer": "^1.4.0", "date-fns": "^3.3.1", "fast-deep-equal": "^3.1.3", @@ -28224,7 +28223,8 @@ "devDependencies": { "@types/fs-extra": "^11.0.4", "@types/lockfile": "^1.0.4", - "@types/yauzl": "^2.10.3" + "@types/yauzl": "^2.10.3", + "@wp-playground/blueprints": "^3.0.46" } }, "tools/compare-perf": { diff --git a/tools/common/package.json b/tools/common/package.json index eb413f2aef..c19de47c70 100644 --- a/tools/common/package.json +++ b/tools/common/package.json @@ -10,7 +10,6 @@ "dependencies": { "@automattic/generate-password": "^0.1.0", "@wordpress/i18n": "^6.9.0", - "@wp-playground/blueprints": "^3.0.46", "cross-port-killer": "^1.4.0", "date-fns": "^3.3.1", "fast-deep-equal": "^3.1.3", @@ -24,6 +23,7 @@ "devDependencies": { "@types/fs-extra": "^11.0.4", "@types/lockfile": "^1.0.4", - "@types/yauzl": "^2.10.3" + "@types/yauzl": "^2.10.3", + "@wp-playground/blueprints": "^3.0.46" } } From c5a33b27b947877f1dcd404a78b440ddc3e515b7 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Thu, 12 Feb 2026 15:50:56 +0100 Subject: [PATCH 33/60] Update Fastfile --- fastlane/Fastfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 706c207648..05796bf74e 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -12,7 +12,7 @@ UI.user_error!('Please run fastlane via `bundle exec`') unless FastlaneCore::Hel ######################################################################## PROJECT_ROOT_FOLDER = File.dirname(File.expand_path(__dir__)) SECRETS_FOLDER = File.join(Dir.home, '.configure', 'studio', 'secrets') -BUILDS_FOLDER = File.join(PROJECT_ROOT_FOLDER, 'out') +BUILDS_FOLDER = File.join(PROJECT_ROOT_FOLDER, 'apps', 'studio', 'out') # Enable dry run mode through environment variable DRY_RUN = ENV['DRY_RUN'] == 'true' From 45bac1ad09d3e4feabf90a8bcb6bac554c00eaa0 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Thu, 12 Feb 2026 15:54:21 +0100 Subject: [PATCH 34/60] Update format script to use `eslint --fix` --- package.json | 2 +- tools/common/lib/tests/utils/fs-extra-mock.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 5c06cd4494..de69302df5 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "app:install:bundle": "npm -w studio-app run install:bundle", "compare:perf": "npm -w compare-perf run compare", "lint": "eslint {apps/cli,apps/studio/src,apps/studio/e2e,tools/common}", - "format": "prettier . --write", + "format": "npm run lint -- --fix", "test": "vitest run", "test:watch": "vitest", "e2e": "npx playwright install && npx playwright test", diff --git a/tools/common/lib/tests/utils/fs-extra-mock.ts b/tools/common/lib/tests/utils/fs-extra-mock.ts index dbf972eb01..c6d488edd2 100644 --- a/tools/common/lib/tests/utils/fs-extra-mock.ts +++ b/tools/common/lib/tests/utils/fs-extra-mock.ts @@ -2,7 +2,6 @@ import { vi } from 'vitest'; // Extend globalThis to include our mock file system declare global { - // eslint-disable-next-line no-var var __fsExtraMockFiles: Record< string, string | string[] > | undefined; } From a9adcdbb04204c8b08765a56c5bcac24e7e0f30d Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Fri, 13 Feb 2026 09:54:58 +0100 Subject: [PATCH 35/60] Packaging tweaks --- apps/cli/package.json | 10 +++++----- apps/studio/forge.config.ts | 33 ++++++++++++++++++++++++--------- apps/studio/package.json | 2 +- package-lock.json | 16 ++++++++-------- scripts/package-in-isolation.ts | 11 +++++------ tools/common/package.json | 2 +- 6 files changed, 44 insertions(+), 30 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index 926979b11c..1133f44118 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -7,12 +7,12 @@ "license": "GPL-2.0-or-later", "main": "index.js", "dependencies": { - "@php-wasm/universal": "^3.0.46", + "@php-wasm/universal": "3.0.46", "@studio/common": "file:../../tools/common", - "@wp-playground/blueprints": "^3.0.46", - "@wp-playground/cli": "^3.0.46", - "@wp-playground/common": "^3.0.46", - "@wp-playground/storage": "^3.0.46", + "@wp-playground/blueprints": "3.0.46", + "@wp-playground/cli": "3.0.46", + "@wp-playground/common": "3.0.46", + "@wp-playground/storage": "3.0.46", "cli-table3": "^0.6.5", "http-proxy": "^1.18.1", "pm2": "^6.0.14", diff --git a/apps/studio/forge.config.ts b/apps/studio/forge.config.ts index 752622324d..7126783ae1 100644 --- a/apps/studio/forge.config.ts +++ b/apps/studio/forge.config.ts @@ -6,13 +6,31 @@ import { MakerSquirrel } from '@electron-forge/maker-squirrel'; import { MakerZIP } from '@electron-forge/maker-zip'; import { AutoUnpackNativesPlugin } from '@electron-forge/plugin-auto-unpack-natives'; import { isErrnoException } from '@studio/common/lib/is-errno-exception'; -import { exec } from 'child_process'; -import { promisify } from 'util'; +import { spawn } from 'child_process'; import { exec as pkgExec } from '@yao-pkg/pkg'; import type { ForgeConfig } from '@electron-forge/shared-types'; const repoRoot = path.resolve( __dirname, '../..' ); +function runCommand( command: string ) { + return new Promise< void >( ( resolve, reject ) => { + const child = spawn( command, { + cwd: repoRoot, + shell: process.platform === 'win32', + stdio: 'inherit', + } ); + + child.on( 'error', reject ); + child.on( 'exit', ( code ) => { + if ( code === 0 ) { + resolve(); + } else { + reject( new Error( `Command failed with exit code ${ code }: ${ command }` ) ); + } + } ); + } ); +} + const config: ForgeConfig = { packagerConfig: { asar: true, @@ -137,8 +155,6 @@ const config: ForgeConfig = { plugins: [ new AutoUnpackNativesPlugin( {} ) ], hooks: { prePackage: async ( _forgeConfig, platform, arch ) => { - const execAsync = promisify( exec ); - console.log( "Ensuring latest WordPress zip isn't included in production build ..." ); const zipPath = path.join( repoRoot, 'wp-files', 'latest.zip' ); try { @@ -150,21 +166,20 @@ const config: ForgeConfig = { console.log( 'Installing Studio app dependencies for bundling ...' ); // NOTE: The `app:install:bundle` script mutates the `apps/studio/node_modules` directory. You // may need to rerun `npm ci` from the repo root to reset the dependency tree after packaging. - await execAsync( 'npm run app:install:bundle', { cwd: repoRoot } ); + await runCommand( 'npm run app:install:bundle' ); console.log( 'Building CLI (with bundled node_modules) ...' ); // NOTE: The `cli:package` script mutates the `apps/cli/node_modules` directory. You may need to // rerun `npm ci` from the repo root to reset the dependency tree after packaging. - await execAsync( 'npm run cli:package', { cwd: repoRoot } ); + await runCommand( 'npm run cli:package' ); console.log( `Downloading Node.js binary for ${ platform }-${ arch }...` ); - await execAsync( + await runCommand( `npx ts-node ${ path.join( repoRoot, 'scripts', 'download-node-binary.ts' - ) } ${ platform } ${ arch }`, - { cwd: repoRoot } + ) } ${ platform } ${ arch }` ); // Build CLI launcher executable for Windows AppX (Microsoft Store). diff --git a/apps/studio/package.json b/apps/studio/package.json index dcd59fda71..7347eeebfa 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -100,7 +100,7 @@ "@types/winreg": "^1.2.36", "@types/yauzl": "^2.10.3", "@vitejs/plugin-react": "^5.1.4", - "@wp-playground/blueprints": "^3.0.46", + "@wp-playground/blueprints": "3.0.46", "electron": "^39.2.7", "electron-devtools-installer": "^4.0.0", "electron-vite": "^5.0.0", diff --git a/package-lock.json b/package-lock.json index de1f662fff..0dc79d3953 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,12 +53,12 @@ "name": "studio-cli", "license": "GPL-2.0-or-later", "dependencies": { - "@php-wasm/universal": "^3.0.46", + "@php-wasm/universal": "3.0.46", "@studio/common": "file:../../tools/common", - "@wp-playground/blueprints": "^3.0.46", - "@wp-playground/cli": "^3.0.46", - "@wp-playground/common": "^3.0.46", - "@wp-playground/storage": "^3.0.46", + "@wp-playground/blueprints": "3.0.46", + "@wp-playground/cli": "3.0.46", + "@wp-playground/common": "3.0.46", + "@wp-playground/storage": "3.0.46", "cli-table3": "^0.6.5", "http-proxy": "^1.18.1", "pm2": "^6.0.14", @@ -79,7 +79,7 @@ }, "apps/studio": { "name": "studio-app", - "version": "1.7.3", + "version": "1.7.4-beta1", "license": "GPL-2.0-or-later", "dependencies": { "@automattic/generate-password": "^0.1.0", @@ -158,7 +158,7 @@ "@types/winreg": "^1.2.36", "@types/yauzl": "^2.10.3", "@vitejs/plugin-react": "^5.1.4", - "@wp-playground/blueprints": "^3.0.46", + "@wp-playground/blueprints": "3.0.46", "electron": "^39.2.7", "electron-devtools-installer": "^4.0.0", "electron-vite": "^5.0.0", @@ -28224,7 +28224,7 @@ "@types/fs-extra": "^11.0.4", "@types/lockfile": "^1.0.4", "@types/yauzl": "^2.10.3", - "@wp-playground/blueprints": "^3.0.46" + "@wp-playground/blueprints": "3.0.46" } }, "tools/compare-perf": { diff --git a/scripts/package-in-isolation.ts b/scripts/package-in-isolation.ts index 672373b271..6884c8f1da 100644 --- a/scripts/package-in-isolation.ts +++ b/scripts/package-in-isolation.ts @@ -40,10 +40,9 @@ function getStudioAppScripts(): Record< string, string > { ); } -function runOrFail( command: string, args: string[], cwd: string, env = process.env ) { +function runOrFail( command: string, args: string[], cwd: string ) { const options: SpawnSyncOptions = { cwd, - env, stdio: 'inherit', shell: process.platform === 'win32', }; @@ -110,23 +109,23 @@ function main() { const stagingRoot = path.join( stagingParent, 'repo' ); try { - console.log( `Creating staging workspace at ${ stagingRoot }` ); + console.log( `Creating packaging directory at ${ stagingRoot }` ); fs.mkdirSync( stagingRoot, { recursive: true } ); fs.cpSync( REPO_ROOT, stagingRoot, { recursive: true, filter: shouldCopyToStaging, } ); - console.log( 'Installing workspace dependencies in staging ...' ); + console.log( 'Installing workspace dependencies in packaging directory ...' ); runOrFail( 'npm', [ 'ci' ], stagingRoot ); - console.log( `Running script "${ scriptName }" in staging ...` ); + console.log( `Running script "${ scriptName }" in packaging directory ...` ); runOrFail( 'npm', [ '-w', 'studio-app', 'run', scriptName ], stagingRoot ); console.log( 'Syncing packaging artifacts back to workspace ...' ); copyArtifactsBack( stagingRoot ); } finally { - console.log( `Removing staging workspace ${ stagingParent }` ); + console.log( `Removing packaging directory ${ stagingParent }` ); fs.rmSync( stagingParent, { recursive: true, force: true } ); } } diff --git a/tools/common/package.json b/tools/common/package.json index c19de47c70..8c57b0aef7 100644 --- a/tools/common/package.json +++ b/tools/common/package.json @@ -24,6 +24,6 @@ "@types/fs-extra": "^11.0.4", "@types/lockfile": "^1.0.4", "@types/yauzl": "^2.10.3", - "@wp-playground/blueprints": "^3.0.46" + "@wp-playground/blueprints": "3.0.46" } } From 8c7a664d02e95e6cdbb5e76b9149067f591941bd Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Fri, 13 Feb 2026 10:20:59 +0100 Subject: [PATCH 36/60] Tweak --- apps/studio/forge.config.ts | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/apps/studio/forge.config.ts b/apps/studio/forge.config.ts index 7126783ae1..bc8bdf37cb 100644 --- a/apps/studio/forge.config.ts +++ b/apps/studio/forge.config.ts @@ -12,11 +12,10 @@ import type { ForgeConfig } from '@electron-forge/shared-types'; const repoRoot = path.resolve( __dirname, '../..' ); -function runCommand( command: string ) { +function runCommand( command: string, args: string[] = [] ) { return new Promise< void >( ( resolve, reject ) => { - const child = spawn( command, { + const child = spawn( command, args, { cwd: repoRoot, - shell: process.platform === 'win32', stdio: 'inherit', } ); @@ -25,7 +24,11 @@ function runCommand( command: string ) { if ( code === 0 ) { resolve(); } else { - reject( new Error( `Command failed with exit code ${ code }: ${ command }` ) ); + reject( + new Error( + `Command failed with exit code ${ code }: ${ [ command, ...args ].join( ' ' ) }` + ) + ); } } ); } ); @@ -155,6 +158,9 @@ const config: ForgeConfig = { plugins: [ new AutoUnpackNativesPlugin( {} ) ], hooks: { prePackage: async ( _forgeConfig, platform, arch ) => { + const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm'; + const npxCommand = process.platform === 'win32' ? 'npx.cmd' : 'npx'; + console.log( "Ensuring latest WordPress zip isn't included in production build ..." ); const zipPath = path.join( repoRoot, 'wp-files', 'latest.zip' ); try { @@ -166,21 +172,20 @@ const config: ForgeConfig = { console.log( 'Installing Studio app dependencies for bundling ...' ); // NOTE: The `app:install:bundle` script mutates the `apps/studio/node_modules` directory. You // may need to rerun `npm ci` from the repo root to reset the dependency tree after packaging. - await runCommand( 'npm run app:install:bundle' ); + await runCommand( npmCommand, [ 'run', 'app:install:bundle' ] ); console.log( 'Building CLI (with bundled node_modules) ...' ); // NOTE: The `cli:package` script mutates the `apps/cli/node_modules` directory. You may need to // rerun `npm ci` from the repo root to reset the dependency tree after packaging. - await runCommand( 'npm run cli:package' ); + await runCommand( npmCommand, [ 'run', 'cli:package' ] ); console.log( `Downloading Node.js binary for ${ platform }-${ arch }...` ); - await runCommand( - `npx ts-node ${ path.join( - repoRoot, - 'scripts', - 'download-node-binary.ts' - ) } ${ platform } ${ arch }` - ); + await runCommand( npxCommand, [ + 'ts-node', + path.join( repoRoot, 'scripts', 'download-node-binary.ts' ), + platform, + arch, + ] ); // Build CLI launcher executable for Windows AppX (Microsoft Store). // AppX packages require AppExecutionAlias with an .exe target — batch files won't work. From 7a5cb84cfe1aa1abcfe8c2143d1f19ef39c5c77d Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Fri, 13 Feb 2026 10:48:22 +0100 Subject: [PATCH 37/60] Clean up --- apps/cli/package.json | 2 +- apps/studio/forge.config.ts | 14 +++++++------- apps/studio/package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index 1133f44118..acd9004e47 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -23,7 +23,7 @@ }, "scripts": { "build": "vite build --config ./vite.config.ts", - "install:bundle": "npm install --omit=dev --no-package-lock --install-links --no-workspaces && patch-package", + "install:bundle": "npm install --omit=dev --no-package-lock --no-progress --install-links --no-workspaces && patch-package", "package": "npm run install:bundle && npm run build", "watch": "vite build --config ./vite.config.ts --watch" }, diff --git a/apps/studio/forge.config.ts b/apps/studio/forge.config.ts index bc8bdf37cb..2000ad8abb 100644 --- a/apps/studio/forge.config.ts +++ b/apps/studio/forge.config.ts @@ -16,9 +16,12 @@ function runCommand( command: string, args: string[] = [] ) { return new Promise< void >( ( resolve, reject ) => { const child = spawn( command, args, { cwd: repoRoot, - stdio: 'inherit', + stdio: 'pipe', } ); + child.stdout.pipe( process.stdout ); + child.stderr.pipe( process.stderr ); + child.on( 'error', reject ); child.on( 'exit', ( code ) => { if ( code === 0 ) { @@ -158,9 +161,6 @@ const config: ForgeConfig = { plugins: [ new AutoUnpackNativesPlugin( {} ) ], hooks: { prePackage: async ( _forgeConfig, platform, arch ) => { - const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm'; - const npxCommand = process.platform === 'win32' ? 'npx.cmd' : 'npx'; - console.log( "Ensuring latest WordPress zip isn't included in production build ..." ); const zipPath = path.join( repoRoot, 'wp-files', 'latest.zip' ); try { @@ -172,15 +172,15 @@ const config: ForgeConfig = { console.log( 'Installing Studio app dependencies for bundling ...' ); // NOTE: The `app:install:bundle` script mutates the `apps/studio/node_modules` directory. You // may need to rerun `npm ci` from the repo root to reset the dependency tree after packaging. - await runCommand( npmCommand, [ 'run', 'app:install:bundle' ] ); + await runCommand( 'npm', [ 'run', 'app:install:bundle' ] ); console.log( 'Building CLI (with bundled node_modules) ...' ); // NOTE: The `cli:package` script mutates the `apps/cli/node_modules` directory. You may need to // rerun `npm ci` from the repo root to reset the dependency tree after packaging. - await runCommand( npmCommand, [ 'run', 'cli:package' ] ); + await runCommand( 'npm', [ 'run', 'cli:package' ] ); console.log( `Downloading Node.js binary for ${ platform }-${ arch }...` ); - await runCommand( npxCommand, [ + await runCommand( 'npx', [ 'ts-node', path.join( repoRoot, 'scripts', 'download-node-binary.ts' ), platform, diff --git a/apps/studio/package.json b/apps/studio/package.json index 7347eeebfa..67c8dd60ec 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -18,7 +18,7 @@ "make:windows-arm64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge make . --arch=arm64 --platform=win32", "make:macos-x64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && SKIP_DMG=true FILE_ARCHITECTURE=x64 electron-forge make . --arch=x64 --platform=darwin", "make:macos-arm64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && SKIP_DMG=true FILE_ARCHITECTURE=arm64 electron-forge make . --arch=arm64 --platform=darwin", - "install:bundle": "npm install --no-package-lock --install-links --no-workspaces && patch-package && npx @electron/rebuild -o fs-ext", + "install:bundle": "npm install --no-package-lock --no-progress --install-links --no-workspaces && patch-package && npx @electron/rebuild -o fs-ext", "package": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge package .", "publish": "electron-forge publish .", "start-wayland": "npm -w studio-cli run build && electron-forge start . -- --enable-features=UseOzonePlatform --ozone-platform=wayland" From 8f3dec63733b7f9a3fd5f9af63143bf8f237c43c Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Fri, 13 Feb 2026 10:57:23 +0100 Subject: [PATCH 38/60] Bring back Windows specific behavior --- apps/studio/forge.config.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/studio/forge.config.ts b/apps/studio/forge.config.ts index 2000ad8abb..1754dbde97 100644 --- a/apps/studio/forge.config.ts +++ b/apps/studio/forge.config.ts @@ -161,6 +161,9 @@ const config: ForgeConfig = { plugins: [ new AutoUnpackNativesPlugin( {} ) ], hooks: { prePackage: async ( _forgeConfig, platform, arch ) => { + const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm'; + const npxCommand = process.platform === 'win32' ? 'npx.cmd' : 'npx'; + console.log( "Ensuring latest WordPress zip isn't included in production build ..." ); const zipPath = path.join( repoRoot, 'wp-files', 'latest.zip' ); try { @@ -172,15 +175,15 @@ const config: ForgeConfig = { console.log( 'Installing Studio app dependencies for bundling ...' ); // NOTE: The `app:install:bundle` script mutates the `apps/studio/node_modules` directory. You // may need to rerun `npm ci` from the repo root to reset the dependency tree after packaging. - await runCommand( 'npm', [ 'run', 'app:install:bundle' ] ); + await runCommand( npmCommand, [ 'run', 'app:install:bundle' ] ); console.log( 'Building CLI (with bundled node_modules) ...' ); // NOTE: The `cli:package` script mutates the `apps/cli/node_modules` directory. You may need to // rerun `npm ci` from the repo root to reset the dependency tree after packaging. - await runCommand( 'npm', [ 'run', 'cli:package' ] ); + await runCommand( npmCommand, [ 'run', 'cli:package' ] ); console.log( `Downloading Node.js binary for ${ platform }-${ arch }...` ); - await runCommand( 'npx', [ + await runCommand( npxCommand, [ 'ts-node', path.join( repoRoot, 'scripts', 'download-node-binary.ts' ), platform, From 4dfe83061e4db8980126419a6ade038008f4d98a Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Fri, 13 Feb 2026 11:11:10 +0100 Subject: [PATCH 39/60] Back to exec --- apps/studio/forge.config.ts | 60 +++++++++++++++---------------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/apps/studio/forge.config.ts b/apps/studio/forge.config.ts index 1754dbde97..2759069704 100644 --- a/apps/studio/forge.config.ts +++ b/apps/studio/forge.config.ts @@ -6,37 +6,12 @@ import { MakerSquirrel } from '@electron-forge/maker-squirrel'; import { MakerZIP } from '@electron-forge/maker-zip'; import { AutoUnpackNativesPlugin } from '@electron-forge/plugin-auto-unpack-natives'; import { isErrnoException } from '@studio/common/lib/is-errno-exception'; -import { spawn } from 'child_process'; +import { exec } from 'child_process'; import { exec as pkgExec } from '@yao-pkg/pkg'; import type { ForgeConfig } from '@electron-forge/shared-types'; const repoRoot = path.resolve( __dirname, '../..' ); -function runCommand( command: string, args: string[] = [] ) { - return new Promise< void >( ( resolve, reject ) => { - const child = spawn( command, args, { - cwd: repoRoot, - stdio: 'pipe', - } ); - - child.stdout.pipe( process.stdout ); - child.stderr.pipe( process.stderr ); - - child.on( 'error', reject ); - child.on( 'exit', ( code ) => { - if ( code === 0 ) { - resolve(); - } else { - reject( - new Error( - `Command failed with exit code ${ code }: ${ [ command, ...args ].join( ' ' ) }` - ) - ); - } - } ); - } ); -} - const config: ForgeConfig = { packagerConfig: { asar: true, @@ -161,8 +136,20 @@ const config: ForgeConfig = { plugins: [ new AutoUnpackNativesPlugin( {} ) ], hooks: { prePackage: async ( _forgeConfig, platform, arch ) => { - const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm'; - const npxCommand = process.platform === 'win32' ? 'npx.cmd' : 'npx'; + const execAsync = ( command: string ) => + new Promise< void >( ( resolve, reject ) => { + exec( + command, + { cwd: repoRoot, maxBuffer: 50 * 1024 * 1024, windowsHide: true }, + ( error ) => { + if ( error ) { + reject( error ); + } else { + resolve(); + } + } + ); + } ); console.log( "Ensuring latest WordPress zip isn't included in production build ..." ); const zipPath = path.join( repoRoot, 'wp-files', 'latest.zip' ); @@ -175,20 +162,21 @@ const config: ForgeConfig = { console.log( 'Installing Studio app dependencies for bundling ...' ); // NOTE: The `app:install:bundle` script mutates the `apps/studio/node_modules` directory. You // may need to rerun `npm ci` from the repo root to reset the dependency tree after packaging. - await runCommand( npmCommand, [ 'run', 'app:install:bundle' ] ); + await execAsync( 'npm run app:install:bundle' ); console.log( 'Building CLI (with bundled node_modules) ...' ); // NOTE: The `cli:package` script mutates the `apps/cli/node_modules` directory. You may need to // rerun `npm ci` from the repo root to reset the dependency tree after packaging. - await runCommand( npmCommand, [ 'run', 'cli:package' ] ); + await execAsync( 'npm run cli:package' ); console.log( `Downloading Node.js binary for ${ platform }-${ arch }...` ); - await runCommand( npxCommand, [ - 'ts-node', - path.join( repoRoot, 'scripts', 'download-node-binary.ts' ), - platform, - arch, - ] ); + await execAsync( + `npx ts-node ${ path.join( + repoRoot, + 'scripts', + 'download-node-binary.ts' + ) } ${ platform } ${ arch }` + ); // Build CLI launcher executable for Windows AppX (Microsoft Store). // AppX packages require AppExecutionAlias with an .exe target — batch files won't work. From 6c441dc042481adcd033752ffd98baa0ed8b1501 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Mon, 16 Feb 2026 09:38:52 +0100 Subject: [PATCH 40/60] Updated dependencies --- apps/studio/package.json | 2 +- package-lock.json | 383 +++++++++++++++++++++++---------------- 2 files changed, 223 insertions(+), 162 deletions(-) diff --git a/apps/studio/package.json b/apps/studio/package.json index 67c8dd60ec..f0aa47487a 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -51,7 +51,7 @@ "date-fns": "^3.3.1", "electron-squirrel-startup": "^1.0.1", "electron2appx": "^2.1.2", - "express": "4.21.2", + "express": "4.22.1", "fast-deep-equal": "^3.1.3", "file-stream-rotator": "^1.0.0", "follow-redirects": "^1.15.11", diff --git a/package-lock.json b/package-lock.json index 2c7c41c1fc..dd1d6d3771 100644 --- a/package-lock.json +++ b/package-lock.json @@ -109,7 +109,7 @@ "date-fns": "^3.3.1", "electron-squirrel-startup": "^1.0.1", "electron2appx": "^2.1.2", - "express": "4.21.2", + "express": "4.22.1", "fast-deep-equal": "^3.1.3", "file-stream-rotator": "^1.0.0", "follow-redirects": "^1.15.11", @@ -424,6 +424,96 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, + "apps/studio/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "apps/studio/node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "apps/studio/node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "apps/studio/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "apps/studio/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/@adobe/css-tools": { "version": "4.4.4", "dev": true, @@ -4872,7 +4962,9 @@ } }, "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", + "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4884,6 +4976,8 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "license": "ISC", "dependencies": { @@ -4899,7 +4993,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -4911,11 +5007,15 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { @@ -4932,6 +5032,8 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7301,6 +7403,8 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "license": "MIT", "optional": true, @@ -9830,7 +9934,9 @@ } }, "node_modules/@wordpress/components/node_modules/path-to-regexp": { - "version": "6.2.1", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "license": "MIT" }, "node_modules/@wordpress/compose": { @@ -12066,21 +12172,23 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.3", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", @@ -12094,21 +12202,37 @@ "ms": "2.0.0" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.13.0", - "license": "BSD-3-Clause", + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { - "node": ">=0.6" + "node": ">= 0.8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, "node_modules/boolean": { @@ -13628,7 +13752,9 @@ "license": "Apache-2.0" }, "node_modules/diff": { - "version": "4.0.2", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -15628,122 +15754,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/express": { - "version": "4.21.2", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/cookie": { - "version": "0.7.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/encodeurl": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/finalhandler": { - "version": "1.3.1", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/express/node_modules/qs": { - "version": "6.13.0", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/extend": { "version": "3.0.2", "license": "MIT" @@ -18133,15 +18143,14 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -18667,7 +18676,9 @@ } }, "node_modules/lodash": { - "version": "4.17.21", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, "node_modules/lodash._baseiteratee": { @@ -22147,7 +22158,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -22217,14 +22230,45 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -24006,6 +24050,8 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -24019,6 +24065,8 @@ }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -24119,6 +24167,8 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -24260,6 +24310,8 @@ }, "node_modules/sucrase/node_modules/brace-expansion": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -24275,28 +24327,31 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.3.10", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.3", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -24310,7 +24365,9 @@ } }, "node_modules/sucrase/node_modules/minipass": { - "version": "7.0.4", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "license": "ISC", "engines": { @@ -27949,6 +28006,8 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -27965,6 +28024,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { From e37fcdca058b5332be95da207e2f391bf5b232e6 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Mon, 16 Feb 2026 09:50:53 +0100 Subject: [PATCH 41/60] Update version to `1.7.4-beta2` --- apps/studio/package.json | 2 +- package-lock.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/studio/package.json b/apps/studio/package.json index f0aa47487a..4bf41c566e 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -3,7 +3,7 @@ "author": "Automattic Inc.", "private": true, "productName": "Studio", - "version": "1.7.4-beta1", + "version": "1.7.4-beta2", "description": "Local WordPress development environment using Playgrounds", "license": "GPL-2.0-or-later", "main": "dist/main/index.js", diff --git a/package-lock.json b/package-lock.json index dd1d6d3771..2129a83f8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -79,7 +79,7 @@ }, "apps/studio": { "name": "studio-app", - "version": "1.7.4-beta1", + "version": "1.7.4-beta2", "license": "GPL-2.0-or-later", "dependencies": { "@automattic/generate-password": "^0.1.0", From db4bbc62ac088554dd211b39e426ba25a5ebacf3 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Mon, 16 Feb 2026 13:42:52 +0100 Subject: [PATCH 42/60] Dependency fixes --- package-lock.json | 25 +++++++++++++++---------- package.json | 1 - 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5903bf5cb5..e9bc5bccf6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,6 @@ "@types/fs-extra": "^11.0.4", "@vitest/ui": "^2.1.8", "@yao-pkg/pkg": "^6.13.1", - "electron": "^39.2.7", "electron-playwright-helpers": "^2.1.0", "eslint": "^9.39.2", "eslint-import-resolver-typescript": "^4.4.4", @@ -18647,7 +18646,9 @@ } }, "node_modules/jsdom": { - "version": "24.0.0", + "version": "24.1.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.3.tgz", + "integrity": "sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18656,21 +18657,21 @@ "decimal.js": "^10.4.3", "form-data": "^4.0.0", "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.7", + "nwsapi": "^2.2.12", "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", + "rrweb-cssom": "^0.7.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.3", + "tough-cookie": "^4.1.4", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0", - "ws": "^8.16.0", + "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, "engines": { @@ -23595,7 +23596,9 @@ ] }, "node_modules/rrweb-cssom": { - "version": "0.6.0", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", "dev": true, "license": "MIT" }, @@ -28751,7 +28754,9 @@ } }, "node_modules/zod": { - "version": "4.3.5", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index f80074f48f..08ca9f08f4 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,6 @@ "@types/fs-extra": "^11.0.4", "@vitest/ui": "^2.1.8", "@yao-pkg/pkg": "^6.13.1", - "electron": "^39.2.7", "electron-playwright-helpers": "^2.1.0", "eslint": "^9.39.2", "eslint-import-resolver-typescript": "^4.4.4", From d66c9ca8ff32be10cbc7a1fec3e1846e921bd99d Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Mon, 16 Feb 2026 13:50:31 +0100 Subject: [PATCH 43/60] Fix missing dependency --- package-lock.json | 36 ++++++++++++++++++++++++++++++------ package.json | 3 ++- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index e9bc5bccf6..ef2e74f14c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,10 +24,11 @@ "@yao-pkg/pkg": "^6.13.1", "electron-playwright-helpers": "^2.1.0", "eslint": "^9.39.2", + "eslint-config-prettier": "^9.1.2", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest-dom": "^5.5.0", - "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-studio": "file:tools/eslint-plugin-studio", "fs-extra": "^11.3.3", @@ -7460,6 +7461,8 @@ }, "node_modules/@pkgr/core": { "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, "license": "MIT", "engines": { @@ -15662,6 +15665,19 @@ } } }, + "node_modules/eslint-config-prettier": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", + "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-import-context": { "version": "0.1.9", "dev": true, @@ -15843,12 +15859,14 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.5.4", + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", + "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", "dev": true, "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.7" + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.12" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -16280,6 +16298,8 @@ }, "node_modules/fast-diff": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true, "license": "Apache-2.0" }, @@ -22353,7 +22373,9 @@ } }, "node_modules/prettier-linter-helpers": { - "version": "1.0.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, "license": "MIT", "dependencies": { @@ -24888,7 +24910,9 @@ "license": "MIT" }, "node_modules/synckit": { - "version": "0.11.11", + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 08ca9f08f4..762b1b1f26 100644 --- a/package.json +++ b/package.json @@ -57,10 +57,11 @@ "@yao-pkg/pkg": "^6.13.1", "electron-playwright-helpers": "^2.1.0", "eslint": "^9.39.2", + "eslint-config-prettier": "^9.1.2", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest-dom": "^5.5.0", - "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-studio": "file:tools/eslint-plugin-studio", "fs-extra": "^11.3.3", From 3546a5f85decf89ac4e8cc9563301cbe7274fd8b Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 09:56:59 +0100 Subject: [PATCH 44/60] Reuse package artifacts between CI jobs --- .buildkite/commands/build-for-windows.ps1 | 22 ++++++- .buildkite/commands/package-app-for-ci.sh | 32 ++++++++++ .buildkite/commands/prepare-environment.sh | 4 +- .buildkite/commands/run-e2e-tests.sh | 27 +++----- .buildkite/commands/run-metrics-tests.sh | 6 ++ .buildkite/pipeline.yml | 43 +++++++++++-- apps/studio/package.json | 9 +-- package.json | 16 +++-- scripts/package-in-isolation.ts | 73 +++++++++++++--------- tools/compare-perf/performance.ts | 33 ++++++++-- 10 files changed, 189 insertions(+), 76 deletions(-) create mode 100755 .buildkite/commands/package-app-for-ci.sh diff --git a/.buildkite/commands/build-for-windows.ps1 b/.buildkite/commands/build-for-windows.ps1 index 44f7a264b1..c72c22486b 100644 --- a/.buildkite/commands/build-for-windows.ps1 +++ b/.buildkite/commands/build-for-windows.ps1 @@ -53,8 +53,26 @@ if ($BuildType -eq $BUILD_TYPE_DEV) { # Set architecture environment variable for AppX packaging $env:FILE_ARCHITECTURE=$Architecture -Write-Host "Building for architecture: $Architecture" -npm -w studio-app run "make:windows-$Architecture" +Write-Host "--- :package: Preparing packaged app for architecture: $Architecture" +if ($BuildType -eq $BUILD_TYPE_DEV) { + $artifactFile = "artifacts/studio-app-windows-$Architecture.tar.gz" + bash -lc "buildkite-agent artifact download `"$artifactFile`" ." + if ($LastExitCode -eq 0) { + Write-Host "Using prebuilt app artifact: $artifactFile" + tar -xzf $artifactFile + If ($LastExitCode -ne 0) { Exit $LastExitCode } + } else { + Write-Host "Error: required prebuilt app artifact not found: $artifactFile" -ForegroundColor Red + Exit 1 + } +} else { + Write-Host "Release build: packaging app for windows-$Architecture" + npm run "package:windows-$Architecture" + If ($LastExitCode -ne 0) { Exit $LastExitCode } +} + +Write-Host "--- :node: Building installer artifacts for architecture: $Architecture" +npm run "make:windows-$Architecture" If ($LastExitCode -ne 0) { Exit $LastExitCode } # Rename NuGet package files with generic name diff --git a/.buildkite/commands/package-app-for-ci.sh b/.buildkite/commands/package-app-for-ci.sh new file mode 100755 index 0000000000..11d3bd4b22 --- /dev/null +++ b/.buildkite/commands/package-app-for-ci.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +set -euo pipefail + +PLATFORM=${1:?Expected platform to be provided as first parameter} +ARCH=${2:?Expected architecture to be provided as second parameter} + +echo "--- :package: Install deps" +bash .buildkite/commands/install-node-dependencies.sh + +export IS_DEV_BUILD=true + +case "$PLATFORM" in + mac) + SCRIPT_PLATFORM="macos" + ;; + windows) + SCRIPT_PLATFORM="windows" + ;; + *) + echo "Unknown platform: $PLATFORM" + exit 1 + ;; +esac + +echo "--- :package: Package app for CI reuse ($PLATFORM-$ARCH)" +npm run "package:${SCRIPT_PLATFORM}-${ARCH}" + +mkdir -p artifacts +ARTIFACT_FILE="artifacts/studio-app-${PLATFORM}-${ARCH}.tar.gz" + +echo "--- :package: Bundle packaged app into $ARTIFACT_FILE" +tar -czf "$ARTIFACT_FILE" apps/studio/out diff --git a/.buildkite/commands/prepare-environment.sh b/.buildkite/commands/prepare-environment.sh index 6cbc984be1..9097b430bb 100755 --- a/.buildkite/commands/prepare-environment.sh +++ b/.buildkite/commands/prepare-environment.sh @@ -1,7 +1,7 @@ #!/bin/bash -eu # Prepares the CI environment to successfully build the macOS app. -# Building the app is done via npm run make:macos-*. +# Building installer artifacts is done via npm run make:macos-*. echo "--- :rubygems: Setting up Gems" install_gems @@ -10,4 +10,4 @@ echo "--- :closed_lock_with_key: Installing Secrets" bundle exec fastlane run configure_apply echo "--- :testflight: Fetching Signing Certificates" -bundle exec fastlane set_up_signing \ No newline at end of file +bundle exec fastlane set_up_signing diff --git a/.buildkite/commands/run-e2e-tests.sh b/.buildkite/commands/run-e2e-tests.sh index 38b626683e..3956e45d52 100644 --- a/.buildkite/commands/run-e2e-tests.sh +++ b/.buildkite/commands/run-e2e-tests.sh @@ -13,25 +13,14 @@ bash .buildkite/commands/install-node-dependencies.sh export IS_DEV_BUILD=true -# Map platform names to electron-forge platform values -case "$PLATFORM" in - mac) - FORGE_PLATFORM="darwin" - ;; - windows) - FORGE_PLATFORM="win32" - ;; - *) - echo "Unknown platform: $PLATFORM" - exit 1 - ;; -esac - -# Use `electron-forge package` instead of `npm run make:*` for E2E tests. -# `make` creates signed distributables (installers), which requires code signing setup. -# `package` creates an unsigned app bundle, sufficient for E2E testing. -echo "--- :package: Package app for testing ($PLATFORM-$ARCH)" -npm -w studio-app run package -- --arch="$ARCH" --platform="$FORGE_PLATFORM" +ARTIFACT_FILE="artifacts/studio-app-${PLATFORM}-${ARCH}.tar.gz" + +if ! buildkite-agent artifact download "$ARTIFACT_FILE" .; then + echo "^^^ +++ Required prebuilt app artifact not found: $ARTIFACT_FILE" + exit 1 +fi +echo "--- :package: Extracting prebuilt app artifacts ($PLATFORM-$ARCH)" +tar -xzf "$ARTIFACT_FILE" echo '--- :playwright: Run End To End Tests' diff --git a/.buildkite/commands/run-metrics-tests.sh b/.buildkite/commands/run-metrics-tests.sh index f11eec8641..834a028f54 100755 --- a/.buildkite/commands/run-metrics-tests.sh +++ b/.buildkite/commands/run-metrics-tests.sh @@ -14,6 +14,12 @@ npm -w compare-perf install export IS_DEV_BUILD=true export ARTIFACTS_PATH=${PWD}/tools/metrics/artifacts export SKIP_WORKER_THREAD_BUILD='true' +export COMPARE_PERF_PREBUILT_BRANCH=$BUILDKITE_COMMIT +export COMPARE_PERF_PREBUILT_OUT_DIR=${PWD}/apps/studio/out + +echo '--- :package: Downloading prebuilt app artifacts' +buildkite-agent artifact download "artifacts/studio-app-mac-arm64.tar.gz" . +tar -xzf artifacts/studio-app-mac-arm64.tar.gz # Detect if this is a PR or trunk push if [ "${BUILDKITE_PULL_REQUEST}" != "false" ]; then diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 74d2daa33d..eb1aa540ae 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -7,6 +7,21 @@ env: IMAGE_ID: $IMAGE_ID steps: + - label: ":package: Package App Artifacts on {{matrix.platform}}-{{matrix.arch}}" + key: package_app_artifacts + agents: + queue: "{{matrix.platform}}" + command: bash .buildkite/commands/package-app-for-ci.sh "{{matrix.platform}}" "{{matrix.arch}}" + artifact_paths: + - artifacts/studio-app-*.tar.gz + plugins: [$CI_TOOLKIT_PLUGIN, $NVM_PLUGIN] + matrix: + setup: { platform: [], arch: [] } + adjustments: + - with: { platform: mac, arch: arm64 } + - with: { platform: windows, arch: x64 } + if: build.branch == 'trunk' || build.tag =~ /^v[0-9]+/ || !build.pull_request.draft + - label: Lint agents: queue: mac @@ -35,6 +50,8 @@ steps: # - windows-x64: Native on x64 agents - label: E2E Tests on {{matrix.platform}}-{{matrix.arch}} key: e2e_tests + depends_on: + - step: package_app_artifacts command: bash .buildkite/commands/run-e2e-tests.sh "{{matrix.platform}}" "{{matrix.arch}}" artifact_paths: - test-results/**/*.zip @@ -60,6 +77,8 @@ steps: - label: ":chart_with_upwards_trend: Performance Metrics" key: metrics + depends_on: + - step: package_app_artifacts agents: queue: mac command: bash .buildkite/commands/run-metrics-tests.sh @@ -80,7 +99,9 @@ steps: - group: 📦 Build for Mac key: dev-mac - depends_on: input-dev-mac + depends_on: + - step: input-dev-mac + - step: package_app_artifacts if: build.tag !~ /^v[0-9]+/ steps: - label: 🔨 Mac Dev Build - {{matrix}} @@ -95,7 +116,16 @@ steps: export IS_DEV_BUILD=true - echo "--- :node: Building Binary" + ARTIFACT_FILE="artifacts/studio-app-mac-{{matrix}}.tar.gz" + if buildkite-agent artifact download "$ARTIFACT_FILE" .; then + echo "--- :package: Extracting prebuilt app artifacts (mac-{{matrix}})" + tar -xzf "$ARTIFACT_FILE" + else + echo "^^^ +++ Required prebuilt app artifact not found: $ARTIFACT_FILE" + exit 1 + fi + + echo "--- :node: Building installer artifacts" npm run make:macos-{{matrix}} # Local trial and error show this needs to run before the DMG generation (obviously) but after the binary has been built @@ -134,7 +164,9 @@ steps: - group: 📦 Build for Windows key: dev-windows - depends_on: input-dev-windows + depends_on: + - step: input-dev-windows + - step: package_app_artifacts if: build.tag !~ /^v[0-9]+/ steps: - label: 🔨 Windows Dev Build - {{matrix}} @@ -194,7 +226,10 @@ steps: .buildkite/commands/install-node-dependencies.sh node ./scripts/confirm-tag-matches-version.mjs - echo "--- :node: Building Binary" + echo "--- :package: Packaging app" + npm run package:macos-{{matrix}} + + echo "--- :node: Building installer artifacts" npm run make:macos-{{matrix}} # Local trial and error show this needs to run before the DMG generation (obviously) but after the binary has been built diff --git a/apps/studio/package.json b/apps/studio/package.json index 498b1bbf89..a816e3e4a4 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -13,13 +13,10 @@ "scripts": { "start": "electron-vite dev --config ./electron.vite.config.ts --outDir=dist --watch", "prestart": "npm -w studio-cli run build", - "make": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge make .", - "make:windows-x64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge make . --arch=x64 --platform=win32", - "make:windows-arm64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge make . --arch=arm64 --platform=win32", - "make:macos-x64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && SKIP_DMG=true FILE_ARCHITECTURE=x64 electron-forge make . --arch=x64 --platform=darwin", - "make:macos-arm64": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && SKIP_DMG=true FILE_ARCHITECTURE=arm64 electron-forge make . --arch=arm64 --platform=darwin", + "build": "electron-vite build --config ./electron.vite.config.ts --outDir=dist", + "make": "SKIP_DMG=true electron-forge make . --skip-package", "install:bundle": "npm install --no-package-lock --no-progress --install-links --no-workspaces && patch-package && npx @electron/rebuild -o fs-ext", - "package": "electron-vite build --config ./electron.vite.config.ts --outDir=dist && electron-forge package .", + "package": "npm run build && electron-forge package .", "publish": "electron-forge publish .", "start-wayland": "npm -w studio-cli run build && electron-forge start . -- --enable-features=UseOzonePlatform --ozone-platform=wayland" }, diff --git a/package.json b/package.json index 762b1b1f26..e4656a29f9 100644 --- a/package.json +++ b/package.json @@ -23,12 +23,16 @@ "start": "npm -w studio-app run start", "start-wayland": "npm -w studio-app run start-wayland", "postinstall": "patch-package --patch-dir apps/cli/patches && patch-package --patch-dir apps/studio/patches && ts-node ./scripts/download-wp-server-files.ts && node ./scripts/download-available-site-translations.mjs && npx @electron/rebuild -o fs-ext", - "package": "ts-node ./scripts/package-in-isolation.ts package", - "make": "ts-node ./scripts/package-in-isolation.ts make", - "make:windows-x64": "ts-node ./scripts/package-in-isolation.ts make:windows-x64", - "make:windows-arm64": "ts-node ./scripts/package-in-isolation.ts make:windows-arm64", - "make:macos-x64": "ts-node ./scripts/package-in-isolation.ts make:macos-x64", - "make:macos-arm64": "ts-node ./scripts/package-in-isolation.ts make:macos-arm64", + "package": "ts-node ./scripts/package-in-isolation.ts", + "package:windows-x64": "ts-node ./scripts/package-in-isolation.ts --platform=win32 --arch=x64", + "package:windows-arm64": "ts-node ./scripts/package-in-isolation.ts --platform=win32 --arch=arm64", + "package:macos-x64": "ts-node ./scripts/package-in-isolation.ts --platform=darwin --arch=x64", + "package:macos-arm64": "ts-node ./scripts/package-in-isolation.ts --platform=darwin --arch=arm64", + "make": "npm -w studio-app run make", + "make:windows-x64": "npm -w studio-app run make -- --platform=win32 --arch=x64", + "make:windows-arm64": "npm -w studio-app run make -- --platform=win32 --arch=arm64", + "make:macos-x64": "npm -w studio-app run make -- --platform=darwin --arch=x64", + "make:macos-arm64": "npm -w studio-app run make -- --platform=darwin --arch=arm64", "make:dmg-x64": "FILE_ARCHITECTURE=x64 node ./scripts/make-dmg.mjs", "make:dmg-arm64": "FILE_ARCHITECTURE=arm64 node ./scripts/make-dmg.mjs", "publish": "npm -w studio-app run publish", diff --git a/scripts/package-in-isolation.ts b/scripts/package-in-isolation.ts index 6884c8f1da..df3095e285 100644 --- a/scripts/package-in-isolation.ts +++ b/scripts/package-in-isolation.ts @@ -1,7 +1,7 @@ /** * This script packages the Studio app in isolation by copying the repo to a temporary directory, - * installing dependencies, running the relevant make/package script, copying the output back to - * the repo and then cleaning up. + * installing dependencies, running studio-app's package script, copying output back to the repo, + * and cleaning up. * * Why is this needed? With npm workspaces, most dependencies are hoisted to the top-level * `node_modules` directory, but there's no guarantee that all of them are. This behavior conflicts @@ -21,23 +21,29 @@ import fs from 'fs'; import os from 'os'; import path from 'path'; import { spawnSync, type SpawnSyncOptions } from 'child_process'; -import { z } from 'zod'; +import yargs from 'yargs'; +import { hideBin } from 'yargs/helpers'; const REPO_ROOT = path.resolve( __dirname, '..' ); -const STUDIO_APP_PACKAGE_JSON = path.join( REPO_ROOT, 'apps', 'studio', 'package.json' ); - -const STUDIO_APP_PACKAGE_JSON_SCHEMA = z.object( { - scripts: z.record( z.string(), z.string() ), -} ); - -function getStudioAppScripts(): Record< string, string > { - const studioAppPackage = JSON.parse( fs.readFileSync( STUDIO_APP_PACKAGE_JSON, 'utf-8' ) ); - const parsedPackage = STUDIO_APP_PACKAGE_JSON_SCHEMA.parse( studioAppPackage ); - return Object.fromEntries( - Object.entries( parsedPackage.scripts ).filter( - ( [ scriptName ] ) => scriptName === 'package' || scriptName.startsWith( 'make' ) - ) - ); + +function parseArgs( argv: string[] ) { + return yargs( hideBin( argv ) ) + .scriptName( 'package-in-isolation' ) + .usage( '$0 [--platform= --arch=]' ) + .option( 'platform', { + type: 'string', + describe: 'Target platform', + choices: [ 'darwin', 'win32' ] as const, + } ) + .option( 'arch', { + type: 'string', + describe: 'Target architecture', + choices: [ 'x64', 'arm64' ] as const, + } ) + .strict() + .help( false ) + .version( false ) + .parseSync(); } function runOrFail( command: string, args: string[], cwd: string ) { @@ -53,6 +59,20 @@ function runOrFail( command: string, args: string[], cwd: string ) { } } +function runPackageScript( cwd: string, arch?: 'x64' | 'arm64', platform?: 'darwin' | 'win32' ) { + const args = [ '-w', 'studio-app', 'run', 'package', '--' ]; + + if ( arch ) { + args.push( `--arch=${ arch }` ); + } + + if ( platform ) { + args.push( `--platform=${ platform }` ); + } + + runOrFail( 'npm', args, cwd ); +} + function shouldCopyToStaging( sourcePath: string ): boolean { const relativePath = path.relative( REPO_ROOT, sourcePath ); if ( relativePath === '' ) return true; @@ -87,21 +107,12 @@ function copyArtifactsBack( stagingRoot: string ) { } function main() { - const studioAppScripts = getStudioAppScripts(); - const scriptName = process.argv[ 2 ]; - - if ( ! studioAppScripts.hasOwnProperty( scriptName ) ) { - throw new Error( - `Unsupported script "${ scriptName }". Supported studio-app packaging scripts: ${ Object.keys( - studioAppScripts - ).join( ', ' ) }` - ); - } + const target = parseArgs( process.argv ); const isCi = process.env.CI && process.env.CI !== 'false'; if ( isCi ) { - console.log( `Detected CI environment; running script "${ scriptName }" in place.` ); - runOrFail( 'npm', [ '-w', 'studio-app', 'run', scriptName ], REPO_ROOT ); + console.log( 'Detected CI environment; running package in place.' ); + runPackageScript( REPO_ROOT, target.arch, target.platform ); return; } @@ -119,8 +130,8 @@ function main() { console.log( 'Installing workspace dependencies in packaging directory ...' ); runOrFail( 'npm', [ 'ci' ], stagingRoot ); - console.log( `Running script "${ scriptName }" in packaging directory ...` ); - runOrFail( 'npm', [ '-w', 'studio-app', 'run', scriptName ], stagingRoot ); + console.log( 'Running package in packaging directory ...' ); + runPackageScript( stagingRoot, target.arch, target.platform ); console.log( 'Syncing packaging artifacts back to workspace ...' ); copyArtifactsBack( stagingRoot ); diff --git a/tools/compare-perf/performance.ts b/tools/compare-perf/performance.ts index 2c469d77ff..abe4973ae3 100644 --- a/tools/compare-perf/performance.ts +++ b/tools/compare-perf/performance.ts @@ -114,6 +114,8 @@ export async function runPerformanceTests( ) { const runningInCI = !! process.env.CI || !! options.ci; const testRounds = options.rounds || 1; + const prebuiltBranch = process.env.COMPARE_PERF_PREBUILT_BRANCH; + const prebuiltOutDir = process.env.COMPARE_PERF_PREBUILT_OUT_DIR; // The default value doesn't work because commander provides an array. if ( branches.length === 0 ) { @@ -219,12 +221,31 @@ export async function runPerformanceTests( logAtIndent( 3, 'Checking out:', formats.success( branch ) ); await simpleGit( buildDir ).raw( 'checkout', branch ); - logAtIndent( 3, 'Installing dependencies and building' ); - await runShellScript( config.setupCommand, buildDir, { - GITHUB_TOKEN: process.env.GITHUB_TOKEN, - SKIP_WORKER_THREAD_BUILD: process.env.SKIP_WORKER_THREAD_BUILD, - IS_DEV_BUILD: 'true', - } ); + if ( + prebuiltBranch && + prebuiltOutDir && + branch === prebuiltBranch && + fs.existsSync( prebuiltOutDir ) + ) { + const prebuiltTargetDir = path.join( buildDir, 'out' ); + logAtIndent( + 3, + 'Using prebuilt app artifacts from:', + formats.success( prebuiltOutDir ) + ); + + if ( fs.existsSync( prebuiltTargetDir ) ) { + fs.rmSync( prebuiltTargetDir, { recursive: true } ); + } + fs.cpSync( prebuiltOutDir, prebuiltTargetDir, { recursive: true } ); + } else { + logAtIndent( 3, 'Installing dependencies and building' ); + await runShellScript( config.setupCommand, buildDir, { + GITHUB_TOKEN: process.env.GITHUB_TOKEN, + SKIP_WORKER_THREAD_BUILD: process.env.SKIP_WORKER_THREAD_BUILD, + IS_DEV_BUILD: 'true', + } ); + } } logAtIndent( 0, 'Looking for test files' ); From 7d8e2e5db05c35763ac61906fed94b6e9ee7dc96 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 10:10:24 +0100 Subject: [PATCH 45/60] Reuse trunk package artifact in compare-perf --- .buildkite/commands/package-app-for-ci.sh | 10 +++++ .buildkite/commands/run-metrics-tests.sh | 18 ++++++++ tools/compare-perf/performance.ts | 52 +++++++++++++++++------ 3 files changed, 67 insertions(+), 13 deletions(-) diff --git a/.buildkite/commands/package-app-for-ci.sh b/.buildkite/commands/package-app-for-ci.sh index 11d3bd4b22..9311f79dc7 100755 --- a/.buildkite/commands/package-app-for-ci.sh +++ b/.buildkite/commands/package-app-for-ci.sh @@ -30,3 +30,13 @@ ARTIFACT_FILE="artifacts/studio-app-${PLATFORM}-${ARCH}.tar.gz" echo "--- :package: Bundle packaged app into $ARTIFACT_FILE" tar -czf "$ARTIFACT_FILE" apps/studio/out + +if [ "$PLATFORM" = "mac" ] && [ "$ARCH" = "arm64" ] && [ "${BUILDKITE_BRANCH:-}" = "trunk" ]; then + echo "--- :package: Caching trunk mac-arm64 package artifact for compare-perf reuse" + TRUNK_ARTIFACT_CACHE_PATH="artifacts/trunk-mac-arm64" + TRUNK_ARTIFACT_CACHE_KEY="$BUILDKITE_PIPELINE_SLUG-trunk-mac-arm64-package" + + mkdir -p "$TRUNK_ARTIFACT_CACHE_PATH" + cp "$ARTIFACT_FILE" "$TRUNK_ARTIFACT_CACHE_PATH/studio-app-trunk-mac-arm64.tar.gz" + save_cache "$TRUNK_ARTIFACT_CACHE_PATH" "$TRUNK_ARTIFACT_CACHE_KEY" +fi diff --git a/.buildkite/commands/run-metrics-tests.sh b/.buildkite/commands/run-metrics-tests.sh index 834a028f54..b3763849fa 100755 --- a/.buildkite/commands/run-metrics-tests.sh +++ b/.buildkite/commands/run-metrics-tests.sh @@ -21,6 +21,24 @@ echo '--- :package: Downloading prebuilt app artifacts' buildkite-agent artifact download "artifacts/studio-app-mac-arm64.tar.gz" . tar -xzf artifacts/studio-app-mac-arm64.tar.gz +if [ "${BUILDKITE_PULL_REQUEST}" != "false" ]; then + TRUNK_ARTIFACT_CACHE_KEY="$BUILDKITE_PIPELINE_SLUG-trunk-mac-arm64-package" + TRUNK_ARTIFACT_CACHE_PATH="artifacts/trunk-mac-arm64" + TRUNK_ARTIFACT_FILE="$TRUNK_ARTIFACT_CACHE_PATH/studio-app-trunk-mac-arm64.tar.gz" + TRUNK_EXTRACT_PATH="${PWD}/artifacts/trunk-mac-arm64-extract" + + echo '--- :package: Restoring latest cached trunk package artifact' + if restore_cache "$TRUNK_ARTIFACT_CACHE_KEY" && [ -f "$TRUNK_ARTIFACT_FILE" ]; then + rm -rf "$TRUNK_EXTRACT_PATH" + mkdir -p "$TRUNK_EXTRACT_PATH" + tar -xzf "$TRUNK_ARTIFACT_FILE" -C "$TRUNK_EXTRACT_PATH" + export COMPARE_PERF_PREBUILT_BRANCH_BASE=trunk + export COMPARE_PERF_PREBUILT_OUT_DIR_BASE="$TRUNK_EXTRACT_PATH/apps/studio/out" + else + echo "--- :warning: Could not restore cached trunk package artifact; compare-perf will build trunk" + fi +fi + # Detect if this is a PR or trunk push if [ "${BUILDKITE_PULL_REQUEST}" != "false" ]; then # PR context - compare against trunk diff --git a/tools/compare-perf/performance.ts b/tools/compare-perf/performance.ts index abe4973ae3..3a18c98930 100644 --- a/tools/compare-perf/performance.ts +++ b/tools/compare-perf/performance.ts @@ -29,6 +29,41 @@ interface PerformanceCommandOptions { testsBranch?: string; } +interface PrebuiltArtifacts { + branch?: string; + outDir?: string; +} + +const CURRENT_BRANCH_PREBUILT: PrebuiltArtifacts = { + branch: process.env.COMPARE_PERF_PREBUILT_BRANCH, + outDir: process.env.COMPARE_PERF_PREBUILT_OUT_DIR, +}; + +const BASE_BRANCH_PREBUILT: PrebuiltArtifacts = { + branch: process.env.COMPARE_PERF_PREBUILT_BRANCH_BASE, + outDir: process.env.COMPARE_PERF_PREBUILT_OUT_DIR_BASE, +}; + +function getPrebuiltOutDirForBranch( branch: string ): string | undefined { + if ( + CURRENT_BRANCH_PREBUILT.branch === branch && + CURRENT_BRANCH_PREBUILT.outDir && + fs.existsSync( CURRENT_BRANCH_PREBUILT.outDir ) + ) { + return CURRENT_BRANCH_PREBUILT.outDir; + } + + if ( + BASE_BRANCH_PREBUILT.branch === branch && + BASE_BRANCH_PREBUILT.outDir && + fs.existsSync( BASE_BRANCH_PREBUILT.outDir ) + ) { + return BASE_BRANCH_PREBUILT.outDir; + } + + return undefined; +} + /** * A logging helper for printing steps and their substeps. * @@ -114,8 +149,6 @@ export async function runPerformanceTests( ) { const runningInCI = !! process.env.CI || !! options.ci; const testRounds = options.rounds || 1; - const prebuiltBranch = process.env.COMPARE_PERF_PREBUILT_BRANCH; - const prebuiltOutDir = process.env.COMPARE_PERF_PREBUILT_OUT_DIR; // The default value doesn't work because commander provides an array. if ( branches.length === 0 ) { @@ -221,18 +254,11 @@ export async function runPerformanceTests( logAtIndent( 3, 'Checking out:', formats.success( branch ) ); await simpleGit( buildDir ).raw( 'checkout', branch ); - if ( - prebuiltBranch && - prebuiltOutDir && - branch === prebuiltBranch && - fs.existsSync( prebuiltOutDir ) - ) { + const prebuiltOutDir = getPrebuiltOutDirForBranch( branch ); + + if ( prebuiltOutDir ) { const prebuiltTargetDir = path.join( buildDir, 'out' ); - logAtIndent( - 3, - 'Using prebuilt app artifacts from:', - formats.success( prebuiltOutDir ) - ); + logAtIndent( 3, 'Using prebuilt app artifacts from:', formats.success( prebuiltOutDir ) ); if ( fs.existsSync( prebuiltTargetDir ) ) { fs.rmSync( prebuiltTargetDir, { recursive: true } ); From 14207e21f98673722e13ca10239340bf08d6800c Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 10:42:59 +0100 Subject: [PATCH 46/60] Improve Buildkite dependency flow --- .buildkite/pipeline.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index eb1aa540ae..deaa7a6e7a 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -8,7 +8,7 @@ env: steps: - label: ":package: Package App Artifacts on {{matrix.platform}}-{{matrix.arch}}" - key: package_app_artifacts + key: package_app_artifacts_{{matrix.platform}}_{{matrix.arch}} agents: queue: "{{matrix.platform}}" command: bash .buildkite/commands/package-app-for-ci.sh "{{matrix.platform}}" "{{matrix.arch}}" @@ -51,7 +51,7 @@ steps: - label: E2E Tests on {{matrix.platform}}-{{matrix.arch}} key: e2e_tests depends_on: - - step: package_app_artifacts + - step: package_app_artifacts_{{matrix.platform}}_{{matrix.arch}} command: bash .buildkite/commands/run-e2e-tests.sh "{{matrix.platform}}" "{{matrix.arch}}" artifact_paths: - test-results/**/*.zip @@ -78,7 +78,7 @@ steps: - label: ":chart_with_upwards_trend: Performance Metrics" key: metrics depends_on: - - step: package_app_artifacts + - step: package_app_artifacts_mac_arm64 agents: queue: mac command: bash .buildkite/commands/run-metrics-tests.sh @@ -101,7 +101,7 @@ steps: key: dev-mac depends_on: - step: input-dev-mac - - step: package_app_artifacts + - step: package_app_artifacts_mac_arm64 if: build.tag !~ /^v[0-9]+/ steps: - label: 🔨 Mac Dev Build - {{matrix}} @@ -166,7 +166,7 @@ steps: key: dev-windows depends_on: - step: input-dev-windows - - step: package_app_artifacts + - step: package_app_artifacts_windows_x64 if: build.tag !~ /^v[0-9]+/ steps: - label: 🔨 Windows Dev Build - {{matrix}} From b83038c6e7cbf4f1b6259d72a68017dd1b1ad977 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 10:43:06 +0100 Subject: [PATCH 47/60] Fix Windows E2E tests --- .buildkite/commands/build-for-windows.ps1 | 13 +++++++++---- .buildkite/commands/run-e2e-tests.sh | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/.buildkite/commands/build-for-windows.ps1 b/.buildkite/commands/build-for-windows.ps1 index c72c22486b..cab03fe9b7 100644 --- a/.buildkite/commands/build-for-windows.ps1 +++ b/.buildkite/commands/build-for-windows.ps1 @@ -55,14 +55,19 @@ $env:FILE_ARCHITECTURE=$Architecture Write-Host "--- :package: Preparing packaged app for architecture: $Architecture" if ($BuildType -eq $BUILD_TYPE_DEV) { - $artifactFile = "artifacts/studio-app-windows-$Architecture.tar.gz" - bash -lc "buildkite-agent artifact download `"$artifactFile`" ." + $artifactFilePattern = "*studio-app-windows-$Architecture.tar.gz" + bash -lc "buildkite-agent artifact download `"$artifactFilePattern`" ." if ($LastExitCode -eq 0) { + $artifactFile = Get-ChildItem -Path . -Recurse -File -Filter "studio-app-windows-$Architecture.tar.gz" | Select-Object -First 1 -ExpandProperty FullName + if (-not $artifactFile) { + Write-Host "Error: downloaded artifact but could not locate studio-app-windows-$Architecture.tar.gz" -ForegroundColor Red + Exit 1 + } Write-Host "Using prebuilt app artifact: $artifactFile" - tar -xzf $artifactFile + tar -xzf "$artifactFile" If ($LastExitCode -ne 0) { Exit $LastExitCode } } else { - Write-Host "Error: required prebuilt app artifact not found: $artifactFile" -ForegroundColor Red + Write-Host "Error: required prebuilt app artifact not found: $artifactFilePattern" -ForegroundColor Red Exit 1 } } else { diff --git a/.buildkite/commands/run-e2e-tests.sh b/.buildkite/commands/run-e2e-tests.sh index 3956e45d52..5d7bd7f903 100644 --- a/.buildkite/commands/run-e2e-tests.sh +++ b/.buildkite/commands/run-e2e-tests.sh @@ -13,13 +13,18 @@ bash .buildkite/commands/install-node-dependencies.sh export IS_DEV_BUILD=true -ARTIFACT_FILE="artifacts/studio-app-${PLATFORM}-${ARCH}.tar.gz" +ARTIFACT_PATTERN="*studio-app-${PLATFORM}-${ARCH}.tar.gz" -if ! buildkite-agent artifact download "$ARTIFACT_FILE" .; then - echo "^^^ +++ Required prebuilt app artifact not found: $ARTIFACT_FILE" +if ! buildkite-agent artifact download "$ARTIFACT_PATTERN" .; then + echo "^^^ +++ Required prebuilt app artifact not found: $ARTIFACT_PATTERN" exit 1 fi -echo "--- :package: Extracting prebuilt app artifacts ($PLATFORM-$ARCH)" +ARTIFACT_FILE=$(find . -type f -name "studio-app-${PLATFORM}-${ARCH}.tar.gz" | head -n 1) +if [ -z "$ARTIFACT_FILE" ]; then + echo "^^^ +++ Downloaded artifact but couldn't locate archive for ${PLATFORM}-${ARCH}" + exit 1 +fi +echo "--- :package: Extracting prebuilt app artifacts ($PLATFORM-$ARCH) from $ARTIFACT_FILE" tar -xzf "$ARTIFACT_FILE" echo '--- :playwright: Run End To End Tests' From 57a3827f349a7062b93883eb0b75a82bba28c8a1 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 10:46:35 +0100 Subject: [PATCH 48/60] Fix Buildkite config --- .buildkite/pipeline.yml | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index deaa7a6e7a..fcd0e062b5 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -7,19 +7,24 @@ env: IMAGE_ID: $IMAGE_ID steps: - - label: ":package: Package App Artifacts on {{matrix.platform}}-{{matrix.arch}}" - key: package_app_artifacts_{{matrix.platform}}_{{matrix.arch}} + - label: ":package: Package App Artifacts on mac-arm64" + key: package_app_artifacts_mac_arm64 agents: - queue: "{{matrix.platform}}" - command: bash .buildkite/commands/package-app-for-ci.sh "{{matrix.platform}}" "{{matrix.arch}}" + queue: mac + command: bash .buildkite/commands/package-app-for-ci.sh mac arm64 + artifact_paths: + - artifacts/studio-app-*.tar.gz + plugins: [$CI_TOOLKIT_PLUGIN, $NVM_PLUGIN] + if: build.branch == 'trunk' || build.tag =~ /^v[0-9]+/ || !build.pull_request.draft + + - label: ":package: Package App Artifacts on windows-x64" + key: package_app_artifacts_windows_x64 + agents: + queue: windows + command: bash .buildkite/commands/package-app-for-ci.sh windows x64 artifact_paths: - artifacts/studio-app-*.tar.gz plugins: [$CI_TOOLKIT_PLUGIN, $NVM_PLUGIN] - matrix: - setup: { platform: [], arch: [] } - adjustments: - - with: { platform: mac, arch: arm64 } - - with: { platform: windows, arch: x64 } if: build.branch == 'trunk' || build.tag =~ /^v[0-9]+/ || !build.pull_request.draft - label: Lint @@ -51,7 +56,7 @@ steps: - label: E2E Tests on {{matrix.platform}}-{{matrix.arch}} key: e2e_tests depends_on: - - step: package_app_artifacts_{{matrix.platform}}_{{matrix.arch}} + - step: "{{matrix.package_step}}" command: bash .buildkite/commands/run-e2e-tests.sh "{{matrix.platform}}" "{{matrix.arch}}" artifact_paths: - test-results/**/*.zip @@ -64,10 +69,16 @@ steps: # See https://playwright.dev/docs/ci#debugging-browser-launches DEBUG: "pw:browser" matrix: - setup: { platform: [], arch: [] } + setup: { platform: [], arch: [], package_step: [] } adjustments: - - with: { platform: mac, arch: arm64 } - - with: { platform: windows, arch: x64 } + - with: + platform: mac + arch: arm64 + package_step: package_app_artifacts_mac_arm64 + - with: + platform: windows + arch: x64 + package_step: package_app_artifacts_windows_x64 # Skip E2E tests on draft PRs to save CI resources # Tests will run automatically when PR is marked ready for review if: build.branch == 'trunk' || build.tag =~ /^v[0-9]+/ || !build.pull_request.draft From af6607f791c2ed9d0e72432c613aa532dbb7acb6 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 10:49:13 +0100 Subject: [PATCH 49/60] No placeholders in `depends_on` --- .buildkite/pipeline.yml | 48 ++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index fcd0e062b5..b0c31272b2 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -50,41 +50,49 @@ steps: - github_commit_status: context: Unit Tests - # E2E tests run on supported platform/architecture combinations. - # - mac-arm64: Native on Apple Silicon agents - # - windows-x64: Native on x64 agents - - label: E2E Tests on {{matrix.platform}}-{{matrix.arch}} - key: e2e_tests + - label: E2E Tests on mac-arm64 + key: e2e_tests_mac_arm64 depends_on: - - step: "{{matrix.package_step}}" - command: bash .buildkite/commands/run-e2e-tests.sh "{{matrix.platform}}" "{{matrix.arch}}" + - step: package_app_artifacts_mac_arm64 + command: bash .buildkite/commands/run-e2e-tests.sh mac arm64 artifact_paths: - test-results/**/*.zip - test-results/**/*.png - test-results/**/*error-context.md plugins: [$CI_TOOLKIT_PLUGIN, $NVM_PLUGIN] agents: - queue: "{{matrix.platform}}" + queue: mac + env: + # See https://playwright.dev/docs/ci#debugging-browser-launches + DEBUG: "pw:browser" + # Skip E2E tests on draft PRs to save CI resources + # Tests will run automatically when PR is marked ready for review + if: build.branch == 'trunk' || build.tag =~ /^v[0-9]+/ || !build.pull_request.draft + notify: + - github_commit_status: + context: E2E Tests (mac-arm64) + + - label: E2E Tests on windows-x64 + key: e2e_tests_windows_x64 + depends_on: + - step: package_app_artifacts_windows_x64 + command: bash .buildkite/commands/run-e2e-tests.sh windows x64 + artifact_paths: + - test-results/**/*.zip + - test-results/**/*.png + - test-results/**/*error-context.md + plugins: [$CI_TOOLKIT_PLUGIN, $NVM_PLUGIN] + agents: + queue: windows env: # See https://playwright.dev/docs/ci#debugging-browser-launches DEBUG: "pw:browser" - matrix: - setup: { platform: [], arch: [], package_step: [] } - adjustments: - - with: - platform: mac - arch: arm64 - package_step: package_app_artifacts_mac_arm64 - - with: - platform: windows - arch: x64 - package_step: package_app_artifacts_windows_x64 # Skip E2E tests on draft PRs to save CI resources # Tests will run automatically when PR is marked ready for review if: build.branch == 'trunk' || build.tag =~ /^v[0-9]+/ || !build.pull_request.draft notify: - github_commit_status: - context: E2E Tests + context: E2E Tests (windows-x64) - label: ":chart_with_upwards_trend: Performance Metrics" key: metrics From e2408880664424f6b72a8a20f4941cae27d415bf Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 10:51:13 +0100 Subject: [PATCH 50/60] YAML primitives to reduce repetition --- .buildkite/pipeline.yml | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index b0c31272b2..f3a3d2ff3e 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -7,7 +7,8 @@ env: IMAGE_ID: $IMAGE_ID steps: - - label: ":package: Package App Artifacts on mac-arm64" + - &package_artifacts_common + label: ":package: Package App Artifacts on mac-arm64" key: package_app_artifacts_mac_arm64 agents: queue: mac @@ -17,15 +18,12 @@ steps: plugins: [$CI_TOOLKIT_PLUGIN, $NVM_PLUGIN] if: build.branch == 'trunk' || build.tag =~ /^v[0-9]+/ || !build.pull_request.draft - - label: ":package: Package App Artifacts on windows-x64" + - <<: *package_artifacts_common + label: ":package: Package App Artifacts on windows-x64" key: package_app_artifacts_windows_x64 agents: queue: windows command: bash .buildkite/commands/package-app-for-ci.sh windows x64 - artifact_paths: - - artifacts/studio-app-*.tar.gz - plugins: [$CI_TOOLKIT_PLUGIN, $NVM_PLUGIN] - if: build.branch == 'trunk' || build.tag =~ /^v[0-9]+/ || !build.pull_request.draft - label: Lint agents: @@ -50,7 +48,8 @@ steps: - github_commit_status: context: Unit Tests - - label: E2E Tests on mac-arm64 + - &e2e_tests_common + label: E2E Tests on mac-arm64 key: e2e_tests_mac_arm64 depends_on: - step: package_app_artifacts_mac_arm64 @@ -72,24 +71,14 @@ steps: - github_commit_status: context: E2E Tests (mac-arm64) - - label: E2E Tests on windows-x64 + - <<: *e2e_tests_common + label: E2E Tests on windows-x64 key: e2e_tests_windows_x64 depends_on: - step: package_app_artifacts_windows_x64 command: bash .buildkite/commands/run-e2e-tests.sh windows x64 - artifact_paths: - - test-results/**/*.zip - - test-results/**/*.png - - test-results/**/*error-context.md - plugins: [$CI_TOOLKIT_PLUGIN, $NVM_PLUGIN] agents: queue: windows - env: - # See https://playwright.dev/docs/ci#debugging-browser-launches - DEBUG: "pw:browser" - # Skip E2E tests on draft PRs to save CI resources - # Tests will run automatically when PR is marked ready for review - if: build.branch == 'trunk' || build.tag =~ /^v[0-9]+/ || !build.pull_request.draft notify: - github_commit_status: context: E2E Tests (windows-x64) From 344eafe6596f53802247d843cc96e5f3bf5159a0 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 11:19:54 +0100 Subject: [PATCH 51/60] Fixes --- .buildkite/pipeline.yml | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index f3a3d2ff3e..ecaa319383 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -25,6 +25,14 @@ steps: queue: windows command: bash .buildkite/commands/package-app-for-ci.sh windows x64 + - <<: *package_artifacts_common + label: ":package: Package App Artifacts on mac-x64" + key: package_app_artifacts_mac_x64 + command: bash .buildkite/commands/package-app-for-ci.sh mac x64 + depends_on: + - step: input-dev-mac + if: build.tag !~ /^v[0-9]+/ && build.branch != 'trunk' + - label: Lint agents: queue: mac @@ -110,6 +118,7 @@ steps: depends_on: - step: input-dev-mac - step: package_app_artifacts_mac_arm64 + - step: package_app_artifacts_mac_x64 if: build.tag !~ /^v[0-9]+/ steps: - label: 🔨 Mac Dev Build - {{matrix}} @@ -125,14 +134,14 @@ steps: export IS_DEV_BUILD=true ARTIFACT_FILE="artifacts/studio-app-mac-{{matrix}}.tar.gz" - if buildkite-agent artifact download "$ARTIFACT_FILE" .; then - echo "--- :package: Extracting prebuilt app artifacts (mac-{{matrix}})" - tar -xzf "$ARTIFACT_FILE" - else + if ! buildkite-agent artifact download "$ARTIFACT_FILE" .; then echo "^^^ +++ Required prebuilt app artifact not found: $ARTIFACT_FILE" exit 1 fi + echo "--- :package: Extracting prebuilt app artifacts (mac-{{matrix}}) from $ARTIFACT_FILE" + tar -xzf "$ARTIFACT_FILE" + echo "--- :node: Building installer artifacts" npm run make:macos-{{matrix}} From 890d06698efd8c3deee294aa2b7409d1ac2d3d24 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 12:35:54 +0100 Subject: [PATCH 52/60] Use pattern instead of path to download artifact --- .buildkite/pipeline.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index ecaa319383..5fcdff15fc 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -133,12 +133,20 @@ steps: export IS_DEV_BUILD=true - ARTIFACT_FILE="artifacts/studio-app-mac-{{matrix}}.tar.gz" - if ! buildkite-agent artifact download "$ARTIFACT_FILE" .; then - echo "^^^ +++ Required prebuilt app artifact not found: $ARTIFACT_FILE" + ARTIFACT_PATTERN="*studio-app-mac-{{matrix}}.tar.gz" + printf 'Artifact search query: <%s>\n' "$ARTIFACT_PATTERN" + if ! buildkite-agent artifact download "$ARTIFACT_PATTERN" .; then + echo "^^^ +++ Required prebuilt app artifact not found: $ARTIFACT_PATTERN" exit 1 fi + ARTIFACT_FILE=$(find . -type f -name "studio-app-mac-{{matrix}}.tar.gz" | head -n 1) + if [ -z "$ARTIFACT_FILE" ]; then + echo "^^^ +++ Downloaded artifact but couldn't locate archive for mac-{{matrix}}" + exit 1 + fi + + printf 'Resolved downloaded artifact: <%s>\n' "$ARTIFACT_FILE" echo "--- :package: Extracting prebuilt app artifacts (mac-{{matrix}}) from $ARTIFACT_FILE" tar -xzf "$ARTIFACT_FILE" From 7cb849cfd379868143899a75701283ad5f10b83a Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 13:02:24 +0100 Subject: [PATCH 53/60] Objects instead of strings --- .buildkite/pipeline.yml | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 5fcdff15fc..716f6e6aa6 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -121,7 +121,7 @@ steps: - step: package_app_artifacts_mac_x64 if: build.tag !~ /^v[0-9]+/ steps: - - label: 🔨 Mac Dev Build - {{matrix}} + - label: 🔨 Mac Dev Build - {{matrix.arch}} agents: queue: mac command: | @@ -133,44 +133,44 @@ steps: export IS_DEV_BUILD=true - ARTIFACT_PATTERN="*studio-app-mac-{{matrix}}.tar.gz" + ARTIFACT_PATTERN="*studio-app-mac-{{matrix.arch}}.tar.gz" printf 'Artifact search query: <%s>\n' "$ARTIFACT_PATTERN" if ! buildkite-agent artifact download "$ARTIFACT_PATTERN" .; then echo "^^^ +++ Required prebuilt app artifact not found: $ARTIFACT_PATTERN" exit 1 fi - ARTIFACT_FILE=$(find . -type f -name "studio-app-mac-{{matrix}}.tar.gz" | head -n 1) + ARTIFACT_FILE=$(find . -type f -name "studio-app-mac-{{matrix.arch}}.tar.gz" | head -n 1) if [ -z "$ARTIFACT_FILE" ]; then - echo "^^^ +++ Downloaded artifact but couldn't locate archive for mac-{{matrix}}" + echo "^^^ +++ Downloaded artifact but couldn't locate archive for mac-{{matrix.arch}}" exit 1 fi printf 'Resolved downloaded artifact: <%s>\n' "$ARTIFACT_FILE" - echo "--- :package: Extracting prebuilt app artifacts (mac-{{matrix}}) from $ARTIFACT_FILE" + echo "--- :package: Extracting prebuilt app artifacts (mac-{{matrix.arch}}) from $ARTIFACT_FILE" tar -xzf "$ARTIFACT_FILE" echo "--- :node: Building installer artifacts" - npm run make:macos-{{matrix}} + npm run make:macos-{{matrix.arch}} # Local trial and error show this needs to run before the DMG generation (obviously) but after the binary has been built echo "--- :hammer: Rebuild fs-attr if necessary before generating DMG" - case {{matrix}} in + case {{matrix.arch}} in x64) - echo "Rebuilding fs-xattr for {{matrix}} architecture" + echo "Rebuilding fs-xattr for {{matrix.arch}} architecture" npm rebuild fs-xattr --cpu universal ;; arm64) echo "No need to rebuild fs-xattr because it works out of the box on Apple Silicon" ;; *) - echo "^^^ +++ Unexpected architecture {{matrix}}" + echo "^^^ +++ Unexpected architecture {{matrix.arch}}" exit 1 ;; esac echo "--- :node: Packaging in DMG" - npm run make:dmg-{{matrix}} + npm run make:dmg-{{matrix.arch}} echo "--- 📃 Notarizing Binary" bundle exec fastlane notarize_binary @@ -179,8 +179,10 @@ steps: - apps/studio/out/**/*.app.zip - apps/studio/out/*.dmg matrix: - - x64 - - arm64 + setup: + arch: + - x64 + - arm64 - input: "🚦 Build for Windows?" prompt: "Do you want to build Windows dev binaries for this PR?" From 640665cd9638222dd5278256e142641b8aed204c Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 13:09:02 +0100 Subject: [PATCH 54/60] Cache node_modules --- .../commands/install-node-dependencies.sh | 60 ++++++++++++------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/.buildkite/commands/install-node-dependencies.sh b/.buildkite/commands/install-node-dependencies.sh index f14b99eb6f..adf5a4949b 100755 --- a/.buildkite/commands/install-node-dependencies.sh +++ b/.buildkite/commands/install-node-dependencies.sh @@ -5,7 +5,9 @@ set -eu PLATFORM=$(uname -s) ARCHITECTURE=$(uname -m) NODE_VERSION=$(node --version) +NPM_VERSION=$(npm --version) PACKAGE_HASH=$(hash_file package-lock.json) +IMAGE_KEY=${IMAGE_ID:-noimage} PATCHES_HASH=nopatch if [ -d apps/cli/patches ] || [ -d apps/studio/patches ]; then @@ -14,7 +16,9 @@ if [ -d apps/cli/patches ] || [ -d apps/studio/patches ]; then PATCHES_HASH="${CLI_PATCHES_HASH}-${STUDIO_PATCHES_HASH}" fi -CACHEKEY="$BUILDKITE_PIPELINE_SLUG-npm-$PLATFORM-$ARCHITECTURE-node-$NODE_VERSION-$PACKAGE_HASH-$PATCHES_HASH" +BASE_CACHE_KEY="$BUILDKITE_PIPELINE_SLUG-node-deps-$PLATFORM-$ARCHITECTURE-image-$IMAGE_KEY-node-$NODE_VERSION-npm-$NPM_VERSION-$PACKAGE_HASH-$PATCHES_HASH" +NPM_CACHE_KEY="$BASE_CACHE_KEY-npm-cache" +NODE_MODULES_CACHE_KEY="$BASE_CACHE_KEY-node-modules" LOCAL_NPM_CACHE=./vendor/npm mkdir -p $LOCAL_NPM_CACHE @@ -23,36 +27,48 @@ npm set cache $LOCAL_NPM_CACHE echo "npm cache set to $(npm get cache)" echo "--- :npm: Restore npm cache if present" -restore_cache "$CACHEKEY" +restore_cache "$NPM_CACHE_KEY" -echo "--- :npm: Install Node dependencies" +echo "--- :npm: Restore node_modules cache if present" +NODE_MODULES_CACHE_HIT=false +if restore_cache "$NODE_MODULES_CACHE_KEY" && [ -d node_modules ]; then + NODE_MODULES_CACHE_HIT=true +fi -MAX_SOCKETS=15 # Default value from npm +if [ "$NODE_MODULES_CACHE_HIT" = true ]; then + echo "--- :npm: Reusing cached node_modules" +else + echo "--- :npm: Install Node dependencies" -# To avoid constant ECONNRESET errors a limit is set for Linux, -# as this is not happening with the Mac jobs. -# This issue is being tracked here: -# https://github.com/npm/cli/issues/4652 -if [ "$PLATFORM" = "Linux" ]; then - MAX_SOCKETS=1 -fi + MAX_SOCKETS=15 # Default value from npm + + # To avoid constant ECONNRESET errors a limit is set for Linux, + # as this is not happening with the Mac jobs. + # This issue is being tracked here: + # https://github.com/npm/cli/issues/4652 + if [ "$PLATFORM" = "Linux" ]; then + MAX_SOCKETS=1 + fi -npm ci \ - --unsafe-perm \ - --prefer-offline \ - --no-audit \ - --no-progress \ - --maxsockets "$MAX_SOCKETS" \ - "$@" + npm ci \ + --prefer-offline \ + --no-audit \ + --no-progress \ + --maxsockets "$MAX_SOCKETS" \ + "$@" +fi echo "--- :npm: Save cache if necessary" -# Notice that we don't cache the local node_modules. -# Those get regenerated by npm ci as per Node reccomendations. -# What we are caching is the root npm folder, which stores pacakge downloads so they are available if the package.json resolution demands them. +# We cache both npm's download cache and root node_modules with a strict +# environment+lockfile key. node_modules is saved only after npm ci runs. # # npm stores temporary files in ~/.npm that we don't want to extract because they might run into naming conflicts. # So, before archiving it, we remove those tmp files. # # Example: https://buildkite.com/automattic/gutenberg-mobile/builds/8857#018e37eb-7afc-4280-b736-cba76f02f1a3/524 rm -rf "$LOCAL_NPM_CACHE/_cacache/tmp" -save_cache "$LOCAL_NPM_CACHE" "$CACHEKEY" +save_cache "$LOCAL_NPM_CACHE" "$NPM_CACHE_KEY" + +if [ "$NODE_MODULES_CACHE_HIT" = false ]; then + save_cache node_modules "$NODE_MODULES_CACHE_KEY" +fi From 75c280e8afd43f84048ecd2c881328eb0794d634 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 13:19:26 +0100 Subject: [PATCH 55/60] Added build-for-mac.sh --- .buildkite/commands/build-for-mac.sh | 67 ++++++++++++++++ .buildkite/pipeline.yml | 113 ++++----------------------- 2 files changed, 84 insertions(+), 96 deletions(-) create mode 100644 .buildkite/commands/build-for-mac.sh diff --git a/.buildkite/commands/build-for-mac.sh b/.buildkite/commands/build-for-mac.sh new file mode 100644 index 0000000000..5ba289a189 --- /dev/null +++ b/.buildkite/commands/build-for-mac.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +set -euo pipefail + +BUILD_TYPE=${1:?Expected build type as first parameter (dev|release)} +ARCH=${2:?Expected architecture as second parameter (x64|arm64)} + +if [ "$BUILD_TYPE" != "dev" ] && [ "$BUILD_TYPE" != "release" ]; then + echo "Unknown build type: $BUILD_TYPE" + exit 1 +fi + +if [ "$ARCH" != "x64" ] && [ "$ARCH" != "arm64" ]; then + echo "Unknown architecture: $ARCH" + exit 1 +fi + +.buildkite/commands/prepare-environment.sh +.buildkite/commands/install-node-dependencies.sh + +if [ "$BUILD_TYPE" = "dev" ]; then + node ./scripts/prepare-dev-build-version.mjs + export IS_DEV_BUILD=true + + ARTIFACT_PATTERN="*studio-app-mac-$ARCH.tar.gz" + printf 'Artifact search query: <%s>\n' "$ARTIFACT_PATTERN" + if ! buildkite-agent artifact download "$ARTIFACT_PATTERN" .; then + echo "^^^ +++ Required prebuilt app artifact not found: $ARTIFACT_PATTERN" + exit 1 + fi + + ARTIFACT_FILE=$(find . -type f -name "studio-app-mac-$ARCH.tar.gz" | head -n 1) + if [ -z "$ARTIFACT_FILE" ]; then + echo "^^^ +++ Downloaded artifact but couldn't locate archive for mac-$ARCH" + exit 1 + fi + + printf 'Resolved downloaded artifact: <%s>\n' "$ARTIFACT_FILE" + echo "--- :package: Extracting prebuilt app artifacts (mac-$ARCH) from $ARTIFACT_FILE" + tar -xzf "$ARTIFACT_FILE" +else + node ./scripts/confirm-tag-matches-version.mjs + + echo "--- :package: Packaging app" + npm run "package:macos-$ARCH" +fi + +echo "--- :node: Building installer artifacts" +npm run "make:macos-$ARCH" + +# Local trial and error show this needs to run before DMG generation, +# but after the binary has been built. +echo "--- :hammer: Rebuild fs-attr if necessary before generating DMG" +case "$ARCH" in + x64) + echo "Rebuilding fs-xattr for $ARCH architecture" + npm rebuild fs-xattr --cpu universal + ;; + arm64) + echo "No need to rebuild fs-xattr because it works out of the box on Apple Silicon" + ;; +esac + +echo "--- :node: Packaging in DMG" +npm run "make:dmg-$ARCH" + +echo "--- 📃 Notarizing Binary" +bundle exec fastlane notarize_binary diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 716f6e6aa6..fc09ec5c86 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -121,68 +121,19 @@ steps: - step: package_app_artifacts_mac_x64 if: build.tag !~ /^v[0-9]+/ steps: - - label: 🔨 Mac Dev Build - {{matrix.arch}} + - &mac_build_common + label: 🔨 Mac Dev Build - x64 agents: queue: mac - command: | - .buildkite/commands/prepare-environment.sh - - .buildkite/commands/install-node-dependencies.sh - - node ./scripts/prepare-dev-build-version.mjs - - export IS_DEV_BUILD=true - - ARTIFACT_PATTERN="*studio-app-mac-{{matrix.arch}}.tar.gz" - printf 'Artifact search query: <%s>\n' "$ARTIFACT_PATTERN" - if ! buildkite-agent artifact download "$ARTIFACT_PATTERN" .; then - echo "^^^ +++ Required prebuilt app artifact not found: $ARTIFACT_PATTERN" - exit 1 - fi - - ARTIFACT_FILE=$(find . -type f -name "studio-app-mac-{{matrix.arch}}.tar.gz" | head -n 1) - if [ -z "$ARTIFACT_FILE" ]; then - echo "^^^ +++ Downloaded artifact but couldn't locate archive for mac-{{matrix.arch}}" - exit 1 - fi - - printf 'Resolved downloaded artifact: <%s>\n' "$ARTIFACT_FILE" - echo "--- :package: Extracting prebuilt app artifacts (mac-{{matrix.arch}}) from $ARTIFACT_FILE" - tar -xzf "$ARTIFACT_FILE" - - echo "--- :node: Building installer artifacts" - npm run make:macos-{{matrix.arch}} - - # Local trial and error show this needs to run before the DMG generation (obviously) but after the binary has been built - echo "--- :hammer: Rebuild fs-attr if necessary before generating DMG" - case {{matrix.arch}} in - x64) - echo "Rebuilding fs-xattr for {{matrix.arch}} architecture" - npm rebuild fs-xattr --cpu universal - ;; - arm64) - echo "No need to rebuild fs-xattr because it works out of the box on Apple Silicon" - ;; - *) - echo "^^^ +++ Unexpected architecture {{matrix.arch}}" - exit 1 - ;; - esac - - echo "--- :node: Packaging in DMG" - npm run make:dmg-{{matrix.arch}} - - echo "--- 📃 Notarizing Binary" - bundle exec fastlane notarize_binary + command: bash .buildkite/commands/build-for-mac.sh dev x64 plugins: [$CI_TOOLKIT_PLUGIN, $NVM_PLUGIN] artifact_paths: - apps/studio/out/**/*.app.zip - apps/studio/out/*.dmg - matrix: - setup: - arch: - - x64 - - arm64 + + - <<: *mac_build_common + label: 🔨 Mac Dev Build - arm64 + command: bash .buildkite/commands/build-for-mac.sh dev arm64 - input: "🚦 Build for Windows?" prompt: "Do you want to build Windows dev binaries for this PR?" @@ -244,49 +195,19 @@ steps: - group: 📦 Build for Mac key: release-mac steps: - - label: 🔨 Mac Release Build - {{matrix}} + - <<: *mac_build_common + label: 🔨 Mac Release Build - x64 agents: queue: mac - command: | - .buildkite/commands/prepare-environment.sh - - .buildkite/commands/install-node-dependencies.sh - node ./scripts/confirm-tag-matches-version.mjs - - echo "--- :package: Packaging app" - npm run package:macos-{{matrix}} - - echo "--- :node: Building installer artifacts" - npm run make:macos-{{matrix}} - - # Local trial and error show this needs to run before the DMG generation (obviously) but after the binary has been built - echo "--- :hammer: Rebuild fs-attr if necessary before generating DMG" - case {{matrix}} in - x64) - echo "Rebuilding fs-xattr for {{matrix}} architecture" - npm rebuild fs-xattr --cpu universal - ;; - arm64) - echo "No need to rebuild fs-xattr because it works out of the box on Apple Silicon" - ;; - *) - echo "^^^ +++ Unexpected architecture {{matrix}}" - exit 1 - ;; - esac - - echo "--- :node: Packaging in DMG" - npm run make:dmg-{{matrix}} - - echo "--- 📃 Notarizing Binary" - bundle exec fastlane notarize_binary + command: bash .buildkite/commands/build-for-mac.sh release x64 plugins: [$CI_TOOLKIT_PLUGIN, $NVM_PLUGIN] - artifact_paths: - - apps/studio/out/**/*.app.zip - - apps/studio/out/*.dmg - matrix: - - x64 - - arm64 + notify: + - github_commit_status: + context: All Mac Release Builds + + - <<: *mac_build_common + label: 🔨 Mac Release Build - arm64 + command: bash .buildkite/commands/build-for-mac.sh release arm64 notify: - github_commit_status: context: All Mac Release Builds From 408b9ae68cbafbb30ead5f7751024c342deb6d4b Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 13:32:57 +0100 Subject: [PATCH 56/60] Shorter cache key --- .buildkite/commands/install-node-dependencies.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.buildkite/commands/install-node-dependencies.sh b/.buildkite/commands/install-node-dependencies.sh index adf5a4949b..f8fefd22f2 100755 --- a/.buildkite/commands/install-node-dependencies.sh +++ b/.buildkite/commands/install-node-dependencies.sh @@ -13,10 +13,10 @@ PATCHES_HASH=nopatch if [ -d apps/cli/patches ] || [ -d apps/studio/patches ]; then CLI_PATCHES_HASH=$( [ -d apps/cli/patches ] && hash_directory apps/cli/patches || echo none ) STUDIO_PATCHES_HASH=$( [ -d apps/studio/patches ] && hash_directory apps/studio/patches || echo none ) - PATCHES_HASH="${CLI_PATCHES_HASH}-${STUDIO_PATCHES_HASH}" + PATCHES_HASH=$(echo "${CLI_PATCHES_HASH}-${STUDIO_PATCHES_HASH}" | shasum -a 256 | awk '{print $1}') fi -BASE_CACHE_KEY="$BUILDKITE_PIPELINE_SLUG-node-deps-$PLATFORM-$ARCHITECTURE-image-$IMAGE_KEY-node-$NODE_VERSION-npm-$NPM_VERSION-$PACKAGE_HASH-$PATCHES_HASH" +BASE_CACHE_KEY="$BUILDKITE_PIPELINE_SLUG-$PLATFORM-$ARCHITECTURE-image-$IMAGE_KEY-node-$NODE_VERSION-$PACKAGE_HASH-$PATCHES_HASH" NPM_CACHE_KEY="$BASE_CACHE_KEY-npm-cache" NODE_MODULES_CACHE_KEY="$BASE_CACHE_KEY-node-modules" From 95a189ffababee5d679583679e96605c085aeba5 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 14:36:04 +0100 Subject: [PATCH 57/60] Respect target arch in install-node-dependencies.sh --- .buildkite/commands/build-for-mac.sh | 1 + .buildkite/commands/build-for-windows.ps1 | 7 ++++--- .buildkite/commands/install-node-dependencies.sh | 2 +- .buildkite/commands/package-app-for-ci.sh | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.buildkite/commands/build-for-mac.sh b/.buildkite/commands/build-for-mac.sh index 5ba289a189..b753ab1465 100644 --- a/.buildkite/commands/build-for-mac.sh +++ b/.buildkite/commands/build-for-mac.sh @@ -15,6 +15,7 @@ if [ "$ARCH" != "x64" ] && [ "$ARCH" != "arm64" ]; then fi .buildkite/commands/prepare-environment.sh +export FILE_ARCHITECTURE="$ARCH" .buildkite/commands/install-node-dependencies.sh if [ "$BUILD_TYPE" = "dev" ]; then diff --git a/.buildkite/commands/build-for-windows.ps1 b/.buildkite/commands/build-for-windows.ps1 index cab03fe9b7..cddfe897f8 100644 --- a/.buildkite/commands/build-for-windows.ps1 +++ b/.buildkite/commands/build-for-windows.ps1 @@ -32,6 +32,10 @@ if ($Architecture -notin $VALID_ARCHITECTURES) { & "setup_windows_code_signing.ps1" If ($LastExitCode -ne 0) { Exit $LastExitCode } +# Set architecture environment variable before dependency install so cache key +# matches the target build architecture. +$env:FILE_ARCHITECTURE=$Architecture + Write-Host "--- :npm: Installing Node dependencies" bash .buildkite/commands/install-node-dependencies.sh If ($LastExitCode -ne 0) { Exit $LastExitCode } @@ -50,9 +54,6 @@ if ($BuildType -eq $BUILD_TYPE_DEV) { If ($LastExitCode -ne 0) { Exit $LastExitCode } } -# Set architecture environment variable for AppX packaging -$env:FILE_ARCHITECTURE=$Architecture - Write-Host "--- :package: Preparing packaged app for architecture: $Architecture" if ($BuildType -eq $BUILD_TYPE_DEV) { $artifactFilePattern = "*studio-app-windows-$Architecture.tar.gz" diff --git a/.buildkite/commands/install-node-dependencies.sh b/.buildkite/commands/install-node-dependencies.sh index f8fefd22f2..d4c67a9f70 100755 --- a/.buildkite/commands/install-node-dependencies.sh +++ b/.buildkite/commands/install-node-dependencies.sh @@ -3,7 +3,7 @@ set -eu PLATFORM=$(uname -s) -ARCHITECTURE=$(uname -m) +ARCHITECTURE=${FILE_ARCHITECTURE:-$(uname -m)} NODE_VERSION=$(node --version) NPM_VERSION=$(npm --version) PACKAGE_HASH=$(hash_file package-lock.json) diff --git a/.buildkite/commands/package-app-for-ci.sh b/.buildkite/commands/package-app-for-ci.sh index 9311f79dc7..5458a1d80c 100755 --- a/.buildkite/commands/package-app-for-ci.sh +++ b/.buildkite/commands/package-app-for-ci.sh @@ -5,6 +5,7 @@ PLATFORM=${1:?Expected platform to be provided as first parameter} ARCH=${2:?Expected architecture to be provided as second parameter} echo "--- :package: Install deps" +export FILE_ARCHITECTURE="$ARCH" bash .buildkite/commands/install-node-dependencies.sh export IS_DEV_BUILD=true From e51a4e318e98b73bf4dba233018ab6a20f8428e6 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 14:36:43 +0100 Subject: [PATCH 58/60] More fine-grained Buildkite dependencies --- .buildkite/pipeline.yml | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index fc09ec5c86..cf7c1b2a25 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -117,12 +117,11 @@ steps: key: dev-mac depends_on: - step: input-dev-mac - - step: package_app_artifacts_mac_arm64 - - step: package_app_artifacts_mac_x64 if: build.tag !~ /^v[0-9]+/ steps: - - &mac_build_common - label: 🔨 Mac Dev Build - x64 + - label: 🔨 Mac Dev Build - x64 + depends_on: + - step: package_app_artifacts_mac_x64 agents: queue: mac command: bash .buildkite/commands/build-for-mac.sh dev x64 @@ -131,9 +130,16 @@ steps: - apps/studio/out/**/*.app.zip - apps/studio/out/*.dmg - - <<: *mac_build_common - label: 🔨 Mac Dev Build - arm64 + - label: 🔨 Mac Dev Build - arm64 + depends_on: + - step: package_app_artifacts_mac_arm64 + agents: + queue: mac command: bash .buildkite/commands/build-for-mac.sh dev arm64 + plugins: [$CI_TOOLKIT_PLUGIN, $NVM_PLUGIN] + artifact_paths: + - apps/studio/out/**/*.app.zip + - apps/studio/out/*.dmg - input: "🚦 Build for Windows?" prompt: "Do you want to build Windows dev binaries for this PR?" @@ -195,7 +201,7 @@ steps: - group: 📦 Build for Mac key: release-mac steps: - - <<: *mac_build_common + - &mac_build_common label: 🔨 Mac Release Build - x64 agents: queue: mac From 40246690da516fd82a834ca91c29c0fb82465399 Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 14:53:27 +0100 Subject: [PATCH 59/60] Bust cache, include devDependencies --- .buildkite/commands/install-node-dependencies.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.buildkite/commands/install-node-dependencies.sh b/.buildkite/commands/install-node-dependencies.sh index d4c67a9f70..d724075e76 100755 --- a/.buildkite/commands/install-node-dependencies.sh +++ b/.buildkite/commands/install-node-dependencies.sh @@ -8,6 +8,7 @@ NODE_VERSION=$(node --version) NPM_VERSION=$(npm --version) PACKAGE_HASH=$(hash_file package-lock.json) IMAGE_KEY=${IMAGE_ID:-noimage} +CACHE_FORMAT_VERSION=v2 PATCHES_HASH=nopatch if [ -d apps/cli/patches ] || [ -d apps/studio/patches ]; then @@ -16,7 +17,7 @@ if [ -d apps/cli/patches ] || [ -d apps/studio/patches ]; then PATCHES_HASH=$(echo "${CLI_PATCHES_HASH}-${STUDIO_PATCHES_HASH}" | shasum -a 256 | awk '{print $1}') fi -BASE_CACHE_KEY="$BUILDKITE_PIPELINE_SLUG-$PLATFORM-$ARCHITECTURE-image-$IMAGE_KEY-node-$NODE_VERSION-$PACKAGE_HASH-$PATCHES_HASH" +BASE_CACHE_KEY="$BUILDKITE_PIPELINE_SLUG-$CACHE_FORMAT_VERSION-$PLATFORM-$ARCHITECTURE-image-$IMAGE_KEY-node-$NODE_VERSION-npm-$NPM_VERSION-$PACKAGE_HASH-$PATCHES_HASH" NPM_CACHE_KEY="$BASE_CACHE_KEY-npm-cache" NODE_MODULES_CACHE_KEY="$BASE_CACHE_KEY-node-modules" @@ -51,6 +52,7 @@ else fi npm ci \ + --include=dev \ --prefer-offline \ --no-audit \ --no-progress \ From 29973faceaad9ca26650b039bad311ea3f1566ce Mon Sep 17 00:00:00 2001 From: Fredrik Rombach Ekelund Date: Tue, 17 Feb 2026 15:39:19 +0100 Subject: [PATCH 60/60] Revert node_modules caching --- .../commands/install-node-dependencies.sh | 50 ++++++------------- 1 file changed, 16 insertions(+), 34 deletions(-) diff --git a/.buildkite/commands/install-node-dependencies.sh b/.buildkite/commands/install-node-dependencies.sh index d724075e76..d03008b0a0 100755 --- a/.buildkite/commands/install-node-dependencies.sh +++ b/.buildkite/commands/install-node-dependencies.sh @@ -19,7 +19,6 @@ fi BASE_CACHE_KEY="$BUILDKITE_PIPELINE_SLUG-$CACHE_FORMAT_VERSION-$PLATFORM-$ARCHITECTURE-image-$IMAGE_KEY-node-$NODE_VERSION-npm-$NPM_VERSION-$PACKAGE_HASH-$PATCHES_HASH" NPM_CACHE_KEY="$BASE_CACHE_KEY-npm-cache" -NODE_MODULES_CACHE_KEY="$BASE_CACHE_KEY-node-modules" LOCAL_NPM_CACHE=./vendor/npm mkdir -p $LOCAL_NPM_CACHE @@ -30,47 +29,30 @@ echo "npm cache set to $(npm get cache)" echo "--- :npm: Restore npm cache if present" restore_cache "$NPM_CACHE_KEY" -echo "--- :npm: Restore node_modules cache if present" -NODE_MODULES_CACHE_HIT=false -if restore_cache "$NODE_MODULES_CACHE_KEY" && [ -d node_modules ]; then - NODE_MODULES_CACHE_HIT=true -fi - -if [ "$NODE_MODULES_CACHE_HIT" = true ]; then - echo "--- :npm: Reusing cached node_modules" -else - echo "--- :npm: Install Node dependencies" +echo "--- :npm: Install Node dependencies" - MAX_SOCKETS=15 # Default value from npm +MAX_SOCKETS=15 # Default value from npm - # To avoid constant ECONNRESET errors a limit is set for Linux, - # as this is not happening with the Mac jobs. - # This issue is being tracked here: - # https://github.com/npm/cli/issues/4652 - if [ "$PLATFORM" = "Linux" ]; then - MAX_SOCKETS=1 - fi - - npm ci \ - --include=dev \ - --prefer-offline \ - --no-audit \ - --no-progress \ - --maxsockets "$MAX_SOCKETS" \ - "$@" +# To avoid constant ECONNRESET errors a limit is set for Linux, +# as this is not happening with the Mac jobs. +# This issue is being tracked here: +# https://github.com/npm/cli/issues/4652 +if [ "$PLATFORM" = "Linux" ]; then + MAX_SOCKETS=1 fi +npm ci \ + --include=dev \ + --prefer-offline \ + --no-audit \ + --no-progress \ + --maxsockets "$MAX_SOCKETS" \ + "$@" + echo "--- :npm: Save cache if necessary" -# We cache both npm's download cache and root node_modules with a strict -# environment+lockfile key. node_modules is saved only after npm ci runs. -# # npm stores temporary files in ~/.npm that we don't want to extract because they might run into naming conflicts. # So, before archiving it, we remove those tmp files. # # Example: https://buildkite.com/automattic/gutenberg-mobile/builds/8857#018e37eb-7afc-4280-b736-cba76f02f1a3/524 rm -rf "$LOCAL_NPM_CACHE/_cacache/tmp" save_cache "$LOCAL_NPM_CACHE" "$NPM_CACHE_KEY" - -if [ "$NODE_MODULES_CACHE_HIT" = false ]; then - save_cache node_modules "$NODE_MODULES_CACHE_KEY" -fi