Files
classroomio/packages/course-app/lib/scaffoldTemplate.ts
T
Rotimi Bestandemmanuel 26700dccd0 feat: introducing @classroomio/course-app (#490)
* feat: v1 templates

* update nvm

* working on the displaying the course content

* working on the displaying the course content

* displayed the content

* finished with the logic for rendering the content for all the courses and lessons

* post hog template UI is good to go

* classic and minimalistic template UI is good to go

* some refactoring

* some refactoring

* layout adjustments

* update tsconfig

* trying to get the filter to work well

* this is working now

* cleanup

* cleanup

* UI updates

* course page UI for posthog

* navbar and sidebar for course page in all templates complete

* all templates course page showing lesson content from md file with mdsvex
configured

* wokring on sections

* posthog lesson content done

* all templates fetches the lesson content from the section

* all templates properly typed

* scaffolding the new template

* finished the webflow-saas

* done with the webflow saas UI

* new calcom template

* new calcom template

* masonry layout for testitomonail section layout done

* calcom UI done

* UI all done

* cleanup

* trying to fix dark mode for the course page and home page

* done with this

* done with this

* working on tests

* migrated minimalistic template to svelte 5

* updated the syntax to svelte 5 for webflow

* migrated classic to svelte 5

* migrated posthog to svelte 5

* used svelte 5 syntax in calcom

* cli tool woks locally

* rename to course-sites

* use pnpm in root

* calcom refactoring

* remove unused files

* chore: biggest refactoring in my life

* add basic readme

* refactoring on course page

* restructure how courses are ordered

* proper state propagation

* add cf adapter

* fix pnpm i issue

* fix folder icon size

* use 18.17 version

* update npmrc

* add engine to packagejson

* pnpm install

* add engine to cio-com

* make it 18.x

* remove sequence

* move mdsvex to dependencies

* update lock

* mdsvex please work

* replace fs with import from vite

* add lock

* styling improvements

* fix styling

* sidebar style improvements

* fix: mobile concerns

* fix spacing of course header on desktop

* update header

* top nav fix

* feat: make cal template

* setup another template

* classic basic UI

* fixed the /courses fetching wrong page content

* fix breaking template cause of logo

* adding some updates

* improve styles theming

* finished updates from reviews

* updated the custom styling css

* clean up posthog template

* cli tool done, needs some cleaning though

* moved components to home

* improved the UI of the minimal template

* Add CLI tool and course app site

* prettier lint

* improve CLI

* ignore sveltekit folder

* publish course app

* fix tailwing theme + improve README

* finish up course-app site

* update README.md

---------

Co-authored-by: emmanuel <[email protected]>
2024-12-14 03:40:47 +01:00

92 lines
3.0 KiB
TypeScript

import chalk from 'chalk';
import ora from 'ora';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import { copyCoursesFolder } from '../utils/copyCoursesFolder';
import { copyFolderSync } from '../utils/copyFolder';
// Define the interface for function parameters
interface ScaffoldTemplateParams {
template: string; // Template name
courses: boolean; // Whether to include demo courses
projectPath: string; // Path to the project
projectName: string; // Name of the project
}
// Using require.resolve() instead of import.meta.url for better compatibility
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const packageRoot = path.join(__dirname, '..');
const spinner = ora();
export async function scaffoldTemplate({
template,
courses,
projectPath,
projectName
}: ScaffoldTemplateParams): Promise<void> {
spinner.text = chalk.yellow('Getting project...');
// Path to the entire template directory
const templateDirPath: string = path.resolve(packageRoot, 'src', 'template');
const coursePathToExclude: string = path.join(templateDirPath, 'src', 'courses');
// Check if the template directory exists
if (!fs.existsSync(templateDirPath)) {
throw new Error(`Template directory does not exist at "${templateDirPath}".`);
}
// Path to the specific template within the components directory
const specificTemplatePath: string = path.resolve(
templateDirPath,
'src',
'lib',
'components',
template
);
// Check if the specific template exists
if (!fs.existsSync(specificTemplatePath)) {
throw new Error(`Template "${template}" does not exist at "${specificTemplatePath}".`);
}
// Get all templates in the components directory
const allTemplates = fs
.readdirSync(path.join(templateDirPath, 'src', 'lib', 'components'))
.filter((file) =>
fs.statSync(path.join(templateDirPath, 'src', 'lib', 'components', file)).isDirectory()
);
// Exclude all templates except the selected one and the ui folder
const excludeTemplates = allTemplates.filter((temp) => temp !== template && temp !== 'ui');
// Copy the selected template files to the project path, excluding others
await copyFolderSync({
from: templateDirPath,
to: projectPath,
excludeNames: ['node_modules', '.svelte-kit', ...excludeTemplates], // Exclude node_modules if present
excludePath: coursePathToExclude
});
// If the user wants demo courses, copy the courses folder
spinner.text = chalk.yellow('Setting up courses folder...');
await copyCoursesFolder({ templatePath: templateDirPath, projectPath, courses });
console.log(
chalk.yellow(
`Project ${projectName} created using template "${template}" ${
courses ? 'with' : 'without'
} demo courses.`
)
);
console.log(
chalk.yellow(
`You can ${
courses
? 'edit or create new courses in the courses folder'
: 'create new courses in the courses folder'
}`
)
);
}