Skip to content

Commit

Permalink
poi: write all the export in one namespace
Browse files Browse the repository at this point in the history
  • Loading branch information
bolasblack committed Apr 14, 2019
1 parent 2967135 commit 0956547
Show file tree
Hide file tree
Showing 3 changed files with 184 additions and 178 deletions.
356 changes: 181 additions & 175 deletions types/poi/index.d.ts
Expand Up @@ -10,192 +10,22 @@ import { Options as HtmlWebpackPluginOptions } from "html-webpack-plugin";
import * as WebpackChainConfig from "webpack-chain";
import CAC from "cac/types/CAC";

export type Mode = "production" | "development" | "test";

export interface Opts {
type: string;
mode: Mode;
[k: string]: any;
}

/**
* https://poi.js.org/config.html
*/
export interface Config {
entry?: Config.Entry;
output?: Config.Output;
pages?: Config.Pages;
babel?: Config.Babel;
css?: Config.Css;
assets?: Config.Assets;
envs?: Config.Envs;
constants?: Config.Constants;
chainWebpack?: Config.ChainWebpack;
configureWebpack?: Config.ConfigureWebpack;
publicFolder?: Config.PublicFolder;
devServer?: Config.DevServer;
plugins?: Config.Plugins;
}

export namespace Config {
type Entry = WebpackConfig["entry"];

interface Output {
dir?: string;
clean?: boolean;
format?: "iife" | "cjs" | "umd";
moduleName?: string;
sourceMap?: boolean;
minimize?: boolean;
publicUrl?: string;
fileNames?: Output.FileNames;
target?:
| "web"
| "electron"
| "electron-renderer"
| "electron-main"
| "node"
| "node-webkit"
| "async-node"
| "webworker";
html?: Output.Html;
}
namespace Output {
interface FileNames {
js?: string;
css?: string;
font?: string;
image?: string;
}

interface HtmlOptions {
title?: string;
filename?: string;
template?: string;
inject?: boolean;
}

type Html = boolean | HtmlOptions;
}

interface Pages {
[pageName: string]:
| string
| Partial<HtmlWebpackPluginOptions> & {
entry: string;
chunks?: string[];
};
}

interface Babel {
jsx?: string;
transpileModules?: string | string[];
namedImports?: string | Babel.NamedImportsOptions;
}
namespace Babel {
interface NamedImportsOptions {
[fileExt: string]: {
[ComponentName: string]: string;
};
}
}

interface Css {
extract?: boolean;
sourceMap?: boolean;
loaderOptions?: Css.LoaderOptions;
}
namespace Css {
interface LoaderOptions {
css?: any;
sass?: any;
postcss?: any;
less?: any;
stylus?: any;
}
}

interface Assets {
inlineImageMaxSize?: number;
}

interface Envs {
[envName: string]: string;
}

interface Constants {
[constantName: string]: string;
}

interface ChainWebpack {
(config: WebpackChainConfig, opts: Opts): void;
}

type ConfigureWebpack =
| WebpackConfig
| ((config: WebpackConfig, opts: Opts) => void | WebpackConfig);

type PublicFolder = string | boolean;

interface DevServer {
host?: string;
port?: string | number;
hot?: boolean;
hotOnly?: boolean;
hotEntries?: string[];
historyApiFallback?: WebpackDevServerConfig["historyApiFallback"];
open?: boolean;
proxy?: string | WebpackDevServerConfig["proxy"];
https?: WebpackDevServerConfig["https"];
before?: WebpackDevServerConfig["before"];
after?: WebpackDevServerConfig["after"];
headers?: WebpackDevServerConfig["headers"];
}

interface PluginOption {
resolve: string;
options?: any;
}
type Plugins = Array<string | PluginOption>;
}

export interface ConfigLoader {
resolve(
files?: ReadonlyArray<string>,
cwd?: string,
stopDir?: string
): string | null;
resolve(options?: ConfigLoader.Options): string | null;

load(files?: ReadonlyArray<string>, cwd?: string, stopDir?: string): any;
load(options?: ConfigLoader.Options): any;
}
export namespace ConfigLoader {
interface Options {
files?: string[];
cwd?: string;
stopDir?: string;
packageKey?: string;
parseJSON?: (str: string) => any;
}
}

/**
* https://poi.js.org/api.html#constructor-argv
*/
export class Poi {
mode: Mode;
declare class PoiCore {
mode: Poi.Mode;

cli: CAC;

/** The current running command */
command: CAC["command"];

config: Config;
config: Poi.Config;

isProd: boolean;

configLoader: ConfigLoader;
configLoader: Poi.ConfigLoader;

constructor(argv?: string[]);

Expand Down Expand Up @@ -230,8 +60,184 @@ export class Poi {
localRequire(pkg: string, cwd?: string): any;
}

export namespace Poi {
declare namespace PoiCore {
type Mode = "production" | "development" | "test";

interface Opts {
type: string;
mode: Mode;
[k: string]: any;
}

/**
* https://poi.js.org/config.html
*/
interface Config {
entry?: Config.Entry;
output?: Config.Output;
pages?: Config.Pages;
babel?: Config.Babel;
css?: Config.Css;
assets?: Config.Assets;
envs?: Config.Envs;
constants?: Config.Constants;
chainWebpack?: Config.ChainWebpack;
configureWebpack?: Config.ConfigureWebpack;
publicFolder?: Config.PublicFolder;
devServer?: Config.DevServer;
plugins?: Config.Plugins;
}

namespace Config {
type Entry = WebpackConfig["entry"];

interface Output {
dir?: string;
clean?: boolean;
format?: "iife" | "cjs" | "umd";
moduleName?: string;
sourceMap?: boolean;
minimize?: boolean;
publicUrl?: string;
fileNames?: Output.FileNames;
target?:
| "web"
| "electron"
| "electron-renderer"
| "electron-main"
| "node"
| "node-webkit"
| "async-node"
| "webworker";
html?: Output.Html;
}
namespace Output {
interface FileNames {
js?: string;
css?: string;
font?: string;
image?: string;
}

interface HtmlOptions {
title?: string;
filename?: string;
template?: string;
inject?: boolean;
}

type Html = boolean | HtmlOptions;
}

interface Pages {
[pageName: string]:
| string
| Partial<HtmlWebpackPluginOptions> & {
entry: string;
chunks?: string[];
};
}

interface Babel {
jsx?: string;
transpileModules?: string | string[];
namedImports?: string | Babel.NamedImportsOptions;
}
namespace Babel {
interface NamedImportsOptions {
[fileExt: string]: {
[ComponentName: string]: string;
};
}
}

interface Css {
extract?: boolean;
sourceMap?: boolean;
loaderOptions?: Css.LoaderOptions;
}
namespace Css {
interface LoaderOptions {
css?: any;
sass?: any;
postcss?: any;
less?: any;
stylus?: any;
}
}

interface Assets {
inlineImageMaxSize?: number;
}

interface Envs {
[envName: string]: string;
}

interface Constants {
[constantName: string]: string;
}

interface ChainWebpack {
(config: WebpackChainConfig, opts: Opts): void;
}

type ConfigureWebpack =
| WebpackConfig
| ((config: WebpackConfig, opts: Opts) => void | WebpackConfig);

type PublicFolder = string | boolean;

interface DevServer {
host?: string;
port?: string | number;
hot?: boolean;
hotOnly?: boolean;
hotEntries?: string[];
historyApiFallback?: WebpackDevServerConfig["historyApiFallback"];
open?: boolean;
proxy?: string | WebpackDevServerConfig["proxy"];
https?: WebpackDevServerConfig["https"];
before?: WebpackDevServerConfig["before"];
after?: WebpackDevServerConfig["after"];
headers?: WebpackDevServerConfig["headers"];
}

interface PluginOption {
resolve: string;
options?: any;
}
type Plugins = Array<string | PluginOption>;
}

interface ConfigLoader {
resolve(
files?: ReadonlyArray<string>,
cwd?: string,
stopDir?: string
): string | null;
resolve(options?: ConfigLoader.Options): string | null;

load(
files?: ReadonlyArray<string>,
cwd?: string,
stopDir?: string
): any;
load(options?: ConfigLoader.Options): any;
}
namespace ConfigLoader {
interface Options {
files?: string[];
cwd?: string;
stopDir?: string;
packageKey?: string;
parseJSON?: (str: string) => any;
}
}

interface HookHandler {
(config: WebpackChainConfig, opts: Opts): void;
}
}

export = PoiCore;
2 changes: 1 addition & 1 deletion types/poi/package.json
@@ -1,7 +1,7 @@
{
"private": true,
"dependencies": {
"cac": "^6.4.2",
"cac": "~6.4.2",
"webpack-chain": "^5.2.4"
}
}
4 changes: 2 additions & 2 deletions types/poi/poi-tests.ts
@@ -1,3 +1,3 @@
import { Poi } from "poi";
import * as PoiCore from "poi";

const poi = new Poi();
const poi = new PoiCore();

0 comments on commit 0956547

Please sign in to comment.