decocms 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +95 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +373 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/add/add.d.ts +7 -0
  7. package/dist/commands/add/add.d.ts.map +1 -0
  8. package/dist/commands/add/add.js +90 -0
  9. package/dist/commands/add/add.js.map +1 -0
  10. package/dist/commands/auth/login.d.ts +2 -0
  11. package/dist/commands/auth/login.d.ts.map +1 -0
  12. package/dist/commands/auth/login.js +125 -0
  13. package/dist/commands/auth/login.js.map +1 -0
  14. package/dist/commands/auth/whoami.d.ts +2 -0
  15. package/dist/commands/auth/whoami.d.ts.map +1 -0
  16. package/dist/commands/auth/whoami.js +51 -0
  17. package/dist/commands/auth/whoami.js.map +1 -0
  18. package/dist/commands/config/configure.d.ts +2 -0
  19. package/dist/commands/config/configure.d.ts.map +1 -0
  20. package/dist/commands/config/configure.js +51 -0
  21. package/dist/commands/config/configure.js.map +1 -0
  22. package/dist/commands/create/create.d.ts +3 -0
  23. package/dist/commands/create/create.d.ts.map +1 -0
  24. package/dist/commands/create/create.js +238 -0
  25. package/dist/commands/create/create.js.map +1 -0
  26. package/dist/commands/dev/dev.d.ts +8 -0
  27. package/dist/commands/dev/dev.d.ts.map +1 -0
  28. package/dist/commands/dev/dev.js +64 -0
  29. package/dist/commands/dev/dev.js.map +1 -0
  30. package/dist/commands/dev/link.d.ts +8 -0
  31. package/dist/commands/dev/link.d.ts.map +1 -0
  32. package/dist/commands/dev/link.js +124 -0
  33. package/dist/commands/dev/link.js.map +1 -0
  34. package/dist/commands/gen/gen.d.ts +11 -0
  35. package/dist/commands/gen/gen.d.ts.map +1 -0
  36. package/dist/commands/gen/gen.js +341 -0
  37. package/dist/commands/gen/gen.js.map +1 -0
  38. package/dist/commands/hosting/deploy.d.ts +19 -0
  39. package/dist/commands/hosting/deploy.d.ts.map +1 -0
  40. package/dist/commands/hosting/deploy.js +194 -0
  41. package/dist/commands/hosting/deploy.js.map +1 -0
  42. package/dist/commands/hosting/list.d.ts +6 -0
  43. package/dist/commands/hosting/list.d.ts.map +1 -0
  44. package/dist/commands/hosting/list.js +26 -0
  45. package/dist/commands/hosting/list.js.map +1 -0
  46. package/dist/commands/hosting/promote.d.ts +11 -0
  47. package/dist/commands/hosting/promote.d.ts.map +1 -0
  48. package/dist/commands/hosting/promote.js +153 -0
  49. package/dist/commands/hosting/promote.js.map +1 -0
  50. package/dist/commands/update/update.d.ts +4 -0
  51. package/dist/commands/update/update.d.ts.map +1 -0
  52. package/dist/commands/update/update.js +242 -0
  53. package/dist/commands/update/update.js.map +1 -0
  54. package/dist/commands/update/upgrade.d.ts +4 -0
  55. package/dist/commands/update/upgrade.d.ts.map +1 -0
  56. package/dist/commands/update/upgrade.js +157 -0
  57. package/dist/commands/update/upgrade.js.map +1 -0
  58. package/dist/lib/config.d.ts +309 -0
  59. package/dist/lib/config.d.ts.map +1 -0
  60. package/dist/lib/config.js +262 -0
  61. package/dist/lib/config.js.map +1 -0
  62. package/dist/lib/constants.d.ts +10 -0
  63. package/dist/lib/constants.d.ts.map +1 -0
  64. package/dist/lib/constants.js +16 -0
  65. package/dist/lib/constants.js.map +1 -0
  66. package/dist/lib/fs.d.ts +40 -0
  67. package/dist/lib/fs.d.ts.map +1 -0
  68. package/dist/lib/fs.js +162 -0
  69. package/dist/lib/fs.js.map +1 -0
  70. package/dist/lib/mcp.d.ts +34 -0
  71. package/dist/lib/mcp.d.ts.map +1 -0
  72. package/dist/lib/mcp.js +19 -0
  73. package/dist/lib/mcp.js.map +1 -0
  74. package/dist/lib/parse-binding-tool.d.ts +12 -0
  75. package/dist/lib/parse-binding-tool.d.ts.map +1 -0
  76. package/dist/lib/parse-binding-tool.js +15 -0
  77. package/dist/lib/parse-binding-tool.js.map +1 -0
  78. package/dist/lib/prompt-ide-setup.d.ts +27 -0
  79. package/dist/lib/prompt-ide-setup.d.ts.map +1 -0
  80. package/dist/lib/prompt-ide-setup.js +158 -0
  81. package/dist/lib/prompt-ide-setup.js.map +1 -0
  82. package/dist/lib/prompt-integrations.d.ts +7 -0
  83. package/dist/lib/prompt-integrations.d.ts.map +1 -0
  84. package/dist/lib/prompt-integrations.js +84 -0
  85. package/dist/lib/prompt-integrations.js.map +1 -0
  86. package/dist/lib/prompt-workspace.d.ts +2 -0
  87. package/dist/lib/prompt-workspace.d.ts.map +1 -0
  88. package/dist/lib/prompt-workspace.js +93 -0
  89. package/dist/lib/prompt-workspace.js.map +1 -0
  90. package/dist/lib/runtime.d.ts +5 -0
  91. package/dist/lib/runtime.d.ts.map +1 -0
  92. package/dist/lib/runtime.js +15 -0
  93. package/dist/lib/runtime.js.map +1 -0
  94. package/dist/lib/session.d.ts +39 -0
  95. package/dist/lib/session.d.ts.map +1 -0
  96. package/dist/lib/session.js +124 -0
  97. package/dist/lib/session.js.map +1 -0
  98. package/dist/lib/slugify.d.ts +13 -0
  99. package/dist/lib/slugify.d.ts.map +1 -0
  100. package/dist/lib/slugify.js +27 -0
  101. package/dist/lib/slugify.js.map +1 -0
  102. package/dist/lib/supabase.d.ts +5 -0
  103. package/dist/lib/supabase.d.ts.map +1 -0
  104. package/dist/lib/supabase.js +19 -0
  105. package/dist/lib/supabase.js.map +1 -0
  106. package/dist/lib/wrangler.d.ts +9 -0
  107. package/dist/lib/wrangler.d.ts.map +1 -0
  108. package/dist/lib/wrangler.js +118 -0
  109. package/dist/lib/wrangler.js.map +1 -0
  110. package/dist/rules/deco-chat.mdc +902 -0
  111. package/package.json +79 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Prompts the user to select a workspace from their available teams.
3
+ *
4
+ * This function:
5
+ * 1. Checks if the user has a valid session
6
+ * 2. Creates a workspace client to access global tools
7
+ * 3. Uses the TEAMS_LIST tool to fetch available teams
8
+ * 4. Presents a searchable select prompt to the user
9
+ * 5. Returns the selected team slug as the workspace
10
+ *
11
+ * @param local - Whether to use local deco.chat instance
12
+ * @param current - Current workspace to use as default
13
+ * @returns Promise<string> - The selected team slug
14
+ * @throws Error if no session is found or no teams are available
15
+ */
16
+ import inquirer from "inquirer";
17
+ import { createWorkspaceClient } from "./mcp.js";
18
+ import { readSession } from "./session.js";
19
+ // @ts-ignore - does not have types
20
+ import inquirerSearchList from "inquirer-search-list";
21
+ import { z } from "zod";
22
+ export async function promptWorkspace(local = false, current = "") {
23
+ // Register the search-list plugin
24
+ try {
25
+ inquirer.registerPrompt("search-list", inquirerSearchList);
26
+ }
27
+ catch {
28
+ console.warn("Could not load search functionality, falling back to basic list");
29
+ }
30
+ // Check if user has a session
31
+ const session = await readSession();
32
+ if (!session) {
33
+ throw new Error("No session found. Please run 'deco login' first.");
34
+ }
35
+ // Create workspace client with empty workspace to access global tools
36
+ const client = await createWorkspaceClient({ workspace: "", local });
37
+ try {
38
+ // Use TEAMS_LIST tool to get available teams
39
+ const response = await client.callTool({
40
+ name: "TEAMS_LIST",
41
+ arguments: {},
42
+ },
43
+ // @ts-expect-error We need to refactor TEAMS_LIST to stop returning array and use a proper object
44
+ z.any());
45
+ if (response.isError) {
46
+ throw new Error("Failed to fetch teams");
47
+ }
48
+ const { items: teams } = response.structuredContent;
49
+ if (!teams || teams.length === 0) {
50
+ throw new Error("No teams found. Please create a team first.");
51
+ }
52
+ // Create options for the select component
53
+ const choices = teams.map((team) => ({
54
+ name: team.name,
55
+ value: team.slug,
56
+ }));
57
+ // Prompt user to select a team with search functionality
58
+ let selectedSlug;
59
+ try {
60
+ // Try using search-list first
61
+ const result = await inquirer.prompt([
62
+ {
63
+ type: "search-list",
64
+ name: "selectedSlug",
65
+ message: "Select a workspace:",
66
+ choices,
67
+ default: current,
68
+ },
69
+ ]);
70
+ selectedSlug = result.selectedSlug;
71
+ }
72
+ catch {
73
+ // Fallback to basic list if search-list fails
74
+ const result = await inquirer.prompt([
75
+ {
76
+ type: "list",
77
+ name: "selectedSlug",
78
+ message: "Select a workspace:",
79
+ choices,
80
+ default: current,
81
+ },
82
+ ]);
83
+ selectedSlug = result.selectedSlug;
84
+ }
85
+ // Return the selected team slug as the workspace
86
+ return selectedSlug;
87
+ }
88
+ finally {
89
+ // Clean up the client connection
90
+ await client.close();
91
+ }
92
+ }
93
+ //# sourceMappingURL=prompt-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-workspace.js","sourceRoot":"","sources":["../../src/lib/prompt-workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,mCAAmC;AACnC,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAK,GAAG,KAAK,EACb,OAAO,GAAG,EAAE;IAEZ,kCAAkC;IAClC,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CACV,iEAAiE,CAClE,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,sEAAsE;IACtE,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CACpC;YACE,IAAI,EAAE,YAAY;YAClB,SAAS,EAAE,EAAE;SACd;QACD,kGAAkG;QAClG,CAAC,CAAC,GAAG,EAAE,CACR,CAAC;QAEF,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,iBAAsC,CAAC;QAEzE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,0CAA0C;QAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,IAAI;SACjB,CAAC,CAAC,CAAC;QAEJ,yDAAyD;QACzD,IAAI,YAAoB,CAAC;QAEzB,IAAI,CAAC;YACH,8BAA8B;YAC9B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBACnC;oBACE,IAAI,EAAE,aAAa;oBACnB,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,qBAAqB;oBAC9B,OAAO;oBACP,OAAO,EAAE,OAAO;iBACjB;aACF,CAAC,CAAC;YACH,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;YAC9C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBACnC;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,qBAAqB;oBAC9B,OAAO;oBACP,OAAO,EAAE,OAAO;iBACjB;aACF,CAAC,CAAC;YACH,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACrC,CAAC;QAED,iDAAiD;QACjD,OAAO,YAAY,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,iCAAiC;QACjC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Detects which runtime is currently executing the CLI
3
+ */
4
+ export declare function detectRuntime(): "node" | "bun" | "deno" | "unknown";
5
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/lib/runtime.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAQnE"}
@@ -0,0 +1,15 @@
1
+ import process from "node:process";
2
+ /**
3
+ * Detects which runtime is currently executing the CLI
4
+ */
5
+ export function detectRuntime() {
6
+ // deno-lint-ignore no-explicit-any
7
+ if (typeof globalThis.Deno !== "undefined")
8
+ return "deno";
9
+ if (process.versions.bun)
10
+ return "bun";
11
+ if (process.versions.node)
12
+ return "node";
13
+ return "unknown";
14
+ }
15
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/lib/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,mCAAmC;IACnC,IAAI,OAAQ,UAAkB,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,MAAM,CAAC;IAEnE,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC;IAEzC,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { User } from "@supabase/supabase-js";
2
+ import { z } from "zod";
3
+ declare const SessionSchema: z.ZodObject<{
4
+ access_token: z.ZodOptional<z.ZodString>;
5
+ refresh_token: z.ZodOptional<z.ZodString>;
6
+ workspace: z.ZodOptional<z.ZodString>;
7
+ api_token: z.ZodOptional<z.ZodString>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ access_token?: string | undefined;
10
+ refresh_token?: string | undefined;
11
+ workspace?: string | undefined;
12
+ api_token?: string | undefined;
13
+ }, {
14
+ access_token?: string | undefined;
15
+ refresh_token?: string | undefined;
16
+ workspace?: string | undefined;
17
+ api_token?: string | undefined;
18
+ }>;
19
+ export declare function setToken(t: string): void;
20
+ export declare function getToken(): string;
21
+ export type SessionData = z.infer<typeof SessionSchema>;
22
+ /**
23
+ * Save session data securely to the filesystem.
24
+ * @param data The session data to save (object).
25
+ */
26
+ export declare function saveSession(data: {
27
+ session: SessionData | null;
28
+ user: User | null;
29
+ }): Promise<void>;
30
+ /**
31
+ * Read session data from the filesystem.
32
+ * @returns The parsed session data, or null if not found or error.
33
+ */
34
+ export declare function readSession(): Promise<SessionData | null>;
35
+ export declare function deleteSession(): Promise<void>;
36
+ export declare function getRequestAuthHeaders(): Promise<Record<string, string>>;
37
+ export declare function getSessionToken(): Promise<string>;
38
+ export {};
39
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/lib/session.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;EAKjB,CAAC;AAGH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAExC;AACD,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AASxD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CACnB,iBAyBA;AAED;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAgB/D;AAED,wBAAsB,aAAa,kBAWlC;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2C7E;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAevD"}
@@ -0,0 +1,124 @@
1
+ // Utility functions for saving and reading session data securely
2
+ import { join } from "path";
3
+ import { homedir } from "os";
4
+ import { promises as fs } from "fs";
5
+ import { decodeJwt } from "jose";
6
+ import { z } from "zod";
7
+ import { createClient } from "./supabase.js";
8
+ import process from "node:process";
9
+ const SessionSchema = z.object({
10
+ access_token: z.string().optional(),
11
+ refresh_token: z.string().optional(),
12
+ workspace: z.string().optional(),
13
+ api_token: z.string().optional(),
14
+ });
15
+ let token;
16
+ export function setToken(t) {
17
+ token = t;
18
+ }
19
+ export function getToken() {
20
+ return token;
21
+ }
22
+ /**
23
+ * Path to the session file in the user's home directory.
24
+ */
25
+ function getSessionPath() {
26
+ return join(homedir(), ".deco_auth_session.json");
27
+ }
28
+ /**
29
+ * Save session data securely to the filesystem.
30
+ * @param data The session data to save (object).
31
+ */
32
+ export async function saveSession(data) {
33
+ const { session, user } = data;
34
+ const sessionPath = getSessionPath();
35
+ await fs.writeFile(sessionPath, JSON.stringify({ ...session, workspace: user ? `/users/${user.id}` : undefined }, null, 2));
36
+ // Set file permissions to 600 (read/write for user only)
37
+ // Skip chmod on Windows as it doesn't support Unix-style file permissions
38
+ if (process.platform !== "win32") {
39
+ try {
40
+ await fs.chmod(sessionPath, 0o600);
41
+ }
42
+ catch (error) {
43
+ // Silently ignore chmod errors on systems that don't support it
44
+ console.warn("Warning: Could not set file permissions on session file:", error instanceof Error ? error.message : String(error));
45
+ }
46
+ }
47
+ }
48
+ /**
49
+ * Read session data from the filesystem.
50
+ * @returns The parsed session data, or null if not found or error.
51
+ */
52
+ export async function readSession() {
53
+ const token = getToken();
54
+ if (token) {
55
+ return {
56
+ workspace: decodeJwt(token).aud,
57
+ api_token: token,
58
+ };
59
+ }
60
+ try {
61
+ const sessionPath = getSessionPath();
62
+ const content = await fs.readFile(sessionPath, "utf-8");
63
+ return SessionSchema.safeParse(JSON.parse(content)).data ?? null;
64
+ }
65
+ catch (_error) {
66
+ return null;
67
+ }
68
+ }
69
+ export async function deleteSession() {
70
+ const sessionPath = getSessionPath();
71
+ const { client } = createClient();
72
+ try {
73
+ await fs.unlink(sessionPath);
74
+ }
75
+ catch (_error) {
76
+ console.warn("Session file not found");
77
+ }
78
+ await client.auth.signOut();
79
+ }
80
+ export async function getRequestAuthHeaders() {
81
+ const session = await readSession();
82
+ if (session?.api_token) {
83
+ return {
84
+ Authorization: `Bearer ${session.api_token}`,
85
+ };
86
+ }
87
+ if (!session) {
88
+ throw new Error("Session not found. Please login again.");
89
+ }
90
+ // Extract tokens from session
91
+ const { access_token, refresh_token } = session;
92
+ if (!access_token || !refresh_token) {
93
+ throw new Error("Session expired. Please login again.");
94
+ }
95
+ // Create Supabase client (no cookies needed for this local op)
96
+ const { client: supabase, responseHeaders } = createClient();
97
+ const { data, error } = await supabase.auth.setSession({
98
+ access_token,
99
+ refresh_token,
100
+ });
101
+ if (error) {
102
+ throw new Error("Session expired. Please login again.");
103
+ }
104
+ await saveSession(data);
105
+ const setCookie = responseHeaders.getSetCookie();
106
+ if (!setCookie.length) {
107
+ throw new Error("Session expired. Please login again.");
108
+ }
109
+ const cookies = setCookie.map((cookie) => cookie.split(";")[0]).join("; ");
110
+ return { cookie: cookies };
111
+ }
112
+ export async function getSessionToken() {
113
+ const session = await readSession();
114
+ if (!session) {
115
+ throw new Error("Session not found. Please login again.");
116
+ }
117
+ // Extract tokens from session
118
+ const { access_token, refresh_token } = session;
119
+ if (!access_token || !refresh_token) {
120
+ throw new Error("Session expired. Please login again.");
121
+ }
122
+ return access_token;
123
+ }
124
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/lib/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Converts a string into a URL-safe slug.
3
+ * - Lowercases the string
4
+ * - Replaces spaces and underscores with dashes
5
+ * - Removes non-alphanumeric characters (except dashes)
6
+ * - Trims leading/trailing dashes
7
+ *
8
+ * @param input - The string to slugify
9
+ * @returns The slugified string
10
+ */
11
+ export declare function slugify(input: string): string;
12
+ export declare function sanitizeConstantName(input: string): string;
13
+ //# sourceMappingURL=slugify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slugify.d.ts","sourceRoot":"","sources":["../../src/lib/slugify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO7C;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO1D"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Converts a string into a URL-safe slug.
3
+ * - Lowercases the string
4
+ * - Replaces spaces and underscores with dashes
5
+ * - Removes non-alphanumeric characters (except dashes)
6
+ * - Trims leading/trailing dashes
7
+ *
8
+ * @param input - The string to slugify
9
+ * @returns The slugified string
10
+ */
11
+ export function slugify(input) {
12
+ return input
13
+ .toLowerCase()
14
+ .replace(/[\s_]+/g, "-") // Replace spaces and underscores with dashes
15
+ .replace(/[^a-z0-9-]/g, "") // Remove all non-alphanumeric except dashes
16
+ .replace(/-+/g, "-") // Collapse multiple dashes
17
+ .replace(/^-+|-+$/g, ""); // Trim leading/trailing dashes
18
+ }
19
+ export function sanitizeConstantName(input) {
20
+ return input
21
+ .toUpperCase()
22
+ .replace(/[\s_]+/g, "_") // Replace spaces and underscores with underscores
23
+ .replace(/[^A-Z0-9_]/g, "") // Remove all non-alphanumeric except underscores
24
+ .replace(/_+/g, "_") // Collapse multiple underscores
25
+ .replace(/^_+|_+$/g, ""); // Trim leading/trailing underscores
26
+ }
27
+ //# sourceMappingURL=slugify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slugify.js","sourceRoot":"","sources":["../../src/lib/slugify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,6CAA6C;SACrE,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,4CAA4C;SACvE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,2BAA2B;SAC/C,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,+BAA+B;AAC7D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,kDAAkD;SAC1E,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,iDAAiD;SAC5E,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,gCAAgC;SACpD,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,oCAAoC;AAClE,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function createClient(requestHeaders?: Headers): {
2
+ client: import("@supabase/supabase-js").SupabaseClient<any, "public", any>;
3
+ responseHeaders: Headers;
4
+ };
5
+ //# sourceMappingURL=supabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"AAOA,wBAAgB,YAAY,CAAC,cAAc,GAAE,OAAuB;;;EAuBnE"}
@@ -0,0 +1,19 @@
1
+ import { SUPABASE_ANON_KEY, SUPABASE_URL } from "./constants.js";
2
+ import { createServerClient, parseCookieHeader, serializeCookieHeader, } from "@supabase/ssr";
3
+ export function createClient(requestHeaders = new Headers()) {
4
+ const cookies = parseCookieHeader(requestHeaders.get("cookie") ?? "");
5
+ const filteredCookies = cookies.filter((cookie) => !!cookie.value);
6
+ const responseHeaders = new Headers();
7
+ const client = createServerClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
8
+ cookies: {
9
+ getAll: () => filteredCookies,
10
+ setAll(cookies) {
11
+ cookies.forEach((cookie) => {
12
+ responseHeaders.append("Set-Cookie", serializeCookieHeader(cookie.name, cookie.value, cookie.options));
13
+ });
14
+ },
15
+ },
16
+ });
17
+ return { client, responseHeaders };
18
+ }
19
+ //# sourceMappingURL=supabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,YAAY,CAAC,iBAA0B,IAAI,OAAO,EAAE;IAClE,MAAM,OAAO,GAAG,iBAAiB,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CACpC,CAAC,MAAM,EAA6C,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACtE,CAAC;IAEF,MAAM,eAAe,GAAG,IAAI,OAAO,EAAE,CAAC;IAEtC,MAAM,MAAM,GAAG,kBAAkB,CAAC,YAAY,EAAE,iBAAiB,EAAE;QACjE,OAAO,EAAE;YACP,MAAM,EAAE,GAAG,EAAE,CAAC,eAAe;YAC7B,MAAM,CAAC,OAAO;gBACZ,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;oBACzB,eAAe,CAAC,MAAM,CACpB,YAAY,EACZ,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CACjE,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;SACF;KACF,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { StartDevServerOptions } from "../commands/dev/dev.js";
2
+ export declare function getCurrentEnvVars(projectRoot: string): Promise<{
3
+ envVars: Record<string, string>;
4
+ envFilepath: string;
5
+ }>;
6
+ export declare function writeEnvVars(projectRoot: string, envVars: Record<string, string | undefined>): Promise<void>;
7
+ export declare function getEnvVars(projectRoot?: string): Promise<Record<string, string>>;
8
+ export declare function ensureDevEnvironment(opts: StartDevServerOptions): Promise<void>;
9
+ //# sourceMappingURL=wrangler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrangler.d.ts","sourceRoot":"","sources":["../../src/lib/wrangler.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAI/D,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACpE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAwBD;AAED,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,iBAQ5C;AAOD,wBAAsB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,mCAoCpD;AAqDD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,iBAUrE"}
@@ -0,0 +1,118 @@
1
+ import { join, dirname } from "path";
2
+ import { promises as fs } from "fs";
3
+ import { addWorkflowDO, getConfig, getConfigFilePath, readWranglerConfig, } from "./config.js";
4
+ import { readSession } from "./session.js";
5
+ import process from "node:process";
6
+ import { Buffer } from "node:buffer";
7
+ const envFile = ".dev.vars";
8
+ export async function getCurrentEnvVars(projectRoot) {
9
+ const envFilepath = join(projectRoot, envFile);
10
+ const devVarsFile = await fs.readFile(envFilepath, "utf-8").catch(() => "");
11
+ const envVars = devVarsFile.split("\n").reduce((acc, line) => {
12
+ if (!line || line.startsWith("#")) {
13
+ return acc;
14
+ }
15
+ const firstEqualIndex = line.indexOf("=");
16
+ if (firstEqualIndex === -1) {
17
+ return acc;
18
+ }
19
+ const key = line.substring(0, firstEqualIndex);
20
+ const value = line.substring(firstEqualIndex + 1);
21
+ acc[key] = value;
22
+ return acc;
23
+ }, {});
24
+ return {
25
+ envVars,
26
+ envFilepath,
27
+ };
28
+ }
29
+ export async function writeEnvVars(projectRoot, envVars) {
30
+ await fs.writeFile(join(projectRoot, envFile), Object.entries(envVars)
31
+ .map(([key, value]) => `${key}=${value}`)
32
+ .join("\n"));
33
+ }
34
+ const getProjectRoot = () => {
35
+ const configPath = getConfigFilePath(process.cwd()) ?? process.cwd();
36
+ return dirname(configPath);
37
+ };
38
+ export async function getEnvVars(projectRoot) {
39
+ if (!projectRoot) {
40
+ projectRoot = getProjectRoot();
41
+ }
42
+ const [currentEnvVars, session, config, wrangler] = await Promise.all([
43
+ getCurrentEnvVars(projectRoot).then(({ envVars }) => envVars),
44
+ readSession(),
45
+ getConfig({}),
46
+ readWranglerConfig(projectRoot),
47
+ ]);
48
+ const encodedBindings = Buffer.from(JSON.stringify(config.bindings)).toString("base64");
49
+ const workspace = config.workspace ?? session?.workspace;
50
+ const env = {
51
+ ...currentEnvVars,
52
+ DECO_CHAT_WORKSPACE: workspace || "",
53
+ DECO_CHAT_API_TOKEN: session?.access_token ?? "",
54
+ DECO_CHAT_BINDINGS: encodedBindings,
55
+ DECO_CHAT_APP_ENTRYPOINT: "http://localhost:8787",
56
+ };
57
+ const { name, scope } = wrangler;
58
+ if (name && workspace) {
59
+ const [_, slug] = workspace.split("/");
60
+ env.DECO_CHAT_APP_NAME = `@${scope ?? slug}/${name}`;
61
+ }
62
+ if (config.local) {
63
+ env.DECO_CHAT_API_URL = "http://localhost:3001";
64
+ }
65
+ else {
66
+ delete env.DECO_CHAT_API_URL;
67
+ }
68
+ return env;
69
+ }
70
+ async function ensureEnvVarsGitIgnore(projectRoot) {
71
+ const gitignorePath = join(projectRoot, ".gitignore");
72
+ try {
73
+ const gitignoreContent = await fs.readFile(gitignorePath, "utf-8");
74
+ const lines = gitignoreContent.split("\n");
75
+ // Check if entry already exists (exact match or as part of a line)
76
+ const entryExists = lines.some((line) => line.trim() === envFile || line.trim() === `/${envFile}`);
77
+ if (!entryExists) {
78
+ const newContent = gitignoreContent.endsWith("\n")
79
+ ? gitignoreContent + envFile + "\n"
80
+ : gitignoreContent + "\n" + envFile + "\n";
81
+ await fs.writeFile(gitignorePath, newContent);
82
+ }
83
+ }
84
+ catch {
85
+ // .gitignore doesn't exist, create it
86
+ await fs.writeFile(gitignorePath, envFile + "\n");
87
+ }
88
+ }
89
+ async function addZodDependency(projectRoot) {
90
+ const packageJsonPath = join(projectRoot, "package.json");
91
+ const packageJsonContent = await fs.readFile(packageJsonPath, "utf-8");
92
+ const packageJson = JSON.parse(packageJsonContent);
93
+ // Ensure dependencies object exists
94
+ if (!packageJson.dependencies) {
95
+ packageJson.dependencies = {};
96
+ }
97
+ // Add or update zod dependency
98
+ packageJson.dependencies.zod = "^3.24.3";
99
+ // Write back to file with proper formatting
100
+ await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n");
101
+ }
102
+ async function cleanBuildDirectory(projectRoot, directory) {
103
+ const buildDir = join(projectRoot, directory);
104
+ await fs.rm(buildDir, { recursive: true, force: true });
105
+ await fs.mkdir(buildDir);
106
+ }
107
+ export async function ensureDevEnvironment(opts) {
108
+ const projectRoot = getProjectRoot();
109
+ if (opts.cleanBuildDirectory?.enabled) {
110
+ await cleanBuildDirectory(projectRoot, opts.cleanBuildDirectory.directory);
111
+ }
112
+ await ensureEnvVarsGitIgnore(projectRoot);
113
+ const env = await getEnvVars(projectRoot);
114
+ await writeEnvVars(projectRoot, env);
115
+ await addWorkflowDO();
116
+ await addZodDependency(projectRoot);
117
+ }
118
+ //# sourceMappingURL=wrangler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrangler.js","sourceRoot":"","sources":["../../src/lib/wrangler.ts"],"names":[],"mappings":"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"}