What will it do?
It will change this
let content = include_str(‘path to text file’);
to this
let content = ‘content of text file’;
It works just like the rust-lang include_str!() macro.
Code
- While looping through the AST, our code checks for a function call (CallExpression ) named include_str
- If one is found, we derive the required file path from the first argument to the call and the path of the file that is being transpiled
- Contents of the file are read into a string with fs.readFIleSync
- The CallExpression is replaced with the string which is converted into a stringLiteral
index.js
const fs = require('fs'); const Path = require('path'); module.exports = function MyPlugin(ref) { var t = ref.types; return { visitor: { CallExpression: { enter: function (path) { if (t.isCallExpression(path.node) && path.node.callee.name === 'include_str') { let file_name = this.file.hub.file.opts.filename; let fpath = Path.join(Path.dirname(file_name), path.node.arguments[0].value); let content = fs.readFileSync(fpath, 'UTF-8'); path.replaceWith(t.stringLiteral(content)); } } } } }; };
Disclaimer
Not tested
Similar libs to check out
- babel-include-html – includes minified HTML as string
- babel-include-scss : processes scss to minified css and includes it as string