paranormal
Version:
Phenomenal Code Examples
99 lines (70 loc) • 3.65 kB
JavaScript
'use strict';
exports.__esModule = true;
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _constants = require('./utils/constants');
var constants = _interopRequireWildcard(_constants);
var _fs = require('./utils/fs');
var fs = _interopRequireWildcard(_fs);
var _stripIndent = require('strip-indent');
var _stripIndent2 = _interopRequireDefault(_stripIndent);
var _resolveFrom = require('resolve-from');
var _resolveFrom2 = _interopRequireDefault(_resolveFrom);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function basename(filePath) {
return _path2.default.basename(filePath, _path2.default.extname(filePath));
}
class Example {
constructor(opts) {
this.filePath = opts.filePath;
this.relativePath = _path2.default.relative(opts.cwd, this.filePath);
this.relativePathOut = this.relativePath.split(_path2.default.sep).map(part => part.replace(constants.EXAMPLE_PATH_PART_NUMBER, '$2')).join(_path2.default.sep);
this.dirName = _path2.default.dirname(this.relativePath);
this.dirNameOut = _path2.default.dirname(this.relativePathOut);
this.baseName = basename(this.relativePath);
this.baseNameOut = basename(this.relativePathOut);
this.tempDir = _path2.default.join(opts.tempDir, this.dirNameOut);
this.htmlPath = _path2.default.join(this.tempDir, this.baseNameOut + '.html');
this.txtPath = _path2.default.join(this.tempDir, this.baseNameOut + '.txt');
this.jsPath = _path2.default.join(this.tempDir, this.baseNameOut + '.js');
let currentDirName = _path2.default.basename(opts.cwd);
let exampleDirName = this.dirNameOut.replace(_path2.default.sep, '/');
this.title = `${currentDirName}/${exampleDirName}/${this.baseNameOut}`;
let reactImport = (0, _resolveFrom2.default)(this.filePath, 'react');
let reactDomImport = (0, _resolveFrom2.default)(this.filePath, 'react-dom');
let relativeJsImport = _path2.default.relative(this.jsPath, this.filePath);
let relativeReactImport = _path2.default.relative(this.jsPath, reactImport);
let relativeReactDomImport = _path2.default.relative(this.jsPath, reactDomImport);
this.htmlContent = (0, _stripIndent2.default)(`
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>${this.title}</title>
</head>
<body>
<div id="root"></div>
<script type="text/javascript" src="./${this.baseNameOut}.js"></script>
</body>
</html>
`).trim();
this.jsContent = (0, _stripIndent2.default)(`
import React from "${relativeReactImport}";
import { render } from "${relativeReactDomImport}";
import Example from "${relativeJsImport}";
render(React.createElement(Example), document.getElementById("root"));
`).trim();
}
async build() {
let fileContents = await fs.readFile(this.filePath);
await fs.mkdirp(this.tempDir);
await _promise2.default.all([fs.writeFile(this.htmlPath, this.htmlContent), fs.writeFile(this.txtPath, fileContents), fs.writeFile(this.jsPath, this.jsContent)]);
}
async delete() {
await _promise2.default.all([fs.unlink(example.htmlPath), fs.unlink(example.jsPath)]);
}
}
exports.default = Example;