@learnmd/cli 0.0.1-beta.1 → 0.0.2-beta.0

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.
@@ -1,3 +1,10 @@
1
- export declare function addCourseCommand(name: string): Promise<void>;
2
- export declare function addLessonCommand(title: string, courseSlug?: string): Promise<void>;
1
+ export interface AddOptions {
2
+ course?: string;
3
+ nonInteractive?: boolean;
4
+ difficulty?: string;
5
+ time?: string;
6
+ }
7
+ export declare function addCourseCommand(initialName?: string, options?: AddOptions): Promise<void>;
8
+ export declare function addLessonCommand(title: string, options?: AddOptions): Promise<void>;
9
+ export declare function addPageCommand(title: string, options?: AddOptions): Promise<void>;
3
10
  //# sourceMappingURL=add.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAgBA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,iBA0BlD;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAsB,iBA2DvF"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,iBAoHhF;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,iBAkEzE;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,iBAkCvE"}
@@ -1,7 +1,7 @@
1
1
  import chalk from 'chalk';
2
2
  import { writeFile, mkdir, readFile } from 'fs/promises';
3
3
  import { join } from 'path';
4
- import { getCourseConfig } from './create.js';
4
+ import { intro, text, select, isCancel, cancel, outro } from '@clack/prompts';
5
5
  async function checkIfInLearnMDWorkspace() {
6
6
  try {
7
7
  const cwd = process.cwd();
@@ -13,31 +13,123 @@ async function checkIfInLearnMDWorkspace() {
13
13
  return false;
14
14
  }
15
15
  }
16
- export async function addCourseCommand(name) {
17
- console.log(chalk.blue(`\nšŸ“š Adding new course: ${name}\n`));
16
+ export async function addCourseCommand(initialName, options) {
17
+ const isNonInteractive = options?.nonInteractive;
18
+ if (!isNonInteractive) {
19
+ intro(chalk.bgBlue(' šŸ“š Add New Course '));
20
+ }
18
21
  const isLearnMD = await checkIfInLearnMDWorkspace();
19
22
  if (!isLearnMD) {
20
23
  console.warn(chalk.yellow('āš ļø Warning: This doesn\'t look like a LearnMD project. Ensure you are running this inside a LearnMD workspace.'));
21
24
  }
25
+ let name = initialName;
26
+ if (!name && !isNonInteractive) {
27
+ const nameResult = await text({
28
+ message: 'What is the title of the course?',
29
+ placeholder: 'e.g., JavaScript Basics',
30
+ validate(value) {
31
+ if (!value || value.length === 0)
32
+ return 'Course title is required';
33
+ },
34
+ });
35
+ if (isCancel(nameResult)) {
36
+ cancel('Operation cancelled.');
37
+ return;
38
+ }
39
+ name = nameResult;
40
+ }
41
+ else if (!name && isNonInteractive) {
42
+ name = 'new-course';
43
+ }
44
+ let difficulty = options?.difficulty;
45
+ if (!difficulty && !isNonInteractive) {
46
+ const diffResult = await select({
47
+ message: 'What is the difficulty level?',
48
+ options: [
49
+ { value: 'beginner', label: 'Beginner' },
50
+ { value: 'intermediate', label: 'Intermediate' },
51
+ { value: 'advanced', label: 'Advanced' },
52
+ ],
53
+ });
54
+ if (isCancel(diffResult)) {
55
+ cancel('Operation cancelled.');
56
+ return;
57
+ }
58
+ difficulty = diffResult;
59
+ }
60
+ else if (!difficulty && isNonInteractive) {
61
+ difficulty = 'beginner';
62
+ }
63
+ let estimatedTime = options?.time;
64
+ if (!estimatedTime && !isNonInteractive) {
65
+ const timeResult = await text({
66
+ message: 'What is the estimated completion time?',
67
+ placeholder: 'e.g., 2 hours',
68
+ defaultValue: '1 hour',
69
+ });
70
+ if (isCancel(timeResult)) {
71
+ cancel('Operation cancelled.');
72
+ return;
73
+ }
74
+ estimatedTime = timeResult;
75
+ }
76
+ else if (!estimatedTime && isNonInteractive) {
77
+ estimatedTime = '1 hour';
78
+ }
22
79
  const slug = name.toLowerCase().replace(/\s+/g, '-');
23
80
  const coursePath = join(process.cwd(), 'courses', slug, 'lessons');
24
81
  try {
25
82
  await mkdir(coursePath, { recursive: true });
26
83
  // Generate course configuration
84
+ const courseConfig = {
85
+ title: {
86
+ en: name,
87
+ es: `${name} (ES)`
88
+ },
89
+ description: {
90
+ en: `An interactive course: ${name}`,
91
+ es: `Un curso interactivo: ${name}`
92
+ },
93
+ version: '1.0.0',
94
+ difficulty: difficulty,
95
+ estimatedTime: estimatedTime,
96
+ lessons: ['introduction']
97
+ };
27
98
  const courseDir = join(process.cwd(), 'courses', slug);
28
- await writeFile(join(courseDir, 'learnmd.json'), getCourseConfig(name));
29
- console.log(chalk.gray(` Created: courses/${slug}/learnmd.json`));
99
+ await writeFile(join(courseDir, 'learnmd.json'), JSON.stringify(courseConfig, null, 2));
100
+ // Add an initial overview.mdx
101
+ const overviewContent = `---
102
+ title: Overview
103
+ ---
104
+
105
+ # Welcome to ${name}!
106
+
107
+ This is the overview page for your new course. You can add extended descriptions, images, and custom salutations here.
108
+ `;
109
+ await writeFile(join(courseDir, 'overview.mdx'), overviewContent);
30
110
  // Add an initial lesson
31
- await addLessonCommand('Introduction', slug);
32
- console.log(chalk.green(`āœ… Course '${name}' created successfully in courses/${slug}/`));
111
+ await addLessonCommand('Introduction', { course: slug, nonInteractive: isNonInteractive });
112
+ if (!isNonInteractive) {
113
+ outro(chalk.green(`āœ… Course '${name}' created successfully in courses/${slug}/`));
114
+ }
115
+ else {
116
+ console.log(chalk.green(`āœ… Course '${name}' created successfully in courses/${slug}/`));
117
+ }
33
118
  }
34
119
  catch (error) {
35
120
  console.error(chalk.red('āŒ Failed to create course directory.'));
36
121
  console.error(error);
37
122
  }
38
123
  }
39
- export async function addLessonCommand(title, courseSlug = 'demo-course') {
40
- console.log(chalk.blue(`\nšŸ“ Adding new lesson: ${title} to ${courseSlug}\n`));
124
+ export async function addLessonCommand(title, options) {
125
+ const courseSlug = options?.course || 'demo-course';
126
+ const isNonInteractive = options?.nonInteractive;
127
+ if (!isNonInteractive) {
128
+ console.log(chalk.blue(`\nšŸ“ Adding new lesson: ${title} to ${courseSlug}\n`));
129
+ }
130
+ else {
131
+ console.log(`Adding new lesson: ${title} to ${courseSlug}`);
132
+ }
41
133
  const slug = title.toLowerCase().replace(/\s+/g, '-');
42
134
  const filePath = join(process.cwd(), 'courses', courseSlug, 'lessons', `${slug}.mdx`);
43
135
  const content = `---
@@ -48,7 +140,6 @@ description:
48
140
  en: 'Description for ${title}'
49
141
  es: 'Descripción para ${title}'
50
142
  duration: '10 minutes'
51
- difficulty: 'beginner'
52
143
  ---
53
144
 
54
145
  # ${title}
@@ -88,11 +179,43 @@ difficulty: 'beginner'
88
179
  try {
89
180
  await mkdir(join(process.cwd(), 'courses', courseSlug, 'lessons'), { recursive: true });
90
181
  await writeFile(filePath, content);
91
- console.log(chalk.green(`āœ… Lesson created at: courses/${courseSlug}/lessons/${slug}.mdx`));
182
+ console.log(chalk.gray(` Created lesson: courses/${courseSlug}/lessons/${slug}.mdx`));
92
183
  }
93
184
  catch (error) {
94
185
  console.error(chalk.red('āŒ Failed to create lesson. Ensure you have permissions.'));
95
186
  console.error(error);
96
187
  }
97
188
  }
189
+ export async function addPageCommand(title, options) {
190
+ const isNonInteractive = options?.nonInteractive;
191
+ const slug = title.toLowerCase().replace(/\s+/g, '-');
192
+ const pathUrl = `/${slug}`;
193
+ if (!isNonInteractive) {
194
+ console.log(chalk.blue(`\nšŸ“„ Adding new custom page: ${title} at ${pathUrl}\n`));
195
+ }
196
+ const filePath = join(process.cwd(), 'pages', `${slug}.mdx`);
197
+ const content = `---
198
+ title: '${title}'
199
+ ---
200
+
201
+ # ${title}
202
+
203
+ This is a custom dynamic page. You can add MDX components here.
204
+ `;
205
+ try {
206
+ await mkdir(join(process.cwd(), 'pages'), { recursive: true });
207
+ await writeFile(filePath, content);
208
+ console.log(chalk.gray(` Created page file: pages/${slug}.mdx`));
209
+ console.log(chalk.yellow(` āš ļø Remember to add this page to your learnmd.config.ts:`));
210
+ console.log(chalk.cyan(`
211
+ customPages: [
212
+ { path: '${pathUrl}', componentPath: 'pages/${slug}.mdx' }
213
+ ]
214
+ `));
215
+ }
216
+ catch (error) {
217
+ console.error(chalk.red('āŒ Failed to create page. Ensure you have permissions.'));
218
+ console.error(error);
219
+ }
220
+ }
98
221
  //# sourceMappingURL=add.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  interface CreateOptions {
2
- template: string;
3
- language: string;
2
+ template?: string;
3
+ language?: string;
4
+ nonInteractive?: boolean;
4
5
  }
5
- export declare function createCommand(name?: string, _options?: CreateOptions): Promise<void>;
6
+ export declare function createCommand(name?: string, options?: CreateOptions): Promise<void>;
6
7
  export declare function getCourseConfig(courseName: string): string;
7
8
  export {};
8
9
  //# sourceMappingURL=create.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AASA,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,iBAqB1E;AAoDD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAgB1D"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAUA,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,iBAqCzE;AAkED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAiB1D"}
@@ -2,20 +2,38 @@ import chalk from 'chalk';
2
2
  import { mkdir, writeFile, readFile } from 'fs/promises';
3
3
  import { join } from 'path';
4
4
  import { createRequire } from 'module';
5
+ import { intro, text, isCancel, cancel, outro } from '@clack/prompts';
5
6
  const require = createRequire(import.meta.url);
6
7
  const pkg = require('../../package.json');
7
8
  const version = pkg.version;
8
- export async function createCommand(name, _options) {
9
- const projectName = name || (await askForProjectName());
9
+ export async function createCommand(name, options) {
10
+ const isNonInteractive = options?.nonInteractive;
11
+ if (!isNonInteractive) {
12
+ intro(chalk.bgBlue(' šŸ“š Create LearnMD Project '));
13
+ }
14
+ let projectName = name;
15
+ if (!projectName && !isNonInteractive) {
16
+ projectName = await askForProjectName();
17
+ }
18
+ else if (!projectName && isNonInteractive) {
19
+ projectName = 'my-course';
20
+ }
21
+ if (!projectName)
22
+ return; // Cancelled
10
23
  const isInWorkspace = await checkIfInLearnMDWorkspace();
11
- console.log(chalk.blue(`\nšŸ“š Creating LearnMD project: ${projectName}\n`));
12
24
  try {
13
25
  await mkdir(projectName, { recursive: true });
14
26
  await createBasicStructure(projectName);
15
27
  await updatePackageJson(projectName, projectName, isInWorkspace);
16
28
  await createEssentialFiles(projectName, isInWorkspace);
17
- console.log(chalk.green('\nāœ… LearnMD project created successfully!\n'));
18
- console.log(chalk.blue('Next steps:'));
29
+ if (!isNonInteractive) {
30
+ outro(chalk.green('āœ… LearnMD project created successfully!'));
31
+ console.log(chalk.blue('Next steps:'));
32
+ }
33
+ else {
34
+ console.log(chalk.green('āœ… LearnMD project created successfully!'));
35
+ console.log('Next steps:');
36
+ }
19
37
  console.log(` cd ${projectName}`);
20
38
  console.log(' pnpm install');
21
39
  console.log(' pnpm dev\n');
@@ -37,21 +55,21 @@ async function checkIfInLearnMDWorkspace() {
37
55
  }
38
56
  }
39
57
  async function askForProjectName() {
40
- const inquirer = await import('inquirer');
41
- const { projectName } = await inquirer.default.prompt([
42
- {
43
- type: 'input',
44
- name: 'projectName',
45
- message: 'What is your project name?',
46
- default: 'my-course',
47
- validate: (input) => {
48
- if (/^[a-z0-9-]+$/.test(input))
49
- return true;
58
+ const result = await text({
59
+ message: 'What is your project name?',
60
+ defaultValue: 'my-course',
61
+ placeholder: 'my-course',
62
+ validate: (value) => {
63
+ if (!value || !/^[a-z0-9-]+$/.test(value)) {
50
64
  return 'Project name must contain only lowercase letters, numbers, and hyphens';
51
- },
65
+ }
52
66
  },
53
- ]);
54
- return projectName;
67
+ });
68
+ if (isCancel(result)) {
69
+ cancel('Operation cancelled.');
70
+ return undefined;
71
+ }
72
+ return result;
55
73
  }
56
74
  async function createBasicStructure(projectPath) {
57
75
  const dirs = ['courses/demo-course/lessons', 'public', 'src'];
@@ -69,6 +87,15 @@ async function createBasicStructure(projectPath) {
69
87
  await writeFile(join(projectPath, '.gitignore'), getGitIgnore());
70
88
  // Course config for the demo course
71
89
  await writeFile(join(projectPath, 'courses/demo-course/learnmd.json'), getCourseConfig('Demo Course'));
90
+ // Overview MDX
91
+ await writeFile(join(projectPath, 'courses/demo-course/overview.mdx'), `---
92
+ title: Demo Course Overview
93
+ ---
94
+
95
+ # Welcome to Demo Course!
96
+
97
+ This is the overview page. Configure your course description and welcome message here.
98
+ `);
72
99
  await writeFile(join(projectPath, 'courses/demo-course/lessons/.gitkeep'), '');
73
100
  }
74
101
  export function getCourseConfig(courseName) {
@@ -84,8 +111,9 @@ export function getCourseConfig(courseName) {
84
111
  author: '',
85
112
  version: '1.0.0',
86
113
  difficulty: 'beginner',
114
+ estimatedTime: '1 hour',
87
115
  tags: [],
88
- lessonOrder: [],
116
+ lessons: [],
89
117
  }, null, 2);
90
118
  }
91
119
  async function createEssentialFiles(projectPath, _isInWorkspace) {
@@ -124,10 +152,20 @@ ReactDOM.createRoot(document.getElementById('root')!).render(
124
152
  function getAppTsx() {
125
153
  return `/// <reference types="vite/client" />
126
154
  import { LearnMDProvider } from '@learnmd/core';
127
- import { CatalogViewer, CourseViewer, ProfileViewer } from '@learnmd/default-theme';
155
+ import { CatalogViewer, CourseViewer, ProfileViewer, MainLayout, Header, Callout, Quiz, VideoEmbed, Progress, LanguageSwitcher, Paragraph } from '@learnmd/default-theme';
128
156
  import { BrowserRouter, Routes, Route } from 'react-router-dom';
157
+ import { MDXProvider } from '@mdx-js/react';
129
158
  import config from '../learnmd.config';
130
159
 
160
+ const components = {
161
+ Callout,
162
+ Quiz,
163
+ VideoEmbed,
164
+ Progress,
165
+ LanguageSwitcher,
166
+ Paragraph,
167
+ };
168
+
131
169
  // Glob all markdown files dynamically across all courses
132
170
  const lessonModules = import.meta.glob('../courses/*/lessons/*.mdx', { eager: true });
133
171
  const allLessons = Object.entries(lessonModules).map(([path, mod]) => {
@@ -142,14 +180,53 @@ const allLessons = Object.entries(lessonModules).map(([path, mod]) => {
142
180
  };
143
181
  });
144
182
 
183
+ // Load Course Configurations (learnmd.json)
184
+ const courseConfigsRaw = import.meta.glob('../courses/*/learnmd.json', { eager: true });
185
+ const coursesConfig = Object.entries(courseConfigsRaw).reduce((acc, [path, mod]) => {
186
+ const courseSlug = path.split('/')[2];
187
+ acc[courseSlug] = { id: courseSlug, ...(mod as any).default || mod };
188
+ return acc;
189
+ }, {} as Record<string, any>);
190
+
191
+ // Optional: Load Home Page MDX
192
+ const homeModule = import.meta.glob('../home.mdx', { eager: true });
193
+ const HomeComponent = Object.values(homeModule)[0] ? (Object.values(homeModule)[0] as any).default : undefined;
194
+
195
+ // Load Custom Pages dynamically
196
+ const pageModules = import.meta.glob('../pages/*.mdx', { eager: true });
197
+
145
198
  function App() {
146
199
  return (
147
200
  <LearnMDProvider config={config}>
148
201
  <BrowserRouter>
149
202
  <Routes>
150
- <Route path="/" element={<CatalogViewer courses={allLessons} />} />
151
- <Route path="/profile" element={<ProfileViewer />} />
152
- <Route path="/courses/:courseId/*" element={<CourseViewer allLessons={allLessons} />} />
203
+ <Route path="/" element={<CatalogViewer courses={allLessons} HomeComponent={HomeComponent} />} />
204
+ <Route path="/profile" element={
205
+ <MainLayout title="Profile">
206
+ <Header title="User Profile" />
207
+ <ProfileViewer />
208
+ </MainLayout>
209
+ } />
210
+ <Route path="/courses/:courseId/*" element={<CourseViewer allLessons={allLessons} coursesConfig={coursesConfig} />} />
211
+
212
+ {config.customPages?.map((page, idx) => {
213
+ // Map standard pages path to dynamic import
214
+ const modKey = \`../\${page.componentPath}\`;
215
+ const mod = pageModules[modKey];
216
+ const Component = mod ? (mod as any).default : () => <div>Page not found</div>;
217
+ return (
218
+ <Route key={idx} path={page.path} element={
219
+ <MainLayout>
220
+ <Header />
221
+ <div className="prose dark:prose-invert max-w-4xl mx-auto py-12 px-6">
222
+ <MDXProvider components={components}>
223
+ <Component />
224
+ </MDXProvider>
225
+ </div>
226
+ </MainLayout>
227
+ } />
228
+ );
229
+ })}
153
230
  </Routes>
154
231
  </BrowserRouter>
155
232
  </LearnMDProvider>
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface SyncOptions {
2
+ course?: string;
3
+ nonInteractive?: boolean;
4
+ }
5
+ export declare function syncCommand(courseSlug: string, options?: SyncOptions): Promise<void>;
6
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,iBAwC1E"}
@@ -0,0 +1,40 @@
1
+ import chalk from 'chalk';
2
+ import { readdir, readFile, writeFile } from 'fs/promises';
3
+ import { join } from 'path';
4
+ export async function syncCommand(courseSlug, options) {
5
+ const isNonInteractive = options?.nonInteractive;
6
+ if (!isNonInteractive) {
7
+ console.log(chalk.blue(`\nšŸ”„ Syncing lessons for course: ${courseSlug}\n`));
8
+ }
9
+ else {
10
+ console.log(`Syncing lessons for course: ${courseSlug}`);
11
+ }
12
+ const courseDir = join(process.cwd(), 'courses', courseSlug);
13
+ const lessonsDir = join(courseDir, 'lessons');
14
+ const configPath = join(courseDir, 'learnmd.json');
15
+ try {
16
+ // Read MDX files
17
+ const files = await readdir(lessonsDir);
18
+ const mdxFiles = files.filter(f => f.endsWith('.mdx'));
19
+ const slugs = mdxFiles.map(f => f.replace(/\.mdx$/, ''));
20
+ // Update learnmd.json
21
+ const configContent = await readFile(configPath, 'utf-8');
22
+ const config = JSON.parse(configContent);
23
+ config.lessons = slugs;
24
+ await writeFile(configPath, JSON.stringify(config, null, 2));
25
+ if (!isNonInteractive) {
26
+ console.log(chalk.green(`āœ… Synced ${slugs.length} lessons to ${courseSlug}/learnmd.json`));
27
+ console.log(chalk.gray(` Lessons: ${slugs.join(', ')}`));
28
+ }
29
+ else {
30
+ console.log(`āœ… Synced ${slugs.length} lessons to ${courseSlug}/learnmd.json`);
31
+ }
32
+ }
33
+ catch (error) {
34
+ console.error(chalk.red(`āŒ Failed to sync course ${courseSlug}. Ensure the course directory exists.`));
35
+ if (!isNonInteractive) {
36
+ console.error(error);
37
+ }
38
+ }
39
+ }
40
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAO5B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAkB,EAAE,OAAqB;IACzE,MAAM,gBAAgB,GAAG,OAAO,EAAE,cAAc,CAAC;IAEjD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,UAAU,IAAI,CAAC,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,iBAAiB;QACjB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAEzD,sBAAsB;QACtB,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAEzC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;QAEvB,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE7D,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,MAAM,eAAe,UAAU,eAAe,CAAC,CAAC,CAAC;YAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,MAAM,eAAe,UAAU,eAAe,CAAC,CAAC;QAChF,CAAC;IAEH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,UAAU,uCAAuC,CAAC,CAAC,CAAC;QACvG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -5,6 +5,7 @@ import { devCommand } from './commands/dev.js';
5
5
  import { buildCommand } from './commands/build.js';
6
6
  import { initCommand } from './commands/init.js';
7
7
  import { addCourseCommand, addLessonCommand } from './commands/add.js';
8
+ import { syncCommand } from './commands/sync.js';
8
9
  import { createRequire } from 'module';
9
10
  const require = createRequire(import.meta.url);
10
11
  const pkg = require('../package.json');
@@ -19,6 +20,7 @@ program
19
20
  .argument('[name]', 'Project name')
20
21
  .option('-t, --template <template>', 'Template to use', 'default')
21
22
  .option('-l, --language <language>', 'Default language', 'en')
23
+ .option('-n, --non-interactive', 'Run without interactive prompts')
22
24
  .action(createCommand);
23
25
  program
24
26
  .command('init')
@@ -38,20 +40,35 @@ program
38
40
  .action(buildCommand);
39
41
  program
40
42
  .command('add')
41
- .description('Add new resources (course or lesson)')
42
- .argument('<type>', 'Type of resource (course, lesson)')
43
+ .description('Add new resources (course, lesson, or page)')
44
+ .argument('<type>', 'Type of resource (course, lesson, page)')
43
45
  .argument('<name>', 'Name/Title of the resource')
44
46
  .option('-c, --course <courseName>', 'Course name to add the lesson to (defaults to demo-course)')
45
- .action((type, name, options) => {
47
+ .option('-n, --non-interactive', 'Run without interactive prompts')
48
+ .option('-d, --difficulty <difficulty>', 'Difficulty level for course')
49
+ .option('-t, --time <time>', 'Estimated completion time for course')
50
+ .action(async (type, name, options) => {
46
51
  if (type === 'course') {
47
- addCourseCommand(name);
52
+ await addCourseCommand(name, options);
48
53
  }
49
54
  else if (type === 'lesson') {
50
- addLessonCommand(name, options.course || 'demo-course');
55
+ await addLessonCommand(name, options);
56
+ }
57
+ else if (type === 'page') {
58
+ const { addPageCommand } = await import('./commands/add.js');
59
+ await addPageCommand(name, options);
51
60
  }
52
61
  else {
53
- console.error('Invalid resource type. Use "course" or "lesson".');
62
+ console.error('Invalid resource type. Use "course", "lesson", or "page".');
54
63
  }
55
64
  });
65
+ program
66
+ .command('sync')
67
+ .description('Sync a directory of MDX files to update the learnmd.json lessons array')
68
+ .argument('<course>', 'Course name to sync')
69
+ .option('-n, --non-interactive', 'Run without interactive prompts')
70
+ .action((course, options) => {
71
+ syncCommand(course, options);
72
+ });
56
73
  program.parse();
57
74
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AACvC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AAE5B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,+CAA+C,CAAC;KAC5D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,8BAA8B,CAAC;KAC3C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;KAClC,MAAM,CAAC,2BAA2B,EAAE,iBAAiB,EAAE,SAAS,CAAC;KACjE,MAAM,CAAC,2BAA2B,EAAE,kBAAkB,EAAE,IAAI,CAAC;KAC7D,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,CAAC;KACrD,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,WAAW,CAAC;KAC1D,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,CAAC;KACrD,MAAM,CAAC,eAAe,EAAE,WAAW,EAAE,GAAG,CAAC;KACzC,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,sCAAsC,CAAC;KACnD,QAAQ,CAAC,QAAQ,EAAE,mCAAmC,CAAC;KACvD,QAAQ,CAAC,QAAQ,EAAE,4BAA4B,CAAC;KAChD,MAAM,CAAC,2BAA2B,EAAE,4DAA4D,CAAC;KACjG,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC9B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACpE,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@learnmd/cli",
3
- "version": "0.0.1-beta.1",
3
+ "version": "0.0.2-beta.0",
4
4
  "description": "CLI for creating and building LearnMD courses",
5
5
  "type": "module",
6
6
  "bin": {
@@ -10,6 +10,7 @@
10
10
  "module": "./dist/index.js",
11
11
  "types": "./dist/index.d.ts",
12
12
  "dependencies": {
13
+ "@clack/prompts": "^1.1.0",
13
14
  "chalk": "^5.3.0",
14
15
  "commander": "^12.0.0",
15
16
  "fs-extra": "^11.2.0",
@@ -19,18 +20,18 @@
19
20
  "marked": "^12.0.0",
20
21
  "minisearch": "^6.3.0",
21
22
  "vite": "^5.1.0",
22
- "@learnmd/core": "0.0.1-beta.1",
23
- "@learnmd/default-theme": "0.0.1-beta.1"
23
+ "@learnmd/core": "0.0.2-beta.0",
24
+ "@learnmd/default-theme": "0.0.2-beta.0"
24
25
  },
25
26
  "devDependencies": {
26
27
  "@types/fs-extra": "^11.0.4",
27
28
  "@types/inquirer": "^9.0.7",
28
29
  "@types/node": "^20.11.0",
30
+ "@vitest/coverage-v8": "^1.3.0",
29
31
  "eslint-plugin-import": "^2.32.0",
30
32
  "eslint-plugin-security": "^4.0.0",
31
33
  "typescript": "^5.4.0",
32
- "vitest": "^1.3.0",
33
- "@vitest/coverage-v8": "^1.3.0"
34
+ "vitest": "^1.3.0"
34
35
  },
35
36
  "keywords": [
36
37
  "learnmd",