From b7991291b6c113d49765b800b5e97dfcc404efbd Mon Sep 17 00:00:00 2001 From: Mike Brocchi Date: Fri, 3 Jun 2016 10:17:53 -0400 Subject: [PATCH] chore: temporarily disable route generation (#992) --- addon/ng2/blueprints/route/index.js | 382 +----------------------- tests/acceptance/generate-route.spec.js | 2 +- tests/e2e/e2e_workflow.spec.js | 4 +- 3 files changed, 6 insertions(+), 382 deletions(-) diff --git a/addon/ng2/blueprints/route/index.js b/addon/ng2/blueprints/route/index.js index c3096acb8fb3..81ee056e4d51 100644 --- a/addon/ng2/blueprints/route/index.js +++ b/addon/ng2/blueprints/route/index.js @@ -1,383 +1,7 @@ -'use strict'; - -const fs = require('fs'); -const path = require('path'); -const dynamicPathParser = require('../../utilities/dynamic-path-parser'); -const stringUtils = require('ember-cli-string-utils'); -const Blueprint = require('ember-cli/lib/models/blueprint'); - - -function _regexEscape(str) { - return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); -} - - -function _insertImport(content, symbolName, fileName) { - // Check if an import from the same file is there. - const importRegex = new RegExp('' + - /^(import\s+\{)/.source + // 1. prefix - /(.*?)/.source + // 2. current imports - `(\\} from '${_regexEscape(fileName)}';)` + // 3. suffix - '\\n', 'm' - ); - - const m = content.match(importRegex); - if (m) { - // console.log(m[2], symbolName, m[2].); - if (m[2].match(new RegExp(`\\b${_regexEscape(symbolName)}\\b`))) { - // Already in the symbol list. - return content; - } - - return content.substr(0, m.index) + m[1] + m[2] + ', ' + symbolName + m[3] + '\n' - + content.substr(m.index + m[0].length); - } - - const importTemplate = `import { ${symbolName} } from '${fileName}';`; - // Find the last import and add an import to it. - content = content.replace(/(import.+)\n(?!import)/m, function (f, m1) { - return `${m1}\n${importTemplate}\n`; - }); - - return content; -} - -function _removeImport(content, symbolName, fileName) { - const importRegex = new RegExp('' + - /^(import\s+\{)/.source + // prefix - /(.*?),?/.source + // symbolsPre - '\\b' + _regexEscape(symbolName) + '\\b' + // symbol - ',?' + '(.*?)' + // symbolsPost - `(} from '${_regexEscape(fileName)}'\\s*;)` + // suffix - '\\n', 'm' - ); - - return content.replace(importRegex, function(_, prefix, symbolsPre, symbol, symbolsPost, suffix) { - if (symbolsPre == '' && symbolsPost == '') { - // Nothing before or after, remove the line. - return ''; - } - if (symbolsPre == '') { - // Nothing before. - return prefix + symbolsPost + suffix; - } - if (symbolsPost == '') { - // Nothing after. - return prefix + symbolsPre + suffix; - } - // Something before and after, add a `,`. - return prefix + symbolsPre + ',' + symbolsPost + suffix; - }); -} - -function _addRoutes(content) { - // If an annotation is already there, just ignore this. - if (content.indexOf('@Routes') !== -1) { - return content; - } - - // Add the imports. - content = _insertImport(content, 'Routes', '@angular/router'); - content = _insertImport(content, 'ROUTER_DIRECTIVES', '@angular/router'); - - // Add the router config. - const m = content.match(/(@Component\(\{[\s\S\n]*?}\)\n)(\s*export class)/m); - if (!m) { - // No component. - // eslint-disable-next-line no-console - console.warn('No component annotation was found...'); - return content; - } - - content = content.substr(0, m.index) + m[1] + '@Routes([\n])\n' - + m[2] + content.substr(m.index + m[0].length); - - return content; -} - - module.exports = { - description: 'Generates a route and a template.', - - availableOptions: [ - { name: 'skip-router-generation', type: Boolean, default: false, aliases: ['srg'] }, - { name: 'default', type: Boolean, default: false }, - { name: 'lazy', type: Boolean, default: true }, - { name: 'inline-template', type: Boolean, default: false, aliases: ['it'] }, - { name: 'inline-style', type: Boolean, default: false, aliases: ['is'] }, - { name: 'prefix', type: Boolean, default: true }, - { name: 'path', type: String } - ], - - beforeInstall: function(options) { - options.route = true; - if (options.lazy) { - options.isLazyRoute = true; - } - return Blueprint.load(path.join(__dirname, '..', 'component')).install(options); - }, - - afterInstall: function (options) { - if (options.dryRun || options.skipRouterGeneration) { - return; - } - - this._addRouteToParent(options); - this._verifyParentRoute(options); - }, - - afterUninstall: function (options) { - this._removeRouteFromParent(options); - }, - - normalizeEntityName: function (entityName) { - var parsedPath = dynamicPathParser(this.project, entityName); - - // If a specified route starts with `+` remove it as it'd break convention. - if (parsedPath.name[0] === '+') { - var index = entityName.lastIndexOf(parsedPath.name); - entityName = entityName.substr(0, index) + entityName.substr(index + 1); - } - - this.dynamicPath = parsedPath; - - //leave the entity name intact for component generation - return entityName; - }, - - locals: function () { - return { - dynamicPath: this.dynamicPath.dir.replace(this.dynamicPath.appRoot, '') - }; - }, - - fileMapTokens: function (options) { - // Return custom template variables here. - return { - __path__: () => { - var dir = this.dynamicPath.dir; - if (!options.locals.flat) { - dir += path.sep + options.dasherizedModuleName; - } - return dir; - } - }; - }, - - _findParentRouteFile: function(dir) { - const parentDir = path.isAbsolute(dir) ? dir : path.join(this.project.root, dir); - // Remove the `+` if it's the first character. - const routeName = path.basename(dir).substr(path.basename(dir)[0] == '+' ? 1 : 0); - let parentFile = path.join(parentDir, `${routeName}.component.ts`); - - if (parentDir == path.join(this.project.root, this.dynamicPath.appRoot)) { - parentFile = path.join(parentDir, this.project.name() + '.component.ts'); - } - - if (fs.existsSync(parentFile)) { - return parentFile; - } - - // Try without the .component. Old routes won't have it, or users might rename it. - parentFile = path.join(parentDir, `${path.basename(dir)}.ts`); - if (fs.existsSync(parentFile)) { - return parentFile; - } - - return null; - }, - - _removeRouteFromParent: function(options) { - const parsedPath = this.dynamicPath; - const parentFile = this._findParentRouteFile(this.dynamicPath.dir); - if (!parentFile) { - return; - } - - const jsComponentName = stringUtils.classify(options.entity.name); - const base = parsedPath.base; - - let content = fs.readFileSync(parentFile, 'utf-8'); - content = _removeImport(content, `${jsComponentName}Component`, - `./${options.isLazyRoute ? '+' : ''}${base}`); - - const route = new RegExp(`^\\s*\\{.*name: '${jsComponentName}'.*component: ${jsComponentName}.*` - + '\\},?\\s*\\n?', 'm'); - content = content.replace(route, ''); - - fs.writeFileSync(parentFile, content, 'utf-8'); - }, - - _addRouteToParent: function(options) { - const parsedPath = this.dynamicPath; - const parentFile = this._findParentRouteFile(this.dynamicPath.dir); - if (!parentFile) { - return; - } - - let isAppComponent = false; - let appComponentFile = - path.join(this.project.root, - this.dynamicPath.dir, - this.project.name() + '.component.ts'); - if (parentFile == appComponentFile) { - isAppComponent = true; - } - - const jsComponentName = stringUtils.classify(options.entity.name); - const base = parsedPath.base; - - // Insert the import statement. - let content = fs.readFileSync(parentFile, 'utf-8'); - let lazyRoutePrefix = '+'; - if (this.project.ngConfig && - this.project.ngConfig.defaults && - this.project.ngConfig.defaults.lazyRoutePrefix !== undefined) { - lazyRoutePrefix = this.project.ngConfig.defaults.lazyRoutePrefix; - } - content = _insertImport(content, `${jsComponentName}Component`, - `./${options.isLazyRoute ? lazyRoutePrefix : ''}${stringUtils.dasherize(base)}`); - - let defaultReg = options.default ? ', useAsDefault: true' : ''; - let routePath = options.path || `/${base}`; - let route = '{' - + `path: '${routePath}', ` - + `component: ${jsComponentName}Component` - + defaultReg - + '}'; - - // Add the route configuration. - content = _addRoutes(content); - content = content.replace(/(@Routes\(\[\s*\n)([\s\S\n]*?)(^\s*\]\))/m, function(_, m1, m2, m3) { - if (m2.length) { - // Add a `,` if there's none. - m2 = m2.replace(/([^,])(\s*)\n$/, function (_, a1, a2) { - return a1 + ',\n' + a2; - }); - } - return m1 + m2 + ` ${route}\n` + m3; - }); - - // Add the directive. - content = content.replace(/(@Component\(\{)([\s\S\n]*?)(\n\}\))/m, function(_, prefix, json, suffix) { - const m = json.match(/(^\s+directives:\s*\[)([\s\S\n]*)(\]\s*,?.*$)/m); - if (m) { - if (m[2].indexOf('ROUTER_DIRECTIVES') != -1) { - // Already there. - return _; - } - - // There's a directive already, but no ROUTER_DIRECTIVES. - return prefix + - json.replace(/(^\s+directives:\s*\[)([\s\S\n]*)(^\]\s*,?.*$)/m, function(_, prefix, d, suffix) { - return prefix + d + (d ? ',' : '') + 'ROUTER_DIRECTIVES' + suffix; - }) + suffix; - } else { - // There's no directive already. - return prefix + json + ',\n directives: [ROUTER_DIRECTIVES]' + suffix; - } - }); - - // Add the provider, only on the APP itself. - if (isAppComponent) { - content = _insertImport(content, 'ROUTER_DIRECTIVES', '@angular/router'); - content = _insertImport(content, 'ROUTER_PROVIDERS', '@angular/router'); - content = content.replace(/(@Component\(\{)([\s\S\n]*?)(\n\}\))/m, function (_, prefix, json, suffix) { - const m = json.match(/(^\s+providers:\s*\[)([\s\S\n]*)(\]\s*,?.*$)/m); - if (m) { - if (m[2].indexOf('ROUTER_PROVIDERS') != -1) { - // Already there. - return _; - } - - // There's a directive already, but no ROUTER_PROVIDERS. - return prefix + - json.replace(/(^\s+providers:\s*\[)([\s\S\n]*)(^\]\s*,?.*$)/m, function (_, prefix, d, suffix) { - return prefix + d + (d ? ',' : '') + 'ROUTER_PROVIDERS' + suffix; - }) + suffix; - } else { - // There's no directive already. - return prefix + json + ',\n providers: [ROUTER_PROVIDERS]' + suffix; - } - }); - } - - // Change the template. - content = content.replace(/(@Component\(\{)([\s\S\n]*?)(\}\))/m, function(_, prefix, json, suffix) { - const m = json.match(/(^\s+template:\s*\[)([\s\S\n]*)(\]\s*,?.*$)/m); - - if (m) { - if (m[2].indexOf('') != -1) { - // Already there. - return _; - } - - // There's a template already, but no . - return prefix + - json.replace(/(^\s+template:\s*`)([\s\S\n]*?)(`,?.*$)/m, function(_, prefix, t, suffix) { - return prefix + t + '' + suffix; - }) + suffix; - } else { - // There's no template, look for the HTML file. - const htmlFile = parentFile.replace(/\.ts$/, '.html'); - if (!fs.existsSync(htmlFile)) { - // eslint-disable-next-line no-console - console.log('Cannot find HTML: ' + htmlFile); - - // Can't be found, exit early. - return _; - } - - let html = fs.readFileSync(htmlFile, 'utf-8'); - if (html.indexOf('') == -1) { - html += '\n'; - - fs.writeFileSync(htmlFile, html, 'utf-8'); - } - return _; - } - }); - - fs.writeFileSync(parentFile, content, 'utf-8'); - }, - - _verifyParentRoute: function() { - const parsedPath = this.dynamicPath; - const parentFile = this._findParentRouteFile(parsedPath.dir); - if (!parentFile) { - return; - } - - const gParentDir = path.dirname(path.dirname(parentFile)); - const gParentFile = this._findParentRouteFile(gParentDir); - - if (!gParentFile) { - return; - } - - let parentComponentName = path.basename(parsedPath.dir); - if (parentComponentName[0] == '+') parentComponentName = parentComponentName.substr(1); - const jsComponentName = stringUtils.classify(parentComponentName); - const routeRegex = new RegExp(`^\\s*\\{.*component: ${jsComponentName}.*` - + '\\},?\\s*\\n?', 'm'); - - let content = fs.readFileSync(gParentFile, 'utf-8'); - const m = content.match(routeRegex); - if (m) { - // Replace `path: '/blah'` with the proper `path: '/blah/...'`. - let json = m[0].replace(/(path:\s*['"])([^'"]+?)(['"])/, function(m, prefix, value, suffix) { - // If the path isn't ending with `...`, add it (with a URL separator). - if (!value.match(/\.\.\.$/)) { - if (!value.match(/\/$/)) { - value += '/'; - } - value += '...'; - } - return prefix + value + suffix; - }); - content = content.substr(0, m.index) + json + content.substr(m.index + m[0].length); - } + description: '', - fs.writeFileSync(gParentFile, content, 'utf-8'); + install: function () { + throw 'Due to changes in the router, route generation has been temporarily disabled'; } }; diff --git a/tests/acceptance/generate-route.spec.js b/tests/acceptance/generate-route.spec.js index 9610185b7179..579d9ad2fd21 100644 --- a/tests/acceptance/generate-route.spec.js +++ b/tests/acceptance/generate-route.spec.js @@ -18,7 +18,7 @@ function fileExpectations(lazy, expectation) { expect(existsSync(path.join(testPath, dir, 'my-route.component.ts'))).to.equal(expectation); } -describe('Acceptance: ng generate route', function () { +xdescribe('Acceptance: ng generate route', function () { before(conf.setup); after(conf.restore); diff --git a/tests/e2e/e2e_workflow.spec.js b/tests/e2e/e2e_workflow.spec.js index f4ecf891a517..309264802ee4 100644 --- a/tests/e2e/e2e_workflow.spec.js +++ b/tests/e2e/e2e_workflow.spec.js @@ -213,7 +213,7 @@ describe('Basic end-to-end Workflow', function () { }); }); - it('Can create a test route using `ng generate route test-route`', function () { + xit('Can create a test route using `ng generate route test-route`', function () { return ng(['generate', 'route', 'test-route']).then(function () { var routeDir = path.join(process.cwd(), 'src', 'app', '+test-route'); expect(existsSync(routeDir)).to.be.equal(true); @@ -221,7 +221,7 @@ describe('Basic end-to-end Workflow', function () { }); }); - it('Perform `ng test` after adding a route', function () { + xit('Perform `ng test` after adding a route', function () { this.timeout(420000); return ng(testArgs).then(function (result) {