Skip to content

Windows support: normalize line endings and path separators #7

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
### 0.3.2

- Switch to 4 spaces intendation
- Add `intendation` option. Defaults to `" "` (four spaces)
- Delete generated fixtures via `npm run clean`

5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# babel-plugin-react-intl-messages-generator
Build skeleton `messages` files with `defineMessage` format for each component that contains explicit texts

___This is a fork of that fixes some issues on Windows systems.___
Hopefully the fork will become obsolete after the issues have been fixed or the solutions merged.
The original project is located at https://github.com/p10ns11y/babel-plugin-react-intl-messages-generator and https://www.npmjs.com/package/babel-plugin-react-intl-messages-generator.

## Installation

```sh
Expand Down Expand Up @@ -70,6 +74,7 @@ Only new unique `defaultMessage` appended as `descriptor` at the end of previous

- **`messagesDir`**: The target location where the plugin will output a `.js` file corresponding to each component from which messages were extracted. If not provided, the extracted message descriptors will only be accessible via Babel's API.

- **`intendation`**: A string that will be used to intend the generated messages. Defaults to `" "` (four spaces ).

### Via CLI

Expand Down
20 changes: 12 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
{
"name": "babel-plugin-react-intl-messages-generator",
"version": "0.3.0",
"description": "Extracts explicit texts from react components and generate a componentNameMessages.js files",
"name": "@loopmode/babel-plugin-react-intl-messages-generator",
"version": "0.3.2",
"description": "Extracts explicit texts from react components and generate a componentNameMessages.js files. Forked from https://github.com/p10ns11y/babel-plugin-react-intl-messages-generator, added Windows compatibility",
"repository": {
"type": "git",
"url": "git+https://github.com/p10ns11y/babel-plugin-react-intl-messages-generator.git"
"url": "git+https://github.com/loopmode/babel-plugin-react-intl-messages-generator.git"
},
"license": "BSD-3-Clause",
"main": "lib/index.js",
"author": "Peramanathan Sathyamoorthy <sathyam.peram@gmail.com>",
"contributors": [
"Jovica Aleksic <jovica.aleksic@loopmode.de> (https://github.com/loopmode)"
],
"dependencies": {
"babel-runtime": "^6.2.0",
"mkdirp": "^0.5.1"
"mkdirp": "^0.5.1",
"eol": "^0.9.0"
},
"devDependencies": {
"babel-cli": "^6.1.18",
Expand All @@ -30,7 +34,7 @@
},
"scripts": {
"lint": "eslint src/",
"clean": "rimraf lib/",
"clean": "rimraf lib/ && rimraf test/fixtures/*/actualMessages.js",
"test": "cross-env NODE_ENV=test mocha --compilers js:babel-register",
"build": "babel src/ --out-dir lib/",
"build:fixtures": "babel-node ./scripts/build-fixtures.js",
Expand All @@ -43,7 +47,7 @@
"defineMessages"
],
"bugs": {
"url": "https://github.com/p10ns11y/babel-plugin-react-intl-messages-generator/issues"
"url": "https://github.com/loopmode/babel-plugin-react-intl-messages-generator/issues"
},
"homepage": "https://github.com/p10ns11y/babel-plugin-react-intl-messages-generator#readme"
"homepage": "https://github.com/loopmode/babel-plugin-react-intl-messages-generator#readme"
}
11 changes: 6 additions & 5 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import * as p from 'path';
import { writeFileSync, existsSync, readFileSync } from 'fs';
import { sync as mkdirpSync } from 'mkdirp';
import eol from 'eol';

import {
createDescriptorsWithKey,
Expand Down Expand Up @@ -39,7 +40,7 @@ export default function({ types: t }) { // eslint-disable-line no-unused-vars

const prefixId = p
.relative(process.cwd(), file.opts.filename)
.split('/')
.split(p.sep)
.join('.')
.replace(/jsx?/, '..');

Expand Down Expand Up @@ -75,7 +76,7 @@ export default function({ types: t }) { // eslint-disable-line no-unused-vars
let relativePath = p.join(
p.sep,
p.relative(process.cwd(), filename)
);
).replace(/\\/g, '/');

let generatedMessagesFilename = p.join(
opts.messagesDir,
Expand Down Expand Up @@ -105,7 +106,7 @@ export default function({ types: t }) { // eslint-disable-line no-unused-vars
}
}

descriptorsWithKey += createDescriptorsWithKey(descriptor);
descriptorsWithKey += createDescriptorsWithKey(descriptor, opts);
return descriptorsWithKey;
},
''
Expand All @@ -122,13 +123,13 @@ export default function({ types: t }) { // eslint-disable-line no-unused-vars
updatedNamedDescriptors
);

writeFileSync(generatedMessagesFilename, updatedDescriptorFile);
writeFileSync(generatedMessagesFilename, eol.lf(updatedDescriptorFile));
}

// new file
if (!existingContent && namedDesriptors) {
let generatedDescriptorFile = defineMessageFormat(namedDesriptors);
writeFileSync(generatedMessagesFilename, generatedDescriptorFile);
writeFileSync(generatedMessagesFilename, eol.lf(generatedDescriptorFile));
}
// else keep the file untouched
}
Expand Down
14 changes: 8 additions & 6 deletions src/utils.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import eol from 'eol';

export const defineMessageFormat = (descriptors) =>
`import { defineMessages } from 'react-intl';

Expand All @@ -6,18 +8,18 @@ export default defineMessages({\n${descriptors}});
`;

export const removeDefindeMessageFormat = (fileContent) =>
fileContent
eol.lf(fileContent)
.replace(`import { defineMessages } from 'react-intl';\n\n`, '')
.replace(`export default defineMessages({\n`, '')
.replace('\n});', '');

export const createDescriptorsWithKey = (descriptor) => {
export const createDescriptorsWithKey = (descriptor, {intendation = ' '}) => {
const lintFixedDescriptor = JSON.stringify(descriptor, null, 4)
.replace('}', ' }')
.replace('"id"', 'id')
.replace('"defaultMessage"', 'defaultMessage')
.replace('}', `${intendation}}`)
.replace('"id"', `${intendation}id`)
.replace('"defaultMessage"', `${intendation}defaultMessage`)
.replace(/\"/g, "'");

const descriptorsWithKey = ` NameTheKey: ${lintFixedDescriptor},\n`;
const descriptorsWithKey = `${intendation}NameTheKey: ${lintFixedDescriptor},\n`;
return descriptorsWithKey;
};
18 changes: 9 additions & 9 deletions test/fixtures/componentMessages/expectedMessages.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { defineMessages } from 'react-intl';

export default defineMessages({
NameTheKey: {
id: 'test.fixtures.componentMessages.actual...',
defaultMessage: 'Hello'
},
NameTheKey: {
id: 'test.fixtures.componentMessages.actual...',
defaultMessage: 'world'
},
});
NameTheKey: {
id: 'test.fixtures.componentMessages.actual...',
defaultMessage: 'Hello'
},
NameTheKey: {
id: 'test.fixtures.componentMessages.actual...',
defaultMessage: 'world'
},
});
22 changes: 13 additions & 9 deletions test/fixtures/componentWithNewMessages/actualWithNewMessages.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import { defineMessages } from 'react-intl';

export default defineMessages({
helloTxt: {
id: 'test.fixtures.componentWithNewMessages.actualWithNew.text.hello',
defaultMessage: 'Hello'
},
worldTxt: {
id: 'test.fixtures.componentWithNewMessages.actualWithNew.text.world',
defaultMessage: 'world'
},
});
helloTxt: {
id: 'test.fixtures.componentWithNewMessages.actualWithNew.text.hello',
defaultMessage: 'Hello'
},
worldTxt: {
id: 'test.fixtures.componentWithNewMessages.actualWithNew.text.world',
defaultMessage: 'world'
},
NameTheKey: {
id: 'test.fixtures.componentWithNewMessages.actualWithNew...',
defaultMessage: 'New message'
},
});
26 changes: 13 additions & 13 deletions test/fixtures/componentWithNewMessages/expectedMessages.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import { defineMessages } from 'react-intl';

export default defineMessages({
helloTxt: {
id: 'test.fixtures.componentWithNewMessages.actualWithNew.text.hello',
defaultMessage: 'Hello'
},
worldTxt: {
id: 'test.fixtures.componentWithNewMessages.actualWithNew.text.world',
defaultMessage: 'world'
},
NameTheKey: {
id: 'test.fixtures.componentWithNewMessages.actualWithNew...',
defaultMessage: 'New message'
},
});
helloTxt: {
id: 'test.fixtures.componentWithNewMessages.actualWithNew.text.hello',
defaultMessage: 'Hello'
},
worldTxt: {
id: 'test.fixtures.componentWithNewMessages.actualWithNew.text.world',
defaultMessage: 'world'
},
NameTheKey: {
id: 'test.fixtures.componentWithNewMessages.actualWithNew...',
defaultMessage: 'New message'
},
});
26 changes: 13 additions & 13 deletions test/fixtures/duplicateMessages/expectedMessages.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import { defineMessages } from 'react-intl';

export default defineMessages({
NameTheKey: {
id: 'test.fixtures.duplicateMessages.actual...',
defaultMessage: 'Hello'
},
NameTheKey: {
id: 'test.fixtures.duplicateMessages.actual...',
defaultMessage: 'world'
},
NameTheKey: {
id: 'test.fixtures.duplicateMessages.actual...',
defaultMessage: 'Hello world'
},
});
NameTheKey: {
id: 'test.fixtures.duplicateMessages.actual...',
defaultMessage: 'Hello'
},
NameTheKey: {
id: 'test.fixtures.duplicateMessages.actual...',
defaultMessage: 'world'
},
NameTheKey: {
id: 'test.fixtures.duplicateMessages.actual...',
defaultMessage: 'Hello world'
},
});
10 changes: 5 additions & 5 deletions test/fixtures/skipNumberMessages/expectedMessages.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { defineMessages } from 'react-intl';

export default defineMessages({
NameTheKey: {
id: 'test.fixtures.skipNumberMessages.actual...',
defaultMessage: '1 it is ok to have numbers with text'
},
});
NameTheKey: {
id: 'test.fixtures.skipNumberMessages.actual...',
defaultMessage: '1 it is ok to have numbers with text'
},
});
18 changes: 9 additions & 9 deletions test/fixtures/statelessComponentMessages/expectedMessages.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { defineMessages } from 'react-intl';

export default defineMessages({
NameTheKey: {
id: 'test.fixtures.statelessComponentMessages.actual...',
defaultMessage: 'I am stateless Component'
},
NameTheKey: {
id: 'test.fixtures.statelessComponentMessages.actual...',
defaultMessage: 'I love props a lot!'
},
});
NameTheKey: {
id: 'test.fixtures.statelessComponentMessages.actual...',
defaultMessage: 'I am stateless Component'
},
NameTheKey: {
id: 'test.fixtures.statelessComponentMessages.actual...',
defaultMessage: 'I love props a lot!'
},
});
9 changes: 6 additions & 3 deletions test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@ import * as path from 'path';
import * as fs from 'fs';
import assert from 'power-assert';
import * as babel from 'babel-core';
import eol from 'eol';
import plugin from '../src/index';

function trim(str) {
return str.toString().replace(/^\s+|\s+$/, '');
}

function normalize(str) {
return eol.lf(trim(str));
}
const skipTests = [
'.babelrc',
'.DS_Store',
Expand Down Expand Up @@ -37,12 +40,12 @@ describe('emit asserts for: ', () => {

// Check code output
const expected = fs.readFileSync(path.join(fixtureDir, 'expected.js'));
assert.equal(trim(actual), trim(expected));
assert.equal(normalize(actual), normalize(expected));

// Check generated message output
const expectedGenMessages = fs.readFileSync(path.join(fixtureDir, 'expectedMessages.js'));
const actualGenMessages = fs.readFileSync(path.join(fixtureDir, actualFileName + 'Messages.js'));
assert.equal(trim(actualGenMessages), trim(expectedGenMessages));
assert.equal(normalize(actualGenMessages), normalize(expectedGenMessages));
});
});
});
Expand Down