├── src ├── app │ ├── home │ │ ├── home.page.scss │ │ ├── home.page.ts │ │ ├── home.page.html │ │ ├── home.module.ts │ │ └── home.page.spec.ts │ ├── app.component.html │ ├── app-routing.module.ts │ ├── app.component.ts │ ├── app.module.ts │ └── app.component.spec.ts ├── environments │ ├── environment.prod.ts │ └── environment.ts ├── assets │ └── icon │ │ └── favicon.png ├── tsconfig.app.json ├── tsconfig.spec.json ├── main.ts ├── global.scss ├── test.ts ├── index.html ├── karma.conf.js ├── theme │ └── variables.scss └── polyfills.ts ├── .prettierrc ├── fastlane-plugin-fivethree_ionic ├── fastlane │ ├── Pluginfile │ ├── android │ │ ├── release-signing.properties │ │ └── pizza.keystore │ └── Fastfile ├── .travis.yml ├── .rspec ├── lib │ └── fastlane │ │ └── plugin │ │ ├── fivethree_ionic │ │ ├── version.rb │ │ ├── helper │ │ │ └── fivethree_ionic_helper.rb │ │ └── actions │ │ │ ├── fiv_bump_version.rb │ │ │ ├── fiv_build_ionic_android.rb │ │ │ ├── fiv_take_screenshots.rb │ │ │ ├── fiv_select_client.rb │ │ │ ├── fiv_update_version_and_build_no.rb │ │ │ ├── fiv_select_clients.rb │ │ │ ├── fiv_update_version.rb │ │ │ ├── fiv_increment_build_no.rb │ │ │ ├── fiv_clean_install.rb │ │ │ ├── fiv_select_env.rb │ │ │ ├── fiv_add_transparent_statusbar.rb │ │ │ ├── fiv_version.rb │ │ │ ├── fiv_android_keystore.rb │ │ │ ├── fiv_sign_android.rb │ │ │ └── fiv_ionic.rb │ │ └── fivethree_ionic.rb ├── Gemfile ├── .gitignore ├── Rakefile ├── spec │ ├── fivethree_ionic_action_spec.rb │ └── spec_helper.rb ├── LICENSE ├── .circleci │ └── config.yml ├── fastlane-plugin-fivethree_ionic.gemspec ├── README.md └── .rubocop.yml ├── fastlane ├── Matchfile ├── Pluginfile ├── Appfile ├── Gymfile ├── README.md ├── Fastfile └── Preview.html ├── .assets └── banner.png ├── resources ├── icon.png ├── splash.png ├── ios │ ├── icon │ │ ├── icon.png │ │ ├── icon-40.png │ │ ├── icon-50.png │ │ ├── icon-60.png │ │ ├── icon-72.png │ │ ├── icon-76.png │ │ ├── icon@2x.png │ │ ├── icon-1024.png │ │ ├── icon-40@2x.png │ │ ├── icon-40@3x.png │ │ ├── icon-50@2x.png │ │ ├── icon-60@2x.png │ │ ├── icon-60@3x.png │ │ ├── icon-72@2x.png │ │ ├── icon-76@2x.png │ │ ├── icon-small.png │ │ ├── icon-83.5@2x.png │ │ ├── icon-small@2x.png │ │ └── icon-small@3x.png │ └── splash │ │ ├── Default-667h.png │ │ ├── Default-736h.png │ │ ├── Default~iphone.png │ │ ├── Default@2x~iphone.png │ │ ├── Default-568h@2x~iphone.png │ │ ├── Default-Landscape-736h.png │ │ ├── Default-Landscape~ipad.png │ │ ├── Default-Portrait~ipad.png │ │ ├── Default-Landscape@2x~ipad.png │ │ ├── Default-Portrait@2x~ipad.png │ │ ├── Default-Portrait@~ipadpro.png │ │ ├── Default-Landscape@~ipadpro.png │ │ └── Default@2x~universal~anyany.png ├── android │ ├── icon │ │ ├── drawable-hdpi-icon.png │ │ ├── drawable-ldpi-icon.png │ │ ├── drawable-mdpi-icon.png │ │ ├── drawable-xhdpi-icon.png │ │ ├── drawable-xxhdpi-icon.png │ │ └── drawable-xxxhdpi-icon.png │ └── splash │ │ ├── drawable-land-hdpi-screen.png │ │ ├── drawable-land-ldpi-screen.png │ │ ├── drawable-land-mdpi-screen.png │ │ ├── drawable-land-xhdpi-screen.png │ │ ├── drawable-port-hdpi-screen.png │ │ ├── drawable-port-ldpi-screen.png │ │ ├── drawable-port-mdpi-screen.png │ │ ├── drawable-port-xhdpi-screen.png │ │ ├── drawable-land-xxhdpi-screen.png │ │ ├── drawable-land-xxxhdpi-screen.png │ │ ├── drawable-port-xxhdpi-screen.png │ │ └── drawable-port-xxxhdpi-screen.png └── README.md ├── .android_signing └── fivethree.keystore ├── ionic.config.json ├── Gemfile ├── e2e ├── tsconfig.e2e.json ├── src │ ├── app.po.ts │ └── app.e2e-spec.ts └── protractor.conf.js ├── tsconfig.json ├── .editorconfig ├── .gitignore ├── LICENSE ├── package.json ├── tslint.json ├── Gemfile.lock ├── angular.json ├── config.xml └── README.md /src/app/home/home.page.scss: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true 3 | } 4 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/fastlane/Pluginfile: -------------------------------------------------------------------------------- 1 | # Autogenerated by fastlane 2 | -------------------------------------------------------------------------------- /fastlane/Matchfile: -------------------------------------------------------------------------------- 1 | 2 | git_url "https://bitbucket.org/fivethree/fastlane-certs" 3 | type "appstore", -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /.assets/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/.assets/banner.png -------------------------------------------------------------------------------- /resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/icon.png -------------------------------------------------------------------------------- /resources/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/splash.png -------------------------------------------------------------------------------- /resources/ios/icon/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon.png -------------------------------------------------------------------------------- /src/assets/icon/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/src/assets/icon/favicon.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-40.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-50.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-60.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-72.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-76.png -------------------------------------------------------------------------------- /resources/ios/icon/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-1024.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-40@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-40@3x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-50@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-60@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-60@3x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-72@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-76@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-small.png -------------------------------------------------------------------------------- /.android_signing/fivethree.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/.android_signing/fivethree.keystore -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/.travis.yml: -------------------------------------------------------------------------------- 1 | # os: osx # enable this if you need macOS support 2 | language: ruby 3 | rvm: 4 | - 2.2.4 5 | -------------------------------------------------------------------------------- /ionic.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fivethree-fastlane", 3 | "integrations": { 4 | "cordova": {} 5 | }, 6 | "type": "angular" 7 | } -------------------------------------------------------------------------------- /resources/ios/icon/icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-83.5@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-small@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/icon/icon-small@3x.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-667h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/splash/Default-667h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-736h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/splash/Default-736h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/splash/Default~iphone.png -------------------------------------------------------------------------------- /resources/ios/splash/Default@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/splash/Default@2x~iphone.png -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/.rspec: -------------------------------------------------------------------------------- 1 | --require spec_helper 2 | --color 3 | --format d 4 | --format RspecJunitFormatter 5 | --out test-results/rspec/rspec.xml 6 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/fastlane/android/release-signing.properties: -------------------------------------------------------------------------------- 1 | storeFile=pizza 2 | storePassword=123456 3 | keyAlias=pizza 4 | keyPassword=123456 5 | -------------------------------------------------------------------------------- /resources/android/icon/drawable-hdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/icon/drawable-hdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-ldpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/icon/drawable-ldpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-mdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/icon/drawable-mdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-xhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/icon/drawable-xhdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-xxhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/icon/drawable-xxhdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-xxxhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/icon/drawable-xxxhdpi-icon.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-568h@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/splash/Default-568h@2x~iphone.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape-736h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/splash/Default-Landscape-736h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/splash/Default-Landscape~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Portrait~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/splash/Default-Portrait~ipad.png -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic/version.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module FivethreeIonic 3 | VERSION = '0.2.9' 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/splash/Default-Landscape@2x~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Portrait@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/splash/Default-Portrait@2x~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Portrait@~ipadpro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/splash/Default-Portrait@~ipadpro.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape@~ipadpro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/splash/Default-Landscape@~ipadpro.png -------------------------------------------------------------------------------- /resources/ios/splash/Default@2x~universal~anyany.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/ios/splash/Default@2x~universal~anyany.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-hdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/splash/drawable-land-hdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-ldpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/splash/drawable-land-ldpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-mdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/splash/drawable-land-mdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-xhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/splash/drawable-land-xhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-hdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/splash/drawable-port-hdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-ldpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/splash/drawable-port-ldpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-mdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/splash/drawable-port-mdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-xhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/splash/drawable-port-xhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-xxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/splash/drawable-land-xxhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-xxxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/splash/drawable-land-xxxhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-xxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/splash/drawable-port-xxhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-xxxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/resources/android/splash/drawable-port-xxxhdpi-screen.png -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/fastlane/android/pizza.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fivethree-team/ionic-fastlane-plugin/HEAD/fastlane-plugin-fivethree_ionic/fastlane/android/pizza.keystore -------------------------------------------------------------------------------- /fastlane/Pluginfile: -------------------------------------------------------------------------------- 1 | # Autogenerated by fastlane 2 | # 3 | # Ensure this file is checked in to source control! 4 | 5 | gem 'fastlane-plugin-fivethree_ionic', path: '../fastlane-plugin-fivethree_ionic' 6 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | gem "net-scp" 5 | 6 | plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') 7 | eval_gemfile(plugins_path) if File.exist?(plugins_path) 8 | -------------------------------------------------------------------------------- /e2e/tsconfig.e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "baseUrl": "./", 6 | "module": "commonjs", 7 | "target": "es5" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/Gemfile: -------------------------------------------------------------------------------- 1 | source('https://rubygems.org') 2 | 3 | gemspec 4 | 5 | plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') 6 | eval_gemfile(plugins_path) if File.exist?(plugins_path) 7 | -------------------------------------------------------------------------------- /src/app/home/home.page.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-home', 5 | templateUrl: 'home.page.html', 6 | styleUrls: ['home.page.scss'], 7 | }) 8 | export class HomePage { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/.gitignore: -------------------------------------------------------------------------------- 1 | *.gem 2 | Gemfile.lock 3 | 4 | ## Documentation cache and generated files: 5 | /.yardoc/ 6 | /_yardoc/ 7 | /doc/ 8 | /rdoc/ 9 | fastlane/README.md 10 | fastlane/report.xml 11 | coverage 12 | test-results 13 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/Rakefile: -------------------------------------------------------------------------------- 1 | require 'bundler/gem_tasks' 2 | 3 | require 'rspec/core/rake_task' 4 | RSpec::Core::RakeTask.new 5 | 6 | require 'rubocop/rake_task' 7 | RuboCop::RakeTask.new(:rubocop) 8 | 9 | task(default: [:spec, :rubocop]) 10 | -------------------------------------------------------------------------------- /src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "baseUrl": "./", 6 | "module": "es2015" 7 | }, 8 | "exclude": [ 9 | "test.ts", 10 | "**/*.spec.ts" 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getParagraphText() { 9 | return element(by.deepCss('app-root ion-content')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /e2e/src/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { AppPage } from './app.po'; 2 | 3 | describe('new App', () => { 4 | let page: AppPage; 5 | 6 | beforeEach(() => { 7 | page = new AppPage(); 8 | }); 9 | 10 | it('should display welcome message', () => { 11 | page.navigateTo(); 12 | expect(page.getParagraphText()).toContain('The world is your oyster.'); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /src/app/home/home.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Ionic Blank 5 | 6 | 7 | 8 | 9 | 10 | The world is your oyster. 11 |

If you get lost, the docs will be your guide.

12 |
13 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "outDir": "./dist/out-tsc", 5 | "sourceMap": true, 6 | "declaration": false, 7 | "moduleResolution": "node", 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "target": "es5", 11 | "lib": [ 12 | "es2017", 13 | "dom" 14 | ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/spec/fivethree_ionic_action_spec.rb: -------------------------------------------------------------------------------- 1 | describe Fastlane::Actions::FivethreeIonicAction do 2 | describe '#run' do 3 | it 'prints a message' do 4 | expect(Fastlane::UI).to receive(:message).with( 5 | 'The fivethree_ionic plugin is working!' 6 | ) 7 | 8 | Fastlane::Actions::FivethreeIonicAction.run(nil) 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /fastlane/Appfile: -------------------------------------------------------------------------------- 1 | # app_identifier("[[APP_IDENTIFIER]]") # The bundle identifier of your app 2 | # apple_id("[[APPLE_ID]]") # Your Apple email address 3 | 4 | 5 | # For more information about the Appfile, see: 6 | # https://docs.fastlane.tools/advanced/#appfile 7 | app_identifier "de.fivethree.fastlane" 8 | apple_id "gary.grossgarten@gmail.com" 9 | team_id "2K6ELPY322" 10 | itc_team_id "119091779" 11 | -------------------------------------------------------------------------------- /src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "baseUrl": "./", 6 | "module": "commonjs", 7 | "types": [ 8 | "jasmine", 9 | "node" 10 | ] 11 | }, 12 | "files": [ 13 | "test.ts" 14 | ], 15 | "include": [ 16 | "polyfills.ts", 17 | "**/*.spec.ts", 18 | "**/*.d.ts" 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /fastlane/Gymfile: -------------------------------------------------------------------------------- 1 | # For more information about this configuration visit 2 | # https://docs.fastlane.tools/actions/gym/#gymfile 3 | 4 | # In general, you can use the options available 5 | # fastlane gym --help 6 | 7 | # Remove the # in front of the line to enable the option 8 | 9 | scheme("fivethree-fastlane") 10 | clean(true) 11 | project("platforms/ios/fivethree-fastlane.xcodeproj") 12 | output_directory("./output/") 13 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.log(err)); 13 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs 2 | # editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | 10 | # We recommend you to keep these unchanged 11 | end_of_line = lf 12 | charset = utf-8 13 | trim_trailing_whitespace = true 14 | insert_final_newline = true 15 | 16 | [*.md] 17 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | const routes: Routes = [ 5 | { path: '', redirectTo: 'home', pathMatch: 'full' }, 6 | { path: 'home', loadChildren: './home/home.module#HomePageModule' }, 7 | ]; 8 | 9 | @NgModule({ 10 | imports: [RouterModule.forRoot(routes)], 11 | exports: [RouterModule] 12 | }) 13 | export class AppRoutingModule { } 14 | -------------------------------------------------------------------------------- /resources/README.md: -------------------------------------------------------------------------------- 1 | These are Cordova resources. You can replace icon.png and splash.png and run 2 | `ionic cordova resources` to generate custom icons and splash screens for your 3 | app. See `ionic cordova resources --help` for details. 4 | 5 | Cordova reference documentation: 6 | 7 | - Icons: https://cordova.apache.org/docs/en/latest/config_ref/images.html 8 | - Splash Screens: https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-splashscreen/ 9 | -------------------------------------------------------------------------------- /src/global.scss: -------------------------------------------------------------------------------- 1 | // http://ionicframework.com/docs/theming/ 2 | @import "~@ionic/angular/css/normalize.css"; 3 | @import "~@ionic/angular/css/structure.css"; 4 | @import "~@ionic/angular/css/typography.css"; 5 | @import "~@ionic/angular/css/colors.css"; 6 | 7 | @import "~@ionic/angular/css/padding.css"; 8 | @import "~@ionic/angular/css/float-elements.css"; 9 | @import "~@ionic/angular/css/text-alignment.css"; 10 | @import "~@ionic/angular/css/text-transformation.css"; 11 | @import "~@ionic/angular/css/flex-utils.css"; 12 | 13 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__)) 2 | 3 | require 'simplecov' 4 | 5 | # SimpleCov.minimum_coverage 95 6 | SimpleCov.start 7 | 8 | # This module is only used to check the environment is currently a testing env 9 | module SpecHelper; end 10 | 11 | require 'fastlane' # to import the Action super class 12 | require 'fastlane/plugin/fivethree_ionic' # import the actual plugin 13 | 14 | Fastlane.load_actions # load other actions (in case your plugin calls other actions or shared values) 15 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic/helper/fivethree_ionic_helper.rb: -------------------------------------------------------------------------------- 1 | require 'fastlane_core/ui/ui' 2 | 3 | module Fastlane 4 | UI = FastlaneCore::UI unless Fastlane.const_defined?('UI') 5 | 6 | module Helper 7 | class FivethreeIonicHelper 8 | # class methods that you define here become available in your action 9 | # as `Helper::FivethreeIonicHelper.your_method` 10 | # 11 | def self.show_message 12 | UI.message('Hello from the fivethree_ionic plugin helper!') 13 | end 14 | end 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic.rb: -------------------------------------------------------------------------------- 1 | require 'fastlane/plugin/fivethree_ionic/version' 2 | 3 | module Fastlane 4 | module FivethreeIonic 5 | # Return all .rb files inside the "actions" and "helper" directory 6 | def self.all_classes 7 | Dir[File.expand_path('**/{actions,helper}/*.rb', File.dirname(__FILE__))] 8 | end 9 | end 10 | end 11 | 12 | # By default we want to import all available actions and helpers 13 | # A plugin can contain any number of actions and plugins 14 | Fastlane::FivethreeIonic.all_classes.each { |current| require current } 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Specifies intentionally untracked files to ignore when using Git 2 | # http://git-scm.com/docs/gitignore 3 | 4 | *~ 5 | *.sw[mnpcod] 6 | *.log 7 | *.tmp 8 | *.tmp.* 9 | log.txt 10 | *.sublime-project 11 | *.sublime-workspace 12 | .vscode/ 13 | npm-debug.log* 14 | 15 | .idea/ 16 | .ionic/ 17 | .sourcemaps/ 18 | .sass-cache/ 19 | .tmp/ 20 | .versions/ 21 | coverage/ 22 | www/ 23 | node_modules/ 24 | tmp/ 25 | temp/ 26 | platforms/ 27 | plugins/ 28 | plugins/android.json 29 | plugins/ios.json 30 | $RECYCLE.BIN/ 31 | 32 | .DS_Store 33 | Thumbs.db 34 | UserInterfaceState.xcuserstate 35 | fastlane/report.xml -------------------------------------------------------------------------------- /src/app/home/home.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { IonicModule } from '@ionic/angular'; 4 | import { FormsModule } from '@angular/forms'; 5 | import { RouterModule } from '@angular/router'; 6 | 7 | import { HomePage } from './home.page'; 8 | 9 | @NgModule({ 10 | imports: [ 11 | CommonModule, 12 | FormsModule, 13 | IonicModule, 14 | RouterModule.forChild([ 15 | { 16 | path: '', 17 | component: HomePage 18 | } 19 | ]) 20 | ], 21 | declarations: [HomePage] 22 | }) 23 | export class HomePageModule {} 24 | -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone-testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | declare const require: any; 11 | 12 | // First, initialize the Angular testing environment. 13 | getTestBed().initTestEnvironment( 14 | BrowserDynamicTestingModule, 15 | platformBrowserDynamicTesting() 16 | ); 17 | // Then we find all the tests. 18 | const context = require.context('./', true, /\.spec\.ts$/); 19 | // And load the modules. 20 | context.keys().map(context); 21 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | import { Platform } from '@ionic/angular'; 4 | import { SplashScreen } from '@ionic-native/splash-screen/ngx'; 5 | import { StatusBar } from '@ionic-native/status-bar/ngx'; 6 | 7 | @Component({ 8 | selector: 'app-root', 9 | templateUrl: 'app.component.html' 10 | }) 11 | export class AppComponent { 12 | constructor( 13 | private platform: Platform, 14 | private splashScreen: SplashScreen, 15 | private statusBar: StatusBar 16 | ) { 17 | this.initializeApp(); 18 | } 19 | 20 | initializeApp() { 21 | this.platform.ready().then(() => { 22 | this.statusBar.styleDefault(); 23 | this.splashScreen.hide(); 24 | }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Ionic App 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/app/home/home.page.spec.ts: -------------------------------------------------------------------------------- 1 | import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; 2 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 3 | 4 | import { HomePage } from './home.page'; 5 | 6 | describe('HomePage', () => { 7 | let component: HomePage; 8 | let fixture: ComponentFixture; 9 | 10 | beforeEach(async(() => { 11 | TestBed.configureTestingModule({ 12 | declarations: [ HomePage ], 13 | schemas: [CUSTOM_ELEMENTS_SCHEMA], 14 | }) 15 | .compileComponents(); 16 | })); 17 | 18 | beforeEach(() => { 19 | fixture = TestBed.createComponent(HomePage); 20 | component = fixture.componentInstance; 21 | fixture.detectChanges(); 22 | }); 23 | 24 | it('should create', () => { 25 | expect(component).toBeTruthy(); 26 | }); 27 | }); 28 | -------------------------------------------------------------------------------- /src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // The file contents for the current environment will overwrite these during build. 2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do 3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead. 4 | // The list of which env maps to which file can be found in `.angular-cli.json`. 5 | export const environment = { 6 | production: false 7 | }; 8 | 9 | /* 10 | * In development mode, to ignore zone related error stack frames such as 11 | * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can 12 | * import the following file, but please comment it out in production mode 13 | * because it will have performance impact when throw error 14 | */ 15 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI. 16 | -------------------------------------------------------------------------------- /e2e/protractor.conf.js: -------------------------------------------------------------------------------- 1 | // Protractor configuration file, see link for more information 2 | // https://github.com/angular/protractor/blob/master/lib/config.ts 3 | 4 | const { SpecReporter } = require('jasmine-spec-reporter'); 5 | 6 | exports.config = { 7 | allScriptsTimeout: 11000, 8 | specs: [ 9 | './src/**/*.e2e-spec.ts' 10 | ], 11 | capabilities: { 12 | 'browserName': 'chrome' 13 | }, 14 | directConnect: true, 15 | baseUrl: 'http://localhost:4200/', 16 | framework: 'jasmine', 17 | jasmineNodeOpts: { 18 | showColors: true, 19 | defaultTimeoutInterval: 30000, 20 | print: function() {} 21 | }, 22 | onPrepare() { 23 | require('ts-node').register({ 24 | project: 'e2e/tsconfig.e2e.json' 25 | }); 26 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { BrowserModule } from '@angular/platform-browser'; 3 | import { RouterModule, RouteReuseStrategy, Routes } from '@angular/router'; 4 | 5 | import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; 6 | import { SplashScreen } from '@ionic-native/splash-screen/ngx'; 7 | import { StatusBar } from '@ionic-native/status-bar/ngx'; 8 | 9 | import { AppComponent } from './app.component'; 10 | import { AppRoutingModule } from './app-routing.module'; 11 | 12 | @NgModule({ 13 | declarations: [AppComponent], 14 | entryComponents: [], 15 | imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule], 16 | providers: [ 17 | StatusBar, 18 | SplashScreen, 19 | { provide: RouteReuseStrategy, useClass: IonicRouteStrategy } 20 | ], 21 | bootstrap: [AppComponent] 22 | }) 23 | export class AppModule {} 24 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/fastlane/Fastfile: -------------------------------------------------------------------------------- 1 | before_all do |lane, options| 2 | ENV['CLIENT'] = options[:client] 3 | ENV['ENV'] = options[:env] 4 | end 5 | 6 | lane :select_client do |options| 7 | client = fiv_select_client 8 | 9 | puts("This client is selected #{client}") 10 | end 11 | 12 | lane :select_clients do |options| 13 | clients = fiv_select_clients 14 | 15 | puts("These clients are selected #{clients}") 16 | end 17 | 18 | lane :select_client_env do |options| 19 | client = fiv_select_client 20 | env = fiv_select_env(client: client) 21 | 22 | puts("This client #{client} and environment #{env} is selected") 23 | end 24 | 25 | lane :sign_android_apk do |options| 26 | # run ionic cordova build android --prod --release 27 | apk_path = 28 | fiv_sign_android( 29 | keystore_name: 'pizza', 30 | key_alias: 'pizza', 31 | app_version: '1.0.1', 32 | app_build_no: '2020', 33 | apk_signed_target: './apk' 34 | ) 35 | end 36 | 37 | lane :version do |options| 38 | fiv_version(ios: true, pathToConfigXML: './../config.xml') 39 | end 40 | -------------------------------------------------------------------------------- /src/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage-istanbul-reporter'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client: { 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | coverageIstanbulReporter: { 19 | dir: require('path').join(__dirname, 'coverage'), 20 | reports: ['html', 'lcovonly'], 21 | fixWebpackSourcePaths: true 22 | }, 23 | reporters: ['progress', 'kjhtml'], 24 | port: 9876, 25 | colors: true, 26 | logLevel: config.LOG_INFO, 27 | autoWatch: true, 28 | browsers: ['Chrome'], 29 | singleRun: false 30 | }); 31 | }; 32 | -------------------------------------------------------------------------------- /fastlane/README.md: -------------------------------------------------------------------------------- 1 | fastlane documentation 2 | ================ 3 | # Installation 4 | 5 | Make sure you have the latest version of the Xcode command line tools installed: 6 | 7 | ``` 8 | xcode-select --install 9 | ``` 10 | 11 | Install _fastlane_ using 12 | ``` 13 | [sudo] gem install fastlane -NV 14 | ``` 15 | or alternatively using `brew cask install fastlane` 16 | 17 | # Available Actions 18 | ### fiv_test 19 | ``` 20 | fastlane fiv_test 21 | ``` 22 | Test lane for action development 23 | 24 | ---- 25 | 26 | ## iOS 27 | ### ios fiv_testflight 28 | ``` 29 | fastlane ios fiv_testflight 30 | ``` 31 | Build and release a test version to testflight 32 | 33 | ---- 34 | 35 | ## Android 36 | ### android fiv_alpha 37 | ``` 38 | fastlane android fiv_alpha 39 | ``` 40 | Build and release a test version to testflight 41 | 42 | ---- 43 | 44 | This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. 45 | More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). 46 | The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Fivethree (Gary Großgarten, Marc Stammerjohann) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 Gary Großgarten, Marc Stammerjohann 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/.circleci/config.yml: -------------------------------------------------------------------------------- 1 | # Ruby CircleCI 2.0 configuration file 2 | # 3 | # Check https://circleci.com/docs/2.0/language-ruby/ for more details 4 | # 5 | version: 2 6 | jobs: 7 | build: 8 | docker: 9 | # specify the version you desire here 10 | - image: circleci/ruby:2.4.2 11 | 12 | working_directory: ~/repo 13 | 14 | steps: 15 | - checkout 16 | 17 | # Download and cache dependencies 18 | - restore_cache: 19 | keys: 20 | - v1-dependencies-{{ checksum "Gemfile" }} 21 | # fallback to using the latest cache if no exact match is found 22 | - v1-dependencies- 23 | 24 | - run: 25 | name: install dependencies 26 | command: bundle check || bundle install --jobs=4 --retry=3 --path vendor/bundle 27 | 28 | - save_cache: 29 | paths: 30 | - ./vendor 31 | key: v1-dependencies-{{ checksum "Gemfile" }} 32 | 33 | # run tests! 34 | - run: 35 | name: run tests 36 | command: bundle exec rake 37 | 38 | # collect reports 39 | - store_test_results: 40 | path: ~/repo/test-results 41 | - store_artifacts: 42 | path: ~/repo/test-results 43 | destination: test-results 44 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/fastlane-plugin-fivethree_ionic.gemspec: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | lib = File.expand_path("../lib", __FILE__) 4 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 5 | require 'fastlane/plugin/fivethree_ionic/version' 6 | 7 | Gem::Specification.new do |spec| 8 | spec.name = 'fastlane-plugin-fivethree_ionic' 9 | spec.version = Fastlane::FivethreeIonic::VERSION 10 | spec.author = 'Marc Stammerjohann' 11 | spec.email = 'marc@fivethree.io' 12 | 13 | spec.summary = 'Fastlane plugin for Ionic v4 Projects' 14 | # spec.homepage = "https://github.com//fastlane-plugin-fivethree_ionic" 15 | spec.license = "MIT" 16 | 17 | spec.files = Dir["lib/**/*"] + %w(README.md LICENSE) 18 | spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) 19 | spec.require_paths = ['lib'] 20 | 21 | # Don't add a dependency to fastlane or fastlane_re 22 | # since this would cause a circular dependency 23 | 24 | # spec.add_dependency 'your-dependency', '~> 1.0.0' 25 | 26 | spec.add_development_dependency('pry') 27 | spec.add_development_dependency('bundler') 28 | spec.add_development_dependency('rspec') 29 | spec.add_development_dependency('rspec_junit_formatter') 30 | spec.add_development_dependency('rake') 31 | spec.add_development_dependency('rubocop', '0.49.1') 32 | spec.add_development_dependency('rubocop-require_tools') 33 | spec.add_development_dependency('simplecov') 34 | spec.add_development_dependency('fastlane', '>= 2.102.0') 35 | end 36 | -------------------------------------------------------------------------------- /fastlane/Fastfile: -------------------------------------------------------------------------------- 1 | 2 | update_fastlane 3 | 4 | default_platform(:ios) 5 | 6 | platform :ios do 7 | 8 | desc "Build and release a test version to testflight" 9 | lane :fiv_testflight do 10 | 11 | # ensure_git_status_clean 12 | match 13 | version_and_build_no = fiv_version( 14 | ios: true, 15 | pathToConfigXML: "./config.xml" 16 | ) 17 | 18 | fiv_ionic( 19 | platform: 'ios', 20 | release: true 21 | ) 22 | automatic_code_signing( 23 | path: "platforms/ios/fivethree-fastlane.xcodeproj", 24 | use_automatic_signing: false, 25 | team_id: "2K6ELPY322" 26 | ) 27 | gym 28 | pilot 29 | end 30 | end 31 | 32 | platform :android do 33 | 34 | desc "Build and release a test version to testflight" 35 | lane :fiv_alpha do 36 | fiv_update_version_and_build_no( 37 | ios: false, 38 | pathToConfigXML: "./config.xml" 39 | ) 40 | ionic( 41 | platform: 'android', 42 | release: true 43 | ) 44 | end 45 | end 46 | 47 | 48 | desc "Test lane for action development" 49 | lane :fiv_test do 50 | 51 | # pathToSignedAPK = fiv_sign_android( 52 | # version: "1.0.0", 53 | # build_no: "1001" 54 | # ) 55 | 56 | # puts "path to signed apk: #{pathToSignedAPK}" 57 | 58 | puts "enter scp password:" 59 | keychain_entry = CredentialsManager::AccountManager.new(user: "immo_app_scp_client") 60 | scp_pw = keychain_entry.password 61 | scp( 62 | host: "d167.x-mailer.de", 63 | username: "immoappde", 64 | password: scp_pw, 65 | upload: { 66 | src: "./www", 67 | dst: "/httpdocs/demo" 68 | } 69 | ) 70 | 71 | 72 | 73 | 74 | end 75 | -------------------------------------------------------------------------------- /src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; 2 | import { TestBed, async } from '@angular/core/testing'; 3 | 4 | import { Platform } from '@ionic/angular'; 5 | import { SplashScreen } from '@ionic-native/splash-screen/ngx'; 6 | import { StatusBar } from '@ionic-native/status-bar/ngx'; 7 | 8 | import { AppComponent } from './app.component'; 9 | 10 | describe('AppComponent', () => { 11 | 12 | let statusBarSpy, splashScreenSpy, platformReadySpy, platformSpy; 13 | 14 | beforeEach(async(() => { 15 | statusBarSpy = jasmine.createSpyObj('StatusBar', ['styleDefault']); 16 | splashScreenSpy = jasmine.createSpyObj('SplashScreen', ['hide']); 17 | platformReadySpy = Promise.resolve(); 18 | platformSpy = jasmine.createSpyObj('Platform', { ready: platformReadySpy }); 19 | 20 | TestBed.configureTestingModule({ 21 | declarations: [AppComponent], 22 | schemas: [CUSTOM_ELEMENTS_SCHEMA], 23 | providers: [ 24 | { provide: StatusBar, useValue: statusBarSpy }, 25 | { provide: SplashScreen, useValue: splashScreenSpy }, 26 | { provide: Platform, useValue: platformSpy }, 27 | ], 28 | }).compileComponents(); 29 | })); 30 | 31 | it('should create the app', () => { 32 | const fixture = TestBed.createComponent(AppComponent); 33 | const app = fixture.debugElement.componentInstance; 34 | expect(app).toBeTruthy(); 35 | }); 36 | 37 | it('should initialize the app', async () => { 38 | TestBed.createComponent(AppComponent); 39 | expect(platformSpy.ready).toHaveBeenCalled(); 40 | await platformReadySpy; 41 | expect(statusBarSpy.styleDefault).toHaveBeenCalled(); 42 | expect(splashScreenSpy.hide).toHaveBeenCalled(); 43 | }); 44 | 45 | // TODO: add more tests! 46 | 47 | }); 48 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic/actions/fiv_bump_version.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Actions 3 | module SharedValues 4 | FIV_BUILD_IONIC_ANDROID_CUSTOM_VALUE = 5 | :FIV_BUILD_IONIC_ANDROID_CUSTOM_VALUE 6 | end 7 | 8 | class FivBumpVersionAction < Action 9 | def self.run(params) 10 | sh 'git add config.xml' 11 | sh "git commit -m \"#{params[:message]}\"" 12 | end 13 | 14 | ##################################################### 15 | # @!group Documentation 16 | ##################################################### 17 | 18 | def self.description 19 | 'A short description with <= 80 characters of what this action does' 20 | end 21 | 22 | def self.details 23 | # Optional: 24 | # this is your chance to provide a more detailed description of this action 25 | 'You can use this action to do cool things...' 26 | end 27 | 28 | def self.available_options 29 | # Define all options your action supports. 30 | 31 | # Below a few examples 32 | [ 33 | FastlaneCore::ConfigItem.new( 34 | key: :message, 35 | env_name: 'FIV_BUILD_IONIC_ANDROID_IS_PROD', 36 | description: 'Dev or Prod build', 37 | optional: false, 38 | type: String 39 | ) 40 | ] 41 | end 42 | 43 | def self.output 44 | # Define the shared values you are going to provide 45 | # Example 46 | [ 47 | [ 48 | 'FIV_BUILD_IONIC_ANDROID_CUSTOM_VALUE', 49 | 'A description of what this value contains' 50 | ] 51 | ] 52 | end 53 | 54 | def self.return_value 55 | # If your method provides a return value, you can describe here what it does 56 | end 57 | 58 | def self.authors 59 | # So no one will ever forget your contribution to fastlane :) You are awesome btw! 60 | ['Your GitHub/Twitter Name'] 61 | end 62 | 63 | def self.is_supported?(platform) 64 | platform == :android 65 | end 66 | end 67 | end 68 | end 69 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic/actions/fiv_build_ionic_android.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Actions 3 | module SharedValues 4 | FIV_BUILD_IONIC_ANDROID_CUSTOM_VALUE = 5 | :FIV_BUILD_IONIC_ANDROID_CUSTOM_VALUE 6 | end 7 | 8 | class FivBuildIonicAndroidAction < Action 9 | def self.run(params) 10 | isProd = params[:isProd] 11 | if (isProd) 12 | sh 'ionic cordova build android --prod' 13 | else 14 | sh 'ionic cordova build android' 15 | end 16 | end 17 | 18 | ##################################################### 19 | # @!group Documentation 20 | ##################################################### 21 | 22 | def self.description 23 | 'A short description with <= 80 characters of what this action does' 24 | end 25 | 26 | def self.details 27 | # Optional: 28 | # this is your chance to provide a more detailed description of this action 29 | 'You can use this action to do cool things...' 30 | end 31 | 32 | def self.available_options 33 | # Define all options your action supports. 34 | 35 | # Below a few examples 36 | [ 37 | FastlaneCore::ConfigItem.new( 38 | key: :isProd, 39 | env_name: 'FIV_BUILD_IONIC_ANDROID_IS_PROD', 40 | description: 'Dev or Prod build', 41 | optional: false, 42 | type: Boolean 43 | ) 44 | ] 45 | end 46 | 47 | def self.output 48 | # Define the shared values you are going to provide 49 | # Example 50 | [ 51 | [ 52 | 'FIV_BUILD_IONIC_ANDROID_CUSTOM_VALUE', 53 | 'A description of what this value contains' 54 | ] 55 | ] 56 | end 57 | 58 | def self.return_value 59 | # If your method provides a return value, you can describe here what it does 60 | end 61 | 62 | def self.authors 63 | # So no one will ever forget your contribution to fastlane :) You are awesome btw! 64 | ['Your GitHub/Twitter Name'] 65 | end 66 | 67 | def self.is_supported?(platform) 68 | platform == :android 69 | end 70 | end 71 | end 72 | end 73 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/README.md: -------------------------------------------------------------------------------- 1 | # fivethree_ionic plugin 2 | 3 | [![fastlane Plugin Badge](https://rawcdn.githack.com/fastlane/fastlane/master/fastlane/assets/plugin-badge.svg)](https://rubygems.org/gems/fastlane-plugin-fivethree_ionic) 4 | 5 | ## Getting Started 6 | 7 | This project is a [_fastlane_](https://github.com/fastlane/fastlane) plugin. To get started with `fastlane-plugin-fivethree_ionic`, add it to your project by running: 8 | 9 | ```bash 10 | fastlane add_plugin fivethree_ionic 11 | ``` 12 | 13 | ## About fivethree_ionic 14 | 15 | Fastlane plugin for Ionic v4 Projects 16 | 17 | **Note to author:** Add a more detailed description about this plugin here. If your plugin contains multiple actions, make sure to mention them here. 18 | 19 | ## Example 20 | 21 | Check out the [example `Fastfile`](fastlane/Fastfile) to see how to use this plugin. Try it by cloning the repo, running `fastlane install_plugins` and `bundle exec fastlane test`. 22 | 23 | **Note to author:** Please set up a sample project to make it easy for users to explore what your plugin does. Provide everything that is necessary to try out the plugin in this project (including a sample Xcode/Android project if necessary) 24 | 25 | ## Run tests for this plugin 26 | 27 | To run both the tests, and code style validation, run 28 | 29 | ``` 30 | rake 31 | ``` 32 | 33 | To automatically fix many of the styling issues, use 34 | ``` 35 | rubocop -a 36 | ``` 37 | 38 | ## Publish 39 | 40 | * `cd fastlane-plugin-fivethree_ionic` 41 | * update to latest gem files `bundle install` 42 | * `sudo rake install` 43 | * increment version number in `lib/fastlane/plugin/fivethree_ionic/version.rb` 44 | * build new plugin version `rake build` 45 | * publish ruby gem `gem push pkg/fastlane-plugin-fivethree_ionic-${version}` 46 | 47 | ## Issues and Feedback 48 | 49 | For any other issues and feedback about this plugin, please submit it to this repository. 50 | 51 | ## Troubleshooting 52 | 53 | If you have trouble using plugins, check out the [Plugins Troubleshooting](https://docs.fastlane.tools/plugins/plugins-troubleshooting/) guide. 54 | 55 | ## Using _fastlane_ Plugins 56 | 57 | For more information about how the `fastlane` plugin system works, check out the [Plugins documentation](https://docs.fastlane.tools/plugins/create-plugin/). 58 | 59 | ## About _fastlane_ 60 | 61 | _fastlane_ is the easiest way to automate beta deployments and releases for your iOS and Android apps. To learn more, check out [fastlane.tools](https://fastlane.tools). 62 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic/actions/fiv_take_screenshots.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Actions 3 | module SharedValues 4 | FIV_BUILD_IONIC_ANDROID_CUSTOM_VALUE = 5 | :FIV_BUILD_IONIC_ANDROID_CUSTOM_VALUE 6 | end 7 | 8 | class FivTakeScreenshotsAction < Action 9 | def self.run(params) 10 | UI.header 'Taking Screenshots...' 11 | 12 | sh "ionic cordova run browser --prod && #{params[:cypress]} run -s #{ 13 | params[:spec] 14 | } -b chrome" 15 | UI.success 'Successfully finished taking screenshots' 16 | end 17 | 18 | ##################################################### 19 | # @!group Documentation 20 | ##################################################### 21 | 22 | def self.description 23 | 'A short description with <= 80 characters of what this action does' 24 | end 25 | 26 | def self.details 27 | # Optional: 28 | # this is your chance to provide a more detailed description of this action 29 | 'You can use this action to do cool things...' 30 | end 31 | 32 | def self.available_options 33 | # Define all options your action supports. 34 | 35 | # Below a few examples 36 | [ 37 | FastlaneCore::ConfigItem.new( 38 | key: :cypress, 39 | env_name: 'FIV_BUILD_IONIC_ANDROID_IS_PROD', 40 | description: 'Dev or Prod build', 41 | optional: false, 42 | type: String 43 | ), 44 | FastlaneCore::ConfigItem.new( 45 | key: :spec, 46 | env_name: 'FIV_BUILD_IONIC_ANDROID_IS_PROD', 47 | description: 'Dev or Prod build', 48 | optional: false, 49 | type: String 50 | ) 51 | ] 52 | end 53 | 54 | def self.output 55 | # Define the shared values you are going to provide 56 | # Example 57 | [ 58 | [ 59 | 'FIV_BUILD_IONIC_ANDROID_CUSTOM_VALUE', 60 | 'A description of what this value contains' 61 | ] 62 | ] 63 | end 64 | 65 | def self.return_value 66 | # If your method provides a return value, you can describe here what it does 67 | end 68 | 69 | def self.authors 70 | # So no one will ever forget your contribution to fastlane :) You are awesome btw! 71 | ['Your GitHub/Twitter Name'] 72 | end 73 | 74 | def self.is_supported?(platform) 75 | platform == :android 76 | end 77 | end 78 | end 79 | end 80 | -------------------------------------------------------------------------------- /src/theme/variables.scss: -------------------------------------------------------------------------------- 1 | // Ionic Variables and Theming. For more info, please see: 2 | // http://ionicframework.com/docs/theming/ 3 | 4 | /** Ionic CSS Variables **/ 5 | :root { 6 | /** primary **/ 7 | --ion-color-primary: #488aff; 8 | --ion-color-primary-rgb: 72,138,255; 9 | --ion-color-primary-contrast: #fff; 10 | --ion-color-primary-contrast-rgb: 255,255,255; 11 | --ion-color-primary-shade: #3f79e0; 12 | --ion-color-primary-tint: #5a96ff; 13 | 14 | /** secondary **/ 15 | --ion-color-secondary: #32db64; 16 | --ion-color-secondary-rgb: 50,219,100; 17 | --ion-color-secondary-contrast: #fff; 18 | --ion-color-secondary-contrast-rgb: 255,255,255; 19 | --ion-color-secondary-shade: #2cc158; 20 | --ion-color-secondary-tint: #47df74; 21 | 22 | /** tertiary **/ 23 | --ion-color-tertiary: #f4a942; 24 | --ion-color-tertiary-rgb: 244,169,66; 25 | --ion-color-tertiary-contrast: #fff; 26 | --ion-color-tertiary-contrast-rgb: 255,255,255; 27 | --ion-color-tertiary-shade: #d7953a; 28 | --ion-color-tertiary-tint: #f5b255; 29 | 30 | /** success **/ 31 | --ion-color-success: #10dc60; 32 | --ion-color-success-rgb: 16,220,96; 33 | --ion-color-success-contrast: #fff; 34 | --ion-color-success-contrast-rgb: 255,255,255; 35 | --ion-color-success-shade: #0ec254; 36 | --ion-color-success-tint: #28e070; 37 | 38 | /** warning **/ 39 | --ion-color-warning: #ffce00; 40 | --ion-color-warning-rgb: 255,206,0; 41 | --ion-color-warning-contrast: #000; 42 | --ion-color-warning-contrast-rgb: 0,0,0; 43 | --ion-color-warning-shade: #e0b500; 44 | --ion-color-warning-tint: #ffd31a; 45 | 46 | /** danger **/ 47 | --ion-color-danger: #f53d3d; 48 | --ion-color-danger-rgb: 245,61,61; 49 | --ion-color-danger-contrast: #fff; 50 | --ion-color-danger-contrast-rgb: 255,255,255; 51 | --ion-color-danger-shade: #d83636; 52 | --ion-color-danger-tint: #f65050; 53 | 54 | /** light **/ 55 | --ion-color-light: #f4f4f4; 56 | --ion-color-light-rgb: 244,244,244; 57 | --ion-color-light-contrast: #000; 58 | --ion-color-light-contrast-rgb: 0,0,0; 59 | --ion-color-light-shade: #d7d7d7; 60 | --ion-color-light-tint: #f5f5f5; 61 | 62 | /** medium **/ 63 | --ion-color-medium: #989aa2; 64 | --ion-color-medium-rgb: 152,154,162; 65 | --ion-color-medium-contrast: #000; 66 | --ion-color-medium-contrast-rgb: 0,0,0; 67 | --ion-color-medium-shade: #86888f; 68 | --ion-color-medium-tint: #a2a4ab; 69 | 70 | /** dark **/ 71 | --ion-color-dark: #222; 72 | --ion-color-dark-rgb: 34,34,34; 73 | --ion-color-dark-contrast: #fff; 74 | --ion-color-dark-contrast-rgb: 255,255,255; 75 | --ion-color-dark-shade: #1e1e1e; 76 | --ion-color-dark-tint: #383838; 77 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fivethree-fastlane", 3 | "version": "0.0.1", 4 | "author": "Ionic Framework", 5 | "homepage": "http://ionicframework.com/", 6 | "scripts": { 7 | "ng": "ng", 8 | "start": "ng serve", 9 | "build": "ng build", 10 | "test": "ng test", 11 | "lint": "ng lint", 12 | "e2e": "ng e2e", 13 | "format:fastlane": "prettier --write fastlane-plugin-fivethree_ionic/lib/**/*.rb" 14 | }, 15 | "private": true, 16 | "dependencies": { 17 | "@angular/common": "~6.1.1", 18 | "@angular/core": "~6.1.1", 19 | "@angular/forms": "~6.1.1", 20 | "@angular/http": "~6.1.1", 21 | "@angular/platform-browser": "~6.1.1", 22 | "@angular/platform-browser-dynamic": "~6.1.1", 23 | "@angular/router": "~6.1.1", 24 | "@ionic-native/core": "5.0.0-beta.14", 25 | "@ionic-native/splash-screen": "5.0.0-beta.14", 26 | "@ionic-native/status-bar": "5.0.0-beta.14", 27 | "@ionic/angular": "^4.0.0-beta.0", 28 | "cordova-android": "7.0.0", 29 | "cordova-browser": "5.0.4", 30 | "cordova-ios": "4.5.5", 31 | "cordova-plugin-device": "^2.0.2", 32 | "cordova-plugin-ionic-keyboard": "^2.1.2", 33 | "cordova-plugin-ionic-webview": "^2.1.0", 34 | "cordova-plugin-splashscreen": "^5.0.2", 35 | "cordova-plugin-whitelist": "^1.3.3", 36 | "core-js": "^2.5.3", 37 | "rxjs": "6.2.2", 38 | "zone.js": "^0.8.26" 39 | }, 40 | "devDependencies": { 41 | "@angular/cli": "~6.1.1", 42 | "@angular/compiler": "~6.1.1", 43 | "@angular/compiler-cli": "~6.1.1", 44 | "@angular/language-service": "~6.1.1", 45 | "@ionic/ng-toolkit": "^1.0.0", 46 | "@ionic/schematics-angular": "^1.0.0", 47 | "@prettier/plugin-ruby": "~0.17.0", 48 | "@types/jasmine": "~2.8.6", 49 | "@types/jasminewd2": "~2.0.3", 50 | "@types/node": "~10.7.1", 51 | "codelyzer": "~4.4.2", 52 | "jasmine-core": "~2.99.1", 53 | "jasmine-spec-reporter": "~4.2.1", 54 | "karma": "~3.0.0", 55 | "karma-chrome-launcher": "~2.2.0", 56 | "karma-coverage-istanbul-reporter": "~2.0.0", 57 | "karma-jasmine": "~1.1.1", 58 | "karma-jasmine-html-reporter": "^0.2.2", 59 | "prettier": "~1.19.1", 60 | "protractor": "~5.4.0", 61 | "ts-node": "~7.0.0", 62 | "tslint": "~5.11.0", 63 | "typescript": "~2.7.2" 64 | }, 65 | "description": "An Ionic project", 66 | "cordova": { 67 | "plugins": { 68 | "cordova-plugin-whitelist": {}, 69 | "cordova-plugin-device": {}, 70 | "cordova-plugin-splashscreen": {}, 71 | "cordova-plugin-ionic-webview": {}, 72 | "cordova-plugin-ionic-keyboard": {} 73 | }, 74 | "platforms": [ 75 | "ios", 76 | "android", 77 | "browser" 78 | ] 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), 12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** IE9, IE10 and IE11 requires all of the following polyfills. **/ 22 | // import 'core-js/es6/symbol'; 23 | // import 'core-js/es6/object'; 24 | // import 'core-js/es6/function'; 25 | // import 'core-js/es6/parse-int'; 26 | // import 'core-js/es6/parse-float'; 27 | // import 'core-js/es6/number'; 28 | // import 'core-js/es6/math'; 29 | // import 'core-js/es6/string'; 30 | // import 'core-js/es6/date'; 31 | // import 'core-js/es6/array'; 32 | // import 'core-js/es6/regexp'; 33 | // import 'core-js/es6/map'; 34 | // import 'core-js/es6/weak-map'; 35 | // import 'core-js/es6/set'; 36 | 37 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */ 38 | // import 'classlist.js'; // Run `npm install --save classlist.js`. 39 | 40 | /** IE10 and IE11 requires the following for the Reflect API. */ 41 | // import 'core-js/es6/reflect'; 42 | 43 | 44 | /** Evergreen browsers require these. **/ 45 | // Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. 46 | import 'core-js/es7/reflect'; 47 | 48 | 49 | /** 50 | * Required to support Web Animations `@angular/platform-browser/animations`. 51 | * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation 52 | **/ 53 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 54 | 55 | 56 | 57 | /*************************************************************************************************** 58 | * Zone JS is required by Angular itself. 59 | */ 60 | import 'zone.js/dist/zone'; // Included with Angular CLI. 61 | 62 | 63 | 64 | /*************************************************************************************************** 65 | * APPLICATION IMPORTS 66 | */ 67 | 68 | /** 69 | * Date, currency, decimal and percent pipes. 70 | * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 71 | */ 72 | // import 'intl'; // Run `npm install --save intl`. 73 | /** 74 | * Need to import at least one locale-data with intl. 75 | */ 76 | // import 'intl/locale-data/jsonp/en'; 77 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic/actions/fiv_select_client.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Actions 3 | class FivSelectClientAction < Action 4 | def self.run(params) 5 | Dir.chdir "#{params[:clients_folder]}" do 6 | clients_folders = Dir.glob('*').sort.select { |f| File.directory? f } 7 | client = ENV['CLIENT'] || params[:client] 8 | if (client) 9 | if (clients_folders.include?(client)) 10 | puts( 11 | " 12 | *********************************************** 13 | Selected client: #{ 14 | client 15 | } 16 | *********************************************** 17 | " 18 | ) 19 | return client 20 | else 21 | UI.user_error!("Client #{client} is not available.") 22 | end 23 | end 24 | 25 | selected_client = UI.select('Select one client: ', clients_folders) 26 | 27 | puts( 28 | " 29 | *********************************************** 30 | Selected client: #{ 31 | selected_client 32 | } 33 | *********************************************** 34 | " 35 | ) 36 | return selected_client 37 | end 38 | end 39 | 40 | def self.description 41 | 'Select a client' 42 | end 43 | 44 | def self.available_options 45 | [ 46 | FastlaneCore::ConfigItem.new( 47 | key: :clients_folder, 48 | env_name: 'FIV_CLIENTS_FOLDER', 49 | # The name of the environment variable 50 | description: 'Clients folder path for SelectClientAction', 51 | # a short description of this parameter 52 | default_value: 'clients', 53 | is_string: true, 54 | verify_block: 55 | proc do |value| 56 | unless (value and not value.empty?) 57 | UI.user_error!( 58 | "No client folder path for SelectClientAction given, pass using `client_folder: '../path_to_clients_folder'`" 59 | ) 60 | end 61 | unless File.directory?(value) 62 | UI.user_error!( 63 | "Couldn't find clients folder at path '#{value}'" 64 | ) 65 | end 66 | end 67 | ), 68 | FastlaneCore::ConfigItem.new( 69 | key: :client, 70 | env_name: 'FIV_CLIENT', 71 | # The name of the environment variable 72 | description: 'client to select', 73 | # a short description of this parameter" 74 | is_string: true, 75 | optional: true 76 | ) 77 | ] 78 | end 79 | 80 | def self.author 81 | 'Marc' 82 | end 83 | 84 | def self.is_supported?(platform) 85 | %i[ios mac android].include? platform 86 | end 87 | end 88 | end 89 | end 90 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic/actions/fiv_update_version_and_build_no.rb: -------------------------------------------------------------------------------- 1 | require 'fastlane/action' 2 | require_relative '../helper/fivethree_ionic_helper' 3 | require_relative './fiv_update_version' 4 | require_relative './fiv_increment_build_no' 5 | 6 | module Fastlane 7 | module Actions 8 | class FivUpdateVersionAndBuildNoAction < Action 9 | def self.run(params) 10 | version = '' 11 | if (params[:skip_version]) 12 | puts('skiping version, just incrementing build no') 13 | old_version = 14 | sh "echo \"cat //*[local-name()='widget']/@version\" | xmllint --shell #{ 15 | params[:pathToConfigXML] 16 | }| awk -F'[=\"]' '!/>/{print $(NF-1)}'" 17 | version = old_version.delete!("\n") 18 | else 19 | version = 20 | Fastlane::Actions::FivUpdateVersionAction.run( 21 | pathToConfigXML: params[:pathToConfigXML] 22 | ) 23 | end 24 | build_no = 25 | Fastlane::Actions::FivIncrementBuildNoAction.run( 26 | pathToConfigXML: params[:pathToConfigXML], ios: params[:ios] 27 | ) 28 | 29 | return { version: version, build_no: build_no } 30 | end 31 | 32 | def self.description 33 | 'Fastlane plugin for Ionic v4 Projects' 34 | end 35 | 36 | def self.authors 37 | %w[Fivethree] 38 | end 39 | 40 | def self.return_value 41 | # If your method provides a return value, you can describe here what it does 42 | 'returns object containing version and build_no' 43 | end 44 | 45 | def self.details 46 | # Optional: 47 | 'Fastlane' 48 | end 49 | 50 | def self.available_options 51 | [ 52 | FastlaneCore::ConfigItem.new( 53 | key: :ios, 54 | env_name: 'FIV_INCREMENT_BUILD_NO_IOS', 55 | description: '---', 56 | optional: false, 57 | type: Boolean 58 | ), 59 | FastlaneCore::ConfigItem.new( 60 | key: :pathToConfigXML, 61 | env_name: 'FIV_INCREMENT_BUILD_CONFIG', 62 | description: '---', 63 | optional: false, 64 | verify_block: 65 | proc do |value| 66 | unless File.exist?(value) 67 | UI.user_error!( 68 | 'Couldnt find config.xml! Please change your path.' 69 | ) 70 | end 71 | end, 72 | type: String 73 | ), 74 | FastlaneCore::ConfigItem.new( 75 | key: :skip_version, 76 | env_name: 'FIV_SKIP_VERSION', 77 | description: '---', 78 | optional: true, 79 | default_value: false, 80 | type: Boolean 81 | ) 82 | ] 83 | end 84 | 85 | def self.is_supported?(platform) 86 | # Adjust this if your plugin only works for a particular platform (iOS vs. Android, for example) 87 | # See: https://docs.fastlane.tools/advanced/#control-configuration-by-lane-and-by-platform 88 | # 89 | # [:ios, :mac, :android].include?(platform) 90 | true 91 | end 92 | end 93 | end 94 | end 95 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic/actions/fiv_select_clients.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Actions 3 | class FivSelectClientsAction < Action 4 | def self.run(params) 5 | clients = [] 6 | Dir.chdir "#{params[:clients_folder]}" do 7 | clients_folders = Dir.glob('*').sort.select { |f| File.directory? f } 8 | 9 | if (ENV['CLIENTS']) 10 | envClients = ENV['CLIENTS'].split(',') 11 | selectedClients = 12 | envClients.select { |x| clients_folders.include?(x) } 13 | puts( 14 | " 15 | *********************************************** 16 | Selected clients: #{ 17 | selectedClients 18 | } 19 | *********************************************** 20 | " 21 | ) 22 | return selectedClients 23 | end 24 | 25 | clients_folders.unshift('All') 26 | selected_client = UI.select('Select clients: ', clients_folders) 27 | 28 | if (selected_client === 'All') 29 | clients_folders.shift 30 | puts( 31 | " 32 | *********************************************** 33 | Selected clients: #{ 34 | clients_folders 35 | } 36 | *********************************************** 37 | " 38 | ) 39 | return clients_folders 40 | end 41 | 42 | puts( 43 | " 44 | *********************************************** 45 | Selected client: #{ 46 | selected_client 47 | } 48 | *********************************************** 49 | " 50 | ) 51 | clients.push(selected_client) 52 | end 53 | 54 | return clients 55 | end 56 | 57 | def self.description 58 | 'Select list of clients' 59 | end 60 | 61 | def self.available_options 62 | [ 63 | FastlaneCore::ConfigItem.new( 64 | key: :clients_folder, 65 | env_name: 'FIV_CLIENTS_FOLDER', 66 | # The name of the environment variable 67 | description: 'Clients folder path for SelectClientAction', 68 | # a short description of this parameter 69 | default_value: 'clients', 70 | is_string: true, 71 | verify_block: 72 | proc do |value| 73 | unless (value and not value.empty?) 74 | UI.user_error!( 75 | "No client folder path for FivSelectClientAction given, pass using `client_folder: '../path_to_clients_folder'`" 76 | ) 77 | end 78 | unless File.directory?(value) 79 | UI.user_error!( 80 | "Couldn't find clients folder at path '#{value}'" 81 | ) 82 | end 83 | end 84 | ) 85 | ] 86 | end 87 | 88 | def self.author 89 | 'Marc' 90 | end 91 | 92 | def self.is_supported?(platform) 93 | %i[ios mac android].include? platform 94 | end 95 | end 96 | end 97 | end 98 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": [ 3 | "node_modules/codelyzer" 4 | ], 5 | "rules": { 6 | "arrow-return-shorthand": true, 7 | "callable-types": true, 8 | "class-name": true, 9 | "comment-format": [ 10 | true, 11 | "check-space" 12 | ], 13 | "curly": true, 14 | "deprecation": { 15 | "severity": "warn" 16 | }, 17 | "eofline": true, 18 | "forin": true, 19 | "import-spacing": true, 20 | "indent": [ 21 | true, 22 | "spaces" 23 | ], 24 | "interface-over-type-literal": true, 25 | "label-position": true, 26 | "max-line-length": [ 27 | true, 28 | 140 29 | ], 30 | "member-access": false, 31 | "member-ordering": [ 32 | true, 33 | { 34 | "order": [ 35 | "static-field", 36 | "instance-field", 37 | "static-method", 38 | "instance-method" 39 | ] 40 | } 41 | ], 42 | "no-arg": true, 43 | "no-bitwise": true, 44 | "no-console": [ 45 | true, 46 | "debug", 47 | "info", 48 | "time", 49 | "timeEnd", 50 | "trace" 51 | ], 52 | "no-construct": true, 53 | "no-debugger": true, 54 | "no-duplicate-super": true, 55 | "no-empty": false, 56 | "no-empty-interface": true, 57 | "no-eval": true, 58 | "no-inferrable-types": [ 59 | true, 60 | "ignore-params" 61 | ], 62 | "no-misused-new": true, 63 | "no-non-null-assertion": true, 64 | "no-shadowed-variable": true, 65 | "no-string-literal": false, 66 | "no-string-throw": true, 67 | "no-switch-case-fall-through": true, 68 | "no-trailing-whitespace": true, 69 | "no-unnecessary-initializer": true, 70 | "no-unused-expression": true, 71 | "no-use-before-declare": true, 72 | "no-var-keyword": true, 73 | "object-literal-sort-keys": false, 74 | "one-line": [ 75 | true, 76 | "check-open-brace", 77 | "check-catch", 78 | "check-else", 79 | "check-whitespace" 80 | ], 81 | "prefer-const": true, 82 | "quotemark": [ 83 | true, 84 | "single" 85 | ], 86 | "radix": true, 87 | "semicolon": [ 88 | true, 89 | "always" 90 | ], 91 | "triple-equals": [ 92 | true, 93 | "allow-null-check" 94 | ], 95 | "typedef-whitespace": [ 96 | true, 97 | { 98 | "call-signature": "nospace", 99 | "index-signature": "nospace", 100 | "parameter": "nospace", 101 | "property-declaration": "nospace", 102 | "variable-declaration": "nospace" 103 | } 104 | ], 105 | "unified-signatures": true, 106 | "variable-name": false, 107 | "whitespace": [ 108 | true, 109 | "check-branch", 110 | "check-decl", 111 | "check-operator", 112 | "check-separator", 113 | "check-type" 114 | ], 115 | "directive-selector": [ 116 | true, 117 | "attribute", 118 | "app", 119 | "camelCase" 120 | ], 121 | "component-selector": [ 122 | true, 123 | "element", 124 | "app", 125 | "page", 126 | "kebab-case" 127 | ], 128 | "no-output-on-prefix": true, 129 | "use-input-property-decorator": true, 130 | "use-output-property-decorator": true, 131 | "use-host-property-decorator": true, 132 | "no-input-rename": true, 133 | "no-output-rename": true, 134 | "use-life-cycle-interface": true, 135 | "use-pipe-transform-interface": true, 136 | "directive-class-suffix": true 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic/actions/fiv_update_version.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Actions 3 | module SharedValues 4 | FIV_UPDATE_VERSION_CUSTOM_VALUE = :FIV_UPDATE_VERSION_CUSTOM_VALUE 5 | end 6 | 7 | class FivUpdateVersionAction < Action 8 | def self.run(params) 9 | # fastlane will take care of reading in the parameter and fetching the environment variable: 10 | old_version = 11 | sh "echo \"cat //*[local-name()='widget']/@version\" | xmllint --shell #{ 12 | params[:pathToConfigXML] 13 | }| awk -F'[=\"]' '!/>/{print $(NF-1)}'" 14 | old_version = old_version.delete!("\n") 15 | puts "current version: #{old_version}" 16 | 17 | puts "Insert new version number, current version in config.xml is '#{ 18 | old_version 19 | }' (Leave empty and press enter to skip this step): " 20 | new_version_number = STDIN.gets.strip 21 | puts "new version: #{new_version_number}" 22 | 23 | if new_version_number.length > 0 24 | puts 'take new version number' 25 | version = new_version_number 26 | else 27 | puts 'take old version number' 28 | version = old_version 29 | end 30 | 31 | text = File.read(params[:pathToConfigXML]) 32 | 33 | new_contents = text.gsub(/version="[0-9.]*"/, "version=\"#{version}\"") 34 | 35 | File.open(params[:pathToConfigXML], 'w') do |file| 36 | file.puts new_contents 37 | end 38 | 39 | return version 40 | end 41 | 42 | ##################################################### 43 | # @!group Documentation 44 | ##################################################### 45 | 46 | def self.description 47 | 'A short description with <= 80 characters of what this action does' 48 | end 49 | 50 | def self.details 51 | # Optional: 52 | # this is your chance to provide a more detailed description of this action 53 | 'You can use this action to do cool things...' 54 | end 55 | 56 | def self.available_options 57 | # Define all options your action supports. 58 | 59 | [ 60 | FastlaneCore::ConfigItem.new( 61 | key: :pathToConfigXML, 62 | env_name: 'FIV_INCREMENT_BUILD_CONFIG', 63 | description: '---', 64 | optional: false, 65 | verify_block: 66 | proc do |value| 67 | unless File.exist?(value) 68 | UI.user_error!( 69 | 'Couldnt find config.xml! Please change your path.' 70 | ) 71 | end 72 | end, 73 | type: String 74 | ) 75 | ] 76 | end 77 | 78 | def self.output 79 | # Define the shared values you are going to provide 80 | # Example 81 | [ 82 | [ 83 | 'FIV_UPDATE_VERSION_CUSTOM_VALUE', 84 | 'A description of what this value contains' 85 | ] 86 | ] 87 | end 88 | 89 | def self.return_value 90 | 'returns the new version specified in config.xml' 91 | end 92 | 93 | def self.authors 94 | # So no one will ever forget your contribution to fastlane :) You are awesome btw! 95 | ['Your GitHub/Twitter Name'] 96 | end 97 | 98 | def self.is_supported?(platform) 99 | # you can do things like 100 | # 101 | # true 102 | # 103 | # platform == :ios 104 | # 105 | # [:ios, :mac].include?(platform) 106 | # 107 | 108 | platform == :ios 109 | end 110 | end 111 | end 112 | end 113 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic/actions/fiv_increment_build_no.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Actions 3 | module SharedValues 4 | FIV_INCREMENT_BUILD_NO_CUSTOM_VALUE = :FIV_INCREMENT_BUILD_NO_CUSTOM_VALUE 5 | end 6 | 7 | class FivIncrementBuildNoAction < Action 8 | def self.run(params) 9 | text = File.read(params[:pathToConfigXML]) 10 | puts "test #{text}" 11 | 12 | isIos = params[:ios] 13 | if (isIos) 14 | app_build_number = 15 | sh "echo \"cat //*[local-name()='widget']/@ios-CFBundleVersion\" | xmllint --shell #{ 16 | params[:pathToConfigXML] 17 | }| awk -F'[=\"]' '!/>/{print $(NF-1)}'" 18 | puts app_build_number.length 19 | 20 | if (app_build_number.length == 0) 21 | new_contents = 22 | text.gsub(//{print $(NF-1)}'" 36 | puts app_build_number.length 37 | 38 | if (app_build_number.length == 0) 39 | new_contents = 40 | text.gsub(/= Build.VERSION_CODES.KITKAT) { 34 | getWindow().getDecorView().setSystemUiVisibility( 35 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | 36 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); 37 | }' 38 | ) 39 | 40 | new_contents = 41 | content.gsub( 42 | /import org.apache.cordova.*;/, 43 | "import org.apache.cordova.*;\nimport android.os.Build;\nimport android.view.View;" 44 | ) 45 | end 46 | 47 | File.open(params[:path], 'w') { |file| file.puts new_contents } 48 | end 49 | 50 | ##################################################### 51 | # @!group Documentation 52 | ##################################################### 53 | 54 | def self.description 55 | 'A short description with <= 80 characters of what this action does' 56 | end 57 | 58 | def self.details 59 | # Optional: 60 | # this is your chance to provide a more detailed description of this action 61 | 'You can use this action to do cool things...' 62 | end 63 | 64 | def self.available_options 65 | # Define all options your action supports. 66 | 67 | # Below a few examples 68 | [ 69 | FastlaneCore::ConfigItem.new( 70 | key: :ios, 71 | env_name: 'FIV_ADD_TRANSPARENT_STATUSBAR_PLATFORM', 72 | description: '---', 73 | optional: false, 74 | type: Boolean 75 | ), 76 | FastlaneCore::ConfigItem.new( 77 | key: :path, 78 | env_name: 'FIV_ADD_TRANSPARENT_STATUSBAR_PATH', 79 | description: 80 | 'Path to Appdelegate.m for ios and MainActivity.java for Android', 81 | optional: false, 82 | verify_block: 83 | proc do |value| 84 | unless File.exist?(value) 85 | UI.user_error!( 86 | 'Couldnt find AppDelegate or Main Activity! Please change your path.' 87 | ) 88 | end 89 | end, 90 | type: String 91 | ) 92 | ] 93 | end 94 | 95 | def self.output 96 | # Define the shared values you are going to provide 97 | # Example 98 | [ 99 | [ 100 | 'ADD_TRANSPARENT_STATUSBAR_CUSTOM_VALUE', 101 | 'A description of what this value contains' 102 | ] 103 | ] 104 | end 105 | 106 | def self.return_value 107 | # If your method provides a return value, you can describe here what it does 108 | end 109 | 110 | def self.authors 111 | # So no one will ever forget your contribution to fastlane :) You are awesome btw! 112 | ['Your GitHub/Twitter Name'] 113 | end 114 | 115 | def self.is_supported?(platform) 116 | # you can do things like 117 | # 118 | # true 119 | # 120 | # platform == :ios 121 | # 122 | # [:ios, :mac].include?(platform) 123 | # 124 | 125 | platform == :ios 126 | end 127 | end 128 | end 129 | end 130 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | PATH 2 | remote: fastlane-plugin-fivethree_ionic 3 | specs: 4 | fastlane-plugin-fivethree_ionic (0.2.0) 5 | 6 | GEM 7 | remote: https://rubygems.org/ 8 | specs: 9 | CFPropertyList (3.0.2) 10 | addressable (2.7.0) 11 | public_suffix (>= 2.0.2, < 5.0) 12 | atomos (0.1.3) 13 | babosa (1.0.3) 14 | claide (1.0.3) 15 | colored (1.2) 16 | colored2 (3.1.2) 17 | commander-fastlane (4.4.6) 18 | highline (~> 1.7.2) 19 | declarative (0.0.10) 20 | declarative-option (0.1.0) 21 | digest-crc (0.4.1) 22 | domain_name (0.5.20190701) 23 | unf (>= 0.0.5, < 1.0.0) 24 | dotenv (2.7.5) 25 | emoji_regex (1.0.1) 26 | excon (0.72.0) 27 | faraday (0.17.3) 28 | multipart-post (>= 1.2, < 3) 29 | faraday-cookie_jar (0.0.6) 30 | faraday (>= 0.7.4) 31 | http-cookie (~> 1.0.0) 32 | faraday_middleware (0.13.1) 33 | faraday (>= 0.7.4, < 1.0) 34 | fastimage (2.1.7) 35 | fastlane (2.141.0) 36 | CFPropertyList (>= 2.3, < 4.0.0) 37 | addressable (>= 2.3, < 3.0.0) 38 | babosa (>= 1.0.2, < 2.0.0) 39 | bundler (>= 1.12.0, < 3.0.0) 40 | colored 41 | commander-fastlane (>= 4.4.6, < 5.0.0) 42 | dotenv (>= 2.1.1, < 3.0.0) 43 | emoji_regex (>= 0.1, < 2.0) 44 | excon (>= 0.71.0, < 1.0.0) 45 | faraday (~> 0.17) 46 | faraday-cookie_jar (~> 0.0.6) 47 | faraday_middleware (~> 0.13.1) 48 | fastimage (>= 2.1.0, < 3.0.0) 49 | gh_inspector (>= 1.1.2, < 2.0.0) 50 | google-api-client (>= 0.29.2, < 0.37.0) 51 | google-cloud-storage (>= 1.15.0, < 2.0.0) 52 | highline (>= 1.7.2, < 2.0.0) 53 | json (< 3.0.0) 54 | jwt (~> 2.1.0) 55 | mini_magick (>= 4.9.4, < 5.0.0) 56 | multi_xml (~> 0.5) 57 | multipart-post (~> 2.0.0) 58 | plist (>= 3.1.0, < 4.0.0) 59 | public_suffix (~> 2.0.0) 60 | rubyzip (>= 1.3.0, < 2.0.0) 61 | security (= 0.1.3) 62 | simctl (~> 1.6.3) 63 | slack-notifier (>= 2.0.0, < 3.0.0) 64 | terminal-notifier (>= 2.0.0, < 3.0.0) 65 | terminal-table (>= 1.4.5, < 2.0.0) 66 | tty-screen (>= 0.6.3, < 1.0.0) 67 | tty-spinner (>= 0.8.0, < 1.0.0) 68 | word_wrap (~> 1.0.0) 69 | xcodeproj (>= 1.13.0, < 2.0.0) 70 | xcpretty (~> 0.3.0) 71 | xcpretty-travis-formatter (>= 0.0.3) 72 | gh_inspector (1.1.3) 73 | google-api-client (0.36.4) 74 | addressable (~> 2.5, >= 2.5.1) 75 | googleauth (~> 0.9) 76 | httpclient (>= 2.8.1, < 3.0) 77 | mini_mime (~> 1.0) 78 | representable (~> 3.0) 79 | retriable (>= 2.0, < 4.0) 80 | signet (~> 0.12) 81 | google-cloud-core (1.5.0) 82 | google-cloud-env (~> 1.0) 83 | google-cloud-errors (~> 1.0) 84 | google-cloud-env (1.3.0) 85 | faraday (~> 0.11) 86 | google-cloud-errors (1.0.0) 87 | google-cloud-storage (1.25.1) 88 | addressable (~> 2.5) 89 | digest-crc (~> 0.4) 90 | google-api-client (~> 0.33) 91 | google-cloud-core (~> 1.2) 92 | googleauth (~> 0.9) 93 | mini_mime (~> 1.0) 94 | googleauth (0.10.0) 95 | faraday (~> 0.12) 96 | jwt (>= 1.4, < 3.0) 97 | memoist (~> 0.16) 98 | multi_json (~> 1.11) 99 | os (>= 0.9, < 2.0) 100 | signet (~> 0.12) 101 | highline (1.7.10) 102 | http-cookie (1.0.3) 103 | domain_name (~> 0.5) 104 | httpclient (2.8.3) 105 | json (2.3.0) 106 | jwt (2.1.0) 107 | memoist (0.16.2) 108 | mini_magick (4.10.1) 109 | mini_mime (1.0.2) 110 | multi_json (1.14.1) 111 | multi_xml (0.6.0) 112 | multipart-post (2.0.0) 113 | nanaimo (0.2.6) 114 | naturally (2.2.0) 115 | net-scp (2.0.0) 116 | net-ssh (>= 2.6.5, < 6.0.0) 117 | net-ssh (5.2.0) 118 | os (1.0.1) 119 | plist (3.5.0) 120 | public_suffix (2.0.5) 121 | representable (3.0.4) 122 | declarative (< 0.1.0) 123 | declarative-option (< 0.2.0) 124 | uber (< 0.2.0) 125 | retriable (3.1.2) 126 | rouge (2.0.7) 127 | rubyzip (1.3.0) 128 | security (0.1.3) 129 | signet (0.12.0) 130 | addressable (~> 2.3) 131 | faraday (~> 0.9) 132 | jwt (>= 1.5, < 3.0) 133 | multi_json (~> 1.10) 134 | simctl (1.6.8) 135 | CFPropertyList 136 | naturally 137 | slack-notifier (2.3.2) 138 | terminal-notifier (2.0.0) 139 | terminal-table (1.8.0) 140 | unicode-display_width (~> 1.1, >= 1.1.1) 141 | tty-cursor (0.7.1) 142 | tty-screen (0.7.1) 143 | tty-spinner (0.9.3) 144 | tty-cursor (~> 0.7) 145 | uber (0.1.0) 146 | unf (0.1.4) 147 | unf_ext 148 | unf_ext (0.0.7.6) 149 | unicode-display_width (1.6.1) 150 | word_wrap (1.0.0) 151 | xcodeproj (1.15.0) 152 | CFPropertyList (>= 2.3.3, < 4.0) 153 | atomos (~> 0.1.3) 154 | claide (>= 1.0.2, < 2.0) 155 | colored2 (~> 3.1) 156 | nanaimo (~> 0.2.6) 157 | xcpretty (0.3.0) 158 | rouge (~> 2.0.7) 159 | xcpretty-travis-formatter (1.0.0) 160 | xcpretty (~> 0.2, >= 0.0.7) 161 | 162 | PLATFORMS 163 | ruby 164 | 165 | DEPENDENCIES 166 | fastlane 167 | fastlane-plugin-fivethree_ionic! 168 | net-scp 169 | 170 | BUNDLED WITH 171 | 2.1.2 172 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic/actions/fiv_version.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Actions 3 | module SharedValues 4 | FIV_BUILD_IONIC_ANDROID_CUSTOM_VALUE = 5 | :FIV_BUILD_IONIC_ANDROID_CUSTOM_VALUE 6 | end 7 | 8 | class FivVersionAction < Action 9 | def self.run(params) 10 | version_and_build_no = 11 | Fastlane::Actions::FivUpdateVersionAndBuildNoAction.run( 12 | ios: params[:ios], 13 | pathToConfigXML: params[:pathToConfigXML], 14 | skip_version: params[:skip_version] 15 | ) 16 | 17 | Fastlane::Actions::FivBumpVersionAction.run( 18 | message: 19 | "fastlane(#{params[:ios] ? 'ios' : 'android'}): build #{ 20 | version_and_build_no[:build_no] 21 | }, version: #{version_and_build_no[:version]}" 22 | ) 23 | 24 | Fastlane::Actions::PushToGitRemoteAction.run( 25 | remote: params[:remote], 26 | local_branch: params[:local_branch], 27 | remote_branch: params[:remote_branch], 28 | force: params[:force], 29 | tags: params[:tags] 30 | ) 31 | 32 | return version_and_build_no 33 | end 34 | 35 | ##################################################### 36 | # @!group Documentation 37 | ##################################################### 38 | 39 | def self.description 40 | 'A short description with <= 80 characters of what this action does' 41 | end 42 | 43 | def self.details 44 | # Optional: 45 | # this is your chance to provide a more detailed description of this action 46 | 'You can use this action to do cool things...' 47 | end 48 | 49 | def self.available_options 50 | # Define all options your action supports. 51 | 52 | # Below a few examples 53 | [ 54 | FastlaneCore::ConfigItem.new( 55 | key: :ios, 56 | env_name: 'FIV_INCREMENT_BUILD_NO_IOS', 57 | description: 'Increment build no for ios', 58 | optional: false, 59 | type: Boolean 60 | ), 61 | FastlaneCore::ConfigItem.new( 62 | key: :pathToConfigXML, 63 | env_name: 'FIV_INCREMENT_BUILD_CONFIG', 64 | description: 'Path to the Cordova config.xml', 65 | optional: false, 66 | verify_block: 67 | proc do |value| 68 | unless File.exist?(value) 69 | UI.user_error!( 70 | 'Couldnt find config.xml! Please change your path.' 71 | ) 72 | end 73 | end, 74 | type: String 75 | ), 76 | FastlaneCore::ConfigItem.new( 77 | key: :local_branch, 78 | env_name: 'FL_GIT_PUSH_LOCAL_BRANCH', 79 | description: 80 | 'The local branch to push from. Defaults to the current branch', 81 | default_value_dynamic: true, 82 | optional: true 83 | ), 84 | FastlaneCore::ConfigItem.new( 85 | key: :remote_branch, 86 | env_name: 'FL_GIT_PUSH_REMOTE_BRANCH', 87 | description: 88 | 'The remote branch to push to. Defaults to the local branch', 89 | default_value_dynamic: true, 90 | optional: true 91 | ), 92 | FastlaneCore::ConfigItem.new( 93 | key: :force, 94 | env_name: 'FL_PUSH_GIT_FORCE', 95 | description: 'Force push to remote', 96 | is_string: false, 97 | default_value: false 98 | ), 99 | FastlaneCore::ConfigItem.new( 100 | key: :tags, 101 | env_name: 'FL_PUSH_GIT_TAGS', 102 | description: 'Whether tags are pushed to remote', 103 | is_string: false, 104 | default_value: true 105 | ), 106 | FastlaneCore::ConfigItem.new( 107 | key: :remote, 108 | env_name: 'FL_GIT_PUSH_REMOTE', 109 | description: 'The remote to push to', 110 | default_value: 'origin' 111 | ), 112 | FastlaneCore::ConfigItem.new( 113 | key: :skip_version, 114 | env_name: 'FIV_SKIP_VERSION', 115 | description: 'CI flag to skip updating the version', 116 | optional: true, 117 | default_value: false, 118 | type: Boolean 119 | ) 120 | ] 121 | end 122 | 123 | def self.output 124 | # Define the shared values you are going to provide 125 | # Example 126 | [ 127 | [ 128 | 'FIV_BUILD_IONIC_ANDROID_CUSTOM_VALUE', 129 | 'A description of what this value contains' 130 | ] 131 | ] 132 | end 133 | 134 | def self.return_value 135 | # If your method provides a return value, you can describe here what it does 136 | end 137 | 138 | def self.authors 139 | # So no one will ever forget your contribution to fastlane :) You are awesome btw! 140 | %w[garygrossgarten] 141 | end 142 | 143 | def self.is_supported?(platform) 144 | platform == :android 145 | end 146 | end 147 | end 148 | end 149 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic/actions/fiv_android_keystore.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Actions 3 | class FivAndroidKeystoreAction < Action 4 | def self.run(params) 5 | keystore_path = params[:keystore_path] 6 | keystore_name = params[:keystore_name] 7 | keystore_file = File.join(keystore_path, keystore_name) + '.keystore' 8 | 9 | # Validating output doesn't exist yet for our android signing info 10 | if File.directory?(keystore_path) 11 | return keystore_file if File.exists?(keystore_file) 12 | else 13 | UI.message 'android keystore doesnt exist yet. creating one for you...' 14 | Dir.mkdir keystore_path 15 | end 16 | 17 | puts 'Please enter the keystore password for new keystore with atleast 6 characters:' 18 | keychain_entry = 19 | CredentialsManager::AccountManager.new( 20 | user: "#{keystore_name}_android_keystore_storepass" 21 | ) 22 | password = keychain_entry.password 23 | 24 | puts 'Please enter the keystore password for new keystore atleast 6 characters:' 25 | keypass_entry = 26 | CredentialsManager::AccountManager.new( 27 | user: "#{keystore_name}_android_keystore_keypass" 28 | ) 29 | key_password = keypass_entry.password 30 | 31 | alias_name = params[:key_alias] 32 | puts "Keystore alias #{alias_name}" 33 | 34 | full_name = 35 | Fastlane::Actions::PromptAction.run(text: 'Enter kexystore full name') 36 | org = Fastlane::Actions::PromptAction.run(text: 'Enter kexystore org') 37 | org_unit = 38 | Fastlane::Actions::PromptAction.run(text: 'Enter kexystore org unit') 39 | city_locality = Fastlane::Actions::PromptAction.run(text: 'Enter city') 40 | state_province = 41 | Fastlane::Actions::PromptAction.run(text: 'Enter state') 42 | country = Fastlane::Actions::PromptAction.run(text: 'country') 43 | 44 | # Create keystore with command 45 | unless File.file?(keystore_file) 46 | keytool = 47 | "keytool -genkey -v \ 48 | -keystore #{ 49 | keystore_file 50 | } \ 51 | -alias #{ 52 | alias_name 53 | } \ 54 | -keyalg RSA -keysize 2048 -validity 10000 \ 55 | -storepass #{ 56 | password 57 | } \ 58 | -keypass #{ 59 | key_password 60 | } \ 61 | -dname \"CN=#{full_name}, OU=#{org_unit}, O=#{ 62 | org 63 | }, L=#{city_locality}, S=#{state_province}, C=#{ 64 | country 65 | }\" 66 | " 67 | sh keytool 68 | else 69 | UI.message "Keystore file already exists - #{keystore_file}" 70 | end 71 | 72 | # Create release-signing.properties for automatic signing with Ionic 73 | release_signing_path = 74 | File.join(keystore_path, 'release-signing.properties') 75 | 76 | unless File.file?(release_signing_path) 77 | out_file = File.new(release_signing_path, 'w') 78 | out_file.puts("storeFile=#{keystore_name}") 79 | out_file.puts("storePassword=#{password}") 80 | out_file.puts("keyAlias=#{alias_name}") 81 | out_file.puts("keyPassword=#{key_password}") 82 | out_file.close 83 | else 84 | UI.message "release-signing.properties file already exists - #{ 85 | release_signing_path 86 | }" 87 | end 88 | 89 | return keystore_file 90 | end 91 | 92 | ##################################################### 93 | # @!group Documentation 94 | ##################################################### 95 | 96 | def self.description 97 | 'Generate an Android keystore file or validate keystore exists' 98 | end 99 | 100 | def self.details 101 | 'Generate an Android keystore file or validate keystore exists' 102 | end 103 | 104 | def self.available_options 105 | [ 106 | FastlaneCore::ConfigItem.new( 107 | key: :keystore_path, 108 | env_name: 'FIV_KEYSTORE_PATH', 109 | description: 'Path to android keystore', 110 | is_string: true, 111 | default_value: './fastlane/android' 112 | ), 113 | FastlaneCore::ConfigItem.new( 114 | key: :keystore_name, 115 | env_name: 'FIV_KEYSTORE_NAME', 116 | description: 'Name of the keystore', 117 | is_string: true, 118 | optional: false 119 | ), 120 | FastlaneCore::ConfigItem.new( 121 | key: :key_alias, 122 | env_name: 'FIV_ANDROID_KEYSTORE_ALIAS', 123 | description: 'Key alias of the keystore', 124 | is_string: true, 125 | optional: false 126 | ) 127 | ] 128 | end 129 | 130 | def self.output 131 | [ 132 | ['ANDROID_KEYSTORE_KEYSTORE_PATH', 'Path to keystore'], 133 | [ 134 | 'ANDROID_KEYSTORE_RELEASE_SIGNING_PATH', 135 | 'Path to release-signing.properties' 136 | ] 137 | ] 138 | end 139 | 140 | def self.return_value 141 | 'Path to keystore' 142 | end 143 | 144 | def self.authors 145 | %w[fivethree] 146 | end 147 | 148 | def self.is_supported?(platform) 149 | platform == :android 150 | end 151 | end 152 | end 153 | end 154 | -------------------------------------------------------------------------------- /angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular-devkit/core/src/workspace/workspace-schema.json", 3 | "version": 1, 4 | "defaultProject": "app", 5 | "projects": { 6 | "app": { 7 | "root": "", 8 | "sourceRoot": "src", 9 | "projectType": "application", 10 | "prefix": "app", 11 | "schematics": {}, 12 | "architect": { 13 | "build": { 14 | "builder": "@angular-devkit/build-angular:browser", 15 | "options": { 16 | "progress": false, 17 | "outputPath": "www", 18 | "index": "src/index.html", 19 | "main": "src/main.ts", 20 | "polyfills": "src/polyfills.ts", 21 | "tsConfig": "src/tsconfig.app.json", 22 | "assets": [ 23 | { 24 | "glob": "**/*", 25 | "input": "src/assets", 26 | "output": "assets" 27 | }, 28 | { 29 | "glob": "**/*.svg", 30 | "input": "node_modules/@ionic/angular/dist/ionic/svg", 31 | "output": "./svg" 32 | } 33 | ], 34 | "styles": [ 35 | { 36 | "input": "src/theme/variables.scss" 37 | }, 38 | { 39 | "input": "src/global.scss" 40 | } 41 | ], 42 | "scripts": [] 43 | }, 44 | "configurations": { 45 | "production": { 46 | "fileReplacements": [ 47 | { 48 | "replace": "src/environments/environment.ts", 49 | "with": "src/environments/environment.prod.ts" 50 | } 51 | ], 52 | "optimization": true, 53 | "outputHashing": "all", 54 | "sourceMap": false, 55 | "extractCss": true, 56 | "namedChunks": false, 57 | "aot": true, 58 | "extractLicenses": true, 59 | "vendorChunk": false, 60 | "buildOptimizer": true 61 | } 62 | } 63 | }, 64 | "serve": { 65 | "builder": "@angular-devkit/build-angular:dev-server", 66 | "options": { 67 | "browserTarget": "app:build" 68 | }, 69 | "configurations": { 70 | "production": { 71 | "browserTarget": "app:build:production" 72 | } 73 | } 74 | }, 75 | "extract-i18n": { 76 | "builder": "@angular-devkit/build-angular:extract-i18n", 77 | "options": { 78 | "browserTarget": "app:build" 79 | } 80 | }, 81 | "test": { 82 | "builder": "@angular-devkit/build-angular:karma", 83 | "options": { 84 | "main": "src/test.ts", 85 | "polyfills": "src/polyfills.ts", 86 | "tsConfig": "src/tsconfig.spec.json", 87 | "karmaConfig": "src/karma.conf.js", 88 | "styles": [ 89 | "styles.css" 90 | ], 91 | "scripts": [], 92 | "assets": [ 93 | { 94 | "glob": "favicon.ico", 95 | "input": "src/", 96 | "output": "/" 97 | }, 98 | { 99 | "glob": "**/*", 100 | "input": "src/assets", 101 | "output": "/assets" 102 | } 103 | ] 104 | } 105 | }, 106 | "lint": { 107 | "builder": "@angular-devkit/build-angular:tslint", 108 | "options": { 109 | "tsConfig": [ 110 | "src/tsconfig.app.json", 111 | "src/tsconfig.spec.json" 112 | ], 113 | "exclude": [ 114 | "**/node_modules/**" 115 | ] 116 | } 117 | }, 118 | "ionic-cordova-build": { 119 | "builder": "@ionic/ng-toolkit:cordova-build", 120 | "options": { 121 | "browserTarget": "app:build" 122 | }, 123 | "configurations": { 124 | "production": { 125 | "browserTarget": "app:build:production" 126 | } 127 | } 128 | }, 129 | "ionic-cordova-serve": { 130 | "builder": "@ionic/ng-toolkit:cordova-serve", 131 | "options": { 132 | "cordovaBuildTarget": "app:ionic-cordova-build", 133 | "devServerTarget": "app:serve" 134 | }, 135 | "configurations": { 136 | "production": { 137 | "cordovaBuildTarget": "app:ionic-cordova-build:production", 138 | "devServerTarget": "app:serve:production" 139 | } 140 | } 141 | } 142 | } 143 | }, 144 | "app-e2e": { 145 | "root": "e2e/", 146 | "projectType": "application", 147 | "architect": { 148 | "e2e": { 149 | "builder": "@angular-devkit/build-angular:protractor", 150 | "options": { 151 | "protractorConfig": "e2e/protractor.conf.js", 152 | "devServerTarget": "app:serve" 153 | } 154 | }, 155 | "lint": { 156 | "builder": "@angular-devkit/build-angular:tslint", 157 | "options": { 158 | "tsConfig": "e2e/tsconfig.e2e.json", 159 | "exclude": [ 160 | "**/node_modules/**" 161 | ] 162 | } 163 | } 164 | } 165 | } 166 | }, 167 | "cli": { 168 | "defaultCollection": "@ionic/schematics-angular" 169 | }, 170 | "schematics": { 171 | "@ionic/schematics-angular:component": { 172 | "styleext": "scss" 173 | }, 174 | "@ionic/schematics-angular:page": { 175 | "styleext": "scss" 176 | } 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /fastlane/Preview.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | deliver - fivethree-fastlane 5 | 6 | 139 | 140 | 141 | 142 |
143 | 144 | 145 | 146 |
147 | 148 | 149 |
150 | en-US 151 |
152 | 153 | 154 | 155 | 156 |
157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 |
166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 |
176 |
Screenshots
177 | 178 | 179 | 180 |
181 |

No Screenshots Found

182 |

183 | deliver couldn't find any screenshots. 184 | 185 | The existing screenshots on App Store Connect will be kept. 186 | if you want to remove them you have to use the --overwrite_screenshots flag. 187 | 188 |

189 | If you want to download your existing screenshots, run deliver download_screenshots. 190 |

191 |
192 | 193 |
194 | 195 |
196 | 197 | 198 |
199 |
Trade Representative Contact Information
200 |
201 | 202 |
203 |
204 |
205 | 206 | 207 | 208 |
209 |
Review Information
210 |
211 | 212 |
213 |
214 | 215 | 216 | 217 | -------------------------------------------------------------------------------- /config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | fivethree-fastlane 4 | An awesome Ionic/Cordova app. 5 | Ionic Framework Team 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic/actions/fiv_sign_android.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Actions 3 | class FivSignAndroidAction < Action 4 | def self.run(params) 5 | keystore_path = Fastlane::Actions::FivAndroidKeystoreAction.run(params) 6 | 7 | keychain_entry = 8 | CredentialsManager::AccountManager.new( 9 | user: "#{params[:keystore_name]}_android_keystore_storepass" 10 | ) 11 | keystore_storepass = keychain_entry.password 12 | 13 | keychain_entry = 14 | CredentialsManager::AccountManager.new( 15 | user: "#{params[:keystore_name]}_android_keystore_keypass" 16 | ) 17 | keystore_keypass = keychain_entry.password 18 | 19 | puts "You can delete the password if they are wrong stored in the keychain: 'fastlane fastlane-credentials remove --username android_keystore_storepass' and 'fastlane fastlane-credentials remove --username android_keystore_keypass'" 20 | 21 | android_build_tool_path = 22 | "#{params[:android_sdk_path]}/build-tools/#{ 23 | params[:android_build_tool_version] 24 | }" 25 | 26 | zipalign_apk_file = params[:apk_zipalign_target] 27 | if (File.file?(zipalign_apk_file)) 28 | remove_zipalign = "rm -Rf #{zipalign_apk_file}" 29 | sh remove_zipalign 30 | end 31 | 32 | # zipalign APK 33 | zipalign = 34 | "#{android_build_tool_path}/zipalign -v 4 \ 35 | #{ 36 | params[:apk_source] 37 | } \ 38 | #{zipalign_apk_file}" 39 | sh zipalign 40 | 41 | if (!File.directory?(params[:apk_signed_target])) 42 | Dir.mkdir params[:apk_signed_target] 43 | end 44 | 45 | output_path = 46 | "#{params[:apk_signed_target]}/app-release-#{params[:app_version]}-#{ 47 | params[:app_build_no] 48 | }.apk" 49 | 50 | sign = 51 | "#{android_build_tool_path}/apksigner sign \ 52 | --ks #{ 53 | keystore_path 54 | } \ 55 | --ks-key-alias #{ 56 | params[:key_alias] 57 | } \ 58 | --ks-pass 'pass:#{keystore_keypass}' \ 59 | --out #{ 60 | output_path 61 | } \ 62 | #{zipalign_apk_file}" 63 | self.run_shell_script(sign) 64 | 65 | verify = 66 | ("#{android_build_tool_path}/apksigner verify -v #{output_path}") 67 | self.run_shell_script(verify) 68 | 69 | return output_path 70 | end 71 | 72 | ##################################################### 73 | # @!group Documentation 74 | ##################################################### 75 | 76 | def self.description 77 | 'Zipalign, sign and verify android apk' 78 | end 79 | 80 | def self.run_shell_script(command) 81 | Fastlane::Actions.sh(command) 82 | end 83 | 84 | def self.details 85 | # Optional: 86 | # this is your chance to provide a more detailed description of this action 87 | 'You can use this action to do cool things...' 88 | end 89 | 90 | def self.available_options 91 | # Define all options your action supports. 92 | 93 | # Below a few examples 94 | [ 95 | FastlaneCore::ConfigItem.new( 96 | key: :keystore_path, 97 | env_name: 'FIV_KEYSTORE_PATH', 98 | description: 'Path to android keystore', 99 | is_string: true, 100 | default_value: './fastlane/android' 101 | ), 102 | FastlaneCore::ConfigItem.new( 103 | key: :keystore_name, 104 | env_name: 'FIV_KEYSTORE_NAME', 105 | description: 'Name of the keystore', 106 | is_string: true, 107 | optional: false 108 | ), 109 | FastlaneCore::ConfigItem.new( 110 | key: :android_sdk_path, 111 | env_name: 'FIV_ANDROID_SDK_PATH', 112 | description: 'Path to your installed Android SDK', 113 | is_string: true, 114 | default_value: '~/Library/Android/sdk' 115 | ), 116 | FastlaneCore::ConfigItem.new( 117 | key: :android_build_tool_version, 118 | env_name: 'FIV_ANDROID_SDK_BUILD_TOOL_VERSION', 119 | description: 120 | 'Android Build Tool version used for `zipalign`, `sign` and `verify`', 121 | is_string: true, 122 | default_value: '28.0.3' 123 | ), 124 | FastlaneCore::ConfigItem.new( 125 | key: :apk_source, 126 | env_name: 'FIV_APK_SOURCE', 127 | description: 'Source path to the apk file', 128 | is_string: true, 129 | default_value: 130 | './platforms/android/app/build/outputs/apk/release/app-release-unsigned.apk' 131 | ), 132 | FastlaneCore::ConfigItem.new( 133 | key: :apk_zipalign_target, 134 | env_name: 'FIV_APK_ZIPALIGN_TARGET', 135 | description: 'Target path for the zipaligned apk', 136 | is_string: true, 137 | default_value: 138 | './platforms/android/app/build/outputs/apk/release/app-release-unsigned-zipalign.apk' 139 | ), 140 | FastlaneCore::ConfigItem.new( 141 | key: :apk_signed_target, 142 | env_name: 'FIV_APK_SIGNED_TARGET', 143 | description: 'Tarket path of the signed apk', 144 | is_string: true, 145 | default_value: './platforms/android/app/build/outputs/apk/release' 146 | ), 147 | FastlaneCore::ConfigItem.new( 148 | key: :key_alias, 149 | env_name: 'FIV_ANDROID_KEYSTORE_ALIAS', 150 | description: 'Key alias of the keystore', 151 | is_string: true, 152 | optional: false 153 | ), 154 | FastlaneCore::ConfigItem.new( 155 | key: :app_version, 156 | env_name: 'FIV_APP_VERSION', 157 | description: 'App version', 158 | is_string: true, 159 | default_value: '' 160 | ), 161 | FastlaneCore::ConfigItem.new( 162 | key: :app_build_no, 163 | env_name: 'FIV_APP_BUILD_NO', 164 | description: 'App build number', 165 | is_string: true, 166 | default_value: '' 167 | ) 168 | ] 169 | end 170 | 171 | def self.output 172 | # Define the shared values you are going to provide 173 | # Example 174 | [ 175 | [ 176 | 'FIV_BUILD_IONIC_ANDROID_CUSTOM_VALUE', 177 | 'A description of what this value contains' 178 | ] 179 | ] 180 | end 181 | 182 | def self.return_value 183 | # If your method provides a return value, you can describe here what it does 184 | end 185 | 186 | def self.authors 187 | # So no one will ever forget your contribution to fastlane :) You are awesome btw! 188 | %w[marcjulian] 189 | end 190 | 191 | def self.is_supported?(platform) 192 | platform == :android 193 | end 194 | end 195 | end 196 | end 197 | -------------------------------------------------------------------------------- /fastlane-plugin-fivethree_ionic/lib/fastlane/plugin/fivethree_ionic/actions/fiv_ionic.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Actions 3 | module SharedValues 4 | CORDOVA_IOS_RELEASE_BUILD_PATH = :CORDOVA_IOS_RELEASE_BUILD_PATH 5 | CORDOVA_ANDROID_RELEASE_BUILD_PATH = :CORDOVA_ANDROID_RELEASE_BUILD_PATH 6 | CORDOVA_PWA_RELEASE_BUILD_PATH = :CORDOVA_PWA_RELEASE_BUILD_PATH 7 | end 8 | 9 | class FivIonicAction < Action 10 | ANDROID_ARGS_MAP = { 11 | keystore_path: 'keystore', 12 | keystore_password: 'storePassword', 13 | key_password: 'password', 14 | keystore_alias: 'alias' 15 | } 16 | 17 | IOS_ARGS_MAP = { 18 | type: 'packageType', 19 | team_id: 'developmentTeam', 20 | provisioning_profile: 'provisioningProfile' 21 | } 22 | 23 | PWA_ARGS_MAP = {} 24 | 25 | # do rewriting and copying of action params 26 | def self.get_platform_args(params, args_map) 27 | platform_args = [] 28 | args_map.each do |action_key, cli_param| 29 | param_value = params[action_key] 30 | unless param_value.to_s.empty? 31 | platform_args << "--#{cli_param}=#{Shellwords.escape(param_value)}" 32 | end 33 | end 34 | 35 | return platform_args.join(' ') 36 | end 37 | 38 | # map action params to the cli param they will be used for 39 | 40 | def self.get_android_args(params) 41 | # TODO document magic in README 42 | if params[:key_password].empty? 43 | params[:key_password] = params[:keystore_password] 44 | end 45 | 46 | return self.get_platform_args(params, ANDROID_ARGS_MAP) 47 | end 48 | 49 | def self.get_ios_args(params) 50 | app_identifier = 51 | CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier) 52 | 53 | if params[:provisioning_profile].empty? 54 | # If `match` or `sigh` were used before this, use the certificates returned from there 55 | params[:provisioning_profile] = 56 | ENV['SIGH_UUID'] || 57 | ENV["sigh_#{app_identifier}_#{params[:type].sub('-', '')}"] 58 | end 59 | 60 | params[:type] = 'ad-hoc' if params[:type] == 'adhoc' 61 | params[:type] = 'app-store' if params[:type] == 'appstore' 62 | 63 | return self.get_platform_args(params, IOS_ARGS_MAP) 64 | end 65 | 66 | def self.get_pwa_args(params) 67 | return self.get_platform_args(params, PWA_ARGS_MAP) 68 | end 69 | 70 | # add cordova platform if missing (run #1) 71 | def self.check_and_add_platform(platform) 72 | if platform && !File.directory?("./platforms/#{platform}") 73 | sh "ionic cordova platform add #{platform}" 74 | end 75 | end 76 | 77 | # app_name 78 | def self.get_app_name 79 | config = REXML::Document.new(File.open('config.xml')) 80 | return config.elements['widget'].elements['name'].first.value 81 | end 82 | 83 | # actual building! (run #2) 84 | def self.build(params) 85 | args = [params[:release] ? '--release' : '--debug'] 86 | args << '--prod' if params[:prod] 87 | if params[:platform].to_s == 'android' 88 | android_args = self.get_android_args(params) 89 | end 90 | ios_args = self.get_ios_args(params) if params[:platform].to_s == 'ios' 91 | if params[:platform].to_s == 'browser' 92 | pwa_args = self.get_pwa_args(params) 93 | end 94 | 95 | if params[:cordova_prepare] 96 | # TODO: Remove params not allowed/used for `prepare` 97 | sh "ionic cordova prepare #{params[:platform]} #{args.join(' ')}" 98 | end 99 | 100 | if params[:platform].to_s == 'ios' 101 | sh "ionic cordova compile #{params[:platform]} #{args.join(' ')} -- #{ 102 | ios_args 103 | }" 104 | elsif params[:platform].to_s == 'android' 105 | sh "ionic cordova compile #{params[:platform]} #{ 106 | args.join(' ') 107 | } -- -- #{android_args}" 108 | elsif params[:platform].to_s == 'browser' 109 | sh "ionic cordova compile #{params[:platform]} #{ 110 | args.join(' ') 111 | } -- -- #{pwa_args}" 112 | end 113 | end 114 | 115 | # export build paths (run #3) 116 | def self.set_build_paths(is_release) 117 | app_name = self.get_app_name 118 | build_type = is_release ? 'release' : 'debug' 119 | apk_name = is_release ? 'app-release-unsigned' : 'app-debug' 120 | ENV['CORDOVA_ANDROID_RELEASE_BUILD_PATH'] = 121 | "./platforms/android/app/build/outputs/apk/#{build_type}/#{ 122 | apk_name 123 | }.apk" 124 | ENV['CORDOVA_IOS_RELEASE_BUILD_PATH'] = 125 | "./platforms/ios/build/device/#{app_name}.ipa" 126 | ENV['CORDOVA_PWA_RELEASE_BUILD_PATH'] = './platforms/browser/www' 127 | 128 | # TODO: https://github.com/bamlab/fastlane-plugin-cordova/issues/7 129 | end 130 | 131 | def self.run(params) 132 | Fastlane::Actions::FivCleanInstallAction.run(params) if params[:fresh] 133 | self.check_and_add_platform(params[:platform]) 134 | self.build(params) 135 | self.set_build_paths(params[:release]) 136 | 137 | if params[:platform].to_s == 'ios' 138 | return ENV['CORDOVA_IOS_RELEASE_BUILD_PATH'] 139 | elsif params[:platform].to_s == 'android' 140 | return ENV['CORDOVA_ANDROID_RELEASE_BUILD_PATH'] 141 | elsif params[:platform].to_s == 'browser' 142 | return ENV['CORDOVA_PWA_RELEASE_BUILD_PATH'] 143 | end 144 | end 145 | 146 | ##################################################### 147 | # @!group Documentation 148 | ##################################################### 149 | 150 | def self.description 151 | 'Build your Ionic app' 152 | end 153 | 154 | def self.details 155 | 'Easily integrate your Ionic build into a Fastlane setup' 156 | end 157 | 158 | def self.available_options 159 | [ 160 | FastlaneCore::ConfigItem.new( 161 | key: :platform, 162 | env_name: 'CORDOVA_PLATFORM', 163 | description: 'Platform to build on. Can be android, ios or browser', 164 | is_string: true, 165 | default_value: '', 166 | verify_block: 167 | proc do |value| 168 | unless ['', 'android', 'ios', 'browser'].include? value 169 | UI.user_error!('Platform should be either android or ios') 170 | end 171 | end 172 | ), 173 | FastlaneCore::ConfigItem.new( 174 | key: :release, 175 | env_name: 'CORDOVA_RELEASE', 176 | description: 'Build for release if true, or for debug if false', 177 | is_string: false, 178 | default_value: true, 179 | verify_block: 180 | proc do |value| 181 | unless [false, true].include? value 182 | UI.user_error!('Release should be boolean') 183 | end 184 | end 185 | ), 186 | FastlaneCore::ConfigItem.new( 187 | key: :prod, 188 | env_name: 'IONIC_PROD', 189 | description: 'Build for production', 190 | is_string: false, 191 | default_value: false, 192 | verify_block: 193 | proc do |value| 194 | unless [false, true].include? value 195 | UI.user_error!('Prod should be boolean') 196 | end 197 | end 198 | ), 199 | FastlaneCore::ConfigItem.new( 200 | key: :type, 201 | env_name: 'CORDOVA_IOS_PACKAGE_TYPE', 202 | description: 203 | 'This will determine what type of build is generated by Xcode. Valid options are development, enterprise, adhoc, and appstore', 204 | is_string: true, 205 | default_value: 'appstore', 206 | verify_block: 207 | proc do |value| 208 | unless %w[ 209 | development 210 | enterprise 211 | adhoc 212 | appstore 213 | ad-hoc 214 | app-store 215 | ].include? value 216 | UI.user_error!( 217 | 'Valid options are development, enterprise, adhoc, and appstore.' 218 | ) 219 | end 220 | end 221 | ), 222 | FastlaneCore::ConfigItem.new( 223 | key: :team_id, 224 | env_name: 'CORDOVA_IOS_TEAM_ID', 225 | description: 226 | 'The development team (Team ID) to use for code signing', 227 | is_string: true, 228 | default_value: 229 | CredentialsManager::AppfileConfig.try_fetch_value(:team_id) 230 | ), 231 | FastlaneCore::ConfigItem.new( 232 | key: :provisioning_profile, 233 | env_name: 'CORDOVA_IOS_PROVISIONING_PROFILE', 234 | description: 235 | 'GUID of the provisioning profile to be used for signing', 236 | is_string: true, 237 | default_value: '' 238 | ), 239 | FastlaneCore::ConfigItem.new( 240 | key: :keystore_path, 241 | env_name: 'CORDOVA_ANDROID_KEYSTORE_PATH', 242 | description: 'Path to the Keystore for Android', 243 | is_string: true, 244 | default_value: '' 245 | ), 246 | FastlaneCore::ConfigItem.new( 247 | key: :keystore_password, 248 | env_name: 'CORDOVA_ANDROID_KEYSTORE_PASSWORD', 249 | description: 'Android Keystore password', 250 | is_string: true, 251 | default_value: '' 252 | ), 253 | FastlaneCore::ConfigItem.new( 254 | key: :key_password, 255 | env_name: 'CORDOVA_ANDROID_KEY_PASSWORD', 256 | description: 'Android Key password (default is keystore password)', 257 | is_string: true, 258 | default_value: '' 259 | ), 260 | FastlaneCore::ConfigItem.new( 261 | key: :keystore_alias, 262 | env_name: 'CORDOVA_ANDROID_KEYSTORE_ALIAS', 263 | description: 'Android Keystore alias', 264 | is_string: true, 265 | default_value: '' 266 | ), 267 | FastlaneCore::ConfigItem.new( 268 | key: :cordova_prepare, 269 | env_name: 'CORDOVA_PREPARE', 270 | description: 271 | 'Specifies whether to run `ionic cordova prepare` before building', 272 | default_value: true, 273 | is_string: false 274 | ), 275 | FastlaneCore::ConfigItem.new( 276 | key: :fresh, 277 | env_name: 'BUILD_FRESH', 278 | description: 'Clean install packages, plugins and platform', 279 | default_value: false, 280 | is_string: false 281 | ), 282 | FastlaneCore::ConfigItem.new( 283 | key: :plugins, 284 | env_name: 'REFRESH_PLUGINS', 285 | description: 'also refresh plugins', 286 | default_value: false, 287 | is_string: false 288 | ), 289 | FastlaneCore::ConfigItem.new( 290 | key: :package_manager, 291 | env_name: 'PACKAGE_MANAGER', 292 | description: 293 | 'What package manager to use to install dependencies: e.g. yarn | npm', 294 | is_string: true, 295 | default_value: 'npm', 296 | verify_block: 297 | proc do |value| 298 | unless ['', 'yarn', 'npm'].include? value 299 | UI.user_error!( 300 | 'Platform should be either android, ios or browser' 301 | ) 302 | end 303 | end 304 | ) 305 | ] 306 | end 307 | 308 | def self.output 309 | [ 310 | [ 311 | 'CORDOVA_ANDROID_RELEASE_BUILD_PATH', 312 | 'Path to the signed release APK if it was generated' 313 | ], 314 | [ 315 | 'CORDOVA_IOS_RELEASE_BUILD_PATH', 316 | 'Path to the signed release IPA if it was generated' 317 | ] 318 | ] 319 | end 320 | 321 | def self.authors 322 | %w[fivethree] 323 | end 324 | 325 | def self.is_supported?(platform) 326 | true 327 | end 328 | 329 | def self.example_code 330 | ["ionic( 331 | platform: 'ios' 332 | )"] 333 | end 334 | 335 | def self.category 336 | :building 337 | end 338 | end 339 | end 340 | end 341 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Ionic Fastlane Plugin 3 |

4 | 5 | # ionic-fastlane-plugin 6 | 7 | [fastlane plugin](https://rubygems.org/gems/fastlane-plugin-fivethree_ionic) for Ionic 4+. 8 | 9 | ## Table of content 10 | 11 | - [Getting started](#getting-started) 12 | - [Actions](#actions) 13 | 14 | ## Getting started 15 | 16 | Install the ionic-fastlane plugin 17 | 18 | ```console 19 | fastlane add_plugin fastlane-plugin-fivethree_ionic 20 | ``` 21 | 22 | This will add `gem 'fastlane-plugin-fivethree_ionic'` in the `fastlane/Pluginfile`. 23 | 24 | ## Actions 25 | 26 | This [Fastfile](./fastlane-plugin-fivethree_ionic/fastlane/Fastfile) contains example of the following actions. 27 | 28 | | Action | Description | 29 | | ------------------------------------------------------------------- | ------------------------------------------------------------- | 30 | | [fiv_add_transparent_statusbar](#fiv_add_transparent_statusbar) | 31 | | [fiv_build_ionic_android](#fiv_build_ionic_android) | 32 | | [fiv_android_keystore](#fiv_android_keystore) | Generate an Android keystore file or validate keystore exists | 33 | | [fiv_build_ionic_android](#fiv_build_ionic_android) | 34 | | [fiv_bump_version](#fiv_bump_version) | 35 | | [fiv_clean_install](#fiv_clean_install) | 36 | | [fiv_increment_build_no](#fiv_increment_build_no) | 37 | | [fiv_ionic](#fiv_ionic) | Build your Ionic app for a specific platform | 38 | | [fiv_select_client](#fiv_select_client) | Select a client for white labeling the app | 39 | | [fiv_select_clients](#fiv_select_clients) | Select all, many or one client for white labeling the app | 40 | | [fiv_select_env](#fiv_select_env) | Select an environment folder for white labeling the app | 41 | | [fiv_sign_android](#fiv_sign_android) | Zipalign, sign and verify apk | 42 | | [fiv_update_version](#fiv_update_version) | 43 | | [fiv_update_version_and_build_no](#fiv_update_version_and_build_no) | 44 | | [fiv_version](#fiv_version) | 45 | 46 | ### fiv_add_transparent_statusbar 47 | 48 | ### fiv_android_keystore 49 | 50 | Generate an Android keystore file or validate keystore exists 51 | 52 | #### Options 53 | 54 | | Options | Description | Type | Default | Required | 55 | | ------------- | ------------------------- | -------- | -------------------- | -------- | 56 | | keystore_path | Path to the android | `string` | `./fastlane/android` | `false` | 57 | | keystore_name | Name of the keystore | `string` | | `true` | 58 | | key_alias | Key alias of the keystore | `string` | | `true` | 59 | 60 | ### fiv_build_ionic_android 61 | 62 | ### fiv_bump_version 63 | 64 | ### fiv_clean_install 65 | 66 | ### fiv_increment_build_no 67 | 68 | ### fiv_ionic 69 | 70 | Build your Ionic app for iOS: 71 | 72 | ```ruby 73 | outputpath = 74 | fiv_ionic( 75 | platform: 'ios', release: 'true', prod: 'true', team_id: 'YOUR_TEAM_ID' 76 | ) 77 | ``` 78 | 79 | Build your Ionic app for Android: 80 | 81 | ```ruby 82 | outputpath = fiv_ionic(platform: 'android', release: 'true', prod: 'true') 83 | ``` 84 | 85 | #### Options 86 | 87 | | Options | Description | Type | Default | 88 | | -------- | ------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | ---------- | 89 | | platform | Platform to build on. Can be android, ios or browser | `android` \| `browser` \| `ios` | 90 | | prod | Build for production | `true` \| `false` | `false` | 91 | | release | Build for release if `true`, or for debug if `false` | `true` \| `false` | `true` | 92 | | team_id | The development team (Team ID) to use for code signing | `string` | 93 | | type | This will determine what type of build is generated by Xcode. Valid options are `development`, `enterprise`, `adhoc`, and `appstore` | `development` \| `enterprise` \| `adhoc` \| `appstore` | `appstore` | 94 | 95 | ### fiv_select_client 96 | 97 | Add `fiv_select_client` to your lane to select a client for copying client specific resources before your app build. 98 | 99 | For example you have the following app clients: 100 | 101 | - clients 102 | - companyA 103 | - resources 104 | - ... 105 | - companyB 106 | - companyZ 107 | 108 | `fiv_select_client()` lets you select one client and returns the client name. 109 | 110 | ```ruby 111 | client = fiv_select_client 112 | 113 | # copy client resources e.g. "cp ../clients/#{client}/resources ../" 114 | # build app 115 | ``` 116 | 117 | #### CI 118 | 119 | Client selection can also be passed as an option for a non interactive environment. Add the option `client` to `before_all` and assign it to an environment variable `CLIENT`. 120 | 121 | ```ruby 122 | before_all { |lane, options| ENV['CLIENT'] = options[:client] } 123 | ``` 124 | 125 | `fastlane example_lane client:companyA` 126 | 127 | #### Options 128 | 129 | | Options | Description | Type | Default | Required | 130 | | -------------- | ------------------------------------------ | -------- | --------- | -------- | 131 | | clients_folder | Path to your clients white label resources | `string` | `clients` | `false` | 132 | 133 | ### fiv_select_clients 134 | 135 | Add `fiv_select_clients` to your lane to select all, many or one client for copying client specific resources before your app build in a loop. 136 | 137 | For example you have the following app clients: 138 | 139 | - clients 140 | - companyA 141 | - resources 142 | - ... 143 | - companyB 144 | - companyZ 145 | 146 | `fiv_select_clients()` lets you select all, many or one client and returns an array of client names. 147 | 148 | ```ruby 149 | clients = fiv_select_clients 150 | 151 | clients.each { |client| } 152 | ``` 153 | 154 | #### CI 155 | 156 | Clients selection can also be passed as an option for a non interactive environment. Add the option `clients` to `before_all` and assign it to an environment variable `CLIENTS`. 157 | 158 | ```ruby 159 | before_all { |lane, options| ENV['CLIENTS'] = options[:clients] } 160 | ``` 161 | 162 | Seperate clients by `,`: 163 | 164 | `fastlane example_lane clients:companyA,companyB` 165 | 166 | #### Options 167 | 168 | | Options | Description | Type | Default | Required | 169 | | -------------- | ------------------------------------------ | -------- | --------- | -------- | 170 | | clients_folder | Path to your clients white label resources | `string` | `clients` | `false` | 171 | 172 | ### fiv_select_env 173 | 174 | Add `fiv_select_env` to your lane to select an environment of a client for copying specific resources for this environment before your app build. e.g the resources or app icon and splash screen might differ for each environment. 175 | 176 | For example you have the following app clients with different environments: 177 | 178 | - clients 179 | - companyA 180 | - resources 181 | - environment 182 | - prod 183 | - resources 184 | - qa 185 | - resources 186 | - test 187 | - resorces 188 | - companyB 189 | - companyZ 190 | 191 | `fiv_select_env()` lets you select one client and returns the client name. 192 | 193 | ```ruby 194 | client = fiv_select_client 195 | env = fiv_select_env(client: client) 196 | 197 | # copy client resources from environment e.g. "cp ../clients/#{client}/enviroment/#{env}/resources ../" 198 | # build app 199 | ``` 200 | 201 | #### CI 202 | 203 | Environment selection can also be passed as an option for a non interactive environment. Add the option `env` to `before_all` and assign it to an environment variable `ENV`. 204 | 205 | ```ruby 206 | before_all do |lane, options| 207 | ENV['CLIENT'] = options[:client] 208 | ENV['ENV'] = options[:env] 209 | end 210 | ``` 211 | 212 | `fastlane example_lane client:companyA env:prod` 213 | 214 | #### Options 215 | 216 | | Options | Description | Type | Default | Required | 217 | | ------------------- | ----------------------------------------------- | -------- | -------------- | -------- | 218 | | clients_folder | Path to your clients white label resources | `string` | `clients` | `false` | 219 | | environments_folder | Path to your environments white label resources | `string` | `environments` | `false` | 220 | | client | Path to your selected client | `string` | | `true` | 221 | 222 | ### fiv_sign_android 223 | 224 | Zipaligns, [signs v2](https://source.android.com/security/apksigning/v2) and verifys an apk with a keystore. If the keystore does not exists it uses `fiv_android_keystore` to create a new keystore. 225 | 226 | ```ruby 227 | # run before signing: ionic cordova build android --prod --release 228 | 229 | apk_path = 230 | fiv_sign_android( 231 | keystore_name: 'pizza', 232 | key_alias: 'pizza', 233 | app_version: '1.0.1', 234 | app_build_no: '2020', 235 | apk_output_dir: './apk', 236 | silent: true 237 | ) 238 | ``` 239 | 240 | #### Options 241 | 242 | | Options | Description | Type | Default | Required | 243 | | -------------------------- | -------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------- | -------- | 244 | | keystore_path | Path to the android | `string` | `./fastlane/android` | `false` | 245 | | keystore_name | Name of the keystore used to store storepass and keypass in keychain | `string` | | `true` | 246 | | android_sdk_path | Path to your installed Android SDK | `string` | `~/Library/Android/sdk` | `false` | 247 | | android_build_tool_version | Android Build Tool version used for `zipalign`, `sign` and `verify` | `string` | `28.0.3` | `false` | 248 | | apk_source | Android Build Tool version used for `zipalign`, `sign` and `verify` | `string` | `./platforms/android/app/build/outputs/apk/release/app-release-unsigned.apk` | `false` | 249 | | apk_zipalign_target | Target path for the zipaligned apk | `string` | `./platforms/android/app/build/outputs/apk/release/app-release-unsigned-zipalign.apk` | `false` | 250 | | apk_signed_target | Target path of the signed apk | `string` | `./platforms/android/app/build/outputs/apk/release` | `false` | 251 | | key_alias | Key alias of the keystore | `string` | | `true` | 252 | | app_version | App version | `string` | | `true` | 253 | | app_build_no | App build number | `string` | | `true` | 254 | 255 | ### fiv_update_version 256 | 257 | ### fiv_update_version_and_build_no 258 | 259 | ### fiv_version 260 | --------------------------------------------------------------------------------