Merge remote-tracking branch 'upstream/minor'

This commit is contained in:
三咲智子 Kevin Deng 2023-12-01 08:16:50 +08:00
commit d28d57bd3f
No known key found for this signature in database
GPG Key ID: 69992F2250DFD93E
14 changed files with 803 additions and 747 deletions

View File

@ -1796,6 +1796,7 @@ describe('compiler: parse', () => {
}) })
}) })
describe('Edge Cases', () => {
test('self closing single tag', () => { test('self closing single tag', () => {
const ast = baseParse('<div :class="{ some: condition }" />') const ast = baseParse('<div :class="{ some: condition }" />')
@ -1881,8 +1882,7 @@ describe('compiler: parse', () => {
}) })
test('parse with correct location info', () => { test('parse with correct location info', () => {
const fooSrc = `foo const fooSrc = `foo\n is `
is `
const barSrc = `{{ bar }}` const barSrc = `{{ bar }}`
const butSrc = ` but ` const butSrc = ` but `
const bazSrc = `{{ baz }}` const bazSrc = `{{ baz }}`
@ -1957,6 +1957,7 @@ describe('compiler: parse', () => {
baseParse(`<Foo>`, { parseMode: 'sfc', onError() {} }) baseParse(`<Foo>`, { parseMode: 'sfc', onError() {} })
expect(() => baseParse(`{ foo }`)).not.toThrow() expect(() => baseParse(`{ foo }`)).not.toThrow()
}) })
})
describe('decodeEntities option', () => { describe('decodeEntities option', () => {
test('use decode by default', () => { test('use decode by default', () => {

View File

@ -161,6 +161,14 @@ describe('compiler: expression transform', () => {
type: NodeTypes.COMPOUND_EXPRESSION, type: NodeTypes.COMPOUND_EXPRESSION,
children: [{ content: `Math` }, `.`, { content: `max` }, `(1, 2)`] children: [{ content: `Math` }, `.`, { content: `max` }, `(1, 2)`]
}) })
expect(
(parseWithExpressionTransform(`{{ new Error() }}`) as InterpolationNode)
.content
).toMatchObject({
type: NodeTypes.COMPOUND_EXPRESSION,
children: ['new ', { content: 'Error' }, '()']
})
}) })
test('should not prefix reserved literals', () => { test('should not prefix reserved literals', () => {

View File

@ -49,7 +49,7 @@
"lru-cache": "^10.1.0", "lru-cache": "^10.1.0",
"merge-source-map": "^1.1.0", "merge-source-map": "^1.1.0",
"minimatch": "^9.0.3", "minimatch": "^9.0.3",
"postcss-modules": "^4.3.1", "postcss-modules": "^6.0.0",
"postcss-selector-parser": "^6.0.13", "postcss-selector-parser": "^6.0.13",
"pug": "^3.0.2", "pug": "^3.0.2",
"sass": "^1.69.5" "sass": "^1.69.5"

View File

@ -3,7 +3,7 @@ import { makeMap } from './makeMap'
const GLOBALS_ALLOWED = const GLOBALS_ALLOWED =
'Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,' + 'Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,' +
'decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,' + 'decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,' +
'Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console' 'Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error'
export const isGloballyAllowed = /*#__PURE__*/ makeMap(GLOBALS_ALLOWED) export const isGloballyAllowed = /*#__PURE__*/ makeMap(GLOBALS_ALLOWED)

View File

@ -245,8 +245,8 @@ importers:
specifier: ^9.0.3 specifier: ^9.0.3
version: 9.0.3 version: 9.0.3
postcss-modules: postcss-modules:
specifier: ^4.3.1 specifier: ^6.0.0
version: 4.3.1(postcss@8.4.31) version: 6.0.0(postcss@8.4.31)
postcss-selector-parser: postcss-selector-parser:
specifier: ^6.0.13 specifier: ^6.0.13
version: 6.0.13 version: 6.0.13
@ -3689,10 +3689,6 @@ packages:
safer-buffer: 2.1.2 safer-buffer: 2.1.2
dev: true dev: true
/icss-replace-symbols@1.1.0:
resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==}
dev: true
/icss-utils@5.1.0(postcss@8.4.31): /icss-utils@5.1.0(postcss@8.4.31):
resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
engines: {node: ^10 || ^12 || >= 14} engines: {node: ^10 || ^12 || >= 14}
@ -4917,13 +4913,13 @@ packages:
postcss: 8.4.31 postcss: 8.4.31
dev: true dev: true
/postcss-modules@4.3.1(postcss@8.4.31): /postcss-modules@6.0.0(postcss@8.4.31):
resolution: {integrity: sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==} resolution: {integrity: sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==}
peerDependencies: peerDependencies:
postcss: ^8.0.0 postcss: ^8.0.0
dependencies: dependencies:
generic-names: 4.0.0 generic-names: 4.0.0
icss-replace-symbols: 1.1.0 icss-utils: 5.1.0(postcss@8.4.31)
lodash.camelcase: 4.3.0 lodash.camelcase: 4.3.0
postcss: 8.4.31 postcss: 8.4.31
postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) postcss-modules-extract-imports: 3.0.0(postcss@8.4.31)

View File

@ -1,4 +1,5 @@
// @ts-check // @ts-check
import assert from 'node:assert/strict'
import { createRequire } from 'node:module' import { createRequire } from 'node:module'
import { fileURLToPath } from 'node:url' import { fileURLToPath } from 'node:url'
import path from 'node:path' import path from 'node:path'
@ -14,6 +15,14 @@ import alias from '@rollup/plugin-alias'
import { entries } from './scripts/aliases.js' import { entries } from './scripts/aliases.js'
import { inlineEnums } from './scripts/inline-enums.js' import { inlineEnums } from './scripts/inline-enums.js'
/**
* @template T
* @template {keyof T} K
* @typedef { Omit<T, K> & Required<Pick<T, K>> } MarkRequired
*/
/** @typedef {'cjs' | 'esm-bundler' | 'global' | 'global-runtime' | 'esm-browser' | 'esm-bundler-runtime' | 'esm-browser-runtime'} PackageFormat */
/** @typedef {MarkRequired<import('rollup').OutputOptions, 'file' | 'format'>} OutputOptions */
if (!process.env.TARGET) { if (!process.env.TARGET) {
throw new Error('TARGET package must be specified via --environment flag.') throw new Error('TARGET package must be specified via --environment flag.')
} }
@ -27,45 +36,35 @@ const consolidatePkg = require('@vue/consolidate/package.json')
const packagesDir = path.resolve(__dirname, 'packages') const packagesDir = path.resolve(__dirname, 'packages')
const packageDir = path.resolve(packagesDir, process.env.TARGET) const packageDir = path.resolve(packagesDir, process.env.TARGET)
/** @param {string} p */ const resolve = (/** @type {string} */ p) => path.resolve(packageDir, p)
const resolve = p => path.resolve(packageDir, p)
const pkg = require(resolve(`package.json`)) const pkg = require(resolve(`package.json`))
const packageOptions = pkg.buildOptions || {} const packageOptions = pkg.buildOptions || {}
const name = packageOptions.filename || path.basename(packageDir) const name = packageOptions.filename || path.basename(packageDir)
const [enumPlugin, enumDefines] = inlineEnums() const [enumPlugin, enumDefines] = inlineEnums()
/** /** @type {Record<PackageFormat, OutputOptions>} */
* @typedef { Omit<T, K> & Required<Pick<T, K>> } MarkRequired
* @template T
* @template {keyof T} K
*/
/** @typedef {import('rollup').ModuleFormat} Format */
/** @typedef {MarkRequired<import('rollup').OutputOptions, 'file'>} Output */
/** @type {Record<string, Output>} */
const outputConfigs = { const outputConfigs = {
'esm-bundler': { 'esm-bundler': {
file: resolve(`dist/${name}.esm-bundler.js`), file: resolve(`dist/${name}.esm-bundler.js`),
format: `es` format: 'es'
}, },
'esm-browser': { 'esm-browser': {
file: resolve(`dist/${name}.esm-browser.js`), file: resolve(`dist/${name}.esm-browser.js`),
format: `es` format: 'es'
}, },
cjs: { cjs: {
file: resolve(`dist/${name}.cjs.js`), file: resolve(`dist/${name}.cjs.js`),
format: `cjs` format: 'cjs'
}, },
global: { global: {
file: resolve(`dist/${name}.global.js`), file: resolve(`dist/${name}.global.js`),
format: `iife` format: 'iife'
}, },
// runtime-only builds, for main "vue" package only // runtime-only builds, for main "vue" package only
'esm-bundler-runtime': { 'esm-bundler-runtime': {
file: resolve(`dist/${name}.runtime.esm-bundler.js`), file: resolve(`dist/${name}.runtime.esm-bundler.js`),
format: `es` format: 'es'
}, },
'esm-browser-runtime': { 'esm-browser-runtime': {
file: resolve(`dist/${name}.runtime.esm-browser.js`), file: resolve(`dist/${name}.runtime.esm-browser.js`),
@ -77,20 +76,20 @@ const outputConfigs = {
} }
} }
/** @type {ReadonlyArray<PackageFormat>} */
const defaultFormats = ['esm-bundler', 'cjs'] const defaultFormats = ['esm-bundler', 'cjs']
const inlineFormats = process.env.FORMATS && process.env.FORMATS.split(',') /** @type {ReadonlyArray<PackageFormat>} */
const inlineFormats = /** @type {any} */ (
process.env.FORMATS && process.env.FORMATS.split(',')
)
/** @type {ReadonlyArray<PackageFormat>} */
const packageFormats = inlineFormats || packageOptions.formats || defaultFormats const packageFormats = inlineFormats || packageOptions.formats || defaultFormats
const packageConfigs = process.env.PROD_ONLY const packageConfigs = process.env.PROD_ONLY
? [] ? []
: packageFormats.map( : packageFormats.map(format => createConfig(format, outputConfigs[format]))
/** @param {Format} format */
format => createConfig(format, outputConfigs[format])
)
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
packageFormats.forEach( packageFormats.forEach(format => {
/** @param {Format} format */
format => {
if (packageOptions.prod === false) { if (packageOptions.prod === false) {
return return
} }
@ -100,17 +99,16 @@ if (process.env.NODE_ENV === 'production') {
if (/^(global|esm-browser)(-runtime)?/.test(format)) { if (/^(global|esm-browser)(-runtime)?/.test(format)) {
packageConfigs.push(createMinifiedConfig(format)) packageConfigs.push(createMinifiedConfig(format))
} }
} })
)
} }
export default packageConfigs export default packageConfigs
/** /**
* *
* @param {Format} format * @param {PackageFormat} format
* @param {Output} output * @param {OutputOptions} output
* @param {import('rollup').Plugin[]} plugins * @param {ReadonlyArray<import('rollup').Plugin>} plugins
* @returns {import('rollup').RollupOptions} * @returns {import('rollup').RollupOptions}
*/ */
function createConfig(format, output, plugins = []) { function createConfig(format, output, plugins = []) {
@ -180,7 +178,7 @@ function createConfig(format, output, plugins = []) {
], ],
output, output,
onwarn(msg, warn) { onwarn(msg, warn) {
if (!/Circular/.test(msg.message)) { if (msg.code !== 'CIRCULAR_DEPENDENCY') {
warn(msg) warn(msg)
} }
}, },
@ -221,7 +219,6 @@ function createConfig(format, output, plugins = []) {
if (!isBundlerESMBuild) { if (!isBundlerESMBuild) {
// hard coded dev/prod builds // hard coded dev/prod builds
// @ts-ignore
replacements.__DEV__ = String(!isProductionBuild) replacements.__DEV__ = String(!isProductionBuild)
} }
@ -229,7 +226,9 @@ function createConfig(format, output, plugins = []) {
//__RUNTIME_COMPILE__=true pnpm build runtime-core //__RUNTIME_COMPILE__=true pnpm build runtime-core
Object.keys(replacements).forEach(key => { Object.keys(replacements).forEach(key => {
if (key in process.env) { if (key in process.env) {
replacements[key] = /** @type {string} */ (process.env[key]) const value = process.env[key]
assert(typeof value === 'string')
replacements[key] = value
} }
}) })
return replacements return replacements
@ -266,7 +265,6 @@ function createConfig(format, output, plugins = []) {
} }
if (Object.keys(replacements).length) { if (Object.keys(replacements).length) {
// @ts-ignore
return [replace({ values: replacements, preventAssignment: true })] return [replace({ values: replacements, preventAssignment: true })]
} else { } else {
return [] return []
@ -304,7 +302,7 @@ function createConfig(format, output, plugins = []) {
function resolveNodePlugins() { function resolveNodePlugins() {
// we are bundling forked consolidate.js in compiler-sfc which dynamically // we are bundling forked consolidate.js in compiler-sfc which dynamically
// requires a ton of template engines which should be ignored. // requires a ton of template engines which should be ignored.
/** @type { string[] } */ /** @type {ReadonlyArray<string>} */
let cjsIgnores = [] let cjsIgnores = []
if ( if (
pkg.name === '@vue/compiler-sfc' || pkg.name === '@vue/compiler-sfc' ||
@ -339,20 +337,14 @@ function createConfig(format, output, plugins = []) {
} }
} }
/** function createProductionConfig(/** @type {PackageFormat} */ format) {
* @param {Format} format
*/
function createProductionConfig(format) {
return createConfig(format, { return createConfig(format, {
...outputConfigs[format], ...outputConfigs[format],
file: resolve(`dist/${name}.${format}.prod.js`) file: resolve(`dist/${name}.${format}.prod.js`)
}) })
} }
/** function createMinifiedConfig(/** @type {PackageFormat} */ format) {
* @param {Format} format
*/
function createMinifiedConfig(format) {
return createConfig( return createConfig(
format, format,
{ {

View File

@ -1,6 +1,7 @@
// @ts-check // @ts-check
import assert from 'node:assert/strict'
import { parse } from '@babel/parser' import { parse } from '@babel/parser'
import { existsSync, readdirSync, readFileSync, writeFileSync } from 'fs' import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'
import MagicString from 'magic-string' import MagicString from 'magic-string'
import dts from 'rollup-plugin-dts' import dts from 'rollup-plugin-dts'
@ -70,15 +71,16 @@ function patchTypes(pkg) {
if (!node.id) { if (!node.id) {
return return
} }
// @ts-ignore assert(node.id.type === 'Identifier')
const name = node.id.name const name = node.id.name
if (name.startsWith('_')) { if (name.startsWith('_')) {
return return
} }
shouldRemoveExport.add(name) shouldRemoveExport.add(name)
if (isExported.has(name)) { if (isExported.has(name)) {
// @ts-ignore const start = (parentDecl || node).start
s.prependLeft((parentDecl || node).start, `export `) assert(typeof start === 'number')
s.prependLeft(start, `export `)
} }
} }
@ -102,9 +104,10 @@ function patchTypes(pkg) {
if (node.type === 'VariableDeclaration') { if (node.type === 'VariableDeclaration') {
processDeclaration(node.declarations[0], node) processDeclaration(node.declarations[0], node)
if (node.declarations.length > 1) { if (node.declarations.length > 1) {
assert(typeof node.start === 'number')
assert(typeof node.end === 'number')
throw new Error( throw new Error(
`unhandled declare const with more than one declarators:\n${code.slice( `unhandled declare const with more than one declarators:\n${code.slice(
// @ts-ignore
node.start, node.start,
node.end node.end
)}` )}`
@ -131,7 +134,7 @@ function patchTypes(pkg) {
spec.type === 'ExportSpecifier' && spec.type === 'ExportSpecifier' &&
shouldRemoveExport.has(spec.local.name) shouldRemoveExport.has(spec.local.name)
) { ) {
// @ts-ignore assert(spec.exported.type === 'Identifier')
const exported = spec.exported.name const exported = spec.exported.name
if (exported !== spec.local.name) { if (exported !== spec.local.name) {
// this only happens if we have something like // this only happens if we have something like
@ -141,19 +144,27 @@ function patchTypes(pkg) {
} }
const next = node.specifiers[i + 1] const next = node.specifiers[i + 1]
if (next) { if (next) {
// @ts-ignore assert(typeof spec.start === 'number')
assert(typeof next.start === 'number')
s.remove(spec.start, next.start) s.remove(spec.start, next.start)
} else { } else {
// last one // last one
const prev = node.specifiers[i - 1] const prev = node.specifiers[i - 1]
// @ts-ignore assert(typeof spec.start === 'number')
s.remove(prev ? prev.end : spec.start, spec.end) assert(typeof spec.end === 'number')
s.remove(
prev
? (assert(typeof prev.end === 'number'), prev.end)
: spec.start,
spec.end
)
} }
removed++ removed++
} }
} }
if (removed === node.specifiers.length) { if (removed === node.specifiers.length) {
// @ts-ignore assert(typeof node.start === 'number')
assert(typeof node.end === 'number')
s.remove(node.start, node.end) s.remove(node.start, node.end)
} }
} }
@ -186,11 +197,8 @@ function copyMts() {
return { return {
name: 'copy-vue-mts', name: 'copy-vue-mts',
writeBundle(_, bundle) { writeBundle(_, bundle) {
writeFileSync( assert('code' in bundle['vue.d.ts'])
'packages/vue/dist/vue.d.mts', writeFileSync('packages/vue/dist/vue.d.mts', bundle['vue.d.ts'].code)
// @ts-ignore
bundle['vue.d.ts'].code
)
} }
} }
} }

View File

@ -4,7 +4,7 @@ import { readdirSync, statSync } from 'node:fs'
import path from 'node:path' import path from 'node:path'
import { fileURLToPath } from 'node:url' import { fileURLToPath } from 'node:url'
const resolveEntryForPkg = p => const resolveEntryForPkg = (/** @type {string} */ p) =>
path.resolve( path.resolve(
fileURLToPath(import.meta.url), fileURLToPath(import.meta.url),
`../../packages/${p}/src/index.ts` `../../packages/${p}/src/index.ts`
@ -12,6 +12,7 @@ const resolveEntryForPkg = p =>
const dirs = readdirSync(new URL('../packages', import.meta.url)) const dirs = readdirSync(new URL('../packages', import.meta.url))
/** @type {Record<string, string>} */
const entries = { const entries = {
vue: resolveEntryForPkg('vue'), vue: resolveEntryForPkg('vue'),
'vue/compiler-sfc': resolveEntryForPkg('compiler-sfc'), 'vue/compiler-sfc': resolveEntryForPkg('compiler-sfc'),

View File

@ -38,6 +38,7 @@ const prodOnly = !devOnly && (args.prodOnly || args.p)
const buildTypes = args.withTypes || args.t const buildTypes = args.withTypes || args.t
const sourceMap = args.sourcemap || args.s const sourceMap = args.sourcemap || args.s
const isRelease = args.release const isRelease = args.release
/** @type {boolean | undefined} */
const buildAllMatching = args.all || args.a const buildAllMatching = args.all || args.a
const writeSize = args.size const writeSize = args.size
const commit = execaSync('git', ['rev-parse', '--short=7', 'HEAD']).stdout const commit = execaSync('git', ['rev-parse', '--short=7', 'HEAD']).stdout
@ -102,7 +103,9 @@ async function runParallel(maxConcurrency, source, iteratorFn) {
ret.push(p) ret.push(p)
if (maxConcurrency <= source.length) { if (maxConcurrency <= source.length) {
const e = p.then(() => executing.splice(executing.indexOf(e), 1)) const e = p.then(() => {
executing.splice(executing.indexOf(e), 1)
})
executing.push(e) executing.push(e)
if (executing.length >= maxConcurrency) { if (executing.length >= maxConcurrency) {
await Promise.race(executing) await Promise.race(executing)

View File

@ -9,6 +9,15 @@ import { execa } from 'execa'
import { createRequire } from 'node:module' import { createRequire } from 'node:module'
import { fileURLToPath } from 'node:url' import { fileURLToPath } from 'node:url'
/**
* @typedef {{
* name: string
* version: string
* dependencies?: { [dependenciesPackageName: string]: string }
* peerDependencies?: { [peerDependenciesPackageName: string]: string }
* }} Package
*/
let versionUpdated = false let versionUpdated = false
const { prompt } = enquirer const { prompt } = enquirer
@ -25,6 +34,7 @@ const args = minimist(process.argv.slice(2), {
const preId = args.preid || semver.prerelease(currentVersion)?.[0] const preId = args.preid || semver.prerelease(currentVersion)?.[0]
const isDryRun = args.dry const isDryRun = args.dry
/** @type {boolean | undefined} */
let skipTests = args.skipTests let skipTests = args.skipTests
const skipBuild = args.skipBuild const skipBuild = args.skipBuild
const isCanary = args.canary const isCanary = args.canary
@ -43,7 +53,7 @@ const packages = fs
} }
}) })
const isCorePackage = pkgName => { const isCorePackage = (/** @type {string} */ pkgName) => {
if (!pkgName) return if (!pkgName) return
if (pkgName === 'vue' || pkgName === '@vue/compat') { if (pkgName === 'vue' || pkgName === '@vue/compat') {
@ -56,7 +66,7 @@ const isCorePackage = pkgName => {
) )
} }
const renamePackageToCanary = pkgName => { const renamePackageToCanary = (/** @type {string} */ pkgName) => {
if (pkgName === 'vue') { if (pkgName === 'vue') {
return '@vue/canary' return '@vue/canary'
} }
@ -68,25 +78,37 @@ const renamePackageToCanary = pkgName => {
return pkgName return pkgName
} }
const keepThePackageName = pkgName => pkgName const keepThePackageName = (/** @type {string} */ pkgName) => pkgName
/** @type {string[]} */
const skippedPackages = [] const skippedPackages = []
/** @type {ReadonlyArray<import('semver').ReleaseType>} */
const versionIncrements = [ const versionIncrements = [
'patch', 'patch',
'minor', 'minor',
'major', 'major',
...(preId ? ['prepatch', 'preminor', 'premajor', 'prerelease'] : []) ...(preId
? /** @type {const} */ (['prepatch', 'preminor', 'premajor', 'prerelease'])
: [])
] ]
const inc = i => semver.inc(currentVersion, i, preId) const inc = (/** @type {import('semver').ReleaseType} */ i) =>
const run = (bin, args, opts = {}) => semver.inc(currentVersion, i, preId)
execa(bin, args, { stdio: 'inherit', ...opts }) const run = async (
const dryRun = (bin, args, opts = {}) => /** @type {string} */ bin,
console.log(pico.blue(`[dryrun] ${bin} ${args.join(' ')}`), opts) /** @type {ReadonlyArray<string>} */ args,
/** @type {import('execa').Options} */ opts = {}
) => execa(bin, args, { stdio: 'inherit', ...opts })
const dryRun = async (
/** @type {string} */ bin,
/** @type {ReadonlyArray<string>} */ args,
/** @type {import('execa').Options} */ opts = {}
) => console.log(pico.blue(`[dryrun] ${bin} ${args.join(' ')}`), opts)
const runIfNotDry = isDryRun ? dryRun : run const runIfNotDry = isDryRun ? dryRun : run
const getPkgRoot = pkg => path.resolve(__dirname, '../packages/' + pkg) const getPkgRoot = (/** @type {string} */ pkg) =>
const step = msg => console.log(pico.cyan(msg)) path.resolve(__dirname, '../packages/' + pkg)
const step = (/** @type {string} */ msg) => console.log(pico.cyan(msg))
async function main() { async function main() {
if (!(await isInSyncWithRemote())) { if (!(await isInSyncWithRemote())) {
@ -137,7 +159,7 @@ async function main() {
semver.inc(latestSameDayPatch, 'prerelease', args.tag) semver.inc(latestSameDayPatch, 'prerelease', args.tag)
) )
} }
} catch (e) { } catch (/** @type {any} */ e) {
if (/E404/.test(e.message)) { if (/E404/.test(e.message)) {
// the first patch version on that day // the first patch version on that day
} else { } else {
@ -150,7 +172,7 @@ async function main() {
if (!targetVersion) { if (!targetVersion) {
// no explicit version, offer suggestions // no explicit version, offer suggestions
// @ts-ignore /** @type {{ release: string }} */
const { release } = await prompt({ const { release } = await prompt({
type: 'select', type: 'select',
name: 'release', name: 'release',
@ -159,16 +181,16 @@ async function main() {
}) })
if (release === 'custom') { if (release === 'custom') {
/** @type {{ version: string }} */
const result = await prompt({ const result = await prompt({
type: 'input', type: 'input',
name: 'version', name: 'version',
message: 'Input custom version', message: 'Input custom version',
initial: currentVersion initial: currentVersion
}) })
// @ts-ignore
targetVersion = result.version targetVersion = result.version
} else { } else {
targetVersion = release.match(/\((.*)\)/)[1] targetVersion = release.match(/\((.*)\)/)?.[1] ?? ''
} }
} }
@ -183,7 +205,7 @@ async function main() {
: `Releasing v${targetVersion}...` : `Releasing v${targetVersion}...`
) )
} else { } else {
// @ts-ignore /** @type {{ yes: boolean }} */
const { yes: confirmRelease } = await prompt({ const { yes: confirmRelease } = await prompt({
type: 'confirm', type: 'confirm',
name: 'yes', name: 'yes',
@ -201,7 +223,7 @@ async function main() {
skipTests ||= isCIPassed skipTests ||= isCIPassed
if (isCIPassed && !skipPrompts) { if (isCIPassed && !skipPrompts) {
// @ts-ignore /** @type {{ yes: boolean }} */
const { yes: promptSkipTests } = await prompt({ const { yes: promptSkipTests } = await prompt({
type: 'confirm', type: 'confirm',
name: 'yes', name: 'yes',
@ -246,7 +268,7 @@ async function main() {
await run(`pnpm`, ['run', 'changelog']) await run(`pnpm`, ['run', 'changelog'])
if (!skipPrompts) { if (!skipPrompts) {
// @ts-ignore /** @type {{ yes: boolean }} */
const { yes: changelogOk } = await prompt({ const { yes: changelogOk } = await prompt({
type: 'confirm', type: 'confirm',
name: 'yes', name: 'yes',
@ -346,7 +368,7 @@ async function isInSyncWithRemote() {
if (data.sha === (await getSha())) { if (data.sha === (await getSha())) {
return true return true
} else { } else {
// @ts-ignore /** @type {{ yes: boolean }} */
const { yes } = await prompt({ const { yes } = await prompt({
type: 'confirm', type: 'confirm',
name: 'yes', name: 'yes',
@ -372,6 +394,10 @@ async function getBranch() {
return (await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD'])).stdout return (await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD'])).stdout
} }
/**
* @param {string} version
* @param {(pkgName: string) => string} getNewPackageName
*/
function updateVersions(version, getNewPackageName = keepThePackageName) { function updateVersions(version, getNewPackageName = keepThePackageName) {
// 1. update root package.json // 1. update root package.json
updatePackage(path.resolve(__dirname, '..'), version, getNewPackageName) updatePackage(path.resolve(__dirname, '..'), version, getNewPackageName)
@ -381,8 +407,14 @@ function updateVersions(version, getNewPackageName = keepThePackageName) {
) )
} }
/**
* @param {string} pkgRoot
* @param {string} version
* @param {(pkgName: string) => string} getNewPackageName
*/
function updatePackage(pkgRoot, version, getNewPackageName) { function updatePackage(pkgRoot, version, getNewPackageName) {
const pkgPath = path.resolve(pkgRoot, 'package.json') const pkgPath = path.resolve(pkgRoot, 'package.json')
/** @type {Package} */
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))
pkg.name = getNewPackageName(pkg.name) pkg.name = getNewPackageName(pkg.name)
pkg.version = version pkg.version = version
@ -393,6 +425,12 @@ function updatePackage(pkgRoot, version, getNewPackageName) {
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n') fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n')
} }
/**
* @param {Package} pkg
* @param {'dependencies' | 'peerDependencies'} depType
* @param {string} version
* @param {(pkgName: string) => string} getNewPackageName
*/
function updateDeps(pkg, depType, version, getNewPackageName) { function updateDeps(pkg, depType, version, getNewPackageName) {
const deps = pkg[depType] const deps = pkg[depType]
if (!deps) return if (!deps) return
@ -408,6 +446,11 @@ function updateDeps(pkg, depType, version, getNewPackageName) {
}) })
} }
/**
* @param {string} pkgName
* @param {string} version
* @param {ReadonlyArray<string>} additionalFlags
*/
async function publishPackage(pkgName, version, additionalFlags) { async function publishPackage(pkgName, version, additionalFlags) {
if (skippedPackages.includes(pkgName)) { if (skippedPackages.includes(pkgName)) {
return return
@ -443,7 +486,7 @@ async function publishPackage(pkgName, version, additionalFlags) {
} }
) )
console.log(pico.green(`Successfully published ${pkgName}@${version}`)) console.log(pico.green(`Successfully published ${pkgName}@${version}`))
} catch (e) { } catch (/** @type {any} */ e) {
if (e.stderr.match(/previously published/)) { if (e.stderr.match(/previously published/)) {
console.log(pico.red(`Skipping already published: ${pkgName}`)) console.log(pico.red(`Skipping already published: ${pkgName}`))
} else { } else {

View File

@ -16,7 +16,13 @@ export const targets = fs.readdirSync('packages').filter(f => {
return true return true
}) })
/**
*
* @param {ReadonlyArray<string>} partialTargets
* @param {boolean | undefined} includeAllMatching
*/
export function fuzzyMatchTarget(partialTargets, includeAllMatching) { export function fuzzyMatchTarget(partialTargets, includeAllMatching) {
/** @type {Array<string>} */
const matched = [] const matched = []
partialTargets.forEach(partialTarget => { partialTargets.forEach(partialTarget => {
for (const target of targets) { for (const target of targets) {
@ -34,7 +40,7 @@ export function fuzzyMatchTarget(partialTargets, includeAllMatching) {
console.log() console.log()
console.error( console.error(
` ${pico.white(pico.bgRed(' ERROR '))} ${pico.red( ` ${pico.white(pico.bgRed(' ERROR '))} ${pico.red(
`Target ${pico.underline(partialTargets)} not found!` `Target ${pico.underline(partialTargets.toString())} not found!`
)}` )}`
) )
console.log() console.log()

View File

@ -11,8 +11,6 @@
"packages/template-explorer", "packages/template-explorer",
"packages/sfc-playground", "packages/sfc-playground",
"packages/dts-test", "packages/dts-test",
"rollup.config.js",
"scripts/*",
"playground" "playground"
] ]
} }

View File

@ -35,8 +35,8 @@
"packages/*/__tests__", "packages/*/__tests__",
"packages/dts-test", "packages/dts-test",
"packages/vue/jsx-runtime", "packages/vue/jsx-runtime",
"scripts/*",
"rollup.*.js", "rollup.*.js",
"playground" "playground"
], ]
"exclude": ["rollup.config.js"]
} }