@bleedingdev/modern-js-app-tools 3.2.0-ultramodern.64 → 3.2.0-ultramodern.66

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.
@@ -106,7 +106,7 @@ const createWorkerManifest = async (outputDirectory, modernConfig)=>{
106
106
  },
107
107
  workerBundles: {
108
108
  directory: WORKER_BUNDLE_DIRECTORY,
109
- format: 'esm',
109
+ format: 'commonjs',
110
110
  importableFromModuleWorker: true,
111
111
  requestHandlerExport: 'requestHandler'
112
112
  },
@@ -201,7 +201,7 @@ const createCloudflarePreset = ({ appContext, modernConfig })=>{
201
201
  spaces: 2
202
202
  });
203
203
  await utils_namespaceObject.fs.writeJSON(external_node_path_default().join(outputDirectory, 'package.json'), {
204
- type: 'module'
204
+ type: 'commonjs'
205
205
  });
206
206
  },
207
207
  async genEntry () {
@@ -121,6 +121,45 @@ function createRequestHandlerOptions({ route, htmlTemplate, routeManifest, loada
121
121
  }
122
122
  };
123
123
  }
124
+ function collectRouteCssAssets(route, routeManifest) {
125
+ const routeAssets = routeManifest?.routeAssets || {};
126
+ const candidateKeys = [
127
+ route.entryName,
128
+ `async-${route.entryName}`
129
+ ].filter(Boolean);
130
+ const assets = new Set();
131
+ for (const key of candidateKeys){
132
+ const routeAsset = routeAssets[key];
133
+ const cssAssets = [
134
+ ...Array.isArray(routeAsset?.referenceCssAssets) ? routeAsset.referenceCssAssets : [],
135
+ ...Array.isArray(routeAsset?.assets) ? routeAsset.assets : []
136
+ ];
137
+ for (const asset of cssAssets)if ('string' == typeof asset && asset.endsWith('.css')) assets.add(asset);
138
+ }
139
+ return [
140
+ ...assets
141
+ ];
142
+ }
143
+ function escapeAttribute(value) {
144
+ return String(value).replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
145
+ }
146
+ async function withRouteCssLinks(response, route, routeManifest, request) {
147
+ const contentType = response.headers.get('content-type') || '';
148
+ if (!contentType.includes('text/html')) return response;
149
+ const cssAssets = collectRouteCssAssets(route, routeManifest);
150
+ if (0 === cssAssets.length) return response;
151
+ const html = await response.text();
152
+ const links = cssAssets.filter((asset)=>!html.includes(asset)).map((asset)=>{
153
+ const href = new URL(asset, request.url).toString();
154
+ return `<link rel="stylesheet" href="${escapeAttribute(href)}">`;
155
+ });
156
+ if (0 === links.length || !html.includes('</head>')) return new Response(html, response);
157
+ return new Response(html.replace('</head>', `${links.join('')}</head>`), {
158
+ headers: response.headers,
159
+ status: response.status,
160
+ statusText: response.statusText
161
+ });
162
+ }
124
163
  async function getRequestHandlerOptions(route, request, env) {
125
164
  const [htmlTemplate, routeManifest, loadableStats] = await Promise.all([
126
165
  readAssetText(route.entryPath, request, env),
@@ -140,14 +179,24 @@ async function loadWorkerModule(workerPath) {
140
179
  if (!workerModulePromises.has(workerPath)) workerModulePromises.set(workerPath, loader());
141
180
  return workerModulePromises.get(workerPath);
142
181
  }
182
+ function getRuntimeModule(workerModule) {
183
+ const defaultExport = workerModule.default;
184
+ const nestedDefaultExport = defaultExport && 'object' == typeof defaultExport ? defaultExport.default : void 0;
185
+ return defaultExport && 'object' == typeof defaultExport ? {
186
+ ...workerModule,
187
+ ...defaultExport,
188
+ ...nestedDefaultExport && 'object' == typeof nestedDefaultExport ? nestedDefaultExport : {}
189
+ } : workerModule;
190
+ }
143
191
  function getFetchHandler(workerModule) {
144
192
  const defaultExport = workerModule.default;
145
- return defaultExport && 'object' == typeof defaultExport && 'function' == typeof defaultExport.fetch && defaultExport.fetch.bind(defaultExport) || 'function' == typeof workerModule.fetch && workerModule.fetch;
193
+ const runtime = getRuntimeModule(workerModule);
194
+ return 'function' == typeof runtime.fetch && runtime.fetch.bind(runtime) || 'function' == typeof defaultExport && defaultExport.fetch?.bind?.(defaultExport);
146
195
  }
147
196
  async function getRequestHandler(workerModule) {
148
197
  const defaultExport = workerModule.default;
149
- const defaultRequestHandler = defaultExport && 'object' == typeof defaultExport && 'requestHandler' in defaultExport ? defaultExport.requestHandler : void 0;
150
- return await workerModule.requestHandler || await defaultRequestHandler || ('function' == typeof defaultExport ? defaultExport : void 0);
198
+ const runtime = getRuntimeModule(workerModule);
199
+ return await workerModule.requestHandler || await runtime.requestHandler || ('function' == typeof defaultExport ? defaultExport : void 0);
151
200
  }
152
201
  async function dispatchRouteWorker(route, request, env, ctx) {
153
202
  const workerPath = route.worker;
@@ -170,7 +219,7 @@ async function dispatchRouteWorker(route, request, env, ctx) {
170
219
  const requestHandler = await getRequestHandler(workerModule);
171
220
  if ('function' == typeof requestHandler) {
172
221
  const requestHandlerOptions = await getRequestHandlerOptions(route, request, env);
173
- return requestHandler(request, requestHandlerOptions);
222
+ return withRouteCssLinks(await requestHandler(request, requestHandlerOptions), route, requestHandlerOptions.resource.routeManifest, request);
174
223
  }
175
224
  return new Response(`Worker bundle has no fetch or requestHandler export: ${workerPath}`, {
176
225
  status: 500,
@@ -223,10 +272,7 @@ async function dispatchBffRequest(request, env) {
223
272
  const mountedRequest = createRequestForMountedPrefix(request, bff.prefix);
224
273
  const effectContext = createEffectContext(request, mountedRequest, env);
225
274
  const defaultExport = workerModule.default;
226
- const runtime = defaultExport && 'object' == typeof defaultExport ? {
227
- ...workerModule,
228
- ...defaultExport
229
- } : workerModule;
275
+ const runtime = getRuntimeModule(workerModule);
230
276
  const directHandler = 'function' == typeof runtime.handler && runtime.handler || 'function' == typeof defaultExport && defaultExport;
231
277
  const createdHandler = 'function' == typeof runtime.createHandler ? runtime.createHandler().handler : void 0;
232
278
  const handler = directHandler || createdHandler;
@@ -68,7 +68,7 @@ const createWorkerManifest = async (outputDirectory, modernConfig)=>{
68
68
  },
69
69
  workerBundles: {
70
70
  directory: WORKER_BUNDLE_DIRECTORY,
71
- format: 'esm',
71
+ format: 'commonjs',
72
72
  importableFromModuleWorker: true,
73
73
  requestHandlerExport: 'requestHandler'
74
74
  },
@@ -163,7 +163,7 @@ const createCloudflarePreset = ({ appContext, modernConfig })=>{
163
163
  spaces: 2
164
164
  });
165
165
  await fs.writeJSON(node_path.join(outputDirectory, 'package.json'), {
166
- type: 'module'
166
+ type: 'commonjs'
167
167
  });
168
168
  },
169
169
  async genEntry () {
@@ -121,6 +121,45 @@ function createRequestHandlerOptions({ route, htmlTemplate, routeManifest, loada
121
121
  }
122
122
  };
123
123
  }
124
+ function collectRouteCssAssets(route, routeManifest) {
125
+ const routeAssets = routeManifest?.routeAssets || {};
126
+ const candidateKeys = [
127
+ route.entryName,
128
+ `async-${route.entryName}`
129
+ ].filter(Boolean);
130
+ const assets = new Set();
131
+ for (const key of candidateKeys){
132
+ const routeAsset = routeAssets[key];
133
+ const cssAssets = [
134
+ ...Array.isArray(routeAsset?.referenceCssAssets) ? routeAsset.referenceCssAssets : [],
135
+ ...Array.isArray(routeAsset?.assets) ? routeAsset.assets : []
136
+ ];
137
+ for (const asset of cssAssets)if ('string' == typeof asset && asset.endsWith('.css')) assets.add(asset);
138
+ }
139
+ return [
140
+ ...assets
141
+ ];
142
+ }
143
+ function escapeAttribute(value) {
144
+ return String(value).replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
145
+ }
146
+ async function withRouteCssLinks(response, route, routeManifest, request) {
147
+ const contentType = response.headers.get('content-type') || '';
148
+ if (!contentType.includes('text/html')) return response;
149
+ const cssAssets = collectRouteCssAssets(route, routeManifest);
150
+ if (0 === cssAssets.length) return response;
151
+ const html = await response.text();
152
+ const links = cssAssets.filter((asset)=>!html.includes(asset)).map((asset)=>{
153
+ const href = new URL(asset, request.url).toString();
154
+ return `<link rel="stylesheet" href="${escapeAttribute(href)}">`;
155
+ });
156
+ if (0 === links.length || !html.includes('</head>')) return new Response(html, response);
157
+ return new Response(html.replace('</head>', `${links.join('')}</head>`), {
158
+ headers: response.headers,
159
+ status: response.status,
160
+ statusText: response.statusText
161
+ });
162
+ }
124
163
  async function getRequestHandlerOptions(route, request, env) {
125
164
  const [htmlTemplate, routeManifest, loadableStats] = await Promise.all([
126
165
  readAssetText(route.entryPath, request, env),
@@ -140,14 +179,24 @@ async function loadWorkerModule(workerPath) {
140
179
  if (!workerModulePromises.has(workerPath)) workerModulePromises.set(workerPath, loader());
141
180
  return workerModulePromises.get(workerPath);
142
181
  }
182
+ function getRuntimeModule(workerModule) {
183
+ const defaultExport = workerModule.default;
184
+ const nestedDefaultExport = defaultExport && 'object' == typeof defaultExport ? defaultExport.default : void 0;
185
+ return defaultExport && 'object' == typeof defaultExport ? {
186
+ ...workerModule,
187
+ ...defaultExport,
188
+ ...nestedDefaultExport && 'object' == typeof nestedDefaultExport ? nestedDefaultExport : {}
189
+ } : workerModule;
190
+ }
143
191
  function getFetchHandler(workerModule) {
144
192
  const defaultExport = workerModule.default;
145
- return defaultExport && 'object' == typeof defaultExport && 'function' == typeof defaultExport.fetch && defaultExport.fetch.bind(defaultExport) || 'function' == typeof workerModule.fetch && workerModule.fetch;
193
+ const runtime = getRuntimeModule(workerModule);
194
+ return 'function' == typeof runtime.fetch && runtime.fetch.bind(runtime) || 'function' == typeof defaultExport && defaultExport.fetch?.bind?.(defaultExport);
146
195
  }
147
196
  async function getRequestHandler(workerModule) {
148
197
  const defaultExport = workerModule.default;
149
- const defaultRequestHandler = defaultExport && 'object' == typeof defaultExport && 'requestHandler' in defaultExport ? defaultExport.requestHandler : void 0;
150
- return await workerModule.requestHandler || await defaultRequestHandler || ('function' == typeof defaultExport ? defaultExport : void 0);
198
+ const runtime = getRuntimeModule(workerModule);
199
+ return await workerModule.requestHandler || await runtime.requestHandler || ('function' == typeof defaultExport ? defaultExport : void 0);
151
200
  }
152
201
  async function dispatchRouteWorker(route, request, env, ctx) {
153
202
  const workerPath = route.worker;
@@ -170,7 +219,7 @@ async function dispatchRouteWorker(route, request, env, ctx) {
170
219
  const requestHandler = await getRequestHandler(workerModule);
171
220
  if ('function' == typeof requestHandler) {
172
221
  const requestHandlerOptions = await getRequestHandlerOptions(route, request, env);
173
- return requestHandler(request, requestHandlerOptions);
222
+ return withRouteCssLinks(await requestHandler(request, requestHandlerOptions), route, requestHandlerOptions.resource.routeManifest, request);
174
223
  }
175
224
  return new Response(`Worker bundle has no fetch or requestHandler export: ${workerPath}`, {
176
225
  status: 500,
@@ -223,10 +272,7 @@ async function dispatchBffRequest(request, env) {
223
272
  const mountedRequest = createRequestForMountedPrefix(request, bff.prefix);
224
273
  const effectContext = createEffectContext(request, mountedRequest, env);
225
274
  const defaultExport = workerModule.default;
226
- const runtime = defaultExport && 'object' == typeof defaultExport ? {
227
- ...workerModule,
228
- ...defaultExport
229
- } : workerModule;
275
+ const runtime = getRuntimeModule(workerModule);
230
276
  const directHandler = 'function' == typeof runtime.handler && runtime.handler || 'function' == typeof defaultExport && defaultExport;
231
277
  const createdHandler = 'function' == typeof runtime.createHandler ? runtime.createHandler().handler : void 0;
232
278
  const handler = directHandler || createdHandler;
@@ -69,7 +69,7 @@ const createWorkerManifest = async (outputDirectory, modernConfig)=>{
69
69
  },
70
70
  workerBundles: {
71
71
  directory: WORKER_BUNDLE_DIRECTORY,
72
- format: 'esm',
72
+ format: 'commonjs',
73
73
  importableFromModuleWorker: true,
74
74
  requestHandlerExport: 'requestHandler'
75
75
  },
@@ -164,7 +164,7 @@ const createCloudflarePreset = ({ appContext, modernConfig })=>{
164
164
  spaces: 2
165
165
  });
166
166
  await fs.writeJSON(node_path.join(outputDirectory, 'package.json'), {
167
- type: 'module'
167
+ type: 'commonjs'
168
168
  });
169
169
  },
170
170
  async genEntry () {
@@ -121,6 +121,45 @@ function createRequestHandlerOptions({ route, htmlTemplate, routeManifest, loada
121
121
  }
122
122
  };
123
123
  }
124
+ function collectRouteCssAssets(route, routeManifest) {
125
+ const routeAssets = routeManifest?.routeAssets || {};
126
+ const candidateKeys = [
127
+ route.entryName,
128
+ `async-${route.entryName}`
129
+ ].filter(Boolean);
130
+ const assets = new Set();
131
+ for (const key of candidateKeys){
132
+ const routeAsset = routeAssets[key];
133
+ const cssAssets = [
134
+ ...Array.isArray(routeAsset?.referenceCssAssets) ? routeAsset.referenceCssAssets : [],
135
+ ...Array.isArray(routeAsset?.assets) ? routeAsset.assets : []
136
+ ];
137
+ for (const asset of cssAssets)if ('string' == typeof asset && asset.endsWith('.css')) assets.add(asset);
138
+ }
139
+ return [
140
+ ...assets
141
+ ];
142
+ }
143
+ function escapeAttribute(value) {
144
+ return String(value).replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
145
+ }
146
+ async function withRouteCssLinks(response, route, routeManifest, request) {
147
+ const contentType = response.headers.get('content-type') || '';
148
+ if (!contentType.includes('text/html')) return response;
149
+ const cssAssets = collectRouteCssAssets(route, routeManifest);
150
+ if (0 === cssAssets.length) return response;
151
+ const html = await response.text();
152
+ const links = cssAssets.filter((asset)=>!html.includes(asset)).map((asset)=>{
153
+ const href = new URL(asset, request.url).toString();
154
+ return `<link rel="stylesheet" href="${escapeAttribute(href)}">`;
155
+ });
156
+ if (0 === links.length || !html.includes('</head>')) return new Response(html, response);
157
+ return new Response(html.replace('</head>', `${links.join('')}</head>`), {
158
+ headers: response.headers,
159
+ status: response.status,
160
+ statusText: response.statusText
161
+ });
162
+ }
124
163
  async function getRequestHandlerOptions(route, request, env) {
125
164
  const [htmlTemplate, routeManifest, loadableStats] = await Promise.all([
126
165
  readAssetText(route.entryPath, request, env),
@@ -140,14 +179,24 @@ async function loadWorkerModule(workerPath) {
140
179
  if (!workerModulePromises.has(workerPath)) workerModulePromises.set(workerPath, loader());
141
180
  return workerModulePromises.get(workerPath);
142
181
  }
182
+ function getRuntimeModule(workerModule) {
183
+ const defaultExport = workerModule.default;
184
+ const nestedDefaultExport = defaultExport && 'object' == typeof defaultExport ? defaultExport.default : void 0;
185
+ return defaultExport && 'object' == typeof defaultExport ? {
186
+ ...workerModule,
187
+ ...defaultExport,
188
+ ...nestedDefaultExport && 'object' == typeof nestedDefaultExport ? nestedDefaultExport : {}
189
+ } : workerModule;
190
+ }
143
191
  function getFetchHandler(workerModule) {
144
192
  const defaultExport = workerModule.default;
145
- return defaultExport && 'object' == typeof defaultExport && 'function' == typeof defaultExport.fetch && defaultExport.fetch.bind(defaultExport) || 'function' == typeof workerModule.fetch && workerModule.fetch;
193
+ const runtime = getRuntimeModule(workerModule);
194
+ return 'function' == typeof runtime.fetch && runtime.fetch.bind(runtime) || 'function' == typeof defaultExport && defaultExport.fetch?.bind?.(defaultExport);
146
195
  }
147
196
  async function getRequestHandler(workerModule) {
148
197
  const defaultExport = workerModule.default;
149
- const defaultRequestHandler = defaultExport && 'object' == typeof defaultExport && 'requestHandler' in defaultExport ? defaultExport.requestHandler : void 0;
150
- return await workerModule.requestHandler || await defaultRequestHandler || ('function' == typeof defaultExport ? defaultExport : void 0);
198
+ const runtime = getRuntimeModule(workerModule);
199
+ return await workerModule.requestHandler || await runtime.requestHandler || ('function' == typeof defaultExport ? defaultExport : void 0);
151
200
  }
152
201
  async function dispatchRouteWorker(route, request, env, ctx) {
153
202
  const workerPath = route.worker;
@@ -170,7 +219,7 @@ async function dispatchRouteWorker(route, request, env, ctx) {
170
219
  const requestHandler = await getRequestHandler(workerModule);
171
220
  if ('function' == typeof requestHandler) {
172
221
  const requestHandlerOptions = await getRequestHandlerOptions(route, request, env);
173
- return requestHandler(request, requestHandlerOptions);
222
+ return withRouteCssLinks(await requestHandler(request, requestHandlerOptions), route, requestHandlerOptions.resource.routeManifest, request);
174
223
  }
175
224
  return new Response(`Worker bundle has no fetch or requestHandler export: ${workerPath}`, {
176
225
  status: 500,
@@ -223,10 +272,7 @@ async function dispatchBffRequest(request, env) {
223
272
  const mountedRequest = createRequestForMountedPrefix(request, bff.prefix);
224
273
  const effectContext = createEffectContext(request, mountedRequest, env);
225
274
  const defaultExport = workerModule.default;
226
- const runtime = defaultExport && 'object' == typeof defaultExport ? {
227
- ...workerModule,
228
- ...defaultExport
229
- } : workerModule;
275
+ const runtime = getRuntimeModule(workerModule);
230
276
  const directHandler = 'function' == typeof runtime.handler && runtime.handler || 'function' == typeof defaultExport && defaultExport;
231
277
  const createdHandler = 'function' == typeof runtime.createHandler ? runtime.createHandler().handler : void 0;
232
278
  const handler = directHandler || createdHandler;
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "modern",
18
18
  "modern.js"
19
19
  ],
20
- "version": "3.2.0-ultramodern.64",
20
+ "version": "3.2.0-ultramodern.66",
21
21
  "types": "./dist/types/index.d.ts",
22
22
  "main": "./dist/cjs/index.js",
23
23
  "exports": {
@@ -99,16 +99,16 @@
99
99
  "ndepe": "^0.1.13",
100
100
  "pkg-types": "^2.3.1",
101
101
  "std-env": "4.1.0",
102
- "@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.2.0-ultramodern.64",
103
- "@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.2.0-ultramodern.64",
104
- "@modern-js/plugin-data-loader": "npm:@bleedingdev/modern-js-plugin-data-loader@3.2.0-ultramodern.64",
105
- "@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.2.0-ultramodern.64",
106
- "@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.2.0-ultramodern.64",
107
- "@modern-js/prod-server": "npm:@bleedingdev/modern-js-prod-server@3.2.0-ultramodern.64",
108
- "@modern-js/server-utils": "npm:@bleedingdev/modern-js-server-utils@3.2.0-ultramodern.64",
109
- "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.2.0-ultramodern.64",
110
- "@modern-js/server": "npm:@bleedingdev/modern-js-server@3.2.0-ultramodern.64",
111
- "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.2.0-ultramodern.64"
102
+ "@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.2.0-ultramodern.66",
103
+ "@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.2.0-ultramodern.66",
104
+ "@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.2.0-ultramodern.66",
105
+ "@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.2.0-ultramodern.66",
106
+ "@modern-js/plugin-data-loader": "npm:@bleedingdev/modern-js-plugin-data-loader@3.2.0-ultramodern.66",
107
+ "@modern-js/server": "npm:@bleedingdev/modern-js-server@3.2.0-ultramodern.66",
108
+ "@modern-js/server-utils": "npm:@bleedingdev/modern-js-server-utils@3.2.0-ultramodern.66",
109
+ "@modern-js/prod-server": "npm:@bleedingdev/modern-js-prod-server@3.2.0-ultramodern.66",
110
+ "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.2.0-ultramodern.66",
111
+ "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.2.0-ultramodern.66"
112
112
  },
113
113
  "devDependencies": {
114
114
  "@rslib/core": "0.21.5",