From 7d5fe4f86cdfdc1870b7420cd888089c5fd704a9 Mon Sep 17 00:00:00 2001 From: sudhirverma Date: Thu, 5 Apr 2018 15:01:08 +0530 Subject: [PATCH 1/4] Uninstaller application #1041 --- uninstaller/.angular-cli.json | 60 ++++++++++++ uninstaller/.babelrc | 3 + uninstaller/.editorconfig | 13 +++ uninstaller/.gitignore | 19 ++++ uninstaller/README.md | 0 uninstaller/browser/.eslintrc.js | 11 +++ uninstaller/browser/index.html | 10 ++ uninstaller/create-uninstaller.ps1 | 26 ------ uninstaller/gulp-tasks/common.ts | 20 ++++ uninstaller/gulp-tasks/config.ts | 22 +++++ uninstaller/gulpfile.ts | 99 ++++++++++++++++++++ uninstaller/karma.conf.js | 33 +++++++ uninstaller/main/index.ts | 83 +++++++++++++++++ uninstaller/package.json | 74 +++++++++++++++ uninstaller/protractor.conf.js | 28 ++++++ uninstaller/tsconfig.json | 19 ++++ uninstaller/tslint.json | 143 +++++++++++++++++++++++++++++ uninstaller/uninstall-helper.ps1 | 143 ----------------------------- uninstaller/uninstall.ico | Bin 315518 -> 0 bytes uninstaller/uninstall.ps1 | 7 -- 20 files changed, 637 insertions(+), 176 deletions(-) create mode 100644 uninstaller/.angular-cli.json create mode 100644 uninstaller/.babelrc create mode 100644 uninstaller/.editorconfig create mode 100644 uninstaller/.gitignore create mode 100644 uninstaller/README.md create mode 100644 uninstaller/browser/.eslintrc.js create mode 100644 uninstaller/browser/index.html delete mode 100644 uninstaller/create-uninstaller.ps1 create mode 100644 uninstaller/gulp-tasks/common.ts create mode 100644 uninstaller/gulp-tasks/config.ts create mode 100644 uninstaller/gulpfile.ts create mode 100644 uninstaller/karma.conf.js create mode 100644 uninstaller/main/index.ts create mode 100644 uninstaller/package.json create mode 100644 uninstaller/protractor.conf.js create mode 100644 uninstaller/tsconfig.json create mode 100644 uninstaller/tslint.json delete mode 100644 uninstaller/uninstall-helper.ps1 delete mode 100644 uninstaller/uninstall.ico delete mode 100644 uninstaller/uninstall.ps1 diff --git a/uninstaller/.angular-cli.json b/uninstaller/.angular-cli.json new file mode 100644 index 00000000..76076d23 --- /dev/null +++ b/uninstaller/.angular-cli.json @@ -0,0 +1,60 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "project": { + "name": "uninstaller" + }, + "apps": [ + { + "root": "src", + "outDir": "dist", + "assets": [ + "assets", + "favicon.ico" + ], + "index": "index.html", + "main": "main.ts", + "polyfills": "polyfills.ts", + "test": "test.ts", + "tsconfig": "tsconfig.app.json", + "testTsconfig": "tsconfig.spec.json", + "prefix": "app", + "styles": [ + "styles.css" + ], + "scripts": [], + "environmentSource": "environments/environment.ts", + "environments": { + "dev": "environments/environment.ts", + "prod": "environments/environment.prod.ts" + } + } + ], + "e2e": { + "protractor": { + "config": "./protractor.conf.js" + } + }, + "lint": [ + { + "project": "src/tsconfig.app.json", + "exclude": "**/node_modules/**" + }, + { + "project": "src/tsconfig.spec.json", + "exclude": "**/node_modules/**" + }, + { + "project": "e2e/tsconfig.e2e.json", + "exclude": "**/node_modules/**" + } + ], + "test": { + "karma": { + "config": "./karma.conf.js" + } + }, + "defaults": { + "styleExt": "css", + "component": {} + } +} diff --git a/uninstaller/.babelrc b/uninstaller/.babelrc new file mode 100644 index 00000000..aedb9046 --- /dev/null +++ b/uninstaller/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["angular"] +} diff --git a/uninstaller/.editorconfig b/uninstaller/.editorconfig new file mode 100644 index 00000000..6e87a003 --- /dev/null +++ b/uninstaller/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/uninstaller/.gitignore b/uninstaller/.gitignore new file mode 100644 index 00000000..09c82cfe --- /dev/null +++ b/uninstaller/.gitignore @@ -0,0 +1,19 @@ +node_modules +dist +jspm_packages +transpiled +package +build +tools +browser/config.js +test/jspm-config.js +.idea +xunit.xml +browser-tests.xml +ui-tests.xml +system-tests.xml +requirements-cache/ +coverage/ +.DS_Store +screenshots +npm-debug.log diff --git a/uninstaller/README.md b/uninstaller/README.md new file mode 100644 index 00000000..e69de29b diff --git a/uninstaller/browser/.eslintrc.js b/uninstaller/browser/.eslintrc.js new file mode 100644 index 00000000..a2b3a15a --- /dev/null +++ b/uninstaller/browser/.eslintrc.js @@ -0,0 +1,11 @@ +module.exports = { + "env": { + "browser": true + }, + "globals": { + "angular": true, + "menu": true, + "MenuItem": true, + "restoreMenu": true + } +}; diff --git a/uninstaller/browser/index.html b/uninstaller/browser/index.html new file mode 100644 index 00000000..556ec616 --- /dev/null +++ b/uninstaller/browser/index.html @@ -0,0 +1,10 @@ + + + + + let's get started + + +

with electron.....................

+ + diff --git a/uninstaller/create-uninstaller.ps1 b/uninstaller/create-uninstaller.ps1 deleted file mode 100644 index 81bae46a..00000000 --- a/uninstaller/create-uninstaller.ps1 +++ /dev/null @@ -1,26 +0,0 @@ -$targetLocation = $args[0] -$timeStamp = $args[1] -$versionString = $args[2] - -$powershell = where.exe powershell -$uninstallItem = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" -$devsuiteItem = "$uninstallItem\DevelopmentSuite$timeStamp" -$uninstallIcon = "$targetLocation\uninstaller\uninstall.ico" -# sign all shell scripts and replace ByPass to AllSigned -$uninstallString = "$powershell -ExecutionPolicy ByPass -File `"$targetLocation\uninstaller\uninstall.ps1`" $timeStamp" -$installDate = Get-Date -Format yyyyMMdd - -Get-ChildItem $uninstallItem | where-object { ($_.PSChildName -like "DevelopmentSuite*" -and (Get-ItemProperty -Path $_.PSPath -Name InstallLocation).InstallLocation -like "$targetLocation") } | ForEach-Object {Remove-Item -Path $_.PSPath } - -New-Item -Path "$uninstallItem" -Name "DevelopmentSuite$timeStamp" -New-ItemProperty -Path $devsuiteItem -Name DisplayName -Value "Red Hat Development Suite" -New-ItemProperty -Path $devsuiteItem -Name DisplayVersion -Value $versionString -New-ItemProperty -Path $devsuiteItem -Name InstallLocation -Value "$targetLocation" -New-ItemProperty -Path $devsuiteItem -Name Comments -Value "$targetLocation" -New-ItemProperty -Path $devsuiteItem -Name NoRepair -PropertyType DWORD -Value 1 -New-ItemProperty -Path $devsuiteItem -Name NoModify -PropertyType DWORD -Value 1 -New-ItemProperty -Path $devsuiteItem -Name InstallDate -Value $installDate -New-ItemProperty -Path $devsuiteItem -Name Publisher -Value "RedHat, Inc." -New-ItemProperty -Path $devsuiteItem -Name UninstallString -Value "$uninstallString" -New-ItemProperty -Path $devsuiteItem -Name DisplayIcon -Value "$uninstallIcon" -[Environment]::Exit(0); diff --git a/uninstaller/gulp-tasks/common.ts b/uninstaller/gulp-tasks/common.ts new file mode 100644 index 00000000..a6c073f3 --- /dev/null +++ b/uninstaller/gulp-tasks/common.ts @@ -0,0 +1,20 @@ +'use strict'; + +let path = require('path'), + fs = require('fs-extra'); + +// Create default callback for exec +function createExecCallback(cb, quiet) { + return function(err, stdout, stderr) { + if (!quiet) { + console.log(stdout); + } + console.log(stderr); + cb(err); + }; +} + + +module.exports = { + createExecCallback +}; diff --git a/uninstaller/gulp-tasks/config.ts b/uninstaller/gulp-tasks/config.ts new file mode 100644 index 00000000..eec68059 --- /dev/null +++ b/uninstaller/gulp-tasks/config.ts @@ -0,0 +1,22 @@ +'use strict'; + +const path = require('path'); + +let config = { + artifactName : 'devsuite', + artifactPlatform : process.platform, + artifactArch : process.arch, + buildFolderRoot : '', + buildFileNamePrefix : '', + // use folder outside buildFolder so that a 'clean' task won't wipe out the cache + prefetchFolder : 'requirements-cache', + buildFolderPath : '', + configIcon : '' +}; + +config.buildFolderRoot = path.join('dist', config.artifactPlatform + '-' + config.artifactArch ); +config.buildFileNamePrefix = config.artifactName; +config.buildFolderPath = path.resolve(config.buildFolderRoot); +config.configIcon = path.resolve(path.join('resources', config.artifactName + '.ico')); + +module.exports = config; diff --git a/uninstaller/gulpfile.ts b/uninstaller/gulpfile.ts new file mode 100644 index 00000000..b5303a78 --- /dev/null +++ b/uninstaller/gulpfile.ts @@ -0,0 +1,99 @@ +'use strict'; + +var gulp = require('gulp'), + babel = require('gulp-babel'), + runSequence = require('run-sequence'), + del = require('del'), + exec = require('child_process').exec, + pjson = require('./package.json'), + path = require('path'), + mkdirp = require('mkdirp'), + merge = require('merge-stream'), + sourcemaps = require('gulp-sourcemaps'), + symlink = require('gulp-symlink'), + common = require('./gulp-tasks/common'), + config = require('./gulp-tasks/config'), + + + +process.on('uncaughtException', function(err) { + if(err) { + throw err; + } +}); + +// transpile sources and copy resources to a separate folder +gulp.task('transpile:app', function() { + var sources = gulp.src(['browser/**/*.js', 'main/*', '*.js'], {base: '.'}) + .pipe(sourcemaps.init()) + .pipe(babel()) + .pipe(sourcemaps.write()) + .pipe(gulp.dest('transpiled')); + + var resources = gulp.src(['browser/**/*', '!browser/**/*.js', 'package.json', + 'cheatsheets/*', 'uninstaller/*', 'requirements.json', 'channels.json', 'resources/*'], {base: '.'} + ).pipe(gulp.dest('transpiled')); + + return merge(sources, resources); +}); + +//create symlink to node_modules in transpiled folder +gulp.task('create-modules-link', function () { + return gulp.src('node_modules') + .pipe(symlink('transpiled/node_modules', {force:true})); +}); + +gulp.task('electron-rebuild', function(cb) { + var electronrebuild = path.join('node_modules', '.bin', 'electron-rebuild'); + exec(electronrebuild, common.createExecCallback(cb, true)); +}); + +// clean dist/ AND prefetch-dependencies/ folder +gulp.task('clean-all', ['clean'], function() { + return del([config.prefetchFolder], { force: true }); +}); + +// clean dist/ folder in prep for fresh build +gulp.task('clean', ['clean-transpiled'], function() { + return del('dist', { force: true }); +}); + +// clean transpiled/ folder in prep for fresh build +gulp.task('clean-transpiled', function() { + return del(['transpiled'], { force: true }); +}); + +gulp.task('create-dist-dir', function(cb) { + return mkdirp(config.buildFolderPath, cb); +}); + +gulp.task('generate', ['create-modules-link', 'update-requirements', 'electron-rebuild'], function(cb) { + var electronVersion = pjson.devDependencies['electron']; + var cmd = path.join('node_modules', '.bin') + path.sep + 'electron-packager transpiled ' + config.artifactName + ' --platform=' + config.artifactPlatform + ' --arch=' + config.artifactArch; + cmd += ' --version=' + electronVersion + ' --out="' + config.buildFolderPath + '" --overwrite --asar.unpack=**/browser/**/*.ps1 --asar.unpackDir="browser/model/helpers/win32/*"'; + cmd += ' --version-string.CompanyName="Red Hat, Inc."'; + cmd += ' --version-string.ProductName="' + pjson.productName + '"'; + cmd += ' --version-string.OriginalFilename="' + config.artifactName + '-' + pjson.version + '-installer.exe"'; + cmd += ' --version-string.FileDescription="' + pjson.description + ' v' + pjson.version + '"'; + cmd += ' --app-copyright="Copyright 2016 Red Hat, Inc."'; + cmd += ' --app-version="' + pjson.version + '"' + ' --build-version="' + pjson.version + '"'; + cmd += ' --prune --ignore="test|' + config.prefetchFolder + '|node_modules/patternfly/(node_modules|src|backstop_data|backstop)|.github|readme.md|README.md|CHANGELOG.md|changelog.md|CHANGES|CHANDES.md|changes.md|.travis.yml|.npmignore.|.eslintrc"'; + cmd += ' --icon="' + config.configIcon + '"'; + exec(cmd, common.createExecCallback(cb, true)); +}); + +// default task +gulp.task('default', ['run-clean']); + +gulp.task('run-clean', function(cb) { + return runSequence( 'clean-transpiled', 'run', cb); +}); + +gulp.task('run', ['update-requirements', 'create-modules-link', 'electron-rebuild'], function(cb) { + let skipInstall = process.argv.filter(name => name === '--skipInstall').length == 1 ? "skipInstall":""; + console.log(path.join('node_modules', '.bin') + path.sep + 'electron transpiled ' + skipInstall) + exec(path.join('node_modules', '.bin') + path.sep + 'electron transpiled ' + skipInstall, common.createExecCallback(cb)); +}); + +gulp.task('update-requirements', ['transpile:app'], function() { +}); diff --git a/uninstaller/karma.conf.js b/uninstaller/karma.conf.js new file mode 100644 index 00000000..af139fad --- /dev/null +++ b/uninstaller/karma.conf.js @@ -0,0 +1,33 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular/cli'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular/cli/plugins/karma') + ], + client:{ + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + reports: [ 'html', 'lcovonly' ], + fixWebpackSourcePaths: true + }, + angularCli: { + environment: 'dev' + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/uninstaller/main/index.ts b/uninstaller/main/index.ts new file mode 100644 index 00000000..576a92d1 --- /dev/null +++ b/uninstaller/main/index.ts @@ -0,0 +1,83 @@ +'use strict'; +import { app, ipcMain, BrowserWindow, dialog, Menu, globalShortcut } from 'electron'; + +// Keep a global reference of the window object, if you don't, the window will +// be closed automatically when the JavaScript object is garbage collected. +let mainWindow = null; + +ipcMain.on('crash', function(event, arg) { + process.crash(arg); +}); + +// Rebroadcasts installComplete event from Renderer back to Renderer. +// Bit of a hack, but it enables async messaging in UI. +ipcMain.on('installComplete', (event, arg) => { + event.sender.send('installComplete', arg); +}); + +ipcMain.on('downloadingComplete', (event, arg) => { + event.sender.send('downloadingComplete', arg); +}); + +ipcMain.on('checkComplete', (event, arg) => { + event.sender.send('checkComplete', arg); +}); + +// Quit when all windows are closed. +app.on('window-all-closed', function() { + app.quit(); +}); + + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +app.on('ready', function() { + // Create the browser window. + mainWindow = new BrowserWindow({ + useContentSize: true, + width: 1010, + height: 650, + 'autoHideMenuBar': true, + resizable: false, + show: false + }); + // Some processing is required to make sure local file can be opened in browser + // windows allows # in names and it should be replaced with ASCII encoding. + let baseLocation = encodeURI(__dirname.replace(/\\/g, '/')).replace(/#/g, '%23'); + + // Load the index.html of the app + mainWindow.loadURL(`file://${baseLocation}/../browser/index.html`); + + // only for windows where 7zip pass location where self extracting archive + // was unpacked + if (process.platform === 'win32') { + mainWindow.bundleTempFolder = process.argv.length > 1 ? process.argv[1].replace(/^--/, '') : undefined; + } + + mainWindow.skipInstall = process.argv.filter(name => name == 'skipInstall').length == 1; + + mainWindow.once('ready-to-show', () => { + mainWindow.show(); + }); + + // Emitted when the window is closed. + mainWindow.on('closed', function() { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + mainWindow = null; + }); + + mainWindow.on('close', function(e) { + let opt = { + type: 'none', + buttons: ['Yes', 'No'], + defaultId: 1, + cancelId: 1, + message: 'Are you sure you want to close the installer?' + }; + if (dialog.showMessageBox(mainWindow, opt)) { + e.preventDefault(); + } + }); +}); diff --git a/uninstaller/package.json b/uninstaller/package.json new file mode 100644 index 00000000..c54c4e39 --- /dev/null +++ b/uninstaller/package.json @@ -0,0 +1,74 @@ +{ + "name": "devstudio-platform-installer", + "productName": "Red Hat Development Suite Installer", + "version": "2.3.0-GA", + "description": "Red Hat Development Suite Installer", + "main": "main/index.js", + "repository": { + "type": "git", + "url": "https://github.com/redhat-developer-tooling/developer-platform-install.git" + }, + "author": "Red Hat Developer Tooling Group", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/redhat-developer-tooling/developer-platform-install/issues" + }, + "homepage": "https://github.com/redhat-developer-tooling/developer-platform-install#readme", + "scripts": { + "start": "./node_modules/.bin/gulp", + "update-deps": "node_modules/.bin/ncu --upgrade --loglevel verbose --packageFile package.json && npm update" + }, + "dependencies": { + "@angular/animations": "^5.2.0", + "@angular/common": "^5.2.0", + "@angular/compiler": "^5.2.0", + "@angular/core": "^5.2.0", + "@angular/forms": "^5.2.0", + "@angular/http": "^5.2.0", + "@angular/platform-browser": "^5.2.0", + "@angular/platform-browser-dynamic": "^5.2.0", + "@angular/router": "^5.2.0", + "core-js": "^2.4.1", + "rxjs": "^5.5.6", + "zone.js": "^0.8.19" + }, + "devDependencies": { + "@angular/cli": "~1.7.3", + "@angular/compiler-cli": "^5.2.0", + "@angular/language-service": "^5.2.0", + "@types/jasmine": "~2.8.3", + "@types/jasminewd2": "~2.0.2", + "@types/node": "~9.6.1", + "babel-core": "6.26.0", + "babel-preset-angular": "^6.0.15", + "bootstrap": "4.0.0", + "codelyzer": "^4.0.1", + "del": "3.0.0", + "electron": "1.8.4", + "electron-builder": "20.8.1", + "electron-packager": "12.0.0", + "electron-rebuild": "1.7.3", + "gulp": "3.9.1", + "gulp-babel": "7.0.1", + "gulp-core": "0.1.3-alpha", + "gulp-run": "1.7.1", + "gulp-sourcemaps": "2.6.4", + "gulp-symlink": "2.1.4", + "jasmine-core": "~3.1.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~2.0.0", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "^1.2.1", + "karma-jasmine": "~1.1.0", + "karma-jasmine-html-reporter": "^1.0.0", + "merge-stream": "1.0.1", + "mkdirp": "0.5.1", + "ngx-bootstrap": "2.0.3", + "path": "0.12.7", + "protractor": "~5.3.0", + "run-sequence": "2.2.1", + "ts-node": "~5.0.1", + "tslint": "~5.9.1", + "typescript": "~2.8.1" + } +} diff --git a/uninstaller/protractor.conf.js b/uninstaller/protractor.conf.js new file mode 100644 index 00000000..7ee3b5ee --- /dev/null +++ b/uninstaller/protractor.conf.js @@ -0,0 +1,28 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './e2e/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: 'e2e/tsconfig.e2e.json' + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; diff --git a/uninstaller/tsconfig.json b/uninstaller/tsconfig.json new file mode 100644 index 00000000..a6c016bf --- /dev/null +++ b/uninstaller/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es5", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2017", + "dom" + ] + } +} diff --git a/uninstaller/tslint.json b/uninstaller/tslint.json new file mode 100644 index 00000000..9963d6c3 --- /dev/null +++ b/uninstaller/tslint.json @@ -0,0 +1,143 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "deprecation": { + "severity": "warn" + }, + "eofline": true, + "forin": true, + "import-blacklist": [ + true, + "rxjs", + "rxjs/Rx" + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "no-output-on-prefix": true, + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true + } +} diff --git a/uninstaller/uninstall-helper.ps1 b/uninstaller/uninstall-helper.ps1 deleted file mode 100644 index 9931e41c..00000000 --- a/uninstaller/uninstall-helper.ps1 +++ /dev/null @@ -1,143 +0,0 @@ -# -for ($i=0; $i -le $args.Count - 1; $i++) { - $folder += $args[$i] + " " -} -$timeStamp = $args[-1] - -[array]$subfolders = Get-ChildItem "$folder\.." -Directory -ErrorAction SilentlyContinue | ForEach-Object { $_.FullName } - -for ($i=0; $i -le $subfolders.Count - 1; $i++) { - $Source = $subfolders[$i] - $random = Get-Random - $target = $subfolders[$i]+$random - $path = "move ""$Source"" ""$target"" >nul 2>nul && echo nolock || echo lock" - $status = cmd.exe /c $path - if ($status -replace '\s','' -eq 'lock'){ - Write-Host "DevSuite folder '$Source' is locked by running program or file opened in editor. Please close all running tools/editors and try again." - $lock +=1; - } else { - $command = "move ""$target"" ""$Source"" >nul 2>nul" - cmd.exe /c $command - } -} - -if ($lock) { - Write-Host "Press any key to exit" - $key = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") - exit -} else { - $vboxInstalled = Test-Path $folder'\..\virtualbox' - $openjdkInstalled = Test-Path $folder'\..\jdk8' - - $devstudiofolder = $folder + '\..\devstudio'; - $devstudioInstalled = Test-Path $devstudiofolder; - - $cygwinfolder = $folder + '\..\cygwin'; - $cygwinInstalled = Test-Path $cygwinfolder; - - echo 'Uninstalling Red Hat Development Suite' - - if ( $vboxInstalled ) { - echo 'Removing VirtualBox' - $vbox = Get-WmiObject Win32_Product | where {$_.Name -like '*VirtualBox*'} - msiexec /x $vbox.IdentifyingNumber /qb /norestart | Out-Null - echo 'DONE' - - $vboxVmsExists = Test-Path $env:USERPROFILE'\VirtualBox VMs' - if($vboxVmsExists) { - echo 'Removing VirtualBox VMs folder' - Remove-Item -Recurse $env:USERPROFILE'\VirtualBox VMs' - echo 'DONE' - } - } - - if ( $openJdkInstalled ) { - echo 'Removing Red Hat OpenJDK' - $vbox = Get-WmiObject Win32_Product | where {$_.Name -like '*OpenJDK*'} - msiexec /x $vbox.IdentifyingNumber /qb /norestart | Out-Null - echo 'DONE' - } - - if ($devstudioInstalled) { - echo 'Removing shortcuts' - [xml]$installConfig = Get-Content $devstudiofolder'\InstallConfigRecord-devstudio.xml'; - $shortcuts = $installConfig.AutomatedInstallation.'com.izforge.izpack.panels.ShortcutPanel'.shortcut.name; - - $desktop = [Environment]::GetFolderPath("Desktop"); - $programs = [Environment]::GetFolderPath("Programs"); - - $shortcuts | % { - if ((Test-Path $desktop'\'$_'.lnk')) { - Remove-Item $desktop'\'$_'.lnk'; - } elseif (Test-Path $programs'\'$_) { - Remove-Item -path \\?\$programs'\'$_ -Force -Recurse - } - } - echo 'DONE' - } - - if($cygwinInstalled) { - $cygwinfolder = (Resolve-Path $cygwinfolder).Path; - $publicDesktop = [Environment]::GetEnvironmentVariable("Public") + "\Desktop"; - $startMenu = "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\Cygwin"; - $shell = New-Object -ComObject WScript.Shell; - - if (-Not (Test-Path $startMenu)) { - $startMenu = ''; - } - - $shortcuts = Get-ChildItem -Path $publicDesktop,$startMenu "cygwin*.lnk"; - foreach($shortcut in $shortcuts) { - $target = $shell.CreateShortcut($shortcut.FullName).TargetPath; - if ($target -like "$cygwinfolder*") { - Remove-Item -Force $shortcut.FullName; - } - } - - if (($startMenu.Length -gt 0) -and ((Get-ChildItem $startMenu | Measure-Object).Count -eq 0)) { - Remove-Item -Force -Recurse $startMenu; - } - } - - $targetFolder = [System.IO.Path]::GetFullPath((Join-Path ($folder) '..')) - - echo 'Removing installation folder' - - $major = $PSVersionTable.PSVersion.Major - $minor = $PSVersionTable.PSVersion.Minor - - if ("$major.$minor" -gt "5.0") { - Remove-Item -path "\\?\$targetFolder" -Force -Recurse - } else { - New-Item "$folder\..\temp" -type Directory -Force | Out-Null - robocopy "$folder\..\temp" "$targetFolder" /purge | Out-Null - Remove-Item -path "$targetFolder" -Force -Recurse - } - - echo 'DONE' - - echo 'Removing path entries' - function Clear-Path { - param([string]$type) - [string[]] $pathFolders = [Environment]::GetEnvironmentVariable("Path", $type) -Split ';' - [Collections.ArrayList] $folderList = New-Object Collections.Arraylist - - $pathFolders | foreach { - If (-Not ($_ -like "$targetFolder*")) { - $folderList.Add($_) | Out-Null - } - } - - [string] $delimitedFolders = $folderList -Join ';' - [Environment]::SetEnvironmentVariable("Path", $delimitedFolders, $type) - } - - Clear-Path -type "User" - Clear-Path -type "Machine" - - Remove-Item -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\DevelopmentSuite$timeStamp" - - echo 'DONE' - #Write-Host "Press any key to exit" - #$key = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") -} diff --git a/uninstaller/uninstall.ico b/uninstaller/uninstall.ico deleted file mode 100644 index 944b8e5441a1a2c237d0ec462d7da9daaa095351..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315518 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 diff --git a/uninstaller/uninstall.ps1 b/uninstaller/uninstall.ps1 deleted file mode 100644 index 083d80f8..00000000 --- a/uninstaller/uninstall.ps1 +++ /dev/null @@ -1,7 +0,0 @@ -$timeStamp = $args[0] -$folder = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition - -Copy-Item $folder/uninstall-helper.ps1 $env:TEMP/uninstall-helper.ps1 -cd ../.. -# sign all shell scripts and replace ByPass to AllSigned -Start-Process powershell.exe -Verb runAs -ArgumentList "-ExecutionPolicy ByPass -File `"$env:TEMP\uninstall-helper.ps1`" $folder $timeStamp" From c24928247e41727d88ab9c5c2ce28db8154d552c Mon Sep 17 00:00:00 2001 From: sudhirverma Date: Thu, 5 Apr 2018 16:56:52 +0530 Subject: [PATCH 2/4] Uninstaller application #1041 --- uninstall/.angular-cli.json | 15 +++++ {uninstaller => uninstall}/.babelrc | 0 {uninstaller => uninstall}/.editorconfig | 0 {uninstaller => uninstall}/.gitignore | 0 uninstall/README.md | 1 + .../browser/.eslintrc.ts | 0 {uninstaller => uninstall}/browser/index.html | 0 .../gulp-tasks/common.ts | 0 .../gulp-tasks/config.ts | 0 {uninstaller => uninstall}/gulpfile.ts | 4 ++ {uninstaller => uninstall}/karma.conf.js | 0 {uninstaller => uninstall}/main/index.ts | 25 -------- {uninstaller => uninstall}/package.json | 8 --- {uninstaller => uninstall}/protractor.conf.js | 7 --- {uninstaller => uninstall}/tsconfig.json | 0 {uninstaller => uninstall}/tslint.json | 0 uninstaller/.angular-cli.json | 60 ------------------- uninstaller/README.md | 0 18 files changed, 20 insertions(+), 100 deletions(-) create mode 100644 uninstall/.angular-cli.json rename {uninstaller => uninstall}/.babelrc (100%) rename {uninstaller => uninstall}/.editorconfig (100%) rename {uninstaller => uninstall}/.gitignore (100%) create mode 100644 uninstall/README.md rename uninstaller/browser/.eslintrc.js => uninstall/browser/.eslintrc.ts (100%) rename {uninstaller => uninstall}/browser/index.html (100%) rename {uninstaller => uninstall}/gulp-tasks/common.ts (100%) rename {uninstaller => uninstall}/gulp-tasks/config.ts (100%) rename {uninstaller => uninstall}/gulpfile.ts (97%) rename {uninstaller => uninstall}/karma.conf.js (100%) rename {uninstaller => uninstall}/main/index.ts (62%) rename {uninstaller => uninstall}/package.json (85%) rename {uninstaller => uninstall}/protractor.conf.js (77%) rename {uninstaller => uninstall}/tsconfig.json (100%) rename {uninstaller => uninstall}/tslint.json (100%) delete mode 100644 uninstaller/.angular-cli.json delete mode 100644 uninstaller/README.md diff --git a/uninstall/.angular-cli.json b/uninstall/.angular-cli.json new file mode 100644 index 00000000..e31faf7a --- /dev/null +++ b/uninstall/.angular-cli.json @@ -0,0 +1,15 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "project": { + "name": "uninstall" + }, + "test": { + "karma": { + "config": "./karma.conf.js" + } + }, + "defaults": { + "styleExt": "css", + "component": {} + } +} diff --git a/uninstaller/.babelrc b/uninstall/.babelrc similarity index 100% rename from uninstaller/.babelrc rename to uninstall/.babelrc diff --git a/uninstaller/.editorconfig b/uninstall/.editorconfig similarity index 100% rename from uninstaller/.editorconfig rename to uninstall/.editorconfig diff --git a/uninstaller/.gitignore b/uninstall/.gitignore similarity index 100% rename from uninstaller/.gitignore rename to uninstall/.gitignore diff --git a/uninstall/README.md b/uninstall/README.md new file mode 100644 index 00000000..316df265 --- /dev/null +++ b/uninstall/README.md @@ -0,0 +1 @@ +# Uninstall diff --git a/uninstaller/browser/.eslintrc.js b/uninstall/browser/.eslintrc.ts similarity index 100% rename from uninstaller/browser/.eslintrc.js rename to uninstall/browser/.eslintrc.ts diff --git a/uninstaller/browser/index.html b/uninstall/browser/index.html similarity index 100% rename from uninstaller/browser/index.html rename to uninstall/browser/index.html diff --git a/uninstaller/gulp-tasks/common.ts b/uninstall/gulp-tasks/common.ts similarity index 100% rename from uninstaller/gulp-tasks/common.ts rename to uninstall/gulp-tasks/common.ts diff --git a/uninstaller/gulp-tasks/config.ts b/uninstall/gulp-tasks/config.ts similarity index 100% rename from uninstaller/gulp-tasks/config.ts rename to uninstall/gulp-tasks/config.ts diff --git a/uninstaller/gulpfile.ts b/uninstall/gulpfile.ts similarity index 97% rename from uninstaller/gulpfile.ts rename to uninstall/gulpfile.ts index b5303a78..8617b3cc 100644 --- a/uninstaller/gulpfile.ts +++ b/uninstall/gulpfile.ts @@ -1,8 +1,11 @@ 'use strict'; +// import gulp from 'gulp'; var gulp = require('gulp'), + fs = require('fs-extra'), babel = require('gulp-babel'), runSequence = require('run-sequence'), + request = require('request'), del = require('del'), exec = require('child_process').exec, pjson = require('./package.json'), @@ -13,6 +16,7 @@ var gulp = require('gulp'), symlink = require('gulp-symlink'), common = require('./gulp-tasks/common'), config = require('./gulp-tasks/config'), + yargs = require('yargs'); diff --git a/uninstaller/karma.conf.js b/uninstall/karma.conf.js similarity index 100% rename from uninstaller/karma.conf.js rename to uninstall/karma.conf.js diff --git a/uninstaller/main/index.ts b/uninstall/main/index.ts similarity index 62% rename from uninstaller/main/index.ts rename to uninstall/main/index.ts index 576a92d1..b71bb578 100644 --- a/uninstaller/main/index.ts +++ b/uninstall/main/index.ts @@ -9,20 +9,6 @@ ipcMain.on('crash', function(event, arg) { process.crash(arg); }); -// Rebroadcasts installComplete event from Renderer back to Renderer. -// Bit of a hack, but it enables async messaging in UI. -ipcMain.on('installComplete', (event, arg) => { - event.sender.send('installComplete', arg); -}); - -ipcMain.on('downloadingComplete', (event, arg) => { - event.sender.send('downloadingComplete', arg); -}); - -ipcMain.on('checkComplete', (event, arg) => { - event.sender.send('checkComplete', arg); -}); - // Quit when all windows are closed. app.on('window-all-closed', function() { app.quit(); @@ -48,23 +34,12 @@ app.on('ready', function() { // Load the index.html of the app mainWindow.loadURL(`file://${baseLocation}/../browser/index.html`); - // only for windows where 7zip pass location where self extracting archive - // was unpacked - if (process.platform === 'win32') { - mainWindow.bundleTempFolder = process.argv.length > 1 ? process.argv[1].replace(/^--/, '') : undefined; - } - - mainWindow.skipInstall = process.argv.filter(name => name == 'skipInstall').length == 1; - mainWindow.once('ready-to-show', () => { mainWindow.show(); }); // Emitted when the window is closed. mainWindow.on('closed', function() { - // Dereference the window object, usually you would store windows - // in an array if your app supports multi windows, this is the time - // when you should delete the corresponding element. mainWindow = null; }); diff --git a/uninstaller/package.json b/uninstall/package.json similarity index 85% rename from uninstaller/package.json rename to uninstall/package.json index c54c4e39..6951f75d 100644 --- a/uninstaller/package.json +++ b/uninstall/package.json @@ -4,16 +4,8 @@ "version": "2.3.0-GA", "description": "Red Hat Development Suite Installer", "main": "main/index.js", - "repository": { - "type": "git", - "url": "https://github.com/redhat-developer-tooling/developer-platform-install.git" - }, "author": "Red Hat Developer Tooling Group", "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/redhat-developer-tooling/developer-platform-install/issues" - }, - "homepage": "https://github.com/redhat-developer-tooling/developer-platform-install#readme", "scripts": { "start": "./node_modules/.bin/gulp", "update-deps": "node_modules/.bin/ncu --upgrade --loglevel verbose --packageFile package.json && npm update" diff --git a/uninstaller/protractor.conf.js b/uninstall/protractor.conf.js similarity index 77% rename from uninstaller/protractor.conf.js rename to uninstall/protractor.conf.js index 7ee3b5ee..0457e29d 100644 --- a/uninstaller/protractor.conf.js +++ b/uninstall/protractor.conf.js @@ -5,14 +5,10 @@ const { SpecReporter } = require('jasmine-spec-reporter'); exports.config = { allScriptsTimeout: 11000, - specs: [ - './e2e/**/*.e2e-spec.ts' - ], capabilities: { 'browserName': 'chrome' }, directConnect: true, - baseUrl: 'http://localhost:4200/', framework: 'jasmine', jasmineNodeOpts: { showColors: true, @@ -20,9 +16,6 @@ exports.config = { print: function() {} }, onPrepare() { - require('ts-node').register({ - project: 'e2e/tsconfig.e2e.json' - }); jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); } }; diff --git a/uninstaller/tsconfig.json b/uninstall/tsconfig.json similarity index 100% rename from uninstaller/tsconfig.json rename to uninstall/tsconfig.json diff --git a/uninstaller/tslint.json b/uninstall/tslint.json similarity index 100% rename from uninstaller/tslint.json rename to uninstall/tslint.json diff --git a/uninstaller/.angular-cli.json b/uninstaller/.angular-cli.json deleted file mode 100644 index 76076d23..00000000 --- a/uninstaller/.angular-cli.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "project": { - "name": "uninstaller" - }, - "apps": [ - { - "root": "src", - "outDir": "dist", - "assets": [ - "assets", - "favicon.ico" - ], - "index": "index.html", - "main": "main.ts", - "polyfills": "polyfills.ts", - "test": "test.ts", - "tsconfig": "tsconfig.app.json", - "testTsconfig": "tsconfig.spec.json", - "prefix": "app", - "styles": [ - "styles.css" - ], - "scripts": [], - "environmentSource": "environments/environment.ts", - "environments": { - "dev": "environments/environment.ts", - "prod": "environments/environment.prod.ts" - } - } - ], - "e2e": { - "protractor": { - "config": "./protractor.conf.js" - } - }, - "lint": [ - { - "project": "src/tsconfig.app.json", - "exclude": "**/node_modules/**" - }, - { - "project": "src/tsconfig.spec.json", - "exclude": "**/node_modules/**" - }, - { - "project": "e2e/tsconfig.e2e.json", - "exclude": "**/node_modules/**" - } - ], - "test": { - "karma": { - "config": "./karma.conf.js" - } - }, - "defaults": { - "styleExt": "css", - "component": {} - } -} diff --git a/uninstaller/README.md b/uninstaller/README.md deleted file mode 100644 index e69de29b..00000000 From 82997c8c1453045ea56ae3cb14606a8e8e69bcfa Mon Sep 17 00:00:00 2001 From: sudhirverma Date: Thu, 5 Apr 2018 17:33:42 +0530 Subject: [PATCH 3/4] uninstaller application --- uninstall/gulpfile.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/uninstall/gulpfile.ts b/uninstall/gulpfile.ts index 8617b3cc..ee4cc2f2 100644 --- a/uninstall/gulpfile.ts +++ b/uninstall/gulpfile.ts @@ -34,8 +34,7 @@ gulp.task('transpile:app', function() { .pipe(sourcemaps.write()) .pipe(gulp.dest('transpiled')); - var resources = gulp.src(['browser/**/*', '!browser/**/*.js', 'package.json', - 'cheatsheets/*', 'uninstaller/*', 'requirements.json', 'channels.json', 'resources/*'], {base: '.'} + var resources = gulp.src(['browser/**/*', '!browser/**/*.js', 'package.json'], {base: '.'} ).pipe(gulp.dest('transpiled')); return merge(sources, resources); From 32295e4af3aba4ddb9c6558625441b543d34bf3d Mon Sep 17 00:00:00 2001 From: sudhirverma Date: Tue, 10 Apr 2018 17:10:02 +0530 Subject: [PATCH 4/4] Change folder structure --- uninstall/.angular-cli.json | 45 ++++++++ uninstall/.babelrc | 3 - uninstall/.gitignore | 61 +++++++---- uninstall/README.md | 1 - uninstall/browser/.eslintrc.ts | 11 -- uninstall/browser/index.html | 10 -- uninstall/e2e/app.e2e-spec.ts | 14 +++ uninstall/e2e/app.po.ts | 11 ++ uninstall/e2e/tsconfig.e2e.json | 14 +++ uninstall/gulp-tasks/common.ts | 20 ---- uninstall/gulp-tasks/config.ts | 22 ---- uninstall/gulpfile.ts | 102 ------------------ uninstall/{main/index.ts => main.js} | 4 +- uninstall/package.json | 47 +++----- uninstall/protractor.conf.js | 7 ++ uninstall/src/app/app.component.css | 0 uninstall/src/app/app.component.html | 1 + uninstall/src/app/app.component.spec.ts | 27 +++++ uninstall/src/app/app.component.ts | 10 ++ uninstall/src/app/app.module.ts | 22 ++++ uninstall/src/app/app.routing.module.ts | 16 +++ .../src/app/welcome/welcome.component.html | 3 + .../src/app/welcome/welcome.component.scss | 0 .../src/app/welcome/welcome.component.spec.ts | 25 +++++ .../src/app/welcome/welcome.component.ts | 15 +++ uninstall/src/app/welcome/welcome.module.ts | 11 ++ uninstall/src/assets/.gitkeep | 0 .../src/environments/environment.prod.ts | 3 + uninstall/src/environments/environment.ts | 8 ++ uninstall/src/favicon.ico | Bin 0 -> 5430 bytes uninstall/src/index.html | 14 +++ uninstall/src/main.ts | 12 +++ uninstall/src/polyfills.ts | 79 ++++++++++++++ uninstall/src/styles.css | 1 + uninstall/src/test.ts | 20 ++++ uninstall/src/tsconfig.app.json | 13 +++ uninstall/src/tsconfig.spec.json | 19 ++++ uninstall/src/typings.d.ts | 5 + 38 files changed, 457 insertions(+), 219 deletions(-) delete mode 100644 uninstall/.babelrc delete mode 100644 uninstall/browser/.eslintrc.ts delete mode 100644 uninstall/browser/index.html create mode 100644 uninstall/e2e/app.e2e-spec.ts create mode 100644 uninstall/e2e/app.po.ts create mode 100644 uninstall/e2e/tsconfig.e2e.json delete mode 100644 uninstall/gulp-tasks/common.ts delete mode 100644 uninstall/gulp-tasks/config.ts delete mode 100644 uninstall/gulpfile.ts rename uninstall/{main/index.ts => main.js} (90%) create mode 100644 uninstall/src/app/app.component.css create mode 100644 uninstall/src/app/app.component.html create mode 100644 uninstall/src/app/app.component.spec.ts create mode 100644 uninstall/src/app/app.component.ts create mode 100644 uninstall/src/app/app.module.ts create mode 100644 uninstall/src/app/app.routing.module.ts create mode 100644 uninstall/src/app/welcome/welcome.component.html create mode 100644 uninstall/src/app/welcome/welcome.component.scss create mode 100644 uninstall/src/app/welcome/welcome.component.spec.ts create mode 100644 uninstall/src/app/welcome/welcome.component.ts create mode 100644 uninstall/src/app/welcome/welcome.module.ts create mode 100644 uninstall/src/assets/.gitkeep create mode 100644 uninstall/src/environments/environment.prod.ts create mode 100644 uninstall/src/environments/environment.ts create mode 100644 uninstall/src/favicon.ico create mode 100644 uninstall/src/index.html create mode 100644 uninstall/src/main.ts create mode 100644 uninstall/src/polyfills.ts create mode 100644 uninstall/src/styles.css create mode 100644 uninstall/src/test.ts create mode 100644 uninstall/src/tsconfig.app.json create mode 100644 uninstall/src/tsconfig.spec.json create mode 100644 uninstall/src/typings.d.ts diff --git a/uninstall/.angular-cli.json b/uninstall/.angular-cli.json index e31faf7a..bd88d144 100644 --- a/uninstall/.angular-cli.json +++ b/uninstall/.angular-cli.json @@ -3,6 +3,51 @@ "project": { "name": "uninstall" }, + "apps": [ + { + "root": "src", + "outDir": "dist", + "assets": [ + "assets", + "favicon.ico" + ], + "index": "index.html", + "main": "main.ts", + "polyfills": "polyfills.ts", + "test": "test.ts", + "tsconfig": "tsconfig.app.json", + "testTsconfig": "tsconfig.spec.json", + "prefix": "app", + "styles": [ + "styles.css" + ], + "scripts": [], + "environmentSource": "environments/environment.ts", + "environments": { + "dev": "environments/environment.ts", + "prod": "environments/environment.prod.ts" + } + } + ], + "e2e": { + "protractor": { + "config": "./protractor.conf.js" + } + }, + "lint": [ + { + "project": "src/tsconfig.app.json", + "exclude": "**/node_modules/**" + }, + { + "project": "src/tsconfig.spec.json", + "exclude": "**/node_modules/**" + }, + { + "project": "e2e/tsconfig.e2e.json", + "exclude": "**/node_modules/**" + } + ], "test": { "karma": { "config": "./karma.conf.js" diff --git a/uninstall/.babelrc b/uninstall/.babelrc deleted file mode 100644 index aedb9046..00000000 --- a/uninstall/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["angular"] -} diff --git a/uninstall/.gitignore b/uninstall/.gitignore index 09c82cfe..eabf65e5 100644 --- a/uninstall/.gitignore +++ b/uninstall/.gitignore @@ -1,19 +1,44 @@ -node_modules -dist -jspm_packages -transpiled -package -build -tools -browser/config.js -test/jspm-config.js -.idea -xunit.xml -browser-tests.xml -ui-tests.xml -system-tests.xml -requirements-cache/ -coverage/ -.DS_Store -screenshots +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/dist-server +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log npm-debug.log +yarn-error.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db diff --git a/uninstall/README.md b/uninstall/README.md index 316df265..e69de29b 100644 --- a/uninstall/README.md +++ b/uninstall/README.md @@ -1 +0,0 @@ -# Uninstall diff --git a/uninstall/browser/.eslintrc.ts b/uninstall/browser/.eslintrc.ts deleted file mode 100644 index a2b3a15a..00000000 --- a/uninstall/browser/.eslintrc.ts +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - "env": { - "browser": true - }, - "globals": { - "angular": true, - "menu": true, - "MenuItem": true, - "restoreMenu": true - } -}; diff --git a/uninstall/browser/index.html b/uninstall/browser/index.html deleted file mode 100644 index 556ec616..00000000 --- a/uninstall/browser/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - let's get started - - -

with electron.....................

- - diff --git a/uninstall/e2e/app.e2e-spec.ts b/uninstall/e2e/app.e2e-spec.ts new file mode 100644 index 00000000..155b305b --- /dev/null +++ b/uninstall/e2e/app.e2e-spec.ts @@ -0,0 +1,14 @@ +import { AppPage } from './app.po'; + +describe('uninstall App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getParagraphText()).toEqual('Welcome to app!'); + }); +}); diff --git a/uninstall/e2e/app.po.ts b/uninstall/e2e/app.po.ts new file mode 100644 index 00000000..82ea75ba --- /dev/null +++ b/uninstall/e2e/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get('/'); + } + + getParagraphText() { + return element(by.css('app-root h1')).getText(); + } +} diff --git a/uninstall/e2e/tsconfig.e2e.json b/uninstall/e2e/tsconfig.e2e.json new file mode 100644 index 00000000..1d9e5edf --- /dev/null +++ b/uninstall/e2e/tsconfig.e2e.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "baseUrl": "./", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/uninstall/gulp-tasks/common.ts b/uninstall/gulp-tasks/common.ts deleted file mode 100644 index a6c073f3..00000000 --- a/uninstall/gulp-tasks/common.ts +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -let path = require('path'), - fs = require('fs-extra'); - -// Create default callback for exec -function createExecCallback(cb, quiet) { - return function(err, stdout, stderr) { - if (!quiet) { - console.log(stdout); - } - console.log(stderr); - cb(err); - }; -} - - -module.exports = { - createExecCallback -}; diff --git a/uninstall/gulp-tasks/config.ts b/uninstall/gulp-tasks/config.ts deleted file mode 100644 index eec68059..00000000 --- a/uninstall/gulp-tasks/config.ts +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -const path = require('path'); - -let config = { - artifactName : 'devsuite', - artifactPlatform : process.platform, - artifactArch : process.arch, - buildFolderRoot : '', - buildFileNamePrefix : '', - // use folder outside buildFolder so that a 'clean' task won't wipe out the cache - prefetchFolder : 'requirements-cache', - buildFolderPath : '', - configIcon : '' -}; - -config.buildFolderRoot = path.join('dist', config.artifactPlatform + '-' + config.artifactArch ); -config.buildFileNamePrefix = config.artifactName; -config.buildFolderPath = path.resolve(config.buildFolderRoot); -config.configIcon = path.resolve(path.join('resources', config.artifactName + '.ico')); - -module.exports = config; diff --git a/uninstall/gulpfile.ts b/uninstall/gulpfile.ts deleted file mode 100644 index ee4cc2f2..00000000 --- a/uninstall/gulpfile.ts +++ /dev/null @@ -1,102 +0,0 @@ -'use strict'; -// import gulp from 'gulp'; - -var gulp = require('gulp'), - fs = require('fs-extra'), - babel = require('gulp-babel'), - runSequence = require('run-sequence'), - request = require('request'), - del = require('del'), - exec = require('child_process').exec, - pjson = require('./package.json'), - path = require('path'), - mkdirp = require('mkdirp'), - merge = require('merge-stream'), - sourcemaps = require('gulp-sourcemaps'), - symlink = require('gulp-symlink'), - common = require('./gulp-tasks/common'), - config = require('./gulp-tasks/config'), - yargs = require('yargs'); - - - -process.on('uncaughtException', function(err) { - if(err) { - throw err; - } -}); - -// transpile sources and copy resources to a separate folder -gulp.task('transpile:app', function() { - var sources = gulp.src(['browser/**/*.js', 'main/*', '*.js'], {base: '.'}) - .pipe(sourcemaps.init()) - .pipe(babel()) - .pipe(sourcemaps.write()) - .pipe(gulp.dest('transpiled')); - - var resources = gulp.src(['browser/**/*', '!browser/**/*.js', 'package.json'], {base: '.'} - ).pipe(gulp.dest('transpiled')); - - return merge(sources, resources); -}); - -//create symlink to node_modules in transpiled folder -gulp.task('create-modules-link', function () { - return gulp.src('node_modules') - .pipe(symlink('transpiled/node_modules', {force:true})); -}); - -gulp.task('electron-rebuild', function(cb) { - var electronrebuild = path.join('node_modules', '.bin', 'electron-rebuild'); - exec(electronrebuild, common.createExecCallback(cb, true)); -}); - -// clean dist/ AND prefetch-dependencies/ folder -gulp.task('clean-all', ['clean'], function() { - return del([config.prefetchFolder], { force: true }); -}); - -// clean dist/ folder in prep for fresh build -gulp.task('clean', ['clean-transpiled'], function() { - return del('dist', { force: true }); -}); - -// clean transpiled/ folder in prep for fresh build -gulp.task('clean-transpiled', function() { - return del(['transpiled'], { force: true }); -}); - -gulp.task('create-dist-dir', function(cb) { - return mkdirp(config.buildFolderPath, cb); -}); - -gulp.task('generate', ['create-modules-link', 'update-requirements', 'electron-rebuild'], function(cb) { - var electronVersion = pjson.devDependencies['electron']; - var cmd = path.join('node_modules', '.bin') + path.sep + 'electron-packager transpiled ' + config.artifactName + ' --platform=' + config.artifactPlatform + ' --arch=' + config.artifactArch; - cmd += ' --version=' + electronVersion + ' --out="' + config.buildFolderPath + '" --overwrite --asar.unpack=**/browser/**/*.ps1 --asar.unpackDir="browser/model/helpers/win32/*"'; - cmd += ' --version-string.CompanyName="Red Hat, Inc."'; - cmd += ' --version-string.ProductName="' + pjson.productName + '"'; - cmd += ' --version-string.OriginalFilename="' + config.artifactName + '-' + pjson.version + '-installer.exe"'; - cmd += ' --version-string.FileDescription="' + pjson.description + ' v' + pjson.version + '"'; - cmd += ' --app-copyright="Copyright 2016 Red Hat, Inc."'; - cmd += ' --app-version="' + pjson.version + '"' + ' --build-version="' + pjson.version + '"'; - cmd += ' --prune --ignore="test|' + config.prefetchFolder + '|node_modules/patternfly/(node_modules|src|backstop_data|backstop)|.github|readme.md|README.md|CHANGELOG.md|changelog.md|CHANGES|CHANDES.md|changes.md|.travis.yml|.npmignore.|.eslintrc"'; - cmd += ' --icon="' + config.configIcon + '"'; - exec(cmd, common.createExecCallback(cb, true)); -}); - -// default task -gulp.task('default', ['run-clean']); - -gulp.task('run-clean', function(cb) { - return runSequence( 'clean-transpiled', 'run', cb); -}); - -gulp.task('run', ['update-requirements', 'create-modules-link', 'electron-rebuild'], function(cb) { - let skipInstall = process.argv.filter(name => name === '--skipInstall').length == 1 ? "skipInstall":""; - console.log(path.join('node_modules', '.bin') + path.sep + 'electron transpiled ' + skipInstall) - exec(path.join('node_modules', '.bin') + path.sep + 'electron transpiled ' + skipInstall, common.createExecCallback(cb)); -}); - -gulp.task('update-requirements', ['transpile:app'], function() { -}); diff --git a/uninstall/main/index.ts b/uninstall/main.js similarity index 90% rename from uninstall/main/index.ts rename to uninstall/main.js index b71bb578..1533c35d 100644 --- a/uninstall/main/index.ts +++ b/uninstall/main.js @@ -1,5 +1,5 @@ 'use strict'; -import { app, ipcMain, BrowserWindow, dialog, Menu, globalShortcut } from 'electron'; +const { app, ipcMain, BrowserWindow, dialog, Menu, globalShortcut } = require('electron'); // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. @@ -32,7 +32,7 @@ app.on('ready', function() { let baseLocation = encodeURI(__dirname.replace(/\\/g, '/')).replace(/#/g, '%23'); // Load the index.html of the app - mainWindow.loadURL(`file://${baseLocation}/../browser/index.html`); + mainWindow.loadURL(`file://${baseLocation}/dist/index.html`); mainWindow.once('ready-to-show', () => { mainWindow.show(); diff --git a/uninstall/package.json b/uninstall/package.json index 6951f75d..7f7674b0 100644 --- a/uninstall/package.json +++ b/uninstall/package.json @@ -1,15 +1,20 @@ { - "name": "devstudio-platform-installer", + "name": "Devsuite uninstall", "productName": "Red Hat Development Suite Installer", "version": "2.3.0-GA", "description": "Red Hat Development Suite Installer", - "main": "main/index.js", - "author": "Red Hat Developer Tooling Group", - "license": "Apache-2.0", + "main": "main.js", "scripts": { - "start": "./node_modules/.bin/gulp", - "update-deps": "node_modules/.bin/ncu --upgrade --loglevel verbose --packageFile package.json && npm update" + "ng": "ng", + "start": "ng serve", + "build": "ng build --prod", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e", + "electron": "ng build && electron .", + "electron-aot": "ng build --prod && electron ." }, + "private": true, "dependencies": { "@angular/animations": "^5.2.0", "@angular/common": "^5.2.0", @@ -30,37 +35,19 @@ "@angular/language-service": "^5.2.0", "@types/jasmine": "~2.8.3", "@types/jasminewd2": "~2.0.2", - "@types/node": "~9.6.1", - "babel-core": "6.26.0", - "babel-preset-angular": "^6.0.15", - "bootstrap": "4.0.0", + "@types/node": "~6.0.60", "codelyzer": "^4.0.1", - "del": "3.0.0", "electron": "1.8.4", - "electron-builder": "20.8.1", - "electron-packager": "12.0.0", - "electron-rebuild": "1.7.3", - "gulp": "3.9.1", - "gulp-babel": "7.0.1", - "gulp-core": "0.1.3-alpha", - "gulp-run": "1.7.1", - "gulp-sourcemaps": "2.6.4", - "gulp-symlink": "2.1.4", - "jasmine-core": "~3.1.0", + "jasmine-core": "~2.8.0", "jasmine-spec-reporter": "~4.2.1", "karma": "~2.0.0", "karma-chrome-launcher": "~2.2.0", "karma-coverage-istanbul-reporter": "^1.2.1", "karma-jasmine": "~1.1.0", - "karma-jasmine-html-reporter": "^1.0.0", - "merge-stream": "1.0.1", - "mkdirp": "0.5.1", - "ngx-bootstrap": "2.0.3", - "path": "0.12.7", - "protractor": "~5.3.0", - "run-sequence": "2.2.1", - "ts-node": "~5.0.1", + "karma-jasmine-html-reporter": "^0.2.2", + "protractor": "~5.1.2", + "ts-node": "~4.1.0", "tslint": "~5.9.1", - "typescript": "~2.8.1" + "typescript": "~2.5.3" } } diff --git a/uninstall/protractor.conf.js b/uninstall/protractor.conf.js index 0457e29d..7ee3b5ee 100644 --- a/uninstall/protractor.conf.js +++ b/uninstall/protractor.conf.js @@ -5,10 +5,14 @@ const { SpecReporter } = require('jasmine-spec-reporter'); exports.config = { allScriptsTimeout: 11000, + specs: [ + './e2e/**/*.e2e-spec.ts' + ], capabilities: { 'browserName': 'chrome' }, directConnect: true, + baseUrl: 'http://localhost:4200/', framework: 'jasmine', jasmineNodeOpts: { showColors: true, @@ -16,6 +20,9 @@ exports.config = { print: function() {} }, onPrepare() { + require('ts-node').register({ + project: 'e2e/tsconfig.e2e.json' + }); jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); } }; diff --git a/uninstall/src/app/app.component.css b/uninstall/src/app/app.component.css new file mode 100644 index 00000000..e69de29b diff --git a/uninstall/src/app/app.component.html b/uninstall/src/app/app.component.html new file mode 100644 index 00000000..0680b43f --- /dev/null +++ b/uninstall/src/app/app.component.html @@ -0,0 +1 @@ + diff --git a/uninstall/src/app/app.component.spec.ts b/uninstall/src/app/app.component.spec.ts new file mode 100644 index 00000000..bcbdf36b --- /dev/null +++ b/uninstall/src/app/app.component.spec.ts @@ -0,0 +1,27 @@ +import { TestBed, async } from '@angular/core/testing'; +import { AppComponent } from './app.component'; +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ + AppComponent + ], + }).compileComponents(); + })); + it('should create the app', async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + })); + it(`should have as title 'app'`, async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('app'); + })); + it('should render title in a h1 tag', async(() => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!'); + })); +}); diff --git a/uninstall/src/app/app.component.ts b/uninstall/src/app/app.component.ts new file mode 100644 index 00000000..7b0f6728 --- /dev/null +++ b/uninstall/src/app/app.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] +}) +export class AppComponent { + title = 'app'; +} diff --git a/uninstall/src/app/app.module.ts b/uninstall/src/app/app.module.ts new file mode 100644 index 00000000..a2c9d7d3 --- /dev/null +++ b/uninstall/src/app/app.module.ts @@ -0,0 +1,22 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { AppComponent } from './app.component'; +import { AppRoutingModule } from './app.routing.module'; +import { WelcomeModule } from './welcome/welcome.module'; + +@NgModule({ + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + RouterModule, + AppRoutingModule, + WelcomeModule + ], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/uninstall/src/app/app.routing.module.ts b/uninstall/src/app/app.routing.module.ts new file mode 100644 index 00000000..c07cd2d6 --- /dev/null +++ b/uninstall/src/app/app.routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { AppComponent } from './app.component'; +import { WelcomeComponent } from './welcome/welcome.component'; + +const routes: Routes = [ + { path: 'welcome', component: WelcomeComponent }, + { path: '', redirectTo: 'welcome', pathMatch: 'full' } +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes, { useHash: true })], + exports: [RouterModule] +}) +export class AppRoutingModule {} diff --git a/uninstall/src/app/welcome/welcome.component.html b/uninstall/src/app/welcome/welcome.component.html new file mode 100644 index 00000000..77efcb65 --- /dev/null +++ b/uninstall/src/app/welcome/welcome.component.html @@ -0,0 +1,3 @@ +

+ welcome works! +

diff --git a/uninstall/src/app/welcome/welcome.component.scss b/uninstall/src/app/welcome/welcome.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/uninstall/src/app/welcome/welcome.component.spec.ts b/uninstall/src/app/welcome/welcome.component.spec.ts new file mode 100644 index 00000000..eb910c61 --- /dev/null +++ b/uninstall/src/app/welcome/welcome.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WelcomeComponent } from './welcome.component'; + +describe('WelcomeComponent', () => { + let component: WelcomeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ WelcomeComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WelcomeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/uninstall/src/app/welcome/welcome.component.ts b/uninstall/src/app/welcome/welcome.component.ts new file mode 100644 index 00000000..9f801200 --- /dev/null +++ b/uninstall/src/app/welcome/welcome.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-welcome', + templateUrl: './welcome.component.html', + styleUrls: ['./welcome.component.scss'] +}) +export class WelcomeComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/uninstall/src/app/welcome/welcome.module.ts b/uninstall/src/app/welcome/welcome.module.ts new file mode 100644 index 00000000..42d09d44 --- /dev/null +++ b/uninstall/src/app/welcome/welcome.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { WelcomeComponent } from './welcome.component'; + +@NgModule({ + imports: [ + CommonModule + ], + declarations: [WelcomeComponent] +}) +export class WelcomeModule { } diff --git a/uninstall/src/assets/.gitkeep b/uninstall/src/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/uninstall/src/environments/environment.prod.ts b/uninstall/src/environments/environment.prod.ts new file mode 100644 index 00000000..3612073b --- /dev/null +++ b/uninstall/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/uninstall/src/environments/environment.ts b/uninstall/src/environments/environment.ts new file mode 100644 index 00000000..b7f639ae --- /dev/null +++ b/uninstall/src/environments/environment.ts @@ -0,0 +1,8 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const environment = { + production: false +}; diff --git a/uninstall/src/favicon.ico b/uninstall/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8081c7ceaf2be08bf59010158c586170d9d2d517 GIT binary patch literal 5430 zcmc(je{54#6vvCoAI3i*G5%$U7!sA3wtMZ$fH6V9C`=eXGJb@R1%(I_{vnZtpD{6n z5Pl{DmxzBDbrB>}`90e12m8T*36WoeDLA&SD_hw{H^wM!cl_RWcVA!I+x87ee975; z@4kD^=bYPn&pmG@(+JZ`rqQEKxW<}RzhW}I!|ulN=fmjVi@x{p$cC`)5$a!)X&U+blKNvN5tg=uLvuLnuqRM;Yc*swiexsoh#XPNu{9F#c`G zQLe{yWA(Y6(;>y|-efAy11k<09(@Oo1B2@0`PtZSkqK&${ zgEY}`W@t{%?9u5rF?}Y7OL{338l*JY#P!%MVQY@oqnItpZ}?s z!r?*kwuR{A@jg2Chlf0^{q*>8n5Ir~YWf*wmsh7B5&EpHfd5@xVaj&gqsdui^spyL zB|kUoblGoO7G(MuKTfa9?pGH0@QP^b#!lM1yHWLh*2iq#`C1TdrnO-d#?Oh@XV2HK zKA{`eo{--^K&MW66Lgsktfvn#cCAc*(}qsfhrvOjMGLE?`dHVipu1J3Kgr%g?cNa8 z)pkmC8DGH~fG+dlrp(5^-QBeEvkOvv#q7MBVLtm2oD^$lJZx--_=K&Ttd=-krx(Bb zcEoKJda@S!%%@`P-##$>*u%T*mh+QjV@)Qa=Mk1?#zLk+M4tIt%}wagT{5J%!tXAE;r{@=bb%nNVxvI+C+$t?!VJ@0d@HIyMJTI{vEw0Ul ze(ha!e&qANbTL1ZneNl45t=#Ot??C0MHjjgY8%*mGisN|S6%g3;Hlx#fMNcL<87MW zZ>6moo1YD?P!fJ#Jb(4)_cc50X5n0KoDYfdPoL^iV`k&o{LPyaoqMqk92wVM#_O0l z09$(A-D+gVIlq4TA&{1T@BsUH`Bm=r#l$Z51J-U&F32+hfUP-iLo=jg7Xmy+WLq6_tWv&`wDlz#`&)Jp~iQf zZP)tu>}pIIJKuw+$&t}GQuqMd%Z>0?t%&BM&Wo^4P^Y z)c6h^f2R>X8*}q|bblAF?@;%?2>$y+cMQbN{X$)^R>vtNq_5AB|0N5U*d^T?X9{xQnJYeU{ zoZL#obI;~Pp95f1`%X3D$Mh*4^?O?IT~7HqlWguezmg?Ybq|7>qQ(@pPHbE9V?f|( z+0xo!#m@Np9PljsyxBY-UA*{U*la#8Wz2sO|48_-5t8%_!n?S$zlGe+NA%?vmxjS- zHE5O3ZarU=X}$7>;Okp(UWXJxI%G_J-@IH;%5#Rt$(WUX?6*Ux!IRd$dLP6+SmPn= z8zjm4jGjN772R{FGkXwcNv8GBcZI#@Y2m{RNF_w8(Z%^A*!bS*!}s6sh*NnURytky humW;*g7R+&|Ledvc- + + + + Uninstall + + + + + + + + + diff --git a/uninstall/src/main.ts b/uninstall/src/main.ts new file mode 100644 index 00000000..91ec6da5 --- /dev/null +++ b/uninstall/src/main.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.log(err)); diff --git a/uninstall/src/polyfills.ts b/uninstall/src/polyfills.ts new file mode 100644 index 00000000..af847707 --- /dev/null +++ b/uninstall/src/polyfills.ts @@ -0,0 +1,79 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE9, IE10 and IE11 requires all of the following polyfills. **/ +// import 'core-js/es6/symbol'; +// import 'core-js/es6/object'; +// import 'core-js/es6/function'; +// import 'core-js/es6/parse-int'; +// import 'core-js/es6/parse-float'; +// import 'core-js/es6/number'; +// import 'core-js/es6/math'; +// import 'core-js/es6/string'; +// import 'core-js/es6/date'; +// import 'core-js/es6/array'; +// import 'core-js/es6/regexp'; +// import 'core-js/es6/map'; +// import 'core-js/es6/weak-map'; +// import 'core-js/es6/set'; + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** IE10 and IE11 requires the following for the Reflect API. */ +// import 'core-js/es6/reflect'; + + +/** Evergreen browsers require these. **/ +// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. +import 'core-js/es7/reflect'; + + +/** + * Required to support Web Animations `@angular/platform-browser/animations`. + * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation + **/ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + */ + + // (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + // (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + // (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + + /* + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + */ +// (window as any).__Zone_enable_cross_context_check = true; + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/uninstall/src/styles.css b/uninstall/src/styles.css new file mode 100644 index 00000000..90d4ee00 --- /dev/null +++ b/uninstall/src/styles.css @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/uninstall/src/test.ts b/uninstall/src/test.ts new file mode 100644 index 00000000..16317897 --- /dev/null +++ b/uninstall/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/uninstall/src/tsconfig.app.json b/uninstall/src/tsconfig.app.json new file mode 100644 index 00000000..39ba8dba --- /dev/null +++ b/uninstall/src/tsconfig.app.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "baseUrl": "./", + "module": "es2015", + "types": [] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts" + ] +} diff --git a/uninstall/src/tsconfig.spec.json b/uninstall/src/tsconfig.spec.json new file mode 100644 index 00000000..ac22a298 --- /dev/null +++ b/uninstall/src/tsconfig.spec.json @@ -0,0 +1,19 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "baseUrl": "./", + "module": "commonjs", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/uninstall/src/typings.d.ts b/uninstall/src/typings.d.ts new file mode 100644 index 00000000..ef5c7bd6 --- /dev/null +++ b/uninstall/src/typings.d.ts @@ -0,0 +1,5 @@ +/* SystemJS module definition */ +declare var module: NodeModule; +interface NodeModule { + id: string; +}