Skip to content

Commit fe229de

Browse files
committed
Setup prember
1 parent a76f6fd commit fe229de

File tree

6 files changed

+544
-20
lines changed

6 files changed

+544
-20
lines changed

docs-app/config/fastboot.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/* global ReadableStream, WritableStream, TransformStream */
2+
module.exports = function () {
3+
return {
4+
buildSandboxGlobals(defaultGlobals) {
5+
return Object.assign({}, defaultGlobals, {
6+
fetch,
7+
AbortController,
8+
ReadableStream:
9+
typeof ReadableStream !== 'undefined'
10+
? ReadableStream
11+
: require('node:stream/web').ReadableStream,
12+
WritableStream:
13+
typeof WritableStream !== 'undefined'
14+
? WritableStream
15+
: require('node:stream/web').WritableStream,
16+
TransformStream:
17+
typeof TransformStream !== 'undefined'
18+
? TransformStream
19+
: require('node:stream/web').TransformStream,
20+
Headers: typeof Headers !== 'undefined' ? Headers : undefined,
21+
});
22+
},
23+
};
24+
};

docs-app/ember-cli-build.js

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,24 @@ const EmberApp = require('ember-cli/lib/broccoli/ember-app');
44
const sortBy = require('lodash.sortby');
55

66
module.exports = function (defaults) {
7+
let environment = EmberApp.env();
8+
let isProduction = environment === 'production';
9+
710
const app = new EmberApp(defaults, {
811
// Add options here
912
'ember-cli-babel': {
1013
enableTypeScriptTransform: true,
1114
},
15+
prember: {
16+
enabled: isProduction || process.env.PREMBER === 'true',
17+
urls: async function () {
18+
let data = await urlsForPrerender();
19+
20+
console.error(data);
21+
22+
return data;
23+
},
24+
},
1225
});
1326

1427
// Use `app.import` to add additional libraries to the generated
@@ -114,19 +127,17 @@ const createManifest = createUnplugin((options) => {
114127
name: 'create-manifest',
115128
async buildStart() {
116129
const path = await import('node:path');
117-
const { globbySync } = await import('globby');
118130

119-
let paths = globbySync(include, {
120-
cwd: path.join(process.cwd(), src),
121-
expandDirectories: true,
131+
let reshaped = await buildManifest({
132+
src,
133+
include,
134+
exclude,
122135
});
123136

124-
paths = paths.filter((path) => !exclude.some((pattern) => path.match(pattern)));
125-
126137
await this.emitFile({
127138
type: 'asset',
128139
fileName: path.join(dest, name),
129-
source: JSON.stringify(reshape(paths)),
140+
source: JSON.stringify(reshaped),
130141
});
131142
},
132143
watchChange(id) {
@@ -135,6 +146,32 @@ const createManifest = createUnplugin((options) => {
135146
};
136147
});
137148

149+
async function urlsForPrerender() {
150+
let manifest = await buildManifest({
151+
src: 'public/docs',
152+
include: '**/*',
153+
exclude: [],
154+
});
155+
156+
return manifest;
157+
}
158+
159+
async function buildManifest(options) {
160+
const { src, include, exclude } = options;
161+
162+
const path = await import('node:path');
163+
const { globbySync } = await import('globby');
164+
165+
let paths = globbySync(include, {
166+
cwd: path.join(process.cwd(), src),
167+
expandDirectories: true,
168+
});
169+
170+
paths = paths.filter((path) => !exclude.some((pattern) => path.match(pattern)));
171+
172+
return reshape(paths);
173+
}
174+
138175
/**
139176
* @param {string[]} paths
140177
*/

docs-app/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
"lint:prettier": "pnpm -w exec lint prettier",
2323
"lint:types": "glint",
2424
"start": "concurrently 'ember serve' 'pnpm _syncPnpm --watch' --names 'docs serve,docs sync deps'",
25+
"start:prod": "concurrently 'ember serve --environment=production' 'pnpm _syncPnpm --watch' --names 'serve prod,sync deps'",
26+
"start:prember": "PREMBER=true concurrently 'ember serve --environment=production' 'pnpm _syncPnpm --watch' --names 'serve prod,sync deps'",
2527
"test": "ember test",
2628
"test:ember": "ember test",
2729
"_syncPnpm": "pnpm sync-dependencies-meta-injected"
@@ -82,6 +84,7 @@
8284
"ember-cli": "~5.0.0",
8385
"ember-cli-app-version": "^6.0.0",
8486
"ember-cli-babel": "^7.26.11",
87+
"ember-cli-fastboot": "^4.1.1",
8588
"ember-cli-htmlbars": "^6.1.1",
8689
"ember-cli-inject-live-reload": "^2.1.0",
8790
"ember-cli-sri": "^2.1.1",
@@ -104,6 +107,7 @@
104107
"globby": "^13.1.4",
105108
"loader.js": "^4.7.0",
106109
"pnpm-sync-dependencies-meta-injected": "0.0.8",
110+
"prember": "^2.0.0",
107111
"prettier": "^2.8.1",
108112
"prettier-plugin-ember-template-tag": "^0.3.2",
109113
"qunit": "^2.19.3",

ember-primitives/src/color-scheme.ts

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,54 @@ export function sync() {
5353
}
5454

5555
export const prefers = {
56-
dark: () => window.matchMedia('(prefers-color-scheme: dark)').matches,
57-
light: () => window.matchMedia('(prefers-color-scheme: light)').matches,
58-
custom: (name: string) => window.matchMedia(`(prefers-color-scheme: ${name})`).matches,
59-
none: () => window.matchMedia('(prefers-color-scheme: no-preference)').matches,
56+
dark: () => {
57+
// Fastboot has no graceful fallbacks
58+
if (typeof matchMedia === 'undefined') return;
59+
60+
return window.matchMedia('(prefers-color-scheme: dark)').matches;
61+
},
62+
light: () => {
63+
// Fastboot has no graceful fallbacks
64+
if (typeof matchMedia === 'undefined') return;
65+
66+
return window.matchMedia('(prefers-color-scheme: light)').matches;
67+
},
68+
custom: (name: string) => {
69+
// Fastboot has no graceful fallbacks
70+
if (typeof matchMedia === 'undefined') return;
71+
72+
return window.matchMedia(`(prefers-color-scheme: ${name})`).matches;
73+
},
74+
none: () => {
75+
// Fastboot has no graceful fallbacks
76+
if (typeof matchMedia === 'undefined') return;
77+
78+
return window.matchMedia('(prefers-color-scheme: no-preference)').matches;
79+
},
6080
};
6181

6282
const LOCAL_PREF_KEY = 'ember-primitives/color-scheme#local-preference';
6383

6484
export const localPreference = {
6585
isSet: () => Boolean(localPreference.read()),
66-
read: () => localStorage.getItem(LOCAL_PREF_KEY),
67-
update: (value: string) => localStorage.setItem(LOCAL_PREF_KEY, value),
68-
delete: () => localStorage.removeItem(LOCAL_PREF_KEY),
86+
read: () => {
87+
// Fastboot has no graceful fallbacks
88+
if (typeof localStorage === 'undefined') return;
89+
90+
return localStorage.getItem(LOCAL_PREF_KEY);
91+
},
92+
update: (value: string) => {
93+
// Fastboot has no graceful fallbacks
94+
if (typeof localStorage === 'undefined') return;
95+
96+
return localStorage.setItem(LOCAL_PREF_KEY, value);
97+
},
98+
delete: () => {
99+
// Fastboot has no graceful fallbacks
100+
if (typeof localStorage === 'undefined') return;
101+
102+
return localStorage.removeItem(LOCAL_PREF_KEY);
103+
},
69104
};
70105

71106
export function getColorScheme(element?: HTMLElement) {

ember-primitives/src/proper-links.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ export function properLinks<Instance extends {}, Klass = { new (...args: any[]):
6666
* This function only requires that a framework object with an owner is passed.
6767
*/
6868
export function setup(parent: object, ignore?: string[]) {
69+
// Fastboot has no graceful fallbacks
70+
if (typeof document === 'undefined') return;
71+
6972
const handler = (event: MouseEvent) => {
7073
/**
7174
* event.target may not be an anchor,

0 commit comments

Comments
 (0)