diff --git a/bin/sequelize-auto b/bin/sequelize-auto index aaaaaa25..d72ba115 100755 --- a/bin/sequelize-auto +++ b/bin/sequelize-auto @@ -86,6 +86,19 @@ const argv = require('yargs') description: 'Set case of model names: c|l|o|p|u \n c = camelCase \n l = lower_case \n o = original (default) \n p = PascalCase \n u = UPPER_CASE', alias: 'cm' }) + .option('caseModelPrefix', { + description: 'Set prefix of model names', + alias: 'cmp' + }) + .option('caseModelSuffix', { + description: 'Set suffix of model names', + alias: 'cmf' + }) + .option('retainStandardFields', { + description: 'Set Retain Sequelize standard fields', + alias: 'rsf', + type: 'boolean' + }) .option('caseProp', { description: 'Set case of property names: c|l|o|p|u', alias: 'cp' @@ -208,6 +221,9 @@ async function readPassword() { configFile.schema = argv.schema || configFile.schema; configFile.lang = argv.lang || configFile.lang || 'es5'; configFile.caseModel = argv.caseModel || configFile.caseModel || 'o'; + configFile.caseModelPrefix = argv.caseModelPrefix || configFile.caseModelPrefix || ''; + configFile.caseModelSuffix = argv.caseModelSuffix || configFile.caseModelSuffix || ''; + configFile.retainStandardFields = argv.retainStandardFields || configFile.retainStandardFields || ''; configFile.caseFile = argv.caseFile || configFile.caseFile || 'o'; configFile.caseProp = argv.caseProp || configFile.caseProp || 'o'; configFile.noAlias = argv.noAlias || configFile.noAlias || false; diff --git a/package.json b/package.json index 18906f8a..b1e0e499 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sequelize-auto", - "version": "0.8.7", + "version": "0.8.7-1", "publishConfig": { "tag": "latest" }, diff --git a/src/auto-generator.ts b/src/auto-generator.ts index 9d3b4252..857bd2f5 100644 --- a/src/auto-generator.ts +++ b/src/auto-generator.ts @@ -17,6 +17,10 @@ export class AutoGenerator { spaces?: boolean; lang?: LangOption; caseModel?: CaseOption; + caseModelPrefix?: string; + caseModelSuffix?: string; + // retain Sequelize standard fields + retainStandardFields?: boolean; caseProp?: CaseOption; caseFile?: CaseFileOption; skipFields?: string[]; @@ -85,7 +89,7 @@ export class AutoGenerator { tableNames.forEach(table => { let str = header; const [schemaName, tableNameOrig] = qNameSplit(table); - const tableName = makeTableName(this.options.caseModel, tableNameOrig, this.options.singularize, this.options.lang); + const tableName = makeTableName(this.options.caseModel, this.options.caseModelPrefix, this.options.caseModelSuffix, tableNameOrig, this.options.singularize, this.options.lang); if (this.options.lang === 'ts') { const associations = this.addTypeScriptAssociationMixins(table); @@ -93,7 +97,7 @@ export class AutoGenerator { needed.forEach(fkTable => { const set = associations.needed[fkTable]; const [fkSchema, fkTableName] = qNameSplit(fkTable); - const filename = recase(this.options.caseFile, fkTableName, this.options.singularize); + const filename = this.options.caseModelPrefix + recase(this.options.caseFile, fkTableName, this.options.singularize) + this.options.caseModelSuffix; str += 'import type { '; str += Array.from(set.values()).sort().join(', '); str += ` } from './${filename}';\n`; @@ -237,7 +241,7 @@ export class AutoGenerator { // ignore Sequelize standard fields const additional = this.options.additional; - if (additional && (additional.timestamps !== false) && (this.isTimestampField(field) || this.isParanoidField(field))) { + if (this.options.retainStandardFields !== true && additional && (additional.timestamps !== false) && (this.isTimestampField(field) || this.isParanoidField(field))) { return ''; } diff --git a/src/auto-writer.ts b/src/auto-writer.ts index 07f279ad..092df250 100644 --- a/src/auto-writer.ts +++ b/src/auto-writer.ts @@ -15,6 +15,8 @@ export class AutoWriter { options: { caseFile?: CaseFileOption; caseModel?: CaseOption; + caseModelPrefix?: CaseOption; + caseModelSuffix?: CaseOption; caseProp?: CaseOption; directory: string; lang?: LangOption; @@ -87,7 +89,7 @@ export class AutoWriter { // is up to the developer to pick the right schema, and potentially chose different output // folders for each different schema. const [schemaName, tableName] = qNameSplit(table); - const fileName = recase(this.options.caseFile, tableName, this.options.singularize); + const fileName = this.options.caseModelPrefix + recase(this.options.caseFile, tableName, this.options.singularize) + this.options.caseModelSuffix; const filePath = path.join(this.options.directory, fileName + (this.options.lang === 'ts' ? '.ts' : '.js')); const writeFile = util.promisify(fs.writeFile); @@ -130,8 +132,8 @@ export class AutoWriter { const modelNames: string[] = []; // import statements tables.forEach(t => { - const fileName = recase(this.options.caseFile, t, this.options.singularize); - const modelName = makeTableName(this.options.caseModel, t, this.options.singularize, this.options.lang); + const fileName = this.options.caseModelPrefix + recase(this.options.caseFile, t, this.options.singularize) + this.options.caseModelSuffix; + const modelName = makeTableName(this.options.caseModel,this.options.caseModelPrefix,this.options.caseModelSuffix, t, this.options.singularize, this.options.lang); modelNames.push(modelName); str += `import { ${modelName} as _${modelName} } from "./${fileName}";\n`; str += `import type { ${modelName}Attributes, ${modelName}CreationAttributes } from "./${fileName}";\n`; @@ -178,8 +180,8 @@ export class AutoWriter { const modelNames: string[] = []; // import statements tables.forEach(t => { - const fileName = recase(this.options.caseFile, t, this.options.singularize); - const modelName = makeTableName(this.options.caseModel, t, this.options.singularize, this.options.lang); + const fileName = this.options.caseModelPrefix + recase(this.options.caseFile, t, this.options.singularize) + this.options.caseModelSuffix; + const modelName = makeTableName(this.options.caseModel,this.options.caseModelPrefix,this.options.caseModelSuffix, t, this.options.singularize, this.options.lang); modelNames.push(modelName); str += `${vardef} _${modelName} = require("./${fileName}");\n`; }); @@ -215,7 +217,7 @@ export class AutoWriter { // import statements tables.forEach(t => { const fileName = recase(this.options.caseFile, t, this.options.singularize); - const modelName = makeTableName(this.options.caseModel, t, this.options.singularize, this.options.lang); + const modelName = makeTableName(this.options.caseModel, this.options.caseModelPrefix,this.options.caseModelSuffix, t, this.options.singularize, this.options.lang); modelNames.push(modelName); str += `import _${modelName} from "./${fileName}.js";\n`; }); diff --git a/src/types.ts b/src/types.ts index cb3d52a0..747418f5 100644 --- a/src/types.ts +++ b/src/types.ts @@ -231,12 +231,15 @@ export function recase(opt: CaseOption | CaseFileOption | undefined, val: string } const tsNames = ["DataTypes", "Model", "Optional", "Sequelize"]; -export function makeTableName(opt: CaseOption | undefined, tableNameOrig: string | null, singular = false, lang = "es5") { +export function makeTableName(opt: CaseOption | undefined, caseModelPrefix:string|undefined, caseModelSuffix:string|undefined, tableNameOrig: string | null, singular = false, lang = "es5") { + if(!caseModelPrefix) caseModelPrefix = '' + if(!caseModelSuffix) caseModelSuffix = '' let name = recase(opt, tableNameOrig, singular); + if (isReserved(name) || (lang == "ts" && tsNames.includes(name))) { name += "_"; } - return name; + return caseModelPrefix + name + caseModelSuffix; } /** build the array of indentation strings */