@nstudio/ionic-angular
Version:
Ionic Angular Plugin for xplat
233 lines (232 loc) • 12 kB
JavaScript
;
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}`),
])));
}