@hyperspan/framework 2.0.0-alpha.4 → 2.0.0-alpha.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperspan/framework",
3
- "version": "2.0.0-alpha.4",
3
+ "version": "2.0.0-alpha.5",
4
4
  "description": "Hyperspan Web Framework",
5
5
  "type": "module",
6
6
  "main": "src/server.ts",
@@ -0,0 +1,23 @@
1
+ import { describe, expect, test } from 'bun:test';
2
+ import type { Adapter } from './types';
3
+ import { createConfig } from './server';
4
+
5
+ const cloudflare: Adapter = {
6
+ name: 'cloudflare',
7
+ createEntry() {
8
+ return {
9
+ fetch: async () => new Response('ok'),
10
+ };
11
+ },
12
+ };
13
+
14
+ describe('createConfig deployAdapter', () => {
15
+ test('defaults to Node when omitted or undefined', () => {
16
+ expect(createConfig({}).deployAdapter.name).toBe('node');
17
+ expect(createConfig({ deployAdapter: undefined }).deployAdapter.name).toBe('node');
18
+ });
19
+
20
+ test('keeps an explicit adapter', () => {
21
+ expect(createConfig({ deployAdapter: cloudflare }).deployAdapter).toBe(cloudflare);
22
+ });
23
+ });
package/src/index.ts CHANGED
@@ -25,4 +25,12 @@ export type { RouteModuleEntry } from './register-routes';
25
25
  export type { AssetManifest } from './client/manifest';
26
26
  export { renderIsland } from './island';
27
27
  export type { IslandRenderOptions } from './island';
28
- export type { Hyperspan, ServerCreateContext, DeployTarget } from './types';
28
+ export type {
29
+ Hyperspan,
30
+ ServerCreateContext,
31
+ DeployAdapter,
32
+ Adapter,
33
+ AdapterAfterBuildContext,
34
+ DeployEntry,
35
+ DeployEntryContext,
36
+ } from './types';
package/src/server.ts CHANGED
@@ -12,6 +12,7 @@ import { isbot } from 'isbot';
12
12
  import { executeMiddleware } from './middleware';
13
13
  import { buildUrl, parsePath, removeUndefined } from './utils';
14
14
  import { Cookies } from './cookies';
15
+ import { nodeAdapter } from '@hyperspan/adapter-node';
15
16
 
16
17
  import type { Hyperspan as HS } from './types';
17
18
 
@@ -51,7 +52,7 @@ export function createConfig(config: Partial<HS.Config> = {}): HS.Config {
51
52
  appDir: './app',
52
53
  publicDir: './public',
53
54
  plugins: [],
54
- deployTarget: 'node',
55
+ deployAdapter: config.deployAdapter ?? nodeAdapter(),
55
56
  responseOptions: {
56
57
  disableStreaming: hyperspanDisableStreaming,
57
58
  },
@@ -59,6 +60,7 @@ export function createConfig(config: Partial<HS.Config> = {}): HS.Config {
59
60
  return {
60
61
  ...defaultConfig,
61
62
  ...config,
63
+ deployAdapter: config.deployAdapter ?? defaultConfig.deployAdapter,
62
64
  responseOptions: {
63
65
  ...defaultConfig.responseOptions,
64
66
  ...config.responseOptions,
package/src/types.ts CHANGED
@@ -63,7 +63,38 @@ export namespace Hyperspan {
63
63
  disableStreaming?: DisableStreamingFn;
64
64
  };
65
65
 
66
- export type DeployTarget = 'node' | 'bun' | 'cloudflare';
66
+ export type AdapterAfterBuildContext = {
67
+ root: string;
68
+ appDir: string;
69
+ outDir: string;
70
+ };
71
+
72
+ export type DeployEntryContext = {
73
+ createHyperspanServer: () => Promise<Server>;
74
+ config: Config;
75
+ };
76
+
77
+ export type DeployEntry = {
78
+ start?(options?: { port?: number }): unknown | Promise<unknown>;
79
+ fetch?(request: Request, env?: unknown, ctx?: unknown): Response | Promise<Response>;
80
+ };
81
+
82
+ export type Adapter = {
83
+ /** Diagnostic name, e.g. `node`, `cloudflare`. */
84
+ name: string;
85
+ /**
86
+ * Native ESM specifier exporting `resolveDevEnv(root)`.
87
+ * Imported by the Vite plugin so platform SDKs like wrangler load correctly.
88
+ */
89
+ devModule?: string;
90
+ resolveDevEnv?(root: string): Promise<unknown>;
91
+ /** Platform entry (`start` and/or `fetch`). Called from generated `dist/server.ts`. */
92
+ createEntry(ctx: DeployEntryContext): DeployEntry;
93
+ afterBuild?(ctx: AdapterAfterBuildContext): void | Promise<void>;
94
+ };
95
+
96
+ /** Runtime adapter object (`nodeAdapter()`, `cloudflareAdapter()`, …). */
97
+ export type DeployAdapter = Adapter;
67
98
 
68
99
  export type ServerCreateContext = {
69
100
  env: unknown;
@@ -72,12 +103,16 @@ export namespace Hyperspan {
72
103
  export type Config = {
73
104
  appDir: string;
74
105
  publicDir: string;
75
- plugins: Array<Hyperspan.Plugin>; // Loaders for client islands
76
- /** Production runtime target. Controls the generated dist/server entry. */
77
- deployTarget?: DeployTarget;
106
+ /** Island plugins (`preactPlugin()`, `sveltePlugin()`, …). */
107
+ plugins: Array<Hyperspan.Plugin>;
108
+ /**
109
+ * Deployment adapter. Pass `cloudflareAdapter()` or `bunAdapter()`.
110
+ * Omit (or pass `nodeAdapter()`) to deploy to Node.
111
+ */
112
+ deployAdapter: Adapter;
78
113
  /**
79
114
  * Called before the server is created, with platform bindings.
80
- * - Vite/`hyperspan dev`: adapter `/dev` `resolveDevEnv(root)` when present; else `process.env`
115
+ * - Vite/`hyperspan dev`: adapter `devModule` `resolveDevEnv(root)` when present; else `process.env`
81
116
  * - Node/Bun production entry: `process.env`
82
117
  * - Cloudflare Workers entry: Worker `env` bindings
83
118
  */
@@ -402,8 +437,12 @@ export namespace Hyperspan {
402
437
  }
403
438
  }
404
439
 
405
- export type DeployTarget = Hyperspan.DeployTarget;
440
+ export type DeployAdapter = Hyperspan.DeployAdapter;
406
441
  export type ServerCreateContext = Hyperspan.ServerCreateContext;
442
+ export type Adapter = Hyperspan.Adapter;
443
+ export type AdapterAfterBuildContext = Hyperspan.AdapterAfterBuildContext;
444
+ export type DeployEntry = Hyperspan.DeployEntry;
445
+ export type DeployEntryContext = Hyperspan.DeployEntryContext;
407
446
 
408
447
  declare global {
409
448
  interface DocumentEventMap {