cooper-stack 0.1.0

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 (97) hide show
  1. package/dist/ai.d.ts +60 -0
  2. package/dist/ai.d.ts.map +1 -0
  3. package/dist/ai.js +66 -0
  4. package/dist/ai.js.map +1 -0
  5. package/dist/api.d.ts +31 -0
  6. package/dist/api.d.ts.map +1 -0
  7. package/dist/api.js +40 -0
  8. package/dist/api.js.map +1 -0
  9. package/dist/auth.d.ts +13 -0
  10. package/dist/auth.d.ts.map +1 -0
  11. package/dist/auth.js +16 -0
  12. package/dist/auth.js.map +1 -0
  13. package/dist/bridge.d.ts +15 -0
  14. package/dist/bridge.d.ts.map +1 -0
  15. package/dist/bridge.js +217 -0
  16. package/dist/bridge.js.map +1 -0
  17. package/dist/cache.d.ts +27 -0
  18. package/dist/cache.d.ts.map +1 -0
  19. package/dist/cache.js +69 -0
  20. package/dist/cache.js.map +1 -0
  21. package/dist/cron.d.ts +22 -0
  22. package/dist/cron.d.ts.map +1 -0
  23. package/dist/cron.js +26 -0
  24. package/dist/cron.js.map +1 -0
  25. package/dist/db.d.ts +46 -0
  26. package/dist/db.d.ts.map +1 -0
  27. package/dist/db.js +158 -0
  28. package/dist/db.js.map +1 -0
  29. package/dist/error.d.ts +18 -0
  30. package/dist/error.d.ts.map +1 -0
  31. package/dist/error.js +30 -0
  32. package/dist/error.js.map +1 -0
  33. package/dist/index.d.ts +18 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +18 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/islands.d.ts +16 -0
  38. package/dist/islands.d.ts.map +1 -0
  39. package/dist/islands.js +23 -0
  40. package/dist/islands.js.map +1 -0
  41. package/dist/middleware.d.ts +20 -0
  42. package/dist/middleware.d.ts.map +1 -0
  43. package/dist/middleware.js +26 -0
  44. package/dist/middleware.js.map +1 -0
  45. package/dist/nats.d.ts +46 -0
  46. package/dist/nats.d.ts.map +1 -0
  47. package/dist/nats.js +157 -0
  48. package/dist/nats.js.map +1 -0
  49. package/dist/pubsub.d.ts +27 -0
  50. package/dist/pubsub.d.ts.map +1 -0
  51. package/dist/pubsub.js +152 -0
  52. package/dist/pubsub.js.map +1 -0
  53. package/dist/queue.d.ts +39 -0
  54. package/dist/queue.d.ts.map +1 -0
  55. package/dist/queue.js +298 -0
  56. package/dist/queue.js.map +1 -0
  57. package/dist/rateLimit.d.ts +29 -0
  58. package/dist/rateLimit.d.ts.map +1 -0
  59. package/dist/rateLimit.js +70 -0
  60. package/dist/rateLimit.js.map +1 -0
  61. package/dist/registry.d.ts +75 -0
  62. package/dist/registry.d.ts.map +1 -0
  63. package/dist/registry.js +41 -0
  64. package/dist/registry.js.map +1 -0
  65. package/dist/secrets.d.ts +10 -0
  66. package/dist/secrets.d.ts.map +1 -0
  67. package/dist/secrets.js +35 -0
  68. package/dist/secrets.js.map +1 -0
  69. package/dist/ssr.d.ts +53 -0
  70. package/dist/ssr.d.ts.map +1 -0
  71. package/dist/ssr.js +39 -0
  72. package/dist/ssr.js.map +1 -0
  73. package/dist/storage.d.ts +28 -0
  74. package/dist/storage.d.ts.map +1 -0
  75. package/dist/storage.js +61 -0
  76. package/dist/storage.js.map +1 -0
  77. package/package.json +40 -0
  78. package/src/ai.ts +99 -0
  79. package/src/api.ts +56 -0
  80. package/src/auth.ts +16 -0
  81. package/src/bridge.ts +267 -0
  82. package/src/cache.ts +86 -0
  83. package/src/cron.ts +32 -0
  84. package/src/db.ts +211 -0
  85. package/src/error.ts +44 -0
  86. package/src/index.ts +17 -0
  87. package/src/islands.ts +28 -0
  88. package/src/middleware.ts +27 -0
  89. package/src/nats.ts +186 -0
  90. package/src/pubsub.ts +208 -0
  91. package/src/queue.ts +414 -0
  92. package/src/rateLimit.ts +89 -0
  93. package/src/registry.ts +98 -0
  94. package/src/secrets.ts +40 -0
  95. package/src/ssr.ts +58 -0
  96. package/src/storage.ts +79 -0
  97. package/tsconfig.json +17 -0
package/dist/cron.js ADDED
@@ -0,0 +1,26 @@
1
+ import { registry } from "./registry.js";
2
+ /**
3
+ * Declare a cron job.
4
+ *
5
+ * ```ts
6
+ * export const cleanup = cron("cleanup", {
7
+ * schedule: "every 1 hour",
8
+ * handler: async () => {
9
+ * await db.query("DELETE FROM sessions WHERE expires_at < NOW()");
10
+ * },
11
+ * });
12
+ * ```
13
+ */
14
+ export function cron(name, config) {
15
+ registry.registerCron(name, {
16
+ name,
17
+ schedule: config.schedule,
18
+ handler: config.handler,
19
+ });
20
+ return {
21
+ _cooper_type: "cron",
22
+ name,
23
+ schedule: config.schedule,
24
+ };
25
+ }
26
+ //# sourceMappingURL=cron.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.js","sourceRoot":"","sources":["../src/cron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAOzC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,MAAkB;IACnD,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE;QAC1B,IAAI;QACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC;IAEH,OAAO;QACL,YAAY,EAAE,MAAe;QAC7B,IAAI;QACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC"}
package/dist/db.d.ts ADDED
@@ -0,0 +1,46 @@
1
+ export interface DatabaseConfig {
2
+ engine?: "postgres" | "mysql" | "mongodb" | "dynamodb";
3
+ migrations?: string;
4
+ partitionKey?: string;
5
+ sortKey?: string;
6
+ }
7
+ export interface TransactionClient {
8
+ /** Run a query returning multiple rows */
9
+ query<T = any>(sql: string, params?: any[]): Promise<T[]>;
10
+ /** Run a query returning a single row or null */
11
+ queryRow<T = any>(sql: string, params?: any[]): Promise<T | null>;
12
+ /** Run a query returning affected row count */
13
+ exec(sql: string, params?: any[]): Promise<{
14
+ rowCount: number;
15
+ }>;
16
+ /** Insert and return the inserted row */
17
+ insert<T = any>(table: string, data: Record<string, any>): Promise<T>;
18
+ /** Access the underlying connection (single client, not pool) */
19
+ conn: any;
20
+ }
21
+ export interface DatabaseClient {
22
+ /** Run a query returning multiple rows */
23
+ query<T = any>(sql: string, params?: any[]): Promise<T[]>;
24
+ /** Run a query returning a single row or null */
25
+ queryRow<T = any>(sql: string, params?: any[]): Promise<T | null>;
26
+ /** Run a query returning affected row count */
27
+ exec(sql: string, params?: any[]): Promise<{
28
+ rowCount: number;
29
+ }>;
30
+ /** Insert and return the inserted row */
31
+ insert<T = any>(table: string, data: Record<string, any>): Promise<T>;
32
+ /** Run a callback inside a transaction — auto-commits on success, rolls back on error */
33
+ transaction<R = any>(fn: (tx: TransactionClient) => Promise<R>): Promise<R>;
34
+ /** Access the underlying connection pool (for ORMs like Drizzle) */
35
+ pool: any;
36
+ }
37
+ /**
38
+ * Declare a database.
39
+ *
40
+ * ```ts
41
+ * export const db = database("main", { migrations: "./migrations" });
42
+ * const user = await db.queryRow<User>("SELECT * FROM users WHERE id = $1", [id]);
43
+ * ```
44
+ */
45
+ export declare function database(name: string, config?: DatabaseConfig): DatabaseClient;
46
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1D,iDAAiD;IACjD,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAClE,+CAA+C;IAC/C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,yCAAyC;IACzC,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACtE,iEAAiE;IACjE,IAAI,EAAE,GAAG,CAAC;CACX;AAED,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1D,iDAAiD;IACjD,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAClE,+CAA+C;IAC/C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,yCAAyC;IACzC,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACtE,yFAAyF;IACzF,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5E,oEAAoE;IACpE,IAAI,EAAE,GAAG,CAAC;CACX;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,cAAc,CAqK9E"}
package/dist/db.js ADDED
@@ -0,0 +1,158 @@
1
+ import { registry } from "./registry.js";
2
+ /**
3
+ * Declare a database.
4
+ *
5
+ * ```ts
6
+ * export const db = database("main", { migrations: "./migrations" });
7
+ * const user = await db.queryRow<User>("SELECT * FROM users WHERE id = $1", [id]);
8
+ * ```
9
+ */
10
+ export function database(name, config) {
11
+ const engine = config?.engine ?? "postgres";
12
+ // Connection details injected by the Rust runtime via env vars
13
+ const connStr = process.env[`COOPER_DB_${name.toUpperCase()}_URL`]
14
+ ?? `postgres://cooper:cooper@localhost:5432/cooper_${name}`;
15
+ let pool = null;
16
+ const ensurePool = async () => {
17
+ if (pool)
18
+ return pool;
19
+ if (engine === "postgres") {
20
+ const pg = await import("pg");
21
+ pool = new pg.default.Pool({ connectionString: connStr });
22
+ return pool;
23
+ }
24
+ if (engine === "mysql") {
25
+ const mysql = await import("mysql2/promise");
26
+ pool = await mysql.createPool(connStr);
27
+ return pool;
28
+ }
29
+ throw new Error(`Database engine "${engine}" not yet supported in JS runtime`);
30
+ };
31
+ const client = {
32
+ async query(sql, params) {
33
+ const p = await ensurePool();
34
+ if (engine === "postgres") {
35
+ const res = await p.query(sql, params);
36
+ return res.rows;
37
+ }
38
+ if (engine === "mysql") {
39
+ const [rows] = await p.execute(sql, params);
40
+ return rows;
41
+ }
42
+ return [];
43
+ },
44
+ async queryRow(sql, params) {
45
+ const rows = await client.query(sql, params);
46
+ return rows[0] ?? null;
47
+ },
48
+ async exec(sql, params) {
49
+ const p = await ensurePool();
50
+ if (engine === "postgres") {
51
+ const res = await p.query(sql, params);
52
+ return { rowCount: res.rowCount ?? 0 };
53
+ }
54
+ if (engine === "mysql") {
55
+ const [result] = await p.execute(sql, params);
56
+ return { rowCount: result.affectedRows ?? 0 };
57
+ }
58
+ return { rowCount: 0 };
59
+ },
60
+ async insert(table, data) {
61
+ const keys = Object.keys(data);
62
+ const values = Object.values(data);
63
+ const placeholders = keys.map((_, i) => engine === "postgres" ? `$${i + 1}` : "?");
64
+ const sql = `INSERT INTO ${table} (${keys.join(", ")}) VALUES (${placeholders.join(", ")}) RETURNING *`;
65
+ const row = await client.queryRow(sql, values);
66
+ return row;
67
+ },
68
+ async transaction(fn) {
69
+ const p = await ensurePool();
70
+ if (engine === "postgres") {
71
+ const pgClient = await p.connect();
72
+ try {
73
+ await pgClient.query("BEGIN");
74
+ const tx = {
75
+ async query(sql, params) {
76
+ const res = await pgClient.query(sql, params);
77
+ return res.rows;
78
+ },
79
+ async queryRow(sql, params) {
80
+ const res = await pgClient.query(sql, params);
81
+ return res.rows[0] ?? null;
82
+ },
83
+ async exec(sql, params) {
84
+ const res = await pgClient.query(sql, params);
85
+ return { rowCount: res.rowCount ?? 0 };
86
+ },
87
+ async insert(table, data) {
88
+ const keys = Object.keys(data);
89
+ const values = Object.values(data);
90
+ const placeholders = keys.map((_, i) => `$${i + 1}`);
91
+ const sql = `INSERT INTO ${table} (${keys.join(", ")}) VALUES (${placeholders.join(", ")}) RETURNING *`;
92
+ const res = await pgClient.query(sql, values);
93
+ return res.rows[0];
94
+ },
95
+ get conn() { return pgClient; },
96
+ };
97
+ const result = await fn(tx);
98
+ await pgClient.query("COMMIT");
99
+ return result;
100
+ }
101
+ catch (err) {
102
+ await pgClient.query("ROLLBACK");
103
+ throw err;
104
+ }
105
+ finally {
106
+ pgClient.release();
107
+ }
108
+ }
109
+ if (engine === "mysql") {
110
+ const conn = await p.getConnection();
111
+ try {
112
+ await conn.beginTransaction();
113
+ const tx = {
114
+ async query(sql, params) {
115
+ const [rows] = await conn.execute(sql, params);
116
+ return rows;
117
+ },
118
+ async queryRow(sql, params) {
119
+ const [rows] = await conn.execute(sql, params);
120
+ return rows[0] ?? null;
121
+ },
122
+ async exec(sql, params) {
123
+ const [result] = await conn.execute(sql, params);
124
+ return { rowCount: result.affectedRows ?? 0 };
125
+ },
126
+ async insert(table, data) {
127
+ const keys = Object.keys(data);
128
+ const values = Object.values(data);
129
+ const placeholders = keys.map(() => "?");
130
+ const sql = `INSERT INTO ${table} (${keys.join(", ")}) VALUES (${placeholders.join(", ")})`;
131
+ await conn.execute(sql, values);
132
+ const [rows] = await conn.execute(`SELECT * FROM ${table} WHERE id = LAST_INSERT_ID()`);
133
+ return rows[0];
134
+ },
135
+ get conn() { return conn; },
136
+ };
137
+ const result = await fn(tx);
138
+ await conn.commit();
139
+ return result;
140
+ }
141
+ catch (err) {
142
+ await conn.rollback();
143
+ throw err;
144
+ }
145
+ finally {
146
+ conn.release();
147
+ }
148
+ }
149
+ throw new Error(`Transactions not supported for engine "${engine}"`);
150
+ },
151
+ get pool() {
152
+ return pool;
153
+ },
154
+ };
155
+ registry.registerDatabase(name, { name, engine, pool: client });
156
+ return client;
157
+ }
158
+ //# sourceMappingURL=db.js.map
package/dist/db.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Structured error codes with automatic HTTP status mapping.
3
+ */
4
+ export type ErrorCode = "NOT_FOUND" | "UNAUTHORIZED" | "PERMISSION_DENIED" | "RATE_LIMITED" | "INVALID_ARGUMENT" | "VALIDATION_FAILED" | "INTERNAL";
5
+ export declare class CooperError extends Error {
6
+ readonly code: ErrorCode;
7
+ readonly statusCode: number;
8
+ retryAfter?: number;
9
+ constructor(code: ErrorCode, message: string);
10
+ toJSON(): {
11
+ error: {
12
+ retryAfter?: number | undefined;
13
+ code: ErrorCode;
14
+ message: string;
15
+ };
16
+ };
17
+ }
18
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,WAAW,GACX,cAAc,GACd,mBAAmB,GACnB,cAAc,GACd,kBAAkB,GAClB,mBAAmB,GACnB,UAAU,CAAC;AAYf,qBAAa,WAAY,SAAQ,KAAK;IACpC,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,UAAU,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;gBAEf,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM;IAO5C,MAAM;;;;;;;CASP"}
package/dist/error.js ADDED
@@ -0,0 +1,30 @@
1
+ const STATUS_MAP = {
2
+ NOT_FOUND: 404,
3
+ UNAUTHORIZED: 401,
4
+ PERMISSION_DENIED: 403,
5
+ RATE_LIMITED: 429,
6
+ INVALID_ARGUMENT: 400,
7
+ VALIDATION_FAILED: 422,
8
+ INTERNAL: 500,
9
+ };
10
+ export class CooperError extends Error {
11
+ code;
12
+ statusCode;
13
+ retryAfter;
14
+ constructor(code, message) {
15
+ super(message);
16
+ this.name = "CooperError";
17
+ this.code = code;
18
+ this.statusCode = STATUS_MAP[code] ?? 500;
19
+ }
20
+ toJSON() {
21
+ return {
22
+ error: {
23
+ code: this.code,
24
+ message: this.message,
25
+ ...(this.retryAfter !== undefined && { retryAfter: this.retryAfter }),
26
+ },
27
+ };
28
+ }
29
+ }
30
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,GAA8B;IAC5C,SAAS,EAAE,GAAG;IACd,YAAY,EAAE,GAAG;IACjB,iBAAiB,EAAE,GAAG;IACtB,YAAY,EAAE,GAAG;IACjB,gBAAgB,EAAE,GAAG;IACrB,iBAAiB,EAAE,GAAG;IACtB,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpB,IAAI,CAAY;IAChB,UAAU,CAAS;IAC5B,UAAU,CAAU;IAE3B,YAAY,IAAe,EAAE,OAAe;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;IAC5C,CAAC;IAED,MAAM;QACJ,OAAO;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;aACtE;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ export { api } from "./api.js";
2
+ export { CooperError, type ErrorCode } from "./error.js";
3
+ export { database, type DatabaseClient, type TransactionClient } from "./db.js";
4
+ export { middleware, cooper } from "./middleware.js";
5
+ export { authHandler } from "./auth.js";
6
+ export { topic, type Topic } from "./pubsub.js";
7
+ export { closeNats } from "./nats.js";
8
+ export { cron } from "./cron.js";
9
+ export { cache, type CacheClient } from "./cache.js";
10
+ export { bucket, type BucketClient } from "./storage.js";
11
+ export { secret } from "./secrets.js";
12
+ export { queue, type QueueClient } from "./queue.js";
13
+ export { page, layout, pageLoader, Suspense } from "./ssr.js";
14
+ export { island } from "./islands.js";
15
+ export { vectorStore, llmGateway } from "./ai.js";
16
+ export { rateLimit, type RateLimitConfig } from "./rateLimit.js";
17
+ export { registry } from "./registry.js";
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ export { api } from "./api.js";
2
+ export { CooperError } from "./error.js";
3
+ export { database } from "./db.js";
4
+ export { middleware, cooper } from "./middleware.js";
5
+ export { authHandler } from "./auth.js";
6
+ export { topic } from "./pubsub.js";
7
+ export { closeNats } from "./nats.js";
8
+ export { cron } from "./cron.js";
9
+ export { cache } from "./cache.js";
10
+ export { bucket } from "./storage.js";
11
+ export { secret } from "./secrets.js";
12
+ export { queue } from "./queue.js";
13
+ export { page, layout, pageLoader, Suspense } from "./ssr.js";
14
+ export { island } from "./islands.js";
15
+ export { vectorStore, llmGateway } from "./ai.js";
16
+ export { rateLimit } from "./rateLimit.js";
17
+ export { registry } from "./registry.js";
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAkB,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,QAAQ,EAA+C,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,KAAK,EAAc,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAoB,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,MAAM,EAAqB,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,KAAK,EAAoB,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,SAAS,EAAwB,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type HydrationStrategy = "load" | "visible" | "idle" | "interaction" | "none";
2
+ /**
3
+ * Mark a component as an island — it will be hydrated on the client.
4
+ *
5
+ * ```tsx
6
+ * // islands/LikeButton.island.tsx
7
+ * export default island(function LikeButton({ userId, initialCount }) {
8
+ * const [count, setCount] = useState(initialCount);
9
+ * return <button onClick={...}>Like ({count})</button>;
10
+ * });
11
+ * ```
12
+ */
13
+ export declare function island<P = any>(component: (props: P) => any): (props: P & {
14
+ hydrate?: HydrationStrategy;
15
+ }) => any;
16
+ //# sourceMappingURL=islands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"islands.d.ts","sourceRoot":"","sources":["../src/islands.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;AAErF;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,CAAC,GAAG,GAAG,EAC5B,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,GAC3B,CAAC,KAAK,EAAE,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,iBAAiB,CAAA;CAAE,KAAK,GAAG,CAYrD"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Mark a component as an island — it will be hydrated on the client.
3
+ *
4
+ * ```tsx
5
+ * // islands/LikeButton.island.tsx
6
+ * export default island(function LikeButton({ userId, initialCount }) {
7
+ * const [count, setCount] = useState(initialCount);
8
+ * return <button onClick={...}>Like ({count})</button>;
9
+ * });
10
+ * ```
11
+ */
12
+ export function island(component) {
13
+ // Mark the component for the bundler
14
+ const wrapper = (props) => {
15
+ // Server-side: render the component to HTML
16
+ // Client-side: hydrate based on strategy
17
+ return component(props);
18
+ };
19
+ wrapper._cooper_island = true;
20
+ wrapper._cooper_hydrate = "load"; // default strategy
21
+ return wrapper;
22
+ }
23
+ //# sourceMappingURL=islands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"islands.js","sourceRoot":"","sources":["../src/islands.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,MAAM,CACpB,SAA4B;IAE5B,qCAAqC;IACrC,MAAM,OAAO,GAAG,CAAC,KAA0C,EAAE,EAAE;QAC7D,4CAA4C;QAC5C,yCAAyC;QACzC,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC;IAED,OAAe,CAAC,cAAc,GAAG,IAAI,CAAC;IACtC,OAAe,CAAC,eAAe,GAAG,MAAM,CAAC,CAAC,mBAAmB;IAE9D,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type MiddlewareFn } from "./registry.js";
2
+ /**
3
+ * Define a middleware function.
4
+ *
5
+ * ```ts
6
+ * const rateLimiter = middleware(async (req, next) => {
7
+ * const count = await userCache.increment(`rate:${req.ip}`, { ttl: "1m" });
8
+ * if (count > 100) throw new CooperError("RATE_LIMITED");
9
+ * return next(req);
10
+ * });
11
+ * ```
12
+ */
13
+ export declare function middleware(fn: MiddlewareFn): MiddlewareFn;
14
+ /**
15
+ * Cooper instance for global middleware registration.
16
+ */
17
+ export declare const cooper: {
18
+ use(...middlewares: MiddlewareFn[]): void;
19
+ };
20
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,GAAG,YAAY,CAEzD;AAED;;GAEG;AACH,eAAO,MAAM,MAAM;wBACG,YAAY,EAAE;CAKnC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { registry } from "./registry.js";
2
+ /**
3
+ * Define a middleware function.
4
+ *
5
+ * ```ts
6
+ * const rateLimiter = middleware(async (req, next) => {
7
+ * const count = await userCache.increment(`rate:${req.ip}`, { ttl: "1m" });
8
+ * if (count > 100) throw new CooperError("RATE_LIMITED");
9
+ * return next(req);
10
+ * });
11
+ * ```
12
+ */
13
+ export function middleware(fn) {
14
+ return fn;
15
+ }
16
+ /**
17
+ * Cooper instance for global middleware registration.
18
+ */
19
+ export const cooper = {
20
+ use(...middlewares) {
21
+ for (const mw of middlewares) {
22
+ registry.addGlobalMiddleware(mw);
23
+ }
24
+ },
25
+ };
26
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAqB,MAAM,eAAe,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,EAAgB;IACzC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,GAAG,CAAC,GAAG,WAA2B;QAChC,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;YAC7B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;CACF,CAAC"}
package/dist/nats.d.ts ADDED
@@ -0,0 +1,46 @@
1
+ /**
2
+ * NATS Connection Manager — singleton lazy connection to embedded NATS.
3
+ *
4
+ * JetStream is used for durable pub/sub with delivery guarantees.
5
+ * Falls back gracefully if NATS is unavailable (logs warning once).
6
+ */
7
+ import { type NatsConnection, type JetStreamClient, type JetStreamManager } from "nats";
8
+ declare const jc: import("nats").Codec<unknown>;
9
+ export declare function ensureConnected(): Promise<boolean>;
10
+ export declare function getJetStream(): JetStreamClient | null;
11
+ export declare function getJetStreamManager(): JetStreamManager | null;
12
+ export declare function getConnection(): NatsConnection | null;
13
+ export { jc as jsonCodec };
14
+ /**
15
+ * Sanitize a topic name into a valid NATS stream name.
16
+ * NATS streams: alphanumeric + dash + underscore only.
17
+ */
18
+ export declare function streamName(topicName: string): string;
19
+ /**
20
+ * Sanitize a subscriber name into a valid NATS durable consumer name.
21
+ */
22
+ export declare function consumerName(subscriberName: string): string;
23
+ /**
24
+ * Ensure a JetStream stream exists for a topic.
25
+ * Creates it if missing, no-ops if it already exists.
26
+ */
27
+ export declare function ensureStream(topicName: string, config?: {
28
+ dedup?: boolean;
29
+ }): Promise<void>;
30
+ /**
31
+ * Ensure a JetStream stream exists for a job queue.
32
+ * Uses WorkQueue retention — each message consumed by exactly one worker.
33
+ */
34
+ export declare function ensureQueueStream(queueName: string, config?: {
35
+ dedup?: boolean;
36
+ }): Promise<void>;
37
+ /**
38
+ * Ensure a JetStream stream exists for a dead-letter queue.
39
+ * Uses Limits retention — messages stay until explicitly purged.
40
+ */
41
+ export declare function ensureDLQStream(dlqName: string): Promise<void>;
42
+ /**
43
+ * Graceful shutdown — drain and close the connection.
44
+ */
45
+ export declare function closeNats(): Promise<void>;
46
+ //# sourceMappingURL=nats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nats.d.ts","sourceRoot":"","sources":["../src/nats.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EAKtB,MAAM,MAAM,CAAC;AAQd,QAAA,MAAM,EAAE,+BAAc,CAAC;AA0BvB,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAOxD;AAED,wBAAgB,YAAY,IAAI,eAAe,GAAG,IAAI,CAErD;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,IAAI,CAE7D;AAED,wBAAgB,aAAa,IAAI,cAAc,GAAG,IAAI,CAErD;AAED,OAAO,EAAE,EAAE,IAAI,SAAS,EAAE,CAAC;AAE3B;;;GAGG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBpE;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAI/C"}