UNPKG

@nstudio/ionic-angular

Version:

Ionic Angular Plugin for xplat

233 lines (232 loc) 12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = default_1; const schematics_1 = require("@angular-devkit/schematics"); const xplat_1 = require("@nstudio/xplat"); const xplat_utils_1 = require("@nstudio/xplat-utils"); const utils_1 = require("../../utils"); const versions_1 = require("../../utils/versions"); const devkit_1 = require("@nx/devkit"); function default_1(options) { if (!options.name) { throw new schematics_1.SchematicsException((0, xplat_1.missingArgument)('name', 'Provide a name for your Ionic app.', 'nx g @nstudio/ionic-angular:app name')); } return (0, schematics_1.chain)([ (0, xplat_utils_1.prerun)(options), // adjust naming convention xplat_1.XplatHelpers.applyAppNamingConvention(options, 'ionic'), // use xplat or not (tree, context) => options.useXplat ? (0, schematics_1.externalSchematic)('@nstudio/angular', 'xplat', Object.assign(Object.assign({}, options), { platforms: 'ionic,web' })) : (0, schematics_1.externalSchematic)('@nstudio/ionic', 'xplat', Object.assign(Object.assign({}, options), { skipDependentPlatformFiles: true })), // create app files (tree, context) => addAppFiles(options, options.name, options.useXplat ? '' : 'skipxplat')(tree, context), // add root package dependencies utils_1.XplatIonicAngularHelpers.updateRootDeps(options), // XplatHelpers.addPackageInstallTask(options), // add start/clean scripts (tree) => { const scripts = {}; const platformApp = options.name.replace('-', '.'); const directory = options.directory ? `${options.directory}/` : ''; // ensure convenient clean script is added for workspace scripts[`clean`] = `npx rimraf hooks node_modules package-lock.json yarn.lock && yarn`; // add convenient ionic scripts scripts[`prepare.${platformApp}.ios`] = `cd apps/${directory}${options.name} && npm run cap.add.ios`; scripts[`prepare.${platformApp}.android`] = `cd apps/${directory}${options.name} && npm run cap.add.android`; scripts[`open.${platformApp}.ios`] = `cd apps/${directory}${options.name} && npm run cap.ios`; scripts[`open.${platformApp}.android`] = `cd apps/${directory}${options.name} && npm run cap.android`; scripts[`sync.${platformApp}`] = `cd apps/${directory}${options.name} && npm run cap.sync`; scripts[`clean.${platformApp}`] = `cd apps/${directory}${options.name} && npx rimraf hooks node_modules platforms www plugins package-lock.json yarn.lock && yarn`; return (0, xplat_1.updatePackageScripts)(tree, scripts); }, (tree, context) => { const directory = options.directory ? `${options.directory}/` : ''; const appFolder = `apps/${directory}${options.name}/`; (0, devkit_1.addProjectConfiguration)((0, xplat_1.convertNgTreeToDevKit)(tree, context), options.name, { name: options.name, root: appFolder, sourceRoot: `${appFolder}src`, projectType: 'application', targets: { build: { executor: '@angular-devkit/build-angular:browser', options: { outputPath: `${appFolder}www`, index: `${appFolder}src/index.html`, main: `${appFolder}src/main.ts`, polyfills: `${appFolder}src/polyfills.ts`, tsConfig: `${appFolder}tsconfig.app.json`, assets: [ { glob: '**/*', input: `${appFolder}src/assets`, output: 'assets', }, { glob: '**/*.svg', input: 'node_modules/ionicons/dist/ionicons/svg', output: './svg', }, ], styles: [ { input: `${appFolder}src/theme/variables.scss`, }, { input: `${appFolder}src/global.scss`, }, ], scripts: [], aot: false, vendorChunk: true, extractLicenses: false, buildOptimizer: false, sourceMap: true, optimization: false, namedChunks: true, }, configurations: { production: { fileReplacements: [ { replace: `${appFolder}src/environments/environment.ts`, with: `${appFolder}src/environments/environment.prod.ts`, }, ], optimization: true, outputHashing: 'all', sourceMap: false, namedChunks: false, aot: true, extractLicenses: true, vendorChunk: false, buildOptimizer: true, budgets: [ { type: 'initial', maximumWarning: '2mb', maximumError: '5mb', }, ], }, ci: { progress: false, }, }, }, serve: { executor: '@angular-devkit/build-angular:dev-server', options: { browserTarget: `${options.name}:build`, }, configurations: { production: { browserTarget: `${options.name}:build:production`, }, ci: { progress: false, }, }, }, 'extract-i18n': { executor: '@angular-devkit/build-angular:extract-i18n', options: { browserTarget: `${options.name}:build`, }, }, test: { executor: '@angular-devkit/build-angular:karma', options: { main: `${appFolder}src/test.ts`, polyfills: `${appFolder}src/polyfills.ts`, tsConfig: `${appFolder}tsconfig.spec.json`, karmaConfig: `${appFolder}karma.conf.js`, styles: [], scripts: [], assets: [ { glob: 'favicon.ico', input: `${appFolder}src/`, output: '/', }, { glob: '**/*', input: `${appFolder}src/assets`, output: '/assets', }, ], }, configurations: { ci: { progress: false, watch: false, }, }, }, lint: { executor: '@angular-eslint/builder:lint', options: { tsConfig: [ `${appFolder}tsconfig.app.json`, `${appFolder}tsconfig.spec.json`, `${appFolder}e2e/tsconfig.json`, ], lintFilePatterns: ['src/**/*.ts', 'src/**/*.html'], }, }, // TODO: add jest e2e configuration for ionic // e2e: { // builder: '@angular-devkit/build-angular:protractor', // options: { // protractorConfig: `${appFolder}e2e/protractor.conf.js`, // devServerTarget: `${options.name}:serve` // }, // configurations: { // production: { // devServerTarget: `${options.name}:serve:production` // }, // ci: { // devServerTarget: `${options.name}:serve:ci` // } // } // }, 'ionic-cordova-build': { executor: '@ionic/angular-toolkit:cordova-build', options: { browserTarget: `${options.name}:build`, }, configurations: { production: { browserTarget: `${options.name}:build:production`, }, }, }, 'ionic-cordova-serve': { executor: '@ionic/angular-toolkit:cordova-serve', options: { cordovaBuildTarget: `${options.name}:ionic-cordova-build`, devServerTarget: `${options.name}:serve`, }, configurations: { production: { cordovaBuildTarget: `${options.name}:ionic-cordova-build:production`, devServerTarget: `${options.name}:serve:production`, }, }, }, }, }); }, ]); } function addAppFiles(options, appPath, extra = '') { extra = extra ? `${extra}_` : ''; const appname = (0, xplat_utils_1.getAppName)(options, 'ionic'); const directory = options.directory ? `${options.directory}/` : ''; return (0, schematics_1.branchAndMerge)((0, schematics_1.mergeWith)((0, schematics_1.apply)((0, schematics_1.url)(`./_${extra}files`), [ (0, schematics_1.template)(Object.assign(Object.assign(Object.assign({}, options), (0, xplat_1.getDefaultTemplateOptions)()), { pathOffset: directory ? '../../../' : '../../', appname, xplatFolderName: xplat_1.XplatHelpers.getXplatFoldername('ionic', 'angular'), capacitorVersion: versions_1.capacitorVersion, capacitorPluginsVersion: versions_1.capacitorPluginsVersion })), (0, schematics_1.move)(`apps/${directory}${appPath}`), ]))); }