@storybook/svelte
Version:
Storybook for Svelte: Develop Svelte Component in isolation with Hot Reloading.
120 lines (83 loc) • 5.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = svelteDocgen;
require("core-js/modules/es.promise.js");
var _sveltedocParser = _interopRequireDefault(require("sveltedoc-parser"));
var _tsDedent = _interopRequireDefault(require("ts-dedent"));
var path = _interopRequireWildcard(require("path"));
var fs = _interopRequireWildcard(require("fs"));
var _loaderUtils = require("loader-utils");
var _compiler = require("svelte/compiler");
var _nodeLogger = require("@storybook/node-logger");
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (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 _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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) { _defineProperty(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; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
// From https://github.com/sveltejs/svelte/blob/8db3e8d0297e052556f0b6dde310ef6e197b8d18/src/compiler/compile/utils/get_name_from_filename.ts
// Copied because it is not exported from the compiler
function getNameFromFilename(filename) {
if (!filename) return null;
var parts = filename.split(/[/\\]/).map(encodeURI);
if (parts.length > 1) {
var index_match = parts[parts.length - 1].match(/^index(\.\w+)/);
if (index_match) {
parts.pop();
parts[parts.length - 1] += index_match[1];
}
}
var base = parts.pop().replace(/%/g, 'u').replace(/\.[^.]+$/, '').replace(/[^a-zA-Z_$0-9]+/g, '_').replace(/^_/, '').replace(/_$/, '').replace(/^(\d)/, '_$1');
if (!base) {
throw new Error(`Could not derive component name from file ${filename}`);
}
return base[0].toUpperCase() + base.slice(1);
}
/**
* webpack loader for sveltedoc-parser
* @param source raw svelte component
*/
async function svelteDocgen(source) {
// eslint-disable-next-line no-underscore-dangle
var resource = this._module.resource;
var svelteOptions = _objectSpread({}, (0, _loaderUtils.getOptions)(this));
var preprocessOptions = svelteOptions.preprocess,
_svelteOptions$logDoc = svelteOptions.logDocgen,
logDocgen = _svelteOptions$logDoc === void 0 ? false : _svelteOptions$logDoc;
var docOptions;
if (preprocessOptions) {
var src = fs.readFileSync(resource).toString();
var _await$preprocess = await (0, _compiler.preprocess)(src, preprocessOptions),
fileContent = _await$preprocess.code;
docOptions = {
fileContent: fileContent
};
} else {
docOptions = {
filename: resource
};
} // set SvelteDoc options
var options = _objectSpread(_objectSpread({}, docOptions), {}, {
version: 3
});
var docgen = '';
try {
// FIXME
// @ts-ignore
var componentDoc = await _sveltedocParser.default.parse(options); // get filename for source content
var file = path.basename(resource); // populate filename in docgen
componentDoc.name = path.basename(file);
var componentName = getNameFromFilename(resource);
docgen = (0, _tsDedent.default)`
${componentName}.__docgen = ${JSON.stringify(componentDoc)};
`;
} catch (error) {
if (logDocgen) {
_nodeLogger.logger.error(error);
}
} // inject __docgen prop in svelte component
var output = source + docgen;
return output;
}