Skip to content

Commit

Permalink
Merge pull request #64 from tuatmcc/develop
Browse files Browse the repository at this point in the history
develop
  • Loading branch information
OJII3 authored Nov 17, 2023
2 parents bb33fed + 83cafb6 commit 3141a7e
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 38 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mdorganizer",
"version": "2.1.3",
"version": "2.1.4",
"description": "A cli tool to convert Markdown into TypeScript Module",
"author": "tuatmcc",
"license": "MIT",
Expand Down
6 changes: 3 additions & 3 deletions src/mdorganizer.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { TypeGenerator } from './typegen';
import { ModuleGenerator } from './modulegen';
import { type DocumentConfig, type UserConfig } from './types';
import { type CategoryConfig, type UserConfig } from './types';
import { writeFile, mkdir } from 'fs/promises';

export class MdOrganizer {
private typeGenerator: TypeGenerator;
private moduleGenerator: ModuleGenerator;
private documentConfigs: DocumentConfig[];
private documentConfigs: CategoryConfig[];

constructor(config: UserConfig) {
this.typeGenerator = new TypeGenerator(config);
Expand Down Expand Up @@ -43,12 +43,12 @@ export class MdOrganizer {

async generateAllModules(): Promise<void> {
const categoryModules = await this.moduleGenerator.generateAll();
console.log(categoryModules);
for (const categoryModule of categoryModules) {
for (const doc of categoryModule.documentModules) {
await writeFile(
`.mdorganizer/generated/${categoryModule.documentCategory}/${doc.documentId}.ts`,
doc.generatedModuleString,
{ flag: 'w+' },
);
}

Expand Down
54 changes: 33 additions & 21 deletions src/modulegen.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserConfig, DocumentConfig } from '@/types';
import { UserConfig, CategoryConfig } from '@/types';
import { glob } from 'glob';
import { readFile } from 'fs/promises';
import graymatter from 'gray-matter';
Expand All @@ -15,35 +15,47 @@ export type CategoryModule = {
};

export class ModuleGenerator {
private documentConfigs: DocumentConfig[];
private categoryConfigs: CategoryConfig[];
private categoryModules: CategoryModule[];

constructor(userConfig: UserConfig) {
this.documentConfigs = userConfig.documents;
this.categoryConfigs = userConfig.documents;
this.categoryModules = userConfig.documents.map((docuementConfig) => ({
documentCategory: docuementConfig.documentCategory,
documentModules: [],
}));
}

async generateAll(): Promise<CategoryModule[]> {
for (const documentConfig of this.documentConfigs) {
const paths = await glob(documentConfig.globPattern);
const documentModules: DocumentModule[] = [];
paths.forEach(async (path) => {
try {
documentModules.push({
rootPath: path,
documentId: `${path
.replace(/\\/g, '/')
.replaceAll('/', '_')
.replace('.md', '')}`,
generatedModuleString: await this.generate(path, documentConfig),
});
} catch (e) {
console.log(`Skipping ${path} due to error: ${e.message}`);
}
});
for (const categoryConfig of this.categoryConfigs) {
const paths = await glob(categoryConfig.globPattern);
// generate modules for each document
const documentModules = await Promise.all(
paths
.map(async (path) => {
try {
return {
rootPath: path,
documentId: `${path
.replace(/\\/g, '/')
.replaceAll('/', '_')
.replace('.md', '')}`,
generatedModuleString: await this.generate(
path,
categoryConfig,
),
} satisfies DocumentModule;
} catch (e) {
console.log(`Skipping ${path} due to error: ${e.message}`);
return null;
}
})
.filter((documentModule) => documentModule !== null),
);

console.log(
`Generated ${documentModules.length} modules for ${categoryConfig.documentCategory}`,
);

this.categoryModules = this.categoryModules.map((categoryModule) => {
return {
Expand All @@ -66,7 +78,7 @@ export class ModuleGenerator {
*/
async generate(
rootPath: string,
documentConfig: DocumentConfig,
documentConfig: CategoryConfig,
): Promise<string> {
const { data, content } = graymatter(await readFile(rootPath, 'utf8'));
// validate data against FieldsConfig
Expand Down
18 changes: 9 additions & 9 deletions src/typegen.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
import { DocumentConfig, UserConfig } from '@/types';
import { CategoryConfig, UserConfig } from '@/types';

export type DocumentCategoryType = {
documentCategory: string;
generatedTypeString: string;
};

export class TypeGenerator {
private documentConfigs: DocumentConfig[];
private categoryConfigs: CategoryConfig[];
private generatedTypes: DocumentCategoryType[] = [];

constructor(config: UserConfig) {
this.documentConfigs = config.documents;
this.categoryConfigs = config.documents;
}

generateAll(): DocumentCategoryType[] {
this.generatedTypes = this.documentConfigs.map((docsumentConfig) => {
this.generatedTypes = this.categoryConfigs.map((docsumentConfig) => {
return {
documentCategory: docsumentConfig.documentCategory,
generatedTypeString: this.generate(docsumentConfig),
Expand All @@ -23,19 +23,19 @@ export class TypeGenerator {
return this.generatedTypes;
}

generate(documentConfig: DocumentConfig): string {
generate(categoryConfig: CategoryConfig): string {
// Make sure the document type is capitalized
const documentCategory =
documentConfig.documentCategory.charAt(0).toUpperCase() +
documentConfig.documentCategory.slice(1);
categoryConfig.documentCategory.charAt(0).toUpperCase() +
categoryConfig.documentCategory.slice(1);
let fields = `export type ${documentCategory}Document = {\n`;
fields += ` documentCategory: string;\n`;
fields += ` globPattern: string;\n`;
fields += ` rootPath: string;\n`;
fields += ` content: string;\n`;
fields += ` fields: {\n`;
for (const key in documentConfig.fields) {
const fieldConfig = documentConfig.fields[key];
for (const key in categoryConfig.fields) {
const fieldConfig = categoryConfig.fields[key];
const required = fieldConfig.required ? '' : '?';
fields += ` ${key}${required}: ${fieldConfig.type};\n`;
}
Expand Down
4 changes: 2 additions & 2 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export type FieldConfig = {
after?: (value: any) => typeof value;
};

export type DocumentConfig = {
export type CategoryConfig = {
globPattern: string;
documentCategory: string;
fields: {
Expand All @@ -31,5 +31,5 @@ export type Document = {
};

export type UserConfig = {
documents: DocumentConfig[];
documents: CategoryConfig[];
};
4 changes: 2 additions & 2 deletions tests/mock/mdorganizer.config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { DocumentConfig } from '@/types';
import { CategoryConfig } from '@/types';

const blog: DocumentConfig = {
const blog: CategoryConfig = {
documentCategory: 'blog',
globPattern: 'tests/mock/content/blog/**/index.md',
fields: {
Expand Down

0 comments on commit 3141a7e

Please sign in to comment.