alepha 0.14.0 → 0.14.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.
Files changed (94) hide show
  1. package/dist/api/audits/index.d.ts +417 -338
  2. package/dist/api/audits/index.d.ts.map +1 -1
  3. package/dist/api/files/index.d.ts +80 -1
  4. package/dist/api/files/index.d.ts.map +1 -1
  5. package/dist/api/jobs/index.d.ts +236 -157
  6. package/dist/api/jobs/index.d.ts.map +1 -1
  7. package/dist/api/notifications/index.d.ts +21 -1
  8. package/dist/api/notifications/index.d.ts.map +1 -1
  9. package/dist/api/parameters/index.d.ts +451 -4
  10. package/dist/api/parameters/index.d.ts.map +1 -1
  11. package/dist/api/users/index.d.ts +833 -830
  12. package/dist/api/users/index.d.ts.map +1 -1
  13. package/dist/cli/index.d.ts +212 -29
  14. package/dist/cli/index.d.ts.map +1 -1
  15. package/dist/cli/index.js +320 -219
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/command/index.d.ts +206 -9
  18. package/dist/command/index.d.ts.map +1 -1
  19. package/dist/command/index.js +306 -69
  20. package/dist/command/index.js.map +1 -1
  21. package/dist/core/index.browser.js.map +1 -1
  22. package/dist/core/index.d.ts +1 -1
  23. package/dist/core/index.js.map +1 -1
  24. package/dist/core/index.native.js.map +1 -1
  25. package/dist/file/index.d.ts.map +1 -1
  26. package/dist/file/index.js.map +1 -1
  27. package/dist/orm/index.d.ts +180 -126
  28. package/dist/orm/index.d.ts.map +1 -1
  29. package/dist/orm/index.js +486 -512
  30. package/dist/orm/index.js.map +1 -1
  31. package/dist/queue/redis/index.js +2 -4
  32. package/dist/queue/redis/index.js.map +1 -1
  33. package/dist/redis/index.d.ts +400 -29
  34. package/dist/redis/index.d.ts.map +1 -1
  35. package/dist/redis/index.js +412 -21
  36. package/dist/redis/index.js.map +1 -1
  37. package/dist/scheduler/index.d.ts +6 -6
  38. package/dist/security/index.d.ts +28 -28
  39. package/dist/security/index.d.ts.map +1 -1
  40. package/dist/server/auth/index.d.ts +155 -155
  41. package/dist/server/core/index.d.ts +0 -1
  42. package/dist/server/core/index.d.ts.map +1 -1
  43. package/dist/server/core/index.js.map +1 -1
  44. package/dist/server/health/index.d.ts +17 -17
  45. package/dist/server/helmet/index.d.ts +4 -1
  46. package/dist/server/helmet/index.d.ts.map +1 -1
  47. package/dist/server/multipart/index.d.ts.map +1 -1
  48. package/dist/server/multipart/index.js.map +1 -1
  49. package/dist/server/proxy/index.js.map +1 -1
  50. package/dist/topic/redis/index.js +3 -3
  51. package/dist/topic/redis/index.js.map +1 -1
  52. package/dist/vite/index.js +9 -6
  53. package/dist/vite/index.js.map +1 -1
  54. package/package.json +3 -3
  55. package/src/cli/apps/AlephaCli.ts +8 -3
  56. package/src/cli/apps/AlephaPackageBuilderCli.ts +3 -0
  57. package/src/cli/atoms/changelogOptions.ts +45 -0
  58. package/src/cli/commands/ChangelogCommands.ts +187 -317
  59. package/src/cli/commands/DeployCommands.ts +118 -0
  60. package/src/cli/commands/DrizzleCommands.ts +28 -8
  61. package/src/cli/commands/ViteCommands.ts +23 -9
  62. package/src/cli/defineConfig.ts +15 -0
  63. package/src/cli/index.ts +3 -0
  64. package/src/cli/services/AlephaCliUtils.ts +4 -21
  65. package/src/cli/services/GitMessageParser.ts +77 -0
  66. package/src/command/helpers/EnvUtils.ts +37 -0
  67. package/src/command/index.ts +3 -1
  68. package/src/command/primitives/$command.ts +172 -6
  69. package/src/command/providers/CliProvider.ts +424 -91
  70. package/src/core/Alepha.ts +1 -1
  71. package/src/file/providers/NodeFileSystemProvider.ts +3 -1
  72. package/src/orm/index.ts +8 -4
  73. package/src/orm/interfaces/PgQueryWhere.ts +1 -26
  74. package/src/orm/providers/drivers/BunPostgresProvider.ts +225 -0
  75. package/src/orm/providers/drivers/BunSqliteProvider.ts +180 -0
  76. package/src/orm/providers/drivers/DatabaseProvider.ts +25 -0
  77. package/src/orm/providers/drivers/NodePostgresProvider.ts +0 -25
  78. package/src/orm/services/QueryManager.ts +10 -125
  79. package/src/queue/redis/providers/RedisQueueProvider.ts +2 -7
  80. package/src/redis/index.ts +65 -3
  81. package/src/redis/providers/BunRedisProvider.ts +304 -0
  82. package/src/redis/providers/BunRedisSubscriberProvider.ts +94 -0
  83. package/src/redis/providers/NodeRedisProvider.ts +280 -0
  84. package/src/redis/providers/NodeRedisSubscriberProvider.ts +94 -0
  85. package/src/redis/providers/RedisProvider.ts +134 -140
  86. package/src/redis/providers/RedisSubscriberProvider.ts +58 -49
  87. package/src/server/core/providers/BunHttpServerProvider.ts +0 -3
  88. package/src/server/core/providers/ServerBodyParserProvider.ts +3 -1
  89. package/src/server/core/providers/ServerProvider.ts +7 -4
  90. package/src/server/multipart/providers/ServerMultipartProvider.ts +3 -1
  91. package/src/server/proxy/providers/ServerProxyProvider.ts +1 -1
  92. package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
  93. package/src/vite/tasks/buildServer.ts +1 -0
  94. package/src/orm/services/PgJsonQueryManager.ts +0 -511
@@ -1,56 +1,65 @@
1
- import { $hook, $inject, Alepha } from "alepha";
2
- import { $logger } from "alepha/logger";
3
- import type { RedisClient } from "./RedisProvider.ts";
4
- import { RedisProvider } from "./RedisProvider.ts";
5
-
6
- export class RedisSubscriberProvider {
7
- protected readonly log = $logger();
8
- protected readonly alepha = $inject(Alepha);
9
- protected readonly redisProvider: RedisProvider = $inject(RedisProvider);
10
- protected readonly client: RedisClient = this.createClient();
11
-
12
- public get subscriber(): RedisClient {
13
- if (!this.client.isReady) {
14
- throw new Error("Redis client is not ready");
15
- }
16
-
17
- return this.client;
18
- }
19
-
20
- protected readonly start = $hook({
21
- on: "start",
22
- handler: () => this.connect(),
23
- });
24
-
25
- protected readonly stop = $hook({
26
- on: "stop",
27
- handler: () => this.close(),
28
- });
29
-
30
- public async connect(): Promise<void> {
31
- this.log.debug("Connecting...");
32
- await this.client.connect();
33
- this.log.info("Connection OK");
34
- }
1
+ /**
2
+ * Abstract Redis subscriber provider interface.
3
+ *
4
+ * This abstract class defines the common interface for Redis pub/sub subscriptions.
5
+ * Implementations include:
6
+ * - {@link NodeRedisSubscriberProvider} - Uses `@redis/client` for Node.js runtime
7
+ * - {@link BunRedisSubscriberProvider} - Uses Bun's native `RedisClient` for Bun runtime
8
+ *
9
+ * Redis requires separate connections for pub/sub operations, so this provider
10
+ * creates a dedicated connection for subscriptions.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * // Inject the abstract provider - runtime selects the implementation
15
+ * const subscriber = alepha.inject(RedisSubscriberProvider);
16
+ *
17
+ * // Subscribe to a channel
18
+ * await subscriber.subscribe("my-channel", (message, channel) => {
19
+ * console.log(`Received: ${message} on ${channel}`);
20
+ * });
21
+ * ```
22
+ */
23
+ export abstract class RedisSubscriberProvider {
24
+ /**
25
+ * Whether the Redis subscriber client is ready to accept commands.
26
+ */
27
+ public abstract readonly isReady: boolean;
35
28
 
36
- public async close(): Promise<void> {
37
- this.log.debug("Closing connection...");
38
- this.subscriber.close();
39
- this.log.info("Connection closed");
40
- }
29
+ /**
30
+ * Connect to the Redis server for subscriptions.
31
+ */
32
+ public abstract connect(): Promise<void>;
41
33
 
42
34
  /**
43
- * Redis subscriber client factory method.
35
+ * Close the subscriber connection.
44
36
  */
45
- protected createClient(): RedisClient {
46
- const client = this.redisProvider.duplicate();
37
+ public abstract close(): Promise<void>;
47
38
 
48
- client.on("error", (error) => {
49
- if (this.alepha.isStarted()) {
50
- this.log.error(error);
51
- }
52
- });
39
+ /**
40
+ * Subscribe to a channel.
41
+ *
42
+ * @param channel The channel name.
43
+ * @param callback The callback to invoke when a message is received.
44
+ */
45
+ public abstract subscribe(
46
+ channel: string,
47
+ callback: SubscribeCallback,
48
+ ): Promise<void>;
53
49
 
54
- return client;
55
- }
50
+ /**
51
+ * Unsubscribe from a channel.
52
+ *
53
+ * @param channel The channel name.
54
+ * @param callback Optional specific callback to remove.
55
+ */
56
+ public abstract unsubscribe(
57
+ channel: string,
58
+ callback?: SubscribeCallback,
59
+ ): Promise<void>;
56
60
  }
61
+
62
+ /**
63
+ * Callback for subscription messages.
64
+ */
65
+ export type SubscribeCallback = (message: string, channel: string) => void;
@@ -21,9 +21,6 @@ declare module "alepha" {
21
21
  interface Env extends Partial<Static<typeof envSchema>> {}
22
22
  }
23
23
 
24
- // Type declaration for Bun global (only when running in Bun runtime)
25
- declare const Bun: any;
26
-
27
24
  export class BunHttpServerProvider extends ServerProvider {
28
25
  protected readonly alepha = $inject(Alepha);
29
26
  protected readonly dateTimeProvider = $inject(DateTimeProvider);
@@ -36,7 +36,9 @@ export class ServerBodyParserProvider {
36
36
  } else if (request.raw.node?.req) {
37
37
  // convert Node.js IncomingMessage to Web ReadableStream
38
38
  // TODO: check performance impact, it's better to directly read from Node stream!
39
- stream = WebStream.from(request.raw.node.req) as ReadableStream;
39
+ stream = WebStream.from(
40
+ request.raw.node.req,
41
+ ) as unknown as ReadableStream;
40
42
  }
41
43
 
42
44
  if (!stream) {
@@ -212,10 +212,13 @@ export class ServerProvider {
212
212
 
213
213
  // if response.body is node stream
214
214
  if (response.body instanceof Readable) {
215
- ev.res = new Response(Readable.toWeb(response.body) as ReadableStream, {
216
- status: response.status,
217
- headers: response.headers,
218
- });
215
+ ev.res = new Response(
216
+ Readable.toWeb(response.body) as unknown as ReadableStream,
217
+ {
218
+ status: response.status,
219
+ headers: response.headers,
220
+ },
221
+ );
219
222
  return;
220
223
  }
221
224
 
@@ -59,7 +59,9 @@ export class ServerMultipartProvider {
59
59
  webRequest = new Request(request.url, {
60
60
  method: request.method,
61
61
  headers: request.headers,
62
- body: WebStream.from(request.raw.node.req) as ReadableStream,
62
+ body: WebStream.from(
63
+ request.raw.node.req,
64
+ ) as unknown as ReadableStream,
63
65
  duplex: "half",
64
66
  } as RequestInit & { duplex: "half" });
65
67
  }
@@ -116,7 +116,7 @@ export class ServerProxyProvider {
116
116
 
117
117
  if (req.raw?.node?.req) {
118
118
  const nodeReq = req.raw.node.req;
119
- return WebStream.from(nodeReq) as ReadableStream;
119
+ return WebStream.from(nodeReq) as unknown as ReadableStream;
120
120
  }
121
121
  }
122
122
  }
@@ -42,7 +42,7 @@ export class RedisTopicProvider extends TopicProvider {
42
42
  * Publish a message to a topic.
43
43
  */
44
44
  public async publish(topic: string, message: string): Promise<void> {
45
- await this.redisProvider.publisher.publish(this.prefix(topic), message);
45
+ await this.redisProvider.publish(this.prefix(topic), message);
46
46
  }
47
47
 
48
48
  /**
@@ -53,7 +53,7 @@ export class RedisTopicProvider extends TopicProvider {
53
53
  callback: SubscribeCallback,
54
54
  ): Promise<UnSubscribeFn> {
55
55
  const topic = this.prefix(name);
56
- await this.redisSubscriberProvider.subscriber.subscribe(topic, callback);
56
+ await this.redisSubscriberProvider.subscribe(topic, callback);
57
57
 
58
58
  return () => this.unsubscribe(name, callback);
59
59
  }
@@ -67,6 +67,6 @@ export class RedisTopicProvider extends TopicProvider {
67
67
  ): Promise<void> {
68
68
  const topic = this.prefix(name);
69
69
 
70
- await this.redisSubscriberProvider.subscriber.unsubscribe(topic, callback);
70
+ await this.redisSubscriberProvider.unsubscribe(topic, callback);
71
71
  }
72
72
  }
@@ -91,6 +91,7 @@ export async function buildServer(
91
91
  minify: true,
92
92
  chunkSizeWarningLimit: 10000,
93
93
  rollupOptions: {
94
+ external: ["bun"],
94
95
  output: {
95
96
  entryFileNames: "[hash].js",
96
97
  chunkFileNames: "[hash].js",