flingit 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/README.md +84 -0
- package/dist/cli/commands/db.d.ts +9 -0
- package/dist/cli/commands/db.d.ts.map +1 -0
- package/dist/cli/commands/db.js +215 -0
- package/dist/cli/commands/db.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +6 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +145 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/feedback.d.ts +6 -0
- package/dist/cli/commands/feedback.d.ts.map +1 -0
- package/dist/cli/commands/feedback.js +116 -0
- package/dist/cli/commands/feedback.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +161 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/launch.d.ts +12 -0
- package/dist/cli/commands/launch.d.ts.map +1 -0
- package/dist/cli/commands/launch.js +176 -0
- package/dist/cli/commands/launch.js.map +1 -0
- package/dist/cli/commands/login.d.ts +6 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +90 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +6 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +32 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +12 -0
- package/dist/cli/commands/logs.d.ts.map +1 -0
- package/dist/cli/commands/logs.js +261 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/onboard.d.ts +22 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -0
- package/dist/cli/commands/onboard.js +244 -0
- package/dist/cli/commands/onboard.js.map +1 -0
- package/dist/cli/commands/project.d.ts +6 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +142 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/push.d.ts +6 -0
- package/dist/cli/commands/push.d.ts.map +1 -0
- package/dist/cli/commands/push.js +351 -0
- package/dist/cli/commands/push.js.map +1 -0
- package/dist/cli/commands/register.d.ts +6 -0
- package/dist/cli/commands/register.d.ts.map +1 -0
- package/dist/cli/commands/register.js +115 -0
- package/dist/cli/commands/register.js.map +1 -0
- package/dist/cli/commands/secret.d.ts +11 -0
- package/dist/cli/commands/secret.d.ts.map +1 -0
- package/dist/cli/commands/secret.js +124 -0
- package/dist/cli/commands/secret.js.map +1 -0
- package/dist/cli/commands/whoami.d.ts +6 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +54 -0
- package/dist/cli/commands/whoami.js.map +1 -0
- package/dist/cli/deploy/assets.d.ts +73 -0
- package/dist/cli/deploy/assets.d.ts.map +1 -0
- package/dist/cli/deploy/assets.js +167 -0
- package/dist/cli/deploy/assets.js.map +1 -0
- package/dist/cli/deploy/base64-stream.d.ts +16 -0
- package/dist/cli/deploy/base64-stream.d.ts.map +1 -0
- package/dist/cli/deploy/base64-stream.js +44 -0
- package/dist/cli/deploy/base64-stream.js.map +1 -0
- package/dist/cli/deploy/bucket-stream.d.ts +18 -0
- package/dist/cli/deploy/bucket-stream.d.ts.map +1 -0
- package/dist/cli/deploy/bucket-stream.js +63 -0
- package/dist/cli/deploy/bucket-stream.js.map +1 -0
- package/dist/cli/deploy/bundler.d.ts +22 -0
- package/dist/cli/deploy/bundler.d.ts.map +1 -0
- package/dist/cli/deploy/bundler.js +131 -0
- package/dist/cli/deploy/bundler.js.map +1 -0
- package/dist/cli/deploy/worker-entry.d.ts +14 -0
- package/dist/cli/deploy/worker-entry.d.ts.map +1 -0
- package/dist/cli/deploy/worker-entry.js +60 -0
- package/dist/cli/deploy/worker-entry.js.map +1 -0
- package/dist/cli/deploy/wrangler-config.d.ts +20 -0
- package/dist/cli/deploy/wrangler-config.d.ts.map +1 -0
- package/dist/cli/deploy/wrangler-config.js +54 -0
- package/dist/cli/deploy/wrangler-config.js.map +1 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +72 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/config.d.ts +39 -0
- package/dist/cli/utils/config.d.ts.map +1 -0
- package/dist/cli/utils/config.js +105 -0
- package/dist/cli/utils/config.js.map +1 -0
- package/dist/cli/utils/duration.d.ts +21 -0
- package/dist/cli/utils/duration.d.ts.map +1 -0
- package/dist/cli/utils/duration.js +44 -0
- package/dist/cli/utils/duration.js.map +1 -0
- package/dist/cli/utils/environment.d.ts +17 -0
- package/dist/cli/utils/environment.d.ts.map +1 -0
- package/dist/cli/utils/environment.js +27 -0
- package/dist/cli/utils/environment.js.map +1 -0
- package/dist/cli/utils/project.d.ts +24 -0
- package/dist/cli/utils/project.d.ts.map +1 -0
- package/dist/cli/utils/project.js +47 -0
- package/dist/cli/utils/project.js.map +1 -0
- package/dist/cli/utils/registry.d.ts +34 -0
- package/dist/cli/utils/registry.d.ts.map +1 -0
- package/dist/cli/utils/registry.js +94 -0
- package/dist/cli/utils/registry.js.map +1 -0
- package/dist/cli/utils/token.d.ts +12 -0
- package/dist/cli/utils/token.d.ts.map +1 -0
- package/dist/cli/utils/token.js +27 -0
- package/dist/cli/utils/token.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/cron.d.ts +50 -0
- package/dist/runtime/cron.d.ts.map +1 -0
- package/dist/runtime/cron.js +80 -0
- package/dist/runtime/cron.js.map +1 -0
- package/dist/runtime/db.d.ts +93 -0
- package/dist/runtime/db.d.ts.map +1 -0
- package/dist/runtime/db.js +137 -0
- package/dist/runtime/db.js.map +1 -0
- package/dist/runtime/http.d.ts +33 -0
- package/dist/runtime/http.d.ts.map +1 -0
- package/dist/runtime/http.js +36 -0
- package/dist/runtime/http.js.map +1 -0
- package/dist/runtime/log.d.ts +90 -0
- package/dist/runtime/log.d.ts.map +1 -0
- package/dist/runtime/log.js +211 -0
- package/dist/runtime/log.js.map +1 -0
- package/dist/runtime/migrate.d.ts +54 -0
- package/dist/runtime/migrate.d.ts.map +1 -0
- package/dist/runtime/migrate.js +130 -0
- package/dist/runtime/migrate.js.map +1 -0
- package/dist/runtime/secrets.d.ts +36 -0
- package/dist/runtime/secrets.d.ts.map +1 -0
- package/dist/runtime/secrets.js +75 -0
- package/dist/runtime/secrets.js.map +1 -0
- package/dist/worker-runtime/index.d.ts +79 -0
- package/dist/worker-runtime/index.d.ts.map +1 -0
- package/dist/worker-runtime/index.js +203 -0
- package/dist/worker-runtime/index.js.map +1 -0
- package/package.json +81 -0
- package/templates/default/.nvmrc +1 -0
- package/templates/default/CLAUDE.md +197 -0
- package/templates/default/index.html +13 -0
- package/templates/default/package.json +25 -0
- package/templates/default/public/vite.svg +1 -0
- package/templates/default/skills/fling/API.md +335 -0
- package/templates/default/skills/fling/EXAMPLES.md +204 -0
- package/templates/default/skills/fling/FEEDBACK.md +73 -0
- package/templates/default/skills/fling/SKILL.md +159 -0
- package/templates/default/src/react-app/App.css +34 -0
- package/templates/default/src/react-app/App.tsx +27 -0
- package/templates/default/src/react-app/index.css +15 -0
- package/templates/default/src/react-app/main.tsx +10 -0
- package/templates/default/src/react-app/vite-env.d.ts +1 -0
- package/templates/default/src/worker/index.ts +27 -0
- package/templates/default/tsconfig.app.json +22 -0
- package/templates/default/tsconfig.json +7 -0
- package/templates/default/tsconfig.worker.json +11 -0
- package/templates/default/vite.config.ts +21 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database migrations for Fling
|
|
3
|
+
*
|
|
4
|
+
* Migrations run automatically on app startup. Each migration runs exactly once,
|
|
5
|
+
* tracked in the `_migrations` table. Migrations execute in alphabetical order
|
|
6
|
+
* by name.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { migrate, db } from "fling";
|
|
11
|
+
*
|
|
12
|
+
* migrate("001_create_users", async () => {
|
|
13
|
+
* await db.prepare(`
|
|
14
|
+
* CREATE TABLE users (
|
|
15
|
+
* id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
16
|
+
* name TEXT NOT NULL
|
|
17
|
+
* )
|
|
18
|
+
* `).run();
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import { db } from "./db.js";
|
|
23
|
+
// Registry of all migrations
|
|
24
|
+
const migrations = new Map();
|
|
25
|
+
/**
|
|
26
|
+
* Register a database migration.
|
|
27
|
+
*
|
|
28
|
+
* @param name - Unique identifier for the migration (use numeric prefix for ordering, e.g., "001_create_users")
|
|
29
|
+
* @param handler - Async function that performs the migration
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* migrate("001_create_users", async () => {
|
|
34
|
+
* await db.prepare(`CREATE TABLE users (...)`).run();
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export function migrate(name, handler) {
|
|
39
|
+
if (migrations.has(name)) {
|
|
40
|
+
throw new Error(`Migration "${name}" already registered`);
|
|
41
|
+
}
|
|
42
|
+
migrations.set(name, { name, handler });
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Run all pending migrations.
|
|
46
|
+
* Called automatically by the Fling runtime on startup.
|
|
47
|
+
*/
|
|
48
|
+
export async function runMigrations() {
|
|
49
|
+
// Skip if no migrations registered
|
|
50
|
+
if (migrations.size === 0) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Create tracking table if it doesn't exist
|
|
54
|
+
db.exec(`
|
|
55
|
+
CREATE TABLE IF NOT EXISTS _migrations (
|
|
56
|
+
name TEXT PRIMARY KEY,
|
|
57
|
+
applied_at TEXT DEFAULT (datetime('now'))
|
|
58
|
+
)
|
|
59
|
+
`);
|
|
60
|
+
// Get already-applied migrations
|
|
61
|
+
const applied = new Set();
|
|
62
|
+
const { results } = db.prepare("SELECT name FROM _migrations").all();
|
|
63
|
+
for (const row of results) {
|
|
64
|
+
applied.add(row.name);
|
|
65
|
+
}
|
|
66
|
+
// Sort migrations alphabetically by name
|
|
67
|
+
const sortedMigrations = Array.from(migrations.values()).sort((a, b) => a.name.localeCompare(b.name));
|
|
68
|
+
// Run pending migrations
|
|
69
|
+
for (const migration of sortedMigrations) {
|
|
70
|
+
if (applied.has(migration.name)) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
console.log(`[migrate] Running "${migration.name}"...`);
|
|
74
|
+
try {
|
|
75
|
+
await migration.handler();
|
|
76
|
+
// Record successful migration
|
|
77
|
+
db.prepare("INSERT INTO _migrations (name) VALUES (?)").bind(migration.name).run();
|
|
78
|
+
console.log(`[migrate] Completed "${migration.name}"`);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
// Log detailed error information
|
|
82
|
+
const separator = "=".repeat(60);
|
|
83
|
+
console.error(`\n${separator}`);
|
|
84
|
+
console.error(`MIGRATION FAILED: ${migration.name}`);
|
|
85
|
+
console.error(separator);
|
|
86
|
+
if (error instanceof Error) {
|
|
87
|
+
// Show error type if it's not a generic Error
|
|
88
|
+
const errorType = error.constructor.name;
|
|
89
|
+
if (errorType !== "Error") {
|
|
90
|
+
console.error(`Type: ${errorType}`);
|
|
91
|
+
}
|
|
92
|
+
console.error(`Message: ${error.message}`);
|
|
93
|
+
// SQLite errors have a 'code' property (e.g., SQLITE_ERROR, SQLITE_CONSTRAINT)
|
|
94
|
+
if ("code" in error && error.code) {
|
|
95
|
+
console.error(`Code: ${typeof error.code === "string" ? error.code : JSON.stringify(error.code)}`);
|
|
96
|
+
}
|
|
97
|
+
// Some errors include the SQL that failed
|
|
98
|
+
if ("sql" in error && error.sql) {
|
|
99
|
+
console.error(`SQL: ${typeof error.sql === "string" ? error.sql : JSON.stringify(error.sql)}`);
|
|
100
|
+
}
|
|
101
|
+
// D1 errors may have additional context
|
|
102
|
+
if ("cause" in error && error.cause) {
|
|
103
|
+
console.error(`Cause: ${error.cause instanceof Error ? error.cause.message : JSON.stringify(error.cause)}`);
|
|
104
|
+
}
|
|
105
|
+
if (error.stack) {
|
|
106
|
+
console.error(`\nStack trace:\n${error.stack}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
console.error("Error:", error);
|
|
111
|
+
}
|
|
112
|
+
console.error(`${separator}\n`);
|
|
113
|
+
// Re-throw to prevent server startup
|
|
114
|
+
throw new Error(`Migration "${migration.name}" failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get all registered migrations (for testing/debugging).
|
|
120
|
+
*/
|
|
121
|
+
export function getMigrations() {
|
|
122
|
+
return migrations;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Clear all registered migrations (for testing).
|
|
126
|
+
*/
|
|
127
|
+
export function clearMigrations() {
|
|
128
|
+
migrations.clear();
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/runtime/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secrets primitive for managing API keys and credentials
|
|
3
|
+
*
|
|
4
|
+
* Secrets are retrieved by name. If a secret is not set,
|
|
5
|
+
* Fling throws an error immediately - no default values.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Secrets interface for retrieving credentials
|
|
9
|
+
*/
|
|
10
|
+
export declare const secrets: {
|
|
11
|
+
/**
|
|
12
|
+
* Get a secret by name. Throws if the secret is not set.
|
|
13
|
+
*
|
|
14
|
+
* @param name - The secret name (e.g., "GITHUB_TOKEN")
|
|
15
|
+
* @returns The secret value
|
|
16
|
+
* @throws Error if the secret is not set
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* import { secrets } from "fling";
|
|
21
|
+
*
|
|
22
|
+
* const githubToken = secrets.get("GITHUB_TOKEN");
|
|
23
|
+
* const openaiKey = secrets.get("OPENAI_API_KEY");
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
get(name: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Check if a secret exists without throwing
|
|
29
|
+
*/
|
|
30
|
+
has(name: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Clear the secrets cache (internal use)
|
|
33
|
+
*/
|
|
34
|
+
clearCache(): void;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/runtime/secrets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqCH;;GAEG;AACH,eAAO,MAAM,OAAO;IAClB;;;;;;;;;;;;;;OAcG;cACO,MAAM,GAAG,MAAM;IAazB;;OAEG;cACO,MAAM,GAAG,OAAO;IAK1B;;OAEG;kBACW,IAAI;CAGnB,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secrets primitive for managing API keys and credentials
|
|
3
|
+
*
|
|
4
|
+
* Secrets are retrieved by name. If a secret is not set,
|
|
5
|
+
* Fling throws an error immediately - no default values.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
// Secrets file path
|
|
10
|
+
const SECRETS_PATH = process.env["FLING_SECRETS_PATH"] ?? join(process.cwd(), ".fling", "secrets");
|
|
11
|
+
let secretsCache = null;
|
|
12
|
+
function loadSecrets() {
|
|
13
|
+
if (secretsCache) {
|
|
14
|
+
return secretsCache;
|
|
15
|
+
}
|
|
16
|
+
secretsCache = new Map();
|
|
17
|
+
if (existsSync(SECRETS_PATH)) {
|
|
18
|
+
const content = readFileSync(SECRETS_PATH, "utf-8");
|
|
19
|
+
for (const line of content.split("\n")) {
|
|
20
|
+
const trimmed = line.trim();
|
|
21
|
+
if (!trimmed || trimmed.startsWith("#")) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const eqIndex = trimmed.indexOf("=");
|
|
25
|
+
if (eqIndex > 0) {
|
|
26
|
+
const key = trimmed.slice(0, eqIndex);
|
|
27
|
+
const value = trimmed.slice(eqIndex + 1);
|
|
28
|
+
secretsCache.set(key, value);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return secretsCache;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Secrets interface for retrieving credentials
|
|
36
|
+
*/
|
|
37
|
+
export const secrets = {
|
|
38
|
+
/**
|
|
39
|
+
* Get a secret by name. Throws if the secret is not set.
|
|
40
|
+
*
|
|
41
|
+
* @param name - The secret name (e.g., "GITHUB_TOKEN")
|
|
42
|
+
* @returns The secret value
|
|
43
|
+
* @throws Error if the secret is not set
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* import { secrets } from "fling";
|
|
48
|
+
*
|
|
49
|
+
* const githubToken = secrets.get("GITHUB_TOKEN");
|
|
50
|
+
* const openaiKey = secrets.get("OPENAI_API_KEY");
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
get(name) {
|
|
54
|
+
const secrets = loadSecrets();
|
|
55
|
+
const value = secrets.get(name);
|
|
56
|
+
if (value === undefined) {
|
|
57
|
+
throw new Error(`Secret "${name}" is not set. Run: fling secret set ${name}=<value>`);
|
|
58
|
+
}
|
|
59
|
+
return value;
|
|
60
|
+
},
|
|
61
|
+
/**
|
|
62
|
+
* Check if a secret exists without throwing
|
|
63
|
+
*/
|
|
64
|
+
has(name) {
|
|
65
|
+
const secrets = loadSecrets();
|
|
66
|
+
return secrets.has(name);
|
|
67
|
+
},
|
|
68
|
+
/**
|
|
69
|
+
* Clear the secrets cache (internal use)
|
|
70
|
+
*/
|
|
71
|
+
clearCache() {
|
|
72
|
+
secretsCache = null;
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/runtime/secrets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,oBAAoB;AACpB,MAAM,YAAY,GAChB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAEhF,IAAI,YAAY,GAA+B,IAAI,CAAC;AAEpD,SAAS,WAAW;IAClB,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;IAEzB,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACpD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,SAAS;YACX,CAAC;YACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;gBACzC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB;;;;;;;;;;;;;;OAcG;IACH,GAAG,CAAC,IAAY;QACd,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEhC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,WAAW,IAAI,uCAAuC,IAAI,UAAU,CACrE,CAAC;QACJ,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,UAAU;QACR,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fling Worker Runtime
|
|
3
|
+
*
|
|
4
|
+
* Worker-compatible runtime for Cloudflare Workers deployment.
|
|
5
|
+
* This module provides the same exports as the main fling package,
|
|
6
|
+
* but with implementations that work in the Workers environment.
|
|
7
|
+
*
|
|
8
|
+
* Used automatically via conditional exports in package.json:
|
|
9
|
+
* - Node.js: imports from src/index.ts (local runtime)
|
|
10
|
+
* - Workers: imports from src/worker-runtime/index.ts (this file)
|
|
11
|
+
*/
|
|
12
|
+
import { Hono } from "hono";
|
|
13
|
+
/**
|
|
14
|
+
* Initialize the Worker environment.
|
|
15
|
+
* Called by the generated _worker.ts before importing user code.
|
|
16
|
+
*/
|
|
17
|
+
export declare function __initEnv(env: Record<string, unknown>): void;
|
|
18
|
+
/**
|
|
19
|
+
* Get the Worker environment.
|
|
20
|
+
*/
|
|
21
|
+
export declare function __getEnv(): Record<string, unknown>;
|
|
22
|
+
type Variables = {
|
|
23
|
+
requestId: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* The main Hono app instance for Workers.
|
|
27
|
+
*/
|
|
28
|
+
export declare const app: Hono<{
|
|
29
|
+
Variables: Variables;
|
|
30
|
+
}, import("hono/types").BlankSchema, "/">;
|
|
31
|
+
/**
|
|
32
|
+
* Get the Hono app instance (used by generated worker entry).
|
|
33
|
+
*/
|
|
34
|
+
export declare function __getApp(): Hono<{
|
|
35
|
+
Variables: Variables;
|
|
36
|
+
}, import("hono/types").BlankSchema, "/">;
|
|
37
|
+
type CronHandler = () => void | Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Register a cron job (stub - handlers stored for future use).
|
|
40
|
+
*/
|
|
41
|
+
export declare function cron(name: string, schedule: string, handler: CronHandler): void;
|
|
42
|
+
/**
|
|
43
|
+
* Get registered cron handlers.
|
|
44
|
+
*/
|
|
45
|
+
export declare function __getCronHandlers(): Map<string, {
|
|
46
|
+
schedule: string;
|
|
47
|
+
handler: CronHandler;
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* Register a database migration (Worker runtime).
|
|
51
|
+
*/
|
|
52
|
+
export declare function migrate(name: string, handler: () => Promise<void>): void;
|
|
53
|
+
/**
|
|
54
|
+
* Run all pending migrations (called by worker entry).
|
|
55
|
+
*/
|
|
56
|
+
export declare function __runMigrations(): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* D1 database interface.
|
|
59
|
+
* Passes through to the D1 binding from the Worker environment.
|
|
60
|
+
*
|
|
61
|
+
* Note: D1 operations are async. User code should always use `await`:
|
|
62
|
+
* const row = await db.prepare("SELECT * FROM items WHERE id = ?").bind(id).first();
|
|
63
|
+
*
|
|
64
|
+
* This works in both local (sync SQLite) and Workers (async D1) environments
|
|
65
|
+
* because `await` on a sync value just returns it.
|
|
66
|
+
*/
|
|
67
|
+
export declare const db: {
|
|
68
|
+
prepare(sql: string): any;
|
|
69
|
+
exec(_sql: string): never;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Secrets stub - will use Worker bindings when implemented.
|
|
73
|
+
*/
|
|
74
|
+
export declare const secrets: {
|
|
75
|
+
get(name: string): string;
|
|
76
|
+
has(name: string): boolean;
|
|
77
|
+
};
|
|
78
|
+
export {};
|
|
79
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/worker-runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKlD;AAMD,KAAK,SAAS,GAAG;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,GAAG;eAAyB,SAAS;yCAAK,CAAC;AASxD;;GAEG;AACH,wBAAgB,QAAQ;eAZiB,SAAS;0CAcjD;AAMD,KAAK,WAAW,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAG9C;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAE/E;AAED;;GAEG;AACH,wBAAgB,iBAAiB;cAZgB,MAAM;aAAW,WAAW;GAc5E;AAaD;;GAEG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAC3B,IAAI,CAKN;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA2FrD;AAMD;;;;;;;;;GASG;AACH,eAAO,MAAM,EAAE;iBACA,MAAM;eAYR,MAAM;CASlB,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,OAAO;cACR,MAAM,GAAG,MAAM;cAUf,MAAM,GAAG,OAAO;CAI3B,CAAC"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fling Worker Runtime
|
|
3
|
+
*
|
|
4
|
+
* Worker-compatible runtime for Cloudflare Workers deployment.
|
|
5
|
+
* This module provides the same exports as the main fling package,
|
|
6
|
+
* but with implementations that work in the Workers environment.
|
|
7
|
+
*
|
|
8
|
+
* Used automatically via conditional exports in package.json:
|
|
9
|
+
* - Node.js: imports from src/index.ts (local runtime)
|
|
10
|
+
* - Workers: imports from src/worker-runtime/index.ts (this file)
|
|
11
|
+
*/
|
|
12
|
+
import { Hono } from "hono";
|
|
13
|
+
// Worker environment bindings (set by __initEnv)
|
|
14
|
+
let workerEnv = null;
|
|
15
|
+
/**
|
|
16
|
+
* Initialize the Worker environment.
|
|
17
|
+
* Called by the generated _worker.ts before importing user code.
|
|
18
|
+
*/
|
|
19
|
+
export function __initEnv(env) {
|
|
20
|
+
workerEnv = env;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get the Worker environment.
|
|
24
|
+
*/
|
|
25
|
+
export function __getEnv() {
|
|
26
|
+
if (!workerEnv) {
|
|
27
|
+
throw new Error("Worker environment not initialized");
|
|
28
|
+
}
|
|
29
|
+
return workerEnv;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The main Hono app instance for Workers.
|
|
33
|
+
*/
|
|
34
|
+
export const app = new Hono();
|
|
35
|
+
// Add request ID middleware
|
|
36
|
+
app.use("*", async (c, next) => {
|
|
37
|
+
const requestId = crypto.randomUUID();
|
|
38
|
+
c.set("requestId", requestId);
|
|
39
|
+
await next();
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* Get the Hono app instance (used by generated worker entry).
|
|
43
|
+
*/
|
|
44
|
+
export function __getApp() {
|
|
45
|
+
return app;
|
|
46
|
+
}
|
|
47
|
+
const cronHandlers = new Map();
|
|
48
|
+
/**
|
|
49
|
+
* Register a cron job (stub - handlers stored for future use).
|
|
50
|
+
*/
|
|
51
|
+
export function cron(name, schedule, handler) {
|
|
52
|
+
cronHandlers.set(name, { schedule, handler });
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get registered cron handlers.
|
|
56
|
+
*/
|
|
57
|
+
export function __getCronHandlers() {
|
|
58
|
+
return cronHandlers;
|
|
59
|
+
}
|
|
60
|
+
const migrations = new Map();
|
|
61
|
+
/**
|
|
62
|
+
* Register a database migration (Worker runtime).
|
|
63
|
+
*/
|
|
64
|
+
export function migrate(name, handler) {
|
|
65
|
+
if (migrations.has(name)) {
|
|
66
|
+
throw new Error(`Migration "${name}" already registered`);
|
|
67
|
+
}
|
|
68
|
+
migrations.set(name, { name, handler });
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Run all pending migrations (called by worker entry).
|
|
72
|
+
*/
|
|
73
|
+
export async function __runMigrations() {
|
|
74
|
+
// Skip if no migrations registered
|
|
75
|
+
if (migrations.size === 0) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Create tracking table if it doesn't exist
|
|
79
|
+
// Note: Using prepare().run() instead of exec() for D1 compatibility
|
|
80
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
81
|
+
const createStmt = db.prepare(`
|
|
82
|
+
CREATE TABLE IF NOT EXISTS _migrations (
|
|
83
|
+
name TEXT PRIMARY KEY,
|
|
84
|
+
applied_at TEXT DEFAULT (datetime('now'))
|
|
85
|
+
)
|
|
86
|
+
`);
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
|
|
88
|
+
await createStmt.run();
|
|
89
|
+
// Get already-applied migrations
|
|
90
|
+
const applied = new Set();
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment
|
|
92
|
+
const result = await db.prepare("SELECT name FROM _migrations").all();
|
|
93
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
94
|
+
const rows = result.results;
|
|
95
|
+
for (const row of rows) {
|
|
96
|
+
applied.add(row.name);
|
|
97
|
+
}
|
|
98
|
+
// Sort migrations alphabetically by name
|
|
99
|
+
const sortedMigrations = Array.from(migrations.values()).sort((a, b) => a.name.localeCompare(b.name));
|
|
100
|
+
// Run pending migrations
|
|
101
|
+
for (const migration of sortedMigrations) {
|
|
102
|
+
if (applied.has(migration.name)) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
console.log(`[migrate] Running "${migration.name}"...`);
|
|
106
|
+
try {
|
|
107
|
+
await migration.handler();
|
|
108
|
+
// Record successful migration
|
|
109
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
|
|
110
|
+
await db.prepare("INSERT INTO _migrations (name) VALUES (?)").bind(migration.name).run();
|
|
111
|
+
console.log(`[migrate] Completed "${migration.name}"`);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
// Log detailed error information
|
|
115
|
+
const separator = "=".repeat(60);
|
|
116
|
+
console.error(`\n${separator}`);
|
|
117
|
+
console.error(`MIGRATION FAILED: ${migration.name}`);
|
|
118
|
+
console.error(separator);
|
|
119
|
+
if (error instanceof Error) {
|
|
120
|
+
// Show error type if it's not a generic Error
|
|
121
|
+
const errorType = error.constructor.name;
|
|
122
|
+
if (errorType !== "Error") {
|
|
123
|
+
console.error(`Type: ${errorType}`);
|
|
124
|
+
}
|
|
125
|
+
console.error(`Message: ${error.message}`);
|
|
126
|
+
// SQLite/D1 errors have a 'code' property
|
|
127
|
+
if ("code" in error && error.code) {
|
|
128
|
+
console.error(`Code: ${typeof error.code === "string" ? error.code : JSON.stringify(error.code)}`);
|
|
129
|
+
}
|
|
130
|
+
// Some errors include the SQL that failed
|
|
131
|
+
if ("sql" in error && error.sql) {
|
|
132
|
+
console.error(`SQL: ${typeof error.sql === "string" ? error.sql : JSON.stringify(error.sql)}`);
|
|
133
|
+
}
|
|
134
|
+
// D1 errors may have additional context
|
|
135
|
+
if ("cause" in error && error.cause) {
|
|
136
|
+
console.error(`Cause: ${error.cause instanceof Error ? error.cause.message : JSON.stringify(error.cause)}`);
|
|
137
|
+
}
|
|
138
|
+
if (error.stack) {
|
|
139
|
+
console.error(`\nStack trace:\n${error.stack}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
console.error("Error:", error);
|
|
144
|
+
}
|
|
145
|
+
console.error(`${separator}\n`);
|
|
146
|
+
// Re-throw to prevent server startup
|
|
147
|
+
throw new Error(`Migration "${migration.name}" failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// ============================================================================
|
|
152
|
+
// Database (D1)
|
|
153
|
+
// ============================================================================
|
|
154
|
+
/**
|
|
155
|
+
* D1 database interface.
|
|
156
|
+
* Passes through to the D1 binding from the Worker environment.
|
|
157
|
+
*
|
|
158
|
+
* Note: D1 operations are async. User code should always use `await`:
|
|
159
|
+
* const row = await db.prepare("SELECT * FROM items WHERE id = ?").bind(id).first();
|
|
160
|
+
*
|
|
161
|
+
* This works in both local (sync SQLite) and Workers (async D1) environments
|
|
162
|
+
* because `await` on a sync value just returns it.
|
|
163
|
+
*/
|
|
164
|
+
export const db = {
|
|
165
|
+
prepare(sql) {
|
|
166
|
+
const env = __getEnv();
|
|
167
|
+
const d1 = env["DB"];
|
|
168
|
+
if (!d1) {
|
|
169
|
+
throw new Error('D1 database not configured. Add [[d1_databases]] to wrangler.toml with binding = "DB".');
|
|
170
|
+
}
|
|
171
|
+
// D1 binding type not available outside Workers context
|
|
172
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-return
|
|
173
|
+
return d1.prepare(sql);
|
|
174
|
+
},
|
|
175
|
+
exec(_sql) {
|
|
176
|
+
// D1 exec() is broken in deployed environments - it fails with:
|
|
177
|
+
// "TypeError: Cannot read properties of undefined (reading 'duration')"
|
|
178
|
+
// See: https://github.com/cloudflare/workers-sdk/issues/3892
|
|
179
|
+
throw new Error("db.exec() is not supported in deployed D1 databases. " +
|
|
180
|
+
"Use db.prepare(sql).run() instead for DDL statements.");
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
// ============================================================================
|
|
184
|
+
// Secrets (stub for Phase 2A - not yet implemented)
|
|
185
|
+
// ============================================================================
|
|
186
|
+
/**
|
|
187
|
+
* Secrets stub - will use Worker bindings when implemented.
|
|
188
|
+
*/
|
|
189
|
+
export const secrets = {
|
|
190
|
+
get(name) {
|
|
191
|
+
const env = __getEnv();
|
|
192
|
+
const value = env[name];
|
|
193
|
+
if (typeof value !== "string") {
|
|
194
|
+
throw new Error(`Secret "${name}" is not set. Add it as a Worker secret binding.`);
|
|
195
|
+
}
|
|
196
|
+
return value;
|
|
197
|
+
},
|
|
198
|
+
has(name) {
|
|
199
|
+
const env = __getEnv();
|
|
200
|
+
return typeof env[name] === "string";
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worker-runtime/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "flingit",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Personal Software Platform - Build and deploy personal tools through conversation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=22.0.0"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"bin": {
|
|
12
|
+
"fling": "./dist/cli/index.js"
|
|
13
|
+
},
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"workerd": "./dist/worker-runtime/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"import": "./dist/index.js",
|
|
19
|
+
"default": "./dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./worker-runtime": {
|
|
22
|
+
"types": "./dist/worker-runtime/index.d.ts",
|
|
23
|
+
"import": "./dist/worker-runtime/index.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist",
|
|
28
|
+
"!dist/cli-admin",
|
|
29
|
+
"templates"
|
|
30
|
+
],
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/glideapps/fling.git"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc",
|
|
37
|
+
"dev": "tsx watch src/cli/index.ts",
|
|
38
|
+
"start": "node dist/cli/index.js",
|
|
39
|
+
"cli": "npm run build && node dist/cli/index.js",
|
|
40
|
+
"cli-admin": "npm run build && node dist/cli-admin/index.js",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"lint": "eslint src/ platform/",
|
|
43
|
+
"lint:fix": "eslint src/ platform/ --fix",
|
|
44
|
+
"check": "npm run typecheck && npm run lint",
|
|
45
|
+
"clean": "rm -rf dist",
|
|
46
|
+
"test": "vitest",
|
|
47
|
+
"test:run": "vitest run",
|
|
48
|
+
"test:coverage": "vitest run --coverage",
|
|
49
|
+
"prepublishOnly": "npm run lint && npm run typecheck && npm run build && npm run test:run",
|
|
50
|
+
"prepare": "husky"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@clack/prompts": "^0.11.0",
|
|
54
|
+
"@hono/node-server": "^1.19.9",
|
|
55
|
+
"better-sqlite3": "^12.6.2",
|
|
56
|
+
"commander": "^14.0.2",
|
|
57
|
+
"croner": "^9.1.0",
|
|
58
|
+
"dotenv": "^17.2.3",
|
|
59
|
+
"esbuild": "^0.27.2",
|
|
60
|
+
"hono": "^4.11.4"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@eslint/js": "^9.39.2",
|
|
64
|
+
"@types/better-sqlite3": "^7.6.12",
|
|
65
|
+
"@types/node": "^24.10.9",
|
|
66
|
+
"eslint": "^9.39.2",
|
|
67
|
+
"husky": "^9.1.7",
|
|
68
|
+
"tsx": "^4.19.0",
|
|
69
|
+
"typescript": "^5.7.0",
|
|
70
|
+
"typescript-eslint": "^8.53.0",
|
|
71
|
+
"vitest": "^4.0.17",
|
|
72
|
+
"wrangler": "^4.60.0"
|
|
73
|
+
},
|
|
74
|
+
"keywords": [
|
|
75
|
+
"fling",
|
|
76
|
+
"personal-software",
|
|
77
|
+
"platform",
|
|
78
|
+
"cloudflare",
|
|
79
|
+
"workers"
|
|
80
|
+
]
|
|
81
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
24
|