Skip to content

Commit

Permalink
Create Fable transformer for React Native
Browse files Browse the repository at this point in the history
  • Loading branch information
jgrund committed May 7, 2017
1 parent 7217e20 commit e8a6dbf
Show file tree
Hide file tree
Showing 8 changed files with 1,276 additions and 39 deletions.
32 changes: 32 additions & 0 deletions src/typescript/fable-utils/client-sync.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/usr/bin/env node

const net = require('net');
const childProcess = require('child_process');

if (require.main === module) {
const [, , port, msg] = process.argv;

let buff = '';

const c = new net.Socket();
c.connect({ port }, () => c.write(msg));

c.on('data', x => (buff += x));
// eslint-disable-next-line no-console
c.on('close', () => console.log(buff));
}

module.exports = args => {
const resp = childProcess.spawnSync('node', [
`${__dirname}/client.js`,
args.port,
JSON.stringify(args)
]);

resp.stderr = resp.stderr.toString();
resp.stdout = resp.stdout.toString();

if (resp.status !== 0) throw new Error(resp.stderr);

return resp;
};
37 changes: 2 additions & 35 deletions src/typescript/fable-utils/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,9 @@ var net = require('net');

var HOST = '127.0.0.1';

function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min;
}

// From http://stackoverflow.com/a/29872303
var isPortFree = function(port) {
return new Promise(function (resolve) {
var server = net.createServer(function(socket) {
socket.write('Echo server\r\n');
socket.pipe(socket);
});

server.listen(port, HOST);
server.on('error', function (e) {
resolve(false);
});

server.on('listening', function (e) {
server.close();
resolve(true);
});
})
};

exports.getFreePort = function(port) {
var port = port || getRandomInt(1000, 10000);
return isPortFree(port).then(res =>
res ? port : getFreePort()
);
}

exports.send = function(port, msg) {
return new Promise((resolve, reject) => {
var buffer = "";
var buffer = '';
var client = new net.Socket(), resolved = false;

client.connect(port, HOST, function() {
Expand All @@ -62,4 +29,4 @@ exports.send = function(port, msg) {
}
});
});
}
};
43 changes: 43 additions & 0 deletions src/typescript/react-native-fable-transformer/.eslintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"plugins": [
"prettier"
],
"rules": {
"no-var": 2,
"linebreak-style": [
2,
"unix"
],
"no-console": "off",
"curly": [
2,
"multi",
"consistent"
],
"prefer-const": [
"error",
{
"destructuring": "all",
"ignoreReadBeforeAssign": false
}
],
"prettier/prettier": [
"error",
{
"singleQuote": true
}
]
},
"env": {
"es6": true,
"node": true
},
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module"
},
"extends": [
"eslint:recommended",
"prettier"
]
}
Empty file.
33 changes: 33 additions & 0 deletions src/typescript/react-native-fable-transformer/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// react-native start --transformer ./smTransform.js

const transformer = require('react-native/packager/transformer');
const client = require('fable-utils/client-sync');
const babelPlugins = require('fable-utils/babel-plugins');
const babel = require('babel-core');

const isFableFile = /\.(?:fs|fsx|fsproj)$/;
const fableCoreVersion = null;
const DEFAULT_PORT = process.env.FABLE_SERVER_PORT != null
? parseInt(process.env.FABLE_SERVER_PORT, 10)
: 61225;

const customPlugins = [
babelPlugins.getRemoveUnneededNulls(),
babelPlugins.getTransformMacroExpressions(babel.template)
];

module.exports = (src, filename, options) => {
options = options || {};
if (isFableFile.test(filename)) {
if (babelOpts.sourceMaps) {
fsCode = src;
babelOpts.sourceMaps = true;
babelOpts.sourceFileName = relative(
process.cwd(),
fileName.replace(/\\/g, '/')
);
}

return babel.transformFromAst(data, fsCode, babelOpts).code;
} else {return transformer.transform(src, filename, options);}
};
38 changes: 38 additions & 0 deletions src/typescript/react-native-fable-transformer/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"name": "react-native-fable-transformer",
"version": "1.0.3",
"description": "React Native transformer for Fable",
"main": "index.js",
"scripts": {
"eslint": "eslint ./"
},
"repository": "https://github.com/fable-compiler/Fable/tree/master/src/typescript/react-native-fable-transformer",
"publishConfig": {
"registry": " https://registry.npmjs.org"
},
"keywords": [
"react native",
"native",
"F#",
"transformer"
],
"author": "Joe Grund",
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/fable-compiler/Fable/issues"
},
"homepage": "https://github.com/fable-compiler/Fable/tree/master/src/typescript/react-native-fable-transformer#readme",
"devDependencies": {
"eslint": "3.19.0",
"eslint-config-prettier": "1.7.0",
"eslint-plugin-prettier": "2.0.1",
"prettier": "1.3.1"
},
"peerDependencies": {
"babel-core": "^6.24.1",
"fable-core": "^1.0.0-narumi-906"
},
"dependencies": {
"fable-utils": "^1.0.0"
}
}
Loading

0 comments on commit e8a6dbf

Please sign in to comment.