@geoly-ai/social-hub-cli 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/client.d.ts +5 -0
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +23 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/config.d.ts +24 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +96 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/config.test.d.ts +2 -0
  10. package/dist/config.test.d.ts.map +1 -0
  11. package/dist/config.test.js +13 -0
  12. package/dist/config.test.js.map +1 -0
  13. package/dist/context-state.d.ts +9 -0
  14. package/dist/context-state.d.ts.map +1 -0
  15. package/dist/context-state.js +29 -0
  16. package/dist/context-state.js.map +1 -0
  17. package/dist/dry-run.d.ts +12 -0
  18. package/dist/dry-run.d.ts.map +1 -0
  19. package/dist/dry-run.js +18 -0
  20. package/dist/dry-run.js.map +1 -0
  21. package/dist/dry-run.test.d.ts +2 -0
  22. package/dist/dry-run.test.d.ts.map +1 -0
  23. package/dist/dry-run.test.js +21 -0
  24. package/dist/dry-run.test.js.map +1 -0
  25. package/dist/index.d.ts +5 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +1342 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/index.test.d.ts +2 -0
  30. package/dist/index.test.d.ts.map +1 -0
  31. package/dist/index.test.js +303 -0
  32. package/dist/index.test.js.map +1 -0
  33. package/dist/output.d.ts +9 -0
  34. package/dist/output.d.ts.map +1 -0
  35. package/dist/output.js +75 -0
  36. package/dist/output.js.map +1 -0
  37. package/dist/permissions.d.ts +32 -0
  38. package/dist/permissions.d.ts.map +1 -0
  39. package/dist/permissions.js +101 -0
  40. package/dist/permissions.js.map +1 -0
  41. package/dist/permissions.test.d.ts +2 -0
  42. package/dist/permissions.test.d.ts.map +1 -0
  43. package/dist/permissions.test.js +17 -0
  44. package/dist/permissions.test.js.map +1 -0
  45. package/dist/register-admin.d.ts +3 -0
  46. package/dist/register-admin.d.ts.map +1 -0
  47. package/dist/register-admin.js +100 -0
  48. package/dist/register-admin.js.map +1 -0
  49. package/dist/register-batch.d.ts +3 -0
  50. package/dist/register-batch.d.ts.map +1 -0
  51. package/dist/register-batch.js +85 -0
  52. package/dist/register-batch.js.map +1 -0
  53. package/dist/register-extensions.d.ts +9 -0
  54. package/dist/register-extensions.d.ts.map +1 -0
  55. package/dist/register-extensions.js +550 -0
  56. package/dist/register-extensions.js.map +1 -0
  57. package/dist/register-ops.d.ts +4 -0
  58. package/dist/register-ops.d.ts.map +1 -0
  59. package/dist/register-ops.js +152 -0
  60. package/dist/register-ops.js.map +1 -0
  61. package/dist/register-shared.d.ts +3 -0
  62. package/dist/register-shared.d.ts.map +1 -0
  63. package/dist/register-shared.js +145 -0
  64. package/dist/register-shared.js.map +1 -0
  65. package/package.json +35 -0
@@ -0,0 +1,5 @@
1
+ import { SocialHubClient } from "@geoly-ai/social-hub-sdk";
2
+ export declare function requireClient(): SocialHubClient;
3
+ export declare function resolveTeamId(explicit?: string): string;
4
+ export declare function getBaseUrl(): string;
5
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAI3D,wBAAgB,aAAa,IAAI,eAAe,CAS/C;AAED,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CASvD;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC"}
package/dist/client.js ADDED
@@ -0,0 +1,23 @@
1
+ import { SocialHubClient } from "@geoly-ai/social-hub-sdk";
2
+ import { resolveCliConfig } from "./config.js";
3
+ import { resolveEffectiveTeamId } from "./context-state.js";
4
+ export function requireClient() {
5
+ const { apiUrl, apiKey } = resolveCliConfig();
6
+ if (!apiKey) {
7
+ console.error("Missing credentials. Run `social-hub auth login` or set SOCIAL_HUB_API_KEY.");
8
+ process.exit(1);
9
+ }
10
+ return new SocialHubClient({ baseUrl: apiUrl, apiKey });
11
+ }
12
+ export function resolveTeamId(explicit) {
13
+ const teamId = resolveEffectiveTeamId(explicit);
14
+ if (!teamId) {
15
+ console.error("Missing team id. Pass -t/--team, set SOCIAL_HUB_TEAM_ID, or run `social-hub config set teamId <uuid>`.");
16
+ process.exit(1);
17
+ }
18
+ return teamId;
19
+ }
20
+ export function getBaseUrl() {
21
+ return resolveCliConfig().apiUrl;
22
+ }
23
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,UAAU,aAAa;IAC3B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CACX,6EAA6E,CAC9E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAiB;IAC7C,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CACX,wGAAwG,CACzG,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,gBAAgB,EAAE,CAAC,MAAM,CAAC;AACnC,CAAC"}
@@ -0,0 +1,24 @@
1
+ export type SocialHubCliConfig = {
2
+ apiUrl?: string;
3
+ /** Legacy name; stores Bearer credential (API key or CLI token). */
4
+ apiKey?: string;
5
+ authToken?: string;
6
+ teamId?: string;
7
+ };
8
+ export declare function getConfigPath(): string;
9
+ export declare function loadConfigFile(): SocialHubCliConfig;
10
+ export declare function saveConfigFile(config: SocialHubCliConfig): void;
11
+ export declare function maskSecret(value: string | undefined, visible?: number): string;
12
+ /** Env vars override file config. */
13
+ export declare function resolveCliConfig(): {
14
+ apiUrl: string;
15
+ apiKey: string | undefined;
16
+ teamId: string | undefined;
17
+ sources: {
18
+ apiUrl: "env" | "file" | "default";
19
+ apiKey: "env" | "file" | "none";
20
+ teamId: "env" | "file" | "none";
21
+ };
22
+ };
23
+ export declare function mergeConfigPatch(patch: Partial<SocialHubCliConfig>): SocialHubCliConfig;
24
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAOF,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,cAAc,IAAI,kBAAkB,CAenD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAY/D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,SAAI,GAAG,MAAM,CAIzE;AAED,qCAAqC;AACrC,wBAAgB,gBAAgB,IAAI;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE;QAAE,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACnH,CAoCA;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACjC,kBAAkB,CAWpB"}
package/dist/config.js ADDED
@@ -0,0 +1,96 @@
1
+ import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ const CONFIG_DIR = process.env.SOCIAL_HUB_CONFIG_DIR ??
5
+ join(process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config"), "social-hub");
6
+ const CONFIG_FILE = join(CONFIG_DIR, "config.json");
7
+ export function getConfigPath() {
8
+ return CONFIG_FILE;
9
+ }
10
+ export function loadConfigFile() {
11
+ if (!existsSync(CONFIG_FILE))
12
+ return {};
13
+ try {
14
+ const raw = readFileSync(CONFIG_FILE, "utf8");
15
+ const parsed = JSON.parse(raw);
16
+ return {
17
+ apiUrl: typeof parsed.apiUrl === "string" ? parsed.apiUrl : undefined,
18
+ apiKey: typeof parsed.apiKey === "string" ? parsed.apiKey : undefined,
19
+ authToken: typeof parsed.authToken === "string" ? parsed.authToken : undefined,
20
+ teamId: typeof parsed.teamId === "string" ? parsed.teamId : undefined,
21
+ };
22
+ }
23
+ catch {
24
+ return {};
25
+ }
26
+ }
27
+ export function saveConfigFile(config) {
28
+ mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
29
+ writeFileSync(CONFIG_FILE, `${JSON.stringify(config, null, 2)}\n`, {
30
+ encoding: "utf8",
31
+ mode: 0o600,
32
+ });
33
+ try {
34
+ chmodSync(CONFIG_FILE, 0o600);
35
+ chmodSync(CONFIG_DIR, 0o700);
36
+ }
37
+ catch {
38
+ // best-effort on platforms that restrict chmod
39
+ }
40
+ }
41
+ export function maskSecret(value, visible = 4) {
42
+ if (!value)
43
+ return "(not set)";
44
+ if (value.length <= visible * 2)
45
+ return "***";
46
+ return `${value.slice(0, visible)}…${value.slice(-visible)}`;
47
+ }
48
+ /** Env vars override file config. */
49
+ export function resolveCliConfig() {
50
+ const file = loadConfigFile();
51
+ const apiUrl = process.env.SOCIAL_HUB_API_URL?.trim() ||
52
+ file.apiUrl?.trim() ||
53
+ "http://localhost:3000";
54
+ const apiKey = process.env.SOCIAL_HUB_API_KEY?.trim() ||
55
+ file.authToken?.trim() ||
56
+ file.apiKey?.trim() ||
57
+ undefined;
58
+ const teamId = process.env.SOCIAL_HUB_TEAM_ID?.trim() || file.teamId?.trim() || undefined;
59
+ return {
60
+ apiUrl,
61
+ apiKey,
62
+ teamId,
63
+ sources: {
64
+ apiUrl: process.env.SOCIAL_HUB_API_URL
65
+ ? "env"
66
+ : file.apiUrl
67
+ ? "file"
68
+ : "default",
69
+ apiKey: process.env.SOCIAL_HUB_API_KEY
70
+ ? "env"
71
+ : file.authToken || file.apiKey
72
+ ? "file"
73
+ : "none",
74
+ teamId: process.env.SOCIAL_HUB_TEAM_ID
75
+ ? "env"
76
+ : file.teamId
77
+ ? "file"
78
+ : "none",
79
+ },
80
+ };
81
+ }
82
+ export function mergeConfigPatch(patch) {
83
+ const current = loadConfigFile();
84
+ const next = { ...current };
85
+ for (const key of ["apiUrl", "apiKey", "authToken", "teamId"]) {
86
+ if (patch[key] !== undefined) {
87
+ const value = patch[key]?.trim();
88
+ if (value)
89
+ next[key] = value;
90
+ else
91
+ delete next[key];
92
+ }
93
+ }
94
+ return next;
95
+ }
96
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { maskSecret, mergeConfigPatch } from "./config.js";
3
+ describe("config", () => {
4
+ it("masks api keys", () => {
5
+ expect(maskSecret("sk_live_abcdefghijklmnop")).toMatch(/^sk_l…/);
6
+ });
7
+ it("mergeConfigPatch clears empty apiKey", () => {
8
+ const next = mergeConfigPatch({ apiKey: "", apiUrl: "https://hub.example" });
9
+ expect(next.apiUrl).toBe("https://hub.example");
10
+ expect(next.apiKey).toBeUndefined();
11
+ });
12
+ });
13
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3D,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ type CliContextState = {
2
+ currentTeamId?: string;
3
+ label?: string;
4
+ };
5
+ export declare function loadContextState(): CliContextState;
6
+ export declare function saveContextState(state: CliContextState): void;
7
+ export declare function resolveEffectiveTeamId(explicit?: string): string | undefined;
8
+ export {};
9
+ //# sourceMappingURL=context-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-state.d.ts","sourceRoot":"","sources":["../src/context-state.ts"],"names":[],"mappings":"AAIA,KAAK,eAAe,GAAG;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAMF,wBAAgB,gBAAgB,IAAI,eAAe,CAQlD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAI7D;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAO5E"}
@@ -0,0 +1,29 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { getConfigPath, loadConfigFile } from "./config.js";
4
+ function statePath() {
5
+ return join(getConfigPath().replace(/config\.json$/, ""), "context.json");
6
+ }
7
+ export function loadContextState() {
8
+ const path = statePath();
9
+ if (!existsSync(path))
10
+ return {};
11
+ try {
12
+ return JSON.parse(readFileSync(path, "utf8"));
13
+ }
14
+ catch {
15
+ return {};
16
+ }
17
+ }
18
+ export function saveContextState(state) {
19
+ const path = statePath();
20
+ mkdirSync(join(path, ".."), { recursive: true });
21
+ writeFileSync(path, `${JSON.stringify(state, null, 2)}\n`);
22
+ }
23
+ export function resolveEffectiveTeamId(explicit) {
24
+ return (explicit?.trim() ||
25
+ loadContextState().currentTeamId?.trim() ||
26
+ loadConfigFile().teamId?.trim() ||
27
+ process.env.SOCIAL_HUB_TEAM_ID?.trim());
28
+ }
29
+ //# sourceMappingURL=context-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-state.js","sourceRoot":"","sources":["../src/context-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAO5D,SAAS,SAAS;IAChB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAoB,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAsB;IACrD,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAiB;IACtD,OAAO,CACL,QAAQ,EAAE,IAAI,EAAE;QAChB,gBAAgB,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE;QACxC,cAAc,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE;QAC/B,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CACvC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type ApplyOptions = {
2
+ dryRun?: boolean;
3
+ apply?: boolean;
4
+ yes?: boolean;
5
+ };
6
+ /** High-risk writes require explicit --apply unless --dry-run. */
7
+ export declare function assertApplyOrDryRun(opts: ApplyOptions, meta: {
8
+ command: string;
9
+ danger: string;
10
+ summary: unknown;
11
+ }): boolean;
12
+ //# sourceMappingURL=dry-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dry-run.d.ts","sourceRoot":"","sources":["../src/dry-run.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,kEAAkE;AAClE,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC1D,OAAO,CAuBT"}
@@ -0,0 +1,18 @@
1
+ /** High-risk writes require explicit --apply unless --dry-run. */
2
+ export function assertApplyOrDryRun(opts, meta) {
3
+ if (opts.dryRun) {
4
+ console.log(JSON.stringify({
5
+ dryRun: true,
6
+ command: meta.command,
7
+ danger: meta.danger,
8
+ wouldApply: meta.summary,
9
+ }, null, 2));
10
+ return false;
11
+ }
12
+ if (!opts.apply) {
13
+ console.error(`Refusing to run \`${meta.command}\` without --apply. Use --dry-run to preview.`);
14
+ process.exit(1);
15
+ }
16
+ return true;
17
+ }
18
+ //# sourceMappingURL=dry-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dry-run.js","sourceRoot":"","sources":["../src/dry-run.ts"],"names":[],"mappings":"AAMA,kEAAkE;AAClE,MAAM,UAAU,mBAAmB,CACjC,IAAkB,EAClB,IAA2D;IAE3D,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;YACE,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,OAAO;SACzB,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CACX,qBAAqB,IAAI,CAAC,OAAO,+CAA+C,CACjF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dry-run.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dry-run.test.d.ts","sourceRoot":"","sources":["../src/dry-run.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { assertApplyOrDryRun } from "./dry-run.js";
3
+ describe("assertApplyOrDryRun", () => {
4
+ it("prints dry-run preview and returns false", () => {
5
+ const log = vi.spyOn(console, "log").mockImplementation(() => { });
6
+ const result = assertApplyOrDryRun({ dryRun: true }, { command: "test", danger: "write", summary: { a: 1 } });
7
+ expect(result).toBe(false);
8
+ expect(log).toHaveBeenCalled();
9
+ log.mockRestore();
10
+ });
11
+ it("exits when neither dry-run nor apply", () => {
12
+ const exit = vi.spyOn(process, "exit").mockImplementation((() => {
13
+ throw new Error("exit");
14
+ }));
15
+ const err = vi.spyOn(console, "error").mockImplementation(() => { });
16
+ expect(() => assertApplyOrDryRun({}, { command: "x", danger: "write", summary: {} })).toThrow("exit");
17
+ exit.mockRestore();
18
+ err.mockRestore();
19
+ });
20
+ });
21
+ //# sourceMappingURL=dry-run.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dry-run.test.js","sourceRoot":"","sources":["../src/dry-run.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,mBAAmB,CAChC,EAAE,MAAM,EAAE,IAAI,EAAE,EAChB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CACxD,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC/B,GAAG,CAAC,WAAW,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE;YAC9D,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAU,CAAC,CAAC;QACb,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,EAAE,CACV,mBAAmB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CACxE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,GAAG,CAAC,WAAW,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ declare const program: Command;
4
+ export { program };
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AAkhD9B,OAAO,EAAE,OAAO,EAAE,CAAC"}