diff --git a/.github/workflows/pkg.pr.new.yml b/.github/workflows/pkg.pr.new.yml index 4f45a8a046..fc5f61d1fd 100644 --- a/.github/workflows/pkg.pr.new.yml +++ b/.github/workflows/pkg.pr.new.yml @@ -20,4 +20,17 @@ jobs: - name: Build run: npm run build - - run: npx pkg-pr-new publish + # ========== Prepare examples ========== + - name: Clear examples + run: rm -rf examples + + - name: Clone examples + uses: actions/checkout@v4 + with: + repository: ant-design/ant-design-examples + path: examples + + - name: Modify examples + run: npx tsx scripts/prepare-examples.ts + + - run: npx pkg-pr-new publish --template './examples/examples/*' diff --git a/.gitignore b/.gitignore index 6b9c1d4b7e..61966b0dbc 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,4 @@ __image_snapshots__/ .node .env +examples/ diff --git a/scripts/prepare-examples.ts b/scripts/prepare-examples.ts new file mode 100644 index 0000000000..8bbf21091c --- /dev/null +++ b/scripts/prepare-examples.ts @@ -0,0 +1,81 @@ +import fg from 'fast-glob'; +import fs from 'fs-extra'; +import path from 'path'; +import cloneDeep from 'lodash/cloneDeep'; +import isPlainObject from 'lodash/isPlainObject'; + +import rootPkg from '../package.json'; + +const examples = fg.sync(['examples/examples/**/package.json'], { + cwd: process.cwd(), + onlyFiles: true, + ignore: ['**/node_modules/**', '.git'], +}); + +const _order = ['dependencies', 'devDependencies', 'peerDependencies'] as const; + +function detectRootDepsVersion(pkgName: string) { + const _pkg: any = rootPkg; + + for (let i = 0; i < _order.length; i++) { + const depKey = _order[i]; + if (_pkg?.[depKey]?.[pkgName]) { + return _pkg[depKey][pkgName]; + } + } +} + +function syncVersion(pkgJson = {}, deps: string[] = []) { + const _pkgJson: any = cloneDeep(pkgJson); + + _order.forEach((key) => { + const _processDeps = _pkgJson[key]; + + if (isPlainObject(_processDeps)) { + Object.keys(_processDeps).forEach((dep) => { + if (deps.includes(dep)) { + _processDeps[dep] = detectRootDepsVersion(dep) ?? _processDeps[dep]; + } + }); + } + }); + + return _pkgJson; +} + +function modifyPackageJson(pkgJson: any) { + if (typeof pkgJson === 'object' && pkgJson !== null) { + return { + ...syncVersion( + pkgJson, + ['@ant-design/cssinjs'], // need to sync version + ), + private: true, + author: 'antd GitHub CI', + }; + } +} + +function main() { + for (let i = 0; i < examples.length; i++) { + const example = examples[i]; + + const pkgJson = fs.readJsonSync(example); + const newPkgJson = modifyPackageJson(pkgJson) ?? pkgJson; + + // unique named package.json + newPkgJson.name = path.basename(path.dirname(example)); + + const rewritePath = process.env.CI ? example : `${example}.tmp`; // ignored + + fs.writeJsonSync(rewritePath, newPkgJson, { spaces: 2 }); + + globalThis.console.log(`🔮 [prepare-examples] ${pkgJson.name} has been prepared.`); + } +} + +/** + * 1. git clone --depth=1 git@github.com:ant-design/ant-design-examples.git examples + * 2. npx tsx scripts/prepare-examples.ts + */ +main();