@react-grab/cli 0.1.46 → 0.1.47-dev.d5e8fc8

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 CHANGED
@@ -67,6 +67,94 @@ npx grab@latest configure --mode hold --hold-duration 500
67
67
  npx grab@latest configure
68
68
  ```
69
69
 
70
+ ## Node API
71
+
72
+ `@react-grab/cli/api` exposes the same primitives that power the CLI, so you can build your own installer or wrap React Grab setup inside another tool. Importing it runs no code, unlike the CLI entry (`.`), which parses `argv` on import.
73
+
74
+ ### `installReactGrab(options?)`
75
+
76
+ A high-level, non-interactive orchestrator. It detects the project, installs `react-grab` with the detected package manager, and applies the framework-specific development-only setup. It returns a structured result instead of printing or exiting.
77
+
78
+ ```ts
79
+ import { installReactGrab } from "@react-grab/cli/api";
80
+
81
+ const result = await installReactGrab({ cwd: process.cwd() });
82
+
83
+ console.log(result.framework); // "next" | "vite" | "tanstack" | "webpack"
84
+ console.log(result.didInstallPackage); // whether react-grab was added to deps
85
+ console.log(result.didChangeFile); // whether an entry file was modified
86
+ console.log(result.transform.filePath); // the file that was (or would be) edited
87
+ ```
88
+
89
+ | Option | Type | Description |
90
+ | ----------------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
91
+ | `cwd` | `string` | Project directory (default: `process.cwd()`) |
92
+ | `framework` | `Framework` | Override framework detection |
93
+ | `nextRouterType` | `NextRouterType` | Override Next.js router detection (`app` / `pages`) |
94
+ | `packageManager` | `PackageManager` | Override package-manager detection |
95
+ | `skipPackageInstall` | `boolean` | Skip installing the `react-grab` npm package |
96
+ | `skipTransform` | `boolean` | Skip editing the framework entry file |
97
+ | `dryRun` | `boolean` | Compute the changes without installing or writing |
98
+ | `installPackageOptions` | `Omit<InstallPackageOptions, "cwd" \| "packageManager">` | Passed through to `installPackages` (e.g. `silent`, `isDev`); `cwd`/`packageManager` are controlled by the orchestrator |
99
+
100
+ Failures throw a `ReactGrabInstallError` whose `code` identifies the cause, with the original error preserved on `error.cause`:
101
+
102
+ - `unsupported-framework`: framework has no automatic setup (Remix, Astro, SvelteKit, Gatsby)
103
+ - `unknown-framework`: no supported framework detected
104
+ - `transform-failed`: entry file could not be located or edited
105
+ - `install-failed`: package manager failed to install `react-grab`
106
+ - `write-failed`: edited file could not be written
107
+
108
+ `installReactGrab` configures a single project at `cwd` and does not walk a monorepo. Point `cwd` at the app you want to set up, or call `findReactProjects` first to locate the apps in a workspace.
109
+
110
+ By default the call mutates your project: it runs the package manager and edits a framework entry file. Pass `dryRun: true` to compute the change set (returned on `result.transform`) without installing or writing.
111
+
112
+ ### Low-level building blocks
113
+
114
+ If you want full control, compose the same functions the orchestrator uses:
115
+
116
+ ```ts
117
+ import {
118
+ detectProject,
119
+ previewTransform,
120
+ applyTransform,
121
+ installPackages,
122
+ getPackagesToInstall,
123
+ installSkill,
124
+ } from "@react-grab/cli/api";
125
+
126
+ const project = await detectProject(process.cwd());
127
+ const transform = previewTransform(
128
+ project.projectRoot,
129
+ project.framework,
130
+ project.nextRouterType,
131
+ project.isReactGrabConfigured,
132
+ );
133
+ ```
134
+
135
+ Install the package only when it's missing, then write the previewed edit. `previewTransform` sets `noChanges` when React Grab is already wired up, so guard on it before calling `applyTransform`, which writes `transform.newContent` to `transform.filePath`:
136
+
137
+ ```ts
138
+ if (!project.hasReactGrab) {
139
+ await installPackages(getPackagesToInstall(), {
140
+ cwd: project.projectRoot,
141
+ packageManager: project.packageManager,
142
+ });
143
+ }
144
+
145
+ if (transform.success && transform.newContent && !transform.noChanges) {
146
+ applyTransform(transform);
147
+ }
148
+
149
+ await installSkill({ cwd: project.projectRoot });
150
+ ```
151
+
152
+ The full export surface, each with its TypeScript types:
153
+
154
+ - Detection: `detectProject`, `detectFramework`, `detectPackageManager`, `detectNextRouterType`, `detectReactGrab`, `detectReactGrabConfigured`, `detectUnsupportedFramework`, `findReactProjects`
155
+ - Transforms: `previewTransform`, `previewOptionsTransform`, `previewCdnTransform`, `applyTransform`, `hasFrameworkEntryPoint`
156
+ - Installation: `installPackages`, `getPackagesToInstall`, `installSkill`, `removeSkill`
157
+
70
158
  ## Supported Frameworks
71
159
 
72
160
  The CLI currently configures:
package/dist/api.cjs ADDED
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const require_install = require("./install-DlD3sLtm.cjs");
4
+ let node_path = require("node:path");
5
+ //#region src/utils/install-react-grab.ts
6
+ var ReactGrabInstallError = class extends Error {
7
+ code;
8
+ constructor(message, code, options) {
9
+ super(message, options);
10
+ this.name = "ReactGrabInstallError";
11
+ this.code = code;
12
+ }
13
+ };
14
+ const installReactGrab = async (options = {}) => {
15
+ const project = await require_install.detectProject((0, node_path.resolve)(options.cwd ?? process.cwd()));
16
+ const framework = options.framework ?? project.framework;
17
+ const packageManager = options.packageManager ?? project.packageManager;
18
+ if (project.unsupportedFramework && !options.framework) throw new ReactGrabInstallError(`${project.unsupportedFramework} is not supported by automatic setup.`, "unsupported-framework");
19
+ if (framework === "unknown") throw new ReactGrabInstallError("Could not detect a supported framework. Pass `framework` explicitly to override detection.", "unknown-framework");
20
+ const nextRouterType = options.nextRouterType ?? (framework === "next" && project.nextRouterType === "unknown" ? require_install.detectNextRouterType(project.projectRoot) : project.nextRouterType);
21
+ const alreadyConfigured = project.isReactGrabConfigured;
22
+ const transform = require_install.previewTransform(project.projectRoot, framework, nextRouterType, alreadyConfigured);
23
+ if (!transform.success && !options.skipTransform) throw new ReactGrabInstallError(transform.message, "transform-failed");
24
+ const didInstallPackage = !options.skipPackageInstall && !options.dryRun && !project.hasReactGrab;
25
+ if (didInstallPackage) try {
26
+ await require_install.installPackages(require_install.getPackagesToInstall(), {
27
+ ...options.installPackageOptions,
28
+ cwd: project.projectRoot,
29
+ packageManager
30
+ });
31
+ } catch (error) {
32
+ throw new ReactGrabInstallError(error instanceof Error ? error.message : "Failed to install the react-grab package.", "install-failed", { cause: error });
33
+ }
34
+ const didChangeFile = !transform.noChanges && Boolean(transform.newContent) && !options.skipTransform && !options.dryRun;
35
+ if (didChangeFile) {
36
+ const writeResult = require_install.applyTransform(transform);
37
+ if (!writeResult.success) throw new ReactGrabInstallError(writeResult.error ?? `Failed to write to ${transform.filePath}`, "write-failed");
38
+ }
39
+ return {
40
+ projectRoot: project.projectRoot,
41
+ framework,
42
+ nextRouterType,
43
+ packageManager,
44
+ alreadyConfigured,
45
+ didInstallPackage,
46
+ didChangeFile,
47
+ dryRun: Boolean(options.dryRun),
48
+ transform
49
+ };
50
+ };
51
+ //#endregion
52
+ exports.ReactGrabInstallError = ReactGrabInstallError;
53
+ exports.applyTransform = require_install.applyTransform;
54
+ exports.detectFramework = require_install.detectFramework;
55
+ exports.detectNextRouterType = require_install.detectNextRouterType;
56
+ exports.detectPackageManager = require_install.detectPackageManager;
57
+ exports.detectProject = require_install.detectProject;
58
+ exports.detectReactGrab = require_install.detectReactGrab;
59
+ exports.detectReactGrabConfigured = require_install.detectReactGrabConfigured;
60
+ exports.detectUnsupportedFramework = require_install.detectUnsupportedFramework;
61
+ exports.findReactProjects = require_install.findReactProjects;
62
+ exports.getPackagesToInstall = require_install.getPackagesToInstall;
63
+ exports.hasFrameworkEntryPoint = require_install.hasFrameworkEntryPoint;
64
+ exports.installPackages = require_install.installPackages;
65
+ exports.installReactGrab = installReactGrab;
66
+ exports.installSkill = require_install.installSkill;
67
+ exports.previewCdnTransform = require_install.previewCdnTransform;
68
+ exports.previewOptionsTransform = require_install.previewOptionsTransform;
69
+ exports.previewTransform = require_install.previewTransform;
70
+ exports.removeSkill = require_install.removeSkill;
package/dist/api.d.cts ADDED
@@ -0,0 +1,121 @@
1
+ #!/usr/bin/env node
2
+ import { SkillAgentType, add } from "agent-install/skill";
3
+
4
+ //#region src/utils/detect.d.ts
5
+ type PackageManager = "npm" | "yarn" | "pnpm" | "bun";
6
+ type Framework = "next" | "vite" | "tanstack" | "webpack" | "unknown";
7
+ type NextRouterType = "app" | "pages" | "unknown";
8
+ type UnsupportedFramework = "remix" | "astro" | "sveltekit" | "gatsby" | null;
9
+ interface ProjectInfo {
10
+ packageManager: PackageManager;
11
+ framework: Framework;
12
+ nextRouterType: NextRouterType;
13
+ isMonorepo: boolean;
14
+ projectRoot: string;
15
+ hasReactGrab: boolean;
16
+ isReactGrabConfigured: boolean;
17
+ reactGrabVersion: string | null;
18
+ unsupportedFramework: UnsupportedFramework;
19
+ }
20
+ declare const detectPackageManager: (projectRoot: string) => Promise<PackageManager>;
21
+ declare const detectFramework: (projectRoot: string) => Framework;
22
+ declare const detectNextRouterType: (projectRoot: string) => NextRouterType;
23
+ interface WorkspaceProject {
24
+ name: string;
25
+ path: string;
26
+ framework: Framework;
27
+ }
28
+ declare const findReactProjects: (projectRoot: string) => WorkspaceProject[];
29
+ declare const detectReactGrabConfigured: (projectRoot: string) => boolean;
30
+ declare const detectReactGrab: (projectRoot: string) => boolean;
31
+ declare const detectUnsupportedFramework: (projectRoot: string) => UnsupportedFramework;
32
+ declare const detectProject: (projectRoot?: string) => Promise<ProjectInfo>;
33
+ //#endregion
34
+ //#region src/utils/transform.d.ts
35
+ interface TransformResult {
36
+ success: boolean;
37
+ filePath: string;
38
+ message: string;
39
+ originalContent?: string;
40
+ newContent?: string;
41
+ noChanges?: boolean;
42
+ }
43
+ interface ReactGrabOptions {
44
+ activationKey?: string;
45
+ activationMode?: "toggle" | "hold";
46
+ keyHoldDuration?: number;
47
+ allowActivationInsideInput?: boolean;
48
+ maxContextLines?: number;
49
+ }
50
+ declare const hasFrameworkEntryPoint: (projectRoot: string, framework: Framework, nextRouterType: NextRouterType) => boolean;
51
+ declare const previewTransform: (projectRoot: string, framework: Framework, nextRouterType: NextRouterType, reactGrabAlreadyConfigured?: boolean) => TransformResult;
52
+ declare const applyTransform: (result: TransformResult) => {
53
+ success: boolean;
54
+ error?: string;
55
+ };
56
+ declare const previewOptionsTransform: (projectRoot: string, framework: Framework, nextRouterType: NextRouterType, options: ReactGrabOptions) => TransformResult;
57
+ declare const previewCdnTransform: (projectRoot: string, framework: Framework, nextRouterType: NextRouterType, targetCdnDomain: string) => TransformResult;
58
+ //#endregion
59
+ //#region src/utils/install.d.ts
60
+ interface InstallPackageOptions {
61
+ cwd?: string;
62
+ isDev?: boolean;
63
+ silent?: boolean;
64
+ packageManager?: PackageManager;
65
+ preferOffline?: boolean;
66
+ additionalArgs?: string[];
67
+ }
68
+ declare const installPackages: (packages: string[], options?: InstallPackageOptions) => Promise<void>;
69
+ declare const getPackagesToInstall: (includeReactGrab?: boolean) => string[];
70
+ //#endregion
71
+ //#region src/utils/install-react-grab.d.ts
72
+ type ReactGrabInstallErrorCode = "unsupported-framework" | "unknown-framework" | "transform-failed" | "install-failed" | "write-failed";
73
+ declare class ReactGrabInstallError extends Error {
74
+ readonly code: ReactGrabInstallErrorCode;
75
+ constructor(message: string, code: ReactGrabInstallErrorCode, options?: ErrorOptions);
76
+ }
77
+ interface InstallReactGrabOptions {
78
+ cwd?: string;
79
+ framework?: Framework;
80
+ nextRouterType?: NextRouterType;
81
+ packageManager?: PackageManager;
82
+ skipPackageInstall?: boolean;
83
+ skipTransform?: boolean;
84
+ dryRun?: boolean;
85
+ installPackageOptions?: Omit<InstallPackageOptions, "cwd" | "packageManager">;
86
+ }
87
+ interface InstallReactGrabResult {
88
+ projectRoot: string;
89
+ framework: Framework;
90
+ nextRouterType: NextRouterType;
91
+ packageManager: PackageManager;
92
+ alreadyConfigured: boolean;
93
+ didInstallPackage: boolean;
94
+ didChangeFile: boolean;
95
+ dryRun: boolean;
96
+ transform: TransformResult;
97
+ }
98
+ declare const installReactGrab: (options?: InstallReactGrabOptions) => Promise<InstallReactGrabResult>;
99
+ //#endregion
100
+ //#region src/utils/install-skill.d.ts
101
+ interface InstallSkillOptions {
102
+ agents?: SkillAgentType[];
103
+ global?: boolean;
104
+ cwd?: string;
105
+ }
106
+ declare const installSkill: ({
107
+ agents,
108
+ global,
109
+ cwd
110
+ }?: InstallSkillOptions) => Promise<Awaited<ReturnType<typeof add>>>;
111
+ interface RemoveSkillOptions {
112
+ cwd?: string;
113
+ global?: boolean;
114
+ }
115
+ declare const removeSkill: ({
116
+ cwd,
117
+ global
118
+ }?: RemoveSkillOptions) => Promise<SkillAgentType[]>;
119
+ //#endregion
120
+ export { type Framework, type InstallPackageOptions, type InstallReactGrabOptions, type InstallReactGrabResult, type InstallSkillOptions, type NextRouterType, type PackageManager, type ProjectInfo, ReactGrabInstallError, type ReactGrabInstallErrorCode, type ReactGrabOptions, type TransformResult, type UnsupportedFramework, type WorkspaceProject, applyTransform, detectFramework, detectNextRouterType, detectPackageManager, detectProject, detectReactGrab, detectReactGrabConfigured, detectUnsupportedFramework, findReactProjects, getPackagesToInstall, hasFrameworkEntryPoint, installPackages, installReactGrab, installSkill, previewCdnTransform, previewOptionsTransform, previewTransform, removeSkill };
121
+ //# sourceMappingURL=api.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.cts","names":[],"sources":["../src/utils/detect.ts","../src/utils/transform.ts","../src/utils/install.ts","../src/utils/install-react-grab.ts","../src/utils/install-skill.ts"],"mappings":"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"}
package/dist/api.d.ts ADDED
@@ -0,0 +1,121 @@
1
+ #!/usr/bin/env node
2
+ import { SkillAgentType, add } from "agent-install/skill";
3
+
4
+ //#region src/utils/detect.d.ts
5
+ type PackageManager = "npm" | "yarn" | "pnpm" | "bun";
6
+ type Framework = "next" | "vite" | "tanstack" | "webpack" | "unknown";
7
+ type NextRouterType = "app" | "pages" | "unknown";
8
+ type UnsupportedFramework = "remix" | "astro" | "sveltekit" | "gatsby" | null;
9
+ interface ProjectInfo {
10
+ packageManager: PackageManager;
11
+ framework: Framework;
12
+ nextRouterType: NextRouterType;
13
+ isMonorepo: boolean;
14
+ projectRoot: string;
15
+ hasReactGrab: boolean;
16
+ isReactGrabConfigured: boolean;
17
+ reactGrabVersion: string | null;
18
+ unsupportedFramework: UnsupportedFramework;
19
+ }
20
+ declare const detectPackageManager: (projectRoot: string) => Promise<PackageManager>;
21
+ declare const detectFramework: (projectRoot: string) => Framework;
22
+ declare const detectNextRouterType: (projectRoot: string) => NextRouterType;
23
+ interface WorkspaceProject {
24
+ name: string;
25
+ path: string;
26
+ framework: Framework;
27
+ }
28
+ declare const findReactProjects: (projectRoot: string) => WorkspaceProject[];
29
+ declare const detectReactGrabConfigured: (projectRoot: string) => boolean;
30
+ declare const detectReactGrab: (projectRoot: string) => boolean;
31
+ declare const detectUnsupportedFramework: (projectRoot: string) => UnsupportedFramework;
32
+ declare const detectProject: (projectRoot?: string) => Promise<ProjectInfo>;
33
+ //#endregion
34
+ //#region src/utils/transform.d.ts
35
+ interface TransformResult {
36
+ success: boolean;
37
+ filePath: string;
38
+ message: string;
39
+ originalContent?: string;
40
+ newContent?: string;
41
+ noChanges?: boolean;
42
+ }
43
+ interface ReactGrabOptions {
44
+ activationKey?: string;
45
+ activationMode?: "toggle" | "hold";
46
+ keyHoldDuration?: number;
47
+ allowActivationInsideInput?: boolean;
48
+ maxContextLines?: number;
49
+ }
50
+ declare const hasFrameworkEntryPoint: (projectRoot: string, framework: Framework, nextRouterType: NextRouterType) => boolean;
51
+ declare const previewTransform: (projectRoot: string, framework: Framework, nextRouterType: NextRouterType, reactGrabAlreadyConfigured?: boolean) => TransformResult;
52
+ declare const applyTransform: (result: TransformResult) => {
53
+ success: boolean;
54
+ error?: string;
55
+ };
56
+ declare const previewOptionsTransform: (projectRoot: string, framework: Framework, nextRouterType: NextRouterType, options: ReactGrabOptions) => TransformResult;
57
+ declare const previewCdnTransform: (projectRoot: string, framework: Framework, nextRouterType: NextRouterType, targetCdnDomain: string) => TransformResult;
58
+ //#endregion
59
+ //#region src/utils/install.d.ts
60
+ interface InstallPackageOptions {
61
+ cwd?: string;
62
+ isDev?: boolean;
63
+ silent?: boolean;
64
+ packageManager?: PackageManager;
65
+ preferOffline?: boolean;
66
+ additionalArgs?: string[];
67
+ }
68
+ declare const installPackages: (packages: string[], options?: InstallPackageOptions) => Promise<void>;
69
+ declare const getPackagesToInstall: (includeReactGrab?: boolean) => string[];
70
+ //#endregion
71
+ //#region src/utils/install-react-grab.d.ts
72
+ type ReactGrabInstallErrorCode = "unsupported-framework" | "unknown-framework" | "transform-failed" | "install-failed" | "write-failed";
73
+ declare class ReactGrabInstallError extends Error {
74
+ readonly code: ReactGrabInstallErrorCode;
75
+ constructor(message: string, code: ReactGrabInstallErrorCode, options?: ErrorOptions);
76
+ }
77
+ interface InstallReactGrabOptions {
78
+ cwd?: string;
79
+ framework?: Framework;
80
+ nextRouterType?: NextRouterType;
81
+ packageManager?: PackageManager;
82
+ skipPackageInstall?: boolean;
83
+ skipTransform?: boolean;
84
+ dryRun?: boolean;
85
+ installPackageOptions?: Omit<InstallPackageOptions, "cwd" | "packageManager">;
86
+ }
87
+ interface InstallReactGrabResult {
88
+ projectRoot: string;
89
+ framework: Framework;
90
+ nextRouterType: NextRouterType;
91
+ packageManager: PackageManager;
92
+ alreadyConfigured: boolean;
93
+ didInstallPackage: boolean;
94
+ didChangeFile: boolean;
95
+ dryRun: boolean;
96
+ transform: TransformResult;
97
+ }
98
+ declare const installReactGrab: (options?: InstallReactGrabOptions) => Promise<InstallReactGrabResult>;
99
+ //#endregion
100
+ //#region src/utils/install-skill.d.ts
101
+ interface InstallSkillOptions {
102
+ agents?: SkillAgentType[];
103
+ global?: boolean;
104
+ cwd?: string;
105
+ }
106
+ declare const installSkill: ({
107
+ agents,
108
+ global,
109
+ cwd
110
+ }?: InstallSkillOptions) => Promise<Awaited<ReturnType<typeof add>>>;
111
+ interface RemoveSkillOptions {
112
+ cwd?: string;
113
+ global?: boolean;
114
+ }
115
+ declare const removeSkill: ({
116
+ cwd,
117
+ global
118
+ }?: RemoveSkillOptions) => Promise<SkillAgentType[]>;
119
+ //#endregion
120
+ export { type Framework, type InstallPackageOptions, type InstallReactGrabOptions, type InstallReactGrabResult, type InstallSkillOptions, type NextRouterType, type PackageManager, type ProjectInfo, ReactGrabInstallError, type ReactGrabInstallErrorCode, type ReactGrabOptions, type TransformResult, type UnsupportedFramework, type WorkspaceProject, applyTransform, detectFramework, detectNextRouterType, detectPackageManager, detectProject, detectReactGrab, detectReactGrabConfigured, detectUnsupportedFramework, findReactProjects, getPackagesToInstall, hasFrameworkEntryPoint, installPackages, installReactGrab, installSkill, previewCdnTransform, previewOptionsTransform, previewTransform, removeSkill };
121
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","names":[],"sources":["../src/utils/detect.ts","../src/utils/transform.ts","../src/utils/install.ts","../src/utils/install-react-grab.ts","../src/utils/install-skill.ts"],"mappings":"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"}
package/dist/api.js ADDED
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+ import { _ as detectReactGrabConfigured, a as previewCdnTransform, f as detectFramework, g as detectReactGrab, h as detectProject, i as hasFrameworkEntryPoint, l as installSkill, m as detectPackageManager, n as installPackages, o as previewOptionsTransform, p as detectNextRouterType, r as applyTransform, s as previewTransform, t as getPackagesToInstall, u as removeSkill, v as detectUnsupportedFramework, y as findReactProjects } from "./install-Car5vKPk.js";
3
+ import { resolve } from "node:path";
4
+ //#region src/utils/install-react-grab.ts
5
+ var ReactGrabInstallError = class extends Error {
6
+ code;
7
+ constructor(message, code, options) {
8
+ super(message, options);
9
+ this.name = "ReactGrabInstallError";
10
+ this.code = code;
11
+ }
12
+ };
13
+ const installReactGrab = async (options = {}) => {
14
+ const project = await detectProject(resolve(options.cwd ?? process.cwd()));
15
+ const framework = options.framework ?? project.framework;
16
+ const packageManager = options.packageManager ?? project.packageManager;
17
+ if (project.unsupportedFramework && !options.framework) throw new ReactGrabInstallError(`${project.unsupportedFramework} is not supported by automatic setup.`, "unsupported-framework");
18
+ if (framework === "unknown") throw new ReactGrabInstallError("Could not detect a supported framework. Pass `framework` explicitly to override detection.", "unknown-framework");
19
+ const nextRouterType = options.nextRouterType ?? (framework === "next" && project.nextRouterType === "unknown" ? detectNextRouterType(project.projectRoot) : project.nextRouterType);
20
+ const alreadyConfigured = project.isReactGrabConfigured;
21
+ const transform = previewTransform(project.projectRoot, framework, nextRouterType, alreadyConfigured);
22
+ if (!transform.success && !options.skipTransform) throw new ReactGrabInstallError(transform.message, "transform-failed");
23
+ const didInstallPackage = !options.skipPackageInstall && !options.dryRun && !project.hasReactGrab;
24
+ if (didInstallPackage) try {
25
+ await installPackages(getPackagesToInstall(), {
26
+ ...options.installPackageOptions,
27
+ cwd: project.projectRoot,
28
+ packageManager
29
+ });
30
+ } catch (error) {
31
+ throw new ReactGrabInstallError(error instanceof Error ? error.message : "Failed to install the react-grab package.", "install-failed", { cause: error });
32
+ }
33
+ const didChangeFile = !transform.noChanges && Boolean(transform.newContent) && !options.skipTransform && !options.dryRun;
34
+ if (didChangeFile) {
35
+ const writeResult = applyTransform(transform);
36
+ if (!writeResult.success) throw new ReactGrabInstallError(writeResult.error ?? `Failed to write to ${transform.filePath}`, "write-failed");
37
+ }
38
+ return {
39
+ projectRoot: project.projectRoot,
40
+ framework,
41
+ nextRouterType,
42
+ packageManager,
43
+ alreadyConfigured,
44
+ didInstallPackage,
45
+ didChangeFile,
46
+ dryRun: Boolean(options.dryRun),
47
+ transform
48
+ };
49
+ };
50
+ //#endregion
51
+ export { ReactGrabInstallError, applyTransform, detectFramework, detectNextRouterType, detectPackageManager, detectProject, detectReactGrab, detectReactGrabConfigured, detectUnsupportedFramework, findReactProjects, getPackagesToInstall, hasFrameworkEntryPoint, installPackages, installReactGrab, installSkill, previewCdnTransform, previewOptionsTransform, previewTransform, removeSkill };
52
+
53
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","names":[],"sources":["../src/utils/install-react-grab.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport {\n detectNextRouterType,\n detectProject,\n type Framework,\n type NextRouterType,\n type PackageManager,\n} from \"./detect.js\";\nimport { getPackagesToInstall, installPackages, type InstallPackageOptions } from \"./install.js\";\nimport { applyTransform, previewTransform, type TransformResult } from \"./transform.js\";\n\nexport type ReactGrabInstallErrorCode =\n | \"unsupported-framework\"\n | \"unknown-framework\"\n | \"transform-failed\"\n | \"install-failed\"\n | \"write-failed\";\n\nexport class ReactGrabInstallError extends Error {\n readonly code: ReactGrabInstallErrorCode;\n\n constructor(message: string, code: ReactGrabInstallErrorCode, options?: ErrorOptions) {\n super(message, options);\n this.name = \"ReactGrabInstallError\";\n this.code = code;\n }\n}\n\nexport interface InstallReactGrabOptions {\n cwd?: string;\n framework?: Framework;\n nextRouterType?: NextRouterType;\n packageManager?: PackageManager;\n skipPackageInstall?: boolean;\n skipTransform?: boolean;\n dryRun?: boolean;\n installPackageOptions?: Omit<InstallPackageOptions, \"cwd\" | \"packageManager\">;\n}\n\nexport interface InstallReactGrabResult {\n projectRoot: string;\n framework: Framework;\n nextRouterType: NextRouterType;\n packageManager: PackageManager;\n alreadyConfigured: boolean;\n didInstallPackage: boolean;\n didChangeFile: boolean;\n dryRun: boolean;\n transform: TransformResult;\n}\n\nexport const installReactGrab = async (\n options: InstallReactGrabOptions = {},\n): Promise<InstallReactGrabResult> => {\n const cwd = resolve(options.cwd ?? process.cwd());\n const project = await detectProject(cwd);\n\n const framework = options.framework ?? project.framework;\n const packageManager = options.packageManager ?? project.packageManager;\n\n if (project.unsupportedFramework && !options.framework) {\n throw new ReactGrabInstallError(\n `${project.unsupportedFramework} is not supported by automatic setup.`,\n \"unsupported-framework\",\n );\n }\n\n if (framework === \"unknown\") {\n throw new ReactGrabInstallError(\n \"Could not detect a supported framework. Pass `framework` explicitly to override detection.\",\n \"unknown-framework\",\n );\n }\n\n // Detection only resolves the router type when the *detected* framework is\n // Next.js, so derive it ourselves when the caller overrides to Next.\n const nextRouterType =\n options.nextRouterType ??\n (framework === \"next\" && project.nextRouterType === \"unknown\"\n ? detectNextRouterType(project.projectRoot)\n : project.nextRouterType);\n\n const alreadyConfigured = project.isReactGrabConfigured;\n\n const transform = previewTransform(\n project.projectRoot,\n framework,\n nextRouterType,\n alreadyConfigured,\n );\n\n if (!transform.success && !options.skipTransform) {\n throw new ReactGrabInstallError(transform.message, \"transform-failed\");\n }\n\n const didInstallPackage = !options.skipPackageInstall && !options.dryRun && !project.hasReactGrab;\n\n if (didInstallPackage) {\n try {\n await installPackages(getPackagesToInstall(), {\n ...options.installPackageOptions,\n cwd: project.projectRoot,\n packageManager,\n });\n } catch (error) {\n throw new ReactGrabInstallError(\n error instanceof Error ? error.message : \"Failed to install the react-grab package.\",\n \"install-failed\",\n { cause: error },\n );\n }\n }\n\n // Mirrors applyTransform's own write guard (it does not require originalContent),\n // so an empty source file still receives the injected setup.\n const hasPendingFileChange = !transform.noChanges && Boolean(transform.newContent);\n const didChangeFile = hasPendingFileChange && !options.skipTransform && !options.dryRun;\n\n if (didChangeFile) {\n const writeResult = applyTransform(transform);\n if (!writeResult.success) {\n throw new ReactGrabInstallError(\n writeResult.error ?? `Failed to write to ${transform.filePath}`,\n \"write-failed\",\n );\n }\n }\n\n return {\n projectRoot: project.projectRoot,\n framework,\n nextRouterType,\n packageManager,\n alreadyConfigured,\n didInstallPackage,\n didChangeFile,\n dryRun: Boolean(options.dryRun),\n transform,\n };\n};\n"],"mappings":";;;;AAkBA,IAAa,wBAAb,cAA2C,MAAM;CAC/C;CAEA,YAAY,SAAiB,MAAiC,SAAwB;AACpF,QAAM,SAAS,QAAQ;AACvB,OAAK,OAAO;AACZ,OAAK,OAAO;;;AA2BhB,MAAa,mBAAmB,OAC9B,UAAmC,EAAE,KACD;CAEpC,MAAM,UAAU,MAAM,cADV,QAAQ,QAAQ,OAAO,QAAQ,KAAK,CACT,CAAC;CAExC,MAAM,YAAY,QAAQ,aAAa,QAAQ;CAC/C,MAAM,iBAAiB,QAAQ,kBAAkB,QAAQ;AAEzD,KAAI,QAAQ,wBAAwB,CAAC,QAAQ,UAC3C,OAAM,IAAI,sBACR,GAAG,QAAQ,qBAAqB,wCAChC,wBACD;AAGH,KAAI,cAAc,UAChB,OAAM,IAAI,sBACR,8FACA,oBACD;CAKH,MAAM,iBACJ,QAAQ,mBACP,cAAc,UAAU,QAAQ,mBAAmB,YAChD,qBAAqB,QAAQ,YAAY,GACzC,QAAQ;CAEd,MAAM,oBAAoB,QAAQ;CAElC,MAAM,YAAY,iBAChB,QAAQ,aACR,WACA,gBACA,kBACD;AAED,KAAI,CAAC,UAAU,WAAW,CAAC,QAAQ,cACjC,OAAM,IAAI,sBAAsB,UAAU,SAAS,mBAAmB;CAGxE,MAAM,oBAAoB,CAAC,QAAQ,sBAAsB,CAAC,QAAQ,UAAU,CAAC,QAAQ;AAErF,KAAI,kBACF,KAAI;AACF,QAAM,gBAAgB,sBAAsB,EAAE;GAC5C,GAAG,QAAQ;GACX,KAAK,QAAQ;GACb;GACD,CAAC;UACK,OAAO;AACd,QAAM,IAAI,sBACR,iBAAiB,QAAQ,MAAM,UAAU,6CACzC,kBACA,EAAE,OAAO,OAAO,CACjB;;CAOL,MAAM,gBADuB,CAAC,UAAU,aAAa,QAAQ,UAAU,WAAW,IACpC,CAAC,QAAQ,iBAAiB,CAAC,QAAQ;AAEjF,KAAI,eAAe;EACjB,MAAM,cAAc,eAAe,UAAU;AAC7C,MAAI,CAAC,YAAY,QACf,OAAM,IAAI,sBACR,YAAY,SAAS,sBAAsB,UAAU,YACrD,eACD;;AAIL,QAAO;EACL,aAAa,QAAQ;EACrB;EACA;EACA;EACA;EACA;EACA;EACA,QAAQ,QAAQ,QAAQ,OAAO;EAC/B;EACD"}