@react-grab/cli 0.1.46 → 0.1.47-dev.bc3a591
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 +88 -0
- package/dist/api.cjs +70 -0
- package/dist/api.d.cts +121 -0
- package/dist/api.d.cts.map +1 -0
- package/dist/api.d.ts +121 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +53 -0
- package/dist/api.js.map +1 -0
- package/dist/cli.cjs +42 -911
- package/dist/cli.js +19 -865
- package/dist/cli.js.map +1 -1
- package/dist/install-Car5vKPk.js +864 -0
- package/dist/install-Car5vKPk.js.map +1 -0
- package/dist/install-DlD3sLtm.cjs +1004 -0
- package/package.json +6 -1
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
|
package/dist/api.js.map
ADDED
|
@@ -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"}
|