feat: 主题配置函数

新增主题配置函数,笔记配置函数,提供类型提示支持.
This commit is contained in:
pengzhanbo 2022-04-25 15:32:46 +08:00
parent 7a2a2af562
commit 844feeae74
10 changed files with 96 additions and 64 deletions

12
.commitlintrc.js Normal file
View File

@ -0,0 +1,12 @@
const fs = require('fs')
const path = require('path')
const packages = fs.readdirSync(path.resolve(__dirname, 'packages'))
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
'scope-enum': [2, 'always', [...packages]],
'footer-max-line-length': [0],
},
}

View File

@ -7,6 +7,7 @@
"packages/*"
],
"scripts": {
"_release": "yarn lint && yarn build && lerna publish --registry https://registry.npmjs.org/",
"build": "yarn build:package",
"build:package": "lerna run build --stream",
"commit": "cz",
@ -19,11 +20,11 @@
"docs:webpack-build": "vuepress-webpack build docs",
"docs:webpack-serve": "vuepress-webpack dev docs",
"lerna": "lerna clean && lerna bootstrap",
"lerna:publish": "ts-node -O {\\\"module\\\":\\\"commonjs\\\"} scripts/release",
"lerna:publish": "scripts/release/index.mjs",
"lint": "eslint --ext .js,.ts,.vue .",
"package:clean": "lerna run clean",
"prepare": "husky install",
"release": "yarn lint && yarn build && lerna publish --registry https://registry.npmjs.org/"
"release": "yarn lint && yarn lerna:publish"
},
"lint-staged": {
"*.{js,ts,vue}": "eslint --fix",

View File

@ -0,0 +1,21 @@
import type { UserConfig } from '@vuepress/cli'
import type { BundlerConfig } from '@vuepress/core'
import type {
PlumeThemeNotesConfigItem,
PlumeThemeNotesOptions,
PlumeThemeOptions,
} from '../shared'
type DefinePlumeConfig = UserConfig<PlumeThemeOptions, BundlerConfig>
export const definePlumeConfig = (
config: DefinePlumeConfig
): DefinePlumeConfig => config
export const definePlumeNotesConfig = (
notes: PlumeThemeNotesOptions
): PlumeThemeNotesOptions => notes
export const definePlumeNotesItemConfig = (
item: PlumeThemeNotesConfigItem
): PlumeThemeNotesConfigItem => item

View File

@ -1,5 +1,6 @@
import { themePlume } from './theme'
export * from './theme'
export * from '../shared'
export * from './define'
export default themePlume

View File

@ -1,4 +1,4 @@
import { release } from './release'
import { release } from './release.mjs'
release().catch((err) => {
console.error(err)

View File

@ -1,27 +1,28 @@
import chalk from 'chalk'
import { prompt } from 'inquirer'
import type { ReleaseType } from 'semver'
import { inc } from 'semver'
import { version as currentVersion } from '../../lerna.json'
import { sync } from './sync'
import { getNpmTags, getVersion, versions } from './version'
import type { Answers } from './version'
const execa = require('execa')
const ora = require('ora')
import inquirer from 'inquirer'
import inc from 'semver/functions/inc.js'
import { getNpmTags, getVersion, versions } from './version.mjs'
import { execa } from 'execa'
import ora from 'ora'
import fs from 'fs'
import path from 'path'
const { green, red } = chalk
const { prompt } = inquirer
export const release = async (): Promise<void> => {
const lerna = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'lerna.json')))
const { version: currentVersion } = lerna
export const release = async () => {
const buildSpinner = ora('Building project').start()
await execa('yarn', ['run', 'clean'])
await execa('yarn', ['run', 'lint'])
await execa('yarn', ['run', 'build'])
buildSpinner.succeed()
ora(`Current version: ${green(currentVersion)}`).info()
const bumps: ReleaseType[] = [
const bumps = [
'prerelease',
'patch',
'minor',
@ -30,7 +31,7 @@ export const release = async (): Promise<void> => {
]
bumps.forEach((bump) => {
versions[bump] = inc(currentVersion, bump) as string
versions[bump] = inc(currentVersion, bump)
})
const bumpChoices = bumps.map((bump) => ({
@ -38,7 +39,7 @@ export const release = async (): Promise<void> => {
value: bump,
}))
const { bump, customVersion, npmTag } = await prompt<Answers>([
const { bump, customVersion, npmTag } = await prompt([
{
name: 'bump',
message: 'Select release type:',
@ -49,20 +50,20 @@ export const release = async (): Promise<void> => {
name: 'customVersion',
message: 'Input version:',
type: 'input',
when: (answers): boolean => answers.bump === 'custom',
when: (answers) => answers.bump === 'custom',
},
{
name: 'npmTag',
message: 'Input npm tag:',
type: 'list',
default: (answers: Answers): string => getNpmTags(getVersion(answers))[0],
choices: (answers: Answers): string[] => getNpmTags(getVersion(answers)),
default: answers => getNpmTags(getVersion(answers))[0],
choices: answers => getNpmTags(getVersion(answers)),
},
])
const version = customVersion || versions[bump]
const { confirm } = await prompt<{ confirm: 'Y' | 'N' }>([
const { confirm } = await prompt([
{
name: 'confirm',
message: `Confirm releasing ${version} (${npmTag})?`,

21
scripts/release/sync.mjs Normal file
View File

@ -0,0 +1,21 @@
import { readdirSync } from 'fs'
import { get } from 'https'
import { resolve } from 'path'
const packages = readdirSync(resolve(__dirname, '../../packages'))
export const sync = () => {
const promises = packages.map(packageName => {
return import(`../../packages/${packageName}/package.json`)
.then(content =>
new Promise((resolve) => {
get(`https://npmmirror.com/sync/${content.name}`).on(
'finish',
() => resolve()
)
})
)
})
return Promise.all(promises)
}

View File

@ -1,21 +0,0 @@
import { readdirSync } from 'fs'
import { get } from 'https'
import { resolve } from 'path'
const packages = readdirSync(resolve(__dirname, '../../packages'))
export const sync = (): Promise<void[]> => {
const promises = packages.map((packageName) => {
return import(`../../packages/${packageName}/package.json`).then(
(content: Record<string, unknown>) =>
new Promise<void>((resolve) => {
get(`https://npmmirror.com/sync/${content.name as string}`).on(
'finish',
() => resolve()
)
})
)
})
return Promise.all(promises)
}

View File

@ -0,0 +1,17 @@
import prerelease from 'semver/functions/prerelease.js'
export const versions = {}
export const getVersion = answers =>
answers.customVersion || versions[answers.bump]
export const isPreRelease = version =>
Boolean(prerelease(version))
export const getNpmTags = version => {
if (isPreRelease(version)) return ['next', 'alpha', 'beta', 'latest']
return ['latest', 'beta', 'alpha', 'next']
}

View File

@ -1,21 +0,0 @@
import { prerelease } from 'semver'
export interface Answers {
bump: string
customVersion: string
npmTag: string
}
export const versions: Record<string, string> = {}
export const getVersion = (answers: Answers): string =>
answers.customVersion || versions[answers.bump]
export const isPreRelease = (version: string): boolean =>
Boolean(prerelease(version))
export const getNpmTags = (version: string): string[] => {
if (isPreRelease(version)) return ['next', 'alpha', 'beta', 'latest']
return ['latest', 'beta', 'alpha', 'next']
}