@quilted/rollup 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/build/esm/app.mjs +0 -4
- package/build/esm/features/async.mjs +34 -31
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/typescript/app.d.ts +1 -1
- package/build/typescript/app.d.ts.map +1 -1
- package/build/typescript/features/async.d.ts +0 -1
- package/build/typescript/features/async.d.ts.map +1 -1
- package/build/typescript/module.d.ts +1 -1
- package/build/typescript/package.d.ts +2 -2
- package/build/typescript/server.d.ts +1 -1
- package/package.json +3 -3
- package/source/app.ts +0 -4
- package/source/features/async.ts +124 -37
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# @quilted/rollup
|
|
2
2
|
|
|
3
|
+
## 0.3.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#871](https://github.com/lemonmade/quilt/pull/871) [`c16b322`](https://github.com/lemonmade/quilt/commit/c16b3224d3c86bc3a3b6f6af44267650d1e8dc1d) Thanks [@lemonmade](https://github.com/lemonmade)! - Remove @quilt/quilt/globals module
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`c16b322`](https://github.com/lemonmade/quilt/commit/c16b3224d3c86bc3a3b6f6af44267650d1e8dc1d)]:
|
|
10
|
+
- @quilted/babel@0.2.4
|
|
11
|
+
- @quilted/graphql@3.3.9
|
|
12
|
+
|
|
3
13
|
## 0.3.2
|
|
4
14
|
|
|
5
15
|
### Patch Changes
|
package/build/esm/app.mjs
CHANGED
|
@@ -741,8 +741,6 @@ function magicModuleAppRequestRouter({
|
|
|
741
741
|
alias: () => sourceEntryForAppServer({ entry, root }),
|
|
742
742
|
async source() {
|
|
743
743
|
return multiline`
|
|
744
|
-
import '@quilted/quilt/globals';
|
|
745
|
-
|
|
746
744
|
import {jsx} from 'preact/jsx-runtime';
|
|
747
745
|
import {RequestRouter} from '@quilted/quilt/request-router';
|
|
748
746
|
import {renderAppToHTMLResponse} from '@quilted/quilt/server';
|
|
@@ -781,8 +779,6 @@ function magicModuleAppBrowserEntry({
|
|
|
781
779
|
async source() {
|
|
782
780
|
const reactRootFunction = hydrate ? "hydrate" : "render";
|
|
783
781
|
return multiline`
|
|
784
|
-
import '@quilted/quilt/globals';
|
|
785
|
-
|
|
786
782
|
import {jsx} from 'preact/jsx-runtime';
|
|
787
783
|
import {${reactRootFunction}} from 'preact';
|
|
788
784
|
|
|
@@ -3,7 +3,6 @@ import { multiline } from '../shared/strings.mjs';
|
|
|
3
3
|
import MagicString from 'magic-string';
|
|
4
4
|
|
|
5
5
|
const MODULE_PREFIX = "quilt-async-module:";
|
|
6
|
-
const IMPORT_PREFIX = "quilt-async-import:";
|
|
7
6
|
function asyncModules({
|
|
8
7
|
preload = true,
|
|
9
8
|
baseURL = "/assets/",
|
|
@@ -13,9 +12,7 @@ function asyncModules({
|
|
|
13
12
|
name: "@quilted/async",
|
|
14
13
|
async resolveId(id, importer) {
|
|
15
14
|
let prefix;
|
|
16
|
-
if (id.startsWith(
|
|
17
|
-
prefix = IMPORT_PREFIX;
|
|
18
|
-
} else if (id.startsWith(MODULE_PREFIX)) {
|
|
15
|
+
if (id.startsWith(MODULE_PREFIX)) {
|
|
19
16
|
prefix = MODULE_PREFIX;
|
|
20
17
|
} else {
|
|
21
18
|
return null;
|
|
@@ -36,20 +33,6 @@ function asyncModules({
|
|
|
36
33
|
return {id: ${JSON.stringify(moduleID)}, import: load};
|
|
37
34
|
}
|
|
38
35
|
`;
|
|
39
|
-
return code;
|
|
40
|
-
}
|
|
41
|
-
if (id.startsWith(`\0${IMPORT_PREFIX}`)) {
|
|
42
|
-
const imported = id.replace(`\0${IMPORT_PREFIX}`, "");
|
|
43
|
-
const moduleID = getModuleID({ imported });
|
|
44
|
-
const code = multiline`
|
|
45
|
-
import * as AsyncModule from ${JSON.stringify(imported)};
|
|
46
|
-
|
|
47
|
-
((globalThis[Symbol.for('quilt')] ||= {}).asyncModules ||= new Map).set(${JSON.stringify(
|
|
48
|
-
moduleID
|
|
49
|
-
)}, AsyncModule);
|
|
50
|
-
|
|
51
|
-
export default AsyncModule;
|
|
52
|
-
`;
|
|
53
36
|
return {
|
|
54
37
|
code,
|
|
55
38
|
meta: {
|
|
@@ -59,16 +42,15 @@ function asyncModules({
|
|
|
59
42
|
}
|
|
60
43
|
return null;
|
|
61
44
|
},
|
|
62
|
-
transform: baseURL ? (code) => code.replace(/__QUILT_ASSETS_BASE_URL__/g, JSON.stringify(baseURL)) : void 0,
|
|
63
45
|
async generateBundle(options, bundle) {
|
|
64
46
|
if (preload) {
|
|
65
47
|
switch (options.format) {
|
|
66
48
|
case "es": {
|
|
67
|
-
await preloadAsyncAssetsInESMBundle(bundle);
|
|
49
|
+
await preloadAsyncAssetsInESMBundle(bundle, { baseURL });
|
|
68
50
|
break;
|
|
69
51
|
}
|
|
70
52
|
case "system": {
|
|
71
|
-
await preloadAsyncAssetsInSystemJSBundle(bundle);
|
|
53
|
+
await preloadAsyncAssetsInSystemJSBundle(bundle, { baseURL });
|
|
72
54
|
break;
|
|
73
55
|
}
|
|
74
56
|
}
|
|
@@ -79,7 +61,7 @@ function asyncModules({
|
|
|
79
61
|
function defaultModuleID({ imported }) {
|
|
80
62
|
return path.relative(process.cwd(), imported).replace(/[\\/]/g, "-");
|
|
81
63
|
}
|
|
82
|
-
async function preloadAsyncAssetsInESMBundle(bundle) {
|
|
64
|
+
async function preloadAsyncAssetsInESMBundle(bundle, { baseURL = "/" } = {}) {
|
|
83
65
|
const { parse: parseImports } = await import('es-module-lexer');
|
|
84
66
|
for (const chunk of Object.values(bundle)) {
|
|
85
67
|
if (chunk.type !== "chunk") continue;
|
|
@@ -87,6 +69,7 @@ async function preloadAsyncAssetsInESMBundle(bundle) {
|
|
|
87
69
|
const { code } = chunk;
|
|
88
70
|
const newCode = new MagicString(code);
|
|
89
71
|
const imports = (await parseImports(code))[0];
|
|
72
|
+
let hasReplacements = false;
|
|
90
73
|
for (const imported of imports) {
|
|
91
74
|
const { s: start, e: end, ss: importStart, d: dynamicStart } = imported;
|
|
92
75
|
if (dynamicStart < 0) continue;
|
|
@@ -94,9 +77,11 @@ async function preloadAsyncAssetsInESMBundle(bundle) {
|
|
|
94
77
|
const dependencies = getDependenciesForImport(
|
|
95
78
|
importSource,
|
|
96
79
|
chunk,
|
|
97
|
-
bundle
|
|
80
|
+
bundle,
|
|
81
|
+
{ baseURL }
|
|
98
82
|
);
|
|
99
83
|
if (dependencies.size === 1) continue;
|
|
84
|
+
hasReplacements = true;
|
|
100
85
|
const originalImport = code.slice(importStart, end + 1);
|
|
101
86
|
newCode.overwrite(
|
|
102
87
|
importStart,
|
|
@@ -104,10 +89,13 @@ async function preloadAsyncAssetsInESMBundle(bundle) {
|
|
|
104
89
|
preloadContentForDependencies(dependencies, originalImport)
|
|
105
90
|
);
|
|
106
91
|
}
|
|
92
|
+
if (hasReplacements) {
|
|
93
|
+
newCode.prepend(getPreloadHelperFunction() + "\n");
|
|
94
|
+
}
|
|
107
95
|
chunk.code = newCode.toString();
|
|
108
96
|
}
|
|
109
97
|
}
|
|
110
|
-
async function preloadAsyncAssetsInSystemJSBundle(bundle) {
|
|
98
|
+
async function preloadAsyncAssetsInSystemJSBundle(bundle, { baseURL = "/" } = {}) {
|
|
111
99
|
for (const chunk of Object.values(bundle)) {
|
|
112
100
|
if (chunk.type !== "chunk") continue;
|
|
113
101
|
if (chunk.dynamicImports.length === 0) continue;
|
|
@@ -115,30 +103,34 @@ async function preloadAsyncAssetsInSystemJSBundle(bundle) {
|
|
|
115
103
|
const newCode = new MagicString(code);
|
|
116
104
|
const systemDynamicImportRegex = /\bmodule\.import\(([^)]*)\)/g;
|
|
117
105
|
let match;
|
|
106
|
+
let hasReplacements = false;
|
|
118
107
|
while (match = systemDynamicImportRegex.exec(code)) {
|
|
119
108
|
const [originalImport, imported] = match;
|
|
120
109
|
const importSource = imported.trim().slice(1, imported.length - 1);
|
|
121
110
|
const dependencies = getDependenciesForImport(
|
|
122
111
|
importSource,
|
|
123
112
|
chunk,
|
|
124
|
-
bundle
|
|
113
|
+
bundle,
|
|
114
|
+
{ baseURL }
|
|
125
115
|
);
|
|
126
116
|
if (dependencies.size === 1) continue;
|
|
117
|
+
hasReplacements = true;
|
|
127
118
|
newCode.overwrite(
|
|
128
119
|
match.index,
|
|
129
120
|
match.index + originalImport.length,
|
|
130
121
|
preloadContentForDependencies(dependencies, originalImport)
|
|
131
122
|
);
|
|
132
123
|
}
|
|
124
|
+
if (hasReplacements) {
|
|
125
|
+
newCode.prepend(getPreloadHelperFunction() + "\n");
|
|
126
|
+
}
|
|
133
127
|
chunk.code = newCode.toString();
|
|
134
128
|
}
|
|
135
129
|
}
|
|
136
130
|
function preloadContentForDependencies(dependencies, originalExpression) {
|
|
137
|
-
return `
|
|
138
|
-
dependencies
|
|
139
|
-
).map((dependency) => JSON.stringify(dependency)).join(",")})).then(function(){return ${originalExpression}})`;
|
|
131
|
+
return `__quilt_preload(${JSON.stringify(Array.from(dependencies))}).then(() => {return ${originalExpression}})`;
|
|
140
132
|
}
|
|
141
|
-
function getDependenciesForImport(imported, chunk, bundle) {
|
|
133
|
+
function getDependenciesForImport(imported, chunk, bundle, { baseURL = "/" } = {}) {
|
|
142
134
|
const originalFilename = chunk.fileName;
|
|
143
135
|
const dependencies = /* @__PURE__ */ new Set();
|
|
144
136
|
const analyzed = /* @__PURE__ */ new Set();
|
|
@@ -152,7 +144,8 @@ function getDependenciesForImport(imported, chunk, bundle) {
|
|
|
152
144
|
analyzed.add(filename);
|
|
153
145
|
const chunk2 = bundle[filename];
|
|
154
146
|
if (chunk2 == null) return;
|
|
155
|
-
|
|
147
|
+
const url = `${baseURL}${baseURL.endsWith("/") ? "" : "/"}${chunk2.fileName}`;
|
|
148
|
+
dependencies.add(url);
|
|
156
149
|
if (chunk2.type !== "chunk") return;
|
|
157
150
|
for (const imported2 of chunk2.imports) {
|
|
158
151
|
addDependencies(imported2);
|
|
@@ -161,5 +154,15 @@ function getDependenciesForImport(imported, chunk, bundle) {
|
|
|
161
154
|
addDependencies(normalizedFile);
|
|
162
155
|
return dependencies;
|
|
163
156
|
}
|
|
157
|
+
function getPreloadHelperFunction({
|
|
158
|
+
type = "module"
|
|
159
|
+
} = {}) {
|
|
160
|
+
const scriptRel = JSON.stringify(
|
|
161
|
+
type === "module" ? "modulepreload" : "preload"
|
|
162
|
+
);
|
|
163
|
+
return multiline`
|
|
164
|
+
const __quilt_preload=(()=>{const o=new Map,f=${scriptRel};class QuiltPreloadError extends Error{constructor(e,{cause:l}={}){super(\`Unable to preload \${e}\`,{cause:l}),this.source=e}}class QuiltPreloadErrorEvent extends Event{constructor(e){super("quilt:preload-error",{cancelable:!0}),this.error=e}}return function __quilt_preload(e){return e.length===0?Promise.resolve():Promise.all(e.map(s=>{const r=s.startsWith("/")?s:"/"+s;if(o.has(r))return;o.set(r,!0);const i=r.endsWith(".css");if(document.querySelector(\`link[href="\${r}"]\`)!=null)return;const t=document.createElement("link");if(i?t.rel="stylesheet":(t.as="script",t.rel=f),t.crossOrigin="",t.href=r,document.head.appendChild(t),i)return new Promise(a=>{t.addEventListener("load",()=>a()),t.addEventListener("error",h=>a(new QuiltPreloadError(r,{cause:h})))})})).then(s=>{for(const r of s)r!=null&&d(r)})};function d(n){const e=new QuiltPreloadErrorEvent(n);if(window.dispatchEvent(e),!e.defaultPrevented)throw n}})();
|
|
165
|
+
`;
|
|
166
|
+
}
|
|
164
167
|
|
|
165
|
-
export {
|
|
168
|
+
export { asyncModules };
|