refactor(v2): add common typing package @docusaurus/types (#1797)

* add common typing package `@docusaurus/typing-common`
.

* change name to `@docusaurus/types`

* refactor `packages/docusaurus/src/server/types`

* use directly `index.d.ts`
.

* add missing dependency `@docusaurus/types` on `@docusaurus/core`

* add missing dependency `@types/webpack`

* fix mistaken type

* typing package move to dev dependency

* Update package.json

see https://stackoverflow.com/questions/45176661/how-do-i-decide-whether-types-goes-into-dependencies-or-devdependencies
This commit is contained in:
Dongwoo Gim 2019-09-25 18:48:56 +09:00 committed by Endi
parent 0397f7b719
commit 961eb44ab1
28 changed files with 81 additions and 113 deletions

View file

@ -10,6 +10,9 @@
"access": "public" "access": "public"
}, },
"license": "MIT", "license": "MIT",
"devDependencies": {
"@docusaurus/types": "^2.0.0-alpha.24"
},
"dependencies": { "dependencies": {
"@docusaurus/mdx-loader": "^2.0.0-alpha.24", "@docusaurus/mdx-loader": "^2.0.0-alpha.24",
"@docusaurus/utils": "^2.0.0-alpha.24", "@docusaurus/utils": "^2.0.0-alpha.24",

View file

@ -8,7 +8,7 @@
import fs from 'fs-extra'; import fs from 'fs-extra';
import path from 'path'; import path from 'path';
import pluginContentBlog from '../index'; import pluginContentBlog from '../index';
import {DocusaurusConfig} from '../typesDocusaurus'; import {DocusaurusConfig} from '@docusaurus/types';
describe('loadBlog', () => { describe('loadBlog', () => {
test('simple website', async () => { test('simple website', async () => {

View file

@ -19,13 +19,13 @@ import {
BlogContent, BlogContent,
BlogItemsToModules, BlogItemsToModules,
TagsModule, TagsModule,
ConfigureWebpackUtils,
} from './types'; } from './types';
import { import {
LoadContext, LoadContext,
PluginContentLoadedActions, PluginContentLoadedActions,
RouteModule, RouteModule,
} from './typesDocusaurus'; ConfigureWebpackUtils,
} from '@docusaurus/types';
import {Configuration} from 'webpack'; import {Configuration} from 'webpack';
// YYYY-MM-DD-{name}.mdx? // YYYY-MM-DD-{name}.mdx?
@ -57,7 +57,7 @@ export default function pluginContentBlog(
context: LoadContext, context: LoadContext,
opts: Partial<PluginOptions>, opts: Partial<PluginOptions>,
) { ) {
const options = {...DEFAULT_OPTIONS, ...opts}; const options: PluginOptions = {...DEFAULT_OPTIONS, ...opts};
const contentPath = path.resolve(context.siteDir, options.path); const contentPath = path.resolve(context.siteDir, options.path);
return { return {
@ -79,7 +79,7 @@ export default function pluginContentBlog(
return null; return null;
} }
const {baseUrl} = siteConfig; const {baseUrl = ''} = siteConfig;
const blogFiles = await globby(include, { const blogFiles = await globby(include, {
cwd: blogDir, cwd: blogDir,
}); });

View file

@ -1,5 +1,3 @@
import {Loader} from 'webpack';
export interface BlogContent { export interface BlogContent {
blogPosts: BlogPost[]; blogPosts: BlogPost[];
blogListPaginated: BlogPaginated[]; blogListPaginated: BlogPaginated[];
@ -80,14 +78,3 @@ export interface TagModule {
count: number; count: number;
permalink: string; permalink: string;
} }
export interface ConfigureWebpackUtils {
getStyleLoaders: (
isServer: boolean,
cssOptions: {
[key: string]: any;
},
) => Loader[];
getCacheLoader: (isServer: boolean, cacheOptions?: {}) => Loader | null;
getBabelLoader: (isServer: boolean, babelOptions?: {}) => Loader;
}

View file

@ -1,63 +0,0 @@
import {ParsedUrlQueryInput} from 'querystring';
export interface DocusaurusConfig {
baseUrl: string;
favicon?: string;
tagline?: string;
title: string;
url: string;
organizationName?: string;
projectName?: string;
githubHost?: string;
plugins?: PluginConfig[];
themes?: PluginConfig[];
presets?: PresetConfig[];
themeConfig?: {
[key: string]: any;
};
customFields?: {
[key: string]: any;
};
}
export type PluginConfig = [string, Object | undefined] | string;
export type PresetConfig = [string, Object | undefined] | string;
export interface CLIOptions {
[option: string]: any;
}
export interface LoadContext {
siteDir: string;
generatedFilesDir?: string;
siteConfig: DocusaurusConfig;
cliOptions?: CLIOptions;
outDir?: string;
baseUrl?: string;
}
export interface PluginContentLoadedActions {
addRoute(config: RouteConfig): void;
createData(name: string, data: Object): Promise<string>;
}
export type Module =
| {
path: string;
__import?: boolean;
query?: ParsedUrlQueryInput;
}
| string;
export interface RouteModule {
[module: string]: Module | RouteModule | RouteModule[];
}
export interface RouteConfig {
path: string;
component: string;
modules?: RouteModule;
routes?: RouteConfig[];
exact?: boolean;
}

View file

@ -0,0 +1,15 @@
{
"name": "@docusaurus/types",
"version": "2.0.0-alpha.24",
"description": "Common used typings for Docusaurus packages",
"main": "./src/index.js",
"types": "./src/index.d.ts",
"publishConfig": {
"access": "public"
},
"license": "MIT",
"dependencies": {
"@types/webpack": "^4.32.0",
"querystring": "0.2.0"
}
}

View file

@ -1,5 +1,5 @@
import {Loader, Configuration} from 'webpack';
import {ParsedUrlQueryInput} from 'querystring'; import {ParsedUrlQueryInput} from 'querystring';
import {Configuration} from 'webpack';
export interface DocusaurusConfig { export interface DocusaurusConfig {
baseUrl: string; baseUrl: string;
@ -21,12 +21,16 @@ export interface DocusaurusConfig {
}; };
} }
export interface DocusaurusContext {
siteConfig?: Partial<DocusaurusConfig>;
}
export interface Preset { export interface Preset {
plugins?: PluginConfig[]; plugins?: PluginConfig[];
themes?: PluginConfig[]; themes?: PluginConfig[];
} }
export type PresetConfig = [string, Object | undefined] | string; export type PresetConfig = [string, Object] | [string] | string;
export interface CLIOptions { export interface CLIOptions {
[option: string]: any; [option: string]: any;
@ -35,7 +39,7 @@ export interface CLIOptions {
export interface LoadContext { export interface LoadContext {
siteDir: string; siteDir: string;
generatedFilesDir: string; generatedFilesDir: string;
siteConfig: DocusaurusConfig; siteConfig: Partial<DocusaurusConfig>;
cliOptions: CLIOptions; cliOptions: CLIOptions;
outDir: string; outDir: string;
baseUrl: string; baseUrl: string;
@ -68,7 +72,8 @@ export interface Plugin<T> {
getPathsToWatch?(): string[]; getPathsToWatch?(): string[];
getClientModules?(): string[]; getClientModules?(): string[];
} }
export type PluginConfig = [string, Object | undefined] | string;
export type PluginConfig = [string, Object] | [string] | string;
export interface ChunkRegistry { export interface ChunkRegistry {
importStatement: string; importStatement: string;
@ -98,3 +103,14 @@ export interface RouteConfig {
export interface ThemeAlias { export interface ThemeAlias {
[alias: string]: string; [alias: string]: string;
} }
export interface ConfigureWebpackUtils {
getStyleLoaders: (
isServer: boolean,
cssOptions: {
[key: string]: any;
},
) => Loader[];
getCacheLoader: (isServer: boolean, cacheOptions?: {}) => Loader | null;
getBabelLoader: (isServer: boolean, babelOptions?: {}) => Loader;
}

View file

@ -0,0 +1,3 @@
/* eslint-disable */
'use strict';
Object.defineProperty(exports, '__esModule', {value: true});

View file

@ -28,6 +28,9 @@
"bugs": { "bugs": {
"url": "https://github.com/facebook/Docusaurus/issues" "url": "https://github.com/facebook/Docusaurus/issues"
}, },
"devDependencies": {
"@docusaurus/types": "^2.0.0-alpha.24"
},
"dependencies": { "dependencies": {
"@babel/core": "^7.6.2", "@babel/core": "^7.6.2",
"@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-dynamic-import": "^7.2.0",

View file

@ -6,6 +6,6 @@
*/ */
import * as React from 'react'; import * as React from 'react';
import {DocusaurusContext} from '../types'; import {DocusaurusContext} from '@docusaurus/types';
export default React.createContext<DocusaurusContext>({}); export default React.createContext<DocusaurusContext>({});

View file

@ -7,7 +7,7 @@
import {useContext} from 'react'; import {useContext} from 'react';
import context from './context'; import context from './context';
import {DocusaurusContext} from '../types'; import {DocusaurusContext} from '@docusaurus/types';
function useDocusaurusContext(): DocusaurusContext { function useDocusaurusContext(): DocusaurusContext {
return useContext(context); return useContext(context);

View file

@ -1,5 +0,0 @@
import {DocusaurusConfig} from '../server/types';
export interface DocusaurusContext {
siteConfig?: DocusaurusConfig;
}

View file

@ -16,7 +16,7 @@ import {BundleAnalyzerPlugin} from 'webpack-bundle-analyzer';
import merge from 'webpack-merge'; import merge from 'webpack-merge';
import {STATIC_DIR_NAME} from '../constants'; import {STATIC_DIR_NAME} from '../constants';
import {load} from '../server'; import {load} from '../server';
import {CLIOptions, Props} from '../server/types'; import {CLIOptions, Props} from '@docusaurus/types';
import {createClientConfig} from '../webpack/client'; import {createClientConfig} from '../webpack/client';
import {createServerConfig} from '../webpack/server'; import {createServerConfig} from '../webpack/server';
import {applyConfigureWebpack} from '../webpack/utils'; import {applyConfigureWebpack} from '../webpack/utils';

View file

@ -20,7 +20,7 @@ import WebpackDevServer from 'webpack-dev-server';
import merge from 'webpack-merge'; import merge from 'webpack-merge';
import HotModuleReplacementPlugin from 'webpack/lib/HotModuleReplacementPlugin'; import HotModuleReplacementPlugin from 'webpack/lib/HotModuleReplacementPlugin';
import {load} from '../server'; import {load} from '../server';
import {CLIOptions} from '../server/types'; import {CLIOptions} from '@docusaurus/types';
import {CONFIG_FILE_NAME, STATIC_DIR_NAME, DEFAULT_PORT} from '../constants'; import {CONFIG_FILE_NAME, STATIC_DIR_NAME, DEFAULT_PORT} from '../constants';
import {createClientConfig} from '../webpack/client'; import {createClientConfig} from '../webpack/client';
import {applyConfigureWebpack} from '../webpack/utils'; import {applyConfigureWebpack} from '../webpack/utils';

View file

@ -8,7 +8,6 @@
import path from 'path'; import path from 'path';
import {loadClientModules} from '../index'; import {loadClientModules} from '../index';
import {LoadContext} from '../../index';
const pluginEmpty = require('./__fixtures__/plugin-empty'); const pluginEmpty = require('./__fixtures__/plugin-empty');
const pluginFooBar = require('./__fixtures__/plugin-foo-bar'); const pluginFooBar = require('./__fixtures__/plugin-foo-bar');

View file

@ -6,7 +6,7 @@
*/ */
import _ from 'lodash'; import _ from 'lodash';
import {Plugin} from '../types'; import {Plugin} from '@docusaurus/types';
export function loadClientModules(plugins: Plugin<any>[]): string[] { export function loadClientModules(plugins: Plugin<any>[]): string[] {
return _.compact( return _.compact(

View file

@ -10,7 +10,7 @@ import importFresh from 'import-fresh';
import _ from 'lodash'; import _ from 'lodash';
import path from 'path'; import path from 'path';
import {CONFIG_FILE_NAME} from '../constants'; import {CONFIG_FILE_NAME} from '../constants';
import {DocusaurusConfig, PluginConfig} from './types'; import {DocusaurusConfig, PluginConfig} from '@docusaurus/types';
const REQUIRED_FIELDS = ['baseUrl', 'favicon', 'tagline', 'title', 'url']; const REQUIRED_FIELDS = ['baseUrl', 'favicon', 'tagline', 'title', 'url'];

View file

@ -26,7 +26,7 @@ import {
LoadContext, LoadContext,
PluginConfig, PluginConfig,
Props, Props,
} from './types'; } from '@docusaurus/types';
export async function load( export async function load(
siteDir: string, siteDir: string,

View file

@ -7,7 +7,7 @@
import path from 'path'; import path from 'path';
import {load} from './index'; import {load} from './index';
import {Props} from './types'; import {Props} from '@docusaurus/types';
// Helper methods to setup dummy/fake projects // Helper methods to setup dummy/fake projects
export const loadSetup = async (name: string): Promise<Props> => { export const loadSetup = async (name: string): Promise<Props> => {

View file

@ -16,7 +16,7 @@ import {
PluginConfig, PluginConfig,
PluginContentLoadedActions, PluginContentLoadedActions,
RouteConfig, RouteConfig,
} from '../types'; } from '@docusaurus/types';
export async function loadPlugins({ export async function loadPlugins({
pluginConfigs, pluginConfigs,

View file

@ -8,7 +8,7 @@
import path from 'path'; import path from 'path';
import {loadPresets} from '../index'; import {loadPresets} from '../index';
import {LoadContext} from '../../index'; import {DocusaurusConfig, LoadContext} from '@docusaurus/types';
describe('loadPresets', () => { describe('loadPresets', () => {
test('no presets', () => { test('no presets', () => {
@ -86,7 +86,7 @@ describe('loadPresets', () => {
siteConfig: { siteConfig: {
presets: [[path.join(__dirname, '__fixtures__/preset-bar.js')]], presets: [[path.join(__dirname, '__fixtures__/preset-bar.js')]],
}, },
} as LoadContext; } as Partial<LoadContext>;
const presets = loadPresets(context); const presets = loadPresets(context);
expect(presets).toMatchInlineSnapshot(` expect(presets).toMatchInlineSnapshot(`
Object { Object {
@ -115,7 +115,7 @@ describe('loadPresets', () => {
], ],
], ],
}, },
} as LoadContext; } as Partial<LoadContext>;
const presets = loadPresets(context); const presets = loadPresets(context);
expect(presets).toMatchInlineSnapshot(` expect(presets).toMatchInlineSnapshot(`
Object { Object {
@ -150,7 +150,7 @@ describe('loadPresets', () => {
], ],
], ],
}, },
} as LoadContext; } as Partial<LoadContext>;
const presets = loadPresets(context); const presets = loadPresets(context);
expect(presets).toMatchInlineSnapshot(` expect(presets).toMatchInlineSnapshot(`
Object { Object {

View file

@ -7,15 +7,20 @@
import importFresh from 'import-fresh'; import importFresh from 'import-fresh';
import _ from 'lodash'; import _ from 'lodash';
import {LoadContext, PluginConfig, Preset, PresetConfig} from '../types'; import {
LoadContext,
PluginConfig,
Preset,
PresetConfig,
} from '@docusaurus/types';
export function loadPresets( export function loadPresets(
context: LoadContext, context: Partial<LoadContext>,
): { ): {
plugins: PluginConfig[]; plugins: PluginConfig[];
themes: PluginConfig[]; themes: PluginConfig[];
} { } {
const presets: PresetConfig[] = context.siteConfig.presets || []; const presets: PresetConfig[] = (context.siteConfig || {}).presets || [];
const unflatPlugins: (PluginConfig[])[] = []; const unflatPlugins: (PluginConfig[])[] = [];
const unflatThemes: (PluginConfig[])[] = []; const unflatThemes: (PluginConfig[])[] = [];

View file

@ -8,7 +8,12 @@
import {genChunkName} from '@docusaurus/utils'; import {genChunkName} from '@docusaurus/utils';
import _ from 'lodash'; import _ from 'lodash';
import {stringify} from 'querystring'; import {stringify} from 'querystring';
import {ChunkRegistry, Module, RouteConfig, RouteModule} from './types'; import {
ChunkRegistry,
Module,
RouteConfig,
RouteModule,
} from '@docusaurus/types';
function getModulePath(target: Module): string { function getModulePath(target: Module): string {
if (typeof target === 'string') { if (typeof target === 'string') {

View file

@ -9,7 +9,7 @@ import globby from 'globby';
import fs from 'fs-extra'; import fs from 'fs-extra';
import path from 'path'; import path from 'path';
import {fileToPath, posixPath, normalizeUrl} from '@docusaurus/utils'; import {fileToPath, posixPath, normalizeUrl} from '@docusaurus/utils';
import {ThemeAlias} from '../types'; import {ThemeAlias} from '@docusaurus/types';
export function themeAlias(themePath: string): ThemeAlias { export function themeAlias(themePath: string): ThemeAlias {
if (!fs.pathExistsSync(themePath)) { if (!fs.pathExistsSync(themePath)) {

View file

@ -5,7 +5,7 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import {ThemeAlias} from '../types'; import {ThemeAlias} from '@docusaurus/types';
import {themeAlias} from './alias'; import {themeAlias} from './alias';
export function loadThemeAlias(themePaths: string[]): ThemeAlias { export function loadThemeAlias(themePaths: string[]): ThemeAlias {

View file

@ -12,7 +12,7 @@ import path from 'path';
import TerserPlugin from 'terser-webpack-plugin'; import TerserPlugin from 'terser-webpack-plugin';
import {Configuration, Loader} from 'webpack'; import {Configuration, Loader} from 'webpack';
import {Props} from '../server/types'; import {Props} from '@docusaurus/types';
import {getBabelLoader, getCacheLoader, getStyleLoaders} from './utils'; import {getBabelLoader, getCacheLoader, getStyleLoaders} from './utils';
const CSS_REGEX = /\.css$/; const CSS_REGEX = /\.css$/;

View file

@ -9,7 +9,7 @@ import {Configuration} from 'webpack';
import merge from 'webpack-merge'; import merge from 'webpack-merge';
import WebpackNiceLog from 'webpack-nicelog'; import WebpackNiceLog from 'webpack-nicelog';
import {Props} from '../server/types'; import {Props} from '@docusaurus/types';
import {createBaseConfig} from './base'; import {createBaseConfig} from './base';
import ChunkManifestPlugin from './plugins/ChunkManifestPlugin'; import ChunkManifestPlugin from './plugins/ChunkManifestPlugin';

View file

@ -11,7 +11,7 @@ import {Configuration} from 'webpack';
import merge from 'webpack-merge'; import merge from 'webpack-merge';
import WebpackNiceLog from 'webpack-nicelog'; import WebpackNiceLog from 'webpack-nicelog';
import {Props} from '../server/types'; import {Props} from '@docusaurus/types';
import {createBaseConfig} from './base'; import {createBaseConfig} from './base';
import WaitPlugin from './plugins/WaitPlugin'; import WaitPlugin from './plugins/WaitPlugin';