Repository: lingui/js-lingui
Pull request #1370 (2023-01-25 13:18:53)

docs(): various refinements

vercel[bot]: [vc]: #MOwwvZesoRe2mOCwffWpCR5N2HkfX/y4qfE74/lTN/A=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJqcy1saW5ndWkiLCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20vbGluZ3VpL2pzLWxpbmd1aS9GMkMyeEx1NVl6U1U3ZnppVldHTXhWQ3dGZXJxIiwicHJldmlld1VybCI6IiIsIm5leHRDb21taXRTdGF0dXMiOiJQRU5ESU5HIn1dfQ==
**The latest updates on your projects**. Learn more about [Vercel for Git ↗︎](https://vercel.link/github-learn-more)

| Name | Status | Preview | Updated |
| :--- | :----- | :------ | :------ |
| **js-lingui** | 🔄 Building ([Inspect](https://vercel.com/lingui/js-lingui/F2C2xLu5YzSU7fziVWGMxVCwFerq)) |  | Jan 25, 2023 at 1:18PM (UTC) |


github-actions[bot]: ## size-limit report 📦 
| Path                                        | Size         |
| ------------------------------------------- | ------------ |
| ./packages/core/build/esm/index.js          | 2.89 KB (0%) |
| ./packages/detect-locale/build/esm/index.js | 804 B (0%)   |
| ./packages/react/build/esm/index.js         | 2.61 KB (0%) |
| ./packages/remote-loader/build/esm/index.js | 7.37 KB (0%) |

Patch:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 0ccce10f..9b475b94 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -7,7 +7,7 @@ The following is a set of guidelines for contributing to Lingui. These are mostl
 This project and everyone participating in it are governed by the [Code of Conduct](/CODE_OF_CONDUCT.md). We expect that all community members adhere to the guidelines within.
 
 **Working on your first Pull Request?** You can learn how from this _free_ series
-[How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github)
+[How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github).
 
 ## Contributing to the docs
 
@@ -71,8 +71,8 @@ This project uses [yarn][yarninstall] package manager. Please follow [official][
 
    > **Note**
    > If you are using an IDE to run test make sure to use the right Jest config.
-   > For unit tests use `-c scripts/jest/config.unit.js`. Integration tests use
-   > build packages (created using `yarn release:build`) and config `-c scripts/jest/config.integration.js`.
+   > For unit tests use `-c jest.config.js`. Integration tests use
+   > build packages (created using `yarn release:build`) and config `-c jest.config.integration.js`.
    > See [package.json](./package.json) for more info.
    > If you run tests manually instead of using `yarn watch` or `yarn test` commands and your tests
    > fail due to missing locale data (typically you'll get wrong number and currency formating)
@@ -84,41 +84,40 @@ After you successfully fix a bug or add a new feature, you most probably want to
 
 `jsLingui` uses [verdaccio](https://verdaccio.org/), a lightweight local NPM registry, to install local build of packages in examples. You can do the same in your project:
 
-1. Run `verdaccio` locally in docker (follow [verdaccio guide](https://verdaccio.org/docs/en/what-is-verdaccio.html)
-   if you don't want to run it in Docker):
+1. Run `verdaccio` locally in docker (follow [verdaccio guide](https://verdaccio.org/docs/en/what-is-verdaccio.html) if you don't want to run it in Docker):
 
-   ```sh
-   docker run -d -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio
-   ```
+    ```sh
+    docker run -d -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio
+    ```
 
-> Make sure that your verdaccio user is the same that appears in verdacio-release.js script.
+    > Make sure that your verdaccio user is the same that appears in verdacio-release.js script.
 
 2. Publish local build of packages to registry. Run local release script:
 
-   ```sh
-   node ./scripts/verdaccio-release.js
-   ```
+    ```sh
+    node ./scripts/verdaccio-release.js
+    ```
 
 3. If you enter inside http://0.0.0.0:4873 (verdaccio instance), you will see your packages published, so you're ready to install them.
 
 4. Inside your project, run:
 
-```sh
-   # Install a small package to update all lingui packages
-   npm i -g update-by-scope
-   # Point to your local registry
-   npm config set registry http://0.0.0.0:4873/
-   # Run update-by-scope will update all @lingui packages
-   update-by-scope @lingui
-```
+    ```sh
+    # Install a small package to update all lingui packages
+    npm i -g update-by-scope
+    # Point to your local registry
+    npm config set registry http://0.0.0.0:4873/
+    # Run update-by-scope will update all @lingui packages
+    update-by-scope @lingui
+    ```
 
 5. After you make some changes, you need to run the same process. (Releasing + yarn upgrade)
 
 6. When finished testing, restore default registry
 
-```sh
-   npm config set registry https://registry.npmjs.org/
-```
+    ```sh
+    npm config set registry https://registry.npmjs.org/
+    ```
 
 ### Finalize changes
 
diff --git a/README.md b/README.md
index 3581d2e5..518a0420 100644
--- a/README.md
+++ b/README.md
@@ -65,8 +65,7 @@ Lingui is an easy yet powerful internationalization framework for global project
 - [Plain JavaScript][TutorialJavaScript]
 - [Working with Command Line Tool][TutorialCLI]
 
-If you're a react-intl user, check out
-[a comparison of react-intl and Lingui](https://lingui.js.org/misc/react-intl.html).
+If you're a react-intl user, check out [a comparison of react-intl and Lingui](https://lingui.dev/misc/react-intl).
 
 ## Example
 
@@ -78,7 +77,7 @@ import { Trans } from "@lingui/macro"
 function App() {
   return (
    <Trans id="msg.docs" /* id is optional */>
-     Read the <a href="https://lingui.js.org">documentation</a>
+     Read the <a href="https://lingui.dev">documentation</a>
      for more info.
    </Trans>
   )
@@ -99,19 +98,15 @@ For more example see the [React tutorial][TutorialReact].
 If you are having issues, please let us know.
 
 - Join us on [Discord](https://discord.gg/gFWwAYnMtA) to chat with the community.
-- Ask questions on [StackOverflow](https://stackoverflow.com/questions/ask?tags=jsLingui)
-  and mark it with [Lingui](https://stackoverflow.com/questions/tagged/jslingui) tag.
-- If something doesn't work as documented, documentation is missing or if you just want
-  to suggest a new feature, [create an issue][Issues].
+- Ask questions on [StackOverflow](https://stackoverflow.com/questions/ask?tags=linguijs) and mark it with [Lingui](https://stackoverflow.com/questions/tagged/linguijs) tag.
+- If something doesn't work as documented, documentation is missing or if you just want to suggest a new feature, [create an issue][Issues].
 
 ## Contribute
 
-Contribution to open-source project is everything from spreading the word, writing
-documentation to implement features and fixing bugs.
+Contribution to open-source project is everything from spreading the word, writing documentation to implement features and fixing bugs.
 
 - Do you use **Lingui** in production site? Let us know!
-- Have you seen any interesting talk or article about **i18n**?
-  [Share it](https://github.com/lingui/js-lingui/edit/main/website/docs/misc/resources.md)!
+- Have you seen any interesting talk or article about **i18n**? [Share it](https://github.com/lingui/js-lingui/edit/main/website/docs/misc/resources.md)!
 - Have you found a bug or do you want to suggest a new feature? [Create an issue][Issues]!
 - Do you want to improve the docs and write some code? Read the [contributors guide][Contributing] and send a PR!
 
@@ -146,14 +141,14 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
 
 The project is licensed under the [MIT][License] license.
 
-[Documentation]: https://lingui.js.org/
-[TutorialReact]: https://lingui.js.org/tutorials/react.html
-[TutorialReactNative]: https://lingui.js.org/tutorials/react-native.html
-[TutorialJavaScript]: https://lingui.js.org/tutorials/javascript.html
-[TutorialCLI]: https://lingui.js.org/tutorials/cli.html
-[TutorialSetupCRA]: https://lingui.js.org/tutorials/setup-cra.html
-[TutorialSetupReact]: https://lingui.js.org/tutorials/setup-react.html
-[RefCLI]: https://lingui.js.org/ref/cli.html
+[Documentation]: https://lingui.dev
+[TutorialReact]: https://lingui.dev/tutorials/react
+[TutorialReactNative]: https://lingui.dev/tutorials/react-native
+[TutorialJavaScript]: https://lingui.dev/tutorials/javascript
+[TutorialCLI]: https://lingui.dev/tutorials/cli
+[TutorialSetupCRA]: https://lingui.dev/tutorials/setup-cra
+[TutorialSetupReact]: https://lingui.dev/tutorials/setup-react
+[RefCLI]: https://lingui.dev/ref/cli
 
 [Badge-MainSuite-GithubCI]: https://github.com/lingui/js-lingui/workflows/main-suite/badge.svg
 [Badge-ReleaseWorkflowTesting-GithubCI]: https://github.com/lingui/js-lingui/workflows/release-workflow-test/badge.svg
diff --git a/examples/next-js/pages/index.tsx b/examples/next-js/pages/index.tsx
index 789feb50..172e3187 100644
--- a/examples/next-js/pages/index.tsx
+++ b/examples/next-js/pages/index.tsx
@@ -10,7 +10,7 @@ export default function Home() {
     <Layout className={styles.main}>
       <h1 className={styles.title}>
         <Trans>
-          Welcome to <a href="https://lingui.js.org">LinguiJS!</a>
+          Welcome to <a href="https://lingui.dev">LinguiJS!</a>
         </Trans>
       </h1>
       <p className={styles.description}>
@@ -20,7 +20,7 @@ export default function Home() {
         </Trans>
       </p>
       <div className={styles.grid}>
-        <a href="https://lingui.js.org" className={styles.card}>
+        <a href="https://lingui.dev" className={styles.card}>
           <h3>
             <Trans>Documentation →</Trans>
           </h3>
diff --git a/package.json b/package.json
index 98b42b4b..35526ae6 100644
--- a/package.json
+++ b/package.json
@@ -12,8 +12,8 @@
     "test:integration": "cross-env TZ=UTC NODE_ICU_DATA=node_modules/full-icu JEST_JUNIT_OUTPUT=results/integration.xml jest -c jest.config.integration.js --no-cache",
     "test:node-api": "node scripts/test-node-api.js",
     "test:all": "yarn test && yarn test:integration && test:node-api",
-    "watch": "cross-env TZ=UTC NODE_ICU_DATA=node_modules/full-icu jest -c scripts/jest/config.unit.js --watch",
-    "watch:integration": "cross-env TZ=UTC NODE_ICU_DATA=node_modules/full-icu jest -c scripts/jest/config.integration.js --watch",
+    "watch": "cross-env TZ=UTC NODE_ICU_DATA=node_modules/full-icu jest -c jest.config.js --watch",
+    "watch:integration": "cross-env TZ=UTC NODE_ICU_DATA=node_modules/full-icu jest -c jest.config.integration.js --watch",
     "lint:types": "tsc",
     "lint:eslint": "eslint packages",
     "lint:all": "yarn lint:eslint && yarn lint:types",
diff --git a/packages/babel-plugin-extract-messages/README.md b/packages/babel-plugin-extract-messages/README.md
index 87216810..937212f9 100644
--- a/packages/babel-plugin-extract-messages/README.md
+++ b/packages/babel-plugin-extract-messages/README.md
@@ -47,7 +47,7 @@ require("@babel/core").transform("code", {
 
 [license]: https://github.com/lingui/js-lingui/blob/main/LICENSE
 [linguijs]: https://github.com/lingui/js-lingui
-[documentation]: https://lingui.js.org/
+[documentation]: https://lingui.dev
 [package]: https://www.npmjs.com/package/@lingui/babel-plugin-extract-messages
 [badge-downloads]: https://img.shields.io/npm/dw/@lingui/babel-plugin-extract-messages.svg
 [badge-version]: https://img.shields.io/npm/v/@lingui/babel-plugin-extract-messages.svg
diff --git a/packages/cli/README.md b/packages/cli/README.md
index 1becbff6..05337159 100644
--- a/packages/cli/README.md
+++ b/packages/cli/README.md
@@ -68,9 +68,9 @@ This package is licensed under [MIT][license] license.
 
 [license]: https://github.com/lingui/js-lingui/blob/main/LICENSE
 [linguijs]: https://github.com/lingui/js-lingui
-[documentation]: https://lingui.js.org/
-[tutorial]: https://lingui.js.org/tutorials/cli.html
-[reference]: https://lingui.js.org/ref/cli.html
+[documentation]: https://lingui.dev
+[tutorial]: https://lingui.dev/tutorials/cli
+[reference]: https://lingui.dev/ref/cli
 [package]: https://www.npmjs.com/package/@lingui/cli
 [badge-downloads]: https://img.shields.io/npm/dw/@lingui/cli.svg
 [badge-version]: https://img.shields.io/npm/v/@lingui/cli.svg
diff --git a/packages/cli/src/lingui-add-locale.ts b/packages/cli/src/lingui-add-locale.ts
index 7853590d..854c01f2 100644
--- a/packages/cli/src/lingui-add-locale.ts
+++ b/packages/cli/src/lingui-add-locale.ts
@@ -4,6 +4,6 @@ if (require.main === module) {
   const msg =
     "lingui add-locale command is deprecated. " +
     `Please set ${chalk.yellow("'locales'")} in configuration. ` +
-    chalk.underline("https://lingui.js.org/ref/conf.html#locales")
+    chalk.underline("https://lingui.dev/ref/conf#locales")
   console.error(msg)
 }
diff --git a/packages/cli/src/lingui-compile.ts b/packages/cli/src/lingui-compile.ts
index d6d0daec..416ddca6 100644
--- a/packages/cli/src/lingui-compile.ts
+++ b/packages/cli/src/lingui-compile.ts
@@ -172,7 +172,7 @@ if (require.main === module) {
   if (program.format) {
     const msg =
       "--format option is deprecated and will be removed in @lingui/cli@3.0.0." +
-      " Please set format in configuration https://lingui.js.org/ref/conf.html#format"
+      " Please set format in configuration https://lingui.dev/ref/conf#format"
     console.warn(msg)
     config.format = program.format
   }
diff --git a/packages/cli/src/lingui-extract.ts b/packages/cli/src/lingui-extract.ts
index e7d4d06e..d620ed74 100644
--- a/packages/cli/src/lingui-extract.ts
+++ b/packages/cli/src/lingui-extract.ts
@@ -118,7 +118,7 @@ if (require.main === module) {
     hasErrors = true
     const msg =
       "--format option is deprecated." +
-      " Please set format in configuration https://lingui.js.org/ref/conf.html#format"
+      " Please set format in configuration https://lingui.dev/ref/conf#format"
     console.error(msg)
     console.error()
   }
@@ -127,7 +127,7 @@ if (require.main === module) {
     hasErrors = true
     const msg =
       "--babelOptions option is deprecated." +
-      " Please set extractBabelOptions in configuration https://lingui.js.org/ref/conf.html#extractBabelOptions"
+      " Please set extractBabelOptions in configuration https://lingui.dev/ref/conf#extractbabeloptions"
     console.error(msg)
     console.error()
   }
diff --git a/packages/conf/README.md b/packages/conf/README.md
index 8b335ce3..2c436f13 100644
--- a/packages/conf/README.md
+++ b/packages/conf/README.md
@@ -23,7 +23,7 @@ const config = getConfig()
 // config.localeDir === '/app/locale'
 ```
 
-See the [reference][reference] documenation of `lingui-cli` for all options.
+See the [reference][reference] documentation of `lingui-cli` for all options.
 
 ## License
 
@@ -31,8 +31,8 @@ This package is licensed under [MIT][license] license.
 
 [license]: https://github.com/lingui/js-lingui/blob/main/LICENSE
 [linguijs]: https://github.com/lingui/js-lingui
-[documentation]: https://lingui.js.org/
-[reference]: https://lingui.js.org/ref/conf.html
+[documentation]: https://lingui.dev
+[reference]: https://lingui.dev/ref/conf
 [package]: https://www.npmjs.com/package/@lingui/conf
 [badge-downloads]: https://img.shields.io/npm/dw/@lingui/conf.svg
 [badge-version]: https://img.shields.io/npm/v/@lingui/conf.svg
diff --git a/packages/conf/src/index.ts b/packages/conf/src/index.ts
index 0a75eb4d..8c3d463a 100644
--- a/packages/conf/src/index.ts
+++ b/packages/conf/src/index.ts
@@ -269,7 +269,7 @@ const deprecatedConfig = {
 export const configValidation = {
   exampleConfig,
   deprecatedConfig,
-  comment: "Documentation: https://lingui.js.org/ref/conf.html",
+  comment: "Documentation: https://lingui.dev/ref/conf",
 }
 
 function validateLocales(config) {
@@ -279,7 +279,7 @@ function validateLocales(config) {
       `Add ${chalk.yellow(
         "'locales'"
       )} to your configuration. See ${chalk.underline(
-        "https://lingui.js.org/ref/conf.html#locales"
+        "https://lingui.dev/ref/conf#locales"
       )}`
     )
   }
diff --git a/packages/core/README.md b/packages/core/README.md
index e6781094..753c0bb0 100644
--- a/packages/core/README.md
+++ b/packages/core/README.md
@@ -17,7 +17,7 @@ npm install --save @lingui/core
 
 ## Usage
 
-See the [tutorial][tutorial] or [reference][reference] documenation.
+See the [tutorial][tutorial] or [reference][reference] documentation.
 
 ## License
 
@@ -25,9 +25,9 @@ This package is licensed under [MIT][license] license.
 
 [license]: https://github.com/lingui/js-lingui/blob/main/LICENSE
 [linguijs]: https://github.com/lingui/js-lingui
-[documentation]: https://lingui.js.org/
-[tutorial]: https://lingui.js.org/tutorials/js.html
-[reference]: https://lingui.js.org/ref/core.html
+[documentation]: https://lingui.dev
+[tutorial]: https://lingui.dev/tutorials/javascript
+[reference]: https://lingui.dev/ref/core
 [package]: https://www.npmjs.com/package/@lingui/core
 [badge-downloads]: https://img.shields.io/npm/dw/@lingui/core.svg
 [badge-version]: https://img.shields.io/npm/v/@lingui/core.svg
diff --git a/packages/loader/README.md b/packages/loader/README.md
index 564d2e71..fdf5c986 100644
--- a/packages/loader/README.md
+++ b/packages/loader/README.md
@@ -18,7 +18,7 @@ npm install --save-dev @lingui/loader
 
 ## Usage
 
-See the [reference][reference] documenation.
+See the [reference][reference] documentation.
 
 ## License
 
@@ -26,8 +26,8 @@ This package is licensed under [MIT][license] license.
 
 [license]: https://github.com/lingui/js-lingui/blob/main/LICENSE
 [linguijs]: https://github.com/lingui/js-lingui
-[documentation]: https://lingui.js.org/
-[reference]: https://lingui.js.org/ref/loader.html
+[documentation]: https://lingui.dev
+[reference]: https://lingui.dev/ref/loader
 [package]: https://www.npmjs.com/package/@lingui/loader
 [badge-downloads]: https://img.shields.io/npm/dw/@lingui/loader.svg
 [badge-version]: https://img.shields.io/npm/v/@lingui/loader.svg
diff --git a/packages/macro/README.md b/packages/macro/README.md
index a36adca9..8dfd2e45 100644
--- a/packages/macro/README.md
+++ b/packages/macro/README.md
@@ -40,8 +40,8 @@ const message = i18n._(t`Hello, my name is ${name} and today is ${date(now)}`)
 
 [license]: https://github.com/lingui/js-lingui/blob/main/LICENSE
 [linguijs]: https://github.com/lingui/js-lingui
-[documentation]: https://lingui.js.org/
-[reference]: https://lingui.js.org/ref/macro/
+[documentation]: https://lingui.dev
+[reference]: https://lingui.dev/ref/macro/
 [package]: https://www.npmjs.com/package/@lingui/macro
 [badge-downloads]: https://img.shields.io/npm/dw/@lingui/macro.svg
 [badge-version]: https://img.shields.io/npm/v/@lingui/macro.svg
diff --git a/packages/macro/src/index.ts b/packages/macro/src/index.ts
index 643436e5..83974660 100644
--- a/packages/macro/src/index.ts
+++ b/packages/macro/src/index.ts
@@ -27,6 +27,22 @@ const getSymbolSource = (name: 'i18n' | 'Trans'): [source: string, identifier?:
 const [i18nImportModule, i18nImportName = "i18n"] = getSymbolSource("i18n")
 const [TransImportModule, TransImportName = "Trans"] = getSymbolSource("Trans")
 
+const jsMacroTags = new Set([
+  'defineMessage',
+  'arg',
+  't',
+  'plural',
+  'select',
+  'selectOrdinal'
+])
+
+const jsxMacroTags = new Set([
+  'Trans',
+  'Plural',
+  'Select',
+  'SelectOrdinal',
+])
+
 function macro({ references, state, babel }: MacroParams) {
   const jsxNodes: NodePath[] = []
   const jsNodes: NodePath[] = []
@@ -34,20 +50,18 @@ function macro({ references, state, babel }: MacroParams) {
 
   Object.keys(references).forEach((tagName) => {
     const nodes = references[tagName]
-    const macroType = getMacroType(tagName)
-    if (macroType == null) {
-      throw nodes[0].buildCodeFrameError(`Unknown macro ${tagName}`)
-    }
 
-    if (macroType === "js") {
+    if (jsMacroTags.has(tagName)) {
       nodes.forEach((node) => {
         jsNodes.push(node.parentPath)
       })
-    } else {
+    } else if(jsxMacroTags.has(tagName)) {
       nodes.forEach((node) => {
         // identifier.openingElement.jsxElement
         jsxNodes.push(node.parentPath.parentPath)
       })
+    } else {
+      throw nodes[0].buildCodeFrameError(`Unknown macro ${tagName}`)
     }
   })
 
@@ -131,21 +145,15 @@ const alreadyVisited = (path: NodePath) => {
   }
 }
 
-function getMacroType(tagName: string): string {
-  switch (tagName) {
-    case "defineMessage":
-    case "arg":
-    case "t":
-    case "plural":
-    case "select":
-    case "selectOrdinal":
-      return "js"
-    case "Trans":
-    case "Plural":
-    case "Select":
-    case "SelectOrdinal":
-      return "jsx"
-  }
-}
+[...jsMacroTags, ...jsxMacroTags].forEach((name) => {
+  Object.defineProperty(module.exports, name, {
+    get() {
+      throw new Error(`The macro you imported from "@lingui/macro" is being executed outside the context of compilation with babel-plugin-macros. `
+        + `This indicates that you don't have the babel plugin "babel-plugin-macros" configured correctly. `
+        + `Please see the documentation for how to configure babel-plugin-macros properly: `
+        + 'https://github.com/kentcdodds/babel-plugin-macros/blob/main/other/docs/user.md');
+    }
+  })
+})
 
 export default createMacro(macro)
diff --git a/packages/react/README.md b/packages/react/README.md
index 07fb2fbe..c59c25f9 100644
--- a/packages/react/README.md
+++ b/packages/react/README.md
@@ -17,7 +17,7 @@ npm install --save @lingui/react
 
 ## Usage
 
-See the [tutorial][tutorial] or [reference][reference] documenation.
+See the [tutorial][tutorial] or [reference][reference] documentation.
 
 ## License
 
@@ -25,9 +25,9 @@ See the [tutorial][tutorial] or [reference][reference] documenation.
 
 [license]: https://github.com/lingui/js-lingui/blob/main/LICENSE
 [linguijs]: https://github.com/lingui/js-lingui
-[documentation]: https://lingui.js.org/
-[tutorial]: https://lingui.js.org/tutorials/react.html
-[reference]: https://lingui.js.org/ref/react.html
+[documentation]: https://lingui.dev
+[tutorial]: https://lingui.dev/tutorials/react
+[reference]: https://lingui.dev/ref/react
 [package]: https://www.npmjs.com/package/@lingui/react
 [badge-downloads]: https://img.shields.io/npm/dw/@lingui/react.svg
 [badge-version]: https://img.shields.io/npm/v/@lingui/react.svg
diff --git a/packages/remote-loader/src/index.ts b/packages/remote-loader/src/index.ts
index 32416c5a..b998f24b 100644
--- a/packages/remote-loader/src/index.ts
+++ b/packages/remote-loader/src/index.ts
@@ -24,7 +24,7 @@ function remoteLoader<T>({ format = "minimal", fallbackMessages, messages}: Remo
   } else {
     throw new Error(`
         *format* value in the Lingui configuration is required to make this loader 100% functional
-        Read more about this here: https://lingui.js.org/ref/conf.html#format
+        Read more about this here: https://lingui.dev/ref/conf#format
       `)
   }
 
diff --git a/packages/snowpack-plugin/README.md b/packages/snowpack-plugin/README.md
index 60c5b44f..4668279b 100644
--- a/packages/snowpack-plugin/README.md
+++ b/packages/snowpack-plugin/README.md
@@ -35,7 +35,7 @@ module.exports = {
 
 [license]: https://github.com/lingui/js-lingui/blob/main/LICENSE
 [linguijs]: https://github.com/lingui/js-lingui
-[documentation]: https://lingui.js.org/
+[documentation]: https://lingui.dev
 [package]: https://www.npmjs.com/package/@lingui/snowpack-plugin
 [badge-downloads]: https://img.shields.io/npm/dw/@lingui/snowpack-plugin.svg
 [badge-version]: https://img.shields.io/npm/v/@lingui/snowpack-plugin.svg
diff --git a/scripts/verdaccio-release.js b/scripts/verdaccio-release.js
index db02f6af..fc23d474 100644
--- a/scripts/verdaccio-release.js
+++ b/scripts/verdaccio-release.js
@@ -12,33 +12,16 @@ async function releaseInVerdaccio() {
   )
   spinner.succeed()
 
-  spinner.start("Versioning packages")
-  const { stdout: actualBranch } = await exec("git rev-parse --abbrev-ref HEAD")
-  await exec(
-    `npx lerna version patch --exact --no-git-tag-version --force-publish --no-private --no-push --yes --allow-branch ${actualBranch}`
-  )
-  spinner.succeed()
-
   spinner.start("Building packages")
   await exec("yarn release:build")
   spinner.succeed()
 
-  spinner.start(
-    "Dont't mark files as changed to let publish, but not create a git history"
-  )
-  await exec("git commit --all -m \"TEMP: verdaccio release\"")
-
-  spinner.succeed()
+  spinner.start("Versioning and Publishing packages to local registry")
+  const { stdout: actualBranch } = await exec("git rev-parse --abbrev-ref HEAD")
 
-  spinner.start("Publishing packages to local registry")
   await exec(
-    `npx lerna publish from-package --force-publish --no-git-tag-version --no-private --no-push --yes --allow-branch ${actualBranch} --registry="http://0.0.0.0:4873"
-  `
-  )
-  spinner.succeed()
-
-  spinner.start("Reverting the changed files from index")
-  await exec("git reset --soft HEAD~1")
+    `npx lerna publish patch --force-publish --no-git-tag-version --no-private --no-push --yes --allow-branch ${actualBranch} --registry="http://0.0.0.0:4873"
+  `)
   spinner.succeed()
 
   console.log()
diff --git a/website/docs/introduction.md b/website/docs/introduction.md
index 98a674c2..52dd1d5c 100644
--- a/website/docs/introduction.md
+++ b/website/docs/introduction.md
@@ -74,7 +74,7 @@ export default function Lingui({ numUsers, name = "You" }) {
       {/* React Elements inside messages works in the same way as in JSX */}
       <p>
         <Trans id="msg.docs">
-          Read the <a href="https://lingui.js.org">documentation</a>
+          Read the <a href="https://lingui.dev">documentation</a>
           for more info.
         </Trans>
       </p>
diff --git a/website/docs/misc/react-intl.md b/website/docs/misc/react-intl.md
index e8dce522..a6a87607 100644
--- a/website/docs/misc/react-intl.md
+++ b/website/docs/misc/react-intl.md
@@ -20,7 +20,7 @@ Looking at the low-level API of [LinguiJS](https://github.com/lingui/js-lingui),
 ``` jsx
 <Trans
    id="welcome"
-   defaults={`Hello {name}, you have {unreadCount, number} {unreadCount, plural,
+   message={`Hello {name}, you have {unreadCount, number} {unreadCount, plural,
      one {message}
      other {messages}
    }`}
@@ -55,7 +55,7 @@ In [react-intl](https://github.com/yahoo/react-intl), this would be translated a
 ``` jsx
 <Trans
     id='msg.docs'
-    defaults='Read the <0>documentation</0>.'
+    message='Read the <0>documentation</0>.'
     components={[
         <a href="/docs" />
     ]}
@@ -86,7 +86,7 @@ All we need to do is to wrap the message in a [`Trans`](/docs/ref/macro.md#trans
 </p>
 ```
 
-The macro then parses the [`Trans`](/docs/ref/macro.md#trans) macro children and generates `defaults` and `components` props  automatically in the form described in the previous section.
+The macro then parses the [`Trans`](/docs/ref/macro.md#trans) macro children and generates `message` and `components` props  automatically in the form described in the previous section.
 
 This is extremely useful when adding i18n to an existing project. All we need is to wrap all messages in [`Trans`](/docs/ref/macro.md#trans) macro.
 
@@ -149,7 +149,7 @@ and the final message would be very similar:
 ``` jsx
 <Trans
    id="welcome"
-   defaults={`Hello <0>{name}</0>, you have {unreadCount, number} {unreadCount, plural,
+   message={`Hello <0>{name}</0>, you have {unreadCount, number} {unreadCount, plural,
      one {message}
      other {messages}
    }`}
diff --git a/website/docs/ref/catalog-formats.md b/website/docs/ref/catalog-formats.md
index 7200b96e..b236e721 100644
--- a/website/docs/ref/catalog-formats.md
+++ b/website/docs/ref/catalog-formats.md
@@ -91,7 +91,7 @@ This file format simply outputs all internal data in JSON format. It's the origi
 {
    "messageId": {
       "translation": "Translated message",
-      "defaults": "Default message",
+      "message": "Default message",
       "description": "Comment for translators",
       "origin": [["src/App.js", 3]]
    },
diff --git a/website/docs/ref/conf.md b/website/docs/ref/conf.md
index fea1d991..9353cafd 100644
--- a/website/docs/ref/conf.md
+++ b/website/docs/ref/conf.md
@@ -328,7 +328,7 @@ Format of message catalogs. Possible values are:
   {
     "MessageID": {
       "translation": "Translated Message",
-      "defaults": "Default string (from source code)",
+      "message": "Default string (from source code)",
       "origin": [
         ["path/to/src.js", 42]
       ]
diff --git a/website/docs/ref/core.md b/website/docs/ref/core.md
index 8754fbb1..fb911d9a 100644
--- a/website/docs/ref/core.md
+++ b/website/docs/ref/core.md
@@ -128,7 +128,7 @@ The core method for translating and formatting messages.
 
 `values` is an object of variables used in translated message.
 
-`options.defaults` is the default translation (optional). This is mostly used when application doesn't use message IDs in natural language (e.g.: `msg.id` or `Component.title`).
+`options.message` is the default translation (optional). This is mostly used when application doesn't use message IDs in natural language (e.g.: `msg.id` or `Component.title`).
 
 ``` js
 import { i18n } from "@lingui/core"
@@ -140,7 +140,7 @@ i18n._("Hello")
 i18n._("My name is {name}", { name: "Tom" })
 
 // Message with custom messageId
-i18n._("msg.id", { name: "Tom" }, { defaults: "My name is {name}" })
+i18n._("msg.id", { name: "Tom" }, { message: "My name is {name}" })
 ```
 
 ### `i18n.date(value: string | Date[, format: Intl.DateTimeFormatOptions])` {#i18n.date}
diff --git a/website/docs/tutorials/react.md b/website/docs/tutorials/react.md
index e1355744..3187b1f3 100644
--- a/website/docs/tutorials/react.md
+++ b/website/docs/tutorials/react.md
@@ -153,7 +153,7 @@ We're going to use [CLI](/docs/ref/cli.md) again. Run [`extract`](/docs/ref/cli.
 
 No locales defined!
 
-Add 'locales' to your configuration. See https://lingui.js.org/ref/conf.html#locales
+Add 'locales' to your configuration. See https://lingui.dev/ref/conf#locales
 ```
 
 We need here to fix the configuration. Create a `.linguirc` file:
@@ -418,7 +418,7 @@ By default, [LinguiJS](https://github.com/lingui/js-lingui) generates message ID
 This will generate:
 
 ```jsx
-<h1><Trans id="inbox.title" defaults="Message Inbox" /></h1>
+<h1><Trans id="inbox.title" message="Message Inbox" /></h1>
 ```
 
 In our message catalog, we'll see `inbox.title` as message ID, but we also get `Message Inbox` as default translation for English.
diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js
index 055e74ff..985b311f 100644
--- a/website/docusaurus.config.js
+++ b/website/docusaurus.config.js
@@ -4,7 +4,7 @@ const url = process.env['SITE_URL'] || 'https://lingui.dev';
 /** @type {import('@docusaurus/types').DocusaurusConfig} */
 module.exports = {
   title: 'Lingui',
-  tagline: 'Professional localization framework for global products',
+  tagline: 'Internationalization Framework for Global Products',
   url: url,
   baseUrl: '/',
   onBrokenLinks: 'throw',
@@ -24,10 +24,14 @@ module.exports = {
       items: [
         {
           to: '/introduction',
-          activeBasePath: '/introduction',
           label: 'Docs',
           position: 'left',
         },
+        {
+          to: '/misc/community',
+          label: 'Community',
+          position: 'left',
+        },
         {
           href: 'https://github.com/lingui/js-lingui',
           position: 'right',
diff --git a/website/src/components/Header.tsx b/website/src/components/Header.tsx
index f9503953..4607eec3 100644
--- a/website/src/components/Header.tsx
+++ b/website/src/components/Header.tsx
@@ -1,13 +1,27 @@
 import React from 'react';
 import clsx from 'clsx';
 import useBaseUrl from '@docusaurus/useBaseUrl';
+import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
+import Head from '@docusaurus/Head';
 import Button from './Button';
 
 import styles from './Header.module.scss';
 
 const Header = (): React.ReactElement => {
+  const context = useDocusaurusContext();
+  const { siteConfig = { title: '', tagline: '' } } = context;
+
   return (
     <header className={clsx('hero', styles.heroBanner)}>
+      <Head>
+        <title>{siteConfig.title}</title>
+        <meta property="og:image" content={'./img/og-image.png'} />
+        <meta property="og:title" content={siteConfig.title} />
+        <meta property="og:description" content={siteConfig.tagline} />
+        <meta property="og:image:width" content="1200" />
+        <meta property="og:image:height" content="630" />
+      </Head>
+
       <div className={clsx(styles.heroBannerHolder)}>
         <div className={clsx(styles.heroBannerContainer, 'container')}>
           <div className="row">
@@ -18,15 +32,15 @@ const Header = (): React.ReactElement => {
                 src={'./img/lingui-logo.svg'}
                 alt="Lingui"
               />
-              <h1 className={clsx(styles.heroTitle)}>Internationalization Framework for Global Products</h1>
+              <h1 className={clsx(styles.heroTitle)}>{siteConfig.tagline}</h1>
               <p className={'margin-bottom--lg'}>
                 JavaScript library for internalization (i18n) of JavaScript projects, including React, Vue, Node.js, and
                 Angular.
               </p>
 
               <div className={clsx(styles.heroButtons, 'name', 'margin-vert--md')}>
-                <Button href={useBaseUrl('/introduction')}>Get Started</Button>
-                <Button href={useBaseUrl('/tutorials/setup-react')} isOutline={true}>
+                <Button href={useBaseUrl('/tutorials/setup-react')}>Get Started</Button>
+                <Button href={useBaseUrl('/introduction')} isOutline={true}>
                   Learn More
                 </Button>
               </div>


Test patch:
diff --git a/.github/workflows/release-test.yml b/.github/workflows/release-test.yml
index 0f9b1d5a..d1ad17af 100644
--- a/.github/workflows/release-test.yml
+++ b/.github/workflows/release-test.yml
@@ -1,6 +1,9 @@
 name: release-workflow-test
 
 on:
+  pull_request:
+    branches:
+      - '*'
   push:
     branches:
       - main
@@ -28,7 +31,7 @@ jobs:
 
       - name: Publish with Verdaccio
         run: |
-          git checkout ${{ github.head_ref }}
+          git switch -c "pull-request"
           npm i -g {verdaccio,verdaccio-auth-memory,verdaccio-memory}
           mkdir -p $HOME/.config/verdaccio
           cp --verbose .github/verdaccio/config.yaml $HOME/.config/verdaccio/config.yaml
diff --git a/packages/conf/src/__snapshots__/index.test.ts.snap b/packages/conf/src/__snapshots__/index.test.ts.snap
index d4d6285b..0196d64b 100644
--- a/packages/conf/src/__snapshots__/index.test.ts.snap
+++ b/packages/conf/src/__snapshots__/index.test.ts.snap
@@ -24,7 +24,7 @@ exports[`@lingui/conf catalogMigration should show deprecation warning 1`] = `
     Please update your configuration.
     
 
-Documentation: https://lingui.js.org/ref/conf.html
+Documentation: https://lingui.dev/ref/conf
 ● Deprecation Warning:
 
  Option srcPathDirs is deprecated. Configure source paths using catalogs instead.
@@ -48,7 +48,7 @@ Documentation: https://lingui.js.org/ref/conf.html
     Please update your configuration.
     
 
-Documentation: https://lingui.js.org/ref/conf.html
+Documentation: https://lingui.dev/ref/conf
 ● Deprecation Warning:
 
  Option srcPathIgnorePatterns is deprecated. Configure excluded source paths using catalogs instead.
@@ -72,7 +72,7 @@ Documentation: https://lingui.js.org/ref/conf.html
     Please update your configuration.
     
 
-Documentation: https://lingui.js.org/ref/conf.html
+Documentation: https://lingui.dev/ref/conf
 `;
 
 exports[`@lingui/conf config file fallbackLocales logic if fallbackLocale is defined, we use the default one on fallbackLocales 1`] = `
@@ -92,7 +92,7 @@ exports[`@lingui/conf config file fallbackLocales logic if fallbackLocale is def
     Please update your configuration.
     
 
-Documentation: https://lingui.js.org/ref/conf.html
+Documentation: https://lingui.dev/ref/conf
 `;
 
 exports[`@lingui/conf should return default config 1`] = `
diff --git a/packages/macro/test/index.ts b/packages/macro/test/index.ts
index 7698d6bd..038b065d 100644
--- a/packages/macro/test/index.ts
+++ b/packages/macro/test/index.ts
@@ -28,6 +28,8 @@ const testCases: Record<string, TestCase[]> = {
 }
 
 describe("macro", function () {
+  process.env.LINGUI_CONFIG = path.join(__dirname, "lingui.config.js")
+
   const babelOptions: TransformOptions = {
     filename: "<filename>",
     configFile: false,
@@ -54,7 +56,16 @@ describe("macro", function () {
 
       cases.forEach(
         (
-          { name, input, expected, filename, production, useTypescriptPreset, only, skip },
+          {
+            name,
+            input,
+            expected,
+            filename,
+            production,
+            useTypescriptPreset,
+            only,
+            skip,
+          },
           index
         ) => {
           let run = it
@@ -73,8 +84,6 @@ describe("macro", function () {
               babelOptions.presets.push("@babel/preset-typescript")
             }
 
-            process.env.LINGUI_CONFIG = path.join(__dirname, "lingui.config.js")
-
             try {
               if (filename) {
                 const inputPath = path.relative(
@@ -111,6 +120,17 @@ describe("macro", function () {
     })
   })
 
+  it("Should throw error if used without babel-macro-plugin", async () => {
+    await expect(
+      async () => {
+        const mod = await import("../src/index");
+        return (mod as unknown as typeof import('@lingui/macro')).Trans
+      }
+    ).rejects.toThrow(
+      'The macro you imported from "@lingui/macro"'
+    )
+  })
+
   describe.skip("validation", function () {
     describe("plural/select/selectordinal", function () {
       it("value is missing", function () {