diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 97454a84..3bcd180d 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -2,7 +2,11 @@ const { join } = require('node:path'); const { existsSync, readFileSync } = require('node:fs'); module.exports = { - extends: ['@nkzw', 'plugin:@deities/strict'], + extends: [ + '@nkzw', + 'plugin:@deities/strict', + 'plugin:@nkzw/eslint-plugin-fbtee/recommended', + ], ignorePatterns: [ 'artemis/prisma/pothos-types.ts', 'dist/', @@ -25,7 +29,7 @@ module.exports = { }, }, { - files: ['i18n/**/*.cjs', 'hera/i18n/**/EntityMap.tsx'], + files: ['i18n/**/*.ts', 'hera/i18n/**/EntityMap.tsx'], rules: { 'sort-keys-fix/sort-keys-fix': 0, }, @@ -50,8 +54,7 @@ module.exports = { files: [ '.eslintrc.cjs', 'eslint-plugin/index.js', - 'i18n/Common.cjs', - 'infra/babelPlugins.tsx', + 'infra/babelPresets.tsx', ], rules: { '@typescript-eslint/no-require-imports': 0, @@ -64,7 +67,7 @@ module.exports = { }, }, ], - plugins: ['@deities', 'workspaces'], + plugins: ['@deities', 'workspaces', '@nkzw/eslint-plugin-fbtee'], rules: { '@typescript-eslint/array-type': [2, { default: 'generic' }], '@typescript-eslint/no-restricted-imports': [ diff --git a/.gitignore b/.gitignore index 6416194c..a6698cd2 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,4 @@ artemis/graphql/schemaImportMap.tsx hera/i18n/CampaignMap.tsx hera/i18n/EntityMap.tsx hermes/CampaignMapName.tsx -i18n/Entities.cjs +i18n/Entities.ts diff --git a/.prettierignore b/.prettierignore index 141a237d..d287b844 100644 --- a/.prettierignore +++ b/.prettierignore @@ -28,7 +28,7 @@ artemis/graphql/schemaImportMap.tsx hera/i18n/CampaignMap.tsx hera/i18n/EntityMap.tsx hermes/CampaignMapName.tsx -i18n/Entities.cjs +i18n/Entities.ts # Codegen but checked-in hera/render/Images.tsx diff --git a/ares/package.json b/ares/package.json index 0e38f6bf..43b79868 100644 --- a/ares/package.json +++ b/ares/package.json @@ -11,8 +11,8 @@ "type": "module", "scripts": { "fbt": "pnpm run fbt:manifest && pnpm run fbt:collect && pnpm run fbt:translate", - "fbt:collect": "../node_modules/.bin/fbt-collect --transform $(pwd)/scripts/collectionTransform.cjs --pretty --manifest < .src_manifest.json > ../source_strings.json", - "fbt:manifest": "../node_modules/.bin/fbt-manifest --src src ../hera ../ui", + "fbt:collect": "../node_modules/.bin/fbtee collect --fbt-common-path ../i18n/Common.ts --pretty --manifest < .src_manifest.json > ../source_strings.json", + "fbt:manifest": "../node_modules/.bin/fbtee manifest --src src ../hera ../ui", "fbt:translate": "mkdir -p src/generated/ && node --no-warnings --experimental-specifier-resolution=node --loader ts-node/esm ./scripts/translations.js" }, "dependencies": { @@ -36,7 +36,7 @@ "@stripe/react-stripe-js": "^3.1.1", "@stripe/stripe-js": "^5.4.0", "cordova-plugin-purchase": "^13.12.1", - "fbt": "^1.0.2", + "fbtee": "^0.2.0", "framer-motion": "^11.15.0", "p-limit": "^6.2.0", "react": "19.0.0", diff --git a/codegen/generate-translations.tsx b/codegen/generate-translations.tsx index 31e09815..5e2cf92b 100755 --- a/codegen/generate-translations.tsx +++ b/codegen/generate-translations.tsx @@ -45,7 +45,7 @@ const publishedCampaigns = new Map([ ['tutorial', Number.POSITIVE_INFINITY], ]); -const COMMON_OUTPUT_FILE = join(root, 'i18n/Entities.cjs'); +const COMMON_OUTPUT_FILE = join(root, 'i18n/Entities.ts'); const FBT_ENTITY_MAP_OUTPUT_FILE = join(root, 'hera/i18n/EntityMap.tsx'); const FBT_CAMPAIGN_MAP_OUTPUT_FILE = join(root, 'hera/i18n/CampaignMap.tsx'); @@ -369,7 +369,7 @@ for (const { description, key, message, unitId } of characterMessages) { const plugins = ['@ianvs/prettier-plugin-sort-imports']; writeFileSync( COMMON_OUTPUT_FILE, - await format(sign(`module.exports = {${common.join(',\n')}};`), { + await format(sign(`export default {${common.join(',\n')}};`), { filepath: COMMON_OUTPUT_FILE, plugins, singleQuote: true, @@ -382,7 +382,7 @@ writeFileSync( sign( [ `import { getUnitInfoOrThrow } from '@deities/athena/info/Unit.tsx';`, - `import { fbt } from 'fbt';`, + `import { fbt } from 'fbtee';`, ...entities, ].join('\n'), ), @@ -400,7 +400,7 @@ writeFileSync( sign( [ `import { getUnitInfoOrThrow } from '@deities/athena/info/Unit.tsx';`, - `import { fbt } from 'fbt';`, + `import { fbt } from 'fbtee';`, `export const CampaignMetadata = {${campaignMetadata.join('\n')}};\n`, `export default {`, campaign.join('\n'), diff --git a/deimos/package.json b/deimos/package.json index abaa2f45..f03afc65 100644 --- a/deimos/package.json +++ b/deimos/package.json @@ -19,7 +19,7 @@ "@deities/ui": "workspace:*", "@emotion/css": "^11.13.5", "array-shuffle": "^3.0.0", - "fbt": "^1.0.2", + "fbtee": "^0.2.0", "framer-motion": "^11.15.0", "react": "19.0.0", "react-dom": "19.0.0", diff --git a/docs/content/playground/ClientScope.tsx b/docs/content/playground/ClientScope.tsx index 640d5ec9..82fdddfd 100644 --- a/docs/content/playground/ClientScope.tsx +++ b/docs/content/playground/ClientScope.tsx @@ -9,12 +9,12 @@ import { AlertContext } from '@deities/ui/hooks/useAlert.tsx'; import { ScaleContext } from '@deities/ui/hooks/useScale.tsx'; import { setDefaultPortalContainer } from '@deities/ui/Portal.tsx'; import { css } from '@emotion/css'; -import { init as initFbt, IntlVariations } from 'fbt'; +import { IntlVariations, setupFbtee } from 'fbtee'; import { ReactElement } from 'react'; initializeCSSVariables(); -initFbt({ +setupFbtee({ hooks: { getViewerContext: () => ({ GENDER: IntlVariations.GENDER_UNKNOWN, diff --git a/docs/package.json b/docs/package.json index fc9d0765..9de02b58 100644 --- a/docs/package.json +++ b/docs/package.json @@ -26,7 +26,7 @@ "@emotion/css": "^11.13.5", "@types/react": "^19.0.2", "dunkel-theme": "^1.7.1", - "fbt": "^1.0.2", + "fbtee": "^0.2.0", "framer-motion": "^11.15.0", "licht-theme": "^1.7.1", "react": "19.0.0", diff --git a/docs/vocs.config.tsx b/docs/vocs.config.tsx index 9d8e4f84..8fda7fb9 100644 --- a/docs/vocs.config.tsx +++ b/docs/vocs.config.tsx @@ -3,7 +3,7 @@ import babelPluginEmotion from '@emotion/babel-plugin'; import react from '@vitejs/plugin-react'; import React from 'react'; import { defineConfig } from 'vocs'; -import babelPlugins from '../infra/babelPlugins.tsx'; +import presets from '../infra/babelPresets.tsx'; import createResolver from '../infra/createResolver.tsx'; const Licht = JSON.parse( @@ -149,7 +149,8 @@ export default defineConfig({ // @ts-expect-error react({ babel: { - plugins: [...babelPlugins, babelPluginEmotion], + plugins: [babelPluginEmotion], + presets, }, }), ], diff --git a/eslint-plugin/index.js b/eslint-plugin/index.js index 47c03140..1d590845 100644 --- a/eslint-plugin/index.js +++ b/eslint-plugin/index.js @@ -4,10 +4,8 @@ module.exports = { rules: { '@deities/no-copy-expression': 2, '@deities/no-date-now': 2, - '@deities/no-fbt-import': 2, '@deities/no-inline-css': 2, '@deities/no-lazy-import': 2, - '@deities/require-fbt-description': 2, '@deities/require-use-effect-arguments': 2, '@deities/use-relay-types': 2, }, @@ -16,10 +14,8 @@ module.exports = { rules: { 'no-copy-expression': require('./no-copy-expression'), 'no-date-now': require('./no-date-now'), - 'no-fbt-import': require('./no-fbt-import'), 'no-inline-css': require('./no-inline-css'), 'no-lazy-import': require('./no-lazy-import'), - 'require-fbt-description': require('./require-fbt-description'), 'require-use-effect-arguments': require('./require-use-effect-arguments'), 'use-relay-types': require('./use-relay-types'), }, diff --git a/eslint-plugin/no-fbt-import.js b/eslint-plugin/no-fbt-import.js deleted file mode 100644 index 8b4889ed..00000000 --- a/eslint-plugin/no-fbt-import.js +++ /dev/null @@ -1,23 +0,0 @@ -module.exports.meta = { - fixable: false, - hasSuggestions: false, - type: 'problem', -}; - -module.exports.create = function noFbtImport(context) { - return { - ImportDefaultSpecifier(node) { - if ( - node.local.type === 'Identifier' && - node.local.name === 'fbt' && - node.parent.source.type === 'Literal' && - node.parent.source.value === 'fbt' - ) { - context.report({ - message: `You must use "import { fbt } from 'fbt'"; instead of a default import.`, - node, - }); - } - }, - }; -}; diff --git a/eslint-plugin/require-fbt-description.js b/eslint-plugin/require-fbt-description.js deleted file mode 100644 index f7d4df01..00000000 --- a/eslint-plugin/require-fbt-description.js +++ /dev/null @@ -1,30 +0,0 @@ -module.exports.meta = { - fixable: false, - hasSuggestions: false, - type: 'problem', -}; - -module.exports.create = function noInlineCSS(context) { - return { - JSXOpeningElement(node) { - if (node.name?.type === 'JSXIdentifier' && node.name.name === 'fbt') { - const descriptionNode = node.attributes.find( - (node) => - node.name?.type === 'JSXIdentifier' && node.name.name === 'desc', - ); - if ( - !descriptionNode || - (descriptionNode.type === 'JSXAttribute' && - (!descriptionNode.value || - descriptionNode.value.type !== 'Literal' || - !descriptionNode.value.value.length)) - ) { - context.report({ - message: '`fbt` elements must have a string description.', - node: descriptionNode, - }); - } - } - }, - }; -}; diff --git a/hera/action-response/processActionResponse.tsx b/hera/action-response/processActionResponse.tsx index 2b5f4cc0..d658a299 100644 --- a/hera/action-response/processActionResponse.tsx +++ b/hera/action-response/processActionResponse.tsx @@ -27,7 +27,7 @@ import dateNow from '@deities/hephaestus/dateNow.tsx'; import UnknownTypeError from '@deities/hephaestus/UnknownTypeError.tsx'; import ImmutableMap from '@nkzw/immutable-map'; import arrayShuffle from 'array-shuffle'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import addIncreaseValueAnimation from '../animations/addIncreaseValueAnimation.tsx'; import animateFireworks, { getPossibleFireworksPositions, @@ -65,7 +65,6 @@ import sabotageAction, { addSabotageAnimation, } from '../behavior/sabotage/sabotageAction.tsx'; import unfoldAction from '../behavior/unfold/unfoldAction.tsx'; -import intlList, { Conjunctions, Delimiters } from '../i18n/intlList.tsx'; import translateMessage from '../i18n/translateMessage.tsx'; import abandonInvasion from '../lib/abandonInvasion.tsx'; import addEndTurnAnimations from '../lib/addEndTurnAnimations.tsx'; @@ -522,7 +521,12 @@ async function processActionResponse( length: 'medium', player: 0, sound: null, - text: String(fbt(`The game ended in a draw!`, 'Draw')), + text: String( + fbt( + `The game ended in a draw!`, + 'Text for when a game ended in a draw.', + ), + ), type: 'banner', }), })); @@ -544,11 +548,6 @@ async function processActionResponse( ).map(({ id }) => id), ]), ]; - const winnerList = intlList( - winners.map(getTranslatedFactionName.bind(null, playerDetails)), - Conjunctions.AND, - Delimiters.COMMA, - ); const fireworks = state.currentViewer && winners.includes(state.currentViewer) ? 5 : 3; await update((currentState) => ({ @@ -581,7 +580,10 @@ async function processActionResponse( sound: null, text: String( fbt( - fbt.param('winners', winnerList) + + fbt.list( + 'winners', + winners.map(getTranslatedFactionName.bind(null, playerDetails)), + ) + ' ' + fbt.plural('wins', winners.length, { many: 'win', diff --git a/hera/animations/addIncreaseValueAnimation.tsx b/hera/animations/addIncreaseValueAnimation.tsx index 0cb2992f..ac7d8cca 100644 --- a/hera/animations/addIncreaseValueAnimation.tsx +++ b/hera/animations/addIncreaseValueAnimation.tsx @@ -3,7 +3,7 @@ import { IncreaseFundsActionResponse, } from '@deities/apollo/ActionResponse.tsx'; import MapData from '@deities/athena/MapData.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { resetBehavior } from '../behavior/Behavior.tsx'; import NullBehavior from '../behavior/NullBehavior.tsx'; import AnimationKey from '../lib/AnimationKey.tsx'; diff --git a/hera/animations/maybeReceiveChaosStarsAnimation.tsx b/hera/animations/maybeReceiveChaosStarsAnimation.tsx index 4620212b..3c6e2c09 100644 --- a/hera/animations/maybeReceiveChaosStarsAnimation.tsx +++ b/hera/animations/maybeReceiveChaosStarsAnimation.tsx @@ -3,7 +3,7 @@ import { TileSize } from '@deities/athena/map/Configuration.tsx'; import Breakpoints from '@deities/ui/Breakpoints.tsx'; import Stack from '@deities/ui/Stack.tsx'; import { css } from '@emotion/css'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { motion } from 'framer-motion'; import { resetBehavior } from '../behavior/Behavior.tsx'; import NullBehavior from '../behavior/NullBehavior.tsx'; diff --git a/hera/animations/objectiveAnimation.tsx b/hera/animations/objectiveAnimation.tsx index 4b601b95..bc6e3de0 100644 --- a/hera/animations/objectiveAnimation.tsx +++ b/hera/animations/objectiveAnimation.tsx @@ -1,7 +1,7 @@ import { SecretDiscoveredActionResponse } from '@deities/apollo/ActionResponse.tsx'; import { OptionalObjectiveActionResponse } from '@deities/apollo/Objective.tsx'; import MapData from '@deities/athena/MapData.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { resetBehavior } from '../behavior/Behavior.tsx'; import NullBehavior from '../behavior/NullBehavior.tsx'; import AnimationKey from '../lib/AnimationKey.tsx'; diff --git a/hera/animations/receiveBiomeAnimation.tsx b/hera/animations/receiveBiomeAnimation.tsx index 41b1ab97..159b121c 100644 --- a/hera/animations/receiveBiomeAnimation.tsx +++ b/hera/animations/receiveBiomeAnimation.tsx @@ -9,7 +9,7 @@ import { SizeVector } from '@deities/athena/MapData.tsx'; import Breakpoints from '@deities/ui/Breakpoints.tsx'; import Stack from '@deities/ui/Stack.tsx'; import { css } from '@emotion/css'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { motion } from 'framer-motion'; import { resetBehavior } from '../behavior/Behavior.tsx'; import NullBehavior from '../behavior/NullBehavior.tsx'; diff --git a/hera/animations/receiveCrystalAnimation.tsx b/hera/animations/receiveCrystalAnimation.tsx index c4b02e6b..a6376095 100644 --- a/hera/animations/receiveCrystalAnimation.tsx +++ b/hera/animations/receiveCrystalAnimation.tsx @@ -4,7 +4,7 @@ import { TileSize } from '@deities/athena/map/Configuration.tsx'; import Breakpoints from '@deities/ui/Breakpoints.tsx'; import Stack from '@deities/ui/Stack.tsx'; import { css } from '@emotion/css'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { motion } from 'framer-motion'; import { resetBehavior } from '../behavior/Behavior.tsx'; import NullBehavior from '../behavior/NullBehavior.tsx'; diff --git a/hera/animations/receivePortraitAnimation.tsx b/hera/animations/receivePortraitAnimation.tsx index a404b00e..b60a4581 100644 --- a/hera/animations/receivePortraitAnimation.tsx +++ b/hera/animations/receivePortraitAnimation.tsx @@ -8,7 +8,7 @@ import pixelBorder from '@deities/ui/pixelBorder.tsx'; import Stack from '@deities/ui/Stack.tsx'; import { css } from '@emotion/css'; import arrayShuffle from 'array-shuffle'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { motion } from 'framer-motion'; import { resetBehavior } from '../behavior/Behavior.tsx'; import NullBehavior from '../behavior/NullBehavior.tsx'; diff --git a/hera/animations/receiveSkillSlotAnimation.tsx b/hera/animations/receiveSkillSlotAnimation.tsx index f00e2d1a..eabf8621 100644 --- a/hera/animations/receiveSkillSlotAnimation.tsx +++ b/hera/animations/receiveSkillSlotAnimation.tsx @@ -1,6 +1,6 @@ import { ReceiveRewardActionResponse } from '@deities/apollo/ActionResponse.tsx'; import applyActionResponse from '@deities/apollo/actions/applyActionResponse.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { resetBehavior } from '../behavior/Behavior.tsx'; import NullBehavior from '../behavior/NullBehavior.tsx'; import AnimationKey from '../lib/AnimationKey.tsx'; diff --git a/hera/behavior/BuySkills.tsx b/hera/behavior/BuySkills.tsx index 86fcbb4b..c6a05fcd 100644 --- a/hera/behavior/BuySkills.tsx +++ b/hera/behavior/BuySkills.tsx @@ -7,7 +7,7 @@ import Icon from '@deities/ui/Icon.tsx'; import Info from '@deities/ui/icons/Info.tsx'; import { css } from '@emotion/css'; import More from '@iconify-icons/pixelarticons/more-horizontal.js'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { useState } from 'react'; import addFlashAnimation from '../lib/addFlashAnimation.tsx'; import getSkillConfigForDisplay from '../lib/getSkillConfigForDisplay.tsx'; diff --git a/hera/behavior/CreateUnit.tsx b/hera/behavior/CreateUnit.tsx index ee700a8a..53718fb3 100644 --- a/hera/behavior/CreateUnit.tsx +++ b/hera/behavior/CreateUnit.tsx @@ -23,7 +23,7 @@ import More from '@iconify-icons/pixelarticons/more-horizontal.js'; import Reply from '@iconify-icons/pixelarticons/reply.js'; import Shield from '@iconify-icons/pixelarticons/shield.js'; import Visible from '@iconify-icons/pixelarticons/visible.js'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { MouseEvent, useCallback, useState } from 'react'; import addFlashAnimation from '../lib/addFlashAnimation.tsx'; import toTransformOrigin, { diff --git a/hera/behavior/Menu.tsx b/hera/behavior/Menu.tsx index cd4ccfdc..fcc2e784 100644 --- a/hera/behavior/Menu.tsx +++ b/hera/behavior/Menu.tsx @@ -17,7 +17,7 @@ import { CreateTracksCost } from '@deities/athena/map/Configuration.tsx'; import Vector, { sortByVectorKey } from '@deities/athena/map/Vector.tsx'; import { moveable } from '@deities/athena/Radius.tsx'; import useInput from '@deities/ui/controls/useInput.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import addFlashAnimation from '../lib/addFlashAnimation.tsx'; import animateSupply from '../lib/animateSupply.tsx'; import { RadiusType } from '../Radius.tsx'; diff --git a/hera/behavior/Radar.tsx b/hera/behavior/Radar.tsx index e549eb0a..91a4757d 100644 --- a/hera/behavior/Radar.tsx +++ b/hera/behavior/Radar.tsx @@ -6,7 +6,7 @@ import { RadiusItem } from '@deities/athena/Radius.tsx'; import Icon from '@deities/ui/Icon.tsx'; import ZapOn from '@deities/ui/icons/ZapOn.tsx'; import Zap from '@iconify-icons/pixelarticons/zap.js'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { RadiusType } from '../Radius.tsx'; import { Actions, State, StateLike, StateWithActions } from '../Types.tsx'; import ActionWheel, { diff --git a/hera/behavior/attack/AttackSelector.tsx b/hera/behavior/attack/AttackSelector.tsx index 777c6dbb..408cbd35 100644 --- a/hera/behavior/attack/AttackSelector.tsx +++ b/hera/behavior/attack/AttackSelector.tsx @@ -15,12 +15,11 @@ import MapData from '@deities/athena/MapData.tsx'; import Icon from '@deities/ui/Icon.tsx'; import Heart from '@deities/ui/icons/Heart.tsx'; import { css } from '@emotion/css'; -import { fbt } from 'fbt'; +import { fbt, TranslatedString } from 'fbtee'; import { useCallback, useMemo } from 'react'; import BuildingTile from '../../Building.tsx'; import Tick from '../../Tick.tsx'; import { Actions, State } from '../../Types.tsx'; -import { Fbt } from '../../types/Fbt.tsx'; import EntityPickerFlyout from '../../ui/EntityPickerFlyout.tsx'; import FlashFlyout from '../../ui/FlashFlyout.tsx'; import { FlyoutColor, FlyoutItem } from '../../ui/Flyout.tsx'; @@ -278,7 +277,11 @@ const getDamageInformation = ( from: Vector, to: Vector, modifier = 1, -): { color: FlyoutColor; damage: number | null; text: Fbt | null } => { +): { + color: FlyoutColor; + damage: number | null; + text: TranslatedString | null; +} => { const damage = calculateLikelyDamage( unitA, entityB, diff --git a/hera/behavior/buySkill/buySkillAction.tsx b/hera/behavior/buySkill/buySkillAction.tsx index a9488f52..5ebf9094 100644 --- a/hera/behavior/buySkill/buySkillAction.tsx +++ b/hera/behavior/buySkill/buySkillAction.tsx @@ -1,6 +1,6 @@ import { BuySkillActionResponse } from '@deities/apollo/ActionResponse.tsx'; import applyActionResponse from '@deities/apollo/actions/applyActionResponse.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import AnimationKey from '../../lib/AnimationKey.tsx'; import getSkillConfigForDisplay from '../../lib/getSkillConfigForDisplay.tsx'; import getTranslatedFactionName from '../../lib/getTranslatedFactionName.tsx'; diff --git a/hera/campaign/CampaignEditor.tsx b/hera/campaign/CampaignEditor.tsx index b8521715..4c7daf12 100644 --- a/hera/campaign/CampaignEditor.tsx +++ b/hera/campaign/CampaignEditor.tsx @@ -44,7 +44,7 @@ import Check from '@iconify-icons/pixelarticons/check.js'; import Close from '@iconify-icons/pixelarticons/close.js'; import Copy from '@iconify-icons/pixelarticons/copy.js'; import DialogueIcon from '@iconify-icons/pixelarticons/message-text.js'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { AnimatePresence, motion } from 'framer-motion'; import { ComponentType, diff --git a/hera/campaign/Level.tsx b/hera/campaign/Level.tsx index b961e95c..f0f4a9fc 100644 --- a/hera/campaign/Level.tsx +++ b/hera/campaign/Level.tsx @@ -49,7 +49,7 @@ import EmptyDialogueIcon from '@iconify-icons/pixelarticons/message.js'; import Pace from '@iconify-icons/pixelarticons/speed-fast.js'; import Subscriptions from '@iconify-icons/pixelarticons/subscriptions.js'; import Zap from '@iconify-icons/pixelarticons/zap.js'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { useInView } from 'framer-motion'; import { memo, MouseEvent, useCallback, useRef, useState } from 'react'; import Portrait from '../character/Portrait.tsx'; diff --git a/hera/campaign/lib/getTranslatedPlayStyleName.tsx b/hera/campaign/lib/getTranslatedPlayStyleName.tsx index dabaf8b7..b8f45ed0 100644 --- a/hera/campaign/lib/getTranslatedPlayStyleName.tsx +++ b/hera/campaign/lib/getTranslatedPlayStyleName.tsx @@ -1,5 +1,5 @@ import { PlayStyle } from '@deities/hermes/PlayStyle.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; export default function getTranslatedPlayStyleName(playStyle: PlayStyle) { switch (playStyle) { diff --git a/hera/campaign/panels/CampaignEditorSettingsPanel.tsx b/hera/campaign/panels/CampaignEditorSettingsPanel.tsx index 451f3e42..15d8afa2 100644 --- a/hera/campaign/panels/CampaignEditorSettingsPanel.tsx +++ b/hera/campaign/panels/CampaignEditorSettingsPanel.tsx @@ -16,7 +16,7 @@ import { TypeaheadDataSourceEntry, } from '@deities/ui/Typeahead.tsx'; import { css } from '@emotion/css'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { RangeSelector } from '../../card/Range.tsx'; import useTagDataSource from '../../hooks/useTagDataSource.tsx'; import getTranslatedPlayStyleName from '../lib/getTranslatedPlayStyleName.tsx'; diff --git a/hera/card/UnitCard.tsx b/hera/card/UnitCard.tsx index 09ae6db8..ea91c17f 100644 --- a/hera/card/UnitCard.tsx +++ b/hera/card/UnitCard.tsx @@ -73,11 +73,10 @@ import Shield from '@iconify-icons/pixelarticons/shield.js'; import Visible from '@iconify-icons/pixelarticons/visible.js'; import Volume from '@iconify-icons/pixelarticons/volume-3.js'; import WarningBox from '@iconify-icons/pixelarticons/warning-box.js'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { memo, ReactNode, useMemo } from 'react'; import getHealthColor from '../behavior/attack/getHealthColor.tsx'; import useUnitState from '../hooks/useUnitState.tsx'; -import intlList, { Conjunctions, Delimiters } from '../i18n/intlList.tsx'; import getAnyBuildingTileField from '../lib/getAnyBuildingTileField.tsx'; import getAnyUnitTile from '../lib/getAnyUnitTile.tsx'; import getTranslatedEntityName, { @@ -879,12 +878,7 @@ const UnitTransports = ({ } const { limit, types } = transports; - const entities = intlList( - [...types].map(getTranslatedEntityName), - Conjunctions.OR, - Delimiters.COMMA, - ); - + const entities = [...types].map(getTranslatedEntityName); const units = unit.transports?.map((transportedUnit) => transportedUnit.deploy(), ); @@ -898,13 +892,13 @@ const UnitTransports = ({ {limit === 1 ? ( This unit can transport one unit of type{' '} - {entities}. + . ) : ( This unit can transport up to{' '} {limit} units of type{' '} - {entities}. + . )}

diff --git a/hera/editor/MapEditor.tsx b/hera/editor/MapEditor.tsx index 7e9f7a18..48bf87fa 100644 --- a/hera/editor/MapEditor.tsx +++ b/hera/editor/MapEditor.tsx @@ -55,7 +55,7 @@ import Storage from '@deities/ui/Storage.tsx'; import { css, cx } from '@emotion/css'; import ChevronDown from '@iconify-icons/pixelarticons/chevron-down.js'; import ChevronLeft from '@iconify-icons/pixelarticons/chevron-left.js'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { AnimatePresence } from 'framer-motion'; import { ReactNode, diff --git a/hera/editor/behavior/DesignBehavior.tsx b/hera/editor/behavior/DesignBehavior.tsx index de699549..8d6d2078 100644 --- a/hera/editor/behavior/DesignBehavior.tsx +++ b/hera/editor/behavior/DesignBehavior.tsx @@ -35,7 +35,7 @@ import getFirstOrThrow from '@deities/hephaestus/getFirstOrThrow.tsx'; import AudioPlayer from '@deities/ui/AudioPlayer.tsx'; import throttle from '@deities/ui/controls/throttle.tsx'; import ImmutableMap from '@nkzw/immutable-map'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import addExplosionAnimation from '../../animations/addExplosionAnimation.tsx'; import Decorators from '../../Decorators.tsx'; import addFlashAnimation from '../../lib/addFlashAnimation.tsx'; diff --git a/hera/editor/lib/ActionCard.tsx b/hera/editor/lib/ActionCard.tsx index 2e9c4573..cae61320 100644 --- a/hera/editor/lib/ActionCard.tsx +++ b/hera/editor/lib/ActionCard.tsx @@ -34,7 +34,7 @@ import ChevronDown from '@iconify-icons/pixelarticons/chevron-down.js'; import ChevronUp from '@iconify-icons/pixelarticons/chevron-up.js'; import Close from '@iconify-icons/pixelarticons/close.js'; import ImmutableMap from '@nkzw/immutable-map'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { useInView } from 'framer-motion'; import { memo, ReactNode, RefObject, useMemo, useRef, useState } from 'react'; import InlineTileList from '../../card/InlineTileList.tsx'; diff --git a/hera/editor/lib/ObjectiveCard.tsx b/hera/editor/lib/ObjectiveCard.tsx index c65b863d..6fa3bc7d 100644 --- a/hera/editor/lib/ObjectiveCard.tsx +++ b/hera/editor/lib/ObjectiveCard.tsx @@ -32,10 +32,9 @@ import Stack from '@deities/ui/Stack.tsx'; import Tag from '@deities/ui/Tag.tsx'; import { css, cx } from '@emotion/css'; import Close from '@iconify-icons/pixelarticons/close.js'; -import { useCallback, useMemo, useState } from 'react'; +import { useCallback, useState } from 'react'; import { UserWithUnlocks } from '../../hooks/useUserMap.tsx'; import getCampaignTranslation from '../../i18n/getCampaignTranslation.tsx'; -import intlList, { Conjunctions, Delimiters } from '../../i18n/intlList.tsx'; import getTranslatedCrystalName from '../../invasions/getTranslatedCrystalName.tsx'; import getTranslatedBiomeName from '../../lib/getTranslatedBiomeName.tsx'; import ObjectiveTitle from '../../objectives/ObjectiveTitle.tsx'; @@ -83,22 +82,6 @@ export default function ObjectiveCard({ objectiveHasAmounts(objective) ? objective.amount : 0, ); const { alert } = useAlert(); - const campaignList = useMemo( - () => - campaigns - ? intlList( - campaigns.map(({ name, slug }) => ( - - {getCampaignTranslation(name)} - - )), - Conjunctions.AND, - Delimiters.COMMA, - ) - : null, - [campaigns], - ); - const onDelete = useCallback(() => { if (!canDelete) { return; @@ -113,13 +96,10 @@ export default function ObjectiveCard({ text: ( This objective is associated with the - - {intlList( - campaigns.map(({ name }) => getCampaignTranslation(name)), - Conjunctions.AND, - Delimiters.COMMA, - )} - {' '} + getCampaignTranslation(name))} + name="campaigns" + /> campaign . If you want to delete the objective, you must first @@ -622,7 +602,17 @@ export default function ObjectiveCard({

This objective is used in the{' '} - {campaignList}{' '} + ( + + {getCampaignTranslation(name)} + + ))} + name="campaigns" + />{' '} campaign . diff --git a/hera/editor/lib/getMapValidationErrorText.tsx b/hera/editor/lib/getMapValidationErrorText.tsx index 9ac681ed..0df14b4f 100644 --- a/hera/editor/lib/getMapValidationErrorText.tsx +++ b/hera/editor/lib/getMapValidationErrorText.tsx @@ -1,5 +1,5 @@ import { ErrorReason } from '@deities/athena/lib/validateMap.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; export default function getValidationErrorText(error?: ErrorReason) { const errors = { diff --git a/hera/editor/panels/DesignPanel.tsx b/hera/editor/panels/DesignPanel.tsx index 8800db4b..fb7827c4 100644 --- a/hera/editor/panels/DesignPanel.tsx +++ b/hera/editor/panels/DesignPanel.tsx @@ -40,7 +40,7 @@ import InlineLink from '@deities/ui/InlineLink.tsx'; import Stack from '@deities/ui/Stack.tsx'; import { css, cx } from '@emotion/css'; import Fill from '@iconify-icons/pixelarticons/fill-half.js'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { useCallback, useMemo } from 'react'; import InlineTileList, { SelectTileFn } from '../../card/InlineTileList.tsx'; import useGridNavigation from '../../hooks/useGridNavigation.tsx'; diff --git a/hera/editor/panels/EntityPanel.tsx b/hera/editor/panels/EntityPanel.tsx index a5b42980..7aa8b08e 100644 --- a/hera/editor/panels/EntityPanel.tsx +++ b/hera/editor/panels/EntityPanel.tsx @@ -28,7 +28,7 @@ import Slider from '@deities/ui/Slider.tsx'; import Stack from '@deities/ui/Stack.tsx'; import { css } from '@emotion/css'; import Heart from '@iconify-icons/pixelarticons/heart.js'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { ChangeEvent, Fragment, useCallback, useEffect, useMemo } from 'react'; import AttributeGrid from '../../card/AttributeGrid.tsx'; import { useSprites } from '../../hooks/useSprites.tsx'; diff --git a/hera/editor/panels/EvaluationPanel.tsx b/hera/editor/panels/EvaluationPanel.tsx index 1925c709..51ca967a 100644 --- a/hera/editor/panels/EvaluationPanel.tsx +++ b/hera/editor/panels/EvaluationPanel.tsx @@ -14,9 +14,9 @@ import ErrorText from '@deities/ui/ErrorText.tsx'; import Spinner from '@deities/ui/Spinner.tsx'; import Stack from '@deities/ui/Stack.tsx'; import { css } from '@emotion/css'; +import { List } from 'fbtee'; import { Fragment, useCallback, useEffect, useMemo, useState } from 'react'; import useClientGameAction from '../../hooks/useClientGameAction.tsx'; -import intlList, { Conjunctions, Delimiters } from '../../i18n/intlList.tsx'; import getTranslatedFactionName from '../../lib/getTranslatedFactionName.tsx'; import { StateWithActions } from '../../Types.tsx'; import MiniPlayerIcon from '../../ui/MiniPlayerIcon.tsx'; @@ -30,10 +30,10 @@ type Result = Readonly<{ const RUNS = 10; const Rounds = ({ results }: { results: ReadonlyArray }) => ( - + <> Rounds:{' '} {results.map(({ turns }) => turns).join(', ')} - + ); export default function EvaluationPanel({ @@ -143,7 +143,10 @@ export default function EvaluationPanel({ - Draw:{' '} + + Draw + + :{' '} {results.length}{' '} id) .values(), ]; - const winnerList = intlList( - winners.map( - getTranslatedFactionName.bind(null, state.playerDetails), - ), - Conjunctions.AND, - Delimiters.COMMA, - ); return ( @@ -184,7 +180,15 @@ export default function EvaluationPanel({ - {winnerList}:{' '} + + :{' '} {results.length}{' '} + import isPresent from '@deities/hephaestus/isPresent.tsx'; import AvailableLanguages from '@deities/i18n/AvailableLanguages.tsx'; import { Fonts } from '@deities/ui/CSS.tsx'; import Storage from '@deities/ui/Storage.tsx'; -import { TranslationDict } from 'fbt'; +import { TranslationDictionary, TranslationTable } from 'fbtee'; type LocaleLoaderFn = ( locale: string, -) => Promise<{ [hashKey: string]: unknown }>; +) => Promise<{ [hashKey: string]: TranslationTable }>; const key = 'locale'; const _defaultLanguage = 'en_US'; const availableLocales = new Map(); -const translations: TranslationDict = { [_defaultLanguage]: {} }; +const translations: TranslationDictionary = { [_defaultLanguage]: {} }; for (const [locale] of AvailableLanguages) { availableLocales.set(locale, locale); diff --git a/hera/i18n/intlList.tsx b/hera/i18n/intlList.tsx deleted file mode 100644 index 87b262ea..00000000 --- a/hera/i18n/intlList.tsx +++ /dev/null @@ -1,167 +0,0 @@ -/* eslint-disable @deities/require-fbt-description */ -import { isValidElement, ReactElement, ReactNode } from 'react'; - -export const Conjunctions = { - AND: 'AND', - NONE: 'NONE', - OR: 'OR', -} as const; - -export const Delimiters = { - BULLET: 'BULLET', - COMMA: 'COMMA', - SEMICOLON: 'SEMICOLON', -} as const; - -type Conjunction = keyof typeof Conjunctions; -type Delimiter = keyof typeof Delimiters; - -export default function intList( - items: ReadonlyArray, - conjunction: Conjunction, - delimiter: Delimiter, -): ReactNode { - if (process.env.NODE_ENV === 'development') { - items.forEach((item) => { - if (typeof item !== 'string' && !isValidElement(item)) { - throw new Error('Must provide a string or ReactComponent to intlList.'); - } - }); - } - - const count = items.length; - if (count === 0) { - return ''; - } else if (count === 1) { - return items[0]; - } - - const lastItem = items[count - 1]; - let output: ReactNode = items[0]; - for (let i = 1; i < count - 1; ++i) { - switch (delimiter) { - case Delimiters.SEMICOLON: - output = ( - - {output} - {'; '} - {items[i]} - - ); - break; - case Delimiters.BULLET: - output = ( - - {output} •{' '} - {items[i]} - - ); - break; - default: - output = ( - - {output} - {', '} - {items[i]} - - ); - } - } - - switch (conjunction) { - case Conjunctions.AND: - return ( - - {output} - and - {lastItem} - - ); - - case Conjunctions.OR: - return ( - - {output} - or - {lastItem} - - ); - case Conjunctions.NONE: - switch (delimiter) { - case Delimiters.SEMICOLON: - return ( - - {output} - {'; '} - {lastItem} - - ); - case Delimiters.BULLET: - return ( - - {output} •{' '} - {lastItem} - - ); - default: - return ( - - {output} - {', '} - {lastItem} - - ); - } - default: - throw new Error( - `fbt: Invalid conjunction '${conjunction}' provided to 'intlList'.`, - ); - } -} diff --git a/hera/invasions/getCrystalDescription.tsx b/hera/invasions/getCrystalDescription.tsx index d1446685..69210ff6 100644 --- a/hera/invasions/getCrystalDescription.tsx +++ b/hera/invasions/getCrystalDescription.tsx @@ -4,7 +4,7 @@ import { MaxChaosStars, } from '@deities/athena/invasions/Crystal.tsx'; import UnknownTypeError from '@deities/hephaestus/UnknownTypeError.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; export default function getCrystalDescription(crystal: Crystal) { switch (crystal) { diff --git a/hera/invasions/getTranslatedCrystalName.tsx b/hera/invasions/getTranslatedCrystalName.tsx index 291554f4..f10ac8c3 100644 --- a/hera/invasions/getTranslatedCrystalName.tsx +++ b/hera/invasions/getTranslatedCrystalName.tsx @@ -1,6 +1,6 @@ import { Crystal } from '@deities/athena/invasions/Crystal.tsx'; import UnknownTypeError from '@deities/hephaestus/UnknownTypeError.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; export default function getTranslatedCrystalName(crystal: Crystal) { switch (crystal) { diff --git a/hera/lib/abandonInvasion.tsx b/hera/lib/abandonInvasion.tsx index 56454018..2aeda7db 100644 --- a/hera/lib/abandonInvasion.tsx +++ b/hera/lib/abandonInvasion.tsx @@ -1,4 +1,4 @@ -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { State, StateLike } from '../Types.tsx'; import AnimationKey from './AnimationKey.tsx'; import getUserDisplayName from './getUserDisplayName.tsx'; diff --git a/hera/lib/addEndTurnAnimations.tsx b/hera/lib/addEndTurnAnimations.tsx index 4b52da8a..4bf7e92d 100644 --- a/hera/lib/addEndTurnAnimations.tsx +++ b/hera/lib/addEndTurnAnimations.tsx @@ -16,7 +16,7 @@ import Vector, { sortVectors, } from '@deities/athena/map/Vector.tsx'; import ImmutableMap from '@nkzw/immutable-map'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import NullBehavior from '../behavior/NullBehavior.tsx'; import { Actions, State, StateToStateLike } from '../Types.tsx'; import animateHeal from './animateHeal.tsx'; diff --git a/hera/lib/addPlayerLoseAnimation.tsx b/hera/lib/addPlayerLoseAnimation.tsx index 23337685..4303723e 100644 --- a/hera/lib/addPlayerLoseAnimation.tsx +++ b/hera/lib/addPlayerLoseAnimation.tsx @@ -1,7 +1,7 @@ import Player from '@deities/athena/map/Player.tsx'; import Unit from '@deities/athena/map/Unit.tsx'; import { sortVectors } from '@deities/athena/map/Vector.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import NullBehavior from '../behavior/NullBehavior.tsx'; import { Actions, State, StateToStateLike } from '../Types.tsx'; import AnimationKey from './AnimationKey.tsx'; diff --git a/hera/lib/animatePoison.tsx b/hera/lib/animatePoison.tsx index 6e781f65..9cb008cf 100644 --- a/hera/lib/animatePoison.tsx +++ b/hera/lib/animatePoison.tsx @@ -2,7 +2,7 @@ import { UnitsWithPosition } from '@deities/athena/lib/getUnitsByPositions.tsx'; import { PoisonDamage } from '@deities/athena/map/Configuration.tsx'; import Unit from '@deities/athena/map/Unit.tsx'; import Vector from '@deities/athena/map/Vector.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { resetBehavior } from '../behavior/Behavior.tsx'; import NullBehavior from '../behavior/NullBehavior.tsx'; import { State, StateLike, StateToStateLike } from '../Types.tsx'; diff --git a/hera/lib/animateSupply.tsx b/hera/lib/animateSupply.tsx index 68795161..32e050bf 100644 --- a/hera/lib/animateSupply.tsx +++ b/hera/lib/animateSupply.tsx @@ -1,7 +1,7 @@ import { UnitsWithPosition } from '@deities/athena/lib/getUnitsByPositions.tsx'; import Unit from '@deities/athena/map/Unit.tsx'; import Vector from '@deities/athena/map/Vector.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { resetBehavior } from '../behavior/Behavior.tsx'; import NullBehavior from '../behavior/NullBehavior.tsx'; import { State, StateLike, StateToStateLike } from '../Types.tsx'; diff --git a/hera/lib/getCoverName.tsx b/hera/lib/getCoverName.tsx index 9458ebb5..c6cf83a0 100644 --- a/hera/lib/getCoverName.tsx +++ b/hera/lib/getCoverName.tsx @@ -1,4 +1,4 @@ -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; const getCover = (cover: number) => { if (cover === Number.POSITIVE_INFINITY) { diff --git a/hera/lib/getCriteriaName.tsx b/hera/lib/getCriteriaName.tsx index ab87acb2..6ecbb990 100644 --- a/hera/lib/getCriteriaName.tsx +++ b/hera/lib/getCriteriaName.tsx @@ -1,6 +1,6 @@ import { Criteria } from '@deities/athena/Objectives.tsx'; import UnknownTypeError from '@deities/hephaestus/UnknownTypeError.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; export default function getCriteriaName(criteria: Criteria) { switch (criteria) { diff --git a/hera/lib/getInvasionNoticeAnimation.tsx b/hera/lib/getInvasionNoticeAnimation.tsx index 81b75cbd..bfc17adf 100644 --- a/hera/lib/getInvasionNoticeAnimation.tsx +++ b/hera/lib/getInvasionNoticeAnimation.tsx @@ -1,6 +1,6 @@ import { Crystal } from '@deities/athena/invasions/Crystal.tsx'; import { PlayerID } from '@deities/athena/map/Player.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { Animations } from '../MapAnimations.tsx'; import { PlayerDetails } from '../Types.tsx'; import AnimationKey from './AnimationKey.tsx'; diff --git a/hera/lib/getMapSizeName.tsx b/hera/lib/getMapSizeName.tsx index 52c67a3e..ef390f4f 100644 --- a/hera/lib/getMapSizeName.tsx +++ b/hera/lib/getMapSizeName.tsx @@ -1,5 +1,5 @@ import UnknownTypeError from '@deities/hephaestus/UnknownTypeError.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; export type MapSize = | 'Large' diff --git a/hera/lib/getSkillConfigForDisplay.tsx b/hera/lib/getSkillConfigForDisplay.tsx index 2a474cfc..e71d0dd4 100644 --- a/hera/lib/getSkillConfigForDisplay.tsx +++ b/hera/lib/getSkillConfigForDisplay.tsx @@ -33,7 +33,7 @@ import Shield from '@iconify-icons/pixelarticons/shield.js'; import Ship from '@iconify-icons/pixelarticons/ship.js'; import SpeedSlow from '@iconify-icons/pixelarticons/speed-slow.js'; import Zap from '@iconify-icons/pixelarticons/zap.js'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; type SkillConfig = Readonly<{ alpha?: number; diff --git a/hera/lib/getTranslatedBiomeName.tsx b/hera/lib/getTranslatedBiomeName.tsx index aac91778..c4812f89 100644 --- a/hera/lib/getTranslatedBiomeName.tsx +++ b/hera/lib/getTranslatedBiomeName.tsx @@ -1,6 +1,6 @@ import { Biome } from '@deities/athena/map/Biome.tsx'; import UnknownTypeError from '@deities/hephaestus/UnknownTypeError.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; export default function getTranslatedBiomeName(biome: Biome) { switch (biome) { diff --git a/hera/lib/getTranslatedColorName.tsx b/hera/lib/getTranslatedColorName.tsx index 493783da..72ace6a1 100644 --- a/hera/lib/getTranslatedColorName.tsx +++ b/hera/lib/getTranslatedColorName.tsx @@ -1,6 +1,6 @@ import { PlayerID } from '@deities/athena/map/Player.tsx'; import { playerToColor } from '@deities/ui/getColor.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; const capitalizedColor = (player: PlayerID) => { const color = playerToColor(player); diff --git a/hera/lib/getTranslatedEntityName.tsx b/hera/lib/getTranslatedEntityName.tsx index 6deccbc1..52a0269b 100644 --- a/hera/lib/getTranslatedEntityName.tsx +++ b/hera/lib/getTranslatedEntityName.tsx @@ -1,6 +1,6 @@ import { EntityGroup, EntityType } from '@deities/athena/map/Entity.tsx'; import UnknownTypeError from '@deities/hephaestus/UnknownTypeError.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; export default function getTranslatedEntityName(entityType: EntityType) { switch (entityType) { diff --git a/hera/lib/getTranslatedFactionName.tsx b/hera/lib/getTranslatedFactionName.tsx index 92fadbfd..60a79178 100644 --- a/hera/lib/getTranslatedFactionName.tsx +++ b/hera/lib/getTranslatedFactionName.tsx @@ -1,6 +1,6 @@ import { PlayerID } from '@deities/athena/map/Player.tsx'; import UnknownTypeError from '@deities/hephaestus/UnknownTypeError.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { PlayerDetails } from '../Types.tsx'; import getTranslatedColorName from './getTranslatedColorName.tsx'; diff --git a/hera/lib/getTranslatedTileTypeName.tsx b/hera/lib/getTranslatedTileTypeName.tsx index a5b7b0e4..93008e81 100644 --- a/hera/lib/getTranslatedTileTypeName.tsx +++ b/hera/lib/getTranslatedTileTypeName.tsx @@ -1,6 +1,6 @@ import { TileType, TileTypes } from '@deities/athena/info/Tile.tsx'; import UnknownTypeError from '@deities/hephaestus/UnknownTypeError.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; export default function getTranslatedTileTypeName(tileType: TileType) { switch (tileType) { diff --git a/hera/lib/getUserDisplayName.tsx b/hera/lib/getUserDisplayName.tsx index 548511c9..e45ce23c 100644 --- a/hera/lib/getUserDisplayName.tsx +++ b/hera/lib/getUserDisplayName.tsx @@ -1,5 +1,5 @@ import { PlayerID } from '@deities/athena/map/Player.tsx'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { PlayerDetails } from '../Types.tsx'; export default function getUserDisplayName( diff --git a/hera/objectives/ObjectiveDescription.tsx b/hera/objectives/ObjectiveDescription.tsx index 5184e066..1a614920 100644 --- a/hera/objectives/ObjectiveDescription.tsx +++ b/hera/objectives/ObjectiveDescription.tsx @@ -11,7 +11,7 @@ import getColor from '@deities/ui/getColor.tsx'; import gradient from '@deities/ui/gradient.tsx'; import Stack from '@deities/ui/Stack.tsx'; import { css } from '@emotion/css'; -import intlList, { Conjunctions, Delimiters } from '../i18n/intlList.tsx'; +import { list } from 'fbtee'; import getTranslatedFactionName from '../lib/getTranslatedFactionName.tsx'; import { PlayerDetails } from '../Types.tsx'; import UILabel from '../ui/UILabel.tsx'; @@ -27,14 +27,13 @@ const PlayerList = ({ players: PlayerIDs; }) => players.length ? ( - intlList( + list( players.map((id) => ( {getTranslatedFactionName(playerDetails, id)} )), - Conjunctions[conjunction === 'or' ? 'OR' : 'AND'], - Delimiters.COMMA, + conjunction, ) ) : ( @@ -65,12 +64,7 @@ const ObjectiveText = ({ ))) || null; const labelList = - labels && - intlList( - labels, - type === Criteria.DefeatOneLabel ? Conjunctions.OR : Conjunctions.AND, - Delimiters.COMMA, - ); + labels && list(labels, type === Criteria.DefeatOneLabel ? 'or' : 'and'); switch (type) { case Criteria.Default: diff --git a/hera/package.json b/hera/package.json index cd2a6e17..b9f7f061 100644 --- a/hera/package.json +++ b/hera/package.json @@ -23,7 +23,7 @@ "@nkzw/immutable-map": "^1.2.2", "@nkzw/use-relative-time": "^1.1.0", "array-shuffle": "^3.0.0", - "fbt": "^1.0.2", + "fbtee": "^0.2.0", "framer-motion": "^11.15.0", "react": "19.0.0", "react-dom": "19.0.0", diff --git a/hera/types/Fbt.tsx b/hera/types/Fbt.tsx deleted file mode 100644 index 41faf5ab..00000000 --- a/hera/types/Fbt.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import type { fbt } from 'fbt'; - -export type Fbt = ReturnType; diff --git a/hera/ui/ErrorOverlay.tsx b/hera/ui/ErrorOverlay.tsx index 31b3f4d9..24dbf862 100644 --- a/hera/ui/ErrorOverlay.tsx +++ b/hera/ui/ErrorOverlay.tsx @@ -3,7 +3,7 @@ import useAlert from '@deities/ui/hooks/useAlert.tsx'; import captureException from '@deities/ui/lib/captureException.tsx'; import Stack from '@deities/ui/Stack.tsx'; import { css } from '@emotion/css'; -import { fbt } from 'fbt'; +import { fbt } from 'fbtee'; import { useEffect } from 'react'; export class SpriteLoadError extends Error {} diff --git a/hera/ui/GameDialog.tsx b/hera/ui/GameDialog.tsx index bbcd2b32..f31bd8da 100644 --- a/hera/ui/GameDialog.tsx +++ b/hera/ui/GameDialog.tsx @@ -44,7 +44,6 @@ import Subscriptions from '@iconify-icons/pixelarticons/subscriptions.js'; import Trophy from '@iconify-icons/pixelarticons/trophy.js'; import Zap from '@iconify-icons/pixelarticons/zap.js'; import { - Fragment, memo, ReactElement, useCallback, @@ -383,10 +382,10 @@ const MapPerformance = ({ without losing a unit to secure the{' '} { - + <> {getTranslatedPerformanceTypeName('power')} - + } {' '} star. @@ -461,19 +460,19 @@ const GameInfoPanel = memo(function GameInfoPanel({ const endGameText = useMemo( () => ( - + <> {canAbandon ? ( Abandon ) : ( Give Up )} - + ), [canAbandon], ); const endGameExplanation = useMemo( () => ( - + <> {canAbandon ? ( Are you sure you want to abandon this map? You will not receive any @@ -484,7 +483,7 @@ const GameInfoPanel = memo(function GameInfoPanel({ Are you sure you want to give up and restart this map? )} - + ), [canAbandon], ); diff --git a/hera/ui/SkillDescription.tsx b/hera/ui/SkillDescription.tsx index 26733b1f..b2fd65b6 100644 --- a/hera/ui/SkillDescription.tsx +++ b/hera/ui/SkillDescription.tsx @@ -81,9 +81,9 @@ import { css, cx } from '@emotion/css'; import Charge from '@iconify-icons/pixelarticons/ac.js'; import Coin from '@iconify-icons/pixelarticons/coin.js'; import WarningBox from '@iconify-icons/pixelarticons/warning-box.js'; +import { List, list } from 'fbtee'; import { Fragment, memo } from 'react'; import BuildingTile from '../Building.tsx'; -import intlList, { Conjunctions, Delimiters } from '../i18n/intlList.tsx'; import getTranslatedCrystalName from '../invasions/getTranslatedCrystalName.tsx'; import getSkillConfigForDisplay from '../lib/getSkillConfigForDisplay.tsx'; import getTranslatedTileTypeName from '../lib/getTranslatedTileTypeName.tsx'; @@ -95,7 +95,7 @@ const canBuildBar = (unitCosts: ReadonlyMap) => ); const RawUnitName = ({ color, unit }: { color: BaseColor; unit: UnitInfo }) => ( - + <> ( > {unit.name} - + ); const UnitName = ({ color, unit }: { color: BaseColor; unit: UnitInfo }) => ( @@ -135,15 +135,12 @@ const UnitNames = ({ units: ReadonlyArray; }) => ( - - {intlList( - units.map((unit, index) => ( - - )), - Conjunctions.AND, - Delimiters.COMMA, - )} - {' '} + ( + + ))} + name="units" + />{' '} units ); @@ -236,7 +233,7 @@ const UnitStatusEffects = ({ type: 'attack' | 'defense'; }) => effects.size - ? intlList( + ? list( groupUnitTypes(effects).map(([effect, units], index) => ( )), - Conjunctions.AND, - Delimiters.COMMA, ) : null; @@ -280,20 +275,17 @@ const UnitRange = ({ range.size ? ( Changes the range of{' '} - - {intlList( - [...range].map(([unit, range], index) => ( - - )), - Conjunctions.AND, - Delimiters.COMMA, - )} - + ( + + ))} + name="list" + /> ) : null; @@ -331,20 +323,20 @@ const MovementTypeStatusEffect = ({ effects: ReadonlyMap; type: 'attack' | 'defense'; }) => - effects.size - ? intlList( - groupMovementTypes(effects).map(([effect, movementTypes], index) => ( + effects.size ? ( + ( - )), - Conjunctions.AND, - Delimiters.COMMA, - ) - : null; + ), + )} + /> + ) : null; const TileTypeStatusEffect = ({ effects: initialEffects, @@ -368,32 +360,27 @@ const TileTypeStatusEffect = ({ ]); } - return inverseEffects.size - ? intlList( - [...inverseEffects].map(([movementTypes, tileTypes], index) => ( - - - - - {' '} - on{' '} - - {intlList( - tileTypes.map((tileType, index) => ( - - )), - Conjunctions.AND, - Delimiters.COMMA, - )} - {' '} - fields - - - )), - Conjunctions.AND, - Delimiters.COMMA, - ) - : null; + return inverseEffects.size ? ( + ( + + + + + {' '} + on{' '} + ( + + ))} + name="tileType" + />{' '} + fields + + + ))} + /> + ) : null; }; const BuildingName = ({ @@ -445,9 +432,9 @@ const UnitCost = ({ {' '} for - + <> {cost} - + ) : ( @@ -457,9 +444,9 @@ const UnitCost = ({ for - + <> {cost} - + ); @@ -471,26 +458,23 @@ const UnitCosts = ({ color: BaseColor; costs: ReadonlyMap; }) => ( - + <> Build - - {intlList( - [...costs].map(([unit, cost], index) => ( - - )), - Conjunctions.AND, - Delimiters.COMMA, - )} - . + ( + + ))} + name="list" + />. {canBuildBar(costs) ? ( - + <> {' '} Enables constructing @@ -499,9 +483,9 @@ const UnitCosts = ({ {' '} buildings. - + ) : null} - + ); const UnitBlocks = ({ @@ -513,15 +497,12 @@ const UnitBlocks = ({ }) => ( Cannot build - - {intlList( - [...blocked].map((unit, index) => ( - - )), - Conjunctions.AND, - Delimiters.COMMA, - )} - . + ( + + ))} + name="list" + />. ); @@ -541,14 +522,13 @@ const MovementTypeNames = ({ movementTypes, }: { movementTypes: ReadonlyArray; -}) => - intlList( - movementTypes.map((movementType, index) => ( +}) => ( + ( - )), - Conjunctions.AND, - Delimiters.COMMA, - ); + ))} + /> +); const TileTypeName = ({ tileType }: { tileType: TileType }) => ( ; }) => ( - - {intlList( - groupMovementTypes(movement).map(([radius, movementTypes], index) => ( + ( - )), - Conjunctions.AND, - Delimiters.COMMA, + ), )} - + name="list" + /> ); @@ -611,7 +590,7 @@ const ActiveUnitType = ({ return typeof type === 'number' ? ( ) : isVector(type) ? ( - + Position {`(${type.x},${type.y})`} ) : ( @@ -629,15 +608,15 @@ const HealTypes = ({ {types === 'all' ? ( - all units + + all units + ) : ( - intlList( - [...types].map((type, index) => ( + ( - )), - Conjunctions.AND, - Delimiters.COMMA, - ) + ))} + /> )} {' '} units are healed by {`${HealAmount}%`} @@ -1138,7 +1117,9 @@ export default memo(function SkillDescription({ ) : null, effects.length ? ( - <>{intlList(effects, Conjunctions.AND, Delimiters.COMMA)}. + <> + . + ) : null, isPower && activateOnInvasion ? (

@@ -1263,19 +1244,16 @@ export const SkillUnlockDescription = ({ unlockContent = ( Unlocks{' '} - - {intlList( - [...costs].map(([unit], index) => ( - - )), - Conjunctions.AND, - Delimiters.COMMA, - )} - {' '} + ( + + ))} + name="list" + />{' '} and the{' '} diff --git a/hera/ui/lib/formatCharacterText.tsx b/hera/ui/lib/formatCharacterText.tsx index fc421a0f..514ab1fb 100644 --- a/hera/ui/lib/formatCharacterText.tsx +++ b/hera/ui/lib/formatCharacterText.tsx @@ -9,8 +9,7 @@ import MapData from '@deities/athena/MapData.tsx'; import parseInteger from '@deities/hephaestus/parseInteger.tsx'; import { formatInputNames } from '@deities/ui/controls/formatInputNames.tsx'; import { getGamepadType } from '@deities/ui/controls/setupGamePad.tsx'; -import { fbt } from 'fbt'; -import intlList, { Conjunctions, Delimiters } from '../../i18n/intlList.tsx'; +import { fbt, list } from 'fbtee'; import getTranslatedFactionName from '../../lib/getTranslatedFactionName.tsx'; import getUserDisplayName from '../../lib/getUserDisplayName.tsx'; import { PlayerDetails } from '../../Types.tsx'; @@ -29,7 +28,7 @@ export default function formatCharacterText( [ 'opponents', String( - intlList( + list( [...playerDetails] .filter( ([playerID]) => @@ -37,8 +36,6 @@ export default function formatCharacterText( map.isOpponent(playerID, player), ) .map(([playerID]) => getUserDisplayName(playerDetails, playerID)), - Conjunctions.AND, - Delimiters.COMMA, ), ) || fbt( diff --git a/i18n/Common.cjs b/i18n/Common.cjs deleted file mode 100644 index 7bad63ca..00000000 --- a/i18n/Common.cjs +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - ...require('./Entities.cjs'), -}; diff --git a/i18n/Common.ts b/i18n/Common.ts new file mode 100644 index 00000000..58040df5 --- /dev/null +++ b/i18n/Common.ts @@ -0,0 +1 @@ +export { default } from './Entities.ts'; diff --git a/infra/babelPlugins.tsx b/infra/babelPlugins.tsx deleted file mode 100644 index bef6ff55..00000000 --- a/infra/babelPlugins.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { join } from 'node:path'; -import babelPluginFbt from 'babel-plugin-fbt'; -import babelPluginFbtImport from 'babel-plugin-fbt-import'; -import babelPluginFbtRuntime from 'babel-plugin-fbt-runtime'; -import isOpenSource from './isOpenSource.tsx'; -import root from './root.ts'; - -const enumManifest = (() => { - try { - return require('../ares/.enum_manifest.json'); - } catch { - if (!isOpenSource()) { - throw new Error('babelPlugins: Missing enum manifest.'); - } - } - return {}; -})(); - -export default [ - babelPluginFbtImport, - [ - babelPluginFbt, - { - extraOptions: { __self: true }, - fbtCommonPath: join(root, 'i18n/Common.cjs'), - fbtEnumManifest: enumManifest, - }, - ], - babelPluginFbtRuntime, -]; diff --git a/infra/babelPresets.tsx b/infra/babelPresets.tsx new file mode 100644 index 00000000..ae8a4832 --- /dev/null +++ b/infra/babelPresets.tsx @@ -0,0 +1,25 @@ +import fbteePreset from '@nkzw/babel-preset-fbtee'; +import fbtCommon from '../i18n/Common.ts'; +import isOpenSource from './isOpenSource.tsx'; + +const enumManifest = (() => { + try { + return require('../ares/.enum_manifest.json'); + } catch { + if (!isOpenSource()) { + throw new Error('babelPresets: Missing enum manifest.'); + } + } + return {}; +})(); + +export default [ + [ + fbteePreset, + { + extraOptions: { __self: true }, + fbtCommon, + fbtEnumManifest: enumManifest, + }, + ], +]; diff --git a/package.json b/package.json index 86707e9b..42f1dbec 100644 --- a/package.json +++ b/package.json @@ -59,15 +59,13 @@ "@babel/plugin-syntax-typescript": "^7.25.9", "@deities/eslint-plugin": "workspace:*", "@ianvs/prettier-plugin-sort-imports": "^4.4.0", + "@nkzw/babel-preset-fbtee": "^0.2.0", "@nkzw/eslint-config": "^1.19.0", + "@nkzw/eslint-plugin-fbtee": "^0.2.0", "@styled/typescript-styled-plugin": "^1.0.1", "@swc/core": "^1.10.4", - "@types/fbt": "^1.0.5", "@types/node": "^22.10.4", "@vitejs/plugin-react": "^4.3.4", - "babel-plugin-fbt": "^1.0.0", - "babel-plugin-fbt-import": "^0.1.0", - "babel-plugin-fbt-runtime": "^1.0.0", "chalk": "^5.4.1", "dotenv": "^16.4.7", "eslint": "^8.57.0", @@ -93,9 +91,6 @@ "react", "react-dom", "utf-8-validate" - ], - "ignoreMissing": [ - "@fbtjs/default-collection-transform" ] }, "neverBuiltDependencies": [ @@ -113,7 +108,6 @@ "patchedDependencies": { "@remix-run/router": "patches/@remix-run__router.patch", "eslint-plugin-import": "patches/eslint-plugin-import.patch", - "fbt@1.0.2": "patches/fbt@1.0.2.patch", "graphql-helix@1.13.0": "patches/graphql-helix@1.13.0.patch", "howler@2.2.4": "patches/howler@2.2.4.patch", "require-in-the-middle": "patches/require-in-the-middle.patch", diff --git a/patches/fbt@1.0.2.patch b/patches/fbt@1.0.2.patch deleted file mode 100644 index 150b77eb..00000000 --- a/patches/fbt@1.0.2.patch +++ /dev/null @@ -1,74 +0,0 @@ -diff --git a/lib/FbtReactUtil.js b/lib/FbtReactUtil.js -index becb60e893478abf6b5edf1baa176c69b009d33f..6a0b62f647f23a5688fed5c6e5b3df801af379d8 100644 ---- a/lib/FbtReactUtil.js -+++ b/lib/FbtReactUtil.js -@@ -16,7 +16,7 @@ - * @noformat - * @nogrep - */ --var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol["for"] && Symbol["for"]('react.element') || 0xeac7; -+var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol["for"] && Symbol["for"]('react.transitional.element') || 0xeac7; - var canDefineProperty = false; - - if (process.env.NODE_ENV !== "production") { -diff --git a/lib/substituteTokens.js b/lib/substituteTokens.js -index 144db1d6553417bb9ec67f537c40c0c4cc4f0067..3061f41cf04dce35f5868c14bbfa2bd75cca10eb 100644 ---- a/lib/substituteTokens.js -+++ b/lib/substituteTokens.js -@@ -39,17 +39,28 @@ function markAsSafeForReact(object) { - if (process.env.NODE_ENV !== "production") { - // If this looks like a ReactElement, mark it as safe to silence any - // key warnings. -- // I use a string key to avoid any possible private variable transforms. -- var storeKey = '_store'; -- var store = object[storeKey]; - -- if (object.type != null && object.type != '' && typeof object.props === 'object' && store != null && typeof store === 'object' && typeof store.validated === 'boolean') { -- store.validated = true; -+ // I use a string key to avoid any possible private variable transforms. -+ const storeKey = '_store'; -+ -+ const store = object[storeKey]; -+ if ( -+ object.type != null && -+ object.type != '' && -+ typeof object.props === 'object' && -+ store != null && -+ typeof store === 'object' -+ ) { -+ if (typeof store.validated === 'number') { -+ store.validated = 1; -+ } else if (typeof store.validated === 'boolean') { -+ store.validated = true; -+ } - } - } -- - return object; - } -+ - /** - * Does the token substitution fbt() but without the string lookup. - * Used for in-place substitutions in translation mode. -@@ -66,12 +77,6 @@ function substituteTokens(template, args, errorListener) { - var objectPieces = []; - var argNames = []; - var stringPieces = template.replace(parameterRegexp, function (_match, parameter, punctuation) { -- if (!hasOwnProperty.call(args, parameter)) { -- var _errorListener$onMiss; -- -- errorListener === null || errorListener === void 0 ? void 0 : (_errorListener$onMiss = errorListener.onMissingParameterError) === null || _errorListener$onMiss === void 0 ? void 0 : _errorListener$onMiss.call(errorListener, Object.keys(args), parameter); -- } -- - var argument = args[parameter]; - - if (argument != null && typeof argument === 'object') { -@@ -80,7 +85,7 @@ function substituteTokens(template, args, errorListener) { - - return '\x17' + punctuation; - } else if (argument == null) { -- return ''; -+ return '{' + parameter + '}' + punctuation; - } - - return String(argument) + (0, _IntlPunctuation.dedupeStops)(String(argument), punctuation); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f683f168..525a768c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,9 +15,6 @@ patchedDependencies: eslint-plugin-import: hash: bydsny2voedhnuh2ubrznxjhie path: patches/eslint-plugin-import.patch - fbt@1.0.2: - hash: h3le5xcbsw44ybdi7qpcrzppny - path: patches/fbt@1.0.2.patch graphql-helix@1.13.0: hash: zltyqk45poay6m4komgvsov4ua path: patches/graphql-helix@1.13.0.patch @@ -47,33 +44,27 @@ importers: '@ianvs/prettier-plugin-sort-imports': specifier: ^4.4.0 version: 4.4.0(prettier@4.0.0-alpha.10) + '@nkzw/babel-preset-fbtee': + specifier: ^0.2.0 + version: 0.2.0 '@nkzw/eslint-config': specifier: ^1.19.0 version: 1.19.0(eslint@8.57.0)(typescript@5.7.2(patch_hash=icxwwkq44uizmbsct6du47zdsu)) + '@nkzw/eslint-plugin-fbtee': + specifier: ^0.2.0 + version: 0.2.0(eslint@8.57.0)(typescript@5.7.2(patch_hash=icxwwkq44uizmbsct6du47zdsu)) '@styled/typescript-styled-plugin': specifier: ^1.0.1 version: 1.0.1 '@swc/core': specifier: ^1.10.4 version: 1.10.4 - '@types/fbt': - specifier: ^1.0.5 - version: 1.0.5 '@types/node': specifier: ^22.10.4 version: 22.10.4 '@vitejs/plugin-react': specifier: ^4.3.4 version: 4.3.4(vite@6.0.7(@types/node@22.10.4)(jiti@1.21.7)(terser@5.37.0)(yaml@2.7.0)) - babel-plugin-fbt: - specifier: ^1.0.0 - version: 1.0.0 - babel-plugin-fbt-import: - specifier: ^0.1.0 - version: 0.1.0 - babel-plugin-fbt-runtime: - specifier: ^1.0.0 - version: 1.0.0(babel-plugin-fbt@1.0.0) chalk: specifier: ^5.4.1 version: 5.4.1 @@ -191,9 +182,9 @@ importers: cordova-plugin-purchase: specifier: ^13.12.1 version: 13.12.1 - fbt: - specifier: ^1.0.2 - version: 1.0.2(patch_hash=h3le5xcbsw44ybdi7qpcrzppny)(babel-plugin-fbt-runtime@1.0.0(babel-plugin-fbt@1.0.0))(babel-plugin-fbt@1.0.0)(react@19.0.0) + fbtee: + specifier: ^0.2.0 + version: 0.2.0(@nkzw/babel-plugin-fbtee-runtime@0.2.0(@nkzw/babel-plugin-fbtee@0.2.0))(@nkzw/babel-plugin-fbtee@0.2.0)(react@19.0.0) framer-motion: specifier: ^11.15.0 version: 11.15.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -575,9 +566,9 @@ importers: array-shuffle: specifier: ^3.0.0 version: 3.0.0 - fbt: - specifier: ^1.0.2 - version: 1.0.2(patch_hash=h3le5xcbsw44ybdi7qpcrzppny)(babel-plugin-fbt-runtime@1.0.0(babel-plugin-fbt@1.0.0))(babel-plugin-fbt@1.0.0)(react@19.0.0) + fbtee: + specifier: ^0.2.0 + version: 0.2.0(@nkzw/babel-plugin-fbtee-runtime@0.2.0(@nkzw/babel-plugin-fbtee@0.2.0))(@nkzw/babel-plugin-fbtee@0.2.0)(react@19.0.0) framer-motion: specifier: ^11.15.0 version: 11.15.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -654,9 +645,9 @@ importers: dunkel-theme: specifier: ^1.7.1 version: 1.7.1 - fbt: - specifier: ^1.0.2 - version: 1.0.2(patch_hash=h3le5xcbsw44ybdi7qpcrzppny)(babel-plugin-fbt-runtime@1.0.0(babel-plugin-fbt@1.0.0))(babel-plugin-fbt@1.0.0)(react@19.0.0) + fbtee: + specifier: ^0.2.0 + version: 0.2.0(@nkzw/babel-plugin-fbtee-runtime@0.2.0(@nkzw/babel-plugin-fbtee@0.2.0))(@nkzw/babel-plugin-fbtee@0.2.0)(react@19.0.0) framer-motion: specifier: ^11.15.0 version: 11.15.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -730,9 +721,9 @@ importers: array-shuffle: specifier: ^3.0.0 version: 3.0.0 - fbt: - specifier: ^1.0.2 - version: 1.0.2(patch_hash=h3le5xcbsw44ybdi7qpcrzppny)(babel-plugin-fbt-runtime@1.0.0(babel-plugin-fbt@1.0.0))(babel-plugin-fbt@1.0.0)(react@19.0.0) + fbtee: + specifier: ^0.2.0 + version: 0.2.0(@nkzw/babel-plugin-fbtee-runtime@0.2.0(@nkzw/babel-plugin-fbtee@0.2.0))(@nkzw/babel-plugin-fbtee@0.2.0)(react@19.0.0) framer-motion: specifier: ^11.15.0 version: 11.15.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -865,9 +856,9 @@ importers: chalk: specifier: ^5.4.1 version: 5.4.1 - fbt: - specifier: ^1.0.2 - version: 1.0.2(patch_hash=h3le5xcbsw44ybdi7qpcrzppny)(babel-plugin-fbt-runtime@1.0.0(babel-plugin-fbt@1.0.0))(babel-plugin-fbt@1.0.0)(react@19.0.0) + fbtee: + specifier: ^0.2.0 + version: 0.2.0(@nkzw/babel-plugin-fbtee-runtime@0.2.0(@nkzw/babel-plugin-fbtee@0.2.0))(@nkzw/babel-plugin-fbtee@0.2.0)(react@19.0.0) jest-image-snapshot: specifier: ^6.4.0 version: 6.4.0 @@ -910,9 +901,9 @@ importers: '@emotion/css': specifier: ^11.13.5 version: 11.13.5 - fbt: - specifier: ^1.0.2 - version: 1.0.2(patch_hash=h3le5xcbsw44ybdi7qpcrzppny)(babel-plugin-fbt-runtime@1.0.0(babel-plugin-fbt@1.0.0))(babel-plugin-fbt@1.0.0)(react@19.0.0) + fbtee: + specifier: ^0.2.0 + version: 0.2.0(@nkzw/babel-plugin-fbtee-runtime@0.2.0(@nkzw/babel-plugin-fbtee@0.2.0))(@nkzw/babel-plugin-fbtee@0.2.0)(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -956,9 +947,9 @@ importers: '@nkzw/joymap': specifier: ^3.0.0 version: 3.0.0 - fbt: - specifier: ^1.0.2 - version: 1.0.2(patch_hash=h3le5xcbsw44ybdi7qpcrzppny)(babel-plugin-fbt-runtime@1.0.0(babel-plugin-fbt@1.0.0))(babel-plugin-fbt@1.0.0)(react@19.0.0) + fbtee: + specifier: ^0.2.0 + version: 0.2.0(@nkzw/babel-plugin-fbtee-runtime@0.2.0(@nkzw/babel-plugin-fbtee@0.2.0))(@nkzw/babel-plugin-fbtee@0.2.0)(react@19.0.0) framer-motion: specifier: ^11.15.0 version: 11.15.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -1337,17 +1328,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-flow@7.26.0': - resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.26.0': resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} engines: {node: '>=6.9.0'} @@ -1366,31 +1346,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.9': resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} engines: {node: '>=6.9.0'} @@ -1499,12 +1454,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-flow-strip-types@7.25.9': - resolution: {integrity: sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.25.9': resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} engines: {node: '>=6.9.0'} @@ -1637,6 +1586,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-display-name@7.25.9': + resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.25.9': + resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.25.9': resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} engines: {node: '>=6.9.0'} @@ -1649,6 +1610,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.25.9': + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.25.9': + resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-regenerator@7.25.9': resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} engines: {node: '>=6.9.0'} @@ -1697,6 +1670,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.26.3': + resolution: {integrity: sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-escapes@7.25.9': resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} engines: {node: '>=6.9.0'} @@ -1732,8 +1711,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/register@7.25.9': - resolution: {integrity: sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==} + '@babel/preset-react@7.26.3': + resolution: {integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.26.0': + resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2426,11 +2411,30 @@ packages: peerDependencies: rollup: ^4.16.4 + '@nkzw/babel-plugin-fbtee-auto-import@0.2.0': + resolution: {integrity: sha512-iOj2EOVQ3fybTnvF1lba2MhrR3ndAQBaoVpmvtAB5F3bQ3GbKw3htF9YBTDATZwxIhrmdmmvTz8rsK0SPkZV8A==} + + '@nkzw/babel-plugin-fbtee-runtime@0.2.0': + resolution: {integrity: sha512-StWScPZisSaq1l6Xj4ilqgKCt+SDRw5JBnKQi4cOAmVi+4MDGgAgVAI2TU1Ypnp3y8eN/mM8oWoOOJ+XUPNvFg==} + peerDependencies: + '@nkzw/babel-plugin-fbtee': ^0.2.0 + + '@nkzw/babel-plugin-fbtee@0.2.0': + resolution: {integrity: sha512-wdQxtdZGsnHPMSa1B7SS6iIjuqnExeh9oQxu8+TYmo2Yo0o8gyW/aZW4kSWNcM61jcd8pMEcmI6UjYYToNLhVw==} + hasBin: true + + '@nkzw/babel-preset-fbtee@0.2.0': + resolution: {integrity: sha512-ref96cHAP83Lo3li7XGr+YfWj5Kkhe7VW8isnQDxz6C+eK+noij4Bk4RQLbnPCpkzK7qT9OH+eu2FuF+5wyb3g==} + hasBin: true + '@nkzw/eslint-config@1.19.0': resolution: {integrity: sha512-udRBviWy0oBHrOtCE/viXn1Iqy52oC0ex7LsmWnCfXvkfoWCEhK1jxI4pIz+5Ctli03/+9YJxT2cVXA8ikDzPg==} peerDependencies: eslint: '>= 8' + '@nkzw/eslint-plugin-fbtee@0.2.0': + resolution: {integrity: sha512-J70+6sKZdB8ie0tOUO0iiXBwrnryxNTuMUVZr1GKJb5/xu9374ux1Qtzd36sOKRYdjUzWEafpJsm13gyve/mCA==} + '@nkzw/eslint-plugin@1.8.0': resolution: {integrity: sha512-doODSLfA7C6fA/wF20uk9whJIeH0ZydyVb8PlhDBZE0kJaOUSKfZqTKzxflxPF9sGG+Lhr2v/Ih//dzBHp/rxw==} peerDependencies: @@ -3823,9 +3827,6 @@ packages: '@types/express@5.0.0': resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==} - '@types/fbt@1.0.5': - resolution: {integrity: sha512-eSyOYJH6YaMRd3HIy34TArMDgfCw3nJ8ijMc/dCvBRVIxsujZsVO6pYi10rFInPhaY60P7WSYz9SH70tWZ00UA==} - '@types/gaussian@1.2.2': resolution: {integrity: sha512-FLlJb9oGcoq0xVaAmn5ytZWeEO4M7nfudewzqL6FxUUYLR5FB+hEzSYAsuhX7H7M6Mw/Z0rLbIVbQkMqHlRS7g==} @@ -4352,21 +4353,6 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - babel-plugin-fbt-import@0.1.0: - resolution: {integrity: sha512-doOkIPQ5vP4hQsgwlyxqoh61JU9MZ2nbj7WaiqxHKPeT03OFJA/+d5+PvWfDOh6F2qlBKAGbhy0fFiOKwxxU7Q==} - - babel-plugin-fbt-runtime@1.0.0: - resolution: {integrity: sha512-gML1rXqIfc+sDf1DWxu1WJjmotBYr6f9vjKwOoetuOukM1o3mTKNAeBFGEYu7iBACkuaXpIi++qW8/URgHnduQ==} - peerDependencies: - babel-plugin-fbt: ^1.0.0 - - babel-plugin-fbt@1.0.0: - resolution: {integrity: sha512-Tjpkrt4JJLgtS+x6HzkWdOguH+Pb+pzJmSkBmHIWrjf3x9Pf+xFcQUdAbpDKOtRPgu6QyI9DtDulw0sbgdfYdg==} - engines: {node: '>= 12.16.0'} - hasBin: true - peerDependencies: - '@fbtjs/default-collection-transform': ^1.0.0 - babel-plugin-macros@2.8.0: resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} @@ -4509,10 +4495,6 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - caniuse-lite@1.0.30001690: resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} @@ -4580,10 +4562,6 @@ packages: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} - cli-color@0.1.7: - resolution: {integrity: sha512-xNaQxWYgI6DD4xIJLn8GY2zDZVbrN0vsU1fEbDNAHZRyceWhpj7A08mYcG1AY92q1Aw0geYkVfiAcEYIZtuTSg==} - engines: {node: '>=0.1.103'} - cli-cursor@4.0.0: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4592,12 +4570,9 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - - clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} @@ -4635,9 +4610,6 @@ packages: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -4805,10 +4777,6 @@ packages: supports-color: optional: true - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} @@ -4913,9 +4881,6 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -4962,10 +4927,6 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - dreamopt@0.6.0: - resolution: {integrity: sha512-KRJa47iBEK0y6ZtgCgy2ykuvMT8c9gj3ua9Dv7vCkclFJJeH2FjhGY2xO5qBoWGahsjCGMlk4Cq9wJYeWxuYhQ==} - engines: {node: '>=0.4.0'} - dset@3.1.4: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} @@ -5086,10 +5047,6 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es5-ext@0.8.2: - resolution: {integrity: sha512-H19ompyhnKiBdjHR1DPHvf5RHgHPmJaY9JNzFGbMbPgdsUkvnUCN1Ke8J4Y0IMyTwFM2M9l4h2GoHwzwpSmXbA==} - engines: {node: '>=0.4'} - esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} @@ -5405,21 +5362,18 @@ packages: fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - fb-babel-plugin-utils@0.13.1: - resolution: {integrity: sha512-AxAr7ut7v4fzHp5VETGxcDUPmRup5H7bkMNNfxaRunS3jzm2rOS5NLvCPCDnnQIiI6AB0x2GrOx/eIcAOVJAAA==} - fbjs-css-vars@1.0.2: resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} fbjs@3.0.5: resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} - fbt@1.0.2: - resolution: {integrity: sha512-vWIasrcX34OW2EWohjrAQM0jpJBH2FjqxW9XrQd38xhtBVXWaks34ePWBSHO3QEShmirRx6kwJNZJrofsHjvlw==} + fbtee@0.2.0: + resolution: {integrity: sha512-ZMfX6xmm9kmtU7Pi6SHXcrFODbm1cR/MDCTUlWKZYThHgPqp9Mal8a82Pml0Zf5aj80mXNwt7yhFvo+HwJnTsA==} peerDependencies: - babel-plugin-fbt: ^1.0.0 - babel-plugin-fbt-runtime: ^1.0.0 - react: 19.0.0-rc.1 + '@nkzw/babel-plugin-fbtee': ^0.2.0 + '@nkzw/babel-plugin-fbtee-runtime': ^0.2.0 + react: ^19.0.0 fdir@6.4.2: resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} @@ -5444,10 +5398,6 @@ packages: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} - find-cache-dir@2.1.0: - resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} - engines: {node: '>=6'} - find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} @@ -5457,10 +5407,6 @@ packages: find-up-path@1.0.0: resolution: {integrity: sha512-cjXDXnYfEezIqqbzctBNNqUax/rRCyNo/VTCFId3Hp9FyVL4uk0PvWrs7Xibtl2E4P5HnWnlxxJsbHqK6DsDPw==} - find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -5479,9 +5425,6 @@ packages: flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - flow-enums-runtime@0.0.4: - resolution: {integrity: sha512-kkJ/ABZb4rhyFw05yCWdcA1K2uW7ddYzz9zVNJp5kRX3BzsIynB4f0E4oLlf+zgDLErj9FwGda1qEAmhnRNXPQ==} - for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -5761,9 +5704,6 @@ packages: hastscript@8.0.0: resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} - heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - hono@3.12.12: resolution: {integrity: sha512-5IAMJOXfpA5nT+K0MNjClchzz0IhBHs2Szl7WFAhrFOsbtQsYmNynFyJRg/a3IPsmCfxcrf8txUGiNShXpK5Rg==} engines: {node: '>=16.0.0'} @@ -6006,10 +5946,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -6071,10 +6007,6 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - iterator.prototype@1.1.5: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} @@ -6102,9 +6034,9 @@ packages: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-docblock@26.0.0: - resolution: {integrity: sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==} - engines: {node: '>= 10.14.2'} + jest-docblock@30.0.0-alpha.6: + resolution: {integrity: sha512-KXRLgRo7/rF1wqxQupsFCZa6wOp1qrDg4GdSXKfIHODYQb0dpi4rYaYA8xV5l2g9KwYc9/zV7l1tPe9TOr27ew==} + engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} @@ -6172,10 +6104,6 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-diff@0.5.5: - resolution: {integrity: sha512-B2RSfPv8Y5iqm6/9aKC3cOhXPzjYupKDpGuqT5py9NRulL8J0UoB/zKXUo70xBsuxPcIFgtsGgEdXLrNp0GL7w==} - hasBin: true - json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} @@ -6243,10 +6171,6 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - leac@0.6.0: resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} @@ -6269,10 +6193,6 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -6345,10 +6265,6 @@ packages: resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} - make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -6840,10 +6756,6 @@ packages: resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} engines: {node: '>=18'} - p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -6899,10 +6811,6 @@ packages: resolution: {integrity: sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==} engines: {node: '>= 0.4.0'} - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -6977,10 +6885,6 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - pioppo@1.2.0: resolution: {integrity: sha512-Mze+UGMj6fGMq7KQQTtiTDQN1RrfXeQwUssaKRgzp3HLx8SS5B9cTFIqQLkr2t6cIWpefGTpwiOLN8Y+3IODBg==} @@ -6992,10 +6896,6 @@ packages: resolution: {integrity: sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==} hasBin: true - pkg-dir@3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} - engines: {node: '>=6'} - pkg-types@1.3.0: resolution: {integrity: sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg==} @@ -7489,9 +7389,6 @@ packages: require-like@0.1.2: resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - requireindex@1.2.0: resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} engines: {node: '>=0.10.5'} @@ -7594,9 +7491,6 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-cookie-parser@2.7.1: resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} @@ -7618,10 +7512,6 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -8599,9 +8489,6 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.18: resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} @@ -8621,9 +8508,6 @@ packages: engines: {node: '>=8'} hasBin: true - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - workbox-background-sync@7.3.0: resolution: {integrity: sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==} @@ -8676,10 +8560,6 @@ packages: worktank@2.7.3: resolution: {integrity: sha512-M0fesnpttBPdvNYBdzRvLDsacN0na9RYWFxwmM/x1+/6mufjduv9/9vBObK8EXDqxRMX/SOYJabpo0UCYYBUdQ==} - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -8727,8 +8607,9 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -8742,13 +8623,13 @@ packages: engines: {node: '>= 14'} hasBin: true - yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} - yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} @@ -9521,16 +9402,6 @@ snapshots: dependencies: '@babel/core': 7.26.0 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -9546,31 +9417,6 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -9686,12 +9532,6 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-flow-strip-types@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.0) - '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -9839,6 +9679,18 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -9849,6 +9701,23 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -9894,6 +9763,17 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-typescript@7.26.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -9999,14 +9879,28 @@ snapshots: '@babel/types': 7.26.3 esutils: 2.0.3 - '@babel/register@7.25.9(@babel/core@7.26.0)': + '@babel/preset-react@7.26.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - clone-deep: 4.0.1 - find-cache-dir: 2.1.0 - make-dir: 2.1.0 - pirates: 4.0.6 - source-map-support: 0.5.21 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color '@babel/runtime@7.26.0': dependencies: @@ -10590,6 +10484,50 @@ snapshots: - acorn - supports-color + '@nkzw/babel-plugin-fbtee-auto-import@0.2.0': + dependencies: + '@babel/core': 7.26.0 + '@babel/types': 7.26.3 + '@nkzw/babel-plugin-fbtee': 0.2.0 + transitivePeerDependencies: + - supports-color + + '@nkzw/babel-plugin-fbtee-runtime@0.2.0(@nkzw/babel-plugin-fbtee@0.2.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/preset-react': 7.26.3(@babel/core@7.26.0) + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + '@nkzw/babel-plugin-fbtee': 0.2.0 + invariant: 2.2.4 + transitivePeerDependencies: + - supports-color + + '@nkzw/babel-plugin-fbtee@0.2.0': + dependencies: + '@babel/core': 7.26.0 + '@babel/generator': 7.26.3 + '@babel/preset-react': 7.26.3(@babel/core@7.26.0) + '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + '@nkzw/babel-plugin-fbtee-auto-import': 0.2.0 + glob: 11.0.0 + invariant: 2.2.4 + jest-docblock: 30.0.0-alpha.6 + nullthrows: 1.1.1 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + '@nkzw/babel-preset-fbtee@0.2.0': + dependencies: + '@nkzw/babel-plugin-fbtee': 0.2.0 + '@nkzw/babel-plugin-fbtee-auto-import': 0.2.0 + '@nkzw/babel-plugin-fbtee-runtime': 0.2.0(@nkzw/babel-plugin-fbtee@0.2.0) + transitivePeerDependencies: + - supports-color + '@nkzw/eslint-config@1.19.0(eslint@8.57.0)(typescript@5.7.2(patch_hash=icxwwkq44uizmbsct6du47zdsu))': dependencies: '@nkzw/eslint-plugin': 1.8.0(eslint@8.57.0) @@ -10612,6 +10550,14 @@ snapshots: - supports-color - typescript + '@nkzw/eslint-plugin-fbtee@0.2.0(eslint@8.57.0)(typescript@5.7.2(patch_hash=icxwwkq44uizmbsct6du47zdsu))': + dependencies: + '@typescript-eslint/utils': 8.19.0(eslint@8.57.0)(typescript@5.7.2(patch_hash=icxwwkq44uizmbsct6du47zdsu)) + transitivePeerDependencies: + - eslint + - supports-color + - typescript + '@nkzw/eslint-plugin@1.8.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 @@ -12221,10 +12167,6 @@ snapshots: '@types/qs': 6.9.17 '@types/serve-static': 1.15.7 - '@types/fbt@1.0.5': - dependencies: - '@types/react': 19.0.2 - '@types/gaussian@1.2.2': {} '@types/glob@8.1.0': @@ -12908,35 +12850,6 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 - babel-plugin-fbt-import@0.1.0: {} - - babel-plugin-fbt-runtime@1.0.0(babel-plugin-fbt@1.0.0): - dependencies: - '@babel/core': 7.26.0 - babel-plugin-fbt: 1.0.0 - invariant: 2.2.4 - transitivePeerDependencies: - - supports-color - - babel-plugin-fbt@1.0.0: - dependencies: - '@babel/core': 7.26.0 - '@babel/generator': 7.26.3 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-transform-flow-strip-types': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) - '@babel/register': 7.25.9(@babel/core@7.26.0) - '@babel/types': 7.26.3 - fb-babel-plugin-utils: 0.13.1 - flow-enums-runtime: 0.0.4 - glob: 7.2.3 - invariant: 2.2.4 - jest-docblock: 26.0.0 - nullthrows: 1.1.1 - yargs: 15.4.1 - transitivePeerDependencies: - - supports-color - babel-plugin-macros@2.8.0: dependencies: '@babel/runtime': 7.26.0 @@ -13106,8 +13019,6 @@ snapshots: camelcase-css@2.0.1: {} - camelcase@5.3.1: {} - caniuse-lite@1.0.30001690: {} canvas@3.0.1: @@ -13173,27 +13084,17 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - cli-color@0.1.7: - dependencies: - es5-ext: 0.8.2 - cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 cli-spinners@2.9.2: {} - cliui@6.0.0: + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - - clone-deep@4.0.1: - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 + wrap-ansi: 7.0.0 clsx@2.1.1: {} @@ -13217,8 +13118,6 @@ snapshots: common-tags@1.8.2: {} - commondir@1.0.1: {} - compressible@2.0.18: dependencies: mime-db: 1.53.0 @@ -13380,8 +13279,6 @@ snapshots: optionalDependencies: supports-color: 5.5.0 - decamelize@1.2.0: {} - decode-named-character-reference@1.0.2: dependencies: character-entities: 2.0.2 @@ -13456,10 +13353,6 @@ snapshots: diff@4.0.2: {} - difflib@0.2.4: - dependencies: - heap: 0.2.7 - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -13521,10 +13414,6 @@ snapshots: dotenv@16.4.7: {} - dreamopt@0.6.0: - dependencies: - wordwrap: 1.0.0 - dset@3.1.4: {} dunder-proto@1.0.1: @@ -13721,8 +13610,6 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es5-ext@0.8.2: {} - esast-util-from-estree@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -14233,23 +14120,6 @@ snapshots: dependencies: format: 0.2.2 - fb-babel-plugin-utils@0.13.1: - dependencies: - '@babel/core': 7.26.0 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) - '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.0) - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) - json-diff: 0.5.5 - transitivePeerDependencies: - - supports-color - fbjs-css-vars@1.0.2: {} fbjs@3.0.5: @@ -14264,10 +14134,10 @@ snapshots: transitivePeerDependencies: - encoding - fbt@1.0.2(patch_hash=h3le5xcbsw44ybdi7qpcrzppny)(babel-plugin-fbt-runtime@1.0.0(babel-plugin-fbt@1.0.0))(babel-plugin-fbt@1.0.0)(react@19.0.0): + fbtee@0.2.0(@nkzw/babel-plugin-fbtee-runtime@0.2.0(@nkzw/babel-plugin-fbtee@0.2.0))(@nkzw/babel-plugin-fbtee@0.2.0)(react@19.0.0): dependencies: - babel-plugin-fbt: 1.0.0 - babel-plugin-fbt-runtime: 1.0.0(babel-plugin-fbt@1.0.0) + '@nkzw/babel-plugin-fbtee': 0.2.0 + '@nkzw/babel-plugin-fbtee-runtime': 0.2.0(@nkzw/babel-plugin-fbtee@0.2.0) invariant: 2.2.4 react: 19.0.0 @@ -14299,12 +14169,6 @@ snapshots: transitivePeerDependencies: - supports-color - find-cache-dir@2.1.0: - dependencies: - commondir: 1.0.1 - make-dir: 2.1.0 - pkg-dir: 3.0.0 - find-root@1.1.0: {} find-up-json@2.0.4: @@ -14313,10 +14177,6 @@ snapshots: find-up-path@1.0.0: {} - find-up@3.0.0: - dependencies: - locate-path: 3.0.0 - find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -14341,8 +14201,6 @@ snapshots: flatted@3.3.1: {} - flow-enums-runtime@0.0.4: {} - for-each@0.3.3: dependencies: is-callable: 1.2.7 @@ -14687,8 +14545,6 @@ snapshots: property-information: 6.5.0 space-separated-tokens: 2.0.2 - heap@0.2.7: {} - hono@3.12.12: {} hosted-git-info@2.8.9: {} @@ -14934,10 +14790,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 - is-regex@1.2.1: dependencies: call-bound: 1.0.3 @@ -14991,8 +14843,6 @@ snapshots: isexe@3.1.1: {} - isobject@3.0.1: {} - iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 @@ -15033,7 +14883,7 @@ snapshots: jest-get-type: 29.6.3 pretty-format: 29.7.0 - jest-docblock@26.0.0: + jest-docblock@30.0.0-alpha.6: dependencies: detect-newline: 3.1.0 @@ -15109,12 +14959,6 @@ snapshots: json-buffer@3.0.1: {} - json-diff@0.5.5: - dependencies: - cli-color: 0.1.7 - difflib: 0.2.4 - dreamopt: 0.6.0 - json-parse-better-errors@1.0.2: {} json-parse-even-better-errors@2.3.1: {} @@ -15181,8 +15025,6 @@ snapshots: dependencies: json-buffer: 3.0.1 - kind-of@6.0.3: {} - leac@0.6.0: {} leven@3.1.0: {} @@ -15198,11 +15040,6 @@ snapshots: lines-and-columns@1.2.4: {} - locate-path@3.0.0: - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -15266,11 +15103,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - make-dir@2.1.0: - dependencies: - pify: 4.0.1 - semver: 5.7.2 - make-error@1.3.6: {} mark.js@8.11.1: {} @@ -16051,10 +15883,6 @@ snapshots: dependencies: yocto-queue: 1.1.1 - p-locate@3.0.0: - dependencies: - p-limit: 2.3.0 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -16122,8 +15950,6 @@ snapshots: pause: 0.0.1 utils-merge: 1.0.1 - path-exists@3.0.0: {} - path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -16176,8 +16002,6 @@ snapshots: pify@2.3.0: {} - pify@4.0.1: {} - pioppo@1.2.0: dependencies: dettle: 1.0.4 @@ -16189,10 +16013,6 @@ snapshots: dependencies: pngjs: 6.0.0 - pkg-dir@3.0.0: - dependencies: - find-up: 3.0.0 - pkg-types@1.3.0: dependencies: confbox: 0.1.8 @@ -16769,8 +16589,6 @@ snapshots: require-like@0.1.2: {} - require-main-filename@2.0.0: {} - requireindex@1.2.0: {} resend@4.0.1(patch_hash=jy6o2bk2q3hc4sulops4iuwsmi)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): @@ -16908,8 +16726,6 @@ snapshots: transitivePeerDependencies: - supports-color - set-blocking@2.0.0: {} - set-cookie-parser@2.7.1: {} set-function-length@1.2.2: @@ -16938,10 +16754,6 @@ snapshots: setprototypeof@1.2.0: {} - shallow-clone@3.0.1: - dependencies: - kind-of: 6.0.3 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -18063,8 +17875,6 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-module@2.0.1: {} - which-typed-array@1.1.18: dependencies: available-typed-arrays: 1.0.7 @@ -18087,8 +17897,6 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - wordwrap@1.0.0: {} - workbox-background-sync@7.3.0: dependencies: idb: 7.1.1 @@ -18207,12 +18015,6 @@ snapshots: promise-make-naked: 2.1.2 webworker-shim: 1.1.0 - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -18243,7 +18045,7 @@ snapshots: xtend@4.0.2: {} - y18n@4.0.3: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -18251,24 +18053,17 @@ snapshots: yaml@2.7.0: {} - yargs-parser@18.1.3: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 + yargs-parser@21.1.1: {} - yargs@15.4.1: + yargs@17.7.2: dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 + cliui: 8.0.1 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 yn@3.1.1: {} diff --git a/tests/display.html b/tests/display.html index 5956b5e8..5d15c15e 100644 --- a/tests/display.html +++ b/tests/display.html @@ -12,9 +12,9 @@