From a19cda507e936006d048daa5d006bb91dc953e4c Mon Sep 17 00:00:00 2001
From: Eemeli Aro
Date: Wed, 31 Dec 2025 02:49:06 +0200
Subject: [PATCH 1/7] Publish all packages as ESM-only, via package.json
exports
---
.gitignore | 2 ++
.prettierignore | 2 --
eslint.config.mjs | 1 -
fluent-bundle/.gitignore | 2 --
fluent-bundle/.npmignore | 7 -------
fluent-bundle/esm/package.json | 3 ---
fluent-bundle/package.json | 17 ++++++++++------
fluent-bundle/src/index.ts | 10 ++++-----
fluent-bundle/tsconfig.json | 2 +-
fluent-dedent/.gitignore | 2 --
fluent-dedent/.npmignore | 7 -------
fluent-dedent/esm/package.json | 3 ---
fluent-dedent/package.json | 14 ++++++++-----
fluent-dedent/tsconfig.json | 2 +-
fluent-dom/.gitignore | 2 --
fluent-dom/.npmignore | 7 -------
fluent-dom/esm/package.json | 3 ---
fluent-dom/package.json | 18 +++++++++--------
fluent-dom/tsconfig.json | 2 +-
fluent-gecko/.gitignore | 1 -
fluent-gecko/src/fluent-react.js | 2 +-
fluent-gecko/src/fluent-syntax.js | 8 ++++----
fluent-langneg/.gitignore | 2 --
fluent-langneg/.npmignore | 7 -------
fluent-langneg/esm/package.json | 3 ---
fluent-langneg/package.json | 14 ++++++++-----
fluent-langneg/tsconfig.json | 2 +-
fluent-react/.gitignore | 2 --
fluent-react/.npmignore | 9 ---------
fluent-react/esm/package.json | 3 ---
fluent-react/package.json | 16 +++++++++------
fluent-react/src/index.ts | 6 +++---
fluent-react/src/localized.ts | 2 --
fluent-react/tsconfig.build.json | 2 +-
fluent-react/vendor/voidElementTags.js | 2 +-
fluent-sequence/.gitignore | 2 --
fluent-sequence/.npmignore | 7 -------
fluent-sequence/esm/package.json | 3 ---
fluent-sequence/package.json | 15 ++++++++------
fluent-sequence/tsconfig.build.json | 8 --------
fluent-sequence/tsconfig.json | 7 ++++++-
fluent-syntax/.gitignore | 2 --
fluent-syntax/.npmignore | 7 -------
fluent-syntax/esm/package.json | 3 ---
fluent-syntax/package.json | 19 +++++++++--------
fluent-syntax/src/index.ts | 4 ++--
fluent-syntax/tsconfig.json | 2 +-
package-lock.json | 9 ---------
package.json | 2 +-
rollup.config.mjs | 28 --------------------------
tools/fluentfmt.mjs | 7 +------
tools/format.mjs | 2 +-
tools/fuzz.mjs | 4 ++--
tools/parse.mjs | 4 ++--
tsconfig.base.json | 3 +--
55 files changed, 107 insertions(+), 218 deletions(-)
delete mode 100644 fluent-bundle/.gitignore
delete mode 100644 fluent-bundle/.npmignore
delete mode 100644 fluent-bundle/esm/package.json
delete mode 100644 fluent-dedent/.gitignore
delete mode 100644 fluent-dedent/.npmignore
delete mode 100644 fluent-dedent/esm/package.json
delete mode 100644 fluent-dom/.gitignore
delete mode 100644 fluent-dom/.npmignore
delete mode 100644 fluent-dom/esm/package.json
delete mode 100644 fluent-gecko/.gitignore
delete mode 100644 fluent-langneg/.gitignore
delete mode 100644 fluent-langneg/.npmignore
delete mode 100644 fluent-langneg/esm/package.json
delete mode 100644 fluent-react/.gitignore
delete mode 100644 fluent-react/.npmignore
delete mode 100644 fluent-react/esm/package.json
delete mode 100644 fluent-sequence/.gitignore
delete mode 100644 fluent-sequence/.npmignore
delete mode 100644 fluent-sequence/esm/package.json
delete mode 100644 fluent-sequence/tsconfig.build.json
delete mode 100644 fluent-syntax/.gitignore
delete mode 100644 fluent-syntax/.npmignore
delete mode 100644 fluent-syntax/esm/package.json
delete mode 100644 rollup.config.mjs
diff --git a/.gitignore b/.gitignore
index 20c62c8ea..c28424f5b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,8 @@ node_modules
html
.vscode
+/fluent-*/dist/
+
# Test coverage
.nyc_output
coverage
diff --git a/.prettierignore b/.prettierignore
index 195cca863..6b53b9882 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -4,8 +4,6 @@ html
coverage/
dist/
-esm/
-/fluent-*/index.js
/tools/**/*.ftl
/tools/**/*.json
diff --git a/eslint.config.mjs b/eslint.config.mjs
index 409194ea8..252cdd97d 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -10,7 +10,6 @@ export default [
"**/node_modules/",
"*/coverage/",
"*/dist/",
- "*/esm/",
"*/vendor/",
"fluent-*/index.js",
"html/",
diff --git a/fluent-bundle/.gitignore b/fluent-bundle/.gitignore
deleted file mode 100644
index 0bd1f3fc5..000000000
--- a/fluent-bundle/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-esm/
-/index.js
diff --git a/fluent-bundle/.npmignore b/fluent-bundle/.npmignore
deleted file mode 100644
index abad613ff..000000000
--- a/fluent-bundle/.npmignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.nyc_output
-coverage
-esm/.compiled
-src
-test
-makefile
-tsconfig.json
diff --git a/fluent-bundle/esm/package.json b/fluent-bundle/esm/package.json
deleted file mode 100644
index 3dbc1ca59..000000000
--- a/fluent-bundle/esm/package.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "type": "module"
-}
diff --git a/fluent-bundle/package.json b/fluent-bundle/package.json
index 730a4f357..362e570c4 100644
--- a/fluent-bundle/package.json
+++ b/fluent-bundle/package.json
@@ -2,6 +2,16 @@
"name": "@fluent/bundle",
"description": "Localization library for expressive translations.",
"version": "0.19.1",
+ "type": "module",
+ "exports": {
+ ".": "./dist/index.js",
+ "./ast": "./dist/ast.js",
+ "./builtins": "./dist/builtins.js",
+ "./package.json": "./package.json"
+ },
+ "files": [
+ "./dist/"
+ ],
"homepage": "https://projectfluent.org",
"author": "Mozilla ",
"license": "Apache-2.0",
@@ -15,9 +25,6 @@
"email": "stas@mozilla.com"
}
],
- "main": "./index.js",
- "module": "./esm/index.js",
- "types": "./esm/index.d.ts",
"repository": {
"type": "git",
"url": "https://github.com/projectfluent/fluent.js.git"
@@ -39,14 +46,12 @@
"parser"
],
"scripts": {
- "build": "tsc",
- "postbuild": "rollup -c ../rollup.config.mjs"
+ "build": "tsc"
},
"engines": {
"node": "^20.19 || ^22.12 || >=24"
},
"devDependencies": {
- "@fluent/dedent": "^0.5.0",
"temporal-polyfill": "^0.2.5"
}
}
diff --git a/fluent-bundle/src/index.ts b/fluent-bundle/src/index.ts
index 0470f9e56..726ccef86 100644
--- a/fluent-bundle/src/index.ts
+++ b/fluent-bundle/src/index.ts
@@ -6,14 +6,14 @@
*/
export type { Message } from "./ast.js";
-export { FluentBundle, TextTransform } from "./bundle.js";
+export { FluentBundle, type TextTransform } from "./bundle.js";
export { FluentResource } from "./resource.js";
export type { Scope } from "./scope.js";
export {
- FluentValue,
- FluentVariable,
- FluentType,
- FluentFunction,
+ type FluentValue,
+ type FluentVariable,
+ type FluentType,
+ type FluentFunction,
FluentNone,
FluentNumber,
FluentDateTime,
diff --git a/fluent-bundle/tsconfig.json b/fluent-bundle/tsconfig.json
index 1a76d9a43..ae18d140e 100644
--- a/fluent-bundle/tsconfig.json
+++ b/fluent-bundle/tsconfig.json
@@ -1,7 +1,7 @@
{
"extends": "../tsconfig.base.json",
"compilerOptions": {
- "outDir": "./esm",
+ "outDir": "./dist",
"rootDir": "./src"
},
"include": ["./src/**/*.ts"]
diff --git a/fluent-dedent/.gitignore b/fluent-dedent/.gitignore
deleted file mode 100644
index 0bd1f3fc5..000000000
--- a/fluent-dedent/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-esm/
-/index.js
diff --git a/fluent-dedent/.npmignore b/fluent-dedent/.npmignore
deleted file mode 100644
index abad613ff..000000000
--- a/fluent-dedent/.npmignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.nyc_output
-coverage
-esm/.compiled
-src
-test
-makefile
-tsconfig.json
diff --git a/fluent-dedent/esm/package.json b/fluent-dedent/esm/package.json
deleted file mode 100644
index 3dbc1ca59..000000000
--- a/fluent-dedent/esm/package.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "type": "module"
-}
diff --git a/fluent-dedent/package.json b/fluent-dedent/package.json
index 9f60cbd64..973e11994 100644
--- a/fluent-dedent/package.json
+++ b/fluent-dedent/package.json
@@ -2,6 +2,14 @@
"name": "@fluent/dedent",
"description": "A template literal tag for dedenting Fluent code",
"version": "0.5.0",
+ "type": "module",
+ "exports": {
+ ".": "./dist/index.js",
+ "./package.json": "./package.json"
+ },
+ "files": [
+ "./dist/"
+ ],
"homepage": "https://projectfluent.org",
"author": "Mozilla ",
"license": "Apache-2.0",
@@ -11,9 +19,6 @@
"email": "stas@mozilla.com"
}
],
- "main": "./index.js",
- "module": "./esm/index.js",
- "types": "./esm/index.d.ts",
"repository": {
"type": "git",
"url": "https://github.com/projectfluent/fluent.js.git"
@@ -24,8 +29,7 @@
"ftl"
],
"scripts": {
- "build": "tsc",
- "postbuild": "rollup -c ../rollup.config.mjs"
+ "build": "tsc"
},
"engines": {
"node": "^20.19 || ^22.12 || >=24"
diff --git a/fluent-dedent/tsconfig.json b/fluent-dedent/tsconfig.json
index 1c5501631..d3d83334d 100644
--- a/fluent-dedent/tsconfig.json
+++ b/fluent-dedent/tsconfig.json
@@ -1,7 +1,7 @@
{
"extends": "../tsconfig.base.json",
"compilerOptions": {
- "outDir": "./esm"
+ "outDir": "./dist"
},
"include": ["./src/**/*.ts"]
}
diff --git a/fluent-dom/.gitignore b/fluent-dom/.gitignore
deleted file mode 100644
index 0bd1f3fc5..000000000
--- a/fluent-dom/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-esm/
-/index.js
diff --git a/fluent-dom/.npmignore b/fluent-dom/.npmignore
deleted file mode 100644
index abad613ff..000000000
--- a/fluent-dom/.npmignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.nyc_output
-coverage
-esm/.compiled
-src
-test
-makefile
-tsconfig.json
diff --git a/fluent-dom/esm/package.json b/fluent-dom/esm/package.json
deleted file mode 100644
index 3dbc1ca59..000000000
--- a/fluent-dom/esm/package.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "type": "module"
-}
diff --git a/fluent-dom/package.json b/fluent-dom/package.json
index 315a853a1..b29bcebce 100644
--- a/fluent-dom/package.json
+++ b/fluent-dom/package.json
@@ -2,6 +2,15 @@
"name": "@fluent/dom",
"version": "0.10.2",
"description": "Fluent bindings for DOM",
+ "type": "module",
+ "exports": {
+ ".": "./dist/index.js",
+ "./overlay": "./dist/overlay.js",
+ "./package.json": "./package.json"
+ },
+ "files": [
+ "./dist/"
+ ],
"repository": {
"type": "git",
"url": "https://github.com/projectfluent/fluent.js.git"
@@ -18,9 +27,6 @@
"email": "stas@mozilla.com"
}
],
- "main": "./index.js",
- "module": "./esm/index.js",
- "types": "./esm/index.d.ts",
"keywords": [
"localization",
"l10n",
@@ -34,15 +40,11 @@
"format"
],
"scripts": {
- "build": "tsc",
- "postbuild": "rollup -c ../rollup.config.mjs --globals cached-iterable:CachedIterable"
+ "build": "tsc"
},
"engines": {
"node": "^20.19 || ^22.12 || >=24"
},
- "devDependencies": {
- "@fluent/bundle": "^0.19.0"
- },
"dependencies": {
"cached-iterable": "^0.3"
}
diff --git a/fluent-dom/tsconfig.json b/fluent-dom/tsconfig.json
index 0225d6717..e87ca5585 100644
--- a/fluent-dom/tsconfig.json
+++ b/fluent-dom/tsconfig.json
@@ -2,7 +2,7 @@
"extends": "../tsconfig.base.json",
"compilerOptions": {
"allowJs": true,
- "outDir": "./esm"
+ "outDir": "./dist"
},
"include": ["./src/**/*"]
}
diff --git a/fluent-gecko/.gitignore b/fluent-gecko/.gitignore
deleted file mode 100644
index 849ddff3b..000000000
--- a/fluent-gecko/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-dist/
diff --git a/fluent-gecko/src/fluent-react.js b/fluent-gecko/src/fluent-react.js
index e89b7fa18..c9ce83bd6 100644
--- a/fluent-gecko/src/fluent-react.js
+++ b/fluent-gecko/src/fluent-react.js
@@ -1 +1 @@
-export * from "../../fluent-react/esm/index.js";
+export * from "../../fluent-react/dist/index.js";
diff --git a/fluent-gecko/src/fluent-syntax.js b/fluent-gecko/src/fluent-syntax.js
index d63e165fb..f14334048 100644
--- a/fluent-gecko/src/fluent-syntax.js
+++ b/fluent-gecko/src/fluent-syntax.js
@@ -1,7 +1,7 @@
-import { FluentParser } from "../../fluent-syntax/esm/parser.js";
-import { FluentSerializer } from "../../fluent-syntax/esm/serializer.js";
-import { Visitor, Transformer } from "../../fluent-syntax/esm/visitor.js";
-import * as ast from "../../fluent-syntax/esm/ast.js";
+import { FluentParser } from "../../fluent-syntax/dist/parser.js";
+import { FluentSerializer } from "../../fluent-syntax/dist/serializer.js";
+import { Visitor, Transformer } from "../../fluent-syntax/dist/visitor.js";
+import * as ast from "../../fluent-syntax/dist/ast.js";
this.EXPORTED_SYMBOLS = [
...Object.keys(ast),
diff --git a/fluent-langneg/.gitignore b/fluent-langneg/.gitignore
deleted file mode 100644
index 0bd1f3fc5..000000000
--- a/fluent-langneg/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-esm/
-/index.js
diff --git a/fluent-langneg/.npmignore b/fluent-langneg/.npmignore
deleted file mode 100644
index abad613ff..000000000
--- a/fluent-langneg/.npmignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.nyc_output
-coverage
-esm/.compiled
-src
-test
-makefile
-tsconfig.json
diff --git a/fluent-langneg/esm/package.json b/fluent-langneg/esm/package.json
deleted file mode 100644
index 3dbc1ca59..000000000
--- a/fluent-langneg/esm/package.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "type": "module"
-}
diff --git a/fluent-langneg/package.json b/fluent-langneg/package.json
index 424f78105..34139c6a1 100644
--- a/fluent-langneg/package.json
+++ b/fluent-langneg/package.json
@@ -2,6 +2,14 @@
"name": "@fluent/langneg",
"description": "Language Negotiation API for Fluent",
"version": "0.7.0",
+ "type": "module",
+ "exports": {
+ ".": "./dist/index.js",
+ "./package.json": "./package.json"
+ },
+ "files": [
+ "./dist/"
+ ],
"homepage": "https://projectfluent.org",
"author": "Mozilla ",
"license": "Apache-2.0",
@@ -15,9 +23,6 @@
"email": "stas@mozilla.com"
}
],
- "main": "./index.js",
- "module": "./esm/index.js",
- "types": "./esm/index.d.ts",
"repository": {
"type": "git",
"url": "https://github.com/projectfluent/fluent.js.git"
@@ -32,8 +37,7 @@
"language-negotiation"
],
"scripts": {
- "build": "tsc",
- "postbuild": "rollup -c ../rollup.config.mjs"
+ "build": "tsc"
},
"engines": {
"node": "^20.19 || ^22.12 || >=24"
diff --git a/fluent-langneg/tsconfig.json b/fluent-langneg/tsconfig.json
index 1c5501631..d3d83334d 100644
--- a/fluent-langneg/tsconfig.json
+++ b/fluent-langneg/tsconfig.json
@@ -1,7 +1,7 @@
{
"extends": "../tsconfig.base.json",
"compilerOptions": {
- "outDir": "./esm"
+ "outDir": "./dist"
},
"include": ["./src/**/*.ts"]
}
diff --git a/fluent-react/.gitignore b/fluent-react/.gitignore
deleted file mode 100644
index 0bd1f3fc5..000000000
--- a/fluent-react/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-esm/
-/index.js
diff --git a/fluent-react/.npmignore b/fluent-react/.npmignore
deleted file mode 100644
index 1831c37ec..000000000
--- a/fluent-react/.npmignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.nyc_output
-coverage
-esm/.compiled
-example
-src
-test
-makefile
-compat_config.js
-tsconfig.json
diff --git a/fluent-react/esm/package.json b/fluent-react/esm/package.json
deleted file mode 100644
index 3dbc1ca59..000000000
--- a/fluent-react/esm/package.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "type": "module"
-}
diff --git a/fluent-react/package.json b/fluent-react/package.json
index c875883c3..ee36a5fdd 100644
--- a/fluent-react/package.json
+++ b/fluent-react/package.json
@@ -2,6 +2,15 @@
"name": "@fluent/react",
"description": "Fluent bindings for React",
"version": "0.15.2",
+ "type": "module",
+ "exports": {
+ ".": "./dist/index.js",
+ "./package.json": "./package.json"
+ },
+ "files": [
+ "./dist/",
+ "./vendor/"
+ ],
"homepage": "https://projectfluent.org",
"author": "Mozilla ",
"license": "Apache-2.0",
@@ -15,9 +24,6 @@
"email": "stas@mozilla.com"
}
],
- "main": "./index.js",
- "module": "./esm/index.js",
- "types": "./esm/index.d.ts",
"repository": {
"type": "git",
"url": "https://github.com/projectfluent/fluent.js.git"
@@ -41,8 +47,7 @@
"reactjs"
],
"scripts": {
- "build": "tsc -p ./tsconfig.build.json",
- "postbuild": "rollup -c ../rollup.config.mjs --globals @fluent/sequence:FluentSequence,cached-iterable:CachedIterable,react:React"
+ "build": "tsc -p ./tsconfig.build.json"
},
"engines": {
"node": "^20.19 || ^22.12 || >=24"
@@ -56,7 +61,6 @@
"react": ">=16.8.0"
},
"devDependencies": {
- "@fluent/bundle": "^0.19.0",
"@types/react": "^18.0.28",
"react": "^18.2.0",
"react-dom": "^18.2.0",
diff --git a/fluent-react/src/index.ts b/fluent-react/src/index.ts
index ccf11f45d..4842ce646 100644
--- a/fluent-react/src/index.ts
+++ b/fluent-react/src/index.ts
@@ -22,8 +22,8 @@ export { ReactLocalization } from "./localization.js";
export { LocalizationProvider } from "./provider.js";
export {
withLocalization,
- WithLocalizationProps,
+ type WithLocalizationProps,
} from "./with_localization.js";
-export { Localized, LocalizedProps } from "./localized.js";
-export { MarkupParser } from "./markup.js";
+export { Localized, type LocalizedProps } from "./localized.js";
+export type { MarkupParser } from "./markup.js";
export { useLocalization } from "./use_localization.js";
diff --git a/fluent-react/src/localized.ts b/fluent-react/src/localized.ts
index c4c59f263..6bc8e5509 100644
--- a/fluent-react/src/localized.ts
+++ b/fluent-react/src/localized.ts
@@ -75,5 +75,3 @@ export function Localized(props: LocalizedProps): ReactElement {
return l10n.getElement(source, id, { attrs, vars, elems });
}
-
-export default Localized;
diff --git a/fluent-react/tsconfig.build.json b/fluent-react/tsconfig.build.json
index 1c5501631..d3d83334d 100644
--- a/fluent-react/tsconfig.build.json
+++ b/fluent-react/tsconfig.build.json
@@ -1,7 +1,7 @@
{
"extends": "../tsconfig.base.json",
"compilerOptions": {
- "outDir": "./esm"
+ "outDir": "./dist"
},
"include": ["./src/**/*.ts"]
}
diff --git a/fluent-react/vendor/voidElementTags.js b/fluent-react/vendor/voidElementTags.js
index c0d36dbe7..3a3c7c24a 100644
--- a/fluent-react/vendor/voidElementTags.js
+++ b/fluent-react/vendor/voidElementTags.js
@@ -5,7 +5,7 @@
* LICENSE file in this directory.
*/
-import omittedCloseTags from "./omittedCloseTags";
+import omittedCloseTags from "./omittedCloseTags.js";
// For HTML, certain tags cannot have children. This has the same purpose as
// `omittedCloseTags` except that `menuitem` should still have its closing tag.
diff --git a/fluent-sequence/.gitignore b/fluent-sequence/.gitignore
deleted file mode 100644
index 0bd1f3fc5..000000000
--- a/fluent-sequence/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-esm/
-/index.js
diff --git a/fluent-sequence/.npmignore b/fluent-sequence/.npmignore
deleted file mode 100644
index abad613ff..000000000
--- a/fluent-sequence/.npmignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.nyc_output
-coverage
-esm/.compiled
-src
-test
-makefile
-tsconfig.json
diff --git a/fluent-sequence/esm/package.json b/fluent-sequence/esm/package.json
deleted file mode 100644
index 3dbc1ca59..000000000
--- a/fluent-sequence/esm/package.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "type": "module"
-}
diff --git a/fluent-sequence/package.json b/fluent-sequence/package.json
index 8c14f88e7..80e4cb0bf 100644
--- a/fluent-sequence/package.json
+++ b/fluent-sequence/package.json
@@ -2,6 +2,14 @@
"name": "@fluent/sequence",
"description": "Manage ordered sequences of FluentBundles",
"version": "0.8.0",
+ "type": "module",
+ "exports": {
+ ".": "./dist/index.js",
+ "./package.json": "./package.json"
+ },
+ "files": [
+ "./dist/"
+ ],
"homepage": "https://projectfluent.org",
"author": "Mozilla ",
"license": "Apache-2.0",
@@ -15,9 +23,6 @@
"email": "stas@mozilla.com"
}
],
- "main": "./index.js",
- "module": "./esm/index.js",
- "types": "./esm/index.d.ts",
"repository": {
"type": "git",
"url": "https://github.com/projectfluent/fluent.js.git"
@@ -27,14 +32,12 @@
"ftl"
],
"scripts": {
- "build": "tsc -p ./tsconfig.build.json",
- "postbuild": "rollup -c ../rollup.config.mjs"
+ "build": "tsc"
},
"engines": {
"node": "^20.19 || ^22.12 || >=24"
},
"devDependencies": {
- "@fluent/bundle": "^0.19.0",
"cached-iterable": "^0.3.0"
},
"peerDependencies": {
diff --git a/fluent-sequence/tsconfig.build.json b/fluent-sequence/tsconfig.build.json
deleted file mode 100644
index 1a76d9a43..000000000
--- a/fluent-sequence/tsconfig.build.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "extends": "../tsconfig.base.json",
- "compilerOptions": {
- "outDir": "./esm",
- "rootDir": "./src"
- },
- "include": ["./src/**/*.ts"]
-}
diff --git a/fluent-sequence/tsconfig.json b/fluent-sequence/tsconfig.json
index 3c43903cf..ae18d140e 100644
--- a/fluent-sequence/tsconfig.json
+++ b/fluent-sequence/tsconfig.json
@@ -1,3 +1,8 @@
{
- "extends": "../tsconfig.json"
+ "extends": "../tsconfig.base.json",
+ "compilerOptions": {
+ "outDir": "./dist",
+ "rootDir": "./src"
+ },
+ "include": ["./src/**/*.ts"]
}
diff --git a/fluent-syntax/.gitignore b/fluent-syntax/.gitignore
deleted file mode 100644
index 0bd1f3fc5..000000000
--- a/fluent-syntax/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-esm/
-/index.js
diff --git a/fluent-syntax/.npmignore b/fluent-syntax/.npmignore
deleted file mode 100644
index abad613ff..000000000
--- a/fluent-syntax/.npmignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.nyc_output
-coverage
-esm/.compiled
-src
-test
-makefile
-tsconfig.json
diff --git a/fluent-syntax/esm/package.json b/fluent-syntax/esm/package.json
deleted file mode 100644
index 3dbc1ca59..000000000
--- a/fluent-syntax/esm/package.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "type": "module"
-}
diff --git a/fluent-syntax/package.json b/fluent-syntax/package.json
index ccca0fb21..977340c99 100644
--- a/fluent-syntax/package.json
+++ b/fluent-syntax/package.json
@@ -2,6 +2,16 @@
"name": "@fluent/syntax",
"description": "AST and parser for Fluent",
"version": "0.19.0",
+ "type": "module",
+ "exports": {
+ ".": "./dist/index.js",
+ "./ast": "./dist/ast.js",
+ "./stream": "./dist/stream.js",
+ "./package.json": "./package.json"
+ },
+ "files": [
+ "./dist/"
+ ],
"homepage": "https://projectfluent.org",
"author": "Mozilla ",
"license": "Apache-2.0",
@@ -15,9 +25,6 @@
"email": "stas@mozilla.com"
}
],
- "main": "./index.js",
- "module": "./esm/index.js",
- "types": "./esm/index.d.ts",
"repository": {
"type": "git",
"url": "https://github.com/projectfluent/fluent.js.git"
@@ -41,13 +48,9 @@
"parser"
],
"scripts": {
- "build": "tsc",
- "postbuild": "rollup -c ../rollup.config.mjs"
+ "build": "tsc"
},
"engines": {
"node": "^20.19 || ^22.12 || >=24"
- },
- "devDependencies": {
- "@fluent/dedent": "^0.5.0"
}
}
diff --git a/fluent-syntax/src/index.ts b/fluent-syntax/src/index.ts
index ebeb2ff1f..fa0432052 100644
--- a/fluent-syntax/src/index.ts
+++ b/fluent-syntax/src/index.ts
@@ -10,9 +10,9 @@ export { Transformer, Visitor } from "./visitor.js";
export {
FluentParser,
- FluentParserOptions,
+ type FluentParserOptions,
FluentSerializer,
- FluentSerializerOptions,
+ type FluentSerializerOptions,
};
/** @category Parse */
diff --git a/fluent-syntax/tsconfig.json b/fluent-syntax/tsconfig.json
index 1c5501631..d3d83334d 100644
--- a/fluent-syntax/tsconfig.json
+++ b/fluent-syntax/tsconfig.json
@@ -1,7 +1,7 @@
{
"extends": "../tsconfig.base.json",
"compilerOptions": {
- "outDir": "./esm"
+ "outDir": "./dist"
},
"include": ["./src/**/*.ts"]
}
diff --git a/package-lock.json b/package-lock.json
index b640ec3de..d679614b5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -39,7 +39,6 @@
"version": "0.19.1",
"license": "Apache-2.0",
"devDependencies": {
- "@fluent/dedent": "^0.5.0",
"temporal-polyfill": "^0.2.5"
},
"engines": {
@@ -61,9 +60,6 @@
"dependencies": {
"cached-iterable": "^0.3"
},
- "devDependencies": {
- "@fluent/bundle": "^0.19.0"
- },
"engines": {
"node": "^20.19 || ^22.12 || >=24"
}
@@ -93,7 +89,6 @@
"cached-iterable": "^0.3.0"
},
"devDependencies": {
- "@fluent/bundle": "^0.19.0",
"@types/react": "^18.0.28",
"react": "^18.2.0",
"react-dom": "^18.2.0",
@@ -112,7 +107,6 @@
"version": "0.8.0",
"license": "Apache-2.0",
"devDependencies": {
- "@fluent/bundle": "^0.19.0",
"cached-iterable": "^0.3.0"
},
"engines": {
@@ -126,9 +120,6 @@
"name": "@fluent/syntax",
"version": "0.19.0",
"license": "Apache-2.0",
- "devDependencies": {
- "@fluent/dedent": "^0.5.0"
- },
"engines": {
"node": "^20.19 || ^22.12 || >=24"
}
diff --git a/package.json b/package.json
index 2063d1bc7..b31dfed73 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
"predist": "npm run clean",
"dist": "npm run build --workspaces",
"postdist": "npm run lint && npm run test && npm run docs",
- "clean": "git clean -fdxe node_modules fluent-*/{coverage,dist,esm,index.js} html",
+ "clean": "git clean -fdxe node_modules fluent-*/{coverage,dist} coverage html",
"deploy-html": "gh-pages -d html",
"docs": "typedoc",
"lint": "eslint --max-warnings 0",
diff --git a/rollup.config.mjs b/rollup.config.mjs
deleted file mode 100644
index c910f4ccb..000000000
--- a/rollup.config.mjs
+++ /dev/null
@@ -1,28 +0,0 @@
-import { readFile } from "fs/promises";
-
-const globalName = {
- "@fluent/bundle": "FluentBundle",
- "@fluent/dedent": "FluentDedent",
- "@fluent/dom": "FluentDOM",
- "@fluent/langneg": "FluentLangNeg",
- "@fluent/react": "FluentReact",
- "@fluent/sequence": "FluentSequence",
- "@fluent/syntax": "FluentSyntax",
-};
-
-export default async function () {
- // Current dir is the package's own directory here
- const pkgSrc = await readFile("package.json", "utf8");
- const { name, version } = JSON.parse(pkgSrc);
-
- return {
- input: "esm/index.js",
- output: {
- file: "index.js",
- format: "umd",
- amd: { id: name },
- name: globalName[name],
- banner: `/** ${name}@${version} */`,
- },
- };
-}
diff --git a/tools/fluentfmt.mjs b/tools/fluentfmt.mjs
index a2d3c25df..7f1f231c0 100755
--- a/tools/fluentfmt.mjs
+++ b/tools/fluentfmt.mjs
@@ -4,12 +4,7 @@
import { readFile } from "fs";
import program from "commander";
-import {
- columnOffset,
- lineOffset,
- parse,
- serialize,
-} from "../fluent-syntax/esm/index.js";
+import { columnOffset, lineOffset, parse, serialize } from "@fluent/syntax";
program
.version("0.0.1")
diff --git a/tools/format.mjs b/tools/format.mjs
index 2cb451d4e..9c801c321 100755
--- a/tools/format.mjs
+++ b/tools/format.mjs
@@ -4,7 +4,7 @@ import "colors";
import { readFile, readFileSync } from "fs";
import program from "commander";
-import { FluentBundle, FluentResource } from "../fluent-bundle/esm/index.js";
+import { FluentBundle, FluentResource } from "@fluent/bundle";
program
.version("0.0.1")
diff --git a/tools/fuzz.mjs b/tools/fuzz.mjs
index aa50e782e..d36ec307f 100755
--- a/tools/fuzz.mjs
+++ b/tools/fuzz.mjs
@@ -6,8 +6,8 @@ import { readFile } from "fs";
import { cursorTo } from "readline";
import program from "commander";
import { mutate, seed } from "fuzzer";
-import { FluentResource } from "../fluent-bundle/esm/index.js";
-import { parse } from "../fluent-syntax/esm/index.js";
+import { FluentResource } from "@fluent/bundle";
+import { parse } from "@fluent/syntax";
seed(Math.random() * 1000000000);
diff --git a/tools/parse.mjs b/tools/parse.mjs
index 5eca1a856..85f00f473 100755
--- a/tools/parse.mjs
+++ b/tools/parse.mjs
@@ -2,8 +2,8 @@
import { readFile } from "fs";
import program from "commander";
-import { columnOffset, lineOffset, parse } from "../fluent-syntax/esm/index.js";
-import { FluentResource } from "../fluent-bundle/esm/index.js";
+import { FluentResource } from "@fluent/bundle";
+import { columnOffset, lineOffset, parse } from "@fluent/syntax";
program
.version("0.0.1")
diff --git a/tsconfig.base.json b/tsconfig.base.json
index 2c547bfd0..f888e66a6 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -1,11 +1,10 @@
{
"compilerOptions": {
"target": "es2021",
- "module": "es2015",
+ "module": "nodenext",
"strict": true,
"allowJs": false,
"esModuleInterop": true,
- "moduleResolution": "node",
"noEmitHelpers": true,
"declaration": true
}
From f18f9ac53441b162a249ad12aafa12253096462e Mon Sep 17 00:00:00 2001
From: Eemeli Aro
Date: Wed, 31 Dec 2025 03:35:03 +0200
Subject: [PATCH 2/7] Handle tools/ as a workspace
---
package-lock.json | 118 ++++++---------------------------------------
package.json | 7 +--
tools/package.json | 14 ++++++
3 files changed, 31 insertions(+), 108 deletions(-)
create mode 100644 tools/package.json
diff --git a/package-lock.json b/package-lock.json
index d679614b5..9d22a4524 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,19 +13,16 @@
"./fluent-langneg",
"./fluent-react",
"./fluent-syntax",
- "./fluent-gecko"
+ "./fluent-gecko",
+ "./tools"
],
"devDependencies": {
- "colors": "^1.3.3",
- "commander": "^2.20",
"eslint": "^9.23.0",
"eslint-config-prettier": "^10.1.1",
- "fuzzer": "^0.2.1",
"gh-pages": "^6.1.1",
"globals": "^16.0.0",
"jsdom": "^27.4.0",
"prettier": "^3.2.5",
- "prettyjson": "^1.2.1",
"rollup": "^4.12.0",
"typedoc": "^0.28.1",
"typedoc-plugin-redirect": "^1.2.0",
@@ -970,6 +967,10 @@
"resolved": "fluent-syntax",
"link": true
},
+ "node_modules/@fluent/tools": {
+ "resolved": "tools",
+ "link": true
+ },
"node_modules/@gerrit0/mini-shiki": {
"version": "3.20.0",
"resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.20.0.tgz",
@@ -2047,7 +2048,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
"integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.3",
@@ -2074,7 +2074,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
"integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"array-buffer-byte-length": "^1.0.1",
@@ -2113,7 +2112,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
"integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -2123,7 +2121,6 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
"integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"possible-typed-array-names": "^1.0.0"
@@ -2189,7 +2186,6 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
"integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.0",
@@ -2208,7 +2204,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
@@ -2222,7 +2217,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
"integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
@@ -2296,7 +2290,6 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.1.90"
@@ -2306,7 +2299,6 @@
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true,
"license": "MIT"
},
"node_modules/commondir": {
@@ -2392,7 +2384,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
"integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.3",
@@ -2410,7 +2401,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
"integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.3",
@@ -2428,7 +2418,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
"integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
@@ -2488,7 +2477,6 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
- "dev": true,
"license": "MIT",
"dependencies": {
"es-define-property": "^1.0.0",
@@ -2506,7 +2494,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
"integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"define-data-property": "^1.0.1",
@@ -2537,7 +2524,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
@@ -2572,7 +2558,6 @@
"version": "1.24.1",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz",
"integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"array-buffer-byte-length": "^1.0.2",
@@ -2641,7 +2626,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -2651,7 +2635,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -2668,7 +2651,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
@@ -2681,7 +2663,6 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
@@ -2697,7 +2678,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
"integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
- "dev": true,
"license": "MIT",
"dependencies": {
"is-callable": "^1.2.7",
@@ -3128,7 +3108,6 @@
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
"integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"is-callable": "^1.2.7"
@@ -3174,7 +3153,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -3184,7 +3162,6 @@
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
"integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.8",
@@ -3205,7 +3182,6 @@
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -3215,7 +3191,6 @@
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/fuzzer/-/fuzzer-0.2.1.tgz",
"integrity": "sha512-LGFobvtCmAWAX6AvpmRAG60QFs+j+6APfQwPTnPt46iL21afI2Uxv1/J02szOwyAZAhIHj5BWqxdxG6zWECG6g==",
- "dev": true,
"license": "ISC",
"dependencies": {
"random-js": "1.0.2",
@@ -3230,7 +3205,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
"integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3240,7 +3214,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
@@ -3265,7 +3238,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "dev": true,
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
@@ -3279,7 +3251,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
"integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.3",
@@ -3356,7 +3327,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
"integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"define-properties": "^1.2.1",
@@ -3394,7 +3364,6 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3414,7 +3383,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
"integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3437,7 +3405,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"es-define-property": "^1.0.0"
@@ -3450,7 +3417,6 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
"integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.0"
@@ -3466,7 +3432,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3479,7 +3444,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
@@ -3495,7 +3459,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
@@ -3586,7 +3549,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
"integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
@@ -3601,7 +3563,6 @@
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
"integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.8",
@@ -3619,7 +3580,6 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
"integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"async-function": "^1.0.0",
@@ -3639,7 +3599,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
"integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"has-bigints": "^1.0.2"
@@ -3655,7 +3614,6 @@
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
"integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.3",
@@ -3672,7 +3630,6 @@
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
"integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3701,7 +3658,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
"integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
@@ -3719,7 +3675,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
"integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
@@ -3746,7 +3701,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
"integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.3"
@@ -3762,7 +3716,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
"integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.4",
@@ -3795,7 +3748,6 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
"integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3815,7 +3767,6 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
"integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3838,7 +3789,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
"integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.3",
@@ -3862,7 +3812,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
"integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
@@ -3881,7 +3830,6 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
"integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3894,7 +3842,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
"integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.3"
@@ -3910,7 +3857,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
"integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.3",
@@ -3927,7 +3873,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
"integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
@@ -3945,7 +3890,6 @@
"version": "1.1.15",
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
"integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"which-typed-array": "^1.1.16"
@@ -3961,7 +3905,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
"integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3974,7 +3917,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
"integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.3"
@@ -3990,7 +3932,6 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
"integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.3",
@@ -4007,7 +3948,6 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
- "dev": true,
"license": "MIT"
},
"node_modules/isexe": {
@@ -4236,7 +4176,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -4297,7 +4236,6 @@
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -4350,7 +4288,6 @@
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
"integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -4363,7 +4300,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -4373,7 +4309,6 @@
"version": "4.1.7",
"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
"integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.8",
@@ -4423,7 +4358,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
"integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.2.6",
@@ -4655,7 +4589,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
"integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -4720,7 +4653,6 @@
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/prettyjson/-/prettyjson-1.2.5.tgz",
"integrity": "sha512-rksPWtoZb2ZpT5OVgtmy0KHVM+Dca3iVwWY9ifwhcexfjebtgjg3wmrUt9PvJ59XIYBcknQeYHD8IAnVlh9lAw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"colors": "1.4.0",
@@ -4775,7 +4707,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/random-js/-/random-js-1.0.2.tgz",
"integrity": "sha512-IIsnMV4J4+K0CY0bDRKJTTlGwy9KUEqiqDJekfBq5iwUSa1l2C5ssml5fmP8YVS17Pry7VJbsHBebDWjcIdheQ==",
- "dev": true,
"license": "MIT"
},
"node_modules/react": {
@@ -4845,7 +4776,6 @@
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
"integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.8",
@@ -4868,7 +4798,6 @@
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
"integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.8",
@@ -5007,7 +4936,6 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
"integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.8",
@@ -5027,7 +4955,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
"integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
@@ -5044,7 +4971,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
"integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
@@ -5095,7 +5021,6 @@
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"define-data-property": "^1.1.4",
@@ -5113,7 +5038,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
"integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"define-data-property": "^1.1.4",
@@ -5129,7 +5053,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
"integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
@@ -5167,7 +5090,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
"integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
@@ -5187,7 +5109,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
"integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
@@ -5204,7 +5125,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
"integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
@@ -5223,7 +5143,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
"integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
@@ -5284,7 +5203,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
"integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
@@ -5298,7 +5216,6 @@
"version": "1.2.10",
"resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
"integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.8",
@@ -5320,7 +5237,6 @@
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
"integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.8",
@@ -5339,7 +5255,6 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
"integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.7",
@@ -5577,7 +5492,6 @@
"version": "0.6.11",
"resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.11.tgz",
"integrity": "sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==",
- "dev": true,
"license": "MIT",
"dependencies": {
"gopd": "^1.2.0",
@@ -5644,7 +5558,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
"integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.3",
@@ -5659,7 +5572,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
"integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.8",
@@ -5679,7 +5591,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
"integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.7",
@@ -5701,7 +5612,6 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
"integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.7",
@@ -5722,7 +5632,6 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz",
"integrity": "sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.8",
@@ -5850,7 +5759,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
"integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.3",
@@ -6149,7 +6057,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
"integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"is-bigint": "^1.1.0",
@@ -6169,7 +6076,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
"integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
@@ -6197,7 +6103,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
"integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"is-map": "^2.0.3",
@@ -6216,7 +6121,6 @@
"version": "1.1.19",
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
"integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.7",
@@ -6304,7 +6208,6 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz",
"integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==",
- "dev": true,
"engines": {
"node": ">=0.4"
}
@@ -6337,6 +6240,15 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
+ },
+ "tools": {
+ "name": "@fluent/tools",
+ "dependencies": {
+ "colors": "^1.3.3",
+ "commander": "^2.20",
+ "fuzzer": "^0.2.1",
+ "prettyjson": "^1.2.1"
+ }
}
}
}
diff --git a/package.json b/package.json
index b31dfed73..b1ac2e9b0 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,8 @@
"./fluent-langneg",
"./fluent-react",
"./fluent-syntax",
- "./fluent-gecko"
+ "./fluent-gecko",
+ "./tools"
],
"scripts": {
"predist": "npm run clean",
@@ -27,16 +28,12 @@
"trailingComma": "es5"
},
"devDependencies": {
- "colors": "^1.3.3",
- "commander": "^2.20",
"eslint": "^9.23.0",
"eslint-config-prettier": "^10.1.1",
- "fuzzer": "^0.2.1",
"gh-pages": "^6.1.1",
"globals": "^16.0.0",
"jsdom": "^27.4.0",
"prettier": "^3.2.5",
- "prettyjson": "^1.2.1",
"rollup": "^4.12.0",
"typedoc": "^0.28.1",
"typedoc-plugin-redirect": "^1.2.0",
diff --git a/tools/package.json b/tools/package.json
new file mode 100644
index 000000000..c5128b919
--- /dev/null
+++ b/tools/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "@fluent/tools",
+ "private": true,
+ "type": "commonjs",
+ "dependencies": {
+ "colors": "^1.3.3",
+ "commander": "^2.20",
+ "fuzzer": "^0.2.1",
+ "prettyjson": "^1.2.1"
+ },
+ "scripts": {
+ "build": ""
+ }
+}
From 905912f51f8d3cacbe0c846a79391884fbaf07af Mon Sep 17 00:00:00 2001
From: Eemeli Aro
Date: Wed, 31 Dec 2025 03:58:01 +0200
Subject: [PATCH 3/7] Replace fluent-gecko/ workspace with
fluent-react/rollup.firefox.js
---
fluent-gecko/README.md | 12 -------
fluent-gecko/package.json | 37 --------------------
fluent-gecko/rollup.config.mjs | 56 -------------------------------
fluent-gecko/src/fluent-react.js | 1 -
fluent-gecko/src/fluent-syntax.js | 14 --------
fluent-react/package.json | 9 +++--
fluent-react/rollup.firefox.js | 40 ++++++++++++++++++++++
package-lock.json | 20 +++--------
package.json | 1 -
9 files changed, 50 insertions(+), 140 deletions(-)
delete mode 100644 fluent-gecko/README.md
delete mode 100644 fluent-gecko/package.json
delete mode 100644 fluent-gecko/rollup.config.mjs
delete mode 100644 fluent-gecko/src/fluent-react.js
delete mode 100644 fluent-gecko/src/fluent-syntax.js
create mode 100644 fluent-react/rollup.firefox.js
diff --git a/fluent-gecko/README.md b/fluent-gecko/README.md
deleted file mode 100644
index e161ed8ec..000000000
--- a/fluent-gecko/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# fluent-gecko 
-
-`fluent-gecko` is a Gecko-compatible distribution of [Project Fluent][].
-
-[project fluent]: https://projectfluent.org
-
-## How to use
-
-`fluent-gecko` can build files ready for vendoring into `mozilla-central`.
-
-- [`FluentSyntax.jsm`](https://searchfox.org/mozilla-central/source/intl/l10n/FluentSyntax.jsm)
-- [`fluent-react.js`](https://searchfox.org/mozilla-central/source/devtools/client/shared/vendor/fluent-react.js)
diff --git a/fluent-gecko/package.json b/fluent-gecko/package.json
deleted file mode 100644
index f0700f03d..000000000
--- a/fluent-gecko/package.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "name": "@fluent/gecko",
- "description": "Gecko bindings for Fluent",
- "private": true,
- "version": "0.0.1",
- "homepage": "https://projectfluent.org",
- "author": "Mozilla ",
- "license": "Apache-2.0",
- "contributors": [
- {
- "name": "Zibi Braniecki",
- "email": "zbraniecki@mozilla.com"
- },
- {
- "name": "Staś Małolepszy",
- "email": "stas@mozilla.com"
- }
- ],
- "directories": {
- "lib": "./src"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/projectfluent/fluent.js.git"
- },
- "keywords": [
- "localization",
- "l10n"
- ],
- "scripts": {
- "build": "rollup --config rollup.config.mjs",
- "docs": "true"
- },
- "devDependencies": {
- "@rollup/plugin-node-resolve": "^15.0.1"
- }
-}
diff --git a/fluent-gecko/rollup.config.mjs b/fluent-gecko/rollup.config.mjs
deleted file mode 100644
index f726f8af4..000000000
--- a/fluent-gecko/rollup.config.mjs
+++ /dev/null
@@ -1,56 +0,0 @@
-import { readFileSync } from "fs";
-import { nodeResolve } from "@rollup/plugin-node-resolve";
-
-const vim = `/* vim: set ts=2 et sw=2 tw=80 filetype=javascript: */`;
-const license = `\
-/* Copyright 2019 Mozilla Foundation and others
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-`;
-
-const reactPkgSrc = readFileSync("../fluent-react/package.json", "utf8");
-const reactPkg = JSON.parse(reactPkgSrc);
-const syntaxPkgSrc = readFileSync("../fluent-syntax/package.json", "utf8");
-const syntaxPkg = JSON.parse(syntaxPkgSrc);
-
-export default [
- {
- input: "src/fluent-react.js",
- output: {
- file: "dist/fluent-react.js",
- format: "cjs",
- generatedCode: { constBindings: true },
- banner: license,
- intro: `/** fluent-react@${reactPkg.version} */`,
- },
- context: "this",
- external: ["react"],
- plugins: [nodeResolve()],
- },
- {
- input: "src/fluent-syntax.js",
- output: {
- file: "dist/FluentSyntax.jsm",
- format: "es",
- freeze: false,
- generatedCode: { constBindings: true },
- banner: `${vim}\n\n${license}`,
- intro: `/** fluent-syntax@${syntaxPkg.version} */`,
- },
- context: "this",
- treeshake: false,
- plugins: [nodeResolve()],
- },
-];
diff --git a/fluent-gecko/src/fluent-react.js b/fluent-gecko/src/fluent-react.js
deleted file mode 100644
index c9ce83bd6..000000000
--- a/fluent-gecko/src/fluent-react.js
+++ /dev/null
@@ -1 +0,0 @@
-export * from "../../fluent-react/dist/index.js";
diff --git a/fluent-gecko/src/fluent-syntax.js b/fluent-gecko/src/fluent-syntax.js
deleted file mode 100644
index f14334048..000000000
--- a/fluent-gecko/src/fluent-syntax.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import { FluentParser } from "../../fluent-syntax/dist/parser.js";
-import { FluentSerializer } from "../../fluent-syntax/dist/serializer.js";
-import { Visitor, Transformer } from "../../fluent-syntax/dist/visitor.js";
-import * as ast from "../../fluent-syntax/dist/ast.js";
-
-this.EXPORTED_SYMBOLS = [
- ...Object.keys(ast),
- ...Object.keys({
- FluentParser,
- FluentSerializer,
- Visitor,
- Transformer,
- }),
-];
diff --git a/fluent-react/package.json b/fluent-react/package.json
index ee36a5fdd..9cdc9c96a 100644
--- a/fluent-react/package.json
+++ b/fluent-react/package.json
@@ -8,8 +8,9 @@
"./package.json": "./package.json"
},
"files": [
- "./dist/",
- "./vendor/"
+ "dist/",
+ "!dist/fluent-react.cjs",
+ "vendor/"
],
"homepage": "https://projectfluent.org",
"author": "Mozilla ",
@@ -47,7 +48,8 @@
"reactjs"
],
"scripts": {
- "build": "tsc -p ./tsconfig.build.json"
+ "build": "tsc -p ./tsconfig.build.json",
+ "postbuild": "rollup --config rollup.firefox.js"
},
"engines": {
"node": "^20.19 || ^22.12 || >=24"
@@ -61,6 +63,7 @@
"react": ">=16.8.0"
},
"devDependencies": {
+ "@rollup/plugin-node-resolve": "^16.0.3",
"@types/react": "^18.0.28",
"react": "^18.2.0",
"react-dom": "^18.2.0",
diff --git a/fluent-react/rollup.firefox.js b/fluent-react/rollup.firefox.js
new file mode 100644
index 000000000..f2f40c7be
--- /dev/null
+++ b/fluent-react/rollup.firefox.js
@@ -0,0 +1,40 @@
+import { nodeResolve } from "@rollup/plugin-node-resolve";
+import pkg from "./package.json" with { type: "json" };
+
+/**
+ * This produces a bundled version of `@fluent/react` suitable for inclusion in Firefox:
+ *
+ * https://searchfox.org/firefox-main/source/devtools/client/shared/vendor/fluent-react.js
+ */
+
+const license = `\
+/* Copyright 2019 Mozilla Foundation and others
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+`;
+
+export default {
+ input: "dist/index.js",
+ output: {
+ file: "dist/fluent-react.cjs",
+ format: "cjs",
+ generatedCode: { constBindings: true },
+ banner: license,
+ intro: `/** ${pkg.name}@${pkg.version} */`,
+ },
+ context: "this",
+ external: ["react"],
+ plugins: [nodeResolve()],
+};
diff --git a/package-lock.json b/package-lock.json
index 9d22a4524..05156fd30 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,7 +13,6 @@
"./fluent-langneg",
"./fluent-react",
"./fluent-syntax",
- "./fluent-gecko",
"./tools"
],
"devDependencies": {
@@ -61,14 +60,6 @@
"node": "^20.19 || ^22.12 || >=24"
}
},
- "fluent-gecko": {
- "name": "@fluent/gecko",
- "version": "0.0.1",
- "license": "Apache-2.0",
- "devDependencies": {
- "@rollup/plugin-node-resolve": "^15.0.1"
- }
- },
"fluent-langneg": {
"name": "@fluent/langneg",
"version": "0.7.0",
@@ -86,6 +77,7 @@
"cached-iterable": "^0.3.0"
},
"devDependencies": {
+ "@rollup/plugin-node-resolve": "^16.0.3",
"@types/react": "^18.0.28",
"react": "^18.2.0",
"react-dom": "^18.2.0",
@@ -947,10 +939,6 @@
"resolved": "fluent-dom",
"link": true
},
- "node_modules/@fluent/gecko": {
- "resolved": "fluent-gecko",
- "link": true
- },
"node_modules/@fluent/langneg": {
"resolved": "fluent-langneg",
"link": true
@@ -1083,9 +1071,9 @@
}
},
"node_modules/@rollup/plugin-node-resolve": {
- "version": "15.3.1",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz",
- "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==",
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz",
+ "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==",
"dev": true,
"license": "MIT",
"dependencies": {
diff --git a/package.json b/package.json
index b1ac2e9b0..bb330f319 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,6 @@
"./fluent-langneg",
"./fluent-react",
"./fluent-syntax",
- "./fluent-gecko",
"./tools"
],
"scripts": {
From afa39c90f29f2a4d427fadb694d739c89406e3a2 Mon Sep 17 00:00:00 2001
From: Eemeli Aro
Date: Thu, 1 Jan 2026 18:58:07 +0200
Subject: [PATCH 4/7] refactor(dom): Drop unnecessary copy of
DOMLocalization.getAttributes()
---
fluent-dom/src/dom_localization.js | 17 +----------------
1 file changed, 1 insertion(+), 16 deletions(-)
diff --git a/fluent-dom/src/dom_localization.js b/fluent-dom/src/dom_localization.js
index dc7e410e7..e3ca4212d 100644
--- a/fluent-dom/src/dom_localization.js
+++ b/fluent-dom/src/dom_localization.js
@@ -294,7 +294,7 @@ export default class DOMLocalization extends Localization {
return undefined;
}
- const keys = elements.map(this.getKeysForElement);
+ const keys = elements.map(this.getAttributes);
const translations = await this.formatMessages(keys);
return this.applyTranslations(elements, translations);
}
@@ -337,19 +337,4 @@ export default class DOMLocalization extends Localization {
return nodes;
}
-
- /**
- * Get the `data-l10n-*` attributes from DOM elements as a two-element
- * array.
- *
- * @param {Element} element
- * @returns {Object}
- * @private
- */
- getKeysForElement(element) {
- return {
- id: element.getAttribute(L10NID_ATTR_NAME),
- args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null),
- };
- }
}
From e72a75f67f1112395273010f98c6f9c309715d99 Mon Sep 17 00:00:00 2001
From: Eemeli Aro
Date: Thu, 1 Jan 2026 20:40:36 +0200
Subject: [PATCH 5/7] refactor(dom): Refactor as TypeScript (#470)
---
...om_localization.js => dom_localization.ts} | 150 +++++++++---------
fluent-dom/src/index.js | 2 -
fluent-dom/src/index.ts | 7 +
.../src/{localization.js => localization.ts} | 119 +++++++-------
fluent-dom/src/{overlay.js => overlay.ts} | 105 ++++++------
fluent-dom/test/dom_localization_test.js | 2 +-
fluent-dom/test/extra_text_markup_test.js | 2 +-
fluent-dom/test/localization_test.js | 2 +-
fluent-dom/test/overlay_attributes_test.js | 2 +-
.../test/overlay_functional_children_test.js | 2 +-
fluent-dom/test/overlay_test.js | 2 +-
fluent-dom/test/overlay_text_children_test.js | 2 +-
fluent-dom/tsconfig.json | 3 +-
fluent-dom/typedoc.json | 3 -
14 files changed, 207 insertions(+), 196 deletions(-)
rename fluent-dom/src/{dom_localization.js => dom_localization.ts} (71%)
delete mode 100644 fluent-dom/src/index.js
create mode 100644 fluent-dom/src/index.ts
rename fluent-dom/src/{localization.js => localization.ts} (77%)
rename fluent-dom/src/{overlay.js => overlay.ts} (81%)
delete mode 100644 fluent-dom/typedoc.json
diff --git a/fluent-dom/src/dom_localization.js b/fluent-dom/src/dom_localization.ts
similarity index 71%
rename from fluent-dom/src/dom_localization.js
rename to fluent-dom/src/dom_localization.ts
index e3ca4212d..f7255cb3d 100644
--- a/fluent-dom/src/dom_localization.js
+++ b/fluent-dom/src/dom_localization.ts
@@ -1,5 +1,10 @@
+import type { FluentBundle } from "@fluent/bundle";
+import {
+ Localization,
+ type FormattedMessage,
+ type MessageKey,
+} from "./localization.js";
import translateElement from "./overlay.js";
-import Localization from "./localization.js";
const L10NID_ATTR_NAME = "data-l10n-id";
const L10NARGS_ATTR_NAME = "data-l10n-args";
@@ -14,37 +19,36 @@ const L10N_ELEMENT_QUERY = `[${L10NID_ATTR_NAME}]`;
* formatting of translations and methods for observing DOM
* trees with a `MutationObserver`.
*/
-export default class DOMLocalization extends Localization {
- /**
- * @param {Array} resourceIds - List of resource IDs
- * @param {Function} generateBundles - Function that returns a
- * generator over FluentBundles
- * @returns {DOMLocalization}
- */
- constructor(resourceIds, generateBundles) {
- super(resourceIds, generateBundles);
+export class DOMLocalization extends Localization {
+ // A Set of DOM trees observed by the `MutationObserver`.
+ roots = new Set();
- // A Set of DOM trees observed by the `MutationObserver`.
- this.roots = new Set();
- // requestAnimationFrame handler.
- this.pendingrAF = null;
- // list of elements pending for translation.
- this.pendingElements = new Set();
- this.windowElement = null;
- this.mutationObserver = null;
-
- this.observerConfig = {
- attributes: true,
- characterData: false,
- childList: true,
- subtree: true,
- attributeFilter: [L10NID_ATTR_NAME, L10NARGS_ATTR_NAME],
- };
+ // requestAnimationFrame handler.
+ pendingrAF: number | null = null;
+
+ pendingElements = new Set();
+ windowElement: (Window & typeof globalThis) | null = null;
+ mutationObserver: MutationObserver | null = null;
+
+ observerConfig = {
+ attributes: true,
+ characterData: false,
+ childList: true,
+ subtree: true,
+ attributeFilter: [L10NID_ATTR_NAME, L10NARGS_ATTR_NAME],
+ };
+
+ constructor(
+ resourceIds: string[],
+ generateBundles: (resourceIds: string[]) => Iterable
+ ) {
+ super(resourceIds, generateBundles);
}
- onChange(eager = false) {
+ onChange(eager = false): void {
super.onChange(eager);
if (this.roots) {
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
this.translateRoots();
}
}
@@ -79,12 +83,15 @@ export default class DOMLocalization extends Localization {
*
* ```
*
- * @param {Element} element - Element to set attributes on
- * @param {string} id - l10n-id string
- * @param {Object} args - KVP list of l10n arguments
- * @returns {Element}
+ * @param element - Element to set attributes on
+ * @param id - l10n-id string
+ * @param args - KVP list of l10n arguments
*/
- setAttributes(element, id, args) {
+ setAttributes(
+ element: Element,
+ id: string,
+ args: Record
+ ): Element {
element.setAttribute(L10NID_ATTR_NAME, id);
if (args) {
element.setAttribute(L10NARGS_ATTR_NAME, JSON.stringify(args));
@@ -103,14 +110,15 @@ export default class DOMLocalization extends Localization {
* );
* // -> { id: 'hello', args: { who: 'world' } }
* ```
- *
- * @param {Element} element - HTML element
- * @returns {{id: string, args: Object}}
*/
- getAttributes(element) {
+ getAttributes(element: Element): {
+ id: string | null;
+ args: Record | null;
+ } {
+ const args = element.getAttribute(L10NARGS_ATTR_NAME);
return {
id: element.getAttribute(L10NID_ATTR_NAME),
- args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null),
+ args: args ? (JSON.parse(args) as Record) : null,
};
}
@@ -119,10 +127,8 @@ export default class DOMLocalization extends Localization {
*
* Additionally, if this `DOMLocalization` has an observer, start observing
* `newRoot` in order to translate mutations in it.
- *
- * @param {Element | DocumentFragment} newRoot - Root to observe.
*/
- connectRoot(newRoot) {
+ connectRoot(newRoot: Element | DocumentFragment): void {
for (const root of this.roots) {
if (
root === newRoot ||
@@ -140,13 +146,13 @@ export default class DOMLocalization extends Localization {
}
} else {
this.windowElement = newRoot.ownerDocument.defaultView;
- this.mutationObserver = new this.windowElement.MutationObserver(
+ this.mutationObserver = new this.windowElement!.MutationObserver(
mutations => this.translateMutations(mutations)
);
}
this.roots.add(newRoot);
- this.mutationObserver.observe(newRoot, this.observerConfig);
+ this.mutationObserver!.observe(newRoot, this.observerConfig);
}
/**
@@ -157,11 +163,8 @@ export default class DOMLocalization extends Localization {
*
* Returns `true` if the root was the last one managed by this
* `DOMLocalization`.
- *
- * @param {Element | DocumentFragment} root - Root to disconnect.
- * @returns {boolean}
*/
- disconnectRoot(root) {
+ disconnectRoot(root: Element | DocumentFragment): boolean {
this.roots.delete(root);
// Pause the mutation observer to stop observing `root`.
this.pauseObserving();
@@ -187,7 +190,7 @@ export default class DOMLocalization extends Localization {
*
* @returns {Promise}
*/
- translateRoots() {
+ translateRoots(): Promise {
const roots = Array.from(this.roots);
return Promise.all(roots.map(root => this.translateFragment(root)));
}
@@ -195,7 +198,7 @@ export default class DOMLocalization extends Localization {
/**
* Pauses the `MutationObserver`.
*/
- pauseObserving() {
+ pauseObserving(): void {
if (!this.mutationObserver) {
return;
}
@@ -207,7 +210,7 @@ export default class DOMLocalization extends Localization {
/**
* Resumes the `MutationObserver`.
*/
- resumeObserving() {
+ resumeObserving(): void {
if (!this.mutationObserver) {
return;
}
@@ -219,19 +222,19 @@ export default class DOMLocalization extends Localization {
/**
* Translate mutations detected by the `MutationObserver`.
- *
- * @private
*/
- translateMutations(mutations) {
+ private translateMutations(mutations: MutationRecord[]): void {
for (const mutation of mutations) {
switch (mutation.type) {
- case "attributes":
- if (mutation.target.hasAttribute("data-l10n-id")) {
- this.pendingElements.add(mutation.target);
+ case "attributes": {
+ const target = mutation.target as HTMLElement;
+ if (target.hasAttribute("data-l10n-id")) {
+ this.pendingElements.add(target);
}
break;
+ }
case "childList":
- for (const addedNode of mutation.addedNodes) {
+ for (const addedNode of mutation.addedNodes as NodeListOf) {
if (addedNode.nodeType === addedNode.ELEMENT_NODE) {
if (addedNode.childElementCount) {
for (const element of this.getTranslatables(addedNode)) {
@@ -250,7 +253,8 @@ export default class DOMLocalization extends Localization {
// into a single requestAnimationFrame.
if (this.pendingElements.size > 0) {
if (this.pendingrAF === null) {
- this.pendingrAF = this.windowElement.requestAnimationFrame(() => {
+ this.pendingrAF = this.windowElement!.requestAnimationFrame(() => {
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
this.translateElements(Array.from(this.pendingElements));
this.pendingElements.clear();
this.pendingrAF = null;
@@ -269,10 +273,10 @@ export default class DOMLocalization extends Localization {
*
* Returns a `Promise` that gets resolved once the translation is complete.
*
- * @param {Element | DocumentFragment} frag - Element or DocumentFragment to be translated
+ * @param {} frag - Element or DocumentFragment to be translated
* @returns {Promise}
*/
- translateFragment(frag) {
+ translateFragment(frag: Element | DocumentFragment): Promise {
return this.translateElements(this.getTranslatables(frag));
}
@@ -285,28 +289,25 @@ export default class DOMLocalization extends Localization {
* with information about which translations to use.
*
* Returns a `Promise` that gets resolved once the translation is complete.
- *
- * @param {Array} elements - List of elements to be translated
- * @returns {Promise}
*/
- async translateElements(elements) {
+ async translateElements(elements: Element[]): Promise {
if (!elements.length) {
return undefined;
}
+ // eslint-disable-next-line @typescript-eslint/unbound-method
const keys = elements.map(this.getAttributes);
- const translations = await this.formatMessages(keys);
+ const translations = await this.formatMessages(keys as MessageKey[]);
return this.applyTranslations(elements, translations);
}
/**
* Applies translations onto elements.
- *
- * @param {Array} elements
- * @param {Array