Skip to content

Commit 8631111

Browse files
authored
feat: Support lingui config in multiple formats (#941)
1 parent 249c486 commit 8631111

3 files changed

Lines changed: 94 additions & 17 deletions

File tree

packages/conf/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
},
2020
"dependencies": {
2121
"@babel/runtime": "^7.11.2",
22+
"@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2",
2223
"chalk": "^4.1.0",
2324
"cosmiconfig": "^7.0.0",
2425
"jest-validate": "^26.5.2"

packages/conf/src/index.ts

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import path from "path"
22
import fs from "fs"
33
import chalk from "chalk"
4-
import { cosmiconfigSync } from "cosmiconfig"
4+
import { Loader, cosmiconfigSync } from "cosmiconfig"
55
import { multipleValidOptions, validate } from "jest-validate"
6+
import get from "lodash.get"
67

78
export type CatalogFormat = "lingui" | "minimal" | "po" | "csv"
89

@@ -27,7 +28,7 @@ type DefaultLocaleObject = {
2728
}
2829
export type FallbackLocales = LocaleObject | DefaultLocaleObject | false
2930

30-
type ModuleSource = [string, string?];
31+
type ModuleSource = [string, string?]
3132

3233
export type LinguiConfig = {
3334
catalogs: CatalogConfig[]
@@ -42,7 +43,7 @@ export type LinguiConfig = {
4243
orderBy: OrderBy
4344
pseudoLocale: string
4445
rootDir: string
45-
runtimeConfigModule: ModuleSource | {[symbolName: string]: ModuleSource},
46+
runtimeConfigModule: ModuleSource | { [symbolName: string]: ModuleSource }
4647
sourceLocale: string
4748
}
4849

@@ -92,7 +93,23 @@ export function getConfig({
9293
skipValidation?: boolean
9394
} = {}): LinguiConfig {
9495
const defaultRootDir = cwd || process.cwd()
95-
const configExplorer = cosmiconfigSync("lingui")
96+
const moduleName = "lingui"
97+
const configExplorer = cosmiconfigSync(moduleName, {
98+
searchPlaces: [
99+
"package.json",
100+
`.${moduleName}rc`,
101+
`.${moduleName}rc.json`,
102+
`.${moduleName}rc.yaml`,
103+
`.${moduleName}rc.yml`,
104+
`.${moduleName}rc.ts`,
105+
`.${moduleName}rc.js`,
106+
`${moduleName}.config.ts`,
107+
`${moduleName}.config.js`,
108+
],
109+
loaders: {
110+
".ts": TypeScriptLoader,
111+
},
112+
})
96113

97114
const result = configExists(configPath)
98115
? configExplorer.load(configPath)
@@ -141,7 +158,7 @@ const exampleConfig = {
141158
}
142159

143160
const deprecatedConfig = {
144-
fallbackLocale: (config: LinguiConfig & DeprecatedFallbackLanguage) =>
161+
fallbackLocale: (config: LinguiConfig & DeprecatedFallbackLanguage) =>
145162
` Option ${chalk.bold("fallbackLocale")} was replaced by ${chalk.bold(
146163
"fallbackLocales"
147164
)}
@@ -151,9 +168,7 @@ const deprecatedConfig = {
151168
@lingui/cli now treats your current configuration as:
152169
{
153170
${chalk.bold('"fallbackLocales"')}: {
154-
default: ${chalk.bold(
155-
`"${config.fallbackLocale}"`
156-
)}
171+
default: ${chalk.bold(`"${config.fallbackLocale}"`)}
157172
}
158173
}
159174
@@ -276,17 +291,18 @@ export function fallbackLanguageMigration(
276291
): LinguiConfig {
277292
const { fallbackLocale, fallbackLocales } = config
278293

279-
if (fallbackLocales === false) return {
280-
...config,
281-
fallbackLocales: null,
282-
}
294+
if (fallbackLocales === false)
295+
return {
296+
...config,
297+
fallbackLocales: null,
298+
}
283299

284300
config.locales.forEach((locale) => {
285301
const fl = getCldrParentLocale(locale.toLowerCase())
286302
if (fl && !config.fallbackLocales[locale]) {
287303
config.fallbackLocales = {
288304
...config.fallbackLocales,
289-
[locale]: fl
305+
[locale]: fl,
290306
}
291307
}
292308
})
@@ -475,7 +491,7 @@ function getCldrParentLocale(sourceLocale: string) {
475491
"yue-hans": "yue",
476492
"zh-hant": "zh",
477493
"zh-hant-hk": "zh",
478-
"zh-hant-mo": "zh-hant-hk"
494+
"zh-hant-mo": "zh-hant-hk",
479495
}[sourceLocale]
480496
}
481497

@@ -525,3 +541,21 @@ export function catalogMigration(
525541

526542
const pipe = (...functions: Array<Function>) => (args: any): any =>
527543
functions.reduce((arg, fn) => fn(arg), args)
544+
545+
// copied from @EndemolShineGroup/cosmiconfig-typescript-loader
546+
// to support sync operations
547+
// if this PR gets merged and published, this piece of code can be thrown away
548+
// https://github.com/EndemolShineGroup/cosmiconfig-typescript-loader/pull/132
549+
function TypeScriptLoader(filePath: string) {
550+
try {
551+
require("ts-node/register")
552+
const result = require(filePath)
553+
554+
return get(result, "default", result)
555+
} catch (error) {
556+
// Replace with logger class OR throw a more specific error
557+
throw require("@endemolshinegroup/cosmiconfig-typescript-loader/dist/Errors/TypeScriptCompileError").fromError(
558+
error
559+
)
560+
}
561+
}

yarn.lock

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,6 +1068,16 @@
10681068
exec-sh "^0.3.2"
10691069
minimist "^1.2.0"
10701070

1071+
"@endemolshinegroup/cosmiconfig-typescript-loader@^3.0.2":
1072+
version "3.0.2"
1073+
resolved "https://registry.yarnpkg.com/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz#eea4635828dde372838b0909693ebd9aafeec22d"
1074+
integrity sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==
1075+
dependencies:
1076+
lodash.get "^4"
1077+
make-error "^1"
1078+
ts-node "^9"
1079+
tslib "^2"
1080+
10711081
"@eslint/eslintrc@^0.1.3":
10721082
version "0.1.3"
10731083
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085"
@@ -3386,6 +3396,11 @@ are-we-there-yet@~1.1.2:
33863396
delegates "^1.0.0"
33873397
readable-stream "^2.0.6"
33883398

3399+
arg@^4.1.0:
3400+
version "4.1.3"
3401+
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
3402+
integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
3403+
33893404
argparse@^1.0.7:
33903405
version "1.0.10"
33913406
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@@ -4758,6 +4773,11 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
47584773
safe-buffer "^5.0.1"
47594774
sha.js "^2.4.8"
47604775

4776+
create-require@^1.1.0:
4777+
version "1.1.1"
4778+
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
4779+
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
4780+
47614781
cross-env@^7.0.2:
47624782
version "7.0.2"
47634783
resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.2.tgz#bd5ed31339a93a3418ac4f3ca9ca3403082ae5f9"
@@ -8244,7 +8264,7 @@ lodash.foreach@^4.5.0:
82448264
resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
82458265
integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=
82468266

8247-
lodash.get@^4.4.2:
8267+
lodash.get@^4, lodash.get@^4.4.2:
82488268
version "4.4.2"
82498269
resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
82508270
integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
@@ -8484,7 +8504,7 @@ make-dir@^3.0.0, make-dir@^3.0.2:
84848504
dependencies:
84858505
semver "^6.0.0"
84868506

8487-
make-error@1.x:
8507+
make-error@1.x, make-error@^1, make-error@^1.1.1:
84888508
version "1.3.6"
84898509
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
84908510
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
@@ -11448,7 +11468,7 @@ source-map-resolve@^0.5.0:
1144811468
source-map-url "^0.4.0"
1144911469
urix "^0.1.0"
1145011470

11451-
source-map-support@^0.5.11, source-map-support@^0.5.19, source-map-support@^0.5.6, source-map-support@^0.5.7, source-map-support@~0.5.12:
11471+
source-map-support@^0.5.11, source-map-support@^0.5.17, source-map-support@^0.5.19, source-map-support@^0.5.6, source-map-support@^0.5.7, source-map-support@~0.5.12:
1145211472
version "0.5.19"
1145311473
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
1145411474
integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
@@ -12302,6 +12322,18 @@ ts-jest@^26.4.1:
1230212322
semver "7.x"
1230312323
yargs-parser "20.x"
1230412324

12325+
ts-node@^9:
12326+
version "9.1.1"
12327+
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d"
12328+
integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==
12329+
dependencies:
12330+
arg "^4.1.0"
12331+
create-require "^1.1.0"
12332+
diff "^4.0.1"
12333+
make-error "^1.1.1"
12334+
source-map-support "^0.5.17"
12335+
yn "3.1.1"
12336+
1230512337
ts-toolbelt@^6.3.3:
1230612338
version "6.15.5"
1230712339
resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz#cb3b43ed725cb63644782c64fbcad7d8f28c0a83"
@@ -12332,6 +12364,11 @@ tslib@^1, tslib@^1.10.0, tslib@^1.11.1, tslib@^1.11.2, tslib@^1.13.0, tslib@^1.8
1233212364
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
1233312365
integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
1233412366

12367+
tslib@^2:
12368+
version "2.1.0"
12369+
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
12370+
integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==
12371+
1233512372
tsutils@^3.17.1:
1233612373
version "3.17.1"
1233712374
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
@@ -13154,3 +13191,8 @@ yargs@^7.1.0:
1315413191
which-module "^1.0.0"
1315513192
y18n "^3.2.1"
1315613193
yargs-parser "5.0.0-security.0"
13194+
13195+
yn@3.1.1:
13196+
version "3.1.1"
13197+
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
13198+
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==

0 commit comments

Comments
 (0)