diff options
author | Daniel Schmid | 2019-11-16 00:54:46 +0000 |
---|---|---|
committer | Matthias Villiger | 2019-11-19 15:09:26 +0000 |
commit | 1068c2f35469aae8c8aa605147eda4f48b19ee5c (patch) | |
tree | 4777ee4268e2fe3239b00e9fdf18bccd2b599bcc | |
parent | ed5cf3ab872be4665895c8065ec32c31b605342b (diff) | |
download | org.eclipse.scout.rt-1068c2f35469aae8c8aa605147eda4f48b19ee5c.tar.gz org.eclipse.scout.rt-1068c2f35469aae8c8aa605147eda4f48b19ee5c.tar.xz org.eclipse.scout.rt-1068c2f35469aae8c8aa605147eda4f48b19ee5c.zip |
create releng module
Signed-off-by: Daniel Schmid <Daniel.Schmid@bsiag.com>
-rw-r--r-- | eclipse-scout-cli/bin/scout-scripts.js | 26 | ||||
-rw-r--r-- | eclipse-scout-cli/package.json | 19 | ||||
-rw-r--r-- | eclipse-scout-cli/scripts/updateVersion.js | 129 | ||||
-rw-r--r-- | eclipse-scout-core/package.json | 15 | ||||
-rw-r--r-- | eclipse-scout-releng/.gitignore | 5 | ||||
-rw-r--r-- | eclipse-scout-releng/bin/releng-scripts.js | 186 | ||||
-rw-r--r-- | eclipse-scout-releng/package.json | 36 | ||||
-rw-r--r-- | eclipse-scout-releng/scripts/snapshot-cleanup.js (renamed from eclipse-scout-cli/scripts/snapshot-cleanup.js) | 91 | ||||
-rw-r--r-- | eclipse-scout-releng/scripts/updateVersion.js | 285 | ||||
-rw-r--r-- | eclipse-scout-testing/package.json | 17 | ||||
-rw-r--r-- | eslint-config/package.json | 13 | ||||
-rw-r--r-- | karma-jasmine-scout/package.json | 13 | ||||
-rw-r--r-- | org.eclipse.scout.rt.svg.ui.html/package.json | 15 |
13 files changed, 588 insertions, 262 deletions
diff --git a/eclipse-scout-cli/bin/scout-scripts.js b/eclipse-scout-cli/bin/scout-scripts.js index 97cc7c46b9..b1d16993e1 100644 --- a/eclipse-scout-cli/bin/scout-scripts.js +++ b/eclipse-scout-cli/bin/scout-scripts.js @@ -56,32 +56,6 @@ switch (script) { runWebpackWatch({mode: 'development'}); break; } - case 'snapshot-version': { - const updateVersionScript = require('../scripts/updateVersion'); - updateVersionScript.generateSnapshotVersion() - .then(() => console.log('snapshot version done')) - .catch(e => { - console.error('snapshot version failed'); - console.error(e); - process.exit(1); - }); - break; - } - case 'release-version': { - const updateVersionScript = require('../scripts/updateVersion'); - updateVersionScript.updateVersionAndDependencies() - .then(() => console.log('Update version done')) - .catch(e => { - console.error('Update version failed'); - console.error(e); - process.exit(1); - }); - break; - } - case 'snapshot-cleanup': { - require('../scripts/snapshot-cleanup'); - break; - } default: console.log(`Unknown script "${script}"`); break; diff --git a/eclipse-scout-cli/package.json b/eclipse-scout-cli/package.json index fc0146047a..b6aa11fb16 100644 --- a/eclipse-scout-cli/package.json +++ b/eclipse-scout-cli/package.json @@ -1,6 +1,6 @@ { "name": "@eclipse-scout/cli", - "version": "10.0.0", + "version": "10.0.0-snapshot", "description": "CLI for Eclipse Scout", "author": "BSI Business Systems Integration AG", "homepage": "https://www.eclipse.org/scout", @@ -22,9 +22,11 @@ "scripts" ], "scripts": { - "snapshot-version": "node bin/scout-scripts snapshot-version", - "release-version": "node bin/scout-scripts release-version", - "snapshot-cleanup": "node bin/scout-scripts snapshot-cleanup" + "snapshot-cleanup": "releng-scripts snapshot-cleanup", + "snapshot-predependency": "releng-scripts snapshot-install-dependency", + "snapshot-postdependency": "releng-scripts snapshot-publish-dependency", + "release-predependency": "releng-scripts release-install-dependency", + "release-postdependency": "releng-scripts release-publish-dependency" }, "dependencies": { "@babel/cli": "7.6.4", @@ -33,7 +35,6 @@ "@babel/plugin-proposal-object-rest-spread": "7.6.2", "@babel/plugin-transform-object-assign": "7.2.0", "@babel/preset-env": "7.6.3", - "axios": "0.19.0", "babel-loader": "8.0.6", "clean-webpack-plugin": "3.0.0", "copy-webpack-plugin": "5.0.4", @@ -44,7 +45,7 @@ "karma-jasmine": "2.0.1", "karma-jasmine-jquery": "0.1.1", "karma-jasmine-ajax": "0.1.13", - "@eclipse-scout/karma-jasmine-scout": "^10.0.0-snapshot", + "@eclipse-scout/karma-jasmine-scout": "10.0.0-snapshot", "karma-jasmine-html-reporter": "1.4.2", "karma-junit-reporter": "2.0.1", "karma-webpack": "4.0.2", @@ -57,8 +58,10 @@ "webpack": "4.41.2", "webpack-cli": "3.3.9", "webpack-dev-server": "3.8.2", - "webpack-shell-plugin": "0.5.0", - "yargs": "14.2.0" + "webpack-shell-plugin": "0.5.0" + }, + "devDependencies": { + "@eclipse-scout/releng": "10.0.0" }, "bin": { "scout-scripts": "./bin/scout-scripts.js" diff --git a/eclipse-scout-cli/scripts/updateVersion.js b/eclipse-scout-cli/scripts/updateVersion.js deleted file mode 100644 index f56fee4bb1..0000000000 --- a/eclipse-scout-cli/scripts/updateVersion.js +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/env node -/* - * Copyright (c) 2010-2019 BSI Business Systems Integration AG. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * BSI Business Systems Integration AG - initial API and implementation - */ - -// Makes the script crash on unhandled rejections instead of silently -// ignoring them. In the future, promise rejections that are not handled will -// terminate the Node.js process with a non-zero exit code. -process.on('unhandledRejection', err => { - throw err; -}); - -const writeFile = async(fileName, file, verbose) => { - const fsp = require('fs').promises; - const stringified = JSON.stringify(file, null, 2); - if (verbose) { - console.log(`file: ${fileName}; new content:\n${stringified}`); - } - await fsp.writeFile(fileName, stringified); - if (verbose) { - console.log(`file ${fileName} saved`); - } -}; - -const updateDepencies = (dependencies, regex, version, verbose) => { - if (dependencies) { - for (const moduleName of Object.keys(dependencies)) { - if (regex.test(moduleName)) { - if (verbose) { - console.log(`updating dependency: ${moduleName}: ${version}`); - } - dependencies[moduleName] = version; - } - } - } -}; - -const updateVersionAndDependencies = async() => { - const yargs = require('yargs'); - const path = require('path'); - const argv = yargs - .option('newVersion', { - description: 'new version of the npm module', - type: 'string' - }) - .option('verbose', { - description: 'More Logging', - type: 'boolean', - default: false - }) - .argv; - - console.log(`Input arguments: new version=${argv.newVersion};verbose=${argv.verbose}`); - - if (!argv.newVersion) { - throw new Error('Please provide arguments for --newVersion'); - } - - const fileName = './package.json'; - const packageJson = require(path.resolve(fileName)); - - // update version of npm module - packageJson.version = argv.newVersion; - - // --mapping.0.regex @eclipse-scout --mapping.0.version 10.0.2 creates an object mapping = {0: {regex: @eclipse-scout; version: 10.0.2}} - if (argv.mapping) { - for (const entry of Object.values(argv.mapping)) { - if (!entry.regex || !entry.version) { - throw new Error('Please provide arguments in the form of --mapping.0.regex and --mapping.0.version'); - } - - const regex = new RegExp(`^${entry.regex}`); // the module name should start with the regex - - if (argv.verbose) { - console.log(`searching for dependencies with regex: ${regex} and updating to version=${entry.version}`); - } - updateDepencies(packageJson.dependencies, regex, entry.version, argv.verbose); - updateDepencies(packageJson.devDependencies, regex, entry.version, argv.verbose); - updateDepencies(packageJson.peerDependencies, regex, entry.version, argv.verbose); - } - } - - await writeFile(fileName, packageJson, argv.verbose); -}; - -const generateSnapshotVersion = async() => { - const yargs = require('yargs'); - const path = require('path'); - const argv = yargs - .option('verbose', { - description: 'More Logging', - type: 'boolean', - default: false - }) - .argv; - - const filename = './package.json'; - const packageJson = require(path.resolve(filename)); - - let timestamp = new Date().toISOString(); // UTC - - // Create a string with the pattern yyyyMMddHHmmss - timestamp = timestamp.replace(/[-:.TZ]/g, ''); - timestamp = timestamp.substr(0, timestamp.length - 3); - - const oldVersion = packageJson.version; - const cleanedVersion = oldVersion.replace(/-snapshot(.)*/i, ''); - const newVersion = `${cleanedVersion}-snapshot.${timestamp}`; - - if (argv.verbose) { - console.log(`old version was: ${oldVersion}`); - } - console.log(`New Version: ${newVersion}`); - packageJson.version = newVersion; - - await writeFile(filename, packageJson, argv.verbose); -}; - -module.exports = { - generateSnapshotVersion, - updateVersionAndDependencies -}; diff --git a/eclipse-scout-core/package.json b/eclipse-scout-core/package.json index a443ee16dd..f1aebe1429 100644 --- a/eclipse-scout-core/package.json +++ b/eclipse-scout-core/package.json @@ -1,6 +1,6 @@ { "name": "@eclipse-scout/core", - "version": "10.0.0", + "version": "10.0.0-snapshot", "description": "Eclipse Scout", "author": "BSI Business Systems Integration AG", "homepage": "https://www.eclipse.org/scout", @@ -31,13 +31,16 @@ "build:prod": "scout-scripts build:prod", "build:all": "scout-scripts build:dev && scout-scripts build:prod", "build:dev:watch": "scout-scripts build:dev:watch", - "snapshot-version": "scout-scripts snapshot-version", - "release-version": "scout-scripts release-version", - "snapshot-cleanup": "scout-scripts snapshot-cleanup" + "snapshot-cleanup": "releng-scripts snapshot-cleanup", + "snapshot-predependency": "releng-scripts snapshot-install-dependency", + "snapshot-postdependency": "releng-scripts snapshot-publish-dependency", + "release-predependency": "releng-scripts release-install-dependency", + "release-postdependency": "releng-scripts release-publish-dependency" }, "devDependencies": { - "@eclipse-scout/cli": "^10.0.0-snapshot", - "@eclipse-scout/testing": "^10.0.0-snapshot" + "@eclipse-scout/cli": "10.0.0-snapshot", + "@eclipse-scout/releng": "10.0.0", + "@eclipse-scout/testing": "10.0.0-snapshot" }, "dependencies": { "jquery": "3.4.1" diff --git a/eclipse-scout-releng/.gitignore b/eclipse-scout-releng/.gitignore new file mode 100644 index 0000000000..921ac61272 --- /dev/null +++ b/eclipse-scout-releng/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +test-results +node +!bin
\ No newline at end of file diff --git a/eclipse-scout-releng/bin/releng-scripts.js b/eclipse-scout-releng/bin/releng-scripts.js new file mode 100644 index 0000000000..abc0f7f13a --- /dev/null +++ b/eclipse-scout-releng/bin/releng-scripts.js @@ -0,0 +1,186 @@ +#!/usr/bin/env node +/* + * Copyright (c) BSI Business Systems Integration AG. All rights reserved. + * http://www.bsiag.com/ + */ + +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on('unhandledRejection', err => { + throw err; +}); + +const yargs = require('yargs'); + +const generateSnapshot = args => { + const script = require('../scripts/updateVersion'); + script.updateSnapshotVersion(args.verbose) + .then(() => console.log('snapshot version done')) + .catch(e => { + console.error('snapshot version failed'); + console.error(e); + process.exit(1); + }); +}; + +const setInstallSnapshotDependencies = args => { + const script = require('../scripts/updateVersion'); + script.setPreInstallSnapshotDependencies({verbose: args.verbose, dryrun: args.dryrun, excludeFolderOverride: args.excludeFolderOverride}) + .then(() => console.log('setPreInstallSnapshotDependencies version done')) + .catch(e => { + console.error('setPreInstallSnapshotDependencies version failed'); + console.error(e); + process.exit(1); + }); +}; + +const setPublishSnapshotDependencies = args => { + const script = require('../scripts/updateVersion'); + script.setPrePublishSnapshotDependencies({verbose: args.verbose, dryrun: args.dryrun, excludeFolderOverride: args.excludeFolderOverride}) + .then(() => console.log('setPublishSnapshotDependencies version done')) + .catch(e => { + console.error('setPublishSnapshotDependencies version failed'); + console.error(e); + process.exit(1); + }); +}; + +const setInstallReleaseDependencies = args => { + const script = require('../scripts/updateVersion'); + script.setPreInstallReleaseDependencies({mapping: args.mapping, verbose: args.verbose, dryrun: args.dryrun, excludeFolderOverride: args.excludeFolderOverride}) + .then(() => console.log('setInstallReleaseDependencies version done')) + .catch(e => { + console.error('setInstallReleaseDependencies version failed'); + console.error(e); + process.exit(1); + }); +}; + +const setPublishReleaseDependencies = args => { + if (!args.newVersion && !args.mapping) { + throw new Error('Please provide arguments for --newVersion or --mapping'); + } + const script = require('../scripts/updateVersion'); + script.setPrePublishReleaseDependencies({mapping: args.mapping, newVersion: args.newVersion, useRegexMap: args.useRegexMap, verbose: args.verbose, dryrun: args.dryrun, excludeFolderOverride: args.excludeFolderOverride}) + .then(() => console.log('setPublishReleaseDependencies version done')) + .catch(e => { + console.error('setPublishReleaseDependencies version failed'); + console.error(e); + process.exit(1); + }); +}; + +const cleanupArtifactory = args => { + const script = require('../scripts/snapshot-cleanup'); + script.doCleanup({url: args.url, apikey: args.apikey, user: args.user, pwd: args.pwd, reponame: args.reponame, keep: args.keep, dryrun: args.dryrun, verbose: args.verbose}) + .then(() => console.log('Repository cleanup done')) + .catch(e => { + console.error('Repository cleanup failed'); + console.error(e); + process.exit(1); + }); +}; + +yargs + .command('$0', 'default', () => { + }, argv => { + console.log(`Unknown script ${argv._[0]}`); + }) + .command('snapshot-version', 'generate a new snapshot version for the module', + () => { + }, + generateSnapshot + ) + .command('snapshot-install-dependency', 'updates dependencies for ci', + yargs => { + return yargs + .option('excludeFolderOverride', { + description: 'override the default exclusion', + type: 'array' + }); + }, + setInstallSnapshotDependencies + ) + .command('snapshot-publish-dependency', 'updates dependencies for ci', + yargs => { + return yargs + .option('excludeFolderOverride', { + description: 'override the default exclusion', + type: 'array' + }); + }, + setPublishSnapshotDependencies + ) + .command('release-install-dependency', 'updates dependencies for ci', + yargs => { + return yargs + .option('excludeFolderOverride', { + description: 'override the default exclusion', + type: 'array' + }); + }, + setInstallReleaseDependencies + ) + .command('release-publish-dependency', 'updates dependencies for ci', + yargs => { + return yargs + .option('newVersion', { + description: 'new version of the npm module', + type: 'string' + }) + .option('useRegexMap', { + description: 'true if the modules in the workspace have different versions. the regex-version mapping is used to set the version', + type: 'boolean', + default: false + }) + .option('excludeFolderOverride', { + description: 'override the default exclusion', + type: 'array' + }); + }, + setPublishReleaseDependencies + ) + .command('snapshot-cleanup', 'cleanup old modules on the artifactory', + yargs => { + return yargs + .option('apikey', { + description: 'API Key for authentication', + type: 'string' + }) + .option('url', { + description: 'URL of the artifactory', + type: 'string' + }) + .option('user', { + description: 'username', + type: 'string' + }) + .option('pwd', { + description: 'password', + type: 'string' + }) + .option('reponame', { + description: 'name of the repository', + type: 'string' + }) + .option('keep', { + description: 'Number of Artifacts to keep', + type: 'number' + }); + }, + cleanupArtifactory + ) + .option('dryrun', { + description: 'If true, simulation of the command', + type: 'boolean', + default: false + }) + .option( + 'verbose', + { + description: 'More Logging', + type: 'boolean', + default: false + } + ).argv; diff --git a/eclipse-scout-releng/package.json b/eclipse-scout-releng/package.json new file mode 100644 index 0000000000..b6a15ff550 --- /dev/null +++ b/eclipse-scout-releng/package.json @@ -0,0 +1,36 @@ +{ + "name": "@eclipse-scout/releng", + "version": "10.0.0", + "description": "Release Engineering module for Eclipse Scout", + "author": "BSI Business Systems Integration AG", + "homepage": "https://www.eclipse.org/scout", + "repository": { + "type": "git", + "url": "ssh://git.eclipse.org:29418/scout/org.eclipse.scout.rt" + }, + "license": "EPL-1.0", + "publishConfig": { + "registry": "https://scout.bsiag.com/repository/api/npm/com.bsiag.scout-npm-local/" + }, + "engines": { + "node": ">=12.2.0", + "npm": ">=6.9.0", + "pnpm": ">=4" + }, + "files": [ + "bin", + "scripts" + ], + "scripts": { + "snapshot-version": "node bin/releng-scripts snapshot-version", + "release-version": "node bin/releng-scripts release-version", + "snapshot-cleanup": "node bin/releng-scripts snapshot-cleanup" + }, + "dependencies": { + "axios": "0.19.0", + "yargs": "14.2.0" + }, + "bin": { + "releng-scripts": "./bin/releng-scripts.js" + } +} diff --git a/eclipse-scout-cli/scripts/snapshot-cleanup.js b/eclipse-scout-releng/scripts/snapshot-cleanup.js index df200bc8e8..287ba54102 100644 --- a/eclipse-scout-cli/scripts/snapshot-cleanup.js +++ b/eclipse-scout-releng/scripts/snapshot-cleanup.js @@ -1,13 +1,7 @@ #!/usr/bin/env node /* - * Copyright (c) 2014-2019 BSI Business Systems Integration AG. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * BSI Business Systems Integration AG - initial API and implementation + * Copyright (c) BSI Business Systems Integration AG. All rights reserved. + * http://www.bsiag.com/ */ const axios = require('axios'); @@ -36,7 +30,7 @@ const getPackageName = itemName => { return itemName.replace(NAME_REGEX, ''); }; -const getSnapshots = async (artifactoryUrl, repoName, config, verbose) => { +const getSnapshots = async(artifactoryUrl, repoName, config, verbose) => { const AQL_API = 'api/search/aql'; // use aql for search const searchUrl = `${artifactoryUrl}${AQL_API}`; const query = `items.find({"repo":"${repoName}","name":{"$match":"*snapshot.*tgz"}})`; @@ -71,7 +65,7 @@ const getSnapshots = async (artifactoryUrl, repoName, config, verbose) => { return snapshotMap; }; -const calculateItemsToDelete = async (itemMap, noToKeep) => { +const calculateItemsToDelete = async(itemMap, noToKeep) => { const toDelete = []; for (const itemSet of itemMap.values()) { // order the snapshots of each package by date and select the oldest items to delete @@ -83,7 +77,7 @@ const calculateItemsToDelete = async (itemMap, noToKeep) => { return toDelete; }; -const deleteItems = async (artifactoryUrl, items, config, dryrun) => { +const deleteItems = async(artifactoryUrl, items, config, dryrun) => { let success = true; if (!items || items.length === 0) { console.log('Nothing to cleanup'); @@ -109,49 +103,11 @@ const deleteItems = async (artifactoryUrl, items, config, dryrun) => { } }; -const doCleanup = async () => { - const yargs = require('yargs'); - const argv = yargs - .option('apikey', { - description: 'API Key for authentication', - type: 'string' - }) - .option('url', { - description: 'URL of the artifactory', - type: 'string' - }) - .option('user', { - description: 'username', - type: 'string' - }) - .option('pwd', { - description: 'password', - type: 'string' - }) - .option('reponame', { - description: 'name of the repository', - type: 'string' - }) - .option('dryrun', { - description: 'If true, the command only indicates which artifacts would have been deleted.', - type: 'boolean', - default: false - }) - .option('keep', { - description: 'Number of Artifacts to keep', - type: 'number', - default: 5 - }) - .option('verbose', { - description: 'More Logging', - type: 'boolean', - default: false - }) - .argv; - - console.log(`Input arguments: url=${argv.url}; repo-name=${argv.reponame}; number of artifacts to keep=${argv.keep}; dry-run=${argv.dryrun}; verbose=${argv.verbose}`); - - if (!argv.reponame || !argv.url) { +const doCleanup = async({url, apikey, user, pwd, reponame, keep = 5, dryrun = false, verbose = false}) => { + + console.log(`Input arguments: url=${url}; repo-name=${reponame}; number of artifacts to keep=${keep}; dry-run=${dryrun}; verbose=${verbose}`); + + if (!reponame || !url) { throw new Error('Please provide arguments for --url and --repo-name'); } @@ -159,32 +115,27 @@ const doCleanup = async () => { 'Content-Type': 'text/plain' }; - if (argv.apikey) { - headers['X-JFrog-Art-Api'] = argv.apikey; + if (apikey) { + headers['X-JFrog-Art-Api'] = apikey; } const config = { headers: headers }; - if (!argv.apikey && argv.user && argv.pwd) { + if (!apikey && user && pwd) { config.auth = { - username: argv.user, - password: argv.pwd + username: user, + password: pwd }; } - const foundItems = await getSnapshots(argv.url, argv.reponame, config, argv.verbose); - const itemsToDelete = await calculateItemsToDelete(foundItems, argv.keep); - await deleteItems(argv.url, itemsToDelete, config, argv.dryrun); + const foundItems = await getSnapshots(url, reponame, config, verbose); + const itemsToDelete = await calculateItemsToDelete(foundItems, keep); + await deleteItems(url, itemsToDelete, config, dryrun); }; -doCleanup() - .then(() => console.log('Repository cleanup done')) - .catch(e => { - console.error('Repository cleanup failed'); - console.error(e); - process.exit(1); - }); - +module.exports = { + doCleanup +}; diff --git a/eclipse-scout-releng/scripts/updateVersion.js b/eclipse-scout-releng/scripts/updateVersion.js new file mode 100644 index 0000000000..9775c0e5f1 --- /dev/null +++ b/eclipse-scout-releng/scripts/updateVersion.js @@ -0,0 +1,285 @@ +#!/usr/bin/env node +/* + * Copyright (c) 2010-2019 BSI Business Systems Integration AG. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * BSI Business Systems Integration AG - initial API and implementation + */ + +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on('unhandledRejection', err => { + throw err; +}); + +const path = require('path'); +const fs = require('fs'); +const fsp = fs.promises; + +const writeFile = async(fileName, file, verbose) => { + const stringified = JSON.stringify(file, null, 2); + if (verbose) { + console.log(`file: ${fileName}; new content:\n${stringified}`); + } + await fsp.writeFile(fileName, stringified); + if (verbose) { + console.log(`file ${fileName} saved`); + } +}; + +/** + * generates a timestamp with the pattern yyyyMMddHHmmss + * @returns {string} + */ +const generateTimeStamp = () => { + let timestamp = new Date().toISOString(); // UTC + + // Create a string with the pattern yyyyMMddHHmmss + timestamp = timestamp.replace(/[-:.TZ]/g, ''); + timestamp = timestamp.substr(0, timestamp.length - 3); + return timestamp; +}; + +/** + * generates a snapshot-version of the current module version and the timestamp + * @param moduleVersion + * @param timestamp + * @param verbose + * @returns {string} + */ +const generateSnapshotVersion = ({moduleVersion, timestamp, verbose}) => { + const cleanedVersion = moduleVersion.replace(/-snapshot(.)*/i, ''); + const newVersion = `${cleanedVersion}-snapshot.${timestamp}`; + + if (verbose) { + console.log(`old version was: ${moduleVersion}`); + } + console.log(`New Version: ${newVersion}`); + return newVersion; +}; + + +const updateSnapshotVersion = async verbose => { + const filename = './package.json'; + const packageJson = require(path.resolve(filename)); + packageJson.version = generateSnapshotVersion({moduleVersion: packageJson.version, timestamp: generateTimeStamp(), verbose}); + await writeFile(filename, packageJson, verbose); +}; + +/** + * searches the matching regex for the module name and returns the corresponding version. + * @param moduleName + * @param mapping + * @param newModuleVersion + * @param useRegexMap + * @param updateWorkspaceDependencies + * @param verbose + * @returns {string | *} + */ +const createReleaseVersionConstraint = ({moduleName, mapping, newModuleVersion, useRegexMap = false, updateWorkspaceDependencies, verbose}) => { + // --mapping.0.regex @eclipse-scout --mapping.0.version 10.0.2 creates an object mapping = {0: {regex: @eclipse-scout; version: 10.0.2}} + if (updateWorkspaceDependencies && !useRegexMap) { + // all Modules in the repository/workspace get the same version + return newModuleVersion; + } + if (mapping) { + for (const entry of Object.values(mapping)) { + if (!entry.regex || !entry.version) { + throw new Error('Please provide arguments in the form of --mapping.0.regex and --mapping.0.version'); + } + + const regex = new RegExp(`^${entry.regex}`); // the module name should start with the regex + if (regex.test(moduleName)) { + if (verbose) { + console.log(`new release constraint form: ${moduleName}: ${entry.version}`); + } + return entry.version; + } + } + } + throw new Error(`couldn't find a constraint for ${moduleName}! Please provide a matching regex`); +}; + +/** + * generates the constraint for a snapshot build + * @param oldConstraint + * @returns {string} + */ +const createSnapshotVersionConstraint = oldConstraint => { + const cleanedModuleVersion = oldConstraint.replace(/-snapshot(.)*/i, ''); + const versionConstraint = `>=${cleanedModuleVersion}-snapshot <${cleanedModuleVersion}`; // ">=10.0.0-snapshot <10.0.0" + return versionConstraint; +}; + +const updateDependencyConstraints = ({dependencies, modulesInWorkspace = [], updateWorkspaceDependencies, isSnapshot, mapping, verbose, newModuleVersion, useRegexMap}) => { + if (!dependencies) { + return; + } + + const regex = new RegExp('-snapshot$'); + for (const [moduleName, version] of Object.entries(dependencies)) { + if (regex.test(version)) { + if ((updateWorkspaceDependencies && modulesInWorkspace.includes(moduleName)) || (!updateWorkspaceDependencies && !modulesInWorkspace.includes(moduleName))) { + const versionConstraint = isSnapshot ? createSnapshotVersionConstraint(version) : createReleaseVersionConstraint({moduleName, mapping, newModuleVersion: newModuleVersion, useRegexMap, updateWorkspaceDependencies, verbose}); + console.log(`dependency ${moduleName} with version ${version} needs to be updated. new constraint: ${versionConstraint}`); + dependencies[moduleName] = versionConstraint; + } else { + if (verbose) { + console.log(`dependency ${moduleName} with version ${version} is in the workspace. no update`); + } + } + } else { + if (verbose) { + console.log(`dependency ${moduleName} with version ${version} is not a snapshot. no update`); + } + } + } +}; + +/** + * find pnpm-workspace.yaml file by going up the directory tree + * @param dir where to start searching + * @param verbose more logging + * @returns {Promise<*>} + */ +const findWorkspaceFileDir = async(dir, verbose) => { + const filePath = path.join(dir, 'pnpm-workspace.yaml'); + if (fs.existsSync(filePath)) { + if (verbose) { + console.log('workspace dir: ' + dir); + } + return dir; + } + + const parentDir = path.join(dir, '../'); + if (dir === parentDir) { + throw new Error('there is no workspace file'); + } + return findWorkspaceFileDir(parentDir, verbose); +}; + +/** + * returns the folders which are excluded by default + * @param excludeFolderOverride + * @returns {*[]|*} + */ +const getExcludedFolders = excludeFolderOverride => { + if (!excludeFolderOverride) { + return ['node_modules', '.git', '.settings', '.idea', 'target', 'src']; + } + return excludeFolderOverride; +}; +/** + * searches all npm modules in the workspace. + * @param dir + * @param verbose + * @param result + * @returns {Promise<Array>} key is the name of the module, value is the path to the package.json file + */ +const findNpmModules = async({dir, verbose, result = [], excludeFolderOverride}) => { + const excludedFolders = getExcludedFolders(excludeFolderOverride); + const files = await fsp.readdir(dir); + for (const file of files) { + const filePath = path.resolve(dir, file); + const state = await fsp.stat(filePath); + if (state.isDirectory() && !excludedFolders.includes(file)) { + // go deeper + await findNpmModules({dir: filePath, verbose, result, excludeFolderOverride}); + } else { + if (file === 'package.json' ) { + if (verbose) { + console.log(`found a package.json here: ${filePath}`); + } + + const packageJson = require(filePath); + const name = packageJson.name; + result[name] = filePath; + } + } + } + return result; +}; + +const collectModulesInWorkspace = async(startDir, excludeFolderOverride, verbose) => { + const root = await findWorkspaceFileDir(startDir, verbose); + console.log('start searching for package.json files...'); + const result = await findNpmModules({dir: root, verbose, excludeFolderOverride}); + return result; +}; + + +const updateAllPackageJsons = async({isSnapshot = true, updateWorkspaceDependencies = false, releaseDependencyMapping = {}, newVersion, useRegexMap = false, verbose = false, dryrun = false, excludeFolderOverride}) => { + const filename = './package.json'; + const filePath = path.resolve(filename); + const dir = path.dirname(filePath); + const foundModulesMap = await collectModulesInWorkspace(dir, excludeFolderOverride, verbose); + if (!foundModulesMap) { + console.log('no modules found'); + return; + } + + const modulesInWorkspace = Object.keys(foundModulesMap); + for (const modulePath of Object.values(foundModulesMap)) { + const packageJson = require(modulePath); + console.log(`updating version/dependency for module: ${packageJson.name}`); + // update version of this module + if (newVersion || useRegexMap) { + if (isSnapshot) { + packageJson.version = generateSnapshotVersion({moduleVersion: packageJson.version, timestamp: newVersion, verbose}); + } else { + if (!useRegexMap) { + packageJson.version = newVersion; + } else { + packageJson.version = createReleaseVersionConstraint({moduleName: packageJson.name, mapping: releaseDependencyMapping, newVersion, useRegexMap, updateWorkspaceDependencies, verbose}); + } + } + if (verbose) { + console.log(`new version for module: ${packageJson.version}`); + } + } + + // update dependencies of this module + updateDependencyConstraints({dependencies: packageJson.dependencies, modulesInWorkspace, updateWorkspaceDependencies, isSnapshot, mapping: releaseDependencyMapping, newModuleVersion: newVersion, useRegexMap, verbose}); + updateDependencyConstraints({dependencies: packageJson.devDependencies, modulesInWorkspace, updateWorkspaceDependencies, isSnapshot, mapping: releaseDependencyMapping, newModuleVersion: newVersion, useRegexMap, verbose}); + updateDependencyConstraints({dependencies: packageJson.peerDependencies, modulesInWorkspace, updateWorkspaceDependencies, isSnapshot, mapping: releaseDependencyMapping, newModuleVersion: newVersion, useRegexMap, verbose}); + updateDependencyConstraints({dependencies: packageJson.bundledDependencies, modulesInWorkspace, updateWorkspaceDependencies, isSnapshot, mapping: releaseDependencyMapping, newModuleVersion: newVersion, useRegexMap, verbose}); + updateDependencyConstraints({dependencies: packageJson.optionalDependencies, modulesInWorkspace, updateWorkspaceDependencies, isSnapshot, mapping: releaseDependencyMapping, newModuleVersion: newVersion, useRegexMap, verbose}); + + if (!dryrun) { + await writeFile(modulePath, packageJson, verbose); + } else { + console.log(JSON.stringify(packageJson, null, 2)); + } + } +}; + +const setPreInstallSnapshotDependencies = async({verbose, dryrun, excludeFolderOverride}) => { + await updateAllPackageJsons({isSnapshot: true, updateWorkspaceDependencies: false, verbose, dryrun, excludeFolderOverride}); +}; + +const setPrePublishSnapshotDependencies = async({verbose, dryrun, excludeFolderOverride}) => { + const timeStamp = generateTimeStamp(); + await updateAllPackageJsons({isSnapshot: true, updateWorkspaceDependencies: true, newVersion: timeStamp, verbose, dryrun, excludeFolderOverride}); +}; + +const setPreInstallReleaseDependencies = async({mapping, verbose, dryrun, excludeFolderOverride}) => { + await updateAllPackageJsons({isSnapshot: false, updateWorkspaceDependencies: false, releaseDependencyMapping: mapping, verbose, dryrun, excludeFolderOverride}); + +}; + +const setPrePublishReleaseDependencies = async({mapping, newVersion, verbose, dryrun, useRegexMap, excludeFolderOverride}) => { + await updateAllPackageJsons({isSnapshot: false, updateWorkspaceDependencies: true, releaseDependencyMapping: mapping, newVersion, useRegexMap, verbose, dryrun, excludeFolderOverride}); +}; + +module.exports = { + updateSnapshotVersion, + setPreInstallSnapshotDependencies, + setPrePublishSnapshotDependencies, + setPreInstallReleaseDependencies, + setPrePublishReleaseDependencies +}; diff --git a/eclipse-scout-testing/package.json b/eclipse-scout-testing/package.json index b4ed67e91b..97f2666d27 100644 --- a/eclipse-scout-testing/package.json +++ b/eclipse-scout-testing/package.json @@ -1,6 +1,6 @@ { "name": "@eclipse-scout/testing", - "version": "10.0.0", + "version": "10.0.0-snapshot", "description": "Eclipse Scout", "author": "BSI Business Systems Integration AG", "homepage": "https://www.eclipse.org/scout", @@ -22,17 +22,20 @@ "src" ], "scripts": { - "snapshot-version": "scout-scripts snapshot-version", - "release-version": "scout-scripts release-version", - "snapshot-cleanup": "scout-scripts snapshot-cleanup" + "snapshot-cleanup": "releng-scripts snapshot-cleanup", + "snapshot-predependency": "releng-scripts snapshot-install-dependency", + "snapshot-postdependency": "releng-scripts snapshot-publish-dependency", + "release-predependency": "releng-scripts release-install-dependency", + "release-postdependency": "releng-scripts release-publish-dependency" }, "devDependencies": { - "@eclipse-scout/cli": "^10.0.0-snapshot", + "@eclipse-scout/cli": "10.0.0-snapshot", + "@eclipse-scout/releng": "10.0.0", "jquery": "3.4.1", - "@eclipse-scout/core": "^10.0.0-snapshot" + "@eclipse-scout/core": "10.0.0-snapshot" }, "peerDependencies": { "jquery": "3.4.1", - "@eclipse-scout/core": "^10.0.0-snapshot" + "@eclipse-scout/core": "10.0.0-snapshot" } } diff --git a/eslint-config/package.json b/eslint-config/package.json index f738110aaa..bead84c76c 100644 --- a/eslint-config/package.json +++ b/eslint-config/package.json @@ -1,6 +1,6 @@ { "name": "@eclipse-scout/eslint-config", - "version": "10.0.0", + "version": "10.0.0-snapshot", "description": "ESLint shareable config for the Scout style", "author": "BSI Business Systems Integration AG", "homepage": "https://www.eclipse.org/scout", @@ -42,12 +42,15 @@ "src" ], "scripts": { - "snapshot-version": "scout-scripts snapshot-version", - "release-version": "scout-scripts release-version", - "snapshot-cleanup": "scout-scripts snapshot-cleanup" + "snapshot-cleanup": "releng-scripts snapshot-cleanup", + "snapshot-predependency": "releng-scripts snapshot-install-dependency", + "snapshot-postdependency": "releng-scripts snapshot-publish-dependency", + "release-predependency": "releng-scripts release-install-dependency", + "release-postdependency": "releng-scripts release-publish-dependency" }, "devDependencies": { - "@eclipse-scout/cli": "^10.0.0-snapshot", + "@eclipse-scout/cli": "10.0.0-snapshot", + "@eclipse-scout/releng": "10.0.0", "eslint": "6.5.1" }, "peerDependencies": { diff --git a/karma-jasmine-scout/package.json b/karma-jasmine-scout/package.json index d600b4de15..4dc7e9b305 100644 --- a/karma-jasmine-scout/package.json +++ b/karma-jasmine-scout/package.json @@ -1,6 +1,6 @@ { "name": "@eclipse-scout/karma-jasmine-scout", - "version": "10.0.0", + "version": "10.0.0-snapshot", "description": "Scout plugin for Jasmine in Karma", "author": "BSI Business Systems Integration AG", "homepage": "https://www.eclipse.org/scout", @@ -25,12 +25,15 @@ "testserver:start": "scout-scripts test-server:start", "testserver:stop": "scout-scripts test-server:stop", "test:ci": "scout-scripts test:ci", - "snapshot-version": "scout-scripts snapshot-version", - "release-version": "scout-scripts release-version", - "snapshot-cleanup": "scout-scripts snapshot-cleanup" + "snapshot-cleanup": "releng-scripts snapshot-cleanup", + "snapshot-predependency": "releng-scripts snapshot-install-dependency", + "snapshot-postdependency": "releng-scripts snapshot-publish-dependency", + "release-predependency": "releng-scripts release-install-dependency", + "release-postdependency": "releng-scripts release-publish-dependency" }, "devDependencies": { - "@eclipse-scout/cli": "^10.0.0-snapshot" + "@eclipse-scout/cli": "10.0.0-snapshot", + "@eclipse-scout/releng": "10.0.0" }, "dependencies": { "jquery": "3.4.1" diff --git a/org.eclipse.scout.rt.svg.ui.html/package.json b/org.eclipse.scout.rt.svg.ui.html/package.json index d4d735a03f..6c9c8bcb3d 100644 --- a/org.eclipse.scout.rt.svg.ui.html/package.json +++ b/org.eclipse.scout.rt.svg.ui.html/package.json @@ -1,6 +1,6 @@ { "name": "@eclipse-scout/svg", - "version": "10.0.0", + "version": "10.0.0-snapshot", "description": "Eclipse Scout", "author": "BSI Business Systems Integration AG", "homepage": "https://www.eclipse.org/scout", @@ -26,15 +26,18 @@ "build:prod": "scout-scripts build:prod", "build:all": "scout-scripts build:dev && scout-scripts build:prod", "build:dev:watch": "scout-scripts build:dev:watch", - "snapshot-version": "scout-scripts snapshot-version", - "release-version": "scout-scripts release-version", - "snapshot-cleanup": "scout-scripts snapshot-cleanup" + "snapshot-cleanup": "releng-scripts snapshot-cleanup", + "snapshot-predependency": "releng-scripts snapshot-install-dependency", + "snapshot-postdependency": "releng-scripts snapshot-publish-dependency", + "release-predependency": "releng-scripts release-install-dependency", + "release-postdependency": "releng-scripts release-publish-dependency" }, "devDependencies": { - "@eclipse-scout/cli": "^10.0.0-snapshot" + "@eclipse-scout/cli": "10.0.0-snapshot", + "@eclipse-scout/releng": "10.0.0" }, "dependencies": { - "@eclipse-scout/core": "^10.0.0-snapshot", + "@eclipse-scout/core": "10.0.0-snapshot", "jquery": "3.4.1" }, "peerDependencies": { |