UNPKG

paranormal

Version:
99 lines (70 loc) 3.65 kB
'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;