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.
- package/README.md +95 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +373 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add/add.d.ts +7 -0
- package/dist/commands/add/add.d.ts.map +1 -0
- package/dist/commands/add/add.js +90 -0
- package/dist/commands/add/add.js.map +1 -0
- package/dist/commands/auth/login.d.ts +2 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +125 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/whoami.d.ts +2 -0
- package/dist/commands/auth/whoami.d.ts.map +1 -0
- package/dist/commands/auth/whoami.js +51 -0
- package/dist/commands/auth/whoami.js.map +1 -0
- package/dist/commands/config/configure.d.ts +2 -0
- package/dist/commands/config/configure.d.ts.map +1 -0
- package/dist/commands/config/configure.js +51 -0
- package/dist/commands/config/configure.js.map +1 -0
- package/dist/commands/create/create.d.ts +3 -0
- package/dist/commands/create/create.d.ts.map +1 -0
- package/dist/commands/create/create.js +238 -0
- package/dist/commands/create/create.js.map +1 -0
- package/dist/commands/dev/dev.d.ts +8 -0
- package/dist/commands/dev/dev.d.ts.map +1 -0
- package/dist/commands/dev/dev.js +64 -0
- package/dist/commands/dev/dev.js.map +1 -0
- package/dist/commands/dev/link.d.ts +8 -0
- package/dist/commands/dev/link.d.ts.map +1 -0
- package/dist/commands/dev/link.js +124 -0
- package/dist/commands/dev/link.js.map +1 -0
- package/dist/commands/gen/gen.d.ts +11 -0
- package/dist/commands/gen/gen.d.ts.map +1 -0
- package/dist/commands/gen/gen.js +341 -0
- package/dist/commands/gen/gen.js.map +1 -0
- package/dist/commands/hosting/deploy.d.ts +19 -0
- package/dist/commands/hosting/deploy.d.ts.map +1 -0
- package/dist/commands/hosting/deploy.js +194 -0
- package/dist/commands/hosting/deploy.js.map +1 -0
- package/dist/commands/hosting/list.d.ts +6 -0
- package/dist/commands/hosting/list.d.ts.map +1 -0
- package/dist/commands/hosting/list.js +26 -0
- package/dist/commands/hosting/list.js.map +1 -0
- package/dist/commands/hosting/promote.d.ts +11 -0
- package/dist/commands/hosting/promote.d.ts.map +1 -0
- package/dist/commands/hosting/promote.js +153 -0
- package/dist/commands/hosting/promote.js.map +1 -0
- package/dist/commands/update/update.d.ts +4 -0
- package/dist/commands/update/update.d.ts.map +1 -0
- package/dist/commands/update/update.js +242 -0
- package/dist/commands/update/update.js.map +1 -0
- package/dist/commands/update/upgrade.d.ts +4 -0
- package/dist/commands/update/upgrade.d.ts.map +1 -0
- package/dist/commands/update/upgrade.js +157 -0
- package/dist/commands/update/upgrade.js.map +1 -0
- package/dist/lib/config.d.ts +309 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +262 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +10 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +16 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/fs.d.ts +40 -0
- package/dist/lib/fs.d.ts.map +1 -0
- package/dist/lib/fs.js +162 -0
- package/dist/lib/fs.js.map +1 -0
- package/dist/lib/mcp.d.ts +34 -0
- package/dist/lib/mcp.d.ts.map +1 -0
- package/dist/lib/mcp.js +19 -0
- package/dist/lib/mcp.js.map +1 -0
- package/dist/lib/parse-binding-tool.d.ts +12 -0
- package/dist/lib/parse-binding-tool.d.ts.map +1 -0
- package/dist/lib/parse-binding-tool.js +15 -0
- package/dist/lib/parse-binding-tool.js.map +1 -0
- package/dist/lib/prompt-ide-setup.d.ts +27 -0
- package/dist/lib/prompt-ide-setup.d.ts.map +1 -0
- package/dist/lib/prompt-ide-setup.js +158 -0
- package/dist/lib/prompt-ide-setup.js.map +1 -0
- package/dist/lib/prompt-integrations.d.ts +7 -0
- package/dist/lib/prompt-integrations.d.ts.map +1 -0
- package/dist/lib/prompt-integrations.js +84 -0
- package/dist/lib/prompt-integrations.js.map +1 -0
- package/dist/lib/prompt-workspace.d.ts +2 -0
- package/dist/lib/prompt-workspace.d.ts.map +1 -0
- package/dist/lib/prompt-workspace.js +93 -0
- package/dist/lib/prompt-workspace.js.map +1 -0
- package/dist/lib/runtime.d.ts +5 -0
- package/dist/lib/runtime.d.ts.map +1 -0
- package/dist/lib/runtime.js +15 -0
- package/dist/lib/runtime.js.map +1 -0
- package/dist/lib/session.d.ts +39 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +124 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/slugify.d.ts +13 -0
- package/dist/lib/slugify.d.ts.map +1 -0
- package/dist/lib/slugify.js +27 -0
- package/dist/lib/slugify.js.map +1 -0
- package/dist/lib/supabase.d.ts +5 -0
- package/dist/lib/supabase.d.ts.map +1 -0
- package/dist/lib/supabase.js +19 -0
- package/dist/lib/supabase.js.map +1 -0
- package/dist/lib/wrangler.d.ts +9 -0
- package/dist/lib/wrangler.d.ts.map +1 -0
- package/dist/lib/wrangler.js +118 -0
- package/dist/lib/wrangler.js.map +1 -0
- package/dist/rules/deco-chat.mdc +902 -0
- 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 @@
|
|
|
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 @@
|
|
|
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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"}
|