UNPKG

@hicoder/angular-cli

Version:

Angular UI componenets and service generator. It works with the mean-rest-express package to generate the end to end web application. The input to this generator is the Mongoose schema defined for the express application. mean-rest-express exposes the Res

307 lines (293 loc) 7.38 kB
const logger = require('./log'); class Features { features = {}; // map of feature: {candidateAPIs: xxx, imports: [{}]} featureList = []; constructor(featureList) { if (featureList) { this.featureList = featureList; } } checkFeature(feature) { let newFeature = feature; if (feature.endsWith('R') || feature.endsWith('U')) { newFeature = feature.slice(0, -1); } if ( !this.featureList.includes(feature) && !this.featureList.includes(newFeature) ) { logger.warning(`Feature ${feature} is not supported!`); } } usedCandidate(feature, API) { this.checkFeature(feature); if (!this.features[feature]) { this.features[feature] = {}; } if (!this.features[feature].candidateAPIs) { this.features[feature].candidateAPIs = ''; } this.features[feature].candidateAPIs += API; } usedConfirmed(feature) { this.checkFeature(feature); if (!this.features[feature]) { this.features[feature] = {}; } this.features[feature].usedFlag = true; } used(API) { for (let p in this.features) { const f = this.features[p]; if (f.candidateAPIs && f.candidateAPIs.includes(API)) { f.usedFlag = true; if (!f.confirmedAPIs) { f.confirmedAPIs = ''; } f.confirmedAPIs += API; } } } addFeatures(featuresMap) { for (let f in featuresMap) { this.checkFeature(f); let featureArray = featuresMap[f]; if (!Array.isArray(featureArray)) { featureArray = [featureArray]; } this.features[f] = { candidateAPIs: '', featureArray, }; } } getUsedFeatures() { let featuresMap = {}; for (let p in this.features) { const f = this.features[p]; if (f.usedFlag) { featuresMap[p] = true; if (!f.confirmedAPIs) { continue; } if (f.confirmedAPIs.includes('U') || f.confirmedAPIs.includes('C')) { featuresMap[`${p}U`] = true; } if (f.confirmedAPIs.includes('L') || f.confirmedAPIs.includes('R')) { featuresMap[`${p}R`] = true; } } } return featuresMap; } getImports() { let imports = {}; let modules = []; let dependencies = []; let featuresMap = this.getUsedFeatures(); for (let p in featuresMap) { let featureArray = this.features[p].featureArray; if (!featureArray) { continue; } for (let a of featureArray) { if (!a.import || !a.from) { continue; } if (!Array.isArray(a.import)) { a.import = [a.import]; } if (a.type === 'module') { modules = modules.concat(a.import); } else if (a.type === 'dependency') { dependencies = dependencies.concat(a.import); } if (!imports[a.from]) { imports[a.from] = []; } imports[a.from] = imports[a.from].concat(a.import); } } dependencies = dependencies.filter( (item, index) => dependencies.indexOf(item) === index ); modules = modules.filter((item, index) => modules.indexOf(item) === index); for (let p in imports) { imports[p] = imports[p].filter( (item, index) => imports[p].indexOf(item) === index ); } return { imports, modules, dependencies, }; } } const featureList = [ 'hasDate', 'hasRef', 'hasEditor', 'hasFileUpload', 'hasEmailing', 'hasMinNumber', 'hasMaxNumber', 'hasAnchorPipe', 'hasRequiredMultiSelection', 'hasRequiredArray', 'hasRequiredMap', 'hasMultiSelect', 'hasAnimation', // FEATURE TO BE ADDED // list view widget feature 'hasCalendar', // IMPORT TO BE ADDED 'hasTinySlider' ]; const listViewWidgetToFeatures = { 'calendar': ['hasCalendar'], 'message': ['hasTinySlider'] }; const angularImports = { common: { hasMinNumberU: { type: 'module', import: 'MddsCoreModule', from: '@hicoder/angular-core', }, hasMaxNumberU: { type: 'module', import: 'MddsCoreModule', from: '@hicoder/angular-core', }, hasAnchorPipeR: { type: 'module', import: 'MddsCoreModule', from: '@hicoder/angular-core', }, hasRequiredArrayU: { type: 'module', import: 'MddsCoreModule', from: '@hicoder/angular-core', }, hasRequiredMapU: { type: 'module', import: 'MddsCoreModule', from: '@hicoder/angular-core', }, hasRequiredMultiSelectionU: { type: 'module', import: 'MddsCoreModule', from: '@hicoder/angular-core', }, hasAnimation: { type: 'module', import: 'BrowserAnimationsModule', from: '@angular/platform-browser/animations', }, }, bootstrap: { hasDate: [ { type: 'module', import: 'NgbModule', from: '@ng-bootstrap/ng-bootstrap', }, { type: 'dependency', import: 'NgbDateParserFormatter', from: '@ng-bootstrap/ng-bootstrap', }, { type: 'dependency', import: ['LOCALE_ID'], from: '@angular/core', }, { type: 'dependency', import: ['MraNgbDateFormatterService'], from: '@hicoder/angular-core', }, ], hasFileUpload: { type: 'module', import: 'FilesModule', from: '@hicoder/angular-file', }, hasEmailingR: { type: 'module', import: 'ActionEmailModule', from: '@hicoder/angular-action-email', }, hasEditor: { // MddsRichtextEditorComponent, MddsRichTextShowDirective, type: 'module', import: 'MddsRichtextEditorModule', from: '@hicoder/angular-richtext', }, hasCalendar: { type: 'module', import: 'MddsCalendarModule', from: '@hicoder/angular-calendar', }, }, angularmeterial: { hasMultiSelect: { type: 'module', import: 'MatChipsModule', from: '@angular/material/chips', }, hasDate: [ { type: 'module', import: 'NgbModule', from: '@ng-bootstrap/ng-bootstrap', }, { type: 'dependency', import: 'NgbDateParserFormatter', from: '@ng-bootstrap/ng-bootstrap', }, { type: 'dependency', import: ['LOCALE_ID'], from: '@angular/core', }, { type: 'dependency', import: ['MraNgbDateFormatterService'], from: '@hicoder/angular-core', }, ], hasFileUpload: { type: 'module', import: 'FilesModule', from: '@hicoder/angular-file', }, hasEmailingR: { type: 'module', import: 'ActionEmailModule', from: '@hicoder/angular-action-email', }, hasEditor: { // MddsRichtextEditorComponent, MddsRichTextShowDirective, type: 'module', import: 'MddsRichtextEditorModule', from: '@hicoder/angular-richtext', }, }, }; function getNewFeatures(framework, design) { let imports = {}; if (framework === 'angular') { imports = angularImports; } const features = new Features(featureList); features.addFeatures(imports.common); if (imports[design]) { features.addFeatures(imports[design]); } return features; } module.exports = { getNewFeatures, listViewWidgetToFeatures, };