@procamp/cli 0.0.8 → 0.0.9

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.
@@ -40,85 +40,106 @@ const fs = __importStar(require("fs-extra"));
40
40
  const inquirer_1 = __importDefault(require("inquirer"));
41
41
  const yaml = __importStar(require("js-yaml"));
42
42
  const path = __importStar(require("path"));
43
- const output_1 = require("../utils/output");
44
- const getUserId_1 = require("../utils/getUserId");
45
43
  const process = __importStar(require("process"));
46
- const deleteFolder = (srcDir, arrayObject) => __awaiter(void 0, void 0, void 0, function* () {
47
- if (yield fs.exists(srcDir)) {
48
- const entries = yield fs.readdir(srcDir, { withFileTypes: true });
49
- const directories = entries
50
- .filter((dirent) => dirent.isDirectory())
51
- .map((dirent) => dirent.name);
52
- const names = arrayObject.map((obj) => obj.title);
53
- let deleteFolder = [];
54
- for (const directory of directories) {
55
- const dir = directory
56
- .toString()
57
- .slice(directory.toString().indexOf('-') + 1)
58
- .replaceAll('-', ' ');
59
- if (!names.includes(dir)) {
60
- deleteFolder.push(directory);
61
- }
62
- }
63
- if (deleteFolder.length !== 0) {
64
- const { confirm } = yield inquirer_1.default.prompt({
65
- type: 'confirm',
66
- message: `We found folders not listed in the structure of your course: \n ${deleteFolder} \n Do you want to delete them ?`,
67
- name: 'confirm',
68
- default: 'y'
69
- });
70
- if (confirm) {
71
- for (const directory of deleteFolder) {
72
- yield fs.rm(path.join(srcDir, directory), {
73
- recursive: true,
74
- force: true
75
- });
76
- }
77
- console.log('Unlisted folders deleted');
78
- }
79
- else {
80
- console.log('Deletion aborted.');
81
- return;
82
- }
83
- }
84
- }
85
- });
86
- const updateCourse = (srcDir, fileDir, object, i) => __awaiter(void 0, void 0, void 0, function* () {
87
- if (yield fs.exists(srcDir)) {
88
- const entries = yield fs.readdir(srcDir, { withFileTypes: true });
89
- if (entries.length === 0)
90
- yield fs.ensureDir(fileDir);
91
- else {
44
+ const default_readme_content_1 = require("../constants/default-readme-content");
45
+ const default_vm_config_1 = require("../constants/default-vm-config");
46
+ const getUserId_1 = require("../utils/getUserId");
47
+ const output_1 = require("../utils/output");
48
+ const knownFiles = ['common'];
49
+ function deleteFolder(srcDir, arrayObject) {
50
+ return __awaiter(this, void 0, void 0, function* () {
51
+ if (yield fs.exists(srcDir)) {
52
+ const entries = yield fs.readdir(srcDir, { withFileTypes: true });
92
53
  const directories = entries
93
54
  .filter((dirent) => dirent.isDirectory())
94
55
  .map((dirent) => dirent.name);
95
- const file = directories.find((file) => {
96
- return (file
56
+ const names = arrayObject.map((obj) => obj.title);
57
+ let unknowFolders = [];
58
+ for (const directory of directories) {
59
+ if (knownFiles.includes(directory)) {
60
+ continue;
61
+ }
62
+ const dir = directory
97
63
  .toString()
98
- .slice(file.toString().indexOf('-') + 1)
99
- .localeCompare(object.title.toString().replaceAll(' ', '-')) === 0);
100
- });
101
- if (file) {
102
- const filePath = path.join(srcDir, file);
103
- if (Number(file.toString().slice(0, file.toString().indexOf('-'))) !==
104
- i + 1) {
105
- yield fs.move(filePath, fileDir, { overwrite: true });
64
+ .slice(directory.toString().indexOf('-') + 1)
65
+ .replaceAll('-', ' ');
66
+ if (!names.includes(dir)) {
67
+ unknowFolders.push(directory);
106
68
  }
107
69
  }
108
- else {
70
+ if (unknowFolders.length !== 0) {
71
+ const { confirm } = yield inquirer_1.default.prompt({
72
+ type: 'confirm',
73
+ message: `We found folders not listed in the structure of your course: \n ${unknowFolders} \n Do you want to delete them ?`,
74
+ name: 'confirm',
75
+ default: 'y'
76
+ });
77
+ if (confirm) {
78
+ for (const folder of unknowFolders) {
79
+ yield fs.rm(path.join(srcDir, folder), {
80
+ recursive: true,
81
+ force: true
82
+ });
83
+ }
84
+ console.log('Unlisted folders deleted');
85
+ }
86
+ else {
87
+ console.log('Deletion aborted.');
88
+ return;
89
+ }
90
+ }
91
+ }
92
+ });
93
+ }
94
+ function writeReadmeFile(baseDir) {
95
+ return __awaiter(this, void 0, void 0, function* () {
96
+ yield fs.writeFile(`${baseDir}/README.md`, default_readme_content_1.DefaultReadmeContent);
97
+ });
98
+ }
99
+ function updateCourse(srcDir, fileDir, object, i) {
100
+ return __awaiter(this, void 0, void 0, function* () {
101
+ if (yield fs.exists(srcDir)) {
102
+ const entries = yield fs.readdir(srcDir, { withFileTypes: true });
103
+ if (entries.length === 0)
109
104
  yield fs.ensureDir(fileDir);
105
+ else {
106
+ const directories = entries
107
+ .filter((dirent) => dirent.isDirectory())
108
+ .map((dirent) => dirent.name);
109
+ const file = directories.find((file) => {
110
+ return (file
111
+ .toString()
112
+ .slice(file.toString().indexOf('-') + 1)
113
+ .localeCompare(object.title.toString().replaceAll(' ', '-')) === 0);
114
+ });
115
+ if (file) {
116
+ const filePath = path.join(srcDir, file);
117
+ if (Number(file.toString().slice(0, file.toString().indexOf('-'))) !==
118
+ i + 1) {
119
+ yield fs.move(filePath, fileDir, { overwrite: true });
120
+ }
121
+ }
122
+ else {
123
+ yield fs.ensureDir(fileDir);
124
+ }
110
125
  }
111
126
  }
112
- }
113
- else
114
- yield fs.mkdir(fileDir);
115
- });
127
+ else
128
+ yield fs.mkdir(fileDir);
129
+ });
130
+ }
116
131
  function generateCourse(courseName) {
117
132
  return __awaiter(this, void 0, void 0, function* () {
118
- const configFile = path.join(process.cwd(), 'blueprint.yaml');
119
- if (yield fs.exists(configFile)) {
133
+ const blueprintFilePath = path.join(process.cwd(), 'blueprint.yaml');
134
+ const commonPath = path.join(process.cwd(), 'common');
135
+ const vmConfigFilePath = path.join(commonPath, '.procamp-vm.json');
136
+ yield fs.ensureDir(commonPath);
137
+ if (!(yield fs.exists(vmConfigFilePath))) {
138
+ yield fs.writeFile(vmConfigFilePath, JSON.stringify(default_vm_config_1.DefaultVmConfig, null, 2));
139
+ }
140
+ if (yield fs.exists(blueprintFilePath)) {
120
141
  const baseDir = courseName === '.' ? process.cwd() : courseName;
121
- const fileContents = yield fs.readFile(configFile, 'utf8');
142
+ const fileContents = yield fs.readFile(blueprintFilePath, 'utf8');
122
143
  const courses = yaml.load(fileContents);
123
144
  const courseData = Object.assign({}, courses);
124
145
  try {
@@ -137,7 +158,7 @@ function generateCourse(courseName) {
137
158
  yield fs.writeJson(`${baseDir}/meta.json`, meta, {
138
159
  spaces: 2
139
160
  });
140
- yield fs.writeFile(`${baseDir}/README.md`, '');
161
+ yield writeReadmeFile(baseDir);
141
162
  }
142
163
  if ('chapters' in courseData) {
143
164
  const chapters = courseData.chapters;
@@ -181,7 +202,7 @@ function generateCourse(courseName) {
181
202
  .toString()
182
203
  .padStart(2, '0')}-${assessment.title.replace(/[:\s]+/g, '-')}`;
183
204
  yield updateCourse(lessonDir, assessmentDir, assessment, k);
184
- yield fs.writeFile(`${assessmentDir}/README.md`, '');
205
+ yield writeReadmeFile(assessmentDir);
185
206
  yield fs.ensureDir(`${assessmentDir}/app-a`);
186
207
  if (assessment.solution === true)
187
208
  yield fs.ensureDir(`${assessmentDir}/app-b`);
@@ -192,7 +213,7 @@ function generateCourse(courseName) {
192
213
  .toString()
193
214
  .padStart(2, '0')}-${lesson.title.replace(/[:\s]+/g, '-')}`;
194
215
  yield fs.ensureDir(assessmentDir);
195
- yield fs.writeFile(`${assessmentDir}/README.md`, '');
216
+ yield writeReadmeFile(assessmentDir);
196
217
  yield fs.ensureDir(`${assessmentDir}/app-a`);
197
218
  }
198
219
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/command/generate.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs-extra';\nimport inquirer from 'inquirer';\nimport * as yaml from 'js-yaml';\nimport * as path from 'path';\nimport { course, courseInfo } from '../interfaces/course';\nimport { error } from '../utils/output';\nimport { getUserId } from '../utils/getUserId';\nimport * as process from 'process';\n\nconst deleteFolder = async (srcDir: string, arrayObject) => {\n if (await fs.exists(srcDir)) {\n const entries = await fs.readdir(srcDir, { withFileTypes: true });\n const directories = entries\n .filter((dirent) => dirent.isDirectory())\n .map((dirent) => dirent.name);\n const names = arrayObject.map((obj) => obj.title);\n let deleteFolder: string[] = [];\n for (const directory of directories) {\n const dir = directory\n .toString()\n .slice(directory.toString().indexOf('-') + 1)\n .replaceAll('-', ' ');\n if (!names.includes(dir)) {\n deleteFolder.push(directory);\n }\n }\n if (deleteFolder.length !== 0) {\n const { confirm } = await inquirer.prompt({\n type: 'confirm',\n message: `We found folders not listed in the structure of your course: \\n ${deleteFolder} \\n Do you want to delete them ?`,\n name: 'confirm',\n default: 'y'\n });\n\n if (confirm) {\n for (const directory of deleteFolder) {\n await fs.rm(path.join(srcDir, directory), {\n recursive: true,\n force: true\n });\n }\n console.log('Unlisted folders deleted');\n } else {\n console.log('Deletion aborted.');\n return;\n }\n }\n }\n};\n\nconst updateCourse = async (\n srcDir: string,\n fileDir: string,\n object,\n i: number\n) => {\n if (await fs.exists(srcDir)) {\n const entries = await fs.readdir(srcDir, { withFileTypes: true });\n if (entries.length === 0) await fs.ensureDir(fileDir);\n else {\n const directories = entries\n .filter((dirent) => dirent.isDirectory())\n .map((dirent) => dirent.name);\n const file = directories.find((file) => {\n return (\n file\n .toString()\n .slice(file.toString().indexOf('-') + 1)\n .localeCompare(object.title.toString().replaceAll(' ', '-')) === 0\n );\n });\n\n if (file) {\n const filePath = path.join(srcDir, file);\n if (\n Number(file.toString().slice(0, file.toString().indexOf('-'))) !==\n i + 1\n ) {\n await fs.move(filePath, fileDir, { overwrite: true });\n }\n } else {\n await fs.ensureDir(fileDir);\n }\n }\n } else await fs.mkdir(fileDir);\n};\n\nexport async function generateCourse(courseName: string) {\n const configFile = path.join(process.cwd(), 'blueprint.yaml');\n if (await fs.exists(configFile)) {\n const baseDir = courseName === '.' ? process.cwd() : courseName;\n const fileContents = await fs.readFile(configFile, 'utf8');\n const courses: any = yaml.load(fileContents);\n const courseData: course = { ...courses };\n\n try {\n let configContent = getUserId();\n\n await fs.ensureDir(baseDir);\n\n if (await fs.exists(baseDir)) {\n const courseInfo = courseData.course;\n const meta: courseInfo = {\n title: baseDir,\n author: courseInfo.author,\n description: courseInfo.description,\n version: courseInfo.version,\n courseId: courseInfo.courseId,\n userId: configContent ? configContent.userId : ''\n };\n\n await fs.writeJson(`${baseDir}/meta.json`, meta, {\n spaces: 2\n });\n await fs.writeFile(`${baseDir}/README.md`, '');\n }\n\n if ('chapters' in courseData) {\n const chapters = courseData.chapters;\n await deleteFolder(baseDir, chapters);\n for (let i = 0; i < chapters.length; i++) {\n const chapter = chapters[i];\n const chapterDir = `${baseDir}/${(i + 1)\n .toString()\n .padStart(2, '0')}-${chapter.title.replace(/[:\\s]+/g, '-')}`;\n await updateCourse(baseDir, chapterDir, chapter, i);\n\n // Create meta.json for chapter\n const chapterMeta = {\n title: chapter.title,\n order: i + 1\n };\n\n await fs.writeJson(`${chapterDir}/meta.json`, chapterMeta, {\n spaces: 2\n });\n\n if ('lessons' in chapter) {\n const lessons = chapter.lessons;\n await deleteFolder(chapterDir, lessons);\n for (let j = 0; j < lessons.length; j++) {\n const lesson = lessons[j];\n const lessonDir = `${chapterDir}/${(j + 1)\n .toString()\n .padStart(2, '0')}-${lesson.title.replace(/[:\\s]+/g, '-')}`;\n await updateCourse(chapterDir, lessonDir, lesson, j);\n\n // Create meta.json for lesson\n const lessonMeta = {\n title: lesson.title,\n objectives: lesson.objectives,\n order: j + 1\n };\n await fs.writeJson(`${lessonDir}/meta.json`, lessonMeta, {\n spaces: 2\n });\n\n if ('assessments' in lesson) {\n const assessments = lesson.assessments;\n await deleteFolder(lessonDir, assessments);\n for (let k = 0; k < assessments.length; k++) {\n const assessment = assessments[k];\n const assessmentDir = `${lessonDir}/${(k + 1)\n .toString()\n .padStart(2, '0')}-${assessment.title.replace(\n /[:\\s]+/g,\n '-'\n )}`;\n await updateCourse(lessonDir, assessmentDir, assessment, k);\n\n await fs.writeFile(`${assessmentDir}/README.md`, '');\n\n // Create app-a and app-b folders inside assessment folder\n await fs.ensureDir(`${assessmentDir}/app-a`);\n\n if (assessment.solution === true)\n await fs.ensureDir(`${assessmentDir}/app-b`);\n }\n } else {\n const assessmentDir = `${lessonDir}/${(1)\n .toString()\n .padStart(2, '0')}-${lesson.title.replace(/[:\\s]+/g, '-')}`;\n await fs.ensureDir(assessmentDir);\n await fs.writeFile(`${assessmentDir}/README.md`, '');\n // Create app-a folders inside assessment folder\n await fs.ensureDir(`${assessmentDir}/app-a`);\n }\n }\n } else return error(`I can't find lessons in the chapter ${i + 1}`);\n }\n } else return error(\"You haven't chapters in your blueprint.yaml\");\n\n console.log('Folder structure created');\n } catch (err) {\n error('Error creating folder structure: ' + err);\n }\n } else return error('We need the blueprint.yaml file to create a course');\n}\n"]}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/command/generate.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs-extra';\nimport inquirer from 'inquirer';\nimport * as yaml from 'js-yaml';\nimport * as path from 'path';\nimport * as process from 'process';\nimport { DefaultReadmeContent } from '../constants/default-readme-content';\nimport { DefaultVmConfig } from '../constants/default-vm-config';\nimport { course, courseInfo } from '../interfaces/course';\nimport { getUserId } from '../utils/getUserId';\nimport { error } from '../utils/output';\n\nconst knownFiles = ['common'];\n\nasync function deleteFolder(srcDir: string, arrayObject) {\n if (await fs.exists(srcDir)) {\n const entries = await fs.readdir(srcDir, { withFileTypes: true });\n const directories = entries\n .filter((dirent) => dirent.isDirectory())\n .map((dirent) => dirent.name);\n const names = arrayObject.map((obj) => obj.title);\n let unknowFolders: string[] = [];\n for (const directory of directories) {\n if (knownFiles.includes(directory)) {\n continue;\n }\n\n const dir = directory\n .toString()\n .slice(directory.toString().indexOf('-') + 1)\n .replaceAll('-', ' ');\n if (!names.includes(dir)) {\n unknowFolders.push(directory);\n }\n }\n\n if (unknowFolders.length !== 0) {\n const { confirm } = await inquirer.prompt({\n type: 'confirm',\n message: `We found folders not listed in the structure of your course: \\n ${unknowFolders} \\n Do you want to delete them ?`,\n name: 'confirm',\n default: 'y'\n });\n\n if (confirm) {\n for (const folder of unknowFolders) {\n await fs.rm(path.join(srcDir, folder), {\n recursive: true,\n force: true\n });\n }\n console.log('Unlisted folders deleted');\n } else {\n console.log('Deletion aborted.');\n return;\n }\n }\n }\n}\n\nasync function writeReadmeFile(baseDir: string) {\n await fs.writeFile(`${baseDir}/README.md`, DefaultReadmeContent);\n}\n\nasync function updateCourse(\n srcDir: string,\n fileDir: string,\n object: any,\n i: number\n) {\n if (await fs.exists(srcDir)) {\n const entries = await fs.readdir(srcDir, { withFileTypes: true });\n if (entries.length === 0) await fs.ensureDir(fileDir);\n else {\n const directories = entries\n .filter((dirent) => dirent.isDirectory())\n .map((dirent) => dirent.name);\n const file = directories.find((file) => {\n return (\n file\n .toString()\n .slice(file.toString().indexOf('-') + 1)\n .localeCompare(object.title.toString().replaceAll(' ', '-')) === 0\n );\n });\n\n if (file) {\n const filePath = path.join(srcDir, file);\n if (\n Number(file.toString().slice(0, file.toString().indexOf('-'))) !==\n i + 1\n ) {\n await fs.move(filePath, fileDir, { overwrite: true });\n }\n } else {\n await fs.ensureDir(fileDir);\n }\n }\n } else await fs.mkdir(fileDir);\n}\n\nexport async function generateCourse(courseName: string) {\n const blueprintFilePath = path.join(process.cwd(), 'blueprint.yaml');\n const commonPath = path.join(process.cwd(), 'common');\n const vmConfigFilePath = path.join(commonPath, '.procamp-vm.json');\n\n await fs.ensureDir(commonPath);\n\n if (!(await fs.exists(vmConfigFilePath))) {\n await fs.writeFile(\n vmConfigFilePath,\n JSON.stringify(DefaultVmConfig, null, 2)\n );\n }\n\n if (await fs.exists(blueprintFilePath)) {\n const baseDir = courseName === '.' ? process.cwd() : courseName;\n const fileContents = await fs.readFile(blueprintFilePath, 'utf8');\n const courses: any = yaml.load(fileContents);\n const courseData: course = { ...courses };\n\n try {\n let configContent = getUserId();\n\n await fs.ensureDir(baseDir);\n\n if (await fs.exists(baseDir)) {\n const courseInfo = courseData.course;\n const meta: courseInfo = {\n title: baseDir,\n author: courseInfo.author,\n description: courseInfo.description,\n version: courseInfo.version,\n courseId: courseInfo.courseId,\n userId: configContent ? configContent.userId : ''\n };\n\n await fs.writeJson(`${baseDir}/meta.json`, meta, {\n spaces: 2\n });\n await writeReadmeFile(baseDir);\n }\n\n if ('chapters' in courseData) {\n const chapters = courseData.chapters;\n await deleteFolder(baseDir, chapters);\n for (let i = 0; i < chapters.length; i++) {\n const chapter = chapters[i];\n const chapterDir = `${baseDir}/${(i + 1)\n .toString()\n .padStart(2, '0')}-${chapter.title.replace(/[:\\s]+/g, '-')}`;\n await updateCourse(baseDir, chapterDir, chapter, i);\n\n // Create meta.json for chapter\n const chapterMeta = {\n title: chapter.title,\n order: i + 1\n };\n\n await fs.writeJson(`${chapterDir}/meta.json`, chapterMeta, {\n spaces: 2\n });\n\n if ('lessons' in chapter) {\n const lessons = chapter.lessons;\n await deleteFolder(chapterDir, lessons);\n for (let j = 0; j < lessons.length; j++) {\n const lesson = lessons[j];\n const lessonDir = `${chapterDir}/${(j + 1)\n .toString()\n .padStart(2, '0')}-${lesson.title.replace(/[:\\s]+/g, '-')}`;\n await updateCourse(chapterDir, lessonDir, lesson, j);\n\n // Create meta.json for lesson\n const lessonMeta = {\n title: lesson.title,\n objectives: lesson.objectives,\n order: j + 1\n };\n await fs.writeJson(`${lessonDir}/meta.json`, lessonMeta, {\n spaces: 2\n });\n\n if ('assessments' in lesson) {\n const assessments = lesson.assessments;\n await deleteFolder(lessonDir, assessments);\n for (let k = 0; k < assessments.length; k++) {\n const assessment = assessments[k];\n const assessmentDir = `${lessonDir}/${(k + 1)\n .toString()\n .padStart(2, '0')}-${assessment.title.replace(\n /[:\\s]+/g,\n '-'\n )}`;\n await updateCourse(lessonDir, assessmentDir, assessment, k);\n\n await writeReadmeFile(assessmentDir);\n\n // Create app-a and app-b folders inside assessment folder\n await fs.ensureDir(`${assessmentDir}/app-a`);\n\n if (assessment.solution === true)\n await fs.ensureDir(`${assessmentDir}/app-b`);\n }\n } else {\n const assessmentDir = `${lessonDir}/${(1)\n .toString()\n .padStart(2, '0')}-${lesson.title.replace(/[:\\s]+/g, '-')}`;\n await fs.ensureDir(assessmentDir);\n await writeReadmeFile(assessmentDir);\n // Create app-a folders inside assessment folder\n await fs.ensureDir(`${assessmentDir}/app-a`);\n }\n }\n } else return error(`I can't find lessons in the chapter ${i + 1}`);\n }\n } else return error(\"You haven't chapters in your blueprint.yaml\");\n\n console.log('Folder structure created');\n } catch (err) {\n error('Error creating folder structure: ' + err);\n }\n } else return error('We need the blueprint.yaml file to create a course');\n}\n"]}
@@ -10,10 +10,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.validate = void 0;
13
+ const console_utils_1 = require("@jfonx/console-utils");
13
14
  const course_validator_1 = require("@procamp/course-validator");
14
15
  function validate() {
15
16
  return __awaiter(this, void 0, void 0, function* () {
16
- yield (0, course_validator_1.validateCourse)(process.cwd());
17
+ try {
18
+ yield (0, course_validator_1.validateCourse)(process.cwd());
19
+ }
20
+ catch (error) {
21
+ console_utils_1.Output.error(error.message, true);
22
+ }
17
23
  });
18
24
  }
19
25
  exports.validate = validate;
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/command/validate.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gEAA2D;AAE3D,SAAsB,QAAQ;;QAC5B,MAAM,IAAA,iCAAc,EAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACtC,CAAC;CAAA;AAFD,4BAEC","sourcesContent":["import { validateCourse } from '@procamp/course-validator';\n\nexport async function validate() {\n await validateCourse(process.cwd());\n}\n"]}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/command/validate.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wDAA8C;AAC9C,gEAA2D;AAE3D,SAAsB,QAAQ;;QAC5B,IAAI;YACF,MAAM,IAAA,iCAAc,EAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;SACrC;QAAC,OAAO,KAAK,EAAE;YACd,sBAAM,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SAC9C;IACH,CAAC;CAAA;AAND,4BAMC","sourcesContent":["import { Output } from '@jfonx/console-utils';\nimport { validateCourse } from '@procamp/course-validator';\n\nexport async function validate() {\n try {\n await validateCourse(process.cwd());\n } catch (error) {\n Output.error((error as Error).message, true);\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare const DefaultReadmeContent: string;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultReadmeContent = void 0;
4
+ exports.DefaultReadmeContent = `
5
+ ---
6
+ title: ___PLEASE_UPDATE___
7
+ ---
8
+
9
+ # TITLE
10
+ `.trim();
11
+ //# sourceMappingURL=default-readme-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-readme-content.js","sourceRoot":"","sources":["../../src/constants/default-readme-content.ts"],"names":[],"mappings":";;;AAAa,QAAA,oBAAoB,GAAG;;;;;;CAMnC,CAAC,IAAI,EAAE,CAAC","sourcesContent":["export const DefaultReadmeContent = `\n---\ntitle: ___PLEASE_UPDATE___\n---\n\n# TITLE\n`.trim();\n"]}
@@ -0,0 +1,6 @@
1
+ export declare const DefaultVmConfig: {
2
+ start: string;
3
+ previewPort: number;
4
+ containerType: string;
5
+ containerImage: string;
6
+ };
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultVmConfig = void 0;
4
+ exports.DefaultVmConfig = {
5
+ start: '',
6
+ previewPort: 0,
7
+ containerType: 'local',
8
+ containerImage: 'procamp/procamp-node'
9
+ };
10
+ //# sourceMappingURL=default-vm-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-vm-config.js","sourceRoot":"","sources":["../../src/constants/default-vm-config.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG;IAC7B,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,CAAC;IACd,aAAa,EAAE,OAAO;IACtB,cAAc,EAAE,sBAAsB;CACvC,CAAC","sourcesContent":["export const DefaultVmConfig = {\n start: '',\n previewPort: 0,\n containerType: 'local',\n containerImage: 'procamp/procamp-node'\n};\n"]}
@@ -1,2 +1,2 @@
1
- export declare function error(err: string): void;
2
- export declare function success(res: string): void;
1
+ export declare function error(message: string): void;
2
+ export declare function success(message: string): void;
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.success = exports.error = void 0;
4
- function error(err) {
5
- console.error('camp \x1b[31m%s\x1b[0m', 'ERR!', err);
4
+ const console_utils_1 = require("@jfonx/console-utils");
5
+ function error(message) {
6
+ console_utils_1.Output.error('ERR: ' + message);
6
7
  }
7
8
  exports.error = error;
8
- function success(res) {
9
- console.error('camp \x1b[32m%s\x1b[0m', 'SUCCESS!', res);
9
+ function success(message) {
10
+ console_utils_1.Output.success('SUCCESS: ' + message);
10
11
  }
11
12
  exports.success = success;
12
13
  //# sourceMappingURL=output.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":";;;AAAA,SAAgB,KAAK,CAAC,GAAW;IAC/B,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;AACvD,CAAC;AAFD,sBAEC;AAED,SAAgB,OAAO,CAAC,GAAW;IACjC,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;AAC3D,CAAC;AAFD,0BAEC","sourcesContent":["export function error(err: string) {\n console.error('camp \\x1b[31m%s\\x1b[0m', 'ERR!', err);\n}\n\nexport function success(res: string) {\n console.error('camp \\x1b[32m%s\\x1b[0m', 'SUCCESS!', res);\n}\n"]}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":";;;AAAA,wDAA8C;AAE9C,SAAgB,KAAK,CAAC,OAAe;IACnC,sBAAM,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC;AAClC,CAAC;AAFD,sBAEC;AAED,SAAgB,OAAO,CAAC,OAAe;IACrC,sBAAM,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC;AACxC,CAAC;AAFD,0BAEC","sourcesContent":["import { Output } from '@jfonx/console-utils';\n\nexport function error(message: string) {\n Output.error('ERR: ' + message);\n}\n\nexport function success(message: string) {\n Output.success('SUCCESS: ' + message);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@procamp/cli",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "description": "Procamp CLI",
5
5
  "main": "dist/index.js",
6
6
  "files": [
@@ -41,7 +41,8 @@
41
41
  "typescript": "^5.0.4"
42
42
  },
43
43
  "dependencies": {
44
- "@procamp/course-validator": "^1.0.3",
44
+ "@jfonx/console-utils": "^1.0.3",
45
+ "@procamp/course-validator": "^1.0.4",
45
46
  "adm-zip": "^0.5.10",
46
47
  "axios": "^1.4.0",
47
48
  "commander": "^10.0.1",