next-intl 4.13.7 → 4.14.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.
Files changed (39) hide show
  1. package/dist/cjs/development/BuiltInPoCodec-B6w-kmTx.cjs +34 -0
  2. package/dist/cjs/development/plugin.cjs +1607 -8
  3. package/dist/esm/development/extractor/catalog/CatalogManager.js +3 -2
  4. package/dist/esm/development/extractor/catalog/CatalogPersister.js +21 -2
  5. package/dist/esm/development/extractor/catalogLoader.js +38 -16
  6. package/dist/esm/development/extractor/extractor/MessageExtractor.js +8 -1
  7. package/dist/esm/development/extractor/format/ExtractorCodec.js +3 -0
  8. package/dist/esm/development/extractor/format/codecs/BuiltInPoCodec.js +22 -0
  9. package/dist/esm/development/extractor/format/index.js +19 -4
  10. package/dist/esm/development/extractor/utils.js +8 -27
  11. package/dist/esm/development/plugin/getNextConfig.js +6 -2
  12. package/dist/esm/production/extractor/catalog/CatalogManager.js +1 -1
  13. package/dist/esm/production/extractor/catalog/CatalogPersister.js +1 -1
  14. package/dist/esm/production/extractor/catalogLoader.js +1 -1
  15. package/dist/esm/production/extractor/extractor/MessageExtractor.js +1 -1
  16. package/dist/esm/production/extractor/format/codecs/BuiltInPoCodec.js +1 -0
  17. package/dist/esm/production/extractor/format/index.js +1 -1
  18. package/dist/esm/production/extractor/utils.js +1 -1
  19. package/dist/esm/production/plugin/getNextConfig.js +1 -1
  20. package/dist/types/extractor/catalog/CatalogManager.d.ts +1 -1
  21. package/dist/types/extractor/catalog/CatalogPersister.d.ts +2 -0
  22. package/dist/types/extractor/extractor/MessageExtractor.d.ts +2 -2
  23. package/dist/types/extractor/format/ExtractorCodec.d.ts +11 -27
  24. package/dist/types/extractor/format/codecs/fixtures/POCodecLegacy.d.ts +50 -0
  25. package/dist/types/extractor/format/index.d.ts +2 -2
  26. package/dist/types/extractor/types.d.ts +9 -21
  27. package/dist/types/extractor/utils.d.ts +1 -1
  28. package/package.json +9 -12
  29. package/dist/cjs/development/ExtractorCodec-D9Tw618d.cjs +0 -7
  30. package/dist/cjs/development/JSONCodec-CzA8ubPy.cjs +0 -55
  31. package/dist/cjs/development/POCodec-CWGHK-Gp.cjs +0 -111
  32. package/dist/cjs/development/plugin-DlFYUFWh.cjs +0 -1613
  33. package/dist/esm/development/extractor/format/codecs/JSONCodec.js +0 -47
  34. package/dist/esm/development/extractor/format/codecs/POCodec.js +0 -99
  35. package/dist/esm/production/extractor/format/codecs/JSONCodec.js +0 -1
  36. package/dist/esm/production/extractor/format/codecs/POCodec.js +0 -1
  37. package/dist/types/extractor/format/codecs/POCodec.d.ts +0 -2
  38. package/dist/types/extractor/format/codecs/fixtures/POCodecSourceMessageKey.d.ts +0 -2
  39. /package/dist/types/extractor/format/codecs/{JSONCodec.d.ts → BuiltInPoCodec.d.ts} +0 -0
@@ -1,47 +0,0 @@
1
- import { getSortedMessages, setNestedProperty, isForbiddenObjectKey } from '../../utils.js';
2
- import { defineCodec } from '../ExtractorCodec.js';
3
-
4
- var JSONCodec = defineCodec(() => ({
5
- decode(source) {
6
- const json = JSON.parse(source);
7
- const messages = [];
8
- traverseMessages(json, (message, id) => {
9
- messages.push({
10
- id,
11
- message,
12
- references: [],
13
- description: []
14
- });
15
- });
16
- return messages;
17
- },
18
- encode(messages) {
19
- const root = {};
20
- for (const message of getSortedMessages(messages)) {
21
- setNestedProperty(root, message.id, message.message);
22
- }
23
- return JSON.stringify(root, null, 2) + '\n';
24
- },
25
- toJSONString(source) {
26
- return source;
27
- }
28
- }));
29
- function traverseMessages(obj, callback, path = '') {
30
- const NAMESPACE_SEPARATOR = '.';
31
- for (const key of Object.keys(obj)) {
32
- if (isForbiddenObjectKey(key)) {
33
- throw new Error(`Invalid message catalog key: \`${key}\`.`);
34
- }
35
- const newPath = path ? path + NAMESPACE_SEPARATOR + key : key;
36
- const value = obj[key];
37
- if (typeof value === 'string') {
38
- callback(value, newPath);
39
- } else if (Array.isArray(value)) {
40
- throw new Error(`Message at \`${newPath}\` resolved to an array, but only strings are supported. See https://next-intl.dev/docs/usage/translations#arrays-of-messages`);
41
- } else if (typeof value === 'object') {
42
- traverseMessages(value, callback, newPath);
43
- }
44
- }
45
- }
46
-
47
- export { JSONCodec as default };
@@ -1,99 +0,0 @@
1
- import POParser from 'po-parser';
2
- import { setNestedProperty, getSortedMessages } from '../../utils.js';
3
- import { defineCodec } from '../ExtractorCodec.js';
4
-
5
- var POCodec = defineCodec(() => {
6
- // See also https://www.gnu.org/software/gettext/manual/html_node/Header-Entry.html
7
- const DEFAULT_METADATA = {
8
- // Recommended by spec
9
- 'Content-Type': 'text/plain; charset=utf-8',
10
- 'Content-Transfer-Encoding': '8bit',
11
- // Otherwise other tools might set this
12
- 'X-Generator': 'next-intl',
13
- // Crowdin defaults to using msgid as source key
14
- 'X-Crowdin-SourceKey': 'msgstr'
15
- };
16
-
17
- // Move all parts before the last dot to msgctxt
18
- const NAMESPACE_SEPARATOR = '.';
19
-
20
- // Metadata is stored so it can be retained when writing
21
- const metadataByLocale = new Map();
22
- return {
23
- decode(content, context) {
24
- const catalog = POParser.parse(content);
25
- if (catalog.meta) {
26
- metadataByLocale.set(context.locale, catalog.meta);
27
- }
28
- const messages = catalog.messages || [];
29
- return messages.map(msg => {
30
- const {
31
- extractedComments,
32
- msgctxt,
33
- msgid,
34
- msgstr,
35
- references,
36
- ...rest
37
- } = msg;
38
- return {
39
- ...rest,
40
- id: msgctxt ? [msgctxt, msgid].join(NAMESPACE_SEPARATOR) : msgid,
41
- message: msgstr,
42
- description: extractedComments ?? [],
43
- references: references ?? []
44
- };
45
- });
46
- },
47
- encode(messages, context) {
48
- const encodedMessages = getSortedMessages(messages).map(msg => {
49
- const {
50
- description = [],
51
- id,
52
- message,
53
- references,
54
- ...rest
55
- } = msg;
56
- const lastDotIndex = id.lastIndexOf(NAMESPACE_SEPARATOR);
57
- const hasNamespace = id.includes(NAMESPACE_SEPARATOR);
58
- const msgid = hasNamespace ? id.slice(lastDotIndex + NAMESPACE_SEPARATOR.length) : id;
59
-
60
- // Path-only refs (no `:line`), unique paths
61
- const pathOnlyRefs = [...new Set(references.map(ref => ref.path))].map(path => ({
62
- path
63
- }));
64
- return {
65
- msgid,
66
- msgstr: message,
67
- ...(description.length > 0 && {
68
- extractedComments: description
69
- }),
70
- ...(hasNamespace && {
71
- msgctxt: id.slice(0, lastDotIndex)
72
- }),
73
- ...(pathOnlyRefs.length > 0 && {
74
- references: pathOnlyRefs
75
- }),
76
- ...rest
77
- };
78
- });
79
- return POParser.serialize({
80
- meta: {
81
- Language: context.locale,
82
- ...DEFAULT_METADATA,
83
- ...metadataByLocale.get(context.locale)
84
- },
85
- messages: encodedMessages
86
- });
87
- },
88
- toJSONString(source, context) {
89
- const parsed = this.decode(source, context);
90
- const messagesObject = {};
91
- for (const message of parsed) {
92
- setNestedProperty(messagesObject, message.id, message.message);
93
- }
94
- return JSON.stringify(messagesObject);
95
- }
96
- };
97
- });
98
-
99
- export { POCodec as default };
@@ -1 +0,0 @@
1
- import{getSortedMessages as e,setNestedProperty as r,isForbiddenObjectKey as s}from"../../utils.js";import{defineCodec as t}from"../ExtractorCodec.js";var o=t((()=>({decode(e){const r=JSON.parse(e),s=[];return n(r,((e,r)=>{s.push({id:r,message:e,references:[],description:[]})})),s},encode(s){const t={};for(const o of e(s))r(t,o.id,o.message);return JSON.stringify(t,null,2)+"\n"},toJSONString:e=>e})));function n(e,r,t=""){for(const o of Object.keys(e)){if(s(o))throw new Error(`Invalid message catalog key: \`${o}\`.`);const a=t?t+"."+o:o,i=e[o];if("string"==typeof i)r(i,a);else{if(Array.isArray(i))throw new Error(`Message at \`${a}\` resolved to an array, but only strings are supported. See https://next-intl.dev/docs/usage/translations#arrays-of-messages`);"object"==typeof i&&n(i,r,a)}}}export{o as default};
@@ -1 +0,0 @@
1
- import e from"po-parser";import{setNestedProperty as t,getSortedMessages as s}from"../../utils.js";import{defineCodec as r}from"../ExtractorCodec.js";var n=r((()=>{const r={"Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"8bit","X-Generator":"next-intl","X-Crowdin-SourceKey":"msgstr"},n=".",o=new Map;return{decode(t,s){const r=e.parse(t);r.meta&&o.set(s.locale,r.meta);return(r.messages||[]).map((e=>{const{extractedComments:t,msgctxt:s,msgid:r,msgstr:o,references:a,...c}=e;return{...c,id:s?[s,r].join(n):r,message:o,description:t??[],references:a??[]}}))},encode(t,a){const c=s(t).map((e=>{const{description:t=[],id:s,message:r,references:o,...a}=e,c=s.lastIndexOf(n),m=s.includes(n),i=m?s.slice(c+1):s,d=[...new Set(o.map((e=>e.path)))].map((e=>({path:e})));return{msgid:i,msgstr:r,...t.length>0&&{extractedComments:t},...m&&{msgctxt:s.slice(0,c)},...d.length>0&&{references:d},...a}}));return e.serialize({meta:{Language:a.locale,...r,...o.get(a.locale)},messages:c})},toJSONString(e,s){const r=this.decode(e,s),n={};for(const e of r)t(n,e.id,e.message);return JSON.stringify(n)}}}));export{n as default};
@@ -1,2 +0,0 @@
1
- declare const _default: () => import("../ExtractorCodec.js").default;
2
- export default _default;
@@ -1,2 +0,0 @@
1
- declare const _default: () => import("../../ExtractorCodec.js").default;
2
- export default _default;