Skip to content
This repository has been archived by the owner on Oct 14, 2020. It is now read-only.

Commit

Permalink
Tracking David's PR 379 - preserve dor notation. With improvements.
Browse files Browse the repository at this point in the history
  • Loading branch information
eddyystop committed Aug 19, 2018
1 parent 372ad27 commit fb8cb9d
Show file tree
Hide file tree
Showing 179 changed files with 6,916 additions and 111 deletions.
4 changes: 3 additions & 1 deletion generators/app/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ module.exports = class AppGenerator extends Generator {
async prompting () {
await Generator.asyncInit(this);
const { props, _specs: specs } = this;
const generator = this;
this._initialGeneration = !specs.app || !specs.app.src;
initSpecs('app');

Expand Down Expand Up @@ -95,7 +96,8 @@ module.exports = class AppGenerator extends Generator {
name: 'src',
message: 'What folder should the source files live in?',
default: props.src,
when: this._initialGeneration
when: this._initialGeneration,
filter: input => generator.makeFileName(input)
}, {
name: 'packager',
type: 'list',
Expand Down
23 changes: 14 additions & 9 deletions generators/service/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ module.exports = class ServiceGenerator extends Generator {
name: 'name',
message: 'What is the name of the service?',
filter (input) {
return camelCase(input);
return generator.makeFileName(input);
},
validate (input) {
if (input.trim() === '') {
Expand Down Expand Up @@ -133,7 +133,6 @@ module.exports = class ServiceGenerator extends Generator {
return true;
}
}, {

type: 'list',
name: 'adapter',
message: 'What kind of service is it?',
Expand Down Expand Up @@ -168,13 +167,15 @@ module.exports = class ServiceGenerator extends Generator {
}
]
}, {
// https://stackoverflow.com/questions/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names
name: 'subFolder',
message: 'Generate service in which nested folder, e.g. `v1/blog`? (optional)',
message: 'Place service code in which nested folder, e.g. `v1/blog`? (optional)',
default (answers) {
defaultSubFolder = answers.subFolder || props.subFolder;
defaultSubFolder = serviceSpecs.subFolder || answers.subFolder || props.subFolder;
return defaultSubFolder;
},
filter (input) {
return generator.makeFilePath(input);
},
validate (input) {
if (input.trim().substr(0, 14).toLowerCase() === 'authentication') {
return 'Path cannot start with `authentication`.';
Expand All @@ -189,10 +190,14 @@ module.exports = class ServiceGenerator extends Generator {
name: 'path',
message: 'Which path should the service be registered on?',
default (answers) {
if (defaultSubFolder !== answers.subFolder) {
return `/${generator.getNameSpace(answers.subFolder)[0]}${kebabCase(answers.name || props.name)}`;
}
return serviceSpecs.path || `/${kebabCase(answers.subFolder || props.subFolder)}${kebabCase(answers.name || props.name)}`;
const rawPath = answers.name || props.name;
const pathName = generator.makeFilePath(rawPath);

return defaultSubFolder !== answers.subFolder ?
`/${pathName}` : (serviceSpecs.path || `/${pathName}`);
},
filter (input) {
return generator.makeFilePath(input);
},
validate (input) {
if (input.trim() === '') {
Expand Down
43 changes: 23 additions & 20 deletions generators/writing/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ const mongoose = require('mongoose');
const jsonSchemaSeeder = require('json-schema-seeder');
const Sequelize = require('sequelize');

const { camelCase, kebabCase, snakeCase, upperFirst } = require('lodash');
const { camelCase, kebabCase: kebabCase1, snakeCase, upperFirst } = require('lodash');
const { existsSync } = require('fs');
const { inspect } = require('util');
const { join } = require('path');

const kebabCase = kebabCase1 //name => name === 'users1' ? name : kebabCase1(name);

const doesFileExist = require('../../lib/does-file-exist');
const makeConfig = require('./templates/_configs');
const serviceSpecsExpand = require('../../lib/service-specs-expand');
Expand All @@ -22,7 +24,6 @@ const serviceSpecsToTypescript = require('../../lib/service-specs-to-typescript'
const stringifyPlus = require('../../lib/stringify-plus');

const { generatorFs } = require('../../lib/generator-fs');
const { getFragment } = require('../../lib/code-fragments');
const { updateSpecs } = require('../../lib/specs');

const EOL = '\n';
Expand Down Expand Up @@ -432,15 +433,15 @@ module.exports = function generatorWriting (generator, what) {
// ===== service =================================================================================
function service (generator, name) {
const specsService = specs.services[name];
const kebabName = kebabCase(name);
const fileName = specsService.fileName;
const camelName = camelCase(name);
const snakeName = snakeCase(name);
const adapter = specsService.adapter;
const path = specsService.path;
const isAuthEntityWithAuthentication = specsService.isAuthEntity ? specs.authentication : undefined;

const moduleMappings = {
generic: `./${kebabName}.class`,
generic: `./${fileName}.class`,
memory: 'feathers-memory',
nedb: 'feathers-nedb',
mongodb: 'feathers-mongodb',
Expand Down Expand Up @@ -482,7 +483,7 @@ module.exports = function generatorWriting (generator, what) {
subFolderReverse: generator.getNameSpace(specsService.subFolder)[2],
primaryKey: feathersSpecs[name]._extensions.primaryKey,
camelName,
kebabName,
kebabName: fileName,
snakeName,
adapter,
path: stripSlashes(path),
Expand All @@ -493,7 +494,7 @@ module.exports = function generatorWriting (generator, what) {
hooks: getHookInfo(name),

libDirectory: specs.app.src,
modelName: hasModel ? `${kebabName}.model` : null,
modelName: hasModel ? `${fileName}.model` : null,
serviceModule,
mongoJsonSchema: serviceSpecsToMongoJsonSchema(feathersSpecs[name], feathersSpecs[name]._extensions),
mongooseSchema: serviceSpecsToMongoose(feathersSpecs[name], feathersSpecs[name]._extensions),
Expand Down Expand Up @@ -560,22 +561,22 @@ module.exports = function generatorWriting (generator, what) {
// Custom abbreviations for building 'todos'.
const serviceTpl = existsSync(join(serPath, '_service', `name.service-${adapter}.ejs`))
? `name.service-${adapter}.ejs` : 'name.service.ejs';
const kn = kebabName;
const fn = fileName;
const sfa = context.subFolderArray;

todos = [
tmpl([testPath, 'services', 'name.test.ejs'], [testDir, 'services', ...sfa, `${kn}.test.${js}`], ),
tmpl([testPath, 'services', 'name.test.ejs'], [testDir, 'services', ...sfa, `${fn}.test.${js}`], ),
tmpl([srcPath, '_model', modelTpl], [libDir, 'models', ...sfa, `${context.modelName}.${js}`], false, !context.modelName ),
tmpl([serPath, '_service', serviceTpl], [libDir, 'services', ...sfa, kn, `${kn}.service.${js}`], ),
tmpl([namePath, 'name.class.ejs'], [libDir, 'services', ...sfa, kn, `${kn}.class.${js}`], false, adapter !== 'generic' ),
tmpl([namePath, 'name.interface.ejs'], [libDir, 'services', ...sfa, kn, `${kn}.interface.${js}`], false, isJs ),

tmpl([namePath, 'name.schema.ejs'], [libDir, 'services', ...sfa, kn, `${kn}.schema.${js}`] ),
tmpl([namePath, 'name.mongo.ejs'], [libDir, 'services', ...sfa, kn, `${kn}.mongo.${js}`] ),
tmpl([namePath, 'name.mongoose.ejs'], [libDir, 'services', ...sfa, kn, `${kn}.mongoose.${js}`] ),
tmpl([namePath, 'name.sequelize.ejs'], [libDir, 'services', ...sfa, kn, `${kn}.sequelize.${js}`] ),
tmpl([namePath, 'name.validate.ejs'], [libDir, 'services', ...sfa, kn, `${kn}.validate.${js}`] ),
tmpl([namePath, 'name.hooks.ejs'], [libDir, 'services', ...sfa, kn, `${kn}.hooks.${js}`] ),
tmpl([serPath, '_service', serviceTpl], [libDir, 'services', ...sfa, fn, `${fn}.service.${js}`], ),
tmpl([namePath, 'name.class.ejs'], [libDir, 'services', ...sfa, fn, `${fn}.class.${js}`], false, adapter !== 'generic' ),
tmpl([namePath, 'name.interface.ejs'], [libDir, 'services', ...sfa, fn, `${fn}.interface.${js}`], false, isJs ),

tmpl([namePath, 'name.schema.ejs'], [libDir, 'services', ...sfa, fn, `${fn}.schema.${js}`] ),
tmpl([namePath, 'name.mongo.ejs'], [libDir, 'services', ...sfa, fn, `${fn}.mongo.${js}`] ),
tmpl([namePath, 'name.mongoose.ejs'], [libDir, 'services', ...sfa, fn, `${fn}.mongoose.${js}`] ),
tmpl([namePath, 'name.sequelize.ejs'], [libDir, 'services', ...sfa, fn, `${fn}.sequelize.${js}`] ),
tmpl([namePath, 'name.validate.ejs'], [libDir, 'services', ...sfa, fn, `${fn}.validate.${js}`] ),
tmpl([namePath, 'name.hooks.ejs'], [libDir, 'services', ...sfa, fn, `${fn}.hooks.${js}`] ),
tmpl([serPath, 'index.ejs'], [libDir, 'services', `index.${js}`] ),

tmpl([tpl, 'src', 'app.interface.ejs'], [src, 'app.interface.ts'], false, isJs),
Expand Down Expand Up @@ -752,7 +753,8 @@ module.exports = function generatorWriting (generator, what) {
const strategies = specs.authentication.strategies;

context = Object.assign({}, context, {
kebabEntity: kebabCase(entity),
servicePath: specs.services[entity].path,
kebabEntity: entity,
camelEntity: camelCase(entity),
oauthProviders: [],
strategies
Expand Down Expand Up @@ -1010,14 +1012,15 @@ module.exports = function generatorWriting (generator, what) {

function writeAuthenticationConfiguration (generator, context) {
const config = Object.assign({}, generator._specs._defaultJson);
const path = context.servicePath;

config.authentication = {
secret: generator._specs._isRunningTests
? '***** secret generated for tests *****'
: (config.authentication || {}).secret || crypto.randomBytes(256).toString('hex'),
strategies: [ 'jwt' ],
path: '/authentication',
service: context.kebabEntity,
service: path.substring(0,1) !== '/' ? path : context.servicePath.substring(1),
jwt: {
header: { typ: 'access' },
audience: 'https://yourdomain.com',
Expand Down
1 change: 0 additions & 1 deletion generators/writing/templates/_configs/package.json.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ const semver = require('semver');
module.exports = function(generator) {
const major = semver.major(process.version);
const { props, _specs: specs } = generator;
const lib = props.src;
const [ packager, version ] = specs.app.packager.split('@');

const pkg = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ let moduleExports = function batchLoaderResolvers<%- tplJsOrTs('(app, options)',
-%>
// <%- `${graphqlName}.${fieldName}${__addField.args}: ${__addField.type}` %>
<%- insertFragment(`bl-${graphqlName}-${fieldName}`, __temp) %>
<%- insertFragment(`bl-${graphqlName}-${fieldName}`, __temp, undefined, { indentEnd: 2 }) %>
<% } -%>
<%# --- if-c ends above. -%>
<% }); -%>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ let resolvers = <%- tplJsOrTs('(app, options)', '(app: App, options: ServiceReso
<% } -%>
<%# --- if-4 ends above. -%>
<%# -%>
<%# --- if-5 starts below. NATCHLOADERS -%>
<%# --- if-5 starts below. BATCHLOADERS -%>
<% if (strategy === 'batchloaders') { -%>
let resolvers = <%- tplJsOrTs('(app, options)', '(app: App, options: BatchloaderResolverOptions)') %> => merge({},
generatedResolvers(app, options),
Expand Down
15 changes: 7 additions & 8 deletions lib/code-fragments.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ async function extractFiles (filePaths, ifCheck) {
/*
// !code:
// !<> code:
//!code:
// !end
*/
function extractSource (filePath, src) {
Expand Down Expand Up @@ -130,29 +131,27 @@ function insertFragment (filePath) {
console.log('moduleCode keys', Object.keys(moduleCode));
*/

return (name, defaultCode, forceAsNonDefault) => {
return (name, defaultCode, forceAsNonDefault, options = {}) => {
name = name.trim();

if (moduleCode && name in moduleCode) {
if (!moduleCode[name].length) { // allow fragments with no lines
return [`${genLeader} ${name}`, genTrailer].join(EOL);
}

/*
console.log('name', name);
console.log('moduleCode[name]', typeof moduleCode[name]);
console.log('moduleCode[name][0]', moduleCode[name][0]);
*/
// console.log('name', name);
// console.log('moduleCode[name]', typeof moduleCode[name]);
// console.log('moduleCode[name][0]', moduleCode[name][0]);

const leadSpaces = moduleCode[name][0].search(/\S|$/);
const spaces = ''.padStart(leadSpaces);
const spaces = ''.padStart(leadSpaces + (options.indentEnd || 0));
return [`${genLeader} ${name}`].concat(moduleCode[name], `${spaces}${genTrailer}`).join(EOL);
}

if (defaultCode) {
defaultCode = Array.isArray(defaultCode) ? defaultCode : [defaultCode];
const leadSpaces = (defaultCode[0] || '').search(/\S|$/);
const spaces = ''.padStart(leadSpaces);
const spaces = ''.padStart(leadSpaces + (options.indentEnd || 0));
return [`${forceAsNonDefault ? genLeader : genDefaultLeader} ${name}`]
.concat(defaultCode, `${spaces}${genTrailer}`).join(EOL);
}
Expand Down
1 change: 0 additions & 1 deletion lib/generator-fs.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ function generatorFs (generator, context1, todos) {

const destinationPath = generator.destinationPath(dest);


if (!ifSkip) {
fileNames.push(destinationPath)
}
Expand Down
26 changes: 24 additions & 2 deletions lib/generator.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const chalk = require('chalk');
const Generator = require('yeoman-generator');
const path = require('path');
const semver = require('semver');
const validateNpmPackageName = require('validate-npm-package-name');
const { cwd } = require('process');
const { kebabCase } = require('lodash');
const { parse } = require('path');
Expand Down Expand Up @@ -46,18 +47,35 @@ module.exports = class BaseGenerator extends Generator {
generator._specs = await setPath(generator);
}

getNameSpace(subFolder = '') {
getNameSpace(subFolder = '', ifConvert) {
subFolder = subFolder.trim();


if (subFolder === '') {
return ['', [], ''];
}
const parts = subFolder.split('/').map(part => kebabCase(part));

const parts = subFolder.split('/').map(
part => ifConvert ? makeFileName(part) : part
);

if (subFolder.substr(-1) === '/') {
parts.pop();
}

// ['a/b/c', ['a','b','c'], '../../../'] Last elem backs up to root of subFolder.
return [`${parts.join('/')}/`, parts, '../'.repeat(parts.length)];
}

makeFilePath(path) {
const str = this.getNameSpace(path, true)[0];
return str.substring(0, str.length - 1);
}

makeFileName (name) {
return makeFileName(name);
}

checkDirContainsApp () {
const specs = this.fs.readJSON(this.destinationPath(appSpecsFile), null);

Expand Down Expand Up @@ -142,3 +160,7 @@ module.exports = class BaseGenerator extends Generator {
}
}
};

function makeFileName (name) {
return validateNpmPackageName(name).validForNewPackages ? name : kebabCase(name);
}
16 changes: 12 additions & 4 deletions lib/specs.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@

const _ = require('lodash');
const chalk = require('chalk');
const updateNotifier = require('update-notifier');
const { join } = require('path');
const { kebabCase } = require('lodash');
const { singular } = require('pluralize');
const { writeFileSync } = require('fs');
const updateNotifier = require('update-notifier');

const pkg = require('../package.json');
const specsExpand = require('./specs-expand');
const { refreshCodeFragments, resetForTest: resetFragments } = require('./code-fragments');
Expand Down Expand Up @@ -91,6 +93,8 @@ function initSpecs (what, info) {
specsOptions.freeze = specsOptions.freeze || [];

let graphql;
let fileName;

switch (what) {
case 'all': // fall through
case 'options':
Expand All @@ -103,14 +107,16 @@ function initSpecs (what, info) {
stashedSpecs.middlewares = stashedSpecs.middlewares || undefined;
break;
case 'service':
fileName = generator.makeFileName(info.name);

stashedSpecs.services = stashedSpecs.services || {};
stashedSpecs.services[info.name] = stashedSpecs.services[info.name] || {
name: info.name,
nameSingular: singular(info.name) || info.name,
subFolder: info.subFolder || '',
fileName: `${_.kebabCase(info.name)}`,
fileName: fileName,
adapter: 'nedb',
path: `/${_.kebabCase(info.name)}`,
path: `/${fileName}`,
isAuthEntity: false,
requiresAuth: false,
graphql: true
Expand Down Expand Up @@ -151,6 +157,8 @@ function updateSpecs (what, props, whosCalling) {
let serviceSpecs, connectionSpecs, graphqlSpecs, middlewaresSpecs, key2; // for no-case-declarations

let app;
let fileName;

switch (what) {
case 'all':
break;
Expand Down Expand Up @@ -191,7 +199,7 @@ function updateSpecs (what, props, whosCalling) {
serviceSpecs.name = props.name;
serviceSpecs.nameSingular = props.nameSingular;
serviceSpecs.subFolder = props.subFolder;
serviceSpecs.fileName = `${_.kebabCase(props.name)}`;
serviceSpecs.fileName = generator.makeFileName(props.name);
serviceSpecs.adapter = props.adapter;
serviceSpecs.path = props.path;
//serviceSpecs.isAuthEntity = serviceSpecs.isAuthEntity || false;
Expand Down
Loading

0 comments on commit fb8cb9d

Please sign in to comment.