diff options
Diffstat (limited to '')
23 files changed, 93 insertions, 1214 deletions
diff --git a/examples/hello-next/bun-framework-next/.npmignore b/examples/hello-next/bun-framework-next/.npmignore deleted file mode 100644 index dc0954477..000000000 --- a/examples/hello-next/bun-framework-next/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -*.bun -node_modules
\ No newline at end of file diff --git a/examples/hello-next/bun-framework-next/client.development.tsx b/examples/hello-next/bun-framework-next/client.development.tsx index 0d019e175..f8fd054c3 100644 --- a/examples/hello-next/bun-framework-next/client.development.tsx +++ b/examples/hello-next/bun-framework-next/client.development.tsx @@ -1,7 +1,8 @@ -import "./bun-error"; globalThis.global = globalThis; globalThis.Bun_disableCSSImports = true; +import "./bun-error"; + import * as React from "react"; var onlyChildPolyfill = React.Children.only; React.Children.only = function (children) { diff --git a/examples/hello-next/bun-framework-next/fallback.development.tsx b/examples/hello-next/bun-framework-next/fallback.development.tsx deleted file mode 100644 index 1cd5f847e..000000000 --- a/examples/hello-next/bun-framework-next/fallback.development.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { insertStyleSheet } from "./page-loader"; -import type { - FallbackMessageContainer, - FallbackStep, -} from "../../../src/api/schema"; - -var once = false; -function insertGlobalStyleSheet(detail) { - if (!once) { - document.head.insertAdjacentHTML( - "beforeend", - `<meta name="next-head-count" content="${document.head.childElementCount}">` - ); - once = true; - } - pageLoader.cssQueue.push(insertStyleSheet(detail).then(() => {})); -} - -[...globalThis["__BUN"].allImportedStyles].map((detail) => - insertGlobalStyleSheet(detail) -); - -document.addEventListener("onimportcss", insertGlobalStyleSheet, { - passive: true, -}); - -import { renderError, _boot, pageLoader } from "./client.development"; -import { renderFallbackError } from "bun-error"; - -function renderFallback({ - router, - reason, - problems, -}: FallbackMessageContainer) { - const route = router.routes[router.route]; - - if (!document.getElementById("__next")) { - const next = document.createElement("div"); - next.id = "__next"; - document.body.prepend(next); - } - - document.removeEventListener("onimportcss", insertGlobalStyleSheet); - document.addEventListener("onimportcss", pageLoader.onImportCSS, { - passive: true, - }); - - globalThis.__NEXT_DATA__.pages["/_app"] = [ - ...globalThis.__NEXT_DATA__.pages["/_app"], - ...globalThis["__BUN"].allImportedStyles, - ]; - - return import(route) - .then((Namespace) => { - return _boot(Namespace, true); - }) - .then(() => { - const cssQueue = pageLoader.cssQueue.slice(); - pageLoader.cssQueue = []; - return Promise.all([...cssQueue]); - }) - .finally(() => { - document.body.style.visibility = "visible"; - document.removeEventListener("onimportcss", pageLoader.onImportCSS); - }); -} - -export default function render(props: FallbackMessageContainer) { - renderFallback(props).then( - () => { - Promise.all(pageLoader.cssQueue).finally(() => { - renderFallbackError(props); - document.body.style.visibility = "visible"; - }); - }, - (err) => { - Promise.all(pageLoader.cssQueue).finally(() => { - renderFallbackError(props); - }); - } - ); -} diff --git a/examples/hello-next/bun-framework-next/index.js b/examples/hello-next/bun-framework-next/index.js deleted file mode 100644 index e69de29bb..000000000 --- a/examples/hello-next/bun-framework-next/index.js +++ /dev/null diff --git a/examples/hello-next/bun-framework-next/next-server.tsx b/examples/hello-next/bun-framework-next/next-server.tsx deleted file mode 100644 index e69de29bb..000000000 --- a/examples/hello-next/bun-framework-next/next-server.tsx +++ /dev/null diff --git a/examples/hello-next/bun-framework-next/package.json b/examples/hello-next/bun-framework-next/package.json deleted file mode 100644 index af6286343..000000000 --- a/examples/hello-next/bun-framework-next/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "bun-framework-next", - "version": "0.0.0-18", - "description": "", - "framework": { - "displayName": "Next.js", - "static": "public", - "assetPrefix": "_next/", - "router": { - "dir": [ - "pages", - "src/pages" - ], - "extensions": [ - ".js", - ".ts", - ".tsx", - ".jsx" - ] - }, - "css": "onimportcss", - "development": { - "client": "client.development.tsx", - "fallback": "fallback.development.tsx", - "server": "server.development.tsx", - "css": "onimportcss", - "define": { - "client": { - ".env": "NEXT_PUBLIC_", - "defaults": { - "process.env.__NEXT_TRAILING_SLASH": "false", - "process.env.NODE_ENV": "\"development\"", - "process.env.__NEXT_ROUTER_BASEPATH": "''", - "process.env.__NEXT_SCROLL_RESTORATION": "false", - "process.env.__NEXT_I18N_SUPPORT": "false", - "process.env.__NEXT_HAS_REWRITES": "false", - "process.env.__NEXT_ANALYTICS_ID": "null", - "process.env.__NEXT_OPTIMIZE_CSS": "false", - "process.env.__NEXT_CROSS_ORIGIN": "''", - "process.env.__NEXT_STRICT_MODE": "false", - "process.env.__NEXT_IMAGE_OPTS": "null" - } - }, - "server": { - ".env": "NEXT_", - "defaults": { - "process.env.__NEXT_TRAILING_SLASH": "false", - "process.env.__NEXT_OPTIMIZE_FONTS": "false", - "process.env.NODE_ENV": "\"development\"", - "process.env.__NEXT_OPTIMIZE_IMAGES": "false", - "process.env.__NEXT_OPTIMIZE_CSS": "false", - "process.env.__NEXT_ROUTER_BASEPATH": "''", - "process.env.__NEXT_SCROLL_RESTORATION": "false", - "process.env.__NEXT_I18N_SUPPORT": "false", - "process.env.__NEXT_HAS_REWRITES": "false", - "process.env.__NEXT_ANALYTICS_ID": "null", - "process.env.__NEXT_CROSS_ORIGIN": "''", - "process.env.__NEXT_STRICT_MODE": "false", - "process.env.__NEXT_IMAGE_OPTS": "null", - "global": "globalThis", - "window": "undefined" - } - } - } - }, - "production": { - "client": "client.production.tsx", - "server": "server.production.tsx", - "fallback": "fallback.production.tsx", - "css": "onimportcss" - } - }, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "react-is": "^17.0.2" - } -} diff --git a/examples/hello-next/bun-framework-next/page-loader.ts b/examples/hello-next/bun-framework-next/page-loader.ts deleted file mode 100644 index fc07578db..000000000 --- a/examples/hello-next/bun-framework-next/page-loader.ts +++ /dev/null @@ -1,147 +0,0 @@ -import NextPageLoader from "next/dist/client/page-loader"; -import getAssetPathFromRoute from "next/dist/shared/lib/router/utils/get-asset-path-from-route"; -// import createRouteLoader from "./route-loader"; - -export function insertStyleSheet(url: string) { - if (document.querySelector(`link[href="${url}"]`)) { - return Promise.resolve(); - } - - return new Promise((resolve, reject) => { - const link = document.createElement("link"); - link.rel = "stylesheet"; - - link.onload = () => resolve(); - link.onerror = () => reject(); - - link.href = url; - - // if (headCount) { - // document.head.insertBefore(headCount, link); - // } else { - document.head.appendChild(link); - // } - }); -} - -export default class PageLoader extends NextPageLoader { - public routeLoader: RouteLoader; - - constructor(_, __, pages) { - super(_, __); - - // TODO: assetPrefix? - // this.routeLoader = {}; //createRouteLoader(""); - - // Rewrite the pages object to omit the entry script - // At this point, the entry point has been loaded so we don't want to do that again. - for (let name in pages) { - for (let i = 0; i < pages[name].length; i += 1) { - const lastDot = pages[name][i].lastIndexOf("."); - if (lastDot == -1) continue; - if ( - pages[name][i].substring(lastDot - ".entry".length, lastDot) !== - ".entry" - ) - continue; - - pages[name][i] = - pages[name][i].substring(0, lastDot - ".entry".length) + - pages[name][i].substring(lastDot); - } - } - - this.pages = pages; - this.pageList = Object.keys(this.pages); - } - - pageList: string[]; - pages: Record<string, string[]>; - - getPageList() { - return this.pageList; - } - - cssQueue = []; - - onImportCSS = (event) => { - this.cssQueue.push( - insertStyleSheet(event.detail).then( - () => {}, - () => {} - ) - ); - }; - - prefetch(route) { - return Promise.resolve({}); - } - - async loadPage(route: string): Promise<GoodPageCache> { - const assets = - this.pages[route] || this.pages[getAssetPathFromRoute(route)]; - - var src; - console.log(getAssetPathFromRoute(route), assets); - for (let asset of assets) { - if (!asset.endsWith(".css")) { - src = asset; - break; - } - } - console.assert(src, "Invalid or unknown route passed to loadPage"); - - document.removeEventListener("onimportcss", this.onImportCSS); - this.cssQueue.length = 0; - document.addEventListener("onimportcss", this.onImportCSS, { - passive: true, - }); - - try { - const res = await import(src); - - if (this.cssQueue.length > 0) { - await Promise.all(this.cssQueue); - this.cssQueue.length = 0; - } - - document.removeEventListener("onimportcss", this.onImportCSS); - - if (this.cssQueue.length > 0) { - await Promise.all(this.cssQueue); - - this.cssQueue.length = 0; - } - - return { - page: res.default, - mod: res, - styleSheets: [], - __N_SSG: false, - __N_SSP: false, - }; - } catch (exception) { - console.error({ exception }); - } - - // return this.routeLoader.loadRoute(route).then((res) => { - // debugger; - // if ("component" in res) { - // return { - // page: res.component, - // mod: res.exports, - // styleSheets: res.styles.map((o) => ({ - // href: o.href, - // text: o.content, - // })), - // }; - // } - // throw res.error; - // }); - } - - // not used in development! - // prefetch(route: string): Promise<void> { - // return this.routeLoader.prefetch(route); - // } -} diff --git a/examples/hello-next/bun-framework-next/render.tsx b/examples/hello-next/bun-framework-next/render.tsx deleted file mode 100644 index e69de29bb..000000000 --- a/examples/hello-next/bun-framework-next/render.tsx +++ /dev/null diff --git a/examples/hello-next/bun-framework-next/renderDocument.tsx b/examples/hello-next/bun-framework-next/renderDocument.tsx deleted file mode 100644 index 356ff788b..000000000 --- a/examples/hello-next/bun-framework-next/renderDocument.tsx +++ /dev/null @@ -1,722 +0,0 @@ -import * as App from "next/app"; -import { AmpStateContext } from "next/dist/shared/lib/amp-context"; -import { HeadManagerContext } from "next/dist/shared/lib/head-manager-context"; -import Loadable from "next/dist/shared/lib/loadable"; -import { LoadableContext } from "next/dist/shared/lib/loadable-context"; -import { RouterContext } from "next/dist/shared/lib/router-context"; -import { NextRouter } from "next/dist/shared/lib/router/router"; -import { - AppType, - ComponentsEnhancer, - DocumentInitialProps, - DocumentProps, - DocumentType, - getDisplayName, - loadGetInitialProps, - NextComponentType, - RenderPage, - RenderPageResult, - HtmlContext, -} from "next/dist/shared/lib/utils"; -import * as NextDocument from "next/document"; -import * as ReactDOMServer from "react-dom/server.browser"; -import * as url from "url"; -import * as React from "react"; -import * as ReactIs from "react-is"; -import { BODY_RENDER_TARGET } from "next/constants"; - -const dev = process.env.NODE_ENV === "development"; - -type ParsedUrlQuery = Record<string, string | string[]>; - -const isJSFile = (file: string) => - file.endsWith(".js") || - file.endsWith(".jsx") || - file.endsWith(".mjs") || - file.endsWith(".ts") || - file.endsWith(".tsx"); - -const notImplementedProxy = (base) => - new Proxy( - {}, - { - deleteProperty: function (target, prop) { - return undefined; - }, - enumerate: function (oTarget, sKey) { - return [].entries(); - }, - ownKeys: function (oTarget, sKey) { - return [].values(); - }, - has: function (oTarget, sKey) { - return false; - }, - defineProperty: function (oTarget, sKey, oDesc) { - return undefined; - }, - getOwnPropertyDescriptor: function (oTarget, sKey) { - return undefined; - }, - get(this, prop) { - throw new ReferenceError( - `${base} is not available for this environment.` - ); - }, - set(this, prop, value) { - throw new ReferenceError( - `${base} is not available for this environment.` - ); - }, - } - ); - -globalThis.fetch = (url, options) => { - return Promise.reject(new Error(`fetch is not implemented yet. sorry!!`)); -}; - -function getScripts(files: DocumentFiles) { - const { context, props } = this; - const { - assetPrefix, - buildManifest, - isDevelopment, - devOnlyCacheBusterQueryString, - disableOptimizedLoading, - } = context; - const normalScripts = files.allFiles.filter(isJSFile); - const lowPriorityScripts = buildManifest.lowPriorityFiles?.filter(isJSFile); - - return [...normalScripts, ...lowPriorityScripts].map((file) => { - return ( - <script - key={file} - src={`${encodeURI(file)}${devOnlyCacheBusterQueryString}`} - nonce={props.nonce} - async - crossOrigin={props.crossOrigin || process.env.__NEXT_CROSS_ORIGIN} - type="module" - /> - ); - }); -} - -// function fixLink(from: string) { -// if (from.startsWith("/_next/http://") || from.startsWith("/_next/https://")) -// return from.substring("/_next".length); -// return from; -// } - -// function cloneWithOverwrittenLink(element: React.ReactElement<any>) { -// const props = { ...element.props }; -// if ("href" in element.props) { -// props.href = fixLink(props.href); -// } - -// if ("n-href" in element.props) { -// props["n-href"] = fixLink(props["n-href"]); -// } - -// if ("n-src" in element.props) { -// props["n-src"] = fixLink(props["n-src"]); -// } - -// if ("src" in element.props) { -// props["src"] = fixLink(props.src); -// } - -// return React.cloneElement(element, props); -// } - -interface DomainLocale { - defaultLocale: string; - domain: string; - http?: true; - locales?: string[]; -} - -function renderDocument( - Document: DocumentType, - { - buildManifest, - docComponentsRendered, - props, - docProps, - pathname, - query, - buildId, - canonicalBase, - assetPrefix, - runtimeConfig, - nextExport, - autoExport, - isFallback, - dynamicImportsIds, - dangerousAsPath, - err, - dev, - ampPath, - ampState, - inAmpMode, - hybridAmp, - dynamicImports, - headTags, - gsp, - gssp, - customServer, - gip, - appGip, - unstable_runtimeJS, - unstable_JsPreload, - devOnlyCacheBusterQueryString, - scriptLoader, - locale, - locales, - defaultLocale, - domainLocales, - isPreview, - disableOptimizedLoading, - }: RenderOpts & { - props: any; - docComponentsRendered: DocumentProps["docComponentsRendered"]; - docProps: DocumentInitialProps; - pathname: string; - query: ParsedUrlQuery; - dangerousAsPath: string; - ampState: any; - ampPath: string; - inAmpMode: boolean; - hybridAmp: boolean; - dynamicImportsIds: (string | number)[]; - dynamicImports: string[]; - headTags: any; - isFallback?: boolean; - gsp?: boolean; - gssp?: boolean; - customServer?: boolean; - gip?: boolean; - appGip?: boolean; - devOnlyCacheBusterQueryString: string; - scriptLoader: any; - isPreview?: boolean; - autoExport?: boolean; - } -): string { - const htmlProps = { - __NEXT_DATA__: { - props, // The result of getInitialProps - page: pathname, // The rendered page - query, // querystring parsed / passed by the user - buildId, // buildId is used to facilitate caching of page bundles, we send it to the client so that pageloader knows where to load bundles - assetPrefix: assetPrefix === "" ? undefined : assetPrefix, // send assetPrefix to the client side when configured, otherwise don't sent in the resulting HTML - runtimeConfig, // runtimeConfig if provided, otherwise don't sent in the resulting HTML - nextExport, // If this is a page exported by `next export` - autoExport, // If this is an auto exported page - isFallback, - dynamicIds: - dynamicImportsIds.length === 0 ? undefined : dynamicImportsIds, - err: err || undefined, // err: err ? serializeError(dev, err) : undefined, // Error if one happened, otherwise don't sent in the resulting HTML - gsp, // whether the page is getStaticProps - gssp, // whether the page is getServerSideProps - customServer, // whether the user is using a custom server - gip, // whether the page has getInitialProps - appGip, // whether the _app has getInitialProps - locale, - locales, - defaultLocale, - domainLocales, - isPreview, - - pages: buildManifest.pages, - }, - buildManifest, - docComponentsRendered, - dangerousAsPath, - canonicalBase, - ampPath, - inAmpMode, - isDevelopment: !!dev, - hybridAmp, - dynamicImports, - assetPrefix, - headTags, - unstable_runtimeJS, - unstable_JsPreload, - devOnlyCacheBusterQueryString, - scriptLoader, - locale, - disableOptimizedLoading, - ...docProps, - }; - return ( - "<!DOCTYPE html>" + - ReactDOMServer.renderToStaticMarkup( - <AmpStateContext.Provider value={ampState}> - <HtmlContext.Provider value={htmlProps}> - <Document {...htmlProps} {...docProps}></Document> - </HtmlContext.Provider> - </AmpStateContext.Provider> - ) - ); -} - -class ServerRouter implements NextRouter { - route: string; - pathname: string; - query: ParsedUrlQuery; - asPath: string; - basePath: string; - events: any; - isFallback: boolean; - locale?: string; - isReady: boolean; - locales?: string[]; - defaultLocale?: string; - domainLocales?: DomainLocale[]; - isPreview: boolean; - isLocaleDomain: boolean; - - constructor( - pathname: string, - query: ParsedUrlQuery, - as: string, - { isFallback }: { isFallback: boolean }, - isReady: boolean, - basePath: string, - locale?: string, - locales?: string[], - defaultLocale?: string, - domainLocales?: DomainLocale[], - isPreview?: boolean, - isLocaleDomain?: boolean - ) { - this.route = pathname.replace(/\/$/, "") || "/"; - this.pathname = pathname; - this.query = query; - this.asPath = as; - this.isFallback = isFallback; - this.basePath = basePath; - this.locale = locale; - this.locales = locales; - this.defaultLocale = defaultLocale; - this.isReady = isReady; - this.domainLocales = domainLocales; - this.isPreview = !!isPreview; - this.isLocaleDomain = !!isLocaleDomain; - } - - push(): any { - noRouter(); - } - replace(): any { - noRouter(); - } - reload() { - noRouter(); - } - back() { - noRouter(); - } - prefetch(): any { - noRouter(); - } - beforePopState() { - noRouter(); - } -} - -function noRouter() { - const message = - 'No router instance found. you should only use "next/router" inside the client side of your app. https://nextjs.org/docs/messages/no-router-instance'; - throw new Error(message); -} - -function enhanceComponents( - options: ComponentsEnhancer, - App: AppType, - Component: NextComponentType -): { - App: AppType; - Component: NextComponentType; -} { - // For backwards compatibility - if (typeof options === "function") { - return { - App, - Component: options(Component), - }; - } - - return { - App: options.enhanceApp ? options.enhanceApp(App) : App, - Component: options.enhanceComponent - ? options.enhanceComponent(Component) - : Component, - }; -} - -Object.defineProperty(NextDocument.Head.prototype, "getScripts", { - get() { - return getScripts; - }, -}); -Object.defineProperty(NextDocument.NextScript.prototype, "getScripts", { - get() { - return getScripts; - }, -}); - -export async function render({ - route, - PageNamespace, - AppNamespace, - appStylesheets = [], - pageStylesheets = [], - DocumentNamespace = null, - buildId, - routePaths = [], -}: { - buildId: number; - route: any; - PageNamespace: { default: NextComponentType<any> }; - AppNamespace: { default: NextComponentType<any> } | null; - DocumentNamespace: Object | null; - appStylesheets: string[]; - pageStylesheets: string[]; - routePaths: string[]; -}): Promise<Response> { - const { default: Component, getStaticProps = null } = PageNamespace || {}; - const { default: AppComponent_ } = AppNamespace || {}; - var query = Object.assign({}, route.query); - - // These are reversed in our Router versus Next.js...mostly due to personal preference. - const pathname = "/" + route.name; - var asPath = route.pathname; - const pages = {}; - - for (let path of routePaths) { - const filePath = path.substring( - path.indexOf("_next/pages/") + "_next/pages".length - ); - const name = filePath.substring(0, filePath.indexOf(".")); - pages[name] = [path]; - } - - pages[pathname] = [route.scriptSrc, ...pageStylesheets]; - - if (appStylesheets.length > 0) { - if (pages["/_app"]) { - pages["/_app"].push(...appStylesheets); - } else { - pages["/_app"] = appStylesheets; - } - } - - const AppComponent = AppComponent_ || App.default; - const Document = - (DocumentNamespace && DocumentNamespace.default) || NextDocument.default; - // Document.Html.prototype.getScripts = getScripts; - // } - - const callMiddleware = async (method: string, args: any[], props = false) => { - let results: any = props ? {} : []; - - if ((Document as any)[`${method}Middleware`]) { - let middlewareFunc = await (Document as any)[`${method}Middleware`]; - middlewareFunc = middlewareFunc.default || middlewareFunc; - - const curResults = await middlewareFunc(...args); - if (props) { - for (const result of curResults) { - results = { - ...results, - ...result, - }; - } - } else { - results = curResults; - } - } - return results; - }; - - const headTags = (...args: any) => callMiddleware("headTags", args); - - if (!ReactIs.isValidElementType(Component)) { - const exportNames = Object.keys(PageNamespace || {}); - - const reactComponents = exportNames.filter(ReactIs.isValidElementType); - if (reactComponents.length > 2) { - throw new Error( - `\"export default\" missing in ${ - route.filePath - }.\nTry exporting one of ${reactComponents.join(", ")}\n` - ); - } else if (reactComponents.length === 2) { - throw new Error( - `\"export default\" missing in ${route.filePath}.\n\nTry exporting <${reactComponents[0]} /> or <${reactComponents[1]} />\n` - ); - } else if (reactComponents.length == 1) { - throw new Error( - `\"export default\" missing in ${route.filePath}. Try adding this to the bottom of the file:\n\n export default ${reactComponents[0]};\n` - ); - } else if (reactComponents.length == 0) { - throw new Error( - `\"export default\" missing in ${route.filePath}. Try exporting a React component.\n` - ); - } - } - - const isFallback = !!query.__nextFallback; - delete query.__nextFallback; - delete query.__nextLocale; - delete query.__nextDefaultLocale; - - const isSSG = !!getStaticProps; - const isBuildTimeSSG = isSSG && false; - const defaultAppGetInitialProps = - App.getInitialProps === (App as any).origGetInitialProps; - - const hasPageGetInitialProps = !!(Component as any).getInitialProps; - const pageIsDynamic = route.kind === "dynamic"; - const isAutoExport = false; - - if (isAutoExport || isFallback) { - // // remove query values except ones that will be set during export - // query = { - // ...(query.amp - // ? { - // amp: query.amp, - // } - // : {}), - // }; - asPath = `${asPath}${ - // ensure trailing slash is present for non-dynamic auto-export pages - asPath.endsWith("/") && asPath !== "/" && !pageIsDynamic ? "/" : "" - }`; - } - - let head: JSX.Element[] = [ - <meta charSet="utf-8" />, - <meta name="viewport" content="width=device-width" />, - ]; - - const nextExport = isAutoExport || isFallback; - const reactLoadableModules: string[] = []; - var scriptLoader = {}; - const AppContainer = ({ children }: any) => ( - <RouterContext.Provider value={router}> - {/* <AmpStateContext.Provider value={ampState}> */} - <HeadManagerContext.Provider - value={{ - updateHead: (state) => { - head = state; - }, - updateScripts: (scripts) => { - scriptLoader = scripts; - }, - scripts: {}, - mountedInstances: new Set(), - }} - > - <LoadableContext.Provider - value={(moduleName) => reactLoadableModules.push(moduleName)} - > - {children} - </LoadableContext.Provider> - </HeadManagerContext.Provider> - {/* </AmpStateContext.Provider> */} - </RouterContext.Provider> - ); - - await Loadable.preloadAll(); // Make sure all dynamic imports are loaded - - const router = new ServerRouter( - pathname, - query, - asPath, - { - isFallback: isFallback, - }, - true, - Bun.origin, - null, - [], // renderOpts.locales, - null, //renderOpts.defaultLocale, - [], // renderOpts.domainLocales, - false, - false - ); - - const ctx = { - err: null, - req: undefined, - res: undefined, - pathname, - query, - asPath, - locale: null, - locales: [], - defaultLocale: null, - AppTree: (props: any) => { - return ( - <AppContainer> - <App {...props} Component={Component} router={router} /> - </AppContainer> - ); - }, - }; - - var props = await loadGetInitialProps(AppComponent, { - AppTree: ctx.AppTree, - Component, - router, - ctx, - }); - - // This isn't correct. - // We don't call getServerSideProps on clients. - const getServerSideProps = PageNamespace.getServerSideProps; - if (typeof getServerSideProps === "function") { - const result = await getServerSideProps({ - params: route.params, - query: route.query, - req: notImplementedProxy("req"), - res: notImplementedProxy("res"), - resolvedUrl: route.pathname, - preview: false, - previewData: null, - locale: null, - locales: [], - defaultLocale: null, - }); - - if (result) { - if ("props" in result) { - if (typeof result.props === "object") { - Object.assign(props, result.props); - } - } - } - } - - const renderToString = ReactDOMServer.renderToString; - const ErrorDebug = null; - - const renderPage: RenderPage = ( - options: ComponentsEnhancer = {} - ): RenderPageResult | Promise<RenderPageResult> => { - if (ctx.err && ErrorDebug) { - const htmlOrPromise = renderToString(<ErrorDebug error={ctx.err} />); - return typeof htmlOrPromise === "string" - ? { html: htmlOrPromise, head } - : htmlOrPromise.then((html) => ({ - html, - head, - })); - } - - if (dev && (props.router || props.Component)) { - throw new Error( - `'router' and 'Component' can not be returned in getInitialProps from _app.js https://nextjs.org/docs/messages/cant-override-next-props` - ); - } - - const { App: EnhancedApp, Component: EnhancedComponent } = - enhanceComponents(options, AppComponent, Component); - - const htmlOrPromise = renderToString( - <AppContainer> - <EnhancedApp Component={EnhancedComponent} router={router} {...props} /> - </AppContainer> - ); - return typeof htmlOrPromise === "string" - ? { html: htmlOrPromise, head } - : htmlOrPromise.then((html) => ({ - html, - head, - })); - }; - - const documentCtx = { ...ctx, renderPage }; - const docProps: DocumentInitialProps = await loadGetInitialProps( - Document, - documentCtx - ); - - if (!docProps || typeof docProps.html !== "string") { - const message = `"${getDisplayName( - Document - )}.getInitialProps()" should resolve to an object with a "html" prop set with a valid html string`; - throw new Error(message); - } - - const renderOpts = { - params: route.params, - }; - // renderOpts.params = _params || params; - - // parsedUrl.pathname = denormalizePagePath(parsedUrl.pathname!); - // renderOpts.resolvedUrl = formatUrl({ - // ...parsedUrl, - // query: origQuery, - // }); - const docComponentsRendered: DocumentProps["docComponentsRendered"] = {}; - - const isPreview = false; - - let html = renderDocument(Document, { - docComponentsRendered, - ...renderOpts, - disableOptimizedLoading: false, - canonicalBase: Bun.origin, - buildManifest: { - devFiles: [], - allFiles: [], - polyfillFiles: [], - lowPriorityFiles: [], - pages: pages, - }, - // Only enabled in production as development mode has features relying on HMR (style injection for example) - unstable_runtimeJS: true, - // process.env.NODE_ENV === "production" - // ? pageConfig.unstable_runtimeJS - // : undefined, - // unstable_JsPreload: pageConfig.unstable_JsPreload, - unstable_JsPreload: true, - dangerousAsPath: router.asPath, - ampState: undefined, - props, - assetPrefix: "", - headTags: await headTags(documentCtx), - isFallback, - docProps, - pathname, - ampPath: undefined, - query, - inAmpMode: false, - hybridAmp: undefined, - dynamicImportsIds: [], // Array.from(dynamicImportsIds), - dynamicImports: [], //Array.from(dynamicImports), - gsp: !!getStaticProps ? true : undefined, - gssp: !!getServerSideProps ? true : undefined, - gip: hasPageGetInitialProps ? true : undefined, - appGip: !defaultAppGetInitialProps ? true : undefined, - devOnlyCacheBusterQueryString: "", - scriptLoader, - isPreview: isPreview === true ? true : undefined, - autoExport: isAutoExport === true ? true : undefined, - nextExport: nextExport === true ? true : undefined, - }); - const bodyRenderIdx = html.indexOf(BODY_RENDER_TARGET); - html = - html.substring(0, bodyRenderIdx) + - (false ? "<!-- __NEXT_DATA__ -->" : "") + - docProps.html + - html.substring(bodyRenderIdx + BODY_RENDER_TARGET.length); - return new Response( - html - .replaceAll("/_next/http://", "http://") - .replaceAll("/_next/https://", "https://") - ); -} diff --git a/examples/hello-next/bun-framework-next/route-loader.ts b/examples/hello-next/bun-framework-next/route-loader.ts deleted file mode 100644 index e69de29bb..000000000 --- a/examples/hello-next/bun-framework-next/route-loader.ts +++ /dev/null diff --git a/examples/hello-next/bun-framework-next/server.development.tsx b/examples/hello-next/bun-framework-next/server.development.tsx deleted file mode 100644 index e3cd24e01..000000000 --- a/examples/hello-next/bun-framework-next/server.development.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import * as React from "react"; -import { Buffer } from "buffer"; -globalThis.Buffer = Buffer; - -class URL { - constructor(base, source) { - this.pathname = source; - this.href = base + source; - } -} -var onlyChildPolyfill = React.Children.only; -React.Children.only = function (children) { - if (children && typeof children === "object" && children.length == 1) { - return onlyChildPolyfill(children[0]); - } - - return onlyChildPolyfill(children); -}; -globalThis.URL = URL; -globalThis.global = globalThis; -import { render } from "./renderDocument"; - -let buildId = 0; - -var DocumentLoaded = false; -var DocumentNamespace; - -import(Bun.routesDir + "_document").then( - (doc) => { - DocumentNamespace = doc; - DocumentLoaded = true; - }, - (err) => { - if (err instanceof ResolveError) { - DocumentLoaded = true; - } else { - console.error(err); - } - } -); - -addEventListener("fetch", async (event: FetchEvent) => { - var route = Bun.match(event); - - // This imports the currently matched route. - const PageNamespace = await import(route.filePath); - - // This returns all .css files that were imported in the line above. - // It's recursive, so any file that imports a CSS file will be included. - const pageStylesheets = (Bun.getImportedStyles() as string[]).slice(); - - var appRoute; - - try { - appRoute = await import(Bun.routesDir + "_app"); - } catch (exception) { - appRoute = null; - } - const appStylesheets = (Bun.getImportedStyles() as string[]).slice(); - - event.respondWith( - render({ - route, - PageNamespace, - appStylesheets, - pageStylesheets, - DocumentNamespace, - AppNamespace: appRoute, - buildId, - routePaths: Bun.getRouteFiles(), - }) - ); - buildId++; -}); - -// typescript isolated modules -export {}; - -declare var Bun: any; diff --git a/examples/hello-next/bun-framework-next/server.production.tsx b/examples/hello-next/bun-framework-next/server.production.tsx deleted file mode 100644 index e69de29bb..000000000 --- a/examples/hello-next/bun-framework-next/server.production.tsx +++ /dev/null diff --git a/examples/hello-next/bun-framework-next/tsconfig.json b/examples/hello-next/bun-framework-next/tsconfig.json deleted file mode 100644 index d14767c9f..000000000 --- a/examples/hello-next/bun-framework-next/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "lib": ["dom", "dom.iterable", "esnext", "WebWorker"], - "allowJs": true, - "skipLibCheck": true, - "strict": false, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "Node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "baseUrl": ".", - "paths": {} - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] -} diff --git a/examples/hello-next/package.json b/examples/hello-next/package.json index 1ce5e4982..e49602501 100644 --- a/examples/hello-next/package.json +++ b/examples/hello-next/package.json @@ -4,6 +4,9 @@ "main": "index.js", "license": "MIT", "dependencies": { + "@jarred/react-static-tweets": "0.5.8", + "@jarred/static-tweets": "^0.5.8", + "date-fns": "^2.23.0", "isomorphic-fetch": "^3.0.0", "next": "^11.1.0", "parcel": "2.0.0-rc.0", @@ -11,8 +14,6 @@ "react": "^17.0.2", "react-dom": "^17.0.2", "react-is": "^17.0.2", - "react-static-tweets": "^0.5.4", - "static-tweets": "^0.5.5", "whatwg-url": "^9.1.0" }, "devDependencies": { diff --git a/examples/hello-next/pages/errortest.tsx b/examples/hello-next/pages/errortest.tsx deleted file mode 100644 index 49a293df7..000000000 --- a/examples/hello-next/pages/errortest.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import IndexPage from "pages/index"; - -export default function ErrorTestPage() { - class Wow {} - - const ladee = "", - foo = { bar: { boom: new Wow() } }; - - if (typeof window === "undefined") { - const Doge = import("wow/such-esm/very-import"); - } - - return <IndexPage />; -} diff --git a/examples/hello-next/pages/index.tsx b/examples/hello-next/pages/index.tsx index 7a2eb9f64..52b8f1f1f 100644 --- a/examples/hello-next/pages/index.tsx +++ b/examples/hello-next/pages/index.tsx @@ -1,80 +1,105 @@ import Head from "next/head"; -import Image from "next/image"; -import styles from "../styles/Home.module.css"; import Link from "next/link"; import { useRouter } from "next/router"; -import Title, { TitleEnum } from "../components/Title"; import React from "react"; +import { + Tweet, + TwitterContextProvider, +} from "@jarred/react-static-tweets/src/index"; +import "@jarred/react-static-tweets/styles.css"; +import { fetchTweetAst } from "@jarred/static-tweets/src/fetchTweetAst"; +import { SWRConfig } from "swr"; +import styles from "../styles/Home.module.css"; -export default function Home({}) { - const router = useRouter(); +export async function getStaticProps(ctx) { + return { + props: { + tweetAst: await fetchTweetAst("1390084458724741121"), + }, + }; +} +export default function Home({ tweetAst }) { return ( - <div className={styles.container}> - <Head> - <title>Fo</title> - <meta name="description" content="Generated by create next app" /> - <link rel="icon" href="/favicon.ico" /> - </Head> + <SWRConfig value={{ fallback: { [tweetAst[0].data.id]: tweetAst } }}> + <TwitterContextProvider + value={{ + tweetAstMap: { [tweetAst[0].data.id]: tweetAst }, + }} + > + <div className={styles.container}> + <Head> + <title>Fo</title> + <meta name="description" content="Generated by create next app" /> + <link rel="icon" href="/favicon.ico" /> + </Head> - <main className={styles.main}> - <h1 className={styles.title}> - Welcome to <a href="https://nextjs.org">Next.js!</a> - </h1> + <main className={styles.main}> + + {/* <h1 className={styles.title}> + Welcome to <a href="https://nextjs.org">Next.js!</a> + </h1> - <p className={styles.description}> - Get started by editing{" "} - <code className={styles.code}>pages/index.js</code> - </p> + <p className={styles.description}> + Get started by editing{" "} + <code className={styles.code}>pages/index.js</code> + </p> - <div className={styles.grid}> - <Link href="/second"> - <div className={styles.card}> - <h2>Second Page →</h2> - <p>Link</p> - </div> - </Link> + <div className={styles.grid}> + <Link href="/second"> + <div className={styles.card}> + <h2>Second Page →</h2> + <p>Link</p> + </div> + </Link> - <a - onClick={() => router.push("/foo/bar/third")} - className={styles.card} - > - <h2>Third Page →</h2> - <p>button, router.push()</p> - </a> + <a + onClick={() => router.push("/foo/bar/third")} + className={styles.card} + > + <h2>Third Page →</h2> + <p>button, router.push()</p> + </a> - <a - href="https://github.com/vercel/next.js/tree/master/examples" - className={styles.card} - > - <h2>Examples →</h2> - <p>Discover and deploy boilerplate example Next.js projects.</p> - </a> + <a + href="https://github.com/vercel/next.js/tree/master/examples" + className={styles.card} + > + <h2>Examples →</h2> + <p>Discover and deploy boilerplate example Next.js projects.</p> + </a> - <a - href="https://vercel.com/new?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app" - className={styles.card} - > - <h2>Deploy →</h2> - <p> - Instantly deploy your Next.js site to a public URL with Vercel. - </p> - </a> + <a + href="https://vercel.com/new?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app" + className={styles.card} + > + <h2>Deploy →</h2> + <p> + Instantly deploy your Next.js site to a public URL with + Vercel. + </p> + </a> + </div> */} + </main> + + {/* <footer className={styles.footer}> + <a + href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app" + target="_blank" + rel="noopener noreferrer" + > + Powered by{" "} + <span className={styles.logo}> + <img + src="/vercel.svg" + alt="Vercel Logo" + width={72} + height={16} + /> + </span> + </a> + </footer> */} </div> - </main> - <footer className={styles.footer}> - <a - href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app" - target="_blank" - rel="noopener noreferrer" - > - Powered by{" "} - <span className={styles.logo}> - <img src="/vercel.svg" alt="Vercel Logo" width={72} height={16} /> - </span> - </a> - </footer> - </div> ); } diff --git a/examples/hello-next/bun-framework-next/bun-error.css b/packages/bun-framework-next/bun-error.css index c5ed9881b..c5ed9881b 100644 --- a/examples/hello-next/bun-framework-next/bun-error.css +++ b/packages/bun-framework-next/bun-error.css diff --git a/examples/hello-next/bun-framework-next/bun-error.tsx b/packages/bun-framework-next/bun-error.tsx index 5d57dd0ea..5d57dd0ea 100644 --- a/examples/hello-next/bun-framework-next/bun-error.tsx +++ b/packages/bun-framework-next/bun-error.tsx diff --git a/examples/hello-next/bun-framework-next/bun-error/close.png b/packages/bun-framework-next/bun-error/close.png Binary files differindex 11e513a1b..11e513a1b 100644 --- a/examples/hello-next/bun-framework-next/bun-error/close.png +++ b/packages/bun-framework-next/bun-error/close.png diff --git a/examples/hello-next/bun-framework-next/bun-error/error.png b/packages/bun-framework-next/bun-error/error.png Binary files differindex c35e01a2b..c35e01a2b 100644 --- a/examples/hello-next/bun-framework-next/bun-error/error.png +++ b/packages/bun-framework-next/bun-error/error.png diff --git a/examples/hello-next/bun-framework-next/bun-error/powered-by.png b/packages/bun-framework-next/bun-error/powered-by.png Binary files differindex 7e71f1357..7e71f1357 100644 --- a/examples/hello-next/bun-framework-next/bun-error/powered-by.png +++ b/packages/bun-framework-next/bun-error/powered-by.png diff --git a/examples/hello-next/bun-framework-next/bun-error/powered-by.webp b/packages/bun-framework-next/bun-error/powered-by.webp Binary files differindex 0f48488ea..0f48488ea 100644 --- a/examples/hello-next/bun-framework-next/bun-error/powered-by.webp +++ b/packages/bun-framework-next/bun-error/powered-by.webp diff --git a/examples/hello-next/bun-framework-next/bun-runtime-error.ts b/packages/bun-framework-next/bun-runtime-error.ts index 331040b36..331040b36 100644 --- a/examples/hello-next/bun-framework-next/bun-runtime-error.ts +++ b/packages/bun-framework-next/bun-runtime-error.ts |