diff --git a/package.json b/package.json index 57c962ce7..7e0f67159 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "packages:build": "lerna run build --ignore docz-example-*", "prerelease": "yarn run packages", "release": "lerna publish --conventional-commits", - "release:beta": "yarn release --npm-tag=beta --cd-version=prerelease --preid=beta" + "release:beta": "yarn release --npm-tag=beta --preid=beta" }, "devDependencies": { "del": "^3.0.0", diff --git a/packages/docz-core/src/DataServer.ts b/packages/docz-core/src/DataServer.ts index 54c8f2a2b..8e093179f 100644 --- a/packages/docz-core/src/DataServer.ts +++ b/packages/docz-core/src/DataServer.ts @@ -32,7 +32,7 @@ export class DataServer { const handleConnection = async (socket: WS) => { const update = this.updateEntries(entries, socket) - const map = await entries.getMap() + const map = await entries.get() watcher.on('change', async () => update(this.config)) watcher.on('unlink', async () => update(this.config)) @@ -89,7 +89,7 @@ export class DataServer { ): (config: Config) => Promise { return async config => { if (isSocketOpened(socket)) { - const map = await entries.getMap() + const map = await entries.get() await Entries.writeImports(map) socket.send(this.entriesData(map)) diff --git a/packages/docz-core/src/Entries.tsx b/packages/docz-core/src/Entries.tsx index fbb931d20..e5423c392 100644 --- a/packages/docz-core/src/Entries.tsx +++ b/packages/docz-core/src/Entries.tsx @@ -4,6 +4,7 @@ import * as path from 'path' import * as paths from './config/paths' import { touch, compiled } from './utils/fs' +import { mapToObj } from './utils/helpers' import { Entry, parseMdx } from './Entry' import { Plugin } from './Plugin' @@ -49,7 +50,9 @@ const writeAppFiles = async (config: Config, dev: boolean): Promise => { const writeImports = async (map: EntryMap): Promise => { const imports = await compiled(fromTemplates('imports.tpl.js')) - await touch(paths.importsJs, imports({ entries: Object.values(map) })) + const rawImportsJs = imports({ entries: Object.values(map) }) + + await touch(paths.importsJs, rawImportsJs) } const writeData = async (map: EntryMap, config: Config): Promise => { @@ -63,7 +66,18 @@ const writeData = async (map: EntryMap, config: Config): Promise => { await touch(paths.configJson, JSON.stringify(configObj, null, 2)) } -export type EntryMap = Record +export interface EntryObj { + id: string + filepath: string + slug: string + name: string + route: string + order: number + menu: string | null + [key: string]: any +} + +export type EntryMap = Record export class Entries { public static async writeApp(config: Config, dev?: boolean): Promise { @@ -79,19 +93,15 @@ export class Entries { await writeData(map, config) } - public all: EntryMap - public getMap: () => Promise + public all: Map + public get: () => Promise constructor(config: Config) { - this.all = {} - - this.getMap = async () => { - this.all = await this.get(config) - return this.all - } + this.all = new Map() + this.get = async () => this.getMap(config) } - private async get(config: Config): Promise { + private async getMap(config: Config): Promise { const { src, files: pattern } = config const ignoreGlob = '!node_modules' @@ -103,18 +113,22 @@ export class Entries { const createEntry = async (file: string) => { const ast = await parseMdx(file) - return new Entry(ast, file, src) + const { settings, ...entry } = new Entry(ast, file, src) + + return { + ...settings, + ...entry, + } } - const filesToReduce = await Promise.all( - files.filter(isEntry).map(createEntry) - ) + const map = new Map() + const entries = await Promise.all(files.filter(isEntry).map(createEntry)) - const reducer = (obj: EntryMap, entry: Entry) => ({ - ...obj, - [entry.filepath]: entry, - }) + for (const entry of entries) { + map.set(entry.filepath, entry) + } - return filesToReduce.reduce(reducer, {}) + this.all = map + return mapToObj(map) } } diff --git a/packages/docz-core/src/Entry.ts b/packages/docz-core/src/Entry.ts index 35555940e..ad1e578e8 100644 --- a/packages/docz-core/src/Entry.ts +++ b/packages/docz-core/src/Entry.ts @@ -22,23 +22,18 @@ export const parseMdx = (file: string): Promise => { return parser.run(parser.parse(raw)) } -const getFromParsedData = (value: string) => (ast: any) => { +const getParsedData = (ast: any) => { const node = find(ast, (node: any) => is('yaml', node)) - return get(node, `data.parsedValue.${value}`) + return get(node, `data.parsedValue`) } -const getName = getFromParsedData('name') -const getRoute = getFromParsedData('route') -const getMenu = getFromParsedData('menu') -const getOrder = getFromParsedData('order') -const getSettings = getFromParsedData('settings') - export class Entry { readonly [key: string]: any public static async check(file: string): Promise { const ast = await parseMdx(file) - return Boolean(getName(ast)) + const parsed = getParsedData(ast) + return Boolean(parsed && parsed.name) } public id: string @@ -46,21 +41,24 @@ export class Entry { public slug: string public route: string public name: string - public menu: string | null public order: number - public settings: any + public menu: string | null + public settings: { + [key: string]: any + } constructor(ast: any, file: string, src: string) { const filepath = this.getFilepath(file, src) + const parsed = getParsedData(ast) this.id = ulid() this.filepath = filepath this.slug = this.slugify(filepath) - this.route = this.getRoute(ast) - this.name = getName(ast) - this.menu = getMenu(ast) - this.order = parseInt(getOrder(ast), 10) || 0 - this.settings = getSettings(ast) || {} + this.route = this.getRoute(parsed) + this.name = parsed.name + this.order = parsed.order || 0 + this.menu = parsed.menu + this.settings = parsed } private getFilepath(file: string, src: string): string { @@ -75,7 +73,7 @@ export class Entry { return slugify(fileWithoutExt) } - private getRoute(ast: any): string { - return getRoute(ast) || `/${this.slug}` + private getRoute(parsed: any): string { + return parsed && parsed.route ? parsed.route : `/${this.slug}` } } diff --git a/packages/docz-core/src/commands/build.ts b/packages/docz-core/src/commands/build.ts index 9a1cb9d0f..394832888 100644 --- a/packages/docz-core/src/commands/build.ts +++ b/packages/docz-core/src/commands/build.ts @@ -12,7 +12,7 @@ export const build = async (args: Config) => { const config = loadConfig(args) const bundler = webpack(config, 'production') const entries = new Entries(config) - const map = await entries.getMap() + const map = await entries.get() const run = Plugin.runPluginsMethod(config.plugins) await fs.remove(paths.app) diff --git a/packages/docz-core/src/commands/dev.ts b/packages/docz-core/src/commands/dev.ts index e4866d1e9..2246cf67f 100644 --- a/packages/docz-core/src/commands/dev.ts +++ b/packages/docz-core/src/commands/dev.ts @@ -17,7 +17,7 @@ export const dev = async (args: Config) => { const config = loadConfig(args) const bundler = webpack(config, 'development') const entries = new Entries(config) - const map = await entries.getMap() + const map = await entries.get() const server = await bundler.createServer(bundler.getConfig()) const app = await server.start() diff --git a/packages/docz-core/src/utils/helpers.ts b/packages/docz-core/src/utils/helpers.ts index b38bf8f97..f54e17f5e 100644 --- a/packages/docz-core/src/utils/helpers.ts +++ b/packages/docz-core/src/utils/helpers.ts @@ -38,3 +38,9 @@ export function isArrEqual(arr: any[] | null, to: any[] | null): boolean { return equals } + +export const mapToObj = (map: Map) => + Array.from(map.entries()).reduce( + (obj, [key, value]) => ({ ...obj, [`${key}`]: value }), + {} + ) diff --git a/packages/docz/src/components/Docs.tsx b/packages/docz/src/components/Docs.tsx index bed24ef46..1e66708e1 100644 --- a/packages/docz/src/components/Docs.tsx +++ b/packages/docz/src/components/Docs.tsx @@ -48,6 +48,7 @@ export const Docs: React.SFC = ({ children }) => { const menus = getMenusFromEntries(entriesArr).sort((a, b) => sortBy(a, b) ) + const docs = entriesArr .sort((a, b) => sortBy(a.name, b.name)) .sort((a, b) => b.order - a.order) diff --git a/packages/docz/src/theme.tsx b/packages/docz/src/theme.tsx index 976198295..ef4417c58 100644 --- a/packages/docz/src/theme.tsx +++ b/packages/docz/src/theme.tsx @@ -22,11 +22,9 @@ export interface Entry { slug: string route: string name: string - menu: string | null order: number - settings: { - [key: string]: any - } + menu: string | null + [key: string]: any } export interface ThemeConfig {