| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- import { existsSync } from 'node:fs'
- import { cp, mkdir, readFile, rm, stat, writeFile } from 'node:fs/promises'
- import { basename, join, resolve } from 'node:path'
- import { spawnSync } from 'node:child_process'
- const sourceRoot = process.cwd()
- const args = process.argv.slice(2)
- const readArg = (name, fallback) => {
- const index = args.indexOf(name)
- return index >= 0 ? args[index + 1] : fallback
- }
- const outputRoot = resolve(
- sourceRoot,
- readArg(
- '--out-dir',
- process.env.FILE_VIEWER_COMPONENT_REPO_DIR ||
- process.env.FILE_VIEWER_WRAPPER_REPO_DIR ||
- '.release/component-repos'
- )
- )
- const sourceDir = join(sourceRoot, 'packages', 'core')
- const rootPackage = await readJson(join(sourceRoot, 'package.json'))
- const corePackage = await readJson(join(sourceDir, 'package.json'))
- const ecosystemManifest = await readJson(join(sourceRoot, 'ecosystem', 'wrappers.json'))
- const coreMetadata = ecosystemManifest.corePackage
- const targetDir = join(outputRoot, coreMetadata.repository)
- const workspaceVersions = new Map([
- [rootPackage.name, rootPackage.version],
- [corePackage.name, corePackage.version]
- ])
- for (const renderer of ecosystemManifest.renderers || []) {
- const rendererPackage = await readJson(join(sourceRoot, renderer.packageDir, 'package.json'))
- workspaceVersions.set(rendererPackage.name, rendererPackage.version)
- }
- function run(command, commandArgs) {
- const result = spawnSync(command, commandArgs, {
- cwd: sourceRoot,
- encoding: 'utf8',
- stdio: 'pipe'
- })
- if (result.status !== 0) {
- throw new Error(`Command failed: ${command} ${commandArgs.join(' ')}\n${result.stderr || result.stdout}`)
- }
- return result.stdout.trim()
- }
- async function readJson(path) {
- return JSON.parse(await readFile(path, 'utf8'))
- }
- async function writeJson(path, value) {
- await writeFile(path, `${JSON.stringify(value, null, 2)}\n`, 'utf8')
- }
- function normalizeWorkspaceRange(dependencyName, range) {
- if (!range?.startsWith?.('workspace:')) {
- return range
- }
- const workspaceRange = range.slice('workspace:'.length)
- if (workspaceRange === '*' || workspaceRange === '') {
- const version = workspaceVersions.get(dependencyName)
- return version ? `^${version}` : `^${rootPackage.version}`
- }
- return workspaceRange
- }
- function normalizeDependencyBlock(block) {
- if (!block) {
- return
- }
- for (const [dependencyName, range] of Object.entries(block)) {
- block[dependencyName] = normalizeWorkspaceRange(dependencyName, range)
- }
- }
- async function assertDirectory(path, label = path) {
- if (!existsSync(path)) {
- throw new Error(`Missing directory: ${label}`)
- }
- const info = await stat(path)
- if (!info.isDirectory()) {
- throw new Error(`Not a directory: ${label}`)
- }
- }
- async function assertFile(path, label = path) {
- if (!existsSync(path)) {
- throw new Error(`Missing file: ${label}`)
- }
- const info = await stat(path)
- if (!info.isFile()) {
- throw new Error(`Not a file: ${label}`)
- }
- }
- async function removePath(path) {
- await rm(path, { recursive: true, force: true })
- }
- const shouldCopy = source => {
- const name = basename(source)
- return ![
- '.DS_Store',
- '.git',
- '.vercel',
- 'dist',
- 'node_modules',
- 'tsconfig.tsbuildinfo'
- ].includes(name)
- }
- async function copyCleanDir(from, to) {
- await removePath(to)
- await mkdir(to, { recursive: true })
- await cp(from, to, {
- recursive: true,
- force: true,
- filter: shouldCopy
- })
- }
- async function normalizePackageJson() {
- const packageJson = {
- ...corePackage,
- packageManager: rootPackage.packageManager,
- private: false,
- repository: {
- type: 'git',
- url: `git+${coreMetadata.github}.git`
- },
- homepage: coreMetadata.github,
- bugs: {
- url: `${coreMetadata.github}/issues`
- },
- scripts: {
- ...corePackage.scripts,
- build: 'node scripts/clean-dist.mjs && tsc -b tsconfig.json --force && node scripts/fix-core-esm-extensions.mjs'
- }
- }
- normalizeDependencyBlock(packageJson.dependencies)
- normalizeDependencyBlock(packageJson.devDependencies)
- normalizeDependencyBlock(packageJson.peerDependencies)
- normalizeDependencyBlock(packageJson.optionalDependencies)
- await writeJson(join(targetDir, 'package.json'), packageJson)
- }
- async function writeGitignore() {
- await writeFile(
- join(targetDir, '.gitignore'),
- [
- 'node_modules/',
- 'dist/',
- '*.tgz',
- '*.tsbuildinfo',
- '.DS_Store',
- '.pnpm-store/',
- '.npm-cache/',
- ''
- ].join('\n'),
- 'utf8'
- )
- }
- async function writeManifest() {
- await writeJson(join(targetDir, 'package-repo-manifest.json'), {
- schemaVersion: 1,
- generatedAt: new Date().toISOString(),
- sourceBranch: run('git', ['branch', '--show-current']),
- sourceCommit: run('git', ['rev-parse', '--short', 'HEAD']),
- organization: ecosystemManifest.organization,
- packageName: coreMetadata.packageName,
- packageVersion: corePackage.version,
- repository: coreMetadata.repository,
- github: coreMetadata.github,
- gitee: coreMetadata.gitee,
- aggregateRepository: coreMetadata.aggregateRepository,
- sourcePackageDir: 'packages/core'
- })
- }
- await assertDirectory(sourceDir, 'packages/core')
- await mkdir(outputRoot, { recursive: true })
- await copyCleanDir(sourceDir, targetDir)
- await cp(join(sourceRoot, 'LICENSE'), join(targetDir, 'LICENSE'), { force: true })
- await cp(
- join(sourceRoot, 'scripts', 'fix-core-esm-extensions.mjs'),
- join(targetDir, 'scripts', 'fix-core-esm-extensions.mjs'),
- { force: true }
- )
- await normalizePackageJson()
- await writeGitignore()
- await writeManifest()
- await assertFile(join(targetDir, 'package.json'), 'core package.json')
- await assertFile(join(targetDir, 'README.md'), 'core README.md')
- await assertFile(join(targetDir, 'README.en.md'), 'core README.en.md')
- await assertFile(join(targetDir, 'LICENSE'), 'core LICENSE')
- await assertFile(join(targetDir, 'src', 'index.ts'), 'core src/index.ts')
- console.log(`Prepared ${coreMetadata.packageName} -> ${targetDir}`)
|