diff --git a/packages/cli/test/extract-partial-consistency/existing/en.po b/packages/cli/test/extract-partial-consistency/existing/en.po
new file mode 100644
index 000000000..7564ea414
--- /dev/null
+++ b/packages/cli/test/extract-partial-consistency/existing/en.po
@@ -0,0 +1,53 @@
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2023-03-15 10:00+0000\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: @lingui/cli\n"
+"Language: en\n"
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Plural-Forms: \n"
+
+#. js-lingui-explicit-id
+#: fixtures/file-a.ts:11
+#~ msgid "custom.id"
+#~ msgstr "This message has custom id"
+
+#. js-lingui-explicit-id
+#: fixtures/file-a.ts:22
+#: fixtures/file-a.ts:23
+msgid "addToCart"
+msgstr "Add To Cart with change ignored"
+
+#. this is a comment
+#: fixtures/file-b.tsx:6
+msgid "Hello this is JSX Translation"
+msgstr "Hello this is JSX Translation"
+
+#: fixtures/file-b.tsx:11
+msgctxt "my context"
+msgid "Hello this is JSX Translation"
+msgstr "Hello this is JSX Translation"
+
+#: fixtures/file-a.ts:4
+msgid "Hello world"
+msgstr "Hello world"
+
+#: fixtures/file-a.ts:6
+msgctxt "custom context"
+msgid "Hello world"
+msgstr "Hello world"
+
+#: fixtures/file-a.ts:16
+msgid "Message in descriptor"
+msgstr "Message in descriptor"
+
+#. js-lingui-explicit-id
+#: fixtures/file-b.tsx:15
+msgid "jsx.custom.id"
+msgstr "This JSX element has custom id"
diff --git a/packages/cli/test/extract-partial-consistency/expected/en.po b/packages/cli/test/extract-partial-consistency/expected/en.po
new file mode 100644
index 000000000..7564ea414
--- /dev/null
+++ b/packages/cli/test/extract-partial-consistency/expected/en.po
@@ -0,0 +1,53 @@
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2023-03-15 10:00+0000\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: @lingui/cli\n"
+"Language: en\n"
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Plural-Forms: \n"
+
+#. js-lingui-explicit-id
+#: fixtures/file-a.ts:11
+#~ msgid "custom.id"
+#~ msgstr "This message has custom id"
+
+#. js-lingui-explicit-id
+#: fixtures/file-a.ts:22
+#: fixtures/file-a.ts:23
+msgid "addToCart"
+msgstr "Add To Cart with change ignored"
+
+#. this is a comment
+#: fixtures/file-b.tsx:6
+msgid "Hello this is JSX Translation"
+msgstr "Hello this is JSX Translation"
+
+#: fixtures/file-b.tsx:11
+msgctxt "my context"
+msgid "Hello this is JSX Translation"
+msgstr "Hello this is JSX Translation"
+
+#: fixtures/file-a.ts:4
+msgid "Hello world"
+msgstr "Hello world"
+
+#: fixtures/file-a.ts:6
+msgctxt "custom context"
+msgid "Hello world"
+msgstr "Hello world"
+
+#: fixtures/file-a.ts:16
+msgid "Message in descriptor"
+msgstr "Message in descriptor"
+
+#. js-lingui-explicit-id
+#: fixtures/file-b.tsx:15
+msgid "jsx.custom.id"
+msgstr "This JSX element has custom id"
diff --git a/packages/cli/test/extract-partial-consistency/fixtures/file-a.ts b/packages/cli/test/extract-partial-consistency/fixtures/file-a.ts
new file mode 100644
index 000000000..87f894eb9
--- /dev/null
+++ b/packages/cli/test/extract-partial-consistency/fixtures/file-a.ts
@@ -0,0 +1,23 @@
+import { i18n } from "@lingui/core"
+import { defineMessage, t } from "@lingui/macro"
+
+const msg = t`Hello world`
+
+const msg2 = t({
+ message: "Hello world",
+ context: "custom context",
+})
+
+const msg3 = null /* original translation commented to mark message obsolete *//*t({
+ message: "This message has custom id",
+ id: "custom.id",
+})*/
+
+const msgDescriptor = defineMessage({
+ message: "Message in descriptor",
+})
+
+i18n._(msgDescriptor)
+
+i18n._("addToCart")
+i18n._({id: "addToCart", message: "Add To Cart with change ignored"})
\ No newline at end of file
diff --git a/packages/cli/test/extract-partial-consistency/fixtures/file-b.tsx b/packages/cli/test/extract-partial-consistency/fixtures/file-b.tsx
new file mode 100644
index 000000000..5c771448f
--- /dev/null
+++ b/packages/cli/test/extract-partial-consistency/fixtures/file-b.tsx
@@ -0,0 +1,16 @@
+import { Trans } from "@lingui/macro"
+import React from "react"
+
+export function MyComponent() {
+ return (
+ Hello this is JSX Translation
+ )
+}
+
+export function MyComponent2() {
+ return Hello this is JSX Translation
+}
+
+export function MyComponent3() {
+ return This JSX element has custom id
+}
diff --git a/packages/cli/test/index.test.ts b/packages/cli/test/index.test.ts
index e53d3b81a..622b28a4c 100644
--- a/packages/cli/test/index.test.ts
+++ b/packages/cli/test/index.test.ts
@@ -5,6 +5,7 @@ import { command as compileCommand } from "../src/lingui-compile"
import fs from "fs/promises"
import os from "os"
import nodepath from "path"
+import glob from "glob"
import { makeConfig } from "@lingui/conf"
import { listingToHumanReadable, readFsToJson } from "../src/tests"
import { getConsoleMockCalls, mockConsole } from "@lingui/jest-mocks"
@@ -22,13 +23,18 @@ async function prepare(caseFolderName: string) {
const actualPath = nodepath.join(rootDir, "actual")
const expectedPath = nodepath.join(rootDir, "expected")
+ const existingPath = nodepath.join(rootDir, "existing")
await fs.rm(actualPath, {
recursive: true,
force: true,
})
- return { rootDir, actualPath, expectedPath }
+ if (glob.sync(existingPath).length === 1) {
+ await fs.cp(existingPath, actualPath, { recursive: true })
+ }
+
+ return { rootDir, actualPath, existingPath, expectedPath }
}
describe("E2E Extractor Test", () => {
@@ -288,4 +294,31 @@ describe("E2E Extractor Test", () => {
compareFolders(actualPath, expectedPath)
})
})
+
+ it("should extract consistently with files argument", async () => {
+ const { rootDir, actualPath, expectedPath } = await prepare(
+ "extract-partial-consistency"
+ )
+
+ await extractCommand(
+ makeConfig({
+ rootDir: rootDir,
+ locales: ["en"],
+ sourceLocale: "en",
+ format: "po",
+ catalogs: [
+ {
+ path: "/actual/{locale}",
+ include: ["/fixtures"],
+ },
+ ],
+ }),
+ {
+ files: [nodepath.join(rootDir, "fixtures", "file-b.tsx")]
+ }
+ )
+
+ compareFolders(actualPath, expectedPath)
+ })
+
})