react-native-i18n-auto
Version:
Auto i18n tool for React Native with full TypeScript support
81 lines (80 loc) • 5.38 kB
JavaScript
"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")');
});
});
});