From 087054dd467b540b344fc6bee4a76b7a50f5f5d0 Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Thu, 29 May 2025 11:37:15 +0530 Subject: [PATCH 01/16] refactor: move out the loadTemplateConfig from Gigantic generator.js Signed-off-by: ItsRoy69 --- apps/generator/lib/generator.js | 59 +---------------- apps/generator/lib/templateConfig/loader.js | 66 +++++++++++++++++++ .../validator.js} | 4 +- apps/generator/test/generator.test.js | 2 +- 4 files changed, 72 insertions(+), 59 deletions(-) create mode 100644 apps/generator/lib/templateConfig/loader.js rename apps/generator/lib/{templateConfigValidator.js => templateConfig/validator.js} (98%) diff --git a/apps/generator/lib/generator.js b/apps/generator/lib/generator.js index 550dbcca29..395179e821 100644 --- a/apps/generator/lib/generator.js +++ b/apps/generator/lib/generator.js @@ -15,7 +15,8 @@ const { isAsyncAPIDocument } = require('@asyncapi/parser/cjs/document'); const { configureReact, renderReact, saveRenderedReactContent } = require('./renderer/react'); const { configureNunjucks, renderNunjucks } = require('./renderer/nunjucks'); -const { validateTemplateConfig } = require('./templateConfigValidator'); +const { validateTemplateConfig } = require('./templateConfig/validator'); +const { loadTemplateConfig } = require('./templateConfig/loader'); const { convertMapToObject, isFileSystemPath, @@ -287,7 +288,7 @@ class Generator { this.templateName = templatePkgName; this.templateContentDir = path.resolve(this.templateDir, TEMPLATE_CONTENT_DIRNAME); - await this.loadTemplateConfig(); + this.templateConfig = await loadTemplateConfig(this.templateDir, this.templateParams); return { templatePkgName, templatePkgPath }; } @@ -962,60 +963,6 @@ class Generator { return !this.noOverwriteGlobs.some(globExp => minimatch(filePath, globExp)); } - /** - * Loads the template configuration. - * @private - */ - async loadTemplateConfig() { - this.templateConfig = {}; - - // Try to load config from .ageneratorrc - try { - const rcConfigPath = path.resolve(this.templateDir, '.ageneratorrc'); - const yaml = await readFile(rcConfigPath, { encoding: 'utf8' }); - const yamlConfig = require('js-yaml').load(yaml); - this.templateConfig = yamlConfig || {}; - - await this.loadDefaultValues(); - return; - } catch (rcError) { - // console.error('Could not load .ageneratorrc file:', rcError); - log.debug('Could not load .ageneratorrc file:', rcError); - // Continue to try package.json if .ageneratorrc fails - } - - // Try to load config from package.json - try { - const configPath = path.resolve(this.templateDir, CONFIG_FILENAME); - const json = await readFile(configPath, { encoding: 'utf8' }); - const generatorProp = JSON.parse(json).generator; - this.templateConfig = generatorProp || {}; - } catch (packageError) { - // console.error('Could not load generator config from package.json:', packageError); - log.debug('Could not load generator config from package.json:', packageError); - } - - await this.loadDefaultValues(); - } - - /** - * Loads default values of parameters from template config. If value was already set as parameter it will not be - * overriden. - * @private - */ - async loadDefaultValues() { - const parameters = this.templateConfig.parameters; - const defaultValues = Object.keys(parameters || {}).filter(key => parameters[key].default); - - defaultValues.filter(dv => this.templateParams[dv] === undefined).forEach(dv => - Object.defineProperty(this.templateParams, dv, { - enumerable: true, - get() { - return parameters[dv].default; - } - }) - ); - } /** * Launches all the hooks registered at a given hook point/name. diff --git a/apps/generator/lib/templateConfig/loader.js b/apps/generator/lib/templateConfig/loader.js new file mode 100644 index 0000000000..d9d570b7e2 --- /dev/null +++ b/apps/generator/lib/templateConfig/loader.js @@ -0,0 +1,66 @@ +const path = require('path'); +const fs = require('fs'); +const log = require('loglevel'); +const { readFile } = require('../utils'); + +const CONFIG_FILENAME = 'package.json'; + +/** + * Loads the template configuration from either .ageneratorrc or package.json + * + * @param {String} templateDir Path to the template directory + * @param {Object} templateParams Template parameters to be used for default values + * @returns {Promise} The loaded template configuration + */ +async function loadTemplateConfig(templateDir, templateParams) { + let templateConfig = {}; + try { + const rcConfigPath = path.resolve(templateDir, '.ageneratorrc'); + const yaml = await readFile(rcConfigPath, { encoding: 'utf8' }); + const yamlConfig = require('js-yaml').load(yaml); + templateConfig = yamlConfig || {}; + + await loadDefaultValues(templateConfig, templateParams); + return templateConfig; + } catch (rcError) { + log.debug('Could not load .ageneratorrc file:', rcError); + } + + try { + const configPath = path.resolve(templateDir, CONFIG_FILENAME); + const json = await readFile(configPath, { encoding: 'utf8' }); + const generatorProp = JSON.parse(json).generator; + templateConfig = generatorProp || {}; + } catch (packageError) { + log.debug('Could not load generator config from package.json:', packageError); + } + + await loadDefaultValues(templateConfig, templateParams); + return templateConfig; +} + +/** + * Loads default values of parameters from template config. If value was already set as parameter it will not be + * overriden. + * + * @param {Object} templateConfig + * @param {Object} templateParams + * @returns {Promise} + */ +async function loadDefaultValues(templateConfig, templateParams) { + const parameters = templateConfig.parameters; + const defaultValues = Object.keys(parameters || {}).filter(key => parameters[key].default); + + defaultValues.filter(dv => templateParams[dv] === undefined).forEach(dv => + Object.defineProperty(templateParams, dv, { + enumerable: true, + get() { + return parameters[dv].default; + } + }) + ); +} + +module.exports = { + loadTemplateConfig +}; \ No newline at end of file diff --git a/apps/generator/lib/templateConfigValidator.js b/apps/generator/lib/templateConfig/validator.js similarity index 98% rename from apps/generator/lib/templateConfigValidator.js rename to apps/generator/lib/templateConfig/validator.js index 9e075b98bf..1b4e4b9ec5 100644 --- a/apps/generator/lib/templateConfigValidator.js +++ b/apps/generator/lib/templateConfig/validator.js @@ -1,10 +1,10 @@ const semver = require('semver'); const Ajv = require('ajv'); -const { getGeneratorVersion } = require('./utils'); +const { getGeneratorVersion } = require('../utils'); const levenshtein = require('levenshtein-edit-distance'); // eslint-disable-next-line no-unused-vars const {AsyncAPIDocumentInterface, AsyncAPIDocument} = require('@asyncapi/parser'); -const { usesNewAPI } = require('./parser'); +const { usesNewAPI } = require('../parser'); const ajv = new Ajv({ allErrors: true }); diff --git a/apps/generator/test/generator.test.js b/apps/generator/test/generator.test.js index 29d63d8044..23a2d4fc21 100644 --- a/apps/generator/test/generator.test.js +++ b/apps/generator/test/generator.test.js @@ -131,7 +131,7 @@ describe('Generator', () => { util = require('../lib/utils'); filtersRegistry = require('../lib/filtersRegistry'); hooksRegistry = require('../lib/hooksRegistry'); - templateConfigValidator = require('../lib/templateConfigValidator'); + templateConfigValidator = require('../lib/templateConfig/validator.js'); xfsMock = require('fs.extra'); const { AsyncAPIDocument } = require('@asyncapi/parser/cjs/models/v2/asyncapi'); asyncApiDocumentMock = new AsyncAPIDocument({ 'x-parser-api-version': 0 }); From c08825fb8c0caf28ae62ddfa77b06ec1fcaee83f Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Fri, 30 May 2025 11:12:10 +0530 Subject: [PATCH 02/16] fixed validator passing in test files Signed-off-by: ItsRoy69 --- apps/generator/test/generator.test.js | 2 +- apps/generator/test/templateConfigValidator.test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/generator/test/generator.test.js b/apps/generator/test/generator.test.js index 23a2d4fc21..6a1e604ad3 100644 --- a/apps/generator/test/generator.test.js +++ b/apps/generator/test/generator.test.js @@ -11,7 +11,7 @@ const logMessage = require('./../lib/logMessages.js'); jest.mock('../lib/utils'); jest.mock('../lib/filtersRegistry'); jest.mock('../lib/hooksRegistry'); -jest.mock('../lib/templateConfigValidator'); +jest.mock('../lib/templateConfig/validator'); describe('Generator', () => { describe('constructor', () => { diff --git a/apps/generator/test/templateConfigValidator.test.js b/apps/generator/test/templateConfigValidator.test.js index 63782b4aac..4a5e39f8d9 100644 --- a/apps/generator/test/templateConfigValidator.test.js +++ b/apps/generator/test/templateConfigValidator.test.js @@ -1,6 +1,6 @@ /* eslint-disable sonarjs/no-identical-functions */ /* eslint-disable sonarjs/no-duplicate-string */ -const { validateTemplateConfig } = require('../lib/templateConfigValidator'); +const { validateTemplateConfig } = require('../lib/templateConfig/validator'); const fs = require('fs'); const path = require('path'); const { parse } = require('../lib/parser'); From 0060d24270ffcb5c78e4d130fd9c5aaf317c9cc0 Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Fri, 30 May 2025 11:47:37 +0530 Subject: [PATCH 03/16] fix path of template validator Signed-off-by: ItsRoy69 --- apps/generator/lib/__mocks__/templateConfigValidator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/generator/lib/__mocks__/templateConfigValidator.js b/apps/generator/lib/__mocks__/templateConfigValidator.js index 4e90cd138d..645e521615 100644 --- a/apps/generator/lib/__mocks__/templateConfigValidator.js +++ b/apps/generator/lib/__mocks__/templateConfigValidator.js @@ -1,3 +1,3 @@ -const templateConfigValidator = jest.genMockFromModule('../templateConfigValidator'); +const templateConfigValidator = jest.genMockFromModule('../templateConfig/validator'); module.exports = templateConfigValidator; From 870e622d2878445458c12486a2d4a12e81e69b6d Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Fri, 30 May 2025 11:57:14 +0530 Subject: [PATCH 04/16] fixed linting errors Signed-off-by: ItsRoy69 --- apps/generator/lib/generator.js | 10 +++------- apps/generator/lib/templateConfig/loader.js | 1 - apps/generator/lib/templateConfig/validator.js | 1 - 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/apps/generator/lib/generator.js b/apps/generator/lib/generator.js index 395179e821..0fd2e56a84 100644 --- a/apps/generator/lib/generator.js +++ b/apps/generator/lib/generator.js @@ -38,7 +38,6 @@ const { definitions, flatten, shorthands } = require('@npmcli/config/lib/definit const FILTERS_DIRNAME = 'filters'; const HOOKS_DIRNAME = 'hooks'; -const CONFIG_FILENAME = 'package.json'; const PACKAGE_JSON_FILENAME = 'package.json'; const GIT_IGNORE_FILENAME = '{.gitignore}'; const NPM_IGNORE_FILENAME = '{.npmignore}'; @@ -956,14 +955,11 @@ class Generator { * @return {Promise} */ async shouldOverwriteFile(filePath) { - if (!Array.isArray(this.noOverwriteGlobs)) return true; - const fileExists = await exists(path.resolve(this.targetDir, filePath)); - if (!fileExists) return true; - - return !this.noOverwriteGlobs.some(globExp => minimatch(filePath, globExp)); + if (this.forceWrite) return true; + if (this.noOverwriteGlobs.some(glob => minimatch(filePath, glob))) return false; + return !(await exists(filePath)); } - /** * Launches all the hooks registered at a given hook point/name. * diff --git a/apps/generator/lib/templateConfig/loader.js b/apps/generator/lib/templateConfig/loader.js index d9d570b7e2..9778b2f201 100644 --- a/apps/generator/lib/templateConfig/loader.js +++ b/apps/generator/lib/templateConfig/loader.js @@ -1,5 +1,4 @@ const path = require('path'); -const fs = require('fs'); const log = require('loglevel'); const { readFile } = require('../utils'); diff --git a/apps/generator/lib/templateConfig/validator.js b/apps/generator/lib/templateConfig/validator.js index 1b4e4b9ec5..4925361c4e 100644 --- a/apps/generator/lib/templateConfig/validator.js +++ b/apps/generator/lib/templateConfig/validator.js @@ -2,7 +2,6 @@ const semver = require('semver'); const Ajv = require('ajv'); const { getGeneratorVersion } = require('../utils'); const levenshtein = require('levenshtein-edit-distance'); -// eslint-disable-next-line no-unused-vars const {AsyncAPIDocumentInterface, AsyncAPIDocument} = require('@asyncapi/parser'); const { usesNewAPI } = require('../parser'); From 74ab0026b11820edba912812f207eb1bfac9c212 Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Fri, 30 May 2025 22:30:12 +0530 Subject: [PATCH 05/16] fixed and tested all errors Signed-off-by: ItsRoy69 --- apps/generator/lib/generator.js | 31 +++++++++--- apps/generator/lib/templateConfig/loader.js | 48 +++++++++---------- .../generator/lib/templateConfig/validator.js | 3 +- 3 files changed, 50 insertions(+), 32 deletions(-) diff --git a/apps/generator/lib/generator.js b/apps/generator/lib/generator.js index 0fd2e56a84..0d1077d36b 100644 --- a/apps/generator/lib/generator.js +++ b/apps/generator/lib/generator.js @@ -16,7 +16,7 @@ const { isAsyncAPIDocument } = require('@asyncapi/parser/cjs/document'); const { configureReact, renderReact, saveRenderedReactContent } = require('./renderer/react'); const { configureNunjucks, renderNunjucks } = require('./renderer/nunjucks'); const { validateTemplateConfig } = require('./templateConfig/validator'); -const { loadTemplateConfig } = require('./templateConfig/loader'); +const { loadTemplateConfig, loadDefaultValues } = require('./templateConfig/loader'); const { convertMapToObject, isFileSystemPath, @@ -287,7 +287,8 @@ class Generator { this.templateName = templatePkgName; this.templateContentDir = path.resolve(this.templateDir, TEMPLATE_CONTENT_DIRNAME); - this.templateConfig = await loadTemplateConfig(this.templateDir, this.templateParams); + await this.loadTemplateConfig(); + await this.loadDefaultValues(); return { templatePkgName, templatePkgPath }; } @@ -955,9 +956,11 @@ class Generator { * @return {Promise} */ async shouldOverwriteFile(filePath) { - if (this.forceWrite) return true; - if (this.noOverwriteGlobs.some(glob => minimatch(filePath, glob))) return false; - return !(await exists(filePath)); + if (!Array.isArray(this.noOverwriteGlobs)) return true; + const fileExists = await exists(path.resolve(this.targetDir, filePath)); + if (!fileExists) return true; + + return !this.noOverwriteGlobs.some(globExp => minimatch(filePath, globExp)); } /** @@ -1037,9 +1040,25 @@ class Generator { if (!isDirEmpty) throw new Error(`"${this.targetDir}" is not an empty directory. You might override your work. To skip this rule, please make your code a git repository or use the --force-write flag (not recommended).`); } } + + /** + * Loads the template configuration. + * @private + */ + async loadTemplateConfig() { + return await loadTemplateConfig.call(this); + } + + /** + * Loads default values of parameters from template config. + * @private + */ + async loadDefaultValues() { + return await loadDefaultValues.call(this); + } } Generator.DEFAULT_TEMPLATES_DIR = DEFAULT_TEMPLATES_DIR; Generator.TRANSPILED_TEMPLATE_LOCATION = TRANSPILED_TEMPLATE_LOCATION; -module.exports = Generator; +module.exports = Generator; \ No newline at end of file diff --git a/apps/generator/lib/templateConfig/loader.js b/apps/generator/lib/templateConfig/loader.js index 9778b2f201..dece60be7a 100644 --- a/apps/generator/lib/templateConfig/loader.js +++ b/apps/generator/lib/templateConfig/loader.js @@ -5,53 +5,50 @@ const { readFile } = require('../utils'); const CONFIG_FILENAME = 'package.json'; /** - * Loads the template configuration from either .ageneratorrc or package.json - * - * @param {String} templateDir Path to the template directory - * @param {Object} templateParams Template parameters to be used for default values - * @returns {Promise} The loaded template configuration + * Loads the template configuration. + * @private */ -async function loadTemplateConfig(templateDir, templateParams) { - let templateConfig = {}; +async function loadTemplateConfig() { + this.templateConfig = {}; + + // Try to load config from .ageneratorrc try { - const rcConfigPath = path.resolve(templateDir, '.ageneratorrc'); + const rcConfigPath = path.resolve(this.templateDir, '.ageneratorrc'); const yaml = await readFile(rcConfigPath, { encoding: 'utf8' }); const yamlConfig = require('js-yaml').load(yaml); - templateConfig = yamlConfig || {}; + this.templateConfig = yamlConfig || {}; - await loadDefaultValues(templateConfig, templateParams); - return templateConfig; + await loadDefaultValues.call(this); + return; } catch (rcError) { log.debug('Could not load .ageneratorrc file:', rcError); + // Continue to try package.json if .ageneratorrc fails } + // Try to load config from package.json try { - const configPath = path.resolve(templateDir, CONFIG_FILENAME); + const configPath = path.resolve(this.templateDir, CONFIG_FILENAME); const json = await readFile(configPath, { encoding: 'utf8' }); const generatorProp = JSON.parse(json).generator; - templateConfig = generatorProp || {}; + this.templateConfig = generatorProp || {}; } catch (packageError) { log.debug('Could not load generator config from package.json:', packageError); } - await loadDefaultValues(templateConfig, templateParams); - return templateConfig; + await loadDefaultValues.call(this); } /** * Loads default values of parameters from template config. If value was already set as parameter it will not be * overriden. - * - * @param {Object} templateConfig - * @param {Object} templateParams - * @returns {Promise} + * @private */ -async function loadDefaultValues(templateConfig, templateParams) { - const parameters = templateConfig.parameters; +async function loadDefaultValues() { + const parameters = this.templateConfig.parameters; const defaultValues = Object.keys(parameters || {}).filter(key => parameters[key].default); - defaultValues.filter(dv => templateParams[dv] === undefined).forEach(dv => - Object.defineProperty(templateParams, dv, { + defaultValues.filter(dv => this.templateParams[dv] === undefined).forEach(dv => + Object.defineProperty(this.templateParams, dv, { enumerable: true, get() { return parameters[dv].default; @@ -61,5 +58,6 @@ async function loadDefaultValues(templateConfig, templateParams) { } module.exports = { - loadTemplateConfig -}; \ No newline at end of file + loadTemplateConfig, + loadDefaultValues +}; \ No newline at end of file diff --git a/apps/generator/lib/templateConfig/validator.js b/apps/generator/lib/templateConfig/validator.js index 4925361c4e..f05142b6f8 100644 --- a/apps/generator/lib/templateConfig/validator.js +++ b/apps/generator/lib/templateConfig/validator.js @@ -2,6 +2,7 @@ const semver = require('semver'); const Ajv = require('ajv'); const { getGeneratorVersion } = require('../utils'); const levenshtein = require('levenshtein-edit-distance'); +// eslint-disable-next-line no-unused-vars const {AsyncAPIDocumentInterface, AsyncAPIDocument} = require('@asyncapi/parser'); const { usesNewAPI } = require('../parser'); @@ -163,4 +164,4 @@ function validateConditionalFiles(conditionalFiles) { conditionalFiles[fileName].validate = ajv.compile(conditionalFiles[fileName].validation); }); } -} +} \ No newline at end of file From b21eb76037973779d4d64677ea6b659d47bf9e8a Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Fri, 30 May 2025 23:04:46 +0530 Subject: [PATCH 06/16] fixed the coderabbit issue Signed-off-by: ItsRoy69 --- apps/generator/lib/templateConfig/loader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/generator/lib/templateConfig/loader.js b/apps/generator/lib/templateConfig/loader.js index dece60be7a..3aa83cce74 100644 --- a/apps/generator/lib/templateConfig/loader.js +++ b/apps/generator/lib/templateConfig/loader.js @@ -15,7 +15,7 @@ async function loadTemplateConfig() { try { const rcConfigPath = path.resolve(this.templateDir, '.ageneratorrc'); const yaml = await readFile(rcConfigPath, { encoding: 'utf8' }); - const yamlConfig = require('js-yaml').load(yaml); + const yamlConfig = require('js-yaml').safeLoad(yaml); this.templateConfig = yamlConfig || {}; await loadDefaultValues.call(this); From aa60016da8b431ad10211f3d6fa04da34180fb65 Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Fri, 30 May 2025 23:23:03 +0530 Subject: [PATCH 07/16] fixed the coderabbit issue Signed-off-by: ItsRoy69 --- apps/generator/lib/generator.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/apps/generator/lib/generator.js b/apps/generator/lib/generator.js index 0d1077d36b..24d0d25bca 100644 --- a/apps/generator/lib/generator.js +++ b/apps/generator/lib/generator.js @@ -963,6 +963,22 @@ class Generator { return !this.noOverwriteGlobs.some(globExp => minimatch(filePath, globExp)); } + /** + * Loads the template configuration. + * @private + */ + async loadTemplateConfig() { + return await loadTemplateConfig.call(this); + } + + /** + * Loads default values of parameters from template config. + * @private + */ + async loadDefaultValues() { + return await loadDefaultValues.call(this); + } + /** * Launches all the hooks registered at a given hook point/name. * @@ -1040,22 +1056,6 @@ class Generator { if (!isDirEmpty) throw new Error(`"${this.targetDir}" is not an empty directory. You might override your work. To skip this rule, please make your code a git repository or use the --force-write flag (not recommended).`); } } - - /** - * Loads the template configuration. - * @private - */ - async loadTemplateConfig() { - return await loadTemplateConfig.call(this); - } - - /** - * Loads default values of parameters from template config. - * @private - */ - async loadDefaultValues() { - return await loadDefaultValues.call(this); - } } Generator.DEFAULT_TEMPLATES_DIR = DEFAULT_TEMPLATES_DIR; From 0cd25673e968bb10ab289dda797abbf93cffe34a Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Wed, 4 Jun 2025 00:28:19 +0530 Subject: [PATCH 08/16] fixed testing of calling properly, removing aasync/await Signed-off-by: ItsRoy69 --- apps/generator/lib/generator.js | 15 +++------------ apps/generator/test/generator.test.js | 7 ++++--- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/apps/generator/lib/generator.js b/apps/generator/lib/generator.js index 4763b20429..02ef12a5a9 100644 --- a/apps/generator/lib/generator.js +++ b/apps/generator/lib/generator.js @@ -14,7 +14,7 @@ const { isAsyncAPIDocument } = require('@asyncapi/parser/cjs/document'); const { configureReact, renderReact, saveRenderedReactContent } = require('./renderer/react'); const { configureNunjucks, renderNunjucks } = require('./renderer/nunjucks'); const { validateTemplateConfig } = require('./templateConfig/validator'); -const { loadTemplateConfig, loadDefaultValues } = require('./templateConfig/loader'); +const { loadTemplateConfig } = require('./templateConfig/loader'); const { isGenerationConditionMet } = require('./conditionalGeneration'); const { convertMapToObject, @@ -287,7 +287,6 @@ class Generator { this.templateContentDir = path.resolve(this.templateDir, TEMPLATE_CONTENT_DIRNAME); await this.loadTemplateConfig(); - await this.loadDefaultValues(); return { templatePkgName, templatePkgPath }; } @@ -1006,16 +1005,8 @@ class Generator { * Loads the template configuration. * @private */ - async loadTemplateConfig() { - return await loadTemplateConfig.call(this); - } - - /** - * Loads default values of parameters from template config. - * @private - */ - async loadDefaultValues() { - return await loadDefaultValues.call(this); + loadTemplateConfig() { + return loadTemplateConfig.call(this); } /** diff --git a/apps/generator/test/generator.test.js b/apps/generator/test/generator.test.js index 6a1e604ad3..31c00b388f 100644 --- a/apps/generator/test/generator.test.js +++ b/apps/generator/test/generator.test.js @@ -5,6 +5,7 @@ const Generator = require('../lib/generator'); const log = require('loglevel'); const unixify = require('unixify'); const dummyYAML = fs.readFileSync(path.resolve(__dirname, './docs/dummy.yml'), 'utf8'); +const { loadDefaultValues } = require('../lib/templateConfig/loader'); const logMessage = require('./../lib/logMessages.js'); @@ -500,7 +501,7 @@ describe('Generator', () => { } }; - await gen.loadDefaultValues(); + await loadDefaultValues.call(gen); expect(gen.templateParams).toStrictEqual({ test: true, @@ -524,7 +525,7 @@ describe('Generator', () => { } }; - await gen.loadDefaultValues(); + await loadDefaultValues.call(gen); expect(gen.templateParams).toStrictEqual({ test: true @@ -550,7 +551,7 @@ describe('Generator', () => { } }; - await gen.loadDefaultValues(); + await loadDefaultValues.call(gen); expect(gen.templateParams).toStrictEqual({ test: true From 234359a6b5b2410edb6e0c3a08960d5a63a82228 Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Wed, 4 Jun 2025 08:59:20 +0530 Subject: [PATCH 09/16] fixed testing of calling properly, removing aasync/await Signed-off-by: ItsRoy69 --- apps/generator/lib/generator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/generator/lib/generator.js b/apps/generator/lib/generator.js index 02ef12a5a9..7a4fb21277 100644 --- a/apps/generator/lib/generator.js +++ b/apps/generator/lib/generator.js @@ -1005,7 +1005,7 @@ class Generator { * Loads the template configuration. * @private */ - loadTemplateConfig() { + loadTemplateConfig() { return loadTemplateConfig.call(this); } From 90899d8f3ff6e607760e5eace7a97eed1ecdba31 Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Fri, 6 Jun 2025 13:11:45 +0530 Subject: [PATCH 10/16] refactoring this keyword Signed-off-by: ItsRoy69 --- apps/generator/lib/templateConfig/loader.js | 88 +++++++++++---------- apps/generator/test/generator.test.js | 6 +- 2 files changed, 48 insertions(+), 46 deletions(-) diff --git a/apps/generator/lib/templateConfig/loader.js b/apps/generator/lib/templateConfig/loader.js index 3aa83cce74..bb73b8bcff 100644 --- a/apps/generator/lib/templateConfig/loader.js +++ b/apps/generator/lib/templateConfig/loader.js @@ -9,53 +9,55 @@ const CONFIG_FILENAME = 'package.json'; * @private */ async function loadTemplateConfig() { - this.templateConfig = {}; - - // Try to load config from .ageneratorrc - try { - const rcConfigPath = path.resolve(this.templateDir, '.ageneratorrc'); - const yaml = await readFile(rcConfigPath, { encoding: 'utf8' }); - const yamlConfig = require('js-yaml').safeLoad(yaml); - this.templateConfig = yamlConfig || {}; - - await loadDefaultValues.call(this); - return; - } catch (rcError) { - log.debug('Could not load .ageneratorrc file:', rcError); - // Continue to try package.json if .ageneratorrc fails - } + this.templateConfig = {}; - // Try to load config from package.json - try { - const configPath = path.resolve(this.templateDir, CONFIG_FILENAME); - const json = await readFile(configPath, { encoding: 'utf8' }); - const generatorProp = JSON.parse(json).generator; - this.templateConfig = generatorProp || {}; - } catch (packageError) { - log.debug('Could not load generator config from package.json:', packageError); - } + // Try to load config from .ageneratorrc + try { + const rcConfigPath = path.resolve(this.templateDir, '.ageneratorrc'); + const yaml = await readFile(rcConfigPath, { encoding: 'utf8' }); + const yamlConfig = require('js-yaml').load(yaml); + this.templateConfig = yamlConfig || {}; - await loadDefaultValues.call(this); -} + await this.loadDefaultValues(); + return; + } catch (rcError) { + // console.error('Could not load .ageneratorrc file:', rcError); + log.debug('Could not load .ageneratorrc file:', rcError); + // Continue to try package.json if .ageneratorrc fails + } -/** - * Loads default values of parameters from template config. If value was already set as parameter it will not be - * overriden. - * @private - */ + // Try to load config from package.json + try { + const configPath = path.resolve(this.templateDir, CONFIG_FILENAME); + const json = await readFile(configPath, { encoding: 'utf8' }); + const generatorProp = JSON.parse(json).generator; + this.templateConfig = generatorProp || {}; + } catch (packageError) { + // console.error('Could not load generator config from package.json:', packageError); + log.debug('Could not load generator config from package.json:', packageError); + } + + await this.loadDefaultValues(); + } + + /** + * Loads default values of parameters from template config. If value was already set as parameter it will not be + * overriden. + * @private + */ async function loadDefaultValues() { - const parameters = this.templateConfig.parameters; - const defaultValues = Object.keys(parameters || {}).filter(key => parameters[key].default); - - defaultValues.filter(dv => this.templateParams[dv] === undefined).forEach(dv => - Object.defineProperty(this.templateParams, dv, { - enumerable: true, - get() { - return parameters[dv].default; - } - }) - ); -} + const parameters = this.templateConfig.parameters; + const defaultValues = Object.keys(parameters || {}).filter(key => parameters[key].default); + + defaultValues.filter(dv => this.templateParams[dv] === undefined).forEach(dv => + Object.defineProperty(this.templateParams, dv, { + enumerable: true, + get() { + return parameters[dv].default; + } + }) + ); + } module.exports = { loadTemplateConfig, diff --git a/apps/generator/test/generator.test.js b/apps/generator/test/generator.test.js index 31c00b388f..2bbf60376b 100644 --- a/apps/generator/test/generator.test.js +++ b/apps/generator/test/generator.test.js @@ -501,7 +501,7 @@ describe('Generator', () => { } }; - await loadDefaultValues.call(gen); + await gen.loadDefaultValues(); expect(gen.templateParams).toStrictEqual({ test: true, @@ -525,7 +525,7 @@ describe('Generator', () => { } }; - await loadDefaultValues.call(gen); + await gen.loadDefaultValues(); expect(gen.templateParams).toStrictEqual({ test: true @@ -551,7 +551,7 @@ describe('Generator', () => { } }; - await loadDefaultValues.call(gen); + await gen.loadDefaultValues(); expect(gen.templateParams).toStrictEqual({ test: true From 4f0cf606165f79f02b5aaa96876356fd36096a1a Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Fri, 6 Jun 2025 16:46:33 +0530 Subject: [PATCH 11/16] updated files Signed-off-by: ItsRoy69 --- apps/generator/lib/generator.js | 15 +++- apps/generator/lib/templateConfig/loader.js | 87 +++++++++++---------- apps/generator/test/generator.test.js | 1 - 3 files changed, 57 insertions(+), 46 deletions(-) diff --git a/apps/generator/lib/generator.js b/apps/generator/lib/generator.js index 7a4fb21277..f1347cce20 100644 --- a/apps/generator/lib/generator.js +++ b/apps/generator/lib/generator.js @@ -14,7 +14,7 @@ const { isAsyncAPIDocument } = require('@asyncapi/parser/cjs/document'); const { configureReact, renderReact, saveRenderedReactContent } = require('./renderer/react'); const { configureNunjucks, renderNunjucks } = require('./renderer/nunjucks'); const { validateTemplateConfig } = require('./templateConfig/validator'); -const { loadTemplateConfig } = require('./templateConfig/loader'); +const { loadTemplateConfig, loadDefaultValues } = require('./templateConfig/loader'); const { isGenerationConditionMet } = require('./conditionalGeneration'); const { convertMapToObject, @@ -1005,10 +1005,19 @@ class Generator { * Loads the template configuration. * @private */ - loadTemplateConfig() { - return loadTemplateConfig.call(this); + async loadTemplateConfig() { + this.templateConfig = await loadTemplateConfig(this.templateDir); + await this.loadDefaultValues(); } + /** + * Loads default values of parameters from template config using the external loader. + * @private + */ + async loadDefaultValues() { + loadDefaultValues(this.templateConfig, this.templateParams); + } + /** * Launches all the hooks registered at a given hook point/name. * diff --git a/apps/generator/lib/templateConfig/loader.js b/apps/generator/lib/templateConfig/loader.js index bb73b8bcff..7e7a6948b4 100644 --- a/apps/generator/lib/templateConfig/loader.js +++ b/apps/generator/lib/templateConfig/loader.js @@ -1,63 +1,66 @@ const path = require('path'); -const log = require('loglevel'); const { readFile } = require('../utils'); +const log = require('loglevel'); const CONFIG_FILENAME = 'package.json'; /** - * Loads the template configuration. - * @private + * Loads template configuration from either .ageneratorrc or package.json + * @param {string} templateDir - Path to the template directory + * @returns {Promise} Template configuration object */ -async function loadTemplateConfig() { - this.templateConfig = {}; +async function loadTemplateConfig(templateDir) { + let templateConfig = {}; - // Try to load config from .ageneratorrc - try { - const rcConfigPath = path.resolve(this.templateDir, '.ageneratorrc'); - const yaml = await readFile(rcConfigPath, { encoding: 'utf8' }); - const yamlConfig = require('js-yaml').load(yaml); - this.templateConfig = yamlConfig || {}; + // Try to load config from .ageneratorrc + try { + const rcConfigPath = path.resolve(templateDir, '.ageneratorrc'); + const yaml = await readFile(rcConfigPath, { encoding: 'utf8' }); + const yamlConfig = require('js-yaml').load(yaml); + templateConfig = yamlConfig || {}; - await this.loadDefaultValues(); - return; - } catch (rcError) { - // console.error('Could not load .ageneratorrc file:', rcError); - log.debug('Could not load .ageneratorrc file:', rcError); - // Continue to try package.json if .ageneratorrc fails - } + log.debug('Template configuration loaded from .ageneratorrc'); + return templateConfig; + } catch (rcError) { + log.debug('Could not load .ageneratorrc file:', rcError); + // Continue to try package.json if .ageneratorrc fails + } - // Try to load config from package.json - try { - const configPath = path.resolve(this.templateDir, CONFIG_FILENAME); - const json = await readFile(configPath, { encoding: 'utf8' }); - const generatorProp = JSON.parse(json).generator; - this.templateConfig = generatorProp || {}; - } catch (packageError) { - // console.error('Could not load generator config from package.json:', packageError); - log.debug('Could not load generator config from package.json:', packageError); - } + // Try to load config from package.json + try { + const configPath = path.resolve(templateDir, CONFIG_FILENAME); + const json = await readFile(configPath, { encoding: 'utf8' }); + const generatorProp = JSON.parse(json).generator; + templateConfig = generatorProp || {}; - await this.loadDefaultValues(); + log.debug('Template configuration loaded from package.json'); + } catch (packageError) { + log.debug('Could not load generator config from package.json:', packageError); } - /** - * Loads default values of parameters from template config. If value was already set as parameter it will not be - * overriden. - * @private - */ -async function loadDefaultValues() { - const parameters = this.templateConfig.parameters; - const defaultValues = Object.keys(parameters || {}).filter(key => parameters[key].default); + return templateConfig; +} - defaultValues.filter(dv => this.templateParams[dv] === undefined).forEach(dv => - Object.defineProperty(this.templateParams, dv, { +/** + * Loads default values of parameters from template config + * @param {Object} templateConfig - The template configuration object + * @param {Object} templateParams - The template parameters object to modify + */ +function loadDefaultValues(templateConfig, templateParams) { + const parameters = templateConfig.parameters; + const defaultValues = Object.keys(parameters || {}).filter(key => parameters[key].default); + + defaultValues + .filter(dv => templateParams[dv] === undefined) + .forEach(dv => { + Object.defineProperty(templateParams, dv, { enumerable: true, get() { return parameters[dv].default; } - }) - ); - } + }); + }); +} module.exports = { loadTemplateConfig, diff --git a/apps/generator/test/generator.test.js b/apps/generator/test/generator.test.js index 2bbf60376b..6a1e604ad3 100644 --- a/apps/generator/test/generator.test.js +++ b/apps/generator/test/generator.test.js @@ -5,7 +5,6 @@ const Generator = require('../lib/generator'); const log = require('loglevel'); const unixify = require('unixify'); const dummyYAML = fs.readFileSync(path.resolve(__dirname, './docs/dummy.yml'), 'utf8'); -const { loadDefaultValues } = require('../lib/templateConfig/loader'); const logMessage = require('./../lib/logMessages.js'); From 6cc19c70560a47186433d4e0aaa715836ecbccca Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Fri, 6 Jun 2025 16:57:54 +0530 Subject: [PATCH 12/16] updated files Signed-off-by: ItsRoy69 --- apps/generator/lib/generator.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/generator/lib/generator.js b/apps/generator/lib/generator.js index f1347cce20..50a22f47f4 100644 --- a/apps/generator/lib/generator.js +++ b/apps/generator/lib/generator.js @@ -1005,16 +1005,18 @@ class Generator { * Loads the template configuration. * @private */ - async loadTemplateConfig() { - this.templateConfig = await loadTemplateConfig(this.templateDir); - await this.loadDefaultValues(); + loadTemplateConfig() { + return loadTemplateConfig(this.templateDir).then(config => { + this.templateConfig = config; + return this.loadDefaultValues(); + }); } /** * Loads default values of parameters from template config using the external loader. * @private */ - async loadDefaultValues() { + loadDefaultValues() { loadDefaultValues(this.templateConfig, this.templateParams); } From e0c584ea176bd9d6ce89a18a053076b0d96d5d31 Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Fri, 6 Jun 2025 17:02:42 +0530 Subject: [PATCH 13/16] updated files Signed-off-by: ItsRoy69 --- apps/generator/lib/templateConfig/loader.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps/generator/lib/templateConfig/loader.js b/apps/generator/lib/templateConfig/loader.js index 7e7a6948b4..38da488f6d 100644 --- a/apps/generator/lib/templateConfig/loader.js +++ b/apps/generator/lib/templateConfig/loader.js @@ -1,6 +1,7 @@ const path = require('path'); const { readFile } = require('../utils'); const log = require('loglevel'); +const fs = require('fs'); const CONFIG_FILENAME = 'package.json'; @@ -8,8 +9,21 @@ const CONFIG_FILENAME = 'package.json'; * Loads template configuration from either .ageneratorrc or package.json * @param {string} templateDir - Path to the template directory * @returns {Promise} Template configuration object + * @throws {Error} If templateDir is invalid or directory doesn't exist */ async function loadTemplateConfig(templateDir) { + if (!templateDir || typeof templateDir !== 'string') { + throw new Error('templateDir must be a valid string path'); + } + + if (!fs.existsSync(templateDir)) { + throw new Error(`Template directory does not exist: ${templateDir}`); + } + + if (!fs.statSync(templateDir).isDirectory()) { + throw new Error(`Path is not a directory: ${templateDir}`); + } + let templateConfig = {}; // Try to load config from .ageneratorrc From 240bddec6c21515dfc6565d64668be78bd0b3d9f Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Fri, 6 Jun 2025 17:06:40 +0530 Subject: [PATCH 14/16] updated files Signed-off-by: ItsRoy69 --- apps/generator/test/generator.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/generator/test/generator.test.js b/apps/generator/test/generator.test.js index 6a1e604ad3..932985d9b9 100644 --- a/apps/generator/test/generator.test.js +++ b/apps/generator/test/generator.test.js @@ -131,7 +131,7 @@ describe('Generator', () => { util = require('../lib/utils'); filtersRegistry = require('../lib/filtersRegistry'); hooksRegistry = require('../lib/hooksRegistry'); - templateConfigValidator = require('../lib/templateConfig/validator.js'); + templateConfigValidator = require('../lib/templateConfig/validator'); xfsMock = require('fs.extra'); const { AsyncAPIDocument } = require('@asyncapi/parser/cjs/models/v2/asyncapi'); asyncApiDocumentMock = new AsyncAPIDocument({ 'x-parser-api-version': 0 }); From fe4253761ab805de09c7edaeeb7d74da6ec1ea9a Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Mon, 9 Jun 2025 17:54:11 +0530 Subject: [PATCH 15/16] removed entirely the loader and templateconfig from generator.js Signed-off-by: ItsRoy69 --- apps/generator/lib/generator.js | 21 +----- apps/generator/lib/templateConfig/loader.js | 71 ++++++++------------- 2 files changed, 29 insertions(+), 63 deletions(-) diff --git a/apps/generator/lib/generator.js b/apps/generator/lib/generator.js index 50a22f47f4..a97dc2ca14 100644 --- a/apps/generator/lib/generator.js +++ b/apps/generator/lib/generator.js @@ -124,6 +124,8 @@ class Generator { this.hooks = {}; /** @type {Object} Maps schema URL to folder. */ this.mapBaseUrlToFolder = mapBaseUrlToFolder; + this.loadTemplateConfig = loadTemplateConfig.bind(this); + this.loadDefaultValues = loadDefaultValues.bind(this); // Load template configuration /** @type {Object} The template parameters. The structure for this object is based on each individual template. */ @@ -1000,25 +1002,6 @@ class Generator { return !this.noOverwriteGlobs.some(globExp => minimatch(filePath, globExp)); } - - /** - * Loads the template configuration. - * @private - */ - loadTemplateConfig() { - return loadTemplateConfig(this.templateDir).then(config => { - this.templateConfig = config; - return this.loadDefaultValues(); - }); - } - - /** - * Loads default values of parameters from template config using the external loader. - * @private - */ - loadDefaultValues() { - loadDefaultValues(this.templateConfig, this.templateParams); - } /** * Launches all the hooks registered at a given hook point/name. diff --git a/apps/generator/lib/templateConfig/loader.js b/apps/generator/lib/templateConfig/loader.js index 38da488f6d..e68de54528 100644 --- a/apps/generator/lib/templateConfig/loader.js +++ b/apps/generator/lib/templateConfig/loader.js @@ -1,79 +1,62 @@ const path = require('path'); const { readFile } = require('../utils'); const log = require('loglevel'); -const fs = require('fs'); const CONFIG_FILENAME = 'package.json'; /** - * Loads template configuration from either .ageneratorrc or package.json - * @param {string} templateDir - Path to the template directory - * @returns {Promise} Template configuration object - * @throws {Error} If templateDir is invalid or directory doesn't exist - */ -async function loadTemplateConfig(templateDir) { - if (!templateDir || typeof templateDir !== 'string') { - throw new Error('templateDir must be a valid string path'); - } - - if (!fs.existsSync(templateDir)) { - throw new Error(`Template directory does not exist: ${templateDir}`); - } - - if (!fs.statSync(templateDir).isDirectory()) { - throw new Error(`Path is not a directory: ${templateDir}`); - } - - let templateConfig = {}; + * Loads the template configuration. + * @private + */ +async function loadTemplateConfig() { + this.templateConfig = {}; // Try to load config from .ageneratorrc try { - const rcConfigPath = path.resolve(templateDir, '.ageneratorrc'); + const rcConfigPath = path.resolve(this.templateDir, '.ageneratorrc'); const yaml = await readFile(rcConfigPath, { encoding: 'utf8' }); const yamlConfig = require('js-yaml').load(yaml); - templateConfig = yamlConfig || {}; + this.templateConfig = yamlConfig || {}; - log.debug('Template configuration loaded from .ageneratorrc'); - return templateConfig; + await this.loadDefaultValues(); + return; } catch (rcError) { + // console.error('Could not load .ageneratorrc file:', rcError); log.debug('Could not load .ageneratorrc file:', rcError); // Continue to try package.json if .ageneratorrc fails } // Try to load config from package.json try { - const configPath = path.resolve(templateDir, CONFIG_FILENAME); + const configPath = path.resolve(this.templateDir, CONFIG_FILENAME); const json = await readFile(configPath, { encoding: 'utf8' }); const generatorProp = JSON.parse(json).generator; - templateConfig = generatorProp || {}; - - log.debug('Template configuration loaded from package.json'); + this.templateConfig = generatorProp || {}; } catch (packageError) { + // console.error('Could not load generator config from package.json:', packageError); log.debug('Could not load generator config from package.json:', packageError); } - return templateConfig; + await this.loadDefaultValues(); } /** - * Loads default values of parameters from template config - * @param {Object} templateConfig - The template configuration object - * @param {Object} templateParams - The template parameters object to modify + * Loads default values of parameters from template config. If value was already set as parameter it will not be + * overriden. + * @private */ -function loadDefaultValues(templateConfig, templateParams) { - const parameters = templateConfig.parameters; +async function loadDefaultValues() { + const parameters = this.templateConfig.parameters; const defaultValues = Object.keys(parameters || {}).filter(key => parameters[key].default); - defaultValues - .filter(dv => templateParams[dv] === undefined) - .forEach(dv => { - Object.defineProperty(templateParams, dv, { - enumerable: true, - get() { - return parameters[dv].default; - } - }); - }); + defaultValues.filter(dv => this.templateParams[dv] === undefined).forEach(dv => + Object.defineProperty(this.templateParams, dv, { + enumerable: true, + get() { + return parameters[dv].default; + } + }) + ); } module.exports = { From cc074811e9d03d583c34aef8c8842028ee4ec2da Mon Sep 17 00:00:00 2001 From: ItsRoy69 Date: Mon, 9 Jun 2025 18:33:37 +0530 Subject: [PATCH 16/16] reverting back Signed-off-by: ItsRoy69 --- apps/generator/lib/generator.js | 21 +++++- apps/generator/lib/templateConfig/loader.js | 71 +++++++++++++-------- 2 files changed, 63 insertions(+), 29 deletions(-) diff --git a/apps/generator/lib/generator.js b/apps/generator/lib/generator.js index a97dc2ca14..50a22f47f4 100644 --- a/apps/generator/lib/generator.js +++ b/apps/generator/lib/generator.js @@ -124,8 +124,6 @@ class Generator { this.hooks = {}; /** @type {Object} Maps schema URL to folder. */ this.mapBaseUrlToFolder = mapBaseUrlToFolder; - this.loadTemplateConfig = loadTemplateConfig.bind(this); - this.loadDefaultValues = loadDefaultValues.bind(this); // Load template configuration /** @type {Object} The template parameters. The structure for this object is based on each individual template. */ @@ -1002,6 +1000,25 @@ class Generator { return !this.noOverwriteGlobs.some(globExp => minimatch(filePath, globExp)); } + + /** + * Loads the template configuration. + * @private + */ + loadTemplateConfig() { + return loadTemplateConfig(this.templateDir).then(config => { + this.templateConfig = config; + return this.loadDefaultValues(); + }); + } + + /** + * Loads default values of parameters from template config using the external loader. + * @private + */ + loadDefaultValues() { + loadDefaultValues(this.templateConfig, this.templateParams); + } /** * Launches all the hooks registered at a given hook point/name. diff --git a/apps/generator/lib/templateConfig/loader.js b/apps/generator/lib/templateConfig/loader.js index e68de54528..38da488f6d 100644 --- a/apps/generator/lib/templateConfig/loader.js +++ b/apps/generator/lib/templateConfig/loader.js @@ -1,62 +1,79 @@ const path = require('path'); const { readFile } = require('../utils'); const log = require('loglevel'); +const fs = require('fs'); const CONFIG_FILENAME = 'package.json'; /** - * Loads the template configuration. - * @private - */ -async function loadTemplateConfig() { - this.templateConfig = {}; + * Loads template configuration from either .ageneratorrc or package.json + * @param {string} templateDir - Path to the template directory + * @returns {Promise} Template configuration object + * @throws {Error} If templateDir is invalid or directory doesn't exist + */ +async function loadTemplateConfig(templateDir) { + if (!templateDir || typeof templateDir !== 'string') { + throw new Error('templateDir must be a valid string path'); + } + + if (!fs.existsSync(templateDir)) { + throw new Error(`Template directory does not exist: ${templateDir}`); + } + + if (!fs.statSync(templateDir).isDirectory()) { + throw new Error(`Path is not a directory: ${templateDir}`); + } + + let templateConfig = {}; // Try to load config from .ageneratorrc try { - const rcConfigPath = path.resolve(this.templateDir, '.ageneratorrc'); + const rcConfigPath = path.resolve(templateDir, '.ageneratorrc'); const yaml = await readFile(rcConfigPath, { encoding: 'utf8' }); const yamlConfig = require('js-yaml').load(yaml); - this.templateConfig = yamlConfig || {}; + templateConfig = yamlConfig || {}; - await this.loadDefaultValues(); - return; + log.debug('Template configuration loaded from .ageneratorrc'); + return templateConfig; } catch (rcError) { - // console.error('Could not load .ageneratorrc file:', rcError); log.debug('Could not load .ageneratorrc file:', rcError); // Continue to try package.json if .ageneratorrc fails } // Try to load config from package.json try { - const configPath = path.resolve(this.templateDir, CONFIG_FILENAME); + const configPath = path.resolve(templateDir, CONFIG_FILENAME); const json = await readFile(configPath, { encoding: 'utf8' }); const generatorProp = JSON.parse(json).generator; - this.templateConfig = generatorProp || {}; + templateConfig = generatorProp || {}; + + log.debug('Template configuration loaded from package.json'); } catch (packageError) { - // console.error('Could not load generator config from package.json:', packageError); log.debug('Could not load generator config from package.json:', packageError); } - await this.loadDefaultValues(); + return templateConfig; } /** - * Loads default values of parameters from template config. If value was already set as parameter it will not be - * overriden. - * @private + * Loads default values of parameters from template config + * @param {Object} templateConfig - The template configuration object + * @param {Object} templateParams - The template parameters object to modify */ -async function loadDefaultValues() { - const parameters = this.templateConfig.parameters; +function loadDefaultValues(templateConfig, templateParams) { + const parameters = templateConfig.parameters; const defaultValues = Object.keys(parameters || {}).filter(key => parameters[key].default); - defaultValues.filter(dv => this.templateParams[dv] === undefined).forEach(dv => - Object.defineProperty(this.templateParams, dv, { - enumerable: true, - get() { - return parameters[dv].default; - } - }) - ); + defaultValues + .filter(dv => templateParams[dv] === undefined) + .forEach(dv => { + Object.defineProperty(templateParams, dv, { + enumerable: true, + get() { + return parameters[dv].default; + } + }); + }); } module.exports = {