From 6331408bae53d09245b9bc91824aa5bb8bccfe44 Mon Sep 17 00:00:00 2001 From: Long Ho Date: Sun, 17 Sep 2023 21:40:39 -0400 Subject: [PATCH] feat(@formatjs/cli): allow formatter to provide custom serialization fn, fix #4149 --- packages/cli-lib/src/extract.ts | 7 +- packages/cli-lib/src/formatters/default.ts | 5 +- packages/cli-lib/src/formatters/index.ts | 5 +- packages/cli-lib/src/formatters/smartling.ts | 2 +- .../__snapshots__/integration.test.ts.snap | 765 +++++++++--------- packages/cli/integration-tests/formatter.js | 4 + 6 files changed, 381 insertions(+), 407 deletions(-) diff --git a/packages/cli-lib/src/extract.ts b/packages/cli-lib/src/extract.ts index 39efc5ec75..90aa0fa552 100644 --- a/packages/cli-lib/src/extract.ts +++ b/packages/cli-lib/src/extract.ts @@ -198,7 +198,7 @@ export async function extract( ) } - const formatter = await resolveBuiltinFormatter(opts.format) + const formatter: Formatter = await resolveBuiltinFormatter(opts.format) const extractionResults = rawResults.filter((r): r is ExtractionResult => !!r) const extractedMessages = new Map() @@ -247,7 +247,10 @@ ${JSON.stringify(message, undefined, 2)}` } results[id] = msg } - return stringify(formatter.format(results), { + if (typeof formatter.serialize === 'function') { + return formatter.serialize(formatter.format(results as any)) + } + return stringify(formatter.format(results as any), { space: 2, cmp: formatter.compareMessages || undefined, }) diff --git a/packages/cli-lib/src/formatters/default.ts b/packages/cli-lib/src/formatters/default.ts index d44b2cc955..6428d7ce6b 100644 --- a/packages/cli-lib/src/formatters/default.ts +++ b/packages/cli-lib/src/formatters/default.ts @@ -1,5 +1,4 @@ import {MessageDescriptor} from '@formatjs/ts-transformer' - export type FormatFn> = ( msgs: Record ) => T @@ -8,6 +7,10 @@ export type CompileFn> = ( msgs: T ) => Record +export type SerializeFn> = ( + msgs: T +) => string + export const format: FormatFn = msgs => msgs export const compile: CompileFn = msgs => { diff --git a/packages/cli-lib/src/formatters/index.ts b/packages/cli-lib/src/formatters/index.ts index 1706eca689..e6082643d2 100644 --- a/packages/cli-lib/src/formatters/index.ts +++ b/packages/cli-lib/src/formatters/index.ts @@ -1,15 +1,16 @@ import * as defaultFormatter from './default' -import {FormatFn, CompileFn} from './default' +import {FormatFn, SerializeFn, CompileFn} from './default' import * as transifex from './transifex' import * as smartling from './smartling' import * as simple from './simple' import * as lokalise from './lokalise' import * as crowdin from './crowdin' -import {Comparator} from 'json-stable-stringify' +import type {Comparator} from 'json-stable-stringify' import {resolve} from 'path' import {pathToFileURL} from 'url' export interface Formatter { + serialize: SerializeFn format: FormatFn compile: CompileFn compareMessages?: Comparator diff --git a/packages/cli-lib/src/formatters/smartling.ts b/packages/cli-lib/src/formatters/smartling.ts index f9ac9b97dc..f8fe7fda3a 100644 --- a/packages/cli-lib/src/formatters/smartling.ts +++ b/packages/cli-lib/src/formatters/smartling.ts @@ -1,4 +1,4 @@ -import {Comparator} from 'json-stable-stringify' +import type {Comparator} from 'json-stable-stringify' import {CompileFn, FormatFn} from './default' export interface SmartlingDirectives { diff --git a/packages/cli/integration-tests/extract/__snapshots__/integration.test.ts.snap b/packages/cli/integration-tests/extract/__snapshots__/integration.test.ts.snap index aed2034750..44af39dcfb 100644 --- a/packages/cli/integration-tests/extract/__snapshots__/integration.test.ts.snap +++ b/packages/cli/integration-tests/extract/__snapshots__/integration.test.ts.snap @@ -4,39 +4,39 @@ exports[`[glob] basic case: defineMessages -> stdout 1`] = ` { "stderr": "", "stdout": "{ - \"286VP8\": { - \"defaultMessage\": \"No ID\", - \"description\": \"no ID\" + "286VP8": { + "defaultMessage": "No ID", + "description": "no ID" }, - \"OvR0NS\": { - \"defaultMessage\": \"I have {count, plural, one{a dog} other{many dogs}}\" + "OvR0NS": { + "defaultMessage": "I have {count, plural, one{a dog} other{many dogs}}" }, - \"app.home.kittens\": { - \"defaultMessage\": \"{count, plural, =0 {😭} one {# kitten} other {# kittens}}\", - \"description\": \"Counts kittens\" + "app.home.kittens": { + "defaultMessage": "{count, plural, =0 {😭} one {# kitten} other {# kittens}}", + "description": "Counts kittens" }, - \"escaped.apostrophe\": { - \"defaultMessage\": \"A quoted value ''{value}'\", - \"description\": \"Escaped apostrophe\" + "escaped.apostrophe": { + "defaultMessage": "A quoted value ''{value}'", + "description": "Escaped apostrophe" }, - \"foo.bar.baz\": { - \"defaultMessage\": \"Hello World!\", - \"description\": \"The default message\" + "foo.bar.baz": { + "defaultMessage": "Hello World!", + "description": "The default message" }, - \"foo.bar.biff\": { - \"defaultMessage\": \"Hello Nurse!\", - \"description\": \"Another message\" + "foo.bar.biff": { + "defaultMessage": "Hello Nurse!", + "description": "Another message" }, - \"ignore\": { - \"defaultMessage\": \"ignore\" + "ignore": { + "defaultMessage": "ignore" }, - \"inline-msg\": { - \"defaultMessage\": \"inline message\", - \"description\": \"inline description\" + "inline-msg": { + "defaultMessage": "inline message", + "description": "inline description" }, - \"trailing.ws\": { - \"defaultMessage\": \"Some whitespace\", - \"description\": \"Whitespace\" + "trailing.ws": { + "defaultMessage": "Some whitespace", + "description": "Whitespace" } } ", @@ -182,36 +182,36 @@ exports[`basic case: defineMessages -> stdout 1`] = ` { "stderr": "", "stdout": "{ - \"286VP8\": { - \"defaultMessage\": \"No ID\", - \"description\": \"no ID\" + "286VP8": { + "defaultMessage": "No ID", + "description": "no ID" }, - \"OvR0NS\": { - \"defaultMessage\": \"I have {count, plural, one{a dog} other{many dogs}}\" + "OvR0NS": { + "defaultMessage": "I have {count, plural, one{a dog} other{many dogs}}" }, - \"app.home.kittens\": { - \"defaultMessage\": \"{count, plural, =0 {😭} one {# kitten} other {# kittens}}\", - \"description\": \"Counts kittens\" + "app.home.kittens": { + "defaultMessage": "{count, plural, =0 {😭} one {# kitten} other {# kittens}}", + "description": "Counts kittens" }, - \"escaped.apostrophe\": { - \"defaultMessage\": \"A quoted value ''{value}'\", - \"description\": \"Escaped apostrophe\" + "escaped.apostrophe": { + "defaultMessage": "A quoted value ''{value}'", + "description": "Escaped apostrophe" }, - \"foo.bar.baz\": { - \"defaultMessage\": \"Hello World!\", - \"description\": \"The default message\" + "foo.bar.baz": { + "defaultMessage": "Hello World!", + "description": "The default message" }, - \"foo.bar.biff\": { - \"defaultMessage\": \"Hello Nurse!\", - \"description\": \"Another message\" + "foo.bar.biff": { + "defaultMessage": "Hello Nurse!", + "description": "Another message" }, - \"inline-msg\": { - \"defaultMessage\": \"inline message\", - \"description\": \"inline description\" + "inline-msg": { + "defaultMessage": "inline message", + "description": "inline description" }, - \"trailing.ws\": { - \"defaultMessage\": \"Some whitespace\", - \"description\": \"Whitespace\" + "trailing.ws": { + "defaultMessage": "Some whitespace", + "description": "Whitespace" } } ", @@ -241,7 +241,7 @@ Options: --id-interpolation-pattern If certain message descriptors don't have id, this \`pattern\` will be used to automatically generate IDs for them. Default to \`[sha512:contenthash:base64:6]\` where \`contenthash\` is the hash of \`defaultMessage\` and \`description\`. - See https://github.com/webpack/loader-utils#interpolatename for sample patterns (default: \"[sha512:contenthash:base64:6]\") + See https://github.com/webpack/loader-utils#interpolatename for sample patterns (default: "[sha512:contenthash:base64:6]") --extract-source-location Whether the metadata about the location of the message in the source file should be extracted. If \`true\`, then \`file\`, \`start\`, and \`end\` fields will exist for each extracted message descriptors. (default: false) @@ -259,14 +259,14 @@ Options: // @intl-meta project:my-custom-project import {FormattedMessage} from 'react-intl'; - ; + ; \`\`\` - and with option \`{pragma: \"intl-meta\"}\`, we'll parse out \`// @intl-meta project:my-custom-project\` into \`{project: 'my-custom-project'}\` in the result file. + and with option \`{pragma: "intl-meta"}\`, we'll parse out \`// @intl-meta project:my-custom-project\` into \`{project: 'my-custom-project'}\` in the result file. --preserve-whitespace Whether to preserve whitespace and newlines. --flatten Whether to hoist selectors & flatten sentences as much as possible. E.g: - \"I have {count, plural, one{a dog} other{many dogs}}\" - becomes \"{count, plural, one{I have a dog} other{I have many dogs}}\". + "I have {count, plural, one{a dog} other{many dogs}}" + becomes "{count, plural, one{I have a dog} other{I have many dogs}}". The goal is to provide as many full sentences as possible since fragmented sentences are not translator-friendly. -h, --help display help for command @@ -286,36 +286,36 @@ exports[`flatten defineMessages -> stdout 1`] = ` { "stderr": "", "stdout": "{ - \"286VP8\": { - \"defaultMessage\": \"No ID\", - \"description\": \"no ID\" + "286VP8": { + "defaultMessage": "No ID", + "description": "no ID" }, - \"OvR0NS\": { - \"defaultMessage\": \"{count,plural,one{I have a dog} other{I have many dogs}}\" + "OvR0NS": { + "defaultMessage": "{count,plural,one{I have a dog} other{I have many dogs}}" }, - \"app.home.kittens\": { - \"defaultMessage\": \"{count,plural,=0{😭} one{# kitten} other{# kittens}}\", - \"description\": \"Counts kittens\" + "app.home.kittens": { + "defaultMessage": "{count,plural,=0{😭} one{# kitten} other{# kittens}}", + "description": "Counts kittens" }, - \"escaped.apostrophe\": { - \"defaultMessage\": \"A quoted value ''{value}''\", - \"description\": \"Escaped apostrophe\" + "escaped.apostrophe": { + "defaultMessage": "A quoted value ''{value}''", + "description": "Escaped apostrophe" }, - \"foo.bar.baz\": { - \"defaultMessage\": \"Hello World!\", - \"description\": \"The default message\" + "foo.bar.baz": { + "defaultMessage": "Hello World!", + "description": "The default message" }, - \"foo.bar.biff\": { - \"defaultMessage\": \"Hello Nurse!\", - \"description\": \"Another message\" + "foo.bar.biff": { + "defaultMessage": "Hello Nurse!", + "description": "Another message" }, - \"inline-msg\": { - \"defaultMessage\": \"inline message\", - \"description\": \"inline description\" + "inline-msg": { + "defaultMessage": "inline message", + "description": "inline description" }, - \"trailing.ws\": { - \"defaultMessage\": \"Some whitespace\", - \"description\": \"Whitespace\" + "trailing.ws": { + "defaultMessage": "Some whitespace", + "description": "Whitespace" } } ", @@ -365,52 +365,52 @@ exports[`ignore -> stdout TS 1`] = ` { "stderr": "", "stdout": "{ - \"286VP8\": { - \"defaultMessage\": \"No ID\", - \"description\": \"no ID\" + "286VP8": { + "defaultMessage": "No ID", + "description": "no ID" }, - \"app.home.kittens\": { - \"defaultMessage\": \"{count, plural, =0 {😭} one {# kitten} other {# kittens}}\", - \"description\": \"Counts kittens\" + "app.home.kittens": { + "defaultMessage": "{count, plural, =0 {😭} one {# kitten} other {# kittens}}", + "description": "Counts kittens" }, - \"eCy8Eo\": { - \"defaultMessage\": \"No Desc\" + "eCy8Eo": { + "defaultMessage": "No Desc" }, - \"escaped.apostrophe\": { - \"defaultMessage\": \"A quoted value ''{value}'\", - \"description\": \"Escaped apostrophe\" + "escaped.apostrophe": { + "defaultMessage": "A quoted value ''{value}'", + "description": "Escaped apostrophe" }, - \"foo.bar.baz\": { - \"defaultMessage\": \"Hello World!\", - \"description\": \"The default message\" + "foo.bar.baz": { + "defaultMessage": "Hello World!", + "description": "The default message" }, - \"foo.bar.biff\": { - \"defaultMessage\": \"Hello Nurse!\", - \"description\": \"Another message\" + "foo.bar.biff": { + "defaultMessage": "Hello Nurse!", + "description": "Another message" }, - \"inline\": { - \"defaultMessage\": \"formatted message\", - \"description\": \"foo\" + "inline": { + "defaultMessage": "formatted message", + "description": "foo" }, - \"inline.linebreak\": { - \"defaultMessage\": \"formatted message with linebreak\", - \"description\": \"foo\\n\\t\\t\\t\\t\\t\\tbar\" + "inline.linebreak": { + "defaultMessage": "formatted message with linebreak", + "description": "foo\\n\\t\\t\\t\\t\\t\\tbar" }, - \"linebreak\": { - \"defaultMessage\": \"this is a message\", - \"description\": \"this is\\na\\ndescription\" + "linebreak": { + "defaultMessage": "this is a message", + "description": "this is\\na\\ndescription" }, - \"newline\": { - \"defaultMessage\": \"this is a message\", - \"description\": \"this is a description\" + "newline": { + "defaultMessage": "this is a message", + "description": "this is a description" }, - \"templateLinebreak\": { - \"defaultMessage\": \"this is a message\", - \"description\": \"this is\\n a\\n description\" + "templateLinebreak": { + "defaultMessage": "this is a message", + "description": "this is\\n a\\n description" }, - \"trailing.ws\": { - \"defaultMessage\": \"Some whitespace\", - \"description\": \"Whitespace\" + "trailing.ws": { + "defaultMessage": "Some whitespace", + "description": "Whitespace" } } ", @@ -440,67 +440,67 @@ exports[`pragma 1`] = ` { "stderr": "", "stdout": "{ - \"286VP8\": { - \"defaultMessage\": \"No ID\", - \"description\": \"no ID\", - \"meta\": { - \"baz\": \"1\", - \"foo\": \"bar\" + "286VP8": { + "defaultMessage": "No ID", + "description": "no ID", + "meta": { + "baz": "1", + "foo": "bar" } }, - \"app.home.kittens\": { - \"defaultMessage\": \"{count, plural, =0 {😭} one {# kitten} other {# kittens}}\", - \"description\": \"Counts kittens\", - \"meta\": { - \"baz\": \"1\", - \"foo\": \"bar\" + "app.home.kittens": { + "defaultMessage": "{count, plural, =0 {😭} one {# kitten} other {# kittens}}", + "description": "Counts kittens", + "meta": { + "baz": "1", + "foo": "bar" } }, - \"eCy8Eo\": { - \"defaultMessage\": \"No Desc\", - \"meta\": { - \"baz\": \"1\", - \"foo\": \"bar\" + "eCy8Eo": { + "defaultMessage": "No Desc", + "meta": { + "baz": "1", + "foo": "bar" } }, - \"escaped.apostrophe\": { - \"defaultMessage\": \"A quoted value ''{value}'\", - \"description\": \"Escaped apostrophe\", - \"meta\": { - \"baz\": \"1\", - \"foo\": \"bar\" + "escaped.apostrophe": { + "defaultMessage": "A quoted value ''{value}'", + "description": "Escaped apostrophe", + "meta": { + "baz": "1", + "foo": "bar" } }, - \"foo.bar.baz\": { - \"defaultMessage\": \"Hello World!\", - \"description\": \"The default message\", - \"meta\": { - \"baz\": \"1\", - \"foo\": \"bar\" + "foo.bar.baz": { + "defaultMessage": "Hello World!", + "description": "The default message", + "meta": { + "baz": "1", + "foo": "bar" } }, - \"foo.bar.biff\": { - \"defaultMessage\": \"Hello Nurse!\", - \"description\": \"Another message\", - \"meta\": { - \"baz\": \"1\", - \"foo\": \"bar\" + "foo.bar.biff": { + "defaultMessage": "Hello Nurse!", + "description": "Another message", + "meta": { + "baz": "1", + "foo": "bar" } }, - \"inline\": { - \"defaultMessage\": \"formatted message\", - \"description\": \"foo\", - \"meta\": { - \"baz\": \"1\", - \"foo\": \"bar\" + "inline": { + "defaultMessage": "formatted message", + "description": "foo", + "meta": { + "baz": "1", + "foo": "bar" } }, - \"trailing.ws\": { - \"defaultMessage\": \"Some whitespace\", - \"description\": \"Whitespace\", - \"meta\": { - \"baz\": \"1\", - \"foo\": \"bar\" + "trailing.ws": { + "defaultMessage": "Some whitespace", + "description": "Whitespace", + "meta": { + "baz": "1", + "foo": "bar" } } } @@ -512,52 +512,52 @@ exports[`typescript -> stdout 1`] = ` { "stderr": "", "stdout": "{ - \"286VP8\": { - \"defaultMessage\": \"No ID\", - \"description\": \"no ID\" + "286VP8": { + "defaultMessage": "No ID", + "description": "no ID" }, - \"app.home.kittens\": { - \"defaultMessage\": \"{count, plural, =0 {😭} one {# kitten} other {# kittens}}\", - \"description\": \"Counts kittens\" + "app.home.kittens": { + "defaultMessage": "{count, plural, =0 {😭} one {# kitten} other {# kittens}}", + "description": "Counts kittens" }, - \"eCy8Eo\": { - \"defaultMessage\": \"No Desc\" + "eCy8Eo": { + "defaultMessage": "No Desc" }, - \"escaped.apostrophe\": { - \"defaultMessage\": \"A quoted value ''{value}'\", - \"description\": \"Escaped apostrophe\" + "escaped.apostrophe": { + "defaultMessage": "A quoted value ''{value}'", + "description": "Escaped apostrophe" }, - \"foo.bar.baz\": { - \"defaultMessage\": \"Hello World!\", - \"description\": \"The default message\" + "foo.bar.baz": { + "defaultMessage": "Hello World!", + "description": "The default message" }, - \"foo.bar.biff\": { - \"defaultMessage\": \"Hello Nurse!\", - \"description\": \"Another message\" + "foo.bar.biff": { + "defaultMessage": "Hello Nurse!", + "description": "Another message" }, - \"inline\": { - \"defaultMessage\": \"formatted message\", - \"description\": \"foo\" + "inline": { + "defaultMessage": "formatted message", + "description": "foo" }, - \"inline.linebreak\": { - \"defaultMessage\": \"formatted message with linebreak\", - \"description\": \"foo\\n\\t\\t\\t\\t\\t\\tbar\" + "inline.linebreak": { + "defaultMessage": "formatted message with linebreak", + "description": "foo\\n\\t\\t\\t\\t\\t\\tbar" }, - \"linebreak\": { - \"defaultMessage\": \"this is a message\", - \"description\": \"this is\\na\\ndescription\" + "linebreak": { + "defaultMessage": "this is a message", + "description": "this is\\na\\ndescription" }, - \"newline\": { - \"defaultMessage\": \"this is a message\", - \"description\": \"this is a description\" + "newline": { + "defaultMessage": "this is a message", + "description": "this is a description" }, - \"templateLinebreak\": { - \"defaultMessage\": \"this is a message\", - \"description\": \"this is\\n a\\n description\" + "templateLinebreak": { + "defaultMessage": "this is a message", + "description": "this is\\n a\\n description" }, - \"trailing.ws\": { - \"defaultMessage\": \"Some whitespace\", - \"description\": \"Whitespace\" + "trailing.ws": { + "defaultMessage": "Some whitespace", + "description": "Whitespace" } } ", @@ -568,52 +568,52 @@ exports[`typescript -> stdout with crowdin 1`] = ` { "stderr": "", "stdout": "{ - \"286VP8\": { - \"description\": \"no ID\", - \"message\": \"No ID\" + "286VP8": { + "description": "no ID", + "message": "No ID" }, - \"app.home.kittens\": { - \"description\": \"Counts kittens\", - \"message\": \"{count, plural, =0 {😭} one {# kitten} other {# kittens}}\" + "app.home.kittens": { + "description": "Counts kittens", + "message": "{count, plural, =0 {😭} one {# kitten} other {# kittens}}" }, - \"eCy8Eo\": { - \"message\": \"No Desc\" + "eCy8Eo": { + "message": "No Desc" }, - \"escaped.apostrophe\": { - \"description\": \"Escaped apostrophe\", - \"message\": \"A quoted value ''{value}'\" + "escaped.apostrophe": { + "description": "Escaped apostrophe", + "message": "A quoted value ''{value}'" }, - \"foo.bar.baz\": { - \"description\": \"The default message\", - \"message\": \"Hello World!\" + "foo.bar.baz": { + "description": "The default message", + "message": "Hello World!" }, - \"foo.bar.biff\": { - \"description\": \"Another message\", - \"message\": \"Hello Nurse!\" + "foo.bar.biff": { + "description": "Another message", + "message": "Hello Nurse!" }, - \"inline\": { - \"description\": \"foo\", - \"message\": \"formatted message\" + "inline": { + "description": "foo", + "message": "formatted message" }, - \"inline.linebreak\": { - \"description\": \"foo\\n\\t\\t\\t\\t\\t\\tbar\", - \"message\": \"formatted message with linebreak\" + "inline.linebreak": { + "description": "foo\\n\\t\\t\\t\\t\\t\\tbar", + "message": "formatted message with linebreak" }, - \"linebreak\": { - \"description\": \"this is\\na\\ndescription\", - \"message\": \"this is a message\" + "linebreak": { + "description": "this is\\na\\ndescription", + "message": "this is a message" }, - \"newline\": { - \"description\": \"this is a description\", - \"message\": \"this is a message\" + "newline": { + "description": "this is a description", + "message": "this is a message" }, - \"templateLinebreak\": { - \"description\": \"this is\\n a\\n description\", - \"message\": \"this is a message\" + "templateLinebreak": { + "description": "this is\\n a\\n description", + "message": "this is a message" }, - \"trailing.ws\": { - \"description\": \"Whitespace\", - \"message\": \"Some whitespace\" + "trailing.ws": { + "description": "Whitespace", + "message": "Some whitespace" } } ", @@ -623,55 +623,18 @@ exports[`typescript -> stdout with crowdin 1`] = ` exports[`typescript -> stdout with formatter 1`] = ` { "stderr": "", - "stdout": "{ - \"286VP8\": { - \"comment\": \"no ID\", - \"string\": \"No ID\" - }, - \"app.home.kittens\": { - \"comment\": \"Counts kittens\", - \"string\": \"{count, plural, =0 {😭} one {# kitten} other {# kittens}}\" - }, - \"eCy8Eo\": { - \"string\": \"No Desc\" - }, - \"escaped.apostrophe\": { - \"comment\": \"Escaped apostrophe\", - \"string\": \"A quoted value ''{value}'\" - }, - \"foo.bar.baz\": { - \"comment\": \"The default message\", - \"string\": \"Hello World!\" - }, - \"foo.bar.biff\": { - \"comment\": \"Another message\", - \"string\": \"Hello Nurse!\" - }, - \"inline\": { - \"comment\": \"foo\", - \"string\": \"formatted message\" - }, - \"inline.linebreak\": { - \"comment\": \"foo\\n\\t\\t\\t\\t\\t\\tbar\", - \"string\": \"formatted message with linebreak\" - }, - \"linebreak\": { - \"comment\": \"this is\\na\\ndescription\", - \"string\": \"this is a message\" - }, - \"newline\": { - \"comment\": \"this is a description\", - \"string\": \"this is a message\" - }, - \"templateLinebreak\": { - \"comment\": \"this is\\n a\\n description\", - \"string\": \"this is a message\" - }, - \"trailing.ws\": { - \"comment\": \"Whitespace\", - \"string\": \"Some whitespace\" - } -} + "stdout": "foo.bar.baz=Hello World! +foo.bar.biff=Hello Nurse! +app.home.kittens={count, plural, =0 {😭} one {# kitten} other {# kittens}} +trailing.ws=Some whitespace +newline=this is a message +linebreak=this is a message +templateLinebreak=this is a message +escaped.apostrophe=A quoted value ''{value}' +286VP8=No ID +eCy8Eo=No Desc +inline=formatted message +inline.linebreak=formatted message with linebreak ", } `; @@ -680,52 +643,52 @@ exports[`typescript -> stdout with lokalise 1`] = ` { "stderr": "", "stdout": "{ - \"286VP8\": { - \"notes\": \"no ID\", - \"translation\": \"No ID\" + "286VP8": { + "notes": "no ID", + "translation": "No ID" }, - \"app.home.kittens\": { - \"notes\": \"Counts kittens\", - \"translation\": \"{count, plural, =0 {😭} one {# kitten} other {# kittens}}\" + "app.home.kittens": { + "notes": "Counts kittens", + "translation": "{count, plural, =0 {😭} one {# kitten} other {# kittens}}" }, - \"eCy8Eo\": { - \"translation\": \"No Desc\" + "eCy8Eo": { + "translation": "No Desc" }, - \"escaped.apostrophe\": { - \"notes\": \"Escaped apostrophe\", - \"translation\": \"A quoted value ''{value}'\" + "escaped.apostrophe": { + "notes": "Escaped apostrophe", + "translation": "A quoted value ''{value}'" }, - \"foo.bar.baz\": { - \"notes\": \"The default message\", - \"translation\": \"Hello World!\" + "foo.bar.baz": { + "notes": "The default message", + "translation": "Hello World!" }, - \"foo.bar.biff\": { - \"notes\": \"Another message\", - \"translation\": \"Hello Nurse!\" + "foo.bar.biff": { + "notes": "Another message", + "translation": "Hello Nurse!" }, - \"inline\": { - \"notes\": \"foo\", - \"translation\": \"formatted message\" + "inline": { + "notes": "foo", + "translation": "formatted message" }, - \"inline.linebreak\": { - \"notes\": \"foo\\n\\t\\t\\t\\t\\t\\tbar\", - \"translation\": \"formatted message with linebreak\" + "inline.linebreak": { + "notes": "foo\\n\\t\\t\\t\\t\\t\\tbar", + "translation": "formatted message with linebreak" }, - \"linebreak\": { - \"notes\": \"this is\\na\\ndescription\", - \"translation\": \"this is a message\" + "linebreak": { + "notes": "this is\\na\\ndescription", + "translation": "this is a message" }, - \"newline\": { - \"notes\": \"this is a description\", - \"translation\": \"this is a message\" + "newline": { + "notes": "this is a description", + "translation": "this is a message" }, - \"templateLinebreak\": { - \"notes\": \"this is\\n a\\n description\", - \"translation\": \"this is a message\" + "templateLinebreak": { + "notes": "this is\\n a\\n description", + "translation": "this is a message" }, - \"trailing.ws\": { - \"notes\": \"Whitespace\", - \"translation\": \"Some whitespace\" + "trailing.ws": { + "notes": "Whitespace", + "translation": "Some whitespace" } } ", @@ -736,18 +699,18 @@ exports[`typescript -> stdout with simple 1`] = ` { "stderr": "", "stdout": "{ - \"286VP8\": \"No ID\", - \"app.home.kittens\": \"{count, plural, =0 {😭} one {# kitten} other {# kittens}}\", - \"eCy8Eo\": \"No Desc\", - \"escaped.apostrophe\": \"A quoted value ''{value}'\", - \"foo.bar.baz\": \"Hello World!\", - \"foo.bar.biff\": \"Hello Nurse!\", - \"inline\": \"formatted message\", - \"inline.linebreak\": \"formatted message with linebreak\", - \"linebreak\": \"this is a message\", - \"newline\": \"this is a message\", - \"templateLinebreak\": \"this is a message\", - \"trailing.ws\": \"Some whitespace\" + "286VP8": "No ID", + "app.home.kittens": "{count, plural, =0 {😭} one {# kitten} other {# kittens}}", + "eCy8Eo": "No Desc", + "escaped.apostrophe": "A quoted value ''{value}'", + "foo.bar.baz": "Hello World!", + "foo.bar.biff": "Hello Nurse!", + "inline": "formatted message", + "inline.linebreak": "formatted message with linebreak", + "linebreak": "this is a message", + "newline": "this is a message", + "templateLinebreak": "this is a message", + "trailing.ws": "Some whitespace" } ", } @@ -757,63 +720,63 @@ exports[`typescript -> stdout with smartling 1`] = ` { "stderr": "", "stdout": "{ - \"smartling\": { - \"string_format\": \"icu\", - \"translate_paths\": [ + "smartling": { + "string_format": "icu", + "translate_paths": [ { - \"instruction\": \"*/description\", - \"key\": \"{*}/message\", - \"path\": \"*/message\" + "instruction": "*/description", + "key": "{*}/message", + "path": "*/message" } ], - \"variants_enabled\": true + "variants_enabled": true }, - \"286VP8\": { - \"description\": \"no ID\", - \"message\": \"No ID\" + "286VP8": { + "description": "no ID", + "message": "No ID" }, - \"app.home.kittens\": { - \"description\": \"Counts kittens\", - \"message\": \"{count, plural, =0 {😭} one {# kitten} other {# kittens}}\" + "app.home.kittens": { + "description": "Counts kittens", + "message": "{count, plural, =0 {😭} one {# kitten} other {# kittens}}" }, - \"eCy8Eo\": { - \"message\": \"No Desc\" + "eCy8Eo": { + "message": "No Desc" }, - \"escaped.apostrophe\": { - \"description\": \"Escaped apostrophe\", - \"message\": \"A quoted value ''{value}'\" + "escaped.apostrophe": { + "description": "Escaped apostrophe", + "message": "A quoted value ''{value}'" }, - \"foo.bar.baz\": { - \"description\": \"The default message\", - \"message\": \"Hello World!\" + "foo.bar.baz": { + "description": "The default message", + "message": "Hello World!" }, - \"foo.bar.biff\": { - \"description\": \"Another message\", - \"message\": \"Hello Nurse!\" + "foo.bar.biff": { + "description": "Another message", + "message": "Hello Nurse!" }, - \"inline\": { - \"description\": \"foo\", - \"message\": \"formatted message\" + "inline": { + "description": "foo", + "message": "formatted message" }, - \"inline.linebreak\": { - \"description\": \"foo\\n\\t\\t\\t\\t\\t\\tbar\", - \"message\": \"formatted message with linebreak\" + "inline.linebreak": { + "description": "foo\\n\\t\\t\\t\\t\\t\\tbar", + "message": "formatted message with linebreak" }, - \"linebreak\": { - \"description\": \"this is\\na\\ndescription\", - \"message\": \"this is a message\" + "linebreak": { + "description": "this is\\na\\ndescription", + "message": "this is a message" }, - \"newline\": { - \"description\": \"this is a description\", - \"message\": \"this is a message\" + "newline": { + "description": "this is a description", + "message": "this is a message" }, - \"templateLinebreak\": { - \"description\": \"this is\\n a\\n description\", - \"message\": \"this is a message\" + "templateLinebreak": { + "description": "this is\\n a\\n description", + "message": "this is a message" }, - \"trailing.ws\": { - \"description\": \"Whitespace\", - \"message\": \"Some whitespace\" + "trailing.ws": { + "description": "Whitespace", + "message": "Some whitespace" } } ", @@ -824,52 +787,52 @@ exports[`typescript -> stdout with transifex 1`] = ` { "stderr": "", "stdout": "{ - \"286VP8\": { - \"developer_comment\": \"no ID\", - \"string\": \"No ID\" + "286VP8": { + "developer_comment": "no ID", + "string": "No ID" }, - \"app.home.kittens\": { - \"developer_comment\": \"Counts kittens\", - \"string\": \"{count, plural, =0 {😭} one {# kitten} other {# kittens}}\" + "app.home.kittens": { + "developer_comment": "Counts kittens", + "string": "{count, plural, =0 {😭} one {# kitten} other {# kittens}}" }, - \"eCy8Eo\": { - \"string\": \"No Desc\" + "eCy8Eo": { + "string": "No Desc" }, - \"escaped.apostrophe\": { - \"developer_comment\": \"Escaped apostrophe\", - \"string\": \"A quoted value ''{value}'\" + "escaped.apostrophe": { + "developer_comment": "Escaped apostrophe", + "string": "A quoted value ''{value}'" }, - \"foo.bar.baz\": { - \"developer_comment\": \"The default message\", - \"string\": \"Hello World!\" + "foo.bar.baz": { + "developer_comment": "The default message", + "string": "Hello World!" }, - \"foo.bar.biff\": { - \"developer_comment\": \"Another message\", - \"string\": \"Hello Nurse!\" + "foo.bar.biff": { + "developer_comment": "Another message", + "string": "Hello Nurse!" }, - \"inline\": { - \"developer_comment\": \"foo\", - \"string\": \"formatted message\" + "inline": { + "developer_comment": "foo", + "string": "formatted message" }, - \"inline.linebreak\": { - \"developer_comment\": \"foo\\n\\t\\t\\t\\t\\t\\tbar\", - \"string\": \"formatted message with linebreak\" + "inline.linebreak": { + "developer_comment": "foo\\n\\t\\t\\t\\t\\t\\tbar", + "string": "formatted message with linebreak" }, - \"linebreak\": { - \"developer_comment\": \"this is\\na\\ndescription\", - \"string\": \"this is a message\" + "linebreak": { + "developer_comment": "this is\\na\\ndescription", + "string": "this is a message" }, - \"newline\": { - \"developer_comment\": \"this is a description\", - \"string\": \"this is a message\" + "newline": { + "developer_comment": "this is a description", + "string": "this is a message" }, - \"templateLinebreak\": { - \"developer_comment\": \"this is\\n a\\n description\", - \"string\": \"this is a message\" + "templateLinebreak": { + "developer_comment": "this is\\n a\\n description", + "string": "this is a message" }, - \"trailing.ws\": { - \"developer_comment\": \"Whitespace\", - \"string\": \"Some whitespace\" + "trailing.ws": { + "developer_comment": "Whitespace", + "string": "Some whitespace" } } ", diff --git a/packages/cli/integration-tests/formatter.js b/packages/cli/integration-tests/formatter.js index a19051af91..2a993164e8 100644 --- a/packages/cli/integration-tests/formatter.js +++ b/packages/cli/integration-tests/formatter.js @@ -16,3 +16,7 @@ exports.compile = function (msgs) { } return results } + +exports.serialize = function (msgs) { + return Object.entries(msgs).map(([id, msg]) => `${id}=${msg.string}`).join('\n'); +} \ No newline at end of file