Skip to content

Commit

Permalink
feat(core): add tty progress and compilation feature #OSP-163
Browse files Browse the repository at this point in the history
  • Loading branch information
why520crazy committed Sep 17, 2021
1 parent 8193714 commit 53ab771
Show file tree
Hide file tree
Showing 34 changed files with 840 additions and 391 deletions.
4 changes: 3 additions & 1 deletion packages/cli/src/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import * as fs from 'fs';
import * as path from 'path';
import { yargsOptionsGenerate } from './util/yargs-options-generate';
import { Option } from '@angular/cli/models/interface';
import { VERSION } from './version';
const ngBuildOptions: Option[] = JSON.parse(fs.readFileSync(path.resolve(__dirname, './ng-build-options.json')).toString());
export const buildCommand: CommandModule = {
command: ['build'],
Expand Down Expand Up @@ -36,7 +37,8 @@ export const buildCommand: CommandModule = {
const docgeni = new Docgeni({
watch: argv.watch,
config,
cmdArgs: normalizeCommandArgsForAngular(config, ngBuildOptions)
cmdArgs: normalizeCommandArgsForAngular(config, ngBuildOptions),
version: VERSION
});
await docgeni.run();
}
Expand Down
4 changes: 3 additions & 1 deletion packages/cli/src/serve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import * as fs from 'fs';
import * as path from 'path';
import { yargsOptionsGenerate } from './util/yargs-options-generate';
import { Option } from '@angular/cli/models/interface';
import { VERSION } from './version';

const ngServeOptions: Option[] = JSON.parse(fs.readFileSync(path.resolve(__dirname, './ng-serve-options.json')).toString());

Expand Down Expand Up @@ -33,7 +34,8 @@ export const serveCommand: CommandModule = {
const docgeni = new Docgeni({
watch: true,
config,
cmdArgs: normalizeCommandArgsForAngular(config, ngServeOptions)
cmdArgs: normalizeCommandArgsForAngular(config, ngServeOptions),
version: VERSION
});
await docgeni.run();
}
Expand Down
2 changes: 2 additions & 0 deletions packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"@angular-devkit/core": "~11.2.14",
"@angular-devkit/schematics": "~11.2.14",
"@docgeni/toolkit": "^1.1.0-next.4",
"@types/text-table": "^0.2.2",
"chokidar": "^3.3.1",
"cosmiconfig": "^6.0.0",
"fancy-log": "^1.3.3",
Expand All @@ -42,6 +43,7 @@
"prismjs": "^1.20.0",
"semver": "7.3.2",
"tapable": "^1.1.3",
"text-table": "^0.2.0",
"through2": "^3.0.1",
"ts-morph": "^7.0.2",
"vinyl": "^2.2.0",
Expand Down
5 changes: 3 additions & 2 deletions packages/core/src/builders/components-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { DocgeniContext } from '../docgeni.interface';
import { DocgeniHost } from '../docgeni-host';
import { toolkit } from '@docgeni/toolkit';
import { normalize, relative, resolve, HostWatchEventType } from '../fs';
import { getSummaryStr } from '../utils';

export interface ComponentDef {
name: string;
Expand Down Expand Up @@ -69,11 +70,11 @@ export class ComponentsBuilder {
if (!this.docgeni.watch) {
return;
}
toolkit.print.info(`Components: start watching ${this.componentsSourcePath}`);
// toolkit.print.info(`Components: start watching ${this.componentsSourcePath}`);
return this.docgeni.host.watch(this.componentsSourcePath, { ignoreInitial: true, recursive: true }).subscribe(async item => {
try {
const type: HostWatchEventType = item.type as any;
toolkit.print.info(`Components: ${item.path}, type: ${HostWatchEventType[item.type]}`);
toolkit.print.info(`Components: ${getSummaryStr(item.path)}, type: ${HostWatchEventType[item.type]}`);
const { name, componentPath } = this.getComponentOfFile(item.path);
if (!name) {
return;
Expand Down
24 changes: 8 additions & 16 deletions packages/core/src/builders/doc-file.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ describe('DocSourceFile', () => {
base: root,
locale: 'zh-cn'
},
docgeniHost,
undefined
docgeniHost
);
});

Expand All @@ -44,8 +43,7 @@ describe('DocSourceFile', () => {
base: root,
locale: 'zh-cn'
},
docgeniHost,
undefined
docgeniHost
);
expect(() => {
const name = docSourceFile.name;
Expand Down Expand Up @@ -84,8 +82,7 @@ describe('DocSourceFile', () => {
base: root,
locale: 'zh-cn'
},
docgeniHost,
undefined
docgeniHost
);
});

Expand Down Expand Up @@ -130,8 +127,7 @@ describe('DocSourceFile', () => {
base: root,
locale: 'zh-cn'
},
docgeniHost,
undefined
docgeniHost
);
await docSourceFile.build();
expect(docSourceFile.output).toContain(`<p>getting-started content</p>`);
Expand All @@ -152,8 +148,7 @@ describe('DocSourceFile', () => {
base: root,
locale: 'zh-cn'
},
docgeniHost,
undefined
docgeniHost
);
await docSourceFile.build();
await docSourceFile.emit('/dest/root');
Expand All @@ -175,8 +170,7 @@ describe('DocSourceFile', () => {
base: root,
locale: 'zh-cn'
},
docgeniHost,
undefined
docgeniHost
);
await docSourceFile.build();
await docSourceFile.emit('/dest/root');
Expand All @@ -198,8 +192,7 @@ describe('DocSourceFile', () => {
base: root,
locale: 'zh-cn'
},
docgeniHost,
undefined
docgeniHost
);
await docSourceFile.build();
await docSourceFile.emit('/dest/root');
Expand All @@ -221,8 +214,7 @@ describe('DocSourceFile', () => {
base: root,
locale: 'zh-cn'
},
docgeniHost,
undefined
docgeniHost
);
expect(docSourceFile.isEmpty()).toEqual(true);
await docSourceFile.build();
Expand Down
6 changes: 3 additions & 3 deletions packages/core/src/builders/doc-file.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { DocType } from '../enums';
import { Markdown } from '../markdown';
import { normalize, relative } from '@angular-devkit/core';
import { DocgeniHost } from '../docgeni-host';
import { DocgeniConfig } from '../interfaces';

export interface DocSourceFileOptions {
cwd: string;
Expand All @@ -26,7 +25,7 @@ export class DocSourceFile<TMeta extends DocMeta = DocMeta> {
public type: DocType;
public content: string;
public meta?: TMeta;
public output: string;
public output: string = '';
/**
* @example "docs/guide/getting-started.md" when base is cwd and path=/../docs/guide/getting-started.md
*/
Expand Down Expand Up @@ -68,7 +67,7 @@ export class DocSourceFile<TMeta extends DocMeta = DocMeta> {
return path.basename(this.path, this.extname);
}

constructor(options: DocSourceFileOptions, host: DocgeniHost, private docConfig: DocgeniConfig) {
constructor(options: DocSourceFileOptions, host: DocgeniHost) {
this.cwd = options.cwd;
this.base = options.base;
this.path = options.path;
Expand Down Expand Up @@ -103,6 +102,7 @@ export class DocSourceFile<TMeta extends DocMeta = DocMeta> {
}
this.outputPath = outputPath;
this.emitted = true;
return { outputPath, content: this.output };
}

public async clear() {
Expand Down
64 changes: 39 additions & 25 deletions packages/core/src/builders/docs-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,40 +5,49 @@ import path from 'path';
import { toolkit } from '@docgeni/toolkit';
import { Locale } from '../interfaces';
import chokidar from 'chokidar';
import { FileEmitter } from './emitter';

export class DocsBuilder {
export class DocsBuilder extends FileEmitter {
private docFiles = new Map<string, DocSourceFile>();

private watchers: chokidar.FSWatcher[] = [];

public hooks = {
buildDoc: new SyncHook<DocSourceFile>(['docBuilder']),
buildDocSucceed: new SyncHook<DocSourceFile>(['docBuilder']),
buildDocs: new AsyncSeriesHook<DocsBuilder>(['docsBuilder']),
buildDocsSucceed: new SyncHook<DocsBuilder>(['docsBuilder'])
};

private get config() {
return this.docgeni.config;
}

public get docs() {
return this.docFiles;
get size() {
return this.docFiles.size;
}

constructor(private docgeni: DocgeniContext) {
super();
}

constructor(private docgeni: DocgeniContext) {}
public async run() {
await this.initialize();
await this.build();
await this.emit();
}

public async build() {
public async initialize() {
for (const locale of this.config.locales) {
await this.buildForLocale(locale);
await this.initializeDocFiles(locale);
}
}

this.hooks.buildDocsSucceed.call(this);
public async build(docs: DocSourceFile[] = Array.from(this.docFiles.values())) {
this.docgeni.hooks.docsBuild.call(this, docs);
for (const doc of docs) {
await this.buildDoc(doc);
}
this.docgeni.hooks.docsBuildSucceed.call(this, docs);
}

public async emit() {
public async onEmit() {
for (const file of this.docFiles.values()) {
await file.emit(this.docgeni.paths.absSiteAssetsContentPath);
const { outputPath, content } = await file.emit(this.docgeni.paths.absSiteAssetsContentPath);
this.addEmitFile(outputPath, content);
}
}

Expand All @@ -55,6 +64,10 @@ export class DocsBuilder {
return Array.from(this.docFiles.values());
}

public getDoc(absPath: string) {
return this.docFiles.get(absPath);
}

public watch() {
if (this.docgeni.watch) {
for (const locale of this.config.locales) {
Expand Down Expand Up @@ -87,12 +100,12 @@ export class DocsBuilder {
}

private async buildDoc(docFileBuilder: DocSourceFile) {
this.hooks.buildDoc.call(docFileBuilder);
this.docgeni.hooks.docBuild.call(docFileBuilder);
await docFileBuilder.build();
this.hooks.buildDocSucceed.call(docFileBuilder);
this.docgeni.hooks.docBuildSucceed.call(docFileBuilder);
}

private async buildForLocale(locale: Locale) {
private async initializeDocFiles(locale: Locale) {
const localeDocsPath = this.getLocaleDocsPath(locale);
const ignoreGlobs = this.getIgnoreGlobs(locale.key);

Expand All @@ -101,11 +114,10 @@ export class DocsBuilder {
root: localeDocsPath,
exclude: ignoreGlobs
});
// build all doc files
// init all doc files
for (const filepath of allFiles) {
const docFile = this.createDocSourceFile(locale, filepath);
this.docFiles.set(docFile.path, docFile);
await this.buildDoc(docFile);
}
}

Expand All @@ -127,8 +139,11 @@ export class DocsBuilder {
docFile = this.createDocSourceFile(locale, absFilePath);
this.docFiles.set(docFile.path, docFile);
}
await this.buildDoc(docFile);
this.hooks.buildDocsSucceed.call(this);
this.docgeni.compile({
docs: [docFile]
});
// await this.buildDoc(docFile);
// this.docgeni.hooks.docsBuildSucceed.call(this, [docFile]);
});
});
}
Expand All @@ -141,8 +156,7 @@ export class DocsBuilder {
base: this.docgeni.paths.cwd,
path: absFilePath
},
this.docgeni.host,
this.docgeni.config
this.docgeni.host
);
}
}
29 changes: 29 additions & 0 deletions packages/core/src/builders/emitter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { EmitFile, EmitFiles } from '../types';

export abstract class FileEmitter<T = unknown> {
protected emitted: boolean;
protected emitFiles: EmitFiles;
abstract onEmit(objects?: T[]): Promise<void>;

async emit(objects?: T[]): Promise<EmitFiles> {
if (this.emitted) {
return {};
}
this.emitFiles = {};
await this.onEmit(objects);
this.emitted = true;
return this.emitFiles;
}

protected async addEmitFiles(adds: EmitFiles) {
Object.assign(this.emitFiles, adds);
}

protected async addEmitFile(path: string, file: EmitFile | string) {
this.emitFiles[path] = file;
}

protected async resetEmitted() {
this.emitted = false;
}
}

0 comments on commit 53ab771

Please sign in to comment.