mattermost/webapp/package.json

96 lines
2.9 KiB
JSON
Raw Permalink Normal View History

{
"name": "@mattermost/webapp",
"private": true,
2023-04-10 10:14:35 -04:00
"engines": {
"node": "^20 || ^22 || ^24",
"npm": "^10 || ^11"
2023-04-10 10:14:35 -04:00
},
"scripts": {
"postinstall": "patch-package && npm run build --workspace=platform/types --workspace=platform/client --workspace=platform/components",
Fixathon: Web app dependency updates part 1 (#29036) * Ensure all packages remove a node_modules in their folder when cleaning * Upgrade typescript to 5.6.3 and move to root package.json Note that this currently fails to build the types package due to @types/node which I'm going to try to remove * Update @types/node to 20.11 to match .nvmrc * Upgrade zen-observable to 0.10.0 It looks like localforage-observable uses its own version of zen-observable because it hasn't been updated in years. This seems like something we probably should remove. * Update yargs to 17.7.2 * Update webpack-dev-server to 5.1.0 * Remove webpack-bundle-analyzer since we haven't used it in years * Update webpack to 5.95.0 * Update web-vitals to 4.2.4 * Update turndown to 7.2.0 * Update tinycolor2 to 1.6.0 * Update timezones.json to 1.7.0 * Update stylelint to 16.10.0, stylelint-config-recommended-scss to 14.1.0, and stylelint-scss to 6.8.1 * Update webpack-cli to 5.1.4 * Update style-loader to 4.0.0 * Change all Webpack scripts to be ES modules * Update strip-ansi to 7.1.0 This is a build script dependency * Update chalk to 5.3.0 This is a build script dependency * Update concurrently to 9.0.1 This is a build script dependency * Update smooth-scroll-into-view-if-needed to 2.0.2 * MM-48205 Update serialize-error to 11.0.3 We didn't update this before because it's an ES module which caused Jest to complain. We can fix that by making Jest transform the it * Update semver to 7.6.3 * Update types for semver, tinycolor2, turndown, and webpack * Fix type issues: change Props to a type * Fix type issues: invalid HTML attributes * Remove unneeded option from Webpack config
2024-11-06 13:40:19 -05:00
"build": "node scripts/build.mjs",
"run": "node scripts/run.mjs",
"dev-server": "node scripts/dev-server.mjs",
"test": "npm run test --workspaces --if-present",
2023-11-13 15:13:58 -05:00
"test:updatesnapshot": "npm run test:updatesnapshot --workspaces --if-present",
"test-ci": "npm run test-ci --workspaces --if-present",
"check": "npm run check --workspaces --if-present",
"fix": "npm run fix --workspaces --if-present",
"check-types": "npm run check-types --workspaces --if-present",
MM-66653: migrate i18n extraction from mmjstool to @formatjs/cli (#34498) * feat(webapp): migrate i18n extraction from mmjstool to @formatjs/cli Replace custom mmjstool with industry-standard @formatjs/cli for i18n message extraction. Adds support for localizeMessage as a recognized extraction function and enables comprehensive ESLint rules for i18n. Changes by area: Dependencies (package.json): - Add @formatjs/cli v6.7.4 - Remove @mattermost/mmjstool dependency - Replace i18n-extract script with formatjs command - Remove mmjstool-specific scripts (clean-empty, check-empty-src) - Add i18n-extract:check for diff validation Code (utils.tsx): - Refactor localizeMessage to accept MessageDescriptor format - Support {id, defaultMessage, description} parameters - Maintain Redux store access (non-React context compatible) - Add comprehensive JSDoc documentation Linting (.eslintrc.json): - Configure formatjs settings with additionalFunctionNames - Enable 9 formatjs ESLint rules including enforce-id (error) - Ensure all messages require explicit manual IDs CI/CD (webapp-ci.yml): - Simplify i18n check to formatjs extraction + diff - Remove mmjstool and mobile-dir references Context: Second attempt at PR #25830. Uses manual IDs only with [id] placeholder pattern to enforce explicit ID requirements. ESLint will catch missing IDs during development. * chore(webapp): add temporary i18n reconciliation tooling Add helper script to analyze conflicts between en.json and defaultMessage values in code. This tooling will be reverted after initial migration cleanup is complete. Tooling added: - scripts/i18n-reconcile-conflicts.js: Analyzes conflicts - Detects spelling corrections - Identifies placeholder mismatches - Flags significant content changes - Provides recommendations on which version to keep - npm script: i18n-reconcile Usage: npm run i18n-reconcile This will be reverted after reconciling the ~50 duplicate message warnings and determining correct versions for conflicting messages. * chore(webapp): upgrade eslint-plugin-formatjs and centralize formatjs deps Move @formatjs/cli to root webapp package.json alongside other formatjs dependencies for better monorepo organization. Upgrade eslint-plugin-formatjs from 4.12.2 to 5.4.2 for latest features and bug fixes. Changes: - Upgrade eslint-plugin-formatjs: 4.12.2 → 5.4.2 - Move @formatjs/cli to webapp/package.json (from channels) - Centralize formatjs tooling at monorepo root level This provides: - Better dependency management in monorepo - Latest formatjs ESLint rules and features - Consistent tooling across workspaces * feat(webapp): make localizeMessage fully compatible with formatMessage API Extend localizeMessage to accept a values parameter for placeholder interpolation, making it fully compatible with react-intl's formatMessage API. Remove the now-redundant localizeAndFormatMessage function. Changes to localizeMessage: - Add values parameter for {placeholder} interpolation - Use getIntl() for proper ICU message formatting - Support full formatMessage feature parity outside React contexts - Update JSDoc with interpolation examples - Mark as deprecated (prefer useIntl in React components) Code cleanup: - Remove localizeAndFormatMessage function (redundant) - Migrate all localizeAndFormatMessage usages to localizeMessage - Remove unused imports: getCurrentLocale, getTranslations - Add getIntl import Files migrated: - notification_actions.tsx: notification.crt message - app_command_parser_dependencies.ts: intlShim formatMessage This consolidates i18n logic and provides a single, feature-complete localization function for non-React contexts. Example usage: // Before (old function) localizeAndFormatMessage( {id: 'welcome', defaultMessage: 'Hello {name}'}, {name: 'John'} ) // After (consolidated) localizeMessage( {id: 'welcome', defaultMessage: 'Hello {name}'}, {name: 'John'} ) * refactor(i18n): remove intlShim abstraction, use IntlShape directly Remove intlShim wrapper and use react-intl's IntlShape type throughout. Key Changes: - Remove intlShim constant from app_command_parser_dependencies.ts - Update errorMessage() signature to accept IntlShape parameter - Use IntlShape for intl properties in AppCommandParser and ParsedCommand - Call getIntl() at function start in actions (command.ts, marketplace.ts) - Pass IntlShape to AppCommandParser and doAppSubmit consistently Files Modified: - app_command_parser_dependencies.ts: Remove intlShim, update errorMessage - app_command_parser.ts: Use IntlShape type - command.ts, marketplace.ts: Call getIntl() early, pass to parser - app_provider.tsx, command_provider.tsx: Use getIntl() in constructor - apps.ts: Update doAppSubmit signature Benefits: Better type safety, standard react-intl patterns, eliminates unnecessary abstraction. Context: Part of migration to @formatjs/cli tooling. * refactor(webapp): remove deprecated t() function and refactor login validation Remove the deprecated t() function that was used as a marker for the old mmjstool extraction. With @formatjs/cli, this is no longer needed as extraction happens directly from formatMessage calls. Changes: - Remove t() function definition from utils/i18n.tsx - Remove t() import and marker calls from login.tsx - Refactor login validation logic from multiple if statements to a clean switch(true) pattern that evaluates boolean combinations directly - Add helpful comments documenting the structure of login method combinations - Add default case as safety fallback The switch(true) pattern eliminates the need to build a key string and makes the login method combination logic clearer and more maintainable. Prompt: Remove deprecated t() translation marker function used by old mmjstool. Refactor login validation from if blocks to switch(true) with boolean cases. * refactor(i18n): share IntlProvider's intl instance with getIntl() Make getIntl() return the same IntlShape instance that IntlProvider creates, ensuring consistency between React components (using useIntl()) and non-React contexts (using getIntl()). Changes: - Add intlInstance storage in utils/i18n.tsx - Export setIntl() function to store the intl instance - Modify getIntl() to return stored instance if available, with fallback to createIntl() for tests and early initialization - Add IntlCapture component in IntlProvider that uses useIntl() hook to capture and store the intl instance via setIntl() Benefits: - Single source of truth: Both React and non-React code use the same IntlShape - Consistent translations: No duplicate translation loading or potential desync - Leverages IntlProvider's translation loading lifecycle automatically - Maintains fallback for edge cases where IntlProvider hasn't mounted yet Prompt: Refactor getIntl() to reuse IntlProvider's intl instance instead of creating a separate instance, ensuring both React and non-React contexts use the same translations and intl configuration. * 1 * exclude test files * reset en.json * refactor(i18n): inline message ID constants for formatjs extraction Replace dynamic ID references with literal strings to enable proper formatjs extraction. Formatjs can only extract from static message IDs, not from variables or computed IDs. Changes: - configuration_bar.tsx: Inline AnnouncementBarMessages constants to literal string IDs ('announcement_bar.error.past_grace', 'announcement_bar.error.preview_mode') - system_analytics.test.tsx: Replace variable IDs (totalPlaybooksID, totalPlaybookRunsID) with literal strings ('total_playbooks', 'total_playbook_runs') - password.tsx: Use full message descriptor from passwordErrors object instead of dynamic ID with hardcoded defaultMessage. The errorId is still built dynamically using template strings, but the actual message is looked up from the passwordErrors defineMessages block where formatjs can extract it. This eliminates all "[id]" placeholder entries from extraction output and ensures all messages have proper extractable definitions. Prompt: Fix dynamic message ID references that formatjs extraction can't parse. Inline constants and use message descriptor lookups to enable clean extraction without [id] placeholders. * fix(i18n): add missing defaultMessage to drafts.tooltipText The drafts.tooltipText FormattedMessage had an empty defaultMessage, causing formatjs extraction to output an empty string for this message. Added the proper defaultMessage with plural formatting for draft and scheduled post counts. Prompt: Fix empty defaultMessage in drafts tooltip causing extraction issues. * feat(i18n): add --preserve-whitespace flag to formatjs extraction Add the --preserve-whitespace flag to ensure formatjs extraction maintains exact whitespace from defaultMessage values. This is important for messages with intentional formatting like tabs, multiple spaces, or line breaks. Prompt: Add --preserve-whitespace to i18n extraction to maintain exact formatting. * feat(i18n): add custom formatjs formatter matching mmjstool ordering Create custom formatter that replicates mmjstool's sorting behavior: - Case-insensitive alphabetical sorting - Underscore (_) sorts before dot (.) to match existing en.json ordering - Simple key-value format (extracts defaultMessage) The underscore-before-dot collation matches mmjstool's actual behavior and reduces diff size by 50% compared to standard alphabetical sorting. Changes: - scripts/formatter.js: Custom compareMessages, format, and compile functions - package.json: Use --format scripts/formatter.js instead of --format simple Prompt: Create custom formatjs formatter matching mmjstool's exact sorting behavior including underscore-before-dot collation to minimize migration diff. * feat(i18n): enhance reconciliation script with git history metadata Add git log lookups to show when each message was last modified in both en.json and code files. This enables data-driven decisions about which version to keep when resolving conflicts. Enhancements: - getEnJsonLastModified(): Find when an en.json entry last changed - findCodeFile(): Locate source file for a message ID (handles id= and id:) - getCodeLastModified(): Get last modification date for source files - Caching for performance (minimizes git operations) Output includes: 📅 en.json: [date] | [hash] | [commit message] 📅 code: [date] | [hash] | [commit message] 📂 file: [source file path] Analysis shows en.json entries from 2023 while code actively updated 2024-2025, indicating code is more authoritative. Prompt: Add git history to reconciliation report showing modification dates for data-driven conflict resolution decisions. * feat(i18n): add optional duplicate message ID check script Add i18n-extract:check-duplicates script that fails if the same message ID has different defaultMessages in multiple locations. This is kept as an optional standalone script rather than auto-chained with i18n-extract to allow the migration to proceed while duplicates are addressed separately. Usage: npm run i18n-extract:check-duplicates The script runs formatjs extract to /dev/null and checks stderr for "Duplicate message id" warnings, failing if any are found. Prompt: Add optional duplicate ID check as standalone npm script for gradual migration without blocking on existing duplicate message IDs. * about.enterpriseEditionLearn * admin.accesscontrol.title * eslint-plugin-formatjs version to eslint 8 compat * admin.channel_settings.channel_detail.access_control_policy_title * admin.connectionSecurityTls - now: admin.connectionSecurityTls.title * admin.customProfileAttribDesc now: - admin.customProfileAttribDesc.ldap - admin.customProfileAttribDesc.saml * admin.gitlab.clientSecretExample * package-lock * admin.google.EnableMarkdownDesc - fix err `]` in admin.google.EnableMarkdownDesc.openid - now: - admin.google.EnableMarkdownDesc.oauth - admin.google.EnableMarkdownDesc.openid * admin.image.amazonS3BucketExample - now: - admin.image.amazonS3BucketExample - admin.image.amazonS3BucketExampleExport * admin.license.trialCard.contactSales * admin.log.AdvancedLoggingJSONDescription - now: - admin.log.AdvancedLoggingJSONDescription - admin.log.AdvancedAuditLoggingJSONDescription * admin.rate.noteDescription - now - admin.rate.noteDescription - admin.info_banner.restart_required.desc (3) * admin.system_properties.user_properties.title - now: - admin.system_properties.user_properties.title - admin.accesscontrol.user_properties.link.label * admin.system_users.filters.team.allTeams, admin.system_users.filters.team.noTeams * admin.user_item.email_title * announcement_bar.error.preview_mode * channel_settings.error_purpose_length * deactivate_member_modal.desc - now: - deactivate_member_modal.desc - deactivate_member_modal.desc_with_confirmation * deleteChannelModal.canViewArchivedChannelsWarning * edit_channel_header_modal.error * filtered_channels_list.search - now: - filtered_channels_list.search - filtered_channels_list.search.label * flag_post.flag * generic_icons.collapse * installed_outgoing_oauth_connections.header * intro_messages.group_message * intro_messages.notificationPreferences - now: - intro_messages.notificationPreferences - intro_messages.notificationPreferences.label * katex.error * multiselect.placeholder - now: - multiselect.placeholder - multiselect.placeholder.addMembers * post_info.pin, post_info.unpin, rhs_root.mobile.flag take en.json * texteditor.rewrite.rewriting * user_groups_modal.addPeople split to user_groups_modal.addPeople.field_title * user.settings.general.validImage take en.json * userSettings.adminMode.modal_header take en.json * webapp.mattermost.feature.start_call split to user_profile.call.start * admin.general.localization.enableExperimentalLocalesDescription take en.json * login.contact_admin.title, login.contact_admin.detail take en.json * fix: correct spelling of "complementary" in accessibility sections * Revert "about.enterpriseEditionLearn" This reverts commit 23ababe1ce0aca746ad0e81d2cd5f4f19541d3d7. * about.enterpriseEditionLearn, about.planNameLearn * fix: improve clarity and consistency in activity log and command descriptions * fix: update emoji upload limits and improve help text for emoji creation * fix easy round 1 * fix: improve messaging for free trial notifications and sales contact take en.json * admin.billing.subscription.planDetails.features.limitedFileStorage take en.json * admin.billing.subscription.updatePaymentInfo take en.json * fix easy round 2 * admin.complianceExport.exportFormat.globalrelay take en.json * fix round 3 * fix round 4 * fix round 5 * fix round 6 * fix closing tag, newlines, and popout title * fix linting, + * update snapshots * test(webapp): update tests to match formatjs migration message changes Update test assertions to reflect message text changes from the mmjstool → @formatjs/cli migration. All changes align with the corresponding i18n message updates in the codebase. Changes: - limits.test.tsx: Update capitalization (Message History → Message history, File Storage → File storage) - emoji_picker.test.tsx: Update label (Recent → Recently Used) - command.test.js: Add period to error message - channel_activity_warning_modal.test.tsx: Update warning text assertion - channel_settings_archive_tab.test.tsx: Update archive warning text - feature_discovery.test.tsx: Update agreement name (Software and Services License Agreement → Software Evaluation Agreement) - flag_post_modal.test.tsx: Update placeholder text (Select a reason for flagging → Select a reason) - channel_intro_message.test.tsx: Remove trailing space from assertion - elasticsearch_settings.tsx: Fix searchableStrings placeholder names (documentationLink → link) to match updated message format All 983 test suites passing (12 tests fixed, 9088 tests total). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * chore(i18n): improve cross-platform compatibility and cleanup temporary tooling Simplify i18n check scripts to reuse npm run i18n-extract, improving cross-platform compatibility and reducing duplication. Changes: - Refactor i18n-extract:check to reuse base extraction command - Uses project-local temp file instead of /tmp (Windows compatible) - Simplified from duplicated formatjs command to npm run reuse - Add --throws flag to fail fast on extraction errors - Add helpful error message: "To update: npm run i18n-extract" - Add i18n-extract:check to main check script - Now runs alongside ESLint and Stylelint checks - Ensures en.json stays in sync with code changes - Remove i18n-extract:check-duplicates script - Redundant - duplicates are caught by i18n-extract automatically - Avoided grep dependency (not cross-platform) - Remove temporary reconciliation tooling - Deleted scripts/i18n-reconcile-conflicts.js (served its purpose) - Removed i18n-reconcile npm script - Add .i18n-check.tmp.json to .gitignore i18n-extract:check now works on Windows, macOS, and Linux. Requires only diff command (available via Git on Windows). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * ci(webapp): simplify i18n check using npm script Replace custom i18n check in CI with npm run i18n-extract:check for consistency with local development workflow. Changes: - Update check-i18n job to use npm run i18n-extract:check - Remove manual cp/extract/diff steps (3 lines → 1 line) - Consistent behavior between CI and local development - Cross-platform compatible (no /tmp dependency) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * feat(i18n): add i18n extraction targets to Makefile and workspace scripts Add Make targets and npm workspace scripts for i18n message extraction to provide consistent tooling access across the project. Changes: - Add make i18n-extract target to webapp/Makefile - Extracts i18n messages from code to en.json - Add make i18n-extract-check target to webapp/Makefile - Checks if en.json is in sync with code - Add i18n-extract workspace script to webapp/package.json - Runs extraction across all workspaces - Add i18n-extract:check workspace script to webapp/package.json - Runs sync check across all workspaces Usage: make i18n-extract # Extract messages make i18n-extract-check # Check if en.json needs update npm run i18n-extract # From webapp root npm run i18n-extract:check 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * feat(i18n): add cross-platform cleanup utility for temp files Add Node.js cleanup script to handle temporary file removal in a cross-platform manner, replacing platform-specific rm commands. Changes: - Add webapp/scripts/cleanup.js - Cross-platform file deletion utility - Silently handles missing files - Works on Windows/Mac/Linux - Update i18n-extract:check to use cleanup script - Removes .i18n-check.tmp.json after diff - Cleans up on both success and failure paths Usage: node scripts/cleanup.js <file1> [file2] [...] 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * chore(i18n): remove 'defineMessage' from additionalFunctionNames in ESLint config * chore(i18n): update i18n-extract check script and remove unused cleanup utility context: WSL is already required on windows * chore(i18n): remove ESLint rule disabling for formatjs placeholders in admin definition * chore(i18n): admin_definition - re-add defineMessage to eslint additionalfunctionnames - mark additional individual placeholder lines in admin_definition * fix(i18n): correct typo in enterprise edition link message * chore(i18n): fix escape sequences * revert emoji.ts changes * fix snapshots * fix admin.google.EnableMarkdownDesc - keep en.json but fix linkAPI and <strong>Create</strong> * restore newlines, and final corrections check * update snapshots * fix: i18n * chore(e2e): admin.complianceExport.exportJobStartTime.title * chore(e2e): emoji_picker.travel-places * chore(e2e): user.settings.general.incorrectPassword * chore(e2e): signup_user_completed.create * chore(e2e): fix Invite People * chore(fix): admin console email heading * chore(e2e): fix edit_channel_header_modal.placeholder * chore(e2e): fix Create account * chore(e2e): fix Create account * chore(e2e): correct success message text in password update alert * fix: admin guide label * chore(e2e): update role name in invite people combobox * chore(e2e): more "Create account" * chore(e2e): fix authentication_spec * lint --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Mattermost Build <build@mattermost.com>
2026-01-12 18:22:04 -05:00
"i18n-extract": "npm run i18n-extract --workspaces --if-present",
"i18n-extract:check": "npm run i18n-extract:check --workspaces --if-present",
"clean": "npm run clean --workspaces --if-present",
"gen-lang-imports": "node scripts/gen_lang_imports.mjs"
},
"dependencies": {
"@mattermost/compass-icons": "0.1.52",
"react-intl": "7.1.14",
Fixathon: Web app dependency updates part 1 (#29036) * Ensure all packages remove a node_modules in their folder when cleaning * Upgrade typescript to 5.6.3 and move to root package.json Note that this currently fails to build the types package due to @types/node which I'm going to try to remove * Update @types/node to 20.11 to match .nvmrc * Upgrade zen-observable to 0.10.0 It looks like localforage-observable uses its own version of zen-observable because it hasn't been updated in years. This seems like something we probably should remove. * Update yargs to 17.7.2 * Update webpack-dev-server to 5.1.0 * Remove webpack-bundle-analyzer since we haven't used it in years * Update webpack to 5.95.0 * Update web-vitals to 4.2.4 * Update turndown to 7.2.0 * Update tinycolor2 to 1.6.0 * Update timezones.json to 1.7.0 * Update stylelint to 16.10.0, stylelint-config-recommended-scss to 14.1.0, and stylelint-scss to 6.8.1 * Update webpack-cli to 5.1.4 * Update style-loader to 4.0.0 * Change all Webpack scripts to be ES modules * Update strip-ansi to 7.1.0 This is a build script dependency * Update chalk to 5.3.0 This is a build script dependency * Update concurrently to 9.0.1 This is a build script dependency * Update smooth-scroll-into-view-if-needed to 2.0.2 * MM-48205 Update serialize-error to 11.0.3 We didn't update this before because it's an ES module which caused Jest to complain. We can fix that by making Jest transform the it * Update semver to 7.6.3 * Update types for semver, tinycolor2, turndown, and webpack * Fix type issues: change Props to a type * Fix type issues: invalid HTML attributes * Remove unneeded option from Webpack config
2024-11-06 13:40:19 -05:00
"typescript": "5.6.3"
},
"devDependencies": {
"@babel/core": "7.28.5",
"@babel/preset-env": "7.28.5",
"@babel/preset-react": "7.28.5",
"@babel/preset-typescript": "7.28.5",
MM-66653: migrate i18n extraction from mmjstool to @formatjs/cli (#34498) * feat(webapp): migrate i18n extraction from mmjstool to @formatjs/cli Replace custom mmjstool with industry-standard @formatjs/cli for i18n message extraction. Adds support for localizeMessage as a recognized extraction function and enables comprehensive ESLint rules for i18n. Changes by area: Dependencies (package.json): - Add @formatjs/cli v6.7.4 - Remove @mattermost/mmjstool dependency - Replace i18n-extract script with formatjs command - Remove mmjstool-specific scripts (clean-empty, check-empty-src) - Add i18n-extract:check for diff validation Code (utils.tsx): - Refactor localizeMessage to accept MessageDescriptor format - Support {id, defaultMessage, description} parameters - Maintain Redux store access (non-React context compatible) - Add comprehensive JSDoc documentation Linting (.eslintrc.json): - Configure formatjs settings with additionalFunctionNames - Enable 9 formatjs ESLint rules including enforce-id (error) - Ensure all messages require explicit manual IDs CI/CD (webapp-ci.yml): - Simplify i18n check to formatjs extraction + diff - Remove mmjstool and mobile-dir references Context: Second attempt at PR #25830. Uses manual IDs only with [id] placeholder pattern to enforce explicit ID requirements. ESLint will catch missing IDs during development. * chore(webapp): add temporary i18n reconciliation tooling Add helper script to analyze conflicts between en.json and defaultMessage values in code. This tooling will be reverted after initial migration cleanup is complete. Tooling added: - scripts/i18n-reconcile-conflicts.js: Analyzes conflicts - Detects spelling corrections - Identifies placeholder mismatches - Flags significant content changes - Provides recommendations on which version to keep - npm script: i18n-reconcile Usage: npm run i18n-reconcile This will be reverted after reconciling the ~50 duplicate message warnings and determining correct versions for conflicting messages. * chore(webapp): upgrade eslint-plugin-formatjs and centralize formatjs deps Move @formatjs/cli to root webapp package.json alongside other formatjs dependencies for better monorepo organization. Upgrade eslint-plugin-formatjs from 4.12.2 to 5.4.2 for latest features and bug fixes. Changes: - Upgrade eslint-plugin-formatjs: 4.12.2 → 5.4.2 - Move @formatjs/cli to webapp/package.json (from channels) - Centralize formatjs tooling at monorepo root level This provides: - Better dependency management in monorepo - Latest formatjs ESLint rules and features - Consistent tooling across workspaces * feat(webapp): make localizeMessage fully compatible with formatMessage API Extend localizeMessage to accept a values parameter for placeholder interpolation, making it fully compatible with react-intl's formatMessage API. Remove the now-redundant localizeAndFormatMessage function. Changes to localizeMessage: - Add values parameter for {placeholder} interpolation - Use getIntl() for proper ICU message formatting - Support full formatMessage feature parity outside React contexts - Update JSDoc with interpolation examples - Mark as deprecated (prefer useIntl in React components) Code cleanup: - Remove localizeAndFormatMessage function (redundant) - Migrate all localizeAndFormatMessage usages to localizeMessage - Remove unused imports: getCurrentLocale, getTranslations - Add getIntl import Files migrated: - notification_actions.tsx: notification.crt message - app_command_parser_dependencies.ts: intlShim formatMessage This consolidates i18n logic and provides a single, feature-complete localization function for non-React contexts. Example usage: // Before (old function) localizeAndFormatMessage( {id: 'welcome', defaultMessage: 'Hello {name}'}, {name: 'John'} ) // After (consolidated) localizeMessage( {id: 'welcome', defaultMessage: 'Hello {name}'}, {name: 'John'} ) * refactor(i18n): remove intlShim abstraction, use IntlShape directly Remove intlShim wrapper and use react-intl's IntlShape type throughout. Key Changes: - Remove intlShim constant from app_command_parser_dependencies.ts - Update errorMessage() signature to accept IntlShape parameter - Use IntlShape for intl properties in AppCommandParser and ParsedCommand - Call getIntl() at function start in actions (command.ts, marketplace.ts) - Pass IntlShape to AppCommandParser and doAppSubmit consistently Files Modified: - app_command_parser_dependencies.ts: Remove intlShim, update errorMessage - app_command_parser.ts: Use IntlShape type - command.ts, marketplace.ts: Call getIntl() early, pass to parser - app_provider.tsx, command_provider.tsx: Use getIntl() in constructor - apps.ts: Update doAppSubmit signature Benefits: Better type safety, standard react-intl patterns, eliminates unnecessary abstraction. Context: Part of migration to @formatjs/cli tooling. * refactor(webapp): remove deprecated t() function and refactor login validation Remove the deprecated t() function that was used as a marker for the old mmjstool extraction. With @formatjs/cli, this is no longer needed as extraction happens directly from formatMessage calls. Changes: - Remove t() function definition from utils/i18n.tsx - Remove t() import and marker calls from login.tsx - Refactor login validation logic from multiple if statements to a clean switch(true) pattern that evaluates boolean combinations directly - Add helpful comments documenting the structure of login method combinations - Add default case as safety fallback The switch(true) pattern eliminates the need to build a key string and makes the login method combination logic clearer and more maintainable. Prompt: Remove deprecated t() translation marker function used by old mmjstool. Refactor login validation from if blocks to switch(true) with boolean cases. * refactor(i18n): share IntlProvider's intl instance with getIntl() Make getIntl() return the same IntlShape instance that IntlProvider creates, ensuring consistency between React components (using useIntl()) and non-React contexts (using getIntl()). Changes: - Add intlInstance storage in utils/i18n.tsx - Export setIntl() function to store the intl instance - Modify getIntl() to return stored instance if available, with fallback to createIntl() for tests and early initialization - Add IntlCapture component in IntlProvider that uses useIntl() hook to capture and store the intl instance via setIntl() Benefits: - Single source of truth: Both React and non-React code use the same IntlShape - Consistent translations: No duplicate translation loading or potential desync - Leverages IntlProvider's translation loading lifecycle automatically - Maintains fallback for edge cases where IntlProvider hasn't mounted yet Prompt: Refactor getIntl() to reuse IntlProvider's intl instance instead of creating a separate instance, ensuring both React and non-React contexts use the same translations and intl configuration. * 1 * exclude test files * reset en.json * refactor(i18n): inline message ID constants for formatjs extraction Replace dynamic ID references with literal strings to enable proper formatjs extraction. Formatjs can only extract from static message IDs, not from variables or computed IDs. Changes: - configuration_bar.tsx: Inline AnnouncementBarMessages constants to literal string IDs ('announcement_bar.error.past_grace', 'announcement_bar.error.preview_mode') - system_analytics.test.tsx: Replace variable IDs (totalPlaybooksID, totalPlaybookRunsID) with literal strings ('total_playbooks', 'total_playbook_runs') - password.tsx: Use full message descriptor from passwordErrors object instead of dynamic ID with hardcoded defaultMessage. The errorId is still built dynamically using template strings, but the actual message is looked up from the passwordErrors defineMessages block where formatjs can extract it. This eliminates all "[id]" placeholder entries from extraction output and ensures all messages have proper extractable definitions. Prompt: Fix dynamic message ID references that formatjs extraction can't parse. Inline constants and use message descriptor lookups to enable clean extraction without [id] placeholders. * fix(i18n): add missing defaultMessage to drafts.tooltipText The drafts.tooltipText FormattedMessage had an empty defaultMessage, causing formatjs extraction to output an empty string for this message. Added the proper defaultMessage with plural formatting for draft and scheduled post counts. Prompt: Fix empty defaultMessage in drafts tooltip causing extraction issues. * feat(i18n): add --preserve-whitespace flag to formatjs extraction Add the --preserve-whitespace flag to ensure formatjs extraction maintains exact whitespace from defaultMessage values. This is important for messages with intentional formatting like tabs, multiple spaces, or line breaks. Prompt: Add --preserve-whitespace to i18n extraction to maintain exact formatting. * feat(i18n): add custom formatjs formatter matching mmjstool ordering Create custom formatter that replicates mmjstool's sorting behavior: - Case-insensitive alphabetical sorting - Underscore (_) sorts before dot (.) to match existing en.json ordering - Simple key-value format (extracts defaultMessage) The underscore-before-dot collation matches mmjstool's actual behavior and reduces diff size by 50% compared to standard alphabetical sorting. Changes: - scripts/formatter.js: Custom compareMessages, format, and compile functions - package.json: Use --format scripts/formatter.js instead of --format simple Prompt: Create custom formatjs formatter matching mmjstool's exact sorting behavior including underscore-before-dot collation to minimize migration diff. * feat(i18n): enhance reconciliation script with git history metadata Add git log lookups to show when each message was last modified in both en.json and code files. This enables data-driven decisions about which version to keep when resolving conflicts. Enhancements: - getEnJsonLastModified(): Find when an en.json entry last changed - findCodeFile(): Locate source file for a message ID (handles id= and id:) - getCodeLastModified(): Get last modification date for source files - Caching for performance (minimizes git operations) Output includes: 📅 en.json: [date] | [hash] | [commit message] 📅 code: [date] | [hash] | [commit message] 📂 file: [source file path] Analysis shows en.json entries from 2023 while code actively updated 2024-2025, indicating code is more authoritative. Prompt: Add git history to reconciliation report showing modification dates for data-driven conflict resolution decisions. * feat(i18n): add optional duplicate message ID check script Add i18n-extract:check-duplicates script that fails if the same message ID has different defaultMessages in multiple locations. This is kept as an optional standalone script rather than auto-chained with i18n-extract to allow the migration to proceed while duplicates are addressed separately. Usage: npm run i18n-extract:check-duplicates The script runs formatjs extract to /dev/null and checks stderr for "Duplicate message id" warnings, failing if any are found. Prompt: Add optional duplicate ID check as standalone npm script for gradual migration without blocking on existing duplicate message IDs. * about.enterpriseEditionLearn * admin.accesscontrol.title * eslint-plugin-formatjs version to eslint 8 compat * admin.channel_settings.channel_detail.access_control_policy_title * admin.connectionSecurityTls - now: admin.connectionSecurityTls.title * admin.customProfileAttribDesc now: - admin.customProfileAttribDesc.ldap - admin.customProfileAttribDesc.saml * admin.gitlab.clientSecretExample * package-lock * admin.google.EnableMarkdownDesc - fix err `]` in admin.google.EnableMarkdownDesc.openid - now: - admin.google.EnableMarkdownDesc.oauth - admin.google.EnableMarkdownDesc.openid * admin.image.amazonS3BucketExample - now: - admin.image.amazonS3BucketExample - admin.image.amazonS3BucketExampleExport * admin.license.trialCard.contactSales * admin.log.AdvancedLoggingJSONDescription - now: - admin.log.AdvancedLoggingJSONDescription - admin.log.AdvancedAuditLoggingJSONDescription * admin.rate.noteDescription - now - admin.rate.noteDescription - admin.info_banner.restart_required.desc (3) * admin.system_properties.user_properties.title - now: - admin.system_properties.user_properties.title - admin.accesscontrol.user_properties.link.label * admin.system_users.filters.team.allTeams, admin.system_users.filters.team.noTeams * admin.user_item.email_title * announcement_bar.error.preview_mode * channel_settings.error_purpose_length * deactivate_member_modal.desc - now: - deactivate_member_modal.desc - deactivate_member_modal.desc_with_confirmation * deleteChannelModal.canViewArchivedChannelsWarning * edit_channel_header_modal.error * filtered_channels_list.search - now: - filtered_channels_list.search - filtered_channels_list.search.label * flag_post.flag * generic_icons.collapse * installed_outgoing_oauth_connections.header * intro_messages.group_message * intro_messages.notificationPreferences - now: - intro_messages.notificationPreferences - intro_messages.notificationPreferences.label * katex.error * multiselect.placeholder - now: - multiselect.placeholder - multiselect.placeholder.addMembers * post_info.pin, post_info.unpin, rhs_root.mobile.flag take en.json * texteditor.rewrite.rewriting * user_groups_modal.addPeople split to user_groups_modal.addPeople.field_title * user.settings.general.validImage take en.json * userSettings.adminMode.modal_header take en.json * webapp.mattermost.feature.start_call split to user_profile.call.start * admin.general.localization.enableExperimentalLocalesDescription take en.json * login.contact_admin.title, login.contact_admin.detail take en.json * fix: correct spelling of "complementary" in accessibility sections * Revert "about.enterpriseEditionLearn" This reverts commit 23ababe1ce0aca746ad0e81d2cd5f4f19541d3d7. * about.enterpriseEditionLearn, about.planNameLearn * fix: improve clarity and consistency in activity log and command descriptions * fix: update emoji upload limits and improve help text for emoji creation * fix easy round 1 * fix: improve messaging for free trial notifications and sales contact take en.json * admin.billing.subscription.planDetails.features.limitedFileStorage take en.json * admin.billing.subscription.updatePaymentInfo take en.json * fix easy round 2 * admin.complianceExport.exportFormat.globalrelay take en.json * fix round 3 * fix round 4 * fix round 5 * fix round 6 * fix closing tag, newlines, and popout title * fix linting, + * update snapshots * test(webapp): update tests to match formatjs migration message changes Update test assertions to reflect message text changes from the mmjstool → @formatjs/cli migration. All changes align with the corresponding i18n message updates in the codebase. Changes: - limits.test.tsx: Update capitalization (Message History → Message history, File Storage → File storage) - emoji_picker.test.tsx: Update label (Recent → Recently Used) - command.test.js: Add period to error message - channel_activity_warning_modal.test.tsx: Update warning text assertion - channel_settings_archive_tab.test.tsx: Update archive warning text - feature_discovery.test.tsx: Update agreement name (Software and Services License Agreement → Software Evaluation Agreement) - flag_post_modal.test.tsx: Update placeholder text (Select a reason for flagging → Select a reason) - channel_intro_message.test.tsx: Remove trailing space from assertion - elasticsearch_settings.tsx: Fix searchableStrings placeholder names (documentationLink → link) to match updated message format All 983 test suites passing (12 tests fixed, 9088 tests total). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * chore(i18n): improve cross-platform compatibility and cleanup temporary tooling Simplify i18n check scripts to reuse npm run i18n-extract, improving cross-platform compatibility and reducing duplication. Changes: - Refactor i18n-extract:check to reuse base extraction command - Uses project-local temp file instead of /tmp (Windows compatible) - Simplified from duplicated formatjs command to npm run reuse - Add --throws flag to fail fast on extraction errors - Add helpful error message: "To update: npm run i18n-extract" - Add i18n-extract:check to main check script - Now runs alongside ESLint and Stylelint checks - Ensures en.json stays in sync with code changes - Remove i18n-extract:check-duplicates script - Redundant - duplicates are caught by i18n-extract automatically - Avoided grep dependency (not cross-platform) - Remove temporary reconciliation tooling - Deleted scripts/i18n-reconcile-conflicts.js (served its purpose) - Removed i18n-reconcile npm script - Add .i18n-check.tmp.json to .gitignore i18n-extract:check now works on Windows, macOS, and Linux. Requires only diff command (available via Git on Windows). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * ci(webapp): simplify i18n check using npm script Replace custom i18n check in CI with npm run i18n-extract:check for consistency with local development workflow. Changes: - Update check-i18n job to use npm run i18n-extract:check - Remove manual cp/extract/diff steps (3 lines → 1 line) - Consistent behavior between CI and local development - Cross-platform compatible (no /tmp dependency) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * feat(i18n): add i18n extraction targets to Makefile and workspace scripts Add Make targets and npm workspace scripts for i18n message extraction to provide consistent tooling access across the project. Changes: - Add make i18n-extract target to webapp/Makefile - Extracts i18n messages from code to en.json - Add make i18n-extract-check target to webapp/Makefile - Checks if en.json is in sync with code - Add i18n-extract workspace script to webapp/package.json - Runs extraction across all workspaces - Add i18n-extract:check workspace script to webapp/package.json - Runs sync check across all workspaces Usage: make i18n-extract # Extract messages make i18n-extract-check # Check if en.json needs update npm run i18n-extract # From webapp root npm run i18n-extract:check 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * feat(i18n): add cross-platform cleanup utility for temp files Add Node.js cleanup script to handle temporary file removal in a cross-platform manner, replacing platform-specific rm commands. Changes: - Add webapp/scripts/cleanup.js - Cross-platform file deletion utility - Silently handles missing files - Works on Windows/Mac/Linux - Update i18n-extract:check to use cleanup script - Removes .i18n-check.tmp.json after diff - Cleans up on both success and failure paths Usage: node scripts/cleanup.js <file1> [file2] [...] 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * chore(i18n): remove 'defineMessage' from additionalFunctionNames in ESLint config * chore(i18n): update i18n-extract check script and remove unused cleanup utility context: WSL is already required on windows * chore(i18n): remove ESLint rule disabling for formatjs placeholders in admin definition * chore(i18n): admin_definition - re-add defineMessage to eslint additionalfunctionnames - mark additional individual placeholder lines in admin_definition * fix(i18n): correct typo in enterprise edition link message * chore(i18n): fix escape sequences * revert emoji.ts changes * fix snapshots * fix admin.google.EnableMarkdownDesc - keep en.json but fix linkAPI and <strong>Create</strong> * restore newlines, and final corrections check * update snapshots * fix: i18n * chore(e2e): admin.complianceExport.exportJobStartTime.title * chore(e2e): emoji_picker.travel-places * chore(e2e): user.settings.general.incorrectPassword * chore(e2e): signup_user_completed.create * chore(e2e): fix Invite People * chore(fix): admin console email heading * chore(e2e): fix edit_channel_header_modal.placeholder * chore(e2e): fix Create account * chore(e2e): fix Create account * chore(e2e): correct success message text in password update alert * fix: admin guide label * chore(e2e): update role name in invite people combobox * chore(e2e): more "Create account" * chore(e2e): fix authentication_spec * lint --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Mattermost Build <build@mattermost.com>
2026-01-12 18:22:04 -05:00
"@formatjs/cli": "6.7.4",
"@types/node": "24.10.4",
"babel-loader": "9.1.2",
"babel-plugin-formatjs": "10.5.1",
"babel-plugin-typescript-to-proptypes": "2.1.0",
"blessed": "0.1.81",
Fixathon: Web app dependency updates part 1 (#29036) * Ensure all packages remove a node_modules in their folder when cleaning * Upgrade typescript to 5.6.3 and move to root package.json Note that this currently fails to build the types package due to @types/node which I'm going to try to remove * Update @types/node to 20.11 to match .nvmrc * Upgrade zen-observable to 0.10.0 It looks like localforage-observable uses its own version of zen-observable because it hasn't been updated in years. This seems like something we probably should remove. * Update yargs to 17.7.2 * Update webpack-dev-server to 5.1.0 * Remove webpack-bundle-analyzer since we haven't used it in years * Update webpack to 5.95.0 * Update web-vitals to 4.2.4 * Update turndown to 7.2.0 * Update tinycolor2 to 1.6.0 * Update timezones.json to 1.7.0 * Update stylelint to 16.10.0, stylelint-config-recommended-scss to 14.1.0, and stylelint-scss to 6.8.1 * Update webpack-cli to 5.1.4 * Update style-loader to 4.0.0 * Change all Webpack scripts to be ES modules * Update strip-ansi to 7.1.0 This is a build script dependency * Update chalk to 5.3.0 This is a build script dependency * Update concurrently to 9.0.1 This is a build script dependency * Update smooth-scroll-into-view-if-needed to 2.0.2 * MM-48205 Update serialize-error to 11.0.3 We didn't update this before because it's an ES module which caused Jest to complain. We can fix that by making Jest transform the it * Update semver to 7.6.3 * Update types for semver, tinycolor2, turndown, and webpack * Fix type issues: change Props to a type * Fix type issues: invalid HTML attributes * Remove unneeded option from Webpack config
2024-11-06 13:40:19 -05:00
"chalk": "5.3.0",
"concurrently": "9.0.1",
"cross-env": "7.0.3",
"css-loader": "6.7.3",
"eslint": "8.57.0",
"eslint-import-resolver-webpack": "0.13.8",
MM-66653: migrate i18n extraction from mmjstool to @formatjs/cli (#34498) * feat(webapp): migrate i18n extraction from mmjstool to @formatjs/cli Replace custom mmjstool with industry-standard @formatjs/cli for i18n message extraction. Adds support for localizeMessage as a recognized extraction function and enables comprehensive ESLint rules for i18n. Changes by area: Dependencies (package.json): - Add @formatjs/cli v6.7.4 - Remove @mattermost/mmjstool dependency - Replace i18n-extract script with formatjs command - Remove mmjstool-specific scripts (clean-empty, check-empty-src) - Add i18n-extract:check for diff validation Code (utils.tsx): - Refactor localizeMessage to accept MessageDescriptor format - Support {id, defaultMessage, description} parameters - Maintain Redux store access (non-React context compatible) - Add comprehensive JSDoc documentation Linting (.eslintrc.json): - Configure formatjs settings with additionalFunctionNames - Enable 9 formatjs ESLint rules including enforce-id (error) - Ensure all messages require explicit manual IDs CI/CD (webapp-ci.yml): - Simplify i18n check to formatjs extraction + diff - Remove mmjstool and mobile-dir references Context: Second attempt at PR #25830. Uses manual IDs only with [id] placeholder pattern to enforce explicit ID requirements. ESLint will catch missing IDs during development. * chore(webapp): add temporary i18n reconciliation tooling Add helper script to analyze conflicts between en.json and defaultMessage values in code. This tooling will be reverted after initial migration cleanup is complete. Tooling added: - scripts/i18n-reconcile-conflicts.js: Analyzes conflicts - Detects spelling corrections - Identifies placeholder mismatches - Flags significant content changes - Provides recommendations on which version to keep - npm script: i18n-reconcile Usage: npm run i18n-reconcile This will be reverted after reconciling the ~50 duplicate message warnings and determining correct versions for conflicting messages. * chore(webapp): upgrade eslint-plugin-formatjs and centralize formatjs deps Move @formatjs/cli to root webapp package.json alongside other formatjs dependencies for better monorepo organization. Upgrade eslint-plugin-formatjs from 4.12.2 to 5.4.2 for latest features and bug fixes. Changes: - Upgrade eslint-plugin-formatjs: 4.12.2 → 5.4.2 - Move @formatjs/cli to webapp/package.json (from channels) - Centralize formatjs tooling at monorepo root level This provides: - Better dependency management in monorepo - Latest formatjs ESLint rules and features - Consistent tooling across workspaces * feat(webapp): make localizeMessage fully compatible with formatMessage API Extend localizeMessage to accept a values parameter for placeholder interpolation, making it fully compatible with react-intl's formatMessage API. Remove the now-redundant localizeAndFormatMessage function. Changes to localizeMessage: - Add values parameter for {placeholder} interpolation - Use getIntl() for proper ICU message formatting - Support full formatMessage feature parity outside React contexts - Update JSDoc with interpolation examples - Mark as deprecated (prefer useIntl in React components) Code cleanup: - Remove localizeAndFormatMessage function (redundant) - Migrate all localizeAndFormatMessage usages to localizeMessage - Remove unused imports: getCurrentLocale, getTranslations - Add getIntl import Files migrated: - notification_actions.tsx: notification.crt message - app_command_parser_dependencies.ts: intlShim formatMessage This consolidates i18n logic and provides a single, feature-complete localization function for non-React contexts. Example usage: // Before (old function) localizeAndFormatMessage( {id: 'welcome', defaultMessage: 'Hello {name}'}, {name: 'John'} ) // After (consolidated) localizeMessage( {id: 'welcome', defaultMessage: 'Hello {name}'}, {name: 'John'} ) * refactor(i18n): remove intlShim abstraction, use IntlShape directly Remove intlShim wrapper and use react-intl's IntlShape type throughout. Key Changes: - Remove intlShim constant from app_command_parser_dependencies.ts - Update errorMessage() signature to accept IntlShape parameter - Use IntlShape for intl properties in AppCommandParser and ParsedCommand - Call getIntl() at function start in actions (command.ts, marketplace.ts) - Pass IntlShape to AppCommandParser and doAppSubmit consistently Files Modified: - app_command_parser_dependencies.ts: Remove intlShim, update errorMessage - app_command_parser.ts: Use IntlShape type - command.ts, marketplace.ts: Call getIntl() early, pass to parser - app_provider.tsx, command_provider.tsx: Use getIntl() in constructor - apps.ts: Update doAppSubmit signature Benefits: Better type safety, standard react-intl patterns, eliminates unnecessary abstraction. Context: Part of migration to @formatjs/cli tooling. * refactor(webapp): remove deprecated t() function and refactor login validation Remove the deprecated t() function that was used as a marker for the old mmjstool extraction. With @formatjs/cli, this is no longer needed as extraction happens directly from formatMessage calls. Changes: - Remove t() function definition from utils/i18n.tsx - Remove t() import and marker calls from login.tsx - Refactor login validation logic from multiple if statements to a clean switch(true) pattern that evaluates boolean combinations directly - Add helpful comments documenting the structure of login method combinations - Add default case as safety fallback The switch(true) pattern eliminates the need to build a key string and makes the login method combination logic clearer and more maintainable. Prompt: Remove deprecated t() translation marker function used by old mmjstool. Refactor login validation from if blocks to switch(true) with boolean cases. * refactor(i18n): share IntlProvider's intl instance with getIntl() Make getIntl() return the same IntlShape instance that IntlProvider creates, ensuring consistency between React components (using useIntl()) and non-React contexts (using getIntl()). Changes: - Add intlInstance storage in utils/i18n.tsx - Export setIntl() function to store the intl instance - Modify getIntl() to return stored instance if available, with fallback to createIntl() for tests and early initialization - Add IntlCapture component in IntlProvider that uses useIntl() hook to capture and store the intl instance via setIntl() Benefits: - Single source of truth: Both React and non-React code use the same IntlShape - Consistent translations: No duplicate translation loading or potential desync - Leverages IntlProvider's translation loading lifecycle automatically - Maintains fallback for edge cases where IntlProvider hasn't mounted yet Prompt: Refactor getIntl() to reuse IntlProvider's intl instance instead of creating a separate instance, ensuring both React and non-React contexts use the same translations and intl configuration. * 1 * exclude test files * reset en.json * refactor(i18n): inline message ID constants for formatjs extraction Replace dynamic ID references with literal strings to enable proper formatjs extraction. Formatjs can only extract from static message IDs, not from variables or computed IDs. Changes: - configuration_bar.tsx: Inline AnnouncementBarMessages constants to literal string IDs ('announcement_bar.error.past_grace', 'announcement_bar.error.preview_mode') - system_analytics.test.tsx: Replace variable IDs (totalPlaybooksID, totalPlaybookRunsID) with literal strings ('total_playbooks', 'total_playbook_runs') - password.tsx: Use full message descriptor from passwordErrors object instead of dynamic ID with hardcoded defaultMessage. The errorId is still built dynamically using template strings, but the actual message is looked up from the passwordErrors defineMessages block where formatjs can extract it. This eliminates all "[id]" placeholder entries from extraction output and ensures all messages have proper extractable definitions. Prompt: Fix dynamic message ID references that formatjs extraction can't parse. Inline constants and use message descriptor lookups to enable clean extraction without [id] placeholders. * fix(i18n): add missing defaultMessage to drafts.tooltipText The drafts.tooltipText FormattedMessage had an empty defaultMessage, causing formatjs extraction to output an empty string for this message. Added the proper defaultMessage with plural formatting for draft and scheduled post counts. Prompt: Fix empty defaultMessage in drafts tooltip causing extraction issues. * feat(i18n): add --preserve-whitespace flag to formatjs extraction Add the --preserve-whitespace flag to ensure formatjs extraction maintains exact whitespace from defaultMessage values. This is important for messages with intentional formatting like tabs, multiple spaces, or line breaks. Prompt: Add --preserve-whitespace to i18n extraction to maintain exact formatting. * feat(i18n): add custom formatjs formatter matching mmjstool ordering Create custom formatter that replicates mmjstool's sorting behavior: - Case-insensitive alphabetical sorting - Underscore (_) sorts before dot (.) to match existing en.json ordering - Simple key-value format (extracts defaultMessage) The underscore-before-dot collation matches mmjstool's actual behavior and reduces diff size by 50% compared to standard alphabetical sorting. Changes: - scripts/formatter.js: Custom compareMessages, format, and compile functions - package.json: Use --format scripts/formatter.js instead of --format simple Prompt: Create custom formatjs formatter matching mmjstool's exact sorting behavior including underscore-before-dot collation to minimize migration diff. * feat(i18n): enhance reconciliation script with git history metadata Add git log lookups to show when each message was last modified in both en.json and code files. This enables data-driven decisions about which version to keep when resolving conflicts. Enhancements: - getEnJsonLastModified(): Find when an en.json entry last changed - findCodeFile(): Locate source file for a message ID (handles id= and id:) - getCodeLastModified(): Get last modification date for source files - Caching for performance (minimizes git operations) Output includes: 📅 en.json: [date] | [hash] | [commit message] 📅 code: [date] | [hash] | [commit message] 📂 file: [source file path] Analysis shows en.json entries from 2023 while code actively updated 2024-2025, indicating code is more authoritative. Prompt: Add git history to reconciliation report showing modification dates for data-driven conflict resolution decisions. * feat(i18n): add optional duplicate message ID check script Add i18n-extract:check-duplicates script that fails if the same message ID has different defaultMessages in multiple locations. This is kept as an optional standalone script rather than auto-chained with i18n-extract to allow the migration to proceed while duplicates are addressed separately. Usage: npm run i18n-extract:check-duplicates The script runs formatjs extract to /dev/null and checks stderr for "Duplicate message id" warnings, failing if any are found. Prompt: Add optional duplicate ID check as standalone npm script for gradual migration without blocking on existing duplicate message IDs. * about.enterpriseEditionLearn * admin.accesscontrol.title * eslint-plugin-formatjs version to eslint 8 compat * admin.channel_settings.channel_detail.access_control_policy_title * admin.connectionSecurityTls - now: admin.connectionSecurityTls.title * admin.customProfileAttribDesc now: - admin.customProfileAttribDesc.ldap - admin.customProfileAttribDesc.saml * admin.gitlab.clientSecretExample * package-lock * admin.google.EnableMarkdownDesc - fix err `]` in admin.google.EnableMarkdownDesc.openid - now: - admin.google.EnableMarkdownDesc.oauth - admin.google.EnableMarkdownDesc.openid * admin.image.amazonS3BucketExample - now: - admin.image.amazonS3BucketExample - admin.image.amazonS3BucketExampleExport * admin.license.trialCard.contactSales * admin.log.AdvancedLoggingJSONDescription - now: - admin.log.AdvancedLoggingJSONDescription - admin.log.AdvancedAuditLoggingJSONDescription * admin.rate.noteDescription - now - admin.rate.noteDescription - admin.info_banner.restart_required.desc (3) * admin.system_properties.user_properties.title - now: - admin.system_properties.user_properties.title - admin.accesscontrol.user_properties.link.label * admin.system_users.filters.team.allTeams, admin.system_users.filters.team.noTeams * admin.user_item.email_title * announcement_bar.error.preview_mode * channel_settings.error_purpose_length * deactivate_member_modal.desc - now: - deactivate_member_modal.desc - deactivate_member_modal.desc_with_confirmation * deleteChannelModal.canViewArchivedChannelsWarning * edit_channel_header_modal.error * filtered_channels_list.search - now: - filtered_channels_list.search - filtered_channels_list.search.label * flag_post.flag * generic_icons.collapse * installed_outgoing_oauth_connections.header * intro_messages.group_message * intro_messages.notificationPreferences - now: - intro_messages.notificationPreferences - intro_messages.notificationPreferences.label * katex.error * multiselect.placeholder - now: - multiselect.placeholder - multiselect.placeholder.addMembers * post_info.pin, post_info.unpin, rhs_root.mobile.flag take en.json * texteditor.rewrite.rewriting * user_groups_modal.addPeople split to user_groups_modal.addPeople.field_title * user.settings.general.validImage take en.json * userSettings.adminMode.modal_header take en.json * webapp.mattermost.feature.start_call split to user_profile.call.start * admin.general.localization.enableExperimentalLocalesDescription take en.json * login.contact_admin.title, login.contact_admin.detail take en.json * fix: correct spelling of "complementary" in accessibility sections * Revert "about.enterpriseEditionLearn" This reverts commit 23ababe1ce0aca746ad0e81d2cd5f4f19541d3d7. * about.enterpriseEditionLearn, about.planNameLearn * fix: improve clarity and consistency in activity log and command descriptions * fix: update emoji upload limits and improve help text for emoji creation * fix easy round 1 * fix: improve messaging for free trial notifications and sales contact take en.json * admin.billing.subscription.planDetails.features.limitedFileStorage take en.json * admin.billing.subscription.updatePaymentInfo take en.json * fix easy round 2 * admin.complianceExport.exportFormat.globalrelay take en.json * fix round 3 * fix round 4 * fix round 5 * fix round 6 * fix closing tag, newlines, and popout title * fix linting, + * update snapshots * test(webapp): update tests to match formatjs migration message changes Update test assertions to reflect message text changes from the mmjstool → @formatjs/cli migration. All changes align with the corresponding i18n message updates in the codebase. Changes: - limits.test.tsx: Update capitalization (Message History → Message history, File Storage → File storage) - emoji_picker.test.tsx: Update label (Recent → Recently Used) - command.test.js: Add period to error message - channel_activity_warning_modal.test.tsx: Update warning text assertion - channel_settings_archive_tab.test.tsx: Update archive warning text - feature_discovery.test.tsx: Update agreement name (Software and Services License Agreement → Software Evaluation Agreement) - flag_post_modal.test.tsx: Update placeholder text (Select a reason for flagging → Select a reason) - channel_intro_message.test.tsx: Remove trailing space from assertion - elasticsearch_settings.tsx: Fix searchableStrings placeholder names (documentationLink → link) to match updated message format All 983 test suites passing (12 tests fixed, 9088 tests total). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * chore(i18n): improve cross-platform compatibility and cleanup temporary tooling Simplify i18n check scripts to reuse npm run i18n-extract, improving cross-platform compatibility and reducing duplication. Changes: - Refactor i18n-extract:check to reuse base extraction command - Uses project-local temp file instead of /tmp (Windows compatible) - Simplified from duplicated formatjs command to npm run reuse - Add --throws flag to fail fast on extraction errors - Add helpful error message: "To update: npm run i18n-extract" - Add i18n-extract:check to main check script - Now runs alongside ESLint and Stylelint checks - Ensures en.json stays in sync with code changes - Remove i18n-extract:check-duplicates script - Redundant - duplicates are caught by i18n-extract automatically - Avoided grep dependency (not cross-platform) - Remove temporary reconciliation tooling - Deleted scripts/i18n-reconcile-conflicts.js (served its purpose) - Removed i18n-reconcile npm script - Add .i18n-check.tmp.json to .gitignore i18n-extract:check now works on Windows, macOS, and Linux. Requires only diff command (available via Git on Windows). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * ci(webapp): simplify i18n check using npm script Replace custom i18n check in CI with npm run i18n-extract:check for consistency with local development workflow. Changes: - Update check-i18n job to use npm run i18n-extract:check - Remove manual cp/extract/diff steps (3 lines → 1 line) - Consistent behavior between CI and local development - Cross-platform compatible (no /tmp dependency) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * feat(i18n): add i18n extraction targets to Makefile and workspace scripts Add Make targets and npm workspace scripts for i18n message extraction to provide consistent tooling access across the project. Changes: - Add make i18n-extract target to webapp/Makefile - Extracts i18n messages from code to en.json - Add make i18n-extract-check target to webapp/Makefile - Checks if en.json is in sync with code - Add i18n-extract workspace script to webapp/package.json - Runs extraction across all workspaces - Add i18n-extract:check workspace script to webapp/package.json - Runs sync check across all workspaces Usage: make i18n-extract # Extract messages make i18n-extract-check # Check if en.json needs update npm run i18n-extract # From webapp root npm run i18n-extract:check 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * feat(i18n): add cross-platform cleanup utility for temp files Add Node.js cleanup script to handle temporary file removal in a cross-platform manner, replacing platform-specific rm commands. Changes: - Add webapp/scripts/cleanup.js - Cross-platform file deletion utility - Silently handles missing files - Works on Windows/Mac/Linux - Update i18n-extract:check to use cleanup script - Removes .i18n-check.tmp.json after diff - Cleans up on both success and failure paths Usage: node scripts/cleanup.js <file1> [file2] [...] 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * chore(i18n): remove 'defineMessage' from additionalFunctionNames in ESLint config * chore(i18n): update i18n-extract check script and remove unused cleanup utility context: WSL is already required on windows * chore(i18n): remove ESLint rule disabling for formatjs placeholders in admin definition * chore(i18n): admin_definition - re-add defineMessage to eslint additionalfunctionnames - mark additional individual placeholder lines in admin_definition * fix(i18n): correct typo in enterprise edition link message * chore(i18n): fix escape sequences * revert emoji.ts changes * fix snapshots * fix admin.google.EnableMarkdownDesc - keep en.json but fix linkAPI and <strong>Create</strong> * restore newlines, and final corrections check * update snapshots * fix: i18n * chore(e2e): admin.complianceExport.exportJobStartTime.title * chore(e2e): emoji_picker.travel-places * chore(e2e): user.settings.general.incorrectPassword * chore(e2e): signup_user_completed.create * chore(e2e): fix Invite People * chore(fix): admin console email heading * chore(e2e): fix edit_channel_header_modal.placeholder * chore(e2e): fix Create account * chore(e2e): fix Create account * chore(e2e): correct success message text in password update alert * fix: admin guide label * chore(e2e): update role name in invite people combobox * chore(e2e): more "Create account" * chore(e2e): fix authentication_spec * lint --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Mattermost Build <build@mattermost.com>
2026-01-12 18:22:04 -05:00
"eslint-plugin-formatjs": "4.13.3",
"eslint-plugin-react": "7.34.0",
"eslint-plugin-react-hooks": "4.6.0",
"mini-css-extract-plugin": "2.7.5",
"patch-package": "8.0.0",
"sass": "1.80.5",
"sass-loader": "16.0.2",
Fixathon: Web app dependency updates part 1 (#29036) * Ensure all packages remove a node_modules in their folder when cleaning * Upgrade typescript to 5.6.3 and move to root package.json Note that this currently fails to build the types package due to @types/node which I'm going to try to remove * Update @types/node to 20.11 to match .nvmrc * Upgrade zen-observable to 0.10.0 It looks like localforage-observable uses its own version of zen-observable because it hasn't been updated in years. This seems like something we probably should remove. * Update yargs to 17.7.2 * Update webpack-dev-server to 5.1.0 * Remove webpack-bundle-analyzer since we haven't used it in years * Update webpack to 5.95.0 * Update web-vitals to 4.2.4 * Update turndown to 7.2.0 * Update tinycolor2 to 1.6.0 * Update timezones.json to 1.7.0 * Update stylelint to 16.10.0, stylelint-config-recommended-scss to 14.1.0, and stylelint-scss to 6.8.1 * Update webpack-cli to 5.1.4 * Update style-loader to 4.0.0 * Change all Webpack scripts to be ES modules * Update strip-ansi to 7.1.0 This is a build script dependency * Update chalk to 5.3.0 This is a build script dependency * Update concurrently to 9.0.1 This is a build script dependency * Update smooth-scroll-into-view-if-needed to 2.0.2 * MM-48205 Update serialize-error to 11.0.3 We didn't update this before because it's an ES module which caused Jest to complain. We can fix that by making Jest transform the it * Update semver to 7.6.3 * Update types for semver, tinycolor2, turndown, and webpack * Fix type issues: change Props to a type * Fix type issues: invalid HTML attributes * Remove unneeded option from Webpack config
2024-11-06 13:40:19 -05:00
"strip-ansi": "7.1.0",
"style-loader": "4.0.0",
"typescript-eslint-language-service": "5.0.5",
"webpack": "5.103.0",
"webpack-cli": "6.0.1",
"webpack-dev-server": "5.2.2"
},
"overrides": {
"@deanwhillier/jest-matchmedia-mock": {
"jest": "30.1.3"
},
"@giphy/react-components": {
"styled-components": "5.3.6"
},
MM-45255 Update web app to React 18 (#33858) * Dependencies: Remove unused dependency on @mattermost/dynamic-virtualized-list * Update Components package to React 18 and new version of RTL * Upgrade React, React Redux, RTL, and associated libraries I had to upgrade React Redux for the new version of React, and that brought with it new versions of associated packges (Redux, Reselect, Redux Thunk). A few other libraries needed to be updated or have their explicit dependencies overridden for the new version of Redux as well. To note for future dependency upgrades, redux-mock-store is deprecated, and redux-batched-actions and redux-persist are inactive. For RTL: 1. `@testing-library/react-hooks` has been rolled into `@testing-library/react`, and its interface has changed. 2. I had to make some changes to get TS to use the types for the new methods added to `expect`. * Dependencies: Fix dom-accessibility-api patch from #33553 * Tests: Fix tests that use jest.spyOn with react-redux * Functional: Remove usage of defaultProps on function components * Tests: Remove usage of react-dom/test-utils * Functional: Rename conflicting context prop on Apps components * Tests: Always await on userEvent calls * Functional: Patch react-overlays to fix pressing escape in unit tests I did something similar in React Bootstrap a few weeks ago. See https://github.com/mattermost/react-bootstrap/pull/5 * Tests: Prevent tests from fetching from real URLs * Tests: Update snapshots changed by upgrading react-redux and styled-components * Functional: Stop passing deprecated pure parameter to connect * Tests: Change how we intercept console errors in tests to preserve stack traces * Tests: Fix incorrect usage of act in Enzyme tests These tests are a mix of: 1. Not calling act when performing something that will update the DOM (like clicking on a button or invoking a method) which either caused warnings or failed snapshots as changes weren't visible. 2. Calling act in weird ways (such as wrapping mount in an async act) which caused Enzyme to not function Some of these changes just silence warnings, but most of them are required to make the test even run * Tests: Fix incorrect usage of act in RTL tests * Tests: Fix a few minor issues in tests * Functional: Add note for why we're not using ReactDOM.createRoot * Functional: Fix focus trap infinite recursion in test * Types: Replace removed React.SFC * Types: Fix type of functions in FormattedMessage values prop * Functional: Fix DropdownInputHybrid placeholder * Types: Patch type definitions of react-batched-actions * Types: Fix mattermost-redux build failing due to type check in Redux Dev Tools * Dependencies: Add type definitions for react-is * Types: Update types around ReactNode and ReactElement React's gotten more strict with these, so we need to be more careful with what we return from a render method. In some of these places, we also misused some types, so hopefully I've sorted those out. * Types: Explicitly added types to all instances of useCallback * Types/Tests: Update typing of Redux actions and hooks useDispatch is sort of stricter now, but it doesn't seem to rely on the global type of `Dispatch` any more, so I ended up having to add an extra overload to make that work. * Tests: Update new tests in useChannelSystemPolicies for new version of RTL These were added on master after I updated RTL on the branch * Tests: Update action used to test initial store state * Functional: Remove remnants of code for hot reloading Redux store * Types/Tests: Update typing around React Router * Types/Functional: Update typing involving the FormattedMessage values prop There's a couple functional changes to ensure that the value passed is either a valid string or Date * Types: Misc fixes * Functional: Don't pass unused props to ChannelHeader * Functional: Ensure plugin setting text is rendered before passing to Setting component The previous version might've allowed MessageDescriptors to be passed unformatted into the Setting component (which would then be rendered in the DOM). As best as I can tell, we never actually did that, so this shouldn't change anything in practice. * Tests: Make tests for identifyElementRegion more reliable * Tests: Update recent tests for new version of RTL * E2E: Make editLastPostWithNewMessage more reliable * Downgrade React to 18.2.0 and manually dedupe React versions 18.2.0 and 18.3.0 are nearly identical to one another, except 18.3.x includes warnings when using any API that will be removed in React 19. I don't want to flood the console and test logs with warnings for things we're not addressing for the time being. Also, they didn't export act from React itself until 18.3.1 for some reason (despite the old import path printing a warning), so I needed to revert the changes to its import path. To get this all to work, for some reason, I had to manually delete all the entries for `react` and `react-dom` from the lockfile to get NPM to use a single version of React and ReactDOM everywhere. I did discover `npm dedupe` in the process, but that didn't solve this problem where I was trying to consistently downgrade everything. * Revert changes to notice file build tool to speed up CI * Add explicit version of types/scheduler The version of `@types/react` that we use says it works with any version of `@types/scheduler` which causes NPM to install a newer version of it which is missing a file of types that it needs. * Update new test to await on userEvent * Fix Playwright test that relied on autogenerated class name * Tests: Disable test for identifyElementRegion * Functional: Change DynamicVirtualizedList ListItem to use useLayoutEffect In a previous commit, I changed the RHS to use the monorepo DynamicVirtualizedList instead of the old version that lived in its own repo. That caused the RHS to no longer scroll to the bottom on initial mount or be able to render additional pages (even though the posts are loaded). This seems like it has to do with the improved size calculation that Zubair made because that's the main difference in the monorepo version of that component. For some reason I don't entirely understand, changing to useLayoutEffect seems to fix that. I think that's because the old measurement code is written as a class component, and useLayoutEffect fires at the same time as componentDidMount/componentDidUpdate. * Types: Revert some type changes to reduce test log output * Functional: Fix places where useSelector returned new results when called with the same arguments I wasn't planning on fixing this now, but I think the increased length of the warning logs in the tests are causing the GitHub action for the unit tests to abort as it reaches around 10000 lines long. * Tests: Fix place where mocked selector returned new results when called with the same arguments Same reason as before, but this one only occurred because of a test's mocked selector. I replaced it with a real one to get around that. * Tests: Fail tests when selector returns new results when called with the same arguments * Attempt to fix web app unit tests failing in CI * Change CI tests to set workerIdleMemoryLimit instead of reducing maxWorkers * Increase workerIdleMemoryLimit in CI * Revert changes to test-ci command and revert changes to how unit test logs are collected * Unrevert changes to test logging, re-add workerIdleMemoryLimit, and try disabling test coverage * Actually disable coverage * Fix flaky test * Update a couple new tests to fit PR and remove an unnecessary act * Replace bad mock in new unit test * Fix types of new code * Remove mock from new unit test
2025-10-07 11:11:12 -04:00
"@types/redux-mock-store": {
"redux": "5.0.1"
},
"braces": "3.0.3",
"cheerio": "1.0.0-rc.12",
MM-45255 Update web app to React 18 (#33858) * Dependencies: Remove unused dependency on @mattermost/dynamic-virtualized-list * Update Components package to React 18 and new version of RTL * Upgrade React, React Redux, RTL, and associated libraries I had to upgrade React Redux for the new version of React, and that brought with it new versions of associated packges (Redux, Reselect, Redux Thunk). A few other libraries needed to be updated or have their explicit dependencies overridden for the new version of Redux as well. To note for future dependency upgrades, redux-mock-store is deprecated, and redux-batched-actions and redux-persist are inactive. For RTL: 1. `@testing-library/react-hooks` has been rolled into `@testing-library/react`, and its interface has changed. 2. I had to make some changes to get TS to use the types for the new methods added to `expect`. * Dependencies: Fix dom-accessibility-api patch from #33553 * Tests: Fix tests that use jest.spyOn with react-redux * Functional: Remove usage of defaultProps on function components * Tests: Remove usage of react-dom/test-utils * Functional: Rename conflicting context prop on Apps components * Tests: Always await on userEvent calls * Functional: Patch react-overlays to fix pressing escape in unit tests I did something similar in React Bootstrap a few weeks ago. See https://github.com/mattermost/react-bootstrap/pull/5 * Tests: Prevent tests from fetching from real URLs * Tests: Update snapshots changed by upgrading react-redux and styled-components * Functional: Stop passing deprecated pure parameter to connect * Tests: Change how we intercept console errors in tests to preserve stack traces * Tests: Fix incorrect usage of act in Enzyme tests These tests are a mix of: 1. Not calling act when performing something that will update the DOM (like clicking on a button or invoking a method) which either caused warnings or failed snapshots as changes weren't visible. 2. Calling act in weird ways (such as wrapping mount in an async act) which caused Enzyme to not function Some of these changes just silence warnings, but most of them are required to make the test even run * Tests: Fix incorrect usage of act in RTL tests * Tests: Fix a few minor issues in tests * Functional: Add note for why we're not using ReactDOM.createRoot * Functional: Fix focus trap infinite recursion in test * Types: Replace removed React.SFC * Types: Fix type of functions in FormattedMessage values prop * Functional: Fix DropdownInputHybrid placeholder * Types: Patch type definitions of react-batched-actions * Types: Fix mattermost-redux build failing due to type check in Redux Dev Tools * Dependencies: Add type definitions for react-is * Types: Update types around ReactNode and ReactElement React's gotten more strict with these, so we need to be more careful with what we return from a render method. In some of these places, we also misused some types, so hopefully I've sorted those out. * Types: Explicitly added types to all instances of useCallback * Types/Tests: Update typing of Redux actions and hooks useDispatch is sort of stricter now, but it doesn't seem to rely on the global type of `Dispatch` any more, so I ended up having to add an extra overload to make that work. * Tests: Update new tests in useChannelSystemPolicies for new version of RTL These were added on master after I updated RTL on the branch * Tests: Update action used to test initial store state * Functional: Remove remnants of code for hot reloading Redux store * Types/Tests: Update typing around React Router * Types/Functional: Update typing involving the FormattedMessage values prop There's a couple functional changes to ensure that the value passed is either a valid string or Date * Types: Misc fixes * Functional: Don't pass unused props to ChannelHeader * Functional: Ensure plugin setting text is rendered before passing to Setting component The previous version might've allowed MessageDescriptors to be passed unformatted into the Setting component (which would then be rendered in the DOM). As best as I can tell, we never actually did that, so this shouldn't change anything in practice. * Tests: Make tests for identifyElementRegion more reliable * Tests: Update recent tests for new version of RTL * E2E: Make editLastPostWithNewMessage more reliable * Downgrade React to 18.2.0 and manually dedupe React versions 18.2.0 and 18.3.0 are nearly identical to one another, except 18.3.x includes warnings when using any API that will be removed in React 19. I don't want to flood the console and test logs with warnings for things we're not addressing for the time being. Also, they didn't export act from React itself until 18.3.1 for some reason (despite the old import path printing a warning), so I needed to revert the changes to its import path. To get this all to work, for some reason, I had to manually delete all the entries for `react` and `react-dom` from the lockfile to get NPM to use a single version of React and ReactDOM everywhere. I did discover `npm dedupe` in the process, but that didn't solve this problem where I was trying to consistently downgrade everything. * Revert changes to notice file build tool to speed up CI * Add explicit version of types/scheduler The version of `@types/react` that we use says it works with any version of `@types/scheduler` which causes NPM to install a newer version of it which is missing a file of types that it needs. * Update new test to await on userEvent * Fix Playwright test that relied on autogenerated class name * Tests: Disable test for identifyElementRegion * Functional: Change DynamicVirtualizedList ListItem to use useLayoutEffect In a previous commit, I changed the RHS to use the monorepo DynamicVirtualizedList instead of the old version that lived in its own repo. That caused the RHS to no longer scroll to the bottom on initial mount or be able to render additional pages (even though the posts are loaded). This seems like it has to do with the improved size calculation that Zubair made because that's the main difference in the monorepo version of that component. For some reason I don't entirely understand, changing to useLayoutEffect seems to fix that. I think that's because the old measurement code is written as a class component, and useLayoutEffect fires at the same time as componentDidMount/componentDidUpdate. * Types: Revert some type changes to reduce test log output * Functional: Fix places where useSelector returned new results when called with the same arguments I wasn't planning on fixing this now, but I think the increased length of the warning logs in the tests are causing the GitHub action for the unit tests to abort as it reaches around 10000 lines long. * Tests: Fix place where mocked selector returned new results when called with the same arguments Same reason as before, but this one only occurred because of a test's mocked selector. I replaced it with a real one to get around that. * Tests: Fail tests when selector returns new results when called with the same arguments * Attempt to fix web app unit tests failing in CI * Change CI tests to set workerIdleMemoryLimit instead of reducing maxWorkers * Increase workerIdleMemoryLimit in CI * Revert changes to test-ci command and revert changes to how unit test logs are collected * Unrevert changes to test logging, re-add workerIdleMemoryLimit, and try disabling test coverage * Actually disable coverage * Fix flaky test * Update a couple new tests to fit PR and remove an unnecessary act * Replace bad mock in new unit test * Fix types of new code * Remove mock from new unit test
2025-10-07 11:11:12 -04:00
"@testing-library/dom": {
"dom-accessibility-api": "0.6.3"
},
"@testing-library/jest-dom": {
"dom-accessibility-api": "0.6.3"
},
"@types/estree": "0.0.51",
MM-45255 Update web app to React 18 (#33858) * Dependencies: Remove unused dependency on @mattermost/dynamic-virtualized-list * Update Components package to React 18 and new version of RTL * Upgrade React, React Redux, RTL, and associated libraries I had to upgrade React Redux for the new version of React, and that brought with it new versions of associated packges (Redux, Reselect, Redux Thunk). A few other libraries needed to be updated or have their explicit dependencies overridden for the new version of Redux as well. To note for future dependency upgrades, redux-mock-store is deprecated, and redux-batched-actions and redux-persist are inactive. For RTL: 1. `@testing-library/react-hooks` has been rolled into `@testing-library/react`, and its interface has changed. 2. I had to make some changes to get TS to use the types for the new methods added to `expect`. * Dependencies: Fix dom-accessibility-api patch from #33553 * Tests: Fix tests that use jest.spyOn with react-redux * Functional: Remove usage of defaultProps on function components * Tests: Remove usage of react-dom/test-utils * Functional: Rename conflicting context prop on Apps components * Tests: Always await on userEvent calls * Functional: Patch react-overlays to fix pressing escape in unit tests I did something similar in React Bootstrap a few weeks ago. See https://github.com/mattermost/react-bootstrap/pull/5 * Tests: Prevent tests from fetching from real URLs * Tests: Update snapshots changed by upgrading react-redux and styled-components * Functional: Stop passing deprecated pure parameter to connect * Tests: Change how we intercept console errors in tests to preserve stack traces * Tests: Fix incorrect usage of act in Enzyme tests These tests are a mix of: 1. Not calling act when performing something that will update the DOM (like clicking on a button or invoking a method) which either caused warnings or failed snapshots as changes weren't visible. 2. Calling act in weird ways (such as wrapping mount in an async act) which caused Enzyme to not function Some of these changes just silence warnings, but most of them are required to make the test even run * Tests: Fix incorrect usage of act in RTL tests * Tests: Fix a few minor issues in tests * Functional: Add note for why we're not using ReactDOM.createRoot * Functional: Fix focus trap infinite recursion in test * Types: Replace removed React.SFC * Types: Fix type of functions in FormattedMessage values prop * Functional: Fix DropdownInputHybrid placeholder * Types: Patch type definitions of react-batched-actions * Types: Fix mattermost-redux build failing due to type check in Redux Dev Tools * Dependencies: Add type definitions for react-is * Types: Update types around ReactNode and ReactElement React's gotten more strict with these, so we need to be more careful with what we return from a render method. In some of these places, we also misused some types, so hopefully I've sorted those out. * Types: Explicitly added types to all instances of useCallback * Types/Tests: Update typing of Redux actions and hooks useDispatch is sort of stricter now, but it doesn't seem to rely on the global type of `Dispatch` any more, so I ended up having to add an extra overload to make that work. * Tests: Update new tests in useChannelSystemPolicies for new version of RTL These were added on master after I updated RTL on the branch * Tests: Update action used to test initial store state * Functional: Remove remnants of code for hot reloading Redux store * Types/Tests: Update typing around React Router * Types/Functional: Update typing involving the FormattedMessage values prop There's a couple functional changes to ensure that the value passed is either a valid string or Date * Types: Misc fixes * Functional: Don't pass unused props to ChannelHeader * Functional: Ensure plugin setting text is rendered before passing to Setting component The previous version might've allowed MessageDescriptors to be passed unformatted into the Setting component (which would then be rendered in the DOM). As best as I can tell, we never actually did that, so this shouldn't change anything in practice. * Tests: Make tests for identifyElementRegion more reliable * Tests: Update recent tests for new version of RTL * E2E: Make editLastPostWithNewMessage more reliable * Downgrade React to 18.2.0 and manually dedupe React versions 18.2.0 and 18.3.0 are nearly identical to one another, except 18.3.x includes warnings when using any API that will be removed in React 19. I don't want to flood the console and test logs with warnings for things we're not addressing for the time being. Also, they didn't export act from React itself until 18.3.1 for some reason (despite the old import path printing a warning), so I needed to revert the changes to its import path. To get this all to work, for some reason, I had to manually delete all the entries for `react` and `react-dom` from the lockfile to get NPM to use a single version of React and ReactDOM everywhere. I did discover `npm dedupe` in the process, but that didn't solve this problem where I was trying to consistently downgrade everything. * Revert changes to notice file build tool to speed up CI * Add explicit version of types/scheduler The version of `@types/react` that we use says it works with any version of `@types/scheduler` which causes NPM to install a newer version of it which is missing a file of types that it needs. * Update new test to await on userEvent * Fix Playwright test that relied on autogenerated class name * Tests: Disable test for identifyElementRegion * Functional: Change DynamicVirtualizedList ListItem to use useLayoutEffect In a previous commit, I changed the RHS to use the monorepo DynamicVirtualizedList instead of the old version that lived in its own repo. That caused the RHS to no longer scroll to the bottom on initial mount or be able to render additional pages (even though the posts are loaded). This seems like it has to do with the improved size calculation that Zubair made because that's the main difference in the monorepo version of that component. For some reason I don't entirely understand, changing to useLayoutEffect seems to fix that. I think that's because the old measurement code is written as a class component, and useLayoutEffect fires at the same time as componentDidMount/componentDidUpdate. * Types: Revert some type changes to reduce test log output * Functional: Fix places where useSelector returned new results when called with the same arguments I wasn't planning on fixing this now, but I think the increased length of the warning logs in the tests are causing the GitHub action for the unit tests to abort as it reaches around 10000 lines long. * Tests: Fix place where mocked selector returned new results when called with the same arguments Same reason as before, but this one only occurred because of a test's mocked selector. I replaced it with a real one to get around that. * Tests: Fail tests when selector returns new results when called with the same arguments * Attempt to fix web app unit tests failing in CI * Change CI tests to set workerIdleMemoryLimit instead of reducing maxWorkers * Increase workerIdleMemoryLimit in CI * Revert changes to test-ci command and revert changes to how unit test logs are collected * Unrevert changes to test logging, re-add workerIdleMemoryLimit, and try disabling test coverage * Actually disable coverage * Fix flaky test * Update a couple new tests to fit PR and remove an unnecessary act * Replace bad mock in new unit test * Fix types of new code * Remove mock from new unit test
2025-10-07 11:11:12 -04:00
"asn1.js": "5.4.1",
"react-beautiful-dnd": {
"react-redux": "9.2.0"
},
"redux-persist": {
"redux": "5.0.1"
}
},
"workspaces": [
"channels",
"platform/client",
"platform/components",
"platform/eslint-plugin",
"platform/mattermost-redux",
"platform/types"
]
}