Skip to content

Commit

Permalink
More cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
lemonmade committed Apr 30, 2024
1 parent f8f6a68 commit 987e035
Show file tree
Hide file tree
Showing 42 changed files with 227 additions and 510 deletions.
3 changes: 2 additions & 1 deletion packages/browser/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@
"build": "rollup --config ./rollup.config.js"
},
"dependencies": {
"@quilted/signals": "^0.2.1",
"@quilted/assets": "workspace:^0.1.1",
"@quilted/signals": "workspace:^0.2.1",
"js-cookie": "^3.0.0"
},
"peerDependencies": {},
Expand Down
4 changes: 4 additions & 0 deletions packages/browser/source/browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,10 @@ export class BrowserSerializations {
this.serializations.set(id, data);
}
}

*[Symbol.iterator]() {
yield* this.serializations;
}
}

function getSerializedFromNode<T = unknown>(node: Element): T | undefined {
Expand Down
94 changes: 94 additions & 0 deletions packages/browser/source/server.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import {resolveSignalOrValue, type ReadonlySignal} from '@quilted/signals';

import type {BrowserDetails, CookieOptions, Cookies} from './types.ts';
import type {
AssetLoadTiming,
AssetsCacheKey,
BrowserAssetModuleSelector,
} from '@quilted/assets';

export * from './types.ts';

Expand All @@ -13,14 +18,17 @@ export class BrowserResponse implements BrowserDetails {
readonly serializations: BrowserResponseSerializations;
readonly headers: Headers;
readonly initialURL: URL;
readonly assets: BrowserResponseAssets;

constructor({
request,
headers = new Headers(),
cacheKey,
serializations,
}: {
request: Request;
headers?: Headers;
cacheKey?: Partial<AssetsCacheKey>;
serializations?: Iterable<[string, unknown]>;
}) {
this.initialURL = new URL(request.url);
Expand All @@ -29,6 +37,7 @@ export class BrowserResponse implements BrowserDetails {
headers,
request.headers.get('Cookie') ?? undefined,
);
this.assets = new BrowserResponseAssets({cacheKey});
this.serializations = new BrowserResponseSerializations(
new Map(serializations),
);
Expand Down Expand Up @@ -136,6 +145,91 @@ export class BrowserResponseSerializations {
this.serializations.set(id, data);
}
}

*[Symbol.iterator]() {
yield* this.serializations;
}
}

const ASSET_TIMING_PRIORITY: AssetLoadTiming[] = ['never', 'preload', 'load'];

const PRIORITY_BY_TIMING = new Map(
ASSET_TIMING_PRIORITY.map((value, index) => [value, index]),
);

export class BrowserResponseAssets {
readonly cacheKey: Partial<AssetsCacheKey>;
private usedModulesWithTiming = new Map<
string,
{
styles: AssetLoadTiming;
scripts: AssetLoadTiming;
}
>();

constructor({cacheKey}: {cacheKey?: Partial<AssetsCacheKey>} = {}) {
this.cacheKey = {...cacheKey};
}

updateCacheKey(cacheKey: Partial<AssetsCacheKey>) {
Object.assign(this.cacheKey, cacheKey);
}

use(
id: string,
{
timing = 'load',
scripts = timing,
styles = timing,
}: {
timing?: AssetLoadTiming;
scripts?: AssetLoadTiming;
styles?: AssetLoadTiming;
} = {},
) {
const current = this.usedModulesWithTiming.get(id);

if (current == null) {
this.usedModulesWithTiming.set(id, {
scripts,
styles,
});
} else {
this.usedModulesWithTiming.set(id, {
scripts:
scripts == null
? current.scripts
: highestPriorityAssetLoadTiming(scripts, current.scripts),
styles:
styles == null
? current.styles
: highestPriorityAssetLoadTiming(styles, current.styles),
});
}
}

get({timing = 'load'}: {timing?: AssetLoadTiming | AssetLoadTiming[]} = {}) {
const allowedTiming = Array.isArray(timing) ? timing : [timing];

const assets: BrowserAssetModuleSelector[] = [];

for (const [asset, {scripts, styles}] of this.usedModulesWithTiming) {
const stylesMatch = allowedTiming.includes(styles);
const scriptsMatch = allowedTiming.includes(scripts);

if (stylesMatch || scriptsMatch) {
assets.push({id: asset, styles: stylesMatch, scripts: scriptsMatch});
}
}

return assets;
}
}

function highestPriorityAssetLoadTiming(...timings: AssetLoadTiming[]) {
return ASSET_TIMING_PRIORITY[
Math.max(...timings.map((timing) => PRIORITY_BY_TIMING.get(timing)!))
]!;
}

// What follows is a basic re-implementation of https://www.npmjs.com/package/cookie.
Expand Down
1 change: 1 addition & 0 deletions packages/browser/source/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export interface BrowserDetails {
readonly serializations: {
get<T = unknown>(id: string): T;
set(id: string, data: unknown): void;
[Symbol.iterator](): IterableIterator<[string, unknown]>;
};
readonly cookies: Cookies;
readonly initialURL: URL;
Expand Down
2 changes: 1 addition & 1 deletion packages/browser/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
},
"include": ["source"],
"exclude": [],
"references": [{"path": "../signals"}]
"references": [{"path": "../assets"}, {"path": "../signals"}]
}
1 change: 0 additions & 1 deletion packages/quilt/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,6 @@
"@quilted/events": "workspace:^2.0.0",
"@quilted/graphql": "workspace:^3.0.2",
"@quilted/react": "workspace:^18.2.0",
"@quilted/react-assets": "workspace:^0.1.1",
"@quilted/react-async": "workspace:^0.4.1",
"@quilted/react-browser": "workspace:^0.0.0",
"@quilted/react-dom": "workspace:^18.2.0",
Expand Down
1 change: 0 additions & 1 deletion packages/quilt/source/assets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ export type {
AssetsBuildManifest,
AssetsBuildManifestEntry,
} from '@quilted/assets';
export {useAssetsCacheKey, useModuleAssets} from '@quilted/react-assets';

declare module '@quilted/assets' {
interface AssetsCacheKey {
Expand Down
9 changes: 0 additions & 9 deletions packages/quilt/source/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,6 @@ export type {
AssetsBuildManifest,
AssetsBuildManifestEntry,
} from '@quilted/assets';
export {
useAssetsCacheKey,
useModuleAssets,
AssetsContext,
AssetsManager,
SERVER_ACTION_ID as ASSETS_SERVER_ACTION_ID,
} from '@quilted/react-assets/server';
export type {HttpState} from '@quilted/react-http/server';
export {parseAcceptLanguageHeader} from '@quilted/react-localize';
export {createRequestRouterLocalization} from '@quilted/react-localize/request-router';
export {
Expand All @@ -52,5 +44,4 @@ export type {
ServerRenderRequestContext,
} from '@quilted/react-server-render';

export {ServerContext} from './server/ServerContext.tsx';
export {renderToResponse} from './server/request-router.tsx';
55 changes: 0 additions & 55 deletions packages/quilt/source/server/ServerContext.tsx

This file was deleted.

Loading

0 comments on commit 987e035

Please sign in to comment.