Full Code of formatjs/formatjs for AI

main d6e6f23fd6f9 cached
1642 files
29.8 MB
4.0M tokens
2202 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (16,120K chars total). Download the full file to get everything.
Repository: formatjs/formatjs
Branch: main
Commit: d6e6f23fd6f9
Files: 1642
Total size: 29.8 MB

Directory structure:
gitextract__h02utbx/

├── .aspect/
│   └── bazelrc/
│       ├── .gitignore
│       ├── bazel5.bazelrc
│       ├── bazel6.bazelrc
│       ├── ci.bazelrc
│       ├── convenience.bazelrc
│       ├── correctness.bazelrc
│       ├── debug.bazelrc
│       ├── javascript.bazelrc
│       └── performance.bazelrc
├── .bazelrc
├── .bazelversion
├── .commitlintrc.mjs
├── .eslintignore
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── bug_report.md
│   └── workflows/
│       ├── claude.yml
│       ├── prerelease.yml
│       ├── release.yml
│       ├── rust-cli-release.yml
│       ├── stale.yml
│       ├── test.yml
│       ├── typesense-index.yml
│       ├── verify-hooks.yml
│       └── website.yml
├── .gitignore
├── .npmrc
├── .oxfmtrc.json
├── .oxlintrc.json
├── .syncpackrc.json
├── .vscode/
│   ├── extensions.json
│   ├── settings.json
│   └── tasks.json
├── BUILD.bazel
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cargo.toml
├── MODULE.bazel
├── README.md
├── REPO.bazel
├── UPCOMING.md
├── benchmarks/
│   └── cli-comparison/
│       ├── BUILD.bazel
│       ├── README.md
│       ├── benchmark-results.json
│       ├── benchmark-tinybench.mjs
│       ├── generate-test-files.mjs
│       ├── package.json
│       └── run-benchmark.sh
├── buildbuddy.yaml
├── config.json
├── conformance-tests/
│   └── icu4j/
│       ├── BUILD.bazel
│       └── ICUConformanceTest.java
├── crates/
│   ├── formatjs_cli/
│   │   ├── BUILD.bazel
│   │   ├── Cargo.toml
│   │   ├── README.md
│   │   ├── RELEASE.md
│   │   ├── build-multiplatform.sh
│   │   ├── platforms/
│   │   │   └── BUILD.bazel
│   │   ├── release.sh
│   │   └── src/
│   │       ├── compile.rs
│   │       ├── compile_folder.rs
│   │       ├── extract.rs
│   │       ├── extractor.rs
│   │       ├── formatters/
│   │       │   ├── crowdin.rs
│   │       │   ├── default.rs
│   │       │   ├── lokalise.rs
│   │       │   ├── mod.rs
│   │       │   ├── simple.rs
│   │       │   ├── smartling.rs
│   │       │   └── transifex.rs
│   │       ├── id_generator.rs
│   │       ├── main.rs
│   │       └── verify.rs
│   ├── icu_messageformat_parser/
│   │   ├── BENCHMARK.md
│   │   ├── BUILD.bazel
│   │   ├── Cargo.toml
│   │   ├── OPTIMIZATION_SUMMARY.md
│   │   ├── README.md
│   │   ├── benches/
│   │   │   └── parser_bench.rs
│   │   ├── date_time_pattern_generator.rs
│   │   ├── error.rs
│   │   ├── lib.rs
│   │   ├── lib_wasm.rs
│   │   ├── manipulator.rs
│   │   ├── parser.rs
│   │   ├── printer.rs
│   │   ├── regex_generated.rs
│   │   ├── time_data_generated.rs
│   │   └── types.rs
│   └── icu_skeleton_parser/
│       ├── BUILD.bazel
│       ├── Cargo.toml
│       ├── datetime_format_options.rs
│       ├── datetime_parser.rs
│       ├── lib.rs
│       ├── number_format_options.rs
│       ├── number_parser.rs
│       └── number_skeleton_token.rs
├── docs/
│   ├── .nojekyll
│   ├── BUILD.bazel
│   ├── README.md
│   ├── index.html
│   ├── package.json
│   ├── public/
│   │   └── img/
│   │       ├── distribute-libs.excalidraw
│   │       ├── polyfills.excalidraw
│   │       ├── simple-workflow.excalidraw
│   │       └── workflow.excalidraw
│   ├── scripts/
│   │   ├── build-typesense-index.ts
│   │   ├── extract-metadata.ts
│   │   └── upload-typesense-index.ts
│   ├── src/
│   │   ├── components/
│   │   │   ├── Admonition.tsx
│   │   │   ├── Breadcrumbs.tsx
│   │   │   ├── IcuEditor.tsx
│   │   │   ├── Layout.tsx
│   │   │   ├── LiveCodeBlock.tsx
│   │   │   ├── MDXComponents.tsx
│   │   │   ├── SearchBar.tsx
│   │   │   ├── Sidebar.tsx
│   │   │   ├── home/
│   │   │   │   ├── BrowserSection.tsx
│   │   │   │   ├── FeaturesSection.tsx
│   │   │   │   ├── HeroSection.tsx
│   │   │   │   ├── HomeFooter.tsx
│   │   │   │   ├── HomeHeader.tsx
│   │   │   │   └── TrustedBySection.tsx
│   │   │   └── ui/
│   │   │       ├── accordion.tsx
│   │   │       ├── alert.tsx
│   │   │       ├── breadcrumb.tsx
│   │   │       ├── button.tsx
│   │   │       ├── command.tsx
│   │   │       ├── dialog.tsx
│   │   │       ├── dropdown-menu.tsx
│   │   │       ├── input.tsx
│   │   │       ├── navigation-menu.tsx
│   │   │       ├── popover.tsx
│   │   │       ├── separator.tsx
│   │   │       ├── sheet.tsx
│   │   │       └── tabs.tsx
│   │   ├── docs/
│   │   │   ├── core-concepts/
│   │   │   │   ├── basic-internationalization-principles.mdx
│   │   │   │   └── icu-syntax.mdx
│   │   │   ├── getting-started/
│   │   │   │   ├── application-workflow.mdx
│   │   │   │   ├── installation.mdx
│   │   │   │   ├── message-declaration.mdx
│   │   │   │   ├── message-distribution.mdx
│   │   │   │   └── message-extraction.mdx
│   │   │   ├── guides/
│   │   │   │   ├── advanced-usage.mdx
│   │   │   │   ├── bundler-plugins.mdx
│   │   │   │   ├── develop.mdx
│   │   │   │   ├── distribute-libraries.mdx
│   │   │   │   ├── migrate-from-i18next.mdx
│   │   │   │   ├── migrate-from-lingui.mdx
│   │   │   │   ├── nextjs-app-router.mdx
│   │   │   │   ├── performance.mdx
│   │   │   │   ├── react-native-hermes.mdx
│   │   │   │   ├── runtime-requirements.mdx
│   │   │   │   ├── testing-with-react-intl.mdx
│   │   │   │   └── wrapper-components.mdx
│   │   │   ├── icu-messageformat-parser.mdx
│   │   │   ├── intl-messageformat.mdx
│   │   │   ├── intl.mdx
│   │   │   ├── polyfills/
│   │   │   │   ├── intl-datetimeformat.mdx
│   │   │   │   ├── intl-displaynames.mdx
│   │   │   │   ├── intl-durationformat.mdx
│   │   │   │   ├── intl-getcanonicallocales.mdx
│   │   │   │   ├── intl-listformat.mdx
│   │   │   │   ├── intl-locale.mdx
│   │   │   │   ├── intl-localematcher.mdx
│   │   │   │   ├── intl-numberformat.mdx
│   │   │   │   ├── intl-pluralrules.mdx
│   │   │   │   ├── intl-relativetimeformat.mdx
│   │   │   │   ├── intl-segmenter.mdx
│   │   │   │   └── intl-supportedvaluesof.mdx
│   │   │   ├── polyfills.mdx
│   │   │   ├── react-intl/
│   │   │   │   ├── api.mdx
│   │   │   │   ├── components.mdx
│   │   │   │   ├── upgrade-guide-10.x.mdx
│   │   │   │   ├── upgrade-guide-2.x.mdx
│   │   │   │   ├── upgrade-guide-3.x.mdx
│   │   │   │   ├── upgrade-guide-4.x.mdx
│   │   │   │   ├── upgrade-guide-5.x.mdx
│   │   │   │   ├── upgrade-guide-6.x.mdx
│   │   │   │   ├── upgrade-guide-7.x.mdx
│   │   │   │   └── upgrade-guide-8.x.mdx
│   │   │   ├── react-intl.mdx
│   │   │   ├── svelte-intl.mdx
│   │   │   ├── tooling/
│   │   │   │   ├── babel-plugin.mdx
│   │   │   │   ├── bazel.mdx
│   │   │   │   ├── cli.mdx
│   │   │   │   ├── linter.mdx
│   │   │   │   ├── rust-icu-messageformat-parser.mdx
│   │   │   │   ├── rust-icu-skeleton-parser.mdx
│   │   │   │   ├── swc-plugin.mdx
│   │   │   │   ├── ts-transformer.mdx
│   │   │   │   └── unplugin.mdx
│   │   │   └── vue-intl.mdx
│   │   ├── docs-metadata.generated.json
│   │   ├── lang/
│   │   │   ├── strings_cs-CZ.json
│   │   │   ├── strings_de-DE.json
│   │   │   ├── strings_en-US.json
│   │   │   ├── strings_es-AR.json
│   │   │   ├── strings_fr-FR.json
│   │   │   ├── strings_ja-JP.json
│   │   │   ├── strings_pt-BR.json
│   │   │   └── strings_sv-SE.json
│   │   ├── lib/
│   │   │   └── utils.ts
│   │   ├── pages/
│   │   │   ├── +Head.tsx
│   │   │   ├── +Layout.tsx
│   │   │   ├── +config.ts
│   │   │   ├── Home.tsx
│   │   │   ├── docs/
│   │   │   │   └── @path/
│   │   │   │       ├── +Head.tsx
│   │   │   │       ├── +Page.tsx
│   │   │   │       ├── +description.ts
│   │   │   │       ├── +onBeforePrerenderStart.ts
│   │   │   │       ├── +prerender.ts
│   │   │   │       ├── +route.ts
│   │   │   │       └── +title.ts
│   │   │   └── index/
│   │   │       ├── +Head.tsx
│   │   │       └── +Page.tsx
│   │   ├── styles/
│   │   │   └── global.css
│   │   ├── theme/
│   │   │   ├── TabItem.tsx
│   │   │   └── Tabs.tsx
│   │   ├── utils/
│   │   │   └── navigation.ts
│   │   └── vite-env.d.ts
│   ├── tailwind.config.ts
│   ├── tsconfig.json
│   └── vite.config.ts
├── formatjs.github.io.BUILD
├── lefthook.yml
├── lerna.json
├── package.json
├── packages/
│   ├── babel-plugin-formatjs/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── global.d.ts
│   │   ├── index.ts
│   │   ├── integration-tests/
│   │   │   ├── BUILD.bazel
│   │   │   ├── package.json
│   │   │   └── vue/
│   │   │       ├── fixtures/
│   │   │       │   ├── App.vue
│   │   │       │   └── app.js
│   │   │       └── integration.test.ts
│   │   ├── package.json
│   │   ├── tests/
│   │   │   ├── __snapshots__/
│   │   │   │   └── index.test.ts.snap
│   │   │   ├── fixtures/
│   │   │   │   ├── 2663.js
│   │   │   │   ├── BUILD.bazel
│   │   │   │   ├── FormattedMessage.js
│   │   │   │   ├── additionalComponentNames.js
│   │   │   │   ├── additionalFunctionNames.js
│   │   │   │   ├── ast.js
│   │   │   │   ├── defineMessage.js
│   │   │   │   ├── defineMessages.js
│   │   │   │   ├── descriptionsAsObjects.js
│   │   │   │   ├── empty.js
│   │   │   │   ├── extractFromFormatMessageCall.js
│   │   │   │   ├── extractFromFormatMessageCallStateless.js
│   │   │   │   ├── extractSourceLocation.js
│   │   │   │   ├── flattenError.js
│   │   │   │   ├── flattenWithOverrideIdFn.js
│   │   │   │   ├── formatMessageCall.js
│   │   │   │   ├── icuSyntax.js
│   │   │   │   ├── idInterpolationPattern.js
│   │   │   │   ├── inline.js
│   │   │   │   ├── jsxNestedInCallExpr.js
│   │   │   │   ├── optionalChaining.js
│   │   │   │   ├── overrideIdFn.js
│   │   │   │   ├── preserveWhitespace.js
│   │   │   │   ├── removeDefaultMessage.js
│   │   │   │   ├── shorthandT.js
│   │   │   │   ├── skipExtractionFormattedMessage.js
│   │   │   │   └── templateLiteral.js
│   │   │   └── index.test.ts
│   │   ├── tsconfig.json
│   │   ├── types.ts
│   │   ├── utils.ts
│   │   └── visitors/
│   │       ├── call-expression.ts
│   │       └── jsx-opening-element.ts
│   ├── bigdecimal/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── tests/
│   │   │   └── bigdecimal.test.ts
│   │   └── tsconfig.json
│   ├── cli/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── integration-tests/
│   │   │   ├── BUILD.bazel
│   │   │   ├── compile/
│   │   │   │   ├── __snapshots__/
│   │   │   │   │   └── integration.test.ts.snap
│   │   │   │   ├── glob/
│   │   │   │   │   ├── en.json
│   │   │   │   │   └── en2.json
│   │   │   │   ├── glob-conflict/
│   │   │   │   │   ├── en.json
│   │   │   │   │   └── en2.json
│   │   │   │   ├── integration.test.ts
│   │   │   │   └── lang/
│   │   │   │       ├── empty.json
│   │   │   │       ├── en-crowdin.json
│   │   │   │       ├── en-format.json
│   │   │   │       ├── en-lokalise.json
│   │   │   │       ├── en-simple.json
│   │   │   │       ├── en-smartling.json
│   │   │   │       ├── en-transifex.json
│   │   │   │       ├── en.json
│   │   │   │       ├── html-messages.json
│   │   │   │       └── malformed-messages.json
│   │   │   ├── compile_folder/
│   │   │   │   ├── __snapshots__/
│   │   │   │   │   └── integration.test.ts.snap
│   │   │   │   ├── integration.test.ts
│   │   │   │   └── lang/
│   │   │   │       ├── empty.json
│   │   │   │       ├── en.json
│   │   │   │       └── en2.json
│   │   │   ├── conformance-tests/
│   │   │   │   ├── README.md
│   │   │   │   ├── SUMMARY.md
│   │   │   │   ├── conformance.test.ts
│   │   │   │   └── test_cases/
│   │   │   │       ├── 01_basic_extract.txt
│   │   │   │       ├── 02_plural_messages.txt
│   │   │   │       ├── 03_flatten_option.txt
│   │   │   │       ├── 04_content_hash_id.txt
│   │   │   │       ├── 05_additional_function_names.txt
│   │   │   │       ├── 06_extract_source_location.txt
│   │   │   │       ├── 07_format_simple.txt
│   │   │   │       ├── 08_whitespace_preservation.txt
│   │   │   │       ├── 09_escaped_quotes.txt
│   │   │   │       ├── 10_nested_select_plural.txt
│   │   │   │       ├── 11_format_transifex.txt
│   │   │   │       ├── 12_format_lokalise.txt
│   │   │   │       ├── 13_format_crowdin.txt
│   │   │   │       ├── 14_format_smartling.txt
│   │   │   │       ├── 15_inline_formatmessage.txt
│   │   │   │       ├── 16_typescript_file.txt
│   │   │   │       ├── 17_pragma.txt
│   │   │   │       ├── 18_optional_chaining.txt
│   │   │   │       ├── 19_no_id_with_hash.txt
│   │   │   │       └── 20_flatten_with_hash.txt
│   │   │   ├── extract/
│   │   │   │   ├── defineMessages/
│   │   │   │   │   ├── actual.ignore.jsx
│   │   │   │   │   ├── actual.jsx
│   │   │   │   │   └── bad.json
│   │   │   │   ├── duplicated/
│   │   │   │   │   ├── file1.tsx
│   │   │   │   │   └── file2.tsx
│   │   │   │   ├── flattenWithIdPattern/
│   │   │   │   │   └── actual.js
│   │   │   │   ├── inFile/
│   │   │   │   │   ├── file1.tsx
│   │   │   │   │   └── file2.tsx
│   │   │   │   ├── inFile.txt
│   │   │   │   ├── issue-6009/
│   │   │   │   │   └── Test.tsx
│   │   │   │   ├── nonDuplicated/
│   │   │   │   │   ├── file1.tsx
│   │   │   │   │   └── file2.tsx
│   │   │   │   ├── optionalChaining/
│   │   │   │   │   └── actual.tsx
│   │   │   │   ├── taggedTemplates/
│   │   │   │   │   └── actual.tsx
│   │   │   │   ├── throwsFlag/
│   │   │   │   │   ├── all-valid.tsx
│   │   │   │   │   └── mixed-valid-invalid.tsx
│   │   │   │   └── typescript/
│   │   │   │       ├── actual.ignore.tsx
│   │   │   │       ├── actual.tsx
│   │   │   │       ├── err.tsx
│   │   │   │       ├── importMeta.mts
│   │   │   │       ├── non-static.tsx
│   │   │   │       ├── pragma.tsx
│   │   │   │       └── ts47.tsx
│   │   │   ├── extract-glimmer/
│   │   │   │   ├── comp.gjs
│   │   │   │   ├── comp.gts
│   │   │   │   ├── comp.hbs
│   │   │   │   └── integration.test.ts
│   │   │   ├── extract-vue/
│   │   │   │   ├── comp.vue
│   │   │   │   └── integration.test.ts
│   │   │   ├── formatter.js
│   │   │   ├── package.json
│   │   │   ├── rust-binary-utils.ts
│   │   │   └── verify/
│   │   │       ├── extra-keys/
│   │   │       │   ├── fixtures1/
│   │   │       │   │   ├── en-US.json
│   │   │       │   │   └── fr-FR.json
│   │   │       │   └── fixtures2/
│   │   │       │       ├── en-US.json
│   │   │       │       └── fr-FR.json
│   │   │       ├── integration.test.ts
│   │   │       ├── missing-keys/
│   │   │       │   ├── fixtures1/
│   │   │       │   │   ├── en-US.json
│   │   │       │   │   ├── es.json
│   │   │       │   │   └── fr.json
│   │   │       │   ├── fixtures2/
│   │   │       │   │   ├── en-US.json
│   │   │       │   │   └── fr-FR.json
│   │   │       │   ├── fixtures3/
│   │   │       │   │   └── fr.json
│   │   │       │   └── fixtures4/
│   │   │       │       ├── en-US.json
│   │   │       │       └── fr-FR.json
│   │   │       └── structural-equality/
│   │   │           ├── fixtures1/
│   │   │           │   ├── en-US.json
│   │   │           │   └── fr.json
│   │   │           └── fixtures2/
│   │   │               ├── en-US.json
│   │   │               └── fr-FR.json
│   │   └── package.json
│   ├── cli-lib/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── integration-tests/
│   │   │   ├── BUILD.bazel
│   │   │   ├── package.json
│   │   │   └── test_esm_imports.mjs
│   │   ├── main.ts
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── cli.ts
│   │   │   ├── compile.ts
│   │   │   ├── compile_folder.ts
│   │   │   ├── console_utils.ts
│   │   │   ├── extract.ts
│   │   │   ├── formatters/
│   │   │   │   ├── crowdin.ts
│   │   │   │   ├── default.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── lokalise.ts
│   │   │   │   ├── simple.ts
│   │   │   │   ├── smartling.ts
│   │   │   │   └── transifex.ts
│   │   │   ├── gts_extractor.ts
│   │   │   ├── hbs_extractor.ts
│   │   │   ├── parse_script.ts
│   │   │   ├── pseudo_locale.ts
│   │   │   ├── svelte_extractor.ts
│   │   │   ├── verify/
│   │   │   │   ├── checkExtraKeys.ts
│   │   │   │   ├── checkMissingKeys.ts
│   │   │   │   ├── checkStructuralEquality.ts
│   │   │   │   └── index.ts
│   │   │   └── vue_extractor.ts
│   │   ├── tests/
│   │   │   └── unit/
│   │   │       ├── __snapshots__/
│   │   │       │   ├── gts_extractor.test.ts.snap
│   │   │       │   ├── hbs_extractor.test.ts.snap
│   │   │       │   ├── pseudo_locale.test.ts.snap
│   │   │       │   ├── svelte_extractor.test.ts.snap
│   │   │       │   └── vue_extractor.test.ts.snap
│   │   │       ├── abort_signal.test.ts
│   │   │       ├── fixtures/
│   │   │       │   ├── bind.svelte
│   │   │       │   ├── bind.vue
│   │   │       │   ├── comp.gjs
│   │   │       │   ├── comp.gts
│   │   │       │   ├── comp.hbs
│   │   │       │   ├── comp.svelte
│   │   │       │   └── comp.vue
│   │   │       ├── gts_extractor.test.ts
│   │   │       ├── hbs_extractor.test.ts
│   │   │       ├── pseudo_locale.test.ts
│   │   │       ├── svelte_extractor.test.ts
│   │   │       ├── unit.test.ts
│   │   │       └── vue_extractor.test.ts
│   │   └── tsconfig.json
│   ├── ecma376/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── tests/
│   │   │   └── index.test.ts
│   │   └── tsconfig.json
│   ├── ecma402-abstract/
│   │   ├── 262.ts
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── CanonicalizeLocaleList.ts
│   │   ├── CanonicalizeTimeZoneName.ts
│   │   ├── CoerceOptionsToObject.ts
│   │   ├── DefaultNumberOption.ts
│   │   ├── GetNumberOption.ts
│   │   ├── GetOption.ts
│   │   ├── GetOptionsObject.ts
│   │   ├── GetStringOrBooleanOption.ts
│   │   ├── IsSanctionedSimpleUnitIdentifier.ts
│   │   ├── IsValidTimeZoneName.ts
│   │   ├── IsWellFormedCurrencyCode.ts
│   │   ├── IsWellFormedUnitIdentifier.ts
│   │   ├── LICENSE.md
│   │   ├── NumberFormat/
│   │   │   ├── ApplyUnsignedRoundingMode.ts
│   │   │   ├── CollapseNumberRange.ts
│   │   │   ├── ComputeExponent.ts
│   │   │   ├── ComputeExponentForMagnitude.ts
│   │   │   ├── CurrencyDigits.ts
│   │   │   ├── FormatApproximately.ts
│   │   │   ├── FormatNumeric.ts
│   │   │   ├── FormatNumericRange.ts
│   │   │   ├── FormatNumericRangeToParts.ts
│   │   │   ├── FormatNumericToParts.ts
│   │   │   ├── FormatNumericToString.ts
│   │   │   ├── GetUnsignedRoundingMode.ts
│   │   │   ├── InitializeNumberFormat.ts
│   │   │   ├── PartitionNumberPattern.ts
│   │   │   ├── PartitionNumberRangePattern.ts
│   │   │   ├── SetNumberFormatDigitOptions.ts
│   │   │   ├── SetNumberFormatUnitOptions.ts
│   │   │   ├── ToRawFixed.ts
│   │   │   ├── ToRawPrecision.ts
│   │   │   ├── decimal-cache.ts
│   │   │   ├── digit-mapping.generated.ts
│   │   │   └── format_to_parts.ts
│   │   ├── PartitionPattern.ts
│   │   ├── README.md
│   │   ├── SupportedLocales.ts
│   │   ├── ToIntlMathematicalValue.ts
│   │   ├── constants.ts
│   │   ├── data.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── regex.generated.ts
│   │   ├── scripts/
│   │   │   ├── digit-mapping.ts
│   │   │   └── regex-gen.ts
│   │   ├── tests/
│   │   │   ├── 262.test.ts
│   │   │   ├── ApplyUnsignedRoundingMode.test.ts
│   │   │   ├── CanonicalizeTimeZoneName.test.ts
│   │   │   ├── CollapseNumberRange.test.ts
│   │   │   ├── FormatApproximately.test.ts
│   │   │   ├── FormatNumericRange.test.ts
│   │   │   ├── FormatNumericRangeToParts.test.ts
│   │   │   ├── GetStringOrBooleanOption.test.ts
│   │   │   ├── GetUnsignedRoundingMode.test.ts
│   │   │   ├── IsValidTimeZoneName.test.ts
│   │   │   ├── PartitionNumberPattern.test.ts
│   │   │   ├── PartitionNumberRangePattern.test.ts
│   │   │   ├── PartitionPattern.test.ts
│   │   │   ├── SetNumberFormatDigitOptions.test.ts
│   │   │   ├── ToRawFixed.test.tsx
│   │   │   ├── ToRawPrecision.test.tsx
│   │   │   └── utils.ts
│   │   ├── tsconfig.json
│   │   ├── types/
│   │   │   ├── core.ts
│   │   │   ├── date-time.ts
│   │   │   ├── displaynames.ts
│   │   │   ├── list.ts
│   │   │   ├── number.ts
│   │   │   ├── plural-rules.ts
│   │   │   └── relative-time.ts
│   │   └── utils.ts
│   ├── editor/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── fixtures/
│   │   │   ├── en-GB.json
│   │   │   ├── en.json
│   │   │   └── ru.json
│   │   ├── header.tsx
│   │   ├── index.html
│   │   ├── index.tsx
│   │   ├── main.tsx
│   │   ├── message.tsx
│   │   ├── messages.tsx
│   │   ├── package.json
│   │   ├── tsconfig.json
│   │   └── types.ts
│   ├── eslint-plugin-formatjs/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── emoji-data.generated.ts
│   │   ├── emoji-utils.ts
│   │   ├── index.ts
│   │   ├── integration-tests/
│   │   │   ├── .oxlintrc.json
│   │   │   ├── BUILD.bazel
│   │   │   ├── eslint.config.mjs
│   │   │   ├── fixture.js
│   │   │   ├── fixture2.js
│   │   │   └── package.json
│   │   ├── messages.ts
│   │   ├── package.json
│   │   ├── rules/
│   │   │   ├── blocklist-elements.ts
│   │   │   ├── enforce-default-message.ts
│   │   │   ├── enforce-description.ts
│   │   │   ├── enforce-id.ts
│   │   │   ├── enforce-placeholders.ts
│   │   │   ├── enforce-plural-rules.ts
│   │   │   ├── no-camel-case.ts
│   │   │   ├── no-complex-selectors.ts
│   │   │   ├── no-emoji.ts
│   │   │   ├── no-id.ts
│   │   │   ├── no-invalid-icu.ts
│   │   │   ├── no-literal-string-in-jsx.ts
│   │   │   ├── no-literal-string-in-object.ts
│   │   │   ├── no-missing-icu-plural-one-placeholders.ts
│   │   │   ├── no-multiple-plurals.ts
│   │   │   ├── no-multiple-whitespaces.ts
│   │   │   ├── no-offset.ts
│   │   │   ├── no-useless-message.ts
│   │   │   ├── prefer-formatted-message.ts
│   │   │   ├── prefer-full-sentence.ts
│   │   │   └── prefer-pound-in-plural.ts
│   │   ├── scripts/
│   │   │   └── generate-emoji-data.ts
│   │   ├── tests/
│   │   │   ├── blocklist-elements.test.ts
│   │   │   ├── emoji-utils.test.ts
│   │   │   ├── enforce-default-message.test.ts
│   │   │   ├── enforce-description.test.ts
│   │   │   ├── enforce-id.test.ts
│   │   │   ├── enforce-placeholders.test.ts
│   │   │   ├── enforce-plural-rules.test.ts
│   │   │   ├── fixtures.ts
│   │   │   ├── no-camel-case.test.ts
│   │   │   ├── no-complex-selectors.test.ts
│   │   │   ├── no-emoji.test.ts
│   │   │   ├── no-id.test.ts
│   │   │   ├── no-invalid-icu.test.ts
│   │   │   ├── no-literal-string-in-jsx.test.ts
│   │   │   ├── no-literal-string-in-object.test.ts
│   │   │   ├── no-missing-icu-plural-one-placeholders.test.ts
│   │   │   ├── no-multiple-plurals.test.ts
│   │   │   ├── no-multiple-whitespaces.test.ts
│   │   │   ├── no-offset.test.ts
│   │   │   ├── no-useless-message.test.ts
│   │   │   ├── prefer-formatted-message.test.ts
│   │   │   ├── prefer-full-sentence.test.ts
│   │   │   ├── prefer-pound-in-plural.test.ts
│   │   │   ├── tagged-template-substitutions.test.ts
│   │   │   └── util.ts
│   │   ├── tsconfig.json
│   │   └── util.ts
│   ├── fast-memoize/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   └── tsconfig.json
│   ├── icu-messageformat-parser/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── benchmark/
│   │   │   ├── BUILD.bazel
│   │   │   ├── benchmark.ts
│   │   │   └── package.json
│   │   ├── date-time-pattern-generator.ts
│   │   ├── error.ts
│   │   ├── index.ts
│   │   ├── integration-tests/
│   │   │   ├── BUILD.bazel
│   │   │   ├── Cargo.toml
│   │   │   ├── integration_tests.rs
│   │   │   ├── package.json
│   │   │   ├── run-parser.ts
│   │   │   ├── test_cases/
│   │   │   │   ├── basic_argument_1.txt
│   │   │   │   ├── basic_argument_2.txt
│   │   │   │   ├── date_arg_skeleton_1.txt
│   │   │   │   ├── date_arg_skeleton_2.txt
│   │   │   │   ├── date_arg_skeleton_3.txt
│   │   │   │   ├── date_arg_skeleton_with_capital_J.txt
│   │   │   │   ├── date_arg_skeleton_with_capital_JJ.txt
│   │   │   │   ├── date_arg_skeleton_with_j.txt
│   │   │   │   ├── date_arg_skeleton_with_jj.txt
│   │   │   │   ├── date_arg_skeleton_with_jjj.txt
│   │   │   │   ├── date_arg_skeleton_with_jjjj.txt
│   │   │   │   ├── date_arg_skeleton_with_jjjjj.txt
│   │   │   │   ├── date_arg_skeleton_with_jjjjjj.txt
│   │   │   │   ├── double_apostrophes_1.txt
│   │   │   │   ├── duplicate_plural_selectors.txt
│   │   │   │   ├── duplicate_select_selectors.txt
│   │   │   │   ├── empty_argument_1.txt
│   │   │   │   ├── empty_argument_2.txt
│   │   │   │   ├── escaped_multiple_tags_1.txt
│   │   │   │   ├── escaped_pound_1.txt
│   │   │   │   ├── expect_arg_format_1.txt
│   │   │   │   ├── expect_date_arg_skeleton_whitespace_only.txt
│   │   │   │   ├── expect_number_arg_skeleton_double_slash.txt
│   │   │   │   ├── expect_number_arg_skeleton_empty_stem.txt
│   │   │   │   ├── expect_number_arg_skeleton_token_1.txt
│   │   │   │   ├── expect_number_arg_skeleton_token_option_1.txt
│   │   │   │   ├── expect_number_arg_skeleton_whitespace_only.txt
│   │   │   │   ├── expect_number_arg_style_1.txt
│   │   │   │   ├── ignore_tag_number_arg_1.txt
│   │   │   │   ├── ignore_tags_1.txt
│   │   │   │   ├── incomplete_nested_message_in_tag.txt
│   │   │   │   ├── invalid_arg_format_1.txt
│   │   │   │   ├── invalid_close_tag_1.txt
│   │   │   │   ├── invalid_closing_tag_1.txt
│   │   │   │   ├── invalid_closing_tag_2.txt
│   │   │   │   ├── invalid_tag_1.txt
│   │   │   │   ├── invalid_tag_2.txt
│   │   │   │   ├── invalid_tag_3.txt
│   │   │   │   ├── left_angle_bracket_1.txt
│   │   │   │   ├── less_than_sign_1.txt
│   │   │   │   ├── malformed_argument_1.txt
│   │   │   │   ├── negative_offset_1.txt
│   │   │   │   ├── nested_1.txt
│   │   │   │   ├── nested_tags_1.txt
│   │   │   │   ├── not_escaped_pound_1.txt
│   │   │   │   ├── not_quoted_string_1.txt
│   │   │   │   ├── not_quoted_string_2.txt
│   │   │   │   ├── not_self_closing_tag_1.txt
│   │   │   │   ├── number_arg_skeleton_2.txt
│   │   │   │   ├── number_arg_skeleton_3.txt
│   │   │   │   ├── number_arg_style_1.txt
│   │   │   │   ├── number_skeleton_1.txt
│   │   │   │   ├── number_skeleton_10.txt
│   │   │   │   ├── number_skeleton_11.txt
│   │   │   │   ├── number_skeleton_12.txt
│   │   │   │   ├── number_skeleton_2.txt
│   │   │   │   ├── number_skeleton_3.txt
│   │   │   │   ├── number_skeleton_4.txt
│   │   │   │   ├── number_skeleton_5.txt
│   │   │   │   ├── number_skeleton_6.txt
│   │   │   │   ├── number_skeleton_7.txt
│   │   │   │   ├── number_skeleton_8.txt
│   │   │   │   ├── number_skeleton_9.txt
│   │   │   │   ├── number_skeleton_many_tokens.txt
│   │   │   │   ├── number_skeleton_multiple_spaces.txt
│   │   │   │   ├── number_skeleton_trailing_slash.txt
│   │   │   │   ├── number_skeleton_with_tab.txt
│   │   │   │   ├── numeric_tag_1.txt
│   │   │   │   ├── open_close_tag_1.txt
│   │   │   │   ├── open_close_tag_2.txt
│   │   │   │   ├── open_close_tag_3.txt
│   │   │   │   ├── open_close_tag_with_args.txt
│   │   │   │   ├── open_close_tag_with_nested_arg.txt
│   │   │   │   ├── plural_arg_1.txt
│   │   │   │   ├── plural_arg_2.txt
│   │   │   │   ├── plural_arg_with_escaped_nested_message.txt
│   │   │   │   ├── plural_arg_with_offset_1.txt
│   │   │   │   ├── plural_with_number_skeleton.txt
│   │   │   │   ├── quoted_pound_sign_1.txt
│   │   │   │   ├── quoted_pound_sign_2.txt
│   │   │   │   ├── quoted_string_1.txt
│   │   │   │   ├── quoted_string_2.txt
│   │   │   │   ├── quoted_string_3.txt
│   │   │   │   ├── quoted_string_4.txt
│   │   │   │   ├── quoted_string_5.txt
│   │   │   │   ├── quoted_tag_1.txt
│   │   │   │   ├── select_arg_1.txt
│   │   │   │   ├── select_arg_with_nested_arguments.txt
│   │   │   │   ├── select_with_number_skeleton.txt
│   │   │   │   ├── selectordinal_1.txt
│   │   │   │   ├── self_closing_tag_1.txt
│   │   │   │   ├── self_closing_tag_2.txt
│   │   │   │   ├── simple_argument_1.txt
│   │   │   │   ├── simple_argument_2.txt
│   │   │   │   ├── simple_date_and_time_arg_1.txt
│   │   │   │   ├── simple_number_arg_1.txt
│   │   │   │   ├── treat_unicode_nbsp_as_whitespace.txt
│   │   │   │   ├── trivial_1.txt
│   │   │   │   ├── trivial_2.txt
│   │   │   │   ├── unclosed_argument_1.txt
│   │   │   │   ├── unclosed_argument_2.txt
│   │   │   │   ├── unclosed_number_arg_1.txt
│   │   │   │   ├── unclosed_number_arg_2.txt
│   │   │   │   ├── unclosed_number_arg_3.txt
│   │   │   │   ├── unclosed_quote_in_number_arg.txt
│   │   │   │   ├── unclosed_quoted_string_1.txt
│   │   │   │   ├── unclosed_quoted_string_2.txt
│   │   │   │   ├── unclosed_quoted_string_3.txt
│   │   │   │   ├── unclosed_quoted_string_4.txt
│   │   │   │   ├── unclosed_quoted_string_5.txt
│   │   │   │   ├── unclosed_quoted_string_6.txt
│   │   │   │   ├── unclosed_quoted_string_7.txt
│   │   │   │   ├── unescaped_string_literal_1.txt
│   │   │   │   ├── unmatched_open_close_tag_1.txt
│   │   │   │   ├── unmatched_open_close_tag_2.txt
│   │   │   │   └── uppercase_tag_1.txt
│   │   │   └── wasm-integration.test.ts
│   │   ├── manipulator.ts
│   │   ├── no-parser.ts
│   │   ├── package.json
│   │   ├── parser.ts
│   │   ├── printer.ts
│   │   ├── regex.generated.ts
│   │   ├── tests/
│   │   │   ├── __snapshots__/
│   │   │   │   └── manipulator.test.ts.snap
│   │   │   ├── browser-smoke.test.ts
│   │   │   ├── date-time-pattern-generator.test.ts
│   │   │   ├── manipulator.test.ts
│   │   │   ├── no-parser.test.ts
│   │   │   └── printer.test.ts
│   │   ├── time-data.generated.ts
│   │   ├── tools/
│   │   │   ├── BUILD.bazel
│   │   │   ├── global.ts
│   │   │   ├── regex-gen.ts
│   │   │   └── time-data-gen.ts
│   │   ├── tsconfig.json
│   │   └── types.ts
│   ├── icu-messageformat-parser-wasm/
│   │   ├── BENCHMARK.md
│   │   ├── BUILD.bazel
│   │   ├── README.md
│   │   ├── benchmark/
│   │   │   ├── BUILD.bazel
│   │   │   ├── benchmark.ts
│   │   │   └── package.json
│   │   ├── index.ts
│   │   ├── package.json
│   │   └── tsconfig.json
│   ├── icu-skeleton-parser/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── date-time.ts
│   │   ├── index.ts
│   │   ├── number.ts
│   │   ├── package.json
│   │   ├── regex.generated.ts
│   │   ├── scripts/
│   │   │   ├── global.ts
│   │   │   └── regex-gen.ts
│   │   ├── tests/
│   │   │   ├── __snapshots__/
│   │   │   │   └── index.test.ts.snap
│   │   │   └── index.test.ts
│   │   └── tsconfig.json
│   ├── intl/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── create-intl.ts
│   │   │   ├── dateTime.ts
│   │   │   ├── displayName.ts
│   │   │   ├── error.ts
│   │   │   ├── list.ts
│   │   │   ├── message.ts
│   │   │   ├── number.ts
│   │   │   ├── plural.ts
│   │   │   ├── relativeTime.ts
│   │   │   ├── types.ts
│   │   │   └── utils.ts
│   │   ├── tests/
│   │   │   ├── __snapshots__/
│   │   │   │   ├── formatDate.test.ts.snap
│   │   │   │   ├── formatMessage.test.ts.snap
│   │   │   │   ├── formatNumber.test.ts.snap
│   │   │   │   ├── formatRelativeTime.test.ts.snap
│   │   │   │   └── formatTime.test.ts.snap
│   │   │   ├── create-intl.test.ts
│   │   │   ├── error.test.ts
│   │   │   ├── formatDate.test.ts
│   │   │   ├── formatDisplayNames.test.ts
│   │   │   ├── formatList.test.ts
│   │   │   ├── formatMessage.test.ts
│   │   │   ├── formatNumber.test.ts
│   │   │   ├── formatPlural.test.ts
│   │   │   ├── formatRelativeTime.test.ts
│   │   │   ├── formatTime.test.ts
│   │   │   └── global_type_overrides.test-d.ts
│   │   └── tsconfig.json
│   ├── intl-datetimeformat/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── defs.bzl
│   │   ├── index.bzl
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── cldr-raw.ts
│   │   │   ├── cldr.ts
│   │   │   ├── execute_tz_docker.sh
│   │   │   ├── extract-dates.ts
│   │   │   ├── link.ts
│   │   │   ├── process-zdump.ts
│   │   │   ├── test-locale-data-gen.ts
│   │   │   ├── test262-main-gen.ts
│   │   │   ├── zic.ts
│   │   │   └── zone.ts
│   │   ├── should-polyfill.ts
│   │   ├── src/
│   │   │   ├── abstract/
│   │   │   │   ├── BasicFormatMatcher.ts
│   │   │   │   ├── BestFitFormatMatcher.ts
│   │   │   │   ├── DateTimeStyleFormat.ts
│   │   │   │   ├── FormatDateTime.ts
│   │   │   │   ├── FormatDateTimePattern.ts
│   │   │   │   ├── FormatDateTimeRange.ts
│   │   │   │   ├── FormatDateTimeRangeToParts.ts
│   │   │   │   ├── FormatDateTimeToParts.ts
│   │   │   │   ├── InitializeDateTimeFormat.ts
│   │   │   │   ├── PartitionDateTimePattern.ts
│   │   │   │   ├── PartitionDateTimeRangePattern.ts
│   │   │   │   ├── ToDateTimeOptions.ts
│   │   │   │   ├── ToLocalTime.ts
│   │   │   │   ├── skeleton.ts
│   │   │   │   └── utils.ts
│   │   │   ├── core.ts
│   │   │   ├── data/
│   │   │   │   ├── all-tz.generated.ts
│   │   │   │   └── links.generated.ts
│   │   │   ├── get_internal_slots.ts
│   │   │   ├── packer.ts
│   │   │   ├── to_locale_string.ts
│   │   │   └── types.ts
│   │   ├── supported-locales.generated.ts
│   │   ├── test262-main.ts
│   │   ├── tests/
│   │   │   ├── abstract/
│   │   │   │   ├── BestFitFormatMatcher.test.ts
│   │   │   │   └── skeleton.test.ts
│   │   │   ├── benchmark.ts
│   │   │   ├── format-range.test.ts
│   │   │   ├── format.test.ts
│   │   │   ├── ftp-main.test.ts
│   │   │   ├── index.test.ts
│   │   │   ├── locale-data/
│   │   │   │   ├── ar.json
│   │   │   │   ├── bs.json
│   │   │   │   ├── de.json
│   │   │   │   ├── en-CA.json
│   │   │   │   ├── en-GB.json
│   │   │   │   ├── en.json
│   │   │   │   ├── fa.json
│   │   │   │   ├── ja.json
│   │   │   │   ├── ko.json
│   │   │   │   ├── nl.json
│   │   │   │   ├── pl.json
│   │   │   │   ├── ru.json
│   │   │   │   └── zh-Hans.json
│   │   │   └── offset-timezone.test.ts
│   │   └── tsconfig.json
│   ├── intl-displaynames/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── abstract/
│   │   │   ├── CanonicalCodeForDisplayNames.ts
│   │   │   └── IsValidDateTimeFieldCode.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── cldr-raw.ts
│   │   │   ├── cldr.ts
│   │   │   ├── extract-displaynames.ts
│   │   │   ├── test-locale-data-gen.ts
│   │   │   └── test262-main-gen.ts
│   │   ├── should-polyfill.ts
│   │   ├── supported-locales.generated.ts
│   │   ├── test262-main.ts
│   │   ├── tests/
│   │   │   ├── CanonicalCodeForDisplayNames.test.ts
│   │   │   ├── IsValidDateTimeFieldCode.test.ts
│   │   │   ├── index.test.ts
│   │   │   ├── locale-data/
│   │   │   │   ├── en.json
│   │   │   │   └── zh.json
│   │   │   └── should-polyfill.test.ts
│   │   └── tsconfig.json
│   ├── intl-durationformat/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── benchmark/
│   │   │   ├── BUILD.bazel
│   │   │   ├── PROFILE.md
│   │   │   ├── README.md
│   │   │   ├── analyze-profile.ts
│   │   │   ├── benchmark.ts
│   │   │   ├── instantiation-benchmark.ts
│   │   │   ├── package.json
│   │   │   └── profile.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── time-separators.ts
│   │   │   └── utils.ts
│   │   ├── should-polyfill.ts
│   │   ├── src/
│   │   │   ├── abstract/
│   │   │   │   ├── DurationRecordSign.ts
│   │   │   │   ├── GetDurationUnitOptions.ts
│   │   │   │   ├── IsValidDurationRecord.ts
│   │   │   │   ├── PartitionDurationFormatPattern.ts
│   │   │   │   ├── ToDurationRecord.ts
│   │   │   │   └── ToIntegerIfIntegral.ts
│   │   │   ├── constants.ts
│   │   │   ├── core.ts
│   │   │   ├── get_internal_slots.ts
│   │   │   ├── numbering-systems.generated.ts
│   │   │   ├── time-separators.generated.ts
│   │   │   └── types.ts
│   │   ├── tests/
│   │   │   └── index.test.ts
│   │   └── tsconfig.json
│   ├── intl-getcanonicallocales/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── aliases.ts
│   │   │   └── likely-subtags.ts
│   │   ├── should-polyfill.ts
│   │   ├── src/
│   │   │   ├── aliases.generated.ts
│   │   │   ├── canonicalizer.ts
│   │   │   ├── emitter.ts
│   │   │   ├── likelySubtags.generated.ts
│   │   │   ├── parser.ts
│   │   │   └── types.ts
│   │   ├── tests/
│   │   │   ├── index.test.ts
│   │   │   └── parser.test.ts
│   │   └── tsconfig.json
│   ├── intl-listformat/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── cldr-raw.ts
│   │   │   ├── cldr.ts
│   │   │   ├── extract-list.ts
│   │   │   ├── test-locale-data-gen.ts
│   │   │   └── test262-main-gen.ts
│   │   ├── should-polyfill.ts
│   │   ├── supported-locales.generated.ts
│   │   ├── test262-main.ts
│   │   ├── tests/
│   │   │   ├── index.test.ts
│   │   │   ├── locale-data/
│   │   │   │   ├── en-AI.json
│   │   │   │   ├── en.json
│   │   │   │   ├── zh-Hans.json
│   │   │   │   ├── zh-Hant.json
│   │   │   │   └── zh.json
│   │   │   └── supported-locales-of.test.ts
│   │   └── tsconfig.json
│   ├── intl-locale/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── calendars.generated.ts
│   │   ├── character-orders.generated.ts
│   │   ├── get_internal_slots.ts
│   │   ├── hour-cycles.generated.ts
│   │   ├── index.ts
│   │   ├── numbering-systems.generated.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── preference-data.ts
│   │   ├── scripts/
│   │   │   ├── calendars.ts
│   │   │   ├── character-orders.ts
│   │   │   ├── common-types.ts
│   │   │   ├── hour-cycles.ts
│   │   │   ├── numbering-systems.ts
│   │   │   ├── timezones.ts
│   │   │   ├── utils.ts
│   │   │   └── week-data.ts
│   │   ├── should-polyfill.ts
│   │   ├── tests/
│   │   │   ├── index.test.ts
│   │   │   ├── likely-subtags.test.ts
│   │   │   └── minimize.test.ts
│   │   ├── timezones.generated.ts
│   │   ├── tsconfig.json
│   │   └── week-data.generated.ts
│   ├── intl-localematcher/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── abstract/
│   │   │   ├── BestAvailableLocale.ts
│   │   │   ├── BestFitMatcher.ts
│   │   │   ├── CanonicalizeLocaleList.ts
│   │   │   ├── CanonicalizeUValue.ts
│   │   │   ├── CanonicalizeUnicodeLocaleId.ts
│   │   │   ├── InsertUnicodeExtensionAndCanonicalize.ts
│   │   │   ├── LookupMatcher.ts
│   │   │   ├── LookupSupportedLocales.ts
│   │   │   ├── ResolveLocale.ts
│   │   │   ├── UnicodeExtensionComponents.ts
│   │   │   ├── UnicodeExtensionValue.ts
│   │   │   ├── languageMatching.ts
│   │   │   ├── regions.generated.ts
│   │   │   ├── types.ts
│   │   │   └── utils.ts
│   │   ├── benchmark/
│   │   │   ├── BUILD.bazel
│   │   │   ├── benchmark.ts
│   │   │   ├── bestfit-benchmark.ts
│   │   │   ├── package.json
│   │   │   └── profile.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── scripts/
│   │   │   └── regions-gen.ts
│   │   ├── tests/
│   │   │   ├── BestFitMatcher.test.ts
│   │   │   ├── LookupMatcher.test.ts
│   │   │   ├── ResolveLocale.test.ts
│   │   │   ├── index.test.ts
│   │   │   └── utils.test.ts
│   │   └── tsconfig.json
│   ├── intl-messageformat/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── core.ts
│   │   │   ├── error.ts
│   │   │   └── formatters.ts
│   │   ├── tests/
│   │   │   ├── benchmark.ts
│   │   │   └── index.test.ts
│   │   └── tsconfig.json
│   ├── intl-numberformat/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── benchmark/
│   │   │   ├── BUILD.bazel
│   │   │   ├── PROFILE.md
│   │   │   ├── README.md
│   │   │   ├── analyze-profile.ts
│   │   │   ├── benchmark.ts
│   │   │   ├── en.json
│   │   │   ├── package.json
│   │   │   └── profile.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── cldr-raw.ts
│   │   │   ├── cldr.ts
│   │   │   ├── currency-digits.ts
│   │   │   ├── extract-currencies.ts
│   │   │   ├── extract-numbers.ts
│   │   │   ├── extract-units.ts
│   │   │   ├── generate-locale-test.ts
│   │   │   ├── numbering-systems.ts
│   │   │   ├── test-locale-data-gen.ts
│   │   │   ├── test262-main-gen.ts
│   │   │   ├── units-constants.ts
│   │   │   ├── update_snapshots.sh
│   │   │   └── utils.ts
│   │   ├── should-polyfill.ts
│   │   ├── src/
│   │   │   ├── core.ts
│   │   │   ├── currency-digits.generated.ts
│   │   │   ├── get_internal_slots.ts
│   │   │   ├── numbering-systems.generated.ts
│   │   │   ├── to_locale_string.ts
│   │   │   └── types.ts
│   │   ├── supported-locales.generated.ts
│   │   ├── test262-main.ts
│   │   ├── tests/
│   │   │   ├── currency/
│   │   │   │   ├── __snapshots__/
│   │   │   │   │   ├── da.test.ts.snap
│   │   │   │   │   ├── de.test.ts.snap
│   │   │   │   │   ├── en-BS.test.ts.snap
│   │   │   │   │   ├── en-GB.test.ts.snap
│   │   │   │   │   ├── en.test.ts.snap
│   │   │   │   │   ├── es.test.ts.snap
│   │   │   │   │   ├── fr.test.ts.snap
│   │   │   │   │   ├── id.test.ts.snap
│   │   │   │   │   ├── it.test.ts.snap
│   │   │   │   │   ├── ja.test.ts.snap
│   │   │   │   │   ├── ko.test.ts.snap
│   │   │   │   │   ├── ms.test.ts.snap
│   │   │   │   │   ├── nb.test.ts.snap
│   │   │   │   │   ├── nl.test.ts.snap
│   │   │   │   │   ├── pl.test.ts.snap
│   │   │   │   │   ├── pt.test.ts.snap
│   │   │   │   │   ├── ru.test.ts.snap
│   │   │   │   │   ├── sv.test.ts.snap
│   │   │   │   │   ├── th.test.ts.snap
│   │   │   │   │   ├── tr.test.ts.snap
│   │   │   │   │   ├── uk.test.ts.snap
│   │   │   │   │   └── zh.test.ts.snap
│   │   │   │   ├── currencyTest.ts
│   │   │   │   ├── da.generated.test.ts
│   │   │   │   ├── de.generated.test.ts
│   │   │   │   ├── en-BS.generated.test.ts
│   │   │   │   ├── en-GB.generated.test.ts
│   │   │   │   ├── en.generated.test.ts
│   │   │   │   ├── es.generated.test.ts
│   │   │   │   ├── fr.generated.test.ts
│   │   │   │   ├── id.generated.test.ts
│   │   │   │   ├── it.generated.test.ts
│   │   │   │   ├── ja.generated.test.ts
│   │   │   │   ├── ko.generated.test.ts
│   │   │   │   ├── ms.generated.test.ts
│   │   │   │   ├── nb.generated.test.ts
│   │   │   │   ├── nl.generated.test.ts
│   │   │   │   ├── pl.generated.test.ts
│   │   │   │   ├── pt.generated.test.ts
│   │   │   │   ├── ru.generated.test.ts
│   │   │   │   ├── sv.generated.test.ts
│   │   │   │   ├── th.generated.test.ts
│   │   │   │   ├── tr.generated.test.ts
│   │   │   │   ├── uk.generated.test.ts
│   │   │   │   └── zh.generated.test.ts
│   │   │   ├── currency-code.test.ts
│   │   │   ├── decimal/
│   │   │   │   ├── __snapshots__/
│   │   │   │   │   ├── da.test.ts.snap
│   │   │   │   │   ├── de.test.ts.snap
│   │   │   │   │   ├── en-BS.test.ts.snap
│   │   │   │   │   ├── en-GB.test.ts.snap
│   │   │   │   │   ├── en.test.ts.snap
│   │   │   │   │   ├── es.test.ts.snap
│   │   │   │   │   ├── fr.test.ts.snap
│   │   │   │   │   ├── id.test.ts.snap
│   │   │   │   │   ├── it.test.ts.snap
│   │   │   │   │   ├── ja.test.ts.snap
│   │   │   │   │   ├── ko.test.ts.snap
│   │   │   │   │   ├── ms.test.ts.snap
│   │   │   │   │   ├── nb.test.ts.snap
│   │   │   │   │   ├── nl.test.ts.snap
│   │   │   │   │   ├── pl.test.ts.snap
│   │   │   │   │   ├── pt.test.ts.snap
│   │   │   │   │   ├── ru.test.ts.snap
│   │   │   │   │   ├── sv.test.ts.snap
│   │   │   │   │   ├── th.test.ts.snap
│   │   │   │   │   ├── tr.test.ts.snap
│   │   │   │   │   ├── uk.test.ts.snap
│   │   │   │   │   └── zh.test.ts.snap
│   │   │   │   ├── da.generated.test.ts
│   │   │   │   ├── de.generated.test.ts
│   │   │   │   ├── decimalTest.ts
│   │   │   │   ├── en-BS.generated.test.ts
│   │   │   │   ├── en-GB.generated.test.ts
│   │   │   │   ├── en.generated.test.ts
│   │   │   │   ├── es.generated.test.ts
│   │   │   │   ├── fr.generated.test.ts
│   │   │   │   ├── id.generated.test.ts
│   │   │   │   ├── it.generated.test.ts
│   │   │   │   ├── ja.generated.test.ts
│   │   │   │   ├── ko.generated.test.ts
│   │   │   │   ├── ms.generated.test.ts
│   │   │   │   ├── nb.generated.test.ts
│   │   │   │   ├── nl.generated.test.ts
│   │   │   │   ├── pl.generated.test.ts
│   │   │   │   ├── pt.generated.test.ts
│   │   │   │   ├── ru.generated.test.ts
│   │   │   │   ├── sv.generated.test.ts
│   │   │   │   ├── th.generated.test.ts
│   │   │   │   ├── tr.generated.test.ts
│   │   │   │   ├── uk.generated.test.ts
│   │   │   │   └── zh.generated.test.ts
│   │   │   ├── fast-path-optimizations.test.ts
│   │   │   ├── format_to_parts.test.ts
│   │   │   ├── legacy.test.ts
│   │   │   ├── locale-data/
│   │   │   │   ├── ar-SS.json
│   │   │   │   ├── bn.json
│   │   │   │   ├── da.json
│   │   │   │   ├── de-AT.json
│   │   │   │   ├── de.json
│   │   │   │   ├── en-BS.json
│   │   │   │   ├── en-GB.json
│   │   │   │   ├── en.json
│   │   │   │   ├── es.json
│   │   │   │   ├── fr-CH.json
│   │   │   │   ├── fr.json
│   │   │   │   ├── hi.json
│   │   │   │   ├── id.json
│   │   │   │   ├── it.json
│   │   │   │   ├── ja.json
│   │   │   │   ├── ko.json
│   │   │   │   ├── ms.json
│   │   │   │   ├── nb.json
│   │   │   │   ├── nl.json
│   │   │   │   ├── pl.json
│   │   │   │   ├── pt.json
│   │   │   │   ├── ru.json
│   │   │   │   ├── sv.json
│   │   │   │   ├── sw.json
│   │   │   │   ├── th.json
│   │   │   │   ├── tr.json
│   │   │   │   ├── uk.json
│   │   │   │   ├── zh-Hans.json
│   │   │   │   ├── zh-Hant.json
│   │   │   │   └── zh.json
│   │   │   ├── misc.test.ts
│   │   │   ├── notation-compact-ko-KR.test.ts
│   │   │   ├── notation-compact-zh-TW.test.ts
│   │   │   ├── percent/
│   │   │   │   ├── __snapshots__/
│   │   │   │   │   ├── da.test.ts.snap
│   │   │   │   │   ├── de.test.ts.snap
│   │   │   │   │   ├── en-BS.test.ts.snap
│   │   │   │   │   ├── en-GB.test.ts.snap
│   │   │   │   │   ├── en.test.ts.snap
│   │   │   │   │   ├── es.test.ts.snap
│   │   │   │   │   ├── fr.test.ts.snap
│   │   │   │   │   ├── id.test.ts.snap
│   │   │   │   │   ├── it.test.ts.snap
│   │   │   │   │   ├── ja.test.ts.snap
│   │   │   │   │   ├── ko.test.ts.snap
│   │   │   │   │   ├── ms.test.ts.snap
│   │   │   │   │   ├── nb.test.ts.snap
│   │   │   │   │   ├── nl.test.ts.snap
│   │   │   │   │   ├── pl.test.ts.snap
│   │   │   │   │   ├── pt.test.ts.snap
│   │   │   │   │   ├── ru.test.ts.snap
│   │   │   │   │   ├── sv.test.ts.snap
│   │   │   │   │   ├── th.test.ts.snap
│   │   │   │   │   ├── tr.test.ts.snap
│   │   │   │   │   ├── uk.test.ts.snap
│   │   │   │   │   └── zh.test.ts.snap
│   │   │   │   ├── da.generated.test.ts
│   │   │   │   ├── de.generated.test.ts
│   │   │   │   ├── en-BS.generated.test.ts
│   │   │   │   ├── en-GB.generated.test.ts
│   │   │   │   ├── en.generated.test.ts
│   │   │   │   ├── es.generated.test.ts
│   │   │   │   ├── fr.generated.test.ts
│   │   │   │   ├── id.generated.test.ts
│   │   │   │   ├── it.generated.test.ts
│   │   │   │   ├── ja.generated.test.ts
│   │   │   │   ├── ko.generated.test.ts
│   │   │   │   ├── ms.generated.test.ts
│   │   │   │   ├── nb.generated.test.ts
│   │   │   │   ├── nl.generated.test.ts
│   │   │   │   ├── percentTest.ts
│   │   │   │   ├── pl.generated.test.ts
│   │   │   │   ├── pt.generated.test.ts
│   │   │   │   ├── ru.generated.test.ts
│   │   │   │   ├── sv.generated.test.ts
│   │   │   │   ├── th.generated.test.ts
│   │   │   │   ├── tr.generated.test.ts
│   │   │   │   ├── uk.generated.test.ts
│   │   │   │   └── zh.generated.test.ts
│   │   │   ├── signDisplay-currency-zh-TW.test.ts
│   │   │   ├── signDisplay-zh-TW.test.ts
│   │   │   ├── unit/
│   │   │   │   ├── __snapshots__/
│   │   │   │   │   ├── da.test.ts.snap
│   │   │   │   │   ├── de.test.ts.snap
│   │   │   │   │   ├── en-BS.test.ts.snap
│   │   │   │   │   ├── en-GB.test.ts.snap
│   │   │   │   │   ├── en.test.ts.snap
│   │   │   │   │   ├── es.test.ts.snap
│   │   │   │   │   ├── fr.test.ts.snap
│   │   │   │   │   ├── id.test.ts.snap
│   │   │   │   │   ├── it.test.ts.snap
│   │   │   │   │   ├── ja.test.ts.snap
│   │   │   │   │   ├── ko.test.ts.snap
│   │   │   │   │   ├── ms.test.ts.snap
│   │   │   │   │   ├── nb.test.ts.snap
│   │   │   │   │   ├── nl.test.ts.snap
│   │   │   │   │   ├── pl.test.ts.snap
│   │   │   │   │   ├── pt.test.ts.snap
│   │   │   │   │   ├── ru.test.ts.snap
│   │   │   │   │   ├── sv.test.ts.snap
│   │   │   │   │   ├── th.test.ts.snap
│   │   │   │   │   ├── tr.test.ts.snap
│   │   │   │   │   ├── uk.test.ts.snap
│   │   │   │   │   └── zh.test.ts.snap
│   │   │   │   ├── da.generated.test.ts
│   │   │   │   ├── de.generated.test.ts
│   │   │   │   ├── en-BS.generated.test.ts
│   │   │   │   ├── en-GB.generated.test.ts
│   │   │   │   ├── en.generated.test.ts
│   │   │   │   ├── es.generated.test.ts
│   │   │   │   ├── fr.generated.test.ts
│   │   │   │   ├── id.generated.test.ts
│   │   │   │   ├── it.generated.test.ts
│   │   │   │   ├── ja.generated.test.ts
│   │   │   │   ├── ko.generated.test.ts
│   │   │   │   ├── ms.generated.test.ts
│   │   │   │   ├── nb.generated.test.ts
│   │   │   │   ├── nl.generated.test.ts
│   │   │   │   ├── pl.generated.test.ts
│   │   │   │   ├── pt.generated.test.ts
│   │   │   │   ├── ru.generated.test.ts
│   │   │   │   ├── sv.generated.test.ts
│   │   │   │   ├── th.generated.test.ts
│   │   │   │   ├── tr.generated.test.ts
│   │   │   │   ├── uk.generated.test.ts
│   │   │   │   ├── unitTest.ts
│   │   │   │   └── zh.generated.test.ts
│   │   │   ├── unit-zh-TW.test.ts
│   │   │   └── value-tonumber.test.ts
│   │   └── tsconfig.json
│   ├── intl-pluralrules/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── abstract/
│   │   │   ├── GetOperands.ts
│   │   │   ├── InitializePluralRules.ts
│   │   │   ├── ResolvePlural.ts
│   │   │   └── ResolvePluralRange.ts
│   │   ├── get_internal_slots.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── cldr-raw.ts
│   │   │   ├── cldr.ts
│   │   │   ├── plural-rules-compiler.ts
│   │   │   └── test262-main-gen.ts
│   │   ├── should-polyfill.ts
│   │   ├── supported-locales.generated.ts
│   │   ├── test262-main.ts
│   │   ├── tests/
│   │   │   ├── index.test.ts
│   │   │   ├── locale-data/
│   │   │   │   ├── en.ts
│   │   │   │   ├── fr.ts
│   │   │   │   └── zh.ts
│   │   │   └── supported-locales-of.test.ts
│   │   └── tsconfig.json
│   ├── intl-relativetimeformat/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── abstract/
│   │   │   ├── FormatRelativeTime.ts
│   │   │   ├── FormatRelativeTimeToParts.ts
│   │   │   ├── InitializeRelativeTimeFormat.ts
│   │   │   ├── MakePartsList.ts
│   │   │   ├── PartitionRelativeTimePattern.ts
│   │   │   └── SingularRelativeTimeUnit.ts
│   │   ├── get_internal_slots.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── cldr-raw.ts
│   │   │   ├── cldr.ts
│   │   │   ├── extract-relative.ts
│   │   │   ├── test-locale-data-gen.ts
│   │   │   └── test262-main-gen.ts
│   │   ├── should-polyfill.ts
│   │   ├── supported-locales.generated.ts
│   │   ├── test262-main.ts
│   │   ├── tests/
│   │   │   ├── index.test.ts
│   │   │   ├── locale-data/
│   │   │   │   ├── en-AI.json
│   │   │   │   ├── en.json
│   │   │   │   ├── zh-Hans.json
│   │   │   │   ├── zh-Hant.json
│   │   │   │   └── zh.json
│   │   │   └── supported-locales-of.test.ts
│   │   └── tsconfig.json
│   ├── intl-segmenter/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── NOTES.md
│   │   ├── README.md
│   │   ├── benchmark.ts
│   │   ├── debug.ts
│   │   ├── index.bzl
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── generate-cldr-segmentation-rules.ts
│   │   │   └── test262-main-gen.ts
│   │   ├── should-polyfill.ts
│   │   ├── src/
│   │   │   ├── cldr-segmentation-rules.generated.ts
│   │   │   ├── segmentation-utils.ts
│   │   │   └── segmenter.ts
│   │   ├── test262-main.ts
│   │   ├── tests/
│   │   │   ├── grapheme.test.ts
│   │   │   ├── isWordLike.test.ts
│   │   │   ├── sentence.test.ts
│   │   │   ├── test-utils.ts
│   │   │   └── word.test.ts
│   │   └── tsconfig.json
│   ├── intl-supportedvaluesof/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── calendars.ts
│   │   │   ├── collations.ts
│   │   │   ├── currencies.ts
│   │   │   ├── timezones.ts
│   │   │   └── units.ts
│   │   ├── should-polyfill.ts
│   │   ├── src/
│   │   │   ├── calendars.generated.ts
│   │   │   ├── collations.generated.ts
│   │   │   ├── currencies.generated.ts
│   │   │   ├── get-supported-calendars.ts
│   │   │   ├── get-supported-collations.ts
│   │   │   ├── get-supported-currencies.ts
│   │   │   ├── get-supported-numbering-systems.ts
│   │   │   ├── get-supported-timezones.ts
│   │   │   ├── get-supported-units.ts
│   │   │   ├── index.ts
│   │   │   ├── memoize.ts
│   │   │   ├── numbering-systems.generated.ts
│   │   │   ├── timezones.generated.ts
│   │   │   └── units.generated.ts
│   │   ├── tests/
│   │   │   └── index.test.ts
│   │   └── tsconfig.json
│   ├── react-intl/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── example-sandboxes/
│   │   │   ├── BUILD.bazel
│   │   │   ├── rescripts/
│   │   │   │   ├── .rescriptsrc.js
│   │   │   │   ├── package.json
│   │   │   │   ├── public/
│   │   │   │   │   └── index.html
│   │   │   │   ├── src/
│   │   │   │   │   ├── App.tsx
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── react-app-env.d.ts
│   │   │   │   │   └── styles.css
│   │   │   │   └── tsconfig.json
│   │   │   ├── strict-locale-type/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── App.tsx
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.css
│   │   │   │   └── tsconfig.json
│   │   │   └── strict-message-types/
│   │   │       ├── .gitignore
│   │   │       ├── package.json
│   │   │       ├── src/
│   │   │       │   ├── App.tsx
│   │   │       │   ├── index.html
│   │   │       │   ├── index.tsx
│   │   │       │   └── styles.css
│   │   │       └── tsconfig.json
│   │   ├── examples/
│   │   │   ├── BUILD.bazel
│   │   │   ├── Bug2727.tsx
│   │   │   ├── HandleChange.tsx
│   │   │   ├── Hooks.tsx
│   │   │   ├── Injected.tsx
│   │   │   ├── Messages.tsx
│   │   │   ├── StaticTypeSafetyAndCodeSplitting/
│   │   │   │   ├── StaticTypeSafetyAndCodeSplitting.tsx
│   │   │   │   ├── en.json
│   │   │   │   ├── intlHelpers.tsx
│   │   │   │   └── it.json
│   │   │   ├── TimeZone.tsx
│   │   │   ├── advanced/
│   │   │   │   ├── Advanced.tsx
│   │   │   │   └── compiled-lang/
│   │   │   │       ├── en.json
│   │   │   │       └── fr.json
│   │   │   ├── index.html
│   │   │   ├── index.tsx
│   │   │   └── package.json
│   │   ├── index.ts
│   │   ├── integration-tests/
│   │   │   ├── BUILD.bazel
│   │   │   ├── format.test.tsx
│   │   │   ├── package.json
│   │   │   └── tsconfig.json
│   │   ├── package.json
│   │   ├── server.ts
│   │   ├── src/
│   │   │   ├── components/
│   │   │   │   ├── context.ts
│   │   │   │   ├── createFormattedComponent.tsx
│   │   │   │   ├── createIntl.ts
│   │   │   │   ├── dateTimeRange.tsx
│   │   │   │   ├── message.tsx
│   │   │   │   ├── plural.tsx
│   │   │   │   ├── provider.tsx
│   │   │   │   ├── relative.tsx
│   │   │   │   └── useIntl.ts
│   │   │   ├── types.ts
│   │   │   └── utils.tsx
│   │   ├── tests/
│   │   │   ├── global_type_overrides.test-d.ts
│   │   │   ├── perf/
│   │   │   │   └── index.tsx
│   │   │   └── unit/
│   │   │       ├── components/
│   │   │       │   ├── date.test.tsx
│   │   │       │   ├── dateTimeRange.test.tsx
│   │   │       │   ├── displayName.test.tsx
│   │   │       │   ├── message.test.tsx
│   │   │       │   ├── number.test.tsx
│   │   │       │   ├── plural.test.tsx
│   │   │       │   ├── provider.test.tsx
│   │   │       │   ├── relative.test.tsx
│   │   │       │   ├── time.test.tsx
│   │   │       │   └── useIntl.test.tsx
│   │   │       ├── react-19-key-warning.test.tsx
│   │   │       ├── react-intl.test.tsx
│   │   │       ├── testUtils.tsx
│   │   │       └── types.test.tsx
│   │   ├── tsconfig.json
│   │   └── vitest.config.mjs
│   ├── svelte-intl/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── context-key.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── provider.ts
│   │   ├── tests/
│   │   │   └── index.test.ts
│   │   └── tsconfig.json
│   ├── ts-transformer/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── examples/
│   │   │   └── compile.ts
│   │   ├── index.ts
│   │   ├── integration-tests/
│   │   │   ├── BUILD.bazel
│   │   │   ├── integration/
│   │   │   │   ├── comp.tsx
│   │   │   │   ├── jest.config.js
│   │   │   │   └── ts-jest.test.tsx
│   │   │   ├── package.json
│   │   │   └── vue/
│   │   │       ├── fixtures/
│   │   │       │   ├── index.vue
│   │   │       │   └── main.ts
│   │   │       └── integration.test.ts
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── console_utils.ts
│   │   │   ├── interpolate-name.ts
│   │   │   ├── transform.ts
│   │   │   └── types.ts
│   │   ├── tests/
│   │   │   ├── __snapshots__/
│   │   │   │   └── index.test.ts.snap
│   │   │   ├── fixtures/
│   │   │   │   ├── FormattedMessage.tsx
│   │   │   │   ├── additionalComponentNames.tsx
│   │   │   │   ├── additionalFunctionNames.tsx
│   │   │   │   ├── ast.tsx
│   │   │   │   ├── defineMessages.tsx
│   │   │   │   ├── defineMessagesPreserveWhitespace.tsx
│   │   │   │   ├── descriptionsAsObjects.tsx
│   │   │   │   ├── extractFromFormatMessage.tsx
│   │   │   │   ├── extractFromFormatMessageStateless.tsx
│   │   │   │   ├── extractSourceLocation.tsx
│   │   │   │   ├── flattenError.tsx
│   │   │   │   ├── formatMessageCall.tsx
│   │   │   │   ├── inline.tsx
│   │   │   │   ├── nested.tsx
│   │   │   │   ├── noImport.tsx
│   │   │   │   ├── nonStaticMessages.tsx
│   │   │   │   ├── optionalChaining.tsx
│   │   │   │   ├── overrideIdFn.tsx
│   │   │   │   ├── removeDefaultMessage.tsx
│   │   │   │   ├── removeDescription.tsx
│   │   │   │   ├── resourcePath.tsx
│   │   │   │   ├── stringConcat.tsx
│   │   │   │   └── templateLiteral.tsx
│   │   │   ├── index.test.ts
│   │   │   └── interpolate-name.test.ts
│   │   ├── ts-jest-integration.ts
│   │   └── tsconfig.json
│   ├── unplugin/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── esbuild.ts
│   │   ├── index.ts
│   │   ├── integration-tests/
│   │   │   ├── BUILD.bazel
│   │   │   ├── fixtures/
│   │   │   │   ├── compiledJsx.js
│   │   │   │   ├── defineMessage.js
│   │   │   │   ├── defineMessages.js
│   │   │   │   ├── formatMessage.js
│   │   │   │   ├── jsx.tsx
│   │   │   │   └── removeDescription.tsx
│   │   │   ├── integration.test.ts
│   │   │   └── package.json
│   │   ├── package.json
│   │   ├── rollup.ts
│   │   ├── rspack.ts
│   │   ├── tests/
│   │   │   └── transform.test.ts
│   │   ├── transform.ts
│   │   ├── tsconfig.json
│   │   ├── vite.ts
│   │   └── webpack.ts
│   ├── utils/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── data/
│   │   │   └── list-one.xml
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── countryCodes.ts
│   │   │   ├── currencyMinorUnits.generated.ts
│   │   │   ├── defaultCurrency.ts
│   │   │   ├── defaultCurrencyData.generated.ts
│   │   │   ├── defaultLocale.ts
│   │   │   ├── defaultLocaleData.generated.ts
│   │   │   ├── defaultTimezone.ts
│   │   │   ├── iso3166Alpha3CountryCodes.ts
│   │   │   └── iso4217.ts
│   │   ├── tests/
│   │   │   ├── countryCodes.test.ts
│   │   │   ├── currencyMinorUnits.test.ts
│   │   │   ├── defaultCurrency.test.ts
│   │   │   ├── defaultLocale.test.ts
│   │   │   └── defaultTimezone.test.ts
│   │   ├── tools/
│   │   │   ├── extract-default-currency.ts
│   │   │   ├── extract-default-locale.ts
│   │   │   └── extract-minor-currency-units.ts
│   │   └── tsconfig.json
│   └── vue-intl/
│       ├── BUILD.bazel
│       ├── CHANGELOG.md
│       ├── LICENSE.md
│       ├── README.md
│       ├── index.ts
│       ├── injection-key.ts
│       ├── package.json
│       ├── plugin.ts
│       ├── provider.ts
│       ├── tests/
│       │   └── index.test.ts
│       └── tsconfig.json
├── patches/
│   ├── @types__mdx.patch
│   ├── @vue+compiler-sfc.patch
│   ├── oxlint@1.48.0.patch
│   ├── unicode-match-property-ecmascript@2.0.0.patch
│   └── unicode-match-property-value-ecmascript@2.2.1.patch
├── pnpm-workspace.yaml
├── release.sh
├── renovate.json
├── test262.BUILD
├── tools/
│   ├── BUILD.bazel
│   ├── check-package-json.ts
│   ├── generate-supported-locales.ts
│   ├── index.bzl
│   ├── oxc-transpiler/
│   │   ├── BUILD.bazel
│   │   ├── index.mjs
│   │   └── package.json
│   ├── oxc_transpiler.bzl
│   ├── tsconfig.bzl
│   ├── vitest.bzl
│   └── vitest.config.mjs
└── tsconfig.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .aspect/bazelrc/.gitignore
================================================
user.bazelrc


================================================
FILE: .aspect/bazelrc/bazel5.bazelrc
================================================
# Performance improvement for WORKSPACE evaluation
# of slow rulesets, for example rules_k8s has been
# observed to take 10 seconds without this flag.
# See https://github.com/bazelbuild/bazel/issues/13907
common --incompatible_existing_rules_immutable_view


================================================
FILE: .aspect/bazelrc/bazel6.bazelrc
================================================
# Speed up all builds by not checking if external repository files have been modified.
# Docs: https://github.com/bazelbuild/bazel/blob/1af61b21df99edc2fc66939cdf14449c2661f873/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java#L244
build --noexperimental_check_external_repository_files
fetch --noexperimental_check_external_repository_files
query --noexperimental_check_external_repository_files

# Directories used by sandboxed non-worker execution may be reused to avoid unnecessary setup costs.
# Save time on Sandbox creation and deletion when many of the same kind of action run during the
# build.
# Docs: https://bazel.build/reference/command-line-reference#flag--reuse_sandbox_directories
build --reuse_sandbox_directories

# Avoid this flag being enabled by remote_download_minimal or remote_download_toplevel
# See https://meroton.com/blog/bazel-6-errors-build-without-the-bytes/
build --action_cache_store_output_metadata


================================================
FILE: .aspect/bazelrc/ci.bazelrc
================================================
# We recommend enforcing a policy that keeps your CI from being slowed down
# by individual test targets that should be optimized
# or split up into multiple test targets with sharding or manually.
# Set this flag to exclude targets that have their timeout set to eternal (>15m) from running on CI.
# Docs: https://bazel.build/docs/user-manual#test-timeout-filters
build --test_timeout_filters=-eternal

# Set this flag to enable re-tries of failed tests on CI.
# When any test target fails, try one or more times. This applies regardless of whether the "flaky"
# tag appears on the target definition.
# This is a tradeoff: legitimately failing tests will take longer to report,
# but we can paper over flaky tests that pass most of the time.
# The alternative is to mark every flaky test with the `flaky = True` attribute, but this requires
# the buildcop to make frequent code edits.
# Not recommended for local builds so that the flakiness is observed during development and thus
# is more likely to get fixed.
# Note that when passing after the first attempt, Bazel will give a special "FLAKY" status.
# Docs: https://bazel.build/docs/user-manual#flaky-test-attempts
build --flaky_test_attempts=2

# Announce all announces command options read from the bazelrc file(s) when starting up at the
# beginning of each Bazel invocation. This is very useful on CI to be able to inspect what Bazel rc
# settings are being applied on each run.
# Docs: https://bazel.build/docs/user-manual#announce-rc
build --announce_rc

# Add a timestamp to each message generated by Bazel specifying the time at which the message was
# displayed.
# Docs: https://bazel.build/docs/user-manual#show-timestamps
build --show_timestamps

# Only show progress every 60 seconds on CI.
# We want to find a compromise between printing often enough to show that the build isn't stuck,
# but not so often that we produce a long log file that requires a lot of scrolling.
# https://bazel.build/reference/command-line-reference#flag--show_progress_rate_limit
build --show_progress_rate_limit=60

# Use cursor controls in screen output.
# Docs: https://bazel.build/docs/user-manual#curses
build --curses=yes

# Use colors to highlight output on the screen. Set to `no` if your CI does not display colors.
# Docs: https://bazel.build/docs/user-manual#color
build --color=yes

# The terminal width in columns. Configure this to override the default value based on what your CI system renders.
# Docs: https://github.com/bazelbuild/bazel/blob/1af61b21df99edc2fc66939cdf14449c2661f873/src/main/java/com/google/devtools/build/lib/runtime/UiOptions.java#L151
build --terminal_columns=143

######################################
# Generic remote cache configuration #
######################################

# Only download remote outputs of top level targets to the local machine.
# Docs: https://bazel.build/reference/command-line-reference#flag--remote_download_toplevel
build --remote_download_toplevel

# The maximum amount of time to wait for remote execution and cache calls.
# https://bazel.build/reference/command-line-reference#flag--remote_timeout
build --remote_timeout=3600

# Upload locally executed action results to the remote cache.
# Docs: https://bazel.build/reference/command-line-reference#flag--remote_upload_local_results
build --remote_upload_local_results

# Fall back to standalone local execution strategy if remote execution fails. If the grpc remote
# cache connection fails, it will fail the build, add this so it falls back to the local cache.
# Docs: https://bazel.build/reference/command-line-reference#flag--remote_local_fallback
build --remote_local_fallback

# Fixes builds hanging on CI that get the TCP connection closed without sending RST packets.
# Docs: https://bazel.build/reference/command-line-reference#flag--grpc_keepalive_time
build --grpc_keepalive_time=30s


================================================
FILE: .aspect/bazelrc/convenience.bazelrc
================================================
# Attempt to build & test every target whose prerequisites were successfully built.
# Docs: https://bazel.build/docs/user-manual#keep-going
build --keep_going

# Output test errors to stderr so users don't have to `cat` or open test failure log files when test
# fail. This makes the log noiser in exchange for reducing the time-to-feedback on test failures for
# users.
# Docs: https://bazel.build/docs/user-manual#test-output
test --test_output=errors

# Show the output files created by builds that requested more than one target. This helps users
# locate the build outputs in more cases
# Docs: https://bazel.build/docs/user-manual#show-result
build --show_result=20

# Bazel picks up host-OS-specific config lines from bazelrc files. For example, if the host OS is
# Linux and you run bazel build, Bazel picks up lines starting with build:linux. Supported OS
# identifiers are `linux`, `macos`, `windows`, `freebsd`, and `openbsd`. Enabling this flag is
# equivalent to using `--config=linux` on Linux, `--config=windows` on Windows, etc.
# Docs: https://bazel.build/reference/command-line-reference#flag--enable_platform_specific_config
common --enable_platform_specific_config

# Output a heap dump if an OOM is thrown during a Bazel invocation
# (including OOMs due to `--experimental_oom_more_eagerly_threshold`).
# The dump will be written to `<output_base>/<invocation_id>.heapdump.hprof`.
# You may need to configure CI to capture this artifact and upload for later use.
# Docs: https://bazel.build/reference/command-line-reference#flag--heap_dump_on_oom
common --heap_dump_on_oom


================================================
FILE: .aspect/bazelrc/correctness.bazelrc
================================================
# Do not upload locally executed action results to the remote cache.
# This should be the default for local builds so local builds cannot poison the remote cache.
# It should be flipped to `--remote_upload_local_results` on CI
# by using `--bazelrc=.aspect/bazelrc/ci.bazelrc`.
# Docs: https://bazel.build/reference/command-line-reference#flag--remote_upload_local_results
build --noremote_upload_local_results

# Don't allow network access for build actions in the sandbox.
# Ensures that you don't accidentally make non-hermetic actions/tests which depend on remote
# services.
# Developers should tag targets with `tags=["requires-network"]` to opt-out of the enforcement.
# Docs: https://bazel.build/reference/command-line-reference#flag--sandbox_default_allow_network
build --sandbox_default_allow_network=false

# Warn if a test's timeout is significantly longer than the test's actual execution time.
# Bazel's default for test_timeout is medium (5 min), but most tests should instead be short (1 min).
# While a test's timeout should be set such that it is not flaky, a test that has a highly
# over-generous timeout can hide real problems that crop up unexpectedly.
# For instance, a test that normally executes in a minute or two should not have a timeout of
# ETERNAL or LONG as these are much, much too generous.
# Docs: https://bazel.build/docs/user-manual#test-verbose-timeout-warnings
test --test_verbose_timeout_warnings

# Allow the Bazel server to check directory sources for changes. Ensures that the Bazel server
# notices when a directory changes, if you have a directory listed in the srcs of some target.
# Recommended when using
# [copy_directory](https://github.com/aspect-build/bazel-lib/blob/main/docs/copy_directory.md) and
# [rules_js](https://github.com/aspect-build/rules_js) since npm package are source directories
# inputs to copy_directory actions.
# Docs: https://bazel.build/reference/command-line-reference#flag--host_jvm_args
startup --host_jvm_args=-DBAZEL_TRACK_SOURCE_DIRECTORIES=1

# Allow exclusive tests to run in the sandbox. Fixes a bug where Bazel doesn't enable sandboxing for
# tests with `tags=["exclusive"]`.
# Docs: https://bazel.build/reference/command-line-reference#flag--incompatible_exclusive_test_sandboxed
test --incompatible_exclusive_test_sandboxed

# Use a static value for `PATH` and does not inherit `LD_LIBRARY_PATH`. Doesn't let environment
# variables like `PATH` sneak into the build, which can cause massive cache misses when they change.
# Use `--action_env=ENV_VARIABLE` if you want to inherit specific environment variables from the
# client, but note that doing so can prevent cross-user caching if a shared cache is used.
# Docs: https://bazel.build/reference/command-line-reference#flag--incompatible_strict_action_env
build --incompatible_strict_action_env

# NOTE(formatjs): disabling these because they cause `file 'xxx' is generated by these conflicting actions` errors.
#
# Propagate tags from a target declaration to the actions' execution requirements.
# Ensures that tags applied in your BUILD file, like `tags=["no-remote"]`
# get propagated to actions created by the rule.
# Without this option, you rely on rules authors to manually check the tags you passed
# and apply relevant ones to the actions they create.
# See https://github.com/bazelbuild/bazel/issues/8830 for details.
# Docs: https://bazel.build/reference/command-line-reference#flag--experimental_allow_tags_propagation
# build --experimental_allow_tags_propagation
# fetch --experimental_allow_tags_propagation
# query --experimental_allow_tags_propagation

# Do not automatically create `__init__.py` files in the runfiles of Python targets. Fixes the wrong
# default that comes from Google's internal monorepo by using `__init__.py` to delimit a Python
# package. Precisely, when a `py_binary` or `py_test` target has `legacy_create_init` set to `auto (the
# default), it is treated as false if and only if this flag is set. See
# https://github.com/bazelbuild/bazel/issues/10076.
# Docs: https://bazel.build/reference/command-line-reference#flag--incompatible_default_to_explicit_init_py
build --incompatible_default_to_explicit_init_py


================================================
FILE: .aspect/bazelrc/debug.bazelrc
================================================
############################################################
# Use `bazel test --config=debug` to enable these settings #
############################################################

# Stream stdout/stderr output from each test in real-time.
# Docs: https://bazel.build/docs/user-manual#test-output
test:debug --test_output=streamed

# Run one test at a time.
# Docs: https://bazel.build/reference/command-line-reference#flag--test_strategy
test:debug --test_strategy=exclusive

# Prevent long running tests from timing out.
# Docs: https://bazel.build/docs/user-manual#test-timeout
test:debug --test_timeout=9999

# Always run tests even if they have cached results.
# Docs: https://bazel.build/docs/user-manual#cache-test-results
test:debug --nocache_test_results


================================================
FILE: .aspect/bazelrc/javascript.bazelrc
================================================
# Aspect recommended Bazel flags when using Aspect's JavaScript rules: https://github.com/aspect-build/rules_js
# Docs for Node.js flags: https://nodejs.org/en/docs/guides/debugging-getting-started/#command-line-options

# Support for debugging Node.js tests. Use bazel run with `--config=debug` to turn on the NodeJS
# inspector agent. The node process will break before user code starts and wait for the debugger to
# connect. Pass the --inspect-brk option to all tests which enables the node inspector agent. See
# https://nodejs.org/de/docs/guides/debugging-getting-started/#command-line-options for more
# details.
# Docs: https://nodejs.org/en/docs/guides/debugging-getting-started/#command-line-options
run:debug -- --node_options=--inspect-brk

# Enable runfiles on all platforms. Runfiles are on by default on Linux and MacOS but off on
# Windows.
#
# In general, rules_js and derivate rule sets assume that runfiles are enabled and do not support no
# runfiles case because it does not scale to teach all Node.js tools to use the runfiles manifest.
#
# If you are developing on Windows, you must either run bazel with administrator privileges or
# enable developer mode. If you do not you may hit this error on Windows:
#
#   Bazel needs to create symlinks to build the runfiles tree.
#   Creating symlinks on Windows requires one of the following:
#       1. Bazel is run with administrator privileges.
#       2. The system version is Windows 10 Creators Update (1703) or later
#          and developer mode is enabled.
#
# Docs: https://bazel.build/reference/command-line-reference#flag--enable_runfiles
build --enable_runfiles


================================================
FILE: .aspect/bazelrc/performance.bazelrc
================================================
# Speed up all builds by not checking if output files have been modified. Lets you make changes to
# the output tree without triggering a build for local debugging. For example, you can modify
# [rules_js](https://github.com/aspect-build/rules_js) 3rd party npm packages in the output tree
# when local debugging.
# Docs: https://github.com/bazelbuild/bazel/blob/1af61b21df99edc2fc66939cdf14449c2661f873/src/main/java/com/google/devtools/build/lib/pkgcache/PackageOptions.java#L185
build --noexperimental_check_output_files
fetch --noexperimental_check_output_files
query --noexperimental_check_output_files

# Directories used by sandboxed non-worker execution may be reused to avoid unnecessary setup costs.
# Save time on Sandbox creation and deletion when many of the same kind of action run during the
# build.
# No longer experimental in Bazel 6: https://github.com/bazelbuild/bazel/commit/c1a95501a5611878e5cc43a3cc531f2b9e47835b
# Docs: https://bazel.build/reference/command-line-reference#flag--reuse_sandbox_directories
build --reuse_sandbox_directories

# Do not build runfiles symlink forests for external repositories under
# `.runfiles/wsname/external/repo` (in addition to `.runfiles/repo`). This reduces runfiles &
# sandbox creation times & prevents accidentally depending on this feature which may flip to off by
# default in the future. Note, some rules may fail under this flag, please file issues with the rule
# author.
# Docs: https://bazel.build/reference/command-line-reference#flag--legacy_external_runfiles
build --nolegacy_external_runfiles

# Some actions are always IO-intensive but require little compute. It's wasteful to put the output
# in the remote cache, it just saturates the network and fills the cache storage causing earlier
# evictions. It's also not worth sending them for remote execution.
# For actions like PackageTar it's usually faster to just re-run the work locally every time.
# You'll have to look at an execution log to figure out what other action mnemonics you care about.
# In some cases you may need to patch rulesets to add a mnemonic to actions that don't have one.
# https://bazel.build/reference/command-line-reference#flag--modify_execution_info
build --modify_execution_info=PackageTar=+no-remote


================================================
FILE: .bazelrc
================================================
# Common Bazel settings for JavaScript/NodeJS workspaces
# This rc file is automatically discovered when Bazel is run in this workspace,
# see https://docs.bazel.build/versions/master/guide.html#bazelrc
#
# The full list of Bazel options: https://docs.bazel.build/versions/master/command-line-reference.html

# Import Aspect recommended Bazel settings for all projects
import %workspace%/.aspect/bazelrc/bazel6.bazelrc
import %workspace%/.aspect/bazelrc/convenience.bazelrc
import %workspace%/.aspect/bazelrc/correctness.bazelrc
import %workspace%/.aspect/bazelrc/debug.bazelrc
import %workspace%/.aspect/bazelrc/performance.bazelrc

### YOUR PROJECT SPECIFIC SETTINGS GO HERE ###

common --enable_bzlmod 
common --color=yes

build --java_language_version=17
build --java_runtime_version=remotejdk_17
build --tool_java_language_version=17
build --tool_java_runtime_version=remotejdk_17

build --action_env=PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

# Give me dem stack traces
build --verbose_failures

build --experimental_platform_in_output_dir
build --remote_cache_compression
build --legacy_important_outputs
build --remote_build_event_upload=minimal
build --noslim_profile 
build --experimental_profile_include_target_label 
build --experimental_profile_include_primary_output 
common --bes_upload_mode=fully_async
common --noincompatible_no_implicit_watch_label

# Bazel will create symlinks from the workspace directory to output artifacts.
# Build results will be placed in a directory called "dist/bin"
# Other directories will be created like "dist/testlogs"
# Be aware that this will still create a bazel-out symlink in
# your project directory, which you must exclude from version control and your
# editor's search path.
# To disable the symlinks altogether (including bazel-out) you can use
# build --symlink_prefix=/
# however this makes it harder to find outputs.

# Support for debugging NodeJS tests
# Add the Bazel option `--config=debug` to enable this
# --compilation_mode=dbg
#     Rules may change their build outputs if the compilation mode is set to dbg. For example,
#     mininfiers such as terser may make their output more human readable when this is set. Rules will pass `COMPILATION_MODE`
#     to `nodejs_binary` executables via the actions.run env attribute.
#     See https://docs.bazel.build/versions/master/user-manual.html#flag--compilation_mode for more details.
test:debug --define=VERBOSE_LOGS=1
run:debug --define=VERBOSE_LOGS=1
# The following option will change the build output of certain rules such as terser and may not be desirable in all cases
build:debug --compilation_mode=dbg

run --incompatible_strict_action_env

# Increase heap size
build --define=NODE_OPTIONS=--max-old-space-size=4096
build --build_metadata=REPO_URL=https://github.com/formatjs/formatjs.git

# BuildBuddy GH Actions Config
# https://www.buildbuddy.io/docs/rbe-github-actions
build:ci --build_metadata=ROLE=CI
build:ci --build_metadata=VISIBILITY=PUBLIC
build:ci --config=remote
build:remote --bes_backend=grpcs://formatjs.buildbuddy.io
build:remote --bes_results_url=https://formatjs.buildbuddy.io/invocation/
build:remote --define=EXECUTOR=remote
build:remote --extra_execution_platforms=@toolchains_buildbuddy//platforms:linux_x86_64
build:remote --jobs=50
build:remote --platforms=@toolchains_buildbuddy//platforms:linux_x86_64
build:remote --remote_cache=grpcs://formatjs.buildbuddy.io
build:remote --remote_executor=grpcs://formatjs.buildbuddy.io
build:remote --remote_timeout=10m

# BuildBuddy config for macOS CI - remote cache only, no remote execution
build:ci-darwin --build_metadata=ROLE=CI
build:ci-darwin --build_metadata=VISIBILITY=PUBLIC
build:ci-darwin --bes_backend=grpcs://formatjs.buildbuddy.io
build:ci-darwin --bes_results_url=https://formatjs.buildbuddy.io/invocation/
build:ci-darwin --remote_cache=grpcs://formatjs.buildbuddy.io

# honor the setting of `skipLibCheck` in the tsconfig.json file
build --@aspect_rules_ts//ts:skipLibCheck=honor_tsconfig
fetch --@aspect_rules_ts//ts:skipLibCheck=honor_tsconfig
query --@aspect_rules_ts//ts:skipLibCheck=honor_tsconfig

# Use "tsc" as the transpiler when ts_project has no `transpiler` set.
build --@aspect_rules_ts//ts:default_to_tsc_transpiler
fetch --@aspect_rules_ts//ts:default_to_tsc_transpiler
query --@aspect_rules_ts//ts:default_to_tsc_transpiler

# Load any settings specific to the current user.
# .bazelrc.user should appear in .gitignore so that settings are not shared with team members
# This needs to be last statement in this
# config, as the user configuration should be able to overwrite flags from this file.
# See https://docs.bazel.build/versions/master/best-practices.html#bazelrc
# (Note that we use .bazelrc.user so the file appears next to .bazelrc in directory listing,
# rather than user.bazelrc as suggested in the Bazel docs)
try-import %workspace%/.bazelrc.user



================================================
FILE: .bazelversion
================================================
9.0.1


================================================
FILE: .commitlintrc.mjs
================================================
import fastGlobPkg from 'fast-glob'
import {readJSONSync} from 'fs-extra/esm'
import {dirname} from 'node:path'
const {sync: globSync} = fastGlobPkg

const packages = [
  ...globSync('./packages/*/package.json').map(fn => readJSONSync(fn).name),
  ...globSync('./crates/*/BUILD.bazel').map(fn => dirname(fn).split('crates/')[1]),
  // renovate bot config package
  'deps',
]

export default {
  extends: ['@commitlint/config-angular'],
  rules: {
    // Cheatsheet: https://commitlint.js.org/#/reference-rules
    // Sweet Jesus why is disabling a rule syntax so verbose??
    'scope-enum': [2, 'always', packages],
    'header-max-length': [0, 'never', Infinity],
    'type-enum': [
      2,
      'always',
      [
        'build',
        'chore',
        'ci',
        'docs',
        'feat',
        'fix',
        'perf',
        'refactor',
        'revert',
        'style',
        'test',
      ],
    ],
  },
}


================================================
FILE: .eslintignore
================================================
/artifacts
/build
/dist
/node_modules
**/artifacts
**/build
**/node_modules
packages/babel-plugin-formatjs/options.ts
**/test262-main.ts
**/locale-data/*
**/tests/fixtures/**
**/integration-tests/**/fixtures/**
packages/cli/integration-tests/extract/typescript/err.tsx
*.generated.*

================================================
FILE: .gitattributes
================================================
packages/*/src/data/* linguist-generated
packages/*/test262-main.ts linguist-generated
packages/*/supported-locales.ts linguist-generated
packages/*/tests/locale-data/* linguist-generated
*.generated.ts linguist-generated
*_generated.rs linguist-generated
*.generated.json linguist-generated
packages/intl-datetimeformat/tz_data.tar.gz binary
website/* linguist-documentation
**/CHANGELOG.md linguist-documentation

# A custom merge driver for the Bazel lockfile.
# https://bazel.build/external/lockfile#automatic-resolution
MODULE.bazel.lock merge=bazel-lockfile-merge

================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve. If this is a question please use Discussions.
title: ''
labels: bug
assignees: ''
---

<!-- If this is more of a question on how i18n should work or you have not narrowed down the issue to be 1 of our packages, please use Discussions instead -->

## Which package?

Since this is a monorepo. Please specify which package this bug report is for.

## Describe the bug

A clear and concise description of what the bug is.

## To Reproduce

### Codesandbox URL

Please include a codesandbox URL if possible

### Reproducible Steps/Repo

Steps to reproduce the behavior:

1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

## Expected behavior

A clear and concise description of what you expected to happen.

## Screenshots

If applicable, add screenshots to help explain your problem.

## Desktop (please complete the following information):

- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]

## Smartphone (please complete the following information):

- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]

## Additional context

Add any other context about the problem here.


================================================
FILE: .github/workflows/claude.yml
================================================
name: Claude Code

on:
  issue_comment:
    types: [created]
  pull_request_review_comment:
    types: [created]
  issues:
    types: [opened, assigned]
  pull_request_review:
    types: [submitted]

jobs:
  claude:
    if: |
      (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
      (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: read
      issues: read
      id-token: write
      actions: read # Required for Claude to read CI results on PRs
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 1

      - name: Run Claude Code
        id: claude
        uses: anthropics/claude-code-action@v1
        with:
          allowed_bots: 'renovate[bot],graphite-app'
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

          # This is an optional setting that allows Claude to read CI results on PRs
          additional_permissions: |
            actions: read

          # Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.
          # prompt: 'Update the pull request description to include a summary of changes.'

          # Optional: Add claude_args to customize behavior and configuration
          # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
          # or https://code.claude.com/docs/en/cli-reference for available options
          # claude_args: '--allowed-tools Bash(gh pr:*)'


================================================
FILE: .github/workflows/prerelease.yml
================================================
name: Prerelease

on:
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}
  cancel-in-progress: false

jobs:
  prerelease:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      packages: write

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
          token: ${{ secrets.GH_RELEASE_TOKEN }}

      - name: Setup pnpm
        uses: pnpm/action-setup@v5
        with:
          version: 10.32.1

      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '24'

      - name: Configure Git
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"

      - name: Install Dependencies
        run: pnpm install --frozen-lockfile

      - name: Run Prerelease
        env:
          GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }}
        run: pnpm run prerelease


================================================
FILE: .github/workflows/release.yml
================================================
name: Release

on:
  push:
    branches:
      - main
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}
  cancel-in-progress: false

jobs:
  release:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v6

      - name: Setup Bazel
        uses: bazel-contrib/setup-bazel@0.18.0
        with:
          bazelisk-cache: true
          disk-cache: ${{ github.workflow }}
          repository-cache: true

      - name: Setup pnpm
        uses: pnpm/action-setup@v5
        with:
          version: 10.32.1

      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '24'
          registry-url: 'https://registry.npmjs.org'

      - name: Build Distribution
        run: |
          bazel build \
            --config=ci \
            --remote_header=x-buildbuddy-api-key=${{ secrets.BUILDBUDDY_ORG_API_KEY }} \
            :dist
          DIST_PATH=$(bazel cquery --config=ci --output=files :dist)
          echo "Distribution path: $DIST_PATH"
          cp -rf "$DIST_PATH" release/
          chmod -R +w release/

      - name: Install Dependencies
        working-directory: release
        run: pnpm install --frozen-lockfile --ignore-scripts

      - name: Publish to npm
        working-directory: release
        run: pnpm -r publish --access public --no-git-checks


================================================
FILE: .github/workflows/rust-cli-release.yml
================================================
name: Rust CLI Release

on:
  push:
    tags:
      - 'formatjs_cli_v*'
  workflow_dispatch:
    inputs:
      dry_run:
        description: 'Dry run (build only, no release)'
        type: boolean
        required: false
        default: true

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: false

jobs:
  build:
    name: Build ${{ matrix.platform }}
    runs-on: ${{ matrix.runner }}

    strategy:
      fail-fast: false
      matrix:
        include:
          - platform: macOS ARM64
            runner: macos-latest
            bazel_platform: //crates/formatjs_cli/platforms:darwin_arm64
            artifact_name: formatjs_cli-darwin-arm64
            config: ci-darwin
          - platform: Linux x86_64
            runner: ubuntu-latest
            bazel_platform: //crates/formatjs_cli/platforms:linux_x86_64
            artifact_name: formatjs_cli-linux-x64
            config: ci

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v6

      - name: Setup Bazel
        uses: bazel-contrib/setup-bazel@0.18.0
        with:
          bazelisk-cache: true
          disk-cache: ${{ github.workflow }}-${{ matrix.platform }}
          repository-cache: true

      - name: Build Binary
        run: |
          if [ -n "${{ secrets.BUILDBUDDY_ORG_API_KEY }}" ]; then
            bazel build \
              --config=${{ matrix.config }} \
              --compilation_mode=opt \
              --platforms=${{ matrix.bazel_platform }} \
              --remote_download_outputs=all \
              --remote_header=x-buildbuddy-api-key=${{ secrets.BUILDBUDDY_ORG_API_KEY }} \
              //crates/formatjs_cli:release_binary
          else
            bazel build \
              --compilation_mode=opt \
              --platforms=${{ matrix.bazel_platform }} \
              //crates/formatjs_cli:release_binary
          fi

          # Copy binary to artifacts directory
          mkdir -p artifacts
          cp bazel-bin/crates/formatjs_cli/formatjs_cli_release artifacts/${{ matrix.artifact_name }}
          chmod +x artifacts/${{ matrix.artifact_name }}

      - name: Smoke Test
        run: |
          ./artifacts/${{ matrix.artifact_name }} --version
          ./artifacts/${{ matrix.artifact_name }} --help

      - name: Upload Artifact
        uses: actions/upload-artifact@v7
        with:
          name: ${{ matrix.artifact_name }}
          path: artifacts/${{ matrix.artifact_name }}
          retention-days: 7

  release:
    name: Create Release
    needs: build
    runs-on: ubuntu-latest
    permissions:
      contents: write
    if: ${{ !inputs.dry_run }}

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v6

      - name: Download All Artifacts
        uses: actions/download-artifact@v8
        with:
          path: release/

      - name: Organize Artifacts
        run: |
          # List downloaded artifacts structure for debugging
          ls -R release/

          # Move binaries from subdirectories to release root
          mv release/formatjs_cli-darwin-arm64/formatjs_cli-darwin-arm64 release/formatjs_cli-darwin-arm64.bin
          mv release/formatjs_cli-linux-x64/formatjs_cli-linux-x64 release/formatjs_cli-linux-x64.bin

          # Remove empty directories
          rmdir release/formatjs_cli-darwin-arm64 release/formatjs_cli-linux-x64

          # Rename binaries to final names
          mv release/formatjs_cli-darwin-arm64.bin release/formatjs_cli-darwin-arm64
          mv release/formatjs_cli-linux-x64.bin release/formatjs_cli-linux-x64

      - name: Generate Checksums
        run: |
          cd release
          shasum -a 256 formatjs_cli-* > checksums.txt
          cat checksums.txt

      - name: List Release Artifacts
        run: |
          ls -lh release/
          echo "---"
          echo "Checksums:"
          cat release/checksums.txt

      - name: Create GitHub Release
        if: startsWith(github.ref, 'refs/tags/formatjs_cli_v')
        uses: softprops/action-gh-release@v2
        with:
          files: |
            release/formatjs_cli-darwin-arm64
            release/formatjs_cli-linux-x64
            release/checksums.txt
          body: |
            ## FormatJS Rust CLI Release

            ### Binaries
            - **macOS Apple Silicon**: `formatjs_cli-darwin-arm64`
            - **Linux x86_64**: `formatjs_cli-linux-x64`

            ### Installation

            ```bash
            # macOS (Apple Silicon)
            curl -LO https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/formatjs_cli-darwin-arm64
            chmod +x formatjs_cli-darwin-arm64
            sudo mv formatjs_cli-darwin-arm64 /usr/local/bin/formatjs

            # Linux
            curl -LO https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/formatjs_cli-linux-x64
            chmod +x formatjs_cli-linux-x64
            sudo mv formatjs_cli-linux-x64 /usr/local/bin/formatjs
            ```

            ### Verification

            Verify the checksums:
            ```bash
            curl -LO https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/checksums.txt
            shasum -a 256 -c checksums.txt
            ```
          draft: false
          prerelease: false


================================================
FILE: .github/workflows/stale.yml
================================================
name: 'Close stale issues and PRs'
on:
  schedule:
    - cron: '30 1 * * *'

permissions:
  contents: read

jobs:
  stale:
    permissions:
      issues: write # for actions/stale to close stale issues
      pull-requests: write # for actions/stale to close stale PRs
    runs-on: ubuntu-latest
    steps:
      - uses: actions/stale@v10
        with:
          days-before-stale: 30
          days-before-close: 7
          exempt-issue-labels: 'pinned,security'
          remove-stale-when-updated: true
          remove-issue-stale-when-updated: true
          remove-pr-stale-when-updated: true
          stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 7 days if no further activity occurs. Thank you for your contributions.'
          stale-pr-message: 'This PR has been automatically marked as stale because it has not had recent activity. It will be closed in 7 days if no further activity occurs. Thank you for your contributions.'
          close-issue-message: 'This issue was automatically closed due to inactivity.'
          close-pr-message: 'This PR was automatically closed due to inactivity.'


================================================
FILE: .github/workflows/test.yml
================================================
name: Test

on:
  pull_request:
  push:
    branches:
      - main
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  test:
    runs-on: ${{ matrix.os }}

    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest]
        include:
          - os: ubuntu-latest
            bazel-config: ci
          - os: macos-latest
            bazel-config: ci-darwin

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v6

      - name: Setup Bazel
        uses: bazel-contrib/setup-bazel@0.18.0
        with:
          bazelisk-cache: true
          disk-cache: ${{ github.workflow }}
          repository-cache: true

      - name: Run Tests
        if: matrix.os != 'macos-latest' || github.event_name != 'pull_request'
        run: |
          if [ -n "${{ secrets.BUILDBUDDY_ORG_API_KEY }}" ]; then
            echo "Running with BuildBuddy ${{ matrix.bazel-config }} config"
            bazel test --config=${{ matrix.bazel-config }} --remote_header=x-buildbuddy-api-key=${{ secrets.BUILDBUDDY_ORG_API_KEY }} //...
          else
            echo "Running without BuildBuddy (no API key)"
            bazel test //...
          fi

  rust-cli-test:
    name: Rust CLI - Build & Test (${{ matrix.os }})
    runs-on: ${{ matrix.runner }}

    strategy:
      fail-fast: false
      matrix:
        include:
          - os: macOS
            runner: macos-latest
            config: ci-darwin
          - os: Linux
            runner: ubuntu-latest
            config: ci

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v6

      - name: Setup Bazel
        uses: bazel-contrib/setup-bazel@0.18.0
        with:
          bazelisk-cache: true
          disk-cache: ${{ github.workflow }}-${{ matrix.os }}
          repository-cache: true

      - name: Build Rust CLI
        if: matrix.runner != 'macos-latest' || github.event_name != 'pull_request'
        run: |
          if [ -n "${{ secrets.BUILDBUDDY_ORG_API_KEY }}" ]; then
            echo "Building with BuildBuddy config: ${{ matrix.config }}"
            bazel build \
              --config=${{ matrix.config }} \
              --compilation_mode=opt \
              --remote_download_outputs=all \
              --remote_header=x-buildbuddy-api-key=${{ secrets.BUILDBUDDY_ORG_API_KEY }} \
              //crates/formatjs_cli
          else
            echo "Building without BuildBuddy (no API key)"
            bazel build --compilation_mode=opt //crates/formatjs_cli
          fi

      - name: Smoke Test Binary
        if: matrix.runner != 'macos-latest' || github.event_name != 'pull_request'
        run: |
          BINARY_PATH=bazel-bin/crates/formatjs_cli/formatjs_cli
          echo "Testing binary at: $BINARY_PATH"
          $BINARY_PATH --version
          $BINARY_PATH --help


================================================
FILE: .github/workflows/typesense-index.yml
================================================
name: Update Typesense Search Index

on:
  push:
    branches:
      - main
    paths:
      - 'docs/src/docs/**/*.mdx'
      - 'docs/scripts/build-typesense-index.ts'
      - 'docs/scripts/upload-typesense-index.ts'
      - '.github/workflows/typesense-index.yml'
  workflow_dispatch:

jobs:
  update-index:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v6

      - uses: bazel-contrib/setup-bazel@0.18.0
        with:
          # Avoid downloading Bazel every time.
          bazelisk-cache: true
          # Store build cache per workflow.
          disk-cache: ${{ github.workflow }}
          # Share repository cache between workflows.
          repository-cache: true

      # Build the Typesense index
      - name: Build Typesense Index
        id: build_index
        run: |
          bazel build \
            --config=ci \
            --remote_download_outputs=all \
            --remote_header=x-buildbuddy-api-key=${{ secrets.BUILDBUDDY_ORG_API_KEY }} \
            //docs:typesense_index
          INDEX_PATH=$(readlink -f bazel-bin)/docs/typesense-index.jsonl
          echo "INDEX_PATH=$INDEX_PATH" >> $GITHUB_OUTPUT

      # Verify index file exists
      - name: Verify Index File
        run: |
          INDEX_PATH="${{ steps.build_index.outputs.INDEX_PATH }}"
          if [ ! -f "$INDEX_PATH" ]; then
            echo "Error: Index file does not exist: $INDEX_PATH"
            exit 1
          fi
          echo "Index file created successfully"
          echo "File size: $(du -h "$INDEX_PATH" | cut -f1)"
          echo "Number of documents: $(wc -l < "$INDEX_PATH")"

      # Upload to Typesense
      - name: Upload to Typesense
        run: |
          bazel run --action_env=TYPESENSE_ADMIN_API_KEY //docs:upload_typesense_index_tool -- \
            --file="${{ steps.build_index.outputs.INDEX_PATH }}"
        env:
          TYPESENSE_ADMIN_API_KEY: ${{ secrets.TYPESENSE_ADMIN_API_KEY }}
          TYPESENSE_HOST: 6e4uts1pzdy7wm3fp-1.a1.typesense.net
          TYPESENSE_PROTOCOL: https
          TYPESENSE_PORT: 443


================================================
FILE: .github/workflows/verify-hooks.yml
================================================
name: Verify Commit Hooks

on:
  pull_request:
  push:
    branches:
      - main

jobs:
  verify-hooks:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v6
        with:
          fetch-depth: 100

      - name: Setup pnpm
        uses: pnpm/action-setup@v5
        with:
          version: 10.32.1

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '24'
          cache: 'pnpm'

      - name: Install Dependencies
        run: pnpm install --frozen-lockfile

      - name: Setup Bazel
        uses: bazel-contrib/setup-bazel@0.18.0
        with:
          bazelisk-cache: true
          disk-cache: ${{ github.workflow }}
          repository-cache: true

      - name: Get Changed Files
        id: changed-files
        run: |
          if [ "${{ github.event_name }}" = "pull_request" ]; then
            git fetch origin ${{ github.base_ref }}
            echo "files=$(git diff --name-only origin/${{ github.base_ref }}...HEAD | tr '\n' ' ')" >> $GITHUB_OUTPUT
          else
            # For push events, check the last commit
            echo "files=$(git diff --name-only HEAD~1 HEAD | tr '\n' ' ')" >> $GITHUB_OUTPUT
          fi

      - name: Run Lefthook on Changed Files
        if: steps.changed-files.outputs.files != ''
        run: |
          # Only stage files that exist (not deleted files)
          for file in ${{ steps.changed-files.outputs.files }}; do
            if [ -f "$file" ]; then
              git add "$file"
            fi
          done
          pnpm lefthook run pre-commit
          if [ -n "$(git status --porcelain)" ]; then
            echo "Error: Pre-commit hooks would have made changes. Please run the hooks locally and commit the changes."
            git diff
            exit 1
          fi

      - name: Validate Commit Messages
        if: github.event_name == 'pull_request'
        run: |
          git fetch origin ${{ github.base_ref }}
          commits=$(git rev-list origin/${{ github.base_ref }}..HEAD)

          for commit in $commits; do
            echo "Validating commit: $(git log -1 --oneline $commit)"
            msg_file=$(mktemp)
            git log -1 --format=%B $commit > "$msg_file"
            pnpm lefthook run commit-msg "$msg_file"
            rm "$msg_file"
          done


================================================
FILE: .github/workflows/website.yml
================================================
name: Deploy Docs to Organization GitHub Pages

on:
  push:
    branches:
      - main # The branch where updates are made in the source repo

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      # Checkout the repository
      - name: Checkout Repository
        uses: actions/checkout@v6

      - uses: bazel-contrib/setup-bazel@0.18.0
        with:
          # Avoid downloading Bazel every time.
          bazelisk-cache: true
          # Store build cache per workflow.
          disk-cache: ${{ github.workflow }}
          # Share repository cache between workflows.
          repository-cache: true

      # Build the docs site
      - name: Build Docs Site
        id: build
        run: |
          bazel build \
            --config=ci \
            --remote_download_outputs=all \
            --remote_header=x-buildbuddy-api-key=${{ secrets.BUILDBUDDY_ORG_API_KEY }} \
            //docs:dist
          BUILD_PATH=$(readlink -f bazel-bin)/docs/dist/client
          echo "BUILD_PATH=$BUILD_PATH" >> $GITHUB_OUTPUT

      # Verify build folder is not empty
      - name: Verify Build Output
        run: |
          BUILD_PATH="${{ steps.build.outputs.BUILD_PATH }}"
          if [ ! -d "$BUILD_PATH" ]; then
            echo "Error: Build path does not exist: $BUILD_PATH"
            exit 1
          fi
          if [ -z "$(ls -A "$BUILD_PATH")" ]; then
            echo "Error: Build path is empty: $BUILD_PATH"
            exit 1
          fi
          echo "Build verification successful. Contents of $BUILD_PATH:"
          ls -lh "$BUILD_PATH"

      # Deploy to Organization GitHub Pages Repository
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v4
        with:
          deploy_key: ${{ secrets.WEBSITE_SECRET_KEY }}
          external_repository: formatjs/formatjs.github.io
          publish_branch: main # default: gh-pages
          publish_dir: ${{ steps.build.outputs.BUILD_PATH }}


================================================
FILE: .gitignore
================================================
bazel-*
dist
node_modules
.cache
.bazelrc.user
*.log
.idea
.css
build/
.DS_Store
.op
release/
!release/BUILD.bazel
target

# Generated files
docs/src/search-index.generated.json
docs/typesense-index.jsonl

# Environment files
docs/.env
.env
.env.local

================================================
FILE: .npmrc
================================================
registry=https://registry.npmjs.org/

================================================
FILE: .oxfmtrc.json
================================================
{
  "$schema": "./node_modules/oxfmt/configuration_schema.json",
  "arrowParens": "avoid",
  "bracketSpacing": false,
  "endOfLine": "lf",
  "semi": false,
  "singleQuote": true,
  "trailingComma": "es5",
  "printWidth": 80,
  "ignorePatterns": [
    ".cache",
    ".claude",
    ".vscode",
    "**/__snapshots__/*",
    "**/CHANGELOG.md",
    "**/package.json",
    "bazel-out",
    "dist",
    "locale-data",
    "package.json",
    "packages/*/CHANGELOG.md",
    "packages/cli-lib/tests/extract/typescript/err.tsx",
    "packages/cli/integration-tests/extract/typescript/err.tsx",
    "target",
  ]
}


================================================
FILE: .oxlintrc.json
================================================
{
  "$schema": "./node_modules/oxlint/configuration_schema.json",
  "plugins": ["import", "typescript", "react", "jsx-a11y"],
  "categories": {
    "correctness": "error"
  },
  "env": {
    "builtin": true,
    "es2026": true,
    "browser": true
  },
   "rules": {
    "typescript/consistent-type-imports": ["error", {
      "fixStyle": "separate-type-imports",
      "prefer": "type-imports"
    }]
  }
}


================================================
FILE: .syncpackrc.json
================================================
{
  "dependencyTypes": [
    "dev",
    "engines",
    "peer",
    "prod"
  ],
  "sortFirst": [
    "name",
    "description",
    "version",
    "license",
    "author",
    "private",
    "type",
    "sideEffects",
    "source",
    "types",
    "exports",
    "imports",
    "engines",
    "scripts",
    "dependencies",
    "devDependencies",
    "peerDependencies",
    "peerDependencies"
  ],
  "sortExports": [
    "types",
    "node-addons",
    "edge-light",
    "node",
    "browser",
    "import",
    "require",
    "development",
    "production",
    "default"
  ],
  "customTypes": {
    "engines": {
      "path": "engines",
      "strategy": "versionsByName"
    }
  },
  "semverGroups": [
    {
      "range": "exact",
      "dependencies": [
        "typescript"
      ]
    }
  ],
  "versionGroups": [
    {
      "label": "Use workspace protocol when developing local packages",
      "dependencies": [
        "$LOCAL"
      ],
      "pinVersion": "workspace:*"
    },
    {
      "label": "React packages",
      "dependencies": [
        "react",
        "react-dom",
        "@types/react",
        "@types/react-dom"
      ],
      "pinVersion": "19"
    },
    {
      "label": "Glimmer",
      "dependencies": [
        "@glimmer/syntax"
      ],
      "packages": [
        "!formatjs-repo"
      ],
      "pinVersion": "^0.84.3 || ^0.95.0"
    },
    {
      "label": "Typescript",
      "dependencies": [
        "typescript"
      ],
      "packages": [
        "!formatjs-repo"
      ],
      "pinVersion": "^5.6.0"
    },
    {
      "label": "ESLint",
      "dependencies": [
        "eslint"
      ],
      "packages": [
        "eslint-plugin-formatjs"
      ],
      "pinVersion": "9 || 10"
    },
    {
      "label": "Typescript root",
      "dependencies": [
        "typescript"
      ],
      "packages": [
        "formatjs-repo"
      ],
      "pinVersion": "5.9.3"
    },
    {
      "label": "Vue",
      "dependencies": [
        "vue",
        "@vue/compiler-core",
        "@vue/compiler-dom"
      ],
      "pinVersion": "^3.5.0"
    },
    {
      "label": "Vite",
      "dependencies": [
        "vite"
      ],
      "isIgnored": true
    },
    {
      "label": "Unplugin bundler peer deps",
      "dependencies": [
        "@rspack/core",
        "esbuild",
        "rollup"
      ],
      "isIgnored": true
    }
  ]
}

================================================
FILE: .vscode/extensions.json
================================================
{
  "recommendations": [
    "dbaeumer.vscode-eslint",
    "foxundermoon.shell-format",
    "TypeScriptTeam.native-preview",
    "oxc.oxc-vscode"
  ]
}


================================================
FILE: .vscode/settings.json
================================================
{
  "files.exclude": {
    "**/.git": true,
    "**/.svn": true,
    "**/.hg": true,
    "**/CVS": true,
    "**/.DS_Store": true,
    ".yarn": true,
    "test262": true,
    "**/.classpath": true,
    "**/.project": true,
    "**/.settings": true,
    "**/.factorypath": true,
    "dist": true,
    ".swc": true
  },
  "files.watcherExclude": {
    "**/.git/objects/**": true,
    "**/.git/subtree-cache/**": true,
    "**/node_modules/*/**": true,
    "test262/**": true,
    "**/test_artifacts/**": true,
    "**/*.map": true,
    "**/*.d.ts.map": true,
    "bazel-out": true
  },
  "search.exclude": {
    "**/node_modules": true,
    "**/bower_components": true,
    "**/*.code-search": true,
    "**/lib": true,
    "**/dist": true,
    "**/dist-es6": true,
    "bazel-out": true
  },
  "json.schemas": [
    {
      "fileMatch": ["/lerna.json"],
      "url": "http://json.schemastore.org/lerna"
    }
  ],
  "typescript.tsdk": "node_modules/typescript/lib",
  "npm.packageManager": "pnpm",
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "oxc.oxc-vscode",
  "editor.codeActionsOnSave": {
    "source.fixAll": "always",
    "source.fixAll.eslint": "always"
  },
  "[shellscript]": {
    "editor.defaultFormatter": "foxundermoon.shell-format"
  },
  "[starlark]": {
    "editor.defaultFormatter": "BazelBuild.vscode-bazel"
  },
  "[ignore]": {
    "editor.defaultFormatter": "foxundermoon.shell-format"
  },
  "[rust]": {
    "editor.defaultFormatter": "rust-lang.rust-analyzer"
  },
  "[json]": {
    "editor.defaultFormatter": "vscode.json-language-features"
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "TypeScriptTeam.native-preview"
  }
}


================================================
FILE: .vscode/tasks.json
================================================
{
  "version": "2.0.0",
  "tasks": [
    {
      "type": "npm",
      "script": "dev:cjs",
      "problemMatcher": ["$tsc-watch"],
      "label": "yarn: dev:cjs",
      "detail": "tsc -b packages/* --watch",
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}


================================================
FILE: BUILD.bazel
================================================
load("@aspect_bazel_lib//lib:copy_to_bin.bzl", "copy_to_bin")
load("@aspect_bazel_lib//lib:copy_to_directory.bzl", "copy_to_directory")
load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_files")
load("@aspect_rules_js//npm:defs.bzl", "npm_link_package")
load("@npm//:defs.bzl", "npm_link_all_packages")
load("@npm//:oxfmt/package_json.bzl", oxfmt = "bin")
load("@rules_multirun//:defs.bzl", "multirun")
load("//tools:tsconfig.bzl", "BASE_TSCONFIG")

npm_link_all_packages()

exports_files(
    [
        "Cargo.toml",
        "Cargo.lock",
    ],
    visibility = ["//:__subpackages__"],
)

genrule(
    name = "pnpm_workspace_config",
    srcs = [],
    outs = ["pnpm-workspace.yaml"],
    cmd = "echo 'packages:\n\
  - 'packages/*' \
' > $@",
)

PACKAGES_TO_DIST = [
    "//packages/babel-plugin-formatjs",
    "//packages/bigdecimal",
    "//packages/cli-lib",
    "//packages/cli",
    "//packages/ecma376",
    "//packages/ecma402-abstract",
    "//packages/eslint-plugin-formatjs",
    "//packages/fast-memoize",
    "//packages/icu-messageformat-parser",
    "//packages/icu-messageformat-parser-wasm",
    "//packages/icu-skeleton-parser",
    "//packages/intl-datetimeformat",
    "//packages/intl-displaynames",
    "//packages/intl-durationformat",
    "//packages/intl-supportedvaluesof",
    "//packages/intl-getcanonicallocales",
    "//packages/intl-listformat",
    "//packages/intl-locale",
    "//packages/intl-localematcher",
    "//packages/intl-messageformat",
    "//packages/intl-numberformat",
    "//packages/intl-pluralrules",
    "//packages/intl-relativetimeformat",
    "//packages/intl-segmenter",
    "//packages/intl",
    "//packages/react-intl",
    "//packages/svelte-intl",
    "//packages/ts-transformer",
    "//packages/unplugin",
    "//packages/utils",
    "//packages/vue-intl",
]

PACKAGE_DIRNAMES = [p.split("packages/")[1] for p in PACKAGES_TO_DIST]

# pnpm_bin.pnpm(
#    name="deploy",
#    srcs=[":dist"],
#    out_dirs=["deploy_result"],
#    chdir="$(rootpath :dist)",
#    args=["deploy", "--filter", "@formatjs/cli-lib", "../$(@D)"]
# )

copy_to_directory(
    name = "dist",
    srcs = [
        # to verify, run verdaccio at port 4000 and enable this
        ":pnpm_workspace_config",
        "package.json",
        "pnpm-lock.yaml",
    ] + ["%s:pkg" % pkg for pkg in PACKAGES_TO_DIST] + glob(["patches/*"]),
    out = "formatjs_dist",
    replace_prefixes = {k: v for k, v in [(
        "packages/%s/pkg" % p,
        "packages/%s" % p,
    ) for p in PACKAGE_DIRNAMES]},
)

multirun(
    name = "generated-test-files",
    testonly = True,
    commands = [
        "//packages/intl-datetimeformat:test262-main",
        "//packages/intl-datetimeformat:generated-test-files",
        "//packages/intl-displaynames:test262-main",
        "//packages/intl-displaynames:generated-test-files",
        "//packages/intl-listformat:test262-main",
        "//packages/intl-listformat:generated-test-files",
        "//packages/intl-numberformat:test262-main",
        "//packages/intl-numberformat:generated-test-files",
        "//packages/intl-pluralrules:test262-main",
        "//packages/intl-pluralrules:generated-test-files",
        "//packages/intl-relativetimeformat:test262-main",
        "//packages/intl-relativetimeformat:generated-test-files",
        "//packages/intl-segmenter:test262-main",
        "//packages/intl-segmenter:generated-files",
        "//packages/intl-getcanonicallocales:aliases",
    ],
)

multirun(
    name = "generated-files",
    testonly = True,
    commands = [
        "//packages/intl-datetimeformat:supported-locales",
        "//packages/intl-displaynames:supported-locales",
        "//packages/intl-listformat:supported-locales",
        "//packages/intl-numberformat:supported-locales",
        "//packages/intl-pluralrules:supported-locales",
        "//packages/intl-relativetimeformat:supported-locales",
        "//packages/intl-segmenter:generated-files",
    ],
)

multirun(
    name = "cldr-gen",
    testonly = True,
    jobs = 0,  # Run all targets in parallel
    commands = [
        "//packages/icu-messageformat-parser:time-data",
        "//packages/intl-datetimeformat:all-tz",
        "//packages/intl-datetimeformat:links",
        "//packages/intl-datetimeformat:supported-locales",
        "//packages/intl-datetimeformat:test262-main",
        "//packages/intl-displaynames:supported-locales",
        "//packages/intl-displaynames:test262-main",
        "//packages/intl-durationformat:numbering-systems",
        "//packages/intl-durationformat:time-separators",
        "//packages/intl-supportedvaluesof:calendars",
        "//packages/intl-supportedvaluesof:collations",
        "//packages/intl-supportedvaluesof:currencies",
        "//packages/intl-supportedvaluesof:numbering-systems",
        "//packages/intl-supportedvaluesof:timezones",
        "//packages/intl-supportedvaluesof:units",
        "//packages/intl-getcanonicallocales:aliases",
        "//packages/intl-getcanonicallocales:likelySubtags",
        "//packages/intl-listformat:supported-locales",
        "//packages/intl-listformat:test262-main",
        "//packages/intl-locale:calendars",
        "//packages/intl-locale:character-orders",
        "//packages/intl-locale:hour-cycles",
        "//packages/intl-locale:numbering-systems",
        "//packages/intl-locale:timezones",
        "//packages/intl-locale:week-data",
        "//packages/intl-numberformat:currency-digits",
        "//packages/intl-numberformat:numbering-systems",
        "//packages/intl-numberformat:supported-locales",
        "//packages/intl-numberformat:test262-main",
        "//packages/intl-pluralrules:supported-locales",
        "//packages/intl-pluralrules:test262-main",
        "//packages/intl-relativetimeformat:supported-locales",
        "//packages/intl-relativetimeformat:test262-main",
        "//packages/intl-segmenter:generate-cldr-segmentation-rules",
        "//packages/intl-segmenter:test262-main",
        "//packages/utils:default-currency",
        "//packages/utils:default-locale",
    ],
)

copy_to_bin(
    name = "tsconfig",
    srcs = ["tsconfig.json"],
    visibility = ["//visibility:public"],
)

# Generate tsconfig.json from BASE_TSCONFIG in tools/tsconfig.bzl
genrule(
    name = "tsconfig_generated",
    outs = ["tsconfig.generated.json"],
    cmd = "echo '%s' > $@" % json.encode_indent(
        BASE_TSCONFIG,
        indent = "  ",
    ),
)

# Format the generated tsconfig.json with oxfmt
# Use genrule with proper BAZEL_BINDIR set, and include oxfmt's config in srcs
genrule(
    name = "tsconfig_formatted",
    srcs = [
        ":tsconfig_generated",
        ":oxfmtrc",
    ],
    outs = ["tsconfig.formatted.json"],
    cmd = "cat $(location :tsconfig_generated) | $(location //:oxfmt) --stdin-filepath=$(location :tsconfig_generated) > $@",
    tools = ["//:oxfmt"],
)

# Ensure tsconfig.json stays in sync with BASE_TSCONFIG
write_source_files(
    name = "tsconfig_sync",
    files = {
        "tsconfig.json": ":tsconfig_formatted",
    },
)

# Symlink some workspaces to the root workspace, so scripts like benchmarks
# can easily depend on the distributable package via target `//:node_modules/<package_name>`.
npm_link_package(
    name = "node_modules/@formatjs/intl-pluralrules",
    src = "//packages/intl-pluralrules",
)

npm_link_package(
    name = "node_modules/@formatjs/intl-localematcher",
    src = "//packages/intl-localematcher",
)

copy_to_bin(
    name = "oxfmtrc",
    srcs = [".oxfmtrc.json"],
    visibility = ["//visibility:public"],
)

oxfmt.oxfmt_binary(
    name = "oxfmt",
    data = [
        ":oxfmtrc",
    ],
    env = {"BAZEL_BINDIR": "."},
    fixed_args = [
        "--config=\"$$JS_BINARY__RUNFILES\"/$(rlocationpath //:oxfmtrc)",
    ],
    visibility = ["//visibility:public"],
)


================================================
FILE: CLAUDE.md
================================================
# Instructions for Claude Code

## Critical Rules

### 1. NEVER Run `bazel clean`

- **NEVER** run `bazel clean` or `bazel clean --expunge` in this repository
- These commands destroy the build cache and significantly slow down builds (can take 10+ minutes to rebuild)
- If you need to rebuild something, use specific targets instead: `bazel build //path/to:target`

### 2. Always Use Bazel Commands

This repository uses Bazel as its build system. Always use `bazel` commands, not `npm`, `yarn`, or `pnpm` directly.

**Common commands:**

```bash
# Run all tests
bazel test //...

# Run tests for a specific package
bazel test //packages/intl-localematcher:unit_test

# Build a package
bazel build //packages/intl-localematcher:dist

# Build all packages
bazel build //packages/...

# Run a benchmark (JS/TS)
bazel run //packages/intl-localematcher/benchmark:benchmark
bazel run //packages/intl-localematcher/benchmark:bestfit_benchmark

# Run with profiling
bazel run //packages/intl-localematcher/benchmark:profile_cpu

# Test with verbose output
bazel test //packages/intl-localematcher:unit_test --test_output=all
bazel test <target> --test_output=errors

# Query test targets
bazel query 'kind(test, //packages/...)'
```

### 3. Package Structure

- Packages are located in `packages/`
- Each package has:
  - `BUILD.bazel` - Bazel build configuration
  - `package.json` - npm package metadata
  - `src/` - Source code
  - `tests/` - Unit tests
  - `benchmark/` (optional) - Performance benchmarks
- Rust crates are in `crates/`

### 4. Polyfill Development

- When working on polyfills, always cross-check with the [LDML spec](https://unicode.org/reports/tr35/) and [ICU4J](https://unicode-org.github.io/icu-docs/apidoc/released/icu4j/) source
- Each Intl polyfill follows the ECMA-402 specification
- Polyfills only activate when native support is missing or buggy
- Uses CLDR data for locale-specific formatting rules
- Data is tree-shakeable and can be selectively imported

### 5. Testing

- Tests use Vitest and are defined in `BUILD.bazel` files
- Run all tests: `bazel test //...`
- Tests must pass before merging PRs
- Conformance tests: `bazel test //packages/cli/integration-tests:conformance_test`
- Rust CLI tests: `bazel test //crates/formatjs_cli:formatjs_cli_test`

### 6. Performance Benchmarks

- JS/TS benchmarks are in `packages/*/benchmark/` directories using `tinybench`
- Rust benchmarks are in `crates/*/benches/` directories using Criterion
- **CRITICAL**: Always use `-c opt` for Rust benchmarks to enable release optimizations
  - Example: `bazel run -c opt //crates/icu_messageformat_parser:comparison_bench`
  - Without `-c opt`, benchmarks run in debug mode and are ~10x slower
- Always verify performance after optimizations

### 7. Commit Message Format

All commit messages must follow the [Conventional Commits](https://www.conventionalcommits.org/) specification:

```
<type>(<scope>): <subject>

[optional body]

[optional footer(s)]
```

**Types:**
- `feat`: A new feature
- `fix`: A bug fix
- `docs`: Documentation only changes
- `style`: Changes that don't affect the code's meaning (white-space, formatting, etc)
- `refactor`: Code change that neither fixes a bug nor adds a feature
- `perf`: Performance improvement
- `test`: Adding missing tests or correcting existing tests
- `build`: Changes that affect the build system or external dependencies
- `ci`: Changes to CI configuration files and scripts
- `chore`: Other changes that don't modify src or test files

**Scope:** The scope should be the full package name from package.json (e.g., `@formatjs/cli`, `@formatjs/cli-lib`, `@formatjs/ts-transformer`, `@formatjs/intl-localematcher`)

**Examples:**
```bash
feat(@formatjs/cli): add support for custom extractors
fix(@formatjs/cli-lib): respect throws flag in extract() function
test(@formatjs/cli): add integration tests for throws flag
docs(@formatjs/cli): update README with new options
perf(@formatjs/intl-localematcher): optimize lookup algorithm
```

**Breaking Changes:**
If a commit introduces a breaking change, add `BREAKING CHANGE:` in the footer or append `!` after the type/scope:
```bash
feat(@formatjs/cli)!: remove deprecated --legacy flag

BREAKING CHANGE: The --legacy flag has been removed. Use --new-flag instead.
```

## Repository Context

### Overview

FormatJS is a set of libraries that provide internationalization (i18n) support for JavaScript/TypeScript applications. The repository is a monorepo managed with Bazel, containing multiple npm packages that work together to provide comprehensive i18n functionality.

**Website**: https://formatjs.io
**GitHub**: https://github.com/formatjs/formatjs
**Documentation**: https://formatjs.io/docs/getting-started/installation

### Main Packages

#### Core Internationalization Packages

- **`@formatjs/intl`** - Main package that provides ICU MessageFormat support
- **`@formatjs/intl-localematcher`** - Implements UTS #35 locale matching algorithms (BestFit and Lookup matchers)
  - Recently optimized for 439x performance improvement (issue #4936)
  - Handles complex locale matching: exact matches, maximization, fallbacks, and CLDR distance calculations
  - Critical for all other Intl polyfills
- **`@formatjs/ecma402-abstract`** - Shared ECMA-402 abstract operations used by all polyfills

#### Intl Polyfills

These packages provide polyfills for Intl APIs that may not be available in all environments:

- **`@formatjs/intl-numberformat`** - Number formatting (Intl.NumberFormat)
- **`@formatjs/intl-datetimeformat`** - Date/time formatting (Intl.DateTimeFormat)
- **`@formatjs/intl-durationformat`** - Duration formatting (Intl.DurationFormat)
- **`@formatjs/intl-relativetimeformat`** - Relative time formatting (Intl.RelativeTimeFormat)
- **`@formatjs/intl-listformat`** - List formatting (Intl.ListFormat)
- **`@formatjs/intl-pluralrules`** - Plural rules (Intl.PluralRules)
- **`@formatjs/intl-displaynames`** - Display names (Intl.DisplayNames)
- **`@formatjs/intl-segmenter`** - Text segmentation (Intl.Segmenter)
- **`@formatjs/intl-locale`** - Locale information (Intl.Locale)
- **`@formatjs/intl-getcanonicallocales`** - Canonical locale names

#### Framework Integrations

- **`react-intl`** - React components and hooks for i18n
- **`vue-intl`** - Vue.js integration

#### Developer Tools

- **`@formatjs/cli`** - Command-line tools for message extraction and compilation
- **`babel-plugin-formatjs`** - Babel plugin for compile-time message extraction
- **`@formatjs/ts-transformer`** - TypeScript transformer for message extraction
- **`eslint-plugin-formatjs`** - ESLint rules for i18n best practices

#### Parsers

- **`@formatjs/icu-messageformat-parser`** - ICU MessageFormat parser (JavaScript/TypeScript)
  - High-performance hand-written parser
  - Used at runtime for message parsing
- **`crates/icu_messageformat_parser`** - Rust implementation of ICU MessageFormat parser
  - **2.6-3.7x faster than JavaScript** parser (with optimized build)
  - Used for WASM compilation and native tooling
  - Run benchmarks: `bazel run -c opt //crates/icu_messageformat_parser:comparison_bench`
- **`@formatjs/icu-skeleton-parser`** - Number/date skeleton parser

### Architecture & Key Concepts

#### 1. Locale Matching (Recent Focus)

The `intl-localematcher` package implements a three-tier optimization for locale matching:

- **Tier 1**: O(1) exact match using Set lookup
- **Tier 2**: Maximization + progressive subtag removal fallback
- **Tier 3**: Full UTS #35 CLDR distance calculation with memoization

This optimization was critical for fixing issue #4936, where React Native/Hermes environments experienced 610ms delays when instantiating formatters with 700+ auto-loaded locales. The optimization reduced this to ~1.4ms (439x faster).

#### 2. Polyfill Strategy

- Each Intl polyfill follows the ECMA-402 specification
- Polyfills only activate when native support is missing or buggy
- Uses CLDR data for locale-specific formatting rules
- Data is tree-shakeable and can be selectively imported

#### 3. CLDR Data

- Uses Unicode CLDR (Common Locale Data Repository) for locale data
- Data files are generated from CLDR JSON and stored in `locale-data/` directories
- Supports 700+ locales from CLDR
- Scripts in `scripts/` directories generate locale data files

#### 4. Build System (Bazel)

- Uses Bazel for reproducible builds and caching
- BuildBuddy provides remote caching and execution for CI
- Each package has its own `BUILD.bazel` file
- Tests use Vitest via Bazel's vitest rule

### Rust CLI Development

- Location: `crates/formatjs_cli/`
- Binary: `bazel-bin/crates/formatjs_cli/formatjs_cli`
- 176 unit tests

### Conformance Testing (Rust CLI vs TypeScript CLI)

- Test suite: `packages/cli/integration-tests/conformance-tests/`
- 20 test cases, 60 total tests (20 TS CLI, 20 Rust CLI, 20 cross-comparisons)
- Current status: 60/60 passing (100% conformance)

**Key issues resolved:**

1. **Whitespace Normalization (#6021)**: `normalize_whitespace()` in `crates/formatjs_cli/src/extractor.rs` — normalizes newlines/tabs/multiple spaces to single spaces while preserving non-breaking spaces (U+00A0) via placeholder technique
2. **Hash Generation Timing**: TypeScript hashes AFTER flattening; Rust CLI must match — hash the flattened message in `crates/formatjs_cli/src/extract.rs`
3. **Non-Breaking Space**: `split_whitespace()` treats U+00A0 as whitespace; use placeholder replacement before/after normalization

### Formatter Output Differences

- **Crowdin**: `"message"` and `"description"` fields
- **Lokalise**: `"translation"` and `"notes"` fields
- **Transifex**: `"string"` and `"developer_comment"` fields
- **Smartling**: Adds metadata with `"string_format"`, `"translate_paths"`, `"variants_enabled"`

### Key Files

- `.bazelrc` - Bazel configuration (remote caching, build flags)
- `pnpm-workspace.yaml` - pnpm workspace configuration
- `pnpm-lock.yaml` - Dependency lockfile
- `MODULE.bazel` - Bazel module configuration (bzlmod)
- `BUILD.bazel` files - Per-package build configuration
- `package.json` files - npm package metadata

### Dependencies

- **Runtime**: No runtime dependencies (polyfills are self-contained)
- **Build Time**: Bazel, TypeScript, Vitest, CLDR data
- **Tooling**: pnpm for package management, BuildBuddy for remote caching

### Important Notes

- All polyfills are designed to be tree-shakeable
- Locale data can be selectively imported to reduce bundle size
- The repository follows ECMA-402 specifications strictly
- Performance is a key concern, especially for React Native/mobile environments
- Code changes should include tests and avoid breaking changes


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

- The use of sexualized language or imagery and unwelcome sexual attention or
  advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic
  address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at formatjsproject@gmail.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

Pull requests are very welcome, but should be within the scope of the project, and follow the repository's code conventions. Before submitting a pull request, it's always good to file an issue, so we can discuss the details of the PR.

## Reporting a Bug

1. Ensure you've replicated the issue against `main`. There is a chance the issue may have already been fixed.

2. Search for any similar issues (both opened and closed). There is a chance someone may have reported it already.

3. Provide a demo of the bug isolated in a codesandbox.io. Sometimes this is not a possibility, in which case provide a detailed description along with any code snippets that would help in triaging the issue. If we cannot reproduce it, we will close it.

4. The best way to demonstrate a bug is to build a failing test. This is not required, however, it will generally speed up the development process.

## Submitting a pull request

1. [Fork](https://github.com/formatjs/formatjs/fork/) the repository.

1. Ensure that all tests are passing prior to submitting.

1. If you are adding new functionality, or fixing a bug, provide test coverage.

1. Follow syntax guidelines detailed below.

1. Push the changes to your fork and submit a pull request. If this resolves any issues, please mark in the body `fix #ID` within the body of your pull request. This allows for github to automatically close the related issue once the pull request is merged.

1. Last step, [submit the pull request](https://github.com/formatjs/formatjs/compare/)!

## Development

### Requirements

- [`bazel`](https://bazel.build/)

You can build & test with `pnpm`. At the moment version >= 9 is not supported:

```sh
pnpm i && pnpm t
```

### Build System Architecture

This repository uses a highly optimized TypeScript build pipeline with Bazel:

#### Fast Parallel Type Checking with tsgo

Type checking is performed using [tsgo](https://github.com/microsoft/TypeScript/tree/main/packages/ts-native-preview) from `@typescript/native-preview`, a native TypeScript type checker that's significantly faster than `tsc`:

- Type checking runs in parallel with code generation
- Uses `no_emit = True` to skip generating files (only validates types)
- Configured via the `transpiler` attribute in `ts_project` targets

#### Fast Transpilation with oxc-transform

Code generation uses [oxc-transform](https://oxc.rs/docs/guide/usage/transform.html), a Rust-based transpiler:

- **439x faster** than tsc for JavaScript transpilation
- **20-40x faster** than tsc for TypeScript declaration generation
- Handles both TypeScript → JavaScript and `.d.ts` file generation
- Respects `verbatimModuleSyntax` for proper type-only import handling
- Uses isolated declarations for fast `.d.ts` generation
- **Note**: Source code must avoid rest parameters with default values (e.g., `...[value, options = {}]`) as oxc's isolated declarations incorrectly preserves these in `.d.ts` files, causing tsc errors

#### How It Works

For every TypeScript compilation target, two separate Bazel targets are created:

1. **Type Check Target** (`<name>-typecheck`):
   - Uses tsgo with `no_emit = True`
   - Runs in parallel with transpilation
   - Fast type validation without generating files

2. **Transpile Target** (`<name>`):
   - Uses oxc-transform for both `.js` and `.d.ts` file generation
   - Declaration files use isolated declarations for speed
   - Preserves directory structure

This separation allows both operations to run in parallel, dramatically improving build times.

#### Type Safety Requirements

The repository uses `verbatimModuleSyntax: true` in `tsconfig.json`. This means:

- **Type-only imports must use `import type`**:
  ```typescript
  // ✅ Correct
  import type { MyType } from './types.js'

  // ❌ Wrong - will cause build errors
  import { MyType } from './types.js'
  ```

- **Type-only exports must use `export type`**:
  ```typescript
  // ✅ Correct
  export type { MyType } from './types.js'

  // ❌ Wrong - will cause runtime errors
  export { MyType } from './types.js'
  ```

This ensures compatibility with fast transpilers that operate in isolated mode without full type information.

#### Implementation Files

The transpiler infrastructure is located in:

- [`tools/index.bzl`](tools/index.bzl) - Main compilation macros (`ts_compile`, `ts_compile_node`)
- [`tools/vitest.bzl`](tools/vitest.bzl) - Test compilation with tsgo
- [`tools/oxc_transpiler.bzl`](tools/oxc_transpiler.bzl) - Custom Bazel rule for oxc-transform
- [`tools/oxc-transpiler/`](tools/oxc-transpiler/) - Node.js wrapper for oxc-transform CLI

### Releases

Releases are automated via GitHub Actions. To publish a new release:

1. Bump package versions by running the prerelease script locally:

```sh
# Make sure you have GH_TOKEN setup as indicated by:
# https://github.com/lerna/lerna/blob/05ad1860e2da7fc16c9c0a072c9389e94792ab64/commands/version/README.md#--create-release-type
GH_TOKEN=xxxxxxx npm run prerelease
```

2. Commit and push the version changes to the `main` branch

3. GitHub Actions will automatically build and publish all packages to npm using [Trusted Publishing (OIDC)](https://docs.npmjs.com/trusted-publishers/)

### Updating tzdata version

`tzdata` requires `Docker` to be installed. This is because tzdata compilation requires `make`.

1. Change `IANA_TZ_VERSION` in [packages/intl-datetimeformat/index.bzl](https://github.com/formatjs/formatjs/blob/main/packages/intl-datetimeformat/index.bzl) to the desired version

1. Update the sha256 for tzdata & tzcode targets

1. Run the Docker image & update the tz_data.tar.gz

```sh
bazel run //packages/intl-datetimeformat:update_tz_data
```

1. Test to make sure everything passes

1. New TimeZones or renames of TimeZones are not updated using the Bazel script. You need to manually update `index.bzl`.

### Updating test snapshots

You can update the snapshot by running the test target + `_update_snapshots`, e.g

```sh
bazel run //packages/cli/integration-tests:compile_folder_integration_test_update_snapshots
```

### Generating CLDR data

#### Regenerate all CLDR data at once

To regenerate all CLDR-related data files across all packages:

```sh
bazel run //:cldr-gen
```

This will run all CLDR generation targets in parallel (identified by the `cldr` tag).

#### Regenerate specific CLDR data

1. Check out `./BUILD.bazel` file for generatable data — which are identifiable via `generate_src_file()` call

```starlark
   generate_src_file(
     name = "regex",
     ...
   )
```

2. Run update script

```sh
   bazel run //packages/icu-messageformat-parser:regex.update
```

3. Verify

```sh
   bazel run //packages/icu-messageformat-parser:regex
```

### Working on `formatjs.github.io` website

The documentation website is built with Vike (React framework with SSR). To run the website locally:

```sh
bazel run //docs:serve
```

Or using npm scripts:

```sh
npm run docs
```

To build the production site:

```sh
bazel build //docs:dist
```

The documentation is automatically deployed to GitHub Pages when changes are pushed to the `main` branch via the GitHub Actions workflow.


================================================
FILE: Cargo.toml
================================================
[workspace]
members = [
  "crates/icu_skeleton_parser",
  "crates/icu_messageformat_parser",
  "crates/formatjs_cli",
  "packages/icu-messageformat-parser/integration-tests",
]
resolver = "3"

[workspace.dependencies]
pretty_assertions = "1.4"


================================================
FILE: MODULE.bazel
================================================
module(
    name = "formatjs",
    version = "1.0",
)

######### Bazel core rules #########

bazel_dep(name = "platforms", version = "1.0.0")
bazel_dep(name = "rules_shell", version = "0.6.1")

######### JS & Node.js rules #########

bazel_dep(name = "aspect_rules_js", version = "3.0.3")

####### Node.js version #########
# By default you get the node version from DEFAULT_NODE_VERSION in @rules_nodejs//nodejs:repositories.bzl
# Optionally you can pin a different node version:
bazel_dep(name = "rules_nodejs", version = "6.7.3")

node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node", dev_dependency = True)
node.toolchain(
    node_version = "24.14.0",
    node_repositories = {
        "24.14.0-darwin_arm64": ("node-v24.14.0-darwin-arm64.tar.gz", "node-v24.14.0-darwin-arm64", "a1a54f46a750d2523d628d924aab61758a51c9dad3e0238beb14141be9615dd3"),
        "24.14.0-darwin_amd64": ("node-v24.14.0-darwin-x64.tar.gz", "node-v24.14.0-darwin-x64", "f2879eb810e25993a0578e5d878930266fd2eafcffe9f2839b3d8db354d4879e"),
        "24.14.0-linux_arm64": ("node-v24.14.0-linux-arm64.tar.xz", "node-v24.14.0-linux-arm64", "e7adfca03d9173276114a6f2219df1a7d25e1bfd6bbd771d3f839118a2053094"),
        "24.14.0-linux_amd64": ("node-v24.14.0-linux-x64.tar.xz", "node-v24.14.0-linux-x64", "41cd79bb7877c81605a9e68ec4c91547774f46a40c67a17e34d7179ef11729df"),
        "24.14.0-windows_amd64": ("node-v24.14.0-win-x64.zip", "node-v24.14.0-win-x64", "313fa40c0d7b18575821de8cb17483031fe07d95de5994f6f435f3b345f85c66"),
    },
)

#################################

npm = use_extension("@aspect_rules_js//npm:extensions.bzl", "npm", dev_dependency = True)
npm.npm_translate_lock(
    name = "npm",
    data = [
        "//:patches/@types__mdx.patch",
        "//:patches/@vue+compiler-sfc.patch",
        "//:patches/unicode-match-property-ecmascript@2.0.0.patch",
        "//:patches/unicode-match-property-value-ecmascript@2.2.1.patch",
    ],
    npmrc = "//:.npmrc",
    patch_args = {"*": ["-p1"]},
    pnpm_lock = "//:pnpm-lock.yaml",
)
use_repo(npm, "npm")

pnpm = use_extension("@aspect_rules_js//npm:extensions.bzl", "pnpm")

# Choose a different version of pnpm - note that only the "root" module may do this,
# not some transitive dependency.
pnpm.pnpm(
    name = "pnpm",
    pnpm_version = "10.4.1",
)

# Allows developers to use the matching pnpm version, for example:
# bazel run -- @pnpm --dir /home/runner/work/rules_js/rules_js install
use_repo(pnpm, "pnpm")

######### ESBuild rules #########

bazel_dep(name = "aspect_rules_esbuild", version = "0.25.1")

######### TypeScript rules #########

bazel_dep(name = "aspect_rules_ts", version = "3.8.7")

rules_ts_ext = use_extension("@aspect_rules_ts//ts:extensions.bzl", "ext", dev_dependency = True)
rules_ts_ext.deps(
    ts_integrity = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
    ts_version_from = "//:package.json",
)
use_repo(rules_ts_ext, "npm_typescript")

######### Bazel lib rules #########

bazel_dep(name = "aspect_bazel_lib", version = "2.22.5")

######### Multirun rules #########

bazel_dep(name = "rules_multirun", version = "0.13.0")

######### buildifier rules #########

bazel_dep(
    name = "buildifier_prebuilt",
    version = "8.5.1",
    dev_dependency = True,
)

######### Rust rules #########

bazel_dep(name = "rules_rust", version = "0.69.0")

rust = use_extension("@rules_rust//rust:extensions.bzl", "rust")
rust.toolchain(
    edition = "2024",
    extra_target_triples = [
        "wasm32-unknown-unknown",
        "x86_64-unknown-linux-gnu",
    ],
    versions = [
        "1.90.0",
    ],
)
use_repo(rust, "rust_toolchains")

crate = use_extension("@rules_rust//crate_universe:extension.bzl", "crate")
crate.from_cargo(
    name = "crates",
    cargo_lockfile = "//:Cargo.lock",
    manifests = ["//:Cargo.toml"],
)
use_repo(crate, "crates")

bazel_dep(name = "rules_rust_wasm_bindgen", version = "0.69.0")

# Register wasm32 toolchain
register_toolchains(
    "@rules_rust//rust/private/dummy_cc_toolchain:dummy_cc_wasm32_toolchain",
)

######### Java rules #########

bazel_dep(name = "rules_java", version = "9.6.1")

########## BuildBuddy toolchain rules #########

bazel_dep(name = "toolchains_buildbuddy", version = "0.0.4")

use_extension("@toolchains_buildbuddy//:extensions.bzl", "buildbuddy")

register_toolchains(
    "@toolchains_buildbuddy//toolchains/cc:ubuntu_gcc_x86_64",
)

######### test262 rules #########

http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

TEST262_COMMIT = "ade328d530525333751e8a3b58f02e18624da085"

http_archive(
    name = "com_github_tc39_test262",
    build_file = "@//:test262.BUILD",
    sha256 = "f4915077f38016d0f20ad8cbeaeec4e3d4a5eca3a98a895e01653f3375802a4b",
    strip_prefix = "tc39-test262-%s" % TEST262_COMMIT[:7],
    type = "tar.gz",
    urls = ["https://github.com/tc39/test262/tarball/%s" % TEST262_COMMIT],
)

http_file = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")

http_file(
    name = "DerivedCombiningClass",
    sha256 = "191463abfbd202703c6fd6776a92a23ac44ec65e0476a7f95aa91ca492cef29b",
    url = "https://www.unicode.org/Public/17.0.0/ucd/extracted/DerivedCombiningClass.txt",
)

http_file(
    name = "DerivedEastAsianWidth",
    sha256 = "0b5523a2217cb318d20b329a05d31eec5af5686ba09d263b85bb75a28989a3a8",
    url = "https://www.unicode.org/Public/17.0.0/ucd/extracted/DerivedEastAsianWidth.txt",
)

http_file(
    name = "GraphemeBreakProperty",
    sha256 = "d6b51d1d2ae5c33b451b7ed994b48f1f4dc62b2272a5831e7fd418514a6bae89",
    url = "https://www.unicode.org/Public/17.0.0/ucd/auxiliary/GraphemeBreakProperty.txt",
)

http_file(
    name = "GraphemeBreakTest",
    sha256 = "e2d134d2c52919bace503ebb6a551c1855fe1a1faec18478c78fff254a1793ec",
    url = "https://www.unicode.org/Public/17.0.0/ucd/auxiliary/GraphemeBreakTest.txt",
)

http_file(
    name = "IndicSyllabicCategory",
    sha256 = "3fc122f4cf58b0c19268d5f810263b04ab4e1e67743386ec0e0ada9c76aec5be",
    url = "https://www.unicode.org/Public/17.0.0/ucd/IndicSyllabicCategory.txt",
)

http_file(
    name = "SentenceBreakProperty",
    sha256 = "871c0c985ad95125e25b302414065a10839d068970bceb383ecec138f22a0a18",
    url = "https://www.unicode.org/Public/17.0.0/ucd/auxiliary/SentenceBreakProperty.txt",
)

http_file(
    name = "SentenceBreakTest",
    sha256 = "12cb47d028ded0c1cb8a28558f95479cbcd24559c46977015c82f3b50a1cc6e4",
    url = "https://www.unicode.org/Public/17.0.0/ucd/auxiliary/SentenceBreakTest.txt",
)

http_file(
    name = "WordBreakProperty",
    sha256 = "72274cac1e6b919507db35655c3e175aa27274668a1ece95c28d2069f2ad9852",
    url = "https://www.unicode.org/Public/17.0.0/ucd/auxiliary/WordBreakProperty.txt",
)

http_file(
    name = "WordBreakTest",
    sha256 = "1de23a75f37904abc7d206239ee8d34f8fdf0fb4ab32a7174dfbabbde25419b2",
    url = "https://www.unicode.org/Public/17.0.0/ucd/auxiliary/WordBreakTest.txt",
)

http_file(
    name = "emoji-data",
    sha256 = "2cb2bb9455cda83e8481541ecf5b6dfda66a3bb89efa3fa7c5297eccf607b72b",
    url = "https://www.unicode.org/Public/17.0.0/ucd/emoji/emoji-data.txt",
)

http_file(
    name = "DerivedCoreProperties",
    sha256 = "24c7fed1195c482faaefd5c1e7eb821c5ee1fb6de07ecdbaa64b56a99da22c08",
    url = "https://www.unicode.org/Public/17.0.0/ucd/DerivedCoreProperties.txt",
)

######### ICU4J for conformance testing #########

http_file(
    name = "icu4j_jar",
    downloaded_file_path = "icu4j-78.1.jar",
    sha256 = "bbb70d3be23110d7295823eee0c2e896ac3b619b3c0f26168f65eb972df51d2a",
    url = "https://github.com/unicode-org/icu/releases/download/release-78.1/icu4j-78.1.jar",
)


================================================
FILE: README.md
================================================
# FormatJS

[![Unit Tests](https://github.com/formatjs/formatjs/actions/workflows/tests.yml/badge.svg)](https://github.com/formatjs/formatjs/actions/workflows/tests.yml)
[![Slack FormatJS](https://img.shields.io/badge/slack-@formatjs-green.svg?logo=slack)](https://join.slack.com/t/formatjs/shared_invite/enQtNjM2MjM4NjE4ODIxLTMyMWE0YTNhMTlmMzZlNzJlNjEzMWY0YjM2ODUxYjlmNDE2YzQyMDIxZDg3Y2Q5YWNlMzhhYzRiNDk0OGQwNGI)
[![Sauce Browser Matrix Status](https://app.saucelabs.com/browser-matrix/formatjsproject.svg)](https://app.saucelabs.com/u/formatjsproject)

This repository is the home of [FormatJS](http://formatjs.github.io/) and related libraries.

**Slack:** Join us on Slack at [formatjs.slack.com](https://formatjs.slack.com/) for help, general conversation and more 💬🎊🎉
You can sign-up using this [invitation link](https://join.slack.com/t/formatjs/shared_invite/enQtNjYwMzE4NjM1MDQzLTA5NDE1Y2Y1ZWNiZWI1YTU5MGUxY2M0YjA4NWNhMmU3YTRjZmQ3MTE3NzJmOTAxMWRmYWE1ZTdkMmYzNzA5Y2M).

## Development

See [CONTRIBUTING.md](CONTRIBUTING.md#Development) for instructions.

## Published Packages

| Package                                                                                                | Version                                                                 | Changelog                                                             | License                                                                       |
| ------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------- | --------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| [@formatjs/cli](https://www.npmjs.com/package/@formatjs/cli)                                           | ![version](https://badgen.net/npm/v/@formatjs/cli)                      | [CHANGELOG](packages/cli/CHANGELOG.md)                                | ![license](https://badgen.net/npm/license/@formatjs/cli)                      |
| [@formatjs/cli-lib](https://www.npmjs.com/package/@formatjs/cli-lib)                                   | ![version](https://badgen.net/npm/v/@formatjs/cli-lib)                  | [CHANGELOG](packages/cli-lib/CHANGELOG.md)                            | ![license](https://badgen.net/npm/license/@formatjs/cli-lib)                  |
| [@formatjs/icu-messageformat-parser](https://www.npmjs.com/package/@formatjs/icu-messageformat-parser) | ![version](https://badgen.net/npm/v/@formatjs/icu-messageformat-parser) | [CHANGELOG](packages/@formatjs/icu-messageformat-parser/CHANGELOG.md) | ![license](https://badgen.net/npm/license/@formatjs/icu-messageformat-parser) |
| [@formatjs/intl-datetimeformat](https://www.npmjs.com/package/@formatjs/intl-datetimeformat)           | ![version](https://badgen.net/npm/v/@formatjs/intl-datetimeformat)      | [CHANGELOG](packages/intl-datetimeformat/CHANGELOG.md)                | ![license](https://badgen.net/npm/license/@formatjs/intl-datetimeformat)      |
| [@formatjs/intl-displaynames](https://www.npmjs.com/package/@formatjs/intl-displaynames)               | ![version](https://badgen.net/npm/v/@formatjs/intl-displaynames)        | [CHANGELOG](packages/intl-displaynames/CHANGELOG.md)                  | ![license](https://badgen.net/npm/license/@formatjs/intl-displaynames)        |
| [@formatjs/intl-getcanonicallocales](https://www.npmjs.com/package/@formatjs/intl-getcanonicallocales) | ![version](https://badgen.net/npm/v/@formatjs/intl-getcanonicallocales) | [CHANGELOG](packages/intl-getcanonicallocales/CHANGELOG.md)           | ![license](https://badgen.net/npm/license/@formatjs/intl-getcanonicallocales) |
| [@formatjs/intl-listformat](https://www.npmjs.com/package/@formatjs/intl-listformat)                   | ![version](https://badgen.net/npm/v/@formatjs/intl-listformat)          | [CHANGELOG](packages/intl-listformat/CHANGELOG.md)                    | ![license](https://badgen.net/npm/license/@formatjs/intl-listformat)          |
| [@formatjs/intl-locale](https://www.npmjs.com/package/@formatjs/intl-locale)                           | ![version](https://badgen.net/npm/v/@formatjs/intl-locale)              | [CHANGELOG](packages/intl-locale/CHANGELOG.md)                        | ![license](https://badgen.net/npm/license/@formatjs/intl-locale)              |
| [@formatjs/intl-localematcher](https://www.npmjs.com/package/@formatjs/intl-localematcher)             | ![version](https://badgen.net/npm/v/@formatjs/intl-localematcher)       | [CHANGELOG](packages/intl-localematcher/CHANGELOG.md)                 | ![license](https://badgen.net/npm/license/@formatjs/intl-localematcher)       |
| [@formatjs/intl-numberformat](https://www.npmjs.com/package/@formatjs/intl-numberformat)               | ![version](https://badgen.net/npm/v/@formatjs/intl-numberformat)        | [CHANGELOG](packages/intl-numberformat/CHANGELOG.md)                  | ![license](https://badgen.net/npm/license/@formatjs/intl-numberformat)        |
| [@formatjs/intl-pluralrules](https://www.npmjs.com/package/@formatjs/intl-pluralrules)                 | ![version](https://badgen.net/npm/v/@formatjs/intl-pluralrules)         | [CHANGELOG](packages/intl-pluralrules/CHANGELOG.md)                   | ![license](https://badgen.net/npm/license/@formatjs/intl-pluralrules)         |
| [@formatjs/intl-relativetimeformat](https://www.npmjs.com/package/@formatjs/intl-relativetimeformat)   | ![version](https://badgen.net/npm/v/@formatjs/intl-relativetimeformat)  | [CHANGELOG](packages/intl-relativetimeformat/CHANGELOG.md)            | ![license](https://badgen.net/npm/license/@formatjs/intl-relativetimeformat)  |
| [@formatjs/intl-segmenter](https://www.npmjs.com/package/@formatjs/intl-segmenter)                     | ![version](https://badgen.net/npm/v/@formatjs/intl-segmenter)           | [CHANGELOG](packages/intl-segmenter/CHANGELOG.md)                     | ![license](https://badgen.net/npm/license/@formatjs/intl-segmenter)           |
| [@formatjs/intl](https://www.npmjs.com/package/@formatjs/intl)                                         | ![version](https://badgen.net/npm/v/@formatjs/intl)                     | [CHANGELOG](packages/intl/CHANGELOG.md)                               | ![license](https://badgen.net/npm/license/@formatjs/intl)                     |
| [@formatjs/ts-transformer](https://www.npmjs.com/package/@formatjs/ts-transformer)                     | ![version](https://badgen.net/npm/v/@formatjs/ts-transformer)           | [CHANGELOG](packages/ts-transformer/CHANGELOG.md)                     | ![license](https://badgen.net/npm/license/@formatjs/ts-transformer)           |
| [babel-plugin-formatjs](https://www.npmjs.com/package/babel-plugin-formatjs)                           | ![version](https://badgen.net/npm/v/babel-plugin-formatjs)              | [CHANGELOG](packages/babel-plugin-formatjs/CHANGELOG.md)              | ![license](https://badgen.net/npm/license/babel-plugin-formatjs)              |
| [eslint-plugin-formatjs](https://www.npmjs.com/package/eslint-plugin-formatjs)                         | ![version](https://badgen.net/npm/v/eslint-plugin-formatjs)             | [CHANGELOG](packages/eslint-plugin-formatjs/CHANGELOG.md)             | ![license](https://badgen.net/npm/license/eslint-plugin-formatjs)             |
| [intl-messageformat](https://www.npmjs.com/package/intl-messageformat)                                 | ![version](https://badgen.net/npm/v/intl-messageformat)                 | [CHANGELOG](packages/intl-messageformat/CHANGELOG.md)                 | ![license](https://badgen.net/npm/license/intl-messageformat)                 |
| [react-intl](https://www.npmjs.com/package/react-intl)                                                 | ![version](https://badgen.net/npm/v/react-intl)                         | [CHANGELOG](packages/react-intl/CHANGELOG.md)                         | ![license](https://badgen.net/npm/license/react-intl)                         |
| [@formatjs/utils](https://www.npmjs.com/package/@formatjs/utils)                                       | ![version](https://badgen.net/npm/v/@formatjs/utils)                    | [CHANGELOG](packages/utils/CHANGELOG.md)                              | ![license](https://badgen.net/npm/license/@formatjs/utils)                    |

## Big Thanks

Cross-browser Testing Platform and Open Source <3 Provided by [Sauce Labs][saucelabs]

[lerna]: https://lerna.js.org/
[saucelabs]: https://saucelabs.com


================================================
FILE: REPO.bazel
================================================
# Repository-level ignore patterns
# This file replaces .bazelignore (deprecated in Bazel 8.0+)
#
# Use ignore_directories() to exclude directories from Bazel's visibility.
# These directories will not be scanned for BUILD files.
#
# Note: ignore_directories() must be called at most once per REPO.bazel file,
# and if called, it must be the first statement in the file.
# Supports the same wildcards as glob().

ignore_directories([
    # Common build output and dependency directories
    "node_modules",
    "dist",
    "bazel-out",
    "target",
    # All node_modules directories recursively using glob pattern
    "**/node_modules",
])


================================================
FILE: UPCOMING.md
================================================
# Upcoming Improvements

## High Impact, High Feasibility

### 1. Vue `$t` Helper (Pinned Issue #3444, open 4+ years)
- Strong community demand for concise `$fm`, `$fn`, `$fd` helpers

## Medium Impact, Strategic

### 2. MessageFormat 2.0 (`Intl.MessageFormat` Polyfill)
- TC39 proposal progressing. Being the reference polyfill for MF2 would be a major strategic win.

### 3. `decimal.js` Bundle Size in `ecma402-abstract`
- 127KB dependency flowing into every polyfill. Evaluate if a lighter approach (native `BigInt`, lazy loading) is possible.

### 4. Rust CLI: Vue/GTS Extraction
- TS CLI has extractors for Vue, Handlebars, GlimmerJS that the Rust CLI lacks. Full parity would let us deprecate the TS CLI.

### 5. Framework Integrations: Svelte, Solid
- Only React and Vue have first-party integrations. Lingui already supports Svelte. Thin wrappers around `@formatjs/intl` core would be straightforward.


================================================
FILE: benchmarks/cli-comparison/BUILD.bazel
================================================
load("@aspect_rules_js//js:defs.bzl", "js_binary", "js_run_binary")
load("@npm//:defs.bzl", "npm_link_all_packages")

npm_link_all_packages()

# Generate test files (100K files with mixed message formats)
# Includes defineMessage, defineMessages, formatMessage, and FormattedMessage patterns
js_run_binary(
    name = "generate",
    srcs = ["generate-test-files.mjs"],
    chdir = package_name(),
    env = {"NUM_FILES": "100000"},
    out_dirs = ["test-files"],
    tags = ["manual"],
    tool = "//:node_modules/node",
)

# Benchmark binary
js_binary(
    name = "benchmark",
    data = [
        "benchmark-tinybench.mjs",
        ":generate",  # Test files as data dependency
        "//:node_modules/@bazel/runfiles",
        "//:node_modules/tinybench",
        "//crates/formatjs_cli",
        "//packages/cli:bin",
    ],
    entry_point = "benchmark-tinybench.mjs",
    tags = ["manual"],
)


================================================
FILE: benchmarks/cli-comparison/README.md
================================================
# FormatJS CLI Benchmark: Rust vs TypeScript

This benchmark compares the performance of the Rust CLI implementation against the TypeScript CLI for the `extract` command.

## Overview

The benchmark:

- Generates 100,000 TypeScript/React files with ICU MessageFormat messages
- Tests all message extraction patterns:
  - `defineMessage` - individual message definitions
  - `defineMessages` - grouped message definitions
  - `intl.formatMessage()` - imperative formatting
  - `<FormattedMessage />` - JSX component formatting
- Message complexity distribution: 40% simple, 30% with variables, 15% plural, 10% select, 5% complex nested
- Measures execution time, throughput (messages/second), and statistical confidence

## Benchmark Results

### Test Environment

- **OS**: macOS 25.2.0 (Darwin)
- **CPU**: Apple Silicon
- **Node.js**: v24.12.0
- **Date**: 2026-01-04

### Results (1,000 files, 9,656 messages)

| Metric                 | TypeScript | Rust     | Speedup   |
| ---------------------- | ---------- | -------- | --------- |
| **Mean Time**          | 601.63ms   | 131.77ms | **4.57x** |
| **Operations/sec**     | 1.66       | 7.59     | **4.57x** |
| **Messages/sec**       | 16,050     | 73,279   | **4.57x** |
| **Margin of Error**    | ±31.94ms   | ±2.82ms  | -         |
| **Samples**            | 9          | 38       | -         |
| **Messages Extracted** | 9,656      | 9,656    | ✓         |

**Summary**: The Rust CLI is **4.57x faster** (356.6% faster) than the TypeScript CLI, processing 73,279 messages/second vs 16,050 messages/second.

These results include all message extraction patterns: `defineMessage`, `defineMessages`, `intl.formatMessage()`, and `<FormattedMessage />`.

## Quick Start

### Option 1: Using the convenience script (Recommended)

```bash
cd benchmarks/cli-comparison
./run-benchmark.sh
```

This script will:

1. Build both TypeScript and Rust CLIs
2. Generate 100K test files (if not already present)
3. Run the benchmark with statistical analysis

### Option 2: Manual steps

```bash
# From the repository root

# 1. Generate test files (100K files with mixed message formats)
bazel build //benchmarks/cli-comparison:generate

# 2. Build both CLIs
bazel build //packages/cli:bin
bazel build //crates/formatjs_cli --compilation_mode=opt

# 3. Run the benchmark
cd benchmarks/cli-comparison
node benchmark-tinybench.mjs
```

### Option 3: Using Bazel

```bash
# Build and run via Bazel
bazel run //benchmarks/cli-comparison:benchmark
```

The benchmark script automatically looks for test files and CLIs in `bazel-bin/` output directories.

## How It Works

### Test File Generation

The generator creates realistic React/TypeScript files with a mix of message patterns:

```tsx
// 25% defineMessages (grouped)
const messages = defineMessages({
  greeting: {
    id: 'msg_0_0',
    defaultMessage: 'Hello, World!',
    description: 'Greeting message',
  },
})

// 25% defineMessage (individual)
const greeting = defineMessage({
  id: 'msg_1_0',
  defaultMessage: 'Welcome, {name}!',
  description: 'Welcome message',
})

// 25% intl.formatMessage (imperative)
const message = intl.formatMessage({
  id: 'msg_2_0',
  defaultMessage: 'You have {count, plural, one {# item} other {# items}}',
})

// 25% FormattedMessage (JSX)
<FormattedMessage
  id="msg_3_0"
  defaultMessage="Order is {status, select, pending {processing} shipped {in transit} other {unknown}}"
/>
```

### Message Complexity

Messages include various ICU MessageFormat features:

- **Simple**: `"Hello, World!"`
- **Variables**: `"Welcome, {name}!"`
- **Plural**: `"{count, plural, one {# item} other {# items}}"`
- **Select**: `"{status, select, active {Active} inactive {Inactive} other {Unknown}}"`
- **Complex**: Nested plural/select with rich text markup

### Benchmark Methodology

Uses [tinybench](https://github.com/tinylibs/tinybench) for statistical benchmarking:

- **Warmup**: 1 second, 1 iteration
- **Measurement**: 5 seconds minimum, at least 3 iterations
- **Metrics**: Mean time, margin of error, operations/sec, messages/sec
- **Validation**: Both CLIs must extract identical message counts

## Output

```
================================================================================
BENCHMARK RESULTS
================================================================================

📊 Performance Metrics:
────────────────────────────────────────────────────────────────────────────────
Metric                                        TypeScript                 Rust           Ratio
────────────────────────────────────────────────────────────────────────────────
Mean Time (ms)                                    601.63               131.77           4.57x
Operations/sec                                      1.66                 7.59           4.57x
Messages/sec                                       16,050               73,279           4.57x
Margin of Error (ms)                              ±31.94                ±2.82               -
Samples                                                9                   38               -
Messages Extracted                                 9,656                9,656               -
────────────────────────────────────────────────────────────────────────────────

✨ Summary:
   🚀 Rust is 4.57x faster (356.6% faster)
   📈 7.59 ops/sec vs 1.66 ops/sec
   💬 Processes 73,279 msg/s vs 16,050 msg/s
   ✓ Both extracted 9,656 messages
```

Results are saved to `benchmark-results.json` with detailed statistics.

## Troubleshooting

### "Rust CLI not found"

```bash
bazel build //crates/formatjs_cli --compilation_mode=opt
```

### "TypeScript CLI not found"

```bash
bazel build //packages/cli:bin
```

### "Test files not found"

```bash
bazel build //benchmarks/cli-comparison:generate
```

### "Cannot find module 'tinybench'"

```bash
cd benchmarks/cli-comparison
pnpm install
```

### Out of memory with 100K files

Reduce the file count in BUILD.bazel:

```python
env = {"NUM_FILES": "10000"},  # Reduce from 100000 to 10000
```

## System Requirements

- **Node.js**: v18 or later
- **Bazel**: Latest version
- **Memory**: At least 4GB available RAM
- **Disk**: ~2GB for test files (100K files)

## License

Same as the main FormatJS project (MIT).


================================================
FILE: benchmarks/cli-comparison/benchmark-results.json
================================================
{
  "timestamp": "2026-01-04T16:53:38.221Z",
  "testFiles": {
    "count": 1000,
    "messages": 9656,
    "pattern": "/Users/longho/src/formatjs/bazel-bin/benchmarks/cli-comparison/test-files/**/*.tsx"
  },
  "typescript": {
    "mean": 601.6272822222221,
    "marginOfError": 31.94,
    "opsPerSec": 1.6621586645909978,
    "messagesPerSec": 16049.804065290675,
    "samples": 9,
    "rme": 5.30959347502743
  },
  "rust": {
    "mean": 131.77019302631572,
    "marginOfError": 2.82,
    "opsPerSec": 7.588969683001761,
    "messagesPerSec": 73279.091259065,
    "samples": 38,
    "rme": 2.143856692003947
  },
  "comparison": {
    "speedup": 4.565731205251187,
    "percentFaster": 356.6
  }
}


================================================
FILE: benchmarks/cli-comparison/benchmark-tinybench.mjs
================================================
#!/usr/bin/env node
/**
 * Benchmark script using tinybench to compare Rust CLI vs TypeScript CLI performance
 */

import {Bench} from 'tinybench'
import {execSync} from 'child_process'
import fs from 'fs'
import path from 'path'
import {fileURLToPath} from 'url'

const __dirname = path.dirname(fileURLToPath(import.meta.url))

// Try to use Bazel runfiles if available, otherwise fall back to bazel-bin
let TEST_FILES_DIR, TS_CLI, RUST_CLI

try {
  // Try importing @bazel/runfiles for proper Bazel sandbox support
  const {Runfiles} = await import('@bazel/runfiles')
  const runfiles = Runfiles.create()

  // Resolve paths through runfiles
  TEST_FILES_DIR = runfiles.resolve(
    '_main/benchmarks/cli-comparison/test-files'
  )
  TS_CLI = runfiles.resolve('_main/packages/cli/bin/formatjs')
  RUST_CLI = runfiles.resolve('_main/crates/formatjs_cli/formatjs_cli')
} catch {
  // Fall back to bazel-bin for manual execution
  const BAZEL_BIN = path.join(__dirname, '../../bazel-bin')
  TEST_FILES_DIR = path.join(BAZEL_BIN, 'benchmarks/cli-comparison/test-files')
  TS_CLI = path.join(BAZEL_BIN, 'packages/cli/bin/formatjs')
  RUST_CLI = path.join(BAZEL_BIN, 'crates/formatjs_cli/formatjs_cli')
}

const OUTPUT_DIR = path.join(__dirname, 'benchmark-output')

// Check if TypeScript CLI is built
if (!fs.existsSync(TS_CLI)) {
  console.error('❌ Error: TypeScript CLI not found. Please build it first:')
  console.error('  bazel build //packages/cli:bin')
  process.exit(1)
}

// Check if Rust CLI is built
if (!fs.existsSync(RUST_CLI)) {
  console.error('❌ Error: Rust CLI not found. Please build it first:')
  console.error('  bazel build //crates/formatjs_cli --compilation_mode=opt')
  process.exit(1)
}

// Check if test files exist
if (!fs.existsSync(TEST_FILES_DIR)) {
  console.error('❌ Error: Test files not found. Please generate them first:')
  console.error('  bazel build //benchmarks/cli-comparison:generate')
  console.error(`  (Looking for test files at: ${TEST_FILES_DIR})`)
  process.exit(1)
}

// Clean and create output directory
try {
  fs.rmSync(OUTPUT_DIR, {recursive: true})
} catch {
  // Directory doesn't exist, that's fine
}
fs.mkdirSync(OUTPUT_DIR, {recursive: true})

// Count test files
function countFiles(dir, count = 0) {
  const files = fs.readdirSync(dir)
  for (const file of files) {
    const filePath = path.join(dir, file)
    const stat = fs.statSync(filePath)
    if (stat.isDirectory()) {
      count = countFiles(filePath, count)
    } else if (file.endsWith('.tsx')) {
      count++
    }
  }
  return count
}

const fileCount = countFiles(TEST_FILES_DIR)
const pattern = path.join(TEST_FILES_DIR, '**/*.tsx')

console.log('🔥 FormatJS CLI Benchmark: Rust vs TypeScript (using tinybench)')
console.log('='.repeat(80))
console.log(
  `\n📁 Test files: ${fileCount.toLocaleString()} TypeScript/React files`
)
console.log(`📂 Test directory: ${TEST_FILES_DIR}`)
console.log('\n⏱️  Running benchmarks...\n')

// Create benchmark suite
const bench = new Bench({
  time: 5000, // Run for 5 seconds minimum per benchmark
  iterations: 3, // At least 3 iterations
  warmupTime: 1000, // 1 second warmup
  warmupIterations: 1,
})

let tsMessageCount = 0
let rustMessageCount = 0

// TypeScript CLI benchmark
bench.add('TypeScript CLI', () => {
  const outputFile = path.join(OUTPUT_DIR, `typescript-${Date.now()}.json`)
  const command = `"${TS_CLI}" extract "${pattern}" --out-file "${outputFile}"`

  try {
    execSync(command, {
      stdio: 'pipe',
      maxBuffer: 1024 * 1024 * 100, // 100MB buffer
    })

    // Count messages on first run
    if (tsMessageCount === 0) {
      const output = JSON.parse(fs.readFileSync(outputFile, 'utf8'))
      tsMessageCount = Object.keys(output).length
    }

    // Clean up output file
    fs.unlinkSync(outputFile)
  } catch (error) {
    console.error('Error running TypeScript CLI:', error.message)
    throw error
  }
})

// Rust CLI benchmark
bench.add('Rust CLI', () => {
  const outputFile = path.join(OUTPUT_DIR, `rust-${Date.now()}.json`)
  const command = `"${RUST_CLI}" extract "${pattern}" --out-file "${outputFile}"`

  try {
    execSync(command, {
      stdio: 'pipe',
      maxBuffer: 1024 * 1024 * 100, // 100MB buffer
    })

    // Count messages on first run
    if (rustMessageCount === 0) {
      const output = JSON.parse(fs.readFileSync(outputFile, 'utf8'))
      rustMessageCount = Object.keys(output).length
    }

    // Clean up output file
    fs.unlinkSync(outputFile)
  } catch (error) {
    console.error('Error running Rust CLI:', error.message)
    throw error
  }
})

// Run benchmarks
await bench.run()

// Display results
console.log('\n' + '='.repeat(80))
console.log('BENCHMARK RESULTS')
console.log('='.repeat(80))

const tsResult = bench.tasks.find(t => t.name === 'TypeScript CLI')
const rustResult = bench.tasks.find(t => t.name === 'Rust CLI')

if (!tsResult?.result || !rustResult?.result) {
  console.log('\n⚠️  Benchmark incomplete - one or more runs failed')
  process.exit(1)
}

// Calculate metrics
const tsMean = tsResult.result.mean // Already in ms
const rustMean = rustResult.result.mean // Already in ms
const speedup = tsMean / rustMean

const tsMsgPerSec = tsMessageCount / (tsMean / 1000)
const rustMsgPerSec = rustMessageCount / (rustMean / 1000)

console.log('\n📊 Performance Metrics:')
console.log('─'.repeat(80))
console.log(
  `${'Metric'.padEnd(35)} ${'TypeScript'.padStart(20)} ${'Rust'.padStart(20)} ${'Ratio'.padStart(15)}`
)
console.log('─'.repeat(80))

// Mean execution time
console.log(
  `${'Mean Time (ms)'.padEnd(35)} ${`${tsMean.toFixed(2)}`.padStart(20)} ${`${rustMean.toFixed(2)}`.padStart(20)} ${`${speedup.toFixed(2)}x`.padStart(15)}`
)

// Operations per second
const tsOpsPerSec = 1000 / tsMean
const rustOpsPerSec = 1000 / rustMean
console.log(
  `${'Operations/sec'.padEnd(35)} ${`${tsOpsPerSec.toFixed(2)}`.padStart(20)} ${`${rustOpsPerSec.toFixed(2)}`.padStart(20)} ${`${(rustOpsPerSec / tsOpsPerSec).toFixed(2)}x`.padStart(15)}`
)

// Messages per second
console.log(
  `${'Messages/sec'.padEnd(35)} ${`${tsMsgPerSec.toFixed(0)}`.padStart(20)} ${`${rustMsgPerSec.toFixed(0)}`.padStart(20)} ${`${(rustMsgPerSec / tsMsgPerSec).toFixed(2)}x`.padStart(15)}`
)

// Margin of error
const tsError = ((tsResult.result.rme / 100) * tsMean).toFixed(2)
const rustError = ((rustResult.result.rme / 100) * rustMean).toFixed(2)
console.log(
  `${'Margin of Error (ms)'.padEnd(35)} ${`±${tsError}`.padStart(20)} ${`±${rustError}`.padStart(20)} ${'-'.padStart(15)}`
)

// Sample size
console.log(
  `${'Samples'.padEnd(35)} ${`${tsResult.result.samples.length}`.padStart(20)} ${`${rustResult.result.samples.length}`.padStart(20)} ${'-'.padStart(15)}`
)

// Messages extracted
console.log(
  `${'Messages Extracted'.padEnd(35)} ${`${tsMessageCount.toLocaleString()}`.padStart(20)} ${`${rustMessageCount.toLocaleString()}`.padStart(20)} ${'-'.padStart(15)}`
)

console.log('─'.repeat(80))

// Statistical significance
const tsHz = 1000 / tsMean
const rustHz = 1000 / rustMean
const percentFaster = ((speedup - 1) * 100).toFixed(1)

console.log('\n✨ Summary:')
console.log(
  `   🚀 Rust is ${speedup.toFixed(2)}x faster (${percentFaster}% faster)`
)
console.log(`   📈 ${rustHz.toFixed(2)} ops/sec vs ${tsHz.toFixed(2)} ops/sec`)
console.log(
  `   💬 Processes ${rustMsgPerSec.toLocaleString()} msg/s vs ${tsMsgPerSec.toLocaleString()} msg/s`
)

if (Math.abs(tsMessageCount - rustMessageCount) > 0) {
  console.log(
    `   ⚠️  Message count differs: TS=${tsMessageCount}, Rust=${rustMessageCount}`
  )
} else {
  console.log(`   ✓ Both extracted ${tsMessageCount.toLocaleString()} messages`)
}

// Save results
const resultsFile = path.join(__dirname, 'benchmark-results.json')
const results = {
  timestamp: new Date().toISOString(),
  testFiles: {
    count: fileCount,
    messages: tsMessageCount,
    pattern: pattern,
  },
  typescript: {
    mean: tsMean,
    marginOfError: parseFloat(tsError),
    opsPerSec: tsOpsPerSec,
    messagesPerSec: tsMsgPerSec,
    samples: tsResult.result.samples.length,
    rme: tsResult.result.rme,
  },
  rust: {
    mean: rustMean,
    marginOfError: parseFloat(rustError),
    opsPerSec: rustOpsPerSec,
    messagesPerSec: rustMsgPerSec,
    samples: rustResult.result.samples.length,
    rme: rustResult.result.rme,
  },
  comparison: {
    speedup: speedup,
    percentFaster: parseFloat(percentFaster),
  },
}

fs.writeFileSync(resultsFile, JSON.stringify(results, null, 2))
console.log(`\n📄 Detailed results saved to: ${resultsFile}`)

console.log('\n' + '='.repeat(80))
console.log('✅ Benchmark complete!')
console.log('='.repeat(80) + '\n')


================================================
FILE: benchmarks/cli-comparison/generate-test-files.mjs
================================================
#!/usr/bin/env node
/**
 * Generates test files with a mix of simple and complex ICU MessageFormat messages
 * for benchmarking the Rust CLI vs TypeScript CLI
 */

import fs from 'fs/promises'
import path from 'path'
import {fileURLToPath} from 'url'

const __dirname = path.dirname(fileURLToPath(import.meta.url))

// Configuration
const NUM_FILES = process.env.NUM_FILES
  ? parseInt(process.env.NUM_FILES)
  : 100_000
const OUTPUT_DIR = path.join(__dirname, 'test-files')
const FILES_PER_DIR = 1000 // Split into subdirectories to avoid filesystem limits

// Message templates - mix of simple and complex
const MESSAGE_TEMPLATES = {
  simple: [
    'Hello, World!',
    'Welcome to our application',
    'Click here to continue',
    'Loading...',
    'Save changes',
    'Cancel',
    'Are you sure?',
    'Success!',
    'Error occurred',
    'Please try again',
  ],
  withVariables: [
    'Hello, {name}!',
    'You have {count} unread messages',
    'Welcome back, {username}',
    'Last login: {date}',
    'Your balance is {amount}',
    '{user} sent you a message',
    'Expires on {expiryDate}',
    'Created by {author} on {date}',
  ],
  plural: [
    '{count, plural, one {# item} other {# items}}',
    '{count, plural, =0 {No messages} one {# message} other {# messages}}',
    '{numPhotos, plural, =0 {no photos} =1 {one photo} other {# photos}}',
    'You have {count, plural, one {# new notification} other {# new notifications}}',
    '{taskCount, plural, =0 {No tasks} one {# task remaining} other {# tasks remaining}}',
  ],
  select: [
    '{gender, select, male {He} female {She} other {They}} liked your post',
    '{status, select, active {Active user} inactive {Inactive} other {Unknown status}}',
    'Order is {orderStatus, select, pending {being processed} shipped {on the way} delivered {completed} other {unknown}}',
  ],
  complex: [
    '{count, plural, one {You have # message from {sender}} other {You have # messages}}',
    '{numPhotos, plural, =0 {<bold>{name}</bold> has no photos} =1 {<bold>{name}</bold> has one photo} other {<bold>{name}</bold> has # photos}}',
    '{gender, select, male {He has {count, plural, one {# item} other {# items}}} female {She has {count, plural, one {# item} other {# items}}} other {They have {count, plural, one {# item} other {# items}}}}',
    'Welcome <link>back</link>, {username}! You have {msgCount, plural, =0 {no new messages} one {# new message} other {# new messages}} and {taskCount, plural, =0 {no pending tasks} one {# pending task} other {# pending tasks}}.',
    '{itemCount, plural, =0 {Your cart is empty} one {You have <bold>{itemCount}</bold> item in your cart for <price>{total}</price>} other {You have <bold>{itemCount}</bold> items in your cart for <price>{total}</price>}}',
  ],
}

// Distribution: 40% simple, 30% with variables, 15% plural, 10% select, 5% complex
const MESSAGE_DISTRIBUTION = [
  {type: 'simple', weight: 40},
  {type: 'withVariables', weight: 30},
  {type: 'plural', weight: 15},
  {type: 'select', weight: 10},
  {type: 'complex', weight: 5},
]

function selectRandomMessage() {
  const random = Math.random() * 100
  let cumulative = 0

  for (const {type, weight} of MESSAGE_DISTRIBUTION) {
    cumulative += weight
    if (random < cumulative) {
      const templates = MESSAGE_TEMPLATES[type]
      return templates[Math.floor(Math.random() * templates.length)]
    }
  }

  return MESSAGE_TEMPLATES.simple[0]
}

function generateFileContent(fileIndex) {
  const numMessages = Math.floor(Math.random() * 10) + 5 // 5-15 messages per file

  const messages = []
  for (let i = 0; i < numMessages; i++) {
    const messageId = `msg_${fileIndex}_${i}`
    const defaultMessage = selectRandomMessage()
    messages.push({
      id: messageId,
      defaultMessage,
      description: `Message ${i} in file ${fileIndex}`,
    })
  }

  // Mix different patterns: defineMessages, defineMessage, formatMessage, FormattedMessage
  const formatType = fileIndex % 4

  if (formatType === 0) {
    // defineMessages pattern (group of messages)
    const imports = `import {defineMessages} from 'react-intl'\n\n`
    const messagesObj = messages
      .map(
        msg => `  ${msg.id}: {
    id: '${msg.id}',
    defaultMessage: '${msg.defaultMessage.replace(/'/g, "\\'")}',
    description: '${msg.description}',
  }`
      )
      .join(',\n')

    const component = `
const messages = defineMessages({
${messagesObj}
})

export function Component${fileIndex}() {
  return <div>{/* Component content */}</div>
}
`
    return imports + component
  } else if (formatType === 1) {
    // defineMessage pattern (individual messages)
    const imports = `import {defineMessage} from 'react-intl'\n\n`
    const messageDefs = messages
      .map(
        msg => `const ${msg.id} = defineMessage({
  id: '${msg.id}',
  defaultMessage: '${msg.defaultMessage.replace(/'/g, "\\'")}',
  description: '${msg.description}',
})`
      )
      .join('\n\n')

    const component = `
export function Component${fileIndex}() {
  return <div>{/* Component content */}</div>
}
`
    return imports + messageDefs + component
  } else if (formatType === 2) {
    // formatMessage pattern (intl.formatMessage)
    const imports = `import {useIntl} from 'react-intl'\n\n`
    const formatCalls = messages
      .map(
        msg =>
          `  const ${msg.id} = intl.formatMessage({
    id: '${msg.id}',
    defaultMessage: '${msg.defaultMessage.replace(/'/g, "\\'")}',
    description: '${msg.description}',
  })`
      )
      .join('\n')

    const component = `
export function Component${fileIndex}() {
  const intl = useIntl()
${formatCalls}
  return <div>{/* Component content */}</div>
}
`
    return imports + component
  } else {
    // FormattedMessage pattern (JSX component)
    const imports = `import {FormattedMessage} from 'react-intl'\n\n`
    const jsxMessages = messages
      .map(
        msg =>
          `      <FormattedMessage
        id="${msg.id}"
        defaultMessage="${msg.defaultMessage.replace(/"/g, '&quot;')}"
        description="${msg.description}"
      />`
      )
      .join('\n')

    const component = `
export function Component${fileIndex}() {
  return (
    <div>
${jsxMessages}
    </div>
  )
}
`
    return imports + component
  }
}

async function generateFiles() {
  console.log(`Generating ${NUM_FILES.toLocaleString()} test files...`)
  console.time('Generation time')

  // Clean and recreate output directory
  try {
    await fs.rm(OUTPUT_DIR, {recursive: true})
  } catch {
    // Directory doesn't exist, that's fine
  }
  await fs.mkdir(OUTPUT_DIR, {recursive: true})

  // Generate files in batches
  const numSubdirs = Math.ceil(NUM_FILES / FILES_PER_DIR)

  for (let dirIndex = 0; dirIndex < numSubdirs; dirIndex++) {
    const subdirName = `batch_${dirIndex.toString().padStart(4, '0')}`
    const subdirPath = path.join(OUTPUT_DIR, subdirName)
    await fs.mkdir(subdirPath, {recursive: true})

    const filesInThisDir = Math.min(
      FILES_PER_DIR,
      NUM_FILES - dirIndex * FILES_PER_DIR
    )

    // Generate files in parallel batches of 100 to avoid overwhelming the system
    const BATCH_SIZE = 100
    for (let batch = 0; batch < filesInThisDir; batch += BATCH_SIZE) {
      const batchEnd = Math.min(batch + BATCH_SIZE, filesInThisDir)
      const promises = []

      for (let i = batch; i < batchEnd; i++) {
        const fileIndex = dirIndex * FILES_PER_DIR + i
        const fileName = `file_${fileIndex.toString().padStart(6, '0')}.tsx`
        const filePath = path.join(subdirPath, fileName)
        const content = generateFileContent(fileIndex)
        promises.push(fs.writeFile(filePath, content, 'utf8'))
      }

      await Promise.all(promises)
    }

    if ((dirIndex + 1) % 10 === 0) {
      const progress = ((dirIndex + 1) / numSubdirs) * 100
      console.log(
        `Progress: ${progress.toFixed(1)}% (${((dirIndex + 1) * FILES_PER_DIR).toLocaleString()} files)`
      )
    }
  }

  console.timeEnd('Generation time')
  console.log(
    `✓ Generated ${NUM_FILES.toLocaleString()} files in ${OUTPUT_DIR}`
  )

  // Generate summary statistics
  console.log('\nFile structure:')
  console.log(`  - ${numSubdirs} subdirectories`)
  console.log(`  - ${FILES_PER_DIR} files per subdirectory`)
  console.log('\nMessage distribution:')
  MESSAGE_DISTRIBUTION.forEach(({type, weight}) => {
    console.log(`  - ${type}: ${weight}%`)
  })
}

// Run generator
generateFiles().catch(err => {
  console.error('Error generating files:', err)
  process.exit(1)
})


================================================
FILE: benchmarks/cli-comparison/package.json
================================================
{
  "name": "@formatjs/cli-benchmark",
  "description": "Benchmark comparing Rust CLI vs TypeScript CLI performance",
  "version": "1.0.0",
  "private": true,
  "type": "module"
}


================================================
FILE: benchmarks/cli-comparison/run-benchmark.sh
================================================
#!/bin/bash
# Run the FormatJS CLI benchmark: Rust vs TypeScript
set -e

echo "🔥 FormatJS CLI Benchmark Runner"
echo "=================================="
echo ""

# Check if we're in the right directory
if [ ! -f "benchmark-tinybench.mjs" ]; then
  echo "❌ Error: Must be run from benchmarks/cli-comparison directory"
  exit 1
fi

cd ../..

# Step 1: Build both CLIs
echo "📦 Step 1/3: Building CLIs..."
echo "  - Building TypeScript CLI..."
bazel build //packages/cli:bin

echo "  - Building Rust CLI (optimized)..."
bazel build //crates/formatjs_cli --compilation_mode=opt

# Step 2: Generate test files
echo ""
echo "📁 Step 2/3: Generating test files..."
if [ -d "bazel-bin/benchmarks/cli-comparison/test-files" ]; then
  echo "  ✓ Test files already exist, skipping generation"
else
  echo "  - Generating 100,000 test files (this may take a few minutes)..."
  bazel build //benchmarks/cli-comparison:generate
fi

# Step 3: Run benchmark
echo ""
echo "⏱️  Step 3/3: Running benchmark with tinybench..."
echo ""
cd benchmarks/cli-comparison
node benchmark-tinybench.mjs

echo ""
echo "✅ Benchmark complete!"
echo ""
echo "📊 Results saved to:"
echo "  - benchmark-results.json (detailed statistics)"
echo "  - Console output above (formatted results)"


================================================
FILE: buildbuddy.yaml
================================================
actions:
  - name: 'Test all targets'
    container_image: 'ubuntu-20.04'
    triggers:
      push:
        branches:
          - 'main'
          - 'gh-readonly-queue/*'
    resource_requests:
      memory: 10GB
      disk: 16GB
    bazel_commands:
      - 'test //...'


================================================
FILE: config.json
================================================
{
  "auths": {
    "ghcr.io": {},
    "https://index.docker.io/v1/": {}
  },
  "credsStore": "desktop",
  "experimental": "disabled"
}


================================================
FILE: conformance-tests/icu4j/BUILD.bazel
================================================
load("@rules_java//java:defs.bzl", "java_binary", "java_import")

java_import(
    name = "icu4j",
    jars = ["@icu4j_jar//file"],
)

java_binary(
    name = "icu_conformance_test",
    srcs = ["ICUConformanceTest.java"],
    main_class = "ICUConformanceTest",
    deps = [":icu4j"],
)


================================================
FILE: conformance-tests/icu4j/ICUConformanceTest.java
================================================
import com.ibm.icu.text.PluralRules;
import com.ibm.icu.number.FormattedNumberRange;
import com.ibm.icu.number.NumberRangeFormatter;
import com.ibm.icu.number.LocalizedNumberRangeFormatter;
import com.ibm.icu.util.ULocale;
import java.util.*;

/**
 * ICU4J conformance test to validate FormatJS behavior against reference implementation.
 *
 * This test validates:
 * 1. Locale canonicalization (getCanonicalLocales)
 * 2. Script code normalization (DisplayNames)
 * 3. Variant handling (Intl.Locale.variants)
 */
public class ICUConformanceTest {
    public static void main(String[] args) {
        System.out.println("==========================================================");
        System.out.println("ICU4J Conformance Test for FormatJS");
        System.out.println("==========================================================\n");

        testLocaleCanonicaliz();
        testScriptCodeNormalization();
        testVariantHandling();
        testLowercaseScriptCodes();
        testDisplayNames();
        testPluralRulesSelectRange();

        System.out.println("\n==========================================================");
        System.out.println("All tests completed successfully!");
        System.out.println("==========================================================");
    }

    /**
     * Test 1: Locale Canonicalization
     * Validates that ICU canonicalizes locales the same way as FormatJS
     */
    private static void testLocaleCanonicaliz() {
        System.out.println("TEST 1: Locale Canonicalization");
        System.out.println("----------------------------------------------------------");

        Map<String, String> testCases = new LinkedHashMap<>();
        testCases.put("en-US", "en-US");
        testCases.put("EN-us", "en-US");
        testCases.put("zh-Hans-CN", "zh-Hans-CN");
        testCases.put("zh-hans-cn", "zh-Hans-CN");
        testCases.put("en-arab-US", "en-Arab-US");
        testCases.put("en-LATN", "en-Latn");
        testCases.put("fr-ca", "fr-CA");
        testCases.put("es-419", "es-419");

        for (Map.Entry<String, String> entry : testCases.entrySet()) {
            String input = entry.getKey();
            String expected = entry.getValue();
            ULocale locale = new ULocale(input);
            String canonical = locale.toLanguageTag();

            boolean pass = canonical.equals(expected);
            System.out.printf("  %-20s → %-20s [%s]%n",
                input, canonical, pass ? "PASS" : "FAIL - expected: " + expected);

            if (!pass) {
                System.exit(1);
            }
        }

        System.out.println("  ✓ All canonicalization tests passed\n");
    }

    /**
     * Test 2: Script Code Normalization
     * Validates that script codes are normalized to title-case (e.g., Arab, Latn)
     */
    private static void testScriptCodeNormalization() {
        System.out.println("TEST 2: Script Code Normalization");
        System.out.println("----------------------------------------------------------");

        Map<String, String> testCases = new LinkedHashMap<>();
        testCases.put("en-arab-US", "Arab");
        testCases.put("en-ARAB-US", "Arab");
        testCases.put("en-Arab-US", "Arab");
        testCases.put("en-latn", "Latn");
        testCases.put("en-LATN", "Latn");
        testCases.put("ar-arab", "Arab");
        testCases.put("zh-hans", "Hans");
        testCases.put("zh-HANT", "Hant");

        for (Map.Entry<String, String> entry : testCases.entrySet()) {
            String input = entry.getKey();
            String expectedScript = entry.getValue();
            ULocale locale = new ULocale(input);
            String actualScript = locale.getScript();

            boolean pass = actualScript.equals(expectedScript);
            System.out.printf("  %-20s → script: %-10s [%s]%n",
                input, actualScript, pass ? "PASS" : "FAIL - expected: " + expectedScript);

            if (!pass) {
                System.exit(1);
            }
        }

        System.out.println("  ✓ All script normalization tests passed\n");
    }

    /**
     * Test 3: Variant Handling
     * Validates that variants are handled correctly, including sorting
     */
    private static void testVariantHandling() {
        System.out.println("TEST 3: Variant Handling");
        System.out.println("----------------------------------------------------------");

        Map<String, String> testCases = new LinkedHashMap<>();
        testCases.put("ca-valencia", "VALENCIA");
        testCases.put("en-fonipa", "FONIPA");
        testCases.put("fr-1606nict", "1606NICT");
        // Note: ICU preserves variant order and uses underscore separator
        testCases.put("de-DE-1996-1901", "1996_1901");
        testCases.put("de-DE-1901-1996", "1901_1996");

        for (Map.Entry<String, String> entry : testCases.entrySet()) {
            String input = entry.getKey();
            String expectedVariant = entry.getValue();
            ULocale locale = new ULocale(input);
            String actualVariant = locale.getVariant();

            boolean pass = actualVariant.equals(expectedVariant);
            System.out.printf("  %-25s → variant: %-15s [%s]%n",
                input, actualVariant, pass ? "PASS" : "FAIL - expected: " + expectedVariant);

            if (!pass) {
                System.exit(1);
            }
        }

        // Test locale without variant
        ULocale noVariant = new ULocale("en-US");
        boolean emptyPass = noVariant.getVariant().isEmpty();
        System.out.printf("  %-25s → variant: %-15s [%s]%n",
            "en-US", "(empty)", emptyPass ? "PASS" : "FAIL");

        if (!emptyPass) {
            System.exit(1);
        }

        System.out.println("  ✓ All variant handling tests passed\n");
    }

    /**
     * Test 4: Lowercase Script Codes (GH #5889 specific test)
     * Validates what ICU4J does with lowercase script codes
     */
    private static void testLowercaseScriptCodes() {
        System.out.println("TEST 4: Lowercase Script Codes (GH #5889)");
        System.out.println("----------------------------------------------------------");

        // Test what ICU4J does with lowercase 'arab'
        System.out.println("\n  Testing locale with lowercase 'arab' script:");
        ULocale lowercase = new ULocale("en-arab");
        System.out.println("    Input: 'en-arab'");
        System.out.println("    toLanguageTag(): " + lowercase.toLanguageTag());
        System.out.println("    getScript(): " + lowercase.getScript());
        System.out.println("    getDisplayScript(ENGLISH): " + lowercase.getDisplayScript(ULocale.ENGLISH));

        // Test what ICU4J does with uppercase 'ARAB'
        System.out.println("\n  Testing locale with uppercase 'ARAB' script:");
        ULocale uppercase = new ULocale("en-ARAB");
        System.out.println("    Input: 'en-ARAB'");
        System.out.println("    toLanguageTag(): " + uppercase.toLanguageTag());
        System.out.println("    getScript(): " + uppercase.getScript());
        System.out.println("    getDisplayScript(ENGLISH): " + uppercase.getDisplayScript(ULocale.ENGLISH));

        // Test what ICU4J does with title-case 'Arab'
        System.out.println("\n  Testing locale with title-case 'Arab' script:");
        ULocale titlecase = new ULocale("en-Arab");
        System.out.println("    Input: 'en-Arab'");
        System.out.println("    toLanguageTag(): " + titlecase.toLanguageTag());
        System.out.println("    getScript(): " + titlecase.getScript());
        System.out.println("    getDisplayScript(ENGLISH): " + titlecase.getDisplayScript(ULocale.ENGLISH));

        System.out.println("\n  ✓ ICU4J canonicalizes all forms to title-case 'Arab'\n");
    }

    /**
     * Test 5: DisplayNames
     * Validates that script display names work correctly with canonical codes
     */
    private static void testDisplayNames() {
        System.out.println("TEST 5: DisplayNames (Script Codes)");
        System.out.println("----------------------------------------------------------");

        ULocale english = ULocale.ENGLISH;

        Map<String, String> testCases = new LinkedHashMap<>();
        testCases.put("Arab", "Arabic");
        testCases.put("Latn", "Latin");
        testCases.put("Hans", "Simplified");
        testCases.put("Hant", "Traditional");
        testCases.put("Cyrl", "Cyrillic");

        for (Map.Entry<String, String> entry : testCases.entrySet()) {
            String scriptCode = entry.getKey();
            String expectedName = entry.getValue();

            // Create a locale with this script and get its display name
            ULocale localeWithScript = new ULocale("en-" + scriptCode);
            String actualName = localeWithScript.getDisplayScript(english);

            boolean pass = actualName.contains(expectedName);
            System.out.printf("  Script %-10s → %-20s [%s]%n",
                scriptCode, actualName, pass ? "PASS" : "FAIL - expected to contain: " + expectedName);

            if (!pass) {
                System.exit(1);
            }
        }

        // Test region display names (for hasMissingICUBug check)
        ULocale canada = new ULocale("en-CA");
        String canadaName = canada.getDisplayCountry(english);
        boolean canadaPass = canadaName.equals("Canada");
        System.out.printf("  Region %-10s → %-20s [%s]%n",
            "CA", canadaName, canadaPass ? "PASS" : "FAIL");

        if (!canadaPass) {
            System.exit(1);
        }

        System.out.println("  ✓ All DisplayNames tests passed\n");
    }

    /**
     * Test 6: PluralRules selectRange
     * Validates ICU4J behavior for selectRange, especially with identical start/end values
     *
     * This addresses the question: does selectRange(1,1) return "one" or "other"?
     * - ECMA-402 spec step 4: if formatted strings are equal, return start category
     * - Chrome returns "other" (possible bug)
     * - Our polyfill returns "one" (following spec)
     * - Need to verify with ICU4J (reference implementation)
     */
    private static void testPluralRulesSelectRange() {
        System.out.println("TEST 6: PluralRules selectRange");
        System.out.println("----------------------------------------------------------");

        // Test English cardinal plural rules
        ULocale english = ULocale.ENGLISH;
        PluralRules enPluralRules = PluralRules.forLocale(english);

        System.out.println("\n  English cardinal plural rules:");
        System.out.println("    select(1): " + enPluralRules.select(1.0));
        System.out.println("    select(2): " + enPluralRules.select(2.0));
        System.out.println();

        // Test selectRange with FormattedNumberRange
        LocalizedNumberRangeFormatter rangeFormatter = NumberRangeFormatter.withLocale(english);

        System.out.println("  Testing selectRange with identical values:");

        // Test case 1: Identical values (1, 1)
        try {
            FormattedNumberRange range_1_1 = rangeFormatter.formatRange(1, 1);
            String result_1_1 = enPluralRules.select(range_1_1);
            System.out.println("    selectRange(1, 1): \"" + result_1_1 + "\"");
            System.out.println("    formatted: \"" + range_1_1 + "\"");
            System.out.println("    identity: " + range_1_1.getIdentityResult());
        } catch (Exception e) {
            System.out.println("    ERROR: " + e.getMessage());
            e.printStackTrace();
        }

        // Test case 2: Identical values (2, 2)
        try {
            FormattedNumberRange range_2_2 = rangeFormatter.formatRange(2, 2);
            String result_2_2 = enPluralRules.select(range_2_2);
            System.out.println("    selectRange(2, 2): \"" + result_2_2 + "\"");
            System.out.println("    formatted: \"" + range_2_2 + "\"");
            System.out.println("    identity: " + range_2_2.getIdentityResult());
        } catch (Exception e) {
            System.out.println("    ERROR: " + e.getMessage());
            e.printStackTrace();
        }

        // Test case 3: Identical values (0, 0)
        try {
            FormattedNumberRange range_0_0 = rangeFormatter.formatRange(0, 0);
            String result_0_0 = enPluralRules.select(range_0_0);
            System.out.println("    selectRange(0, 0): \"" + result_0_0 + "\"");
            System.out.println("    formatted: \"" + range_0_0 + "\"");
            System.out.println("    identity: " + range_0_0.getIdentityResult());
        } catch (Exception e) {
            System.out.println("    ERROR: " + e.getMessage());
            e.printStackTrace();
        }

        System.out.println();

        // Test case 4: Different values (1, 2)
        System.out.println("  Testing selectRange with different values:");
        try {
            FormattedNumberRange range_1_2 = rangeFormatter.formatRange(1, 2);
            String result_1_2 = enPluralRules.select(range_1_2);
            System.out.println("    selectRange(1, 2): \"" + result_1_2 + "\"");
            System.out.println("    formatted: \"" + range_1_2 + "\"");
            System.out.println("    identity: " + range_1_2.getIdentityResult());
        } catch (Exception e) {
            System.out.println("    ERROR: " + e.getMessage());
            e.printStackTrace();
        }

        // Test case 5: Different values (0, 1)
        try {
            FormattedNumberRange range_0_1 = rangeFormatter.formatRange(0, 1);
            String result_0_1 = enPluralRules.select(range_0_1);
            System.out.println("    selectRange(0, 1): \"" + result_0_1 + "\"");
            System.out.println("    formatted: \"" + range_0_1 + "\"");
            System.out.println("    identity: " + range_0_1.getIdentityResult());
        } catch (Exception e) {
            System.out.println("    ERROR: " + e.getMessage());
            e.printStackTrace();
        }

        System.out.println();

        // Test French for comparison
        System.out.println("  Testing French plural rules:");
        ULocale french = ULocale.FRENCH;
        PluralRules frPluralRules = PluralRules.forLocale(french);
        LocalizedNumberRangeFormatter frRangeFormatter = NumberRangeFormatter.withLocale(french);

        System.out.println("    select(0): " + frPluralRules.select(0.0));
        System.out.println("    select(1): " + frPluralRules.select(1.0));
        System.out.println("    select(2): " + frPluralRules.select(2.0));
        System.out.println();

        try {
            FormattedNumberRange range_0_0 = frRangeFormatter.formatRange(0, 0);
            String result_0_0 = frPluralRules.select(range_0_0);
            System.out.println("    selectRange(0, 0): \"" + result_0_0 + "\"");
            System.out.println("    formatted: \"" + range_0_0 + "\"");
            System.out.println("    identity: " + range_0_0.getIdentityResult());
        } catch (Exception e) {
            System.out.println("    ERROR: " + e.getMessage());
        }

        try {
            FormattedNumberRange range_1_1 = frRangeFormatter.formatRange(1, 1);
            String result_1_1 = frPluralRules.select(range_1_1);
            System.out.println("    selectRange(1, 1): \"" + result_1_1 + "\"");
            System.out.println("    formatted: \"" + range_1_1 + "\"");
            System.out.println("    identity: " + range_1_1.getIdentityResult());
        } catch (Exception e) {
            System.out.println("    ERROR: " + e.getMessage());
        }

        try {
            FormattedNumberRange range_0_1 = frRangeFormatter.formatRange(0, 1);
            String result_0_1 = frPluralRules.select(range_0_1);
            System.out.println("    selectRange(0, 1): \"" + result_0_1 + "\"");
            System.out.println("    formatted: \"" + range_0_1 + "\"");
            System.out.println("    identity: " + range_0_1.getIdentityResult());
        } catch (Exception e) {
            System.out.println("    ERROR: " + e.getMessage());
        }

        System.out.println("\n  ✓ PluralRules selectRange tests completed\n");
    }
}


================================================
FILE: crates/formatjs_cli/BUILD.bazel
================================================
load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_test")

exports_files(
    [
        "Cargo.toml",
        "src/main.rs",
        "src/extract.rs",
        "src/extractor.rs",
        "src/compile.rs",
        "src/compile_folder.rs",
        "src/verify.rs",
        "src/id_generator.rs",
        "src/formatters/mod.rs",
        "src/formatters/default.rs",
        "src/formatters/simple.rs",
        "src/formatters/transifex.rs",
        "src/formatters/smartling.rs",
        "src/formatters/lokalise.rs",
        "src/formatters/crowdin.rs",
    ],
    visibility = ["//visibility:public"],
)

# Common dependencies for all targets
COMMON_DEPS = [
    "//crates/icu_messageformat_parser",
    "//crates/icu_skeleton_parser",
    "@crates//:anyhow",
    "@crates//:base64",
    "@crates//:clap",
    "@crates//:fast-glob",
    "@crates//:walkdir",
    "@crates//:hex",
    "@crates//:once_cell",
    "@crates//:oxc",
    "@crates//:oxc_allocator",
    "@crates//:oxc_ast",
    "@crates//:oxc_parser",
    "@crates//:oxc_span",
    "@crates//:regex",
    "@crates//:serde",
    "@crates//:serde_json",
    "@crates//:sha2",
]

TEST_DEPS = COMMON_DEPS + [
    "@crates//:tempfile",
]

# Base rust binary (builds for host platform)
rust_binary(
    name = "formatjs_cli",
    srcs = [
        "src/compile.rs",
        "src/compile_folder.rs",
        "src/extract.rs",
        "src/extractor.rs",
        "src/formatters/crowdin.rs",
        "src/formatters/default.rs",
        "src/formatters/lokalise.rs",
        "src/formatters/mod.rs",
        "src/formatters/simple.rs",
        "src/formatters/smartling.rs",
        "src/formatters/transifex.rs",
        "src/id_generator.rs",
        "src/main.rs",
        "src/verify.rs",
    ],
    crate_name = "formatjs",
    edition = "2024",
    visibility = ["//visibility:public"],
    deps = COMMON_DEPS,
)

rust_test(
    name = "formatjs_cli_test",
    crate = ":formatjs_cli",
    data = ["//packages/ts-transformer:test_fixtures"],
    deps = TEST_DEPS,
)

# Alias for convenience (defaults to host platform)
alias(
    name = "formatjs",
    actual = ":formatjs_cli",
    visibility = ["//visibility:public"],
)

# Release targets - these build for the current platform and copy to release directory
# Use --platforms flag to build for different platforms:
#   macOS: bazel build --platforms=//crates/formatjs_cli/platforms:darwin_arm64 //crates/formatjs_cli:release_binary
#   Linux: bazel build --platforms=//crates/formatjs_cli/platforms:linux_x86_64 //crates/formatjs_cli:release_binary

genrule(
    name = "release_binary",
    srcs = [":formatjs_cli"],
    outs = ["formatjs_cli_release"],
    cmd = "cp $< $@ && chmod +x $@",
    visibility = ["//visibility:public"],
)


================================================
FILE: crates/formatjs_cli/Cargo.toml
================================================
[package]
name = "formatjs_cli"
version = "0.1.14"
edition = "2024"
authors = ["FormatJS Team", "Long Ho <holevietlong@gmail.com>"]
description = "Command-line interface for FormatJS - A Rust-based CLI for internationalization"
license = "MIT"
repository = "https://github.com/formatjs/formatjs"
homepage = "https://formatjs.io/"
documentation = "https://docs.rs/formatjs_cli"
keywords = ["icu", "i18n", "internationalization", "cli", "intl"]
categories = ["internationalization", "command-line-utilities", "localization"]
readme = "README.md"
rust-version = "1.90"

[[bin]]
name = "formatjs"
path = "src/main.rs"

[dependencies]
clap = { version = "4.5", features = ["derive", "cargo", "env"] }
anyhow = "1.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = { version = "1.0", features = ["preserve_order"] }
fast-glob = "1.0"
walkdir = "2"
formatjs_icu_messageformat_parser = { path = "../icu_messageformat_parser", version = "0.2.4" }
formatjs_icu_skeleton_parser = { path = "../icu_skeleton_parser", version = "0.1.1" }
oxc = { version = "0.120", features = ["ast_visit"] }
oxc_allocator = "0.120"
oxc_ast = "0.120"
oxc_parser = "0.120"
oxc_span = "0.120"
sha2 = "0.10"
base64 = "0.22"
hex = "0.4"
regex = "1.12"

[dev-dependencies]
tempfile = "3.0"


================================================
FILE: crates/formatjs_cli/README.md
================================================
# formatjs_cli

A high-performance Rust-based command-line interface for FormatJS internationalization tools.

## Overview

`formatjs_cli` is a high-performance Rust implementation of the FormatJS CLI, providing fast and efficient tools for working with ICU MessageFormat messages in your internationalization workflow.

### Why Use the Native CLI?

The native Rust CLI offers significant advantages over the Node.js-based `@formatjs/cli`:

- **🚀 Faster Performance**: Up to 10-100x faster for large codebases
- **📦 Zero Dependencies**: Single binary with no Node.js or npm packages required
- **💾 Lower Memory Usage**: Minimal memory footprint compared to Node.js
- **⚡ Instant Startup**: No Node.js initialization overhead
- **🔧 Easy Distribution**: Standalone binaries for CI/CD pipelines
- **🎯 Perfect for CI/CD**: Fast, reliable, and cache-friendly

**Benchmark results** (processing ~1000 message files):

- Node.js CLI: ~8.5 seconds
- Rust CLI: ~0.5 seconds (17x faster)

The native CLI is a drop-in replacement for `@formatjs/cli` with identical command-line interface and output format.

## Features

- **Extract**: Extract messages from source files (React, Vue, etc.)
- **Compile**: Compile messages for production use with optional minification
- **Verify**: Validate message files and check for missing/extra keys
- **Compile-Folder**: Batch compile all translation files in a folder

## Quick Start

```bash
# Download the binary (macOS Apple Silicon example)
curl -L https://github.com/formatjs/formatjs/releases/download/formatjs_cli_v0.1.6/formatjs-darwin-arm64 -o formatjs
chmod +x formatjs

# Extract messages from your source code
./formatjs extract "src/**/*.tsx" --out-file messages.json

# Compile translations for production
./formatjs compile "translations/*.json" --out-file compiled.json --ast

# Verify translations are complete
./formatjs verify "translations/*.json" --source-locale en --missing-keys
```

## Installation

### Pre-built Binaries (Recommended)

Download pre-built native binaries from the [GitHub Releases](https://github.com/formatjs/formatjs/releases) page:

**Latest Release:** [formatjs_cli_v0.1.6](https://github.com/formatjs/formatjs/releases/tag/formatjs_cli_v0.1.6)

**Available binaries:**

- `formatjs-darwin-arm64` - macOS Apple Silicon (M1/M2/M3)
- `formatjs-linux-x86_64` - Linux x86_64

**Installation steps:**

1. Download the appropriate binary for your platform:

   ```bash
   # macOS Apple Silicon
   curl -L https://github.com/formatjs/formatjs/releases/download/formatjs_cli_v0.1.6/formatjs-darwin-arm64 -o formatjs

   # Linux x86_64
   curl -L https://github.com/formatjs/formatjs/releases/download/formatjs_cli_v0.1.6/formatjs-linux-x86_64 -o formatjs
   ```

2. Make it executable:

   ```bash
   chmod +x formatjs
   ```

3. Optionally, move it to your PATH:

   ```bash
   sudo mv formatjs /usr/local/bin/
   ```

4. Verify installation:
   ```bash
   formatjs --version
   ```

### Using Bazel

Build the CLI using Bazel for host platform:

```bash
bazel build //crates/formatjs_cli:formatjs
```

Run directly with Bazel:

```bash
bazel run //crates/formatjs_cli:formatjs -- --help
```

### Multi-Platform Build (Darwin ARM64 + Linux x64)

Build for both Darwin ARM64 and Linux x64:

```bash
cd crates/formatjs_cli
./build-multiplatform.sh
```

This will create binaries in `dist/formatjs_cli/`:

- `formatjs-darwin-arm64` - macOS Apple Silicon binary
- `formatjs-linux-x86_64` - Linux x86_64 binary

You can also build for specific platforms using Bazel directly:

```bash
# Build for Darwin ARM64 (macOS Apple Silicon)
bazel build --platforms=//crates/formatjs_cli/platforms:darwin_arm64 //crates/formatjs_cli:formatjs_cli

# Build for Linux x64
bazel build --platforms=//crates/formatjs_cli/platforms:linux_x86_64 //crates/formatjs_cli:formatjs_cli
```

### Using Cargo

Build and install using Cargo (host platform only):

```bash
cd crates/formatjs_cli
cargo build --release
cargo install --path .
```

## Usage

### Extract Command

Extract string messages from React components that use react-intl:

```bash
formatjs extract "src/**/*.tsx" --out-file messages.json
```

**Full example with options:**

```bash
formatjs extract "src/**/*.{js,ts,tsx}" \
  --out-file extracted.json \
  --id-interpolation-pattern '[sha512:contenthash:base64:6]' \
  --additional-function-names t,__ \
  --flatten \
  --extract-source-location
```

**Options:**

- `[FILES]...` - File glob patterns to extract from (e.g., `src/**/*.tsx`)
- `--format <PATH>` - Path to formatter file controlling JSON output shape
- `--in-file <PATH>` - File containing list of files to extract (one per line)
- `--out-file <PATH>` - Target file for aggregated .json output
- `--id-interpolation-pattern <PATTERN>` - Pattern to auto-generate message IDs (default: `[sha512:contenthash:base64:6]`)
- `--extract-source-location` - Extract metadata about message location in source
- `--additional-component-names <NAMES>` - Additional component names to extract from (comma-separated)
- `--additional-function-names <NAMES>` - Additional function names to extract from (comma-separated)
- `--ignore <PATTERNS>` - Glob patterns to exclude
- `--throws` - Throw exception when failing to process any file
- `--pragma <PRAGMA>` - Parse custom pragma for file metadata (e.g., `@intl-meta`)
- `--preserve-whitespace` - Preserve whitespace and newlines
- `--flatten` - Hoist selectors and flatten sentences

### Compile Command

Compile extracted translation files into react-intl consumable JSON:

```bash
formatjs compile "lang/*.json" --out-file compiled.json
```

**Full example with options:**

```bash
formatjs compile "lang/*.json" \
  --out-file compiled.json \
  --ast \
  --pseudo-locale en-XA
```

**Options:**

- `[TRANSLATION_FILES]...` - Glob patterns for translation files (e.g., `foo/**/en.json`)
- `--format <PATH>` - Path to formatter file that converts input to `Record<string, string>`
- `--out-file <PATH>` - Output file path (prints to stdout if not provided)
- `--ast` - Compile to AST instead of strings
- `--skip-errors` - Continue compiling after errors (excludes keys with errors)
- `--pseudo-locale <LOCALE>` - Generate pseudo-locale files (requires `--ast`)
  - Values: `xx-LS`, `xx-AC`, `xx-HA`, `en-XA`, `en-XB`
- `--ignore-tag` - Treat HTML/XML tags as string literals

### Compile-Folder Command

Batch compile all translation JSON files in a folder:

```bash
formatjs compile-folder lang/ dist/lang/
```

**Full example with options:**

```bash
formatjs compile-folder lang/ dist/lang/ --ast
```

**Options:**

- `<FOLDER>` - Source directory containing translation JSON files
- `<OUT_FOLDER>` - Output directory for compiled files
- `--format <PATH>` - Path to formatter file
- `--ast` - Compile to AST

### Verify Command

Run checks on translation files to validate correctness:

```bash
formatjs verify "lang/*.json" --source-locale en --missing-keys
```

**Full example with all checks:**

```bash
formatjs verify "lang/*.json" \
  --source-locale en \
  --missing-keys \
  --extra-keys \
  --structural-equality
```

**Options:**

- `[TRANSLATION_FILES]...` - Glob patterns for translation files
- `--source-locale <LOCALE>` - **Required** for checks to work (e.g., `en`)
- `--ignore <PATTERNS>` - Glob patterns to ignore
- `--missing-keys` - Check for missing keys in target locales
- `--extra-keys` - Check for extra keys not in source locale
- `--structural-equality` - Check structural equality of messages

## Development

### Running Tests

Using Bazel:

```bash
bazel test //crates/formatjs_cli:formatjs_cli_test
```

Using Cargo:

```bash
cargo test
```

### Project Structure

```
crates/formatjs_cli/
├── Cargo.toml          # Cargo package manifest
├── BUILD.bazel         # Bazel build configuration
├── README.md           # This file
└── src/
    └── main.rs         # Main CLI implementation
```

## Dependencies

- `clap`: Command-line argument parsing
- `anyhow`: Error handling
- `serde` & `serde_json`: JSON serialization
- `formatjs_icu_messageformat_parser`: ICU MessageFormat parsing
- `formatjs_icu_skeleton_parser`: ICU skeleton parsing

## Performance

This Rust implementation provides significant performance improvements over the Node.js-based CLI, especially for:

- **Large codebases**: 10-100x faster extraction and compilation
- **Batch processing**: Minimal overhead when processing many files
- **CI/CD pipelines**: Faster builds and deployments
- **Memory efficiency**: Lower memory usage for large message catalogs

See the [benchmarks](../../benchmarks/cli-comparison) for detailed performance comparisons.

## Contributing

Contributions are welcome! Please see the main [FormatJS repository](https://github.com/formatjs/formatjs) for contribution guidelines.

## License

MIT

## Related Packages

- [@formatjs/cli](../../packages/cli) - Node.js-based CLI
- [formatjs_icu_messageformat_parser](../icu_messageformat_parser) - ICU MessageFormat parser
- [formatjs_icu_skeleton_parser](../icu_skeleton_parser) - ICU skeleton parser


================================================
FILE: crates/formatjs_cli/RELEASE.md
================================================
# FormatJS Rust CLI - Release Guide

This document explains how to build release binaries for the FormatJS Rust CLI for multiple platforms.

## Quick Start

### Option 1: Using GitHub Actions (Recommended for Releases)

The repository includes two GitHub Actions workflows:

#### 1. Build & Test Workflow (`.github/workflows/rust-cli-test.yml`)

**Runs automatically on**:

- Pull requests that modify Rust code
- Pushes to `main` branch
- Can be triggered manually

**What it does**:

- Builds Rust CLI on both macOS and Linux
- Runs unit tests
- Runs integration tests
- Performs smoke tests

#### 2. Release Workflow (`.github/workflows/rust-cli-release.yml`)

**Triggered by**: Push a tag starting with `formatjs_cli_v` (e.g., `formatjs_cli_v0.1.0`)

```bash
# Create and push a release tag
git tag formatjs_cli_v0.1.0
git push origin formatjs_cli_v0.1.0
```

**What it does**:

1. Build macOS ARM64 binary natively on macOS runner
2. Build Linux x86_64 binary natively on Linux runner
3. Run smoke tests on both binaries
4. Combine artifacts and generate checksums
5. Create a GitHub Release with all binaries

**Release artifacts**:

- `formatjs_cli-darwin-arm64` (macOS Apple Silicon)
- `formatjs_cli-linux-x64` (Linux x86_64)
- `checksums.txt` (SHA-256 checksums)

### Option 2: Using Cargo

```bash
cd crates/formatjs_cli
./release.sh
```

This uses native Cargo cross-compilation. Requires additional setup for cross-compilation (see below).

## Platform Support

| Platform | Architecture  | Target Triple            | Status                                |
| -------- | ------------- | ------------------------ | ------------------------------------- |
| macOS    | Apple Silicon | aarch64-apple-darwin     | ✅ Native (Bazel on GHA macOS runner) |
| Linux    | x86_64        | x86_64-unknown-linux-gnu | ✅ Native (Bazel on GHA Linux runner) |

**Note**: The GitHub Actions workflow builds each platform natively on its respective runner, avoiding complex cross-compilation setup.

## Cross-Compilation Setup

### For Linux builds from macOS

You have several options:

#### Option A: Using Zig (Easiest)

```bash
# Install zig (provides a cross-platform linker)
brew install zig

# Add Linux target
rustup target add x86_64-unknown-linux-gnu

# Zig will be automatically detected and used as the linker
```

#### Option B: Using musl (Static binaries)

```bash
# Add musl target (produces static binaries)
rustup target add x86_64-unknown-linux-musl

# Build
cargo build --release --target x86_64-unknown-linux-musl
```

#### Option C: Using cross

```bash
# Install cross (Docker-based cross-compilation)
cargo install cross

# Build
cross build --release --target x86_64-unknown-linux-gnu
```

## Manual Building

### Build with Bazel

```bash
# Build for current platform
bazel build --compilation_mode=opt //crates/formatjs_cli:release_binary

# Build for specific platform (requires being on that platform)
# macOS ARM64:
bazel build --compilation_mode=opt --platforms=//crates/formatjs_cli/platforms:darwin_arm64 //crates/formatjs_cli:release_binary

# Linux x86_64:
bazel build --compilation_mode=opt --platforms=//crates/formatjs_cli/platforms:linux_x86_64 //crates/formatjs_cli:release_binary
```

Binary will be in `bazel-bin/crates/formatjs_cli/formatjs_cli_release`.

**Note**: Bazel builds each platform natively (no cross-compilation). Use GitHub Actions to build both platforms.

### Build for specific platform with Cargo

```bash
# macOS Apple Silicon
cargo build --release --target aarch64-apple-darwin

# macOS Intel
cargo build --release --target x86_64-apple-darwin

# Linux x86_64 (requires cross-compilation setup)
cargo build --release --target x86_64-unknown-linux-gnu
```

Binaries will be in `target/<triple>/release/formatjs_cli`.

## Release Artifacts

After running the GitHub Actions workflow, artifacts will be available:

1. **During the workflow run**: As job artifacts (7 day retention)
2. **After tag push**: As GitHub Release assets

```
Release assets:
├── formatjs_cli-darwin-arm64      # macOS Apple Silicon
├── formatjs_cli-linux-x64         # Linux x86_64
└── checksums.txt                  # SHA-256 checksums
```

### Verify checksums

```bash
# Download from release
curl -LO https://github.com/formatjs/formatjs/releases/download/formatjs_cli_v0.1.0/checksums.txt
curl -LO https://github.com/formatjs/formatjs/releases/download/formatjs_cli_v0.1.0/formatjs_cli-darwin-arm64

shasum -a 256 -c checksums.txt
```

## Testing Binaries

The GitHub Actions workflow includes smoke tests that run automatically:

```bash
./formatjs_cli-{platform} --version
./formatjs_cli-{platform} --help
```

To test manually after downloading:

```bash
# macOS Apple Silicon
chmod +x formatjs_cli-darwin-arm64
./formatjs_cli-darwin-arm64 --version

# Linux
chmod +x formatjs_cli-linux-x64
./formatjs_cli-linux-x64 --version
```

## Publishing

The GitHub Actions workflow automates the entire release process:

1. **Tag the release**:

   ```bash
   # Update version in Cargo.toml if needed
   git tag formatjs_cli_v0.1.0
   git push origin formatjs_cli_v0.1.0
   ```

2. **Workflow runs automatically**:
   - Builds both macOS and Linux binaries
   - Runs smoke tests
   - Creates GitHub Release with all artifacts

3. **Manual verification** (optional):
   - Check GitHub Actions run completed successfully
   - Download and test binaries from the release
   - Verify checksums

4. **Publish to npm** (if applicable):
   ```bash
   # Update package.json with release URLs
   # Point to GitHub release assets
   npm publish
   ```

## Troubleshooting

### Linux cross-compilation fails

**Problem**: `cargo build --target x86_64-unknown-linux-gnu` fails with linker errors.

**Solutions**:

1. Install zig: `brew install zig` (easiest)
2. Use musl target: `cargo build --target x86_64-unknown-linux-musl`
3. Use cross: `cargo install cross && cross build --target x86_64-unknown-linux-gnu`
4. Build on an actual Linux machine

### Binary doesn't run on target platform

**Problem**: Binary fails to execute with "exec format error" or "cannot execute binary file".

**Cause**: Binary was built for wrong architecture.

**Solution**: Verify the target triple matches your platform:

```bash
file dist/v<version>/formatjs_cli-*
```

### "Unknown platform" error with Bazel

**Problem**: Bazel can't find the platform definition.

**Solution**: Ensure `rules_rust` is properly configured in `MODULE.bazel` or `WORKSPACE`.

## CI/CD Integration

The repository includes two production-ready GitHub Actions workflows:

### 1. Build & Test Workflow (`.github/workflows/rust-cli-test.yml`)

**Purpose**: Continuous integration for all changes

**Triggers**:

- Pull requests modifying Rust code
- Pushes to `main` branch
- Manual dispatch

**Jobs**:

```yaml
build-and-test-macos: # Build and test on macOS runner
build-and-test-linux: # Build and test on Linux runner
```

**Features**:

- Concurrent testing on both platforms
- Unit tests and integration tests
- Smoke tests for binaries
- BuildBuddy integration (optional, via API key)

### 2. Release Workflow (`.github/workflows/rust-cli-release.yml`)

**Purpose**: Create official releases with binaries

**Triggers**:

- Push a tag starting with `formatjs_cli_v`

**Jobs**:

```yaml
build-macos: # Build macOS binary
build-linux: # Build Linux binary
combine-and-release: # Combine, checksum, and create release
```

**Features**:

1. **Multi-platform builds**: macOS and Linux built natively
2. **Smoke tests**: Automatic testing with `--version` and `--help`
3. **Artifact management**: 7-day retention during workflow, permanent in releases
4. **Checksum generation**: Automatic SHA-256 checksums
5. **GitHub Release**: Automatic creation with formatted release notes
6. **BuildBuddy integration**: Optional remote caching

## License

Same as the main FormatJS project (MIT).


================================================
FILE: crates/formatjs_cli/build-multiplatform.sh
================================================
#!/bin/bash
# Build formatjs CLI for Darwin ARM64 and Linux x64
# Usage: ./build-multiplatform.sh
# Default: builds for both darwin_arm64 and linux_x86_64

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
OUTPUT_DIR="${OUTPUT_DIR:-$REPO_ROOT/dist/formatjs_cli}"

# Colors for output
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

echo -e "${BLUE}Building formatjs CLI for Darwin ARM64 and Linux x64${NC}"
echo "Output directory: $OUTPUT_DIR"
echo ""

# Create output directory
mkdir -p "$OUTPUT_DIR"

# Build for Darwin ARM64
echo -e "${BLUE}Building for Darwin ARM64...${NC}"
if bazel build --platforms=//crates/formatjs_cli/platforms:darwin_arm64 //crates/formatjs_cli:formatjs_cli 2>&1 | tee /tmp/build_darwin.log; then
    BINARY_PATH=$(bazel cquery --output=files --platforms=//crates/formatjs_cli/platforms:darwin_arm64 //crates/formatjs_cli:formatjs_cli 2>/dev/null)
    if [ -f "$BINARY_PATH" ]; then
        cp "$BINARY_PATH" "$OUTPUT_DIR/formatjs-darwin-arm64"
        chmod +x "$OUTPUT_DIR/formatjs-darwin-arm64"
        echo -e "${GREEN}✓ Built formatjs-darwin-arm64${NC}"
        ls -lh "$OUTPUT_DIR/formatjs-darwin-arm64"
        file "$OUTPUT_DIR/formatjs-darwin-arm64" 2>/dev/null || true
    else
        echo -e "${RED}✗ Binary not found${NC}"
    fi
else
    echo -e "${RED}✗ Failed to build for Darwin ARM64${NC}"
fi
echo ""

# Build for Linux x64
echo -e "${BLUE}Building for Linux x64...${NC}"
echo -e "${YELLOW}Note: Cross-compilation to Linux may require additional toolchain setup${NC}"
if bazel build --platforms=//crates/formatjs_cli/platforms:linux_x86_64 //crates/formatjs_cli:formatjs_cli 2>&1 | tee /tmp/build_linux.log; then
    BINARY_PATH=$(bazel cquery --output=files --platforms=//crates/formatjs_cli/platforms:linux_x86_64 //crates/formatjs_cli:formatjs_cli 2>/dev/null)
    if [ -f "$BINARY_PATH" ]; then
        cp "$BINARY_PATH" "$OUTPUT_DIR/formatjs-linux-x86_64"
        chmod +x "$OUTPUT_DIR/formatjs-linux-x86_64"
        echo -e "${GREEN}✓ Built formatjs-linux-x86_64${NC}"
        ls -lh "$OUTPUT_DIR/formatjs-linux-x86_64"
        file "$OUTPUT_DIR/formatjs-linux-x86_64" 2>/dev/null || true
    else
        echo -e "${RED}✗ Binary not found${NC}"
    fi
else
    echo -e "${RED}✗ Failed to build for Linux x64${NC}"
    echo -e "${YELLOW}Build logs saved to /tmp/build_linux.log${NC}"
fi
echo ""

echo -e "${GREEN}Build complete!${NC}"
echo "Binaries are in: $OUTPUT_DIR"
ls -lh "$OUTPUT_DIR" 2>/dev/null || true


================================================
FILE: crates/formatjs_cli/platforms/BUILD.bazel
================================================
# Define custom platforms for cross-compilation

# macOS ARM64 (Apple Silicon)
platform(
    name = "darwin_arm64",
    constraint_values = [
        "@platforms//os:osx",
        "@platforms//cpu:aarch64",
    ],
    visibility = ["//visibility:public"],
)

# Linux x86_64
platform(
    name = "linux_x86_64",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:x86_64",
    ],
    visibility = ["//visibility:public"],
)


================================================
FILE: crates/formatjs_cli/release.sh
================================================
#!/bin/bash
# Build release binaries for FormatJS Rust CLI
# Supports: macOS (darwin) and Linux cross-compilation
set -e

VERSION=$(grep '^version' Cargo.toml | head -1 | cut -d'"' -f2)
DIST_DIR="dist/v${VERSION}"

echo "🚀 Building FormatJS Rust CLI v${VERSION}"
echo "=========================================="
echo ""

# Create dist directory
mkdir -p "$DIST_DIR"

# Detect host OS
if [[ "$OSTYPE" == "darwin"* ]]; then
  HOST_OS="darwin"
  HOST_TARGET="aarch64-apple-darwin"
  if [[ $(uname -m) == "x86_64" ]]; then
    HOST_TARGET="x86_64-apple-darwin"
  fi
else
  HOST_OS="linux"
  HOST_TARGET="x86_64-unknown-linux-gnu"
fi

echo "📋 Build Configuration:"
echo "  Version: ${VERSION}"
echo "  Host OS: ${HOST_OS}"
echo "  Host Target: ${HOST_TARGET}"
echo ""

# Build for macOS (darwin)
if [[ "$HOST_OS" == "darwin" ]]; then
  echo "🍎 Building for macOS (darwin)..."

  # Build for Apple Silicon (aarch64)
  echo "  - Building for aarch64-apple-darwin (Apple Silicon)..."
  rustup target add aarch64-apple-darwin
  cargo build --release --target aarch64-apple-darwin
  cp target/aarch64-apple-darwin/release/formatjs_cli "$DIST_DIR/formatjs_cli-darwin-arm64"

  # Build for Intel (x86_64)
  echo "  - Building for x86_64-apple-darwin (Intel)..."
  rustup target add x86_64-apple-darwin
  cargo build --release --target x86_64-apple-darwin
  cp target/x86_64-apple-darwin/release/formatjs_cli "$DIST_DIR/formatjs_cli-darwin-x64"

  echo "  ✓ macOS builds complete"
  echo ""
fi

# Build for Linux (cross-compile from macOS or native on Linux)
echo "🐧 Building for Linux..."

# Check if cross-compilation tools are available
if [[ "$HOST_OS" == "darwin" ]]; then
  echo "  ℹ️  Cross-compiling from macOS to Linux"
  echo ""
  echo "  📦 Checking cross-compilation prerequisites..."

  # Check if Linux target is installed
  if ! rustup target list --installed | grep -q "x86_64-unknown-linux-gnu"; then
    echo "  - Adding x86_64-unknown-linux-gnu target..."
    rustup target add x86_64-unknown-linux-gnu
  fi

  # Check if musl target is installed (for static binaries)
  if ! rustup target list --installed | grep -q "x86_64-unknown-linux-musl"; then
    echo "  - Adding x86_64-unknown-linux-musl target..."
    rustup target add x86_64-unknown-linux-musl
  fi

  # Check for cross-compilation linker
  if command -v x86_64-unknown-linux-gnu-gcc &> /dev/null; then
    echo "  ✓ Found x86_64-unknown-linux-gnu-gcc"
    LINUX_TARGET="x86_64-unknown-linux-gnu"
  elif command -v zig &> /dev/null; then
    echo "  ✓ Found zig (will use as linker)"
    export CC_x86_64_unknown_linux_gnu="zig cc -target x86_64-linux-gnu"
    export CXX_x86_64_unknown_linux_gnu="zig c++ -target x86_64-linux-gnu"
    export AR_x86_64_unknown_linux_gnu="zig ar"
    LINUX_TARGET="x86_64-unknown-linux-gnu"
  else
    echo "  ⚠️  No Linux cross-compiler found, trying musl (static binary)..."
    echo ""
    echo "  💡 To improve cross-compilation, install one of:"
    echo "     - zig: brew install zig"
    echo "     - cross: cargo install cross"
    LINUX_TARGET="x86_64-unknown-linux-musl"
  fi

  echo ""
  echo "  - Building for ${LINUX_TARGET}..."

  # Try building with cargo
  if cargo build --release --target "$LINUX_TARGET" 2>&1; then
    cp "target/${LINUX_TARGET}/release/formatjs_cli" "$DIST_DIR/formatjs_cli-linux-x64"
    echo "  ✓ Linux build complete"
  else
    echo "  ❌ Linux cross-compilation failed"
    echo ""
    echo "  💡 Alternatives:"
    echo "     1. Install zig: brew install zig"
    echo "     2. Install cross: cargo install cross && cross build --release --target x86_64-unknown-linux-gnu"
    echo "     3. Build on a Linux machine"
    echo ""
    echo "  Skipping Linux build..."
  fi
else
  # Native Linux build
  echo "  - Building for x86_64-unknown-linux-gnu..."
  cargo build --release --target x86_64-unknown-linux-gnu
  cp target/x86_64-unknown-linux-gnu/release/formatjs_cli "$DIST_DIR/formatjs_cli-linux-x64"
  echo "  ✓ Linux build complete"
fi

echo ""
echo "=========================================="
echo "✅ Release build complete!"
echo ""
echo "📦 Artifacts in ${DIST_DIR}:"
ls -lh "$DIST_DIR"
echo ""

# Calculate checksums
echo "🔐 Generating checksums..."
cd "$DIST_DIR"
shasum -a 256 formatjs_cli-* > checksums.txt
cat checksums.txt
cd - > /dev/null
echo ""

# Test binaries
echo "🧪 Testing binaries..."
for binary in "$DIST_DIR"/formatjs_cli-*; do
  if [[ -f "$binary" ]] && [[ -x "$binary" ]]; then
    echo "  - Testing $(basename $binary)..."
    if $binary --version &> /dev/null; then
      echo "    ✓ $(basename $binary): $($binary --version)"
    else
      echo "    ⚠️  $(basename $binary): Not executable on this platform"
    fi
  fi
done

echo ""
echo "🎉 Done! Release artifacts are ready in ${DIST_DIR}/"


================================================
FILE: crates/formatjs_cli/src/compile.rs
================================================
use anyhow::{Context, Result};
use serde_json::{Map, Value, json};
use std::collections::BTreeMap;
use std::path::PathBuf;
use walkdir::WalkDir;

use crate::formatters::Formatter;

/// Pseudo-locale variants for testing and expanding translations
#[derive(Clone, Copy, Debug)]
pub enum PseudoLocale {
    /// Expansion pseudo-locale
    XxLs,
    /// Accented pseudo-locale
    XxAc,
    /// HTML accented pseudo-locale
    XxHa,
    /// English expansion (west-to-east)
    EnXa,
    /// English expansion (east-to-west)
    EnXb,
}

/// Compile extracted translation files into react-intl consumable JSON.
///
/// This command reads translation JSON files, validates them as ICU MessageFormat messages,
/// and compiles them into a format suitable for react-intl. Optionally compiles to AST
/// representation and can generate pseudo-locales for testing.
///
/// # Arguments
///
/// * `translation_files` - Glob patterns for translation files (e.g., `foo/**/en.json`)
/// * `format` - Optional formatter to convert input to `Record<string, string>`
/// * `out_file` - Optional output file path (prints to stdout if not provided)
/// * `ast` - Whether to compile to AST instead of strings
/// * `skip_errors` - Whether to continue compiling after errors (excludes keys with errors from output)
/// * `pseudo_locale` - Optional pseudo-locale to generate for testing (requires `ast` to be true)
/// * `ignore_tag` - Whether to treat HTML/XML tags as string literals instead of parsing them
///
/// # Pseudo-Locales
///
/// * `XxLs` - Expansion pseudo-locale (adds ~30% length for layout testing)
/// * `XxAc` - Accented pseudo-locale (adds diacritics: à, é, ñ, etc.)
/// * `XxHa` - HTML-safe accented pseudo-locale
/// * `EnXa` - English expansion west-to-east
/// * `EnXb` - English expansion east-to-west
///
/// # Example
///
/// ```no_run
/// # use std::path::PathBuf;
/// # use formatjs_cli::compile::{compile, PseudoLocale};
/// let files = vec![PathBuf::from("lang/*.json")];
/// compile(
///     &files,
///     None,
///     Some(&PathBuf::from("compiled.json")),
///     true,
///     false,
///     Some(PseudoLocale::EnXa),
///     false,
/// ).unwrap();
/// ```
#[allow(clippy::too_many_arguments)]
pub fn compile(
    translation_files: &[PathBuf],
    format: Option<Formatter>,
    out_file: Option<&PathBuf>,
    ast: bool,
    skip_errors: bool,
    pseudo_locale: Option<PseudoLocale>,
    ignore_tag: bool,
) -> Result<()> {
    use formatjs_icu_messageformat_parser::{Parser, ParserOptions};

    // Validate pseudo-locale requires ast
    if pseudo_locale.is_some() && !ast {
        anyhow::bail!("Pseudo-locale generation requires --ast flag");
    }

    // Warn about unimplemented features
    if pseudo_locale.is_some() {
        eprintln!("Warning: Pseudo-locale transformations not yet implemented");
    }

    // Default to "default" formatter if none provided (matches TypeScript CLI)
    let formatter = format.unwrap_or(Formatter::Default);

    // Step 1: Expand glob patterns to actual file paths
    let mut expanded_files = Vec::new();
    for pattern in translation_files {
        let pattern_str = pattern
            .to_str()
            .context("Pattern path contains invalid UTF-8")?;

        let base_dir = crate::extract::extract_base_dir(pattern_str);
        if base_dir.exists() {
            for entry in WalkDir::new(&base_dir).into_iter().filter_map(|e| e.ok()) {
                if entry.path().is_file() {
                    let path_str = entry.path().to_string_lossy();
                    if fast_glob::glob_match(pattern_str, path_str.as_ref()) {
                        expanded_files.push(entry.path().to_path_buf());
                    }
                }
            }
        }
    }

    if expanded_files.is_empty() {
        anyhow::bail!("No translation files found matching the patterns");
    }

    // Step 2: Load and aggregate all messages from files
    // Store both message and source file for better error reporting
    let mut messages: BTreeMap<String, (String, PathBuf)> = BTreeMap::new();

    for file in &expanded_files {
        let content = std::fs::read_to_string(file)
            .with_context(|| format!("Failed to read file: {}", file.display()))?;

        let json: Value = serde_json::from_str(&content)
            .with_context(|| format!("Failed to parse JSON in file: {}", file.display()))?;

        // Apply formatter to extract messages
        let file_path_str = file.to_str().unwrap_or("<invalid path>");
        let file_messages = formatter.apply(&json, file_path_str)?;

        // Merge messages, checking for conflicts
        // Convert to BTreeMap for sorted iteration
        for (key, message_str) in file_messages {
            // Check for conflicts - same ID with different message
            if let Some((existing, existing_file)) = messages.get(&key) {
                if existing != &message_str {
                    anyhow::bail!(
                        "Conflicting ID \"{}\" with different translation found in these 2 files:\n  {}\n  {}",
                        key,
                        existing_file.display(),
                        file.display()
                    );
                }
            }
            messages.insert(key, (message_str, file.clone()));
        }
    }

    if messages.is_empty() {
        eprintln!("Warning: No messages found in translation files");
    }

    // Step 3: Parse and validate ICU MessageFormat, compile to output format
    let mut compiled_messages: Map<String, Value> = Map::new();
    let mut error_count = 0;

    let parser_options = ParserOptions {
        ignore_tag,
        should_parse_skeletons: true,
        requires_other_clause: true,
        ..Default::default()
    };

    for (id, (message, source_file)) in &messages {
        let parser = Parser::new(message.as_str(), parser_options.clone());
        match parser.parse() {
            Ok(msg_ast) => {
                // TODO: Apply pseudo-locale transformations to AST if specified
                // This would modify literal elements in the AST

                if ast {
                    // Serialize AST to JSON for output
                    let ast_json = serde_json::to_value(&msg_ast)
                        .with_context(|| format!("Failed to serialize AST for message '{}'", id))?;
                    compiled_messages.insert(id.clone(), ast_json);
                } else {
                    // Keep as validated string
                    compiled_messages.insert(id.clone(), json!(message));
                }
            }
            Err(e) => {
                error_count += 1;
                if skip_errors {
                    eprintln!(
                        "[@formatjs/cli] [WARN] Error validating message \"{}\" with ID \"{}\" in file {}",
                        message,
                        id,
                        source_file.display()
                    );
                } else {
                    // Match TypeScript error format: "SyntaxError: ERROR_KIND"
                    anyhow::bail!("SyntaxError: {}", e);
                }
            }
        }
    }

    if error_count > 0 {
        eprintln!("\nSkipped {} message(s) with parsing errors", error_count);
    }

    // Step 4: Serialize and write output
    let output_json = Value::Object(compiled_messages);
    let output = serde_json::to_string_pretty(&output_json)
        .context("Failed to serialize compiled messages to JSON")?;

    if let Some(out_path) = out_file {
        // Create parent directories if they don't exist
        if let Some(parent) = out_path.parent() {
            std::fs::create_dir_all(parent).with_context(|| {
                format!(
                    "Failed to create parent directories for {}",
                    out_path.display()
                )
            })?;
        }
        // Write to file with trailing newline
        std::fs::write(out_path, format!("{}\n", output))
            .with_context(|| format!("Failed to write output to {}", out_path.display()))?;
        // Silently succeed (matches TypeScript CLI behavior)
    } else {
        // Print to stdout (no trailing newline for piping)
        println!("{}", output);
    }

    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;
    use serde_json::json;
    use std::fs;
    use tempfile::tempdir;

    #[test]
    fn test_compile_simple_messages() {
        let dir = tempdir().unwrap();
        let input_file = dir.path().join("messages.json");
        let output_file = dir.path().join("compiled.json");

        // Write input file with simple string format (for Simple formatter)
        fs::write(
            &input_file,
            json!({
                "greeting": "Hello {name}!",
                "farewell": "Goodbye!"
            })
            .to_string(),
        )
        .unwrap();

        // Compile with Simple formatter explicitly (accepts simple strings)
        compile(
            &[input_file],
            Some(Formatter::Simple),
            Some(&output_file),
            false, // not AST
            false, // don't skip errors
            None,  // no pseudo-locale
            false, // don't ignore tags
        )
        .unwrap();

        // Verify output
        let output_content = fs::read_to_string(&output_file).unwrap();
        let output_json: serde_json::Value = serde_json::from_str(&output_content).unwrap();

        assert_eq!(output_json["greeting"], "Hello {name}!");
        assert_eq!(output_json["farewell"], "Goodbye!");
    }

    #[test]
    fn test_compile_with_default_formatter() {
        let dir = tempdir().unwrap();
        let input_file = dir.path().join("messages.json");
        let output_file = dir.path().join("compiled.json");

        // Write input file with MessageDescriptor format
        fs::write(
            &input_file,
            json!({
                "greeting": {
                    "defaultMessage": "Hello {name}!",
                    "description": "Greeting message"
                }
            })
            .to_string(),
        )
        .unwrap();

        // Compile with default formatter
        compile(
            &[input_file],
            Some(Formatter::Default),
            Some(&output_file),
            false,
            false,
            None,
            false,
        )
        .unwrap();

        // Verify output
        let output_content = fs::read_to_string(&output_file).unwrap();
        let output_json: serde_json::Value = serde_json::from_str(&output_content).unwrap();

        assert_eq!(output_json["greeting"], "Hello {name}!");
    }

    #[test]
    fn test_compile_to_ast() {
        let dir = tempdir().unwrap();
        let input_file = dir.path().join("messages.json");
        let output_file = dir.path().join("compiled.json");

        // Write input file with message descriptor format
        fs::write(
            &input_file,
            json!({
                "greeting": {
                    "defaultMessage": "Hello {name}!"
                }
            })
            .to_string(),
        )
        .unwrap();

        // Compile to AST
        compile(
            &[input_file],
            None,
            Some(&output_file),
            true, // AST output
            false,
            None,
            false,
        )
        .unwrap();

        // Verify output is AST
        let output_content = fs::read_to_string(&output_file).unwrap();
        let output_json: serde_json::Value = serde_json::from_str(&output_content).unwrap();

        // AST should be an array
        assert!(output_json["greeting"].is_array());
    }

    #[test]
    fn test_compile_invalid_icu_message() {
        let dir = tempdir().unwrap();
        let input_file = dir.path().join("messages.json");
        let output_file = dir.path().join("compiled.json");

        // Write input file with invalid ICU syntax
        fs::write(
            &input_file,
            json!({
                "invalid": {
                    "defaultMessage": "Hello {name"  // Missing closing brace
                }
            })
            .to_string(),
        )
        .unwrap();

        // Should fail without skip_errors
        let result = compile(
            &[input_file.clone()],
            None,
            Some(&output_file),
            false,
            false, // don't skip errors
            None,
            false,
        );

        assert!(result.is_err());
    }

    #[test]
    fn test_compile_skip_errors() {
        let dir = tempdir().unwrap();
        let input_file = dir.path().join("messages.json");
        let output_file = dir.path().join("compiled.json");

        // Write input file with one valid and one invalid message
        fs::write(
            &input_file,
            json!({
                "valid": {
                    "defaultMessage": "Hello {name}!"
                },
                "invalid": {
                    "defaultMessage": "Hello {name"  // Missing closing brace
                }
            })
            .to_string(),
        )
        .unwrap();

        // Should succeed with skip_errors
        compile(
            &[input_file],
            None,
            Some(&output_file),
            false,
            true, // skip errors
            None,
            false,
        )
        .unwrap();

        // Verify only valid message is in output
        let output_content = fs::read_to_string(&output_file).unwrap();
        let output_json: serde_json::Value = serde_json::from_str(&output_content).unwrap();

        assert_eq!(output_json["valid"], "Hello {name}!");
        assert!(output_json.get("invalid").is_none());
    }

    #[test]
    fn test_compile_multiple_files() {
        let dir = tempdir().unwrap();
        let input_file1 = dir.path().join("messages1.json");
        let input_file2 = dir.path().join("messages2.json");
        let output_file = dir.path().join("compiled.json");

        // Write input files with message descriptor format
        fs::write(
            &input_file1,
            json!({"greeting": {"defaultMessage": "Hello!"}}).to_string(),
        )
        .unwrap();
        fs::write(
            &input_file2,
            json!({"farewell": {"defaultMessage": "Goodbye!"}}).to_string(),
        )
        .unwrap();

        // Compile
        compile(
            &[input_file1, input_file2],
            None,
            Some(&output_file),
            false,
            false,
            None,
            false,
        )
        .unwrap();

        // Verify output contains both messages
        let output_content = fs::read_to_string(&output_file).unwrap();
        let output_json: serde_json::Value = serde_json::from_str(&output_content).unwrap();

        assert_eq!(output_json["greeting"], "Hello!");
        assert_eq!(output_json["farewell"], "Goodbye!");
    }

    #[test]
    fn test_compile_conflict_detection() {
        let dir = tempdir().unwrap();
        let input_file1 = dir.path().join("messages1.json");
        let input_file2 = dir.path().join("messages2.json");
        let output_file = dir.path().join("compiled.json");

        // Write input files with conflicting message IDs (different defaultMessage values)
        fs::write(
            &input_file1,
            json!({"greeting": {"defaultMessage": "Hello!"}}).to_string(),
        )
        .unwrap();
        fs::write(
            &input_file2,
            json!({"greeting": {"defaultMessage": "Bonjour!"}}).to_string(),
        )
        .unwrap();

        // Should fail due to conflict
        let result = compile(
            &[input_file1, input_file2],
            None,
            Some(&output_file),
            false,
            false,
            None,
            false,
        );

        assert!(result.is_err());
        assert!(result.unwrap_err().to_string().contains("Conflict"));
    }

    #[test]
    fn test_compile_with_glob_pattern() {
        let dir = tempdir().unwrap();

        // Create multiple JSON files with message descriptor format
        fs::write(
            dir.path().join("en.json"),
            json!({"greeting": {"defaultMessage": "Hello!"}}).to_string(),
        )
        .unwrap();
        fs::write(
            dir.path().join("fr.json"),
            json!({"farewell": {"defaultMessage": "Au revoir!"}}).to_string(),
        )
        .unwrap();

        let output_file = dir.path().join("compiled.json");
        let pattern = dir.path().join("*.json");

        // Compile using glob pattern
        compile(
            &[pattern],
            None,
            Some(&output_file),
            false,
            false,
            None,
            false,
        )
        .unwrap();

        // Verify output contains messages from both files
        let output_content = fs::read_to_string(&output_file).unwrap();
        let output_json: serde_json::Value = serde_json::from_str(&output_content).unwrap();

        assert_eq!(output_json["greeting"], "Hello!");
        assert_eq!(output_json["farewell"], "Au revoir!");
    }

    #[test]
    fn test_compile_icu_plural() {
        let dir = tempdir().unwrap();
        let input_file = dir.path().join("messages.json");
        let output_file = dir.path().join("compiled.json");

        // Write input file with ICU plural
        fs::write(
            &input_file,
            json!({
                "items": {
                    "defaultMessage": "{count, plural, one {# item} other {# items}}"
                }
            })
            .to_string(),
        )
        .unwrap();

        // Compile
        compile(
            &[input_file],
            None,
            Some(&output_file),
            false,
            false,
            None,
            false,
        )
        .unwrap();

        // Verify output
        let output_content = fs::read_to_string(&output_file).unwrap();
        let output_json: serde_json::Value = serde_json::from_str(&output_content).unwrap();

        assert_eq!(
            output_json["items"],
            "{count, plural, one {# item} other {# items}}"
        );
    }

    #[test]
    fn test_compile_with_transifex_formatter() {
        let dir = tempdir().unwrap();
        let input_file = dir.path().join("messages.json");
        let output_file = dir.path().join("compiled.json");

        // Write input file in Transifex format
        fs::write(
            &input_file,
            json!({
                "greeting": {
                    "string": "Hello {name}!",
                    "developer_comment": "Greeting"
                }
            })
            .to_string(),
        )
        .unwrap();

        // Compile with Transifex formatter
        compile(
            &[input_file],
            Some(Formatter::Transifex),
            Some(&output_file),
            false,
            false,
            None,
            false,
        )
        .unwrap();

        // Verify output
        let output_content = fs::read_to_string(&output_file).unwrap();
        let output_json: serde_json::Value = serde_json::from_str(&output_content).unwrap();

        assert_eq!(output_json["greeting"], "Hello {name}!");
    }

    #[test]
    fn test_compile_pseudo_locale_requires_ast() {
        let dir = tempdir().unwrap();
        let input_file = dir.path().join("messages.json");
        let output_file = dir.path().join("compiled.json");

        fs::write(&input_file, json!({"msg": "Hello!"}).to_string()).unwrap();

        // Should fail when pseudo_locale is specified without ast
        let result = compile(
            &[input_file],
            None,
            Some(&output_file),
            false, // not AST
            false,
            Some(PseudoLocale::EnXa), // pseudo-locale specified
            false,
        );

        assert!(result.is_err());
        assert!(
            result
                .unwrap_err()
                .to_string()
                .contains("requires --ast flag")
        );
    }

    #[test]
    fn test_compile_sorted_keys() {
        let dir = tempdir().unwrap();
        let input_file = dir.path().join("messages.json");
        let output_file = dir.path().join("compiled.json");

        // Write input file with messages in unsorted order
        fs::write(
            &input_file,
            json!({
                "zebra": {
                    "defaultMessage": "Zebra message"
                },
                "apple": {
                    "defaultMessage": "Apple message"
                },
                "mango": {
                    "defaultMessage": "Mango message"
                },
                "banana": {
                    "defaultMessage": "Banana message"
                }
            })
            .to_string(),
        )
        .unwrap();

        // Compile
        compile(
            &[input_file],
            None,
            Some(&output_file),
            false,
            false,
            None,
            false,
        )
        .unwrap();

        // Verify output has sorted keys
        let output_content = fs::read_to_string(&output_file).unwrap();
        let output_json: serde_json::Value = serde_json::from_str(&output_content).unwrap();

        // Get the keys and verify they are sorted
        let keys: Vec<&str> = output_json
            .as_object()
            .unwrap()
            .keys()
            .map(|s| s.as_str())
            .collect();
        let mut sorted_keys = keys.clone();
        sorted_keys.sort();

        // Keys should be in alphabetical order
        assert_eq!(keys, sorted_keys, "Keys should be sorted alphabetically");
        assert_eq!(keys, vec!["apple", "banana", "mango", "zebra"]);
    }

    #[test]
    fn test_compile_sorted_keys_multiple_files() {
        let dir = tempdir().unwrap();
        let input_file1 = dir.path().join("messages1.json");
        let input_file2 = dir.path().join("messages2.json");
        let output_file = dir.path().join("compiled.json");

        // Write input files with messages that would be unsorted when merged
        fs::write(
            &input_file1,
            json!({
                "zebra": {"defaultMessage": "Zebra!"},
                "delta": {"defaultMessage": "Delta!"}
            })
            .to_string(),
        )
        .unwrap();
        fs::write(
            &input_file2,
            json!({
                "alpha": {"defaultMessage": "Alpha!"},
                "charlie": {"defaultMessage": "Charlie!"}
            })
            .to_string(),
        )
        .unwrap();

        // Compile
        compile(
            &[input_file1, input_file2],
            None,
            Some(&output_file),
            false,
            false,
            None,
            false,
        )
        .unwrap();

        // Verify output contains sorted keys from both files
        let output_content = fs::read_to_string(&output_file).unwrap();
        let output_json: serde_json::Value = serde_json::from_str(&output_content).unwrap();

        // Get the keys and verify they are sorted
        let keys: Vec<&str> = output_json
            .as_object()
            .unwrap()
            .keys()
            .map(|s| s.as_str())
            .collect();

        assert_
Download .txt
gitextract__h02utbx/

├── .aspect/
│   └── bazelrc/
│       ├── .gitignore
│       ├── bazel5.bazelrc
│       ├── bazel6.bazelrc
│       ├── ci.bazelrc
│       ├── convenience.bazelrc
│       ├── correctness.bazelrc
│       ├── debug.bazelrc
│       ├── javascript.bazelrc
│       └── performance.bazelrc
├── .bazelrc
├── .bazelversion
├── .commitlintrc.mjs
├── .eslintignore
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── bug_report.md
│   └── workflows/
│       ├── claude.yml
│       ├── prerelease.yml
│       ├── release.yml
│       ├── rust-cli-release.yml
│       ├── stale.yml
│       ├── test.yml
│       ├── typesense-index.yml
│       ├── verify-hooks.yml
│       └── website.yml
├── .gitignore
├── .npmrc
├── .oxfmtrc.json
├── .oxlintrc.json
├── .syncpackrc.json
├── .vscode/
│   ├── extensions.json
│   ├── settings.json
│   └── tasks.json
├── BUILD.bazel
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cargo.toml
├── MODULE.bazel
├── README.md
├── REPO.bazel
├── UPCOMING.md
├── benchmarks/
│   └── cli-comparison/
│       ├── BUILD.bazel
│       ├── README.md
│       ├── benchmark-results.json
│       ├── benchmark-tinybench.mjs
│       ├── generate-test-files.mjs
│       ├── package.json
│       └── run-benchmark.sh
├── buildbuddy.yaml
├── config.json
├── conformance-tests/
│   └── icu4j/
│       ├── BUILD.bazel
│       └── ICUConformanceTest.java
├── crates/
│   ├── formatjs_cli/
│   │   ├── BUILD.bazel
│   │   ├── Cargo.toml
│   │   ├── README.md
│   │   ├── RELEASE.md
│   │   ├── build-multiplatform.sh
│   │   ├── platforms/
│   │   │   └── BUILD.bazel
│   │   ├── release.sh
│   │   └── src/
│   │       ├── compile.rs
│   │       ├── compile_folder.rs
│   │       ├── extract.rs
│   │       ├── extractor.rs
│   │       ├── formatters/
│   │       │   ├── crowdin.rs
│   │       │   ├── default.rs
│   │       │   ├── lokalise.rs
│   │       │   ├── mod.rs
│   │       │   ├── simple.rs
│   │       │   ├── smartling.rs
│   │       │   └── transifex.rs
│   │       ├── id_generator.rs
│   │       ├── main.rs
│   │       └── verify.rs
│   ├── icu_messageformat_parser/
│   │   ├── BENCHMARK.md
│   │   ├── BUILD.bazel
│   │   ├── Cargo.toml
│   │   ├── OPTIMIZATION_SUMMARY.md
│   │   ├── README.md
│   │   ├── benches/
│   │   │   └── parser_bench.rs
│   │   ├── date_time_pattern_generator.rs
│   │   ├── error.rs
│   │   ├── lib.rs
│   │   ├── lib_wasm.rs
│   │   ├── manipulator.rs
│   │   ├── parser.rs
│   │   ├── printer.rs
│   │   ├── regex_generated.rs
│   │   ├── time_data_generated.rs
│   │   └── types.rs
│   └── icu_skeleton_parser/
│       ├── BUILD.bazel
│       ├── Cargo.toml
│       ├── datetime_format_options.rs
│       ├── datetime_parser.rs
│       ├── lib.rs
│       ├── number_format_options.rs
│       ├── number_parser.rs
│       └── number_skeleton_token.rs
├── docs/
│   ├── .nojekyll
│   ├── BUILD.bazel
│   ├── README.md
│   ├── index.html
│   ├── package.json
│   ├── public/
│   │   └── img/
│   │       ├── distribute-libs.excalidraw
│   │       ├── polyfills.excalidraw
│   │       ├── simple-workflow.excalidraw
│   │       └── workflow.excalidraw
│   ├── scripts/
│   │   ├── build-typesense-index.ts
│   │   ├── extract-metadata.ts
│   │   └── upload-typesense-index.ts
│   ├── src/
│   │   ├── components/
│   │   │   ├── Admonition.tsx
│   │   │   ├── Breadcrumbs.tsx
│   │   │   ├── IcuEditor.tsx
│   │   │   ├── Layout.tsx
│   │   │   ├── LiveCodeBlock.tsx
│   │   │   ├── MDXComponents.tsx
│   │   │   ├── SearchBar.tsx
│   │   │   ├── Sidebar.tsx
│   │   │   ├── home/
│   │   │   │   ├── BrowserSection.tsx
│   │   │   │   ├── FeaturesSection.tsx
│   │   │   │   ├── HeroSection.tsx
│   │   │   │   ├── HomeFooter.tsx
│   │   │   │   ├── HomeHeader.tsx
│   │   │   │   └── TrustedBySection.tsx
│   │   │   └── ui/
│   │   │       ├── accordion.tsx
│   │   │       ├── alert.tsx
│   │   │       ├── breadcrumb.tsx
│   │   │       ├── button.tsx
│   │   │       ├── command.tsx
│   │   │       ├── dialog.tsx
│   │   │       ├── dropdown-menu.tsx
│   │   │       ├── input.tsx
│   │   │       ├── navigation-menu.tsx
│   │   │       ├── popover.tsx
│   │   │       ├── separator.tsx
│   │   │       ├── sheet.tsx
│   │   │       └── tabs.tsx
│   │   ├── docs/
│   │   │   ├── core-concepts/
│   │   │   │   ├── basic-internationalization-principles.mdx
│   │   │   │   └── icu-syntax.mdx
│   │   │   ├── getting-started/
│   │   │   │   ├── application-workflow.mdx
│   │   │   │   ├── installation.mdx
│   │   │   │   ├── message-declaration.mdx
│   │   │   │   ├── message-distribution.mdx
│   │   │   │   └── message-extraction.mdx
│   │   │   ├── guides/
│   │   │   │   ├── advanced-usage.mdx
│   │   │   │   ├── bundler-plugins.mdx
│   │   │   │   ├── develop.mdx
│   │   │   │   ├── distribute-libraries.mdx
│   │   │   │   ├── migrate-from-i18next.mdx
│   │   │   │   ├── migrate-from-lingui.mdx
│   │   │   │   ├── nextjs-app-router.mdx
│   │   │   │   ├── performance.mdx
│   │   │   │   ├── react-native-hermes.mdx
│   │   │   │   ├── runtime-requirements.mdx
│   │   │   │   ├── testing-with-react-intl.mdx
│   │   │   │   └── wrapper-components.mdx
│   │   │   ├── icu-messageformat-parser.mdx
│   │   │   ├── intl-messageformat.mdx
│   │   │   ├── intl.mdx
│   │   │   ├── polyfills/
│   │   │   │   ├── intl-datetimeformat.mdx
│   │   │   │   ├── intl-displaynames.mdx
│   │   │   │   ├── intl-durationformat.mdx
│   │   │   │   ├── intl-getcanonicallocales.mdx
│   │   │   │   ├── intl-listformat.mdx
│   │   │   │   ├── intl-locale.mdx
│   │   │   │   ├── intl-localematcher.mdx
│   │   │   │   ├── intl-numberformat.mdx
│   │   │   │   ├── intl-pluralrules.mdx
│   │   │   │   ├── intl-relativetimeformat.mdx
│   │   │   │   ├── intl-segmenter.mdx
│   │   │   │   └── intl-supportedvaluesof.mdx
│   │   │   ├── polyfills.mdx
│   │   │   ├── react-intl/
│   │   │   │   ├── api.mdx
│   │   │   │   ├── components.mdx
│   │   │   │   ├── upgrade-guide-10.x.mdx
│   │   │   │   ├── upgrade-guide-2.x.mdx
│   │   │   │   ├── upgrade-guide-3.x.mdx
│   │   │   │   ├── upgrade-guide-4.x.mdx
│   │   │   │   ├── upgrade-guide-5.x.mdx
│   │   │   │   ├── upgrade-guide-6.x.mdx
│   │   │   │   ├── upgrade-guide-7.x.mdx
│   │   │   │   └── upgrade-guide-8.x.mdx
│   │   │   ├── react-intl.mdx
│   │   │   ├── svelte-intl.mdx
│   │   │   ├── tooling/
│   │   │   │   ├── babel-plugin.mdx
│   │   │   │   ├── bazel.mdx
│   │   │   │   ├── cli.mdx
│   │   │   │   ├── linter.mdx
│   │   │   │   ├── rust-icu-messageformat-parser.mdx
│   │   │   │   ├── rust-icu-skeleton-parser.mdx
│   │   │   │   ├── swc-plugin.mdx
│   │   │   │   ├── ts-transformer.mdx
│   │   │   │   └── unplugin.mdx
│   │   │   └── vue-intl.mdx
│   │   ├── docs-metadata.generated.json
│   │   ├── lang/
│   │   │   ├── strings_cs-CZ.json
│   │   │   ├── strings_de-DE.json
│   │   │   ├── strings_en-US.json
│   │   │   ├── strings_es-AR.json
│   │   │   ├── strings_fr-FR.json
│   │   │   ├── strings_ja-JP.json
│   │   │   ├── strings_pt-BR.json
│   │   │   └── strings_sv-SE.json
│   │   ├── lib/
│   │   │   └── utils.ts
│   │   ├── pages/
│   │   │   ├── +Head.tsx
│   │   │   ├── +Layout.tsx
│   │   │   ├── +config.ts
│   │   │   ├── Home.tsx
│   │   │   ├── docs/
│   │   │   │   └── @path/
│   │   │   │       ├── +Head.tsx
│   │   │   │       ├── +Page.tsx
│   │   │   │       ├── +description.ts
│   │   │   │       ├── +onBeforePrerenderStart.ts
│   │   │   │       ├── +prerender.ts
│   │   │   │       ├── +route.ts
│   │   │   │       └── +title.ts
│   │   │   └── index/
│   │   │       ├── +Head.tsx
│   │   │       └── +Page.tsx
│   │   ├── styles/
│   │   │   └── global.css
│   │   ├── theme/
│   │   │   ├── TabItem.tsx
│   │   │   └── Tabs.tsx
│   │   ├── utils/
│   │   │   └── navigation.ts
│   │   └── vite-env.d.ts
│   ├── tailwind.config.ts
│   ├── tsconfig.json
│   └── vite.config.ts
├── formatjs.github.io.BUILD
├── lefthook.yml
├── lerna.json
├── package.json
├── packages/
│   ├── babel-plugin-formatjs/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── global.d.ts
│   │   ├── index.ts
│   │   ├── integration-tests/
│   │   │   ├── BUILD.bazel
│   │   │   ├── package.json
│   │   │   └── vue/
│   │   │       ├── fixtures/
│   │   │       │   ├── App.vue
│   │   │       │   └── app.js
│   │   │       └── integration.test.ts
│   │   ├── package.json
│   │   ├── tests/
│   │   │   ├── __snapshots__/
│   │   │   │   └── index.test.ts.snap
│   │   │   ├── fixtures/
│   │   │   │   ├── 2663.js
│   │   │   │   ├── BUILD.bazel
│   │   │   │   ├── FormattedMessage.js
│   │   │   │   ├── additionalComponentNames.js
│   │   │   │   ├── additionalFunctionNames.js
│   │   │   │   ├── ast.js
│   │   │   │   ├── defineMessage.js
│   │   │   │   ├── defineMessages.js
│   │   │   │   ├── descriptionsAsObjects.js
│   │   │   │   ├── empty.js
│   │   │   │   ├── extractFromFormatMessageCall.js
│   │   │   │   ├── extractFromFormatMessageCallStateless.js
│   │   │   │   ├── extractSourceLocation.js
│   │   │   │   ├── flattenError.js
│   │   │   │   ├── flattenWithOverrideIdFn.js
│   │   │   │   ├── formatMessageCall.js
│   │   │   │   ├── icuSyntax.js
│   │   │   │   ├── idInterpolationPattern.js
│   │   │   │   ├── inline.js
│   │   │   │   ├── jsxNestedInCallExpr.js
│   │   │   │   ├── optionalChaining.js
│   │   │   │   ├── overrideIdFn.js
│   │   │   │   ├── preserveWhitespace.js
│   │   │   │   ├── removeDefaultMessage.js
│   │   │   │   ├── shorthandT.js
│   │   │   │   ├── skipExtractionFormattedMessage.js
│   │   │   │   └── templateLiteral.js
│   │   │   └── index.test.ts
│   │   ├── tsconfig.json
│   │   ├── types.ts
│   │   ├── utils.ts
│   │   └── visitors/
│   │       ├── call-expression.ts
│   │       └── jsx-opening-element.ts
│   ├── bigdecimal/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── tests/
│   │   │   └── bigdecimal.test.ts
│   │   └── tsconfig.json
│   ├── cli/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── integration-tests/
│   │   │   ├── BUILD.bazel
│   │   │   ├── compile/
│   │   │   │   ├── __snapshots__/
│   │   │   │   │   └── integration.test.ts.snap
│   │   │   │   ├── glob/
│   │   │   │   │   ├── en.json
│   │   │   │   │   └── en2.json
│   │   │   │   ├── glob-conflict/
│   │   │   │   │   ├── en.json
│   │   │   │   │   └── en2.json
│   │   │   │   ├── integration.test.ts
│   │   │   │   └── lang/
│   │   │   │       ├── empty.json
│   │   │   │       ├── en-crowdin.json
│   │   │   │       ├── en-format.json
│   │   │   │       ├── en-lokalise.json
│   │   │   │       ├── en-simple.json
│   │   │   │       ├── en-smartling.json
│   │   │   │       ├── en-transifex.json
│   │   │   │       ├── en.json
│   │   │   │       ├── html-messages.json
│   │   │   │       └── malformed-messages.json
│   │   │   ├── compile_folder/
│   │   │   │   ├── __snapshots__/
│   │   │   │   │   └── integration.test.ts.snap
│   │   │   │   ├── integration.test.ts
│   │   │   │   └── lang/
│   │   │   │       ├── empty.json
│   │   │   │       ├── en.json
│   │   │   │       └── en2.json
│   │   │   ├── conformance-tests/
│   │   │   │   ├── README.md
│   │   │   │   ├── SUMMARY.md
│   │   │   │   ├── conformance.test.ts
│   │   │   │   └── test_cases/
│   │   │   │       ├── 01_basic_extract.txt
│   │   │   │       ├── 02_plural_messages.txt
│   │   │   │       ├── 03_flatten_option.txt
│   │   │   │       ├── 04_content_hash_id.txt
│   │   │   │       ├── 05_additional_function_names.txt
│   │   │   │       ├── 06_extract_source_location.txt
│   │   │   │       ├── 07_format_simple.txt
│   │   │   │       ├── 08_whitespace_preservation.txt
│   │   │   │       ├── 09_escaped_quotes.txt
│   │   │   │       ├── 10_nested_select_plural.txt
│   │   │   │       ├── 11_format_transifex.txt
│   │   │   │       ├── 12_format_lokalise.txt
│   │   │   │       ├── 13_format_crowdin.txt
│   │   │   │       ├── 14_format_smartling.txt
│   │   │   │       ├── 15_inline_formatmessage.txt
│   │   │   │       ├── 16_typescript_file.txt
│   │   │   │       ├── 17_pragma.txt
│   │   │   │       ├── 18_optional_chaining.txt
│   │   │   │       ├── 19_no_id_with_hash.txt
│   │   │   │       └── 20_flatten_with_hash.txt
│   │   │   ├── extract/
│   │   │   │   ├── defineMessages/
│   │   │   │   │   ├── actual.ignore.jsx
│   │   │   │   │   ├── actual.jsx
│   │   │   │   │   └── bad.json
│   │   │   │   ├── duplicated/
│   │   │   │   │   ├── file1.tsx
│   │   │   │   │   └── file2.tsx
│   │   │   │   ├── flattenWithIdPattern/
│   │   │   │   │   └── actual.js
│   │   │   │   ├── inFile/
│   │   │   │   │   ├── file1.tsx
│   │   │   │   │   └── file2.tsx
│   │   │   │   ├── inFile.txt
│   │   │   │   ├── issue-6009/
│   │   │   │   │   └── Test.tsx
│   │   │   │   ├── nonDuplicated/
│   │   │   │   │   ├── file1.tsx
│   │   │   │   │   └── file2.tsx
│   │   │   │   ├── optionalChaining/
│   │   │   │   │   └── actual.tsx
│   │   │   │   ├── taggedTemplates/
│   │   │   │   │   └── actual.tsx
│   │   │   │   ├── throwsFlag/
│   │   │   │   │   ├── all-valid.tsx
│   │   │   │   │   └── mixed-valid-invalid.tsx
│   │   │   │   └── typescript/
│   │   │   │       ├── actual.ignore.tsx
│   │   │   │       ├── actual.tsx
│   │   │   │       ├── err.tsx
│   │   │   │       ├── importMeta.mts
│   │   │   │       ├── non-static.tsx
│   │   │   │       ├── pragma.tsx
│   │   │   │       └── ts47.tsx
│   │   │   ├── extract-glimmer/
│   │   │   │   ├── comp.gjs
│   │   │   │   ├── comp.gts
│   │   │   │   ├── comp.hbs
│   │   │   │   └── integration.test.ts
│   │   │   ├── extract-vue/
│   │   │   │   ├── comp.vue
│   │   │   │   └── integration.test.ts
│   │   │   ├── formatter.js
│   │   │   ├── package.json
│   │   │   ├── rust-binary-utils.ts
│   │   │   └── verify/
│   │   │       ├── extra-keys/
│   │   │       │   ├── fixtures1/
│   │   │       │   │   ├── en-US.json
│   │   │       │   │   └── fr-FR.json
│   │   │       │   └── fixtures2/
│   │   │       │       ├── en-US.json
│   │   │       │       └── fr-FR.json
│   │   │       ├── integration.test.ts
│   │   │       ├── missing-keys/
│   │   │       │   ├── fixtures1/
│   │   │       │   │   ├── en-US.json
│   │   │       │   │   ├── es.json
│   │   │       │   │   └── fr.json
│   │   │       │   ├── fixtures2/
│   │   │       │   │   ├── en-US.json
│   │   │       │   │   └── fr-FR.json
│   │   │       │   ├── fixtures3/
│   │   │       │   │   └── fr.json
│   │   │       │   └── fixtures4/
│   │   │       │       ├── en-US.json
│   │   │       │       └── fr-FR.json
│   │   │       └── structural-equality/
│   │   │           ├── fixtures1/
│   │   │           │   ├── en-US.json
│   │   │           │   └── fr.json
│   │   │           └── fixtures2/
│   │   │               ├── en-US.json
│   │   │               └── fr-FR.json
│   │   └── package.json
│   ├── cli-lib/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── integration-tests/
│   │   │   ├── BUILD.bazel
│   │   │   ├── package.json
│   │   │   └── test_esm_imports.mjs
│   │   ├── main.ts
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── cli.ts
│   │   │   ├── compile.ts
│   │   │   ├── compile_folder.ts
│   │   │   ├── console_utils.ts
│   │   │   ├── extract.ts
│   │   │   ├── formatters/
│   │   │   │   ├── crowdin.ts
│   │   │   │   ├── default.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── lokalise.ts
│   │   │   │   ├── simple.ts
│   │   │   │   ├── smartling.ts
│   │   │   │   └── transifex.ts
│   │   │   ├── gts_extractor.ts
│   │   │   ├── hbs_extractor.ts
│   │   │   ├── parse_script.ts
│   │   │   ├── pseudo_locale.ts
│   │   │   ├── svelte_extractor.ts
│   │   │   ├── verify/
│   │   │   │   ├── checkExtraKeys.ts
│   │   │   │   ├── checkMissingKeys.ts
│   │   │   │   ├── checkStructuralEquality.ts
│   │   │   │   └── index.ts
│   │   │   └── vue_extractor.ts
│   │   ├── tests/
│   │   │   └── unit/
│   │   │       ├── __snapshots__/
│   │   │       │   ├── gts_extractor.test.ts.snap
│   │   │       │   ├── hbs_extractor.test.ts.snap
│   │   │       │   ├── pseudo_locale.test.ts.snap
│   │   │       │   ├── svelte_extractor.test.ts.snap
│   │   │       │   └── vue_extractor.test.ts.snap
│   │   │       ├── abort_signal.test.ts
│   │   │       ├── fixtures/
│   │   │       │   ├── bind.svelte
│   │   │       │   ├── bind.vue
│   │   │       │   ├── comp.gjs
│   │   │       │   ├── comp.gts
│   │   │       │   ├── comp.hbs
│   │   │       │   ├── comp.svelte
│   │   │       │   └── comp.vue
│   │   │       ├── gts_extractor.test.ts
│   │   │       ├── hbs_extractor.test.ts
│   │   │       ├── pseudo_locale.test.ts
│   │   │       ├── svelte_extractor.test.ts
│   │   │       ├── unit.test.ts
│   │   │       └── vue_extractor.test.ts
│   │   └── tsconfig.json
│   ├── ecma376/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── tests/
│   │   │   └── index.test.ts
│   │   └── tsconfig.json
│   ├── ecma402-abstract/
│   │   ├── 262.ts
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── CanonicalizeLocaleList.ts
│   │   ├── CanonicalizeTimeZoneName.ts
│   │   ├── CoerceOptionsToObject.ts
│   │   ├── DefaultNumberOption.ts
│   │   ├── GetNumberOption.ts
│   │   ├── GetOption.ts
│   │   ├── GetOptionsObject.ts
│   │   ├── GetStringOrBooleanOption.ts
│   │   ├── IsSanctionedSimpleUnitIdentifier.ts
│   │   ├── IsValidTimeZoneName.ts
│   │   ├── IsWellFormedCurrencyCode.ts
│   │   ├── IsWellFormedUnitIdentifier.ts
│   │   ├── LICENSE.md
│   │   ├── NumberFormat/
│   │   │   ├── ApplyUnsignedRoundingMode.ts
│   │   │   ├── CollapseNumberRange.ts
│   │   │   ├── ComputeExponent.ts
│   │   │   ├── ComputeExponentForMagnitude.ts
│   │   │   ├── CurrencyDigits.ts
│   │   │   ├── FormatApproximately.ts
│   │   │   ├── FormatNumeric.ts
│   │   │   ├── FormatNumericRange.ts
│   │   │   ├── FormatNumericRangeToParts.ts
│   │   │   ├── FormatNumericToParts.ts
│   │   │   ├── FormatNumericToString.ts
│   │   │   ├── GetUnsignedRoundingMode.ts
│   │   │   ├── InitializeNumberFormat.ts
│   │   │   ├── PartitionNumberPattern.ts
│   │   │   ├── PartitionNumberRangePattern.ts
│   │   │   ├── SetNumberFormatDigitOptions.ts
│   │   │   ├── SetNumberFormatUnitOptions.ts
│   │   │   ├── ToRawFixed.ts
│   │   │   ├── ToRawPrecision.ts
│   │   │   ├── decimal-cache.ts
│   │   │   ├── digit-mapping.generated.ts
│   │   │   └── format_to_parts.ts
│   │   ├── PartitionPattern.ts
│   │   ├── README.md
│   │   ├── SupportedLocales.ts
│   │   ├── ToIntlMathematicalValue.ts
│   │   ├── constants.ts
│   │   ├── data.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── regex.generated.ts
│   │   ├── scripts/
│   │   │   ├── digit-mapping.ts
│   │   │   └── regex-gen.ts
│   │   ├── tests/
│   │   │   ├── 262.test.ts
│   │   │   ├── ApplyUnsignedRoundingMode.test.ts
│   │   │   ├── CanonicalizeTimeZoneName.test.ts
│   │   │   ├── CollapseNumberRange.test.ts
│   │   │   ├── FormatApproximately.test.ts
│   │   │   ├── FormatNumericRange.test.ts
│   │   │   ├── FormatNumericRangeToParts.test.ts
│   │   │   ├── GetStringOrBooleanOption.test.ts
│   │   │   ├── GetUnsignedRoundingMode.test.ts
│   │   │   ├── IsValidTimeZoneName.test.ts
│   │   │   ├── PartitionNumberPattern.test.ts
│   │   │   ├── PartitionNumberRangePattern.test.ts
│   │   │   ├── PartitionPattern.test.ts
│   │   │   ├── SetNumberFormatDigitOptions.test.ts
│   │   │   ├── ToRawFixed.test.tsx
│   │   │   ├── ToRawPrecision.test.tsx
│   │   │   └── utils.ts
│   │   ├── tsconfig.json
│   │   ├── types/
│   │   │   ├── core.ts
│   │   │   ├── date-time.ts
│   │   │   ├── displaynames.ts
│   │   │   ├── list.ts
│   │   │   ├── number.ts
│   │   │   ├── plural-rules.ts
│   │   │   └── relative-time.ts
│   │   └── utils.ts
│   ├── editor/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── fixtures/
│   │   │   ├── en-GB.json
│   │   │   ├── en.json
│   │   │   └── ru.json
│   │   ├── header.tsx
│   │   ├── index.html
│   │   ├── index.tsx
│   │   ├── main.tsx
│   │   ├── message.tsx
│   │   ├── messages.tsx
│   │   ├── package.json
│   │   ├── tsconfig.json
│   │   └── types.ts
│   ├── eslint-plugin-formatjs/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── emoji-data.generated.ts
│   │   ├── emoji-utils.ts
│   │   ├── index.ts
│   │   ├── integration-tests/
│   │   │   ├── .oxlintrc.json
│   │   │   ├── BUILD.bazel
│   │   │   ├── eslint.config.mjs
│   │   │   ├── fixture.js
│   │   │   ├── fixture2.js
│   │   │   └── package.json
│   │   ├── messages.ts
│   │   ├── package.json
│   │   ├── rules/
│   │   │   ├── blocklist-elements.ts
│   │   │   ├── enforce-default-message.ts
│   │   │   ├── enforce-description.ts
│   │   │   ├── enforce-id.ts
│   │   │   ├── enforce-placeholders.ts
│   │   │   ├── enforce-plural-rules.ts
│   │   │   ├── no-camel-case.ts
│   │   │   ├── no-complex-selectors.ts
│   │   │   ├── no-emoji.ts
│   │   │   ├── no-id.ts
│   │   │   ├── no-invalid-icu.ts
│   │   │   ├── no-literal-string-in-jsx.ts
│   │   │   ├── no-literal-string-in-object.ts
│   │   │   ├── no-missing-icu-plural-one-placeholders.ts
│   │   │   ├── no-multiple-plurals.ts
│   │   │   ├── no-multiple-whitespaces.ts
│   │   │   ├── no-offset.ts
│   │   │   ├── no-useless-message.ts
│   │   │   ├── prefer-formatted-message.ts
│   │   │   ├── prefer-full-sentence.ts
│   │   │   └── prefer-pound-in-plural.ts
│   │   ├── scripts/
│   │   │   └── generate-emoji-data.ts
│   │   ├── tests/
│   │   │   ├── blocklist-elements.test.ts
│   │   │   ├── emoji-utils.test.ts
│   │   │   ├── enforce-default-message.test.ts
│   │   │   ├── enforce-description.test.ts
│   │   │   ├── enforce-id.test.ts
│   │   │   ├── enforce-placeholders.test.ts
│   │   │   ├── enforce-plural-rules.test.ts
│   │   │   ├── fixtures.ts
│   │   │   ├── no-camel-case.test.ts
│   │   │   ├── no-complex-selectors.test.ts
│   │   │   ├── no-emoji.test.ts
│   │   │   ├── no-id.test.ts
│   │   │   ├── no-invalid-icu.test.ts
│   │   │   ├── no-literal-string-in-jsx.test.ts
│   │   │   ├── no-literal-string-in-object.test.ts
│   │   │   ├── no-missing-icu-plural-one-placeholders.test.ts
│   │   │   ├── no-multiple-plurals.test.ts
│   │   │   ├── no-multiple-whitespaces.test.ts
│   │   │   ├── no-offset.test.ts
│   │   │   ├── no-useless-message.test.ts
│   │   │   ├── prefer-formatted-message.test.ts
│   │   │   ├── prefer-full-sentence.test.ts
│   │   │   ├── prefer-pound-in-plural.test.ts
│   │   │   ├── tagged-template-substitutions.test.ts
│   │   │   └── util.ts
│   │   ├── tsconfig.json
│   │   └── util.ts
│   ├── fast-memoize/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   └── tsconfig.json
│   ├── icu-messageformat-parser/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── benchmark/
│   │   │   ├── BUILD.bazel
│   │   │   ├── benchmark.ts
│   │   │   └── package.json
│   │   ├── date-time-pattern-generator.ts
│   │   ├── error.ts
│   │   ├── index.ts
│   │   ├── integration-tests/
│   │   │   ├── BUILD.bazel
│   │   │   ├── Cargo.toml
│   │   │   ├── integration_tests.rs
│   │   │   ├── package.json
│   │   │   ├── run-parser.ts
│   │   │   ├── test_cases/
│   │   │   │   ├── basic_argument_1.txt
│   │   │   │   ├── basic_argument_2.txt
│   │   │   │   ├── date_arg_skeleton_1.txt
│   │   │   │   ├── date_arg_skeleton_2.txt
│   │   │   │   ├── date_arg_skeleton_3.txt
│   │   │   │   ├── date_arg_skeleton_with_capital_J.txt
│   │   │   │   ├── date_arg_skeleton_with_capital_JJ.txt
│   │   │   │   ├── date_arg_skeleton_with_j.txt
│   │   │   │   ├── date_arg_skeleton_with_jj.txt
│   │   │   │   ├── date_arg_skeleton_with_jjj.txt
│   │   │   │   ├── date_arg_skeleton_with_jjjj.txt
│   │   │   │   ├── date_arg_skeleton_with_jjjjj.txt
│   │   │   │   ├── date_arg_skeleton_with_jjjjjj.txt
│   │   │   │   ├── double_apostrophes_1.txt
│   │   │   │   ├── duplicate_plural_selectors.txt
│   │   │   │   ├── duplicate_select_selectors.txt
│   │   │   │   ├── empty_argument_1.txt
│   │   │   │   ├── empty_argument_2.txt
│   │   │   │   ├── escaped_multiple_tags_1.txt
│   │   │   │   ├── escaped_pound_1.txt
│   │   │   │   ├── expect_arg_format_1.txt
│   │   │   │   ├── expect_date_arg_skeleton_whitespace_only.txt
│   │   │   │   ├── expect_number_arg_skeleton_double_slash.txt
│   │   │   │   ├── expect_number_arg_skeleton_empty_stem.txt
│   │   │   │   ├── expect_number_arg_skeleton_token_1.txt
│   │   │   │   ├── expect_number_arg_skeleton_token_option_1.txt
│   │   │   │   ├── expect_number_arg_skeleton_whitespace_only.txt
│   │   │   │   ├── expect_number_arg_style_1.txt
│   │   │   │   ├── ignore_tag_number_arg_1.txt
│   │   │   │   ├── ignore_tags_1.txt
│   │   │   │   ├── incomplete_nested_message_in_tag.txt
│   │   │   │   ├── invalid_arg_format_1.txt
│   │   │   │   ├── invalid_close_tag_1.txt
│   │   │   │   ├── invalid_closing_tag_1.txt
│   │   │   │   ├── invalid_closing_tag_2.txt
│   │   │   │   ├── invalid_tag_1.txt
│   │   │   │   ├── invalid_tag_2.txt
│   │   │   │   ├── invalid_tag_3.txt
│   │   │   │   ├── left_angle_bracket_1.txt
│   │   │   │   ├── less_than_sign_1.txt
│   │   │   │   ├── malformed_argument_1.txt
│   │   │   │   ├── negative_offset_1.txt
│   │   │   │   ├── nested_1.txt
│   │   │   │   ├── nested_tags_1.txt
│   │   │   │   ├── not_escaped_pound_1.txt
│   │   │   │   ├── not_quoted_string_1.txt
│   │   │   │   ├── not_quoted_string_2.txt
│   │   │   │   ├── not_self_closing_tag_1.txt
│   │   │   │   ├── number_arg_skeleton_2.txt
│   │   │   │   ├── number_arg_skeleton_3.txt
│   │   │   │   ├── number_arg_style_1.txt
│   │   │   │   ├── number_skeleton_1.txt
│   │   │   │   ├── number_skeleton_10.txt
│   │   │   │   ├── number_skeleton_11.txt
│   │   │   │   ├── number_skeleton_12.txt
│   │   │   │   ├── number_skeleton_2.txt
│   │   │   │   ├── number_skeleton_3.txt
│   │   │   │   ├── number_skeleton_4.txt
│   │   │   │   ├── number_skeleton_5.txt
│   │   │   │   ├── number_skeleton_6.txt
│   │   │   │   ├── number_skeleton_7.txt
│   │   │   │   ├── number_skeleton_8.txt
│   │   │   │   ├── number_skeleton_9.txt
│   │   │   │   ├── number_skeleton_many_tokens.txt
│   │   │   │   ├── number_skeleton_multiple_spaces.txt
│   │   │   │   ├── number_skeleton_trailing_slash.txt
│   │   │   │   ├── number_skeleton_with_tab.txt
│   │   │   │   ├── numeric_tag_1.txt
│   │   │   │   ├── open_close_tag_1.txt
│   │   │   │   ├── open_close_tag_2.txt
│   │   │   │   ├── open_close_tag_3.txt
│   │   │   │   ├── open_close_tag_with_args.txt
│   │   │   │   ├── open_close_tag_with_nested_arg.txt
│   │   │   │   ├── plural_arg_1.txt
│   │   │   │   ├── plural_arg_2.txt
│   │   │   │   ├── plural_arg_with_escaped_nested_message.txt
│   │   │   │   ├── plural_arg_with_offset_1.txt
│   │   │   │   ├── plural_with_number_skeleton.txt
│   │   │   │   ├── quoted_pound_sign_1.txt
│   │   │   │   ├── quoted_pound_sign_2.txt
│   │   │   │   ├── quoted_string_1.txt
│   │   │   │   ├── quoted_string_2.txt
│   │   │   │   ├── quoted_string_3.txt
│   │   │   │   ├── quoted_string_4.txt
│   │   │   │   ├── quoted_string_5.txt
│   │   │   │   ├── quoted_tag_1.txt
│   │   │   │   ├── select_arg_1.txt
│   │   │   │   ├── select_arg_with_nested_arguments.txt
│   │   │   │   ├── select_with_number_skeleton.txt
│   │   │   │   ├── selectordinal_1.txt
│   │   │   │   ├── self_closing_tag_1.txt
│   │   │   │   ├── self_closing_tag_2.txt
│   │   │   │   ├── simple_argument_1.txt
│   │   │   │   ├── simple_argument_2.txt
│   │   │   │   ├── simple_date_and_time_arg_1.txt
│   │   │   │   ├── simple_number_arg_1.txt
│   │   │   │   ├── treat_unicode_nbsp_as_whitespace.txt
│   │   │   │   ├── trivial_1.txt
│   │   │   │   ├── trivial_2.txt
│   │   │   │   ├── unclosed_argument_1.txt
│   │   │   │   ├── unclosed_argument_2.txt
│   │   │   │   ├── unclosed_number_arg_1.txt
│   │   │   │   ├── unclosed_number_arg_2.txt
│   │   │   │   ├── unclosed_number_arg_3.txt
│   │   │   │   ├── unclosed_quote_in_number_arg.txt
│   │   │   │   ├── unclosed_quoted_string_1.txt
│   │   │   │   ├── unclosed_quoted_string_2.txt
│   │   │   │   ├── unclosed_quoted_string_3.txt
│   │   │   │   ├── unclosed_quoted_string_4.txt
│   │   │   │   ├── unclosed_quoted_string_5.txt
│   │   │   │   ├── unclosed_quoted_string_6.txt
│   │   │   │   ├── unclosed_quoted_string_7.txt
│   │   │   │   ├── unescaped_string_literal_1.txt
│   │   │   │   ├── unmatched_open_close_tag_1.txt
│   │   │   │   ├── unmatched_open_close_tag_2.txt
│   │   │   │   └── uppercase_tag_1.txt
│   │   │   └── wasm-integration.test.ts
│   │   ├── manipulator.ts
│   │   ├── no-parser.ts
│   │   ├── package.json
│   │   ├── parser.ts
│   │   ├── printer.ts
│   │   ├── regex.generated.ts
│   │   ├── tests/
│   │   │   ├── __snapshots__/
│   │   │   │   └── manipulator.test.ts.snap
│   │   │   ├── browser-smoke.test.ts
│   │   │   ├── date-time-pattern-generator.test.ts
│   │   │   ├── manipulator.test.ts
│   │   │   ├── no-parser.test.ts
│   │   │   └── printer.test.ts
│   │   ├── time-data.generated.ts
│   │   ├── tools/
│   │   │   ├── BUILD.bazel
│   │   │   ├── global.ts
│   │   │   ├── regex-gen.ts
│   │   │   └── time-data-gen.ts
│   │   ├── tsconfig.json
│   │   └── types.ts
│   ├── icu-messageformat-parser-wasm/
│   │   ├── BENCHMARK.md
│   │   ├── BUILD.bazel
│   │   ├── README.md
│   │   ├── benchmark/
│   │   │   ├── BUILD.bazel
│   │   │   ├── benchmark.ts
│   │   │   └── package.json
│   │   ├── index.ts
│   │   ├── package.json
│   │   └── tsconfig.json
│   ├── icu-skeleton-parser/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── date-time.ts
│   │   ├── index.ts
│   │   ├── number.ts
│   │   ├── package.json
│   │   ├── regex.generated.ts
│   │   ├── scripts/
│   │   │   ├── global.ts
│   │   │   └── regex-gen.ts
│   │   ├── tests/
│   │   │   ├── __snapshots__/
│   │   │   │   └── index.test.ts.snap
│   │   │   └── index.test.ts
│   │   └── tsconfig.json
│   ├── intl/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── create-intl.ts
│   │   │   ├── dateTime.ts
│   │   │   ├── displayName.ts
│   │   │   ├── error.ts
│   │   │   ├── list.ts
│   │   │   ├── message.ts
│   │   │   ├── number.ts
│   │   │   ├── plural.ts
│   │   │   ├── relativeTime.ts
│   │   │   ├── types.ts
│   │   │   └── utils.ts
│   │   ├── tests/
│   │   │   ├── __snapshots__/
│   │   │   │   ├── formatDate.test.ts.snap
│   │   │   │   ├── formatMessage.test.ts.snap
│   │   │   │   ├── formatNumber.test.ts.snap
│   │   │   │   ├── formatRelativeTime.test.ts.snap
│   │   │   │   └── formatTime.test.ts.snap
│   │   │   ├── create-intl.test.ts
│   │   │   ├── error.test.ts
│   │   │   ├── formatDate.test.ts
│   │   │   ├── formatDisplayNames.test.ts
│   │   │   ├── formatList.test.ts
│   │   │   ├── formatMessage.test.ts
│   │   │   ├── formatNumber.test.ts
│   │   │   ├── formatPlural.test.ts
│   │   │   ├── formatRelativeTime.test.ts
│   │   │   ├── formatTime.test.ts
│   │   │   └── global_type_overrides.test-d.ts
│   │   └── tsconfig.json
│   ├── intl-datetimeformat/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── defs.bzl
│   │   ├── index.bzl
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── cldr-raw.ts
│   │   │   ├── cldr.ts
│   │   │   ├── execute_tz_docker.sh
│   │   │   ├── extract-dates.ts
│   │   │   ├── link.ts
│   │   │   ├── process-zdump.ts
│   │   │   ├── test-locale-data-gen.ts
│   │   │   ├── test262-main-gen.ts
│   │   │   ├── zic.ts
│   │   │   └── zone.ts
│   │   ├── should-polyfill.ts
│   │   ├── src/
│   │   │   ├── abstract/
│   │   │   │   ├── BasicFormatMatcher.ts
│   │   │   │   ├── BestFitFormatMatcher.ts
│   │   │   │   ├── DateTimeStyleFormat.ts
│   │   │   │   ├── FormatDateTime.ts
│   │   │   │   ├── FormatDateTimePattern.ts
│   │   │   │   ├── FormatDateTimeRange.ts
│   │   │   │   ├── FormatDateTimeRangeToParts.ts
│   │   │   │   ├── FormatDateTimeToParts.ts
│   │   │   │   ├── InitializeDateTimeFormat.ts
│   │   │   │   ├── PartitionDateTimePattern.ts
│   │   │   │   ├── PartitionDateTimeRangePattern.ts
│   │   │   │   ├── ToDateTimeOptions.ts
│   │   │   │   ├── ToLocalTime.ts
│   │   │   │   ├── skeleton.ts
│   │   │   │   └── utils.ts
│   │   │   ├── core.ts
│   │   │   ├── data/
│   │   │   │   ├── all-tz.generated.ts
│   │   │   │   └── links.generated.ts
│   │   │   ├── get_internal_slots.ts
│   │   │   ├── packer.ts
│   │   │   ├── to_locale_string.ts
│   │   │   └── types.ts
│   │   ├── supported-locales.generated.ts
│   │   ├── test262-main.ts
│   │   ├── tests/
│   │   │   ├── abstract/
│   │   │   │   ├── BestFitFormatMatcher.test.ts
│   │   │   │   └── skeleton.test.ts
│   │   │   ├── benchmark.ts
│   │   │   ├── format-range.test.ts
│   │   │   ├── format.test.ts
│   │   │   ├── ftp-main.test.ts
│   │   │   ├── index.test.ts
│   │   │   ├── locale-data/
│   │   │   │   ├── ar.json
│   │   │   │   ├── bs.json
│   │   │   │   ├── de.json
│   │   │   │   ├── en-CA.json
│   │   │   │   ├── en-GB.json
│   │   │   │   ├── en.json
│   │   │   │   ├── fa.json
│   │   │   │   ├── ja.json
│   │   │   │   ├── ko.json
│   │   │   │   ├── nl.json
│   │   │   │   ├── pl.json
│   │   │   │   ├── ru.json
│   │   │   │   └── zh-Hans.json
│   │   │   └── offset-timezone.test.ts
│   │   └── tsconfig.json
│   ├── intl-displaynames/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── abstract/
│   │   │   ├── CanonicalCodeForDisplayNames.ts
│   │   │   └── IsValidDateTimeFieldCode.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── cldr-raw.ts
│   │   │   ├── cldr.ts
│   │   │   ├── extract-displaynames.ts
│   │   │   ├── test-locale-data-gen.ts
│   │   │   └── test262-main-gen.ts
│   │   ├── should-polyfill.ts
│   │   ├── supported-locales.generated.ts
│   │   ├── test262-main.ts
│   │   ├── tests/
│   │   │   ├── CanonicalCodeForDisplayNames.test.ts
│   │   │   ├── IsValidDateTimeFieldCode.test.ts
│   │   │   ├── index.test.ts
│   │   │   ├── locale-data/
│   │   │   │   ├── en.json
│   │   │   │   └── zh.json
│   │   │   └── should-polyfill.test.ts
│   │   └── tsconfig.json
│   ├── intl-durationformat/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── benchmark/
│   │   │   ├── BUILD.bazel
│   │   │   ├── PROFILE.md
│   │   │   ├── README.md
│   │   │   ├── analyze-profile.ts
│   │   │   ├── benchmark.ts
│   │   │   ├── instantiation-benchmark.ts
│   │   │   ├── package.json
│   │   │   └── profile.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── time-separators.ts
│   │   │   └── utils.ts
│   │   ├── should-polyfill.ts
│   │   ├── src/
│   │   │   ├── abstract/
│   │   │   │   ├── DurationRecordSign.ts
│   │   │   │   ├── GetDurationUnitOptions.ts
│   │   │   │   ├── IsValidDurationRecord.ts
│   │   │   │   ├── PartitionDurationFormatPattern.ts
│   │   │   │   ├── ToDurationRecord.ts
│   │   │   │   └── ToIntegerIfIntegral.ts
│   │   │   ├── constants.ts
│   │   │   ├── core.ts
│   │   │   ├── get_internal_slots.ts
│   │   │   ├── numbering-systems.generated.ts
│   │   │   ├── time-separators.generated.ts
│   │   │   └── types.ts
│   │   ├── tests/
│   │   │   └── index.test.ts
│   │   └── tsconfig.json
│   ├── intl-getcanonicallocales/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── aliases.ts
│   │   │   └── likely-subtags.ts
│   │   ├── should-polyfill.ts
│   │   ├── src/
│   │   │   ├── aliases.generated.ts
│   │   │   ├── canonicalizer.ts
│   │   │   ├── emitter.ts
│   │   │   ├── likelySubtags.generated.ts
│   │   │   ├── parser.ts
│   │   │   └── types.ts
│   │   ├── tests/
│   │   │   ├── index.test.ts
│   │   │   └── parser.test.ts
│   │   └── tsconfig.json
│   ├── intl-listformat/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── cldr-raw.ts
│   │   │   ├── cldr.ts
│   │   │   ├── extract-list.ts
│   │   │   ├── test-locale-data-gen.ts
│   │   │   └── test262-main-gen.ts
│   │   ├── should-polyfill.ts
│   │   ├── supported-locales.generated.ts
│   │   ├── test262-main.ts
│   │   ├── tests/
│   │   │   ├── index.test.ts
│   │   │   ├── locale-data/
│   │   │   │   ├── en-AI.json
│   │   │   │   ├── en.json
│   │   │   │   ├── zh-Hans.json
│   │   │   │   ├── zh-Hant.json
│   │   │   │   └── zh.json
│   │   │   └── supported-locales-of.test.ts
│   │   └── tsconfig.json
│   ├── intl-locale/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── calendars.generated.ts
│   │   ├── character-orders.generated.ts
│   │   ├── get_internal_slots.ts
│   │   ├── hour-cycles.generated.ts
│   │   ├── index.ts
│   │   ├── numbering-systems.generated.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── preference-data.ts
│   │   ├── scripts/
│   │   │   ├── calendars.ts
│   │   │   ├── character-orders.ts
│   │   │   ├── common-types.ts
│   │   │   ├── hour-cycles.ts
│   │   │   ├── numbering-systems.ts
│   │   │   ├── timezones.ts
│   │   │   ├── utils.ts
│   │   │   └── week-data.ts
│   │   ├── should-polyfill.ts
│   │   ├── tests/
│   │   │   ├── index.test.ts
│   │   │   ├── likely-subtags.test.ts
│   │   │   └── minimize.test.ts
│   │   ├── timezones.generated.ts
│   │   ├── tsconfig.json
│   │   └── week-data.generated.ts
│   ├── intl-localematcher/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── abstract/
│   │   │   ├── BestAvailableLocale.ts
│   │   │   ├── BestFitMatcher.ts
│   │   │   ├── CanonicalizeLocaleList.ts
│   │   │   ├── CanonicalizeUValue.ts
│   │   │   ├── CanonicalizeUnicodeLocaleId.ts
│   │   │   ├── InsertUnicodeExtensionAndCanonicalize.ts
│   │   │   ├── LookupMatcher.ts
│   │   │   ├── LookupSupportedLocales.ts
│   │   │   ├── ResolveLocale.ts
│   │   │   ├── UnicodeExtensionComponents.ts
│   │   │   ├── UnicodeExtensionValue.ts
│   │   │   ├── languageMatching.ts
│   │   │   ├── regions.generated.ts
│   │   │   ├── types.ts
│   │   │   └── utils.ts
│   │   ├── benchmark/
│   │   │   ├── BUILD.bazel
│   │   │   ├── benchmark.ts
│   │   │   ├── bestfit-benchmark.ts
│   │   │   ├── package.json
│   │   │   └── profile.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── scripts/
│   │   │   └── regions-gen.ts
│   │   ├── tests/
│   │   │   ├── BestFitMatcher.test.ts
│   │   │   ├── LookupMatcher.test.ts
│   │   │   ├── ResolveLocale.test.ts
│   │   │   ├── index.test.ts
│   │   │   └── utils.test.ts
│   │   └── tsconfig.json
│   ├── intl-messageformat/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── core.ts
│   │   │   ├── error.ts
│   │   │   └── formatters.ts
│   │   ├── tests/
│   │   │   ├── benchmark.ts
│   │   │   └── index.test.ts
│   │   └── tsconfig.json
│   ├── intl-numberformat/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── benchmark/
│   │   │   ├── BUILD.bazel
│   │   │   ├── PROFILE.md
│   │   │   ├── README.md
│   │   │   ├── analyze-profile.ts
│   │   │   ├── benchmark.ts
│   │   │   ├── en.json
│   │   │   ├── package.json
│   │   │   └── profile.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── cldr-raw.ts
│   │   │   ├── cldr.ts
│   │   │   ├── currency-digits.ts
│   │   │   ├── extract-currencies.ts
│   │   │   ├── extract-numbers.ts
│   │   │   ├── extract-units.ts
│   │   │   ├── generate-locale-test.ts
│   │   │   ├── numbering-systems.ts
│   │   │   ├── test-locale-data-gen.ts
│   │   │   ├── test262-main-gen.ts
│   │   │   ├── units-constants.ts
│   │   │   ├── update_snapshots.sh
│   │   │   └── utils.ts
│   │   ├── should-polyfill.ts
│   │   ├── src/
│   │   │   ├── core.ts
│   │   │   ├── currency-digits.generated.ts
│   │   │   ├── get_internal_slots.ts
│   │   │   ├── numbering-systems.generated.ts
│   │   │   ├── to_locale_string.ts
│   │   │   └── types.ts
│   │   ├── supported-locales.generated.ts
│   │   ├── test262-main.ts
│   │   ├── tests/
│   │   │   ├── currency/
│   │   │   │   ├── __snapshots__/
│   │   │   │   │   ├── da.test.ts.snap
│   │   │   │   │   ├── de.test.ts.snap
│   │   │   │   │   ├── en-BS.test.ts.snap
│   │   │   │   │   ├── en-GB.test.ts.snap
│   │   │   │   │   ├── en.test.ts.snap
│   │   │   │   │   ├── es.test.ts.snap
│   │   │   │   │   ├── fr.test.ts.snap
│   │   │   │   │   ├── id.test.ts.snap
│   │   │   │   │   ├── it.test.ts.snap
│   │   │   │   │   ├── ja.test.ts.snap
│   │   │   │   │   ├── ko.test.ts.snap
│   │   │   │   │   ├── ms.test.ts.snap
│   │   │   │   │   ├── nb.test.ts.snap
│   │   │   │   │   ├── nl.test.ts.snap
│   │   │   │   │   ├── pl.test.ts.snap
│   │   │   │   │   ├── pt.test.ts.snap
│   │   │   │   │   ├── ru.test.ts.snap
│   │   │   │   │   ├── sv.test.ts.snap
│   │   │   │   │   ├── th.test.ts.snap
│   │   │   │   │   ├── tr.test.ts.snap
│   │   │   │   │   ├── uk.test.ts.snap
│   │   │   │   │   └── zh.test.ts.snap
│   │   │   │   ├── currencyTest.ts
│   │   │   │   ├── da.generated.test.ts
│   │   │   │   ├── de.generated.test.ts
│   │   │   │   ├── en-BS.generated.test.ts
│   │   │   │   ├── en-GB.generated.test.ts
│   │   │   │   ├── en.generated.test.ts
│   │   │   │   ├── es.generated.test.ts
│   │   │   │   ├── fr.generated.test.ts
│   │   │   │   ├── id.generated.test.ts
│   │   │   │   ├── it.generated.test.ts
│   │   │   │   ├── ja.generated.test.ts
│   │   │   │   ├── ko.generated.test.ts
│   │   │   │   ├── ms.generated.test.ts
│   │   │   │   ├── nb.generated.test.ts
│   │   │   │   ├── nl.generated.test.ts
│   │   │   │   ├── pl.generated.test.ts
│   │   │   │   ├── pt.generated.test.ts
│   │   │   │   ├── ru.generated.test.ts
│   │   │   │   ├── sv.generated.test.ts
│   │   │   │   ├── th.generated.test.ts
│   │   │   │   ├── tr.generated.test.ts
│   │   │   │   ├── uk.generated.test.ts
│   │   │   │   └── zh.generated.test.ts
│   │   │   ├── currency-code.test.ts
│   │   │   ├── decimal/
│   │   │   │   ├── __snapshots__/
│   │   │   │   │   ├── da.test.ts.snap
│   │   │   │   │   ├── de.test.ts.snap
│   │   │   │   │   ├── en-BS.test.ts.snap
│   │   │   │   │   ├── en-GB.test.ts.snap
│   │   │   │   │   ├── en.test.ts.snap
│   │   │   │   │   ├── es.test.ts.snap
│   │   │   │   │   ├── fr.test.ts.snap
│   │   │   │   │   ├── id.test.ts.snap
│   │   │   │   │   ├── it.test.ts.snap
│   │   │   │   │   ├── ja.test.ts.snap
│   │   │   │   │   ├── ko.test.ts.snap
│   │   │   │   │   ├── ms.test.ts.snap
│   │   │   │   │   ├── nb.test.ts.snap
│   │   │   │   │   ├── nl.test.ts.snap
│   │   │   │   │   ├── pl.test.ts.snap
│   │   │   │   │   ├── pt.test.ts.snap
│   │   │   │   │   ├── ru.test.ts.snap
│   │   │   │   │   ├── sv.test.ts.snap
│   │   │   │   │   ├── th.test.ts.snap
│   │   │   │   │   ├── tr.test.ts.snap
│   │   │   │   │   ├── uk.test.ts.snap
│   │   │   │   │   └── zh.test.ts.snap
│   │   │   │   ├── da.generated.test.ts
│   │   │   │   ├── de.generated.test.ts
│   │   │   │   ├── decimalTest.ts
│   │   │   │   ├── en-BS.generated.test.ts
│   │   │   │   ├── en-GB.generated.test.ts
│   │   │   │   ├── en.generated.test.ts
│   │   │   │   ├── es.generated.test.ts
│   │   │   │   ├── fr.generated.test.ts
│   │   │   │   ├── id.generated.test.ts
│   │   │   │   ├── it.generated.test.ts
│   │   │   │   ├── ja.generated.test.ts
│   │   │   │   ├── ko.generated.test.ts
│   │   │   │   ├── ms.generated.test.ts
│   │   │   │   ├── nb.generated.test.ts
│   │   │   │   ├── nl.generated.test.ts
│   │   │   │   ├── pl.generated.test.ts
│   │   │   │   ├── pt.generated.test.ts
│   │   │   │   ├── ru.generated.test.ts
│   │   │   │   ├── sv.generated.test.ts
│   │   │   │   ├── th.generated.test.ts
│   │   │   │   ├── tr.generated.test.ts
│   │   │   │   ├── uk.generated.test.ts
│   │   │   │   └── zh.generated.test.ts
│   │   │   ├── fast-path-optimizations.test.ts
│   │   │   ├── format_to_parts.test.ts
│   │   │   ├── legacy.test.ts
│   │   │   ├── locale-data/
│   │   │   │   ├── ar-SS.json
│   │   │   │   ├── bn.json
│   │   │   │   ├── da.json
│   │   │   │   ├── de-AT.json
│   │   │   │   ├── de.json
│   │   │   │   ├── en-BS.json
│   │   │   │   ├── en-GB.json
│   │   │   │   ├── en.json
│   │   │   │   ├── es.json
│   │   │   │   ├── fr-CH.json
│   │   │   │   ├── fr.json
│   │   │   │   ├── hi.json
│   │   │   │   ├── id.json
│   │   │   │   ├── it.json
│   │   │   │   ├── ja.json
│   │   │   │   ├── ko.json
│   │   │   │   ├── ms.json
│   │   │   │   ├── nb.json
│   │   │   │   ├── nl.json
│   │   │   │   ├── pl.json
│   │   │   │   ├── pt.json
│   │   │   │   ├── ru.json
│   │   │   │   ├── sv.json
│   │   │   │   ├── sw.json
│   │   │   │   ├── th.json
│   │   │   │   ├── tr.json
│   │   │   │   ├── uk.json
│   │   │   │   ├── zh-Hans.json
│   │   │   │   ├── zh-Hant.json
│   │   │   │   └── zh.json
│   │   │   ├── misc.test.ts
│   │   │   ├── notation-compact-ko-KR.test.ts
│   │   │   ├── notation-compact-zh-TW.test.ts
│   │   │   ├── percent/
│   │   │   │   ├── __snapshots__/
│   │   │   │   │   ├── da.test.ts.snap
│   │   │   │   │   ├── de.test.ts.snap
│   │   │   │   │   ├── en-BS.test.ts.snap
│   │   │   │   │   ├── en-GB.test.ts.snap
│   │   │   │   │   ├── en.test.ts.snap
│   │   │   │   │   ├── es.test.ts.snap
│   │   │   │   │   ├── fr.test.ts.snap
│   │   │   │   │   ├── id.test.ts.snap
│   │   │   │   │   ├── it.test.ts.snap
│   │   │   │   │   ├── ja.test.ts.snap
│   │   │   │   │   ├── ko.test.ts.snap
│   │   │   │   │   ├── ms.test.ts.snap
│   │   │   │   │   ├── nb.test.ts.snap
│   │   │   │   │   ├── nl.test.ts.snap
│   │   │   │   │   ├── pl.test.ts.snap
│   │   │   │   │   ├── pt.test.ts.snap
│   │   │   │   │   ├── ru.test.ts.snap
│   │   │   │   │   ├── sv.test.ts.snap
│   │   │   │   │   ├── th.test.ts.snap
│   │   │   │   │   ├── tr.test.ts.snap
│   │   │   │   │   ├── uk.test.ts.snap
│   │   │   │   │   └── zh.test.ts.snap
│   │   │   │   ├── da.generated.test.ts
│   │   │   │   ├── de.generated.test.ts
│   │   │   │   ├── en-BS.generated.test.ts
│   │   │   │   ├── en-GB.generated.test.ts
│   │   │   │   ├── en.generated.test.ts
│   │   │   │   ├── es.generated.test.ts
│   │   │   │   ├── fr.generated.test.ts
│   │   │   │   ├── id.generated.test.ts
│   │   │   │   ├── it.generated.test.ts
│   │   │   │   ├── ja.generated.test.ts
│   │   │   │   ├── ko.generated.test.ts
│   │   │   │   ├── ms.generated.test.ts
│   │   │   │   ├── nb.generated.test.ts
│   │   │   │   ├── nl.generated.test.ts
│   │   │   │   ├── percentTest.ts
│   │   │   │   ├── pl.generated.test.ts
│   │   │   │   ├── pt.generated.test.ts
│   │   │   │   ├── ru.generated.test.ts
│   │   │   │   ├── sv.generated.test.ts
│   │   │   │   ├── th.generated.test.ts
│   │   │   │   ├── tr.generated.test.ts
│   │   │   │   ├── uk.generated.test.ts
│   │   │   │   └── zh.generated.test.ts
│   │   │   ├── signDisplay-currency-zh-TW.test.ts
│   │   │   ├── signDisplay-zh-TW.test.ts
│   │   │   ├── unit/
│   │   │   │   ├── __snapshots__/
│   │   │   │   │   ├── da.test.ts.snap
│   │   │   │   │   ├── de.test.ts.snap
│   │   │   │   │   ├── en-BS.test.ts.snap
│   │   │   │   │   ├── en-GB.test.ts.snap
│   │   │   │   │   ├── en.test.ts.snap
│   │   │   │   │   ├── es.test.ts.snap
│   │   │   │   │   ├── fr.test.ts.snap
│   │   │   │   │   ├── id.test.ts.snap
│   │   │   │   │   ├── it.test.ts.snap
│   │   │   │   │   ├── ja.test.ts.snap
│   │   │   │   │   ├── ko.test.ts.snap
│   │   │   │   │   ├── ms.test.ts.snap
│   │   │   │   │   ├── nb.test.ts.snap
│   │   │   │   │   ├── nl.test.ts.snap
│   │   │   │   │   ├── pl.test.ts.snap
│   │   │   │   │   ├── pt.test.ts.snap
│   │   │   │   │   ├── ru.test.ts.snap
│   │   │   │   │   ├── sv.test.ts.snap
│   │   │   │   │   ├── th.test.ts.snap
│   │   │   │   │   ├── tr.test.ts.snap
│   │   │   │   │   ├── uk.test.ts.snap
│   │   │   │   │   └── zh.test.ts.snap
│   │   │   │   ├── da.generated.test.ts
│   │   │   │   ├── de.generated.test.ts
│   │   │   │   ├── en-BS.generated.test.ts
│   │   │   │   ├── en-GB.generated.test.ts
│   │   │   │   ├── en.generated.test.ts
│   │   │   │   ├── es.generated.test.ts
│   │   │   │   ├── fr.generated.test.ts
│   │   │   │   ├── id.generated.test.ts
│   │   │   │   ├── it.generated.test.ts
│   │   │   │   ├── ja.generated.test.ts
│   │   │   │   ├── ko.generated.test.ts
│   │   │   │   ├── ms.generated.test.ts
│   │   │   │   ├── nb.generated.test.ts
│   │   │   │   ├── nl.generated.test.ts
│   │   │   │   ├── pl.generated.test.ts
│   │   │   │   ├── pt.generated.test.ts
│   │   │   │   ├── ru.generated.test.ts
│   │   │   │   ├── sv.generated.test.ts
│   │   │   │   ├── th.generated.test.ts
│   │   │   │   ├── tr.generated.test.ts
│   │   │   │   ├── uk.generated.test.ts
│   │   │   │   ├── unitTest.ts
│   │   │   │   └── zh.generated.test.ts
│   │   │   ├── unit-zh-TW.test.ts
│   │   │   └── value-tonumber.test.ts
│   │   └── tsconfig.json
│   ├── intl-pluralrules/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── abstract/
│   │   │   ├── GetOperands.ts
│   │   │   ├── InitializePluralRules.ts
│   │   │   ├── ResolvePlural.ts
│   │   │   └── ResolvePluralRange.ts
│   │   ├── get_internal_slots.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── cldr-raw.ts
│   │   │   ├── cldr.ts
│   │   │   ├── plural-rules-compiler.ts
│   │   │   └── test262-main-gen.ts
│   │   ├── should-polyfill.ts
│   │   ├── supported-locales.generated.ts
│   │   ├── test262-main.ts
│   │   ├── tests/
│   │   │   ├── index.test.ts
│   │   │   ├── locale-data/
│   │   │   │   ├── en.ts
│   │   │   │   ├── fr.ts
│   │   │   │   └── zh.ts
│   │   │   └── supported-locales-of.test.ts
│   │   └── tsconfig.json
│   ├── intl-relativetimeformat/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── abstract/
│   │   │   ├── FormatRelativeTime.ts
│   │   │   ├── FormatRelativeTimeToParts.ts
│   │   │   ├── InitializeRelativeTimeFormat.ts
│   │   │   ├── MakePartsList.ts
│   │   │   ├── PartitionRelativeTimePattern.ts
│   │   │   └── SingularRelativeTimeUnit.ts
│   │   ├── get_internal_slots.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── cldr-raw.ts
│   │   │   ├── cldr.ts
│   │   │   ├── extract-relative.ts
│   │   │   ├── test-locale-data-gen.ts
│   │   │   └── test262-main-gen.ts
│   │   ├── should-polyfill.ts
│   │   ├── supported-locales.generated.ts
│   │   ├── test262-main.ts
│   │   ├── tests/
│   │   │   ├── index.test.ts
│   │   │   ├── locale-data/
│   │   │   │   ├── en-AI.json
│   │   │   │   ├── en.json
│   │   │   │   ├── zh-Hans.json
│   │   │   │   ├── zh-Hant.json
│   │   │   │   └── zh.json
│   │   │   └── supported-locales-of.test.ts
│   │   └── tsconfig.json
│   ├── intl-segmenter/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── NOTES.md
│   │   ├── README.md
│   │   ├── benchmark.ts
│   │   ├── debug.ts
│   │   ├── index.bzl
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── generate-cldr-segmentation-rules.ts
│   │   │   └── test262-main-gen.ts
│   │   ├── should-polyfill.ts
│   │   ├── src/
│   │   │   ├── cldr-segmentation-rules.generated.ts
│   │   │   ├── segmentation-utils.ts
│   │   │   └── segmenter.ts
│   │   ├── test262-main.ts
│   │   ├── tests/
│   │   │   ├── grapheme.test.ts
│   │   │   ├── isWordLike.test.ts
│   │   │   ├── sentence.test.ts
│   │   │   ├── test-utils.ts
│   │   │   └── word.test.ts
│   │   └── tsconfig.json
│   ├── intl-supportedvaluesof/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── polyfill-force.ts
│   │   ├── polyfill.ts
│   │   ├── scripts/
│   │   │   ├── calendars.ts
│   │   │   ├── collations.ts
│   │   │   ├── currencies.ts
│   │   │   ├── timezones.ts
│   │   │   └── units.ts
│   │   ├── should-polyfill.ts
│   │   ├── src/
│   │   │   ├── calendars.generated.ts
│   │   │   ├── collations.generated.ts
│   │   │   ├── currencies.generated.ts
│   │   │   ├── get-supported-calendars.ts
│   │   │   ├── get-supported-collations.ts
│   │   │   ├── get-supported-currencies.ts
│   │   │   ├── get-supported-numbering-systems.ts
│   │   │   ├── get-supported-timezones.ts
│   │   │   ├── get-supported-units.ts
│   │   │   ├── index.ts
│   │   │   ├── memoize.ts
│   │   │   ├── numbering-systems.generated.ts
│   │   │   ├── timezones.generated.ts
│   │   │   └── units.generated.ts
│   │   ├── tests/
│   │   │   └── index.test.ts
│   │   └── tsconfig.json
│   ├── react-intl/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── example-sandboxes/
│   │   │   ├── BUILD.bazel
│   │   │   ├── rescripts/
│   │   │   │   ├── .rescriptsrc.js
│   │   │   │   ├── package.json
│   │   │   │   ├── public/
│   │   │   │   │   └── index.html
│   │   │   │   ├── src/
│   │   │   │   │   ├── App.tsx
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── react-app-env.d.ts
│   │   │   │   │   └── styles.css
│   │   │   │   └── tsconfig.json
│   │   │   ├── strict-locale-type/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── App.tsx
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── styles.css
│   │   │   │   └── tsconfig.json
│   │   │   └── strict-message-types/
│   │   │       ├── .gitignore
│   │   │       ├── package.json
│   │   │       ├── src/
│   │   │       │   ├── App.tsx
│   │   │       │   ├── index.html
│   │   │       │   ├── index.tsx
│   │   │       │   └── styles.css
│   │   │       └── tsconfig.json
│   │   ├── examples/
│   │   │   ├── BUILD.bazel
│   │   │   ├── Bug2727.tsx
│   │   │   ├── HandleChange.tsx
│   │   │   ├── Hooks.tsx
│   │   │   ├── Injected.tsx
│   │   │   ├── Messages.tsx
│   │   │   ├── StaticTypeSafetyAndCodeSplitting/
│   │   │   │   ├── StaticTypeSafetyAndCodeSplitting.tsx
│   │   │   │   ├── en.json
│   │   │   │   ├── intlHelpers.tsx
│   │   │   │   └── it.json
│   │   │   ├── TimeZone.tsx
│   │   │   ├── advanced/
│   │   │   │   ├── Advanced.tsx
│   │   │   │   └── compiled-lang/
│   │   │   │       ├── en.json
│   │   │   │       └── fr.json
│   │   │   ├── index.html
│   │   │   ├── index.tsx
│   │   │   └── package.json
│   │   ├── index.ts
│   │   ├── integration-tests/
│   │   │   ├── BUILD.bazel
│   │   │   ├── format.test.tsx
│   │   │   ├── package.json
│   │   │   └── tsconfig.json
│   │   ├── package.json
│   │   ├── server.ts
│   │   ├── src/
│   │   │   ├── components/
│   │   │   │   ├── context.ts
│   │   │   │   ├── createFormattedComponent.tsx
│   │   │   │   ├── createIntl.ts
│   │   │   │   ├── dateTimeRange.tsx
│   │   │   │   ├── message.tsx
│   │   │   │   ├── plural.tsx
│   │   │   │   ├── provider.tsx
│   │   │   │   ├── relative.tsx
│   │   │   │   └── useIntl.ts
│   │   │   ├── types.ts
│   │   │   └── utils.tsx
│   │   ├── tests/
│   │   │   ├── global_type_overrides.test-d.ts
│   │   │   ├── perf/
│   │   │   │   └── index.tsx
│   │   │   └── unit/
│   │   │       ├── components/
│   │   │       │   ├── date.test.tsx
│   │   │       │   ├── dateTimeRange.test.tsx
│   │   │       │   ├── displayName.test.tsx
│   │   │       │   ├── message.test.tsx
│   │   │       │   ├── number.test.tsx
│   │   │       │   ├── plural.test.tsx
│   │   │       │   ├── provider.test.tsx
│   │   │       │   ├── relative.test.tsx
│   │   │       │   ├── time.test.tsx
│   │   │       │   └── useIntl.test.tsx
│   │   │       ├── react-19-key-warning.test.tsx
│   │   │       ├── react-intl.test.tsx
│   │   │       ├── testUtils.tsx
│   │   │       └── types.test.tsx
│   │   ├── tsconfig.json
│   │   └── vitest.config.mjs
│   ├── svelte-intl/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── context-key.ts
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── provider.ts
│   │   ├── tests/
│   │   │   └── index.test.ts
│   │   └── tsconfig.json
│   ├── ts-transformer/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── examples/
│   │   │   └── compile.ts
│   │   ├── index.ts
│   │   ├── integration-tests/
│   │   │   ├── BUILD.bazel
│   │   │   ├── integration/
│   │   │   │   ├── comp.tsx
│   │   │   │   ├── jest.config.js
│   │   │   │   └── ts-jest.test.tsx
│   │   │   ├── package.json
│   │   │   └── vue/
│   │   │       ├── fixtures/
│   │   │       │   ├── index.vue
│   │   │       │   └── main.ts
│   │   │       └── integration.test.ts
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── console_utils.ts
│   │   │   ├── interpolate-name.ts
│   │   │   ├── transform.ts
│   │   │   └── types.ts
│   │   ├── tests/
│   │   │   ├── __snapshots__/
│   │   │   │   └── index.test.ts.snap
│   │   │   ├── fixtures/
│   │   │   │   ├── FormattedMessage.tsx
│   │   │   │   ├── additionalComponentNames.tsx
│   │   │   │   ├── additionalFunctionNames.tsx
│   │   │   │   ├── ast.tsx
│   │   │   │   ├── defineMessages.tsx
│   │   │   │   ├── defineMessagesPreserveWhitespace.tsx
│   │   │   │   ├── descriptionsAsObjects.tsx
│   │   │   │   ├── extractFromFormatMessage.tsx
│   │   │   │   ├── extractFromFormatMessageStateless.tsx
│   │   │   │   ├── extractSourceLocation.tsx
│   │   │   │   ├── flattenError.tsx
│   │   │   │   ├── formatMessageCall.tsx
│   │   │   │   ├── inline.tsx
│   │   │   │   ├── nested.tsx
│   │   │   │   ├── noImport.tsx
│   │   │   │   ├── nonStaticMessages.tsx
│   │   │   │   ├── optionalChaining.tsx
│   │   │   │   ├── overrideIdFn.tsx
│   │   │   │   ├── removeDefaultMessage.tsx
│   │   │   │   ├── removeDescription.tsx
│   │   │   │   ├── resourcePath.tsx
│   │   │   │   ├── stringConcat.tsx
│   │   │   │   └── templateLiteral.tsx
│   │   │   ├── index.test.ts
│   │   │   └── interpolate-name.test.ts
│   │   ├── ts-jest-integration.ts
│   │   └── tsconfig.json
│   ├── unplugin/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── esbuild.ts
│   │   ├── index.ts
│   │   ├── integration-tests/
│   │   │   ├── BUILD.bazel
│   │   │   ├── fixtures/
│   │   │   │   ├── compiledJsx.js
│   │   │   │   ├── defineMessage.js
│   │   │   │   ├── defineMessages.js
│   │   │   │   ├── formatMessage.js
│   │   │   │   ├── jsx.tsx
│   │   │   │   └── removeDescription.tsx
│   │   │   ├── integration.test.ts
│   │   │   └── package.json
│   │   ├── package.json
│   │   ├── rollup.ts
│   │   ├── rspack.ts
│   │   ├── tests/
│   │   │   └── transform.test.ts
│   │   ├── transform.ts
│   │   ├── tsconfig.json
│   │   ├── vite.ts
│   │   └── webpack.ts
│   ├── utils/
│   │   ├── BUILD.bazel
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── data/
│   │   │   └── list-one.xml
│   │   ├── index.ts
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── countryCodes.ts
│   │   │   ├── currencyMinorUnits.generated.ts
│   │   │   ├── defaultCurrency.ts
│   │   │   ├── defaultCurrencyData.generated.ts
│   │   │   ├── defaultLocale.ts
│   │   │   ├── defaultLocaleData.generated.ts
│   │   │   ├── defaultTimezone.ts
│   │   │   ├── iso3166Alpha3CountryCodes.ts
│   │   │   └── iso4217.ts
│   │   ├── tests/
│   │   │   ├── countryCodes.test.ts
│   │   │   ├── currencyMinorUnits.test.ts
│   │   │   ├── defaultCurrency.test.ts
│   │   │   ├── defaultLocale.test.ts
│   │   │   └── defaultTimezone.test.ts
│   │   ├── tools/
│   │   │   ├── extract-default-currency.ts
│   │   │   ├── extract-default-locale.ts
│   │   │   └── extract-minor-currency-units.ts
│   │   └── tsconfig.json
│   └── vue-intl/
│       ├── BUILD.bazel
│       ├── CHANGELOG.md
│       ├── LICENSE.md
│       ├── README.md
│       ├── index.ts
│       ├── injection-key.ts
│       ├── package.json
│       ├── plugin.ts
│       ├── provider.ts
│       ├── tests/
│       │   └── index.test.ts
│       └── tsconfig.json
├── patches/
│   ├── @types__mdx.patch
│   ├── @vue+compiler-sfc.patch
│   ├── oxlint@1.48.0.patch
│   ├── unicode-match-property-ecmascript@2.0.0.patch
│   └── unicode-match-property-value-ecmascript@2.2.1.patch
├── pnpm-workspace.yaml
├── release.sh
├── renovate.json
├── test262.BUILD
├── tools/
│   ├── BUILD.bazel
│   ├── check-package-json.ts
│   ├── generate-supported-locales.ts
│   ├── index.bzl
│   ├── oxc-transpiler/
│   │   ├── BUILD.bazel
│   │   ├── index.mjs
│   │   └── package.json
│   ├── oxc_transpiler.bzl
│   ├── tsconfig.bzl
│   ├── vitest.bzl
│   └── vitest.config.mjs
└── tsconfig.json
Download .txt
Showing preview only (206K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2202 symbols across 406 files)

FILE: benchmarks/cli-comparison/benchmark-tinybench.mjs
  constant TEST_FILES_DIR (line 15) | let TEST_FILES_DIR, TS_CLI, RUST_CLI
  constant TS_CLI (line 15) | let TEST_FILES_DIR, TS_CLI, RUST_CLI
  constant RUST_CLI (line 15) | let TEST_FILES_DIR, TS_CLI, RUST_CLI
  constant OUTPUT_DIR (line 36) | const OUTPUT_DIR = path.join(__dirname, 'benchmark-output')
  function countFiles (line 69) | function countFiles(dir, count = 0) {

FILE: benchmarks/cli-comparison/generate-test-files.mjs
  constant NUM_FILES (line 14) | const NUM_FILES = process.env.NUM_FILES
  constant OUTPUT_DIR (line 17) | const OUTPUT_DIR = path.join(__dirname, 'test-files')
  constant FILES_PER_DIR (line 18) | const FILES_PER_DIR = 1000 // Split into subdirectories to avoid filesys...
  constant MESSAGE_TEMPLATES (line 21) | const MESSAGE_TEMPLATES = {
  constant MESSAGE_DISTRIBUTION (line 66) | const MESSAGE_DISTRIBUTION = [
  function selectRandomMessage (line 74) | function selectRandomMessage() {
  function generateFileContent (line 89) | function generateFileContent(fileIndex) {
  function generateFiles (line 197) | async function generateFiles() {

FILE: conformance-tests/icu4j/ICUConformanceTest.java
  class ICUConformanceTest (line 16) | public class ICUConformanceTest {
    method main (line 17) | public static void main(String[] args) {
    method testLocaleCanonicaliz (line 38) | private static void testLocaleCanonicaliz() {
    method testScriptCodeNormalization (line 74) | private static void testScriptCodeNormalization() {
    method testVariantHandling (line 110) | private static void testVariantHandling() {
    method testLowercaseScriptCodes (line 154) | private static void testLowercaseScriptCodes() {
    method testDisplayNames (line 189) | private static void testDisplayNames() {
    method testPluralRulesSelectRange (line 243) | private static void testPluralRulesSelectRange() {

FILE: crates/formatjs_cli/src/compile.rs
  type PseudoLocale (line 11) | pub enum PseudoLocale {
  function compile (line 65) | pub fn compile(
  function test_compile_simple_messages (line 234) | fn test_compile_simple_messages() {
  function test_compile_with_default_formatter (line 271) | fn test_compile_with_default_formatter() {
  function test_compile_to_ast (line 309) | fn test_compile_to_ast() {
  function test_compile_invalid_icu_message (line 347) | fn test_compile_invalid_icu_message() {
  function test_compile_skip_errors (line 379) | fn test_compile_skip_errors() {
  function test_compile_multiple_files (line 420) | fn test_compile_multiple_files() {
  function test_compile_conflict_detection (line 459) | fn test_compile_conflict_detection() {
  function test_compile_with_glob_pattern (line 493) | fn test_compile_with_glob_pattern() {
  function test_compile_icu_plural (line 532) | fn test_compile_icu_plural() {
  function test_compile_with_transifex_formatter (line 572) | fn test_compile_with_transifex_formatter() {
  function test_compile_pseudo_locale_requires_ast (line 610) | fn test_compile_pseudo_locale_requires_ast() {
  function test_compile_sorted_keys (line 638) | fn test_compile_sorted_keys() {
  function test_compile_sorted_keys_multiple_files (line 696) | fn test_compile_sorted_keys_multiple_files() {
  function test_compile_sorted_keys_with_ast (line 750) | fn test_compile_sorted_keys_with_ast() {
  function test_compile_with_crowdin_formatter (line 799) | fn test_compile_with_crowdin_formatter() {
  function test_compile_with_crowdin_formatter_icu_plural (line 842) | fn test_compile_with_crowdin_formatter_icu_plural() {
  function test_compile_with_crowdin_formatter_skips_smartling_key (line 883) | fn test_compile_with_crowdin_formatter_skips_smartling_key() {
  function test_compile_with_crowdin_formatter_to_ast (line 927) | fn test_compile_with_crowdin_formatter_to_ast() {
  function test_compile_with_crowdin_formatter_missing_message_field (line 969) | fn test_compile_with_crowdin_formatter_missing_message_field() {
  function test_compile_with_crowdin_formatter_multiple_files (line 1006) | fn test_compile_with_crowdin_formatter_multiple_files() {
  function test_compile_with_brace_expansion_glob (line 1057) | fn test_compile_with_brace_expansion_glob() {
  function test_compile_with_nested_directory_glob (line 1098) | fn test_compile_with_nested_directory_glob() {
  function test_compile_with_literal_file_path (line 1138) | fn test_compile_with_literal_file_path() {

FILE: crates/formatjs_cli/src/compile_folder.rs
  function compile_folder (line 39) | pub fn compile_folder(
  function test_compile_folder_simple (line 150) | fn test_compile_folder_simple() {
  function test_compile_folder_preserves_structure (line 193) | fn test_compile_folder_preserves_structure() {
  function test_compile_folder_with_formatter (line 238) | fn test_compile_folder_with_formatter() {
  function test_compile_folder_to_ast (line 274) | fn test_compile_folder_to_ast() {
  function test_compile_folder_source_not_exists (line 304) | fn test_compile_folder_source_not_exists() {
  function test_compile_folder_source_not_directory (line 324) | fn test_compile_folder_source_not_directory() {
  function test_compile_folder_no_json_files (line 348) | fn test_compile_folder_no_json_files() {
  function test_compile_folder_partial_failure (line 370) | fn test_compile_folder_partial_failure() {
  function test_compile_folder_multiple_files (line 401) | fn test_compile_folder_multiple_files() {
  function test_compile_folder_creates_output_dir (line 433) | fn test_compile_folder_creates_output_dir() {

FILE: crates/formatjs_cli/src/extract.rs
  function extract (line 14) | pub fn extract(
  function read_file_list (line 147) | fn read_file_list(path: &Path) -> Result<Vec<PathBuf>> {
  function extract_base_dir (line 161) | pub fn extract_base_dir(pattern: &str) -> PathBuf {
  function resolve_files_from_globs (line 184) | fn resolve_files_from_globs(globs: &[PathBuf], ignore: &[String]) -> Res...
  function should_ignore (line 229) | fn should_ignore(path: &Path, patterns: &[String]) -> bool {
  function is_supported_file (line 237) | fn is_supported_file(path: &Path) -> bool {
  function build_component_names (line 249) | fn build_component_names(additional: &[String]) -> Vec<String> {
  function build_function_names (line 256) | fn build_function_names(additional: &[String]) -> Vec<String> {
  function extract_from_file (line 268) | fn extract_from_file(
  function extract_pragma (line 307) | fn extract_pragma(source: &str, pragma: &str) -> HashMap<String, String> {
  function test_read_file_list (line 332) | fn test_read_file_list() {
  function test_is_supported_file (line 348) | fn test_is_supported_file() {
  function test_build_component_names (line 360) | fn test_build_component_names() {
  function test_build_function_names (line 370) | fn test_build_function_names() {
  function test_extract_pragma (line 382) | fn test_extract_pragma() {
  function test_should_ignore (line 397) | fn test_should_ignore() {
  function test_resolve_files_with_brace_expansion (line 412) | fn test_resolve_files_with_brace_expansion() {
  function test_extract_brace_expansion_e2e (line 436) | fn test_extract_brace_expansion_e2e() {
  function test_extract_base_dir (line 514) | fn test_extract_base_dir() {
  function test_resolve_files_with_ignore_patterns (line 531) | fn test_resolve_files_with_ignore_patterns() {
  function test_resolve_files_nested_directories (line 556) | fn test_resolve_files_nested_directories() {
  function test_resolve_files_nonexistent_base_dir (line 578) | fn test_resolve_files_nonexistent_base_dir() {
  function test_resolve_files_literal_path (line 585) | fn test_resolve_files_literal_path() {
  function test_extract_sorted_keys (line 599) | fn test_extract_sorted_keys() {
  function test_extract_sorted_keys_with_default_formatter (line 675) | fn test_extract_sorted_keys_with_default_formatter() {
  function test_extract_with_custom_id_interpolation_pattern (line 745) | fn test_extract_with_custom_id_interpolation_pattern() {
  function test_extract_with_different_id_patterns (line 801) | fn test_extract_with_different_id_patterns() {
  function test_extract_with_base62_interpolation_pattern (line 872) | fn test_extract_with_base62_interpolation_pattern() {
  function test_extract_base62_vs_base64_vs_hex (line 938) | fn test_extract_base62_vs_base64_vs_hex() {
  function test_extract_messages_without_id_use_pattern (line 1044) | fn test_extract_messages_without_id_use_pattern() {
  function test_extract_with_description_affects_generated_id (line 1102) | fn test_extract_with_description_affects_generated_id() {
  function test_extract_with_crowdin_format (line 1183) | fn test_extract_with_crowdin_format() {
  function test_extract_with_crowdin_format_icu_plural (line 1251) | fn test_extract_with_crowdin_format_icu_plural() {
  function test_extract_with_crowdin_format_without_description (line 1300) | fn test_extract_with_crowdin_format_without_description() {
  function test_extract_with_crowdin_format_icu_select (line 1346) | fn test_extract_with_crowdin_format_icu_select() {
  function test_extract_with_crowdin_format_multiple_files (line 1391) | fn test_extract_with_crowdin_format_multiple_files() {
  function test_extract_crowdin_format_json_structure (line 1457) | fn test_extract_crowdin_format_json_structure() {
  function test_extract_crowdin_format_with_formatted_message_component (line 1512) | fn test_extract_crowdin_format_with_formatted_message_component() {
  function test_extract_deterministic_id_generation (line 1562) | fn test_extract_deterministic_id_generation() {
  function test_extract_with_throws_false_collects_partial_results (line 1626) | fn test_extract_with_throws_false_collects_partial_results() {
  function test_extract_with_throws_true_fails_on_error (line 1708) | fn test_extract_with_throws_true_fails_on_error() {

FILE: crates/formatjs_cli/src/extractor.rs
  type MessageDescriptor (line 26) | pub struct MessageDescriptor {
  function normalize_whitespace (line 45) | fn normalize_whitespace(s: &str) -> String {
  function get_line_col (line 50) | fn get_line_col(source: &str, offset: usize) -> (usize, usize) {
  function extract_messages_from_source (line 68) | pub fn extract_messages_from_source(
  function determine_source_type (line 168) | pub fn determine_source_type(path: &Path) -> Result<SourceType> {
  type MessageExtractor (line 186) | struct MessageExtractor<'a> {
  function new (line 198) | fn new(
  function extract_string_literal (line 219) | fn extract_string_literal(
  function extract_description (line 253) | fn extract_description(&self, expr: &Expression) -> Option<Value> {
  function extract_function_name (line 293) | fn extract_function_name<'b>(&self, callee: &'b Expression) -> Option<&'...
  function extract_function_name_from_chain (line 319) | fn extract_function_name_from_chain<'b>(
  function extract_function_name_from_member (line 333) | fn extract_function_name_from_member<'b>(
  function is_intl_object (line 349) | fn is_intl_object(&self, expr: &Expression) -> bool {
  function is_intl_object_from_chain (line 374) | fn is_intl_object_from_chain(&self, chain_elem: &ChainElement) -> bool {
  function extract_jsx_message (line 386) | fn extract_jsx_message(&mut self, opening_element: &JSXOpeningElement) {
  function extract_call_expression_message (line 485) | fn extract_call_expression_message(&mut self, call: &CallExpression) {
  function extract_object_descriptor (line 541) | fn extract_object_descriptor(
  function visit_jsx_opening_element (line 598) | fn visit_jsx_opening_element(&mut self, it: &JSXOpeningElement<'a>) {
  function visit_call_expression (line 604) | fn visit_call_expression(&mut self, it: &CallExpression<'a>) {
  function visit_chain_expression (line 610) | fn visit_chain_expression(&mut self, it: &oxc_ast::ast::ChainExpression<...
  function fixtures_dir (line 645) | fn fixtures_dir() -> PathBuf {
  function extract_from_fixture (line 672) | fn extract_from_fixture(
  function extract_pragma (line 704) | fn extract_pragma(source: &str, pragma: &str) -> HashMap<String, String> {
  function test_extract_formatted_message_jsx (line 722) | fn test_extract_formatted_message_jsx() {
  function test_extract_define_messages (line 760) | fn test_extract_define_messages() {
  function test_extract_format_message_call (line 804) | fn test_extract_format_message_call() {
  function test_extract_with_source_location (line 841) | fn test_extract_with_source_location() {
  function test_extract_object_description (line 872) | fn test_extract_object_description() {
  function test_whitespace_preservation (line 916) | fn test_whitespace_preservation() {
  function test_custom_component_names (line 965) | fn test_custom_component_names() {
  function test_custom_function_names (line 995) | fn test_custom_function_names() {
  function test_no_defaultmessage_skips (line 1031) | fn test_no_defaultmessage_skips() {
  function test_fixture_formatted_message (line 1062) | fn test_fixture_formatted_message() {
  function test_fixture_define_messages (line 1090) | fn test_fixture_define_messages() {
  function test_fixture_additional_component_names (line 1130) | fn test_fixture_additional_component_names() {
  function test_fixture_additional_function_names (line 1155) | fn test_fixture_additional_function_names() {
  function test_fixture_descriptions_as_objects (line 1175) | fn test_fixture_descriptions_as_objects() {
  function test_fixture_extract_from_format_message (line 1199) | fn test_fixture_extract_from_format_message() {
  function test_fixture_format_message_call (line 1217) | fn test_fixture_format_message_call() {
  function test_fixture_nested (line 1234) | fn test_fixture_nested() {
  function test_fixture_string_concat (line 1246) | fn test_fixture_string_concat() {
  function test_fixture_template_literal (line 1259) | fn test_fixture_template_literal() {
  function test_fixture_inline (line 1276) | fn test_fixture_inline() {
  function test_fixture_define_messages_preserve_whitespace (line 1302) | fn test_fixture_define_messages_preserve_whitespace() {
  function test_fixture_optional_chaining (line 1345) | fn test_fixture_optional_chaining() {
  function test_fixture_no_import (line 1411) | fn test_fixture_no_import() {
  function test_fixture_extract_source_location (line 1486) | fn test_fixture_extract_source_location() {
  function test_string_concatenation (line 1518) | fn test_string_concatenation() {
  function test_non_breaking_space_in_message (line 1555) | fn test_non_breaking_space_in_message() {
  function test_typescript_type_guard_no_crash (line 1596) | fn test_typescript_type_guard_no_crash() {
  function test_flatten_error_includes_location_info (line 1639) | fn test_flatten_error_includes_location_info() {

FILE: crates/formatjs_cli/src/formatters/crowdin.rs
  function format (line 20) | pub fn format(messages: &BTreeMap<String, MessageDescriptor>) -> Value {
  function compile (line 44) | pub fn compile(messages: &Value) -> BTreeMap<String, String> {
  function test_crowdin_formatter_basic (line 75) | fn test_crowdin_formatter_basic() {
  function test_crowdin_formatter_skips_smartling_key (line 93) | fn test_crowdin_formatter_skips_smartling_key() {
  function test_crowdin_formatter_missing_field (line 110) | fn test_crowdin_formatter_missing_field() {
  function test_crowdin_formatter_icu_message (line 122) | fn test_crowdin_formatter_icu_message() {
  function test_crowdin_format_basic (line 140) | fn test_crowdin_format_basic() {
  function test_crowdin_format_without_description (line 177) | fn test_crowdin_format_without_description() {
  function test_crowdin_format_multiple_messages (line 204) | fn test_crowdin_format_multiple_messages() {
  function test_crowdin_format_icu_plural (line 255) | fn test_crowdin_format_icu_plural() {
  function test_crowdin_format_icu_select (line 283) | fn test_crowdin_format_icu_select() {
  function test_crowdin_format_with_object_description (line 312) | fn test_crowdin_format_with_object_description() {
  function test_crowdin_format_empty_messages (line 340) | fn test_crowdin_format_empty_messages() {
  function test_crowdin_format_without_default_message (line 351) | fn test_crowdin_format_without_default_message() {
  function test_crowdin_format_compile_roundtrip (line 383) | fn test_crowdin_format_compile_roundtrip() {
  function test_crowdin_format_json_structure (line 422) | fn test_crowdin_format_json_structure() {

FILE: crates/formatjs_cli/src/formatters/default.rs
  function format (line 22) | pub fn format(messages: &BTreeMap<String, MessageDescriptor>) -> Value {
  function compile (line 27) | pub fn compile(messages: &Value) -> BTreeMap<String, String> {
  function test_default_formatter_basic (line 52) | fn test_default_formatter_basic() {
  function test_default_formatter_missing_field (line 71) | fn test_default_formatter_missing_field() {
  function test_default_formatter_wrong_type (line 83) | fn test_default_formatter_wrong_type() {
  function test_default_formatter_icu_message (line 93) | fn test_default_formatter_icu_message() {

FILE: crates/formatjs_cli/src/formatters/lokalise.rs
  function format (line 20) | pub fn format(messages: &BTreeMap<String, MessageDescriptor>) -> Value {
  function compile (line 44) | pub fn compile(messages: &Value) -> BTreeMap<String, String> {
  function test_lokalise_formatter_basic (line 68) | fn test_lokalise_formatter_basic() {
  function test_lokalise_formatter_missing_field (line 87) | fn test_lokalise_formatter_missing_field() {
  function test_lokalise_formatter_with_metadata (line 99) | fn test_lokalise_formatter_with_metadata() {

FILE: crates/formatjs_cli/src/formatters/mod.rs
  type Formatter (line 16) | pub enum Formatter {
    method format_to_vendor_json (line 44) | pub fn format_to_vendor_json(&self, messages: &BTreeMap<String, Messag...
    method format (line 68) | pub fn format(
    method apply (line 100) | pub fn apply(&self, json: &Value, _file_path: &str) -> Result<HashMap<...
    method from_str (line 115) | pub fn from_str(s: &str) -> Result<Self> {
    method as_str (line 131) | pub fn as_str(&self) -> &'static str {
  function test_formatter_from_str (line 149) | fn test_formatter_from_str() {
  function test_formatter_from_str_case_insensitive (line 177) | fn test_formatter_from_str_case_insensitive() {
  function test_formatter_from_str_invalid (line 193) | fn test_formatter_from_str_invalid() {
  function test_formatter_as_str (line 199) | fn test_formatter_as_str() {
  function test_formatter_apply_default (line 209) | fn test_formatter_apply_default() {
  function test_formatter_apply_simple (line 221) | fn test_formatter_apply_simple() {
  function test_formatter_apply_transifex (line 231) | fn test_formatter_apply_transifex() {
  function test_formatter_apply_smartling (line 243) | fn test_formatter_apply_smartling() {
  function test_formatter_apply_lokalise (line 255) | fn test_formatter_apply_lokalise() {
  function test_formatter_apply_crowdin (line 267) | fn test_formatter_apply_crowdin() {

FILE: crates/formatjs_cli/src/formatters/simple.rs
  function format (line 18) | pub fn format(messages: &BTreeMap<String, MessageDescriptor>) -> Value {
  function compile (line 30) | pub fn compile(messages: &Value) -> BTreeMap<String, String> {
  function test_simple_formatter_basic (line 51) | fn test_simple_formatter_basic() {
  function test_simple_formatter_wrong_type (line 64) | fn test_simple_formatter_wrong_type() {
  function test_simple_formatter_icu_message (line 79) | fn test_simple_formatter_icu_message() {

FILE: crates/formatjs_cli/src/formatters/smartling.rs
  function format (line 29) | pub fn format(messages: &BTreeMap<String, MessageDescriptor>) -> Value {
  function compile (line 66) | pub fn compile(messages: &Value) -> BTreeMap<String, String> {
  function test_smartling_formatter_basic (line 95) | fn test_smartling_formatter_basic() {
  function test_smartling_formatter_skips_metadata (line 123) | fn test_smartling_formatter_skips_metadata() {
  function test_smartling_formatter_missing_field (line 140) | fn test_smartling_formatter_missing_field() {

FILE: crates/formatjs_cli/src/formatters/transifex.rs
  function format (line 20) | pub fn format(messages: &BTreeMap<String, MessageDescriptor>) -> Value {
  function compile (line 44) | pub fn compile(messages: &Value) -> BTreeMap<String, String> {
  function test_transifex_formatter_basic (line 68) | fn test_transifex_formatter_basic() {
  function test_transifex_formatter_missing_field (line 87) | fn test_transifex_formatter_missing_field() {
  function test_transifex_formatter_with_metadata (line 99) | fn test_transifex_formatter_with_metadata() {

FILE: crates/formatjs_cli/src/id_generator.rs
  constant BASE62_CHARS (line 12) | const BASE62_CHARS: &[u8] = b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef...
  function encode_base62 (line 15) | fn encode_base62(bytes: &[u8]) -> String {
  function generate_id (line 68) | pub fn generate_id(
  function test_generate_id_sha512_base64 (line 149) | fn test_generate_id_sha512_base64() {
  function test_generate_id_sha512_base64url (line 162) | fn test_generate_id_sha512_base64url() {
  function test_generate_id_with_description (line 174) | fn test_generate_id_with_description() {
  function test_generate_id_hex (line 189) | fn test_generate_id_hex() {
  function test_generate_id_invalid_pattern (line 195) | fn test_generate_id_invalid_pattern() {
  function test_generate_id_different_lengths (line 201) | fn test_generate_id_different_lengths() {
  function test_generate_id_deterministic (line 211) | fn test_generate_id_deterministic() {
  function test_generate_id_different_messages (line 233) | fn test_generate_id_different_messages() {
  function test_generate_id_with_description_affects_hash (line 255) | fn test_generate_id_with_description_affects_hash() {
  function test_generate_id_hex_vs_base64 (line 282) | fn test_generate_id_hex_vs_base64() {
  function test_generate_id_base64_vs_base64url (line 292) | fn test_generate_id_base64_vs_base64url() {
  function test_generate_id_base62 (line 303) | fn test_generate_id_base62() {
  function test_generate_id_base62_deterministic (line 310) | fn test_generate_id_base62_deterministic() {
  function test_generate_id_base62_different_from_base64 (line 330) | fn test_generate_id_base62_different_from_base64() {
  function test_generate_id_base62_various_lengths (line 341) | fn test_generate_id_base62_various_lengths() {
  function test_generate_id_invalid_encoding (line 351) | fn test_generate_id_invalid_encoding() {
  function test_generate_id_invalid_hash_algorithm (line 366) | fn test_generate_id_invalid_hash_algorithm() {
  function test_generate_id_invalid_format (line 376) | fn test_generate_id_invalid_format() {
  function test_generate_id_matches_typescript_cli (line 392) | fn test_generate_id_matches_typescript_cli() {

FILE: crates/formatjs_cli/src/main.rs
  type Cli (line 18) | struct Cli {
  type FormatterType (line 24) | enum FormatterType {
  function from (line 46) | fn from(f: FormatterType) -> Self {
  type PseudoLocale (line 59) | enum PseudoLocale {
  function from (line 73) | fn from(p: PseudoLocale) -> Self {
  type Commands (line 85) | enum Commands {
  function main (line 245) | fn main() -> Result<()> {
  function verify_cli (line 345) | fn verify_cli() {
  function test_extract_help (line 351) | fn test_extract_help() {
  function test_compile_help (line 359) | fn test_compile_help() {
  function test_verify_help (line 367) | fn test_verify_help() {

FILE: crates/formatjs_cli/src/verify.rs
  function verify (line 57) | pub fn verify(
  function extract_locale_from_path (line 152) | fn extract_locale_from_path(path: &Path) -> Result<String> {
  function should_ignore (line 163) | fn should_ignore(file: &Path, ignore_patterns: &[String]) -> bool {
  function extract_keys (line 172) | fn extract_keys(value: &Value, parent_key: &str) -> Vec<String> {
  function flatten (line 200) | fn flatten(value: &Value, parent_key: &str) -> HashMap<String, String> {
  function check_missing_keys (line 232) | fn check_missing_keys(locales: &HashMap<String, Value>, source_locale: &...
  function check_extra_keys (line 273) | fn check_extra_keys(locales: &HashMap<String, Value>, source_locale: &st...
  function check_structural_equality (line 307) | fn check_structural_equality(locales: &HashMap<String, Value>, source_lo...
  function extract_parse_error_code (line 383) | fn extract_parse_error_code(msg: &str) -> Option<String> {
  function format_error_message (line 410) | fn format_error_message(msg: &str) -> String {
  function compare_message_structure (line 458) | fn compare_message_structure(source: &str, target: &str, message_id: Opt...
  function test_extract_keys (line 488) | fn test_extract_keys() {
  function test_extract_keys_empty_object (line 508) | fn test_extract_keys_empty_object() {
  function test_extract_keys_flat_object (line 515) | fn test_extract_keys_flat_object() {
  function test_flatten (line 530) | fn test_flatten() {
  function test_flatten_ignores_non_string_values (line 549) | fn test_flatten_ignores_non_string_values() {
  function test_flatten_empty_object (line 575) | fn test_flatten_empty_object() {
  function test_extract_locale_from_path (line 582) | fn test_extract_locale_from_path() {
  function test_extract_locale_from_path_complex (line 591) | fn test_extract_locale_from_path_complex() {
  function test_should_ignore (line 600) | fn test_should_ignore() {
  function test_should_ignore_empty_patterns (line 616) | fn test_should_ignore_empty_patterns() {
  function test_check_missing_keys (line 623) | fn test_check_missing_keys() {
  function test_check_missing_keys_with_missing (line 650) | fn test_check_missing_keys_with_missing() {
  function test_check_extra_keys (line 671) | fn test_check_extra_keys() {
  function test_check_extra_keys_with_extra (line 692) | fn test_check_extra_keys_with_extra() {
  function test_compare_message_structure_identical (line 713) | fn test_compare_message_structure_identical() {
  function test_compare_message_structure_same_structure_different_text (line 722) | fn test_compare_message_structure_same_structure_different_text() {
  function test_compare_message_structure_plural (line 730) | fn test_compare_message_structure_plural() {
  function test_compare_message_structure_missing_variable (line 738) | fn test_compare_message_structure_missing_variable() {
  function test_compare_message_structure_different_variable_name (line 748) | fn test_compare_message_structure_different_variable_name() {
  function test_compare_message_structure_type_mismatch (line 757) | fn test_compare_message_structure_type_mismatch() {
  function test_compare_message_structure_date_format (line 769) | fn test_compare_message_structure_date_format() {
  function test_compare_message_structure_date_type_mismatch (line 777) | fn test_compare_message_structure_date_type_mismatch() {
  function test_compare_message_structure_number_format (line 786) | fn test_compare_message_structure_number_format() {
  function test_compare_message_structure_select (line 794) | fn test_compare_message_structure_select() {
  function test_compare_message_structure_multiple_variables (line 802) | fn test_compare_message_structure_multiple_variables() {
  function test_compare_message_structure_multiple_variables_missing_one (line 810) | fn test_compare_message_structure_multiple_variables_missing_one() {
  function test_compare_message_structure_complex_nested (line 819) | fn test_compare_message_structure_complex_nested() {
  function test_compare_message_structure_invalid_source (line 828) | fn test_compare_message_structure_invalid_source() {
  function test_compare_message_structure_invalid_target (line 836) | fn test_compare_message_structure_invalid_target() {
  function test_check_structural_equality (line 844) | fn test_check_structural_equality() {
  function test_check_structural_equality_with_errors (line 865) | fn test_check_structural_equality_with_errors() {
  function test_verify_with_brace_expansion_glob (line 886) | fn test_verify_with_brace_expansion_glob() {
  function test_verify_with_nested_directory_glob (line 932) | fn test_verify_with_nested_directory_glob() {
  function test_verify_with_literal_file_paths (line 969) | fn test_verify_with_literal_file_paths() {
  function test_should_ignore_with_glob_patterns (line 1002) | fn test_should_ignore_with_glob_patterns() {

FILE: crates/icu_messageformat_parser/benches/parser_bench.rs
  constant COMPLEX_MSG (line 11) | const COMPLEX_MSG: &str = concat!(
  constant NORMAL_MSG (line 33) | const NORMAL_MSG: &str = concat!(
  constant SIMPLE_MSG (line 41) | const SIMPLE_MSG: &str = "Hello, {name}!";
  constant STRING_MSG (line 43) | const STRING_MSG: &str = "Hello, world!";
  function benchmark_complex_msg (line 45) | fn benchmark_complex_msg(c: &mut Criterion) {
  function benchmark_normal_msg (line 54) | fn benchmark_normal_msg(c: &mut Criterion) {
  function benchmark_simple_msg (line 63) | fn benchmark_simple_msg(c: &mut Criterion) {
  function benchmark_string_msg (line 72) | fn benchmark_string_msg(c: &mut Criterion) {

FILE: crates/icu_messageformat_parser/date_time_pattern_generator.rs
  function get_best_pattern (line 23) | pub fn get_best_pattern(skeleton: &str, locale: &Locale) -> String {
  function get_default_hour_symbol_from_locale (line 76) | fn get_default_hour_symbol_from_locale(locale: &Locale) -> char {
  function get_hour_symbol_from_time_data (line 94) | fn get_hour_symbol_from_time_data(locale: &Locale) -> char {
  function test_get_best_pattern_simple (line 124) | fn test_get_best_pattern_simple() {
  function test_get_best_pattern_with_j (line 131) | fn test_get_best_pattern_with_j() {
  function test_get_best_pattern_with_capital_j (line 140) | fn test_get_best_pattern_with_capital_j() {
  function test_get_best_pattern_multiple_j (line 149) | fn test_get_best_pattern_multiple_j() {
  function test_get_best_pattern_with_hour_cycle (line 157) | fn test_get_best_pattern_with_hour_cycle() {
  function test_get_default_hour_symbol_en_us (line 165) | fn test_get_default_hour_symbol_en_us() {
  function test_get_default_hour_symbol_fr_fr (line 173) | fn test_get_default_hour_symbol_fr_fr() {
  function test_time_data_fallback (line 181) | fn test_time_data_fallback() {

FILE: crates/icu_messageformat_parser/error.rs
  type LocationDetails (line 5) | pub struct LocationDetails {
  type Location (line 13) | pub struct Location {
  type ParserError (line 20) | pub struct ParserError {
    method new (line 28) | pub fn new(kind: ErrorKind, message: String, location: Location) -> Se...
    method fmt (line 38) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type ErrorKind (line 52) | pub enum ErrorKind {
    method fmt (line 111) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  method serialize (line 160) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  function test_error_kind_discriminants (line 173) | fn test_error_kind_discriminants() {
  function test_parser_error_display (line 184) | fn test_parser_error_display() {
  function test_location_details (line 210) | fn test_location_details() {

FILE: crates/icu_messageformat_parser/lib.rs
  function test_time_data_has_entries (line 49) | fn test_time_data_has_entries() {
  function test_time_data_has_001 (line 54) | fn test_time_data_has_001() {

FILE: crates/icu_messageformat_parser/lib_wasm.rs
  type JsParserOptions (line 14) | struct JsParserOptions {
    method to_parser_options (line 32) | fn to_parser_options(self) -> ParserOptions {
  function default_true (line 27) | fn default_true() -> bool {
  function parse (line 44) | pub fn parse(input: &str, options_json: Option<String>) -> Result<String...
  function parse_ignore_tag (line 65) | pub fn parse_ignore_tag(input: &str) -> Result<String, JsValue> {

FILE: crates/icu_messageformat_parser/manipulator.rs
  type ManipulatorError (line 13) | pub enum ManipulatorError {
    method fmt (line 29) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  type StructuralComparisonResult (line 56) | pub type StructuralComparisonResult = Result<(), StructuralComparisonErr...
  type StructuralComparisonError (line 60) | pub enum StructuralComparisonError {
    method fmt (line 82) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  function is_plural_or_select_element (line 141) | fn is_plural_or_select_element(el: &MessageFormatElement) -> bool {
  function replace_pound_with_argument (line 163) | fn replace_pound_with_argument(
  function find_plural_or_select_element (line 248) | fn find_plural_or_select_element(ast: &[MessageFormatElement]) -> bool {
  function hoist_element (line 277) | fn hoist_element(
  function hoist_selectors_impl (line 372) | fn hoist_selectors_impl(
  function hoist_selectors (line 420) | pub fn hoist_selectors(ast: Vec<MessageFormatElement>) -> Vec<MessageFor...
  function try_hoist_selectors (line 439) | pub fn try_hoist_selectors(
  function collect_variables (line 471) | fn collect_variables(
  function is_structurally_same (line 561) | pub fn is_structurally_same(
  function test_hoist_simple_plural (line 607) | fn test_hoist_simple_plural() {
  function test_collect_variables (line 660) | fn test_collect_variables() {
  function test_is_structurally_same_success (line 690) | fn test_is_structurally_same_success() {
  function test_is_structurally_same_includes_message_id (line 706) | fn test_is_structurally_same_includes_message_id() {
  function test_is_structurally_same_missing_variable (line 731) | fn test_is_structurally_same_missing_variable() {
  function test_is_structurally_same_type_mismatch (line 753) | fn test_is_structurally_same_type_mismatch() {
  function test_hoist_panics_on_plural_in_tag (line 785) | fn test_hoist_panics_on_plural_in_tag() {
  function test_is_structurally_same_with_plural_translations (line 813) | fn test_is_structurally_same_with_plural_translations() {

FILE: crates/icu_messageformat_parser/parser.rs
  type Position (line 18) | pub struct Position {
    method new (line 31) | pub fn new() -> Self {
  method default (line 42) | fn default() -> Self {
  type ParserOptions (line 49) | pub struct ParserOptions {
  type Result (line 70) | pub type Result<T> = std::result::Result<T, ParserError>;
  type ArgType (line 74) | enum ArgType {
    method from_str (line 85) | fn from_str(s: &str) -> Option<Self> {
  constant LEFT_ANGLE_BRACKET (line 102) | const LEFT_ANGLE_BRACKET: &str = "<";
  constant APOSTROPHE (line 103) | const APOSTROPHE: &str = "'";
  function match_identifier_at_index (line 118) | fn match_identifier_at_index(s: &str, byte_index: usize) -> (&str, usize) {
  function is_alpha (line 145) | fn is_alpha(codepoint: u32) -> bool {
  function is_alpha_or_slash (line 151) | fn is_alpha_or_slash(codepoint: u32) -> bool {
  function is_potential_element_name_char (line 160) | fn is_potential_element_name_char(c: u32) -> bool {
  function is_white_space (line 186) | fn is_white_space(c: u32) -> bool {
  function is_pattern_syntax (line 200) | fn is_pattern_syntax(c: char) -> bool {
  function is_identifier_char (line 228) | fn is_identifier_char(c: char) -> bool {
  function trim_start (line 235) | fn trim_start(s: &str) -> String {
  function trim_end (line 243) | fn trim_end(s: &str) -> String {
  function create_location (line 249) | fn create_location(start: Position, end: Position) -> Option<Location> {
  function cold_panic (line 267) | fn cold_panic(msg: &str) -> ! {
  function cold_panic_fmt (line 274) | fn cold_panic_fmt(args: std::fmt::Arguments) -> ! {
  type Parser (line 292) | pub struct Parser {
    method new (line 316) | pub fn new(message: impl Into<String>, options: ParserOptions) -> Self {
    method parse (line 341) | pub fn parse(mut self) -> Result<Vec<MessageFormatElement>> {
    method byte_offset (line 354) | fn byte_offset(&self) -> usize {
    method offset (line 362) | fn offset(&self) -> usize {
    method is_eof (line 370) | fn is_eof(&self) -> bool {
    method char (line 383) | fn char(&self) -> u32 {
    method clone_position (line 403) | fn clone_position(&self) -> Position {
    method error (line 412) | fn error<T>(&self, kind: ErrorKind, location: Option<Location>) -> Res...
    method bump (line 443) | fn bump(&mut self) {
    method bump_if (line 471) | fn bump_if(&mut self, prefix: &str) -> bool {
    method bump_until (line 486) | fn bump_until(&mut self, pattern: &str) -> bool {
    method bump_to (line 502) | fn bump_to(&mut self, target_offset: usize) {
    method bump_space (line 529) | fn bump_space(&mut self) {
    method peek (line 538) | fn peek(&self) -> Option<u32> {
    method parse_identifier_if_possible (line 563) | fn parse_identifier_if_possible(&mut self) -> (String, Option<Location...
    method try_parse_left_angle_bracket (line 593) | fn try_parse_left_angle_bracket(&mut self) -> Option<String> {
    method try_parse_quote (line 612) | fn try_parse_quote(&mut self, parent_arg_type: ArgType) -> Option<Stri...
    method try_parse_unquoted (line 684) | fn try_parse_unquoted(
    method parse_literal (line 715) | fn parse_literal(
    method parse_tag_name (line 762) | fn parse_tag_name(&mut self) -> String {
    method parse_tag (line 788) | fn parse_tag(
    method try_parse_argument_close (line 885) | fn try_parse_argument_close(&mut self, opening_brace_position: Positio...
    method try_parse_decimal_integer (line 902) | fn try_parse_decimal_integer(
    method parse_simple_arg_style_if_possible (line 955) | fn parse_simple_arg_style_if_possible(&mut self) -> Result<String> {
    method parse_message (line 1016) | fn parse_message(
    method parse_argument (line 1085) | fn parse_argument(
    method parse_argument_options (line 1188) | fn parse_argument_options(
    method try_parse_plural_or_select_options (line 1512) | fn try_parse_plural_or_select_options(
  function test_position_default (line 1646) | fn test_position_default() {
  function test_is_alpha (line 1654) | fn test_is_alpha() {
  function test_is_white_space (line 1662) | fn test_is_white_space() {
  function test_parser_creation (line 1670) | fn test_parser_creation() {
  function test_parser_bump (line 1677) | fn test_parser_bump() {
  function test_parser_bump_if (line 1693) | fn test_parser_bump_if() {
  function test_parser_peek (line 1707) | fn test_parser_peek() {
  function test_parser_hindi_text_with_tags (line 1714) | fn test_parser_hindi_text_with_tags() {

FILE: crates/icu_messageformat_parser/printer.rs
  function print_ast (line 37) | pub fn print_ast(ast: &[MessageFormatElement]) -> String {
  function do_print_ast (line 55) | fn do_print_ast(ast: &[MessageFormatElement], is_in_plural: bool) -> Str...
  function print_tag_element (line 92) | fn print_tag_element(el: &TagElement) -> String {
  function print_escaped_message (line 108) | fn print_escaped_message(message: &str) -> String {
  function print_literal_element (line 128) | fn print_literal_element(
  function print_argument_element (line 169) | fn print_argument_element(el: &ArgumentElement) -> String {
  function print_number_element (line 184) | fn print_number_element(el: &NumberElement) -> String {
  function print_date_element (line 203) | fn print_date_element(el: &DateElement) -> String {
  function print_time_element (line 222) | fn print_time_element(el: &TimeElement) -> String {
  function print_number_skeleton_token (line 242) | fn print_number_skeleton_token(token: &NumberSkeletonToken) -> String {
  function print_argument_style_number (line 271) | fn print_argument_style_number(style: &NumberSkeletonOrStyle) -> String {
  function print_argument_style_datetime (line 298) | fn print_argument_style_datetime(style: &DateTimeSkeletonOrStyle) -> Str...
  function print_date_time_skeleton (line 319) | pub fn print_date_time_skeleton(style: &DateTimeSkeleton) -> String {
  function print_select_element (line 337) | fn print_select_element(el: &SelectElement) -> String {
  function get_plural_rule_sort_order (line 365) | fn get_plural_rule_sort_order(rule: &ValidPluralRule) -> (u8, i32) {
  function print_plural_element (line 397) | fn print_plural_element(el: &PluralElement) -> String {
  function test_print_literal (line 435) | fn test_print_literal() {
  function test_print_argument (line 443) | fn test_print_argument() {
  function test_print_number (line 451) | fn test_print_number() {
  function test_print_date (line 462) | fn test_print_date() {
  function test_print_pound (line 473) | fn test_print_pound() {
  function test_print_tag (line 479) | fn test_print_tag() {
  function test_print_select (line 492) | fn test_print_select() {
  function test_print_plural (line 538) | fn test_print_plural() {
  function test_print_plural_ldml_order (line 577) | fn test_print_plural_ldml_order() {
  function test_print_mixed_elements (line 656) | fn test_print_mixed_elements() {
  function test_print_nested_plural_in_select (line 677) | fn test_print_nested_plural_in_select() {
  function test_print_nested_tags_with_formatting (line 749) | fn test_print_nested_tags_with_formatting() {
  function test_print_complex_plural_with_nested_elements (line 778) | fn test_print_complex_plural_with_nested_elements() {
  function test_print_selectordinal (line 842) | fn test_print_selectordinal() {
  function test_print_plural_with_offset (line 902) | fn test_print_plural_with_offset() {
  function test_print_date_and_time_with_skeletons (line 970) | fn test_print_date_and_time_with_skeletons() {

FILE: crates/icu_messageformat_parser/types.rs
  type Type (line 13) | pub enum Type {
  method serialize (line 36) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  type SkeletonType (line 47) | pub enum SkeletonType {
  method serialize (line 53) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  type ValidPluralRule (line 63) | pub enum ValidPluralRule {
    method from_str (line 75) | pub fn from_str(s: &str) -> Self {
    method as_str (line 87) | pub fn as_str(&self) -> &str {
  type PluralType (line 103) | pub enum PluralType {
  type BaseElement (line 110) | pub struct BaseElement {
  type LiteralElement (line 118) | pub struct LiteralElement {
    method new (line 504) | pub fn new(value: String) -> Self {
    method with_location (line 511) | pub fn with_location(value: String, location: Location) -> Self {
  type ArgumentElement (line 126) | pub struct ArgumentElement {
    method new (line 520) | pub fn new(value: String) -> Self {
    method with_location (line 527) | pub fn with_location(value: String, location: Location) -> Self {
  type TagElement (line 134) | pub struct TagElement {
  type SimpleFormatElement (line 143) | pub struct SimpleFormatElement<S> {
  type NumberElement (line 152) | pub type NumberElement = SimpleFormatElement<NumberSkeletonOrStyle>;
  type DateElement (line 155) | pub type DateElement = SimpleFormatElement<DateTimeSkeletonOrStyle>;
  type TimeElement (line 158) | pub type TimeElement = SimpleFormatElement<DateTimeSkeletonOrStyle>;
  type NumberSkeletonOrStyle (line 162) | pub enum NumberSkeletonOrStyle {
  method serialize (line 168) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  type DateTimeSkeletonOrStyle (line 181) | pub enum DateTimeSkeletonOrStyle {
  method serialize (line 187) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  type PluralOrSelectOption (line 200) | pub struct PluralOrSelectOption {
  type SelectElement (line 208) | pub struct SelectElement {
  type PluralElement (line 217) | pub struct PluralElement {
  type PoundElement (line 228) | pub struct PoundElement {
  type MessageFormatElement (line 235) | pub enum MessageFormatElement {
    method element_type (line 248) | pub fn element_type(&self) -> Type {
    method is_literal (line 262) | pub fn is_literal(&self) -> bool {
    method is_argument (line 266) | pub fn is_argument(&self) -> bool {
    method is_number (line 270) | pub fn is_number(&self) -> bool {
    method is_date (line 274) | pub fn is_date(&self) -> bool {
    method is_time (line 278) | pub fn is_time(&self) -> bool {
    method is_select (line 282) | pub fn is_select(&self) -> bool {
    method is_plural (line 286) | pub fn is_plural(&self) -> bool {
    method is_pound (line 290) | pub fn is_pound(&self) -> bool {
    method is_tag (line 294) | pub fn is_tag(&self) -> bool {
    method literal (line 536) | pub fn literal(value: String) -> Self {
    method argument (line 540) | pub fn argument(value: String) -> Self {
  method serialize (line 301) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  type NumberSkeleton (line 419) | pub struct NumberSkeleton {
  method serialize (line 428) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  type DateTimeSkeleton (line 449) | pub struct DateTimeSkeleton {
  method serialize (line 457) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  type Skeleton (line 480) | pub enum Skeleton {
    method skeleton_type (line 486) | pub fn skeleton_type(&self) -> SkeletonType {
    method is_number_skeleton (line 493) | pub fn is_number_skeleton(&self) -> bool {
    method is_date_time_skeleton (line 497) | pub fn is_date_time_skeleton(&self) -> bool {
  function test_type_enum (line 550) | fn test_type_enum() {
  function test_valid_plural_rule (line 556) | fn test_valid_plural_rule() {
  function test_literal_element (line 567) | fn test_literal_element() {
  function test_message_format_element_type_guards (line 574) | fn test_message_format_element_type_guards() {
  function test_skeleton_type (line 587) | fn test_skeleton_type() {

FILE: crates/icu_skeleton_parser/datetime_format_options.rs
  type DateTimeFormatEra (line 7) | pub enum DateTimeFormatEra {
  type DateTimeFormatYear (line 17) | pub enum DateTimeFormatYear {
  type DateTimeFormatMonth (line 27) | pub enum DateTimeFormatMonth {
  type DateTimeFormatDay (line 40) | pub enum DateTimeFormatDay {
  type DateTimeFormatWeekday (line 50) | pub enum DateTimeFormatWeekday {
  type DateTimeFormatHour (line 60) | pub enum DateTimeFormatHour {
  type DateTimeFormatHourCycle (line 70) | pub enum DateTimeFormatHourCycle {
  type DateTimeFormatMinute (line 81) | pub enum DateTimeFormatMinute {
  type DateTimeFormatSecond (line 91) | pub enum DateTimeFormatSecond {
  type DateTimeFormatTimeZoneName (line 101) | pub enum DateTimeFormatTimeZoneName {
  type DateTimeFormatOptions (line 110) | pub struct DateTimeFormatOptions {
    method new (line 147) | pub fn new() -> Self {
    method era (line 152) | pub fn era(&self) -> Option<&DateTimeFormatEra> {
    method year (line 156) | pub fn year(&self) -> Option<&DateTimeFormatYear> {
    method month (line 160) | pub fn month(&self) -> Option<&DateTimeFormatMonth> {
    method day (line 164) | pub fn day(&self) -> Option<&DateTimeFormatDay> {
    method weekday (line 168) | pub fn weekday(&self) -> Option<&DateTimeFormatWeekday> {
    method hour (line 172) | pub fn hour(&self) -> Option<&DateTimeFormatHour> {
    method hour12 (line 176) | pub fn hour12(&self) -> Option<bool> {
    method hour_cycle (line 180) | pub fn hour_cycle(&self) -> Option<&DateTimeFormatHourCycle> {
    method minute (line 184) | pub fn minute(&self) -> Option<&DateTimeFormatMinute> {
    method second (line 188) | pub fn second(&self) -> Option<&DateTimeFormatSecond> {
    method time_zone_name (line 192) | pub fn time_zone_name(&self) -> Option<&DateTimeFormatTimeZoneName> {
    method with_era (line 197) | pub fn with_era(mut self, era: DateTimeFormatEra) -> Self {
    method with_year (line 202) | pub fn with_year(mut self, year: DateTimeFormatYear) -> Self {
    method with_month (line 207) | pub fn with_month(mut self, month: DateTimeFormatMonth) -> Self {
    method with_day (line 212) | pub fn with_day(mut self, day: DateTimeFormatDay) -> Self {
    method with_weekday (line 217) | pub fn with_weekday(mut self, weekday: DateTimeFormatWeekday) -> Self {
    method with_hour (line 222) | pub fn with_hour(mut self, hour: DateTimeFormatHour) -> Self {
    method with_hour12 (line 227) | pub fn with_hour12(mut self, hour12: bool) -> Self {
    method with_hour_cycle (line 232) | pub fn with_hour_cycle(mut self, hour_cycle: DateTimeFormatHourCycle) ...
    method with_minute (line 237) | pub fn with_minute(mut self, minute: DateTimeFormatMinute) -> Self {
    method with_second (line 242) | pub fn with_second(mut self, second: DateTimeFormatSecond) -> Self {
    method with_time_zone_name (line 247) | pub fn with_time_zone_name(mut self, time_zone_name: DateTimeFormatTim...
  function test_datetime_format_options_creation (line 258) | fn test_datetime_format_options_creation() {
  function test_datetime_format_options_serialization (line 270) | fn test_datetime_format_options_serialization() {
  function test_datetime_format_options_deserialization (line 285) | fn test_datetime_format_options_deserialization() {
  function test_hour12_boolean (line 295) | fn test_hour12_boolean() {
  function test_hour_cycle_values (line 307) | fn test_hour_cycle_values() {
  function test_weekday_values (line 320) | fn test_weekday_values() {
  function test_time_zone_name (line 335) | fn test_time_zone_name() {
  function test_era_values (line 349) | fn test_era_values() {
  function test_default_empty (line 356) | fn test_default_empty() {
  function test_skip_serializing_none_fields (line 373) | fn test_skip_serializing_none_fields() {

FILE: crates/icu_skeleton_parser/datetime_parser.rs
  function parse_date_time_skeleton (line 84) | pub fn parse_date_time_skeleton(skeleton: &str) -> Result<DateTimeFormat...
  function test_parse_year_numeric (line 275) | fn test_parse_year_numeric() {
  function test_parse_year_two_digit (line 281) | fn test_parse_year_two_digit() {
  function test_parse_month_formats (line 287) | fn test_parse_month_formats() {
  function test_parse_day_formats (line 305) | fn test_parse_day_formats() {
  function test_parse_weekday_e (line 314) | fn test_parse_weekday_e() {
  function test_parse_weekday_e_short_error (line 326) | fn test_parse_weekday_e_short_error() {
  function test_parse_weekday_capital_e (line 337) | fn test_parse_weekday_capital_e() {
  function test_parse_era (line 349) | fn test_parse_era() {
  function test_parse_hour_cycles (line 361) | fn test_parse_hour_cycles() {
  function test_parse_hour12_with_period (line 378) | fn test_parse_hour12_with_period() {
  function test_parse_minute_second (line 385) | fn test_parse_minute_second() {
  function test_parse_timezone (line 400) | fn test_parse_timezone() {
  function test_parse_complex_skeleton (line 415) | fn test_parse_complex_skeleton() {
  function test_parse_full_datetime (line 426) | fn test_parse_full_datetime() {
  function test_unsupported_year_pattern (line 438) | fn test_unsupported_year_pattern() {
  function test_unsupported_quarter_pattern (line 445) | fn test_unsupported_quarter_pattern() {
  function test_unsupported_week_pattern (line 452) | fn test_unsupported_week_pattern() {
  function test_unsupported_day_pattern (line 459) | fn test_unsupported_day_pattern() {
  function test_unsupported_period_pattern (line 466) | fn test_unsupported_period_pattern() {
  function test_unsupported_hour_pattern (line 473) | fn test_unsupported_hour_pattern() {
  function test_unsupported_second_pattern (line 480) | fn test_unsupported_second_pattern() {
  function test_unsupported_timezone_pattern (line 487) | fn test_unsupported_timezone_pattern() {
  function test_empty_skeleton (line 494) | fn test_empty_skeleton() {
  function test_month_standalone_l (line 502) | fn test_month_standalone_l() {
  function test_weekday_c (line 509) | fn test_weekday_c() {
  function test_integration_complex_skeleton_1 (line 519) | fn test_integration_complex_skeleton_1() {
  function test_integration_skeleton_2 (line 538) | fn test_integration_skeleton_2() {
  function test_integration_skeleton_3 (line 548) | fn test_integration_skeleton_3() {
  function test_integration_skeleton_4 (line 558) | fn test_integration_skeleton_4() {
  function test_integration_empty_skeleton (line 568) | fn test_integration_empty_skeleton() {

FILE: crates/icu_skeleton_parser/number_format_options.rs
  type NumberFormatNotation (line 5) | pub enum NumberFormatNotation {
  type RoundingPriorityType (line 14) | pub enum RoundingPriorityType {
  type RoundingModeType (line 22) | pub enum RoundingModeType {
  type UseGroupingString (line 37) | pub enum UseGroupingString {
  type UseGroupingType (line 52) | pub enum UseGroupingType {
    method from (line 58) | fn from(value: bool) -> Self {
  type NumberFormatOptionsStyle (line 65) | pub enum NumberFormatOptionsStyle {
  type NumberFormatOptionsCompactDisplay (line 74) | pub enum NumberFormatOptionsCompactDisplay {
  type NumberFormatOptionsCurrencyDisplay (line 81) | pub enum NumberFormatOptionsCurrencyDisplay {
  type NumberFormatOptionsCurrencySign (line 90) | pub enum NumberFormatOptionsCurrencySign {
  type NumberFormatOptionsSignDisplay (line 97) | pub enum NumberFormatOptionsSignDisplay {
  type NumberFormatOptionsUnitDisplay (line 107) | pub enum NumberFormatOptionsUnitDisplay {
  type TrailingZeroDisplay (line 115) | pub enum TrailingZeroDisplay {
  type NumberFormatOptions (line 123) | pub struct NumberFormatOptions {
  type ExtendedNumberFormatOptions (line 190) | pub struct ExtendedNumberFormatOptions {
    method new (line 200) | pub fn new() -> Self {
    method scale (line 205) | pub fn scale(&self) -> Option<f64> {
    method style (line 209) | pub fn style(&self) -> Option<&NumberFormatOptionsStyle> {
    method currency (line 213) | pub fn currency(&self) -> Option<&str> {
    method unit (line 217) | pub fn unit(&self) -> Option<&str> {
    method unit_display (line 221) | pub fn unit_display(&self) -> Option<&NumberFormatOptionsUnitDisplay> {
    method use_grouping (line 225) | pub fn use_grouping(&self) -> Option<&UseGroupingType> {
    method minimum_integer_digits (line 229) | pub fn minimum_integer_digits(&self) -> Option<u32> {
    method minimum_fraction_digits (line 233) | pub fn minimum_fraction_digits(&self) -> Option<u32> {
    method maximum_fraction_digits (line 237) | pub fn maximum_fraction_digits(&self) -> Option<u32> {
    method minimum_significant_digits (line 241) | pub fn minimum_significant_digits(&self) -> Option<u32> {
    method maximum_significant_digits (line 245) | pub fn maximum_significant_digits(&self) -> Option<u32> {
    method compact_display (line 249) | pub fn compact_display(&self) -> Option<&NumberFormatOptionsCompactDis...
    method currency_display (line 253) | pub fn currency_display(&self) -> Option<&NumberFormatOptionsCurrencyD...
    method currency_sign (line 257) | pub fn currency_sign(&self) -> Option<&NumberFormatOptionsCurrencySign> {
    method notation (line 261) | pub fn notation(&self) -> Option<&NumberFormatNotation> {
    method sign_display (line 265) | pub fn sign_display(&self) -> Option<&NumberFormatOptionsSignDisplay> {
    method numbering_system (line 269) | pub fn numbering_system(&self) -> Option<&str> {
    method trailing_zero_display (line 273) | pub fn trailing_zero_display(&self) -> Option<&TrailingZeroDisplay> {
    method rounding_priority (line 277) | pub fn rounding_priority(&self) -> Option<&RoundingPriorityType> {
    method rounding_increment (line 281) | pub fn rounding_increment(&self) -> Option<u32> {
    method rounding_mode (line 285) | pub fn rounding_mode(&self) -> Option<&RoundingModeType> {
    method with_scale (line 291) | pub fn with_scale(mut self, scale: f64) -> Self {
    method with_style (line 297) | pub fn with_style(mut self, style: NumberFormatOptionsStyle) -> Self {
    method with_currency (line 303) | pub fn with_currency(mut self, currency: impl Into<String>) -> Self {
    method with_notation (line 309) | pub fn with_notation(mut self, notation: NumberFormatNotation) -> Self {
    method with_compact_display (line 315) | pub fn with_compact_display(
    method with_use_grouping (line 324) | pub fn with_use_grouping(mut self, use_grouping: impl Into<UseGrouping...
    method with_unit (line 330) | pub fn with_unit(mut self, unit: impl Into<String>) -> Self {
    method with_currency_display (line 336) | pub fn with_currency_display(
    method with_unit_display (line 345) | pub fn with_unit_display(mut self, unit_display: NumberFormatOptionsUn...
    method with_sign_display (line 351) | pub fn with_sign_display(mut self, sign_display: NumberFormatOptionsSi...
    method with_currency_sign (line 357) | pub fn with_currency_sign(mut self, currency_sign: NumberFormatOptions...
    method with_minimum_integer_digits (line 363) | pub fn with_minimum_integer_digits(mut self, digits: u32) -> Self {
    method with_minimum_fraction_digits (line 369) | pub fn with_minimum_fraction_digits(mut self, digits: u32) -> Self {
    method with_maximum_fraction_digits (line 375) | pub fn with_maximum_fraction_digits(mut self, digits: u32) -> Self {
    method with_minimum_significant_digits (line 381) | pub fn with_minimum_significant_digits(mut self, digits: u32) -> Self {
    method with_maximum_significant_digits (line 387) | pub fn with_maximum_significant_digits(mut self, digits: u32) -> Self {
    method with_rounding_mode (line 393) | pub fn with_rounding_mode(mut self, rounding_mode: RoundingModeType) -...
    method with_rounding_priority (line 399) | pub fn with_rounding_priority(mut self, rounding_priority: RoundingPri...
    method with_trailing_zero_display (line 405) | pub fn with_trailing_zero_display(
    method with_numbering_system (line 414) | pub fn with_numbering_system(mut self, numbering_system: impl Into<Str...
    method with_rounding_increment (line 420) | pub fn with_rounding_increment(mut self, rounding_increment: u32) -> S...
    method merge (line 435) | pub fn merge(mut self, other: Self) -> Self {
  function test_extended_number_format_options_creation (line 508) | fn test_extended_number_format_options_creation() {
  function test_serialization (line 520) | fn test_serialization() {
  function test_deserialization (line 531) | fn test_deserialization() {
  function test_use_grouping_bool_conversion (line 540) | fn test_use_grouping_bool_conversion() {
  function test_use_grouping_string_values (line 550) | fn test_use_grouping_string_values() {
  function test_all_enums (line 569) | fn test_all_enums() {

FILE: crates/icu_skeleton_parser/number_parser.rs
  function icu_unit_to_ecma (line 48) | fn icu_unit_to_ecma(unit: &str) -> &str {
  function parse_significant_precision (line 83) | fn parse_significant_precision(str: &str) -> ExtendedNumberFormatOptions {
  function parse_sign (line 158) | fn parse_sign(str: &str) -> Option<ExtendedNumberFormatOptions> {
  function parse_concise_scientific_and_engineering_stem (line 224) | fn parse_concise_scientific_and_engineering_stem(
  function parse_notation_options (line 271) | fn parse_notation_options(opt: &str) -> ExtendedNumberFormatOptions {
  function parse_number_skeleton (line 293) | pub fn parse_number_skeleton(
  function test_icu_unit_with_prefix (line 539) | fn test_icu_unit_with_prefix() {
  function test_icu_unit_length_meter (line 544) | fn test_icu_unit_length_meter() {
  function test_icu_unit_volume_liter (line 549) | fn test_icu_unit_volume_liter() {
  function test_icu_unit_temperature_celsius (line 554) | fn test_icu_unit_temperature_celsius() {
  function test_icu_unit_without_hyphen (line 559) | fn test_icu_unit_without_hyphen() {
  function test_icu_unit_multiple_hyphens (line 564) | fn test_icu_unit_multiple_hyphens() {
  function test_icu_unit_empty_string (line 570) | fn test_icu_unit_empty_string() {
  function test_icu_unit_only_hyphen (line 575) | fn test_icu_unit_only_hyphen() {
  function test_icu_unit_hyphen_at_end (line 580) | fn test_icu_unit_hyphen_at_end() {
  function test_icu_unit_hyphen_at_start (line 585) | fn test_icu_unit_hyphen_at_start() {
  function test_parse_significant_precision_exact (line 590) | fn test_parse_significant_precision_exact() {
  function test_parse_significant_precision_exact_three (line 598) | fn test_parse_significant_precision_exact_three() {
  function test_parse_significant_precision_minimum_with_trailing (line 606) | fn test_parse_significant_precision_minimum_with_trailing() {
  function test_parse_significant_precision_maximum_only (line 614) | fn test_parse_significant_precision_maximum_only() {
  function test_parse_significant_precision_min_max (line 622) | fn test_parse_significant_precision_min_max() {
  function test_parse_significant_precision_min_max_complex (line 630) | fn test_parse_significant_precision_min_max_complex() {
  function test_parse_significant_precision_with_more_precision (line 638) | fn test_parse_significant_precision_with_more_precision() {
  function test_parse_significant_precision_with_less_precision (line 650) | fn test_parse_significant_precision_with_less_precision() {
  function test_parse_significant_precision_complex_with_rounding (line 662) | fn test_parse_significant_precision_complex_with_rounding() {
  function test_parse_significant_precision_plus_with_rounding (line 674) | fn test_parse_significant_precision_plus_with_rounding() {
  function test_parse_significant_precision_empty (line 686) | fn test_parse_significant_precision_empty() {
  function test_parse_significant_precision_single_at (line 695) | fn test_parse_significant_precision_single_at() {
  function test_parse_significant_precision_single_hash (line 703) | fn test_parse_significant_precision_single_hash() {
  function test_parse_sign_auto (line 711) | fn test_parse_sign_auto() {
  function test_parse_sign_accounting (line 721) | fn test_parse_sign_accounting() {
  function test_parse_sign_accounting_shorthand (line 731) | fn test_parse_sign_accounting_shorthand() {
  function test_parse_sign_always (line 742) | fn test_parse_sign_always() {
  function test_parse_sign_always_shorthand (line 752) | fn test_parse_sign_always_shorthand() {
  function test_parse_sign_accounting_always (line 763) | fn test_parse_sign_accounting_always() {
  function test_parse_sign_accounting_always_shorthand (line 776) | fn test_parse_sign_accounting_always_shorthand() {
  function test_parse_sign_except_zero (line 790) | fn test_parse_sign_except_zero() {
  function test_parse_sign_except_zero_shorthand (line 800) | fn test_parse_sign_except_zero_shorthand() {
  function test_parse_sign_accounting_except_zero (line 811) | fn test_parse_sign_accounting_except_zero() {
  function test_parse_sign_accounting_except_zero_shorthand (line 824) | fn test_parse_sign_accounting_except_zero_shorthand() {
  function test_parse_sign_never (line 838) | fn test_parse_sign_never() {
  function test_parse_sign_never_shorthand (line 848) | fn test_parse_sign_never_shorthand() {
  function test_parse_sign_unknown (line 859) | fn test_parse_sign_unknown() {
  function test_parse_sign_empty (line 866) | fn test_parse_sign_empty() {
  function test_parse_concise_scientific (line 873) | fn test_parse_concise_scientific() {
  function test_parse_concise_engineering (line 882) | fn test_parse_concise_engineering() {
  function test_parse_concise_scientific_with_integer_width (line 891) | fn test_parse_concise_scientific_with_integer_width() {
  function test_parse_concise_scientific_with_integer_width_three (line 900) | fn test_parse_concise_scientific_with_integer_width_three() {
  function test_parse_concise_engineering_with_integer_width (line 909) | fn test_parse_concise_engineering_with_integer_width() {
  function test_parse_concise_scientific_with_sign_always (line 918) | fn test_parse_concise_scientific_with_sign_always() {
  function test_parse_concise_scientific_with_sign_except_zero (line 931) | fn test_parse_concise_scientific_with_sign_except_zero() {
  function test_parse_concise_engineering_with_sign_always (line 944) | fn test_parse_concise_engineering_with_sign_always() {
  function test_parse_concise_scientific_with_sign_and_width (line 956) | fn test_parse_concise_scientific_with_sign_and_width() {
  function test_parse_concise_engineering_with_sign_and_width (line 969) | fn test_parse_concise_engineering_with_sign_and_width() {
  function test_parse_concise_scientific_not_recognized (line 982) | fn test_parse_concise_scientific_not_recognized() {
  function test_parse_concise_scientific_malformed (line 989) | fn test_parse_concise_scientific_malformed() {
  function test_parse_concise_scientific_malformed_with_letters (line 1000) | fn test_parse_concise_scientific_malformed_with_letters() {
  function test_parse_concise_engineering_malformed (line 1007) | fn test_parse_concise_engineering_malformed() {
  function test_parse_concise_scientific_empty (line 1014) | fn test_parse_concise_scientific_empty() {
  function test_parse_number_skeleton_percent (line 1021) | fn test_parse_number_skeleton_percent() {
  function test_parse_number_skeleton_percent_shorthand (line 1028) | fn test_parse_number_skeleton_percent_shorthand() {
  function test_parse_number_skeleton_percent_scaled (line 1035) | fn test_parse_number_skeleton_percent_scaled() {
  function test_parse_number_skeleton_currency (line 1043) | fn test_parse_number_skeleton_currency() {
  function test_parse_number_skeleton_unit (line 1051) | fn test_parse_number_skeleton_unit() {
  function test_parse_number_skeleton_compact_short (line 1059) | fn test_parse_number_skeleton_compact_short() {
  function test_parse_number_skeleton_compact_short_k (line 1070) | fn test_parse_number_skeleton_compact_short_k() {
  function test_parse_number_skeleton_scientific (line 1081) | fn test_parse_number_skeleton_scientific() {
  function test_parse_number_skeleton_scientific_with_sign (line 1088) | fn test_parse_number_skeleton_scientific_with_sign() {
  function test_parse_number_skeleton_fraction_precision (line 1099) | fn test_parse_number_skeleton_fraction_precision() {
  function test_parse_number_skeleton_fraction_precision_max_only (line 1107) | fn test_parse_number_skeleton_fraction_precision_max_only() {
  function test_parse_number_skeleton_integer_width (line 1115) | fn test_parse_number_skeleton_integer_width() {
  function test_parse_number_skeleton_significant_digits (line 1122) | fn test_parse_number_skeleton_significant_digits() {
  function test_parse_number_skeleton_scale (line 1130) | fn test_parse_number_skeleton_scale() {
  function test_parse_number_skeleton_rounding_mode (line 1137) | fn test_parse_number_skeleton_rounding_mode() {
  function test_parse_number_skeleton_group_off (line 1144) | fn test_parse_number_skeleton_group_off() {
  function test_parse_number_skeleton_complex (line 1154) | fn test_parse_number_skeleton_complex() {
  function test_parse_number_skeleton_concise_scientific (line 1173) | fn test_parse_number_skeleton_concise_scientific() {
  function test_integration_percent_max_fraction (line 1186) | fn test_integration_percent_max_fraction() {
  function test_integration_max_fraction_only (line 1195) | fn test_integration_max_fraction_only() {
  function test_integration_trailing_zero_display (line 1203) | fn test_integration_trailing_zero_display() {
  function test_integration_precision_integer (line 1215) | fn test_integration_precision_integer() {
  function test_integration_percent_shorthand (line 1223) | fn test_integration_percent_shorthand() {
  function test_integration_rounding_priority_more (line 1232) | fn test_integration_rounding_priority_more() {
  function test_integration_rounding_priority_less (line 1246) | fn test_integration_rounding_priority_less() {
  function test_integration_single_sig_digit_rounding_floor (line 1260) | fn test_integration_single_sig_digit_rounding_floor() {
  function test_integration_percent_min_fraction (line 1270) | fn test_integration_percent_min_fraction() {
  function test_integration_percent_min_max_fraction (line 1279) | fn test_integration_percent_min_max_fraction() {
  function test_integration_percent_fraction_sig_digits_1 (line 1289) | fn test_integration_percent_fraction_sig_digits_1() {
  function test_integration_percent_fraction_sig_digits_2 (line 1301) | fn test_integration_percent_fraction_sig_digits_2() {
  function test_integration_percent_scale (line 1313) | fn test_integration_percent_scale() {
  function test_integration_currency_precision_integer (line 1322) | fn test_integration_currency_precision_integer() {
  function test_integration_currency_trailing_zero (line 1332) | fn test_integration_currency_trailing_zero() {
  function test_integration_currency_sig_digits_1 (line 1347) | fn test_integration_currency_sig_digits_1() {
  function test_integration_currency_sig_digits_2 (line 1359) | fn test_integration_currency_sig_digits_2() {
  function test_integration_currency_full_name (line 1372) | fn test_integration_currency_full_name() {
  function test_integration_unit_meter (line 1395) | fn test_integration_unit_meter() {
  function test_integration_unit_meter_full_name (line 1409) | fn test_integration_unit_meter_full_name() {
  function test_integration_compact_short (line 1433) | fn test_integration_compact_short() {
  function test_integration_compact_long (line 1445) | fn test_integration_compact_long() {
  function test_integration_scientific_notation (line 1457) | fn test_integration_scientific_notation() {
  function test_integration_scientific_sign_always (line 1465) | fn test_integration_scientific_sign_always() {
  function test_integration_scientific_sign_always_alternative (line 1477) | fn test_integration_scientific_sign_always_alternative() {
  function test_integration_engineering_notation (line 1489) | fn test_integration_engineering_notation() {
  function test_integration_engineering_except_zero (line 1497) | fn test_integration_engineering_except_zero() {
  function test_integration_notation_simple (line 1510) | fn test_integration_notation_simple() {
  function test_integration_sign_auto (line 1518) | fn test_integration_sign_auto() {
  function test_integration_sign_always_long (line 1529) | fn test_integration_sign_always_long() {
  function test_integration_sign_always_shorthand (line 1540) | fn test_integration_sign_always_shorthand() {
  function test_integration_sign_never_long (line 1551) | fn test_integration_sign_never_long() {
  function test_integration_sign_never_shorthand (line 1562) | fn test_integration_sign_never_shorthand() {
  function test_integration_sign_accounting_long (line 1573) | fn test_integration_sign_accounting_long() {
  function test_integration_sign_accounting_shorthand (line 1584) | fn test_integration_sign_accounting_shorthand() {
  function test_integration_sign_accounting_always_long (line 1595) | fn test_integration_sign_accounting_always_long() {
  function test_integration_sign_accounting_always_shorthand (line 1610) | fn test_integration_sign_accounting_always_shorthand() {
  function test_integration_sign_except_zero_long (line 1625) | fn test_integration_sign_except_zero_long() {
  function test_integration_sign_except_zero_shorthand (line 1636) | fn test_integration_sign_except_zero_shorthand() {
  function test_integration_sign_accounting_except_zero_long (line 1647) | fn test_integration_sign_accounting_except_zero_long() {
  function test_integration_sign_accounting_except_zero_shorthand (line 1662) | fn test_integration_sign_accounting_except_zero_shorthand() {
  function test_integration_min_integer_digits_concise (line 1677) | fn test_integration_min_integer_digits_concise() {
  function test_integration_min_integer_digits_long (line 1685) | fn test_integration_min_integer_digits_long() {
  function test_integration_scientific_concise_e0 (line 1693) | fn test_integration_scientific_concise_e0() {
  function test_integration_scientific_concise_sign_width (line 1702) | fn test_integration_scientific_concise_sign_width() {
  function test_integration_engineering_concise_sign_width (line 1715) | fn test_integration_engineering_concise_sign_width() {
  function test_integration_percent_scaled (line 1728) | fn test_integration_percent_scaled() {

FILE: crates/icu_skeleton_parser/number_skeleton_token.rs
  type NumberSkeletonToken (line 7) | pub struct NumberSkeletonToken {
    method new (line 17) | pub fn new(stem: impl Into<String>, options: Vec<String>) -> Self {
    method parse_from_string (line 57) | pub fn parse_from_string(skeleton: &str) -> Result<Vec<Self>, String> {
    method parse_token (line 70) | fn parse_token(token: &str) -> Result<Self, String> {
    method stem (line 89) | pub fn stem(&self) -> &str {
    method options (line 94) | pub fn options(&self) -> &[String] {
  function test_number_skeleton_token_creation (line 104) | fn test_number_skeleton_token_creation() {
  function test_number_skeleton_token_serialization (line 115) | fn test_number_skeleton_token_serialization() {
  function test_number_skeleton_token_deserialization (line 123) | fn test_number_skeleton_token_deserialization() {
  function test_parse_empty_skeleton (line 131) | fn test_parse_empty_skeleton() {
  function test_parse_simple_token (line 138) | fn test_parse_simple_token() {
  function test_parse_token_with_options (line 146) | fn test_parse_token_with_options() {
  function test_parse_multiple_tokens (line 154) | fn test_parse_multiple_tokens() {
  function test_parse_token_with_multiple_options (line 166) | fn test_parse_token_with_multiple_options() {
  function test_parse_invalid_skeleton_empty_option (line 174) | fn test_parse_invalid_skeleton_empty_option() {
  function test_parse_with_extra_whitespace (line 181) | fn test_parse_with_extra_whitespace() {
  function test_parse_compact_notation (line 189) | fn test_parse_compact_notation() {

FILE: docs/scripts/build-typesense-index.ts
  type TypesenseDocument (line 16) | interface TypesenseDocument {
  function generateSlug (line 28) | function generateSlug(text: string): string {
  function extractHeadings (line 37) | function extractHeadings(
  function stripMarkdown (line 74) | function stripMarkdown(content: string): string {
  function getDocType (line 100) | function getDocType(
  function extractTags (line 132) | function extractTags(
  function buildTypesenseIndex (line 188) | async function buildTypesenseIndex() {

FILE: docs/scripts/extract-metadata.ts
  type DocMetadata (line 19) | interface DocMetadata {
  type MetadataCollection (line 24) | type MetadataCollection = Record<string, DocMetadata>
  function extractDescription (line 27) | function extractDescription(content: string): string {
  function extractTitle (line 80) | function extractTitle(path: string): string {
  function main (line 89) | async function main(): Promise<void> {

FILE: docs/scripts/upload-typesense-index.ts
  constant TYPESENSE_HOST (line 15) | const TYPESENSE_HOST =
  constant TYPESENSE_ADMIN_API_KEY (line 17) | const TYPESENSE_ADMIN_API_KEY = process.env.TYPESENSE_ADMIN_API_KEY
  constant TYPESENSE_PROTOCOL (line 18) | const TYPESENSE_PROTOCOL = process.env.TYPESENSE_PROTOCOL || 'https'
  constant TYPESENSE_PORT (line 19) | const TYPESENSE_PORT = process.env.TYPESENSE_PORT || '443'
  function uploadToTypesense (line 49) | async function uploadToTypesense() {

FILE: docs/src/components/Admonition.tsx
  type AdmonitionProps (line 5) | interface AdmonitionProps {
  function Admonition (line 38) | function Admonition({

FILE: docs/src/components/Breadcrumbs.tsx
  function toTitleCase (line 13) | function toTitleCase(str: string): string {
  function Breadcrumbs (line 21) | function Breadcrumbs(): React.ReactNode {

FILE: docs/src/components/IcuEditor.tsx
  type IcuEditorProps (line 6) | interface IcuEditorProps {
  function IcuEditor (line 11) | function IcuEditor({

FILE: docs/src/components/Layout.tsx
  type LayoutProps (line 10) | interface LayoutProps {
  function Layout (line 14) | function Layout({children}: LayoutProps): React.ReactNode {

FILE: docs/src/components/LiveCodeBlock.tsx
  type LiveCodeBlockProps (line 122) | interface LiveCodeBlockProps {
  function LiveCodeBlock (line 127) | function LiveCodeBlock({

FILE: docs/src/components/MDXComponents.tsx
  type MDXProviderProps (line 10) | type MDXProviderProps = React.ComponentProps<typeof MDXProvider>
  type MDXComponents (line 11) | type MDXComponents = NonNullable<

FILE: docs/src/components/SearchBar.tsx
  type TypesenseResult (line 8) | interface TypesenseResult {
  type SearchResultWithSnippet (line 19) | interface SearchResultWithSnippet extends TypesenseResult {
  constant TYPESENSE_CONFIG (line 25) | const TYPESENSE_CONFIG = {
  constant COLLECTION_NAME (line 33) | const COLLECTION_NAME = 'docs'
  function formatSection (line 36) | function formatSection(section: string): string {
  function getDocTypeBadge (line 44) | function getDocTypeBadge(docType: string): {bg: string; text: string} {
  function highlightMatches (line 75) | function highlightMatches(text: string, query: string): React.ReactNode {
  function extractSnippet (line 105) | function extractSnippet(
  function SearchBar (line 126) | function SearchBar(): React.ReactNode {

FILE: docs/src/components/Sidebar.tsx
  function Sidebar (line 6) | function Sidebar(): React.ReactNode {

FILE: docs/src/components/home/BrowserSection.tsx
  function BrowserSection (line 3) | function BrowserSection(): React.ReactNode {

FILE: docs/src/components/home/FeaturesSection.tsx
  function FeaturesSection (line 3) | function FeaturesSection(): React.ReactNode {

FILE: docs/src/components/home/HeroSection.tsx
  constant LOCALES (line 11) | const LOCALES = [
  constant MESSAGE (line 47) | const MESSAGE: MessageDescriptor = defineMessage({
  function ExampleOutput (line 53) | function ExampleOutput({
  function HeroSection (line 66) | function HeroSection(): React.ReactNode {

FILE: docs/src/components/home/HomeFooter.tsx
  function HomeFooter (line 4) | function HomeFooter(): React.ReactNode {

FILE: docs/src/components/home/HomeHeader.tsx
  function HomeHeader (line 19) | function HomeHeader(): React.ReactNode {

FILE: docs/src/components/home/TrustedBySection.tsx
  function TrustedBySection (line 3) | function TrustedBySection(): React.ReactNode {

FILE: docs/src/components/ui/breadcrumb.tsx
  type BreadcrumbSeparatorComponent (line 83) | interface BreadcrumbSeparatorComponent {
  type BreadcrumbEllipsisComponent (line 120) | interface BreadcrumbEllipsisComponent {

FILE: docs/src/components/ui/button.tsx
  type ButtonVariants (line 49) | type ButtonVariants = typeof buttonVariants
  type ButtonProps (line 51) | interface ButtonProps

FILE: docs/src/components/ui/command.tsx
  type CommandShortcutComponent (line 158) | interface CommandShortcutComponent {

FILE: docs/src/components/ui/dialog.tsx
  type DialogHeaderComponent (line 60) | interface DialogHeaderComponent {
  type DialogFooterComponent (line 81) | interface DialogFooterComponent {

FILE: docs/src/components/ui/dropdown-menu.tsx
  type DropdownMenuShortcutComponent (line 251) | interface DropdownMenuShortcutComponent {

FILE: docs/src/components/ui/input.tsx
  type InputProps (line 5) | interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}

FILE: docs/src/components/ui/sheet.tsx
  type SheetContentProps (line 56) | interface SheetContentProps
  type SheetHeaderComponent (line 98) | interface SheetHeaderComponent {
  type SheetFooterComponent (line 119) | interface SheetFooterComponent {

FILE: docs/src/lib/utils.ts
  function cn (line 4) | function cn(...inputs: ClassValue[]): string {

FILE: docs/src/pages/+Head.tsx
  function Head (line 4) | function Head(): React.ReactNode {

FILE: docs/src/pages/+Layout.tsx
  function Layout (line 7) | function Layout({children}: {children: React.ReactNode}): React.ReactNode {

FILE: docs/src/pages/Home.tsx
  function Home (line 9) | function Home(): React.ReactNode {

FILE: docs/src/pages/docs/@path/+Head.tsx
  type Metadata (line 5) | type Metadata = {
  function Head (line 12) | function Head(): React.ReactNode {

FILE: docs/src/pages/docs/@path/+Page.tsx
  function Page (line 15) | function Page(): React.ReactNode {

FILE: docs/src/pages/docs/@path/+description.ts
  type Metadata (line 4) | type Metadata = {
  function description (line 11) | function description(pageContext: PageContext): string {

FILE: docs/src/pages/docs/@path/+title.ts
  type Metadata (line 4) | type Metadata = {
  function title (line 11) | function title(pageContext: PageContext): string {

FILE: docs/src/pages/index/+Head.tsx
  function Head (line 3) | function Head(): React.ReactNode {

FILE: docs/src/pages/index/+Page.tsx
  function Page (line 6) | function Page(): React.ReactNode {

FILE: docs/src/theme/TabItem.tsx
  type TabItemProps (line 3) | interface TabItemProps {
  function TabItem (line 9) | function TabItem({children}: TabItemProps): React.ReactNode {

FILE: docs/src/theme/Tabs.tsx
  type TabsProps (line 9) | interface TabsProps {
  function Tabs (line 16) | function Tabs({

FILE: docs/src/utils/navigation.ts
  type NavItem (line 1) | interface NavItem {
  type NavSection (line 7) | interface NavSection {
  function getNavigationTree (line 14) | function getNavigationTree(): NavSection[] {

FILE: packages/babel-plugin-formatjs/index.ts
  type ExtractionResult (line 15) | type ExtractionResult<M = Record<string, string>> = {
  constant DEFAULT_ID_INTERPOLATION_PATTERN (line 20) | const DEFAULT_ID_INTERPOLATION_PATTERN = '[sha512:contenthash:base64:6]'
  method pre (line 45) | pre() {
  method enter (line 52) | enter(this: PluginPass & State, path) {
  method exit (line 79) | exit(

FILE: packages/babel-plugin-formatjs/tests/fixtures/2663.js
  function error1 (line 1) | async function error1() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/FormattedMessage.js
  class Foo (line 4) | class Foo extends Component {
    method render (line 5) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/additionalComponentNames.js
  function CustomMessage (line 3) | function CustomMessage() {}
  class Foo (line 5) | class Foo extends Component {
    method render (line 6) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/additionalFunctionNames.js
  function CustomMessage (line 4) | function CustomMessage() {}
  class Foo (line 6) | class Foo extends Component {
    method render (line 7) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/ast.js
  class Foo (line 24) | class Foo extends Component {
    method render (line 25) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/defineMessage.js
  class Foo (line 41) | class Foo extends Component {
    method render (line 42) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/defineMessages.js
  class Foo (line 33) | class Foo extends Component {
    method render (line 34) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/descriptionsAsObjects.js
  class Foo (line 5) | class Foo extends Component {
    method render (line 6) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/empty.js
  class Foo (line 3) | class Foo extends Component {
    method render (line 4) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/extractFromFormatMessageCall.js
  class Foo (line 10) | class Foo extends Component {
    method render (line 11) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/extractFromFormatMessageCallStateless.js
  function myFunction (line 5) | function myFunction(param1, {formatMessage, formatDate}) {
  function SFC (line 15) | function SFC() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/extractSourceLocation.js
  class Foo (line 4) | class Foo extends Component {
    method render (line 5) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/flattenError.js
  function Test (line 3) | function Test() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/formatMessageCall.js
  class Foo (line 10) | class Foo extends Component {
    method render (line 11) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/icuSyntax.js
  class Foo (line 4) | class Foo extends Component {
    method render (line 5) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/idInterpolationPattern.js
  class Foo (line 19) | class Foo extends Component {
    method render (line 20) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/inline.js
  class Foo (line 4) | class Foo extends Component {
    method render (line 5) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/jsxNestedInCallExpr.js
  function IndexPage (line 4) | function IndexPage() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/optionalChaining.js
  function testOptionalChaining (line 4) | function testOptionalChaining() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/overrideIdFn.js
  class Foo (line 20) | class Foo extends Component {
    method render (line 21) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/preserveWhitespace.js
  class Foo (line 56) | class Foo extends Component {
    method render (line 57) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/removeDefaultMessage.js
  class Foo (line 19) | class Foo extends Component {
    method render (line 20) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/skipExtractionFormattedMessage.js
  function nonStaticId (line 4) | function nonStaticId() {
  class Foo (line 8) | class Foo extends Component {
    method render (line 9) | render() {

FILE: packages/babel-plugin-formatjs/tests/fixtures/templateLiteral.js
  class Foo (line 11) | class Foo extends Component {
    method render (line 12) | render() {

FILE: packages/babel-plugin-formatjs/tests/index.test.ts
  function transformAndCheck (line 7) | function transformAndCheck(fn: string, opts: Options = {}) {
  method onMsgExtracted (line 121) | onMsgExtracted(_, msgs) {
  method onMetaExtracted (line 124) | onMetaExtracted(_, m) {
  method onMsgExtracted (line 189) | onMsgExtracted(_, msgs) {
  method onMetaExtracted (line 192) | onMetaExtracted(_, m) {
  function transform (line 250) | function transform(

FILE: packages/babel-plugin-formatjs/types.ts
  type MessageDescriptor (line 8) | interface MessageDescriptor {
  type State (line 14) | interface State {
  type ExtractedMessageDescriptor (line 21) | type ExtractedMessageDescriptor = MessageDescriptor &
  type MessageDescriptorPath (line 24) | type MessageDescriptorPath = Record<
  type Options (line 29) | interface Options {

FILE: packages/babel-plugin-formatjs/utils.ts
  constant DESCRIPTOR_PROPS (line 15) | const DESCRIPTOR_PROPS = new Set<keyof MessageDescriptorPath>([
  function evaluatePath (line 21) | function evaluatePath(path: NodePath<any>): string {
  function getMessageDescriptorKey (line 32) | function getMessageDescriptorKey(path: NodePath<any>): string {
  function getMessageDescriptorValue (line 40) | function getMessageDescriptorValue(
  function createMessageDescriptor (line 64) | function createMessageDescriptor(
  function evaluateMessageDescriptor (line 90) | function evaluateMessageDescriptor(
  function getICUMessageValue (line 152) | function getICUMessageValue(
  constant EXTRACTED (line 194) | const EXTRACTED = Symbol('FormatJSExtracted')
  function tagAsExtracted (line 204) | function tagAsExtracted(path: NodePath<any>): void {
  function wasExtracted (line 211) | function wasExtracted(path: NodePath<any>): boolean {
  function storeMessage (line 223) | function storeMessage(

FILE: packages/babel-plugin-formatjs/visitors/call-expression.ts
  function assertObjectExpression (line 14) | function assertObjectExpression(
  function isFormatMessageCall (line 27) | function isFormatMessageCall(
  function getMessagesObjectFromExpression (line 44) | function getMessagesObjectFromExpression(
  function processMessageObject (line 87) | function processMessageObject(

FILE: packages/bigdecimal/index.ts
  constant DIV_PRECISION (line 2) | const DIV_PRECISION = 40
  type SpecialValue (line 4) | const enum SpecialValue {
  function removeTrailingZeros (line 11) | function removeTrailingZeros(
  function bigintAbs (line 23) | function bigintAbs(n: bigint): bigint {
  function digitCount (line 27) | function digitCount(n: bigint): number {
  constant TEN_BIGINT (line 46) | const TEN_BIGINT = 10n
  function bigintPow10 (line 48) | function bigintPow10(n: number): bigint {
  function parseDecimalString (line 62) | function parseDecimalString(s: string): {
  class BigDecimal (line 153) | class BigDecimal {
    method constructor (line 159) | constructor(value: number | string | bigint) {
    method _create (line 210) | private static _create(
    method _coerce (line 225) | private static _coerce(v: BigDecimal | number | string | bigint): BigD...
    method times (line 231) | times(y: BigDecimal | number | string | bigint): BigDecimal {
    method div (line 248) | div(y: BigDecimal | number | string | bigint): BigDecimal {
    method plus (line 277) | plus(y: BigDecimal | number | string | bigint): BigDecimal {
    method minus (line 307) | minus(y: BigDecimal | number | string | bigint): BigDecimal {
    method mod (line 311) | mod(y: BigDecimal | number | string | bigint): BigDecimal {
    method abs (line 357) | abs(): BigDecimal {
    method negated (line 370) | negated(): BigDecimal {
    method pow (line 389) | pow(n: number): BigDecimal {
    method floor (line 408) | floor(): BigDecimal {
    method ceil (line 432) | ceil(): BigDecimal {
    method log (line 454) | log(base: number): BigDecimal {
    method _log10 (line 479) | private _log10(): BigDecimal {
    method eq (line 512) | eq(y: BigDecimal | number | string | bigint): boolean {
    method _compareTo (line 527) | private _compareTo(other: BigDecimal): number {
    method lessThan (line 572) | lessThan(y: BigDecimal | number | string | bigint): boolean {
    method greaterThan (line 577) | greaterThan(y: BigDecimal | number | string | bigint): boolean {
    method lessThanOrEqualTo (line 582) | lessThanOrEqualTo(y: BigDecimal | number | string | bigint): boolean {
    method greaterThanOrEqualTo (line 587) | greaterThanOrEqualTo(y: BigDecimal | number | string | bigint): boolean {
    method isZero (line 594) | isZero(): boolean {
    method isNaN (line 598) | isNaN(): boolean {
    method isFinite (line 602) | isFinite(): boolean {
    method isNegative (line 606) | isNegative(): boolean {
    method isPositive (line 614) | isPositive(): boolean {
    method isInteger (line 622) | isInteger(): boolean {
    method toJSON (line 630) | toJSON(): string {
    method toNumber (line 634) | toNumber(): number {
    method toString (line 642) | toString(): string {
    method pow (line 676) | static pow(base: number | BigDecimal, exp: number | BigDecimal): BigDe...
    method set (line 686) | static set(_config: Record<string, unknown>): void {
    method _isSignNegative (line 692) | private _isSignNegative(): boolean {
    method _specialArith (line 699) | private _specialArith(

FILE: packages/cli-lib/integration-tests/test_esm_imports.mjs
  function setup (line 23) | async function setup() {
  function cleanup (line 29) | async function cleanup() {
  function testExtractFunction (line 34) | async function testExtractFunction() {
  function testCompileFunction (line 73) | async function testCompileFunction() {
  function testCompileWithAST (line 106) | async function testCompileWithAST() {
  function main (line 127) | async function main() {

FILE: packages/cli-lib/src/cli.ts
  constant KNOWN_COMMANDS (line 13) | const KNOWN_COMMANDS = ['extract']
  function main (line 15) | async function main(argv: string[]): Promise<void> {

FILE: packages/cli-lib/src/compile.ts
  type CompileFn (line 20) | type CompileFn = (msgs: any) => Record<string, string>
  type PseudoLocale (line 22) | type PseudoLocale = 'xx-LS' | 'xx-AC' | 'xx-HA' | 'en-XA' | 'en-XB'
  type CompileCLIOpts (line 24) | interface CompileCLIOpts extends Opts {
  type Opts (line 30) | interface Opts {
  function compile (line 71) | async function compile(
  function compileAndWrite (line 156) | async function compileAndWrite(

FILE: packages/cli-lib/src/compile_folder.ts
  function compileFolder (line 4) | async function compileFolder(

FILE: packages/cli-lib/src/console_utils.ts
  constant CLEAR_WHOLE_LINE (line 7) | const CLEAR_WHOLE_LINE = 0
  function clearLine (line 16) | async function clearLine(
  type LogLevel (line 34) | type LogLevel = 'debug' | 'warn' | 'error'
  constant LEVEL_COLORS (line 36) | const LEVEL_COLORS: Record<LogLevel, 'green' | 'yellow' | 'red'> = {
  function label (line 42) | function label(level: LogLevel, message: string) {
  function debug (line 49) | async function debug(message: string, ...args: any[]): Promise<void> {
  function warn (line 58) | async function warn(message: string, ...args: any[]): Promise<void> {
  function error (line 64) | async function error(message: string, ...args: any[]): Promise<void> {
  function getStdinAsString (line 70) | function getStdinAsString(): Promise<string> {

FILE: packages/cli-lib/src/extract.ts
  type ExtractionResult (line 15) | interface ExtractionResult<M = Record<string, string>> {
  type ExtractedMessageDescriptor (line 26) | interface ExtractedMessageDescriptor extends MessageDescriptor {
  type ExtractCLIOptions (line 41) | type ExtractCLIOptions = Omit<
  type ExtractOpts (line 59) | type ExtractOpts = Opts & {
  function calculateLineColFromOffset (line 87) | function calculateLineColFromOffset(
  function processFile (line 100) | async function processFile(
  function extract (line 200) | async function extract(
  function extractAndWrite (line 328) | async function extractAndWrite(

FILE: packages/cli-lib/src/formatters/crowdin.ts
  type CrowdinJson (line 3) | type CrowdinJson = Record<

FILE: packages/cli-lib/src/formatters/default.ts
  type FormatFn (line 2) | type FormatFn<T = Record<string, MessageDescriptor>> = (
  type CompileFn (line 6) | type CompileFn<T = Record<string, MessageDescriptor>> = (
  type SerializeFn (line 10) | type SerializeFn<T = Record<string, MessageDescriptor>> = (

FILE: packages/cli-lib/src/formatters/index.ts
  type Formatter (line 12) | interface Formatter<T> {
  function resolveBuiltinFormatter (line 19) | async function resolveBuiltinFormatter(

FILE: packages/cli-lib/src/formatters/lokalise.ts
  type StructuredJson (line 3) | type StructuredJson = Record<

FILE: packages/cli-lib/src/formatters/simple.ts
  type PhraseJson (line 3) | type PhraseJson = Record<string, string>

FILE: packages/cli-lib/src/formatters/smartling.ts
  type SmartlingDirectives (line 4) | interface SmartlingDirectives {
  type SmartlingJson (line 17) | type SmartlingJson = {

FILE: packages/cli-lib/src/formatters/transifex.ts
  type StructuredJson (line 3) | type StructuredJson = Record<

FILE: packages/cli-lib/src/gts_extractor.ts
  function parseFile (line 6) | function parseFile(

FILE: packages/cli-lib/src/hbs_extractor.ts
  function extractText (line 4) | function extractText(
  function parseFile (line 43) | function parseFile(

FILE: packages/cli-lib/src/parse_script.ts
  function parseScript (line 9) | function parseScript(opts: Opts, fn?: string) {

FILE: packages/cli-lib/src/pseudo_locale.ts
  function forEachLiteralElement (line 12) | function forEachLiteralElement(
  function generateXXLS (line 29) | function generateXXLS(
  function generateXXAC (line 41) | function generateXXAC(
  function generateXXHA (line 51) | function generateXXHA(
  type _TupleOf (line 63) | type _TupleOf<T, N extends number, R extends unknown[]> = R['length'] ex...
  type Tuple (line 67) | type Tuple<T, N extends number> = N extends N
  type PseudoLocaleTransformMap (line 73) | type PseudoLocaleTransformMap = {
  constant ACCENTED_MAP (line 78) | const ACCENTED_MAP: PseudoLocaleTransformMap = {
  constant FLIPPED_MAP (line 87) | const FLIPPED_MAP: PseudoLocaleTransformMap = {
  function transformString (line 99) | function transformString(
  function generateENXA (line 129) | function generateENXA(
  function generateENXB (line 151) | function generateENXB(

FILE: packages/cli-lib/src/svelte_extractor.ts
  type ScriptParseFn (line 3) | type ScriptParseFn = (source: string) => void
  type SvelteNode (line 5) | interface SvelteNode {
  function walkFragment (line 12) | function walkFragment(
  function extractExpression (line 25) | function extractExpression(
  function walkNode (line 44) | function walkNode(
  function parseFile (line 145) | function parseFile(

FILE: packages/cli-lib/src/verify/checkExtraKeys.ts
  function extractKeys (line 9) | function extractKeys(obj: any, parentKey = ''): string[] {
  function checkExtraKeys (line 18) | async function checkExtraKeys(

FILE: packages/cli-lib/src/verify/checkMissingKeys.ts
  function extractKeys (line 9) | function extractKeys(obj: any, parentKey = ''): string[] {
  function checkMissingKeys (line 18) | async function checkMissingKeys(

FILE: packages/cli-lib/src/verify/checkStructuralEquality.ts
  function flatten (line 15) | function flatten(obj: any, parentKey = ''): Record<string, string> {
  function checkStructuralEquality (line 31) | async function checkStructuralEquality(

FILE: packages/cli-lib/src/verify/index.ts
  type VerifyOpts (line 7) | interface VerifyOpts {
  function verify (line 15) | async function verify(

FILE: packages/cli-lib/src/vue_extractor.ts
  type ScriptParseFn (line 14) | type ScriptParseFn = (source: string) => void
  function walk (line 16) | function walk(
  function templateSimpleExpressionNodeVisitor (line 65) | function templateSimpleExpressionNodeVisitor(parseScriptFn: ScriptParseF...
  function parseFile (line 94) | function parseFile(

FILE: packages/cli-lib/tests/unit/gts_extractor.test.ts
  method onMsgExtracted (line 12) | onMsgExtracted(_: any, msgs: any) {
  method onMsgExtracted (line 41) | onMsgExtracted(_: any, msgs: any) {

FILE: packages/cli-lib/tests/unit/hbs_extractor.test.ts
  method onMsgExtracted (line 11) | onMsgExtracted(_: any, msgs: any) {

FILE: packages/cli-lib/tests/unit/svelte_extractor.test.ts
  method onMsgExtracted (line 15) | onMsgExtracted(_, msgs) {
  method onMsgExtracted (line 32) | onMsgExtracted(_, msgs) {

FILE: packages/cli-lib/tests/unit/vue_extractor.test.ts
  method onMsgExtracted (line 16) | onMsgExtracted(_, msgs) {
  method onMsgExtracted (line 33) | onMsgExtracted(_, msgs) {

FILE: packages/cli/integration-tests/compile/integration.test.ts
  constant TS_BIN_PATH (line 9) | const TS_BIN_PATH = require.resolve('@formatjs/cli/bin/formatjs')
  constant RUST_BIN_PATH (line 10) | const RUST_BIN_PATH = resolveRustBinaryPath(import.meta.dirname)
  constant ARTIFACT_PATH (line 12) | const ARTIFACT_PATH = resolve(import.meta.dirname, 'test_artifacts')

FILE: packages/cli/integration-tests/compile_folder/integration.test.ts
  constant BIN_PATH (line 10) | const BIN_PATH = require.resolve('@formatjs/cli/bin/formatjs')

FILE: packages/cli/integration-tests/conformance-tests/conformance.test.ts
  constant TS_BIN_PATH (line 11) | const TS_BIN_PATH = require.resolve('@formatjs/cli/bin/formatjs')
  constant RUST_BIN_PATH (line 12) | const RUST_BIN_PATH = resolveRustBinaryPath(import.meta.dirname)
  constant ARTIFACT_PATH (line 14) | const ARTIFACT_PATH = resolve(import.meta.dirname, 'test_artifacts')
  constant TEST_CASES_PATH (line 15) | const TEST_CASES_PATH = resolve(import.meta.dirname, 'test_cases')
  type TestCase (line 22) | interface TestCase {
  function parseTestCase (line 42) | function parseTestCase(filename: string, content: string): TestCase {

FILE: packages/cli/integration-tests/extract-glimmer/integration.test.ts
  constant BIN_PATH (line 7) | const BIN_PATH = require.resolve('@formatjs/cli/bin/formatjs')

FILE: packages/cli/integration-tests/extract-vue/integration.test.ts
  constant BIN_PATH (line 7) | const BIN_PATH = require.resolve('@formatjs/cli/bin/formatjs')

FILE: packages/cli/integration-tests/extract/defineMessages/actual.ignore.jsx
  class Foo (line 12) | class Foo extends Component {
    method render (line 13) | render() {

FILE: packages/cli/integration-tests/extract/defineMessages/actual.jsx
  class Foo (line 43) | class Foo extends Component {
    method render (line 44) | render() {

FILE: packages/cli/integration-tests/extract/duplicated/file1.tsx
  function Foo (line 4) | function Foo() {

FILE: packages/cli/integration-tests/extract/duplicated/file2.tsx
  function Bar (line 4) | function Bar() {

FILE: packages/cli/integration-tests/extract/inFile/file1.tsx
  function Foo (line 4) | function Foo() {

FILE: packages/cli/integration-tests/extract/inFile/file2.tsx
  function Bar (line 4) | function Bar() {

FILE: packages/cli/integration-tests/extract/issue-6009/Test.tsx
  function Test (line 3) | function Test() {

FILE: packages/cli/integration-tests/extract/nonDuplicated/file1.tsx
  function Foo (line 4) | function Foo() {

FILE: packages/cli/integration-tests/extract/nonDuplicated/file2.tsx
  function Bar (line 4) | function Bar() {

FILE: packages/cli/integration-tests/extract/optionalChaining/actual.tsx
  function OptionalChainingComponent (line 5) | function OptionalChainingComponent() {

FILE: packages/cli/integration-tests/extract/taggedTemplates/actual.tsx
  function StyledMessageComponent (line 15) | function StyledMessageComponent() {

FILE: packages/cli/integration-tests/extract/throwsFlag/all-valid.tsx
  function AllValidMessages (line 5) | function AllValidMessages() {

FILE: packages/cli/integration-tests/extract/throwsFlag/mixed-valid-invalid.tsx
  function MixedMessages (line 8) | function MixedMessages() {

FILE: packages/cli/integration-tests/extract/typescript/actual.ignore.tsx
  class Foo (line 11) | class Foo extends Component {
    method render (line 12) | render() {

FILE: packages/cli/integration-tests/extract/typescript/actual.tsx
  type TestEnum (line 4) | enum TestEnum {
  function foo (line 71) | async function foo() {
  class Foo (line 75) | class Foo extends Component<{}, {}> {
    method componentDidMount (line 76) | async componentDidMount() {
    method render (line 79) | render() {

FILE: packages/cli/integration-tests/extract/typescript/non-static.tsx
  function NonStaticMessages (line 5) | function NonStaticMessages() {

FILE: packages/cli/integration-tests/extract/typescript/pragma.tsx
  type TestEnum (line 5) | enum TestEnum {
  function foo (line 49) | async function foo() {
  class Foo (line 53) | class Foo extends Component<{}, {}> {
    method componentDidMount (line 54) | async componentDidMount() {
    method render (line 57) | render() {

FILE: packages/cli/integration-tests/extract/typescript/ts47.tsx
  type GetMetaType (line 2) | type GetMetaType<State> = State extends {

FILE: packages/cli/integration-tests/rust-binary-utils.ts
  function resolveRustBinaryPath (line 14) | function resolveRustBinaryPath(dirname: string): string | undefined {

FILE: packages/cli/integration-tests/verify/integration.test.ts
  constant TS_BIN_PATH (line 9) | const TS_BIN_PATH = require.resolve('@formatjs/cli/bin/formatjs')
  constant RUST_BIN_PATH (line 10) | const RUST_BIN_PATH = resolveRustBinaryPath(import.meta.dirname)

FILE: packages/ecma376/index.ts
  constant NUMBER (line 1) | const NUMBER = 10000
  constant ALL_ZEROS (line 2) | const ALL_ZEROS = /^0+$/
  function partToPattern (line 3) | function partToPattern(part: Intl.NumberFormatPart): string {
  function generateNumFmtPattern (line 21) | function generateNumFmtPattern(

FILE: packages/ecma402-abstract/262.ts
  function ToString (line 7) | function ToString(o: unknown): string {
  function ToNumber (line 20) | function ToNumber(arg: any): Decimal {
  function ToInteger (line 56) | function ToInteger(n: any): Decimal {
  function TimeClip (line 75) | function TimeClip(time: Decimal): Decimal {
  function ToObject (line 89) | function ToObject<T>(
  function SameValue (line 103) | function SameValue(x: any, y: any): boolean {
  function ArrayCreate (line 121) | function ArrayCreate<T = any>(len: number): T[] {
  function HasOwnProperty (line 130) | function HasOwnProperty(o: object, prop: string): boolean {
  function Type (line 138) | function Type(
  constant MS_PER_DAY (line 176) | const MS_PER_DAY = 86400000
  function mod (line 184) | function mod(x: number, y: number): number {
  function Day (line 192) | function Day(t: number): number {
  function WeekDay (line 200) | function WeekDay(t: number): number {
  function DayFromYear (line 208) | function DayFromYear(y: number): number {
  function TimeFromYear (line 223) | function TimeFromYear(y: number): number {
  function YearFromTime (line 231) | function YearFromTime(t: number): number {
  function DaysInYear (line 235) | function DaysInYear(y: number): 365 | 366 {
  function DayWithinYear (line 248) | function DayWithinYear(t: number): number {
  function InLeapYear (line 252) | function InLeapYear(t: number): 0 | 1 {
  function MonthFromTime (line 260) | function MonthFromTime(
  function DateFromTime (line 304) | function DateFromTime(t: number): number {
  constant HOURS_PER_DAY (line 347) | const HOURS_PER_DAY = 24
  constant MINUTES_PER_HOUR (line 348) | const MINUTES_PER_HOUR = 60
  constant SECONDS_PER_MINUTE (line 349) | const SECONDS_PER_MINUTE = 60
  constant MS_PER_SECOND (line 350) | const MS_PER_SECOND = 1e3
  constant MS_PER_MINUTE (line 351) | const MS_PER_MINUTE = MS_PER_SECOND * SECONDS_PER_MINUTE
  constant MS_PER_HOUR (line 352) | const MS_PER_HOUR = MS_PER_MINUTE * MINUTES_PER_HOUR
  function HourFromTime (line 354) | function HourFromTime(t: number): number {
  function MinFromTime (line 358) | function MinFromTime(t: number): number {
  function SecFromTime (line 362) | function SecFromTime(t: number): number {
  function IsCallable (line 366) | function IsCallable(fn: any): fn is Function {
  function OrdinaryHasInstance (line 379) | function OrdinaryHasInstance(
  function msFromTime (line 403) | function msFromTime(t: number): number {
  function OrdinaryToPrimitive (line 407) | function OrdinaryToPrimitive<
  function ToPrimitive (line 428) | function ToPrimitive<

FILE: packages/ecma402-abstract/CanonicalizeLocaleList.ts
  function CanonicalizeLocaleList (line 5) | function CanonicalizeLocaleList(

FILE: packages/ecma402-abstract/CanonicalizeTimeZoneName.ts
  constant OFFSET_TIMEZONE_PREFIX_REGEX (line 2) | const OFFSET_TIMEZONE_PREFIX_REGEX = /^[+-]/
  constant OFFSET_TIMEZONE_FORMAT_REGEX (line 3) | const OFFSET_TIMEZONE_FORMAT_REGEX =
  constant TRAILING_ZEROS_REGEX (line 5) | const TRAILING_ZEROS_REGEX = /0+$/
  function IsTimeZoneOffsetString (line 16) | function IsTimeZoneOffsetString(offsetString: string): boolean {
  function ParseTimeZoneOffsetString (line 31) | function ParseTimeZoneOffsetString(offsetString: string): string {
  function CanonicalizeTimeZoneName (line 78) | function CanonicalizeTimeZoneName(

FILE: packages/ecma402-abstract/CoerceOptionsToObject.ts
  function CoerceOptionsToObject (line 8) | function CoerceOptionsToObject<T>(options?: T): T {

FILE: packages/ecma402-abstract/DefaultNumberOption.ts
  function DefaultNumberOption (line 8) | function DefaultNumberOption<F extends number | undefined>(

FILE: packages/ecma402-abstract/GetNumberOption.ts
  function GetNumberOption (line 12) | function GetNumberOption<

FILE: packages/ecma402-abstract/GetOption.ts
  function GetOption (line 11) | function GetOption<T extends object, K extends keyof T, F>(

FILE: packages/ecma402-abstract/GetOptionsObject.ts
  function GetOptionsObject (line 6) | function GetOptionsObject<T extends object>(options?: T): T {

FILE: packages/ecma402-abstract/GetStringOrBooleanOption.ts
  function GetStringOrBooleanOption (line 13) | function GetStringOrBooleanOption<T extends object, K extends keyof T>(

FILE: packages/ecma402-abstract/IsSanctionedSimpleUnitIdentifier.ts
  constant SANCTIONED_UNITS (line 4) | const SANCTIONED_UNITS = [
  function removeUnitNamespace (line 52) | function removeUnitNamespace(unit: string): string {
  constant SIMPLE_UNITS (line 59) | const SIMPLE_UNITS: string[] = SANCTIONED_UNITS.map(removeUnitNamespace)
  function IsSanctionedSimpleUnitIdentifier (line 64) | function IsSanctionedSimpleUnitIdentifier(

FILE: packages/ecma402-abstract/IsValidTimeZoneName.ts
  constant OFFSET_TIMEZONE_PREFIX_REGEX (line 2) | const OFFSET_TIMEZONE_PREFIX_REGEX = /^[+-]/
  constant OFFSET_TIMEZONE_FORMAT_REGEX (line 3) | const OFFSET_TIMEZONE_FORMAT_REGEX =
  function IsTimeZoneOffsetString (line 16) | function IsTimeZoneOffsetString(offsetString: string): boolean {
  function IsValidTimeZoneName (line 57) | function IsValidTimeZoneName(

FILE: packages/ecma402-abstract/IsWellFormedCurrencyCode.ts
  function toUpperCase (line 5) | function toUpperCase(str: string): string {
  constant NOT_A_Z_REGEX (line 9) | const NOT_A_Z_REGEX = /[^A-Z]/
  function IsWellFormedCurrencyCode (line 14) | function IsWellFormedCurrencyCode(currency: string): boolean {

FILE: packages/ecma402-abstract/IsWellFormedUnitIdentifier.ts
  function toLowerCase (line 7) | function toLowerCase(str: string): string {
  function IsWellFormedUnitIdentifier (line 15) | function IsWellFormedUnitIdentifier(unit: string): boolean {

FILE: packages/ecma402-abstract/NumberFormat/ApplyUnsignedRoundingMode.ts
  function ApplyUnsignedRoundingMode (line 5) | function ApplyUnsignedRoundingMode(

FILE: packages/ecma402-abstract/NumberFormat/CollapseNumberRange.ts
  constant PART_TYPES_TO_COLLAPSE (line 7) | const PART_TYPES_TO_COLLAPSE = new Set<NumberFormatPartTypes>([
  function CollapseNumberRange (line 24) | function CollapseNumberRange(

FILE: packages/ecma402-abstract/NumberFormat/ComputeExponent.ts
  function ComputeExponent (line 14) | function ComputeExponent(

FILE: packages/ecma402-abstract/NumberFormat/ComputeExponentForMagnitude.ts
  function ComputeExponentForMagnitude (line 13) | function ComputeExponentForMagnitude(

FILE: packages/ecma402-abstract/NumberFormat/CurrencyDigits.ts
  function CurrencyDigits (line 6) | function CurrencyDigits(

FILE: packages/ecma402-abstract/NumberFormat/FormatApproximately.ts
  function FormatApproximately (line 9) | function FormatApproximately(

FILE: packages/ecma402-abstract/NumberFormat/FormatNumeric.ts
  function FormatNumeric (line 5) | function FormatNumeric(

FILE: packages/ecma402-abstract/NumberFormat/FormatNumericRange.ts
  function FormatNumericRange (line 8) | function FormatNumericRange(

FILE: packages/ecma402-abstract/NumberFormat/FormatNumericRangeToParts.ts
  function FormatNumericRangeToParts (line 11) | function FormatNumericRangeToParts(

FILE: packages/ecma402-abstract/NumberFormat/FormatNumericToParts.ts
  function FormatNumericToParts (line 9) | function FormatNumericToParts(

FILE: packages/ecma402-abstract/NumberFormat/FormatNumericToString.ts
  function FormatNumericToString (line 15) | function FormatNumericToString(

FILE: packages/ecma402-abstract/NumberFormat/GetUnsignedRoundingMode.ts
  function GetUnsignedRoundingMode (line 30) | function GetUnsignedRoundingMode(

FILE: packages/ecma402-abstract/NumberFormat/InitializeNumberFormat.ts
  function InitializeNumberFormat (line 20) | function InitializeNumberFormat(

FILE: packages/ecma402-abstract/NumberFormat/PartitionNumberPattern.ts
  function PartitionNumberPattern (line 15) | function PartitionNumberPattern(

FILE: packages/ecma402-abstract/NumberFormat/PartitionNumberRangePattern.ts
  function PartitionNumberRangePattern (line 15) | function PartitionNumberRangePattern(

FILE: packages/ecma402-abstract/NumberFormat/SetNumberFormatDigitOptions.ts
  constant VALID_ROUNDING_INCREMENTS (line 12) | const VALID_ROUNDING_INCREMENTS = new Set([
  function SetNumberFormatDigitOptions (line 19) | function SetNumberFormatDigitOptions(

FILE: packages/ecma402-abstract/NumberFormat/SetNumberFormatUnitOptions.ts
  function SetNumberFormatUnitOptions (line 13) | function SetNumberFormatUnitOptions(

FILE: packages/ecma402-abstract/NumberFormat/ToRawFixed.ts
  function ToRawFixedFn (line 11) | function ToRawFixedFn(n: Decimal, f: number) {
  function findN1R1 (line 16) | function findN1R1(x: Decimal, f: number, roundingIncrement: number) {
  function findN2R2 (line 27) | function findN2R2(x: Decimal, f: number, roundingIncrement: number) {
  function ToRawFixed (line 43) | function ToRawFixed(

FILE: packages/ecma402-abstract/NumberFormat/ToRawPrecision.ts
  function findN1E1R1 (line 12) | function findN1E1R1(x: Decimal, p: number) {
  function findN2E2R2 (line 75) | function findN2E2R2(x: Decimal, p: number) {
  function ToRawPrecision (line 136) | function ToRawPrecision(

FILE: packages/ecma402-abstract/NumberFormat/format_to_parts.ts
  constant CARET_S_UNICODE_REGEX (line 30) | const CARET_S_UNICODE_REGEX = new RegExp(`^${S_UNICODE_REGEX.source}`)
  constant S_DOLLAR_UNICODE_REGEX (line 32) | const S_DOLLAR_UNICODE_REGEX = new RegExp(`${S_UNICODE_REGEX.source}$`)
  constant CLDR_NUMBER_PATTERN (line 34) | const CLDR_NUMBER_PATTERN = /[#0](?:[.,][#0]+)*/g
  type NumberResult (line 36) | interface NumberResult {
  function formatToParts (line 45) | function formatToParts(
  function partitionNumberIntoParts (line 371) | function partitionNumberIntoParts(
  function getPatternForSign (line 524) | function getPatternForSign(pattern: string, sign: -1 | 0 | 1): string {
  function getCompactDisplayPattern (line 548) | function getCompactDisplayPattern(
  function selectPlural (line 628) | function selectPlural<T>(

FILE: packages/ecma402-abstract/PartitionPattern.ts
  function PartitionPattern (line 8) | function PartitionPattern<T extends string>(

FILE: packages/ecma402-abstract/SupportedLocales.ts
  function SupportedLocales (line 11) | function SupportedLocales(

FILE: packages/ecma402-abstract/ToIntlMathematicalValue.ts
  function ToIntlMathematicalValue (line 8) | function ToIntlMathematicalValue(input: unknown): Decimal {

FILE: packages/ecma402-abstract/constants.ts
  constant TEN (line 3) | const TEN: Decimal = new Decimal(10)
  constant ZERO (line 4) | const ZERO: Decimal = new Decimal(0)
  constant NEGATIVE_ZERO (line 5) | const NEGATIVE_ZERO: Decimal = new Decimal(-0)

FILE: packages/ecma402-abstract/data.ts
  class MissingLocaleDataError (line 1) | class MissingLocaleDataError extends Error {
  function isMissingLocaleDataError (line 5) | function isMissingLocaleDataError(

FILE: packages/ecma402-abstract/regex.generated.ts
  constant S_UNICODE_REGEX (line 2) | const S_UNICODE_REGEX: RegExp =

FILE: packages/ecma402-abstract/scripts/digit-mapping.ts
  function generateDigitChars (line 6) | function generateDigitChars(startCharCode: number): string[] {
  type Args (line 94) | interface Args extends ParsedArgs {
  function main (line 98) | function main(args: Args) {

FILE: packages/ecma402-abstract/scripts/regex-gen.ts
  function main (line 8) | function main(args: minimist.ParsedArgs) {

FILE: packages/ecma402-abstract/tests/utils.ts
  function getInternalSlots (line 6) | function getInternalSlots(x: Intl.NumberFormat): NumberFormatInternal {

FILE: packages/ecma402-abstract/types/core.ts
  type Locale (line 1) | type Locale = string
  type LocaleData (line 2) | interface LocaleData<T> {
  type LookupMatcherResult (line 7) | interface LookupMatcherResult {

FILE: packages/ecma402-abstract/types/date-time.ts
  type Formats (line 1) | type Formats = Pick<
  type IntlDateTimeFormatInternal (line 24) | interface IntlDateTimeFormatInternal {
  type RangePatternPart (line 56) | interface RangePatternPart<
  type RangePatterns (line 63) | type RangePatterns = Pick<
  type RangePatternType (line 79) | enum RangePatternType {
  type TABLE_6 (line 85) | type TABLE_6 =
  type TABLE_2 (line 98) | type TABLE_2 =
  type TimeZoneNameData (line 110) | type TimeZoneNameData = Record<
  type EraData (line 118) | interface EraData {
  type DateTimeFormatLocaleInternalData (line 123) | interface DateTimeFormatLocaleInternalData {
  type IntervalFormatsData (line 174) | type IntervalFormatsData = {
  type DateTimeFormat (line 178) | interface DateTimeFormat extends Omit<
  type ResolvedDateTimeFormatOptions (line 191) | interface ResolvedDateTimeFormatOptions
  type UnpackedZoneData (line 198) | type UnpackedZoneData = [
  type IntlDateTimeFormatPartType (line 209) | type IntlDateTimeFormatPartType =
  type IntlDateTimeFormatPart (line 217) | interface IntlDateTimeFormatPart {

FILE: packages/ecma402-abstract/types/displaynames.ts
  type LanguageTag (line 3) | type LanguageTag = string
  type RegionCode (line 4) | type RegionCode = string
  type ScriptCode (line 5) | type ScriptCode = string
  type CurrencyCode (line 6) | type CurrencyCode = string
  type CalendarCode (line 7) | type CalendarCode = string
  type DateTimeFieldCode (line 8) | type DateTimeFieldCode = string
  type DisplayNamesData (line 10) | interface DisplayNamesData {
  type DisplayNamesLocaleData (line 67) | type DisplayNamesLocaleData = LocaleData<DisplayNamesData>

FILE: packages/ecma402-abstract/types/list.ts
  type ListPatternLocaleData (line 3) | type ListPatternLocaleData = LocaleData<ListPatternFieldsData>
  type ListPatternFieldsData (line 5) | interface ListPatternFieldsData {
  type ListPattern (line 11) | interface ListPattern {
  type ListPatternData (line 18) | interface ListPatternData {

FILE: packages/ecma402-abstract/types/number.ts
  type NumberFormatNotation (line 5) | type NumberFormatNotation =
  type RoundingPriorityType (line 11) | type RoundingPriorityType = 'auto' | 'morePrecision' | 'lessPrecision'
  type NumberFormatRoundingType (line 13) | type NumberFormatRoundingType =
  type RoundingModeType (line 19) | type RoundingModeType =
  type UnsignedRoundingModeType (line 30) | type UnsignedRoundingModeType =
  type UseGroupingType (line 37) | type UseGroupingType = 'min2' | 'auto' | 'always' | boolean
  type NumberFormatDigitOptions (line 39) | interface NumberFormatDigitOptions {
  type NumberFormatDigitInternalSlots (line 51) | interface NumberFormatDigitInternalSlots {
  type RawNumberLocaleData (line 67) | type RawNumberLocaleData = LocaleData<NumberFormatLocaleInternalData>
  type NumberFormatLocaleInternalData (line 69) | interface NumberFormatLocaleInternalData {
  type UnitDataTable (line 77) | interface UnitDataTable {
  type UnitData (line 82) | interface UnitData {
  type CompoundUnitData (line 93) | interface CompoundUnitData {
  type CurrencyData (line 99) | interface CurrencyData {
  type DecimalFormatNum (line 105) | type DecimalFormatNum =
  type NumberingSystem (line 118) | type NumberingSystem = string
  type CurrencySpacingData (line 127) | interface CurrencySpacingData {
  type RawCurrencyData (line 132) | interface RawCurrencyData {
  type SymbolsData (line 142) | interface SymbolsData {
  type RawNumberData (line 161) | interface RawNumberData {
  type LDMLPluralRuleMap (line 180) | type LDMLPluralRuleMap<T> = Omit<
  type RawNumberFormatResult (line 187) | interface RawNumberFormatResult {
  type NumberFormatOptionsLocaleMatcher (line 194) | type NumberFormatOptionsLocaleMatcher = 'lookup' | 'best fit'
  type NumberFormatOptionsStyle (line 195) | type NumberFormatOptionsStyle =
  type NumberFormatOptionsCompactDisplay (line 200) | type NumberFormatOptionsCompactDisplay = 'short' | 'long'
  type NumberFormatOptionsCurrencyDisplay (line 201) | type NumberFormatOptionsCurrencyDisplay =
  type NumberFormatOptionsCurrencySign (line 206) | type NumberFormatOptionsCurrencySign = 'standard' | 'accounting'
  type NumberFormatOptionsNotation (line 207) | type NumberFormatOptionsNotation = NumberFormatNotation
  type NumberFormatOptionsSignDisplay (line 208) | type NumberFormatOptionsSignDisplay =
  type NumberFormatOptionsUnitDisplay (line 214) | type NumberFormatOptionsUnitDisplay = 'long' | 'short' | 'narrow'
  type TrailingZeroDisplay (line 215) | type TrailingZeroDisplay = 'auto' | 'stripIfInteger'
  type NumberFormatInternal (line 217) | interface NumberFormatInternal extends NumberFormatDigitInternalSlots {
  type NumberFormatOptions (line 238) | type NumberFormatOptions = Omit<
  type ResolvedNumberFormatOptions (line 260) | type ResolvedNumberFormatOptions = Intl.ResolvedNumberFormatOptions &
  type NumberFormatPartTypes (line 271) | type NumberFormatPartTypes =
  type NumberFormatPart (line 281) | interface NumberFormatPart {
  type NumberRangeToParts (line 287) | interface NumberRangeToParts extends NumberFormatPart {

FILE: packages/ecma402-abstract/types/plural-rules.ts
  type LDMLPluralRule (line 3) | type LDMLPluralRule = 'zero' | 'one' | 'two' | 'few' | 'many' | 'other'
  type PluralRangesData (line 5) | interface PluralRangesData {
  type PluralRulesData (line 10) | interface PluralRulesData {
  type PluralRulesLocaleData (line 19) | type PluralRulesLocaleData = LocaleData<PluralRulesData>
  type PluralRulesInternal (line 21) | interface PluralRulesInternal extends NumberFormatDigitInternalSlots {

FILE: packages/ecma402-abstract/types/relative-time.ts
  type FieldData (line 4) | interface FieldData {
  type RelativeTimeData (line 16) | type RelativeTimeData = {[u in LDMLPluralRule]?: string}
  type UnpackedLocaleFieldsData (line 18) | type UnpackedLocaleFieldsData = {
  type LocaleFieldsData (line 22) | type LocaleFieldsData = {
  type RelativeTimeField (line 26) | type RelativeTimeField =
  type RelativeTimeFormatSingularUnit (line 52) | type RelativeTimeFormatSingularUnit = Exclude<
  type RelativeTimeLocaleData (line 64) | type RelativeTimeLocaleData = LocaleData<LocaleFieldsData>
  type RelativeTimeFormatInternal (line 65) | interface RelativeTimeFormatInternal {

FILE: packages/ecma402-abstract/utils.ts
  function repeat (line 3) | function repeat(s: string, times: number): string {
  function setInternalSlot (line 14) | function setInternalSlot<
  function setMultiInternalSlots (line 31) | function setMultiInternalSlots<
  function getInternalSlot (line 45) | function getInternalSlot<
  function getMultiInternalSlots (line 57) | function getMultiInternalSlots<
  type LiteralPart (line 79) | interface LiteralPart {
  function isLiteralPart (line 84) | function isLiteralPart(
  function defineProperty (line 100) | function defineProperty<T extends object>(
  function createDataProperty (line 119) | function createDataProperty<T extends object>(
  constant UNICODE_EXTENSION_SEQUENCE_REGEX (line 132) | const UNICODE_EXTENSION_SEQUENCE_REGEX: RegExp =
  function invariant (line 135) | function invariant(

FILE: packages/editor/header.tsx
  function handleClick (line 4) | function handleClick(event: React.MouseEvent<HTMLAnchorElement, MouseEve...
  type Props (line 9) | interface Props {}

FILE: packages/editor/index.tsx
  constant MESSAGES_COUNT (line 29) | const MESSAGES_COUNT = 50
  function fetchData (line 30) | async function fetchData(): Promise<TranslatedMessage[]> {
  function CoreApp (line 42) | function CoreApp() {
  function App (line 176) | function App() {

FILE: packages/editor/message.tsx
  type Props (line 16) | interface Props {
  function formatAst (line 20) | function formatAst(ast: MessageFormatElement[]): React.ReactNode[] {

FILE: packages/editor/messages.tsx
  type Props (line 7) | interface Props {

FILE: packages/editor/types.ts
  type TranslatedMessage (line 1) | interface TranslatedMessage {

FILE: packages/eslint-plugin-formatjs/emoji-data.generated.ts
  type EmojiVersion (line 9) | type EmojiVersion =
  constant EMOJI_VERSIONS (line 26) | const EMOJI_VERSIONS: EmojiVersion[] = [
  type EmojiRange (line 44) | interface EmojiRange {
  constant EMOJI_RANGES (line 62) | const EMOJI_RANGES: readonly EmojiRange[] = [

FILE: packages/eslint-plugin-formatjs/emoji-utils.ts
  function hasEmoji (line 44) | function hasEmoji(text: string): boolean {
  function extractEmojis (line 80) | function extractEmojis(text: string): string[] {
  function isValidEmojiVersion (line 108) | function isValidEmojiVersion(version: string): boolean {
  function getEmojiVersion (line 116) | function getEmojiVersion(emoji: string): EmojiVersion | undefined {
  function filterEmojis (line 137) | function filterEmojis(
  function getAllEmojis (line 156) | function getAllEmojis(filter: (emoji: string) => boolean): string[] {
  function parseVersion (line 175) | function parseVersion(version: string): number {

FILE: packages/eslint-plugin-formatjs/index.ts
  type Plugin (line 106) | type Plugin = {

FILE: packages/eslint-plugin-formatjs/messages.ts
  type CoreMessageIds (line 1) | type CoreMessageIds = 'parseError'
  constant CORE_MESSAGES (line 3) | const CORE_MESSAGES: Record<CoreMessageIds, string> = {

FILE: packages/eslint-plugin-formatjs/rules/blocklist-elements.ts
  type MessageIds (line 18) | type MessageIds = 'blocklist' | CoreMessageIds
  function getMessage (line 22) | function getMessage(type: Element): {
  type Element (line 32) | enum Element {
  function verifyAst (line 44) | function verifyAst(blocklist: Element[], ast: MessageFormatElement[]) {
  function checkNode (line 90) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 157) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/enforce-default-message.ts
  type Option (line 5) | enum Option {
  function checkNode (line 12) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 62) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/enforce-description.ts
  type Option (line 5) | enum Option {
  type ObjectOption (line 10) | type ObjectOption = {
  type NormalizedOption (line 15) | type NormalizedOption = {
  function normalizeOptions (line 20) | function normalizeOptions(
  function checkNode (line 32) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 115) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/enforce-id.ts
  type Option (line 6) | type Option = {
  type MessageIds (line 12) | type MessageIds =
  type MatchingMessageData (line 19) | type MatchingMessageData = {
  function checkNode (line 26) | function checkNode(
  method create (line 196) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/enforce-placeholders.ts
  function collectPlaceholderNames (line 11) | function collectPlaceholderNames(ast: MessageFormatElement[]): Set<strin...
  function checkNode (line 41) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 163) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/enforce-plural-rules.ts
  type LDML (line 11) | enum LDML {
  type PluralConfig (line 20) | type PluralConfig = {[key in LDML]?: boolean}
  type Options (line 21) | type Options = [PluralConfig?]
  type MessageIds (line 23) | type MessageIds = 'missingPlural' | 'forbidden' | CoreMessageIds
  function verifyAst (line 25) | function verifyAst(plConfig: PluralConfig, ast: MessageFormatElement[]) {
  function checkNode (line 48) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 125) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/no-camel-case.ts
  type MessageIds (line 11) | type MessageIds = 'camelcase' | CoreMessageIds
  constant CAMEL_CASE_REGEX (line 15) | const CAMEL_CASE_REGEX = /[A-Z]/
  function verifyAst (line 17) | function verifyAst(ast: MessageFormatElement[]) {
  function checkNode (line 40) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 92) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/no-complex-selectors.ts
  type Config (line 11) | interface Config {
  function calculateComplexity (line 15) | function calculateComplexity(ast: MessageFormatElement[]): number {
  function checkNode (line 61) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 146) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/no-emoji.ts
  type NoEmojiConfig (line 14) | type NoEmojiConfig = {versionAbove: string}
  type Options (line 15) | type Options = [NoEmojiConfig?]
  function checkNode (line 17) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 103) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/no-id.ts
  function isComment (line 5) | function isComment(
  function checkNode (line 13) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 47) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/no-invalid-icu.ts
  function checkNode (line 9) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 66) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/no-literal-string-in-jsx.ts
  type PropMatcher (line 19) | type PropMatcher = readonly [TagNamePattern: string, PropNamePattern: st...
  type CompiledPropMatcher (line 21) | type CompiledPropMatcher = readonly [
  type Config (line 26) | type Config = {
  function stringifyJsxTagName (line 49) | function stringifyJsxTagName(
  function compilePropMatcher (line 62) | function compilePropMatcher(propMatcher: PropMatcher): CompiledPropMatch...
  method create (line 105) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/no-literal-string-in-object.ts
  type PropertyConfig (line 4) | type PropertyConfig = {
  method create (line 35) | create(context) {
  function checkProperty (line 57) | function checkProperty(context: Rule.RuleContext, node: Property) {
  function checkPropertyValue (line 77) | function checkPropertyValue(

FILE: packages/eslint-plugin-formatjs/rules/no-missing-icu-plural-one-placeholders.ts
  type MessageIds (line 17) | type MessageIds = 'noMissingIcuPluralOnePlaceholders' | CoreMessageIds
  type MessagePatch (line 19) | type MessagePatch =
  function verifyAst (line 24) | function verifyAst(
  function checkNode (line 87) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 134) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/no-multiple-plurals.ts
  type MessageIds (line 11) | type MessageIds = 'noMultiplePlurals' | CoreMessageIds
  function verifyAst (line 13) | function verifyAst(ast: MessageFormatElement[], pluralCount = {count: 0}) {
  function checkNode (line 31) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 85) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/no-multiple-whitespaces.ts
  function isAstValid (line 12) | function isAstValid(ast: MessageFormatElement[]): boolean {
  function trimMultiWhitespaces (line 42) | function trimMultiWhitespaces(
  function checkNode (line 98) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 154) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/no-offset.ts
  type MessageIds (line 11) | type MessageIds = 'noOffset' | CoreMessageIds
  function verifyAst (line 13) | function verifyAst(ast: MessageFormatElement[]) {
  function checkNode (line 30) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 84) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/no-useless-message.ts
  type MessageIds (line 10) | type MessageIds =
  function verifyAst (line 17) | function verifyAst(ast: MessageFormatElement[]): MessageIds | undefined {
  function checkNode (line 34) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 94) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/prefer-formatted-message.ts
  method create (line 22) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/prefer-full-sentence.ts
  type WhitespaceIssue (line 11) | type WhitespaceIssue = 'leadingWhitespace' | 'trailingWhitespace'
  function getFirstBoundaryElement (line 17) | function getFirstBoundaryElement(
  function getLastBoundaryElement (line 31) | function getLastBoundaryElement(
  function findWhitespaceIssues (line 42) | function findWhitespaceIssues(ast: MessageFormatElement[]): WhitespaceIs...
  function checkNode (line 82) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 141) | create(context) {

FILE: packages/eslint-plugin-formatjs/rules/prefer-pound-in-plural.ts
  function verifyAst (line 13) | function verifyAst(
  function checkNode (line 186) | function checkNode(context: Rule.RuleContext, node: Node) {
  method create (line 234) | create(context) {

FILE: packages/eslint-plugin-formatjs/scripts/generate-emoji-data.ts
  type EmojiRange (line 12) | interface EmojiRange {
  function parseEmojiData (line 22) | function parseEmojiData(content: string): EmojiRange[] {
  function generateTypeScript (line 70) | function generateTypeScript(ranges: EmojiRange[]): string {
  type Args (line 143) | interface Args extends ParsedArgs {
  function main (line 151) | function main({out, emojiDataPath}: Args): void {

FILE: packages/eslint-plugin-formatjs/tests/util.ts
  type TestCaseBase (line 10) | interface TestCaseBase {
  type ValidTestCase (line 17) | interface ValidTestCase extends TestCaseBase {}
  type InvalidTestCase (line 19) | interface InvalidTestCase extends TestCaseBase {
  type EslintCompatRuleTester (line 27) | interface EslintCompatRuleTester {

FILE: packages/eslint-plugin-formatjs/util.ts
  type MessageDescriptor (line 14) | interface MessageDescriptor {
  constant FORMAT_FUNCTION_NAMES (line 20) | const FORMAT_FUNCTION_NAMES = new Set(['$formatMessage', 'formatMessage'...
  constant COMPONENT_NAMES (line 21) | const COMPONENT_NAMES = new Set(['FormattedMessage'])
  constant DECLARATION_FUNCTION_NAMES (line 22) | const DECLARATION_FUNCTION_NAMES = new Set(['defineMessage'])
  type Settings (line 24) | interface Settings {
  type MessageDescriptorNodeInfo (line 30) | interface MessageDescriptorNodeInfo {
  function getSettings (line 40) | function getSettings({settings}: Rule.RuleContext): Settings {
  function isStringLiteral (line 44) | function isStringLiteral(node: Node): node is Literal & {value: string} {
  function isTemplateLiteralWithoutVar (line 48) | function isTemplateLiteralWithoutVar(node: Node): node is TemplateLiteral {
  function staticallyEvaluateStringConcat (line 52) | function staticallyEvaluateStringConcat(
  function isIntlFormatMessageCall (line 72) | function isIntlFormatMessageCall(node: Node): boolean {
  function isSingleMessageDescriptorDeclaration (line 108) | function isSingleMessageDescriptorDeclaration(
  function isMultipleMessageDescriptorDeclaration (line 119) | function isMultipleMessageDescriptorDeclaration(node: Node) {
  function extractMessageDescriptor (line 127) | function extractMessageDescriptor(
  function extractMessageDescriptorFromJSXElement (line 202) | function extractMessageDescriptorFromJSXElement(
  function extractMessageDescriptors (line 311) | function extractMessageDescriptors(node?: Expression) {
  function extractMessages (line 332) | function extractMessages(
  function patchMessage (line 394) | function patchMessage(

FILE: packages/fast-memoize/index.ts
  type Func (line 5) | type Func = (...args: any[]) => any
  type Cache (line 7) | interface Cache<K, V> {
  type CacheCreateFunc (line 11) | interface CacheCreateFunc<K, V> {
  type DefaultCache (line 15) | interface DefaultCache<K, V> {
  type Serializer (line 20) | type Serializer = (args: any[]) => string
  type Options (line 22) | interface Options<F extends Func> {
  type ResolvedOptions (line 28) | interface ResolvedOptions<F extends Func> {
  type MemoizeFunc (line 33) | interface MemoizeFunc<F extends Func> {
  function memoize (line 37) | function memoize<F extends Func>(fn: F, options?: Options<F>): F {
  function isPrimitive (line 56) | function isPrimitive(value: any): boolean {
  type StrategyFn (line 62) | type StrategyFn = <F extends Func>(
  function monadic (line 70) | function monadic<F extends Func>(
  function variadic (line 88) | function variadic<F extends Func>(
  function assemble (line 106) | function assemble<F extends Func>(
  function strategyDefault (line 116) | function strategyDefault<F extends Func>(
  function strategyVariadic (line 132) | function strategyVariadic<F extends Func>(
  function strategyMonadic (line 146) | function strategyMonadic<F extends Func>(
  class ObjectWithoutPrototypeCache (line 166) | class ObjectWithoutPrototypeCache {
    method constructor (line 169) | constructor() {
    method get (line 173) | get(key: string) {
    method set (line 177) | set<T>(key: string, value: T): void {
  type Strategies (line 192) | interface Strategies<F extends Func> {

FILE: packages/icu-messageformat-parser-wasm/benchmark/benchmark.ts
  function run (line 39) | async function run() {

FILE: packages/icu-messageformat-parser-wasm/index.ts
  type ExtendedNumberFormatOptions (line 12) | interface ExtendedNumberFormatOptions extends NumberFormatOptions {
  type TYPE (line 16) | enum TYPE {
  type SKELETON_TYPE (line 28) | enum SKELETON_TYPE {
  type LocationDetails (line 33) | interface LocationDetails {
  type Location (line 39) | interface Location {
  type BaseElement (line 44) | interface BaseElement<T extends TYPE> {
  type LiteralElement (line 50) | type LiteralElement = BaseElement<TYPE.literal>
  type ArgumentElement (line 51) | type ArgumentElement = BaseElement<TYPE.argument>
  type TagElement (line 53) | interface TagElement extends BaseElement<TYPE.tag> {
  type SimpleFormatElement (line 57) | interface SimpleFormatElement<
  type NumberElement (line 64) | type NumberElement = SimpleFormatElement<TYPE.number, NumberSkeleton>
  type DateElement (line 65) | type DateElement = SimpleFormatElement<TYPE.date, DateTimeSkeleton>
  type TimeElement (line 66) | type TimeElement = SimpleFormatElement<TYPE.time, DateTimeSkeleton>
  type ValidPluralRule (line 68) | type ValidPluralRule =
  type PluralOrSelectOption (line 77) | interface PluralOrSelectOption {
  type SelectElement (line 82) | interface SelectElement extends BaseElement<TYPE.select> {
  type PluralElement (line 86) | interface PluralElement extends BaseElement<TYPE.plural> {
  type PoundElement (line 92) | interface PoundElement {
  type MessageFormatElement (line 97) | type MessageFormatElement =
  type NumberSkeleton (line 108) | interface NumberSkeleton {
  type DateTimeSkeleton (line 115) | interface DateTimeSkeleton {
  type Skeleton (line 122) | type Skeleton = NumberSkeleton | DateTimeSkeleton
  type ParserOptions (line 124) | interface ParserOptions {
  function ensureInitialized (line 136) | async function ensureInitialized(): Promise<void> {
  function parse (line 155) | async function parse(

FILE: packages/icu-messageformat-parser/benchmark/benchmark.ts
  function run (line 52) | async function run() {

FILE: packages/icu-messageformat-parser/date-time-pattern-generator.ts
  function getBestPattern (line 10) | function getBestPattern(skeleton: string, locale: Intl.Locale): string {
  function getDefaultHourSymbolFromLocale (line 55) | function getDefaultHourSymbolFromLocale(locale: Intl.Locale): string {

FILE: packages/icu-messageformat-parser/error.ts
  type ParserError (line 3) | interface ParserError {
  type ErrorKind (line 9) | enum ErrorKind {

FILE: packages/icu-messageformat-parser/index.ts
  function pruneLocation (line 15) | function pruneLocation(els: MessageFormatElement[]): void {
  function parse (line 36) | function parse(

FILE: packages/icu-messageformat-parser/integration-tests/integration_tests.rs
  function read_test_case (line 23) | fn read_test_case(path: &Path) -> (String, Value, Value) {
  function json_to_parser_options (line 50) | fn json_to_parser_options(options_json: &Value) -> ParserOptions {
  function run_integration_test (line 87) | fn run_integration_test(test_file_name: &str) {
  function integration_test (line 202) | fn integration_test() {

FILE: packages/icu-messageformat-parser/integration-tests/run-parser.ts
  type Args (line 5) | interface Args extends minimist.ParsedArgs {
  function run (line 10) | function run({input, out}: Args) {

FILE: packages/icu-messageformat-parser/integration-tests/wasm-integration.test.ts
  type ParserOptions (line 19) | interface ParserOptions {
  type TestCase (line 27) | interface TestCase {
  function readTestCase (line 43) | function readTestCase(filePath: string): TestCase {
  function getTestCaseFiles (line 63) | function getTestCaseFiles(): string[] {

FILE: packages/icu-messageformat-parser/manipulator.ts
  function cloneDeep (line 17) | function cloneDeep<T>(obj: T): T {
  function replacePoundWithArgument (line 39) | function replacePoundWithArgument(
  function hoistPluralOrSelectElement (line 73) | function hoistPluralOrSelectElement(
  function isPluralOrSelectElement (line 113) | function isPluralOrSelectElement(
  function findPluralOrSelectElement (line 119) | function findPluralOrSelectElement(ast: MessageFormatElement[]): boolean {
  function hoistSelectors (line 142) | function hoistSelectors(
  function collectVariables (line 164) | function collectVariables(
  type IsStructurallySameResult (line 195) | interface IsStructurallySameResult {
  function isStructurallySame (line 207) | function isStructurallySame(

FILE: packages/icu-messageformat-parser/no-parser.ts
  function parse (line 1) | function parse(): void {

FILE: packages/icu-messageformat-parser/parser.ts
  constant SPACE_SEPARATOR_START_REGEX (line 22) | const SPACE_SEPARATOR_START_REGEX = new RegExp(
  constant SPACE_SEPARATOR_END_REGEX (line 25) | const SPACE_SEPARATOR_END_REGEX = new RegExp(
  type Position (line 29) | interface Position {
  type ParserOptions (line 37) | interface ParserOptions {
  type Result (line 66) | type Result<T, E> = {val: T; err: null} | {val: null; err: E}
  type ArgType (line 67) | type ArgType =
  function createLocation (line 76) | function createLocation(start: Position, end: Position): Location {
  constant IDENTIFIER_PREFIX_RE (line 123) | const IDENTIFIER_PREFIX_RE = new RegExp(
  function matchIdentifierAtIndex (line 128) | function matchIdentifierAtIndex(s: string, index: number): string {
  class Parser (line 134) | class Parser {
    method constructor (line 143) | constructor(message: string, options: ParserOptions = {}) {
    method parse (line 152) | parse(): Result<MessageFormatElement[], ParserError> {
    method parseMessage (line 159) | private parseMessage(
    method parseTag (line 238) | private parseTag(
    method parseTagName (line 323) | private parseTagName(): string {
    method parseLiteral (line 333) | private parseLiteral(
    method tryParseLeftAngleBracket (line 372) | tryParseLeftAngleBracket(): string | null {
    method tryParseQuote (line 391) | private tryParseQuote(parentArgType: ArgType): string | null {
    method tryParseUnquoted (line 445) | private tryParseUnquoted(
    method parseArgument (line 468) | private parseArgument(
    method parseIdentifierIfPossible (line 558) | private parseIdentifierIfPossible(): {value: string; location: Locatio...
    method parseArgumentOptions (line 573) | private parseArgumentOptions(
    method tryParseArgumentClose (line 806) | private tryParseArgumentClose(
    method parseSimpleArgStyleIfPossible (line 824) | private parseSimpleArgStyleIfPossible(): Result<string, ParserError> {
    method parseNumberSkeletonFromString (line 873) | private parseNumberSkeletonFromString(
    method tryParsePluralOrSelectOptions (line 907) | private tryParsePluralOrSelectOptions(
    method tryParseDecimalInteger (line 1016) | private tryParseDecimalInteger(
    method offset (line 1055) | private offset(): number {
    method isEOF (line 1059) | private isEOF(): boolean {
    method clonePosition (line 1063) | private clonePosition(): Position {
    method char (line 1076) | private char(): number {
    method error (line 1088) | private error(
    method bump (line 1103) | private bump(): void {
    method bumpIf (line 1125) | private bumpIf(prefix: string): boolean {
    method bumpUntil (line 1139) | private bumpUntil(pattern: string): boolean {
    method bumpTo (line 1155) | private bumpTo(targetOffset: number) {
    method bumpSpace (line 1182) | private bumpSpace() {
    method peek (line 1192) | private peek(): number | null {
  function _isAlpha (line 1208) | function _isAlpha(codepoint: number): boolean {
  function _isAlphaOrSlash (line 1215) | function _isAlphaOrSlash(codepoint: number): boolean {
  function _isPotentialElementNameChar (line 1220) | function _isPotentialElementNameChar(c: number): boolean {
  function _isWhiteSpace (line 1248) | function _isWhiteSpace(c: number) {

FILE: packages/icu-messageformat-parser/printer.ts
  function printAST (line 27) | function printAST(ast: MessageFormatElement[]): string {
  function doPrintAST (line 31) | function doPrintAST(
  function printTagElement (line 66) | function printTagElement(el: TagElement): string {
  function printEscapedMessage (line 70) | function printEscapedMessage(message: string): string {
  function printLiteralElement (line 74) | function printLiteralElement(
  function printArgumentElement (line 94) | function printArgumentElement({value}: ArgumentElement) {
  function printSimpleFormatElement (line 98) | function printSimpleFormatElement(
  function printNumberSkeletonToken (line 106) | function printNumberSkeletonToken(token: NumberSkeletonToken): string {
  function printArgumentStyle (line 113) | function printArgumentStyle(style: string | Skeleton) {
  function printDateTimeSkeleton (line 123) | function printDateTimeSkeleton(style: DateTimeSkeleton): string {
  function printSelectElement (line 127) | function printSelectElement(el: SelectElement) {
  function printPluralElement (line 138) | function printPluralElement(el: PluralElement) {

FILE: packages/icu-messageformat-parser/regex.generated.ts
  constant SPACE_SEPARATOR_REGEX (line 2) | const SPACE_SEPARATOR_REGEX: RegExp =
  constant WHITE_SPACE_REGEX (line 4) | const WHITE_SPACE_REGEX: RegExp = /[\t-\r \x85\u200E\u200F\u2028\u2029]/

FILE: packages/icu-messageformat-parser/tools/regex-gen.ts
  function generateTypeScript (line 9) | function generateTypeScript(
  function generateRust (line 19) | function generateRust(spaceSeparator: regenerate, ws: regenerate): string {
  function main (line 39) | function main(args: minimist.ParsedArgs) {

FILE: packages/icu-messageformat-parser/tools/time-data-gen.ts
  function generateTypeScript (line 6) | function generateTypeScript(data: Record<string, string[]>): string {
  function generateRust (line 15) | function generateRust(data: Record<string, string[]>): string {
  function main (line 36) | function main(args: minimist.ParsedArgs) {

FILE: packages/icu-messageformat-parser/types.ts
  type ExtendedNumberFormatOptions (line 4) | interface ExtendedNumberFormatOptions extends NumberFormatOptions {
  type TYPE (line 8) | enum TYPE {
  type SKELETON_TYPE (line 48) | enum SKELETON_TYPE {
  type LocationDetails (line 53) | interface LocationDetails {
  type Location (line 58) | interface Location {
  type BaseElement (line 63) | interface BaseElement<T extends TYPE> {
  type LiteralElement (line 69) | type LiteralElement = BaseElement<TYPE.literal>
  type ArgumentElement (line 70) | type ArgumentElement = BaseElement<TYPE.argument>
  type TagElement (line 71) | interface TagElement extends BaseElement<TYPE.tag> {
  type SimpleFormatElement (line 75) | interface SimpleFormatElement<
  type NumberElement (line 82) | type NumberElement = SimpleFormatElement<TYPE.number, NumberSkeleton>
  type DateElement (line 83) | type DateElement = SimpleFormatElement<TYPE.date, DateTimeSkeleton>
  type TimeElement (line 84) | type TimeElement = SimpleFormatElement<TYPE.time, DateTimeSkeleton>
  type ValidPluralRule (line 86) | type ValidPluralRule =
  type PluralOrSelectOption (line 95) | interface PluralOrSelectOption {
  type SelectElement (line 100) | interface SelectElement extends BaseElement<TYPE.select> {
  type PluralElement (line 104) | interface PluralElement extends BaseElement<TYPE.plural> {
  type PoundElement (line 110) | interface PoundElement {
  type MessageFormatElement (line 115) | type MessageFormatElement =
  type NumberSkeleton (line 126) | interface NumberSkeleton {
  type DateTimeSkeleton (line 133) | interface DateTimeSkeleton {
  type Skeleton (line 140) | type Skeleton = NumberSkeleton | DateTimeSkeleton
  function isLiteralElement (line 145) | function isLiteralElement(
  function isArgumentElement (line 150) | function isArgumentElement(
  function isNumberElement (line 155) | function isNumberElement(el: MessageFormatElement): el is NumberElement {
  function isDateElement (line 158) | function isDateElement(el: MessageFormatElement): el is DateElement {
  function isTimeElement (line 161) | function isTimeElement(el: MessageFormatElement): el is TimeElement {
  function isSelectElement (line 164) | function isSelectElement(el: MessageFormatElement): el is SelectElement {
  function isPluralElement (line 167) | function isPluralElement(el: MessageFormatElement): el is PluralElement {
  function isPoundElement (line 170) | function isPoundElement(el: MessageFormatElement): el is PoundElement {
  function isTagElement (line 173) | function isTagElement(el: MessageFormatElement): el is TagElement {
  function isNumberSkeleton (line 176) | function isNumberSkeleton(
  function isDateTimeSkeleton (line 181) | function isDateTimeSkeleton(
  function createLiteralElement (line 187) | function createLiteralElement(value: string): LiteralElement {
  function createNumberElement (line 194) | function createNumberElement(

FILE: packages/icu-skeleton-parser/date-time.ts
  constant DATE_TIME_REGEX (line 6) | const DATE_TIME_REGEX =
  function parseDateTimeSkeleton (line 15) | function parseDateTimeSkeleton(

FILE: packages/icu-skeleton-parser/number.ts
  type ExtendedNumberFormatOptions (line 4) | interface ExtendedNumberFormatOptions extends NumberFormatOptions {
  type NumberSkeletonToken (line 7) | interface NumberSkeletonToken {
  function parseNumberSkeletonFromString (line 12) | function parseNumberSkeletonFromString(
  function icuUnitToEcma (line 42) | function icuUnitToEcma(unit: string): ExtendedNumberFormatOptions['unit'] {
  constant FRACTION_PRECISION_REGEX (line 46) | const FRACTION_PRECISION_REGEX = /^\.(?:(0+)(\*)?|(#+)|(0+)(#+))$/g
  constant SIGNIFICANT_PRECISION_REGEX (line 47) | const SIGNIFICANT_PRECISION_REGEX = /^(@+)?(\+|#+)?[rs]?$/g
  constant INTEGER_WIDTH_REGEX (line 48) | const INTEGER_WIDTH_REGEX = /(\*)(0+)|(#+)(0+)|(0+)/g
  constant CONCISE_INTEGER_WIDTH_REGEX (line 49) | const CONCISE_INTEGER_WIDTH_REGEX = /^(0+)$/
  function parseSignificantPrecision (line 51) | function parseSignificantPrecision(str: string): ExtendedNumberFormatOpt...
  function parseSign (line 86) | function parseSign(str: string): ExtendedNumberFormatOptions | undefined {
  function parseConciseScientificAndEngineeringStem (line 127) | function parseConciseScientificAndEngineeringStem(
  function parseNotationOptions (line 160) | function parseNotationOptions(opt: string): ExtendedNumberFormatOptions {
  function parseNumberSkeleton (line 172) | function parseNumberSkeleton(

FILE: packages/icu-skeleton-parser/regex.generated.ts
  constant WHITE_SPACE_REGEX (line 2) | const WHITE_SPACE_REGEX: RegExp = /[\t-\r \x85\u200E\u200F\u2028\u2029]/i

FILE: packages/icu-skeleton-parser/scripts/regex-gen.ts
  function main (line 9) | function main(args: minimist.ParsedArgs) {

FILE: packages/intl-datetimeformat/scripts/cldr-raw.ts
  function main (line 7) | async function main(args: minimist.ParsedArgs) {

FILE: packages/intl-datetimeformat/scripts/cldr.ts
  type Args (line 6) | interface Args extends minimist.ParsedArgs {
  function main (line 9) | function main(args: Args) {

FILE: packages/intl-datetimeformat/scripts/extract-dates.ts
  function isDateFormatOnly (line 39) | function isDateFormatOnly(opts: Intl.DateTimeFormatOptions) {
  function isTimeFormatOnly (line 50) | function isTimeFormatOnly(opts: Intl.DateTimeFormatOptions) {
  function getAllLocales (line 62) | function getAllLocales(): string[] {
  function resolveDateTimeSymbolTable (line 80) | function resolveDateTimeSymbolTable(token: string): string {
  function filterKeys (line 94) | function filterKeys<T>(
  function hasAltVariant (line 106) | function hasAltVariant(k: string): boolean {
  function extractTimezoneToMetazoneMap (line 137) | function extractTimezoneToMetazoneMap(): Record<string, string> {
  function loadDatesFields (line 167) | async function loadDatesFields(
  function extractDatesFields (line 513) | async function extractDatesFields(
  function extractStyleFormatFields (line 531) | function extractStyleFormatFields<

FILE: packages/intl-datetimeformat/scripts/link.ts
  function main (line 5) | function main(args: minimist.ParsedArgs) {

FILE: packages/intl-datetimeformat/scripts/process-zdump.ts
  constant SPACE_REGEX (line 10) | const SPACE_REGEX = /[\s\t]+/
  constant MONTHS (line 12) | const MONTHS = [
  function pad (line 27) | function pad(n: number) {
  constant GOLDEN_TIMEZONES (line 34) | const GOLDEN_TIMEZONES = new Set([
  function utTimeToSeconds (line 288) | function utTimeToSeconds(utTime: string) {
  constant LINE_REGEX (line 300) | const LINE_REGEX = /^(.*?)\s+(.*?) UTC? = (.*?) isdst=(0|1) gmtoff=(.*?)$/i
  function processZone (line 302) | function processZone(
  constant SPECIAL_CASES (line 342) | const SPECIAL_CASES = [
  function main (line 382) | async function main(args: minimist.ParsedArgs) {

FILE: packages/intl-datetimeformat/scripts/test-locale-data-gen.ts
  function main (line 7) | function main(args: minimist.ParsedArgs) {

FILE: packages/intl-datetimeformat/scripts/test262-main-gen.ts
  type Args (line 5) | interface Args extends minimist.ParsedArgs {
  function main (line 11) | function main(args: Args) {

FILE: packages/intl-datetimeformat/scripts/zic.ts
  function main (line 6) | async function main(args: minimist.ParsedArgs) {

FILE: packages/intl-datetimeformat/scripts/zone.ts
  function main (line 4) | function main(args: minimist.ParsedArgs) {

FILE: packages/intl-datetimeformat/should-polyfill.ts
  function supportsDateStyle (line 4) | function supportsDateStyle() {
  function hasChromeLt71Bug (line 19) | function hasChromeLt71Bug() {
  function hasUnthrownDateTimeStyleBug (line 37) | function hasUnthrownDateTimeStyleBug(): boolean {
  function supportedLocalesOf (line 48) | function supportedLocalesOf(locale?: string | string[]) {
  function shouldPolyfill (line 58) | function shouldPolyfill(locale = 'en'): string | undefined {

FILE: packages/intl-datetimeformat/src/abstract/BasicFormatMatcher.ts
  function BasicFormatMatcher (line 18) | function BasicFormatMatcher(

FILE: packages/intl-datetimeformat/src/abstract/BestFitFormatMatcher.ts
  function isNumericType (line 14) | function isNumericType(
  function bestFitFormatMatcherScore (line 26) | function bestFitFormatMatcherScore(
  function BestFitFormatMatcher (line 80) | function BestFitFormatMatcher(

FILE: packages/intl-datetimeformat/src/abstract/DateTimeStyleFormat.ts
  function DateTimeStyleFormat (line 7) | function DateTimeStyleFormat(

FILE: packages/intl-datetimeformat/src/abstract/FormatDateTime.ts
  function FormatDateTime (line 10) | function FormatDateTime(

FILE: packages/intl-datetimeformat/src/abstract/FormatDateTimePattern.ts
  function pad (line 14) | function pad(n: number): string {
  function offsetToGmtString (line 21) | function offsetToGmtString(
  type FormatDateTimePatternImplDetails (line 50) | interface FormatDateTimePatternImplDetails {
  function FormatDateTimePattern (line 68) | function FormatDateTimePattern(

FILE: packages/intl-datetimeformat/src/abstract/FormatDateTimeRange.ts
  function FormatDateTimeRange (line 6) | function FormatDateTimeRange(

FILE: packages/intl-datetimeformat/src/abstract/FormatDateTimeRangeToParts.ts
  function FormatDateTimeRangeToParts (line 7) | function FormatDateTimeRangeToParts(

FILE: packages/intl-datetimeformat/src/abstract/FormatDateTimeToParts.ts
  function FormatDateTimeToParts (line 15) | function FormatDateTimeToParts(

FILE: packages/intl-datetimeformat/src/abstract/InitializeDateTimeFormat.ts
  function isTimeRelated (line 20) | function isTimeRelated(opt: Opt) {
  function resolveHourCycle (line 32) | function resolveHourCycle(hc: string, hcDefault: string, hour12?: boolea...
  type Opt (line 55) | interface Opt extends Omit<Formats, 'pattern' | 'pattern12'> {
  constant TYPE_REGEX (line 61) | const TYPE_REGEX = /^[a-z0-9]{3,8}$/i
  function InitializeDateTimeFormat (line 68) | function InitializeDateTimeFormat(

FILE: packages/intl-datetimeformat/src/abstract/PartitionDateTimePattern.ts
  function PartitionDateTimePattern (line 21) | function PartitionDateTimePattern(

FILE: packages/intl-datetimeformat/src/abstract/PartitionDateTimeRangePattern.ts
  constant TABLE_2_FIELDS (line 17) | const TABLE_2_FIELDS: Array<TABLE_2> = [
  function PartitionDateTimeRangePattern (line 30) | function PartitionDateTimeRangePattern(

FILE: packages/intl-datetimeformat/src/abstract/ToDateTimeOptions.ts
  function ToDateTimeOptions (line 9) | function ToDateTimeOptions(

FILE: packages/intl-datetimeformat/src/abstract/ToLocalTime.ts
  constant OFFSET_TIMEZONE_PREFIX_REGEX (line 16) | const OFFSET_TIMEZONE_PREFIX_REGEX = /^[+-]/
  constant OFFSET_TIMEZONE_FORMAT_REGEX (line 17) | const OFFSET_TIMEZONE_FORMAT_REGEX =
  function IsTimeZoneOffsetString (line 29) | function IsTimeZoneOffsetString(offsetString: string): boolean {
  function ParseTimeZoneOffsetString (line 45) | function ParseTimeZoneOffsetString(offsetString: string): number {
  function getApplicableZoneData (line 89) | function getApplicableZoneData(
  type ToLocalTimeImplDetails (line 125) | interface ToLocalTimeImplDetails {
  function ToLocalTime (line 135) | function ToLocalTime(

FILE: packages/intl-datetimeformat/src/abstract/skeleton.ts
  constant DATE_TIME_REGEX (line 14) | const DATE_TIME_REGEX =
  function matchSkeletonPattern (line 20) | function matchSkeletonPattern(
  function skeletonTokenToTable2 (line 165) | function skeletonTokenToTable2(c: string): TABLE_2 {
  function processDateTimePattern (line 217) | function processDateTimePattern(
  function parseDateTimeSkeleton (line 271) | function parseDateTimeSkeleton(
  function splitFallbackRangePattern (line 326) | function splitFallbackRangePattern(
  function splitRangePattern (line 351) | function splitRangePattern(pattern: string): Array<RangePatternPart> {

FILE: packages/intl-datetimeformat/src/abstract/utils.ts
  constant DATE_TIME_PROPS (line 6) | const DATE_TIME_PROPS: Array<

FILE: packages/intl-datetimeformat/src/core.ts
  constant UPPERCASED_LINKS (line 29) | const UPPERCASED_LINKS = Object.keys(links).reduce(
  constant RESOLVED_OPTIONS_KEYS (line 37) | const RESOLVED_OPTIONS_KEYS: Array<
  method get (line 61) | get(this: IDateTimeFormat) {
  type DateTimeFormatConstructor (line 120) | interface DateTimeFormatConstructor {
  constant DEFAULT_TIMEZONE (line 304) | const DEFAULT_TIMEZONE = 'UTC'
  function findIntervalFormat (line 337) | function findIntervalFormat(

FILE: packages/intl-datetimeformat/src/get_internal_slots.ts
  function getInternalSlots (line 14) | function getInternalSlots(

FILE: packages/intl-datetimeformat/src/packer.ts
  function pack (line 4) | function pack(data: UnpackedData): PackedData {
  function unpack (line 21) | function unpack(data: PackedData): Record<string, UnpackedZoneData[]> {

FILE: packages/intl-datetimeformat/src/to_locale_string.ts
  function toLocaleString (line 9) | function toLocaleString(
  function toLocaleDateString (line 18) | function toLocaleDateString(
  function toLocaleTimeString (line 30) | function toLocaleTimeString(

FILE: packages/intl-datetimeformat/src/types.ts
  type PackedData (line 7) | interface PackedData {
  type UnpackedData (line 13) | interface UnpackedData {
  type ZoneData (line 22) | type ZoneData = [
  type RawDateTimeLocaleData (line 33) | type RawDateTimeLocaleData = LocaleData<RawDateTimeLocaleInternalData>
  type RawDateTimeLocaleInternalData (line 35) | type RawDateTimeLocaleInternalData = Omit<
  type TimeZoneNameData (line 51) | type TimeZoneNameData = Record<

FILE: packages/intl-datetimeformat/tests/abstract/BestFitFormatMatcher.test.ts
  constant FORMATS (line 141) | const FORMATS = {
  constant PROCESSED_FORMATS (line 681) | const PROCESSED_FORMATS = Object.keys(FORMATS).map(skeleton =>

FILE: packages/intl-datetimeformat/tests/benchmark.ts
  function run (line 13) | async function run() {

FILE: packages/intl-datetimeformat/tests/format-range.test.ts
  method [Symbol.toPrimitive] (line 153) | get [Symbol.toPrimitive]() {

FILE: packages/intl-datetimeformat/tests/ftp-main.test.ts
  function reduce (line 12) | function reduce(parts: IntlDateTimeFormatPart[]) {
  function compareFTPtoFormat (line 16) | function compareFTPtoFormat(

FILE: packages/intl-datetimeformat/tests/index.test.ts
  constant DEFAULT_TIMEZONE (line 15) | const DEFAULT_TIMEZONE = DateTimeFormat.getDefaultTimeZone()

FILE: packages/intl-datetimeformat/tests/offset-timezone.test.ts
  constant DEFAULT_TIMEZONE (line 13) | const DEFAULT_TIMEZONE = DateTimeFormat.getDefaultTimeZone()

FILE: packages/intl-displaynames/abstract/CanonicalCodeForDisplayNames.ts
  constant UNICODE_REGION_SUBTAG_REGEX (line 9) | const UNICODE_REGION_SUBTAG_REGEX = /^([a-z]{2}|[0-9]{3})$/i
  constant ALPHA_4 (line 10) | const ALPHA_4 = /^[a-z]{4}$/i
  constant UNICODE_TYPE_REGEX (line 11) | const UNICODE_TYPE_REGEX = /^[a-z0-9]{3,8}([-_][a-z0-9]{3,8})*$/i
  function isUnicodeRegionSubtag (line 13) | function isUnicodeRegionSubtag(region: string): boolean {
  function isUnicodeScriptSubtag (line 17) | function isUnicodeScriptSubtag(script: string): boolean {
  function isUnicodeLocaleIdentifierType (line 21) | function isUnicodeLocaleIdentifierType(code: string): boolean {
  function CanonicalCodeForDisplayNames (line 25) | function CanonicalCodeForDisplayNames(

FILE: packages/intl-displaynames/abstract/IsValidDateTimeFieldCode.ts
  constant CODES_FOR_DATE_TIME_FIELD (line 1) | const CODES_FOR_DATE_TIME_FIELD: Array<string> = [
  function IsValidDateTimeFieldCode (line 16) | function IsValidDateTimeFieldCode(field: string): boolean {

FILE: packages/intl-displaynames/index.ts
  type DisplayNamesOptions (line 20) | interface DisplayNamesOptions {
  type DisplayNamesResolvedOptions (line 34) | interface DisplayNamesResolvedOptions {
  class DisplayNames (line 42) | class DisplayNames {
    method constructor (line 43) | constructor(
    method supportedLocalesOf (line 149) | static supportedLocalesOf(
    method __addLocaleData (line 160) | static __addLocaleData(...data: DisplayNamesLocaleData[]): void {
    method of (line 176) | of(code: string | number | Record<string, unknown>): string | undefined {
    method resolvedOptions (line 219) | resolvedOptions(): DisplayNamesResolvedOptions {
    method getDefaultLocale (line 237) | private static getDefaultLocale() {
  function isValidCodeForDisplayNames (line 244) | function isValidCodeForDisplayNames(
  type DisplayNamesInternalSlots (line 295) | interface DisplayNamesInternalSlots {
  function getSlot (line 311) | function getSlot<K extends keyof DisplayNamesInternalSlots>(
  function setSlot (line 318) | function setSlot<K extends keyof DisplayNamesInternalSlots>(
  function checkReceiver (line 326) | function checkReceiver(receiver: unknown, methodName: string) {
  function getNameForTypeLanguage (line 334) | function getNameForTypeLanguage(

FILE: packages/intl-displaynames/scripts/cldr-raw.ts
  function main (line 8) | async function main(args: minimist.ParsedArgs) {

FILE: packages/intl-displaynames/scripts/cldr.ts
  type Args (line 6) | interface Args extends minimist.ParsedArgs {
  function main (line 11) | function main(args: Args) {

FILE: packages/intl-displaynames/scripts/extract-displaynames.ts
  type LanguageRawData (line 16) | type LanguageRawData =
  type RegionRawData (line 18) | type RegionRawData =
  type ScriptRawData (line 20) | type ScriptRawData =
  type LocalePatternRawData (line 22) | type LocalePatternRawData =
  type CurrencyRawData (line 24) | type CurrencyRawData =
  type CalendarRawData (line 26) | type CalendarRawData =
  type DateTimeFieldRawData (line 28) | type DateTimeFieldRawData =
  function getAllLocales (line 32) | async function getAllLocales(): Promise<string[]> {
  function extractStyleData (line 49) | function extractStyleData(
  function extractCurrencyStyleData (line 72) | function extractCurrencyStyleData(
  constant CLDR_TO_TC39_KEYS (line 92) | const CLDR_TO_TC39_KEYS: Record<string, string> = {
  function extractDateTimeFieldStyleData (line 96) | function extractDateTimeFieldStyleData(
  function getStandardLanguageValue (line 118) | function getStandardLanguageValue(
  function extractStandardLanguageStyleData (line 142) | function extractStandardLanguageStyleData(
  function extractLanguageStyleData (line 189) | function extractLanguageStyleData(
  function loadDisplayNames (line 207) | async function loadDisplayNames(
  function extractDisplayNames (line 283) | async function extractDisplayNames(

FILE: packages/intl-displaynames/scripts/test-locale-data-gen.ts
  function main (line 7) | function main(args: minimist.ParsedArgs) {

FILE: packages/intl-displaynames/scripts/test262-main-gen.ts
  type Args (line 4) | interface Args extends minimist.ParsedArgs {
  function main (line 10) | function main(args: Args) {

FILE: packages/intl-displaynames/should-polyfill.ts
  function hasMissingICUBug (line 7) | function hasMissingICUBug() {
  function hasScriptBug (line 32) | function hasScriptBug() {
  function supportedLocalesOf (line 44) | function supportedLocalesOf(locale?: string | string[]) {
  function _shouldPolyfillWithoutLocale (line 55) | function _shouldPolyfillWithoutLocale(): boolean {
  function shouldPolyfill (line 59) | function shouldPolyfill(locale = 'en'): string | true | undefined {

FILE: packages/intl-durationformat/benchmark/analyze-profile.ts
  type CallFrame (line 4) | interface CallFrame {
  type ProfileNode (line 10) | interface ProfileNode {
  type CPUProfile (line 15) | interface CPUProfile {
  type FunctionStats (line 19) | interface FunctionStats {
  type FunctionEntry (line 24) | interface FunctionEntry {
  type FileEntry (line 30) | interface FileEntry {
  function analyzeProfile (line 35) | function analyzeProfile(profilePath: string): void {
  function main (line 103) | function main(): void {

FILE: packages/intl-durationformat/benchmark/benchmark.ts
  function run (line 49) | async function run() {

FILE: packages/intl-durationformat/benchmark/instantiation-benchmark.ts
  function run (line 8) | async function run() {

FILE: packages/intl-durationformat/scripts/time-separators.ts
  type RawData (line 8) | type RawData = typeof arData
  type Args (line 10) | interface Args {
  function main (line 14) | async function main(args: Args) {

FILE: packages/intl-durationformat/scripts/utils.ts
  function getAllLocales (line 7) | async function getAllLocales(): Promise<string[]> {

FILE: packages/intl-durationformat/should-polyfill.ts
  function shouldPolyfill (line 1) | function shouldPolyfill(): boolean {

FILE: packages/intl-durationformat/src/abstract/DurationRecordSign.ts
  function DurationRecordSign (line 4) | function DurationRecordSign(record: DurationRecord): -1 | 0 | 1 {

FILE: packages/intl-durationformat/src/abstract/GetDurationUnitOptions.ts
  function GetDurationUnitOptions (line 3) | function GetDurationUnitOptions<T extends object>(

FILE: packages/intl-durationformat/src/abstract/IsValidDurationRecord.ts
  function IsValidDurationRecord (line 6) | function IsValidDurationRecord(record: DurationRecord): boolean {

FILE: packages/intl-durationformat/src/abstract/PartitionDurationFormatPattern.ts
  function PartitionDurationFormatPattern (line 12) | function PartitionDurationFormatPattern(

FILE: packages/intl-durationformat/src/abstract/ToDurationRecord.ts
  function ToDurationRecord (line 5) | function ToDurationRecord(input: DurationInput): DurationRecord {

FILE: packages/intl-durationformat/src/abstract/ToIntegerIfIntegral.ts
  function ToIntegerIfIntegral (line 3) | function ToIntegerIfIntegral(arg: any): number {

FILE: packages/intl-durationformat/src/constants.ts
  constant TABLE_1 (line 3) | const TABLE_1: Array<keyof DurationRecord> = [
  constant TABLE_2 (line 16) | const TABLE_2 = [

FILE: packages/intl-durationformat/src/core.ts
  constant RESOLVED_OPTIONS_KEYS (line 32) | const RESOLVED_OPTIONS_KEYS: Array<
  constant TABLE_3 (line 64) | const TABLE_3 = [
  class DurationFormat (line 141) | class DurationFormat implements DurationFormatType {
    method constructor (line 142) | constructor(locales?: string | string[], options?: DurationFormatOptio...
    method resolvedOptions (line 256) | resolvedOptions(): ResolvedDurationFormatOptions {
    method formatToParts (line 280) | formatToParts(duration: DurationInput): DurationFormatPart[] {
    method format (line 297) | format(duration: DurationInput): string {
    method supportedLocalesOf (line 311) | static supportedLocalesOf(

FILE: packages/intl-durationformat/src/get_internal_slots.ts
  function getInternalSlots (line 10) | function getInternalSlots(

FILE: packages/intl-durationformat/src/time-separators.generated.ts
  constant TIME_SEPARATORS (line 3) | const TIME_SEPARATORS = {

FILE: packages/intl-durationformat/src/types.ts
  type DurationFormatOptions (line 3) | type DurationFormatOptions = Partial<ResolvedDurationFormatOptions>
  type ResolvedDurationFormatOptions (line 5) | interface ResolvedDurationFormatOptions {
  type DurationFormatPart (line 33) | interface DurationFormatPart {
  type RawDurationLocaleData (line 39) | interface RawDurationLocaleData {
  type DurationFormatLocaleInternalData (line 44) | interface DurationFormatLocaleInternalData {
  type DurationFormat (line 50) | interface DurationFormat {
  type IntlDurationFormatInternal (line 56) | interface IntlDurationFormatInternal {
  type DurationInput (line 85) | interface DurationInput {
  type DurationRecord (line 98) | interface DurationRecord {
  type DurationFormatConstructor (line 111) | interface DurationFormatConstructor {

FILE: packages/intl-getcanonicallocales/index.ts
  function isLocaleObject (line 15) | function isLocaleObject(value: any): value is Intl.Locale {
  function CanonicalizeLocaleList (line 29) | function CanonicalizeLocaleList(
  function getCanonicalLocales (line 92) | function getCanonicalLocales(

FILE: packages/intl-getcanonicallocales/scripts/aliases.ts
  function main (line 9) | function main({out}: minimist.ParsedArgs) {

FILE: packages/intl-getcanonicallocales/scripts/likely-subtags.ts
  function main (line 5) | function main({out}: minimist.ParsedArgs) {

FILE: packages/intl-getcanonicallocales/should-polyfill.ts
  function shouldPolyfill (line 1) | function shouldPolyfill(): boolean {

FILE: packages/intl-getcanonicallocales/src/canonicalizer.ts
  function canonicalizeAttrs (line 22) | function canonicalizeAttrs(strs: string[]): string[] {
  function canonicalizeKVs (line 31) | function canonicalizeKVs(arr: KV[]): KV[] {
  function compareKV (line 48) | function compareKV(t1: Array<any>, t2: Array<any>): number {
  function compareExtension (line 52) | function compareExtension(e1: Extension, e2: Extension): number {
  function mergeVariants (line 56) | function mergeVariants(v1: string[], v2: string[]): string[] {
  function canonicalizeUnicodeLanguageId (line 75) | function canonicalizeUnicodeLanguageId(
  function CanonicalizeUnicodeLocaleId (line 249) | function CanonicalizeUnicodeLocaleId(

FILE: packages/intl-getcanonicallocales/src/emitter.ts
  function emitUnicodeLanguageId (line 3) | function emitUnicodeLanguageId(lang?: UnicodeLanguageId): string {
  function emitUnicodeLocaleId (line 12) | function emitUnicodeLocaleId({

FILE: packages/intl-getcanonicallocales/src/parser.ts
  constant ALPHANUM_1_8 (line 11) | const ALPHANUM_1_8 = /^[a-z0-9]{1,8}$/i
  constant ALPHANUM_2_8 (line 12) | const ALPHANUM_2_8 = /^[a-z0-9]{2,8}$/i
  constant ALPHANUM_3_8 (line 13) | const ALPHANUM_3_8 = /^[a-z0-9]{3,8}$/i
  constant KEY_REGEX (line 15) | const KEY_REGEX = /^[a-z0-9][a-z]$/i
  constant TYPE_REGEX (line 17) | const TYPE_REGEX = /^[a-z0-9]{3,8}$/i
  constant ALPHA_4 (line 18) | const ALPHA_4 = /^[a-z]{4}$/i
  constant OTHER_EXTENSION_TYPE (line 20) | const OTHER_EXTENSION_TYPE = /^[0-9a-svwyz]$/i
  constant UNICODE_REGION_SUBTAG_REGEX (line 21) | const UNICODE_REGION_SUBTAG_REGEX = /^([a-z]{2}|[0-9]{3})$/i
  constant UNICODE_VARIANT_SUBTAG_REGEX (line 22) | const UNICODE_VARIANT_SUBTAG_REGEX = /^([a-z0-9]{5,8}|[0-9][a-z0-9]{3})$/i
  constant UNICODE_LANGUAGE_SUBTAG_REGEX (line 23) | const UNICODE_LANGUAGE_SUBTAG_REGEX = /^([a-z]{2,3}|[a-z]{5,8})$/i
  constant TKEY_REGEX (line 24) | const TKEY_REGEX = /^[a-z][0-9]$/i
  constant SEPARATOR (line 26) | const SEPARATOR = '-'
  function isUnicodeLanguageSubtag (line 28) | function isUnicodeLanguageSubtag(lang: string): boolean {
  function isStructurallyValidLanguageTag (line 32) | function isStructurallyValidLanguageTag(tag: string): boolean {
  function isUnicodeRegionSubtag (line 41) | function isUnicodeRegionSubtag(region: string): boolean {
  function isUnicodeScriptSubtag (line 45) | function isUnicodeScriptSubtag(script: string): boolean {
  function isUnicodeVariantSubtag (line 49) | function isUnicodeVariantSubtag(variant: string): boolean {
  function parseUnicodeLanguageId (line 53) | function parseUnicodeLanguageId(
  function parseUnicodeExtension (line 96) | function parseUnicodeExtension(chunks: string[]): UnicodeExtension {
  function parseKeyword (line 128) | function parseKeyword(chunks: string[]): KV | undefined {
  function parseTransformedExtension (line 146) | function parseTransformedExtension(chunks: string[]): TransformedExtensi...
  function parsePuExtension (line 174) | function parsePuExtension(chunks: string[]): PuExtension {
  function parseOtherExtensionValue (line 187) | function parseOtherExtensionValue(chunks: string[]): string {
  function parseExtensions (line 197) | function parseExtensions(chunks: string[]): Omit<UnicodeLocaleId, 'lang'> {
  function parseUnicodeLocaleId (line 252) | function parseUnicodeLocaleId(locale: string): UnicodeLocaleId {

FILE: packages/intl-getcanonicallocales/src/types.ts
  type UnicodeLocaleId (line 1) | interface UnicodeLocaleId {
  type UnicodeLanguageId (line 8) | interface UnicodeLanguageId {
  type KV (line 15) | type KV = [string, string] | [string]
  type Extension (line 17) | interface Extension {
  type UnicodeExtension (line 21) | interface UnicodeExtension extends Extension {
  type TransformedExtension (line 27) | interface TransformedExtension extends Extension {
  type PuExtension (line 32) | interface PuExtension extends Extension {
  type OtherExtension (line 37) | interface OtherExtension extends Extension {

FILE: packages/intl-listformat/index.ts
  type IntlListFormatOptions (line 18) | interface IntlListFormatOptions {
  type ResolvedIntlListFormatOptions (line 45) | interface ResolvedIntlListFormatOptions {
  type Part (line 71) | type Part<T = string> = LiteralPart | ElementPart | ElementPart<T>
  type ElementPart (line 73) | interface ElementPart<T = string> {
  type Placeable (line 78) | interface Placeable {
  type ListFormatInternal (line 83) | interface ListFormatInternal {
  function validateInstance (line 94) | function validateInstance(instance: any, method: string) {
  function stringListFromIterable (line 108) | function stringListFromIterable(iterable: Iterable<unknown>): string[] {
  function createPartsFromList (line 125) | function createPartsFromList(
  function deconstructPattern (line 162) | function deconstructPattern(
  class ListFormat (line 188) | class ListFormat {
    method constructor (line 189) | constructor(locales?: string | string[], options?: IntlListFormatOptio...
    method format (line 270) | format(elements: Iterable<string>): string {
    method formatToParts (line 286) | formatToParts(elements: Iterable<string>): Part[] {
    method resolvedOptions (line 303) | resolvedOptions(): ResolvedIntlListFormatOptions {
    method supportedLocalesOf (line 312) | public static supportedLocalesOf(
    method __addLocaleData (line 324) | public static __addLocaleData(...data: ListPatternLocaleData[]): void {
    method getDefaultLocale (line 340) | private static getDefaultLocale() {

FILE: packages/intl-listformat/scripts/cldr-raw.ts
  function main (line 8) | async function main(args: minimist.ParsedArgs) {

FILE: packages/intl-listformat/scripts/cldr.ts
  type Args (line 6) | interface Args extends minimist.ParsedArgs {
  function main (line 11) | function main(args: Args) {

FILE: packages/intl-listformat/scripts/extract-list.ts
  type ListTypes (line 18) | type ListTypes = (typeof ListPatterns)['main']['en']['listPatterns']
  function getAllLocales (line 20) | async function getAllLocales(): Promise<string[]> {
  function serializeToPatternData (line 37) | function serializeToPatternData(
  function loadListPatterns (line 48) | async function loadListPatterns(
  function extractLists (line 79) | async function extractLists(

FILE: packages/intl-listformat/scripts/test-locale-data-gen.ts
  function main (line 7) | function main(args: minimist.ParsedArgs) {

FILE: packages/intl-listformat/scripts/test262-main-gen.ts
  type Args (line 4) | interface Args extends minimist.ParsedArgs {
  function main (line 10) | function main(args: Args) {

FILE: packages/intl-listformat/should-polyfill.ts
  function supportedLocalesOf (line 4) | function supportedLocalesOf(locale?: string | string[]) {
  function shouldPolyfill (line 15) | function shouldPolyfill(locale = 'en'): string | undefined {

FILE: packages/intl-listformat/tests/supported-locales-of.test.ts
  function test (line 13) | function test() {

FILE: packages/intl-locale/calendars.generated.ts
  type CalendarsKey (line 293) | type CalendarsKey = keyof typeof calendars

FILE: packages/intl-locale/character-orders.generated.ts
  type CharacterOrdersKey (line 771) | type CharacterOrdersKey = keyof typeof characterOrders
  type CharacterOrder (line 772) | type CharacterOrder = 'left-to-right' | 'right-to-left' | 'top-to-bottom'

FILE: packages/intl-locale/get_internal_slots.ts
  function getInternalSlots (line 9) | function getInternalSlots(

FILE: packages/intl-locale/hour-cycles.generated.ts
  type HourCyclesKey (line 1049) | type HourCyclesKey = keyof typeof hourCycles

FILE: packages/intl-locale/index.ts
  type IntlLocaleOptions (line 37) | interface IntlLocaleOptions {
  constant ALPHANUM_3_8 (line 50) | const ALPHANUM_3_8 = /^[a-z0-9]{3,8}$/i
  constant RELEVANT_EXTENSION_KEYS (line 52) | const RELEVANT_EXTENSION_KEYS = [
  type RELEVANT_EXTENSION_KEY (line 61) | type RELEVANT_EXTENSION_KEY = (typeof RELEVANT_EXTENSION_KEYS)[number]
  type ExtensionOpts (line 62) | type ExtensionOpts = Record<RELEVANT_EXTENSION_KEY, string>
  type IntlLocaleInternal (line 64) | interface IntlLocaleInternal extends IntlLocaleOptions {
  constant UNICODE_TYPE_REGEX (line 69) | const UNICODE_TYPE_REGEX = /^[a-z0-9]{3,8}(-[a-z0-9]{3,8})*$/i
  function applyOptionsToTag (line 71) | function applyOptionsToTag(tag: string, options: IntlLocaleOptions): str...
  function applyUnicodeExtensionToTag (line 126) | function applyUnicodeExtensionToTag(
  function mergeUnicodeLanguageId (line 184) | function mergeUnicodeLanguageId(
  function addLikelySubtags (line 207) | function addLikelySubtags(tag: string): string {
  function removeLikelySubtags (line 275) | function removeLikelySubtags(tag: string): string {
  function createArrayFromListOrRestricted (line 320) | function createArrayFromListOrRestricted(
  function calendarsOfLocale (line 332) | function calendarsOfLocale(loc: Locale): Array<string> {
  function collationsOfLocale (line 347) | function collationsOfLocale(loc: Locale): Array<string> {
  function hourCyclesOfLocale (line 360) | function hourCyclesOfLocale(loc: Locale): Array<string> {
  function numberingSystemsOfLocale (line 378) | function numberingSystemsOfLocale(loc: Locale): Array<string> {
  function timeZonesOfLocale (line 399) | function timeZonesOfLocale(loc: Locale): Array<string> | undefined {
  function translateCharacterOrder (line 415) | function translateCharacterOrder(order: CharacterOrder | undefined): str...
  function characterDirectionOfLocale (line 423) | function characterDirectionOfLocale(loc: Locale): string {
  function weekInfoOfLocale (line 428) | function weekInfoOfLocale(loc: Locale): WeekInfoInternal {
  constant TABLE_1 (line 441) | const TABLE_1 = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'] as const
  function weekdayToString (line 443) | function weekdayToString(fw: string) {
  class Locale (line 447) | class Locale {
    method constructor (line 448) | constructor(tag: string | Locale, opts?: IntlLocaleOptions) {
    method maximize (line 597) | public maximize(): Locale {
    method minimize (line 610) | public minimize(): Locale {
    method toString (line 620) | public toString(): string {
    method baseName (line 624) | public get baseName(): string {
    method calendar (line 629) | public get calendar(): string | undefined {
    method collation (line 633) | public get collation(): string | undefined {
    method caseFirst (line 637) | public get caseFirst(): 'upper' | 'lower' | 'false' | undefined {
    method numeric (line 641) | public get numeric(): boolean | undefined {
    method numberingSystem (line 644) | public get numberingSystem(): string | undefined {
    method language (line 650) | public get language(): string {
    method script (line 657) | public get script(): string | undefined {
    method region (line 664) | public get region(): string | undefined {
    method variants (line 678) | public get variants(): string | undefined {
    method firstDayOfWeek (line 687) | public get firstDayOfWeek(): string | undefined {
    method hourCycle (line 695) | public get hourCycle(): 'h11' | 'h12' | 'h23' | 'h24' | undefined {
    method getCalendars (line 707) | public getCalendars(): string[] {
    method getCollations (line 715) | public getCollations(): string[] {
    method getHourCycles (line 723) | public getHourCycles(): string[] {
    method getNumberingSystems (line 736) | public getNumberingSystems(): string[] {
    method getTimeZones (line 744) | public getTimeZones(): string[] | undefined {
    method getTextInfo (line 752) | public getTextInfo(): {
    method getWeekInfo (line 767) | public getWeekInfo(): {

FILE: packages/intl-locale/numbering-systems.generated.ts
  type NumberingSystemsKey (line 2428) | type NumberingSystemsKey = keyof typeof numberingSystems

FILE: packages/intl-locale/preference-data.ts
  function getCalendarPreferenceDataForRegion (line 13) | function getCalendarPreferenceDataForRegion(region?: string): string[] {
  function getHourCyclesPreferenceDataForLocaleOrRegion (line 41) | function getHourCyclesPreferenceDataForLocaleOrRegion(
  function getTimeZonePreferenceForRegion (line 57) | function getTimeZonePreferenceForRegion(region: string): string[] {
  function getWeekDataForRegion (line 67) | function getWeekDataForRegion(region?: string): WeekInfoInternal {

FILE: packages/intl-locale/scripts/calendars.ts
  function main (line 11) | async function main(args: Args) {

FILE: packages/intl-locale/scripts/character-orders.ts
  type CharacterOrder (line 8) | type CharacterOrder = 'left-to-right' | 'right-to-left'
  type CldrMiscLayout (line 10) | type CldrMiscLayout =
  function getCharacterOrder (line 24) | function getCharacterOrder(
  function main (line 31) | async function main(args: Args) {

FILE: packages/intl-locale/scripts/common-types.ts
  type Args (line 3) | interface Args extends ParsedArgs {

FILE: packages/intl-locale/scripts/hour-cycles.ts
  function resolveDateTimeSymbolTable (line 10) | function resolveDateTimeSymbolTable(token: string): string {
  function main (line 35) | async function main(args: Args) {

FILE: packages/intl-locale/scripts/numbering-systems.ts
  type CldrNumbersNumbers (line 9) | type CldrNumbersNumbers = {
  function getNumberingSystems (line 16) | function getNumberingSystems(numbers: CldrNumbersNumbers): string[] {
  function main (line 33) | async function main(args: Args) {

FILE: packages/intl-locale/scripts/timezones.ts
  type Tz (line 8) | type Tz = typeof rawTimezones.keyword.u.tz & {
  type TzEntry (line 12) | type TzEntry = {
  function getTimezoneAlias (line 21) | function getTimezoneAlias(timezone: TzEntry): string | null {
  function main (line 72) | async function main(args: Args) {

FILE: packages/intl-locale/scripts/utils.ts
  function getAllLocales (line 7) | async function getAllLocales(): Promise<string[]> {

FILE: packages/intl-locale/scripts/week-data.ts
  type WeekInfoInternal (line 10) | type WeekInfoInternal = {
  type WeekDataForTerritories (line 19) | type WeekDataForTerritories = {
  function resolveWeekDaySymbolTable (line 25) | function resolveWeekDaySymbolTable(token: string): number {
  function getWeekDataForRegion (line 45) | function getWeekDataForRegion(region?: string): WeekInfoInternal {
  function main (line 85) | async function main(args: Args) {

FILE: packages/intl-locale/should-polyfill.ts
  function hasIntlGetCanonicalLocalesBug (line 4) | function hasIntlGetCanonicalLocalesBug(): boolean {
  function hasVariantsProperty (line 18) | function hasVariantsProperty(): boolean {
  function hasIncompleteLocaleInfo (line 38) | function hasIncompleteLocaleInfo(): boolean {
  function shouldPolyfill (line 64) | function shouldPolyfill(): boolean {

FILE: packages/intl-locale/timezones.generated.ts
  type TimezonesTerritory (line 968) | type TimezonesTerritory = keyof typeof timezones

FILE: packages/intl-locale/week-data.generated.ts
  type WeekDataKey (line 2074) | type WeekDataKey = keyof typeof weekData
  type WeekInfoInternal (line 2075) | type WeekInfoInternal = (typeof weekData)[WeekDataKey]

FILE: packages/intl-localematcher/abstract/BestAvailableLocale.ts
  function BestAvailableLocale (line 9) | function BestAvailableLocale(

FILE: packages/intl-localematcher/abstract/BestFitMatcher.ts
  function BestFitMatcher (line 10) | function BestFitMatcher(

FILE: packages/intl-localematcher/abstract/CanonicalizeLocaleList.ts
  function CanonicalizeLocaleList (line 5) | function CanonicalizeLocaleList(

FILE: packages/intl-localematcher/abstract/CanonicalizeUValue.ts
  function CanonicalizeUValue (line 3) | function CanonicalizeUValue(ukey: string, uvalue: string): string {

FILE: packages/intl-localematcher/abstract/CanonicalizeUnicodeLocaleId.ts
  function CanonicalizeUnicodeLocaleId (line 1) | function CanonicalizeUnicodeLocaleId(locale: string): string {

FILE: packages/intl-localematcher/abstract/InsertUnicodeExtensionAndCanonicalize.ts
  function InsertUnicodeExtensionAndCanonicalize (line 5) | function InsertUnicodeExtensionAndCanonicalize(

FILE: packages/intl-localematcher/abstract/LookupMatcher.ts
  function LookupMatcher (line 11) | function LookupMatcher(

FILE: packages/intl-localematcher/abstract/LookupSupportedLocales.ts
  function LookupSupportedLocales (line 9) | function LookupSupportedLocales(

FILE: packages/intl-localematcher/abstract/ResolveLocale.ts
  type ResolveLocaleResult (line 9) | interface ResolveLocaleResult {
  function ResolveLocale (line 18) | function ResolveLocale<K extends string, D extends {[k in K]: any}>(

FILE: packages/intl-localematcher/abstract/UnicodeExtensionComponents.ts
  function UnicodeExtensionComponents (line 4) | function UnicodeExtensionComponents(extension: string): {

FILE: packages/intl-localematcher/abstract/UnicodeExtensionValue.ts
  function UnicodeExtensionValue (line 8) | function UnicodeExtensionValue(

FILE: packages/intl-localematcher/abstract/types.ts
  type LookupMatcherResult (line 1) | interface LookupMatcherResult {
  type Keyword (line 7) | interface Keyword {

FILE: packages/intl-localematcher/abstract/utils.ts
  constant UNICODE_EXTENSION_SEQUENCE_REGEX (line 4) | const UNICODE_EXTENSION_SEQUENCE_REGEX: RegExp =
  function invariant (line 22) | function invariant(
  constant DEFAULT_MATCHING_THRESHOLD (line 33) | const DEFAULT_MATCHING_THRESHOLD = 838
  type LSR (line 35) | interface LSR {
  type LanguageMatchInfo (line 41) | interface LanguageMatchInfo {
  type LanguageInfo (line 48) | interface LanguageInfo {
  constant PROCESSED_DATA (line 54) | let PROCESSED_DATA: LanguageInfo | undefined
  function processData (line 56) | function processData(): LanguageInfo {
  function isMatched (line 107) | function isMatched(
  function serializeLSR (line 138) | function serializeLSR(lsr: LSR): string {
  function findMatchingDistanceForLSR (line 142) | function findMatchingDistanceForLSR(
  function findMatchingDistanceImpl (line 170) | function findMatchingDistanceImpl(desired: string, supported: string): n...
  type LocaleMatchingResult (line 258) | interface LocaleMatchingResult {
  function getFallbackCandidates (line 269) | function getFallbackCandidates(locale: string): string[] {
  function findBestMatch (line 341) | function findBestMatch(

FILE: packages/intl-localematcher/benchmark/benchmark.ts
  function run (line 8) | async function run() {

FILE: packages/intl-localematcher/benchmark/bestfit-benchmark.ts
  function matchLocale (line 17) | function matchLocale(
  function run (line 24) | async function run() {

FILE: packages/intl-localematcher/index.ts
  type Opts (line 4) | interface Opts {
  function match (line 8) | function match(

FILE: packages/intl-localematcher/scripts/regions-gen.ts
  type Args (line 6) | interface Args extends minimist.ParsedArgs {
  function flattenRegion (line 10) | function flattenRegion(
  function main (line 23) | function main({out}: Args) {

FILE: packages/intl-messageformat/src/core.ts
  function mergeConfig (line 26) | function mergeConfig(c1: Record<string, object>, c2?: Record<string, obj...
  function mergeConfigs (line 43) | function mergeConfigs(
  type Options (line 60) | interface Options extends Omit<ParserOptions, 'locale'> {
  function createFastMemoizeCache (line 64) | function createFastMemoizeCache<V>(
  function createDefaultFormatters (line 81) | function createDefaultFormatters(
  class IntlMessageFormat (line 104) | class IntlMessageFormat {
    method constructor (line 116) | constructor(
    method defaultLocale (line 206) | static get defaultLocale(): string {

FILE: packages/intl-messageformat/src/error.ts
  type ErrorCode (line 1) | enum ErrorCode {
  class FormatError (line 10) | class FormatError extends Error {
    method constructor (line 20) | constructor(msg: string, code: ErrorCode, originalMessage?: string) {
    method toString (line 25) | public toString() {
  class InvalidValueError (line 30) | class InvalidValueError extends FormatError {
    method constructor (line 31) | constructor(
  class InvalidValueTypeError (line 47) | class InvalidValueTypeError extends FormatError {
    method constructor (line 48) | constructor(value: any, type: string, originalMessage?: string) {
  class MissingValueError (line 57) | class MissingValueError extends FormatError {
    method constructor (line 58) | constructor(variableId: string, originalMessage?: string) {

FILE: packages/intl-messageformat/src/formatters.ts
  type Message (line 27) | interface Message {}
  type IntlConfig (line 28) | interface IntlConfig {}
  type Formats (line 29) | interface Formats {}
  type Format (line 33) | type Format<Source = string> = Source extends keyof FormatjsIntl.Formats
  type Formats (line 37) | interface Formats {
  type FormatterCache (line 43) | interface FormatterCache {
  type Formatters (line 49) | interface Formatters {
  type PART_TYPE (line 62) | enum PART_TYPE {
  type LiteralPart (line 67) | interface LiteralPart {
  type ObjectPart (line 72) | interface ObjectPart<T = any> {
  type MessageFormatPart (line 77) | type MessageFormatPart<T> = LiteralPart | ObjectPart<T>
  type PrimitiveType (line 79) | type PrimitiveType =
  function mergeLiteral (line 88) | function mergeLiteral<T>(
  function isFormatXMLElementFn (line 109) | function isFormatXMLElementFn<T>(
  function formatToParts (line 116) | function formatToParts<T>(
  type FormatXMLElementFn (line 352) | type FormatXMLElementFn<T, R = string | T | (string | T)[]> = (

FILE: packages/intl-messageformat/tests/benchmark.ts
  function run (line 41) | async function run() {

FILE: packages/intl-messageformat/tests/index.test.ts
  function formatWithValueNameTypo (line 418) | function formatWithValueNameTypo() {
  function formatWithMissingValue (line 437) | function formatWithMissingValue() {
  function formatWithMissingValue (line 447) | function formatWithMissingValue() {

FILE: packages/intl-numberformat/benchmark/analyze-profile.ts
  type CallFrame (line 4) | interface CallFrame {
  type ProfileNode (line 10) | interface ProfileNode {
  type CPUProfile (line 15) | interface CPUProfile {
  type FunctionStats (line 19) | interface FunctionStats {
  type FunctionEntry (line 24) | interface FunctionEntry {
  type FileEntry (line 30) | interface FileEntry {
  function analyzeProfile (line 35) | function analyzeProfile(profilePath: string): void {
  function main (line 103) | function main(): void {

FILE: packages/intl-numberformat/benchmark/benchmark.ts
  function run (line 37) | async function run() {

FILE: packages/intl-numberformat/scripts/cldr-raw.ts
  function main (line 10) | async function main(args: minimist.ParsedArgs) {

FILE: packages/intl-numberformat/scripts/cldr.ts
  type Args (line 5) | interface Args extends minimist.ParsedArgs {
  function main (line 10) | function main(args: Args) {

FILE: packages/intl-numberformat/scripts/currency-digits.ts
  function main (line 5) | function main(args: minimist.ParsedArgs) {

FILE: packages/intl-numberformat/scripts/extract-currencies.ts
  type Currencies (line 22) | type Currencies =
  function extractCurrencyPattern (line 25) | function extractCurrencyPattern(d: Currencies['USD']) {
  function getAllLocales (line 42) | function getAllLocales(): string[] {
  function loadCurrencies (line 51) | async function loadCurrencies(
  function generateDataForLocales (line 74) | async function generateDataForLocales(
  function extractCurrencyDigits (line 87) | function extractCurrencyDigits(): Record<string, number> {

FILE: packages/intl-numberformat/scripts/extract-numbers.ts
  type Numbers (line 19) | type Numbers = (typeof NumbersData)['main']['ar']['numbers']
  constant COUNTS (line 21) | const COUNTS = [
  function reduceNumCount (line 36) | function reduceNumCount<
  function extractNumbers (line 57) | function extractNumbers(d: Numbers): RawNumberData {
  function loadNumbers (line 131) | async function loadNumbers(locale: string): Promise<RawNumberData> {
  function generateDataForLocales (line 146) | async function generateDataForLocales(
  function extractNumberingSystemNames (line 156) | function extractNumberingSystemNames() {

FILE: packages/intl-numberformat/scripts/extract-units.ts
  type Units (line 19) | type Units = (typeof UnitsData)['main']['en']['units']
  function extractUnitPattern (line 21) | function extractUnitPattern(d: Units['long']['volume-gallon']) {
  function loadUnits (line 32) | async function loadUnits(locale: string): Promise<UnitDataTable> {
  function generateDataForLocales (line 83) | async function generateDataForLocales(

FILE: packages/intl-numberformat/scripts/generate-locale-test.ts
  type Args (line 4) | interface Args extends minimist.ParsedArgs {
  function main (line 10) | function main(args: Args) {

FILE: packages/intl-numberformat/scripts/numbering-systems.ts
  function main (line 4) | function main(args: minimist.ParsedArgs) {

FILE: packages/intl-numberformat/scripts/test-locale-data-gen.ts
  function main (line 7) | function main(args: minimist.ParsedArgs) {

FILE: packages/intl-numberformat/scripts/test262-main-gen.ts
  type Args (line 4) | interface Args extends minimist.ParsedArgs {
  function main (line 10) | function main(args: Args) {

FILE: packages/intl-numberformat/scripts/units-constants.ts
  function main (line 5) | function main(args: minimist.ParsedArgs) {

FILE: packages/intl-numberformat/scripts/utils.ts
  function collapseSingleValuePluralRule (line 6) | function collapseSingleValuePluralRule<T>(
  constant PLURAL_RULES (line 21) | const PLURAL_RULES: Array<LDMLPluralRule> = [

FILE: packages/intl-numberformat/should-polyfill.ts
  function onlySupportsEn (line 7) | function onlySupportsEn() {
  function supportsES2020 (line 21) | function supportsES2020() {
  function supportsES2023 (line 48) | function supportsES2023() {
  function supportedLocalesOf (line 65) | function supportedLocalesOf(locale?: string | string[]) {
  function shouldPolyfill (line 73) | function shouldPolyfill(locale = 'en'): string | undefined {

FILE: packages/intl-numberformat/src/core.ts
  type NumberFormat (line 28) | type NumberFormat = NumberFormatType
  constant RESOLVED_OPTIONS_KEYS (line 30) | const RESOLVED_OPTIONS_KEYS = [
  function formatToParts (line 91) | function formatToParts(this: Intl.NumberFormat, x: number | bigint | Dec...
  function formatRange (line 97) | function formatRange(
  function formatRangeToParts (line 112) | function formatRangeToParts(
  method get (line 180) | get(this: NumberFormat) {

FILE: packages/intl-numberformat/src/get_internal_slots.ts
  function getInternalSlots (line 7) | function getInternalSlots(

FILE: packages/intl-numberformat/src/to_locale_string.ts
  function toLocaleString (line 9) | function toLocaleString(

FILE: packages/intl-numberformat/src/types.ts
  type NumberFormat (line 13) | interface NumberFormat {
  type NumberFormatConstructor (line 27) | interface NumberFormatConstructor {

FILE: packages/intl/index.ts
  function defineMessages (line 4) | function defineMessages<
  function defineMessage (line 12) | function defineMessage<T>(msg: T): T {

FILE: packages/intl/src/create-intl.ts
  type CreateIntlFn (line 24) | interface CreateIntlFn<
  function messagesContainString (line 32) | function messagesContainString(
  function verifyConfigMessages (line 40) | function verifyConfigMessages<T = string>(config: IntlConfig<T>) {
  function createIntl (line 57) | function createIntl<T = string>(

FILE: packages/intl/src/dateTime.ts
  constant DATE_TIME_FORMAT_OPTIONS (line 11) | const DATE_TIME_FORMAT_OPTIONS: Array<keyof Intl.DateTimeFormatOptions> = [
  function getFormatter (line 35) | function getFormatter(
  function formatDate (line 78) | function formatDate(
  function formatTime (line 101) | function formatTime(
  function formatDateTimeRange (line 125) | function formatDateTimeRange(
  function formatDateToParts (line 156) | function formatDateToParts(
  function formatTimeToParts (line 184) | function formatTimeToParts(

FILE: packages/intl/src/displayName.ts
  constant DISPLAY_NAMES_OPTONS (line 7) | const DISPLAY_NAMES_OPTONS: Array<keyof Intl.DisplayNamesOptions> = [
  function formatDisplayName (line 14) | function formatDisplayName(

FILE: packages/intl/src/error.ts
  type IntlErrorCode (line 3) | enum IntlErrorCode {
Copy disabled (too large) Download .json
Condensed preview — 1642 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,623K chars).
[
  {
    "path": ".aspect/bazelrc/.gitignore",
    "chars": 13,
    "preview": "user.bazelrc\n"
  },
  {
    "path": ".aspect/bazelrc/bazel5.bazelrc",
    "chars": 258,
    "preview": "# Performance improvement for WORKSPACE evaluation\n# of slow rulesets, for example rules_k8s has been\n# observed to take"
  },
  {
    "path": ".aspect/bazelrc/bazel6.bazelrc",
    "chars": 968,
    "preview": "# Speed up all builds by not checking if external repository files have been modified.\n# Docs: https://github.com/bazelb"
  },
  {
    "path": ".aspect/bazelrc/ci.bazelrc",
    "chars": 3867,
    "preview": "# We recommend enforcing a policy that keeps your CI from being slowed down\n# by individual test targets that should be "
  },
  {
    "path": ".aspect/bazelrc/convenience.bazelrc",
    "chars": 1594,
    "preview": "# Attempt to build & test every target whose prerequisites were successfully built.\n# Docs: https://bazel.build/docs/use"
  },
  {
    "path": ".aspect/bazelrc/correctness.bazelrc",
    "chars": 4191,
    "preview": "# Do not upload locally executed action results to the remote cache.\n# This should be the default for local builds so lo"
  },
  {
    "path": ".aspect/bazelrc/debug.bazelrc",
    "chars": 767,
    "preview": "############################################################\n# Use `bazel test --config=debug` to enable these settings "
  },
  {
    "path": ".aspect/bazelrc/javascript.bazelrc",
    "chars": 1641,
    "preview": "# Aspect recommended Bazel flags when using Aspect's JavaScript rules: https://github.com/aspect-build/rules_js\n# Docs f"
  },
  {
    "path": ".aspect/bazelrc/performance.bazelrc",
    "chars": 2260,
    "preview": "# Speed up all builds by not checking if output files have been modified. Lets you make changes to\n# the output tree wit"
  },
  {
    "path": ".bazelrc",
    "chars": 4910,
    "preview": "# Common Bazel settings for JavaScript/NodeJS workspaces\n# This rc file is automatically discovered when Bazel is run in"
  },
  {
    "path": ".bazelversion",
    "chars": 6,
    "preview": "9.0.1\n"
  },
  {
    "path": ".commitlintrc.mjs",
    "chars": 922,
    "preview": "import fastGlobPkg from 'fast-glob'\nimport {readJSONSync} from 'fs-extra/esm'\nimport {dirname} from 'node:path'\nconst {s"
  },
  {
    "path": ".eslintignore",
    "chars": 282,
    "preview": "/artifacts\n/build\n/dist\n/node_modules\n**/artifacts\n**/build\n**/node_modules\npackages/babel-plugin-formatjs/options.ts\n**"
  },
  {
    "path": ".gitattributes",
    "chars": 569,
    "preview": "packages/*/src/data/* linguist-generated\npackages/*/test262-main.ts linguist-generated\npackages/*/supported-locales.ts l"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 1230,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve. If this is a question please use Discussions.\ntitle: ''\n"
  },
  {
    "path": ".github/workflows/claude.yml",
    "chars": 1926,
    "preview": "name: Claude Code\n\non:\n  issue_comment:\n    types: [created]\n  pull_request_review_comment:\n    types: [created]\n  issue"
  },
  {
    "path": ".github/workflows/prerelease.yml",
    "chars": 988,
    "preview": "name: Prerelease\n\non:\n  workflow_dispatch:\n\nconcurrency:\n  group: ${{ github.workflow }}\n  cancel-in-progress: false\n\njo"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 1444,
    "preview": "name: Release\n\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\nconcurrency:\n  group: ${{ github.workflow }}"
  },
  {
    "path": ".github/workflows/rust-cli-release.yml",
    "chars": 5349,
    "preview": "name: Rust CLI Release\n\non:\n  push:\n    tags:\n      - 'formatjs_cli_v*'\n  workflow_dispatch:\n    inputs:\n      dry_run:\n"
  },
  {
    "path": ".github/workflows/stale.yml",
    "chars": 1195,
    "preview": "name: 'Close stale issues and PRs'\non:\n  schedule:\n    - cron: '30 1 * * *'\n\npermissions:\n  contents: read\n\njobs:\n  stal"
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 2879,
    "preview": "name: Test\n\non:\n  pull_request:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\nconcurrency:\n  group: ${{ githu"
  },
  {
    "path": ".github/workflows/typesense-index.yml",
    "chars": 2108,
    "preview": "name: Update Typesense Search Index\n\non:\n  push:\n    branches:\n      - main\n    paths:\n      - 'docs/src/docs/**/*.mdx'\n"
  },
  {
    "path": ".github/workflows/verify-hooks.yml",
    "chars": 2365,
    "preview": "name: Verify Commit Hooks\n\non:\n  pull_request:\n  push:\n    branches:\n      - main\n\njobs:\n  verify-hooks:\n    runs-on: ub"
  },
  {
    "path": ".github/workflows/website.yml",
    "chars": 1934,
    "preview": "name: Deploy Docs to Organization GitHub Pages\n\non:\n  push:\n    branches:\n      - main # The branch where updates are ma"
  },
  {
    "path": ".gitignore",
    "chars": 251,
    "preview": "bazel-*\ndist\nnode_modules\n.cache\n.bazelrc.user\n*.log\n.idea\n.css\nbuild/\n.DS_Store\n.op\nrelease/\n!release/BUILD.bazel\ntarge"
  },
  {
    "path": ".npmrc",
    "chars": 36,
    "preview": "registry=https://registry.npmjs.org/"
  },
  {
    "path": ".oxfmtrc.json",
    "chars": 604,
    "preview": "{\n  \"$schema\": \"./node_modules/oxfmt/configuration_schema.json\",\n  \"arrowParens\": \"avoid\",\n  \"bracketSpacing\": false,\n  "
  },
  {
    "path": ".oxlintrc.json",
    "chars": 408,
    "preview": "{\n  \"$schema\": \"./node_modules/oxlint/configuration_schema.json\",\n  \"plugins\": [\"import\", \"typescript\", \"react\", \"jsx-a1"
  },
  {
    "path": ".syncpackrc.json",
    "chars": 2375,
    "preview": "{\n  \"dependencyTypes\": [\n    \"dev\",\n    \"engines\",\n    \"peer\",\n    \"prod\"\n  ],\n  \"sortFirst\": [\n    \"name\",\n    \"descrip"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 152,
    "preview": "{\n  \"recommendations\": [\n    \"dbaeumer.vscode-eslint\",\n    \"foxundermoon.shell-format\",\n    \"TypeScriptTeam.native-previ"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 1677,
    "preview": "{\n  \"files.exclude\": {\n    \"**/.git\": true,\n    \"**/.svn\": true,\n    \"**/.hg\": true,\n    \"**/CVS\": true,\n    \"**/.DS_Sto"
  },
  {
    "path": ".vscode/tasks.json",
    "chars": 296,
    "preview": "{\n  \"version\": \"2.0.0\",\n  \"tasks\": [\n    {\n      \"type\": \"npm\",\n      \"script\": \"dev:cjs\",\n      \"problemMatcher\": [\"$ts"
  },
  {
    "path": "BUILD.bazel",
    "chars": 7865,
    "preview": "load(\"@aspect_bazel_lib//lib:copy_to_bin.bzl\", \"copy_to_bin\")\nload(\"@aspect_bazel_lib//lib:copy_to_directory.bzl\", \"copy"
  },
  {
    "path": "CLAUDE.md",
    "chars": 10676,
    "preview": "# Instructions for Claude Code\n\n## Critical Rules\n\n### 1. NEVER Run `bazel clean`\n\n- **NEVER** run `bazel clean` or `baz"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3360,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 7136,
    "preview": "# Contributing\n\nPull requests are very welcome, but should be within the scope of the project, and follow the repository"
  },
  {
    "path": "Cargo.toml",
    "chars": 244,
    "preview": "[workspace]\nmembers = [\n  \"crates/icu_skeleton_parser\",\n  \"crates/icu_messageformat_parser\",\n  \"crates/formatjs_cli\",\n  "
  },
  {
    "path": "MODULE.bazel",
    "chars": 7717,
    "preview": "module(\n    name = \"formatjs\",\n    version = \"1.0\",\n)\n\n######### Bazel core rules #########\n\nbazel_dep(name = \"platforms"
  },
  {
    "path": "README.md",
    "chars": 8582,
    "preview": "# FormatJS\n\n[![Unit Tests](https://github.com/formatjs/formatjs/actions/workflows/tests.yml/badge.svg)](https://github.c"
  },
  {
    "path": "REPO.bazel",
    "chars": 642,
    "preview": "# Repository-level ignore patterns\n# This file replaces .bazelignore (deprecated in Bazel 8.0+)\n#\n# Use ignore_directori"
  },
  {
    "path": "UPCOMING.md",
    "chars": 911,
    "preview": "# Upcoming Improvements\n\n## High Impact, High Feasibility\n\n### 1. Vue `$t` Helper (Pinned Issue #3444, open 4+ years)\n- "
  },
  {
    "path": "benchmarks/cli-comparison/BUILD.bazel",
    "chars": 901,
    "preview": "load(\"@aspect_rules_js//js:defs.bzl\", \"js_binary\", \"js_run_binary\")\nload(\"@npm//:defs.bzl\", \"npm_link_all_packages\")\n\nnp"
  },
  {
    "path": "benchmarks/cli-comparison/README.md",
    "chars": 6241,
    "preview": "# FormatJS CLI Benchmark: Rust vs TypeScript\n\nThis benchmark compares the performance of the Rust CLI implementation aga"
  },
  {
    "path": "benchmarks/cli-comparison/benchmark-results.json",
    "chars": 699,
    "preview": "{\n  \"timestamp\": \"2026-01-04T16:53:38.221Z\",\n  \"testFiles\": {\n    \"count\": 1000,\n    \"messages\": 9656,\n    \"pattern\": \"/"
  },
  {
    "path": "benchmarks/cli-comparison/benchmark-tinybench.mjs",
    "chars": 8642,
    "preview": "#!/usr/bin/env node\n/**\n * Benchmark script using tinybench to compare Rust CLI vs TypeScript CLI performance\n */\n\nimpor"
  },
  {
    "path": "benchmarks/cli-comparison/generate-test-files.mjs",
    "chars": 8550,
    "preview": "#!/usr/bin/env node\n/**\n * Generates test files with a mix of simple and complex ICU MessageFormat messages\n * for bench"
  },
  {
    "path": "benchmarks/cli-comparison/package.json",
    "chars": 180,
    "preview": "{\n  \"name\": \"@formatjs/cli-benchmark\",\n  \"description\": \"Benchmark comparing Rust CLI vs TypeScript CLI performance\",\n  "
  },
  {
    "path": "benchmarks/cli-comparison/run-benchmark.sh",
    "chars": 1253,
    "preview": "#!/bin/bash\n# Run the FormatJS CLI benchmark: Rust vs TypeScript\nset -e\n\necho \"🔥 FormatJS CLI Benchmark Runner\"\necho \"=="
  },
  {
    "path": "buildbuddy.yaml",
    "chars": 271,
    "preview": "actions:\n  - name: 'Test all targets'\n    container_image: 'ubuntu-20.04'\n    triggers:\n      push:\n        branches:\n  "
  },
  {
    "path": "config.json",
    "chars": 135,
    "preview": "{\n  \"auths\": {\n    \"ghcr.io\": {},\n    \"https://index.docker.io/v1/\": {}\n  },\n  \"credsStore\": \"desktop\",\n  \"experimental\""
  },
  {
    "path": "conformance-tests/icu4j/BUILD.bazel",
    "chars": 287,
    "preview": "load(\"@rules_java//java:defs.bzl\", \"java_binary\", \"java_import\")\n\njava_import(\n    name = \"icu4j\",\n    jars = [\"@icu4j_j"
  },
  {
    "path": "conformance-tests/icu4j/ICUConformanceTest.java",
    "chars": 16152,
    "preview": "import com.ibm.icu.text.PluralRules;\nimport com.ibm.icu.number.FormattedNumberRange;\nimport com.ibm.icu.number.NumberRan"
  },
  {
    "path": "crates/formatjs_cli/BUILD.bazel",
    "chars": 2750,
    "preview": "load(\"@rules_rust//rust:defs.bzl\", \"rust_binary\", \"rust_test\")\n\nexports_files(\n    [\n        \"Cargo.toml\",\n        \"src/"
  },
  {
    "path": "crates/formatjs_cli/Cargo.toml",
    "chars": 1270,
    "preview": "[package]\nname = \"formatjs_cli\"\nversion = \"0.1.14\"\nedition = \"2024\"\nauthors = [\"FormatJS Team\", \"Long Ho <holevietlong@g"
  },
  {
    "path": "crates/formatjs_cli/README.md",
    "chars": 9042,
    "preview": "# formatjs_cli\n\nA high-performance Rust-based command-line interface for FormatJS internationalization tools.\n\n## Overvi"
  },
  {
    "path": "crates/formatjs_cli/RELEASE.md",
    "chars": 7870,
    "preview": "# FormatJS Rust CLI - Release Guide\n\nThis document explains how to build release binaries for the FormatJS Rust CLI for "
  },
  {
    "path": "crates/formatjs_cli/build-multiplatform.sh",
    "chars": 2580,
    "preview": "#!/bin/bash\n# Build formatjs CLI for Darwin ARM64 and Linux x64\n# Usage: ./build-multiplatform.sh\n# Default: builds for "
  },
  {
    "path": "crates/formatjs_cli/platforms/BUILD.bazel",
    "chars": 454,
    "preview": "# Define custom platforms for cross-compilation\n\n# macOS ARM64 (Apple Silicon)\nplatform(\n    name = \"darwin_arm64\",\n    "
  },
  {
    "path": "crates/formatjs_cli/release.sh",
    "chars": 4766,
    "preview": "#!/bin/bash\n# Build release binaries for FormatJS Rust CLI\n# Supports: macOS (darwin) and Linux cross-compilation\nset -e"
  },
  {
    "path": "crates/formatjs_cli/src/compile.rs",
    "chars": 36129,
    "preview": "use anyhow::{Context, Result};\nuse serde_json::{Map, Value, json};\nuse std::collections::BTreeMap;\nuse std::path::PathBu"
  },
  {
    "path": "crates/formatjs_cli/src/compile_folder.rs",
    "chars": 13642,
    "preview": "use anyhow::{Context, Result};\nuse std::path::PathBuf;\nuse walkdir::WalkDir;\n\nuse crate::compile;\nuse crate::formatters:"
  },
  {
    "path": "crates/formatjs_cli/src/extract.rs",
    "chars": 55596,
    "preview": "use anyhow::{Context, Result};\nuse std::collections::{BTreeMap, HashMap};\nuse std::fs;\nuse std::io::{self, Write};\nuse s"
  },
  {
    "path": "crates/formatjs_cli/src/extractor.rs",
    "chars": 59535,
    "preview": "use anyhow::{Context, Result};\nuse formatjs_icu_messageformat_parser::{\n    Parser as IcuParser, ParserOptions, print_as"
  },
  {
    "path": "crates/formatjs_cli/src/formatters/crowdin.rs",
    "chars": 14808,
    "preview": "use serde_json::{json, Value};\nuse std::collections::BTreeMap;\n\nuse crate::extractor::MessageDescriptor;\n\n/// Crowdin fo"
  },
  {
    "path": "crates/formatjs_cli/src/formatters/default.rs",
    "chars": 2866,
    "preview": "use serde_json::Value;\nuse std::collections::BTreeMap;\n\nuse crate::extractor::MessageDescriptor;\n\n/// Default formatter:"
  },
  {
    "path": "crates/formatjs_cli/src/formatters/lokalise.rs",
    "chars": 3252,
    "preview": "use serde_json::{json, Value};\nuse std::collections::BTreeMap;\n\nuse crate::extractor::MessageDescriptor;\n\n/// Lokalise f"
  },
  {
    "path": "crates/formatjs_cli/src/formatters/mod.rs",
    "chars": 8957,
    "preview": "mod crowdin;\nmod default;\nmod lokalise;\nmod simple;\nmod smartling;\nmod transifex;\n\nuse anyhow::Result;\nuse serde_json::V"
  },
  {
    "path": "crates/formatjs_cli/src/formatters/simple.rs",
    "chars": 2456,
    "preview": "use serde_json::{json, Value};\nuse std::collections::BTreeMap;\n\nuse crate::extractor::MessageDescriptor;\n\n/// Simple for"
  },
  {
    "path": "crates/formatjs_cli/src/formatters/smartling.rs",
    "chars": 4329,
    "preview": "use serde_json::{json, Value};\nuse std::collections::BTreeMap;\n\nuse crate::extractor::MessageDescriptor;\n\n/// Smartling "
  },
  {
    "path": "crates/formatjs_cli/src/formatters/transifex.rs",
    "chars": 3297,
    "preview": "use serde_json::{json, Value};\nuse std::collections::BTreeMap;\n\nuse crate::extractor::MessageDescriptor;\n\n/// Transifex "
  },
  {
    "path": "crates/formatjs_cli/src/id_generator.rs",
    "chars": 13125,
    "preview": "/// ID generation for messages using interpolation patterns.\n///\n/// This module handles generating message IDs based on"
  },
  {
    "path": "crates/formatjs_cli/src/main.rs",
    "chars": 11758,
    "preview": "use anyhow::Result;\nuse clap::{Parser, Subcommand, ValueEnum};\nuse std::path::PathBuf;\n\n// Module declarations\npub mod c"
  },
  {
    "path": "crates/formatjs_cli/src/verify.rs",
    "chars": 33453,
    "preview": "use anyhow::{Context, Result};\nuse serde_json::Value;\nuse std::collections::{HashMap, HashSet};\nuse std::path::{Path, Pa"
  },
  {
    "path": "crates/icu_messageformat_parser/BENCHMARK.md",
    "chars": 4590,
    "preview": "# ICU MessageFormat Parser Benchmark Results\n\nThis document contains benchmark results for the Rust implementation of th"
  },
  {
    "path": "crates/icu_messageformat_parser/BUILD.bazel",
    "chars": 2417,
    "preview": "load(\"@rules_rust//rust:defs.bzl\", \"rust_binary\", \"rust_library\", \"rust_shared_library\", \"rust_test\")\nload(\"@rules_rust_"
  },
  {
    "path": "crates/icu_messageformat_parser/Cargo.toml",
    "chars": 1092,
    "preview": "[package]\nname = \"formatjs_icu_messageformat_parser\"\nversion = \"0.2.4\"\nedition = \"2024\"\nauthors = [\"FormatJS Team\", \"Lon"
  },
  {
    "path": "crates/icu_messageformat_parser/OPTIMIZATION_SUMMARY.md",
    "chars": 7185,
    "preview": "# Optimization Summary\n\n## What We Did\n\nWe implemented **Three Key Optimizations** to dramatically improve the Rust ICU "
  },
  {
    "path": "crates/icu_messageformat_parser/README.md",
    "chars": 5923,
    "preview": "# ICU MessageFormat Parser (Rust)\n\nA Rust implementation of the ICU MessageFormat parser, optimized for performance and "
  },
  {
    "path": "crates/icu_messageformat_parser/benches/parser_bench.rs",
    "chars": 2929,
    "preview": "//! Benchmark for the FormatJS ICU MessageFormat parser.\n//!\n//! Run with: `bazel run -c opt //crates/icu_messageformat_"
  },
  {
    "path": "crates/icu_messageformat_parser/date_time_pattern_generator.rs",
    "chars": 6048,
    "preview": "use crate::time_data_generated::TIME_DATA;\nuse icu::locale::Locale;\n\n/// Returns the best matching date time pattern if "
  },
  {
    "path": "crates/icu_messageformat_parser/error.rs",
    "chars": 8630,
    "preview": "use serde::Serialize;\n\n/// Location details for error reporting\n#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]\n"
  },
  {
    "path": "crates/icu_messageformat_parser/lib.rs",
    "chars": 1521,
    "preview": "pub mod date_time_pattern_generator;\npub mod error;\npub mod manipulator;\npub mod parser;\npub mod printer;\npub mod regex_"
  },
  {
    "path": "crates/icu_messageformat_parser/lib_wasm.rs",
    "chars": 2591,
    "preview": "//! WASM bindings for ICU MessageFormat Parser\n//!\n//! This module provides WebAssembly bindings using wasm-bindgen,\n//!"
  },
  {
    "path": "crates/icu_messageformat_parser/manipulator.rs",
    "chars": 29556,
    "preview": "//! AST manipulation utilities for MessageFormat elements\n//!\n//! This module provides utilities for transforming and an"
  },
  {
    "path": "crates/icu_messageformat_parser/parser.rs",
    "chars": 62634,
    "preview": "//! ICU MessageFormat parser implementation.\n//!\n//! This module provides a recursive descent parser for ICU MessageForm"
  },
  {
    "path": "crates/icu_messageformat_parser/printer.rs",
    "chars": 31852,
    "preview": "//! Printer module for converting AST back to ICU MessageFormat strings\n//!\n//! This module provides functionality to se"
  },
  {
    "path": "crates/icu_messageformat_parser/regex_generated.rs",
    "chars": 505,
    "preview": "// @generated from regex-gen.ts\nuse once_cell::sync::Lazy;\nuse regex::Regex;\n\n/// Unicode Space Separator regex pattern\n"
  },
  {
    "path": "crates/icu_messageformat_parser/time_data_generated.rs",
    "chars": 14437,
    "preview": "// @generated from time-data-gen.ts\nuse once_cell::sync::Lazy;\nuse std::collections::HashMap;\n\n/// Time format preferenc"
  },
  {
    "path": "crates/icu_messageformat_parser/types.rs",
    "chars": 18527,
    "preview": "use crate::error::Location;\nuse indexmap::IndexMap;\nuse serde::Serialize;\n\n// Re-export types from icu-skeleton-parser\np"
  },
  {
    "path": "crates/icu_skeleton_parser/BUILD.bazel",
    "chars": 638,
    "preview": "load(\"@rules_rust//rust:defs.bzl\", \"rust_library\", \"rust_test\")\n\nrust_library(\n    name = \"icu_skeleton_parser\",\n    src"
  },
  {
    "path": "crates/icu_skeleton_parser/Cargo.toml",
    "chars": 759,
    "preview": "[package]\nname = \"formatjs_icu_skeleton_parser\"\nversion = \"0.1.1\"\nedition = \"2024\"\nauthors = [\"FormatJS Team\", \"Long Ho "
  },
  {
    "path": "crates/icu_skeleton_parser/datetime_format_options.rs",
    "chars": 12030,
    "preview": "use serde::{Deserialize, Serialize};\n\n/// Represents the era format in date-time formatting\n/// Corresponds to Intl.Date"
  },
  {
    "path": "crates/icu_skeleton_parser/datetime_parser.rs",
    "chars": 21941,
    "preview": "use once_cell::sync::Lazy;\n\nuse crate::DateTimeFormatDay;\nuse crate::DateTimeFormatEra;\nuse crate::DateTimeFormatHour;\nu"
  },
  {
    "path": "crates/icu_skeleton_parser/lib.rs",
    "chars": 1037,
    "preview": "pub mod datetime_format_options;\npub mod datetime_parser;\npub mod number_format_options;\npub mod number_parser;\npub mod "
  },
  {
    "path": "crates/icu_skeleton_parser/number_format_options.rs",
    "chars": 19412,
    "preview": "use serde::{Deserialize, Serialize};\n\n#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\n#[serde(rename_all "
  },
  {
    "path": "crates/icu_skeleton_parser/number_parser.rs",
    "chars": 64670,
    "preview": "use once_cell::sync::Lazy;\n\nuse crate::ExtendedNumberFormatOptions;\nuse crate::NumberFormatNotation;\nuse crate::NumberFo"
  },
  {
    "path": "crates/icu_skeleton_parser/number_skeleton_token.rs",
    "chars": 6629,
    "preview": "use once_cell::sync::Lazy;\nuse regex::Regex;\nuse serde::{Deserialize, Serialize};\n\n/// NumberSkeletonToken represents a "
  },
  {
    "path": "docs/.nojekyll",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/BUILD.bazel",
    "chars": 8363,
    "preview": "load(\"@aspect_bazel_lib//lib:copy_to_bin.bzl\", \"copy_to_bin\")\nload(\"@aspect_rules_ts//ts:defs.bzl\", \"ts_project\")\nload(\""
  },
  {
    "path": "docs/README.md",
    "chars": 11719,
    "preview": "# FormatJS Documentation - Typesense Search Integration\n\nThis documentation site uses [Typesense](https://typesense.org)"
  },
  {
    "path": "docs/index.html",
    "chars": 309,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-w"
  },
  {
    "path": "docs/package.json",
    "chars": 183,
    "preview": "{\n  \"name\": \"docs\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"devDependencies\": {\n    \"intl-messag"
  },
  {
    "path": "docs/public/img/distribute-libs.excalidraw",
    "chars": 15499,
    "preview": "{\n  \"type\": \"excalidraw\",\n  \"version\": 2,\n  \"source\": \"https://excalidraw.com\",\n  \"elements\": [\n    {\n      \"id\": \"lzjFC"
  },
  {
    "path": "docs/public/img/polyfills.excalidraw",
    "chars": 24553,
    "preview": "{\n  \"type\": \"excalidraw\",\n  \"version\": 2,\n  \"source\": \"https://app.excalidraw.com\",\n  \"elements\": [\n    {\n      \"type\": "
  },
  {
    "path": "docs/public/img/simple-workflow.excalidraw",
    "chars": 13407,
    "preview": "{\n  \"type\": \"excalidraw\",\n  \"version\": 2,\n  \"source\": \"https://excalidraw.com\",\n  \"elements\": [\n    {\n      \"type\": \"rec"
  },
  {
    "path": "docs/public/img/workflow.excalidraw",
    "chars": 15092,
    "preview": "{\n  \"type\": \"excalidraw\",\n  \"version\": 2,\n  \"source\": \"https://excalidraw.com\",\n  \"elements\": [\n    {\n      \"id\": \"Oud-E"
  },
  {
    "path": "docs/scripts/build-typesense-index.ts",
    "chars": 7287,
    "preview": "#!/usr/bin/env node\nimport {readFileSync, writeFileSync, mkdirSync} from 'fs'\nimport {join, relative, dirname} from 'pat"
  },
  {
    "path": "docs/scripts/extract-metadata.ts",
    "chars": 3699,
    "preview": "#!/usr/bin/env node\nimport {readFileSync, writeFileSync, mkdirSync} from 'fs'\nimport {join, dirname} from 'path'\nimport "
  },
  {
    "path": "docs/scripts/upload-typesense-index.ts",
    "chars": 4412,
    "preview": "#!/usr/bin/env node\nimport {readFileSync} from 'fs'\nimport Typesense from 'typesense'\nimport minimist from 'minimist'\n\nc"
  },
  {
    "path": "docs/src/components/Admonition.tsx",
    "chars": 1480,
    "preview": "import * as React from 'react'\nimport {Alert, AlertDescription, AlertTitle} from './ui/alert'\nimport {Info, Lightbulb, A"
  },
  {
    "path": "docs/src/components/Breadcrumbs.tsx",
    "chars": 1956,
    "preview": "import * as React from 'react'\nimport {usePageContext} from 'vike-react/usePageContext'\nimport {\n  Breadcrumb,\n  Breadcr"
  },
  {
    "path": "docs/src/components/IcuEditor.tsx",
    "chars": 4434,
    "preview": "import * as React from 'react'\nimport {useEffect, useState} from 'react'\nimport {Input} from './ui/input'\nimport IntlMes"
  },
  {
    "path": "docs/src/components/Layout.tsx",
    "chars": 1970,
    "preview": "import * as React from 'react'\nimport {useState} from 'react'\nimport {Menu} from 'lucide-react'\nimport {Button} from './"
  },
  {
    "path": "docs/src/components/LiveCodeBlock.tsx",
    "chars": 7073,
    "preview": "import * as React from 'react'\nimport {LiveProvider, LiveEditor, LiveError, LivePreview} from 'react-live'\nimport {\n  Ac"
  },
  {
    "path": "docs/src/components/MDXComponents.tsx",
    "chars": 6286,
    "preview": "import * as React from 'react'\nimport type {MDXProvider} from '@mdx-js/react'\nimport Tabs from '../theme/Tabs'\nimport Ta"
  },
  {
    "path": "docs/src/components/SearchBar.tsx",
    "chars": 10917,
    "preview": "import * as React from 'react'\nimport {useState, useEffect, useRef, useCallback} from 'react'\nimport {navigate} from 'vi"
  },
  {
    "path": "docs/src/components/Sidebar.tsx",
    "chars": 1823,
    "preview": "import * as React from 'react'\nimport {usePageContext} from 'vike-react/usePageContext'\nimport {Separator} from './ui/se"
  },
  {
    "path": "docs/src/components/home/BrowserSection.tsx",
    "chars": 1506,
    "preview": "import * as React from 'react'\n\nexport default function BrowserSection(): React.ReactNode {\n  return (\n    <div classNam"
  },
  {
    "path": "docs/src/components/home/FeaturesSection.tsx",
    "chars": 9501,
    "preview": "import * as React from 'react'\n\nexport default function FeaturesSection(): React.ReactNode {\n  return (\n    <div classNa"
  },
  {
    "path": "docs/src/components/home/HeroSection.tsx",
    "chars": 9987,
    "preview": "import * as React from 'react'\nimport {\n  defineMessage,\n  IntlProvider,\n  type MessageDescriptor,\n  useIntl,\n} from 're"
  },
  {
    "path": "docs/src/components/home/HomeFooter.tsx",
    "chars": 3164,
    "preview": "import * as React from 'react'\nimport {ExternalLink} from 'lucide-react'\n\nexport default function HomeFooter(): React.Re"
  },
  {
    "path": "docs/src/components/home/HomeHeader.tsx",
    "chars": 4022,
    "preview": "import * as React from 'react'\nimport {Menu as MenuIcon, ExternalLink} from 'lucide-react'\nimport {\n  DropdownMenu,\n  Dr"
  },
  {
    "path": "docs/src/components/home/TrustedBySection.tsx",
    "chars": 1313,
    "preview": "import * as React from 'react'\n\nexport default function TrustedBySection(): React.ReactNode {\n  return (\n    <div classN"
  },
  {
    "path": "docs/src/components/ui/accordion.tsx",
    "chars": 2824,
    "preview": "import * as React from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\n\nimport {cn} from '../../"
  },
  {
    "path": "docs/src/components/ui/alert.tsx",
    "chars": 1798,
    "preview": "import * as React from 'react'\nimport {cva, type VariantProps} from 'class-variance-authority'\n\nimport {cn} from '../../"
  },
  {
    "path": "docs/src/components/ui/breadcrumb.tsx",
    "chars": 4423,
    "preview": "import * as React from 'react'\nimport {Slot} from '@radix-ui/react-slot'\n\nimport {cn} from '../../lib/utils'\n\nconst Brea"
  },
  {
    "path": "docs/src/components/ui/button.tsx",
    "chars": 2305,
    "preview": "import * as React from 'react'\nimport {Slot} from '@radix-ui/react-slot'\nimport {cva, type VariantProps} from 'class-var"
  },
  {
    "path": "docs/src/components/ui/command.tsx",
    "chars": 6353,
    "preview": "import * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\n\nimport {cn} from '../../lib/ut"
  },
  {
    "path": "docs/src/components/ui/dialog.tsx",
    "chars": 5074,
    "preview": "import * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport {X} from 'lucide-react'\n"
  },
  {
    "path": "docs/src/components/ui/dropdown-menu.tsx",
    "chars": 10276,
    "preview": "import * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\n\nimport {cn} from "
  },
  {
    "path": "docs/src/components/ui/input.tsx",
    "chars": 920,
    "preview": "import * as React from 'react'\n\nimport {cn} from '../../lib/utils'\n\nexport interface InputProps extends React.InputHTMLA"
  },
  {
    "path": "docs/src/components/ui/navigation-menu.tsx",
    "chars": 6544,
    "preview": "import * as React from 'react'\nimport * as NavigationMenuPrimitive from '@radix-ui/react-navigation-menu'\nimport {cva} f"
  },
  {
    "path": "docs/src/components/ui/popover.tsx",
    "chars": 1484,
    "preview": "import * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport {cn} from '../../lib/"
  },
  {
    "path": "docs/src/components/ui/separator.tsx",
    "chars": 931,
    "preview": "import * as React from 'react'\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\n\nimport {cn} from '../../"
  },
  {
    "path": "docs/src/components/ui/sheet.tsx",
    "chars": 5784,
    "preview": "import * as React from 'react'\nimport * as SheetPrimitive from '@radix-ui/react-dialog'\nimport {cva, type VariantProps} "
  },
  {
    "path": "docs/src/components/ui/tabs.tsx",
    "chars": 2411,
    "preview": "import * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\n\nimport {cn} from '../../lib/utils'"
  },
  {
    "path": "docs/src/docs/core-concepts/basic-internationalization-principles.mdx",
    "chars": 3396,
    "preview": "## What Is Internationalization and Why Does It Matter?\n\nInternationalized software supports the languages and cultural "
  },
  {
    "path": "docs/src/docs/core-concepts/icu-syntax.mdx",
    "chars": 16129,
    "preview": "If you are translating text you'll need a way for your translators to express the subtleties of spelling, grammar, and c"
  },
  {
    "path": "docs/src/docs/getting-started/application-workflow.mdx",
    "chars": 2887,
    "preview": "While our [Installation](/docs/getting-started/installation) guide can help you get started, this guide gives you an ove"
  },
  {
    "path": "docs/src/docs/getting-started/installation.mdx",
    "chars": 6848,
    "preview": "formatjs is a set of libraries that help you setup internationalization in any project whether it's React or not.\n\n## In"
  },
  {
    "path": "docs/src/docs/getting-started/message-declaration.mdx",
    "chars": 3017,
    "preview": "While you can declare your messages using only `id`s, we highly recommend declaring `defaultMessage`s inline along with "
  },
  {
    "path": "docs/src/docs/getting-started/message-distribution.mdx",
    "chars": 4813,
    "preview": "Now that you've declared your messages, extracted them, sent them to your translation vendor and they have given you bac"
  },
  {
    "path": "docs/src/docs/getting-started/message-extraction.mdx",
    "chars": 8319,
    "preview": "Now that you've declared some messages, it's time to extract them.\n\n## Installation\n\n<Tabs\ngroupId=\"npm\"\ndefaultValue=\"n"
  },
  {
    "path": "docs/src/docs/guides/advanced-usage.mdx",
    "chars": 2245,
    "preview": "`react-intl` is optimized for both runtime & compile time rendering. Below are a few guidelines you can follow if you ha"
  },
  {
    "path": "docs/src/docs/guides/bundler-plugins.mdx",
    "chars": 5496,
    "preview": "Now that you've had a working pipeline. It's time to dive deeper on how to optimize the build with `formatjs`. From [Mes"
  },
  {
    "path": "docs/src/docs/guides/develop.mdx",
    "chars": 2922,
    "preview": "Aside from a strong focus on facilitating i18n production pipeline, `formatjs` also aims to improve i18n DevEx with our "
  },
  {
    "path": "docs/src/docs/guides/distribute-libraries.mdx",
    "chars": 4494,
    "preview": "In larger scale applications/monorepos, not all components/libraries live within the same repo/project and they might ge"
  },
  {
    "path": "docs/src/docs/guides/migrate-from-i18next.mdx",
    "chars": 6797,
    "preview": "This guide helps you migrate from [i18next](https://www.i18next.com/) / [react-i18next](https://react.i18next.com/) to F"
  },
  {
    "path": "docs/src/docs/guides/migrate-from-lingui.mdx",
    "chars": 6952,
    "preview": "This guide helps you migrate from [Lingui](https://lingui.dev/) to FormatJS / `react-intl`. Both libraries use ICU Messa"
  },
  {
    "path": "docs/src/docs/guides/nextjs-app-router.mdx",
    "chars": 7170,
    "preview": "This guide covers using `react-intl` with the Next.js App Router and React Server Components (RSC). The key challenge is"
  },
  {
    "path": "docs/src/docs/guides/performance.mdx",
    "chars": 6926,
    "preview": "`react-intl` and the FormatJS ecosystem are designed for high-performance i18n. This guide consolidates all the techniqu"
  },
  {
    "path": "docs/src/docs/guides/react-native-hermes.mdx",
    "chars": 9296,
    "preview": "This guide covers setting up FormatJS polyfills for React Native with the Hermes JavaScript engine. Hermes ships with pa"
  },
  {
    "path": "docs/src/docs/guides/runtime-requirements.mdx",
    "chars": 2769,
    "preview": "## Browser\n\n<Admonition type=\"info\" title=\"Browser Support\">\n  We support **IE11** & **2 most recent versions of Edge, C"
  },
  {
    "path": "docs/src/docs/guides/testing-with-react-intl.mdx",
    "chars": 10051,
    "preview": "## `Intl` APIs requirements\n\nReact Intl uses the built-in [`Intl` APIs](https://mdn.io/intl) in JavaScript. Make sure yo"
  },
  {
    "path": "docs/src/docs/guides/wrapper-components.mdx",
    "chars": 14306,
    "preview": "# Creating Wrapper Components with Auto ID Generation\n\nA common pattern in large applications is to create wrapper compo"
  },
  {
    "path": "docs/src/docs/icu-messageformat-parser.mdx",
    "chars": 2759,
    "preview": "Parses [ICU Message strings](https://unicode-org.github.io/icu/userguide/format_parse/messages) into an AST via JavaScri"
  },
  {
    "path": "docs/src/docs/intl-messageformat.mdx",
    "chars": 11861,
    "preview": "Formats ICU Message strings with number, date, plural, and select placeholders to create localized messages.\n\n[![npm Ver"
  },
  {
    "path": "docs/src/docs/intl.mdx",
    "chars": 16737,
    "preview": "This library contains core intl API that is used by `react-intl`.\n\n## Installation\n\n<Tabs\ngroupId=\"npm\"\ndefaultValue=\"np"
  },
  {
    "path": "docs/src/docs/polyfills/intl-datetimeformat.mdx",
    "chars": 9026,
    "preview": "A spec-compliant polyfill for Intl.DateTimeFormat fully tested by the [official ECMAScript Conformance test suite](https"
  },
  {
    "path": "docs/src/docs/polyfills/intl-displaynames.mdx",
    "chars": 6227,
    "preview": "A polyfill for [`Intl.DisplayNames`](https://tc39.es/proposal-intl-displaynames).\n\n[![npm Version](https://img.shields.i"
  },
  {
    "path": "docs/src/docs/polyfills/intl-durationformat.mdx",
    "chars": 5134,
    "preview": "A spec-compliant polyfill for Intl.DurationFormat\n\n[![npm Version](https://img.shields.io/npm/v/@formatjs/intl-durationf"
  },
  {
    "path": "docs/src/docs/polyfills/intl-getcanonicallocales.mdx",
    "chars": 1806,
    "preview": "A spec-compliant polyfill/ponyfill for `Intl.getCanonicalLocales` tested by the [official ECMAScript Conformance test su"
  },
  {
    "path": "docs/src/docs/polyfills/intl-listformat.mdx",
    "chars": 4783,
    "preview": "A spec-compliant polyfill for Intl.ListFormat fully tested by the [official ECMAScript Conformance test suite](https://g"
  },
  {
    "path": "docs/src/docs/polyfills/intl-locale.mdx",
    "chars": 4707,
    "preview": "A spec-compliant polyfill/ponyfill for Intl.Locale tested by the [official ECMAScript Conformance test suite](https://gi"
  },
  {
    "path": "docs/src/docs/polyfills/intl-localematcher.mdx",
    "chars": 1300,
    "preview": "A spec-compliant ponyfill for [Intl.LocaleMatcher](https://github.com/tc39/proposal-intl-localematcher). Since this is o"
  },
  {
    "path": "docs/src/docs/polyfills/intl-numberformat.mdx",
    "chars": 9278,
    "preview": "A polyfill for ESNext [`Intl.NumberFormat`][numberformat] and [`Number.prototype.toLocaleString`][tolocalestring].\n\n[num"
  },
  {
    "path": "docs/src/docs/polyfills/intl-pluralrules.mdx",
    "chars": 4692,
    "preview": "A spec-compliant polyfill for [`Intl.PluralRules`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glo"
  },
  {
    "path": "docs/src/docs/polyfills/intl-relativetimeformat.mdx",
    "chars": 7630,
    "preview": "A spec-compliant polyfill for Intl.RelativeTimeFormat fully tested by the [official ECMAScript Conformance test suite](h"
  },
  {
    "path": "docs/src/docs/polyfills/intl-segmenter.mdx",
    "chars": 5858,
    "preview": "A polyfill for [`Intl.Segmenter`](https://tc39.es/proposal-intl-segmenter).\n\n[![npm Version](https://img.shields.io/npm/"
  },
  {
    "path": "docs/src/docs/polyfills/intl-supportedvaluesof.mdx",
    "chars": 1787,
    "preview": "A spec-compliant polyfill/ponyfill for `Intl.supportedValuesOf`.\n\n[![npm Version](https://img.shields.io/npm/v/@formatjs"
  },
  {
    "path": "docs/src/docs/polyfills.mdx",
    "chars": 1367,
    "preview": "One of our goals is to provide developers with access to newest ECMA-402 Intl APIs. Therefore, FormatJS suite also provi"
  },
  {
    "path": "docs/src/docs/react-intl/api.mdx",
    "chars": 21019,
    "preview": "There are a few API layers that React Intl provides and is built on. When using React Intl you'll be interacting with it"
  },
  {
    "path": "docs/src/docs/react-intl/components.mdx",
    "chars": 24461,
    "preview": "React Intl has a set of React components that provide a declarative way to setup an i18n context and format dates, numbe"
  },
  {
    "path": "docs/src/docs/react-intl/upgrade-guide-10.x.mdx",
    "chars": 2199,
    "preview": "## Breaking API Changes\n\n### `injectIntl` HOC removed\n\nThe `injectIntl` higher-order component has been removed. Use the"
  },
  {
    "path": "docs/src/docs/react-intl/upgrade-guide-2.x.mdx",
    "chars": 10214,
    "preview": "## Use React 0.14 or 15\n\nReact Intl v2 has a peer dependency on `react@^0.14.0 || ^15.0.0-0` and now takes advantage of "
  },
  {
    "path": "docs/src/docs/react-intl/upgrade-guide-3.x.mdx",
    "chars": 13663,
    "preview": "## Breaking API Changes\n\n- `addLocaleData` has been removed. See [Migrate to using native Intl APIs](#migrate-to-using-n"
  },
  {
    "path": "docs/src/docs/react-intl/upgrade-guide-4.x.mdx",
    "chars": 2007,
    "preview": "## Breaking API Changes\n\n- All tags specified must have corresponding values and will throw error if it's missing, e.g:\n"
  },
  {
    "path": "docs/src/docs/react-intl/upgrade-guide-5.x.mdx",
    "chars": 1763,
    "preview": "## Breaking API Changes\n\n- Rich text formatting callback function is no longer variadic.\n\nBefore:\n\n```tsx\nnew IntlMessag"
  },
  {
    "path": "docs/src/docs/react-intl/upgrade-guide-6.x.mdx",
    "chars": 1054,
    "preview": "## Breaking API Changes\n\n### React 18 type fixes\n\n`react-intl` v6 fixes type compatibility issues with React 18. If you "
  },
  {
    "path": "docs/src/docs/react-intl/upgrade-guide-7.x.mdx",
    "chars": 1392,
    "preview": "## Breaking API Changes\n\n### Polyfill packages removed from dependencies\n\n`@formatjs/intl-displaynames` and `@formatjs/i"
  },
  {
    "path": "docs/src/docs/react-intl/upgrade-guide-8.x.mdx",
    "chars": 2177,
    "preview": "## Breaking API Changes\n\n### React 18 and below no longer supported\n\n`react-intl` v8 requires React 19. If you are using"
  },
  {
    "path": "docs/src/docs/react-intl.mdx",
    "chars": 14403,
    "preview": "[![npm Version](https://img.shields.io/npm/v/react-intl.svg?style=flat-square)](https://www.npmjs.org/package/react-intl"
  },
  {
    "path": "docs/src/docs/svelte-intl.mdx",
    "chars": 5750,
    "preview": "This library provides FormatJS internationalization bindings for Svelte 5.\n\n## Installation\n\n<Tabs\ngroupId=\"npm\"\ndefault"
  },
  {
    "path": "docs/src/docs/tooling/babel-plugin.mdx",
    "chars": 6140,
    "preview": "Process string messages for translation from modules that use react-intl, specifically:\n\n- Parse and verify that message"
  },
  {
    "path": "docs/src/docs/tooling/bazel.mdx",
    "chars": 18023,
    "preview": "Bazel rules for [FormatJS](https://formatjs.io/) - Internationalize your web apps with Bazel build integration.\n\n## Feat"
  },
  {
    "path": "docs/src/docs/tooling/cli.mdx",
    "chars": 21176,
    "preview": "## Installation\n\n<Tabs\ngroupId=\"npm\"\ndefaultValue=\"npm\"\nvalues={[\n{label: 'npm', value: 'npm'},\n{label: 'yarn', value: '"
  },
  {
    "path": "docs/src/docs/tooling/linter.mdx",
    "chars": 20541,
    "preview": "This eslint plugin allows you to enforce certain rules in your ICU message.\n\n## Usage\n\n<Tabs\ngroupId=\"npm\"\ndefaultValue="
  },
  {
    "path": "docs/src/docs/tooling/rust-icu-messageformat-parser.mdx",
    "chars": 6641,
    "preview": "---\ntitle: ICU MessageFormat Parser (Rust)\n---\n\n## Overview\n\nA high-performance Rust implementation of the ICU MessageFo"
  },
  {
    "path": "docs/src/docs/tooling/rust-icu-skeleton-parser.mdx",
    "chars": 9303,
    "preview": "---\ntitle: ICU Skeleton Parser (Rust)\n---\n\n## Overview\n\nA high-performance Rust implementation of the ICU number and dat"
  },
  {
    "path": "docs/src/docs/tooling/swc-plugin.mdx",
    "chars": 5458,
    "preview": "Process string messages for translation from modules that use react-intl, specifically:\n\n- Parse and verify that message"
  },
  {
    "path": "docs/src/docs/tooling/ts-transformer.mdx",
    "chars": 8522,
    "preview": "[![npm version](https://badgen.net/npm/v/@formatjs/ts-transformer)](https://badgen.net/npm/v/@formatjs/ts-transformer)\n\n"
  },
  {
    "path": "docs/src/docs/tooling/unplugin.mdx",
    "chars": 4840,
    "preview": "Universal build plugin for FormatJS — supports **Vite**, **Webpack**, **Rollup**, **esbuild**, and **Rspack** with one c"
  },
  {
    "path": "docs/src/docs/vue-intl.mdx",
    "chars": 3119,
    "preview": "This library contains our plugin for Vue.\n\n## Installation\n\n<Tabs\ngroupId=\"npm\"\ndefaultValue=\"npm\"\nvalues={[\n{label: 'np"
  },
  {
    "path": "docs/src/docs-metadata.generated.json",
    "chars": 11382,
    "preview": "{\n  \"core-concepts/basic-internationalization-principles\": {\n    \"title\": \"Basic Internationalization Principles\",\n    \""
  },
  {
    "path": "docs/src/lang/strings_cs-CZ.json",
    "chars": 189,
    "preview": "{\n  \"demo\": \"{takenDate, date, long} {name} {numPhotos, plural,=0 {nevyfotila} other {vyfotila} } {numPhotos, plural, =0"
  },
  {
    "path": "docs/src/lang/strings_de-DE.json",
    "chars": 207,
    "preview": "{\n  \"demo\": \"{name} {numPhotos, plural, =0 {hat am {takenDate, date, long} keine Fotos aufgenommen} =1 {nahm am {takenDa"
  },
  {
    "path": "docs/src/lang/strings_en-US.json",
    "chars": 124,
    "preview": "{\n  \"demo\": \"{name} took {numPhotos, plural, =0 {no photos} =1 {one photo} other {# photos}} on {takenDate, date, long}."
  },
  {
    "path": "docs/src/lang/strings_es-AR.json",
    "chars": 167,
    "preview": "{\n  \"demo\": \"El {takenDate, date, long}, {name} {numPhotos, plural, =0 {no} other {} } sacó {numPhotos, plural, =0 {ning"
  },
  {
    "path": "docs/src/lang/strings_fr-FR.json",
    "chars": 169,
    "preview": "{\n  \"demo\": \"Le {takenDate, date, long}, {name} {numPhotos, plural, =0 {n'a pas pris de photographie.} =1 {a pris une ph"
  },
  {
    "path": "docs/src/lang/strings_ja-JP.json",
    "chars": 126,
    "preview": "{\n  \"demo\": \"{name}は{takenDate, date, long}に{numPhotos, plural, =0 {1枚も写真を撮りませんでした。} =1 {1枚写真を撮りました。} other {#枚写真を撮りました。"
  }
]

// ... and 1442 more files (download for full content)

About this extraction

This page contains the full source code of the formatjs/formatjs GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1642 files (29.8 MB), approximately 4.0M tokens, and a symbol index with 2202 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!