next-translate-plugin 2.0.0-canary.6 → 2.0.1
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/lib/cjs/index.js +27 -14
- package/lib/cjs/loader.js +6 -2
- package/lib/cjs/templateAppDir.js +42 -0
- package/lib/cjs/utils.js +5 -1
- package/lib/esm/index.js +27 -14
- package/lib/esm/loader.js +6 -2
- package/lib/esm/templateAppDir.js +39 -0
- package/lib/esm/utils.js +3 -0
- package/package.json +3 -2
- package/templateAppDir/package.json +7 -0
- package/templateAppDir.d.ts +7 -0
- package/types.d.ts +1 -0
- package/utils.d.ts +1 -0
package/lib/cjs/index.js
CHANGED
|
@@ -21,6 +21,15 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
21
21
|
}
|
|
22
22
|
return t;
|
|
23
23
|
};
|
|
24
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
25
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
26
|
+
if (ar || !(i in from)) {
|
|
27
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
28
|
+
ar[i] = from[i];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
32
|
+
};
|
|
24
33
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
25
34
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
26
35
|
};
|
|
@@ -28,19 +37,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
28
37
|
var fs_1 = __importDefault(require("fs"));
|
|
29
38
|
var path_1 = __importDefault(require("path"));
|
|
30
39
|
var utils_1 = require("./utils");
|
|
40
|
+
var test = /\.(tsx|ts|js|mjs|jsx)$/;
|
|
41
|
+
var appDirNext13 = ['app', 'src/app'];
|
|
42
|
+
var possiblePageDirs = __spreadArray([
|
|
43
|
+
'pages',
|
|
44
|
+
'src/pages',
|
|
45
|
+
'app/pages',
|
|
46
|
+
'integrations/pages'
|
|
47
|
+
], appDirNext13, true);
|
|
31
48
|
function nextTranslate(nextConfig) {
|
|
32
49
|
if (nextConfig === void 0) { nextConfig = {}; }
|
|
33
|
-
var test = /\.(tsx|ts|js|mjs|jsx)$/;
|
|
34
50
|
var basePath = pkgDir();
|
|
35
|
-
var
|
|
36
|
-
'pages',
|
|
37
|
-
'src/pages',
|
|
38
|
-
'app/pages',
|
|
39
|
-
'integrations/pages',
|
|
40
|
-
];
|
|
41
|
-
var translationDir = path_1.default.resolve(path_1.default.relative(basePath, process.env.NEXT_TRANSLATE_PATH || '.'));
|
|
51
|
+
var dir = path_1.default.resolve(path_1.default.relative(basePath, process.env.NEXT_TRANSLATE_PATH || '.'));
|
|
42
52
|
var nextConfigI18n = nextConfig.i18n || {};
|
|
43
|
-
var _a = require(path_1.default.join(
|
|
53
|
+
var _a = require(path_1.default.join(dir, 'i18n')), _b = _a.locales, locales = _b === void 0 ? nextConfigI18n.locales || [] : _b, _c = _a.defaultLocale, defaultLocale = _c === void 0 ? nextConfigI18n.defaultLocale || 'en' : _c, _d = _a.domains, domains = _d === void 0 ? nextConfigI18n.domains : _d, _e = _a.localeDetection, localeDetection = _e === void 0 ? nextConfigI18n.localeDetection : _e, _f = _a.loader, loader = _f === void 0 ? true : _f, pagesInDir = _a.pagesInDir, restI18n = __rest(_a, ["locales", "defaultLocale", "domains", "localeDetection", "loader", "pagesInDir"]);
|
|
44
54
|
var nextConfigWithI18n = __assign(__assign({}, nextConfig), { i18n: {
|
|
45
55
|
locales: locales,
|
|
46
56
|
defaultLocale: defaultLocale,
|
|
@@ -48,22 +58,24 @@ function nextTranslate(nextConfig) {
|
|
|
48
58
|
localeDetection: localeDetection,
|
|
49
59
|
} });
|
|
50
60
|
var hasGetInitialPropsOnAppJs = false;
|
|
61
|
+
var isAppDirNext13 = false;
|
|
51
62
|
if (!pagesInDir) {
|
|
52
63
|
for (var _i = 0, possiblePageDirs_1 = possiblePageDirs; _i < possiblePageDirs_1.length; _i++) {
|
|
53
64
|
var possiblePageDir = possiblePageDirs_1[_i];
|
|
54
|
-
if (fs_1.default.existsSync(path_1.default.join(
|
|
65
|
+
if (fs_1.default.existsSync(path_1.default.join(dir, possiblePageDir))) {
|
|
55
66
|
pagesInDir = possiblePageDir;
|
|
67
|
+
isAppDirNext13 = appDirNext13.includes(possiblePageDir);
|
|
56
68
|
break;
|
|
57
69
|
}
|
|
58
70
|
}
|
|
59
71
|
}
|
|
60
|
-
if (!pagesInDir || !fs_1.default.existsSync(path_1.default.join(
|
|
72
|
+
if (!pagesInDir || !fs_1.default.existsSync(path_1.default.join(dir, pagesInDir))) {
|
|
61
73
|
return nextConfigWithI18n;
|
|
62
74
|
}
|
|
63
|
-
var pagesPath = path_1.default.join(
|
|
75
|
+
var pagesPath = path_1.default.join(dir, pagesInDir);
|
|
64
76
|
var app = fs_1.default.readdirSync(pagesPath).find(function (page) { return page.startsWith('_app.'); });
|
|
65
77
|
if (app) {
|
|
66
|
-
var appPkg = (0, utils_1.parseFile)(
|
|
78
|
+
var appPkg = (0, utils_1.parseFile)(dir, path_1.default.join(pagesPath, app));
|
|
67
79
|
var defaultExport = (0, utils_1.getDefaultExport)(appPkg);
|
|
68
80
|
if (defaultExport) {
|
|
69
81
|
var isGetInitialProps = (0, utils_1.hasStaticName)(appPkg, defaultExport, 'getInitialProps');
|
|
@@ -80,7 +92,7 @@ function nextTranslate(nextConfig) {
|
|
|
80
92
|
config.module = {};
|
|
81
93
|
if (!config.module.rules)
|
|
82
94
|
config.module.rules = [];
|
|
83
|
-
config.resolve.alias = __assign(__assign({}, (config.resolve.alias || {})), { '@next-translate-root': path_1.default.resolve(
|
|
95
|
+
config.resolve.alias = __assign(__assign({}, (config.resolve.alias || {})), { '@next-translate-root': path_1.default.resolve(dir) });
|
|
84
96
|
if (!loader)
|
|
85
97
|
return config;
|
|
86
98
|
config.module.rules.push({
|
|
@@ -95,6 +107,7 @@ function nextTranslate(nextConfig) {
|
|
|
95
107
|
hasLoadLocaleFrom: typeof restI18n.loadLocaleFrom === 'function',
|
|
96
108
|
extensionsRgx: restI18n.extensionsRgx || test,
|
|
97
109
|
revalidate: restI18n.revalidate || 0,
|
|
110
|
+
isAppDirNext13: isAppDirNext13,
|
|
98
111
|
},
|
|
99
112
|
},
|
|
100
113
|
});
|
package/lib/cjs/loader.js
CHANGED
|
@@ -6,8 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
var templateWithHoc_1 = __importDefault(require("./templateWithHoc"));
|
|
7
7
|
var templateWithLoader_1 = __importDefault(require("./templateWithLoader"));
|
|
8
8
|
var utils_1 = require("./utils");
|
|
9
|
+
var templateAppDir_1 = __importDefault(require("./templateAppDir"));
|
|
9
10
|
function loader(rawCode) {
|
|
10
|
-
var _a = this.getOptions(), basePath = _a.basePath, pagesPath = _a.pagesPath, hasAppJs = _a.hasAppJs, hasGetInitialPropsOnAppJs = _a.hasGetInitialPropsOnAppJs, hasLoadLocaleFrom = _a.hasLoadLocaleFrom, extensionsRgx = _a.extensionsRgx, revalidate = _a.revalidate;
|
|
11
|
+
var _a = this.getOptions(), basePath = _a.basePath, pagesPath = _a.pagesPath, hasAppJs = _a.hasAppJs, hasGetInitialPropsOnAppJs = _a.hasGetInitialPropsOnAppJs, hasLoadLocaleFrom = _a.hasLoadLocaleFrom, extensionsRgx = _a.extensionsRgx, revalidate = _a.revalidate, isAppDirNext13 = _a.isAppDirNext13;
|
|
11
12
|
var normalizedPagesPath = pagesPath.replace(/\\/g, '/');
|
|
12
13
|
var normalizedResourcePath = this.resourcePath.replace(/\\/g, '/');
|
|
13
14
|
if (normalizedResourcePath.includes('node_modules/next/dist/pages/_app')) {
|
|
@@ -15,7 +16,7 @@ function loader(rawCode) {
|
|
|
15
16
|
return rawCode;
|
|
16
17
|
return (0, utils_1.getDefaultAppJs)(hasLoadLocaleFrom);
|
|
17
18
|
}
|
|
18
|
-
if (!normalizedResourcePath.startsWith(normalizedPagesPath))
|
|
19
|
+
if (!isAppDirNext13 && !normalizedResourcePath.startsWith(normalizedPagesPath))
|
|
19
20
|
return rawCode;
|
|
20
21
|
var page = normalizedResourcePath.replace(normalizedPagesPath, '/');
|
|
21
22
|
var pageNoExt = page.replace(extensionsRgx, '');
|
|
@@ -23,6 +24,9 @@ function loader(rawCode) {
|
|
|
23
24
|
var defaultExport = (0, utils_1.getDefaultExport)(pagePkg);
|
|
24
25
|
if (!defaultExport)
|
|
25
26
|
return rawCode;
|
|
27
|
+
if (isAppDirNext13) {
|
|
28
|
+
return (0, templateAppDir_1.default)(pagePkg, { hasLoadLocaleFrom: hasLoadLocaleFrom, pageNoExt: pageNoExt, normalizedResourcePath: normalizedResourcePath, normalizedPagesPath: normalizedPagesPath });
|
|
29
|
+
}
|
|
26
30
|
if ((0, utils_1.hasExportName)(pagePkg, '__N_SSP') || (0, utils_1.hasExportName)(pagePkg, '__N_SSG')) {
|
|
27
31
|
return rawCode;
|
|
28
32
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var utils_1 = require("./utils");
|
|
4
|
+
var clientLine = ['"use client"', "'use client'"];
|
|
5
|
+
var defaultDynamicExport = "export const dynamic = 'force-dynamic';";
|
|
6
|
+
function templateAppDir(pagePkg, _a) {
|
|
7
|
+
var _b = _a === void 0 ? {} : _a, _c = _b.hasLoadLocaleFrom, hasLoadLocaleFrom = _c === void 0 ? false : _c, _d = _b.pageNoExt, pageNoExt = _d === void 0 ? '/' : _d, _e = _b.normalizedResourcePath, normalizedResourcePath = _e === void 0 ? '' : _e, _f = _b.normalizedPagesPath, normalizedPagesPath = _f === void 0 ? '' : _f;
|
|
8
|
+
var code = pagePkg.getCode();
|
|
9
|
+
var codeWithoutComments = (0, utils_1.removeCommentsFromCode)(code).trim();
|
|
10
|
+
var isClientCode = clientLine.some(function (line) { return codeWithoutComments.startsWith(line); });
|
|
11
|
+
var isPage = pageNoExt.endsWith('/page') && normalizedResourcePath.startsWith(normalizedPagesPath);
|
|
12
|
+
if (!isPage && !isClientCode)
|
|
13
|
+
return code;
|
|
14
|
+
var hash = Date.now().toString(16);
|
|
15
|
+
var pathname = pageNoExt.replace('/page', '/');
|
|
16
|
+
var pageVariableName = (0, utils_1.interceptExport)(pagePkg, 'default', "__Next_Translate__Page__".concat(hash, "__"));
|
|
17
|
+
var dynamicVariable = (0, utils_1.getNamedExport)(pagePkg, 'dynamic', false);
|
|
18
|
+
var dynamicExport = dynamicVariable ? '' : defaultDynamicExport;
|
|
19
|
+
if (!pageVariableName)
|
|
20
|
+
return code;
|
|
21
|
+
code = pagePkg.getCode();
|
|
22
|
+
if (isClientCode && !isPage)
|
|
23
|
+
return templateAppDirClientComponent({ code: code, hash: hash, pageVariableName: pageVariableName });
|
|
24
|
+
if (isClientCode && isPage)
|
|
25
|
+
return templateAppDirClientPage({ code: code, hash: hash, pageVariableName: pageVariableName, pathname: pathname, hasLoadLocaleFrom: hasLoadLocaleFrom });
|
|
26
|
+
return "\n import __i18nConfig from '@next-translate-root/i18n'\n import __loadNamespaces from 'next-translate/loadNamespaces'\n ".concat(code, "\n\n globalThis.i18nConfig = __i18nConfig\n\n ").concat(dynamicExport, "\n\n export default async function __Next_Translate_new__").concat(hash, "__(props) {\n let config = { \n ...__i18nConfig,\n locale: props.searchParams?.lang,\n loaderName: `${dynamic} (server page)`,\n pathname: '").concat(pathname, "',\n ").concat((0, utils_1.overwriteLoadLocales)(hasLoadLocaleFrom), "\n }\n \n if (!globalThis.__NEXT_TRANSLATE__) {\n globalThis.__NEXT_TRANSLATE__ = {}\n }\n \n const { __lang, __namespaces } = await __loadNamespaces(config)\n globalThis.__NEXT_TRANSLATE__ = { lang: __lang, namespaces: __namespaces, pathname: '").concat(pathname, "' }\n\n return (\n <>\n <div \n id=\"__NEXT_TRANSLATE_DATA__\" \n data-lang={__lang} \n data-ns={JSON.stringify(__namespaces)}\n data-pathname=\"").concat(pathname, "\"\n />\n <").concat(pageVariableName, " {...props} />\n </>\n )\n }\n");
|
|
27
|
+
}
|
|
28
|
+
exports.default = templateAppDir;
|
|
29
|
+
function templateAppDirClientComponent(_a) {
|
|
30
|
+
var code = _a.code, hash = _a.hash, pageVariableName = _a.pageVariableName;
|
|
31
|
+
var clientCode = code;
|
|
32
|
+
var topLine = clientLine[0];
|
|
33
|
+
clientLine.forEach(function (line) { clientCode = clientCode.replace(line, ''); });
|
|
34
|
+
return "".concat(topLine, "\n import __i18nConfig from '@next-translate-root/i18n'\n import * as __react from 'react'\n\n ").concat(clientCode, "\n\n export default function __Next_Translate_new__").concat(hash, "__(props) {\n const forceUpdate = __react.useReducer(() => [])[1]\n const isClient = typeof window !== 'undefined'\n\n if (isClient && !window.__NEXT_TRANSLATE__) {\n window.__NEXT_TRANSLATE__ = { lang: __i18nConfig.defaultLocale, namespaces: {} }\n update(false)\n }\n\n if (isClient && !window.i18nConfig) {\n window.i18nConfig = __i18nConfig\n }\n\n __react.useEffect(update)\n\n function update(rerender = true) {\n const el = document.getElementById('__NEXT_TRANSLATE_DATA__')\n\n if (!el) return\n\n const { lang, ns, pathname } = el.dataset\n const shouldRerender = lang !== window.__NEXT_TRANSLATE__.lang || pathname !== window.__NEXT_TRANSLATE__.pathname\n window.__NEXT_TRANSLATE__ = { lang, namespaces: JSON.parse(ns), pathname }\n if (shouldRerender && rerender) forceUpdate()\n }\n\n return <").concat(pageVariableName, " {...props} />\n }\n ");
|
|
35
|
+
}
|
|
36
|
+
function templateAppDirClientPage(_a) {
|
|
37
|
+
var code = _a.code, hash = _a.hash, pageVariableName = _a.pageVariableName, pathname = _a.pathname, hasLoadLocaleFrom = _a.hasLoadLocaleFrom;
|
|
38
|
+
var clientCode = code;
|
|
39
|
+
var topLine = clientLine[0];
|
|
40
|
+
clientLine.forEach(function (line) { clientCode = clientCode.replace(line, ''); });
|
|
41
|
+
return "".concat(topLine, "\n import __i18nConfig from '@next-translate-root/i18n'\n import __loadNamespaces, { log as __log } from 'next-translate/loadNamespaces'\n import { useSearchParams as __useSearchParams } from 'next/navigation'\n import * as __react from 'react'\n\n ").concat(clientCode, "\n\n export default function __Next_Translate_new__").concat(hash, "__(props) {\n const forceUpdate = __react.useReducer(() => [])[1]\n const lang = __useSearchParams().get('lang')\n const pathname = '").concat(pathname, "'\n const isServer = typeof window === 'undefined'\n const config = { \n ...__i18nConfig,\n locale: lang,\n loaderName: 'useEffect (client page)',\n pathname,\n ").concat((0, utils_1.overwriteLoadLocales)(hasLoadLocaleFrom), "\n }\n\n __react.useEffect(() => {\n const shouldLoad = lang !== window.__NEXT_TRANSLATE__?.lang || pathname !== window.__NEXT_TRANSLATE__?.pathname\n\n if (!shouldLoad) return\n\n __loadNamespaces(config).then(({ __lang, __namespaces }) => {\n window.__NEXT_TRANSLATE__ = { lang: __lang, namespaces: __namespaces, pathname: '").concat(pathname, "' }\n window.i18nConfig = __i18nConfig\n forceUpdate()\n })\n }, [lang])\n\n if (isServer) __log(config, { page: pathname, lang, namespaces: ['calculated in client-side'] })\n if (isServer || !window.__NEXT_TRANSLATE__) return null\n\n return <").concat(pageVariableName, " {...props} />\n }\n ");
|
|
42
|
+
}
|
package/lib/cjs/utils.js
CHANGED
|
@@ -23,7 +23,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
23
23
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.interceptExport = exports.isNotExportModifier = exports.hasHOC = exports.isPageToIgnore = exports.hasStaticName = exports.getStaticName = exports.hasExportName = exports.getDefaultExport = exports.getNamedExport = exports.resolveIdentifier = exports.resolveParenthesis = exports.getImportedNames = exports.getSymbol = exports.parseCode = exports.parseFile = exports.getFilePkg = exports.getTsCompilerOptions = exports.overwriteLoadLocales = exports.getDefaultAppJs = exports.defaultLoader = void 0;
|
|
26
|
+
exports.removeCommentsFromCode = exports.interceptExport = exports.isNotExportModifier = exports.hasHOC = exports.isPageToIgnore = exports.hasStaticName = exports.getStaticName = exports.hasExportName = exports.getDefaultExport = exports.getNamedExport = exports.resolveIdentifier = exports.resolveParenthesis = exports.getImportedNames = exports.getSymbol = exports.parseCode = exports.parseFile = exports.getFilePkg = exports.getTsCompilerOptions = exports.overwriteLoadLocales = exports.getDefaultAppJs = exports.defaultLoader = void 0;
|
|
27
27
|
var typescript_1 = __importDefault(require("typescript"));
|
|
28
28
|
var specFileOrFolderRgx = /(__mocks__|__tests__)|(\.(spec|test)\.(tsx|ts|js|jsx)$)/;
|
|
29
29
|
exports.defaultLoader = '(l, n) => import(`@next-translate-root/locales/${l}/${n}`).then(m => m.default)';
|
|
@@ -350,3 +350,7 @@ function interceptExport(filePkg, exportName, defaultLocalName) {
|
|
|
350
350
|
return finalLocalName;
|
|
351
351
|
}
|
|
352
352
|
exports.interceptExport = interceptExport;
|
|
353
|
+
function removeCommentsFromCode(code) {
|
|
354
|
+
return code.replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, '');
|
|
355
|
+
}
|
|
356
|
+
exports.removeCommentsFromCode = removeCommentsFromCode;
|
package/lib/esm/index.js
CHANGED
|
@@ -20,22 +20,32 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
20
20
|
}
|
|
21
21
|
return t;
|
|
22
22
|
};
|
|
23
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
24
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
25
|
+
if (ar || !(i in from)) {
|
|
26
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
27
|
+
ar[i] = from[i];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
31
|
+
};
|
|
23
32
|
import fs from 'fs';
|
|
24
33
|
import path from 'path';
|
|
25
34
|
import { parseFile, getDefaultExport, hasStaticName, hasHOC } from './utils';
|
|
35
|
+
var test = /\.(tsx|ts|js|mjs|jsx)$/;
|
|
36
|
+
var appDirNext13 = ['app', 'src/app'];
|
|
37
|
+
var possiblePageDirs = __spreadArray([
|
|
38
|
+
'pages',
|
|
39
|
+
'src/pages',
|
|
40
|
+
'app/pages',
|
|
41
|
+
'integrations/pages'
|
|
42
|
+
], appDirNext13, true);
|
|
26
43
|
function nextTranslate(nextConfig) {
|
|
27
44
|
if (nextConfig === void 0) { nextConfig = {}; }
|
|
28
|
-
var test = /\.(tsx|ts|js|mjs|jsx)$/;
|
|
29
45
|
var basePath = pkgDir();
|
|
30
|
-
var
|
|
31
|
-
'pages',
|
|
32
|
-
'src/pages',
|
|
33
|
-
'app/pages',
|
|
34
|
-
'integrations/pages',
|
|
35
|
-
];
|
|
36
|
-
var translationDir = path.resolve(path.relative(basePath, process.env.NEXT_TRANSLATE_PATH || '.'));
|
|
46
|
+
var dir = path.resolve(path.relative(basePath, process.env.NEXT_TRANSLATE_PATH || '.'));
|
|
37
47
|
var nextConfigI18n = nextConfig.i18n || {};
|
|
38
|
-
var _a = require(path.join(
|
|
48
|
+
var _a = require(path.join(dir, 'i18n')), _b = _a.locales, locales = _b === void 0 ? nextConfigI18n.locales || [] : _b, _c = _a.defaultLocale, defaultLocale = _c === void 0 ? nextConfigI18n.defaultLocale || 'en' : _c, _d = _a.domains, domains = _d === void 0 ? nextConfigI18n.domains : _d, _e = _a.localeDetection, localeDetection = _e === void 0 ? nextConfigI18n.localeDetection : _e, _f = _a.loader, loader = _f === void 0 ? true : _f, pagesInDir = _a.pagesInDir, restI18n = __rest(_a, ["locales", "defaultLocale", "domains", "localeDetection", "loader", "pagesInDir"]);
|
|
39
49
|
var nextConfigWithI18n = __assign(__assign({}, nextConfig), { i18n: {
|
|
40
50
|
locales: locales,
|
|
41
51
|
defaultLocale: defaultLocale,
|
|
@@ -43,22 +53,24 @@ function nextTranslate(nextConfig) {
|
|
|
43
53
|
localeDetection: localeDetection,
|
|
44
54
|
} });
|
|
45
55
|
var hasGetInitialPropsOnAppJs = false;
|
|
56
|
+
var isAppDirNext13 = false;
|
|
46
57
|
if (!pagesInDir) {
|
|
47
58
|
for (var _i = 0, possiblePageDirs_1 = possiblePageDirs; _i < possiblePageDirs_1.length; _i++) {
|
|
48
59
|
var possiblePageDir = possiblePageDirs_1[_i];
|
|
49
|
-
if (fs.existsSync(path.join(
|
|
60
|
+
if (fs.existsSync(path.join(dir, possiblePageDir))) {
|
|
50
61
|
pagesInDir = possiblePageDir;
|
|
62
|
+
isAppDirNext13 = appDirNext13.includes(possiblePageDir);
|
|
51
63
|
break;
|
|
52
64
|
}
|
|
53
65
|
}
|
|
54
66
|
}
|
|
55
|
-
if (!pagesInDir || !fs.existsSync(path.join(
|
|
67
|
+
if (!pagesInDir || !fs.existsSync(path.join(dir, pagesInDir))) {
|
|
56
68
|
return nextConfigWithI18n;
|
|
57
69
|
}
|
|
58
|
-
var pagesPath = path.join(
|
|
70
|
+
var pagesPath = path.join(dir, pagesInDir);
|
|
59
71
|
var app = fs.readdirSync(pagesPath).find(function (page) { return page.startsWith('_app.'); });
|
|
60
72
|
if (app) {
|
|
61
|
-
var appPkg = parseFile(
|
|
73
|
+
var appPkg = parseFile(dir, path.join(pagesPath, app));
|
|
62
74
|
var defaultExport = getDefaultExport(appPkg);
|
|
63
75
|
if (defaultExport) {
|
|
64
76
|
var isGetInitialProps = hasStaticName(appPkg, defaultExport, 'getInitialProps');
|
|
@@ -75,7 +87,7 @@ function nextTranslate(nextConfig) {
|
|
|
75
87
|
config.module = {};
|
|
76
88
|
if (!config.module.rules)
|
|
77
89
|
config.module.rules = [];
|
|
78
|
-
config.resolve.alias = __assign(__assign({}, (config.resolve.alias || {})), { '@next-translate-root': path.resolve(
|
|
90
|
+
config.resolve.alias = __assign(__assign({}, (config.resolve.alias || {})), { '@next-translate-root': path.resolve(dir) });
|
|
79
91
|
if (!loader)
|
|
80
92
|
return config;
|
|
81
93
|
config.module.rules.push({
|
|
@@ -90,6 +102,7 @@ function nextTranslate(nextConfig) {
|
|
|
90
102
|
hasLoadLocaleFrom: typeof restI18n.loadLocaleFrom === 'function',
|
|
91
103
|
extensionsRgx: restI18n.extensionsRgx || test,
|
|
92
104
|
revalidate: restI18n.revalidate || 0,
|
|
105
|
+
isAppDirNext13: isAppDirNext13,
|
|
93
106
|
},
|
|
94
107
|
},
|
|
95
108
|
});
|
package/lib/esm/loader.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import templateWithHoc from './templateWithHoc';
|
|
2
2
|
import templateWithLoader from './templateWithLoader';
|
|
3
3
|
import { parseFile, getDefaultAppJs, getDefaultExport, hasExportName, hasStaticName, isPageToIgnore, hasHOC, } from './utils';
|
|
4
|
+
import templateAppDir from './templateAppDir';
|
|
4
5
|
export default function loader(rawCode) {
|
|
5
|
-
var _a = this.getOptions(), basePath = _a.basePath, pagesPath = _a.pagesPath, hasAppJs = _a.hasAppJs, hasGetInitialPropsOnAppJs = _a.hasGetInitialPropsOnAppJs, hasLoadLocaleFrom = _a.hasLoadLocaleFrom, extensionsRgx = _a.extensionsRgx, revalidate = _a.revalidate;
|
|
6
|
+
var _a = this.getOptions(), basePath = _a.basePath, pagesPath = _a.pagesPath, hasAppJs = _a.hasAppJs, hasGetInitialPropsOnAppJs = _a.hasGetInitialPropsOnAppJs, hasLoadLocaleFrom = _a.hasLoadLocaleFrom, extensionsRgx = _a.extensionsRgx, revalidate = _a.revalidate, isAppDirNext13 = _a.isAppDirNext13;
|
|
6
7
|
var normalizedPagesPath = pagesPath.replace(/\\/g, '/');
|
|
7
8
|
var normalizedResourcePath = this.resourcePath.replace(/\\/g, '/');
|
|
8
9
|
if (normalizedResourcePath.includes('node_modules/next/dist/pages/_app')) {
|
|
@@ -10,7 +11,7 @@ export default function loader(rawCode) {
|
|
|
10
11
|
return rawCode;
|
|
11
12
|
return getDefaultAppJs(hasLoadLocaleFrom);
|
|
12
13
|
}
|
|
13
|
-
if (!normalizedResourcePath.startsWith(normalizedPagesPath))
|
|
14
|
+
if (!isAppDirNext13 && !normalizedResourcePath.startsWith(normalizedPagesPath))
|
|
14
15
|
return rawCode;
|
|
15
16
|
var page = normalizedResourcePath.replace(normalizedPagesPath, '/');
|
|
16
17
|
var pageNoExt = page.replace(extensionsRgx, '');
|
|
@@ -18,6 +19,9 @@ export default function loader(rawCode) {
|
|
|
18
19
|
var defaultExport = getDefaultExport(pagePkg);
|
|
19
20
|
if (!defaultExport)
|
|
20
21
|
return rawCode;
|
|
22
|
+
if (isAppDirNext13) {
|
|
23
|
+
return templateAppDir(pagePkg, { hasLoadLocaleFrom: hasLoadLocaleFrom, pageNoExt: pageNoExt, normalizedResourcePath: normalizedResourcePath, normalizedPagesPath: normalizedPagesPath });
|
|
24
|
+
}
|
|
21
25
|
if (hasExportName(pagePkg, '__N_SSP') || hasExportName(pagePkg, '__N_SSG')) {
|
|
22
26
|
return rawCode;
|
|
23
27
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { interceptExport, overwriteLoadLocales, getNamedExport, removeCommentsFromCode } from "./utils";
|
|
2
|
+
var clientLine = ['"use client"', "'use client'"];
|
|
3
|
+
var defaultDynamicExport = "export const dynamic = 'force-dynamic';";
|
|
4
|
+
export default function templateAppDir(pagePkg, _a) {
|
|
5
|
+
var _b = _a === void 0 ? {} : _a, _c = _b.hasLoadLocaleFrom, hasLoadLocaleFrom = _c === void 0 ? false : _c, _d = _b.pageNoExt, pageNoExt = _d === void 0 ? '/' : _d, _e = _b.normalizedResourcePath, normalizedResourcePath = _e === void 0 ? '' : _e, _f = _b.normalizedPagesPath, normalizedPagesPath = _f === void 0 ? '' : _f;
|
|
6
|
+
var code = pagePkg.getCode();
|
|
7
|
+
var codeWithoutComments = removeCommentsFromCode(code).trim();
|
|
8
|
+
var isClientCode = clientLine.some(function (line) { return codeWithoutComments.startsWith(line); });
|
|
9
|
+
var isPage = pageNoExt.endsWith('/page') && normalizedResourcePath.startsWith(normalizedPagesPath);
|
|
10
|
+
if (!isPage && !isClientCode)
|
|
11
|
+
return code;
|
|
12
|
+
var hash = Date.now().toString(16);
|
|
13
|
+
var pathname = pageNoExt.replace('/page', '/');
|
|
14
|
+
var pageVariableName = interceptExport(pagePkg, 'default', "__Next_Translate__Page__".concat(hash, "__"));
|
|
15
|
+
var dynamicVariable = getNamedExport(pagePkg, 'dynamic', false);
|
|
16
|
+
var dynamicExport = dynamicVariable ? '' : defaultDynamicExport;
|
|
17
|
+
if (!pageVariableName)
|
|
18
|
+
return code;
|
|
19
|
+
code = pagePkg.getCode();
|
|
20
|
+
if (isClientCode && !isPage)
|
|
21
|
+
return templateAppDirClientComponent({ code: code, hash: hash, pageVariableName: pageVariableName });
|
|
22
|
+
if (isClientCode && isPage)
|
|
23
|
+
return templateAppDirClientPage({ code: code, hash: hash, pageVariableName: pageVariableName, pathname: pathname, hasLoadLocaleFrom: hasLoadLocaleFrom });
|
|
24
|
+
return "\n import __i18nConfig from '@next-translate-root/i18n'\n import __loadNamespaces from 'next-translate/loadNamespaces'\n ".concat(code, "\n\n globalThis.i18nConfig = __i18nConfig\n\n ").concat(dynamicExport, "\n\n export default async function __Next_Translate_new__").concat(hash, "__(props) {\n let config = { \n ...__i18nConfig,\n locale: props.searchParams?.lang,\n loaderName: `${dynamic} (server page)`,\n pathname: '").concat(pathname, "',\n ").concat(overwriteLoadLocales(hasLoadLocaleFrom), "\n }\n \n if (!globalThis.__NEXT_TRANSLATE__) {\n globalThis.__NEXT_TRANSLATE__ = {}\n }\n \n const { __lang, __namespaces } = await __loadNamespaces(config)\n globalThis.__NEXT_TRANSLATE__ = { lang: __lang, namespaces: __namespaces, pathname: '").concat(pathname, "' }\n\n return (\n <>\n <div \n id=\"__NEXT_TRANSLATE_DATA__\" \n data-lang={__lang} \n data-ns={JSON.stringify(__namespaces)}\n data-pathname=\"").concat(pathname, "\"\n />\n <").concat(pageVariableName, " {...props} />\n </>\n )\n }\n");
|
|
25
|
+
}
|
|
26
|
+
function templateAppDirClientComponent(_a) {
|
|
27
|
+
var code = _a.code, hash = _a.hash, pageVariableName = _a.pageVariableName;
|
|
28
|
+
var clientCode = code;
|
|
29
|
+
var topLine = clientLine[0];
|
|
30
|
+
clientLine.forEach(function (line) { clientCode = clientCode.replace(line, ''); });
|
|
31
|
+
return "".concat(topLine, "\n import __i18nConfig from '@next-translate-root/i18n'\n import * as __react from 'react'\n\n ").concat(clientCode, "\n\n export default function __Next_Translate_new__").concat(hash, "__(props) {\n const forceUpdate = __react.useReducer(() => [])[1]\n const isClient = typeof window !== 'undefined'\n\n if (isClient && !window.__NEXT_TRANSLATE__) {\n window.__NEXT_TRANSLATE__ = { lang: __i18nConfig.defaultLocale, namespaces: {} }\n update(false)\n }\n\n if (isClient && !window.i18nConfig) {\n window.i18nConfig = __i18nConfig\n }\n\n __react.useEffect(update)\n\n function update(rerender = true) {\n const el = document.getElementById('__NEXT_TRANSLATE_DATA__')\n\n if (!el) return\n\n const { lang, ns, pathname } = el.dataset\n const shouldRerender = lang !== window.__NEXT_TRANSLATE__.lang || pathname !== window.__NEXT_TRANSLATE__.pathname\n window.__NEXT_TRANSLATE__ = { lang, namespaces: JSON.parse(ns), pathname }\n if (shouldRerender && rerender) forceUpdate()\n }\n\n return <").concat(pageVariableName, " {...props} />\n }\n ");
|
|
32
|
+
}
|
|
33
|
+
function templateAppDirClientPage(_a) {
|
|
34
|
+
var code = _a.code, hash = _a.hash, pageVariableName = _a.pageVariableName, pathname = _a.pathname, hasLoadLocaleFrom = _a.hasLoadLocaleFrom;
|
|
35
|
+
var clientCode = code;
|
|
36
|
+
var topLine = clientLine[0];
|
|
37
|
+
clientLine.forEach(function (line) { clientCode = clientCode.replace(line, ''); });
|
|
38
|
+
return "".concat(topLine, "\n import __i18nConfig from '@next-translate-root/i18n'\n import __loadNamespaces, { log as __log } from 'next-translate/loadNamespaces'\n import { useSearchParams as __useSearchParams } from 'next/navigation'\n import * as __react from 'react'\n\n ").concat(clientCode, "\n\n export default function __Next_Translate_new__").concat(hash, "__(props) {\n const forceUpdate = __react.useReducer(() => [])[1]\n const lang = __useSearchParams().get('lang')\n const pathname = '").concat(pathname, "'\n const isServer = typeof window === 'undefined'\n const config = { \n ...__i18nConfig,\n locale: lang,\n loaderName: 'useEffect (client page)',\n pathname,\n ").concat(overwriteLoadLocales(hasLoadLocaleFrom), "\n }\n\n __react.useEffect(() => {\n const shouldLoad = lang !== window.__NEXT_TRANSLATE__?.lang || pathname !== window.__NEXT_TRANSLATE__?.pathname\n\n if (!shouldLoad) return\n\n __loadNamespaces(config).then(({ __lang, __namespaces }) => {\n window.__NEXT_TRANSLATE__ = { lang: __lang, namespaces: __namespaces, pathname: '").concat(pathname, "' }\n window.i18nConfig = __i18nConfig\n forceUpdate()\n })\n }, [lang])\n\n if (isServer) __log(config, { page: pathname, lang, namespaces: ['calculated in client-side'] })\n if (isServer || !window.__NEXT_TRANSLATE__) return null\n\n return <").concat(pageVariableName, " {...props} />\n }\n ");
|
|
39
|
+
}
|
package/lib/esm/utils.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "next-translate-plugin",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Tiny and powerful i18n plugin to translate your Next.js pages.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -48,7 +48,8 @@
|
|
|
48
48
|
"test": "cross-env NODE_ENV=test jest --env=jsdom",
|
|
49
49
|
"test:coverage": "cross-env NODE_ENV=test jest --env=jsdom --coverage",
|
|
50
50
|
"test:watch": "cross-env NODE_ENV=test jest --env=jsdom --watch",
|
|
51
|
-
"tsc": "tsc -p tsconfig.json && tsc -p tsconfig-cjs.json && node build-packages.js"
|
|
51
|
+
"tsc": "tsc -p tsconfig.json && tsc -p tsconfig-cjs.json && node build-packages.js",
|
|
52
|
+
"postinstall": "node postinstall-message.js"
|
|
52
53
|
},
|
|
53
54
|
"dependencies": {
|
|
54
55
|
"typescript": "4.5.2"
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ParsedFilePkg } from "./types";
|
|
2
|
+
export default function templateAppDir(pagePkg: ParsedFilePkg, { hasLoadLocaleFrom, pageNoExt, normalizedResourcePath, normalizedPagesPath }?: {
|
|
3
|
+
hasLoadLocaleFrom?: boolean | undefined;
|
|
4
|
+
pageNoExt?: string | undefined;
|
|
5
|
+
normalizedResourcePath?: string | undefined;
|
|
6
|
+
normalizedPagesPath?: string | undefined;
|
|
7
|
+
}): string;
|
package/types.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export interface LoaderOptions {
|
|
|
7
7
|
hasLoadLocaleFrom: boolean;
|
|
8
8
|
extensionsRgx: RegExp;
|
|
9
9
|
revalidate: number;
|
|
10
|
+
isAppDirNext13: boolean;
|
|
10
11
|
}
|
|
11
12
|
export declare type Transformer = (rootNode: ts.SourceFile, context: ts.TransformationContext) => ts.SourceFile;
|
|
12
13
|
export interface ParsedFilePkg {
|
package/utils.d.ts
CHANGED
|
@@ -20,3 +20,4 @@ export declare function isPageToIgnore(pageFilePath: string): boolean;
|
|
|
20
20
|
export declare function hasHOC(filePkg: ParsedFilePkg): boolean;
|
|
21
21
|
export declare function isNotExportModifier(modifier: ts.Modifier): boolean;
|
|
22
22
|
export declare function interceptExport(filePkg: ParsedFilePkg, exportName: string, defaultLocalName: string): string;
|
|
23
|
+
export declare function removeCommentsFromCode(code: string): string;
|