vue-styleguidist
Version:
Vue components style guide generator
215 lines (213 loc) • 12.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = _default;
exports.vuedocLoader = vuedocLoader;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var fs = _interopRequireWildcard(require("fs"));
var path = _interopRequireWildcard(require("path"));
var _util = require("util");
var _escodegen = require("escodegen");
var _toAst = _interopRequireDefault(require("to-ast"));
var _glogg = _interopRequireDefault(require("glogg"));
var _loaderUtils = _interopRequireDefault(require("loader-utils"));
var _sortProps = _interopRequireDefault(require("react-styleguidist/lib/loaders/utils/sortProps"));
var _requireIt = _interopRequireDefault(require("react-styleguidist/lib/loaders/utils/requireIt"));
var _getExamples = _interopRequireDefault(require("./utils/getExamples"));
var _getComponentVueDoc = _interopRequireDefault(require("./utils/getComponentVueDoc"));
var _findOrigins = _interopRequireDefault(require("./utils/findOrigins"));
var _stripOutOrigins = _interopRequireDefault(require("./utils/stripOutOrigins"));
var _getParser = _interopRequireDefault(require("./utils/getParser"));
var _consts = _interopRequireDefault(require("../scripts/consts"));
var _alreadyLoadedExamplesCache = _interopRequireDefault(require("./utils/already-loaded-examples-cache"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
var exists = (0, _util.promisify)(fs.exists);
var logger = (0, _glogg["default"])('rsg');
var examplesLoader = path.resolve(__dirname, './examples-loader.js');
function _default(source) {
var callback = this.async();
var cb = callback ? callback : function () {
return null;
};
vuedocLoader.call(this, source).then(function (res) {
return cb(undefined, res);
})["catch"](function (e) {
throw e;
});
}
function makeObject(set) {
if (!set) {
return undefined;
}
return set.reduce(function (acc, item) {
acc[item.name] = item;
return acc;
}, {});
}
function vuedocLoader(_x) {
return _vuedocLoader.apply(this, arguments);
}
function _vuedocLoader() {
_vuedocLoader = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(source) {
var _this = this;
var file, config, _ref, _ref$noExample, noExample, propsParser, getVsgDocs, vsgDocs, componentVueDoc, isComponentDocInVueFile, ignoreExamplesInFile, examples, examplePaths, examplesFile, relativeFile;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
file = this.request.split('!').pop();
config = this._styleguidist;
_ref = _loaderUtils["default"].getOptions(this) || {}, _ref$noExample = _ref.noExample, noExample = _ref$noExample === void 0 ? false : _ref$noExample; // Setup Webpack context dependencies to enable hot reload when adding new files or updating any of component dependencies
if (config.contextDependencies) {
config.contextDependencies.forEach(function (dir) {
return _this.addContextDependency(dir);
});
}
propsParser = (0, _getParser["default"])(config);
getVsgDocs = /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(internalFile) {
var docs, componentPath, originFiles, basedir, inSideVsgDocs, filteredProps, sortProps;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
docs = {
displayName: '',
exportName: '',
tags: {}
};
_context.prev = 1;
_context.next = 4;
return propsParser(internalFile);
case 4:
docs = _context.sent;
_context.next = 11;
break;
case 7:
_context.prev = 7;
_context.t0 = _context["catch"](1);
componentPath = path.relative(process.cwd(), internalFile);
logger.warn("Error parsing ".concat(componentPath, ": ").concat(_context.t0));
case 11:
// set dependency tree for mixins and extends
originFiles = (0, _findOrigins["default"])(docs);
basedir = path.dirname(internalFile);
originFiles.forEach(function (extensionFile) {
_this.addDependency(path.join(basedir, extensionFile));
});
// strip out origins if config is set to false to
// keep origins from displaying
if (!config.displayOrigins) {
(0, _stripOutOrigins["default"])(docs);
}
inSideVsgDocs = _objectSpread(_objectSpread({}, docs), {}, {
events: makeObject(docs.events),
slots: makeObject(docs.slots)
});
if (docs.props) {
filteredProps = docs.props.filter(function (prop) {
return !prop.tags || !prop.tags.ignore;
});
sortProps = config.sortProps || _sortProps["default"];
inSideVsgDocs.props = filteredProps ? sortProps(filteredProps) : undefined;
}
return _context.abrupt("return", inSideVsgDocs);
case 18:
case "end":
return _context.stop();
}
}
}, _callee, null, [[1, 7]]);
}));
return function getVsgDocs(_x2) {
return _ref2.apply(this, arguments);
};
}();
_context2.next = 8;
return getVsgDocs(file);
case 8:
vsgDocs = _context2.sent;
// examples
componentVueDoc = (0, _getComponentVueDoc["default"])(source, file);
isComponentDocInVueFile = !!componentVueDoc;
ignoreExamplesInFile = noExample;
if (componentVueDoc) {
vsgDocs.example = (0, _requireIt["default"])("!!".concat(examplesLoader, "?customLangs=vue|js|jsx!").concat(file));
} else if (vsgDocs.tags) {
examples = vsgDocs.tags.examples;
if (examples) {
examplePaths = examples.map(function (a) {
return a.content;
});
if (examplePaths[0] === '[none]') {
ignoreExamplesInFile = true;
} else {
vsgDocs.example = examplePaths.map(function (p) {
return (0, _requireIt["default"])("!!".concat(examplesLoader, "?customLangs=vue|js|jsx!").concat(p));
});
}
}
}
if (ignoreExamplesInFile) {
_context2.next = 28;
break;
}
examplesFile = config.getExampleFilename ? config.getExampleFilename(file) : false;
_context2.t0 = examplesFile;
if (!_context2.t0) {
_context2.next = 20;
break;
}
_context2.next = 19;
return exists(examplesFile);
case 19:
_context2.t0 = _context2.sent;
case 20:
if (!_context2.t0) {
_context2.next = 24;
break;
}
if (process.env.NODE_ENV !== 'production' && examplesFile && global) {
if (_alreadyLoadedExamplesCache["default"][examplesFile]) {
relativeFile = path.relative(process.cwd(), file);
if (_alreadyLoadedExamplesCache["default"][examplesFile] !== relativeFile) {
logger.warn('\n\n' + "".concat(path.relative(process.cwd(), examplesFile), "\n") + "this file is used by multiple components.\n" + " - ".concat(_alreadyLoadedExamplesCache["default"][examplesFile], "\n") + " - ".concat(relativeFile, "\n") + 'It will be displayed more than once in the styleguide\n' + 'Check out this cookbook receipe to solve the issue\n' + "".concat(_consts["default"].DOCS_COOKBOOK, "#i-have-multiple-components-in-the-same-folder-what-can-i-do\n"));
}
} else {
_alreadyLoadedExamplesCache["default"][examplesFile] = path.relative(process.cwd(), file);
}
}
_context2.next = 25;
break;
case 24:
examplesFile = false;
case 25:
vsgDocs.examples = (0, _getExamples["default"])(file, examplesFile, vsgDocs.displayName, config.defaultExample, isComponentDocInVueFile);
_context2.next = 29;
break;
case 28:
vsgDocs.examples = [{
type: 'noexample'
}];
case 29:
if (config.updateDocs) {
vsgDocs = config.updateDocs(vsgDocs, file);
}
return _context2.abrupt("return", "\n\t\tif (module.hot) {\n\t\t\tmodule.hot.accept([])\n\t\t}\n\n\t\tmodule.exports = ".concat((0, _escodegen.generate)((0, _toAst["default"])(vsgDocs)), "\n\t"));
case 31:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
return _vuedocLoader.apply(this, arguments);
}