@intlify/vue-i18n-extensions 6.0.5 → 6.1.0

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/dist/index.cjs CHANGED
@@ -205,11 +205,12 @@ function createContentBuilder(options = {}) {
205
205
  };
206
206
  }
207
207
 
208
+ const GLOBAL_TRANSLATE_SIGNATURE = "$t";
208
209
  function transformVTDirective(options = {}) {
209
210
  const i18nInstance = options.i18n;
210
211
  const mode = shared.isString(options.mode) && ["composition", "legacy"].includes(options.mode) ? options.mode : "composition";
211
- const translationSignatures = shared.isString(options.translationSignatures) ? [options.translationSignatures] : shared.isArray(options.translationSignatures) ? options.translationSignatures : ["t"];
212
- translationSignatures.push(`$t`);
212
+ const translationSignatures = shared.isString(options.translationSignatures) || shared.isFunction(options.translationSignatures) ? [options.translationSignatures] : shared.isArray(options.translationSignatures) ? options.translationSignatures : ["t"];
213
+ translationSignatures.push(GLOBAL_TRANSLATE_SIGNATURE);
213
214
  return (dir, node, context) => {
214
215
  const { exp, loc } = dir;
215
216
  if (!exp) {
@@ -393,11 +394,17 @@ function generateTranslationCode(context, mode, params, translationSignatures) {
393
394
  return mode === "composition" ? generateComposableCode(context, params, translationSignatures) : generateLegacyCode(context, params);
394
395
  }
395
396
  function generateTranslationCallableSignatures(context, translationSignatures) {
396
- const { prefixIdentifiers, bindingMetadata } = context;
397
- return translationSignatures.map((signature) => {
398
- const type = shared.hasOwn(bindingMetadata, signature) && bindingMetadata[signature];
397
+ const { prefixIdentifiers, bindingMetadata, inline } = context;
398
+ return translationSignatures.map((signatureOrResolver) => {
399
+ if (shared.isFunction(signatureOrResolver)) {
400
+ return signatureOrResolver(context);
401
+ }
402
+ if (inline && signatureOrResolver !== GLOBAL_TRANSLATE_SIGNATURE) {
403
+ return signatureOrResolver;
404
+ }
405
+ const type = shared.hasOwn(bindingMetadata, signatureOrResolver) && bindingMetadata[signatureOrResolver];
399
406
  const bindingContext = prefixIdentifiers ? type && type.startsWith("setup") || type === compilerDom.BindingTypes.LITERAL_CONST ? "$setup." : "_ctx." : "";
400
- return `${bindingContext}${signature}`;
407
+ return `${bindingContext}${signatureOrResolver}`;
401
408
  }).join(" || ");
402
409
  }
403
410
  function generateComposableCode(context, params, translationSignatures) {
package/dist/index.d.cts CHANGED
@@ -1,6 +1,40 @@
1
- import { DirectiveTransform } from '@vue/compiler-dom';
1
+ import { DirectiveTransform, TransformContext } from '@vue/compiler-dom';
2
2
  import { I18n, I18nMode } from 'vue-i18n';
3
3
 
4
+ /**
5
+ * Translation signature resolver
6
+ *
7
+ * @remarks
8
+ * This resolver is used at {@link TransformVTDirectiveOptions | 'translationSignatures' option}
9
+ *
10
+ * @example
11
+ * ```js
12
+ * import { compile } from '@vue/compiler-dom'
13
+ * import { transformVTDirective } from '@intlify/vue-i18n-extensions'
14
+ *
15
+ * // the below is just an example, you can use your own signature resolver
16
+ * const signatureMap = new Map()
17
+ *
18
+ * const transformVT = transformVTDirective({
19
+ * translationSignatures: (context) => {
20
+ * const { prefixIdentifiers, bindingMetadata, inline, filename } = context
21
+ * let signature = ''
22
+ *
23
+ * // something logic to resolve signature like using `signatureMap`
24
+ * // signature = signatureMap.get(filename)
25
+ * // ...
26
+ *
27
+ * return signature
28
+ * }
29
+ * })
30
+ *
31
+ * const { code } = compile(`<p v-t="'hello'"></p>`, {
32
+ * // ...
33
+ * directiveTransforms: { t: transformVT }
34
+ * })
35
+ * ```
36
+ */
37
+ type TranslationSignatureResolver = (context: TransformContext) => string;
4
38
  /**
5
39
  * Transform options for `v-t` custom directive
6
40
  *
@@ -37,7 +71,7 @@ Legacy extends boolean = true> {
37
71
  * If each Vue component has a different signature for the translation function, you can specify several in an array for safe SSR.
38
72
  * This option value is `undefined` and the signature attached to the binding context is `t`.
39
73
  */
40
- translationSignatures?: string | string[];
74
+ translationSignatures?: string | TranslationSignatureResolver | string[] | TranslationSignatureResolver[] | (string | TranslationSignatureResolver)[];
41
75
  }
42
76
  /**
43
77
  * Transform `v-t` custom directive
package/dist/index.d.mts CHANGED
@@ -1,6 +1,40 @@
1
- import { DirectiveTransform } from '@vue/compiler-dom';
1
+ import { DirectiveTransform, TransformContext } from '@vue/compiler-dom';
2
2
  import { I18n, I18nMode } from 'vue-i18n';
3
3
 
4
+ /**
5
+ * Translation signature resolver
6
+ *
7
+ * @remarks
8
+ * This resolver is used at {@link TransformVTDirectiveOptions | 'translationSignatures' option}
9
+ *
10
+ * @example
11
+ * ```js
12
+ * import { compile } from '@vue/compiler-dom'
13
+ * import { transformVTDirective } from '@intlify/vue-i18n-extensions'
14
+ *
15
+ * // the below is just an example, you can use your own signature resolver
16
+ * const signatureMap = new Map()
17
+ *
18
+ * const transformVT = transformVTDirective({
19
+ * translationSignatures: (context) => {
20
+ * const { prefixIdentifiers, bindingMetadata, inline, filename } = context
21
+ * let signature = ''
22
+ *
23
+ * // something logic to resolve signature like using `signatureMap`
24
+ * // signature = signatureMap.get(filename)
25
+ * // ...
26
+ *
27
+ * return signature
28
+ * }
29
+ * })
30
+ *
31
+ * const { code } = compile(`<p v-t="'hello'"></p>`, {
32
+ * // ...
33
+ * directiveTransforms: { t: transformVT }
34
+ * })
35
+ * ```
36
+ */
37
+ type TranslationSignatureResolver = (context: TransformContext) => string;
4
38
  /**
5
39
  * Transform options for `v-t` custom directive
6
40
  *
@@ -37,7 +71,7 @@ Legacy extends boolean = true> {
37
71
  * If each Vue component has a different signature for the translation function, you can specify several in an array for safe SSR.
38
72
  * This option value is `undefined` and the signature attached to the binding context is `t`.
39
73
  */
40
- translationSignatures?: string | string[];
74
+ translationSignatures?: string | TranslationSignatureResolver | string[] | TranslationSignatureResolver[] | (string | TranslationSignatureResolver)[];
41
75
  }
42
76
  /**
43
77
  * Transform `v-t` custom directive
package/dist/index.d.ts CHANGED
@@ -1,6 +1,40 @@
1
- import { DirectiveTransform } from '@vue/compiler-dom';
1
+ import { DirectiveTransform, TransformContext } from '@vue/compiler-dom';
2
2
  import { I18n, I18nMode } from 'vue-i18n';
3
3
 
4
+ /**
5
+ * Translation signature resolver
6
+ *
7
+ * @remarks
8
+ * This resolver is used at {@link TransformVTDirectiveOptions | 'translationSignatures' option}
9
+ *
10
+ * @example
11
+ * ```js
12
+ * import { compile } from '@vue/compiler-dom'
13
+ * import { transformVTDirective } from '@intlify/vue-i18n-extensions'
14
+ *
15
+ * // the below is just an example, you can use your own signature resolver
16
+ * const signatureMap = new Map()
17
+ *
18
+ * const transformVT = transformVTDirective({
19
+ * translationSignatures: (context) => {
20
+ * const { prefixIdentifiers, bindingMetadata, inline, filename } = context
21
+ * let signature = ''
22
+ *
23
+ * // something logic to resolve signature like using `signatureMap`
24
+ * // signature = signatureMap.get(filename)
25
+ * // ...
26
+ *
27
+ * return signature
28
+ * }
29
+ * })
30
+ *
31
+ * const { code } = compile(`<p v-t="'hello'"></p>`, {
32
+ * // ...
33
+ * directiveTransforms: { t: transformVT }
34
+ * })
35
+ * ```
36
+ */
37
+ type TranslationSignatureResolver = (context: TransformContext) => string;
4
38
  /**
5
39
  * Transform options for `v-t` custom directive
6
40
  *
@@ -37,7 +71,7 @@ Legacy extends boolean = true> {
37
71
  * If each Vue component has a different signature for the translation function, you can specify several in an array for safe SSR.
38
72
  * This option value is `undefined` and the signature attached to the binding context is `t`.
39
73
  */
40
- translationSignatures?: string | string[];
74
+ translationSignatures?: string | TranslationSignatureResolver | string[] | TranslationSignatureResolver[] | (string | TranslationSignatureResolver)[];
41
75
  }
42
76
  /**
43
77
  * Transform `v-t` custom directive
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { NodeTypes, TO_DISPLAY_STRING, createCompoundExpression, createSimpleExpression, isText, BindingTypes } from '@vue/compiler-dom';
2
- import { isString, format, isNumber, isArray, isSymbol, isObject, toDisplayString, hasOwn } from '@intlify/shared';
2
+ import { isString, format, isNumber, isFunction, isArray, isSymbol, isObject, toDisplayString, hasOwn } from '@intlify/shared';
3
3
  import { parse } from '@babel/parser';
4
4
 
5
5
  function evaluateValue(expression) {
@@ -203,11 +203,12 @@ function createContentBuilder(options = {}) {
203
203
  };
204
204
  }
205
205
 
206
+ const GLOBAL_TRANSLATE_SIGNATURE = "$t";
206
207
  function transformVTDirective(options = {}) {
207
208
  const i18nInstance = options.i18n;
208
209
  const mode = isString(options.mode) && ["composition", "legacy"].includes(options.mode) ? options.mode : "composition";
209
- const translationSignatures = isString(options.translationSignatures) ? [options.translationSignatures] : isArray(options.translationSignatures) ? options.translationSignatures : ["t"];
210
- translationSignatures.push(`$t`);
210
+ const translationSignatures = isString(options.translationSignatures) || isFunction(options.translationSignatures) ? [options.translationSignatures] : isArray(options.translationSignatures) ? options.translationSignatures : ["t"];
211
+ translationSignatures.push(GLOBAL_TRANSLATE_SIGNATURE);
211
212
  return (dir, node, context) => {
212
213
  const { exp, loc } = dir;
213
214
  if (!exp) {
@@ -391,11 +392,17 @@ function generateTranslationCode(context, mode, params, translationSignatures) {
391
392
  return mode === "composition" ? generateComposableCode(context, params, translationSignatures) : generateLegacyCode(context, params);
392
393
  }
393
394
  function generateTranslationCallableSignatures(context, translationSignatures) {
394
- const { prefixIdentifiers, bindingMetadata } = context;
395
- return translationSignatures.map((signature) => {
396
- const type = hasOwn(bindingMetadata, signature) && bindingMetadata[signature];
395
+ const { prefixIdentifiers, bindingMetadata, inline } = context;
396
+ return translationSignatures.map((signatureOrResolver) => {
397
+ if (isFunction(signatureOrResolver)) {
398
+ return signatureOrResolver(context);
399
+ }
400
+ if (inline && signatureOrResolver !== GLOBAL_TRANSLATE_SIGNATURE) {
401
+ return signatureOrResolver;
402
+ }
403
+ const type = hasOwn(bindingMetadata, signatureOrResolver) && bindingMetadata[signatureOrResolver];
397
404
  const bindingContext = prefixIdentifiers ? type && type.startsWith("setup") || type === BindingTypes.LITERAL_CONST ? "$setup." : "_ctx." : "";
398
- return `${bindingContext}${signature}`;
405
+ return `${bindingContext}${signatureOrResolver}`;
399
406
  }).join(" || ");
400
407
  }
401
408
  function generateComposableCode(context, params, translationSignatures) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@intlify/vue-i18n-extensions",
3
3
  "description": "vue-i18n extensions",
4
- "version": "6.0.5",
4
+ "version": "6.1.0",
5
5
  "author": {
6
6
  "name": "kazuya kawaguchi",
7
7
  "email": "kawakazu80@gmail.com"