helloruntime 0.0.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/cli/config.d.ts +17 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +22 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/deploy.d.ts +4 -0
- package/dist/cli/deploy.d.ts.map +1 -0
- package/dist/cli/deploy.js +69 -0
- package/dist/cli/deploy.js.map +1 -0
- package/dist/cli/destroy.d.ts +5 -0
- package/dist/cli/destroy.d.ts.map +1 -0
- package/dist/cli/destroy.js +41 -0
- package/dist/cli/destroy.js.map +1 -0
- package/dist/cli/http.d.ts +3 -0
- package/dist/cli/http.d.ts.map +1 -0
- package/dist/cli/http.js +26 -0
- package/dist/cli/http.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +76 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/packager.d.ts +7 -0
- package/dist/cli/packager.d.ts.map +1 -0
- package/dist/cli/packager.js +49 -0
- package/dist/cli/packager.js.map +1 -0
- package/dist/cli/project-config.d.ts +3 -0
- package/dist/cli/project-config.d.ts.map +1 -0
- package/dist/cli/project-config.js +20 -0
- package/dist/cli/project-config.js.map +1 -0
- package/dist/cli/triggers.d.ts +15 -0
- package/dist/cli/triggers.d.ts.map +1 -0
- package/dist/cli/triggers.js +68 -0
- package/dist/cli/triggers.js.map +1 -0
- package/dist/sdk/cron.d.ts +12 -0
- package/dist/sdk/cron.d.ts.map +1 -0
- package/dist/sdk/cron.js +10 -0
- package/dist/sdk/cron.js.map +1 -0
- package/dist/sdk/db.d.ts +14 -0
- package/dist/sdk/db.d.ts.map +1 -0
- package/dist/sdk/db.js +44 -0
- package/dist/sdk/db.js.map +1 -0
- package/dist/sdk/index.d.ts +10 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +11 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/jobs.d.ts +12 -0
- package/dist/sdk/jobs.d.ts.map +1 -0
- package/dist/sdk/jobs.js +11 -0
- package/dist/sdk/jobs.js.map +1 -0
- package/dist/sdk/registry.d.ts +2 -0
- package/dist/sdk/registry.d.ts.map +1 -0
- package/dist/sdk/registry.js +5 -0
- package/dist/sdk/registry.js.map +1 -0
- package/dist/sdk/runtime/express.d.ts +6 -0
- package/dist/sdk/runtime/express.d.ts.map +1 -0
- package/dist/sdk/runtime/express.js +56 -0
- package/dist/sdk/runtime/express.js.map +1 -0
- package/dist/sdk/runtime/handler.d.ts +13 -0
- package/dist/sdk/runtime/handler.d.ts.map +1 -0
- package/dist/sdk/runtime/handler.js +85 -0
- package/dist/sdk/runtime/handler.js.map +1 -0
- package/dist/sdk/runtime/hono.d.ts +10 -0
- package/dist/sdk/runtime/hono.d.ts.map +1 -0
- package/dist/sdk/runtime/hono.js +16 -0
- package/dist/sdk/runtime/hono.js.map +1 -0
- package/dist/sdk/runtime/register.d.ts +9 -0
- package/dist/sdk/runtime/register.d.ts.map +1 -0
- package/dist/sdk/runtime/register.js +32 -0
- package/dist/sdk/runtime/register.js.map +1 -0
- package/dist/sdk/runtime/verify.d.ts +20 -0
- package/dist/sdk/runtime/verify.d.ts.map +1 -0
- package/dist/sdk/runtime/verify.js +29 -0
- package/dist/sdk/runtime/verify.js.map +1 -0
- package/dist/sdk/send-job.d.ts +15 -0
- package/dist/sdk/send-job.d.ts.map +1 -0
- package/dist/sdk/send-job.js +36 -0
- package/dist/sdk/send-job.js.map +1 -0
- package/helloruntime.schema.json +48 -0
- package/package.json +50 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const configSchema: z.ZodObject<{
|
|
3
|
+
apiUrl: z.ZodString;
|
|
4
|
+
token: z.ZodString;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
apiUrl: string;
|
|
7
|
+
token: string;
|
|
8
|
+
}, {
|
|
9
|
+
apiUrl: string;
|
|
10
|
+
token: string;
|
|
11
|
+
}>;
|
|
12
|
+
export type CliConfig = z.infer<typeof configSchema>;
|
|
13
|
+
export declare function configPath(): string;
|
|
14
|
+
export declare function readConfig(): Promise<CliConfig>;
|
|
15
|
+
export declare function writeConfig(config: CliConfig): Promise<void>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,YAAY;;;;;;;;;EAGhB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAErD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAIrD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
const configSchema = z.object({
|
|
6
|
+
apiUrl: z.string().url(),
|
|
7
|
+
token: z.string()
|
|
8
|
+
});
|
|
9
|
+
export function configPath() {
|
|
10
|
+
return join(homedir(), ".helloruntime", "config.json");
|
|
11
|
+
}
|
|
12
|
+
export async function readConfig() {
|
|
13
|
+
const raw = await readFile(configPath(), "utf8").catch(() => null);
|
|
14
|
+
if (!raw)
|
|
15
|
+
throw new Error("Not logged in. Run `helloruntime login` first.");
|
|
16
|
+
return configSchema.parse(JSON.parse(raw));
|
|
17
|
+
}
|
|
18
|
+
export async function writeConfig(config) {
|
|
19
|
+
await mkdir(join(homedir(), ".helloruntime"), { recursive: true, mode: 0o700 });
|
|
20
|
+
await writeFile(configPath(), `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACnE,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAC5E,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAiB;IACjD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,MAAM,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACzF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/cli/deploy.ts"],"names":[],"mappings":"AAkCA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D5E"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { basename, join } from "node:path";
|
|
3
|
+
import { readConfig } from "./config.js";
|
|
4
|
+
import { helloruntimeRequest } from "./http.js";
|
|
5
|
+
import { packageSource } from "./packager.js";
|
|
6
|
+
import { readProjectConfig } from "./project-config.js";
|
|
7
|
+
const TERMINAL = new Set(["active", "failed"]);
|
|
8
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
9
|
+
function formatDuration(ms) {
|
|
10
|
+
const seconds = ms / 1000;
|
|
11
|
+
if (seconds < 60)
|
|
12
|
+
return `${seconds.toFixed(1)}s`;
|
|
13
|
+
const mins = Math.floor(seconds / 60);
|
|
14
|
+
return `${mins}m ${String(Math.round(seconds % 60)).padStart(2, "0")}s`;
|
|
15
|
+
}
|
|
16
|
+
export async function deployCommand(options) {
|
|
17
|
+
const cwd = process.cwd();
|
|
18
|
+
const config = await readConfig();
|
|
19
|
+
const projectConfig = await readProjectConfig(cwd);
|
|
20
|
+
const pkg = await readFile(join(cwd, "package.json"), "utf8")
|
|
21
|
+
.then((raw) => JSON.parse(raw))
|
|
22
|
+
.catch(() => ({}));
|
|
23
|
+
const appName = options.app ?? pkg.name ?? basename(cwd);
|
|
24
|
+
process.stdout.write("Packaging source… ");
|
|
25
|
+
const { tarPath, sourceHash, entries } = await packageSource(cwd);
|
|
26
|
+
console.log(`${entries.length} files (${sourceHash.slice(0, 12)})`);
|
|
27
|
+
process.stdout.write("Uploading… ");
|
|
28
|
+
const tarball = await readFile(tarPath);
|
|
29
|
+
const uploaded = await helloruntimeRequest(config, `/v1/artifacts?sourceHash=${encodeURIComponent(sourceHash)}`, { method: "POST", headers: { "content-type": "application/gzip" }, body: tarball });
|
|
30
|
+
console.log(`${(uploaded.artifactSizeBytes / 1024).toFixed(0)} KiB`);
|
|
31
|
+
const created = await helloruntimeRequest(config, "/v1/deployments", {
|
|
32
|
+
method: "POST",
|
|
33
|
+
body: JSON.stringify({
|
|
34
|
+
appName,
|
|
35
|
+
appSlug: appName,
|
|
36
|
+
sourceHash,
|
|
37
|
+
artifactKey: uploaded.artifactKey,
|
|
38
|
+
artifactSizeBytes: uploaded.artifactSizeBytes,
|
|
39
|
+
manifest: projectConfig
|
|
40
|
+
})
|
|
41
|
+
});
|
|
42
|
+
console.log(`Deploying v${created.version}…`);
|
|
43
|
+
let phase = "";
|
|
44
|
+
let phaseStart = Date.now();
|
|
45
|
+
for (;;) {
|
|
46
|
+
const status = await helloruntimeRequest(config, `/v1/deployments/${created.deploymentId}`);
|
|
47
|
+
if (status.status !== phase) {
|
|
48
|
+
// Close the previous phase's line with how long it took, then open the new
|
|
49
|
+
// one (its duration is appended once it ends). Nothing else writes to stdout
|
|
50
|
+
// between these, so the duration lands on the same line.
|
|
51
|
+
if (phase !== "")
|
|
52
|
+
process.stdout.write(` (${formatDuration(Date.now() - phaseStart)})\n`);
|
|
53
|
+
process.stdout.write(` → ${status.status}`);
|
|
54
|
+
phase = status.status;
|
|
55
|
+
phaseStart = Date.now();
|
|
56
|
+
}
|
|
57
|
+
if (TERMINAL.has(status.status)) {
|
|
58
|
+
process.stdout.write("\n");
|
|
59
|
+
if (status.status === "failed") {
|
|
60
|
+
throw new Error(`Deploy failed: ${status.error ?? "unknown error"}`);
|
|
61
|
+
}
|
|
62
|
+
console.log(`\n✓ Deployed v${status.version}`);
|
|
63
|
+
console.log(` ${status.url}`);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
await sleep(2000);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/cli/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../src/cli/destroy.ts"],"names":[],"mappings":"AAuBA,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B5F"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { basename, join } from "node:path";
|
|
3
|
+
import { createInterface } from "node:readline/promises";
|
|
4
|
+
import { readConfig } from "./config.js";
|
|
5
|
+
import { helloruntimeRequest } from "./http.js";
|
|
6
|
+
async function confirm(question) {
|
|
7
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
8
|
+
try {
|
|
9
|
+
const answer = (await rl.question(question)).trim().toLowerCase();
|
|
10
|
+
return answer === "y" || answer === "yes";
|
|
11
|
+
}
|
|
12
|
+
finally {
|
|
13
|
+
rl.close();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function destroyCommand(options) {
|
|
17
|
+
const config = await readConfig();
|
|
18
|
+
let appName = options.app;
|
|
19
|
+
if (!appName) {
|
|
20
|
+
const pkg = (await readFile(join(process.cwd(), "package.json"), "utf8")
|
|
21
|
+
.then(JSON.parse)
|
|
22
|
+
.catch(() => ({})));
|
|
23
|
+
appName = pkg.name ?? basename(process.cwd());
|
|
24
|
+
}
|
|
25
|
+
if (!options.yes) {
|
|
26
|
+
const ok = await confirm(`Permanently destroy "${appName}" — its workload, all versions, and (if it is the last app) the project database. This cannot be undone. Continue? [y/N] `);
|
|
27
|
+
if (!ok) {
|
|
28
|
+
console.log("Aborted.");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const result = await helloruntimeRequest(config, `/v1/apps/${encodeURIComponent(appName)}`, {
|
|
33
|
+
method: "DELETE"
|
|
34
|
+
});
|
|
35
|
+
console.log(`✓ Destroyed ${result.app}`);
|
|
36
|
+
if (result.destroyedNamespace)
|
|
37
|
+
console.log(` namespace ${result.destroyedNamespace} removed`);
|
|
38
|
+
if (result.destroyedDatabase)
|
|
39
|
+
console.log(` database dropped`);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=destroy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../src/cli/destroy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAQhD,KAAK,UAAU,OAAO,CAAC,QAAgB;IACrC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClE,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,CAAC;IAC5C,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAwC;IAC3E,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC;aACrE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;aAChB,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAsB,CAAC;QAC3C,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,wBAAwB,OAAO,2HAA2H,CAC3J,CAAC;QACF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAgB,MAAM,EAAE,YAAY,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE;QACzG,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,kBAAkB;QAAE,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,kBAAkB,UAAU,CAAC,CAAC;IAC/F,IAAI,MAAM,CAAC,iBAAiB;QAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/cli/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,CAAC,CAAC,CAiBZ"}
|
package/dist/cli/http.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export async function helloruntimeRequest(config, path, init = {}) {
|
|
2
|
+
const headers = {
|
|
3
|
+
authorization: `Bearer ${config.token}`,
|
|
4
|
+
...init.headers
|
|
5
|
+
};
|
|
6
|
+
if (typeof init.body === "string" && !headers["content-type"]) {
|
|
7
|
+
headers["content-type"] = "application/json";
|
|
8
|
+
}
|
|
9
|
+
const response = await fetch(new URL(path, config.apiUrl), { ...init, headers });
|
|
10
|
+
const text = await response.text();
|
|
11
|
+
const body = text ? safeJson(text) : null;
|
|
12
|
+
if (!response.ok) {
|
|
13
|
+
const detail = body && typeof body === "object" ? JSON.stringify(body) : text;
|
|
14
|
+
throw new Error(`${path} failed (${response.status}): ${detail}`);
|
|
15
|
+
}
|
|
16
|
+
return body;
|
|
17
|
+
}
|
|
18
|
+
function safeJson(text) {
|
|
19
|
+
try {
|
|
20
|
+
return JSON.parse(text);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return text;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/cli/http.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAiB,EACjB,IAAY,EACZ,OAAoB,EAAE;IAEtB,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;QACvC,GAAI,IAAI,CAAC,OAA8C;KACxD,CAAC;IACF,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9D,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,YAAY,QAAQ,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,IAAS,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { writeConfig } from "./config.js";
|
|
4
|
+
import { deployCommand } from "./deploy.js";
|
|
5
|
+
import { destroyCommand } from "./destroy.js";
|
|
6
|
+
import { cronList, cronTrigger, jobsList, jobsTrigger } from "./triggers.js";
|
|
7
|
+
const program = new Command();
|
|
8
|
+
program.name("helloruntime").description("Deploy server-rendered JS/TS apps to Helloruntime").version("0.0.1");
|
|
9
|
+
program
|
|
10
|
+
.command("login")
|
|
11
|
+
.option("--api-url <url>", "Helloruntime API URL", process.env.HELLORUNTIME_API_URL ?? "http://localhost:3000")
|
|
12
|
+
.option("--email <email>", "Dev login email", "dev@helloruntime.local")
|
|
13
|
+
.option("--dev", "Use the dev-login fallback (no real IdP yet)")
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
const response = await fetch(new URL("/v1/auth/dev-login", options.apiUrl), {
|
|
16
|
+
method: "POST",
|
|
17
|
+
headers: { "content-type": "application/json" },
|
|
18
|
+
body: JSON.stringify({ email: options.email })
|
|
19
|
+
});
|
|
20
|
+
const body = (await response.json().catch(() => null));
|
|
21
|
+
if (!response.ok || !body) {
|
|
22
|
+
throw new Error(`Login failed (${response.status})`);
|
|
23
|
+
}
|
|
24
|
+
await writeConfig({ apiUrl: options.apiUrl, token: body.token });
|
|
25
|
+
console.log(`Logged in to ${options.apiUrl} as ${body.user.email}`);
|
|
26
|
+
});
|
|
27
|
+
program
|
|
28
|
+
.command("deploy")
|
|
29
|
+
.description("Build + deploy the app in the current directory")
|
|
30
|
+
.option("--app <name>", "App name")
|
|
31
|
+
.action(deployCommand);
|
|
32
|
+
program
|
|
33
|
+
.command("destroy")
|
|
34
|
+
.description("Destroy an app (and the project database if it is the last app)")
|
|
35
|
+
.option("--app <name>", "App name")
|
|
36
|
+
.option("-y, --yes", "Skip the confirmation prompt")
|
|
37
|
+
.action(destroyCommand);
|
|
38
|
+
// ─── Jobs ─────────────────────────────────────────────────────────────────────
|
|
39
|
+
const jobs = program.command("jobs").description("Inspect and trigger background jobs");
|
|
40
|
+
jobs
|
|
41
|
+
.command("trigger <name>")
|
|
42
|
+
.description("Enqueue a job on demand")
|
|
43
|
+
.option("--payload <json>", "JSON payload, @file.json, or a bare string")
|
|
44
|
+
.option("--app <name>", "App name (defaults to package.json name / dir)")
|
|
45
|
+
.action(jobsTrigger);
|
|
46
|
+
jobs
|
|
47
|
+
.command("list")
|
|
48
|
+
.description("List recent jobs")
|
|
49
|
+
.option("--status <status>", "Filter by status (pending|leased|succeeded|dead)")
|
|
50
|
+
.option("--app <name>", "App name")
|
|
51
|
+
.action(jobsList);
|
|
52
|
+
// ─── Cron ─────────────────────────────────────────────────────────────────────
|
|
53
|
+
const cron = program.command("cron").description("Inspect and trigger cron schedules");
|
|
54
|
+
cron
|
|
55
|
+
.command("trigger <name>")
|
|
56
|
+
.description("Fire a cron out-of-schedule")
|
|
57
|
+
.option("--app <name>", "App name")
|
|
58
|
+
.action(cronTrigger);
|
|
59
|
+
cron
|
|
60
|
+
.command("list")
|
|
61
|
+
.description("List registered crons")
|
|
62
|
+
.option("--app <name>", "App name")
|
|
63
|
+
.action(cronList);
|
|
64
|
+
const notYet = (command) => () => {
|
|
65
|
+
console.error(`helloruntime ${command}: not implemented yet`);
|
|
66
|
+
process.exitCode = 1;
|
|
67
|
+
};
|
|
68
|
+
program.command("apps").description("List deployed apps").action(notYet("apps"));
|
|
69
|
+
program.command("app").option("--app <name>").action(notYet("app"));
|
|
70
|
+
program.command("rollback").argument("[version]").option("--app <name>").action(notYet("rollback"));
|
|
71
|
+
program.command("logs").option("--app <name>").action(notYet("logs"));
|
|
72
|
+
program.parseAsync().catch((error) => {
|
|
73
|
+
console.error(error instanceof Error ? error.message : error);
|
|
74
|
+
process.exitCode = 1;
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packager.d.ts","sourceRoot":"","sources":["../../src/cli/packager.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAGD,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoBxE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mkdir, readdir, readFile } from "node:fs/promises";
|
|
3
|
+
import { join, relative, sep } from "node:path";
|
|
4
|
+
import * as tar from "tar";
|
|
5
|
+
// Directories never uploaded: build outputs + vcs + deps. node_modules is installed
|
|
6
|
+
// server-side; .output/dist are rebuilt; excluding them keeps the source hash stable.
|
|
7
|
+
const DENY_DIRS = new Set([
|
|
8
|
+
"node_modules",
|
|
9
|
+
".git",
|
|
10
|
+
"dist",
|
|
11
|
+
".output",
|
|
12
|
+
".helloruntime",
|
|
13
|
+
".turbo",
|
|
14
|
+
"coverage",
|
|
15
|
+
".next",
|
|
16
|
+
".vite"
|
|
17
|
+
]);
|
|
18
|
+
const DENY_FILES = new Set([".DS_Store", ".env", ".env.local"]);
|
|
19
|
+
async function walk(dir, out) {
|
|
20
|
+
for (const entry of await readdir(dir, { withFileTypes: true })) {
|
|
21
|
+
if (entry.isDirectory()) {
|
|
22
|
+
if (!DENY_DIRS.has(entry.name))
|
|
23
|
+
await walk(join(dir, entry.name), out);
|
|
24
|
+
}
|
|
25
|
+
else if (entry.isFile() && !DENY_FILES.has(entry.name)) {
|
|
26
|
+
out.push(join(dir, entry.name));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Tar SOURCE ONLY (sorted, deterministic), hash over relative path + content.
|
|
31
|
+
export async function packageSource(cwd) {
|
|
32
|
+
const absFiles = [];
|
|
33
|
+
await walk(cwd, absFiles);
|
|
34
|
+
absFiles.sort();
|
|
35
|
+
const entries = absFiles.map((f) => relative(cwd, f).split(sep).join("/"));
|
|
36
|
+
const hash = createHash("sha256");
|
|
37
|
+
for (let i = 0; i < absFiles.length; i++) {
|
|
38
|
+
hash.update(entries[i]);
|
|
39
|
+
hash.update("\0");
|
|
40
|
+
hash.update(await readFile(absFiles[i]));
|
|
41
|
+
}
|
|
42
|
+
const sourceHash = hash.digest("hex");
|
|
43
|
+
const outDir = join(cwd, ".helloruntime", "artifacts");
|
|
44
|
+
await mkdir(outDir, { recursive: true });
|
|
45
|
+
const tarPath = join(outDir, `${sourceHash}.tgz`);
|
|
46
|
+
await tar.c({ gzip: true, file: tarPath, cwd, portable: true }, entries);
|
|
47
|
+
return { tarPath, sourceHash, entries };
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=packager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packager.js","sourceRoot":"","sources":["../../src/cli/packager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/cli/project-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAK3F,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAUhF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { helloruntimeConfigSchema } from "@helloruntime/protocol";
|
|
4
|
+
// Load the optional helloruntime.json (infra knobs). Absent → empty config (zero-config
|
|
5
|
+
// deploys still work). Distinct from ~/.helloruntime/config.json, which holds auth. The
|
|
6
|
+
// editor-only "$schema" field is stripped by the validator.
|
|
7
|
+
export async function readProjectConfig(cwd) {
|
|
8
|
+
const raw = await readFile(join(cwd, "helloruntime.json"), "utf8").catch(() => null);
|
|
9
|
+
if (!raw)
|
|
10
|
+
return helloruntimeConfigSchema.parse({});
|
|
11
|
+
let parsed;
|
|
12
|
+
try {
|
|
13
|
+
parsed = JSON.parse(raw);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
throw new Error(`Invalid helloruntime.json: ${error instanceof Error ? error.message : String(error)}`);
|
|
17
|
+
}
|
|
18
|
+
return helloruntimeConfigSchema.parse(parsed);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=project-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/cli/project-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,wBAAwB,EAA2B,MAAM,wBAAwB,CAAC;AAE3F,wFAAwF;AACxF,wFAAwF;AACxF,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACrF,IAAI,CAAC,GAAG;QAAE,OAAO,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function jobsTrigger(name: string, options: {
|
|
2
|
+
payload?: string;
|
|
3
|
+
app?: string;
|
|
4
|
+
}): Promise<void>;
|
|
5
|
+
export declare function cronTrigger(name: string, options: {
|
|
6
|
+
app?: string;
|
|
7
|
+
}): Promise<void>;
|
|
8
|
+
export declare function jobsList(options: {
|
|
9
|
+
status?: string;
|
|
10
|
+
app?: string;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
export declare function cronList(options: {
|
|
13
|
+
app?: string;
|
|
14
|
+
}): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=triggers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../src/cli/triggers.ts"],"names":[],"mappings":"AAyBA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAS1G;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CASxF;AAYD,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBxF;AAUD,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAYvE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { basename } from "node:path";
|
|
3
|
+
import { readConfig } from "./config.js";
|
|
4
|
+
import { helloruntimeRequest } from "./http.js";
|
|
5
|
+
async function resolveAppSlug(explicit) {
|
|
6
|
+
if (explicit)
|
|
7
|
+
return explicit;
|
|
8
|
+
const pkg = await readFile("package.json", "utf8")
|
|
9
|
+
.then((raw) => JSON.parse(raw))
|
|
10
|
+
.catch(() => ({}));
|
|
11
|
+
return pkg.name ?? basename(process.cwd());
|
|
12
|
+
}
|
|
13
|
+
// --payload accepts inline JSON, @file.json, or a bare string.
|
|
14
|
+
async function loadPayload(raw) {
|
|
15
|
+
if (raw == null)
|
|
16
|
+
return undefined;
|
|
17
|
+
const text = raw.startsWith("@") ? await readFile(raw.slice(1), "utf8") : raw;
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(text);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return text;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function jobsTrigger(name, options) {
|
|
26
|
+
const config = await readConfig();
|
|
27
|
+
const slug = await resolveAppSlug(options.app);
|
|
28
|
+
const payload = await loadPayload(options.payload);
|
|
29
|
+
const res = await helloruntimeRequest(config, `/v1/apps/${encodeURIComponent(slug)}/jobs`, {
|
|
30
|
+
method: "POST",
|
|
31
|
+
body: JSON.stringify({ name, payload })
|
|
32
|
+
});
|
|
33
|
+
console.log(`Enqueued job "${name}" → ${res.jobId}`);
|
|
34
|
+
}
|
|
35
|
+
export async function cronTrigger(name, options) {
|
|
36
|
+
const config = await readConfig();
|
|
37
|
+
const slug = await resolveAppSlug(options.app);
|
|
38
|
+
const res = await helloruntimeRequest(config, `/v1/apps/${encodeURIComponent(slug)}/crons/${encodeURIComponent(name)}/trigger`, { method: "POST", body: "{}" });
|
|
39
|
+
console.log(`Triggered cron "${name}" → ${res.jobId}`);
|
|
40
|
+
}
|
|
41
|
+
export async function jobsList(options) {
|
|
42
|
+
const config = await readConfig();
|
|
43
|
+
const slug = await resolveAppSlug(options.app);
|
|
44
|
+
const query = options.status ? `?status=${encodeURIComponent(options.status)}` : "";
|
|
45
|
+
const { jobs } = await helloruntimeRequest(config, `/v1/apps/${encodeURIComponent(slug)}/jobs${query}`);
|
|
46
|
+
if (!jobs.length) {
|
|
47
|
+
console.log("No jobs.");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
for (const j of jobs) {
|
|
51
|
+
const err = j.lastError ? ` — ${j.lastError.split("\n")[0].slice(0, 80)}` : "";
|
|
52
|
+
console.log(`${j.status.padEnd(10)} ${j.kind.padEnd(5)} ${j.name.padEnd(20)} attempt=${j.attempt} ${j.id}${err}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export async function cronList(options) {
|
|
56
|
+
const config = await readConfig();
|
|
57
|
+
const slug = await resolveAppSlug(options.app);
|
|
58
|
+
const { crons } = await helloruntimeRequest(config, `/v1/apps/${encodeURIComponent(slug)}/crons`);
|
|
59
|
+
if (!crons.length) {
|
|
60
|
+
console.log("No crons registered.");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
for (const c of crons) {
|
|
64
|
+
const next = c.nextRunAt ? `next=${c.nextRunAt}` : "next=—";
|
|
65
|
+
console.log(`${c.name.padEnd(20)} ${c.schedule.padEnd(16)} ${c.enabled ? "enabled " : "disabled"} ${next}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=triggers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../src/cli/triggers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type CronHandler } from "@helloruntime/protocol";
|
|
2
|
+
export interface CronDefinition {
|
|
3
|
+
name: string;
|
|
4
|
+
schedule: string;
|
|
5
|
+
handler: CronHandler;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Register a cron handler on a schedule (5-field cron expression). The platform
|
|
9
|
+
* invokes `_helloruntime/cron/<name>` on schedule; the user never runs setInterval.
|
|
10
|
+
*/
|
|
11
|
+
export declare function defineCron(name: string, schedule: string, handler: CronHandler): CronDefinition;
|
|
12
|
+
//# sourceMappingURL=cron.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../src/sdk/cron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAExE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,WAAW,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,cAAc,CAG/F"}
|
package/dist/sdk/cron.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { registerCron } from "@helloruntime/protocol";
|
|
2
|
+
/**
|
|
3
|
+
* Register a cron handler on a schedule (5-field cron expression). The platform
|
|
4
|
+
* invokes `_helloruntime/cron/<name>` on schedule; the user never runs setInterval.
|
|
5
|
+
*/
|
|
6
|
+
export function defineCron(name, schedule, handler) {
|
|
7
|
+
registerCron(name, schedule, handler);
|
|
8
|
+
return { name, schedule, handler };
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=cron.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/sdk/cron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,wBAAwB,CAAC;AAQxE;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,QAAgB,EAAE,OAAoB;IAC7E,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC"}
|
package/dist/sdk/db.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type NodePgDatabase } from "drizzle-orm/node-postgres";
|
|
2
|
+
export declare function getDb(): NodePgDatabase;
|
|
3
|
+
/** Lazily-initialized Drizzle handle. Use with your own schema: `db.select().from(table)`. */
|
|
4
|
+
export declare const db: NodePgDatabase;
|
|
5
|
+
/**
|
|
6
|
+
* Create a Drizzle database bound to your schema, over the injected pooled
|
|
7
|
+
* DATABASE_URL. The recommended entry point:
|
|
8
|
+
*
|
|
9
|
+
* import { createDatabase } from "helloruntime";
|
|
10
|
+
* import * as schema from "./schema";
|
|
11
|
+
* export const db = createDatabase(schema);
|
|
12
|
+
*/
|
|
13
|
+
export declare function createDatabase<TSchema extends Record<string, unknown>>(schema: TSchema): NodePgDatabase<TSchema>;
|
|
14
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/sdk/db.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AASzE,wBAAgB,KAAK,IAAI,cAAc,CAYtC;AAED,8FAA8F;AAC9F,eAAO,MAAM,EAAE,EAAE,cAIf,CAAC;AAEH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,MAAM,EAAE,OAAO,GACd,cAAc,CAAC,OAAO,CAAC,CAQzB"}
|