diff --git a/common/changes/@typespec/migrate/date-time-migrate_2023-04-07-23-20.json b/common/changes/@typespec/migrate/date-time-migrate_2023-04-07-23-20.json new file mode 100644 index 00000000000..54e119f5c77 --- /dev/null +++ b/common/changes/@typespec/migrate/date-time-migrate_2023-04-07-23-20.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@typespec/migrate", + "comment": "Add migrate script for zonedDateTime", + "type": "none" + } + ], + "packageName": "@typespec/migrate" +} \ No newline at end of file diff --git a/packages/migrate/src/migration-config.ts b/packages/migrate/src/migration-config.ts index c633b61a7ee..a5740d04448 100644 --- a/packages/migrate/src/migration-config.ts +++ b/packages/migrate/src/migration-config.ts @@ -7,7 +7,7 @@ import { updatePackageVersion, } from "./migrations/v0.41/typespec-rename.js"; import { migrateQueryHeaderRequiredFormat } from "./migrations/v0.43/query-header-required-format.js"; - +import { migrateZonedDateTimeToUtcDateTime } from "./migrations/v0.43/zoned-date-time-to-utc-date-time.js"; // Update here before release. export type TypeSpecCompilerCurrent = typeof import("@typespec/compiler"); export type TypeSpecCompilerV0_37 = typeof import("@typespec/compiler-v0.37"); @@ -37,5 +37,5 @@ export const migrationConfigurations: MigrationStepsDictionary = { updatePackageVersion, migrateTspConfigFile, ], - "0.43.0": [migrateQueryHeaderRequiredFormat], + "0.43.0": [migrateQueryHeaderRequiredFormat, migrateZonedDateTimeToUtcDateTime], }; diff --git a/packages/migrate/src/migrations/v0.43/zoned-date-time-to-utc-date-time.ts b/packages/migrate/src/migrations/v0.43/zoned-date-time-to-utc-date-time.ts new file mode 100644 index 00000000000..d555d05cedc --- /dev/null +++ b/packages/migrate/src/migrations/v0.43/zoned-date-time-to-utc-date-time.ts @@ -0,0 +1,45 @@ +import { Node, SyntaxKind, TypeSpecScriptNode } from "@typespec/compiler-v0.42"; +import { TypeSpecCompilerV0_42 } from "../../migration-config.js"; +import { + AstContentMigrateAction, + createContentMigration, + MigrationContext, + MigrationKind, +} from "../../migration-types.js"; + +export const migrateZonedDateTimeToUtcDateTime = createContentMigration({ + name: "Migrate zonedDateTime to utcDateTime", + kind: MigrationKind.AstContentMigration, + from: "0.42.0", + to: "0.43.0", + migrate: ( + { printNode, printNodes }: MigrationContext, + compilerV37: TypeSpecCompilerV0_42, + root: TypeSpecScriptNode + ) => { + const actions: AstContentMigrateAction[] = []; + visitRecursive(compilerV37, root, (node) => { + if ( + node.kind === SyntaxKind.TypeReference && + node.target.kind === SyntaxKind.Identifier && + node.target.sv === "zonedDateTime" + ) { + actions.push({ + kind: MigrationKind.AstContentMigration, + target: node.target, + content: "utcDateTime", + }); + } + }); + + return actions; + }, +}); + +function visitRecursive(compiler: any, root: Node, callback: (node: Node) => void) { + const visit = (node: Node) => { + callback(node); + compiler.visitChildren(node, visit); + }; + visit(root); +} diff --git a/packages/migrate/test/zoned-date-time-to-utc-date-time.test.ts b/packages/migrate/test/zoned-date-time-to-utc-date-time.test.ts new file mode 100644 index 00000000000..fe9bce927f5 --- /dev/null +++ b/packages/migrate/test/zoned-date-time-to-utc-date-time.test.ts @@ -0,0 +1,50 @@ +import { strictEqual } from "assert"; +import { migrateTypeSpecContent } from "../src/migration-impl.js"; +import { migrateZonedDateTimeToUtcDateTime } from "../src/migrations/v0.43/zoned-date-time-to-utc-date-time.js"; + +describe("migration: zonedDateTime to utcDateTime", () => { + it("migrates type references and not other identifiers", async () => { + const [result] = await migrateTypeSpecContent( + ` + scalar instant extends zonedDateTime; + + model Widget { + created: zonedDateTime; + \`zonedDateTime\`: zonedDateTime; + } + + @error + model Error { + code: int32; + message: string; + } + + op test(@path id: string, time: zonedDateTime) : zonedDateTime; + op test(@path id: string, time: zonedDateTime) : zonedDateTime | Error; + `, + migrateZonedDateTimeToUtcDateTime + ); + + strictEqual( + result.trim(), + // note that the `zonedDateTime` property name no longer needs to be escaped with backticks + ` +scalar instant extends utcDateTime; + +model Widget { + created: utcDateTime; + zonedDateTime: utcDateTime; +} + +@error +model Error { + code: int32; + message: string; +} + +op test(@path id: string, time: utcDateTime): utcDateTime; +op test(@path id: string, time: utcDateTime): utcDateTime | Error; +`.trim() + ); + }); +});