@zeltjs/adapter-node 0.8.1 → 0.8.2-canary.1

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/dist/index.cjs ADDED
@@ -0,0 +1,151 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let _hono_node_server = require("@hono/node-server");
3
+ let _zeltjs_core = require("@zeltjs/core");
4
+ //#region src/node-cli.config.ts
5
+ function _ts_decorate$1(decorators, target, key, desc) {
6
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
7
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
8
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
9
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
10
+ }
11
+ var NodeCliConfig = class extends _zeltjs_core.CliConfig {
12
+ cwd() {
13
+ return process.cwd();
14
+ }
15
+ argv() {
16
+ return process.argv;
17
+ }
18
+ exit(code) {
19
+ process.exit(code);
20
+ }
21
+ setExitCode(code) {
22
+ process.exitCode = code;
23
+ }
24
+ onSignal(signal, handler) {
25
+ process.on(signal, handler);
26
+ }
27
+ offSignal(signal, handler) {
28
+ process.off(signal, handler);
29
+ }
30
+ };
31
+ NodeCliConfig = _ts_decorate$1([_zeltjs_core.Config], NodeCliConfig);
32
+ //#endregion
33
+ //#region src/process-env.adaptor.ts
34
+ function _ts_decorate(decorators, target, key, desc) {
35
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
36
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
37
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
38
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
39
+ }
40
+ var ProcessEnvAdaptor = class extends _zeltjs_core.EnvAdaptor {
41
+ get(key) {
42
+ return process.env[key];
43
+ }
44
+ };
45
+ ProcessEnvAdaptor = _ts_decorate([_zeltjs_core.Config], ProcessEnvAdaptor);
46
+ //#endregion
47
+ //#region src/on-node.ts
48
+ const createListenForHttp = (appFetch, appShutdown) => {
49
+ return async (portOrOptions) => {
50
+ const listenOptions = typeof portOrOptions === "number" ? { port: portOrOptions } : portOrOptions ?? {};
51
+ const port = listenOptions.port ?? 3e3;
52
+ const hostname = listenOptions.hostname ?? "0.0.0.0";
53
+ let server;
54
+ const address = await new Promise((resolve) => {
55
+ server = (0, _hono_node_server.serve)({
56
+ fetch: appFetch,
57
+ port,
58
+ hostname
59
+ }, (info) => resolve({
60
+ port: info.port,
61
+ address: info.address
62
+ }));
63
+ });
64
+ const shutdown = async () => {
65
+ await new Promise((resolve, reject) => {
66
+ server.close((err) => err ? reject(err) : resolve());
67
+ });
68
+ await appShutdown();
69
+ };
70
+ return {
71
+ address,
72
+ shutdown
73
+ };
74
+ };
75
+ };
76
+ const getArgs = () => globalThis.process.argv.slice(2);
77
+ const createNodeApp = (readyApp, shutdown, args) => {
78
+ const base = {
79
+ ...readyApp,
80
+ args,
81
+ shutdown
82
+ };
83
+ const httpCaps = readyApp.getFeatureCapabilities(_zeltjs_core.HttpFeature);
84
+ if (!httpCaps) return base;
85
+ return {
86
+ ...base,
87
+ listen: createListenForHttp(httpCaps.fetch, shutdown)
88
+ };
89
+ };
90
+ /** @throws {ZeltLifecycleStateError} */ async function onNode(app, options = {}) {
91
+ const readyApp = await app.createRuntime({
92
+ fallbackConfigs: [NodeCliConfig, ProcessEnvAdaptor],
93
+ warmup: options.warmup ?? true
94
+ });
95
+ const cliConfig = await readyApp.get(NodeCliConfig);
96
+ const runtimeShutdown = readyApp.shutdown;
97
+ let shuttingDown = false;
98
+ const detachSignals = () => {
99
+ cliConfig.offSignal("SIGINT", gracefulShutdown);
100
+ cliConfig.offSignal("SIGTERM", gracefulShutdown);
101
+ };
102
+ const shutdown = async () => {
103
+ if (shuttingDown) return;
104
+ shuttingDown = true;
105
+ try {
106
+ await runtimeShutdown();
107
+ } finally {
108
+ detachSignals();
109
+ }
110
+ };
111
+ const gracefulShutdown = () => {
112
+ shutdown().catch(() => {});
113
+ };
114
+ cliConfig.onSignal("SIGINT", gracefulShutdown);
115
+ cliConfig.onSignal("SIGTERM", gracefulShutdown);
116
+ return createNodeApp(readyApp, shutdown, getArgs());
117
+ }
118
+ //#endregion
119
+ //#region src/serve.lib.ts
120
+ const buildServeOptions = (optionsOrCallback) => typeof optionsOrCallback === "function" ? {} : optionsOrCallback ?? {};
121
+ const extractCallback = (optionsOrCallback, maybeCallback) => typeof optionsOrCallback === "function" ? optionsOrCallback : maybeCallback;
122
+ const serveApp = (app, optionsOrCallback, maybeCallback) => {
123
+ const options = buildServeOptions(optionsOrCallback);
124
+ const callback = extractCallback(optionsOrCallback, maybeCallback);
125
+ return (0, _hono_node_server.serve)({
126
+ fetch: app.fetch,
127
+ port: options.port ?? 3e3,
128
+ hostname: options.hostname ?? "0.0.0.0"
129
+ }, callback);
130
+ };
131
+ //#endregion
132
+ Object.defineProperty(exports, "NodeCliConfig", {
133
+ enumerable: true,
134
+ get: function() {
135
+ return NodeCliConfig;
136
+ }
137
+ });
138
+ Object.defineProperty(exports, "ProcessEnvAdaptor", {
139
+ enumerable: true,
140
+ get: function() {
141
+ return ProcessEnvAdaptor;
142
+ }
143
+ });
144
+ Object.defineProperty(exports, "createAdaptorServer", {
145
+ enumerable: true,
146
+ get: function() {
147
+ return _hono_node_server.createAdaptorServer;
148
+ }
149
+ });
150
+ exports.onNode = onNode;
151
+ exports.serve = serveApp;
@@ -0,0 +1,61 @@
1
+ import { ServerType, createAdaptorServer } from "@hono/node-server";
2
+ import { CliConfig, ConfiguredFeature, EnvAdaptor, FeatureApp, HttpFeature, RuntimeApp, Signal, SignalHandler } from "@zeltjs/core";
3
+
4
+ //#region src/node-cli.config.d.ts
5
+ declare class NodeCliConfig extends CliConfig {
6
+ cwd(): string;
7
+ argv(): readonly string[];
8
+ exit(code: number): never;
9
+ setExitCode(code: number): void;
10
+ onSignal(signal: Signal, handler: SignalHandler): void;
11
+ offSignal(signal: Signal, handler: SignalHandler): void;
12
+ }
13
+ //#endregion
14
+ //#region src/on-node.d.ts
15
+ type ListenOptions = {
16
+ readonly port?: number;
17
+ readonly hostname?: string;
18
+ };
19
+ type ServerHandle = {
20
+ readonly address: {
21
+ port: number;
22
+ address: string;
23
+ };
24
+ readonly shutdown: () => Promise<void>;
25
+ };
26
+ type NodeAppOptions = {
27
+ readonly warmup?: boolean;
28
+ };
29
+ type EnvironmentNodeAppPart = {
30
+ readonly args: readonly string[];
31
+ readonly shutdown: () => Promise<void>;
32
+ };
33
+ type HttpNodeAppPart = {
34
+ readonly listen: (portOrOptions?: number | ListenOptions) => Promise<ServerHandle>;
35
+ };
36
+ type HasFeatureClass<F extends readonly ConfiguredFeature[], TFeature extends ConfiguredFeature> = Extract<F[number], TFeature> extends never ? false : true;
37
+ type WithFeatureClass<F extends readonly ConfiguredFeature[], TFeature extends ConfiguredFeature, TPart extends object> = HasFeatureClass<F, TFeature> extends true ? TPart : unknown;
38
+ type NodeAppForFeatures<F extends readonly ConfiguredFeature[]> = RuntimeApp<F> & EnvironmentNodeAppPart & (number extends F['length'] ? Partial<HttpNodeAppPart> : WithFeatureClass<F, HttpFeature, HttpNodeAppPart>);
39
+ declare function onNode<const F extends readonly ConfiguredFeature[]>(app: FeatureApp<F>, options?: NodeAppOptions): Promise<NodeAppForFeatures<F>>;
40
+ //#endregion
41
+ //#region src/process-env.adaptor.d.ts
42
+ declare class ProcessEnvAdaptor extends EnvAdaptor {
43
+ get(key: string): string | undefined;
44
+ }
45
+ //#endregion
46
+ //#region src/serve.lib.d.ts
47
+ type ServeOptions = {
48
+ port?: number;
49
+ hostname?: string;
50
+ };
51
+ type AddressInfo = {
52
+ port: number;
53
+ address: string;
54
+ };
55
+ type AppLike = {
56
+ fetch: (request: Request) => Promise<Response>;
57
+ };
58
+ declare const serveApp: (app: AppLike, optionsOrCallback?: ServeOptions | ((info: AddressInfo) => void), maybeCallback?: (info: AddressInfo) => void) => ServerType;
59
+ //#endregion
60
+ export { type AddressInfo, NodeCliConfig, ProcessEnvAdaptor, type ServeOptions, type ServerHandle, createAdaptorServer, onNode, serveApp as serve };
61
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/node-cli.config.ts","../src/on-node.ts","../src/process-env.adaptor.ts","../src/serve.lib.ts"],"mappings":";;;;cAIa,aAAA,SAAsB,SAAA;EACxB,GAAA,CAAA;EAIA,IAAA,CAAA;EAIA,IAAA,CAAK,IAAA;EAIL,WAAA,CAAY,IAAA;EAIZ,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA;EAIlC,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA;AAAA;;;KCjBzC,aAAA;EAAA,SACM,IAAA;EAAA,SACA,QAAA;AAAA;AAAA,KAGC,YAAA;EAAA,SACD,OAAA;IAAW,IAAA;IAAc,OAAA;EAAA;EAAA,SACzB,QAAA,QAAgB,OAAA;AAAA;AAAA,KAGf,cAAA;EAAA,SACD,MAAA;AAAA;AAAA,KAKN,sBAAA;EAAA,SACM,IAAA;EAAA,SACA,QAAA,QAAgB,OAAA;AAAA;AAAA,KAGtB,eAAA;EAAA,SACM,MAAA,GAAS,aAAA,YAAyB,aAAA,KAAkB,OAAA,CAAQ,YAAA;AAAA;AAAA,KAMlE,eAAA,oBAAmC,iBAAA,qBAAsC,iBAAA,IAC5E,OAAA,CAAQ,CAAA,UAAW,QAAA;AAAA,KAEhB,gBAAA,oBACgB,iBAAA,qBACF,iBAAA,0BAEf,eAAA,CAAgB,CAAA,EAAG,QAAA,iBAAyB,KAAA;AAAA,KAE3C,kBAAA,oBAAsC,iBAAA,MAAuB,UAAA,CAAW,CAAA,IAC3E,sBAAA,mBACgB,CAAA,aACZ,OAAA,CAAQ,eAAA,IACR,gBAAA,CAAiB,CAAA,EAAG,WAAA,EAAa,eAAA;AAAA,iBAsDvB,MAAA,0BAAgC,iBAAA,GAAA,CAC9C,GAAA,EAAK,UAAA,CAAW,CAAA,GAChB,OAAA,GAAU,cAAA,GACT,OAAA,CAAQ,kBAAA,CAAmB,CAAA;;;cCvGjB,iBAAA,SAA0B,UAAA;EAC5B,GAAA,CAAI,GAAA;AAAA;;;KCDH,YAAA;EACV,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,WAAA;EACV,IAAA;EACA,OAAA;AAAA;AAAA,KAGG,OAAA;EACH,KAAA,GAAQ,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA;AAAA,cAa1B,QAAA,GACX,GAAA,EAAK,OAAA,EACL,iBAAA,GAAoB,YAAA,KAAiB,IAAA,EAAM,WAAA,YAC3C,aAAA,IAAiB,IAAA,EAAM,WAAA,cACtB,UAAA"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ServerType, createAdaptorServer } from "@hono/node-server";
2
- import { CliConfig, CommandApp, EnvAdaptor, ExecResult, HttpApp, ReadyResult, SchedulerApp, Signal, SignalHandler } from "@zeltjs/core";
2
+ import { CliConfig, ConfiguredFeature, EnvAdaptor, FeatureApp, HttpFeature, RuntimeApp, Signal, SignalHandler } from "@zeltjs/core";
3
3
 
4
4
  //#region src/node-cli.config.d.ts
5
5
  declare class NodeCliConfig extends CliConfig {
@@ -26,34 +26,17 @@ type ServerHandle = {
26
26
  type NodeAppOptions = {
27
27
  readonly warmup?: boolean;
28
28
  };
29
- type NodeAppBase = {
29
+ type EnvironmentNodeAppPart = {
30
30
  readonly args: readonly string[];
31
- };
32
- type HttpNodeApp = ReadyResult & NodeAppBase & {
33
- readonly listen: (portOrOptions?: number | ListenOptions) => Promise<ServerHandle>;
34
31
  readonly shutdown: () => Promise<void>;
35
32
  };
36
- type CommandNodeApp = ReadyResult & NodeAppBase & {
37
- readonly execCommand: (argv: readonly string[]) => Promise<ExecResult>;
38
- readonly shutdown: () => Promise<void>;
39
- };
40
- type SchedulerNodeAppPart = {
41
- readonly startScheduler: () => Promise<void>;
42
- readonly stopScheduler: () => Promise<void>;
33
+ type HttpNodeAppPart = {
34
+ readonly listen: (portOrOptions?: number | ListenOptions) => Promise<ServerHandle>;
43
35
  };
44
- type FullNodeApp = HttpNodeApp & CommandNodeApp;
45
- /** @throws {ZeltLifecycleStateError} */
46
- declare function onNode(app: HttpApp & CommandApp & SchedulerApp, options?: NodeAppOptions): Promise<FullNodeApp & SchedulerNodeAppPart>;
47
- /** @throws {ZeltLifecycleStateError} */
48
- declare function onNode(app: HttpApp & SchedulerApp, options?: NodeAppOptions): Promise<HttpNodeApp & SchedulerNodeAppPart>;
49
- /** @throws {ZeltLifecycleStateError} */
50
- declare function onNode(app: CommandApp & SchedulerApp, options?: NodeAppOptions): Promise<CommandNodeApp & SchedulerNodeAppPart>;
51
- /** @throws {ZeltLifecycleStateError} */
52
- declare function onNode(app: HttpApp & CommandApp, options?: NodeAppOptions): Promise<FullNodeApp>;
53
- /** @throws {ZeltLifecycleStateError} */
54
- declare function onNode(app: HttpApp, options?: NodeAppOptions): Promise<HttpNodeApp>;
55
- /** @throws {ZeltLifecycleStateError} */
56
- declare function onNode(app: CommandApp, options?: NodeAppOptions): Promise<CommandNodeApp>;
36
+ type HasFeatureClass<F extends readonly ConfiguredFeature[], TFeature extends ConfiguredFeature> = Extract<F[number], TFeature> extends never ? false : true;
37
+ type WithFeatureClass<F extends readonly ConfiguredFeature[], TFeature extends ConfiguredFeature, TPart extends object> = HasFeatureClass<F, TFeature> extends true ? TPart : unknown;
38
+ type NodeAppForFeatures<F extends readonly ConfiguredFeature[]> = RuntimeApp<F> & EnvironmentNodeAppPart & (number extends F['length'] ? Partial<HttpNodeAppPart> : WithFeatureClass<F, HttpFeature, HttpNodeAppPart>);
39
+ declare function onNode<const F extends readonly ConfiguredFeature[]>(app: FeatureApp<F>, options?: NodeAppOptions): Promise<NodeAppForFeatures<F>>;
57
40
  //#endregion
58
41
  //#region src/process-env.adaptor.d.ts
59
42
  declare class ProcessEnvAdaptor extends EnvAdaptor {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/node-cli.config.ts","../src/on-node.ts","../src/process-env.adaptor.ts","../src/serve.lib.ts"],"mappings":";;;;cAIa,aAAA,SAAsB,SAAA;EACxB,GAAA,CAAA;EAIA,IAAA,CAAA;EAIA,IAAA,CAAK,IAAA;EAIL,WAAA,CAAY,IAAA;EAIZ,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA;EAIlC,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA;AAAA;;;KCXzC,aAAA;EAAA,SACM,IAAA;EAAA,SACA,QAAA;AAAA;AAAA,KAGC,YAAA;EAAA,SACD,OAAA;IAAW,IAAA;IAAc,OAAA;EAAA;EAAA,SACzB,QAAA,QAAgB,OAAA;AAAA;AAAA,KAGf,cAAA;EAAA,SACD,MAAA;AAAA;AAAA,KAKN,WAAA;EAAA,SACM,IAAA;AAAA;AAAA,KAGC,WAAA,GAAc,WAAA,GACxB,WAAA;EAAA,SACW,MAAA,GAAS,aAAA,YAAyB,aAAA,KAAkB,OAAA,CAAQ,YAAA;EAAA,SAC5D,QAAA,QAAgB,OAAA;AAAA;AAAA,KAGjB,cAAA,GAAiB,WAAA,GAC3B,WAAA;EAAA,SACW,WAAA,GAAc,IAAA,wBAA4B,OAAA,CAAQ,UAAA;EAAA,SAClD,QAAA,QAAgB,OAAA;AAAA;AAAA,KAGjB,oBAAA;EAAA,SACD,cAAA,QAAsB,OAAA;EAAA,SACtB,aAAA,QAAqB,OAAA;AAAA;AAAA,KAGpB,WAAA,GAAc,WAAA,GAAc,cAAA;;iBAqIxB,MAAA,CACd,GAAA,EAAK,OAAA,GAAU,UAAA,GAAa,YAAA,EAC5B,OAAA,GAAU,cAAA,GACT,OAAA,CAAQ,WAAA,GAAc,oBAAA;;iBAET,MAAA,CACd,GAAA,EAAK,OAAA,GAAU,YAAA,EACf,OAAA,GAAU,cAAA,GACT,OAAA,CAAQ,WAAA,GAAc,oBAAA;;iBAET,MAAA,CACd,GAAA,EAAK,UAAA,GAAa,YAAA,EAClB,OAAA,GAAU,cAAA,GACT,OAAA,CAAQ,cAAA,GAAiB,oBAAA;;iBAEZ,MAAA,CAAO,GAAA,EAAK,OAAA,GAAU,UAAA,EAAY,OAAA,GAAU,cAAA,GAAiB,OAAA,CAAQ,WAAA;AApLrF;AAAA,iBAsLgB,MAAA,CAAO,GAAA,EAAK,OAAA,EAAS,OAAA,GAAU,cAAA,GAAiB,OAAA,CAAQ,WAAA;;iBAExD,MAAA,CAAO,GAAA,EAAK,UAAA,EAAY,OAAA,GAAU,cAAA,GAAiB,OAAA,CAAQ,cAAA;;;cCxM9D,iBAAA,SAA0B,UAAA;EAC5B,GAAA,CAAI,GAAA;AAAA;;;KCDH,YAAA;EACV,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,WAAA;EACV,IAAA;EACA,OAAA;AAAA;AAAA,KAGG,OAAA;EACH,KAAA,GAAQ,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA;AAAA,cAa1B,QAAA,GACX,GAAA,EAAK,OAAA,EACL,iBAAA,GAAoB,YAAA,KAAiB,IAAA,EAAM,WAAA,YAC3C,aAAA,IAAiB,IAAA,EAAM,WAAA,cACtB,UAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/node-cli.config.ts","../src/on-node.ts","../src/process-env.adaptor.ts","../src/serve.lib.ts"],"mappings":";;;;cAIa,aAAA,SAAsB,SAAA;EACxB,GAAA,CAAA;EAIA,IAAA,CAAA;EAIA,IAAA,CAAK,IAAA;EAIL,WAAA,CAAY,IAAA;EAIZ,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA;EAIlC,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA;AAAA;;;KCjBzC,aAAA;EAAA,SACM,IAAA;EAAA,SACA,QAAA;AAAA;AAAA,KAGC,YAAA;EAAA,SACD,OAAA;IAAW,IAAA;IAAc,OAAA;EAAA;EAAA,SACzB,QAAA,QAAgB,OAAA;AAAA;AAAA,KAGf,cAAA;EAAA,SACD,MAAA;AAAA;AAAA,KAKN,sBAAA;EAAA,SACM,IAAA;EAAA,SACA,QAAA,QAAgB,OAAA;AAAA;AAAA,KAGtB,eAAA;EAAA,SACM,MAAA,GAAS,aAAA,YAAyB,aAAA,KAAkB,OAAA,CAAQ,YAAA;AAAA;AAAA,KAMlE,eAAA,oBAAmC,iBAAA,qBAAsC,iBAAA,IAC5E,OAAA,CAAQ,CAAA,UAAW,QAAA;AAAA,KAEhB,gBAAA,oBACgB,iBAAA,qBACF,iBAAA,0BAEf,eAAA,CAAgB,CAAA,EAAG,QAAA,iBAAyB,KAAA;AAAA,KAE3C,kBAAA,oBAAsC,iBAAA,MAAuB,UAAA,CAAW,CAAA,IAC3E,sBAAA,mBACgB,CAAA,aACZ,OAAA,CAAQ,eAAA,IACR,gBAAA,CAAiB,CAAA,EAAG,WAAA,EAAa,eAAA;AAAA,iBAsDvB,MAAA,0BAAgC,iBAAA,GAAA,CAC9C,GAAA,EAAK,UAAA,CAAW,CAAA,GAChB,OAAA,GAAU,cAAA,GACT,OAAA,CAAQ,kBAAA,CAAmB,CAAA;;;cCvGjB,iBAAA,SAA0B,UAAA;EAC5B,GAAA,CAAI,GAAA;AAAA;;;KCDH,YAAA;EACV,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,WAAA;EACV,IAAA;EACA,OAAA;AAAA;AAAA,KAGG,OAAA;EACH,KAAA,GAAQ,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA;AAAA,cAa1B,QAAA,GACX,GAAA,EAAK,OAAA,EACL,iBAAA,GAAoB,YAAA,KAAiB,IAAA,EAAM,WAAA,YAC3C,aAAA,IAAiB,IAAA,EAAM,WAAA,cACtB,UAAA"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createAdaptorServer, serve } from "@hono/node-server";
2
- import { CliConfig, Config, EnvAdaptor } from "@zeltjs/core";
2
+ import { CliConfig, Config, EnvAdaptor, HttpFeature } from "@zeltjs/core";
3
3
  //#region src/node-cli.config.ts
4
4
  function _ts_decorate$1(decorators, target, key, desc) {
5
5
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -72,75 +72,27 @@ const createListenForHttp = (appFetch, appShutdown) => {
72
72
  };
73
73
  };
74
74
  };
75
- const getStderr = () => globalThis.process.stderr;
76
75
  const getArgs = () => globalThis.process.argv.slice(2);
77
- const extractCapabilities = (app) => app;
78
- const buildHttpNodeApp = (caps, resolver, shutdown, args) => {
79
- if (typeof caps.fetch !== "function") return void 0;
80
- return {
81
- ...resolver,
82
- args,
83
- listen: createListenForHttp(caps.fetch, shutdown),
84
- shutdown
85
- };
86
- };
87
- const buildCommandNodeApp = (caps, resolver, shutdown, stderr, args) => {
88
- if (typeof caps.execCommand !== "function") return void 0;
89
- const coreExecCommand = caps.execCommand;
90
- const execCommand = async (argv) => {
91
- const result = await coreExecCommand(argv);
92
- if (result.exitCode === 1) stderr.write(`${result.reason.message}\n`);
93
- return result;
94
- };
95
- return {
96
- ...resolver,
76
+ const createNodeApp = (readyApp, shutdown, args) => {
77
+ const base = {
78
+ ...readyApp,
97
79
  args,
98
- execCommand,
99
80
  shutdown
100
81
  };
101
- };
102
- const buildSchedulerPart = (caps) => {
103
- if (typeof caps.startScheduler !== "function" || typeof caps.stopScheduler !== "function") return void 0;
82
+ const httpCaps = readyApp.getFeatureCapabilities(HttpFeature);
83
+ if (!httpCaps) return base;
104
84
  return {
105
- startScheduler: caps.startScheduler,
106
- stopScheduler: caps.stopScheduler
107
- };
108
- };
109
- const buildNodeApps = (caps, resolver, shutdown, stderr, args) => ({
110
- httpResult: buildHttpNodeApp(caps, resolver, shutdown, args),
111
- commandResult: buildCommandNodeApp(caps, resolver, shutdown, stderr, args),
112
- schedulerPart: buildSchedulerPart(caps)
113
- });
114
- const mergeNodeApps = (result, resolver, shutdown, args) => {
115
- const { httpResult, commandResult, schedulerPart } = result;
116
- const schedulerMethods = schedulerPart ?? {};
117
- if (httpResult && commandResult) return {
118
- ...httpResult,
119
- execCommand: commandResult.execCommand,
120
- ...schedulerMethods
121
- };
122
- if (httpResult) return {
123
- ...httpResult,
124
- ...schedulerMethods
125
- };
126
- if (commandResult) return {
127
- ...commandResult,
128
- ...schedulerMethods
129
- };
130
- return {
131
- ...resolver,
132
- args,
133
- shutdown,
134
- listen: () => new Promise(() => {}),
135
- ...schedulerMethods
85
+ ...base,
86
+ listen: createListenForHttp(httpCaps.fetch, shutdown)
136
87
  };
137
88
  };
138
89
  /** @throws {ZeltLifecycleStateError} */ async function onNode(app, options = {}) {
139
- app.addFallbackConfig(NodeCliConfig);
140
- app.addFallbackConfig(ProcessEnvAdaptor);
141
- const readyOptions = { warmup: options.warmup ?? true };
142
- const resolver = await app.ready(readyOptions);
143
- const cliConfig = resolver.get(NodeCliConfig);
90
+ const readyApp = await app.createRuntime({
91
+ fallbackConfigs: [NodeCliConfig, ProcessEnvAdaptor],
92
+ warmup: options.warmup ?? true
93
+ });
94
+ const cliConfig = await readyApp.get(NodeCliConfig);
95
+ const runtimeShutdown = readyApp.shutdown;
144
96
  let shuttingDown = false;
145
97
  const detachSignals = () => {
146
98
  cliConfig.offSignal("SIGINT", gracefulShutdown);
@@ -150,7 +102,7 @@ const mergeNodeApps = (result, resolver, shutdown, args) => {
150
102
  if (shuttingDown) return;
151
103
  shuttingDown = true;
152
104
  try {
153
- await app.shutdown();
105
+ await runtimeShutdown();
154
106
  } finally {
155
107
  detachSignals();
156
108
  }
@@ -160,10 +112,7 @@ const mergeNodeApps = (result, resolver, shutdown, args) => {
160
112
  };
161
113
  cliConfig.onSignal("SIGINT", gracefulShutdown);
162
114
  cliConfig.onSignal("SIGTERM", gracefulShutdown);
163
- const caps = extractCapabilities(app);
164
- const stderr = getStderr();
165
- const args = getArgs();
166
- return mergeNodeApps(buildNodeApps(caps, resolver, shutdown, stderr, args), resolver, shutdown, args);
115
+ return createNodeApp(readyApp, shutdown, getArgs());
167
116
  }
168
117
  //#endregion
169
118
  //#region src/serve.lib.ts
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["CliConfig","Config","NodeCliConfig","cwd","process","argv","exit","code","setExitCode","exitCode","onSignal","signal","handler","on","offSignal","off","Config","EnvAdaptor","ProcessEnvAdaptor","get","key","process","env","serve","NodeCliConfig","ProcessEnvAdaptor","createListenForHttp","appFetch","appShutdown","portOrOptions","listenOptions","port","hostname","server","serverReady","Promise","resolve","fetch","info","address","shutdown","reject","close","err","getStderr","globalThis","process","stderr","getArgs","argv","slice","extractCapabilities","app","buildHttpNodeApp","caps","resolver","args","undefined","listen","buildCommandNodeApp","execCommand","coreExecCommand","result","exitCode","write","reason","message","buildSchedulerPart","startScheduler","stopScheduler","buildNodeApps","httpResult","commandResult","schedulerPart","mergeNodeApps","schedulerMethods","fullApp","onNode","options","addFallbackConfig","readyOptions","warmup","ready","cliConfig","get","shuttingDown","detachSignals","offSignal","gracefulShutdown","catch","onSignal","serve","buildServeOptions","optionsOrCallback","extractCallback","maybeCallback","serveApp","app","options","callback","fetch","port","hostname"],"sources":["../src/node-cli.config.ts","../src/process-env.adaptor.ts","../src/on-node.ts","../src/serve.lib.ts"],"sourcesContent":["import type { Signal, SignalHandler } from '@zeltjs/core';\nimport { CliConfig, Config } from '@zeltjs/core';\n\n@Config\nexport class NodeCliConfig extends CliConfig {\n override cwd(): string {\n return process.cwd();\n }\n\n override argv(): readonly string[] {\n return process.argv;\n }\n\n override exit(code: number): never {\n process.exit(code);\n }\n\n override setExitCode(code: number): void {\n process.exitCode = code;\n }\n\n override onSignal(signal: Signal, handler: SignalHandler): void {\n process.on(signal, handler);\n }\n\n override offSignal(signal: Signal, handler: SignalHandler): void {\n process.off(signal, handler);\n }\n}\n","import { Config, EnvAdaptor } from '@zeltjs/core';\n\n@Config\nexport class ProcessEnvAdaptor extends EnvAdaptor {\n override get(key: string): string | undefined {\n return process.env[key];\n }\n}\n","import type { ServerType } from '@hono/node-server';\nimport { serve } from '@hono/node-server';\nimport type {\n CommandApp,\n ExecResult,\n HttpApp,\n ReadyOptions,\n ReadyResult,\n SchedulerApp,\n} from '@zeltjs/core';\n\nimport { NodeCliConfig } from './node-cli.config';\nimport { ProcessEnvAdaptor } from './process-env.adaptor';\n\ntype ListenOptions = {\n readonly port?: number;\n readonly hostname?: string;\n};\n\nexport type ServerHandle = {\n readonly address: { port: number; address: string };\n readonly shutdown: () => Promise<void>;\n};\n\nexport type NodeAppOptions = {\n readonly warmup?: boolean;\n};\n\nexport type { ExecResult } from '@zeltjs/core';\n\ntype NodeAppBase = {\n readonly args: readonly string[];\n};\n\nexport type HttpNodeApp = ReadyResult &\n NodeAppBase & {\n readonly listen: (portOrOptions?: number | ListenOptions) => Promise<ServerHandle>;\n readonly shutdown: () => Promise<void>;\n };\n\nexport type CommandNodeApp = ReadyResult &\n NodeAppBase & {\n readonly execCommand: (argv: readonly string[]) => Promise<ExecResult>;\n readonly shutdown: () => Promise<void>;\n };\n\nexport type SchedulerNodeAppPart = {\n readonly startScheduler: () => Promise<void>;\n readonly stopScheduler: () => Promise<void>;\n};\n\nexport type FullNodeApp = HttpNodeApp & CommandNodeApp;\n\nexport type NodeApp = HttpNodeApp | CommandNodeApp | FullNodeApp;\n\ntype Stderr = { write: (s: string) => void };\n\nconst createListenForHttp = (\n appFetch: (request: Request) => Promise<Response>,\n appShutdown: () => Promise<void>,\n): ((portOrOptions?: number | ListenOptions) => Promise<ServerHandle>) => {\n return async (portOrOptions?: number | ListenOptions): Promise<ServerHandle> => {\n const listenOptions: ListenOptions =\n typeof portOrOptions === 'number' ? { port: portOrOptions } : (portOrOptions ?? {});\n\n const port = listenOptions.port ?? 3000;\n const hostname = listenOptions.hostname ?? '0.0.0.0';\n\n let server!: ServerType;\n const serverReady = new Promise<{ port: number; address: string }>((resolve) => {\n server = serve({ fetch: appFetch, port, hostname }, (info) =>\n resolve({ port: info.port, address: info.address }),\n );\n });\n\n const address = await serverReady;\n\n const shutdown = async (): Promise<void> => {\n await new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n });\n await appShutdown();\n };\n\n return { address, shutdown };\n };\n};\n\nconst getStderr = (): Stderr => globalThis.process.stderr;\n\nconst getArgs = (): readonly string[] => globalThis.process.argv.slice(2);\n\ntype AppCapabilities = {\n fetch?: (request: Request) => Promise<Response>;\n execCommand?: (argv: readonly string[]) => Promise<ExecResult>;\n startScheduler?: () => Promise<void>;\n stopScheduler?: () => Promise<void>;\n};\n\ntype AnyApp = HttpApp | CommandApp | SchedulerApp | (HttpApp & CommandApp & SchedulerApp);\n\nconst extractCapabilities = (app: AnyApp): AppCapabilities => app;\n\ntype BuildResult = {\n httpResult: HttpNodeApp | undefined;\n commandResult: CommandNodeApp | undefined;\n schedulerPart: SchedulerNodeAppPart | undefined;\n};\n\nconst buildHttpNodeApp = (\n caps: AppCapabilities,\n resolver: ReadyResult,\n shutdown: () => Promise<void>,\n args: readonly string[],\n): HttpNodeApp | undefined => {\n if (typeof caps.fetch !== 'function') return undefined;\n return { ...resolver, args, listen: createListenForHttp(caps.fetch, shutdown), shutdown };\n};\n\nconst buildCommandNodeApp = (\n caps: AppCapabilities,\n resolver: ReadyResult,\n shutdown: () => Promise<void>,\n stderr: Stderr,\n args: readonly string[],\n): CommandNodeApp | undefined => {\n if (typeof caps.execCommand !== 'function') return undefined;\n\n const coreExecCommand = caps.execCommand;\n const execCommand = async (argv: readonly string[]): Promise<ExecResult> => {\n const result = await coreExecCommand(argv);\n if (result.exitCode === 1) {\n stderr.write(`${result.reason.message}\\n`);\n }\n return result;\n };\n\n return { ...resolver, args, execCommand, shutdown };\n};\n\nconst buildSchedulerPart = (caps: AppCapabilities): SchedulerNodeAppPart | undefined => {\n if (typeof caps.startScheduler !== 'function' || typeof caps.stopScheduler !== 'function')\n return undefined;\n return {\n startScheduler: caps.startScheduler,\n stopScheduler: caps.stopScheduler,\n };\n};\n\nconst buildNodeApps = (\n caps: AppCapabilities,\n resolver: ReadyResult,\n shutdown: () => Promise<void>,\n stderr: Stderr,\n args: readonly string[],\n): BuildResult => ({\n httpResult: buildHttpNodeApp(caps, resolver, shutdown, args),\n commandResult: buildCommandNodeApp(caps, resolver, shutdown, stderr, args),\n schedulerPart: buildSchedulerPart(caps),\n});\n\nconst mergeNodeApps = (\n result: BuildResult,\n resolver: ReadyResult,\n shutdown: () => Promise<void>,\n args: readonly string[],\n): NodeApp => {\n const { httpResult, commandResult, schedulerPart } = result;\n const schedulerMethods = schedulerPart ?? {};\n\n if (httpResult && commandResult) {\n const fullApp: FullNodeApp = {\n ...httpResult,\n execCommand: commandResult.execCommand,\n ...schedulerMethods,\n };\n return fullApp;\n }\n if (httpResult) return { ...httpResult, ...schedulerMethods };\n if (commandResult) return { ...commandResult, ...schedulerMethods };\n return { ...resolver, args, shutdown, listen: () => new Promise(() => {}), ...schedulerMethods };\n};\n\n/** @throws {ZeltLifecycleStateError} */\nexport function onNode(\n app: HttpApp & CommandApp & SchedulerApp,\n options?: NodeAppOptions,\n): Promise<FullNodeApp & SchedulerNodeAppPart>;\n/** @throws {ZeltLifecycleStateError} */\nexport function onNode(\n app: HttpApp & SchedulerApp,\n options?: NodeAppOptions,\n): Promise<HttpNodeApp & SchedulerNodeAppPart>;\n/** @throws {ZeltLifecycleStateError} */\nexport function onNode(\n app: CommandApp & SchedulerApp,\n options?: NodeAppOptions,\n): Promise<CommandNodeApp & SchedulerNodeAppPart>;\n/** @throws {ZeltLifecycleStateError} */\nexport function onNode(app: HttpApp & CommandApp, options?: NodeAppOptions): Promise<FullNodeApp>;\n/** @throws {ZeltLifecycleStateError} */\nexport function onNode(app: HttpApp, options?: NodeAppOptions): Promise<HttpNodeApp>;\n/** @throws {ZeltLifecycleStateError} */\nexport function onNode(app: CommandApp, options?: NodeAppOptions): Promise<CommandNodeApp>;\n/** @throws {ZeltLifecycleStateError} */\nexport async function onNode(app: AnyApp, options: NodeAppOptions = {}): Promise<NodeApp> {\n app.addFallbackConfig(NodeCliConfig);\n app.addFallbackConfig(ProcessEnvAdaptor);\n\n const readyOptions: ReadyOptions = { warmup: options.warmup ?? true };\n const resolver = await app.ready(readyOptions);\n\n const cliConfig = resolver.get(NodeCliConfig);\n\n let shuttingDown = false;\n const detachSignals = (): void => {\n cliConfig.offSignal('SIGINT', gracefulShutdown);\n cliConfig.offSignal('SIGTERM', gracefulShutdown);\n };\n\n const shutdown = async (): Promise<void> => {\n if (shuttingDown) return;\n shuttingDown = true;\n try {\n await app.shutdown();\n } finally {\n detachSignals();\n }\n };\n\n const gracefulShutdown = (): void => {\n void shutdown().catch(() => {});\n };\n\n cliConfig.onSignal('SIGINT', gracefulShutdown);\n cliConfig.onSignal('SIGTERM', gracefulShutdown);\n\n const caps = extractCapabilities(app);\n const stderr = getStderr();\n const args = getArgs();\n const result = buildNodeApps(caps, resolver, shutdown, stderr, args);\n\n return mergeNodeApps(result, resolver, shutdown, args);\n}\n","import type { ServerType } from '@hono/node-server';\nimport { serve } from '@hono/node-server';\n\nexport type ServeOptions = {\n port?: number;\n hostname?: string;\n};\n\nexport type AddressInfo = {\n port: number;\n address: string;\n};\n\ntype AppLike = {\n fetch: (request: Request) => Promise<Response>;\n};\n\nconst buildServeOptions = (\n optionsOrCallback: ServeOptions | ((info: AddressInfo) => void) | undefined,\n): ServeOptions => (typeof optionsOrCallback === 'function' ? {} : (optionsOrCallback ?? {}));\n\nconst extractCallback = (\n optionsOrCallback: ServeOptions | ((info: AddressInfo) => void) | undefined,\n maybeCallback: ((info: AddressInfo) => void) | undefined,\n): ((info: AddressInfo) => void) | undefined =>\n typeof optionsOrCallback === 'function' ? optionsOrCallback : maybeCallback;\n\nexport const serveApp = (\n app: AppLike,\n optionsOrCallback?: ServeOptions | ((info: AddressInfo) => void),\n maybeCallback?: (info: AddressInfo) => void,\n): ServerType => {\n const options = buildServeOptions(optionsOrCallback);\n const callback = extractCallback(optionsOrCallback, maybeCallback);\n\n return serve(\n {\n fetch: app.fetch,\n port: options.port ?? 3000,\n hostname: options.hostname ?? '0.0.0.0',\n },\n callback,\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["CliConfig","Config","NodeCliConfig","cwd","process","argv","exit","code","setExitCode","exitCode","onSignal","signal","handler","on","offSignal","off","Config","EnvAdaptor","ProcessEnvAdaptor","get","key","process","env","serve","HttpFeature","NodeCliConfig","ProcessEnvAdaptor","createListenForHttp","appFetch","appShutdown","portOrOptions","listenOptions","port","hostname","server","serverReady","Promise","resolve","fetch","info","address","shutdown","reject","close","err","getArgs","globalThis","process","argv","slice","createNodeApp","readyApp","args","base","httpCaps","getFeatureCapabilities","listen","onNode","app","options","createRuntime","fallbackConfigs","warmup","cliConfig","get","runtimeShutdown","shuttingDown","detachSignals","offSignal","gracefulShutdown","catch","onSignal","serve","buildServeOptions","optionsOrCallback","extractCallback","maybeCallback","serveApp","app","options","callback","fetch","port","hostname"],"sources":["../src/node-cli.config.ts","../src/process-env.adaptor.ts","../src/on-node.ts","../src/serve.lib.ts"],"sourcesContent":["import type { Signal, SignalHandler } from '@zeltjs/core';\nimport { CliConfig, Config } from '@zeltjs/core';\n\n@Config\nexport class NodeCliConfig extends CliConfig {\n override cwd(): string {\n return process.cwd();\n }\n\n override argv(): readonly string[] {\n return process.argv;\n }\n\n override exit(code: number): never {\n process.exit(code);\n }\n\n override setExitCode(code: number): void {\n process.exitCode = code;\n }\n\n override onSignal(signal: Signal, handler: SignalHandler): void {\n process.on(signal, handler);\n }\n\n override offSignal(signal: Signal, handler: SignalHandler): void {\n process.off(signal, handler);\n }\n}\n","import { Config, EnvAdaptor } from '@zeltjs/core';\n\n@Config\nexport class ProcessEnvAdaptor extends EnvAdaptor {\n override get(key: string): string | undefined {\n return process.env[key];\n }\n}\n","import type { ServerType } from '@hono/node-server';\nimport { serve } from '@hono/node-server';\nimport type { ConfiguredFeature, FeatureApp, RuntimeApp } from '@zeltjs/core';\nimport { HttpFeature } from '@zeltjs/core';\n\nimport { NodeCliConfig } from './node-cli.config';\nimport { ProcessEnvAdaptor } from './process-env.adaptor';\n\ntype ListenOptions = {\n readonly port?: number;\n readonly hostname?: string;\n};\n\nexport type ServerHandle = {\n readonly address: { port: number; address: string };\n readonly shutdown: () => Promise<void>;\n};\n\nexport type NodeAppOptions = {\n readonly warmup?: boolean;\n};\n\nexport type { ExecResult } from '@zeltjs/core';\n\ntype EnvironmentNodeAppPart = {\n readonly args: readonly string[];\n readonly shutdown: () => Promise<void>;\n};\n\ntype HttpNodeAppPart = {\n readonly listen: (portOrOptions?: number | ListenOptions) => Promise<ServerHandle>;\n};\n\nexport type NodeApp = (RuntimeApp<readonly ConfiguredFeature[]> & EnvironmentNodeAppPart) &\n Partial<HttpNodeAppPart>;\n\ntype HasFeatureClass<F extends readonly ConfiguredFeature[], TFeature extends ConfiguredFeature> =\n Extract<F[number], TFeature> extends never ? false : true;\n\ntype WithFeatureClass<\n F extends readonly ConfiguredFeature[],\n TFeature extends ConfiguredFeature,\n TPart extends object,\n> = HasFeatureClass<F, TFeature> extends true ? TPart : unknown;\n\ntype NodeAppForFeatures<F extends readonly ConfiguredFeature[]> = RuntimeApp<F> &\n EnvironmentNodeAppPart &\n (number extends F['length']\n ? Partial<HttpNodeAppPart>\n : WithFeatureClass<F, HttpFeature, HttpNodeAppPart>);\n\nconst createListenForHttp = (\n appFetch: (request: Request) => Promise<Response>,\n appShutdown: () => Promise<void>,\n): ((portOrOptions?: number | ListenOptions) => Promise<ServerHandle>) => {\n return async (portOrOptions?: number | ListenOptions): Promise<ServerHandle> => {\n const listenOptions: ListenOptions =\n typeof portOrOptions === 'number' ? { port: portOrOptions } : (portOrOptions ?? {});\n\n const port = listenOptions.port ?? 3000;\n const hostname = listenOptions.hostname ?? '0.0.0.0';\n\n let server!: ServerType;\n const serverReady = new Promise<{ port: number; address: string }>((resolve) => {\n server = serve({ fetch: appFetch, port, hostname }, (info) =>\n resolve({ port: info.port, address: info.address }),\n );\n });\n\n const address = await serverReady;\n\n const shutdown = async (): Promise<void> => {\n await new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n });\n await appShutdown();\n };\n\n return { address, shutdown };\n };\n};\n\nconst getArgs = (): readonly string[] => globalThis.process.argv.slice(2);\n\nconst createNodeApp = (\n readyApp: RuntimeApp<readonly ConfiguredFeature[]>,\n shutdown: () => Promise<void>,\n args: readonly string[],\n): NodeApp => {\n const base: RuntimeApp<readonly ConfiguredFeature[]> & EnvironmentNodeAppPart = {\n ...readyApp,\n args,\n shutdown,\n };\n\n const httpCaps = readyApp.getFeatureCapabilities(HttpFeature);\n if (!httpCaps) return base;\n return {\n ...base,\n listen: createListenForHttp(httpCaps.fetch, shutdown),\n };\n};\n\nexport function onNode<const F extends readonly ConfiguredFeature[]>(\n app: FeatureApp<F>,\n options?: NodeAppOptions,\n): Promise<NodeAppForFeatures<F>>;\n\n/** @throws {ZeltLifecycleStateError} */\nexport async function onNode<const F extends readonly ConfiguredFeature[]>(\n app: FeatureApp<F>,\n options: NodeAppOptions = {},\n): Promise<NodeApp> {\n const readyApp = await app.createRuntime({\n fallbackConfigs: [NodeCliConfig, ProcessEnvAdaptor],\n warmup: options.warmup ?? true,\n });\n\n const cliConfig = await readyApp.get(NodeCliConfig);\n const runtimeShutdown = readyApp.shutdown;\n\n let shuttingDown = false;\n const detachSignals = (): void => {\n cliConfig.offSignal('SIGINT', gracefulShutdown);\n cliConfig.offSignal('SIGTERM', gracefulShutdown);\n };\n\n const shutdown = async (): Promise<void> => {\n if (shuttingDown) return;\n shuttingDown = true;\n try {\n await runtimeShutdown();\n } finally {\n detachSignals();\n }\n };\n\n const gracefulShutdown = (): void => {\n void shutdown().catch(() => {});\n };\n\n cliConfig.onSignal('SIGINT', gracefulShutdown);\n cliConfig.onSignal('SIGTERM', gracefulShutdown);\n\n const args = getArgs();\n\n return createNodeApp(readyApp, shutdown, args);\n}\n","import type { ServerType } from '@hono/node-server';\nimport { serve } from '@hono/node-server';\n\nexport type ServeOptions = {\n port?: number;\n hostname?: string;\n};\n\nexport type AddressInfo = {\n port: number;\n address: string;\n};\n\ntype AppLike = {\n fetch: (request: Request) => Promise<Response>;\n};\n\nconst buildServeOptions = (\n optionsOrCallback: ServeOptions | ((info: AddressInfo) => void) | undefined,\n): ServeOptions => (typeof optionsOrCallback === 'function' ? {} : (optionsOrCallback ?? {}));\n\nconst extractCallback = (\n optionsOrCallback: ServeOptions | ((info: AddressInfo) => void) | undefined,\n maybeCallback: ((info: AddressInfo) => void) | undefined,\n): ((info: AddressInfo) => void) | undefined =>\n typeof optionsOrCallback === 'function' ? optionsOrCallback : maybeCallback;\n\nexport const serveApp = (\n app: AppLike,\n optionsOrCallback?: ServeOptions | ((info: AddressInfo) => void),\n maybeCallback?: (info: AddressInfo) => void,\n): ServerType => {\n const options = buildServeOptions(optionsOrCallback);\n const callback = extractCallback(optionsOrCallback, maybeCallback);\n\n return serve(\n {\n fetch: app.fetch,\n port: options.port ?? 3000,\n hostname: options.hostname ?? '0.0.0.0',\n },\n callback,\n );\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeltjs/adapter-node",
3
- "version": "0.8.1",
3
+ "version": "0.8.2-canary.1",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -13,23 +13,33 @@
13
13
  },
14
14
  "exports": {
15
15
  ".": {
16
- "types": "./dist/index.d.ts",
17
- "import": "./dist/index.js"
16
+ "import": {
17
+ "types": "./dist/index.d.ts",
18
+ "default": "./dist/index.js"
19
+ },
20
+ "require": {
21
+ "types": "./dist/index.d.cts",
22
+ "default": "./dist/index.cjs"
23
+ }
18
24
  }
19
25
  },
20
26
  "files": [
21
27
  "dist"
22
28
  ],
23
29
  "dependencies": {
24
- "@hono/node-server": "2.0.1",
25
- "@zeltjs/core": "0.8.1"
30
+ "@hono/node-server": "2.0.1"
31
+ },
32
+ "peerDependencies": {
33
+ "@zeltjs/core": "0.8.2-canary.1"
26
34
  },
27
35
  "devDependencies": {
28
- "@types/node": "22.19.17"
36
+ "@types/node": "22.19.17",
37
+ "@zeltjs/core": "0.8.2-canary.1"
29
38
  },
30
39
  "volta": {
31
40
  "extends": "../../package.json"
32
41
  },
42
+ "main": "./dist/index.cjs",
33
43
  "scripts": {
34
44
  "build": "tsdown",
35
45
  "test": "vitest run",