UNPKG

react-native-i18n-auto

Version:

Auto i18n tool for React Native with full TypeScript support

81 lines (80 loc) 5.38 kB
"use strict"; var _core = require("@babel/core"); var _babelPluginI18nAuto = _interopRequireDefault(require("../babel-plugin/babel-plugin-i18n-auto")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } describe('Babel Plugin i18n Auto', function () { var transform = function transform(code) { var _transformSync; return (_transformSync = (0, _core.transformSync)(code, { plugins: [_babelPluginI18nAuto["default"]], parserOpts: { plugins: ['jsx', 'typescript'] }, filename: 'test.tsx' })) === null || _transformSync === void 0 ? void 0 : _transformSync.code; }; describe('JSX Text Transformation', function () { it('should transform simple text nodes', function () { var input = "\n function App() {\n return <div>Hello World</div>;\n }\n "; var output = transform(input); expect(output).toContain('i18n.t("HELLO_WORLD")'); }); it('should handle multiple text nodes', function () { var input = "\n function App() {\n return (\n <div>\n <span>Hello</span>\n <span>World</span>\n </div>\n );\n }\n "; var output = transform(input); expect(output).toContain('i18n.t("HELLO")'); expect(output).toContain('i18n.t("WORLD")'); }); it('should ignore empty or whitespace-only text', function () { var input = "\n function App() {\n return (\n <div>\n {\" \"}\n <span> </span>\n <span>Hello</span>\n </div>\n );\n }\n "; var output = transform(input); expect(output).toContain('i18n.t("HELLO")'); expect(output).not.toContain('i18n.t(" ")'); }); }); describe('JSX Attribute Transformation', function () { it('should transform specific string attributes', function () { var input = "\n function App() {\n return (\n <input\n placeholder=\"Enter your name\"\n title=\"Name Input\"\n type=\"text\"\n />\n );\n }\n "; var output = transform(input); expect(output).toContain('i18n.t("ENTER_YOUR_NAME")'); expect(output).toContain('i18n.t("NAME_INPUT")'); expect(output).not.toContain('i18n.t("TEXT")'); // Should not transform type attribute }); it('should handle multiple attributes on the same element', function () { var input = "\n function App() {\n return (\n <button\n title=\"Submit Form\"\n label=\"Click here\"\n />\n );\n }\n "; var output = transform(input); expect(output).toContain('i18n.t("SUBMIT_FORM")'); expect(output).toContain('i18n.t("CLICK_HERE")'); }); }); describe('Import Management', function () { it('should add i18n import when translations are used', function () { var input = "\n function App() {\n return <div>Hello</div>;\n }\n "; var output = transform(input); expect(output).toMatch(/require\(["']react-native-i18n-auto["']\)/); expect(output).toContain('i18n.t("HELLO")'); }); it('should not add import when no translations are needed', function () { var input = "\n function App() {\n return <div>{someVar}</div>;\n }\n "; var output = transform(input); expect(output).not.toMatch(/require\(["']react-native-i18n-auto["']\)/); }); }); describe('Key Generation', function () { it('should generate consistent keys for the same text', function () { var _output1$match, _output2$match; var input1 = "\n function App1() {\n return <div>Hello World</div>;\n }\n "; var input2 = "\n function App2() {\n return <span>Hello World</span>;\n }\n "; var output1 = transform(input1); var output2 = transform(input2); var key1 = output1 === null || output1 === void 0 || (_output1$match = output1.match(/i18n\.t\("([^"]+)"\)/)) === null || _output1$match === void 0 ? void 0 : _output1$match[1]; var key2 = output2 === null || output2 === void 0 || (_output2$match = output2.match(/i18n\.t\("([^"]+)"\)/)) === null || _output2$match === void 0 ? void 0 : _output2$match[1]; expect(key1).toBe(key2); }); it('should handle special characters in text', function () { var input = "\n function App() {\n return <div>Hello, World! 123</div>;\n }\n "; var output = transform(input); expect(output).toContain('i18n.t("HELLO_WORLD_123")'); }); }); });