vite-plugin-storybook-nextjs
Version:
This is a Vite plugin that allows you to use Next.js features in Vite. It is the basis for `@storybook/experimental-nextjs-vite` and should be used when running portable stories in Vitest.
107 lines (104 loc) • 3.02 kB
JavaScript
import * as singletonRouter from 'next/dist/client/router.js';
import singletonRouter__default from 'next/dist/client/router.js';
import { NextjsRouterMocksNotAvailable } from 'storybook/internal/preview-errors';
import { fn } from 'storybook/test';
export * from 'next/dist/client/router';
// src/plugins/next-mocks/alias/router/index.ts
var defaultRouterState = {
route: "/",
asPath: "/",
basePath: "/",
pathname: "/",
query: {},
isFallback: false,
isLocaleDomain: false,
isReady: true,
isPreview: false
};
var routerAPI;
var createRouter = (overrides) => {
const routerActions = {
push: fn((..._args) => {
return Promise.resolve(true);
}).mockName("next/router::useRouter().push"),
replace: fn((..._args) => {
return Promise.resolve(true);
}).mockName("next/router::useRouter().replace"),
reload: fn((..._args) => {
}).mockName(
"next/router::useRouter().reload"
),
back: fn((..._args) => {
}).mockName(
"next/router::useRouter().back"
),
forward: fn(() => {
}).mockName("next/router::useRouter().forward"),
prefetch: fn((..._args) => {
return Promise.resolve();
}).mockName("next/router::useRouter().prefetch"),
beforePopState: fn((..._args) => {
}).mockName(
"next/router::useRouter().beforePopState"
)
};
const routerEvents = {
on: fn((..._args) => {
}).mockName(
"next/router::useRouter().events.on"
),
off: fn((..._args) => {
}).mockName(
"next/router::useRouter().events.off"
),
emit: fn((..._args) => {
}).mockName(
"next/router::useRouter().events.emit"
)
};
if (overrides) {
for (const key of Object.keys(routerActions)) {
if (key in overrides) {
routerActions[key] = fn((...args) => {
return overrides[key](...args);
}).mockName(`useRouter().${key}`);
}
}
}
if (overrides?.events) {
for (const key of Object.keys(routerEvents)) {
if (key in routerEvents) {
routerEvents[key] = fn((...args) => {
return overrides.events[key](...args);
}).mockName(`useRouter().events.${key}`);
}
}
}
routerAPI = {
...defaultRouterState,
...overrides,
...routerActions,
// @ts-expect-error TODO improve typings
events: routerEvents
};
singletonRouter__default.router = routerAPI;
for (const cb of singletonRouter__default.readyCallbacks) {
cb();
}
singletonRouter__default.readyCallbacks = [];
return routerAPI;
};
var getRouter = () => {
if (!routerAPI) {
throw new NextjsRouterMocksNotAvailable({
importType: "next/router"
});
}
return routerAPI;
};
var router_default = singletonRouter__default;
var useRouter2 = fn(
singletonRouter.useRouter
).mockName("next/router::useRouter");
var withRouter2 = fn(singletonRouter.withRouter).mockName("next/router::withRouter");
export { createRouter, router_default as default, getRouter, useRouter2 as useRouter, withRouter2 as withRouter };