From dc5ec8ae6ea7c93800285b6003c0c240a46df5d1 Mon Sep 17 00:00:00 2001 From: Ryan Christian Date: Thu, 11 Apr 2024 16:45:32 -0500 Subject: [PATCH 1/9] refactor: Reduce subpath exports --- package.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 30a1202..509a3c0 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,8 @@ "types": "src/index.d.ts", "exports": { ".": "./src/index.js", - "./router": "./src/router.js", - "./lazy": "./src/lazy.js", "./prerender": "./src/prerender.js", - "./hydrate": "./src/hydrate.js" + "./package.json": "./package.json" }, "license": "MIT", "description": "Isomorphic utilities for Preact", @@ -35,6 +33,11 @@ "preact": ">=10", "preact-render-to-string": ">=6.4.0" }, + "peerDependenciesMeta": { + "preact-render-to-string": { + "optional": true + } + }, "devDependencies": { "@types/mocha": "^10.0.7", "@types/sinon-chai": "^3.2.12", From 893375cf7b96b50f722450afa3dbce513aa66abf Mon Sep 17 00:00:00 2001 From: Ryan Christian Date: Thu, 11 Apr 2024 16:47:28 -0500 Subject: [PATCH 2/9] refactor: Use only named exports, rather than a mix --- src/hydrate.d.ts | 2 +- src/hydrate.js | 2 +- src/index.d.ts | 5 ++--- src/index.js | 10 +++------- src/lazy.d.ts | 2 +- src/lazy.js | 2 +- src/prerender.d.ts | 2 +- src/prerender.js | 2 +- test/lazy.test.js | 2 +- test/node/prerender.test.js | 2 +- test/router.test.js | 2 +- 11 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/hydrate.d.ts b/src/hydrate.d.ts index 227b5ec..d5d23a2 100644 --- a/src/hydrate.d.ts +++ b/src/hydrate.d.ts @@ -1,3 +1,3 @@ import { ComponentChild, ContainerNode } from 'preact'; -export default function hydrate(jsx: ComponentChild, parent?: ContainerNode): void; +export function hydrate(jsx: ComponentChild, parent?: ContainerNode): void; diff --git a/src/hydrate.js b/src/hydrate.js index 269bc58..d7e2cd8 100644 --- a/src/hydrate.js +++ b/src/hydrate.js @@ -3,7 +3,7 @@ import { render, hydrate as hydrativeRender } from 'preact'; let initialized; /** @type {typeof hydrativeRender} */ -export default function hydrate(jsx, parent) { +export function hydrate(jsx, parent) { if (typeof window === 'undefined') return; let isodata = document.querySelector('script[type=isodata]'); // @ts-ignore-next diff --git a/src/index.d.ts b/src/index.d.ts index 70ba4a2..1d8e633 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -1,4 +1,3 @@ -export { default as prerender } from './prerender.js'; export * from './router.js'; -export { default as lazy, ErrorBoundary } from './lazy.js'; -export { default as hydrate } from './hydrate.js'; +export * from './lazy.js'; +export * from './hydrate.js'; diff --git a/src/index.js b/src/index.js index 3bfc751..92a55d8 100644 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,3 @@ -export { Router, LocationProvider, useLocation, Route, useRoute } from './router.js'; -export { default as lazy, ErrorBoundary } from './lazy.js'; -export { default as hydrate } from './hydrate.js'; - -export function prerender(vnode, options) { - return import('./prerender.js').then(m => m.default(vnode, options)); -} +export * from './hydrate.js'; +export * from './lazy.js'; +export * from './router.js'; diff --git a/src/lazy.d.ts b/src/lazy.d.ts index 24e3b1b..7841eef 100644 --- a/src/lazy.d.ts +++ b/src/lazy.d.ts @@ -1,6 +1,6 @@ import { ComponentChildren, VNode } from 'preact'; -export default function lazy(load: () => Promise<{ default: T } | T>): T & { +export function lazy(load: () => Promise<{ default: T } | T>): T & { preload: () => Promise; }; diff --git a/src/lazy.js b/src/lazy.js index 9fb7fe3..a0feaa2 100644 --- a/src/lazy.js +++ b/src/lazy.js @@ -10,7 +10,7 @@ options.__b = (vnode) => { if (oldDiff) oldDiff(vnode); }; -export default function lazy(load) { +export function lazy(load) { let p, c; const loadModule = () => diff --git a/src/prerender.d.ts b/src/prerender.d.ts index b9958bc..104ba3d 100644 --- a/src/prerender.d.ts +++ b/src/prerender.d.ts @@ -9,7 +9,7 @@ export interface PrerenderResult { links?: Set } -export default function prerender( +export function prerender( vnode: VNode, options?: PrerenderOptions ): Promise; diff --git a/src/prerender.js b/src/prerender.js index 879576f..d0d3d14 100644 --- a/src/prerender.js +++ b/src/prerender.js @@ -14,7 +14,7 @@ options.vnode = vnode => { * @param {object} [options] * @param {object} [options.props] Additional props to merge into the root JSX element */ -export default async function prerender(vnode, options) { +export async function prerender(vnode, options) { options = options || {}; const props = options.props; diff --git a/test/lazy.test.js b/test/lazy.test.js index 1d29f57..6af6f80 100644 --- a/test/lazy.test.js +++ b/test/lazy.test.js @@ -4,7 +4,7 @@ import * as sinon from 'sinon'; import sinonChai from 'sinon-chai'; import { LocationProvider, Router } from '../src/router.js'; -import lazy, { ErrorBoundary } from '../src/lazy.js'; +import { lazy, ErrorBoundary } from '../src/lazy.js'; import './setup.js'; diff --git a/test/node/prerender.test.js b/test/node/prerender.test.js index 434b151..1450d98 100644 --- a/test/node/prerender.test.js +++ b/test/node/prerender.test.js @@ -2,7 +2,7 @@ import { test } from 'uvu'; import * as assert from 'uvu/assert'; import { html } from 'htm/preact'; -import { default as prerender } from '../../src/prerender.js'; +import { prerender } from '../../src/prerender.js'; test('extracts links', async () => { const App = () => html` diff --git a/test/router.test.js b/test/router.test.js index df64c0c..4fffc86 100644 --- a/test/router.test.js +++ b/test/router.test.js @@ -5,7 +5,7 @@ import * as sinon from 'sinon'; import sinonChai from 'sinon-chai'; import { LocationProvider, Router, useLocation, Route, useRoute } from '../src/router.js'; -import lazy, { ErrorBoundary } from '../src/lazy.js'; +import { lazy, ErrorBoundary } from '../src/lazy.js'; import './setup.js'; From 7fecc0745803b6356485529b4c9f6eef959d01d1 Mon Sep 17 00:00:00 2001 From: Ryan Christian Date: Mon, 2 Sep 2024 01:45:17 -0500 Subject: [PATCH 3/9] refactor: Drop half implemented `url` prop on LocationProvider --- src/router.js | 3 +-- test/router.test.js | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/router.js b/src/router.js index ac5d5cc..477c1a9 100644 --- a/src/router.js +++ b/src/router.js @@ -80,8 +80,7 @@ export const exec = (url, route, matches = {}) => { * @type {import('./router.d.ts').LocationProvider} */ export function LocationProvider(props) { - // @ts-expect-error - props.url is not implemented correctly & will be removed in the future - const [url, route] = useReducer(UPDATE, props.url || location.pathname + location.search); + const [url, route] = useReducer(UPDATE, location.pathname + location.search); if (props.scope) scope = props.scope; const wasPush = push === true; diff --git a/test/router.test.js b/test/router.test.js index 4fffc86..d7a8804 100644 --- a/test/router.test.js +++ b/test/router.test.js @@ -44,12 +44,15 @@ describe('Router', () => { it('should strip trailing slashes from path', async () => { render( - + , scratch ); + loc.route('/a/'); + await sleep(1); + expect(loc).to.deep.include({ url: '/a/', path: '/a', From f715657d5a9c851b52fd21c7f9267b21305004a5 Mon Sep 17 00:00:00 2001 From: Ryan Christian Date: Mon, 14 Oct 2024 16:58:16 -0500 Subject: [PATCH 4/9] fix: Ensure isodata script tag will pass spec validators --- src/hydrate.js | 2 +- src/prerender.js | 2 +- test/node/prerender.test.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hydrate.js b/src/hydrate.js index d7e2cd8..796ed5c 100644 --- a/src/hydrate.js +++ b/src/hydrate.js @@ -5,7 +5,7 @@ let initialized; /** @type {typeof hydrativeRender} */ export function hydrate(jsx, parent) { if (typeof window === 'undefined') return; - let isodata = document.querySelector('script[type=isodata]'); + let isodata = document.getElementById('isodata'); // @ts-ignore-next parent = parent || (isodata && isodata.parentNode) || document.body; if (!initialized && isodata) { diff --git a/src/prerender.js b/src/prerender.js index d0d3d14..06d1258 100644 --- a/src/prerender.js +++ b/src/prerender.js @@ -34,7 +34,7 @@ export async function prerender(vnode, options) { try { let html = await renderToStringAsync(vnode); - html += ``; + html += ``; return { html, links }; } finally { vnodeHook = null; diff --git a/test/node/prerender.test.js b/test/node/prerender.test.js index 1450d98..163e74c 100644 --- a/test/node/prerender.test.js +++ b/test/node/prerender.test.js @@ -23,7 +23,7 @@ test('extracts links', async () => { test('appends iso data script', async () => { const { html: h } = await prerender(html`
`); // Empty for now, but used for hydration vs render detection - assert.match(h, /`; + const html = await renderToStringAsync(vnode); return { html, links }; } finally { vnodeHook = null; diff --git a/test/node/prerender.test.js b/test/node/prerender.test.js index 163e74c..ba771e7 100644 --- a/test/node/prerender.test.js +++ b/test/node/prerender.test.js @@ -20,10 +20,4 @@ test('extracts links', async () => { assert.ok(links.has('/baz'), `missing: /baz`); }); -test('appends iso data script', async () => { - const { html: h } = await prerender(html`
`); - // Empty for now, but used for hydration vs render detection - assert.match(h, /