@patternfly/patternfly-cli 1.0.2 ā 1.0.3
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/.github/workflows/build.yml +1 -1
- package/.github/workflows/lint.yml +1 -1
- package/.github/workflows/release.yml +1 -1
- package/.github/workflows/test.yml +1 -1
- package/dist/cli.js +28 -0
- package/dist/cli.js.map +1 -1
- package/dist/gh-pages.d.ts +14 -0
- package/dist/gh-pages.d.ts.map +1 -0
- package/dist/gh-pages.js +139 -0
- package/dist/gh-pages.js.map +1 -0
- package/package.json +2 -2
- package/src/__tests__/gh-pages.test.ts +283 -0
- package/src/cli.ts +27 -0
- package/src/gh-pages.ts +170 -0
package/dist/cli.js
CHANGED
|
@@ -9,6 +9,7 @@ import { mergeTemplates } from './template-loader.js';
|
|
|
9
9
|
import { offerAndCreateGitHubRepo } from './github.js';
|
|
10
10
|
import { runSave } from './save.js';
|
|
11
11
|
import { runLoad } from './load.js';
|
|
12
|
+
import { runDeployToGitHubPages } from './gh-pages.js';
|
|
12
13
|
/** Command to create a new project */
|
|
13
14
|
program
|
|
14
15
|
.version('1.0.0')
|
|
@@ -268,5 +269,32 @@ program
|
|
|
268
269
|
process.exit(1);
|
|
269
270
|
}
|
|
270
271
|
});
|
|
272
|
+
/** Command to deploy the React app to GitHub Pages */
|
|
273
|
+
program
|
|
274
|
+
.command('deploy')
|
|
275
|
+
.description('Build the app and deploy it to GitHub Pages (uses gh-pages branch)')
|
|
276
|
+
.argument('[path]', 'Path to the project (defaults to current directory)')
|
|
277
|
+
.option('-d, --dist-dir <dir>', 'Build output directory to deploy', 'dist')
|
|
278
|
+
.option('--no-build', 'Skip running the build step (deploy existing output only)')
|
|
279
|
+
.option('-b, --branch <branch>', 'Git branch to deploy to', 'gh-pages')
|
|
280
|
+
.action(async (projectPath, options) => {
|
|
281
|
+
const cwd = projectPath ? path.resolve(projectPath) : process.cwd();
|
|
282
|
+
try {
|
|
283
|
+
await runDeployToGitHubPages(cwd, {
|
|
284
|
+
distDir: options.distDir,
|
|
285
|
+
skipBuild: options.build === false,
|
|
286
|
+
branch: options.branch,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
if (error instanceof Error) {
|
|
291
|
+
console.error(`\nā ${error.message}\n`);
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
console.error(error);
|
|
295
|
+
}
|
|
296
|
+
process.exit(1);
|
|
297
|
+
}
|
|
298
|
+
});
|
|
271
299
|
program.parse(process.argv);
|
|
272
300
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type DeployOptions = {
|
|
2
|
+
/** Build output directory to deploy (e.g. dist, build) */
|
|
3
|
+
distDir: string;
|
|
4
|
+
/** Skip running the build step */
|
|
5
|
+
skipBuild: boolean;
|
|
6
|
+
/** Branch to push to (default gh-pages) */
|
|
7
|
+
branch: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Deploy the built app to GitHub Pages using the gh-pages package.
|
|
11
|
+
* Builds the project first unless skipBuild is true, then publishes distDir to the gh-pages branch.
|
|
12
|
+
*/
|
|
13
|
+
export declare function runDeployToGitHubPages(projectPath: string, options?: Partial<DeployOptions>): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=gh-pages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gh-pages.d.ts","sourceRoot":"","sources":["../src/gh-pages.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,aAAa,GAAG;IAC1B,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AA+FF;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM,GACnC,OAAO,CAAC,IAAI,CAAC,CAsDf"}
|
package/dist/gh-pages.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import { execa } from 'execa';
|
|
4
|
+
import ghPages from 'gh-pages';
|
|
5
|
+
import { checkGhAuth } from './github.js';
|
|
6
|
+
const DEFAULT_DIST_DIR = 'dist';
|
|
7
|
+
const DEFAULT_BRANCH = 'gh-pages';
|
|
8
|
+
/**
|
|
9
|
+
* Parse owner and repo name from a Git remote URL.
|
|
10
|
+
* Supports https://github.com/owner/repo, https://github.com/owner/repo.git, git@github.com:owner/repo.git
|
|
11
|
+
*/
|
|
12
|
+
function parseRepoFromUrl(repoUrl) {
|
|
13
|
+
const trimmed = repoUrl.trim().replace(/\.git$/, '');
|
|
14
|
+
// git@github.com:owner/repo or https://github.com/owner/repo
|
|
15
|
+
const sshMatch = trimmed.match(/git@github\.com:([^/]+)\/([^/]+)/);
|
|
16
|
+
if (sshMatch?.[1] && sshMatch[2]) {
|
|
17
|
+
return { owner: sshMatch[1], repo: sshMatch[2] };
|
|
18
|
+
}
|
|
19
|
+
const httpsMatch = trimmed.match(/github\.com[/:]([^/]+)\/([^/#?]+)/);
|
|
20
|
+
if (httpsMatch?.[1] && httpsMatch[2]) {
|
|
21
|
+
return { owner: httpsMatch[1], repo: httpsMatch[2] };
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Ensure GitHub Pages is enabled for the repository, configured to use the given branch.
|
|
27
|
+
* Uses the GitHub API via `gh` CLI. No-op if gh is not authenticated or on failure.
|
|
28
|
+
*/
|
|
29
|
+
async function ensurePagesEnabled(owner, repo, branch) {
|
|
30
|
+
const auth = await checkGhAuth();
|
|
31
|
+
if (!auth.ok)
|
|
32
|
+
return;
|
|
33
|
+
const body = JSON.stringify({ source: { branch, path: '/' } });
|
|
34
|
+
try {
|
|
35
|
+
const getResult = await execa('gh', ['api', `repos/${owner}/${repo}/pages`, '--jq', '.source.branch'], {
|
|
36
|
+
reject: false,
|
|
37
|
+
encoding: 'utf8',
|
|
38
|
+
});
|
|
39
|
+
if (getResult.exitCode === 0) {
|
|
40
|
+
const currentBranch = getResult.stdout?.trim();
|
|
41
|
+
if (currentBranch === branch)
|
|
42
|
+
return;
|
|
43
|
+
await execa('gh', [
|
|
44
|
+
'api',
|
|
45
|
+
'-X',
|
|
46
|
+
'PUT',
|
|
47
|
+
`repos/${owner}/${repo}/pages`,
|
|
48
|
+
'--input',
|
|
49
|
+
'-',
|
|
50
|
+
], { input: body });
|
|
51
|
+
console.log(` GitHub Pages source updated to branch "${branch}".`);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
await execa('gh', [
|
|
55
|
+
'api',
|
|
56
|
+
'-X',
|
|
57
|
+
'POST',
|
|
58
|
+
`repos/${owner}/${repo}/pages`,
|
|
59
|
+
'--input',
|
|
60
|
+
'-',
|
|
61
|
+
], { input: body });
|
|
62
|
+
console.log(` GitHub Pages enabled (source: branch "${branch}").`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Best-effort: continue without enabling; user can enable manually
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Detect package manager from lock files.
|
|
71
|
+
*/
|
|
72
|
+
async function getPackageManager(cwd) {
|
|
73
|
+
if (await fs.pathExists(path.join(cwd, 'yarn.lock')))
|
|
74
|
+
return 'yarn';
|
|
75
|
+
if (await fs.pathExists(path.join(cwd, 'pnpm-lock.yaml')))
|
|
76
|
+
return 'pnpm';
|
|
77
|
+
return 'npm';
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Run build script in the project (npm run build / yarn build / pnpm build).
|
|
81
|
+
*/
|
|
82
|
+
async function runBuild(cwd) {
|
|
83
|
+
const pkgPath = path.join(cwd, 'package.json');
|
|
84
|
+
const pkg = await fs.readJson(pkgPath);
|
|
85
|
+
const scripts = pkg.scripts || {};
|
|
86
|
+
if (!scripts['build']) {
|
|
87
|
+
throw new Error('No "build" script found in package.json. Add a build script or use --no-build and deploy an existing folder with -d/--dist-dir.');
|
|
88
|
+
}
|
|
89
|
+
const pm = await getPackageManager(cwd);
|
|
90
|
+
const runCmd = pm === 'npm' ? 'npm' : pm === 'yarn' ? 'yarn' : 'pnpm';
|
|
91
|
+
const args = pm === 'npm' ? ['run', 'build'] : ['build'];
|
|
92
|
+
console.log(`š¦ Running build (${runCmd} ${args.join(' ')})...`);
|
|
93
|
+
await execa(runCmd, args, { cwd, stdio: 'inherit' });
|
|
94
|
+
console.log('ā
Build completed.\n');
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Deploy the built app to GitHub Pages using the gh-pages package.
|
|
98
|
+
* Builds the project first unless skipBuild is true, then publishes distDir to the gh-pages branch.
|
|
99
|
+
*/
|
|
100
|
+
export async function runDeployToGitHubPages(projectPath, options = {}) {
|
|
101
|
+
const distDir = options.distDir ?? DEFAULT_DIST_DIR;
|
|
102
|
+
const skipBuild = options.skipBuild ?? false;
|
|
103
|
+
const branch = options.branch ?? DEFAULT_BRANCH;
|
|
104
|
+
const cwd = path.resolve(projectPath);
|
|
105
|
+
const pkgPath = path.join(cwd, 'package.json');
|
|
106
|
+
if (!(await fs.pathExists(pkgPath))) {
|
|
107
|
+
throw new Error('No package.json found in this directory. Run this command from your project root (or pass the project path).');
|
|
108
|
+
}
|
|
109
|
+
let repoUrl;
|
|
110
|
+
try {
|
|
111
|
+
const { stdout } = await execa('git', ['remote', 'get-url', 'origin'], {
|
|
112
|
+
cwd,
|
|
113
|
+
reject: true,
|
|
114
|
+
});
|
|
115
|
+
repoUrl = stdout.trim();
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
throw new Error('Please save your changes first, before deploying to GitHub Pages.');
|
|
119
|
+
}
|
|
120
|
+
if (!skipBuild) {
|
|
121
|
+
await runBuild(cwd);
|
|
122
|
+
}
|
|
123
|
+
const absoluteDist = path.join(cwd, distDir);
|
|
124
|
+
if (!(await fs.pathExists(absoluteDist))) {
|
|
125
|
+
throw new Error(`Build output directory "${distDir}" does not exist. Run a build first or specify the correct directory with -d/--dist-dir.`);
|
|
126
|
+
}
|
|
127
|
+
const parsed = parseRepoFromUrl(repoUrl);
|
|
128
|
+
if (parsed) {
|
|
129
|
+
await ensurePagesEnabled(parsed.owner, parsed.repo, branch);
|
|
130
|
+
}
|
|
131
|
+
console.log(`š Deploying "${distDir}" to GitHub Pages (branch: ${branch})...`);
|
|
132
|
+
await new Promise((resolve, reject) => {
|
|
133
|
+
ghPages.publish(absoluteDist, { branch, repo: repoUrl }, (err) => (err ? reject(err) : resolve()));
|
|
134
|
+
});
|
|
135
|
+
console.log('\nā
Deployed to GitHub Pages.');
|
|
136
|
+
console.log(' Enable GitHub Pages in your repo: Settings ā Pages ā Source: branch "' + branch + '".');
|
|
137
|
+
console.log(' If the site is at username.github.io/<repo-name>, set your app\'s base path (e.g. base: \'/<repo-name>/\' in Vite).\n');
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=gh-pages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gh-pages.js","sourceRoot":"","sources":["../src/gh-pages.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@patternfly/patternfly-cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Patternfly cli for scaffolding projects, performing code mods, and running project related tasks",
|
|
5
5
|
"author": "Red Hat",
|
|
6
6
|
"license": "MIT",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
]
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"
|
|
53
|
+
"gh-pages": "^6.3.0",
|
|
54
54
|
"commander": "^12.1.0",
|
|
55
55
|
"execa": "^9.3.0",
|
|
56
56
|
"fs-extra": "^11.2.0",
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
jest.mock('fs-extra', () => ({
|
|
2
|
+
__esModule: true,
|
|
3
|
+
default: {
|
|
4
|
+
pathExists: jest.fn(),
|
|
5
|
+
readJson: jest.fn(),
|
|
6
|
+
},
|
|
7
|
+
}));
|
|
8
|
+
|
|
9
|
+
jest.mock('execa', () => ({
|
|
10
|
+
__esModule: true,
|
|
11
|
+
execa: jest.fn(),
|
|
12
|
+
}));
|
|
13
|
+
|
|
14
|
+
jest.mock('gh-pages', () => ({
|
|
15
|
+
__esModule: true,
|
|
16
|
+
default: {
|
|
17
|
+
publish: jest.fn(),
|
|
18
|
+
},
|
|
19
|
+
}));
|
|
20
|
+
|
|
21
|
+
jest.mock('../github.js', () => ({
|
|
22
|
+
checkGhAuth: jest.fn().mockResolvedValue({ ok: false }),
|
|
23
|
+
}));
|
|
24
|
+
|
|
25
|
+
import path from 'path';
|
|
26
|
+
import fs from 'fs-extra';
|
|
27
|
+
import { execa } from 'execa';
|
|
28
|
+
import ghPages from 'gh-pages';
|
|
29
|
+
import { runDeployToGitHubPages } from '../gh-pages.js';
|
|
30
|
+
|
|
31
|
+
const mockPathExists = fs.pathExists as jest.MockedFunction<typeof fs.pathExists>;
|
|
32
|
+
const mockReadJson = fs.readJson as jest.MockedFunction<typeof fs.readJson>;
|
|
33
|
+
const mockExeca = execa as jest.MockedFunction<typeof execa>;
|
|
34
|
+
const mockGhPagesPublish = ghPages.publish as jest.MockedFunction<typeof ghPages.publish>;
|
|
35
|
+
|
|
36
|
+
const cwd = '/tmp/my-app';
|
|
37
|
+
|
|
38
|
+
/** Setup pathExists to return values based on path (avoids brittle call-order chains) */
|
|
39
|
+
function setupPathExists(checks: Record<string, boolean>) {
|
|
40
|
+
mockPathExists.mockImplementation((p: string) => {
|
|
41
|
+
for (const [key, value] of Object.entries(checks)) {
|
|
42
|
+
if (p.includes(key) || p === path.join(cwd, key)) return Promise.resolve(value);
|
|
43
|
+
}
|
|
44
|
+
return Promise.resolve(checks['*'] ?? false);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
describe('runDeployToGitHubPages', () => {
|
|
49
|
+
const consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(() => {});
|
|
50
|
+
|
|
51
|
+
beforeEach(() => {
|
|
52
|
+
jest.clearAllMocks();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
afterAll(() => {
|
|
56
|
+
consoleLogSpy.mockRestore();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('throws when package.json does not exist', async () => {
|
|
60
|
+
mockPathExists.mockImplementation((p: string) =>
|
|
61
|
+
Promise.resolve(path.join(cwd, 'package.json') !== p)
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
await expect(runDeployToGitHubPages(cwd)).rejects.toThrow(
|
|
65
|
+
'No package.json found in this directory'
|
|
66
|
+
);
|
|
67
|
+
expect(mockPathExists).toHaveBeenCalledWith(path.join(cwd, 'package.json'));
|
|
68
|
+
expect(mockExeca).not.toHaveBeenCalled();
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('throws when git remote origin is not configured', async () => {
|
|
72
|
+
setupPathExists({ 'package.json': true });
|
|
73
|
+
mockExeca.mockRejectedValue(new Error('not a git repo'));
|
|
74
|
+
|
|
75
|
+
await expect(runDeployToGitHubPages(cwd)).rejects.toThrow(
|
|
76
|
+
'Please save your changes first, before deploying to GitHub Pages.'
|
|
77
|
+
);
|
|
78
|
+
expect(mockExeca).toHaveBeenCalledWith('git', ['remote', 'get-url', 'origin'], {
|
|
79
|
+
cwd,
|
|
80
|
+
reject: true,
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('throws when no build script and skipBuild is false', async () => {
|
|
85
|
+
setupPathExists({ 'package.json': true });
|
|
86
|
+
mockReadJson.mockResolvedValueOnce({ scripts: {} });
|
|
87
|
+
mockExeca.mockResolvedValue({
|
|
88
|
+
stdout: 'https://github.com/user/repo.git',
|
|
89
|
+
stderr: '',
|
|
90
|
+
exitCode: 0,
|
|
91
|
+
} as Awaited<ReturnType<typeof execa>>);
|
|
92
|
+
|
|
93
|
+
await expect(runDeployToGitHubPages(cwd, { skipBuild: false })).rejects.toThrow(
|
|
94
|
+
'No "build" script found in package.json'
|
|
95
|
+
);
|
|
96
|
+
expect(mockReadJson).toHaveBeenCalledWith(path.join(cwd, 'package.json'));
|
|
97
|
+
expect(mockExeca).toHaveBeenCalledTimes(1); // only git
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('runs build then deploys when skipBuild is false (npm)', async () => {
|
|
101
|
+
setupPathExists({ 'package.json': true, 'dist': true });
|
|
102
|
+
mockReadJson.mockResolvedValueOnce({
|
|
103
|
+
scripts: { build: 'webpack --config webpack.prod.js' },
|
|
104
|
+
});
|
|
105
|
+
mockExeca.mockResolvedValue({
|
|
106
|
+
stdout: 'https://github.com/user/repo.git',
|
|
107
|
+
stderr: '',
|
|
108
|
+
exitCode: 0,
|
|
109
|
+
} as Awaited<ReturnType<typeof execa>>);
|
|
110
|
+
mockGhPagesPublish.mockImplementation((_dir, _opts, cb) => cb(null));
|
|
111
|
+
|
|
112
|
+
await runDeployToGitHubPages(cwd, { skipBuild: false });
|
|
113
|
+
|
|
114
|
+
expect(mockExeca).toHaveBeenCalledTimes(2); // git, npm run build
|
|
115
|
+
expect(mockExeca).toHaveBeenNthCalledWith(2, 'npm', ['run', 'build'], {
|
|
116
|
+
cwd,
|
|
117
|
+
stdio: 'inherit',
|
|
118
|
+
});
|
|
119
|
+
expect(mockGhPagesPublish).toHaveBeenCalledWith(
|
|
120
|
+
path.join(cwd, 'dist'),
|
|
121
|
+
{ branch: 'gh-pages', repo: 'https://github.com/user/repo.git' },
|
|
122
|
+
expect.any(Function)
|
|
123
|
+
);
|
|
124
|
+
expect(consoleLogSpy).toHaveBeenCalledWith(
|
|
125
|
+
expect.stringContaining('Running build')
|
|
126
|
+
);
|
|
127
|
+
expect(consoleLogSpy).toHaveBeenCalledWith(
|
|
128
|
+
expect.stringContaining('Deployed to GitHub Pages')
|
|
129
|
+
);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('uses yarn when yarn.lock exists', async () => {
|
|
133
|
+
setupPathExists({ 'package.json': true, 'yarn.lock': true, 'dist': true });
|
|
134
|
+
mockReadJson.mockResolvedValueOnce({
|
|
135
|
+
scripts: { build: 'webpack' },
|
|
136
|
+
});
|
|
137
|
+
mockExeca.mockResolvedValue({
|
|
138
|
+
stdout: 'https://github.com/user/repo.git',
|
|
139
|
+
stderr: '',
|
|
140
|
+
exitCode: 0,
|
|
141
|
+
} as Awaited<ReturnType<typeof execa>>);
|
|
142
|
+
mockGhPagesPublish.mockImplementation((_dir, _opts, cb) => cb(null));
|
|
143
|
+
|
|
144
|
+
await runDeployToGitHubPages(cwd, { skipBuild: false });
|
|
145
|
+
|
|
146
|
+
expect(mockExeca).toHaveBeenNthCalledWith(2, 'yarn', ['build'], {
|
|
147
|
+
cwd,
|
|
148
|
+
stdio: 'inherit',
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it('uses pnpm when pnpm-lock.yaml exists (and no yarn.lock)', async () => {
|
|
153
|
+
setupPathExists({ 'package.json': true, 'pnpm-lock.yaml': true, 'dist': true });
|
|
154
|
+
mockReadJson.mockResolvedValueOnce({
|
|
155
|
+
scripts: { build: 'vite build' },
|
|
156
|
+
});
|
|
157
|
+
mockExeca.mockResolvedValue({
|
|
158
|
+
stdout: 'https://github.com/user/repo.git',
|
|
159
|
+
stderr: '',
|
|
160
|
+
exitCode: 0,
|
|
161
|
+
} as Awaited<ReturnType<typeof execa>>);
|
|
162
|
+
mockGhPagesPublish.mockImplementation((_dir, _opts, cb) => cb(null));
|
|
163
|
+
|
|
164
|
+
await runDeployToGitHubPages(cwd, { skipBuild: false });
|
|
165
|
+
|
|
166
|
+
expect(mockExeca).toHaveBeenNthCalledWith(2, 'pnpm', ['build'], {
|
|
167
|
+
cwd,
|
|
168
|
+
stdio: 'inherit',
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('skips build and deploys when skipBuild is true', async () => {
|
|
173
|
+
setupPathExists({ 'package.json': true, 'dist': true });
|
|
174
|
+
mockExeca.mockResolvedValue({
|
|
175
|
+
stdout: 'https://github.com/user/repo.git',
|
|
176
|
+
stderr: '',
|
|
177
|
+
exitCode: 0,
|
|
178
|
+
} as Awaited<ReturnType<typeof execa>>);
|
|
179
|
+
mockGhPagesPublish.mockImplementation((_dir, _opts, cb) => cb(null));
|
|
180
|
+
|
|
181
|
+
await runDeployToGitHubPages(cwd, { skipBuild: true });
|
|
182
|
+
|
|
183
|
+
expect(mockReadJson).not.toHaveBeenCalled();
|
|
184
|
+
expect(mockExeca).toHaveBeenCalledTimes(1); // git only
|
|
185
|
+
expect(mockGhPagesPublish).toHaveBeenCalledWith(
|
|
186
|
+
path.join(cwd, 'dist'),
|
|
187
|
+
{ branch: 'gh-pages', repo: 'https://github.com/user/repo.git' },
|
|
188
|
+
expect.any(Function)
|
|
189
|
+
);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it('throws when dist directory does not exist (after build)', async () => {
|
|
193
|
+
setupPathExists({ 'package.json': true, 'dist': false });
|
|
194
|
+
mockReadJson.mockResolvedValueOnce({
|
|
195
|
+
scripts: { build: 'npm run build' },
|
|
196
|
+
});
|
|
197
|
+
mockExeca.mockResolvedValue({
|
|
198
|
+
stdout: 'https://github.com/user/repo.git',
|
|
199
|
+
stderr: '',
|
|
200
|
+
exitCode: 0,
|
|
201
|
+
} as Awaited<ReturnType<typeof execa>>);
|
|
202
|
+
|
|
203
|
+
await expect(runDeployToGitHubPages(cwd, { skipBuild: false })).rejects.toThrow(
|
|
204
|
+
'Build output directory "dist" does not exist'
|
|
205
|
+
);
|
|
206
|
+
expect(mockExeca).toHaveBeenCalledTimes(2); // git, npm run build
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
it('throws when dist directory does not exist with skipBuild true', async () => {
|
|
210
|
+
setupPathExists({ 'package.json': true, 'dist': false });
|
|
211
|
+
mockExeca.mockResolvedValue({
|
|
212
|
+
stdout: 'https://github.com/user/repo.git',
|
|
213
|
+
stderr: '',
|
|
214
|
+
exitCode: 0,
|
|
215
|
+
} as Awaited<ReturnType<typeof execa>>);
|
|
216
|
+
|
|
217
|
+
await expect(runDeployToGitHubPages(cwd, { skipBuild: true })).rejects.toThrow(
|
|
218
|
+
'Build output directory "dist" does not exist'
|
|
219
|
+
);
|
|
220
|
+
expect(mockExeca).toHaveBeenCalledTimes(1); // git only
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it('uses custom distDir and branch options', async () => {
|
|
224
|
+
setupPathExists({ 'package.json': true, 'build': true });
|
|
225
|
+
mockExeca.mockResolvedValue({
|
|
226
|
+
stdout: 'https://github.com/user/repo.git',
|
|
227
|
+
stderr: '',
|
|
228
|
+
exitCode: 0,
|
|
229
|
+
} as Awaited<ReturnType<typeof execa>>);
|
|
230
|
+
mockGhPagesPublish.mockImplementation((_dir, _opts, cb) => cb(null));
|
|
231
|
+
|
|
232
|
+
await runDeployToGitHubPages(cwd, {
|
|
233
|
+
skipBuild: true,
|
|
234
|
+
distDir: 'build',
|
|
235
|
+
branch: 'pages',
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
expect(mockGhPagesPublish).toHaveBeenCalledWith(
|
|
239
|
+
path.join(cwd, 'build'),
|
|
240
|
+
{ branch: 'pages', repo: 'https://github.com/user/repo.git' },
|
|
241
|
+
expect.any(Function)
|
|
242
|
+
);
|
|
243
|
+
expect(consoleLogSpy).toHaveBeenCalledWith(
|
|
244
|
+
expect.stringContaining('Deploying "build" to GitHub Pages (branch: pages)')
|
|
245
|
+
);
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
it('propagates build failure', async () => {
|
|
249
|
+
setupPathExists({ 'package.json': true });
|
|
250
|
+
mockReadJson.mockResolvedValueOnce({
|
|
251
|
+
scripts: { build: 'webpack' },
|
|
252
|
+
});
|
|
253
|
+
mockExeca
|
|
254
|
+
.mockResolvedValueOnce({
|
|
255
|
+
stdout: 'https://github.com/user/repo.git',
|
|
256
|
+
stderr: '',
|
|
257
|
+
exitCode: 0,
|
|
258
|
+
} as Awaited<ReturnType<typeof execa>>)
|
|
259
|
+
.mockRejectedValueOnce(new Error('Build failed'));
|
|
260
|
+
|
|
261
|
+
await expect(runDeployToGitHubPages(cwd, { skipBuild: false })).rejects.toThrow(
|
|
262
|
+
'Build failed'
|
|
263
|
+
);
|
|
264
|
+
expect(mockExeca).toHaveBeenCalledTimes(2); // git, npm run build
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
it('propagates gh-pages deploy failure', async () => {
|
|
268
|
+
setupPathExists({ 'package.json': true, 'dist': true });
|
|
269
|
+
mockExeca.mockResolvedValue({
|
|
270
|
+
stdout: 'https://github.com/user/repo.git',
|
|
271
|
+
stderr: '',
|
|
272
|
+
exitCode: 0,
|
|
273
|
+
} as Awaited<ReturnType<typeof execa>>);
|
|
274
|
+
mockGhPagesPublish.mockImplementation((_dir, _opts, cb) =>
|
|
275
|
+
cb(new Error('Deploy failed'))
|
|
276
|
+
);
|
|
277
|
+
|
|
278
|
+
await expect(runDeployToGitHubPages(cwd, { skipBuild: true })).rejects.toThrow(
|
|
279
|
+
'Deploy failed'
|
|
280
|
+
);
|
|
281
|
+
expect(mockExeca).toHaveBeenCalledTimes(1); // git only
|
|
282
|
+
});
|
|
283
|
+
});
|
package/src/cli.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { mergeTemplates } from './template-loader.js';
|
|
|
10
10
|
import { offerAndCreateGitHubRepo } from './github.js';
|
|
11
11
|
import { runSave } from './save.js';
|
|
12
12
|
import { runLoad } from './load.js';
|
|
13
|
+
import { runDeployToGitHubPages } from './gh-pages.js';
|
|
13
14
|
|
|
14
15
|
/** Project data provided by the user */
|
|
15
16
|
type ProjectData = {
|
|
@@ -304,4 +305,30 @@ program
|
|
|
304
305
|
}
|
|
305
306
|
});
|
|
306
307
|
|
|
308
|
+
/** Command to deploy the React app to GitHub Pages */
|
|
309
|
+
program
|
|
310
|
+
.command('deploy')
|
|
311
|
+
.description('Build the app and deploy it to GitHub Pages (uses gh-pages branch)')
|
|
312
|
+
.argument('[path]', 'Path to the project (defaults to current directory)')
|
|
313
|
+
.option('-d, --dist-dir <dir>', 'Build output directory to deploy', 'dist')
|
|
314
|
+
.option('--no-build', 'Skip running the build step (deploy existing output only)')
|
|
315
|
+
.option('-b, --branch <branch>', 'Git branch to deploy to', 'gh-pages')
|
|
316
|
+
.action(async (projectPath, options) => {
|
|
317
|
+
const cwd = projectPath ? path.resolve(projectPath) : process.cwd();
|
|
318
|
+
try {
|
|
319
|
+
await runDeployToGitHubPages(cwd, {
|
|
320
|
+
distDir: options.distDir,
|
|
321
|
+
skipBuild: options.build === false,
|
|
322
|
+
branch: options.branch,
|
|
323
|
+
});
|
|
324
|
+
} catch (error) {
|
|
325
|
+
if (error instanceof Error) {
|
|
326
|
+
console.error(`\nā ${error.message}\n`);
|
|
327
|
+
} else {
|
|
328
|
+
console.error(error);
|
|
329
|
+
}
|
|
330
|
+
process.exit(1);
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
|
|
307
334
|
program.parse(process.argv);
|
package/src/gh-pages.ts
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import { execa } from 'execa';
|
|
4
|
+
import ghPages from 'gh-pages';
|
|
5
|
+
import { checkGhAuth } from './github.js';
|
|
6
|
+
|
|
7
|
+
export type DeployOptions = {
|
|
8
|
+
/** Build output directory to deploy (e.g. dist, build) */
|
|
9
|
+
distDir: string;
|
|
10
|
+
/** Skip running the build step */
|
|
11
|
+
skipBuild: boolean;
|
|
12
|
+
/** Branch to push to (default gh-pages) */
|
|
13
|
+
branch: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const DEFAULT_DIST_DIR = 'dist';
|
|
17
|
+
const DEFAULT_BRANCH = 'gh-pages';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Parse owner and repo name from a Git remote URL.
|
|
21
|
+
* Supports https://github.com/owner/repo, https://github.com/owner/repo.git, git@github.com:owner/repo.git
|
|
22
|
+
*/
|
|
23
|
+
function parseRepoFromUrl(repoUrl: string): { owner: string; repo: string } | null {
|
|
24
|
+
const trimmed = repoUrl.trim().replace(/\.git$/, '');
|
|
25
|
+
// git@github.com:owner/repo or https://github.com/owner/repo
|
|
26
|
+
const sshMatch = trimmed.match(/git@github\.com:([^/]+)\/([^/]+)/);
|
|
27
|
+
if (sshMatch?.[1] && sshMatch[2]) {
|
|
28
|
+
return { owner: sshMatch[1], repo: sshMatch[2] };
|
|
29
|
+
}
|
|
30
|
+
const httpsMatch = trimmed.match(/github\.com[/:]([^/]+)\/([^/#?]+)/);
|
|
31
|
+
if (httpsMatch?.[1] && httpsMatch[2]) {
|
|
32
|
+
return { owner: httpsMatch[1], repo: httpsMatch[2] };
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Ensure GitHub Pages is enabled for the repository, configured to use the given branch.
|
|
39
|
+
* Uses the GitHub API via `gh` CLI. No-op if gh is not authenticated or on failure.
|
|
40
|
+
*/
|
|
41
|
+
async function ensurePagesEnabled(owner: string, repo: string, branch: string): Promise<void> {
|
|
42
|
+
const auth = await checkGhAuth();
|
|
43
|
+
if (!auth.ok) return;
|
|
44
|
+
|
|
45
|
+
const body = JSON.stringify({ source: { branch, path: '/' } });
|
|
46
|
+
try {
|
|
47
|
+
const getResult = await execa('gh', ['api', `repos/${owner}/${repo}/pages`, '--jq', '.source.branch'], {
|
|
48
|
+
reject: false,
|
|
49
|
+
encoding: 'utf8',
|
|
50
|
+
});
|
|
51
|
+
if (getResult.exitCode === 0) {
|
|
52
|
+
const currentBranch = getResult.stdout?.trim();
|
|
53
|
+
if (currentBranch === branch) return;
|
|
54
|
+
await execa('gh', [
|
|
55
|
+
'api',
|
|
56
|
+
'-X',
|
|
57
|
+
'PUT',
|
|
58
|
+
`repos/${owner}/${repo}/pages`,
|
|
59
|
+
'--input',
|
|
60
|
+
'-',
|
|
61
|
+
], { input: body });
|
|
62
|
+
console.log(` GitHub Pages source updated to branch "${branch}".`);
|
|
63
|
+
} else {
|
|
64
|
+
await execa('gh', [
|
|
65
|
+
'api',
|
|
66
|
+
'-X',
|
|
67
|
+
'POST',
|
|
68
|
+
`repos/${owner}/${repo}/pages`,
|
|
69
|
+
'--input',
|
|
70
|
+
'-',
|
|
71
|
+
], { input: body });
|
|
72
|
+
console.log(` GitHub Pages enabled (source: branch "${branch}").`);
|
|
73
|
+
}
|
|
74
|
+
} catch {
|
|
75
|
+
// Best-effort: continue without enabling; user can enable manually
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Detect package manager from lock files.
|
|
81
|
+
*/
|
|
82
|
+
async function getPackageManager(cwd: string): Promise<'yarn' | 'pnpm' | 'npm'> {
|
|
83
|
+
if (await fs.pathExists(path.join(cwd, 'yarn.lock'))) return 'yarn';
|
|
84
|
+
if (await fs.pathExists(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';
|
|
85
|
+
return 'npm';
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Run build script in the project (npm run build / yarn build / pnpm build).
|
|
90
|
+
*/
|
|
91
|
+
async function runBuild(cwd: string): Promise<void> {
|
|
92
|
+
const pkgPath = path.join(cwd, 'package.json');
|
|
93
|
+
const pkg = await fs.readJson(pkgPath);
|
|
94
|
+
const scripts = (pkg.scripts as Record<string, string>) || {};
|
|
95
|
+
if (!scripts['build']) {
|
|
96
|
+
throw new Error(
|
|
97
|
+
'No "build" script found in package.json. Add a build script or use --no-build and deploy an existing folder with -d/--dist-dir.'
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const pm = await getPackageManager(cwd);
|
|
102
|
+
const runCmd = pm === 'npm' ? 'npm' : pm === 'yarn' ? 'yarn' : 'pnpm';
|
|
103
|
+
const args = pm === 'npm' ? ['run', 'build'] : ['build'];
|
|
104
|
+
console.log(`š¦ Running build (${runCmd} ${args.join(' ')})...`);
|
|
105
|
+
await execa(runCmd, args, { cwd, stdio: 'inherit' });
|
|
106
|
+
console.log('ā
Build completed.\n');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Deploy the built app to GitHub Pages using the gh-pages package.
|
|
111
|
+
* Builds the project first unless skipBuild is true, then publishes distDir to the gh-pages branch.
|
|
112
|
+
*/
|
|
113
|
+
export async function runDeployToGitHubPages(
|
|
114
|
+
projectPath: string,
|
|
115
|
+
options: Partial<DeployOptions> = {}
|
|
116
|
+
): Promise<void> {
|
|
117
|
+
const distDir = options.distDir ?? DEFAULT_DIST_DIR;
|
|
118
|
+
const skipBuild = options.skipBuild ?? false;
|
|
119
|
+
const branch = options.branch ?? DEFAULT_BRANCH;
|
|
120
|
+
|
|
121
|
+
const cwd = path.resolve(projectPath);
|
|
122
|
+
const pkgPath = path.join(cwd, 'package.json');
|
|
123
|
+
|
|
124
|
+
if (!(await fs.pathExists(pkgPath))) {
|
|
125
|
+
throw new Error(
|
|
126
|
+
'No package.json found in this directory. Run this command from your project root (or pass the project path).'
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
let repoUrl: string;
|
|
131
|
+
try {
|
|
132
|
+
const { stdout } = await execa('git', ['remote', 'get-url', 'origin'], {
|
|
133
|
+
cwd,
|
|
134
|
+
reject: true,
|
|
135
|
+
});
|
|
136
|
+
repoUrl = stdout.trim();
|
|
137
|
+
} catch {
|
|
138
|
+
throw new Error(
|
|
139
|
+
'Please save your changes first, before deploying to GitHub Pages.'
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (!skipBuild) {
|
|
144
|
+
await runBuild(cwd);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const absoluteDist = path.join(cwd, distDir);
|
|
148
|
+
if (!(await fs.pathExists(absoluteDist))) {
|
|
149
|
+
throw new Error(
|
|
150
|
+
`Build output directory "${distDir}" does not exist. Run a build first or specify the correct directory with -d/--dist-dir.`
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const parsed = parseRepoFromUrl(repoUrl);
|
|
155
|
+
if (parsed) {
|
|
156
|
+
await ensurePagesEnabled(parsed.owner, parsed.repo, branch);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
console.log(`š Deploying "${distDir}" to GitHub Pages (branch: ${branch})...`);
|
|
160
|
+
await new Promise<void>((resolve, reject) => {
|
|
161
|
+
ghPages.publish(
|
|
162
|
+
absoluteDist,
|
|
163
|
+
{ branch, repo: repoUrl },
|
|
164
|
+
(err) => (err ? reject(err) : resolve())
|
|
165
|
+
);
|
|
166
|
+
});
|
|
167
|
+
console.log('\nā
Deployed to GitHub Pages.');
|
|
168
|
+
console.log(' Enable GitHub Pages in your repo: Settings ā Pages ā Source: branch "' + branch + '".');
|
|
169
|
+
console.log(' If the site is at username.github.io/<repo-name>, set your app\'s base path (e.g. base: \'/<repo-name>/\' in Vite).\n');
|
|
170
|
+
}
|