Skip to content

fix: use type-only import in TypeScript migration template#1579

Merged
Shinigami92 merged 1 commit intosalsita:mainfrom
shimscho:fix/template-type-only-import
Mar 17, 2026
Merged

fix: use type-only import in TypeScript migration template#1579
Shinigami92 merged 1 commit intosalsita:mainfrom
shimscho:fix/template-type-only-import

Conversation

@shimscho
Copy link
Contributor

Summary

The default TypeScript migration template (templates/migration-template.ts) imports ColumnDefinitions as a value import, but it is only exported as a TypeScript type — no runtime representation exists in the compiled JavaScript bundle.

This causes a SyntaxError when loading .ts migration files directly via tsx, swc, or Node.js 22.6+ with --experimental-strip-types:

SyntaxError: The requested module 'node-pg-migrate' does not provide an export named 'ColumnDefinitions'

Why it breaks

Toolchain Behavior Result
tsc.js → Node tsc erases unused value imports Works
tsx / swc / Node strip-types ESM loader checks exports before type stripping Crash

The fix

- import { ColumnDefinitions, MigrationBuilder } from 'node-pg-migrate';
+ import type { ColumnDefinitions, MigrationBuilder } from 'node-pg-migrate';

This aligns the template with the rest of the codebase, which already uses import type for ColumnDefinitions everywhere:

  • src/migration.tsimport type { ColumnDefinitions }
  • src/runner.tsimport type { ColumnDefinitions }
  • src/migrationBuilder.tsimport type { ColumnDefinitions }
  • test/ts/migrations/*.tsimport type { ColumnDefinitions, MigrationBuilder }
  • test/jiti/migrations/*.tsimport type { ColumnDefinitions, MigrationBuilder }

Fixes #1578

The default TypeScript template imports `ColumnDefinitions` as a value,
but it is only exported as a TypeScript type (no runtime representation).

This works with traditional `tsc` compilation (which erases unused value
imports), but fails when loading `.ts` files directly via tsx, swc, or
Node.js 22.6+ `--experimental-strip-types` because the ESM loader checks
module exports before types are stripped:

  SyntaxError: The requested module 'node-pg-migrate' does not provide
  an export named 'ColumnDefinitions'

The fix aligns the template with the rest of the codebase, which already
uses `import type` for `ColumnDefinitions` everywhere (src/migration.ts,
src/runner.ts, test files, etc.).

Fixes salsita#1578
@github-actions
Copy link

Coverage Report

Status Category Percentage Covered / Total
🔵 Lines 93.33% (🎯 90%)
🟰 ±0%
1457 / 1561
🔵 Statements 93.41% (🎯 90%)
🟰 ±0%
1475 / 1579
🔵 Functions 94.73% (🎯 90%)
🟰 ±0%
324 / 342
🔵 Branches 87.22% (🎯 85%)
🟰 ±0%
935 / 1072
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Unchanged Files
src/db.ts 78.43% 75% 76.92% 78% 90-92, 125-137, 173, 177-178
src/index.ts 100% 100% 100% 100%
src/logger.ts 100% 100% 100% 100%
src/migration.ts 79.66% 74.07% 79.16% 79.48% 149-151, 174-187, 235-236, 301-336, 402, 429-431, 439, 457-459, 489
src/migrationBuilder.ts 95.49% 62.5% 90% 95.49% 833-836, 976-980
src/migrationOptions.ts 100% 100% 100% 100%
src/pgType.ts 100% 100% 100% 100%
src/runner.ts 76.85% 60.56% 82.6% 76.06% 209-217, 230, 283, 328, 338-341, 355, 367-369, 393, 434-445, 450-452, 473-474, 484, 486-494
src/sqlMigration.ts 83.33% 100% 80% 83.33% 57-59
src/operations/sql.ts 100% 50% 100% 100%
src/operations/casts/createCast.ts 100% 100% 100% 100%
src/operations/casts/dropCast.ts 100% 100% 100% 100%
src/operations/casts/index.ts 100% 100% 100% 100%
src/operations/domains/alterDomain.ts 100% 100% 100% 100%
src/operations/domains/createDomain.ts 100% 95.45% 100% 100%
src/operations/domains/dropDomain.ts 100% 100% 100% 100%
src/operations/domains/index.ts 100% 100% 100% 100%
src/operations/domains/renameDomain.ts 100% 100% 100% 100%
src/operations/domains/shared.ts 100% 100% 100% 100%
src/operations/extensions/createExtension.ts 100% 100% 100% 100%
src/operations/extensions/dropExtension.ts 100% 100% 100% 100%
src/operations/extensions/index.ts 100% 100% 100% 100%
src/operations/extensions/shared.ts 100% 100% 100% 100%
src/operations/functions/createFunction.ts 96.29% 92% 100% 96.29% 71-73
src/operations/functions/dropFunction.ts 100% 100% 100% 100%
src/operations/functions/index.ts 100% 100% 100% 100%
src/operations/functions/renameFunction.ts 100% 100% 100% 100%
src/operations/functions/shared.ts 100% 100% 100% 100%
src/operations/grants/grantOnSchemas.ts 100% 100% 100% 100%
src/operations/grants/grantOnTables.ts 100% 100% 100% 100%
src/operations/grants/grantRoles.ts 100% 100% 100% 100%
src/operations/grants/index.ts 100% 100% 100% 100%
src/operations/grants/revokeOnSchemas.ts 100% 100% 100% 100%
src/operations/grants/revokeOnTables.ts 100% 100% 100% 100%
src/operations/grants/revokeRoles.ts 100% 100% 100% 100%
src/operations/grants/shared.ts 100% 75% 100% 100%
src/operations/indexes/createIndex.ts 100% 100% 100% 100%
src/operations/indexes/dropIndex.ts 100% 100% 100% 100%
src/operations/indexes/index.ts 100% 100% 100% 100%
src/operations/indexes/shared.ts 100% 88.23% 100% 100%
src/operations/materializedViews/alterMaterializedView.ts 100% 100% 100% 100%
src/operations/materializedViews/createMaterializedView.ts 100% 100% 100% 100%
src/operations/materializedViews/dropMaterializedView.ts 100% 100% 100% 100%
src/operations/materializedViews/index.ts 100% 100% 100% 100%
src/operations/materializedViews/refreshMaterializedView.ts 100% 100% 100% 100%
src/operations/materializedViews/renameMaterializedView.ts 100% 100% 100% 100%
src/operations/materializedViews/renameMaterializedViewColumn.ts 100% 100% 100% 100%
src/operations/materializedViews/shared.ts 100% 83.33% 100% 100%
src/operations/operators/addToOperatorFamily.ts 100% 100% 100% 100%
src/operations/operators/createOperator.ts 100% 88.88% 100% 100%
src/operations/operators/createOperatorClass.ts 100% 75% 100% 100%
src/operations/operators/createOperatorFamily.ts 100% 100% 100% 100%
src/operations/operators/dropOperator.ts 100% 100% 100% 100%
src/operations/operators/dropOperatorClass.ts 100% 100% 100% 100%
src/operations/operators/dropOperatorFamily.ts 100% 100% 100% 100%
src/operations/operators/index.ts 100% 100% 100% 100%
src/operations/operators/removeFromOperatorFamily.ts 100% 100% 100% 100%
src/operations/operators/renameOperatorClass.ts 100% 100% 100% 100%
src/operations/operators/renameOperatorFamily.ts 100% 100% 100% 100%
src/operations/operators/shared.ts 81.81% 77.77% 100% 81.81% 24, 38
src/operations/policies/alterPolicy.ts 100% 100% 100% 100%
src/operations/policies/createPolicy.ts 100% 100% 100% 100%
src/operations/policies/dropPolicy.ts 100% 100% 100% 100%
src/operations/policies/index.ts 100% 100% 100% 100%
src/operations/policies/renamePolicy.ts 100% 100% 100% 100%
src/operations/policies/shared.ts 100% 100% 100% 100%
src/operations/roles/alterRole.ts 100% 100% 100% 100%
src/operations/roles/createRole.ts 100% 92.3% 100% 100%
src/operations/roles/dropRole.ts 100% 100% 100% 100%
src/operations/roles/index.ts 100% 100% 100% 100%
src/operations/roles/renameRole.ts 100% 100% 100% 100%
src/operations/roles/shared.ts 100% 86.66% 100% 100%
src/operations/schemas/createSchema.ts 100% 100% 100% 100%
src/operations/schemas/dropSchema.ts 100% 100% 100% 100%
src/operations/schemas/index.ts 100% 100% 100% 100%
src/operations/schemas/renameSchema.ts 100% 100% 100% 100%
src/operations/sequences/alterSequence.ts 90% 83.33% 100% 90% 23
src/operations/sequences/createSequence.ts 100% 100% 100% 100%
src/operations/sequences/dropSequence.ts 100% 100% 100% 100%
src/operations/sequences/index.ts 100% 100% 100% 100%
src/operations/sequences/renameSequence.ts 100% 100% 100% 100%
src/operations/sequences/shared.ts 81.48% 83.33% 100% 81.48% 41, 43, 49, 63, 69
src/operations/tables/addColumns.ts 100% 85.71% 100% 100%
src/operations/tables/addConstraint.ts 100% 100% 100% 100%
src/operations/tables/alterColumn.ts 91.17% 81.25% 100% 91.17% 69, 76-83
src/operations/tables/alterTable.ts 100% 100% 100% 100%
src/operations/tables/createTable.ts 88% 82.14% 100% 88% 51-54, 92
src/operations/tables/dropColumns.ts 100% 100% 100% 100%
src/operations/tables/dropConstraint.ts 100% 100% 100% 100%
src/operations/tables/dropTable.ts 100% 100% 100% 100%
src/operations/tables/index.ts 100% 100% 100% 100%
src/operations/tables/renameColumn.ts 100% 100% 100% 100%
src/operations/tables/renameConstraint.ts 100% 100% 100% 100%
src/operations/tables/renameTable.ts 100% 100% 100% 100%
src/operations/tables/shared.ts 86.79% 76.76% 76.47% 86.79% 157, 241, 261, 287, 291-297, 301, 442-463
src/operations/triggers/createTrigger.ts 88.23% 71.79% 100% 88.23% 53, 66, 70, 74-76
src/operations/triggers/dropTrigger.ts 100% 100% 100% 100%
src/operations/triggers/index.ts 100% 100% 100% 100%
src/operations/triggers/renameTrigger.ts 100% 100% 100% 100%
src/operations/triggers/shared.ts 100% 100% 100% 100%
src/operations/types/addTypeAttribute.ts 100% 100% 100% 100%
src/operations/types/addTypeValue.ts 100% 100% 100% 100%
src/operations/types/createType.ts 100% 100% 100% 100%
src/operations/types/dropType.ts 100% 100% 100% 100%
src/operations/types/dropTypeAttribute.ts 100% 100% 100% 100%
src/operations/types/index.ts 100% 100% 100% 100%
src/operations/types/renameType.ts 100% 100% 100% 100%
src/operations/types/renameTypeAttribute.ts 100% 100% 100% 100%
src/operations/types/renameTypeValue.ts 100% 100% 100% 100%
src/operations/types/setTypeAttribute.ts 100% 100% 100% 100%
src/operations/views/alterView.ts 100% 100% 100% 100%
src/operations/views/alterViewColumn.ts 100% 100% 100% 100%
src/operations/views/createView.ts 100% 100% 100% 100%
src/operations/views/dropView.ts 100% 100% 100% 100%
src/operations/views/index.ts 100% 100% 100% 100%
src/operations/views/renameView.ts 100% 100% 100% 100%
src/operations/views/shared.ts 100% 50% 100% 100%
src/utils/PgLiteral.ts 100% 100% 100% 100%
src/utils/createSchemalize.ts 96.42% 93.54% 100% 96.29% 84
src/utils/createTransformer.ts 100% 100% 100% 100%
src/utils/decamelize.ts 100% 100% 100% 100%
src/utils/escapeValue.ts 100% 100% 100% 100%
src/utils/formatLines.ts 100% 100% 100% 100%
src/utils/formatParams.ts 100% 87.5% 100% 100%
src/utils/formatPartitionColumns.ts 100% 100% 100% 100%
src/utils/getMigrationTableSchema.ts 100% 100% 100% 100%
src/utils/getSchemas.ts 100% 100% 100% 100%
src/utils/identity.ts 100% 100% 100% 100%
src/utils/index.ts 100% 100% 100% 100%
src/utils/intersection.ts 100% 100% 100% 100%
src/utils/makeComment.ts 100% 100% 100% 100%
src/utils/quote.ts 100% 100% 100% 100%
src/utils/stringIdGenerator.ts 100% 100% 100% 100%
src/utils/toArray.ts 100% 100% 100% 100%
src/utils/types.ts 100% 100% 100% 100%
Generated in workflow #2981 for commit d8dd7cd by the Vitest Coverage Report Action

@Shinigami92 Shinigami92 added the c: refactor PR that affects the runtime behavior, but doesn't add new features or fixes bugs label Mar 17, 2026
@Shinigami92 Shinigami92 added this pull request to the merge queue Mar 17, 2026
Merged via the queue into salsita:main with commit afe7eac Mar 17, 2026
28 checks passed
@Shinigami92
Copy link
Collaborator

I'm on the wrong PC to init the release, I need to switch release pipeline to new npm oidc token process and the old npm token is expired.
Not sure if I can do this in todays evening, so might be tomorrow, or when I accidentally find some idle time.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

c: refactor PR that affects the runtime behavior, but doesn't add new features or fixes bugs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Default TypeScript template fails at runtime: ColumnDefinitions is not a runtime export

2 participants