diff --git a/pgpm/cli/src/commands/package.ts b/pgpm/cli/src/commands/package.ts index 0b4272cf6..52ad09730 100644 --- a/pgpm/cli/src/commands/package.ts +++ b/pgpm/cli/src/commands/package.ts @@ -13,11 +13,13 @@ Options: --plan Include deployment plan (default: true) --pretty Pretty-print output (default: true) --functionDelimiter Function delimiter (default: $EOFCODE$) + --outputDiff Export AST diff files when round-trip mismatch detected (default: false) --cwd Working directory (default: current directory) Examples: pgpm package Package with defaults pgpm package --no-plan Package without plan + pgpm package --outputDiff Package and export AST diff files if mismatch detected `; export default async ( @@ -51,10 +53,17 @@ export default async ( default: '$EOFCODE$', useDefault: true, required: false + }, + { + type: 'confirm', + name: 'outputDiff', + default: false, + useDefault: true, + required: false } ]; - let { cwd, plan, pretty, functionDelimiter } = await prompter.prompt(argv, questions); + let { cwd, plan, pretty, functionDelimiter, outputDiff } = await prompter.prompt(argv, questions); const project = new PgpmPackage(cwd); @@ -69,7 +78,8 @@ export default async ( usePlan: plan, packageDir: project.modulePath, pretty, - functionDelimiter + functionDelimiter, + outputDiff }); return argv; diff --git a/pgpm/core/src/packaging/package.ts b/pgpm/core/src/packaging/package.ts index a361f3159..93941fc50 100644 --- a/pgpm/core/src/packaging/package.ts +++ b/pgpm/core/src/packaging/package.ts @@ -26,6 +26,7 @@ interface PackageModuleOptions { extension?: boolean; pretty?: boolean; functionDelimiter?: string; + outputDiff?: boolean; } interface WritePackageOptions extends PackageModuleOptions { @@ -44,7 +45,7 @@ const filterStatements = (stmts: RawStmt[], extension: boolean): RawStmt[] => { export const packageModule = async ( packageDir: string, - { usePlan = true, extension = true, pretty = true, functionDelimiter = '$EOFCODE$' }: PackageModuleOptions = {} + { usePlan = true, extension = true, pretty = true, functionDelimiter = '$EOFCODE$', outputDiff = false }: PackageModuleOptions = {} ): Promise<{ sql: string; diff?: boolean; tree1?: string; tree2?: string }> => { const resolveFn = usePlan ? resolveWithPlan : resolve; const sql = resolveFn(packageDir); @@ -70,7 +71,8 @@ export const packageModule = async ( }); const tree1 = parsed.stmts; - const tree2 = await parse(finalSql); + const reparsed = await parse(finalSql); + const tree2 = filterStatements(reparsed.stmts as any, extension); const results: { sql: string; @@ -102,6 +104,7 @@ export const writePackage = async ({ extension = true, usePlan = true, packageDir, + outputDiff = false, }: WritePackageOptions): Promise => { const pkgPath = `${packageDir}/package.json`; const pkg = require(pkgPath); @@ -116,6 +119,7 @@ export const writePackage = async ({ const { sql, diff, tree1, tree2 } = await packageModule(packageDir, { extension, usePlan, + outputDiff, }); const outPath = extension ? `${packageDir}/sql` : `${packageDir}/out`; @@ -140,10 +144,13 @@ export const writePackage = async ({ } if (diff) { - log.warn(`⚠️ SQL diff exists! Review the ${relative(packageDir, outPath)}/ folder.`); - // Uncomment if needed: - // writeFileSync(`${outPath}/orig.${sqlFileName}.tree.json`, tree1); - // writeFileSync(`${outPath}/parsed.${sqlFileName}.tree.json`, tree2); + if (outputDiff) { + writeFileSync(`${outPath}/orig.${sqlFileName}.tree.json`, tree1!); + writeFileSync(`${outPath}/parsed.${sqlFileName}.tree.json`, tree2!); + log.warn(`⚠️ AST round-trip diff detected! Diff files written to ${relative(packageDir, outPath)}/`); + } else { + log.warn(`⚠️ AST round-trip diff detected! Run with --outputDiff to export the AST diff files.`); + } } const writePath = `${outPath}/${sqlFileName}`;