storybook-mirage
Version:
A Storybook addon to use and interact with a MirageJS server
92 lines (91 loc) • 3.51 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "withServer", {
enumerable: true,
get: function() {
return withServer;
}
});
const _previewapi = require("storybook/preview-api");
const _miragejs = require("miragejs");
const _coreevents = require("storybook/internal/core-events");
const _constants = require("./constants");
const withServer = (StoryFn, context)=>{
const { logging, fixtures, handlers, timing, instance, factorySeeds } = (0, _previewapi.useParameter)(_constants.PARAM_KEY, {
handlers: null,
fixtures: null,
logging: false,
timing: null,
instance: null,
factorySeeds: null
});
context.server = context.server ?? instance ?? makeServer();
context.server.logging = logging;
const emit = (0, _previewapi.useChannel)({
[_constants.EVENTS.SET]: ({ verb, path, response })=>{
context.server[verb.toLowerCase()](path, ()=>{
if (typeof response === "number") return new _miragejs.Response(response);
if (Array.isArray(response)) return new _miragejs.Response(...response);
return new _miragejs.Response(200, {}, response);
});
_previewapi.addons.getChannel().emit(_coreevents.FORCE_RE_RENDER);
}
});
if (fixtures) context.server.db.loadData(fixtures);
if (timing !== null) context.server.timing = timing;
if (handlers) {
Object.keys(handlers).forEach((method)=>{
const set = handlers[method];
Object.keys(set).forEach((route)=>{
const value = set[route];
context.server[method](route, (...args)=>{
if (typeof value === "number") return new _miragejs.Response(value);
if (Array.isArray(value)) return new _miragejs.Response(...value);
if (typeof value === 'function') return value(...args);
return new _miragejs.Response(200, {}, value);
});
});
});
}
if (factorySeeds) {
Object.keys(factorySeeds).forEach((factoryName)=>{
const items = factorySeeds[factoryName];
if (typeof items === "number") context.server.createList(factoryName, items);
else if (typeof items === "object") {
items.forEach((item)=>{
const { traits = [], attrs = {}, count = 1 } = item;
context.server.createList(factoryName, count, ...traits, attrs);
});
}
});
}
const { handledRequest, unhandledRequest, erroredRequest } = context.server.pretender;
context.server.pretender.handledRequest = function(verb, path, request) {
handledRequest(verb, path, request);
emit(_constants.EVENTS.REQUEST, {
verb,
path,
request
});
};
context.server.pretender.unhandledRequest = function(verb, path, request) {
unhandledRequest(verb, path, request);
emit(_constants.EVENTS.UNHANDLED, {
verb,
path,
request
});
};
context.server.pretender.erroredRequest = function(verb, path, request, error) {
erroredRequest(verb, path, request, error);
emit(_constants.EVENTS.ERROR, {
verb,
path,
request,
error
});
};
return StoryFn();
};