@torpor/build 0.1.2 → 0.1.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.
Files changed (65) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/{Server-CB99REgs.d.cts → Site-Df1k0TuQ.d.cts} +27 -1
  3. package/dist/{Server-CB99REgs.d.ts → Site-Df1k0TuQ.d.ts} +27 -1
  4. package/dist/bin/index.cjs +164 -166
  5. package/dist/bin/index.cjs.map +1 -1
  6. package/dist/bin/index.js +2 -3
  7. package/dist/bin/index.js.map +1 -1
  8. package/dist/chunk-L3QBUPXY.js +176 -0
  9. package/dist/chunk-L3QBUPXY.js.map +1 -0
  10. package/dist/{chunk-ENB7RXFX.js → chunk-Q623TPGO.js} +43 -185
  11. package/dist/chunk-Q623TPGO.js.map +1 -0
  12. package/dist/index.cjs +174 -118
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.d.cts +2 -2
  15. package/dist/index.d.ts +2 -2
  16. package/dist/index.js +12 -4
  17. package/dist/index.js.map +1 -1
  18. package/dist/metafile-cjs.json +1 -1
  19. package/dist/metafile-esm.json +1 -1
  20. package/dist/run.cjs +164 -166
  21. package/dist/run.cjs.map +1 -1
  22. package/dist/run.d.cts +1 -2
  23. package/dist/run.d.ts +1 -2
  24. package/dist/run.js +2 -3
  25. package/package.json +3 -3
  26. package/src/index.ts +4 -1
  27. package/src/site/Site.ts +2 -2
  28. package/src/site/defaultAdapter.ts +11 -0
  29. package/src/site/runDev.ts +1 -1
  30. package/tsconfig.json +1 -1
  31. package/tsup.config.ts +1 -9
  32. package/dist/Site-CgoeDt8k.d.cts +0 -29
  33. package/dist/Site-D95nwrAg.d.ts +0 -29
  34. package/dist/adapters/cloudflare/index.cjs +0 -125
  35. package/dist/adapters/cloudflare/index.cjs.map +0 -1
  36. package/dist/adapters/cloudflare/index.d.cts +0 -13
  37. package/dist/adapters/cloudflare/index.d.ts +0 -13
  38. package/dist/adapters/cloudflare/index.js +0 -80
  39. package/dist/adapters/cloudflare/index.js.map +0 -1
  40. package/dist/adapters/node/index.cjs +0 -152
  41. package/dist/adapters/node/index.cjs.map +0 -1
  42. package/dist/adapters/node/index.d.cts +0 -8
  43. package/dist/adapters/node/index.d.ts +0 -8
  44. package/dist/adapters/node/index.js +0 -8
  45. package/dist/adapters/node/index.js.map +0 -1
  46. package/dist/chunk-5X4T3PZN.js +0 -23
  47. package/dist/chunk-5X4T3PZN.js.map +0 -1
  48. package/dist/chunk-ALHFYD7U.js +0 -113
  49. package/dist/chunk-ALHFYD7U.js.map +0 -1
  50. package/dist/chunk-ENB7RXFX.js.map +0 -1
  51. package/dist/chunk-V4XTDQEV.js +0 -19
  52. package/dist/chunk-V4XTDQEV.js.map +0 -1
  53. package/src/adapters/cloudflare/_worker.ts +0 -38
  54. package/src/adapters/cloudflare/index.ts +0 -98
  55. package/src/adapters/node/constants.ts +0 -1
  56. package/src/adapters/node/createFetchHandler.ts +0 -29
  57. package/src/adapters/node/createNodeServer.ts +0 -8
  58. package/src/adapters/node/index.ts +0 -18
  59. package/src/adapters/node/nodeMessageToRequest.ts +0 -43
  60. package/src/adapters/node/responseToNodeResponse.ts +0 -44
  61. /package/src/{adapters/node → server/connect}/createMiddlewareHandler.ts +0 -0
  62. /package/src/{adapters/node → server/connect}/flattenHeaders.ts +0 -0
  63. /package/src/{adapters/node → server/connect}/nodeMessageToNodeResponse.ts +0 -0
  64. /package/src/{adapters/node → server/connect}/readableToBuffer.ts +0 -0
  65. /package/src/{adapters/node → server/connect}/requestToNodeMessage.ts +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @torpor/build
2
2
 
3
+ ## 0.1.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 4b86717: Refactor: separate adapters into packages
8
+
3
9
  ## 0.1.2
4
10
 
5
11
  ### Patch Changes
@@ -1,3 +1,4 @@
1
+ import { Plugin } from 'vite';
1
2
  import { SerializeOptions } from 'cookie';
2
3
 
3
4
  declare class CookieHelper {
@@ -71,4 +72,29 @@ declare class RouteHandler {
71
72
  constructor(path: string, fn: ServerFunction);
72
73
  }
73
74
 
74
- export { CookieHelper as C, HeaderHelper as H, Server as S };
75
+ type Adapter = {
76
+ prebuild?: (site: Site) => Promise<void> | void;
77
+ postbuild?: (site: Site) => Promise<void> | void;
78
+ serve: (server: Server, site: Site) => void;
79
+ };
80
+
81
+ /**
82
+ * The Site class contains the information necessary to setup a @torpor/build
83
+ * site, including routes, plugins, and options.
84
+ */
85
+ declare class Site {
86
+ #private;
87
+ root: string;
88
+ routes: {
89
+ path: string;
90
+ file: string;
91
+ type: number;
92
+ }[];
93
+ plugins: Plugin[];
94
+ adapter: Adapter;
95
+ constructor();
96
+ addRouteFolder(folder: string): Promise<void>;
97
+ addRouteFile(path: string, file: string): void;
98
+ }
99
+
100
+ export { type Adapter as A, CookieHelper as C, HeaderHelper as H, Site as S, Server as a };
@@ -1,3 +1,4 @@
1
+ import { Plugin } from 'vite';
1
2
  import { SerializeOptions } from 'cookie';
2
3
 
3
4
  declare class CookieHelper {
@@ -71,4 +72,29 @@ declare class RouteHandler {
71
72
  constructor(path: string, fn: ServerFunction);
72
73
  }
73
74
 
74
- export { CookieHelper as C, HeaderHelper as H, Server as S };
75
+ type Adapter = {
76
+ prebuild?: (site: Site) => Promise<void> | void;
77
+ postbuild?: (site: Site) => Promise<void> | void;
78
+ serve: (server: Server, site: Site) => void;
79
+ };
80
+
81
+ /**
82
+ * The Site class contains the information necessary to setup a @torpor/build
83
+ * site, including routes, plugins, and options.
84
+ */
85
+ declare class Site {
86
+ #private;
87
+ root: string;
88
+ routes: {
89
+ path: string;
90
+ file: string;
91
+ type: number;
92
+ }[];
93
+ plugins: Plugin[];
94
+ adapter: Adapter;
95
+ constructor();
96
+ addRouteFolder(folder: string): Promise<void>;
97
+ addRouteFile(path: string, file: string): void;
98
+ }
99
+
100
+ export { type Adapter as A, CookieHelper as C, HeaderHelper as H, Site as S, Server as a };
@@ -137,170 +137,8 @@ var import_vite3 = __toESM(require("@torpor/unplugin/vite"), 1);
137
137
  var import_dotenv = require("dotenv");
138
138
  var import_node_fs3 = require("fs");
139
139
  var import_node_path3 = __toESM(require("path"), 1);
140
- var import_node_url = require("url");
141
140
  var import_vite4 = require("vite");
142
141
 
143
- // src/adapters/node/flattenHeaders.ts
144
- function flattenHeaders(headers) {
145
- const flatHeaders = new Headers();
146
- for (const [key, value] of Object.entries(headers)) {
147
- if (value === void 0 || value === null) {
148
- continue;
149
- } else if (Array.isArray(value)) {
150
- for (const v of value) {
151
- if (v !== void 0 && v !== null) {
152
- value.forEach((v2) => flatHeaders.append(key, v2));
153
- }
154
- }
155
- } else {
156
- flatHeaders.set(key, String(value));
157
- }
158
- }
159
- return flatHeaders;
160
- }
161
-
162
- // src/adapters/node/nodeMessageToNodeResponse.ts
163
- var import_node_http = require("http");
164
- var import_node_stream = require("stream");
165
- function nodeMessageToNodeResponse(incomingMessage) {
166
- const res = new import_node_http.ServerResponse(incomingMessage);
167
- const passThrough = new import_node_stream.PassThrough();
168
- let handled = false;
169
- const onReadable = (cb) => {
170
- const handleReadable = () => {
171
- if (handled) return;
172
- handled = true;
173
- cb({
174
- readable: import_node_stream.Readable.from(passThrough),
175
- headers: res.getHeaders(),
176
- status: res.statusCode
177
- });
178
- };
179
- passThrough.once("readable", handleReadable);
180
- passThrough.once("end", handleReadable);
181
- };
182
- passThrough.once("finish", () => {
183
- res.emit("finish");
184
- });
185
- passThrough.once("close", () => {
186
- res.destroy();
187
- res.emit("close");
188
- });
189
- passThrough.on("drain", () => {
190
- res.emit("drain");
191
- });
192
- res.write = passThrough.write.bind(passThrough);
193
- res.end = passThrough.end.bind(passThrough);
194
- res.writeHead = function writeHead(statusCode, statusMessage, headers) {
195
- res.statusCode = statusCode;
196
- if (typeof statusMessage === "object") {
197
- headers = statusMessage;
198
- statusMessage = void 0;
199
- }
200
- if (headers) {
201
- for (const [key, value] of Object.entries(headers)) {
202
- if (value !== void 0) {
203
- res.setHeader(key, value);
204
- }
205
- }
206
- }
207
- return res;
208
- };
209
- return {
210
- res,
211
- onReadable
212
- };
213
- }
214
-
215
- // src/adapters/node/readableToBuffer.ts
216
- function readableToBuffer(req) {
217
- return new Promise((resolve, reject) => {
218
- const chunks = [];
219
- req.on("data", (chunk) => {
220
- chunks.push(chunk);
221
- });
222
- req.on("end", () => {
223
- resolve(Buffer.concat(chunks));
224
- });
225
- req.on("error", (err) => {
226
- reject(err);
227
- });
228
- });
229
- }
230
-
231
- // src/adapters/node/requestToNodeMessage.ts
232
- var import_node_stream2 = require("stream");
233
- var DUMMY_BASE_URL = "http://localhost";
234
- function requestToNodeMessage(request) {
235
- const parsedUrl = new URL(request.url, DUMMY_BASE_URL);
236
- const pathAndQuery = (parsedUrl.pathname || "") + (parsedUrl.search || "");
237
- const body = (
238
- /*request.body ? Readable.fromWeb(request.body as any) :*/
239
- import_node_stream2.Readable.from([])
240
- );
241
- return Object.assign(body, {
242
- url: pathAndQuery,
243
- method: request.method,
244
- headers: Object.fromEntries(request.headers)
245
- });
246
- }
247
-
248
- // src/adapters/node/createMiddlewareHandler.ts
249
- function createMiddlewareHandler(handler) {
250
- return async (ev, next) => {
251
- const req = requestToNodeMessage(ev.request);
252
- const { res, onReadable } = nodeMessageToNodeResponse(req);
253
- return new Promise(async (resolve, reject) => {
254
- onReadable(async ({ readable, headers, status }) => {
255
- const responseBody = statusCodesWithoutBody.includes(status) ? null : (
256
- //(Readable.toWeb(readable) as ReadableStream);
257
- // HACK: Chunked bodies are not being
258
- // read correctly somewhere...
259
- await readableToBuffer(readable)
260
- );
261
- ev.response = new Response(responseBody, {
262
- status,
263
- headers: flattenHeaders(headers)
264
- });
265
- resolve();
266
- });
267
- const cnext = async (error) => {
268
- if (error) {
269
- reject(error instanceof Error ? error : new Error(String(error)));
270
- } else {
271
- await next();
272
- resolve();
273
- }
274
- };
275
- try {
276
- const handled = await handler(req, res, cnext);
277
- if (handled === false) {
278
- res.destroy();
279
- resolve();
280
- }
281
- } catch (e) {
282
- cnext(e);
283
- }
284
- });
285
- };
286
- }
287
- var statusCodesWithoutBody = [
288
- 100,
289
- // Continue
290
- 101,
291
- // Switching Protocols
292
- 102,
293
- // Processing (WebDAV)
294
- 103,
295
- // Early Hints
296
- 204,
297
- // No Content
298
- 205,
299
- // Reset Content
300
- 304
301
- // Not Modified
302
- ];
303
-
304
142
  // src/response/response.ts
305
143
  function response(status, body) {
306
144
  let headers = void 0;
@@ -495,6 +333,167 @@ var RouteHandler = class {
495
333
  }
496
334
  };
497
335
 
336
+ // src/server/connect/flattenHeaders.ts
337
+ function flattenHeaders(headers) {
338
+ const flatHeaders = new Headers();
339
+ for (const [key, value] of Object.entries(headers)) {
340
+ if (value === void 0 || value === null) {
341
+ continue;
342
+ } else if (Array.isArray(value)) {
343
+ for (const v of value) {
344
+ if (v !== void 0 && v !== null) {
345
+ value.forEach((v2) => flatHeaders.append(key, v2));
346
+ }
347
+ }
348
+ } else {
349
+ flatHeaders.set(key, String(value));
350
+ }
351
+ }
352
+ return flatHeaders;
353
+ }
354
+
355
+ // src/server/connect/nodeMessageToNodeResponse.ts
356
+ var import_node_http = require("http");
357
+ var import_node_stream = require("stream");
358
+ function nodeMessageToNodeResponse(incomingMessage) {
359
+ const res = new import_node_http.ServerResponse(incomingMessage);
360
+ const passThrough = new import_node_stream.PassThrough();
361
+ let handled = false;
362
+ const onReadable = (cb) => {
363
+ const handleReadable = () => {
364
+ if (handled) return;
365
+ handled = true;
366
+ cb({
367
+ readable: import_node_stream.Readable.from(passThrough),
368
+ headers: res.getHeaders(),
369
+ status: res.statusCode
370
+ });
371
+ };
372
+ passThrough.once("readable", handleReadable);
373
+ passThrough.once("end", handleReadable);
374
+ };
375
+ passThrough.once("finish", () => {
376
+ res.emit("finish");
377
+ });
378
+ passThrough.once("close", () => {
379
+ res.destroy();
380
+ res.emit("close");
381
+ });
382
+ passThrough.on("drain", () => {
383
+ res.emit("drain");
384
+ });
385
+ res.write = passThrough.write.bind(passThrough);
386
+ res.end = passThrough.end.bind(passThrough);
387
+ res.writeHead = function writeHead(statusCode, statusMessage, headers) {
388
+ res.statusCode = statusCode;
389
+ if (typeof statusMessage === "object") {
390
+ headers = statusMessage;
391
+ statusMessage = void 0;
392
+ }
393
+ if (headers) {
394
+ for (const [key, value] of Object.entries(headers)) {
395
+ if (value !== void 0) {
396
+ res.setHeader(key, value);
397
+ }
398
+ }
399
+ }
400
+ return res;
401
+ };
402
+ return {
403
+ res,
404
+ onReadable
405
+ };
406
+ }
407
+
408
+ // src/server/connect/readableToBuffer.ts
409
+ function readableToBuffer(req) {
410
+ return new Promise((resolve, reject) => {
411
+ const chunks = [];
412
+ req.on("data", (chunk) => {
413
+ chunks.push(chunk);
414
+ });
415
+ req.on("end", () => {
416
+ resolve(Buffer.concat(chunks));
417
+ });
418
+ req.on("error", (err) => {
419
+ reject(err);
420
+ });
421
+ });
422
+ }
423
+
424
+ // src/server/connect/requestToNodeMessage.ts
425
+ var import_node_stream2 = require("stream");
426
+ var DUMMY_BASE_URL = "http://localhost";
427
+ function requestToNodeMessage(request) {
428
+ const parsedUrl = new URL(request.url, DUMMY_BASE_URL);
429
+ const pathAndQuery = (parsedUrl.pathname || "") + (parsedUrl.search || "");
430
+ const body = (
431
+ /*request.body ? Readable.fromWeb(request.body as any) :*/
432
+ import_node_stream2.Readable.from([])
433
+ );
434
+ return Object.assign(body, {
435
+ url: pathAndQuery,
436
+ method: request.method,
437
+ headers: Object.fromEntries(request.headers)
438
+ });
439
+ }
440
+
441
+ // src/server/connect/createMiddlewareHandler.ts
442
+ function createMiddlewareHandler(handler) {
443
+ return async (ev, next) => {
444
+ const req = requestToNodeMessage(ev.request);
445
+ const { res, onReadable } = nodeMessageToNodeResponse(req);
446
+ return new Promise(async (resolve, reject) => {
447
+ onReadable(async ({ readable, headers, status }) => {
448
+ const responseBody = statusCodesWithoutBody.includes(status) ? null : (
449
+ //(Readable.toWeb(readable) as ReadableStream);
450
+ // HACK: Chunked bodies are not being
451
+ // read correctly somewhere...
452
+ await readableToBuffer(readable)
453
+ );
454
+ ev.response = new Response(responseBody, {
455
+ status,
456
+ headers: flattenHeaders(headers)
457
+ });
458
+ resolve();
459
+ });
460
+ const cnext = async (error) => {
461
+ if (error) {
462
+ reject(error instanceof Error ? error : new Error(String(error)));
463
+ } else {
464
+ await next();
465
+ resolve();
466
+ }
467
+ };
468
+ try {
469
+ const handled = await handler(req, res, cnext);
470
+ if (handled === false) {
471
+ res.destroy();
472
+ resolve();
473
+ }
474
+ } catch (e) {
475
+ cnext(e);
476
+ }
477
+ });
478
+ };
479
+ }
480
+ var statusCodesWithoutBody = [
481
+ 100,
482
+ // Continue
483
+ 101,
484
+ // Switching Protocols
485
+ 102,
486
+ // Processing (WebDAV)
487
+ 103,
488
+ // Early Hints
489
+ 204,
490
+ // No Content
491
+ 205,
492
+ // Reset Content
493
+ 304
494
+ // Not Modified
495
+ ];
496
+
498
497
  // src/site/prepareTemplate.ts
499
498
  function prepareTemplate(template, clientScript) {
500
499
  let contentStart = regexIndexOf(template, /\<div\s+id=("app"|'app'|app)\s+/);
@@ -511,8 +510,6 @@ function regexIndexOf(string, regex, position) {
511
510
  }
512
511
 
513
512
  // src/site/runDev.ts
514
- var import_meta = {};
515
- var __dirname = import_node_path3.default.dirname((0, import_node_url.fileURLToPath)(import_meta.url));
516
513
  async function runDev(site) {
517
514
  const server = new Server();
518
515
  const vite = await (0, import_vite4.createServer)({
@@ -528,8 +525,9 @@ async function runDev(site) {
528
525
  const templateFile = import_node_path3.default.resolve(site.root, "src/site.html");
529
526
  let template = await import_node_fs3.promises.readFile(templateFile, "utf-8");
530
527
  template = await vite.transformIndexHtml("", template);
531
- const clientScript = import_node_path3.default.resolve(__dirname, "../../src/site/clientEntry.ts");
532
- const serverScript = import_node_path3.default.resolve(__dirname, "../../src/site/serverEntry.ts");
528
+ const siteFolder = import_node_path3.default.resolve(site.root, "./node_modules/@torpor/build/src/site/");
529
+ let clientScript = import_node_path3.default.join(siteFolder, "clientEntry.ts");
530
+ let serverScript = import_node_path3.default.join(siteFolder, "serverEntry.ts");
533
531
  template = prepareTemplate(template, clientScript);
534
532
  server.use(createMiddlewareHandler(vite.middlewares));
535
533
  server.add("*", async (ev) => {