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.
Files changed (161) hide show
  1. package/README.md +84 -0
  2. package/dist/cli/commands/db.d.ts +9 -0
  3. package/dist/cli/commands/db.d.ts.map +1 -0
  4. package/dist/cli/commands/db.js +215 -0
  5. package/dist/cli/commands/db.js.map +1 -0
  6. package/dist/cli/commands/dev.d.ts +6 -0
  7. package/dist/cli/commands/dev.d.ts.map +1 -0
  8. package/dist/cli/commands/dev.js +145 -0
  9. package/dist/cli/commands/dev.js.map +1 -0
  10. package/dist/cli/commands/feedback.d.ts +6 -0
  11. package/dist/cli/commands/feedback.d.ts.map +1 -0
  12. package/dist/cli/commands/feedback.js +116 -0
  13. package/dist/cli/commands/feedback.js.map +1 -0
  14. package/dist/cli/commands/init.d.ts +6 -0
  15. package/dist/cli/commands/init.d.ts.map +1 -0
  16. package/dist/cli/commands/init.js +161 -0
  17. package/dist/cli/commands/init.js.map +1 -0
  18. package/dist/cli/commands/launch.d.ts +12 -0
  19. package/dist/cli/commands/launch.d.ts.map +1 -0
  20. package/dist/cli/commands/launch.js +176 -0
  21. package/dist/cli/commands/launch.js.map +1 -0
  22. package/dist/cli/commands/login.d.ts +6 -0
  23. package/dist/cli/commands/login.d.ts.map +1 -0
  24. package/dist/cli/commands/login.js +90 -0
  25. package/dist/cli/commands/login.js.map +1 -0
  26. package/dist/cli/commands/logout.d.ts +6 -0
  27. package/dist/cli/commands/logout.d.ts.map +1 -0
  28. package/dist/cli/commands/logout.js +32 -0
  29. package/dist/cli/commands/logout.js.map +1 -0
  30. package/dist/cli/commands/logs.d.ts +12 -0
  31. package/dist/cli/commands/logs.d.ts.map +1 -0
  32. package/dist/cli/commands/logs.js +261 -0
  33. package/dist/cli/commands/logs.js.map +1 -0
  34. package/dist/cli/commands/onboard.d.ts +22 -0
  35. package/dist/cli/commands/onboard.d.ts.map +1 -0
  36. package/dist/cli/commands/onboard.js +244 -0
  37. package/dist/cli/commands/onboard.js.map +1 -0
  38. package/dist/cli/commands/project.d.ts +6 -0
  39. package/dist/cli/commands/project.d.ts.map +1 -0
  40. package/dist/cli/commands/project.js +142 -0
  41. package/dist/cli/commands/project.js.map +1 -0
  42. package/dist/cli/commands/push.d.ts +6 -0
  43. package/dist/cli/commands/push.d.ts.map +1 -0
  44. package/dist/cli/commands/push.js +351 -0
  45. package/dist/cli/commands/push.js.map +1 -0
  46. package/dist/cli/commands/register.d.ts +6 -0
  47. package/dist/cli/commands/register.d.ts.map +1 -0
  48. package/dist/cli/commands/register.js +115 -0
  49. package/dist/cli/commands/register.js.map +1 -0
  50. package/dist/cli/commands/secret.d.ts +11 -0
  51. package/dist/cli/commands/secret.d.ts.map +1 -0
  52. package/dist/cli/commands/secret.js +124 -0
  53. package/dist/cli/commands/secret.js.map +1 -0
  54. package/dist/cli/commands/whoami.d.ts +6 -0
  55. package/dist/cli/commands/whoami.d.ts.map +1 -0
  56. package/dist/cli/commands/whoami.js +54 -0
  57. package/dist/cli/commands/whoami.js.map +1 -0
  58. package/dist/cli/deploy/assets.d.ts +73 -0
  59. package/dist/cli/deploy/assets.d.ts.map +1 -0
  60. package/dist/cli/deploy/assets.js +167 -0
  61. package/dist/cli/deploy/assets.js.map +1 -0
  62. package/dist/cli/deploy/base64-stream.d.ts +16 -0
  63. package/dist/cli/deploy/base64-stream.d.ts.map +1 -0
  64. package/dist/cli/deploy/base64-stream.js +44 -0
  65. package/dist/cli/deploy/base64-stream.js.map +1 -0
  66. package/dist/cli/deploy/bucket-stream.d.ts +18 -0
  67. package/dist/cli/deploy/bucket-stream.d.ts.map +1 -0
  68. package/dist/cli/deploy/bucket-stream.js +63 -0
  69. package/dist/cli/deploy/bucket-stream.js.map +1 -0
  70. package/dist/cli/deploy/bundler.d.ts +22 -0
  71. package/dist/cli/deploy/bundler.d.ts.map +1 -0
  72. package/dist/cli/deploy/bundler.js +131 -0
  73. package/dist/cli/deploy/bundler.js.map +1 -0
  74. package/dist/cli/deploy/worker-entry.d.ts +14 -0
  75. package/dist/cli/deploy/worker-entry.d.ts.map +1 -0
  76. package/dist/cli/deploy/worker-entry.js +60 -0
  77. package/dist/cli/deploy/worker-entry.js.map +1 -0
  78. package/dist/cli/deploy/wrangler-config.d.ts +20 -0
  79. package/dist/cli/deploy/wrangler-config.d.ts.map +1 -0
  80. package/dist/cli/deploy/wrangler-config.js +54 -0
  81. package/dist/cli/deploy/wrangler-config.js.map +1 -0
  82. package/dist/cli/index.d.ts +10 -0
  83. package/dist/cli/index.d.ts.map +1 -0
  84. package/dist/cli/index.js +72 -0
  85. package/dist/cli/index.js.map +1 -0
  86. package/dist/cli/utils/config.d.ts +39 -0
  87. package/dist/cli/utils/config.d.ts.map +1 -0
  88. package/dist/cli/utils/config.js +105 -0
  89. package/dist/cli/utils/config.js.map +1 -0
  90. package/dist/cli/utils/duration.d.ts +21 -0
  91. package/dist/cli/utils/duration.d.ts.map +1 -0
  92. package/dist/cli/utils/duration.js +44 -0
  93. package/dist/cli/utils/duration.js.map +1 -0
  94. package/dist/cli/utils/environment.d.ts +17 -0
  95. package/dist/cli/utils/environment.d.ts.map +1 -0
  96. package/dist/cli/utils/environment.js +27 -0
  97. package/dist/cli/utils/environment.js.map +1 -0
  98. package/dist/cli/utils/project.d.ts +24 -0
  99. package/dist/cli/utils/project.d.ts.map +1 -0
  100. package/dist/cli/utils/project.js +47 -0
  101. package/dist/cli/utils/project.js.map +1 -0
  102. package/dist/cli/utils/registry.d.ts +34 -0
  103. package/dist/cli/utils/registry.d.ts.map +1 -0
  104. package/dist/cli/utils/registry.js +94 -0
  105. package/dist/cli/utils/registry.js.map +1 -0
  106. package/dist/cli/utils/token.d.ts +12 -0
  107. package/dist/cli/utils/token.d.ts.map +1 -0
  108. package/dist/cli/utils/token.js +27 -0
  109. package/dist/cli/utils/token.js.map +1 -0
  110. package/dist/index.d.ts +12 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +12 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/runtime/cron.d.ts +50 -0
  115. package/dist/runtime/cron.d.ts.map +1 -0
  116. package/dist/runtime/cron.js +80 -0
  117. package/dist/runtime/cron.js.map +1 -0
  118. package/dist/runtime/db.d.ts +93 -0
  119. package/dist/runtime/db.d.ts.map +1 -0
  120. package/dist/runtime/db.js +137 -0
  121. package/dist/runtime/db.js.map +1 -0
  122. package/dist/runtime/http.d.ts +33 -0
  123. package/dist/runtime/http.d.ts.map +1 -0
  124. package/dist/runtime/http.js +36 -0
  125. package/dist/runtime/http.js.map +1 -0
  126. package/dist/runtime/log.d.ts +90 -0
  127. package/dist/runtime/log.d.ts.map +1 -0
  128. package/dist/runtime/log.js +211 -0
  129. package/dist/runtime/log.js.map +1 -0
  130. package/dist/runtime/migrate.d.ts +54 -0
  131. package/dist/runtime/migrate.d.ts.map +1 -0
  132. package/dist/runtime/migrate.js +130 -0
  133. package/dist/runtime/migrate.js.map +1 -0
  134. package/dist/runtime/secrets.d.ts +36 -0
  135. package/dist/runtime/secrets.d.ts.map +1 -0
  136. package/dist/runtime/secrets.js +75 -0
  137. package/dist/runtime/secrets.js.map +1 -0
  138. package/dist/worker-runtime/index.d.ts +79 -0
  139. package/dist/worker-runtime/index.d.ts.map +1 -0
  140. package/dist/worker-runtime/index.js +203 -0
  141. package/dist/worker-runtime/index.js.map +1 -0
  142. package/package.json +81 -0
  143. package/templates/default/.nvmrc +1 -0
  144. package/templates/default/CLAUDE.md +197 -0
  145. package/templates/default/index.html +13 -0
  146. package/templates/default/package.json +25 -0
  147. package/templates/default/public/vite.svg +1 -0
  148. package/templates/default/skills/fling/API.md +335 -0
  149. package/templates/default/skills/fling/EXAMPLES.md +204 -0
  150. package/templates/default/skills/fling/FEEDBACK.md +73 -0
  151. package/templates/default/skills/fling/SKILL.md +159 -0
  152. package/templates/default/src/react-app/App.css +34 -0
  153. package/templates/default/src/react-app/App.tsx +27 -0
  154. package/templates/default/src/react-app/index.css +15 -0
  155. package/templates/default/src/react-app/main.tsx +10 -0
  156. package/templates/default/src/react-app/vite-env.d.ts +1 -0
  157. package/templates/default/src/worker/index.ts +27 -0
  158. package/templates/default/tsconfig.app.json +22 -0
  159. package/templates/default/tsconfig.json +7 -0
  160. package/templates/default/tsconfig.worker.json +11 -0
  161. 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