@percher/core 0.1.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/dist/app-name.d.ts +6 -0
- package/dist/app-name.d.ts.map +1 -0
- package/dist/app-name.js +20 -0
- package/dist/app-name.js.map +1 -0
- package/dist/commands/create.d.ts +27 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +60 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/data.d.ts +28 -0
- package/dist/commands/data.d.ts.map +1 -0
- package/dist/commands/data.js +28 -0
- package/dist/commands/data.js.map +1 -0
- package/dist/commands/dev.d.ts +25 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +143 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/doctor.d.ts +29 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +159 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/domains.d.ts +49 -0
- package/dist/commands/domains.d.ts.map +1 -0
- package/dist/commands/domains.js +45 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/env.d.ts +33 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +49 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/generate.d.ts +15 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +160 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +26 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +71 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +15 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +52 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +18 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +38 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/open.d.ts +12 -0
- package/dist/commands/open.d.ts.map +1 -0
- package/dist/commands/open.js +19 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/push.d.ts +32 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +179 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/resume.d.ts +15 -0
- package/dist/commands/resume.d.ts.map +1 -0
- package/dist/commands/resume.js +17 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/rollback.d.ts +22 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +41 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/versions.d.ts +17 -0
- package/dist/commands/versions.d.ts.map +1 -0
- package/dist/commands/versions.js +15 -0
- package/dist/commands/versions.js.map +1 -0
- package/dist/commands/whoami.d.ts +7 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +4 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/context.d.ts +17 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/detect.d.ts +17 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +173 -0
- package/dist/detect.js.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +11 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/plans.d.ts +27 -0
- package/dist/plans.d.ts.map +1 -0
- package/dist/plans.js +84 -0
- package/dist/plans.js.map +1 -0
- package/dist/tarball.d.ts +17 -0
- package/dist/tarball.d.ts.map +1 -0
- package/dist/tarball.js +75 -0
- package/dist/tarball.js.map +1 -0
- package/dist/templates.d.ts +12 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +58 -0
- package/dist/templates.js.map +1 -0
- package/dist/validation/blocked-names.d.ts +8 -0
- package/dist/validation/blocked-names.d.ts.map +1 -0
- package/dist/validation/blocked-names.js +86 -0
- package/dist/validation/blocked-names.js.map +1 -0
- package/dist/watcher.d.ts +15 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +62 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readPercherTomlAppName } from "../app-name";
|
|
3
|
+
import { PercherCoreError } from "../errors";
|
|
4
|
+
export const domainAddInputSchema = z.object({
|
|
5
|
+
app: z.string().optional(),
|
|
6
|
+
domain: z.string().min(1, "Domain is required"),
|
|
7
|
+
});
|
|
8
|
+
export const domainVerifyInputSchema = z.object({
|
|
9
|
+
app: z.string().optional(),
|
|
10
|
+
domain: z.string().min(1, "Domain is required"),
|
|
11
|
+
});
|
|
12
|
+
export const domainListInputSchema = z.object({
|
|
13
|
+
app: z.string().optional(),
|
|
14
|
+
});
|
|
15
|
+
export const domainRemoveInputSchema = z.object({
|
|
16
|
+
app: z.string().optional(),
|
|
17
|
+
domain: z.string().min(1, "Domain is required"),
|
|
18
|
+
});
|
|
19
|
+
function resolveApp(ctx, app) {
|
|
20
|
+
const name = app ?? readPercherTomlAppName(ctx.cwd);
|
|
21
|
+
if (!name) {
|
|
22
|
+
throw new PercherCoreError("No app specified and no percher.toml found", {
|
|
23
|
+
code: "env.no-app",
|
|
24
|
+
hint: "Pass an app name or run from a directory with percher.toml.",
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return name;
|
|
28
|
+
}
|
|
29
|
+
export async function domainAdd(ctx, input) {
|
|
30
|
+
const appRef = resolveApp(ctx, input.app);
|
|
31
|
+
return ctx.client.apps.addDomain(appRef, input.domain);
|
|
32
|
+
}
|
|
33
|
+
export async function domainVerify(ctx, input) {
|
|
34
|
+
const appRef = resolveApp(ctx, input.app);
|
|
35
|
+
return ctx.client.apps.verifyDomain(appRef, input.domain);
|
|
36
|
+
}
|
|
37
|
+
export async function domainList(ctx, input = {}) {
|
|
38
|
+
const appRef = resolveApp(ctx, input.app);
|
|
39
|
+
return ctx.client.apps.listDomains(appRef);
|
|
40
|
+
}
|
|
41
|
+
export async function domainRemove(ctx, input) {
|
|
42
|
+
const appRef = resolveApp(ctx, input.app);
|
|
43
|
+
await ctx.client.apps.removeDomain(appRef, input.domain);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=domains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domains.js","sourceRoot":"","sources":["../../src/commands/domains.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC;CAChD,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC;CAChD,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC;CAChD,CAAC,CAAC;AAGH,SAAS,UAAU,CAAC,GAAY,EAAE,GAAY;IAC5C,MAAM,IAAI,GAAG,GAAG,IAAI,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,gBAAgB,CAAC,4CAA4C,EAAE;YACvE,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,6DAA6D;SACpE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAY,EACZ,KAAqB;IAErB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAY,EACZ,KAAwB;IAExB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAY,EACZ,QAAyB,EAAE;IAE3B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAY,EAAE,KAAwB;IACvE,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Context } from "../context";
|
|
3
|
+
export declare const envSetInputSchema: z.ZodObject<{
|
|
4
|
+
app: z.ZodOptional<z.ZodString>;
|
|
5
|
+
values: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
values: Record<string, string>;
|
|
8
|
+
app?: string | undefined;
|
|
9
|
+
}, {
|
|
10
|
+
values: Record<string, string>;
|
|
11
|
+
app?: string | undefined;
|
|
12
|
+
}>;
|
|
13
|
+
export declare const envUnsetInputSchema: z.ZodObject<{
|
|
14
|
+
app: z.ZodOptional<z.ZodString>;
|
|
15
|
+
key: z.ZodString;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
key: string;
|
|
18
|
+
app?: string | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
key: string;
|
|
21
|
+
app?: string | undefined;
|
|
22
|
+
}>;
|
|
23
|
+
export declare const envListInputSchema: z.ZodObject<{
|
|
24
|
+
app: z.ZodOptional<z.ZodString>;
|
|
25
|
+
}, "strip", z.ZodTypeAny, {
|
|
26
|
+
app?: string | undefined;
|
|
27
|
+
}, {
|
|
28
|
+
app?: string | undefined;
|
|
29
|
+
}>;
|
|
30
|
+
export declare function envSet(ctx: Context, input: z.infer<typeof envSetInputSchema>): Promise<void>;
|
|
31
|
+
export declare function envUnset(ctx: Context, input: z.infer<typeof envUnsetInputSchema>): Promise<void>;
|
|
32
|
+
export declare function envList(ctx: Context, input?: z.infer<typeof envListInputSchema>): Promise<Record<string, string>>;
|
|
33
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,eAAO,MAAM,iBAAiB;;;;;;;;;EAG5B,CAAC;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;EAG9B,CAAC;AACH,eAAO,MAAM,kBAAkB;;;;;;EAE7B,CAAC;AAkBH,wBAAsB,MAAM,CAC1B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,GACzC,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,OAAO,CAC3B,GAAG,EAAE,OAAO,EACZ,KAAK,GAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAM,GAC7C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAOjC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readPercherTomlAppName } from "../app-name";
|
|
3
|
+
import { PercherCoreError } from "../errors";
|
|
4
|
+
export const envSetInputSchema = z.object({
|
|
5
|
+
app: z.string().optional(),
|
|
6
|
+
values: z.record(z.string(), z.string()),
|
|
7
|
+
});
|
|
8
|
+
export const envUnsetInputSchema = z.object({
|
|
9
|
+
app: z.string().optional(),
|
|
10
|
+
key: z.string().min(1),
|
|
11
|
+
});
|
|
12
|
+
export const envListInputSchema = z.object({
|
|
13
|
+
app: z.string().optional(),
|
|
14
|
+
});
|
|
15
|
+
function resolveAppName(ctx, provided) {
|
|
16
|
+
const name = provided ?? readPercherTomlAppName(ctx.cwd);
|
|
17
|
+
if (!name) {
|
|
18
|
+
throw new PercherCoreError("No app specified and no percher.toml found", {
|
|
19
|
+
code: "env.no-app",
|
|
20
|
+
hint: "Pass --app <name> or run from a directory with percher.toml.",
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return name;
|
|
24
|
+
}
|
|
25
|
+
function mask(value) {
|
|
26
|
+
if (value.length <= 8)
|
|
27
|
+
return value;
|
|
28
|
+
return `${value.slice(0, 4)}•••••`;
|
|
29
|
+
}
|
|
30
|
+
export async function envSet(ctx, input) {
|
|
31
|
+
const name = resolveAppName(ctx, input.app);
|
|
32
|
+
const app = await ctx.client.apps.get(name);
|
|
33
|
+
await ctx.client.env.set(app.id, input.values);
|
|
34
|
+
}
|
|
35
|
+
export async function envUnset(ctx, input) {
|
|
36
|
+
const name = resolveAppName(ctx, input.app);
|
|
37
|
+
const app = await ctx.client.apps.get(name);
|
|
38
|
+
await ctx.client.env.unset(app.id, input.key);
|
|
39
|
+
}
|
|
40
|
+
export async function envList(ctx, input = {}) {
|
|
41
|
+
const name = resolveAppName(ctx, input.app);
|
|
42
|
+
const app = await ctx.client.apps.get(name);
|
|
43
|
+
const raw = await ctx.client.env.list(app.id);
|
|
44
|
+
const masked = {};
|
|
45
|
+
for (const [k, v] of Object.entries(raw))
|
|
46
|
+
masked[k] = mask(v);
|
|
47
|
+
return masked;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Context } from "../context";
|
|
3
|
+
export declare const generateInputSchema: z.ZodObject<{
|
|
4
|
+
cwd: z.ZodOptional<z.ZodString>;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
cwd?: string | undefined;
|
|
7
|
+
}, {
|
|
8
|
+
cwd?: string | undefined;
|
|
9
|
+
}>;
|
|
10
|
+
export type GenerateInput = z.infer<typeof generateInputSchema>;
|
|
11
|
+
export interface GenerateResult {
|
|
12
|
+
files: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare function generate(ctx: Context, input?: GenerateInput): Promise<GenerateResult>;
|
|
15
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,eAAO,MAAM,mBAAmB;;;;;;EAE9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AA8FD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CA8B/F"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { parseFile } from "@percher/toml";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { PercherCoreError } from "../errors";
|
|
6
|
+
export const generateInputSchema = z.object({
|
|
7
|
+
cwd: z.string().optional(),
|
|
8
|
+
});
|
|
9
|
+
function generateEnvExample(config) {
|
|
10
|
+
const lines = ["# Generated by percher generate", ""];
|
|
11
|
+
// From [env] section — mask secret-like values
|
|
12
|
+
if (config.env) {
|
|
13
|
+
for (const [key, value] of Object.entries(config.env)) {
|
|
14
|
+
const isSensitive = /key|secr|tok|passw|auth|dsn|private|database_url|redis_url/i.test(key);
|
|
15
|
+
lines.push(`${key}=${isSensitive ? "your-value-here" : value}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// From [required_env] section
|
|
19
|
+
if (config.required_env) {
|
|
20
|
+
if (config.env && Object.keys(config.env).length > 0)
|
|
21
|
+
lines.push("");
|
|
22
|
+
lines.push("# Required environment variables");
|
|
23
|
+
for (const [key, hint] of Object.entries(config.required_env)) {
|
|
24
|
+
const placeholder = hint === "secret" ? "your-secret-here" : hint === "url" ? "https://..." : "value";
|
|
25
|
+
lines.push(`${key}=${placeholder}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
lines.push("");
|
|
29
|
+
return lines.join("\n");
|
|
30
|
+
}
|
|
31
|
+
function generateTypeScript(config) {
|
|
32
|
+
const lines = [
|
|
33
|
+
"// Auto-generated by percher generate — do not edit manually",
|
|
34
|
+
"// Re-run: bunx percher generate",
|
|
35
|
+
"",
|
|
36
|
+
"declare namespace NodeJS {",
|
|
37
|
+
" interface ProcessEnv {",
|
|
38
|
+
];
|
|
39
|
+
const allKeys = new Set();
|
|
40
|
+
// Platform-injected vars
|
|
41
|
+
for (const key of ["PERCHER_APP_NAME", "PERCHER_DEPLOY_ID", "PERCHER_APP_URL"]) {
|
|
42
|
+
lines.push(` readonly ${key}: string;`);
|
|
43
|
+
allKeys.add(key);
|
|
44
|
+
}
|
|
45
|
+
if (config.data?.mode === "pocketbase") {
|
|
46
|
+
for (const key of ["POCKETBASE_URL", "POCKETBASE_PUBLIC_URL"]) {
|
|
47
|
+
lines.push(` readonly ${key}: string;`);
|
|
48
|
+
allKeys.add(key);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else if (config.data?.mode === "convex") {
|
|
52
|
+
for (const key of ["CONVEX_URL", "VITE_CONVEX_URL"]) {
|
|
53
|
+
lines.push(` readonly ${key}: string;`);
|
|
54
|
+
allKeys.add(key);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else if (config.data?.mode === "supabase") {
|
|
58
|
+
for (const key of ["SUPABASE_URL", "VITE_SUPABASE_URL"]) {
|
|
59
|
+
lines.push(` readonly ${key}: string;`);
|
|
60
|
+
allKeys.add(key);
|
|
61
|
+
}
|
|
62
|
+
if (config.data.supabase?.anon_key) {
|
|
63
|
+
for (const key of ["SUPABASE_ANON_KEY", "VITE_SUPABASE_ANON_KEY"]) {
|
|
64
|
+
lines.push(` readonly ${key}: string;`);
|
|
65
|
+
allKeys.add(key);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// From [env]
|
|
70
|
+
if (config.env) {
|
|
71
|
+
for (const key of Object.keys(config.env)) {
|
|
72
|
+
if (!allKeys.has(key)) {
|
|
73
|
+
lines.push(` readonly ${key}: string;`);
|
|
74
|
+
allKeys.add(key);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// From [required_env]
|
|
79
|
+
if (config.required_env) {
|
|
80
|
+
for (const key of Object.keys(config.required_env)) {
|
|
81
|
+
if (!allKeys.has(key)) {
|
|
82
|
+
lines.push(` readonly ${key}: string;`);
|
|
83
|
+
allKeys.add(key);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
lines.push(" }");
|
|
88
|
+
lines.push("}");
|
|
89
|
+
lines.push("");
|
|
90
|
+
return lines.join("\n");
|
|
91
|
+
}
|
|
92
|
+
export async function generate(ctx, input = {}) {
|
|
93
|
+
const cwd = input.cwd ?? ctx.cwd;
|
|
94
|
+
const tomlPath = join(cwd, "percher.toml");
|
|
95
|
+
if (!existsSync(tomlPath)) {
|
|
96
|
+
throw new PercherCoreError("No percher.toml found", {
|
|
97
|
+
code: "dev.no-app",
|
|
98
|
+
hint: "Run percher init first.",
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const config = await parseFile(tomlPath);
|
|
102
|
+
const files = [];
|
|
103
|
+
// Generate .env.example
|
|
104
|
+
const envExample = generateEnvExample(config);
|
|
105
|
+
writeFileSync(join(cwd, ".env.example"), envExample);
|
|
106
|
+
files.push(".env.example");
|
|
107
|
+
// Generate TypeScript types
|
|
108
|
+
const tsTypes = generateTypeScript(config);
|
|
109
|
+
writeFileSync(join(cwd, "percher.generated.d.ts"), tsTypes);
|
|
110
|
+
files.push("percher.generated.d.ts");
|
|
111
|
+
// Generate agent instructions
|
|
112
|
+
const agentInstructions = generateAgentInstructions(config);
|
|
113
|
+
mkdirSync(join(cwd, ".percher"), { recursive: true });
|
|
114
|
+
writeFileSync(join(cwd, ".percher", "agent-instructions.md"), agentInstructions);
|
|
115
|
+
files.push(".percher/agent-instructions.md");
|
|
116
|
+
return { files };
|
|
117
|
+
}
|
|
118
|
+
function generateAgentInstructions(config) {
|
|
119
|
+
const lines = [
|
|
120
|
+
`# Agent Instructions for ${config.app.name}`,
|
|
121
|
+
"",
|
|
122
|
+
"This file was generated by `percher generate`. It tells AI agents how to work with this app.",
|
|
123
|
+
"",
|
|
124
|
+
"## App Info",
|
|
125
|
+
"",
|
|
126
|
+
`- **Name**: ${config.app.name}`,
|
|
127
|
+
`- **Runtime**: ${config.app.runtime}`,
|
|
128
|
+
`- **URL**: https://${config.app.name}.percher.run`,
|
|
129
|
+
];
|
|
130
|
+
if (config.app.framework) {
|
|
131
|
+
lines.push(`- **Framework**: ${config.app.framework}`);
|
|
132
|
+
}
|
|
133
|
+
// Data backend instructions
|
|
134
|
+
const dataMode = config.data?.mode ?? "pocketbase";
|
|
135
|
+
lines.push("", "## Data Backend", "");
|
|
136
|
+
if (dataMode === "pocketbase") {
|
|
137
|
+
lines.push("This app uses **PocketBase** (managed by Percher).", "", "- PocketBase URL is available as `POCKETBASE_URL` (internal) and `POCKETBASE_PUBLIC_URL` (public)", "- Use the PocketBase JavaScript SDK: `import PocketBase from 'pocketbase'`", "- Admin panel: accessible via `percher data` or the Percher dashboard");
|
|
138
|
+
}
|
|
139
|
+
else if (dataMode === "convex") {
|
|
140
|
+
lines.push("This app uses **Convex** (external, BYO).", "", "- Convex URL is available as `CONVEX_URL` and `VITE_CONVEX_URL`", "- Use the Convex SDK: `import { ConvexProvider } from 'convex/react'`", "- Convex deploy key must be set via `percher env set CONVEX_DEPLOY_KEY=...`", "- Do NOT put Convex secrets in percher.toml");
|
|
141
|
+
}
|
|
142
|
+
else if (dataMode === "supabase") {
|
|
143
|
+
lines.push("This app uses **Supabase** (external, BYO).", "", "- Supabase URL is available as `SUPABASE_URL` and `VITE_SUPABASE_URL`", "- Anon key (if set) is available as `SUPABASE_ANON_KEY` and `VITE_SUPABASE_ANON_KEY`", "- Service role key must be set via `percher env set SUPABASE_SERVICE_ROLE_KEY=...`", "- Do NOT put service role keys in percher.toml");
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
lines.push(`Data mode: **${dataMode}**`);
|
|
147
|
+
}
|
|
148
|
+
// Required env vars
|
|
149
|
+
if (config.required_env && Object.keys(config.required_env).length > 0) {
|
|
150
|
+
lines.push("", "## Required Environment Variables", "");
|
|
151
|
+
lines.push("Set these before deploying:", "");
|
|
152
|
+
for (const [key, hint] of Object.entries(config.required_env)) {
|
|
153
|
+
lines.push(`- \`${key}\` (${hint}) — set via \`percher env set ${key}=...\``);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Deploy instructions
|
|
157
|
+
lines.push("", "## Deploy", "", "```bash", "bunx percher push", "```", "", "## Useful Commands", "", "```bash", "percher doctor # Check app health", "percher logs # Stream logs", "percher data # View data status", "percher env list # List env vars", "```", "");
|
|
158
|
+
return lines.join("\n");
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type PercherConfig } from "@percher/toml";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import type { Context } from "../context";
|
|
4
|
+
import { type DetectedFramework } from "../detect";
|
|
5
|
+
export declare const initInputSchema: z.ZodObject<{
|
|
6
|
+
force: z.ZodOptional<z.ZodBoolean>;
|
|
7
|
+
name: z.ZodOptional<z.ZodString>;
|
|
8
|
+
dataMode: z.ZodOptional<z.ZodEnum<["pocketbase", "postgres", "sqlite", "none"]>>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
force?: boolean | undefined;
|
|
11
|
+
name?: string | undefined;
|
|
12
|
+
dataMode?: "pocketbase" | "postgres" | "sqlite" | "none" | undefined;
|
|
13
|
+
}, {
|
|
14
|
+
force?: boolean | undefined;
|
|
15
|
+
name?: string | undefined;
|
|
16
|
+
dataMode?: "pocketbase" | "postgres" | "sqlite" | "none" | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
export type InitInput = z.infer<typeof initInputSchema>;
|
|
19
|
+
export interface InitResult {
|
|
20
|
+
path: string;
|
|
21
|
+
config: PercherConfig;
|
|
22
|
+
detected: DetectedFramework | null;
|
|
23
|
+
overwritten: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function init(ctx: Context, input?: InitInput): Promise<InitResult>;
|
|
26
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAA2B,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,KAAK,iBAAiB,EAAmB,MAAM,WAAW,CAAC;AAmBpE,eAAO,MAAM,eAAe;;;;;;;;;;;;EAI1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,OAAO,CAAC;CACtB;AAQD,wBAAsB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,SAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CA4CnF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { existsSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { basename, join } from "node:path";
|
|
3
|
+
import { generateName, serialize } from "@percher/toml";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { detectFramework } from "../detect";
|
|
6
|
+
import { PercherCoreError } from "../errors";
|
|
7
|
+
function buildDataConfig(mode) {
|
|
8
|
+
if (mode === "convex") {
|
|
9
|
+
return {
|
|
10
|
+
mode: "convex",
|
|
11
|
+
convex: { deployment_url: "https://your-project.convex.cloud" },
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
if (mode === "supabase") {
|
|
15
|
+
return {
|
|
16
|
+
mode: "supabase",
|
|
17
|
+
supabase: { url: "https://your-project.supabase.co" },
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return { mode: mode };
|
|
21
|
+
}
|
|
22
|
+
export const initInputSchema = z.object({
|
|
23
|
+
force: z.boolean().optional(),
|
|
24
|
+
name: z.string().optional(),
|
|
25
|
+
dataMode: z.enum(["pocketbase", "postgres", "sqlite", "none"]).optional(),
|
|
26
|
+
});
|
|
27
|
+
function scanEnvVars(_cwd) {
|
|
28
|
+
// Minimal implementation: do not walk the full tree in init. The CLI can
|
|
29
|
+
// add a more thorough scan later. Detection tests don't rely on this.
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
export async function init(ctx, input = {}) {
|
|
33
|
+
const path = join(ctx.cwd, "percher.toml");
|
|
34
|
+
const exists = existsSync(path);
|
|
35
|
+
if (exists && !input.force) {
|
|
36
|
+
throw new PercherCoreError("percher.toml already exists", {
|
|
37
|
+
code: "init.exists",
|
|
38
|
+
hint: "Run with --force to overwrite.",
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const detected = await detectFramework(ctx.cwd);
|
|
42
|
+
const name = input.name ?? generateName(basename(ctx.cwd));
|
|
43
|
+
const config = {
|
|
44
|
+
app: {
|
|
45
|
+
name,
|
|
46
|
+
runtime: detected?.runtime ?? "node",
|
|
47
|
+
...(detected?.framework
|
|
48
|
+
? { framework: detected.framework }
|
|
49
|
+
: {}),
|
|
50
|
+
},
|
|
51
|
+
...(detected?.build ? { build: detected.build } : {}),
|
|
52
|
+
...(detected?.web ? { web: detected.web } : {}),
|
|
53
|
+
...(detected?.data || input.dataMode
|
|
54
|
+
? {
|
|
55
|
+
data: buildDataConfig(input.dataMode ?? detected?.data?.mode ?? "none"),
|
|
56
|
+
}
|
|
57
|
+
: {}),
|
|
58
|
+
};
|
|
59
|
+
const envVars = scanEnvVars(ctx.cwd);
|
|
60
|
+
if (Object.keys(envVars).length > 0) {
|
|
61
|
+
config.env = envVars;
|
|
62
|
+
}
|
|
63
|
+
writeFileSync(path, serialize(config), "utf8");
|
|
64
|
+
return {
|
|
65
|
+
path,
|
|
66
|
+
config,
|
|
67
|
+
detected,
|
|
68
|
+
overwritten: exists,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Context } from "../context";
|
|
3
|
+
export declare const loginInputSchema: z.ZodObject<{
|
|
4
|
+
token: z.ZodOptional<z.ZodString>;
|
|
5
|
+
apiUrl: z.ZodOptional<z.ZodString>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
token?: string | undefined;
|
|
8
|
+
apiUrl?: string | undefined;
|
|
9
|
+
}, {
|
|
10
|
+
token?: string | undefined;
|
|
11
|
+
apiUrl?: string | undefined;
|
|
12
|
+
}>;
|
|
13
|
+
export type LoginInput = z.infer<typeof loginInputSchema>;
|
|
14
|
+
export declare function login(ctx: Context, input?: LoginInput): Promise<string>;
|
|
15
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,eAAO,MAAM,gBAAgB;;;;;;;;;EAG3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAuB1D,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BjF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { PercherClient, saveConfig } from "@percher/client";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { PercherCoreError } from "../errors";
|
|
4
|
+
export const loginInputSchema = z.object({
|
|
5
|
+
token: z.string().optional(),
|
|
6
|
+
apiUrl: z.string().url().optional(),
|
|
7
|
+
});
|
|
8
|
+
async function writeStatus(ctx, message) {
|
|
9
|
+
ctx.status(message);
|
|
10
|
+
}
|
|
11
|
+
async function validateAndPersist(ctx, apiUrl, token) {
|
|
12
|
+
if (apiUrl)
|
|
13
|
+
saveConfig({ apiUrl, token });
|
|
14
|
+
else
|
|
15
|
+
saveConfig({ token });
|
|
16
|
+
const client = new PercherClient({
|
|
17
|
+
apiUrl: apiUrl ?? ctx.client.apiUrl,
|
|
18
|
+
token,
|
|
19
|
+
});
|
|
20
|
+
const me = await client.auth.whoami();
|
|
21
|
+
await writeStatus(ctx, `Signed in as ${me.email}`);
|
|
22
|
+
return token;
|
|
23
|
+
}
|
|
24
|
+
export async function login(ctx, input = {}) {
|
|
25
|
+
// Token mode
|
|
26
|
+
if (input.token) {
|
|
27
|
+
return validateAndPersist(ctx, input.apiUrl, input.token);
|
|
28
|
+
}
|
|
29
|
+
// Device flow
|
|
30
|
+
const deviceClient = input.apiUrl
|
|
31
|
+
? new PercherClient({ apiUrl: input.apiUrl, token: null })
|
|
32
|
+
: ctx.client;
|
|
33
|
+
const code = await deviceClient.auth.requestDeviceCode();
|
|
34
|
+
const verifyUrl = `${code.verificationUri}?code=${encodeURIComponent(code.userCode)}`;
|
|
35
|
+
await writeStatus(ctx, `Opening browser to: ${verifyUrl}`);
|
|
36
|
+
await ctx.openUrl(verifyUrl);
|
|
37
|
+
await writeStatus(ctx, `Waiting for authorization (code: ${code.userCode})...`);
|
|
38
|
+
const deadline = Date.now() + code.expiresIn * 1000;
|
|
39
|
+
while (Date.now() < deadline) {
|
|
40
|
+
const result = await deviceClient.auth.exchangeDeviceCode({ deviceCode: code.deviceCode });
|
|
41
|
+
if (result.token) {
|
|
42
|
+
return validateAndPersist(ctx, input.apiUrl, result.token);
|
|
43
|
+
}
|
|
44
|
+
if (code.interval > 0) {
|
|
45
|
+
await new Promise((resolve) => setTimeout(resolve, code.interval * 1000));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
throw new PercherCoreError("Login timed out. Re-run `percher login`.", {
|
|
49
|
+
code: "login.expired",
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Context } from "../context";
|
|
3
|
+
export declare const logsInputSchema: z.ZodObject<{
|
|
4
|
+
app: z.ZodOptional<z.ZodString>;
|
|
5
|
+
tail: z.ZodOptional<z.ZodNumber>;
|
|
6
|
+
follow: z.ZodOptional<z.ZodBoolean>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
app?: string | undefined;
|
|
9
|
+
tail?: number | undefined;
|
|
10
|
+
follow?: boolean | undefined;
|
|
11
|
+
}, {
|
|
12
|
+
app?: string | undefined;
|
|
13
|
+
tail?: number | undefined;
|
|
14
|
+
follow?: boolean | undefined;
|
|
15
|
+
}>;
|
|
16
|
+
export type LogsInput = z.infer<typeof logsInputSchema>;
|
|
17
|
+
export declare function logs(ctx: Context, input?: LogsInput): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=logs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,eAAO,MAAM,eAAe;;;;;;;;;;;;EAI1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,wBAAsB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,SAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B7E"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readPercherTomlAppName } from "../app-name";
|
|
3
|
+
import { PercherCoreError } from "../errors";
|
|
4
|
+
export const logsInputSchema = z.object({
|
|
5
|
+
app: z.string().optional(),
|
|
6
|
+
tail: z.number().int().positive().optional(),
|
|
7
|
+
follow: z.boolean().optional(),
|
|
8
|
+
});
|
|
9
|
+
export async function logs(ctx, input = {}) {
|
|
10
|
+
const name = input.app ?? readPercherTomlAppName(ctx.cwd);
|
|
11
|
+
if (!name) {
|
|
12
|
+
throw new PercherCoreError("No app specified and no percher.toml found", {
|
|
13
|
+
code: "logs.no-app",
|
|
14
|
+
hint: "Pass an app name or run from a directory with percher.toml.",
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
const app = await ctx.client.apps.get(name);
|
|
18
|
+
const writer = ctx.stdout.getWriter();
|
|
19
|
+
const encoder = new TextEncoder();
|
|
20
|
+
try {
|
|
21
|
+
if (input.tail !== undefined) {
|
|
22
|
+
const lines = await ctx.client.logs.tail(app.id, { lines: input.tail });
|
|
23
|
+
for (const line of lines) {
|
|
24
|
+
await writer.write(encoder.encode(`${line}\n`));
|
|
25
|
+
}
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// Follow mode (default)
|
|
29
|
+
for await (const line of ctx.client.logs.stream(app.id)) {
|
|
30
|
+
const levelTag = line.level.toUpperCase().padEnd(5);
|
|
31
|
+
await writer.write(encoder.encode(`[${line.timestamp}] ${levelTag} ${line.message}\n`));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
writer.releaseLock();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC;AAGH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,GAAY,EAAE,QAAmB,EAAE;IAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,gBAAgB,CAAC,4CAA4C,EAAE;YACvE,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,6DAA6D;SACpE,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAElC,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACxE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;YAClD,CAAC;YACD,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Context } from "../context";
|
|
3
|
+
export declare const openInputSchema: z.ZodObject<{
|
|
4
|
+
app: z.ZodOptional<z.ZodString>;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
app?: string | undefined;
|
|
7
|
+
}, {
|
|
8
|
+
app?: string | undefined;
|
|
9
|
+
}>;
|
|
10
|
+
export type OpenInput = z.infer<typeof openInputSchema>;
|
|
11
|
+
export declare function open(ctx: Context, input?: OpenInput): Promise<string>;
|
|
12
|
+
//# sourceMappingURL=open.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,eAAO,MAAM,eAAe;;;;;;EAE1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,wBAAsB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,SAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAW/E"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readPercherTomlAppName } from "../app-name";
|
|
3
|
+
import { PercherCoreError } from "../errors";
|
|
4
|
+
export const openInputSchema = z.object({
|
|
5
|
+
app: z.string().optional(),
|
|
6
|
+
});
|
|
7
|
+
export async function open(ctx, input = {}) {
|
|
8
|
+
const name = input.app ?? readPercherTomlAppName(ctx.cwd);
|
|
9
|
+
if (!name) {
|
|
10
|
+
throw new PercherCoreError("No app specified and no percher.toml found", {
|
|
11
|
+
code: "open.no-app",
|
|
12
|
+
hint: "Pass an app name or run from a directory with percher.toml.",
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
const app = await ctx.client.apps.get(name);
|
|
16
|
+
await ctx.openUrl(app.url);
|
|
17
|
+
return app.url;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=open.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3B,CAAC,CAAC;AAGH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,GAAY,EAAE,QAAmB,EAAE;IAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,gBAAgB,CAAC,4CAA4C,EAAE;YACvE,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,6DAA6D;SACpE,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,GAAG,CAAC,GAAG,CAAC;AACjB,CAAC"}
|