offcourse 0.0.2 ā 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +255 -20
- package/dist/cli/commands/config.d.ts +13 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +66 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/inspect.d.ts +11 -0
- package/dist/cli/commands/inspect.d.ts.map +1 -0
- package/dist/cli/commands/inspect.js +365 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/login.d.ts +12 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +55 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/status.d.ts +15 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +118 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +15 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +921 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/syncHighLevel.d.ts +23 -0
- package/dist/cli/commands/syncHighLevel.d.ts.map +1 -0
- package/dist/cli/commands/syncHighLevel.js +479 -0
- package/dist/cli/commands/syncHighLevel.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +106 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/configManager.d.ts +31 -0
- package/dist/config/configManager.d.ts.map +1 -0
- package/dist/config/configManager.js +68 -0
- package/dist/config/configManager.js.map +1 -0
- package/dist/config/paths.d.ts +21 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +33 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +60 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +50 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/downloader/hlsDownloader.d.ts +58 -0
- package/dist/downloader/hlsDownloader.d.ts.map +1 -0
- package/dist/downloader/hlsDownloader.js +263 -0
- package/dist/downloader/hlsDownloader.js.map +1 -0
- package/dist/downloader/hlsValidator.d.ts +35 -0
- package/dist/downloader/hlsValidator.d.ts.map +1 -0
- package/dist/downloader/hlsValidator.js +152 -0
- package/dist/downloader/hlsValidator.js.map +1 -0
- package/dist/downloader/index.d.ts +29 -0
- package/dist/downloader/index.d.ts.map +1 -0
- package/dist/downloader/index.js +55 -0
- package/dist/downloader/index.js.map +1 -0
- package/dist/downloader/loomDownloader.d.ts +56 -0
- package/dist/downloader/loomDownloader.d.ts.map +1 -0
- package/dist/downloader/loomDownloader.js +562 -0
- package/dist/downloader/loomDownloader.js.map +1 -0
- package/dist/downloader/queue.d.ts +56 -0
- package/dist/downloader/queue.d.ts.map +1 -0
- package/dist/downloader/queue.js +88 -0
- package/dist/downloader/queue.js.map +1 -0
- package/dist/downloader/vimeoDownloader.d.ts +52 -0
- package/dist/downloader/vimeoDownloader.d.ts.map +1 -0
- package/dist/downloader/vimeoDownloader.js +569 -0
- package/dist/downloader/vimeoDownloader.js.map +1 -0
- package/dist/scraper/extractor.d.ts +53 -0
- package/dist/scraper/extractor.d.ts.map +1 -0
- package/dist/scraper/extractor.js +627 -0
- package/dist/scraper/extractor.js.map +1 -0
- package/dist/scraper/highlevel/extractor.d.ts +89 -0
- package/dist/scraper/highlevel/extractor.d.ts.map +1 -0
- package/dist/scraper/highlevel/extractor.js +373 -0
- package/dist/scraper/highlevel/extractor.js.map +1 -0
- package/dist/scraper/highlevel/index.d.ts +3 -0
- package/dist/scraper/highlevel/index.d.ts.map +1 -0
- package/dist/scraper/highlevel/index.js +3 -0
- package/dist/scraper/highlevel/index.js.map +1 -0
- package/dist/scraper/highlevel/navigator.d.ts +86 -0
- package/dist/scraper/highlevel/navigator.d.ts.map +1 -0
- package/dist/scraper/highlevel/navigator.js +505 -0
- package/dist/scraper/highlevel/navigator.js.map +1 -0
- package/dist/scraper/highlevel/schemas.d.ts +188 -0
- package/dist/scraper/highlevel/schemas.d.ts.map +1 -0
- package/dist/scraper/highlevel/schemas.js +139 -0
- package/dist/scraper/highlevel/schemas.js.map +1 -0
- package/dist/scraper/navigator.d.ts +68 -0
- package/dist/scraper/navigator.d.ts.map +1 -0
- package/dist/scraper/navigator.js +257 -0
- package/dist/scraper/navigator.js.map +1 -0
- package/dist/scraper/schemas.d.ts +57 -0
- package/dist/scraper/schemas.d.ts.map +1 -0
- package/dist/scraper/schemas.js +135 -0
- package/dist/scraper/schemas.js.map +1 -0
- package/dist/scraper/videoInterceptor.d.ts +23 -0
- package/dist/scraper/videoInterceptor.d.ts.map +1 -0
- package/dist/scraper/videoInterceptor.js +330 -0
- package/dist/scraper/videoInterceptor.js.map +1 -0
- package/dist/shared/auth.d.ts +58 -0
- package/dist/shared/auth.d.ts.map +1 -0
- package/dist/shared/auth.js +197 -0
- package/dist/shared/auth.js.map +1 -0
- package/dist/shared/firebase.d.ts +60 -0
- package/dist/shared/firebase.d.ts.map +1 -0
- package/dist/shared/firebase.js +102 -0
- package/dist/shared/firebase.js.map +1 -0
- package/dist/shared/fs.d.ts +31 -0
- package/dist/shared/fs.d.ts.map +1 -0
- package/dist/shared/fs.js +77 -0
- package/dist/shared/fs.js.map +1 -0
- package/dist/shared/http.d.ts +15 -0
- package/dist/shared/http.d.ts.map +1 -0
- package/dist/shared/http.js +31 -0
- package/dist/shared/http.js.map +1 -0
- package/dist/shared/index.d.ts +7 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +7 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/slug.d.ts +11 -0
- package/dist/shared/slug.d.ts.map +1 -0
- package/dist/shared/slug.js +25 -0
- package/dist/shared/slug.js.map +1 -0
- package/dist/shared/url.d.ts +43 -0
- package/dist/shared/url.d.ts.map +1 -0
- package/dist/shared/url.js +54 -0
- package/dist/shared/url.js.map +1 -0
- package/dist/state/database.d.ts +246 -0
- package/dist/state/database.d.ts.map +1 -0
- package/dist/state/database.js +679 -0
- package/dist/state/database.js.map +1 -0
- package/dist/state/index.d.ts +2 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +2 -0
- package/dist/state/index.js.map +1 -0
- package/dist/storage/fileSystem.d.ts +56 -0
- package/dist/storage/fileSystem.d.ts.map +1 -0
- package/dist/storage/fileSystem.js +129 -0
- package/dist/storage/fileSystem.js.map +1 -0
- package/package.json +71 -11
- package/cli.js +0 -45
package/README.md
CHANGED
|
@@ -1,33 +1,142 @@
|
|
|
1
1
|
# Offcourse
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/offcourse)
|
|
4
|
+
[](https://www.npmjs.com/package/offcourse)
|
|
5
|
+
[](https://github.com/sebastian-software/offcourse/blob/main/LICENSE)
|
|
6
|
+
[](https://nodejs.org)
|
|
7
|
+
[](https://codecov.io/gh/sebastian-software/offcourse)
|
|
8
|
+
[](https://github.com/sebastian-software/offcourse/actions/workflows/ci.yml)
|
|
7
9
|
|
|
8
10
|
Download online courses for offline access ā of course! š
|
|
9
11
|
|
|
10
|
-
|
|
12
|
+
Saves video content and lesson text as Markdown files, organized by module structure.
|
|
11
13
|
|
|
12
|
-
##
|
|
13
|
-
|
|
14
|
-
Offcourse is a CLI tool that downloads online courses for offline access. It preserves the course structure, downloads videos, and converts lesson content to clean Markdown files.
|
|
15
|
-
|
|
16
|
-
## Planned Features
|
|
14
|
+
## Features
|
|
17
15
|
|
|
18
16
|
- š **Browser-based authentication** ā Log in once, sessions are cached
|
|
19
17
|
- š **Course structure preservation** ā Maintains module/lesson hierarchy
|
|
20
|
-
- š¬ **Video downloads** ā Supports
|
|
18
|
+
- š¬ **Video downloads** ā Supports HLS streams, Loom and Vimeo
|
|
21
19
|
- š **Content extraction** ā Converts lesson text to clean Markdown
|
|
22
20
|
- āøļø **Resumable syncs** ā Skips already downloaded content
|
|
23
21
|
- ā” **Concurrent downloads** ā Configurable parallelism
|
|
22
|
+
- š **Auto-detection** ā Automatically detects platform from URL
|
|
24
23
|
|
|
25
24
|
## Supported Platforms
|
|
26
25
|
|
|
27
|
-
| Platform | Status |
|
|
28
|
-
|
|
29
|
-
| [Skool.com](https://skool.com) | ā
|
|
30
|
-
| [
|
|
26
|
+
| Platform | Status | Notes |
|
|
27
|
+
|----------|--------|-------|
|
|
28
|
+
| [Skool.com](https://skool.com) | ā
Supported | Community courses |
|
|
29
|
+
| [HighLevel (GoHighLevel)](https://gohighlevel.com) | ā
Supported | Membership portals, ClientClub |
|
|
30
|
+
| [LearningSuite.io](https://learningsuite.io) | š§ Planned | |
|
|
31
|
+
|
|
32
|
+
## Installation
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm install -g offcourse
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Or run directly with npx:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npx offcourse <command>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Requires Node.js 22+.
|
|
45
|
+
|
|
46
|
+
For HLS video downloads (HighLevel native videos), [ffmpeg](https://ffmpeg.org/) must be installed:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# macOS
|
|
50
|
+
brew install ffmpeg
|
|
51
|
+
|
|
52
|
+
# Ubuntu/Debian
|
|
53
|
+
sudo apt install ffmpeg
|
|
54
|
+
|
|
55
|
+
# Windows (via Chocolatey)
|
|
56
|
+
choco install ffmpeg
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Usage
|
|
60
|
+
|
|
61
|
+
### Login
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# Opens browser for interactive login
|
|
65
|
+
offcourse login
|
|
66
|
+
|
|
67
|
+
# Force re-login
|
|
68
|
+
offcourse login --force
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Sync a Course
|
|
72
|
+
|
|
73
|
+
The `sync` command auto-detects the platform from the URL:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# Auto-detect platform and download
|
|
77
|
+
offcourse sync <url>
|
|
78
|
+
|
|
79
|
+
# Skip video downloads
|
|
80
|
+
offcourse sync <url> --skip-videos
|
|
81
|
+
|
|
82
|
+
# Skip text content
|
|
83
|
+
offcourse sync <url> --skip-content
|
|
84
|
+
|
|
85
|
+
# Preview without downloading
|
|
86
|
+
offcourse sync <url> --dry-run
|
|
87
|
+
|
|
88
|
+
# Limit to first N lessons (for testing)
|
|
89
|
+
offcourse sync <url> --limit 5
|
|
90
|
+
|
|
91
|
+
# Override course name (useful when auto-detection fails)
|
|
92
|
+
offcourse sync <url> --course-name "My Course Name"
|
|
93
|
+
|
|
94
|
+
# Prefer specific video quality
|
|
95
|
+
offcourse sync <url> --quality 720p
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Platform-Specific Commands
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# Skool courses
|
|
102
|
+
offcourse sync-skool https://www.skool.com/your-community/classroom
|
|
103
|
+
|
|
104
|
+
# HighLevel/GoHighLevel membership portals
|
|
105
|
+
offcourse sync-highlevel https://member.example.com/courses/products/<id>
|
|
106
|
+
offcourse sync-highlevel <url> --course-name "Course Name"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Configuration
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# Show current config
|
|
113
|
+
offcourse config show
|
|
114
|
+
|
|
115
|
+
# Set output directory
|
|
116
|
+
offcourse config set outputDir ~/Courses
|
|
117
|
+
|
|
118
|
+
# Set video quality (highest, lowest, 1080p, 720p, 480p)
|
|
119
|
+
offcourse config set videoQuality 720p
|
|
120
|
+
|
|
121
|
+
# Set download concurrency (1-5)
|
|
122
|
+
offcourse config set concurrency 3
|
|
123
|
+
|
|
124
|
+
# Run headless (no browser window)
|
|
125
|
+
offcourse config set headless true
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Inspect (Debugging)
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# Analyze page structure
|
|
132
|
+
offcourse inspect <url>
|
|
133
|
+
|
|
134
|
+
# Save analysis to files
|
|
135
|
+
offcourse inspect <url> --output ./analysis
|
|
136
|
+
|
|
137
|
+
# Include full HTML dump
|
|
138
|
+
offcourse inspect <url> --full
|
|
139
|
+
```
|
|
31
140
|
|
|
32
141
|
## Output Structure
|
|
33
142
|
|
|
@@ -45,13 +154,139 @@ Offcourse is a CLI tool that downloads online courses for offline access. It pre
|
|
|
45
154
|
āāā ...
|
|
46
155
|
```
|
|
47
156
|
|
|
48
|
-
##
|
|
157
|
+
## Platform Notes
|
|
49
158
|
|
|
50
|
-
|
|
159
|
+
### HighLevel (GoHighLevel)
|
|
51
160
|
|
|
52
|
-
|
|
161
|
+
HighLevel is an all-in-one marketing platform with a "Memberships" feature for hosting courses. Offcourse supports:
|
|
53
162
|
|
|
54
|
-
|
|
163
|
+
- **Authentication**: Firebase-based login via browser
|
|
164
|
+
- **Course structure**: Extracts products, categories, and posts via API
|
|
165
|
+
- **Video downloads**: Native HLS videos with quality selection (requires ffmpeg)
|
|
166
|
+
- **Embedded videos**: Vimeo, Loom, and other embedded players
|
|
167
|
+
|
|
168
|
+
Common HighLevel portal URLs:
|
|
169
|
+
- `https://member.yourdomain.com/courses/...`
|
|
170
|
+
- `https://portal.yourdomain.com/courses/...`
|
|
171
|
+
- `https://courses.yourdomain.com/...`
|
|
172
|
+
|
|
173
|
+
## Development
|
|
174
|
+
|
|
175
|
+
### Setup
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# Clone the repository
|
|
179
|
+
git clone https://github.com/sebastian-software/offcourse.git
|
|
180
|
+
cd offcourse
|
|
181
|
+
|
|
182
|
+
# Install dependencies
|
|
183
|
+
npm install
|
|
184
|
+
|
|
185
|
+
# Build
|
|
186
|
+
npm run build
|
|
187
|
+
|
|
188
|
+
# Link globally (optional)
|
|
189
|
+
npm link
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Commands
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
# Watch mode
|
|
196
|
+
npm run dev
|
|
197
|
+
|
|
198
|
+
# Run directly (without build)
|
|
199
|
+
npx tsx src/cli/index.ts <command>
|
|
200
|
+
|
|
201
|
+
# Lint
|
|
202
|
+
npm run lint
|
|
203
|
+
|
|
204
|
+
# Format
|
|
205
|
+
npm run format
|
|
206
|
+
|
|
207
|
+
# Type check
|
|
208
|
+
npm run typecheck
|
|
209
|
+
|
|
210
|
+
# Test
|
|
211
|
+
npm test
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Git Hooks
|
|
215
|
+
|
|
216
|
+
This project uses [Husky](https://typicode.github.io/husky/) for Git hooks:
|
|
217
|
+
|
|
218
|
+
- **pre-commit**: Runs Prettier on staged files via lint-staged
|
|
219
|
+
- **pre-push**: Runs ESLint and TypeScript type checking
|
|
220
|
+
- **commit-msg**: Validates commit messages follow [Conventional Commits](https://www.conventionalcommits.org/)
|
|
221
|
+
|
|
222
|
+
### Commit Convention
|
|
223
|
+
|
|
224
|
+
We follow [Conventional Commits](https://www.conventionalcommits.org/). Commit messages must follow this format:
|
|
55
225
|
|
|
56
|
-
|
|
226
|
+
```
|
|
227
|
+
<type>[optional scope]: <description>
|
|
228
|
+
|
|
229
|
+
[optional body]
|
|
230
|
+
|
|
231
|
+
[optional footer(s)]
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Types:**
|
|
235
|
+
|
|
236
|
+
- `feat`: New feature
|
|
237
|
+
- `fix`: Bug fix
|
|
238
|
+
- `docs`: Documentation changes
|
|
239
|
+
- `style`: Code style changes (formatting, semicolons, etc.)
|
|
240
|
+
- `refactor`: Code refactoring
|
|
241
|
+
- `perf`: Performance improvements
|
|
242
|
+
- `test`: Adding or updating tests
|
|
243
|
+
- `chore`: Maintenance tasks
|
|
244
|
+
- `ci`: CI/CD changes
|
|
245
|
+
|
|
246
|
+
**Examples:**
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
git commit -m "feat: add support for Vimeo downloads"
|
|
250
|
+
git commit -m "fix: handle missing video URLs gracefully"
|
|
251
|
+
git commit -m "docs: update installation instructions"
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Releasing
|
|
255
|
+
|
|
256
|
+
Releases are managed with [release-it](https://github.com/release-it/release-it). The release process:
|
|
257
|
+
|
|
258
|
+
1. Runs linting, type checking, and tests
|
|
259
|
+
2. Bumps version based on conventional commits
|
|
260
|
+
3. Generates/updates `CHANGELOG.md`
|
|
261
|
+
4. Creates a Git tag and GitHub release
|
|
262
|
+
5. Publishes to npm
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
# Interactive release (will prompt for version bump)
|
|
266
|
+
npm run release
|
|
267
|
+
|
|
268
|
+
# Dry run (preview what would happen)
|
|
269
|
+
npm run release -- --dry-run
|
|
270
|
+
|
|
271
|
+
# Specific version bump
|
|
272
|
+
npm run release -- --minor
|
|
273
|
+
npm run release -- --major
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## Acknowledgments
|
|
277
|
+
|
|
278
|
+
A huge thank you to [Sindre Sorhus](https://github.com/sindresorhus) š for creating and maintaining so many excellent packages that power this project:
|
|
279
|
+
|
|
280
|
+
- [`@sindresorhus/slugify`](https://github.com/sindresorhus/slugify) ā Slugify a string
|
|
281
|
+
- [`conf`](https://github.com/sindresorhus/conf) ā Simple config handling
|
|
282
|
+
- [`delay`](https://github.com/sindresorhus/delay) ā Delay a promise
|
|
283
|
+
- [`execa`](https://github.com/sindresorhus/execa) ā Process execution for humans
|
|
284
|
+
- [`ky`](https://github.com/sindresorhus/ky) ā Tiny & elegant HTTP client
|
|
285
|
+
- [`p-queue`](https://github.com/sindresorhus/p-queue) ā Promise queue with concurrency control
|
|
286
|
+
- [`p-retry`](https://github.com/sindresorhus/p-retry) ā Retry a promise-returning function
|
|
287
|
+
|
|
288
|
+
His commitment to high-quality, well-documented, and beautifully designed open source software is truly inspiring. If you find his work useful, consider [sponsoring him](https://github.com/sponsors/sindresorhus).
|
|
289
|
+
|
|
290
|
+
## License
|
|
57
291
|
|
|
292
|
+
MIT
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shows all current configuration values.
|
|
3
|
+
*/
|
|
4
|
+
export declare function configShowCommand(): void;
|
|
5
|
+
/**
|
|
6
|
+
* Sets a configuration value.
|
|
7
|
+
*/
|
|
8
|
+
export declare function configSetCommand(key: string, value: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Gets a specific configuration value.
|
|
11
|
+
*/
|
|
12
|
+
export declare function configGetCommand(key: string): void;
|
|
13
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAUxC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAiCjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAWlD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { getConfigValue, loadConfig, updateConfig } from "../../config/configManager.js";
|
|
3
|
+
import { CONFIG_FILE } from "../../config/paths.js";
|
|
4
|
+
import { configSchema } from "../../config/schema.js";
|
|
5
|
+
/**
|
|
6
|
+
* Shows all current configuration values.
|
|
7
|
+
*/
|
|
8
|
+
export function configShowCommand() {
|
|
9
|
+
const config = loadConfig();
|
|
10
|
+
console.log(chalk.blue("\nāļø Configuration\n"));
|
|
11
|
+
console.log(chalk.gray(` File: ${CONFIG_FILE}\n`));
|
|
12
|
+
for (const [key, value] of Object.entries(config)) {
|
|
13
|
+
console.log(` ${chalk.cyan(key)}: ${chalk.white(String(value))}`);
|
|
14
|
+
}
|
|
15
|
+
console.log();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Sets a configuration value.
|
|
19
|
+
*/
|
|
20
|
+
export function configSetCommand(key, value) {
|
|
21
|
+
const validKeys = Object.keys(configSchema.shape);
|
|
22
|
+
if (!validKeys.includes(key)) {
|
|
23
|
+
console.log(chalk.red(`\nā Unknown config key: ${key}`));
|
|
24
|
+
console.log(chalk.gray(` Valid keys: ${validKeys.join(", ")}\n`));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
// Parse value based on expected type
|
|
28
|
+
const currentValue = getConfigValue(key);
|
|
29
|
+
let parsedValue;
|
|
30
|
+
if (typeof currentValue === "boolean") {
|
|
31
|
+
parsedValue = value === "true" || value === "1";
|
|
32
|
+
}
|
|
33
|
+
else if (typeof currentValue === "number") {
|
|
34
|
+
parsedValue = parseInt(value, 10);
|
|
35
|
+
if (isNaN(parsedValue)) {
|
|
36
|
+
console.log(chalk.red(`\nā Invalid number: ${value}\n`));
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
parsedValue = value;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
updateConfig({ [key]: parsedValue });
|
|
45
|
+
console.log(chalk.green(`\nā
Set ${key} = ${parsedValue}\n`));
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.log(chalk.red(`\nā Invalid value for ${key}: ${value}`));
|
|
49
|
+
console.log(chalk.gray(` ${String(error)}\n`));
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Gets a specific configuration value.
|
|
55
|
+
*/
|
|
56
|
+
export function configGetCommand(key) {
|
|
57
|
+
const validKeys = Object.keys(configSchema.shape);
|
|
58
|
+
if (!validKeys.includes(key)) {
|
|
59
|
+
console.log(chalk.red(`\nā Unknown config key: ${key}`));
|
|
60
|
+
console.log(chalk.gray(` Valid keys: ${validKeys.join(", ")}\n`));
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
const value = getConfigValue(key);
|
|
64
|
+
console.log(String(value));
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface InspectOptions {
|
|
2
|
+
output?: string;
|
|
3
|
+
full?: boolean;
|
|
4
|
+
click?: boolean;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Inspects the page structure and logs useful debugging info.
|
|
8
|
+
*/
|
|
9
|
+
export declare function inspectCommand(url: string, options: InspectOptions): Promise<void>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=inspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/inspect.ts"],"names":[],"mappings":"AAWA,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoaxF"}
|