lingo.dev 0.78.3 → 0.78.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/cli.cjs CHANGED
@@ -1803,7 +1803,7 @@ async function loadPrettierConfig() {
1803
1803
 
1804
1804
  var _isurl = require('is-url'); var _isurl2 = _interopRequireDefault(_isurl);
1805
1805
  var _datefns = require('date-fns');
1806
- function createUnlocalizableLoader(isCacheRestore = false) {
1806
+ function createUnlocalizableLoader(isCacheRestore = false, returnUnlocalizedKeys = false) {
1807
1807
  const rules = {
1808
1808
  isEmpty: (v) => _lodash2.default.isEmpty(v),
1809
1809
  isNumber: (v) => typeof v === "number" || /^[0-9]+$/.test(v),
@@ -1823,6 +1823,9 @@ function createUnlocalizableLoader(isCacheRestore = false) {
1823
1823
  return false;
1824
1824
  }).map(([key, _21]) => key);
1825
1825
  const result = _lodash2.default.omitBy(input2, (_21, key) => passthroughKeys.includes(key));
1826
+ if (returnUnlocalizedKeys) {
1827
+ result.unlocalizable = _lodash2.default.omitBy(input2, (_21, key) => !passthroughKeys.includes(key));
1828
+ }
1826
1829
  return result;
1827
1830
  },
1828
1831
  async push(locale, data, originalInput) {
@@ -2915,7 +2918,7 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
2915
2918
  createAndroidLoader(),
2916
2919
  createFlatLoader(),
2917
2920
  createSyncLoader(),
2918
- createUnlocalizableLoader(options.isCacheRestore)
2921
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
2919
2922
  );
2920
2923
  case "csv":
2921
2924
  return composeLoaders(
@@ -2923,7 +2926,7 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
2923
2926
  createCsvLoader(),
2924
2927
  createFlatLoader(),
2925
2928
  createSyncLoader(),
2926
- createUnlocalizableLoader(options.isCacheRestore)
2929
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
2927
2930
  );
2928
2931
  case "html":
2929
2932
  return composeLoaders(
@@ -2931,7 +2934,7 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
2931
2934
  createPrettierLoader({ parser: "html", alwaysFormat: true }),
2932
2935
  createHtmlLoader(),
2933
2936
  createSyncLoader(),
2934
- createUnlocalizableLoader(options.isCacheRestore)
2937
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
2935
2938
  );
2936
2939
  case "json":
2937
2940
  return composeLoaders(
@@ -2940,7 +2943,7 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
2940
2943
  createJsonLoader(),
2941
2944
  createFlatLoader(),
2942
2945
  createSyncLoader(),
2943
- createUnlocalizableLoader(options.isCacheRestore)
2946
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
2944
2947
  );
2945
2948
  case "markdown":
2946
2949
  return composeLoaders(
@@ -2948,7 +2951,7 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
2948
2951
  createPrettierLoader({ parser: "markdown" }),
2949
2952
  createMarkdownLoader(),
2950
2953
  createSyncLoader(),
2951
- createUnlocalizableLoader(options.isCacheRestore)
2954
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
2952
2955
  );
2953
2956
  case "po":
2954
2957
  return composeLoaders(
@@ -2956,7 +2959,7 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
2956
2959
  createPoLoader(),
2957
2960
  createFlatLoader(),
2958
2961
  createSyncLoader(),
2959
- createUnlocalizableLoader(options.isCacheRestore),
2962
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys),
2960
2963
  createVariableLoader({ type: "python" })
2961
2964
  );
2962
2965
  case "properties":
@@ -2964,14 +2967,14 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
2964
2967
  createTextFileLoader(bucketPathPattern),
2965
2968
  createPropertiesLoader(),
2966
2969
  createSyncLoader(),
2967
- createUnlocalizableLoader(options.isCacheRestore)
2970
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
2968
2971
  );
2969
2972
  case "xcode-strings":
2970
2973
  return composeLoaders(
2971
2974
  createTextFileLoader(bucketPathPattern),
2972
2975
  createXcodeStringsLoader(),
2973
2976
  createSyncLoader(),
2974
- createUnlocalizableLoader(options.isCacheRestore)
2977
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
2975
2978
  );
2976
2979
  case "xcode-stringsdict":
2977
2980
  return composeLoaders(
@@ -2979,7 +2982,7 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
2979
2982
  createXcodeStringsdictLoader(),
2980
2983
  createFlatLoader(),
2981
2984
  createSyncLoader(),
2982
- createUnlocalizableLoader(options.isCacheRestore)
2985
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
2983
2986
  );
2984
2987
  case "xcode-xcstrings":
2985
2988
  return composeLoaders(
@@ -2989,7 +2992,7 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
2989
2992
  createXcodeXcstringsLoader(options.defaultLocale),
2990
2993
  createFlatLoader(),
2991
2994
  createSyncLoader(),
2992
- createUnlocalizableLoader(options.isCacheRestore),
2995
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys),
2993
2996
  createVariableLoader({ type: "ieee" })
2994
2997
  );
2995
2998
  case "yaml":
@@ -2999,7 +3002,7 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
2999
3002
  createYamlLoader(),
3000
3003
  createFlatLoader(),
3001
3004
  createSyncLoader(),
3002
- createUnlocalizableLoader(options.isCacheRestore)
3005
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
3003
3006
  );
3004
3007
  case "yaml-root-key":
3005
3008
  return composeLoaders(
@@ -3009,7 +3012,7 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
3009
3012
  createRootKeyLoader(true),
3010
3013
  createFlatLoader(),
3011
3014
  createSyncLoader(),
3012
- createUnlocalizableLoader(options.isCacheRestore)
3015
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
3013
3016
  );
3014
3017
  case "flutter":
3015
3018
  return composeLoaders(
@@ -3019,7 +3022,7 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
3019
3022
  createFlutterLoader(),
3020
3023
  createFlatLoader(),
3021
3024
  createSyncLoader(),
3022
- createUnlocalizableLoader(options.isCacheRestore)
3025
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
3023
3026
  );
3024
3027
  case "xliff":
3025
3028
  return composeLoaders(
@@ -3027,7 +3030,7 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
3027
3030
  createXliffLoader(),
3028
3031
  createFlatLoader(),
3029
3032
  createSyncLoader(),
3030
- createUnlocalizableLoader(options.isCacheRestore)
3033
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
3031
3034
  );
3032
3035
  case "xml":
3033
3036
  return composeLoaders(
@@ -3035,28 +3038,28 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
3035
3038
  createXmlLoader(),
3036
3039
  createFlatLoader(),
3037
3040
  createSyncLoader(),
3038
- createUnlocalizableLoader(options.isCacheRestore)
3041
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
3039
3042
  );
3040
3043
  case "srt":
3041
3044
  return composeLoaders(
3042
3045
  createTextFileLoader(bucketPathPattern),
3043
3046
  createSrtLoader(),
3044
3047
  createSyncLoader(),
3045
- createUnlocalizableLoader(options.isCacheRestore)
3048
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
3046
3049
  );
3047
3050
  case "dato":
3048
3051
  return composeLoaders(
3049
3052
  createDatoLoader(bucketPathPattern),
3050
3053
  createSyncLoader(),
3051
3054
  createFlatLoader(),
3052
- createUnlocalizableLoader(options.isCacheRestore)
3055
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
3053
3056
  );
3054
3057
  case "vtt":
3055
3058
  return composeLoaders(
3056
3059
  createTextFileLoader(bucketPathPattern),
3057
3060
  createVttLoader(),
3058
3061
  createSyncLoader(),
3059
- createUnlocalizableLoader(options.isCacheRestore)
3062
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
3060
3063
  );
3061
3064
  case "php":
3062
3065
  return composeLoaders(
@@ -3064,7 +3067,7 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
3064
3067
  createPhpLoader(),
3065
3068
  createSyncLoader(),
3066
3069
  createFlatLoader(),
3067
- createUnlocalizableLoader(options.isCacheRestore)
3070
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
3068
3071
  );
3069
3072
  case "vue-json":
3070
3073
  return composeLoaders(
@@ -3072,7 +3075,7 @@ function createBucketLoader(bucketType, bucketPathPattern, options) {
3072
3075
  createVueJsonLoader(),
3073
3076
  createSyncLoader(),
3074
3077
  createFlatLoader(),
3075
- createUnlocalizableLoader()
3078
+ createUnlocalizableLoader(options.isCacheRestore, options.returnUnlocalizedKeys)
3076
3079
  );
3077
3080
  }
3078
3081
  }
@@ -3317,27 +3320,55 @@ var i18n_default = new (0, _interactivecommander.Command)().command("i18n").desc
3317
3320
  }
3318
3321
  if (flags.frozen) {
3319
3322
  ora.start("Checking for lockfile updates...");
3320
- let requiresUpdate = false;
3321
- for (const bucket of buckets) {
3323
+ let requiresUpdate = null;
3324
+ bucketLoop: for (const bucket of buckets) {
3322
3325
  for (const bucketConfig of bucket.config) {
3323
3326
  const sourceLocale = __spec.resolveOverridenLocale.call(void 0, i18nConfig.locale.source, bucketConfig.delimiter);
3324
3327
  const bucketLoader = createBucketLoader(bucket.type, bucketConfig.pathPattern, {
3325
3328
  isCacheRestore: false,
3326
- defaultLocale: sourceLocale
3329
+ defaultLocale: sourceLocale,
3330
+ returnUnlocalizedKeys: true
3327
3331
  });
3328
3332
  bucketLoader.setDefaultLocale(sourceLocale);
3329
3333
  await bucketLoader.init();
3330
- const sourceData = await bucketLoader.pull(i18nConfig.locale.source);
3334
+ const { unlocalizable: sourceUnlocalizable, ...sourceData } = await bucketLoader.pull(
3335
+ i18nConfig.locale.source
3336
+ );
3331
3337
  const updatedSourceData = lockfileHelper.extractUpdatedData(bucketConfig.pathPattern, sourceData);
3332
3338
  if (Object.keys(updatedSourceData).length > 0) {
3333
- requiresUpdate = true;
3334
- break;
3339
+ requiresUpdate = "updated";
3340
+ break bucketLoop;
3341
+ }
3342
+ for (const _targetLocale of targetLocales) {
3343
+ const targetLocale = __spec.resolveOverridenLocale.call(void 0, _targetLocale, bucketConfig.delimiter);
3344
+ const { unlocalizable: targetUnlocalizable, ...targetData } = await bucketLoader.pull(targetLocale);
3345
+ const missingKeys = _lodash2.default.difference(Object.keys(sourceData), Object.keys(targetData));
3346
+ const extraKeys = _lodash2.default.difference(Object.keys(targetData), Object.keys(sourceData));
3347
+ const unlocalizableDataDiff = !_lodash2.default.isEqual(sourceUnlocalizable, targetUnlocalizable);
3348
+ if (missingKeys.length > 0) {
3349
+ requiresUpdate = "missing";
3350
+ break bucketLoop;
3351
+ }
3352
+ if (extraKeys.length > 0) {
3353
+ requiresUpdate = "extra";
3354
+ break bucketLoop;
3355
+ }
3356
+ if (unlocalizableDataDiff) {
3357
+ requiresUpdate = "unlocalizable";
3358
+ break bucketLoop;
3359
+ }
3335
3360
  }
3336
3361
  }
3337
- if (requiresUpdate) break;
3338
3362
  }
3339
3363
  if (requiresUpdate) {
3340
- ora.fail("Localization data has changed; please update i18n.lock or run without --frozen.");
3364
+ const message = {
3365
+ updated: "Source file has been updated.",
3366
+ missing: "Target file is missing translations.",
3367
+ extra: "Target file has extra translations not present in the source file.",
3368
+ unlocalizable: "Unlocalizable data (such as booleans, dates, URLs, etc.) do not match."
3369
+ }[requiresUpdate];
3370
+ ora.fail(`Localization data has changed; please update i18n.lock or run without --frozen.`);
3371
+ ora.fail(` Details: ${message}`);
3341
3372
  process.exit(1);
3342
3373
  } else {
3343
3374
  ora.succeed("No lockfile updates required.");
@@ -3421,8 +3452,8 @@ var i18n_default = new (0, _interactivecommander.Command)().command("i18n").desc
3421
3452
  bucketOra.start(`Applying changes to ${bucketConfig} (${targetLocale})`);
3422
3453
  }
3423
3454
  const finalDiffSize = _lodash2.default.chain(finalTargetData).omitBy((value, key) => value === targetData[key]).size().value();
3455
+ await bucketLoader.push(targetLocale, finalTargetData);
3424
3456
  if (finalDiffSize > 0 || flags.force) {
3425
- await bucketLoader.push(targetLocale, finalTargetData);
3426
3457
  bucketOra.succeed(`[${sourceLocale} -> ${targetLocale}] Localization completed`);
3427
3458
  } else {
3428
3459
  bucketOra.succeed(`[${sourceLocale} -> ${targetLocale}] Localization completed (no changes).`);
@@ -3837,7 +3868,7 @@ var mcp_default = new (0, _interactivecommander.Command)().command("mcp").descri
3837
3868
  // package.json
3838
3869
  var package_default = {
3839
3870
  name: "lingo.dev",
3840
- version: "0.78.3",
3871
+ version: "0.78.4",
3841
3872
  description: "Lingo.dev CLI",
3842
3873
  private: false,
3843
3874
  publishConfig: {