remove references to webpack

This commit is contained in:
ChaosExAnima 2025-04-14 11:55:58 +02:00
parent ccc22cce76
commit 653d8965c6
No known key found for this signature in database
GPG Key ID: 8F2B333100FB6117
18 changed files with 631 additions and 7294 deletions

View File

@ -25,23 +25,6 @@
'tesseract.js', // Requires code changes 'tesseract.js', // Requires code changes
'react-hotkeys', // Requires code changes 'react-hotkeys', // Requires code changes
// Requires Webpacker upgrade or replacement
'@svgr/webpack',
'@types/webpack',
'babel-loader',
'compression-webpack-plugin',
'css-loader',
'imports-loader',
'mini-css-extract-plugin',
'postcss-loader',
'sass-loader',
'terser-webpack-plugin',
'webpack',
'webpack-assets-manifest',
'webpack-bundle-analyzer',
'webpack-dev-server',
'webpack-cli',
// react-router: Requires manual upgrade // react-router: Requires manual upgrade
'history', 'history',
'react-router-dom', 'react-router-dom',

View File

@ -1,4 +1,4 @@
web: env PORT=3000 RAILS_ENV=development bundle exec puma -C config/puma.rb web: env PORT=3000 RAILS_ENV=development bundle exec puma -C config/puma.rb
sidekiq: env PORT=3000 RAILS_ENV=development bundle exec sidekiq sidekiq: env PORT=3000 RAILS_ENV=development bundle exec sidekiq
stream: env PORT=4000 yarn workspace @mastodon/streaming start stream: env PORT=4000 yarn workspace @mastodon/streaming start
webpack: bin/webpack-dev-server vite: bin/vite dev

View File

@ -1,4 +1,4 @@
/* Placeholder file to have `inert.scss` compiled by Webpack /* Placeholder file to have `inert.scss` compiled by Vite
This is used by the `wicg-inert` polyfill */ This is used by the `wicg-inert` polyfill */
import '../styles/inert.scss'; import '../styles/inert.scss';

View File

@ -149,9 +149,7 @@ function loaded() {
const reactComponents = document.querySelectorAll('[data-component]'); const reactComponents = document.querySelectorAll('[data-component]');
if (reactComponents.length > 0) { if (reactComponents.length > 0) {
import( import('../mastodon/containers/media_container')
/* webpackChunkName: "containers/media_container" */ '../mastodon/containers/media_container'
)
.then(({ default: MediaContainer }) => { .then(({ default: MediaContainer }) => {
reactComponents.forEach((component) => { reactComponents.forEach((component) => {
Array.from(component.children).forEach((child) => { Array.from(component.children).forEach((child) => {

View File

@ -1,7 +1,8 @@
import Rails from '@rails/ujs'; import Rails from '@rails/ujs';
export function start() { export function start() {
require.context('../images/', true, /\.(jpg|png|svg)$/); // TODO: Find alternative to this
// require.context('../images/', true, /\.(jpg|png|svg)$/);
try { try {
Rails.start(); Rails.start();

View File

@ -1,235 +1,235 @@
export function EmojiPicker () { export function EmojiPicker () {
return import(/* webpackChunkName: "emoji_picker" */'../../emoji/emoji_picker'); return import('../../emoji/emoji_picker');
} }
export function Compose () { export function Compose () {
return import(/* webpackChunkName: "features/compose" */'../../compose'); return import('../../compose');
} }
export function Notifications () { export function Notifications () {
return import(/* webpackChunkName: "features/notifications" */'../../notifications_v2'); return import('../../notifications_v2');
} }
export function HomeTimeline () { export function HomeTimeline () {
return import(/* webpackChunkName: "features/home_timeline" */'../../home_timeline'); return import('../../home_timeline');
} }
export function PublicTimeline () { export function PublicTimeline () {
return import(/* webpackChunkName: "features/public_timeline" */'../../public_timeline'); return import('../../public_timeline');
} }
export function CommunityTimeline () { export function CommunityTimeline () {
return import(/* webpackChunkName: "features/community_timeline" */'../../community_timeline'); return import('../../community_timeline');
} }
export function Firehose () { export function Firehose () {
return import(/* webpackChunkName: "features/firehose" */'../../firehose'); return import('../../firehose');
} }
export function HashtagTimeline () { export function HashtagTimeline () {
return import(/* webpackChunkName: "features/hashtag_timeline" */'../../hashtag_timeline'); return import('../../hashtag_timeline');
} }
export function DirectTimeline() { export function DirectTimeline() {
return import(/* webpackChunkName: "features/direct_timeline" */'../../direct_timeline'); return import('../../direct_timeline');
} }
export function ListTimeline () { export function ListTimeline () {
return import(/* webpackChunkName: "features/list_timeline" */'../../list_timeline'); return import('../../list_timeline');
} }
export function Lists () { export function Lists () {
return import(/* webpackChunkName: "features/lists" */'../../lists'); return import('../../lists');
} }
export function Status () { export function Status () {
return import(/* webpackChunkName: "features/status" */'../../status'); return import('../../status');
} }
export function GettingStarted () { export function GettingStarted () {
return import(/* webpackChunkName: "features/getting_started" */'../../getting_started'); return import('../../getting_started');
} }
export function KeyboardShortcuts () { export function KeyboardShortcuts () {
return import(/* webpackChunkName: "features/keyboard_shortcuts" */'../../keyboard_shortcuts'); return import('../../keyboard_shortcuts');
} }
export function PinnedStatuses () { export function PinnedStatuses () {
return import(/* webpackChunkName: "features/pinned_statuses" */'../../pinned_statuses'); return import('../../pinned_statuses');
} }
export function AccountTimeline () { export function AccountTimeline () {
return import(/* webpackChunkName: "features/account_timeline" */'../../account_timeline'); return import('../../account_timeline');
} }
export function AccountGallery () { export function AccountGallery () {
return import(/* webpackChunkName: "features/account_gallery" */'../../account_gallery'); return import('../../account_gallery');
} }
export function AccountFeatured() { export function AccountFeatured() {
return import(/* webpackChunkName: "features/account_featured" */'../../account_featured'); return import('../../account_featured');
} }
export function Followers () { export function Followers () {
return import(/* webpackChunkName: "features/followers" */'../../followers'); return import('../../followers');
} }
export function Following () { export function Following () {
return import(/* webpackChunkName: "features/following" */'../../following'); return import('../../following');
} }
export function Reblogs () { export function Reblogs () {
return import(/* webpackChunkName: "features/reblogs" */'../../reblogs'); return import('../../reblogs');
} }
export function Favourites () { export function Favourites () {
return import(/* webpackChunkName: "features/favourites" */'../../favourites'); return import('../../favourites');
} }
export function FollowRequests () { export function FollowRequests () {
return import(/* webpackChunkName: "features/follow_requests" */'../../follow_requests'); return import('../../follow_requests');
} }
export function FavouritedStatuses () { export function FavouritedStatuses () {
return import(/* webpackChunkName: "features/favourited_statuses" */'../../favourited_statuses'); return import('../../favourited_statuses');
} }
export function FollowedTags () { export function FollowedTags () {
return import(/* webpackChunkName: "features/followed_tags" */'../../followed_tags'); return import('../../followed_tags');
} }
export function BookmarkedStatuses () { export function BookmarkedStatuses () {
return import(/* webpackChunkName: "features/bookmarked_statuses" */'../../bookmarked_statuses'); return import('../../bookmarked_statuses');
} }
export function Blocks () { export function Blocks () {
return import(/* webpackChunkName: "features/blocks" */'../../blocks'); return import('../../blocks');
} }
export function DomainBlocks () { export function DomainBlocks () {
return import(/* webpackChunkName: "features/domain_blocks" */'../../domain_blocks'); return import('../../domain_blocks');
} }
export function Mutes () { export function Mutes () {
return import(/* webpackChunkName: "features/mutes" */'../../mutes'); return import('../../mutes');
} }
export function MuteModal () { export function MuteModal () {
return import(/* webpackChunkName: "modals/mute_modal" */'../components/mute_modal'); return import('../components/mute_modal');
} }
export function BlockModal () { export function BlockModal () {
return import(/* webpackChunkName: "modals/block_modal" */'../components/block_modal'); return import('../components/block_modal');
} }
export function DomainBlockModal () { export function DomainBlockModal () {
return import(/* webpackChunkName: "modals/domain_block_modal" */'../components/domain_block_modal'); return import('../components/domain_block_modal');
} }
export function ReportModal () { export function ReportModal () {
return import(/* webpackChunkName: "modals/report_modal" */'../components/report_modal'); return import('../components/report_modal');
} }
export function IgnoreNotificationsModal () { export function IgnoreNotificationsModal () {
return import(/* webpackChunkName: "modals/domain_block_modal" */'../components/ignore_notifications_modal'); return import('../components/ignore_notifications_modal');
} }
export function MediaGallery () { export function MediaGallery () {
return import(/* webpackChunkName: "status/media_gallery" */'../../../components/media_gallery'); return import('../../../components/media_gallery');
} }
export function Video () { export function Video () {
return import(/* webpackChunkName: "features/video" */'../../video'); return import('../../video');
} }
export function EmbedModal () { export function EmbedModal () {
return import(/* webpackChunkName: "modals/embed_modal" */'../components/embed_modal'); return import('../components/embed_modal');
} }
export function ListAdder () { export function ListAdder () {
return import(/*webpackChunkName: "features/list_adder" */'../../list_adder'); return import('../../list_adder');
} }
export function Tesseract () { export function Tesseract () {
return import(/*webpackChunkName: "tesseract" */'tesseract.js'); return import('tesseract.js');
} }
export function Audio () { export function Audio () {
return import(/* webpackChunkName: "features/audio" */'../../audio'); return import('../../audio');
} }
export function Directory () { export function Directory () {
return import(/* webpackChunkName: "features/directory" */'../../directory'); return import('../../directory');
} }
export function OnboardingProfile () { export function OnboardingProfile () {
return import(/* webpackChunkName: "features/onboarding" */'../../onboarding/profile'); return import('../../onboarding/profile');
} }
export function OnboardingFollows () { export function OnboardingFollows () {
return import(/* webpackChunkName: "features/onboarding" */'../../onboarding/follows'); return import('../../onboarding/follows');
} }
export function CompareHistoryModal () { export function CompareHistoryModal () {
return import(/*webpackChunkName: "modals/compare_history_modal" */'../components/compare_history_modal'); return import('../components/compare_history_modal');
} }
export function Explore () { export function Explore () {
return import(/* webpackChunkName: "features/explore" */'../../explore'); return import('../../explore');
} }
export function Search () { export function Search () {
return import(/* webpackChunkName: "features/explore" */'../../search'); return import('../../search');
} }
export function FilterModal () { export function FilterModal () {
return import(/*webpackChunkName: "modals/filter_modal" */'../components/filter_modal'); return import('../components/filter_modal');
} }
export function InteractionModal () { export function InteractionModal () {
return import(/*webpackChunkName: "modals/interaction_modal" */'../../interaction_modal'); return import('../../interaction_modal');
} }
export function SubscribedLanguagesModal () { export function SubscribedLanguagesModal () {
return import(/*webpackChunkName: "modals/subscribed_languages_modal" */'../../subscribed_languages_modal'); return import('../../subscribed_languages_modal');
} }
export function ClosedRegistrationsModal () { export function ClosedRegistrationsModal () {
return import(/*webpackChunkName: "modals/closed_registrations_modal" */'../../closed_registrations_modal'); return import('../../closed_registrations_modal');
} }
export function About () { export function About () {
return import(/*webpackChunkName: "features/about" */'../../about'); return import('../../about');
} }
export function PrivacyPolicy () { export function PrivacyPolicy () {
return import(/*webpackChunkName: "features/privacy_policy" */'../../privacy_policy'); return import('../../privacy_policy');
} }
export function TermsOfService () { export function TermsOfService () {
return import(/*webpackChunkName: "features/terms_of_service" */'../../terms_of_service'); return import('../../terms_of_service');
} }
export function NotificationRequests () { export function NotificationRequests () {
return import(/*webpackChunkName: "features/notifications/requests" */'../../notifications/requests'); return import('../../notifications/requests');
} }
export function NotificationRequest () { export function NotificationRequest () {
return import(/*webpackChunkName: "features/notifications/request" */'../../notifications/request'); return import('../../notifications/request');
} }
export function LinkTimeline () { export function LinkTimeline () {
return import(/*webpackChunkName: "features/link_timeline" */'../../link_timeline'); return import('../../link_timeline');
} }
export function AnnualReportModal () { export function AnnualReportModal () {
return import(/*webpackChunkName: "modals/annual_report_modal" */'../components/annual_report_modal'); return import('../components/annual_report_modal');
} }
export function ListEdit () { export function ListEdit () {
return import(/*webpackChunkName: "features/lists" */'../../lists/new'); return import('../../lists/new');
} }
export function ListMembers () { export function ListMembers () {
return import(/* webpackChunkName: "features/lists" */'../../lists/members'); return import('../../lists/members');
} }

View File

@ -3,7 +3,7 @@
// can at least log in using KaiOS devices). // can at least log in using KaiOS devices).
function importArrowKeyNavigation() { function importArrowKeyNavigation() {
return import(/* webpackChunkName: "arrow-key-navigation" */ 'arrow-key-navigation'); return import('arrow-key-navigation');
} }
export default function loadKeyboardExtensions() { export default function loadKeyboardExtensions() {

View File

@ -1,7 +1,6 @@
// //
// Tools for performance debugging, only enabled in development mode. // Tools for performance debugging, only enabled in development mode.
// Open up Chrome Dev Tools, then Timeline, then User Timing to see output. // Open up Chrome Dev Tools, then Timeline, then User Timing to see output.
// Also see config/webpack/loaders/mark.js for the webpack loader marks.
import * as marky from 'marky'; import * as marky from 'marky';

View File

@ -5,7 +5,7 @@
import { loadIntlPolyfills } from './intl'; import { loadIntlPolyfills } from './intl';
function importExtraPolyfills() { function importExtraPolyfills() {
return import(/* webpackChunkName: "extra_polyfills" */ './extra_polyfills'); return import('./extra_polyfills');
} }
export function loadPolyfills() { export function loadPolyfills() {

View File

@ -68,11 +68,9 @@ async function loadIntlPluralRulesPolyfills(locale: string) {
// } // }
// // Load the polyfill 1st BEFORE loading data // // Load the polyfill 1st BEFORE loading data
// await import( // await import(
// /* webpackChunkName: "i18n-relativetimeformat-polyfill" */
// '@formatjs/intl-relativetimeformat/polyfill-force' // '@formatjs/intl-relativetimeformat/polyfill-force'
// ); // );
// await import( // await import(
// /* webpackChunkName: "i18n-relativetimeformat-polyfill-[request]" */
// `@formatjs/intl-relativetimeformat/locale-data/${unsupportedLocale}` // `@formatjs/intl-relativetimeformat/locale-data/${unsupportedLocale}`
// ); // );
// } // }

View File

@ -1,19 +0,0 @@
#!/usr/bin/env ruby
ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development"
ENV["NODE_ENV"] ||= "development"
require "pathname"
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
Pathname.new(__FILE__).realpath)
require "rubygems"
require "bundler/setup"
require "webpacker"
require "webpacker/webpack_runner"
APP_ROOT = File.expand_path("..", __dir__)
Dir.chdir(APP_ROOT) do
Webpacker::WebpackRunner.run(ARGV)
end

View File

@ -1,19 +0,0 @@
#!/usr/bin/env ruby
ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development"
ENV["NODE_ENV"] ||= "development"
require "pathname"
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
Pathname.new(__FILE__).realpath)
require "rubygems"
require "bundler/setup"
require "webpacker"
require "webpacker/dev_server_runner"
APP_ROOT = File.expand_path("..", __dir__)
Dir.chdir(APP_ROOT) do
Webpacker::DevServerRunner.run(ARGV)
end

View File

@ -244,7 +244,6 @@ export default tseslint.config([
{ {
devDependencies: [ devDependencies: [
'eslint.config.mjs', 'eslint.config.mjs',
'config/webpack/**',
'app/javascript/mastodon/performance.js', 'app/javascript/mastodon/performance.js',
'app/javascript/mastodon/test_setup.js', 'app/javascript/mastodon/test_setup.js',
'app/javascript/mastodon/test_helpers.tsx', 'app/javascript/mastodon/test_helpers.tsx',
@ -252,7 +251,6 @@ export default tseslint.config([
], ],
}, },
], ],
'import/no-webpack-loader-syntax': 'error',
'react/jsx-filename-extension': [ 'react/jsx-filename-extension': [
'error', 'error',
@ -288,7 +286,6 @@ export default tseslint.config([
'**/*.config.js', '**/*.config.js',
'**/.*rc.js', '**/.*rc.js',
'**/ide-helper.js', '**/ide-helper.js',
'config/webpack/**/*',
'config/formatjs-formatter.js', 'config/formatjs-formatter.js',
], ],

View File

@ -10,8 +10,8 @@
"streaming" "streaming"
], ],
"scripts": { "scripts": {
"build:development": "cross-env RAILS_ENV=development NODE_ENV=development ./bin/webpack", "build:development": "cross-env RAILS_ENV=development NODE_ENV=development ./bin/vite build",
"build:production": "cross-env RAILS_ENV=production NODE_ENV=production ./bin/webpack", "build:production": "cross-env RAILS_ENV=production NODE_ENV=production ./bin/vite build",
"fix:js": "eslint . --cache --fix", "fix:js": "eslint . --cache --fix",
"fix:css": "stylelint --fix \"**/*.{css,scss}\"", "fix:css": "stylelint --fix \"**/*.{css,scss}\"",
"fix": "yarn fix:js && yarn fix:css", "fix": "yarn fix:js && yarn fix:css",
@ -34,14 +34,6 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@babel/core": "^7.22.1",
"@babel/plugin-transform-nullish-coalescing-operator": "^7.22.3",
"@babel/plugin-transform-react-inline-elements": "^7.21.0",
"@babel/plugin-transform-runtime": "^7.22.4",
"@babel/preset-env": "^7.22.4",
"@babel/preset-react": "^7.22.3",
"@babel/preset-typescript": "^7.21.5",
"@babel/runtime": "^7.22.3",
"@csstools/stylelint-formatter-github": "^1.0.0", "@csstools/stylelint-formatter-github": "^1.0.0",
"@dnd-kit/core": "^6.1.0", "@dnd-kit/core": "^6.1.0",
"@dnd-kit/sortable": "^10.0.0", "@dnd-kit/sortable": "^10.0.0",
@ -52,20 +44,13 @@
"@rails/ujs": "7.1.501", "@rails/ujs": "7.1.501",
"@react-spring/web": "^9.7.5", "@react-spring/web": "^9.7.5",
"@reduxjs/toolkit": "^2.0.1", "@reduxjs/toolkit": "^2.0.1",
"@svgr/webpack": "^5.5.0",
"@use-gesture/react": "^10.3.1", "@use-gesture/react": "^10.3.1",
"arrow-key-navigation": "^1.2.0", "arrow-key-navigation": "^1.2.0",
"async-mutex": "^0.5.0", "async-mutex": "^0.5.0",
"axios": "^1.4.0", "axios": "^1.4.0",
"babel-loader": "^8.3.0",
"babel-plugin-formatjs": "^10.5.37",
"babel-plugin-lodash": "patch:babel-plugin-lodash@npm%3A3.3.4#~/.yarn/patches/babel-plugin-lodash-npm-3.3.4-c7161075b6.patch",
"babel-plugin-preval": "^5.1.0",
"babel-plugin-transform-react-remove-prop-types": "^0.4.24",
"blurhash": "^2.0.5", "blurhash": "^2.0.5",
"classnames": "^2.3.2", "classnames": "^2.3.2",
"color-blend": "^4.0.0", "color-blend": "^4.0.0",
"compression-webpack-plugin": "^6.1.2",
"core-js": "^3.30.2", "core-js": "^3.30.2",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"detect-passive-events": "^2.0.3", "detect-passive-events": "^2.0.3",
@ -111,23 +96,16 @@
"stacktrace-js": "^2.0.2", "stacktrace-js": "^2.0.2",
"stringz": "^2.1.0", "stringz": "^2.1.0",
"substring-trie": "^1.0.2", "substring-trie": "^1.0.2",
"terser-webpack-plugin": "^4.2.3",
"tesseract.js": "^6.0.0", "tesseract.js": "^6.0.0",
"tiny-queue": "^0.2.1", "tiny-queue": "^0.2.1",
"twitter-text": "3.1.0", "twitter-text": "3.1.0",
"use-debounce": "^10.0.0", "use-debounce": "^10.0.0",
"vite": "^6.2.6", "vite": "^6.2.6",
"webpack": "^4.47.0",
"webpack-assets-manifest": "^4.0.6",
"webpack-bundle-analyzer": "^4.8.0",
"webpack-cli": "^3.3.12",
"webpack-merge": "^6.0.0",
"wicg-inert": "^3.1.2", "wicg-inert": "^3.1.2",
"workbox-expiration": "^7.0.0", "workbox-expiration": "^7.0.0",
"workbox-precaching": "^7.0.0", "workbox-precaching": "^7.0.0",
"workbox-routing": "^7.0.0", "workbox-routing": "^7.0.0",
"workbox-strategies": "^7.0.0", "workbox-strategies": "^7.0.0",
"workbox-webpack-plugin": "^7.0.0",
"workbox-window": "^7.0.0" "workbox-window": "^7.0.0"
}, },
"devDependencies": { "devDependencies": {
@ -136,12 +114,12 @@
"@testing-library/dom": "^10.2.0", "@testing-library/dom": "^10.2.0",
"@testing-library/jest-dom": "^6.0.0", "@testing-library/jest-dom": "^6.0.0",
"@testing-library/react": "^16.0.0", "@testing-library/react": "^16.0.0",
"@types/babel__core": "^7.20.1",
"@types/emoji-mart": "3.0.14", "@types/emoji-mart": "3.0.14",
"@types/escape-html": "^1.0.2", "@types/escape-html": "^1.0.2",
"@types/hoist-non-react-statics": "^3.3.1", "@types/hoist-non-react-statics": "^3.3.1",
"@types/http-link-header": "^1.0.3", "@types/http-link-header": "^1.0.3",
"@types/intl": "^1.2.0", "@types/intl": "^1.2.0",
"@types/jest": "^29.5.14",
"@types/js-yaml": "^4.0.5", "@types/js-yaml": "^4.0.5",
"@types/lodash": "^4.14.195", "@types/lodash": "^4.14.195",
"@types/object-assign": "^4.0.30", "@types/object-assign": "^4.0.30",
@ -160,8 +138,6 @@
"@types/react-toggle": "^4.0.3", "@types/react-toggle": "^4.0.3",
"@types/redux-immutable": "^4.0.3", "@types/redux-immutable": "^4.0.3",
"@types/requestidlecallback": "^0.3.5", "@types/requestidlecallback": "^0.3.5",
"@types/webpack": "^4.41.33",
"@types/webpack-env": "^1.18.4",
"@vitejs/plugin-react": "^4.2.1", "@vitejs/plugin-react": "^4.2.1",
"eslint": "^9.23.0", "eslint": "^9.23.0",
"eslint-import-resolver-typescript": "^4.2.5", "eslint-import-resolver-typescript": "^4.2.5",
@ -180,18 +156,17 @@
"stylelint": "^16.11.0", "stylelint": "^16.11.0",
"stylelint-config-prettier-scss": "^1.0.0", "stylelint-config-prettier-scss": "^1.0.0",
"stylelint-config-standard-scss": "^14.0.0", "stylelint-config-standard-scss": "^14.0.0",
"ts-jest": "^29.3.2",
"typescript": "~5.7.3", "typescript": "~5.7.3",
"typescript-eslint": "^8.28.0", "typescript-eslint": "^8.29.1",
"vite-plugin-rails": "^0.5.0", "vite-plugin-rails": "^0.5.0",
"vite-plugin-svgr": "^4.2.0", "vite-plugin-svgr": "^4.2.0",
"vitest": "^3.1.1", "vitest": "^3.1.1"
"webpack-dev-server": "^3.11.3"
}, },
"resolutions": { "resolutions": {
"@types/react": "^18.2.7", "@types/react": "^18.2.7",
"@types/react-dom": "^18.2.4", "@types/react-dom": "^18.2.4",
"kind-of": "^6.0.3", "kind-of": "^6.0.3"
"webpack/terser-webpack-plugin": "^4.2.3"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"react": { "react": {

View File

@ -12,7 +12,7 @@
"noUncheckedIndexedAccess": true, "noUncheckedIndexedAccess": true,
"esModuleInterop": true, "esModuleInterop": true,
"skipLibCheck": true, "skipLibCheck": true,
"types": ["vite/client", "vitest/globals", "@types/webpack-env"], "types": ["vite/client", "vitest/globals"],
"baseUrl": "./", "baseUrl": "./",
"incremental": true, "incremental": true,
"tsBuildInfoFile": "tmp/cache/tsconfig.tsbuildinfo", "tsBuildInfoFile": "tmp/cache/tsconfig.tsbuildinfo",
@ -26,6 +26,7 @@
}, },
"include": [ "include": [
"vite.config.mts", "vite.config.mts",
"config/vite",
"app/javascript/mastodon", "app/javascript/mastodon",
"app/javascript/entrypoints", "app/javascript/entrypoints",
"app/javascript/types" "app/javascript/types"

View File

@ -1,43 +1,84 @@
/// <reference types="vitest" /> /// <reference types="vitest" />
import fs from 'fs';
import path from 'path'; import path from 'path';
import react from '@vitejs/plugin-react'; import react from '@vitejs/plugin-react';
import RailsPlugin from 'vite-plugin-rails';
import svgr from 'vite-plugin-svgr'; import svgr from 'vite-plugin-svgr';
import { defineConfig, configDefaults } from 'vitest/config'; import { defineConfig, configDefaults } from 'vitest/config';
import postcssPresetEnv from 'postcss-preset-env';
const sourceCodeDir = 'app/javascript'; import { manifestSRI } from './config/vite/plugin-manifest-sri';
const items = fs.readdirSync(sourceCodeDir);
const directories = items.filter((item) =>
fs.lstatSync(path.join(sourceCodeDir, item)).isDirectory(),
);
const aliasesFromJavascriptRoot: Record<string, string> = {};
directories.forEach((directory) => {
aliasesFromJavascriptRoot[directory] = path.resolve(
__dirname,
sourceCodeDir,
directory,
);
});
export default defineConfig({ export default defineConfig({
resolve: { root: './app/javascript/entrypoints',
alias: { css: {
...aliasesFromJavascriptRoot, postcss: {
plugins: [
postcssPresetEnv({
features: {
'logical-properties-and-values': false,
},
}),
],
}, },
}, },
plugins: [ resolve: {
RailsPlugin(), alias: {
react({ mastodon: path.resolve(__dirname, 'app/javascript/mastodon'),
include: ['**/*.jsx', '**/*.tsx'], '@': path.resolve(__dirname, 'app/javascript'),
babel: { },
plugins: ['formatjs', 'preval', 'transform-react-remove-prop-types'], },
build: {
commonjsOptions: { transformMixedEsModules: true },
outDir: path.resolve(__dirname, '.dist'),
emptyOutDir: true,
manifest: 'manifest.json',
rollupOptions: {
input: {
admin: path.resolve(__dirname, 'app/javascript/entrypoints/admin.tsx'),
application: path.resolve(
__dirname,
'app/javascript/entrypoints/application.ts',
),
twoFactor: path.resolve(
__dirname,
'app/javascript/entrypoints/two_factor_authentication.ts',
),
}, },
}), output: {
svgr(), chunkFileNames(chunkInfo) {
], if (
/mastodon\/locales\/[a-zA-Z-]+\.json/.exec(chunkInfo.facadeModuleId)
) {
// put all locale files in `intl/`
return `intl/[name]-[hash].js`;
} else if (
/node_modules\/@formatjs\//.exec(chunkInfo.facadeModuleId)
) {
// use a custom name for formatjs polyfill files
const name = /node_modules\/@formatjs\/([^/]+)\//.exec(
chunkInfo.facadeModuleId,
);
if (name?.[1]) {
return `intl/[name]-${name[1]}-[hash].js`;
}
} else if (chunkInfo.name === 'index' && chunkInfo.facadeModuleId) {
// Use a custom name for chunks, to avoid having too many of them called "index"
const parts = chunkInfo.facadeModuleId.split('/');
const parent = parts.at(-2);
if (parent) {
return `${parent}-[name]-[hash].js`;
}
}
return `[name]-[hash].js`;
},
},
},
},
plugins: [react(), svgr(), manifestSRI()],
test: { test: {
environment: 'jsdom', environment: 'jsdom',
include: [ include: [

View File

@ -1,77 +0,0 @@
import path from 'node:path';
import postcssPresetEnv from 'postcss-preset-env';
import { defineConfig } from 'vite';
import { manifestSRI } from './config/vite/plugin-manifest-sri';
// eslint-disable-next-line import/no-default-export
export default defineConfig({
root: './app/javascript/entrypoints',
css: {
postcss: {
plugins: [
postcssPresetEnv({
features: {
'logical-properties-and-values': false,
},
}),
],
},
},
build: {
commonjsOptions: { transformMixedEsModules: true },
outDir: path.resolve(__dirname, '.dist'),
emptyOutDir: true,
manifest: 'manifest.json',
rollupOptions: {
input: {
admin: path.resolve(__dirname, 'app/javascript/entrypoints/admin.tsx'),
application: path.resolve(
__dirname,
'app/javascript/entrypoints/application.ts',
),
twoFactor: path.resolve(
__dirname,
'app/javascript/entrypoints/two_factor_authentication.ts',
),
},
output: {
chunkFileNames: (chunkInfo) => {
if (
chunkInfo.facadeModuleId?.match(
/mastodon\/locales\/[a-zA-Z-]+\.json/,
)
) {
// put all locale files in `intl/`
return `intl/[name]-[hash].js`;
} else if (
chunkInfo.facadeModuleId?.match(/node_modules\/@formatjs\//)
) {
// use a custom name for formatjs polyfill files
const name = /node_modules\/@formatjs\/([^/]+)\//.exec(
chunkInfo.facadeModuleId,
);
if (name?.[1]) return `intl/[name]-${name[1]}-[hash].js`;
} else if (chunkInfo.name === 'index' && chunkInfo.facadeModuleId) {
// Use a custom name for chunks, to avoid having too many of them called "index"
const parts = chunkInfo.facadeModuleId.split('/');
const parent = parts.at(-2);
if (parent) return `${parent}-[name]-[hash].js`;
}
return `[name]-[hash].js`;
},
},
},
},
plugins: [manifestSRI()],
resolve: {
alias: {
mastodon: path.resolve(__dirname, 'app/javascript/mastodon'),
'@': path.resolve(__dirname, 'app/javascript'),
},
},
});

7517
yarn.lock

File diff suppressed because it is too large Load Diff