Skip to content

Commit

Permalink
feat: add genetate-history-method bin and support .generate-history-m…
Browse files Browse the repository at this point in the history
…ethod.config.js
  • Loading branch information
baozouai committed Jul 18, 2023
1 parent 0983ade commit f9cc938
Show file tree
Hide file tree
Showing 15 changed files with 118 additions and 76 deletions.
20 changes: 10 additions & 10 deletions README-zh_CN.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

<p align="center">
<h1 align="center">genetate-history-method-webpack-plugin</h1>
<h1 align="center">generate-history-method-webpack-plugin</h1>
</p>

<div align="center">
Expand All @@ -11,15 +11,15 @@
![Test][test-badge]


[npm-image]: https://img.shields.io/npm/v/genetate-history-method-webpack-plugin.svg?style=flat-square
[npm-url]: http://npmjs.org/package/genetate-history-method-webpack-plugin
[npm-image]: https://img.shields.io/npm/v/generate-history-method-webpack-plugin.svg?style=flat-square
[npm-url]: http://npmjs.org/package/generate-history-method-webpack-plugin


[download-image]: https://img.shields.io/npm/dm/genetate-history-method-webpack-plugin.svg?style=flat-square
[download-image]: https://img.shields.io/npm/dm/generate-history-method-webpack-plugin.svg?style=flat-square



[test-badge]: https://github.com/baozouai/genetate-history-method-webpack-plugin/actions/workflows/ci.yml/badge.svg
[test-badge]: https://github.com/baozouai/generate-history-method-webpack-plugin/actions/workflows/ci.yml/badge.svg



Expand All @@ -30,11 +30,11 @@
## 📦 安装

```sh
pnpm add genetate-history-method-webpack-plugin -D
pnpm add generate-history-method-webpack-plugin -D
# or
yarn add genetate-history-method-webpack-plugin -D
yarn add generate-history-method-webpack-plugin -D
# or
npm i genetate-history-method-webpack-plugin -D
npm i generate-history-method-webpack-plugin -D
```

确保你的依赖有`qs`,否则请安装
Expand Down Expand Up @@ -117,7 +117,7 @@ interface GenerateHistoryMethodWebpackPluginOptions {
```js
// webpack.config.js
// webpack.config.js
const GenerateHistoryMethodWebpackPlugin = require('genetate-history-method-webpack-plugin')
const GenerateHistoryMethodWebpackPlugin = require('generate-history-method-webpack-plugin')
const path = require('path')

module.exports = {
Expand Down Expand Up @@ -168,4 +168,4 @@ export default interface Params {
- [react-router-5-js](./playgrounds/react-router-5-js/webpack.config.js)
## 📄 协议

genetate-history-method-webpack-plugin 遵循 [MIT 协议](./LICENSE).
generate-history-method-webpack-plugin 遵循 [MIT 协议](./LICENSE).
20 changes: 10 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

<p align="center">
<h1 align="center">genetate-history-method-webpack-plugin</h1>
<h1 align="center">generate-history-method-webpack-plugin</h1>
</p>

<div align="center">
Expand All @@ -11,15 +11,15 @@
![Test][test-badge]


[npm-image]: https://img.shields.io/npm/v/genetate-history-method-webpack-plugin.svg?style=flat-square
[npm-url]: http://npmjs.org/package/genetate-history-method-webpack-plugin
[npm-image]: https://img.shields.io/npm/v/generate-history-method-webpack-plugin.svg?style=flat-square
[npm-url]: http://npmjs.org/package/generate-history-method-webpack-plugin


[download-image]: https://img.shields.io/npm/dm/genetate-history-method-webpack-plugin.svg?style=flat-square
[download-image]: https://img.shields.io/npm/dm/generate-history-method-webpack-plugin.svg?style=flat-square



[test-badge]: https://github.com/baozouai/genetate-history-method-webpack-plugin/actions/workflows/ci.yml/badge.svg
[test-badge]: https://github.com/baozouai/generate-history-method-webpack-plugin/actions/workflows/ci.yml/badge.svg



Expand All @@ -30,11 +30,11 @@ English | [中文](./README-zh_CN.md)
## 📦 Install

```sh
pnpm add genetate-history-method-webpack-plugin -D
pnpm add generate-history-method-webpack-plugin -D
# or
yarn add genetate-history-method-webpack-plugin -D
yarn add generate-history-method-webpack-plugin -D
# or
npm i genetate-history-method-webpack-plugin -D
npm i generate-history-method-webpack-plugin -D
```

make sure your dependencies have `qs`,otherwise please install
Expand Down Expand Up @@ -120,7 +120,7 @@ interface GenerateHistoryMethodWebpackPluginOptions {

```js
// webpack.config.js
const GenerateHistoryMethodWebpackPlugin = require('genetate-history-method-webpack-plugin')
const GenerateHistoryMethodWebpackPlugin = require('generate-history-method-webpack-plugin')
const path = require('path')

module.exports = {
Expand Down Expand Up @@ -169,4 +169,4 @@ and webpack.config.js:

## 📄 License

genetate-history-method-webpack-plugin is [MIT licensed](./LICENSE).
generate-history-method-webpack-plugin is [MIT licensed](./LICENSE).
1 change: 1 addition & 0 deletions build.config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { defineBuildConfig } from 'unbuild'

export default defineBuildConfig({
entries: ['./src/generate-history-method-webpack-plugin', './src/bin/generate-history-method'],
declaration: true,
clean: true,
rollup: {
Expand Down
17 changes: 10 additions & 7 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
{
"name": "genetate-history-method-webpack-plugin",
"name": "generate-history-method-webpack-plugin",
"version": "1.2.1",
"packageManager": "pnpm@8.3.1",
"description": "A webpack Plugin for automatically generating routing methods based on conventional routing",
"author": "baozouai <baozouai@gmail.com>",
"license": "MIT",
"homepage": "https://github.com/baozouai/genetate-history-method-webpack-plugin",
"homepage": "https://github.com/baozouai/generate-history-method-webpack-plugin",
"repository": {
"type": "git",
"url": "https://github.com/baozouai/genetate-history-method-webpack-plugin.git"
"url": "https://github.com/baozouai/generate-history-method-webpack-plugin.git"
},
"bugs": {
"url": "https://github.com/baozouai/genetate-history-method-webpack-plugin/issues"
"url": "https://github.com/baozouai/generate-history-method-webpack-plugin/issues"
},
"bin": {
"generate-history-method": "dist/generate-history-method.cjs"
},
"keywords": [
"webpack",
Expand All @@ -20,9 +23,9 @@
"webpack-plugin",
"add react history method"
],
"main": "dist/genetate-history-method-webpack-plugin.cjs",
"types": "dist/genetate-history-method-webpack-plugin.d.ts",
"module": "./dist/genetate-history-method-webpack-plugin.mjs",
"main": "dist/generate-history-method-webpack-plugin.cjs",
"types": "dist/generate-history-method-webpack-plugin.d.ts",
"module": "./dist/generate-history-method-webpack-plugin.mjs",
"files": [
"dist"
],
Expand Down
2 changes: 1 addition & 1 deletion playgrounds/react-router-5-js/webpack.config.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { DefinePlugin } = require('webpack')
const GenerateHistoryMethodWebpackPlugin = require('../../dist/genetate-history-method-webpack-plugin.cjs')
const GenerateHistoryMethodWebpackPlugin = require('../../dist/generate-history-method-webpack-plugin.cjs')
const isHash = process.env.HISTORY_MODE === 'hash'
module.exports = {
entry: './src/index.jsx',
Expand Down
9 changes: 9 additions & 0 deletions playgrounds/react-router-5/.generate-history-method.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const path = require('path')

const isHash = process.env.HISTORY_MODE === 'hash'
module.exports = {
pagesRootPath: path.resolve(__dirname, 'src/pages'),
originHistoryModuleName: isHash ? '@/hash_history' : '@/browser_history',
mode: process.env.HISTORY_MODE,
reactRouterVersion: 5,
}
3 changes: 2 additions & 1 deletion playgrounds/react-router-5/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"typescript": "^4.9.5",
"webpack": "^5.87.0",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^4.15.1"
"webpack-dev-server": "^4.15.1",
"generate-history-method-webpack-plugin": "workspace:*"
}
}
2 changes: 1 addition & 1 deletion playgrounds/react-router-5/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,5 @@
},

},
"include": ["src", "./webpack.config.js"]
"include": ["src"]
}
5 changes: 1 addition & 4 deletions playgrounds/react-router-5/webpack.config.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { DefinePlugin } = require('webpack')
const GenerateHistoryMethodWebpackPlugin = require('../../dist/genetate-history-method-webpack-plugin.cjs')
const GenerateHistoryMethodWebpackPlugin = require('../../dist/generate-history-method-webpack-plugin.cjs')
const isHash = process.env.HISTORY_MODE === 'hash'
module.exports = {
entry: './src/index.tsx',
Expand Down Expand Up @@ -38,10 +38,7 @@ module.exports = {
template: 'public/index.html',
}),
new GenerateHistoryMethodWebpackPlugin({
pagesRootPath: path.resolve(__dirname, 'src/pages'),
originHistoryModuleName: isHash ? '@/hash_history' : '@/browser_history',
mode: process.env.HISTORY_MODE,
reactRouterVersion: 5,
}),
// ...其他插件
],
Expand Down
2 changes: 1 addition & 1 deletion playgrounds/react-router-6-js/webpack.config.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { DefinePlugin } = require('webpack')
const GenerateHistoryMethodWebpackPlugin = require('../../dist/genetate-history-method-webpack-plugin.cjs')
const GenerateHistoryMethodWebpackPlugin = require('../../dist/generate-history-method-webpack-plugin.cjs')
const isHash = process.env.HISTORY_MODE === 'hash'
module.exports = {
entry: './src/index.jsx',
Expand Down
2 changes: 1 addition & 1 deletion playgrounds/react-router-6/webpack.config.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { DefinePlugin } = require('webpack')
const GenerateHistoryMethodWebpackPlugin = require('../../dist/genetate-history-method-webpack-plugin.cjs')
const GenerateHistoryMethodWebpackPlugin = require('../../dist/generate-history-method-webpack-plugin.cjs')
const isHash = process.env.HISTORY_MODE === 'hash'
module.exports = {
entry: './src/index.tsx',
Expand Down
3 changes: 3 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/bin/generate-history-method.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/usr/bin/env node
import GenerateHistoryMethodWebpackPlugin from '../generate-history-method-webpack-plugin'
new GenerateHistoryMethodWebpackPlugin().run()
2 changes: 2 additions & 0 deletions src/const.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import { resolve } from 'path'
export const CONFIG_FILE_PATH = resolve(process.cwd(), '.generate-history-method.config.js')
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { dirname, extname, resolve } from 'path'
import { validate } from 'schema-utils'
import glob from 'glob'
import schema from './schema.json'
import { CONFIG_FILE_PATH } from './const'

const cwdPath = process.cwd()

Expand Down Expand Up @@ -68,7 +69,26 @@ class GenerateHistoryMethodWebpackPlugin {
reactRouterVersion: AllowReactRouterVersion
exportHistoryName: string

constructor(options: GenerateHistoryMethodWebpackPluginOptions) {
getDefaultConfig() {
if (existsSync(CONFIG_FILE_PATH)) {
// @ts-ignore
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-var-requires
const config = require(CONFIG_FILE_PATH)
return config as GenerateHistoryMethodWebpackPluginOptions
}
return {}
}

combindConfig(config: GenerateHistoryMethodWebpackPluginOptions) {
const defaultConfig = this.getDefaultConfig()
return {
...defaultConfig,
...config,
}
}

constructor(options = {} as GenerateHistoryMethodWebpackPluginOptions) {
const combineOptions = this.combindConfig(options)
const {
paramsName = 'index.params',
pageName = 'index.page',
Expand All @@ -78,10 +98,9 @@ class GenerateHistoryMethodWebpackPlugin {
exportHistoryName = 'history',
pagesRootPath,
reactRouterVersion,
} = options || {}

} = combineOptions
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
validate(schema as any, options)
validate(schema as any, combineOptions)
this.paramsName = paramsName
this.pageName = pageName
this.historyModuleName = historyModuleName
Expand All @@ -100,48 +119,52 @@ class GenerateHistoryMethodWebpackPlugin {
return this.reactRouterVersion === 6
}

apply(compiler: any) {
// @ts-ignore
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
compiler.hooks.beforeCompile.tap(
GenerateHistoryMethodWebpackPlugin.name,
() => {
const filePattern = `${this.pagesRootPath}/**/${this.pageName}.{tsx,js,jsx}` // 匹配的文件模式
run() {
const filePattern = `${this.pagesRootPath}/**/${this.pageName}.{tsx,js,jsx}` // 匹配的文件模式

glob(filePattern, (err, files) => {
if (err) {
console.warn(err)
return
}
const isExistTS = files.some(file => /\.tsx?/.test(extname(file)))
this.contents = []
glob(filePattern, (err, files) => {
if (err) {
console.warn(err)
return
}
const isExistTS = files.some(file => /\.tsx?/.test(extname(file)))
this.contents = []

this.addTopImport()
this.generateUseHistoryHook(isExistTS)
this.generateRouter(isExistTS)
this.addTopImport()
this.generateUseHistoryHook(isExistTS)
this.generateRouter(isExistTS)

const { urlObj, paramsMap } = this.getParamsMapAndUrlObj(files)
const urlKeys = Object.keys(urlObj)
const { urlObj, paramsMap } = this.getParamsMapAndUrlObj(files)
const urlKeys = Object.keys(urlObj)

this.generateURL_MAP(urlObj)
this.generateFormatUrlFn(isExistTS)
this.generateHistory(paramsMap, urlKeys, isExistTS)
this.generateUseSearchParamsHook(isExistTS)
this.generateURL_MAP(urlObj)
this.generateFormatUrlFn(isExistTS)
this.generateHistory(paramsMap, urlKeys, isExistTS)
this.generateUseSearchParamsHook(isExistTS)

this.contents.unshift('// @eslint-ignored')
const contentStr = this.contents.join('\n')
const outputPath = resolve(
cwdPath,
this.contents.unshift('// @eslint-ignored')
const contentStr = this.contents.join('\n')
const outputPath = resolve(
cwdPath,
`node_modules/${this.historyModuleName}.${isExistTS ? 'tsx' : 'js'}`,
) // 输出文件路径
if (existsSync(outputPath)) {
// 已存在则对比是否变化,没变化则没必要写入
const originFile = readFileSync(outputPath, 'utf-8')
if (originFile === contentStr)
return
}
writeFileSync(outputPath, contentStr)
})
) // 输出文件路径
if (existsSync(outputPath)) {
// 已存在则对比是否变化,没变化则没必要写入
const originFile = readFileSync(outputPath, 'utf-8')
if (originFile === contentStr)
return
}
writeFileSync(outputPath, contentStr)
})
}

apply(compiler: any) {
// @ts-ignore
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
compiler.hooks.beforeCompile.tap(
GenerateHistoryMethodWebpackPlugin.name,
() => {
this.run()
},
)
}
Expand Down

0 comments on commit f9cc938

Please sign in to comment.