diff --git a/package.json b/package.json index d381cf1..72d7796 100644 --- a/package.json +++ b/package.json @@ -58,5 +58,8 @@ "nyc": "15.1.0", "prettier": "2.4.0", "typescript": "4.4.2" + }, + "publishConfig": { + "tag": "latest" } } diff --git a/resources/build.js b/resources/build.js index 360c16a..5834e95 100644 --- a/resources/build.js +++ b/resources/build.js @@ -5,18 +5,19 @@ const path = require('path'); const assert = require('assert'); const babel = require('@babel/core'); -const prettier = require('prettier'); -const prettierConfig = JSON.parse( - fs.readFileSync(require.resolve('../.prettierrc'), 'utf-8'), -); - -const { readdirRecursive, showDirStats } = require('./utils'); +const { + writeGeneratedFile, + readdirRecursive, + showDirStats, +} = require('./utils'); if (require.main === module) { fs.rmSync('./npmDist', { recursive: true, force: true }); fs.mkdirSync('./npmDist'); + const packageJSON = buildPackageJSON(); + const srcFiles = readdirRecursive('./src', { ignoreDir: /^__.*__$/ }); for (const filepath of srcFiles) { const srcPath = path.join('./src', filepath); @@ -38,11 +39,7 @@ if (require.main === module) { fs.copyFileSync('./README.md', './npmDist/README.md'); // Should be done as the last step so only valid packages can be published - const packageJSON = buildPackageJSON(); - fs.writeFileSync( - './npmDist/package.json', - JSON.stringify(packageJSON, null, 2), - ); + writeGeneratedFile('./npmDist/package.json', JSON.stringify(packageJSON)); showDirStats('./npmDist'); } @@ -65,6 +62,10 @@ function buildPackageJSON() { delete packageJSON.scripts; delete packageJSON.devDependencies; + // TODO: move to integration tests + const publishTag = packageJSON.publishConfig?.tag; + assert(publishTag != null, 'Should have packageJSON.publishConfig defined!'); + const { version } = packageJSON; const versionMatch = /^\d+\.\d+\.\d+-?(?.*)?$/.exec(version); if (!versionMatch) { @@ -74,20 +75,20 @@ function buildPackageJSON() { const { preReleaseTag } = versionMatch.groups; if (preReleaseTag != null) { - const [tag] = preReleaseTag.split('.'); + const splittedTag = preReleaseTag.split('.'); + // Note: `experimental-*` take precedence over `alpha`, `beta` or `rc`. + const versionTag = splittedTag[2] ?? splittedTag[0]; assert( - tag.startsWith('experimental-') || ['alpha', 'beta', 'rc'].includes(tag), - `"${tag}" tag is supported.`, + ['alpha', 'beta', 'rc'].includes(versionTag) || + versionTag.startsWith('experimental-'), + `"${versionTag}" tag is not supported.`, + ); + assert.equal( + versionTag, + publishTag, + 'Publish tag and version tag should match!', ); - - assert(!packageJSON.publishConfig, 'Can not override "publishConfig".'); - packageJSON.publishConfig = { tag: tag || 'latest' }; } return packageJSON; } - -function writeGeneratedFile(filepath, body) { - const formatted = prettier.format(body, { filepath, ...prettierConfig }); - fs.writeFileSync(filepath, formatted); -} diff --git a/resources/utils.js b/resources/utils.js index 253212c..37cd83e 100644 --- a/resources/utils.js +++ b/resources/utils.js @@ -4,6 +4,8 @@ const fs = require('fs'); const path = require('path'); const childProcess = require('child_process'); +const prettier = require('prettier'); + function exec(command, options) { const output = childProcess.execSync(command, { maxBuffer: 10 * 1024 * 1024, // 10MB @@ -80,8 +82,18 @@ function showDirStats(dirPath) { ); } +const prettierConfig = JSON.parse( + fs.readFileSync(require.resolve('../.prettierrc'), 'utf-8'), +); + +function writeGeneratedFile(filepath, body) { + const formatted = prettier.format(body, { filepath, ...prettierConfig }); + fs.writeFileSync(filepath, formatted); +} + module.exports = { exec, readdirRecursive, showDirStats, + writeGeneratedFile, };