@procamp/cli 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/command/generate.js +90 -69
- package/dist/command/generate.js.map +1 -1
- package/dist/command/validate.js +7 -1
- package/dist/command/validate.js.map +1 -1
- package/dist/constants/default-readme-content.d.ts +1 -0
- package/dist/constants/default-readme-content.js +11 -0
- package/dist/constants/default-readme-content.js.map +1 -0
- package/dist/constants/default-vm-config.d.ts +6 -0
- package/dist/constants/default-vm-config.js +10 -0
- package/dist/constants/default-vm-config.js.map +1 -0
- package/dist/utils/output.d.ts +2 -2
- package/dist/utils/output.js +5 -4
- package/dist/utils/output.js.map +1 -1
- package/package.json +3 -2
package/dist/command/generate.js
CHANGED
@@ -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
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
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
|
96
|
-
|
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(
|
99
|
-
.
|
100
|
-
|
101
|
-
|
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
|
-
|
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
|
-
|
114
|
-
|
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
|
119
|
-
|
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(
|
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
|
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
|
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
|
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"]}
|
package/dist/command/validate.js
CHANGED
@@ -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
|
-
|
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;
|
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,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"]}
|
package/dist/utils/output.d.ts
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
export declare function error(
|
2
|
-
export declare function success(
|
1
|
+
export declare function error(message: string): void;
|
2
|
+
export declare function success(message: string): void;
|
package/dist/utils/output.js
CHANGED
@@ -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
|
-
|
5
|
-
|
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(
|
9
|
-
|
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
|
package/dist/utils/output.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":";;;AAAA,SAAgB,KAAK,CAAC,
|
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.
|
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
|
-
"@
|
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",
|