From cb6d7d91a5bb0831edeec75a57a85fdc9dd56b85 Mon Sep 17 00:00:00 2001 From: Pier-Paolo Mammi Date: Thu, 2 Jul 2026 16:48:39 +0200 Subject: [PATCH] fixes on nodejs script - add missing headers generation - sort variables (for testing, may be disabled) - skip environments when no file is actually present --- scripts/generate-http-docs.js | 42 ++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/scripts/generate-http-docs.js b/scripts/generate-http-docs.js index 19e8907..d0c0086 100644 --- a/scripts/generate-http-docs.js +++ b/scripts/generate-http-docs.js @@ -6,7 +6,7 @@ import stripJsonComments from 'strip-json-comments'; import { fileURLToPath } from 'url'; const interpolationVariableRegex = /^{{(.*?)}}$/ -const DEFAULT_ENV_VAR_VALUE = 'EDIT_VALUE_HERE' +const DEFAULT_VAR_VALUE = 'EDIT_VALUE_HERE' const VARIABLE_NAME_VALUE_SEPARATOR = '=' const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -221,6 +221,22 @@ export function mergeRequestConfig(base, updates) { delete merged.auth; } + if (Object.prototype.hasOwnProperty.call(updates, 'headers')) { + const headers = [...(Array.isArray(base.headers) ? base.headers : [])]; + const byName = new Map(); + for (const header of headers) { + if (header && header.name) { + byName.set(String(header.name), header); + } + } + for (const header of updates.headers) { + if (header && header.name) { + byName.set(String(header.name), header); + } + } + merged.headers = [...byName.values()]; + } + if (Array.isArray(updates.variables)) { const variables = [...(Array.isArray(base.variables) ? base.variables : [])]; const byName = new Map(); @@ -352,7 +368,7 @@ export function buildRequestContent(request, requestName, requestConfig = {}, do commentedVariableDefinitions.push({ name: normalized, value }); }; - const addReferencedVariables = (value, fallbackValue = 'YOUR_VALUE_HERE') => { + const addReferencedVariables = (value, fallbackValue = DEFAULT_VAR_VALUE) => { for (const placeholder of collectPlaceholders(String(value))) { addVariable(placeholder, fallbackValue); } @@ -479,14 +495,20 @@ export function buildRequestContent(request, requestName, requestConfig = {}, do if (commentedVariableDefinitions.length > 0) { lines.push(`# Other variables for ${requestName}`); - for (const variable of commentedVariableDefinitions) { + for (const variable of commentedVariableDefinitions.sort((a, b) => { + const nameComparison = a.name.localeCompare(b.name); + return nameComparison !== 0 ? nameComparison : a.value.localeCompare(b.value); + })) { lines.push(`# @${sanitizeVarName(variable.name)}${VARIABLE_NAME_VALUE_SEPARATOR}${formatVariableValue(variable.value, { renderValue })}`); } } if (parameterVariableDefinitions.length > 0) { lines.push(`# Parameter variables for ${requestName}`); - for (const variable of parameterVariableDefinitions) { + for (const variable of parameterVariableDefinitions.sort((a, b) => { + const nameComparison = a.name.localeCompare(b.name); + return nameComparison !== 0 ? nameComparison : a.value.localeCompare(b.value); + })) { lines.push(`@${sanitizeVarName(variable.name)}${VARIABLE_NAME_VALUE_SEPARATOR}${formatVariableValue(variable.value, { renderValue })}`); } } @@ -523,7 +545,10 @@ export function buildRequestContent(request, requestName, requestConfig = {}, do if (variableDefinitions.length > 0) { lines.push(`# Variables for ${requestName}`); - for (const variable of variableDefinitions) { + for (const variable of variableDefinitions.sort((a, b) => { + const nameComparison = a.name.localeCompare(b.name); + return nameComparison !== 0 ? nameComparison : a.value.localeCompare(b.value); + })) { lines.push(`@${sanitizeVarName(variable.name)}${VARIABLE_NAME_VALUE_SEPARATOR}${formatVariableValue(variable.value, { renderValue })}`); } } @@ -598,7 +623,8 @@ function writeEnvironmentTemplates(sourceDir, outputRoot) { const visit = (currentDir) => { const entries = fs.readdirSync(currentDir, { withFileTypes: true }); - const hasEnvironmentsDir = entries.some((entry) => entry.isDirectory() && entry.name === 'environments'); + const hasEnvironmentsDir = entries.some((entry) => entry.isDirectory() && entry.name === 'environments' && + fs.readdirSync(path.join(currentDir, 'environments'), { withFileTypes: true }).some((envEntry) => envEntry.isFile() && /\.ya?ml$/i.test(envEntry.name))); if (hasEnvironmentsDir) { targets.push(currentDir); @@ -647,7 +673,7 @@ function writeEnvironmentTemplates(sourceDir, outputRoot) { } } - const templateContent = variableNames.length > 0 ? `${variableNames.map(v => `${v}=${DEFAULT_ENV_VAR_VALUE}`).join('\n')}\n` : ''; + const templateContent = variableNames.length > 0 ? `${variableNames.map(v => `${v}=${DEFAULT_VAR_VALUE}`).join('\n')}\n` : ''; fs.writeFileSync(path.join(targetDir, '.env.template'), templateContent, 'utf8'); dotenvVariablesByTarget.set(targetDir, new Set(variableNames)); } @@ -761,7 +787,7 @@ function main() { throw new Error('No collections found in workspace.yml'); } - const outputBaseRoot = path.join(workspaceRoot, 'autogen', 'httpyac'); + const outputBaseRoot = path.join(workspaceRoot, 'autogen', 'httpyac_node'); cleanFolder(outputBaseRoot); for (const collection of collections) {