Skip to content

Commit

Permalink
refactor: add core module
Browse files Browse the repository at this point in the history
clode #133
close #108
close #98
close #61
  • Loading branch information
kamiazya committed Aug 24, 2021
1 parent 88d1e28 commit 3218097
Show file tree
Hide file tree
Showing 18 changed files with 301 additions and 172 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"lerna": "lerna",
"test": "jest",
"prebuild": "lerna run --parallel clean",
"build": "yarn workspace @rediagram/common build && yarn workspace create-rediagram-project build && yarn workspace @rediagram/cdk build && yarn workspace @rediagram/cli build && yarn workspace rediagram build && yarn workspace @rediagram/aws build && yarn workspace @rediagram/gcp build && yarn workspace @rediagram/firebase build",
"build": "yarn workspace @rediagram/common build && yarn workspace create-rediagram-project build && yarn workspace @rediagram/cdk build && yarn workspace rediagram build && yarn workspace @rediagram/cli build && yarn workspace @rediagram/aws build && yarn workspace @rediagram/gcp build && yarn workspace @rediagram/firebase build",
"prewatch": "yarn build",
"watch": "lerna run --parallel watch",
"rediagram": "yarn workspace @rediagram/cli start",
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/rollup.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ export default {
file: './lib/rediagramc.js',
},
],
external: ['commander', 'fast-glob', 'path', 'fs', 'sucrase/dist/register', '@rediagram/common', 'chokidar'],
external: ['commander', 'fast-glob', 'path', 'fs', 'sucrase/dist/register', 'rediagram', 'chokidar'],
plugins: [typescript()],
};
14 changes: 3 additions & 11 deletions packages/cli/src/rediagramc.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,15 @@
import cmd from 'commander';
import glob from 'fast-glob';
import chokidar from 'chokidar';
import { CONFIG } from '@rediagram/common';
import { Rediagram } from 'rediagram';
import { registerAll } from 'sucrase/dist/register';
import path from 'path';
import pkg from './pkg';

type Options = {
watch: boolean;
};

function runRediagram(src: string) {
// eslint-disable-next-line no-console
console.log(src);
const resolved = path.resolve(src);
// eslint-disable-next-line global-require, import/no-dynamic-require
require(resolved);
delete require.cache[resolved];
}
const runRediagram = Rediagram.run.bind(Rediagram);

cmd
.name('rediagramc')
Expand All @@ -29,7 +21,7 @@ cmd
const paths =
pattarns.length >= 1
? pattarns
: [...CONFIG.scope.getIncludesPattarns(), ...CONFIG.scope.getExcludesPattarns().map((p) => `!${p}`)];
: [...Rediagram.config.scope.includes, ...Rediagram.config.scope.excludes.map((p) => `!${p}`)];
if (this.watch) {
chokidar.watch(paths).on('add', runRediagram).on('change', runRediagram);
} else {
Expand Down
10 changes: 7 additions & 3 deletions packages/common/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,18 @@
"build": "rollup -c && prettier --write './lib/*'",
"watch": "tsc --watch"
},
"dependencies": {
"@ts-graphviz/node": "^0.4.0",
"@ts-graphviz/react": "^0.9.0",
"cosmiconfig": "^7.0.1",
"fs-extra": "^10.0.0",
"tslog": "^3.2.1"
},
"devDependencies": {
"rollup": "^2.55.0",
"rollup-plugin-delete": "^2.0.0",
"rollup-plugin-dts": "^3.0.2",
"rollup-plugin-typescript2": "^0.30.0",
"typescript": "^4.0.2"
},
"dependencies": {
"cosmiconfig": "^7.0.0"
}
}
2 changes: 1 addition & 1 deletion packages/common/rollup.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const options = [
file: './lib/index.js',
},
],
external: ['path', 'cosmiconfig'],
external: ['path', 'cosmiconfig', 'fs-extra', 'tslog', '@ts-graphviz/react', '@ts-graphviz/node'],
plugins: [typescript()],
},
{
Expand Down
38 changes: 38 additions & 0 deletions packages/common/src/config/beta1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/* eslint-disable @typescript-eslint/no-namespace */
import path from 'path';
import { Format } from '@ts-graphviz/node';
import { RediagramGlobalConfig } from './types';

export namespace beta1 {
export const version = 'beta1';

interface Config {
version: typeof version;
includes?: string[];
excludes?: string[];
output?: {
dir?: string;
type?: Format;
};
dot?: {
timeout?: number;
};
}

export function load(filepath: string, data: Config): RediagramGlobalConfig {
return {
filepath,
output: {
dir: path.resolve(path.dirname(filepath), data.output?.dir ?? '.'),
format: data.output?.type ?? 'png',
},
scope: {
includes: data.includes ?? ['**/*.rediagram.{jsx,tsx}'],
excludes: data.excludes ?? ['**/node_modules/**/*'],
},
dot: {
timeout: data.dot?.timeout ?? 10_000,
},
};
}
}
17 changes: 17 additions & 0 deletions packages/common/src/config/default.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { RediagramGlobalConfig } from './types';

export function createDefaultConfig(): RediagramGlobalConfig {
return {
filepath: null,
scope: {
includes: ['**/*.rediagram.{jsx,tsx}'],
excludes: ['**/node_modules/**/*'],
},
output: {
format: 'png',
},
dot: {
timeout: 10_000,
},
};
}
103 changes: 4 additions & 99 deletions packages/common/src/config/index.ts
Original file line number Diff line number Diff line change
@@ -1,99 +1,4 @@
/* eslint-disable @typescript-eslint/no-var-requires */
/* eslint-disable import/no-dynamic-require */
/* eslint-disable global-require */
/* eslint-disable @typescript-eslint/ban-types */
/* eslint-disable @typescript-eslint/no-namespace */
/* eslint-disable no-useless-constructor */
/* eslint-disable max-classes-per-file */
import path from 'path';
import { cosmiconfigSync } from 'cosmiconfig';
import { Beta1 } from './version';

export class OutputConfig {
constructor(private readonly data?: { dir?: string }) {}

public getDir(): string {
return this.data?.dir ?? process.cwd();
}
}

export class ScopeConfig {
constructor(private readonly data?: { includes?: string[]; excludes?: string[] }) {}

public getIncludesPattarns(): string[] {
return this.data?.includes ?? ['**/*.rediagram.{jsx,tsx}'];
}

public getExcludesPattarns(): string[] {
return this.data?.excludes ?? ['**/node_modules/**/*'];
}
}

export class DotConfig {
constructor(private readonly data?: { timeout?: number }) {}

public getTimeout(): number {
return this.data?.timeout ?? 10_000;
}
}

export type RediagramGlobalConfig = {
readonly filepath: string | null;
readonly output: OutputConfig;
readonly scope: ScopeConfig;
readonly dot: DotConfig;
};

const MODULE_NAME = 'rediagram';

function createDefaultConfig(): RediagramGlobalConfig {
return {
filepath: null,
scope: new ScopeConfig(),
output: new OutputConfig(),
dot: new DotConfig(),
};
}

namespace beta1 {
type Config = {
version: Beta1;
includes?: string[];
excludes?: string[];
output?: {
dir?: string;
};
dot?: {
timeout?: number;
};
};

export function load(filepath: string, data: Config): RediagramGlobalConfig {
return {
filepath,
output: new OutputConfig({
dir: path.resolve(path.dirname(filepath), data.output?.dir ?? '.'),
}),
scope: new ScopeConfig({
includes: data.includes,
excludes: data.excludes,
}),
dot: new DotConfig({
timeout: data.dot?.timeout,
}),
};
}
}

function loadConfig(): RediagramGlobalConfig {
const { search } = cosmiconfigSync(MODULE_NAME);
const result = search();
if (result !== null) {
if (result.config.version === 'beta1') {
return beta1.load(result.filepath, result.config);
}
}
return createDefaultConfig();
}

export const CONFIG = loadConfig();
export * from './beta1';
export * from './default';
export * from './types';
export * from './utils';
16 changes: 16 additions & 0 deletions packages/common/src/config/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Format } from '@ts-graphviz/node';

export type RediagramGlobalConfig = {
filepath: string | null;
scope: Readonly<{
includes: ReadonlyArray<string>;
excludes: ReadonlyArray<string>;
}>;
output: Readonly<{
dir?: string;
format: Format;
}>;
dot: Readonly<{
timeout: number;
}>;
};
17 changes: 17 additions & 0 deletions packages/common/src/config/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { cosmiconfigSync } from 'cosmiconfig';
import { RediagramGlobalConfig } from './types';
import { beta1 } from './beta1';
import { createDefaultConfig } from './default';

const MODULE_NAME = 'rediagram';

export function loadConfigfile(): RediagramGlobalConfig {
const { search } = cosmiconfigSync(MODULE_NAME);
const result = search();
switch (result?.config.version) {
case beta1.version:
return beta1.load(result.filepath, result.config);
default:
return createDefaultConfig();
}
}
1 change: 1 addition & 0 deletions packages/common/src/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from './config';
export * from './rediagram';
75 changes: 75 additions & 0 deletions packages/common/src/rediagram/core.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import path from 'path';
import { ensureDir } from 'fs-extra';
import { Logger } from 'tslog';
import { ReactElement } from 'react';
import { renderToDot } from '@ts-graphviz/react';
import { exportToFile } from '@ts-graphviz/node';
import { RediagramGlobalConfig, loadConfigfile } from '../config';
import { RenderOption } from './types';

export class RediagramCore {
public static readonly MODULE_NAME = 'rediagram';

private static instance?: RediagramCore;

public logger = new Logger({
type: 'pretty',
name: 'rediagram',
displayDateTime: false,
displayFilePath: 'hidden',
displayFunctionName: false,
});

public static create(): RediagramCore {
if (!this.instance) {
const config = loadConfigfile();
this.instance = new RediagramCore(config);
}
return this.instance;
}

public readonly config: Readonly<RediagramGlobalConfig>;

constructor({ ...config }: RediagramGlobalConfig) {
this.config = Object.freeze(config);

this.logger.info(
'Config file is',
config.filepath ? `"./${path.relative(process.cwd(), config.filepath)}".` : 'not exist.',
);
}

public async render(element: ReactElement, options: RenderOption): Promise<void> {
const dot = renderToDot(element);
const dir = options.dir ?? this.config.output.dir;
const format = options.format ?? this.config.output.format;
const output = path.format({
dir,
name: options.name,
ext: `.${format}`,
});
if (dir !== undefined) {
await ensureDir(dir);
}
this.logger.info('Output', path.relative(process.cwd(), output));
await exportToFile(dot, {
format,
output,
childProcessOptions: {
timeout: this.config.dot.timeout,
},
});
}

public async run(src: string): Promise<void> {
try {
this.logger.info('Runing', src);
const resolved = path.resolve(src);
// eslint-disable-next-line global-require, import/no-dynamic-require
require(resolved);
delete require.cache[resolved];
} catch (err) {
this.logger.error(err);
}
}
}
2 changes: 2 additions & 0 deletions packages/common/src/rediagram/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './types';
export * from './core';
16 changes: 16 additions & 0 deletions packages/common/src/rediagram/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Format } from '@ts-graphviz/node';

export type RenderOption = {
/**
* Output destination directory.
*/
dir?: string;
/**
* Output file name.
*/
name: string;
/**
* Output file format.
*/
format?: Format;
};
3 changes: 3 additions & 0 deletions packages/rediagram/src/core.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { RediagramCore } from '@rediagram/common';

export const Rediagram = RediagramCore.create();
Loading

0 comments on commit 3218097

Please sign in to comment.