forked from fanruan/fineui
iapyang
5 years ago
7 changed files with 298 additions and 0 deletions
@ -0,0 +1,35 @@ |
|||||||
|
module.exports = function (api) { |
||||||
|
api.cache(true); |
||||||
|
const presets = [ |
||||||
|
[ |
||||||
|
"@babel/preset-env", |
||||||
|
{ |
||||||
|
targets: { |
||||||
|
ie: 9, |
||||||
|
chrome: 47, |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
"@babel/preset-typescript", |
||||||
|
]; |
||||||
|
const plugins = [ |
||||||
|
[ |
||||||
|
"@babel/plugin-proposal-decorators", |
||||||
|
{ |
||||||
|
legacy: true, |
||||||
|
}, |
||||||
|
], |
||||||
|
"@babel/plugin-proposal-class-properties", |
||||||
|
"@babel/plugin-transform-block-scoping", |
||||||
|
["@babel/plugin-transform-classes", { |
||||||
|
loose: true, |
||||||
|
}], |
||||||
|
"@babel/plugin-transform-proto-to-assign", |
||||||
|
// "@babel/plugin-transform-modules-commonjs",
|
||||||
|
]; |
||||||
|
|
||||||
|
return { |
||||||
|
presets, |
||||||
|
plugins, |
||||||
|
}; |
||||||
|
}; |
@ -0,0 +1,13 @@ |
|||||||
|
interface Obj { |
||||||
|
[key: string]: any; |
||||||
|
} |
||||||
|
|
||||||
|
// declare let BI: Obj & import("../typescript/index")._BI;
|
||||||
|
|
||||||
|
declare let BI: Obj; |
||||||
|
|
||||||
|
declare const Fix: Obj; |
||||||
|
|
||||||
|
declare interface String { |
||||||
|
replaceAll(regx: string, callback: (str: string) => void): string; |
||||||
|
} |
@ -0,0 +1,61 @@ |
|||||||
|
export type Constructor<T> = new(...args: any[]) => T; |
||||||
|
|
||||||
|
/** |
||||||
|
* 注册widget |
||||||
|
*/ |
||||||
|
export function shortcut() { |
||||||
|
return function decorator<U>(Target: Constructor<U> & {xtype: string}): void { |
||||||
|
BI.shortcut(Target.xtype, Target); |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 注册model |
||||||
|
*/ |
||||||
|
export function model() { |
||||||
|
return function decorator<U extends {new(...args:any[]):{}} & {xtype: string, context?: ReadonlyArray<string>}>(Target: U): void { |
||||||
|
BI.model(Target.xtype, Target); |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 类注册_store属性 |
||||||
|
* @param Model model类 |
||||||
|
* @param opts 额外条件 |
||||||
|
*/ |
||||||
|
export function store<T>(Model: Constructor<T> & {xtype: string}, opts: { props?(this: unknown): { [key: string]: unknown } } = {}) { |
||||||
|
return function classDecorator<U extends {new(...args:any[]):{}}>(constructor:U) { |
||||||
|
return class extends constructor { |
||||||
|
_store() { |
||||||
|
const props = opts.props ? opts.props.apply(this) : undefined; |
||||||
|
|
||||||
|
return BI.Models.getModel(Model.xtype, props); |
||||||
|
} |
||||||
|
}; |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Model基类 |
||||||
|
*/ |
||||||
|
export class Model<U extends {types?: {[key: string]: unknown} | {}, context?: ReadonlyArray<string>} = {}> extends Fix.Model { |
||||||
|
// @ts-ignore this["computed"][key]为空
|
||||||
|
model: Pick<{[key in keyof U["types"]]: U["types"][key]}, U["context"][number]> & {[key in keyof ReturnType<this["state"]>]: ReturnType<this["state"]>[key]} & {[key in keyof this["computed"]]: ReturnType<this["computed"][key]>}; |
||||||
|
|
||||||
|
store: this["actions"]; |
||||||
|
|
||||||
|
state(): {[key: string]: unknown} | {} { |
||||||
|
return {}; |
||||||
|
} |
||||||
|
|
||||||
|
context: U["context"]; |
||||||
|
|
||||||
|
actions:{[key: string]: (...args: any[]) => any}; |
||||||
|
|
||||||
|
childContext: ReadonlyArray<keyof (this["computed"] & ReturnType<this["state"]>)>; |
||||||
|
|
||||||
|
// @ts-ignore this["computed"][key]为空
|
||||||
|
TYPE: Pick<{[key in keyof this["computed"]]: ReturnType<this["computed"][key]>} & {[key in keyof ReturnType<this["state"]>]: ReturnType<this["state"]>[key]}, this["childContext"][number]>; |
||||||
|
|
||||||
|
computed: {[key: string]: () => unknown} | {}; |
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
const path = require("path"); |
||||||
|
module.exports = { |
||||||
|
DEST: path.resolve(__dirname, "../dist"), |
||||||
|
NODE_MODULES: path.resolve(__dirname, "../node_modules"), |
||||||
|
PRIVATE: path.resolve(__dirname, "../private"), |
||||||
|
BABEL_CONFIG: path.resolve(__dirname, "../babel.config.js"), |
||||||
|
TYPESCRIPT: path.resolve(__dirname, "../typescript"), |
||||||
|
}; |
@ -0,0 +1,59 @@ |
|||||||
|
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); |
||||||
|
const autoprefixer = require("autoprefixer"); |
||||||
|
|
||||||
|
const dirs = require("./dirs"); |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
entry: { |
||||||
|
fineui: [ |
||||||
|
"./typescript/index.ts", |
||||||
|
], |
||||||
|
}, |
||||||
|
resolve: { |
||||||
|
mainFields: ["module", "main"], |
||||||
|
extensions: [".js", ".ts"], |
||||||
|
}, |
||||||
|
module: { |
||||||
|
rules: [ |
||||||
|
{ |
||||||
|
test: /\.(js|ts)$/, |
||||||
|
include: [dirs.NODE_MODULES, dirs.PRIVATE, dirs.TYPESCRIPT], |
||||||
|
use: [{ |
||||||
|
loader: "babel-loader", |
||||||
|
options: { |
||||||
|
configFile: dirs.BABEL_CONFIG, |
||||||
|
}, |
||||||
|
}, { |
||||||
|
loader: "source-map-loader", |
||||||
|
options: { |
||||||
|
enforce: "pre", |
||||||
|
}, |
||||||
|
}], |
||||||
|
}, |
||||||
|
{ |
||||||
|
test: /\.(css|less)$/, |
||||||
|
use: [ |
||||||
|
MiniCssExtractPlugin.loader, |
||||||
|
{ |
||||||
|
loader: "css-loader", |
||||||
|
options: { |
||||||
|
url: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
loader: "postcss-loader", |
||||||
|
options: { |
||||||
|
plugins: [autoprefixer], |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
loader: "less-loader", |
||||||
|
options: { |
||||||
|
relativeUrls: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
}; |
@ -0,0 +1,50 @@ |
|||||||
|
const merge = require("webpack-merge"); |
||||||
|
const path = require("path"); |
||||||
|
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); |
||||||
|
const HtmlWebpackPlugin = require("html-webpack-plugin"); |
||||||
|
const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin"); |
||||||
|
const OptimizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin"); |
||||||
|
|
||||||
|
const dirs = require("./dirs"); |
||||||
|
|
||||||
|
const common = require("./webpack.common.js"); |
||||||
|
|
||||||
|
module.exports = merge(common, { |
||||||
|
devtool: "eval-source-map", |
||||||
|
output: { |
||||||
|
path: dirs.DEST, |
||||||
|
filename: "[name].[contenthash].js", |
||||||
|
}, |
||||||
|
devServer: { |
||||||
|
contentBase: path.join(__dirname, ".."), |
||||||
|
port: 9001, |
||||||
|
liveReload: true, |
||||||
|
}, |
||||||
|
plugins: [ |
||||||
|
new MiniCssExtractPlugin({ |
||||||
|
path: dirs.DEST, |
||||||
|
filename: "fineui.[contenthash].css", |
||||||
|
}), |
||||||
|
new HtmlWebpackPlugin({ |
||||||
|
template: path.resolve(__dirname, "../index.html"), |
||||||
|
chunks: ["fineui"], |
||||||
|
chunksSortMode: "manual", |
||||||
|
}), |
||||||
|
new ForkTsCheckerWebpackPlugin({ |
||||||
|
watch: ["./typescript"], |
||||||
|
}), |
||||||
|
new OptimizeCssAssetsPlugin({ |
||||||
|
assetNameRegExp: /\.css$/g, |
||||||
|
cssProcessor: require("cssnano"), |
||||||
|
cssProcessorPluginOptions: { |
||||||
|
preset: ["default", { |
||||||
|
discardComments: { |
||||||
|
removeAll: true, |
||||||
|
}, |
||||||
|
normalizeUnicode: false, |
||||||
|
}], |
||||||
|
}, |
||||||
|
canPrint: true, |
||||||
|
}), |
||||||
|
], |
||||||
|
}); |
@ -0,0 +1,72 @@ |
|||||||
|
const webpack = require("webpack"); |
||||||
|
const merge = require("webpack-merge"); |
||||||
|
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); |
||||||
|
const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin"); |
||||||
|
const OptimizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin"); |
||||||
|
const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); |
||||||
|
|
||||||
|
const dirs = require("./dirs"); |
||||||
|
|
||||||
|
const common = require("./webpack.common.js"); |
||||||
|
|
||||||
|
module.exports = merge.smart(common, { |
||||||
|
mode: "production", |
||||||
|
|
||||||
|
devtool: "hidden-source-map", |
||||||
|
|
||||||
|
output: { |
||||||
|
path: dirs.DEST, |
||||||
|
filename: "webpack", |
||||||
|
}, |
||||||
|
|
||||||
|
plugins: [ |
||||||
|
new MiniCssExtractPlugin({ |
||||||
|
path: dirs.DEST, |
||||||
|
filename: "plugin.jsondata.es5.css", |
||||||
|
}), |
||||||
|
new UglifyJsPlugin({ |
||||||
|
test: /\.js(\?.*)?$/i, |
||||||
|
parallel: 16, |
||||||
|
sourceMap: true, |
||||||
|
uglifyOptions: { |
||||||
|
output: { |
||||||
|
comments: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}), |
||||||
|
new webpack.BannerPlugin({ |
||||||
|
banner: `time: ${new Date().toLocaleString()}`, |
||||||
|
}), |
||||||
|
new ForkTsCheckerWebpackPlugin({ |
||||||
|
}), |
||||||
|
new OptimizeCssAssetsPlugin({ |
||||||
|
assetNameRegExp: /\.css$/g, |
||||||
|
cssProcessor: require("cssnano"), |
||||||
|
cssProcessorPluginOptions: { |
||||||
|
preset: ["default", { |
||||||
|
discardComments: { |
||||||
|
removeAll: true, |
||||||
|
}, |
||||||
|
normalizeUnicode: false, |
||||||
|
}], |
||||||
|
}, |
||||||
|
canPrint: true, |
||||||
|
}), |
||||||
|
], |
||||||
|
|
||||||
|
module: { |
||||||
|
rules: [ |
||||||
|
{ |
||||||
|
test: /\.(css|less)$/, |
||||||
|
use: [ |
||||||
|
{ |
||||||
|
loader: "postcss-loader", |
||||||
|
options: { |
||||||
|
plugins: [], |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
}); |
Loading…
Reference in new issue