@openrewrite/recipes-date-libraries 0.0.0 → 0.1.0-20260617-085322

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"date-fns-to-temporal.d.ts","sourceRoot":"","sources":["../src/date-fns-to-temporal.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAuB3E,qBAAa,iBAAkB,SAAQ,MAAM;IACzC,IAAI,SAAsE;IAC1E,WAAW,SAAsC;IACjD,WAAW,SAAwF;IAE7F,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CAG9D"}
1
+ {"version":3,"file":"date-fns-to-temporal.d.ts","sourceRoot":"","sources":["../src/date-fns-to-temporal.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AA+C3E,qBAAa,iBAAkB,SAAQ,MAAM;IACzC,IAAI,SAAsE;IAC1E,WAAW,SAAsC;IACjD,WAAW,SAAwF;IAE7F,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CAG9D"}
@@ -12,15 +12,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.DateFnsToTemporal = void 0;
13
13
  const rewrite_1 = require("@openrewrite/rewrite");
14
14
  const javascript_1 = require("@openrewrite/rewrite/javascript");
15
- const java_1 = require("@openrewrite/rewrite/java");
16
- const DATE_FNS_FUNCTIONS = new Set([
17
- 'addDays', 'addMonths', 'addYears',
18
- 'subDays', 'subMonths', 'subYears',
19
- 'isAfter', 'isBefore', 'isEqual',
20
- 'differenceInDays', 'differenceInHours', 'differenceInMinutes',
21
- 'startOfDay', 'startOfMonth', 'startOfYear',
22
- 'endOfDay', 'endOfMonth', 'endOfYear',
23
- ]);
15
+ const DATE_FNS_CONFIG = {
16
+ context: [
17
+ `import {
18
+ addDays, addMonths, addYears,
19
+ subDays, subMonths, subYears,
20
+ isAfter, isBefore, isEqual,
21
+ differenceInDays, differenceInHours, differenceInMinutes,
22
+ startOfDay, startOfMonth, startOfYear,
23
+ endOfDay, endOfMonth, endOfYear
24
+ } from "date-fns";`
25
+ ],
26
+ dependencies: { 'date-fns': '^2.30.0' },
27
+ lenientTypeMatching: false
28
+ };
29
+ const TEMPORAL_CONFIG = {
30
+ context: ['import { Temporal } from "@js-temporal/polyfill";'],
31
+ dependencies: { '@js-temporal/polyfill': '^0.5.1' }
32
+ };
24
33
  class DateFnsToTemporal extends rewrite_1.Recipe {
25
34
  constructor() {
26
35
  super(...arguments);
@@ -38,85 +47,25 @@ exports.DateFnsToTemporal = DateFnsToTemporal;
38
47
  class DateFnsToTemporalVisitor extends javascript_1.JavaScriptVisitor {
39
48
  constructor() {
40
49
  super(...arguments);
41
- this.importedDateFnsFunctions = new Set();
42
- this.aliasToOriginal = new Map();
43
- this._ruleCache = new Map();
50
+ this.rules = this.buildRules();
44
51
  }
45
52
  visitJsCompilationUnit(cu, ctx) {
46
53
  const _super = Object.create(null, {
47
54
  visitJsCompilationUnit: { get: () => super.visitJsCompilationUnit }
48
55
  });
49
56
  return __awaiter(this, void 0, void 0, function* () {
50
- var _a, _b;
51
- this.importedDateFnsFunctions = new Set();
52
- this.aliasToOriginal = new Map();
53
- for (const stmt of cu.statements) {
54
- const s = (_a = stmt.element) !== null && _a !== void 0 ? _a : stmt;
55
- if (s.kind === javascript_1.JS.Kind.Import) {
56
- this.collectDateFnsImports(s);
57
- }
58
- }
59
- if (this.importedDateFnsFunctions.size === 0) {
60
- return cu;
61
- }
62
57
  const result = yield _super.visitJsCompilationUnit.call(this, cu, ctx);
63
- for (const fn of this.importedDateFnsFunctions) {
64
- const originalName = (_b = this.aliasToOriginal.get(fn)) !== null && _b !== void 0 ? _b : fn;
65
- (0, javascript_1.maybeRemoveImport)(this, 'date-fns', originalName);
66
- }
58
+ (0, javascript_1.maybeRemoveImport)(this, 'date-fns');
67
59
  return result;
68
60
  });
69
61
  }
70
- collectDateFnsImports(imp) {
71
- const moduleSpecifier = imp.moduleSpecifier;
72
- if (!moduleSpecifier)
73
- return;
74
- const literal = moduleSpecifier.element;
75
- if (literal.kind !== java_1.J.Kind.Literal)
76
- return;
77
- if (literal.value !== 'date-fns')
78
- return;
79
- const importClause = imp.importClause;
80
- if (!(importClause === null || importClause === void 0 ? void 0 : importClause.namedBindings))
81
- return;
82
- if (importClause.namedBindings.kind !== javascript_1.JS.Kind.NamedImports)
83
- return;
84
- const namedImports = importClause.namedBindings;
85
- for (const elem of namedImports.elements.elements) {
86
- const specifier = elem.element;
87
- const specifierNode = specifier.specifier;
88
- if ((0, java_1.isIdentifier)(specifierNode) && DATE_FNS_FUNCTIONS.has(specifierNode.simpleName)) {
89
- this.importedDateFnsFunctions.add(specifierNode.simpleName);
90
- continue;
91
- }
92
- if (specifierNode.kind === javascript_1.JS.Kind.Alias) {
93
- const alias = specifierNode;
94
- const imported = alias.propertyName.element;
95
- const local = alias.alias;
96
- if ((0, java_1.isIdentifier)(imported) && (0, java_1.isIdentifier)(local) && DATE_FNS_FUNCTIONS.has(imported.simpleName)) {
97
- this.importedDateFnsFunctions.add(local.simpleName);
98
- this.aliasToOriginal.set(local.simpleName, imported.simpleName);
99
- }
100
- }
101
- }
102
- }
103
62
  visitMethodInvocation(method, ctx) {
104
63
  const _super = Object.create(null, {
105
64
  visitMethodInvocation: { get: () => super.visitMethodInvocation }
106
65
  });
107
66
  return __awaiter(this, void 0, void 0, function* () {
108
- var _a, _b;
109
67
  method = (yield _super.visitMethodInvocation.call(this, method, ctx));
110
- if (this.importedDateFnsFunctions.size === 0)
111
- return method;
112
- const name = (_a = method.name) === null || _a === void 0 ? void 0 : _a.simpleName;
113
- if (!name || !this.importedDateFnsFunctions.has(name))
114
- return method;
115
- const originalName = (_b = this.aliasToOriginal.get(name)) !== null && _b !== void 0 ? _b : name;
116
- const rule = this.getRuleForFunction(name, originalName);
117
- if (!rule)
118
- return method;
119
- return (yield rule.tryOn(this.cursor, method)) || method;
68
+ return (yield this.rules.tryOn(this.cursor, method)) || method;
120
69
  });
121
70
  }
122
71
  visitFunctionCall(functionCall, ctx) {
@@ -124,90 +73,66 @@ class DateFnsToTemporalVisitor extends javascript_1.JavaScriptVisitor {
124
73
  visitFunctionCall: { get: () => super.visitFunctionCall }
125
74
  });
126
75
  return __awaiter(this, void 0, void 0, function* () {
127
- var _a, _b;
128
76
  functionCall = (yield _super.visitFunctionCall.call(this, functionCall, ctx));
129
- if (this.importedDateFnsFunctions.size === 0)
130
- return functionCall;
131
- const fn = (_a = functionCall.function) === null || _a === void 0 ? void 0 : _a.element;
132
- if (!fn || !(0, java_1.isIdentifier)(fn))
133
- return functionCall;
134
- const name = fn.simpleName;
135
- if (!this.importedDateFnsFunctions.has(name))
136
- return functionCall;
137
- const originalName = (_b = this.aliasToOriginal.get(name)) !== null && _b !== void 0 ? _b : name;
138
- const rule = this.getRuleForFunction(name, originalName);
139
- if (!rule)
140
- return functionCall;
141
- return (yield rule.tryOn(this.cursor, functionCall)) || functionCall;
77
+ return (yield this.rules.tryOn(this.cursor, functionCall)) || functionCall;
142
78
  });
143
79
  }
144
- getRuleForFunction(localName, originalName) {
145
- if (this._ruleCache.has(localName))
146
- return this._ruleCache.get(localName);
147
- const rule = this.buildRule(localName, originalName);
148
- if (rule)
149
- this._ruleCache.set(localName, rule);
150
- return rule;
151
- }
152
- buildRule(localName, originalName) {
153
- switch (originalName) {
154
- case 'addDays': return this.addSubRule(localName, 'days', 'add');
155
- case 'addMonths': return this.addSubRule(localName, 'months', 'add');
156
- case 'addYears': return this.addSubRule(localName, 'years', 'add');
157
- case 'subDays': return this.addSubRule(localName, 'days', 'subtract');
158
- case 'subMonths': return this.addSubRule(localName, 'months', 'subtract');
159
- case 'subYears': return this.addSubRule(localName, 'years', 'subtract');
160
- case 'isAfter': return this.compareRule(localName, '> 0');
161
- case 'isBefore': return this.compareRule(localName, '< 0');
162
- case 'isEqual': return this.compareRule(localName, '=== 0');
163
- case 'differenceInDays': return this.differenceRule(localName, 'day', 'days');
164
- case 'differenceInHours': return this.differenceRule(localName, 'hour', 'hours');
165
- case 'differenceInMinutes': return this.differenceRule(localName, 'minute', 'minutes');
166
- case 'startOfDay': return this.singleArgRule(localName, 'Temporal.PlainDate.from(', ').toPlainDateTime()');
167
- case 'startOfMonth': return this.singleArgRule(localName, 'Temporal.PlainDate.from(', ').with({day: 1}).toPlainDateTime()');
168
- case 'startOfYear': return this.singleArgRule(localName, 'Temporal.PlainDate.from(', ').with({month: 1, day: 1}).toPlainDateTime()');
169
- case 'endOfDay': return this.singleArgRule(localName, 'Temporal.PlainDate.from(', ').toPlainDateTime({hour: 23, minute: 59, second: 59, millisecond: 999})');
170
- case 'endOfMonth': return this.endOfMonthRule(localName);
171
- case 'endOfYear': return this.singleArgRule(localName, 'Temporal.PlainDate.from(', ').with({month: 12, day: 31}).toPlainDateTime({hour: 23, minute: 59, second: 59, millisecond: 999})');
172
- default: return undefined;
173
- }
80
+ buildRules() {
81
+ return this.addSubRule('addDays', 'days', 'add')
82
+ .orElse(this.addSubRule('addMonths', 'months', 'add'))
83
+ .orElse(this.addSubRule('addYears', 'years', 'add'))
84
+ .orElse(this.addSubRule('subDays', 'days', 'subtract'))
85
+ .orElse(this.addSubRule('subMonths', 'months', 'subtract'))
86
+ .orElse(this.addSubRule('subYears', 'years', 'subtract'))
87
+ .orElse(this.compareRule('isAfter', '> 0'))
88
+ .orElse(this.compareRule('isBefore', '< 0'))
89
+ .orElse(this.compareRule('isEqual', '=== 0'))
90
+ .orElse(this.differenceRule('differenceInDays', 'day', 'days'))
91
+ .orElse(this.differenceRule('differenceInHours', 'hour', 'hours'))
92
+ .orElse(this.differenceRule('differenceInMinutes', 'minute', 'minutes'))
93
+ .orElse(this.singleArgRule('startOfDay', d => (0, javascript_1.template) `Temporal.PlainDate.from(${d}).toPlainDateTime()`))
94
+ .orElse(this.singleArgRule('startOfMonth', d => (0, javascript_1.template) `Temporal.PlainDate.from(${d}).with({day: 1}).toPlainDateTime()`))
95
+ .orElse(this.singleArgRule('startOfYear', d => (0, javascript_1.template) `Temporal.PlainDate.from(${d}).with({month: 1, day: 1}).toPlainDateTime()`))
96
+ .orElse(this.singleArgRule('endOfDay', d => (0, javascript_1.template) `Temporal.PlainDate.from(${d}).toPlainDateTime({hour: 23, minute: 59, second: 59, millisecond: 999})`))
97
+ .orElse(this.endOfMonthRule())
98
+ .orElse(this.singleArgRule('endOfYear', d => (0, javascript_1.template) `Temporal.PlainDate.from(${d}).with({month: 12, day: 31}).toPlainDateTime({hour: 23, minute: 59, second: 59, millisecond: 999})`));
174
99
  }
175
100
  addSubRule(fnName, unit, method) {
176
101
  const date = (0, javascript_1.capture)();
177
102
  const amount = (0, javascript_1.capture)();
178
103
  return (0, javascript_1.rewrite)(() => ({
179
- before: (0, javascript_1.pattern) `${(0, javascript_1.raw)(fnName)}(${date}, ${amount})`,
180
- after: (0, javascript_1.template) `Temporal.PlainDate.from(${date}).${(0, javascript_1.raw)(method)}({${(0, javascript_1.raw)(unit)}: ${amount}})`
104
+ before: (0, javascript_1.pattern) `${(0, javascript_1.raw)(fnName)}(${date}, ${amount})`.configure(DATE_FNS_CONFIG),
105
+ after: (0, javascript_1.template) `Temporal.PlainDate.from(${date}).${(0, javascript_1.raw)(method)}({${(0, javascript_1.raw)(unit)}: ${amount}})`.configure(TEMPORAL_CONFIG)
181
106
  }));
182
107
  }
183
108
  compareRule(fnName, operator) {
184
109
  const a = (0, javascript_1.capture)();
185
110
  const b = (0, javascript_1.capture)();
186
111
  return (0, javascript_1.rewrite)(() => ({
187
- before: (0, javascript_1.pattern) `${(0, javascript_1.raw)(fnName)}(${a}, ${b})`,
188
- after: (0, javascript_1.template) `Temporal.PlainDateTime.compare(${a}, ${b}) ${(0, javascript_1.raw)(operator)}`
112
+ before: (0, javascript_1.pattern) `${(0, javascript_1.raw)(fnName)}(${a}, ${b})`.configure(DATE_FNS_CONFIG),
113
+ after: (0, javascript_1.template) `Temporal.PlainDateTime.compare(${a}, ${b}) ${(0, javascript_1.raw)(operator)}`.configure(TEMPORAL_CONFIG)
189
114
  }));
190
115
  }
191
116
  differenceRule(fnName, largestUnit, field) {
192
117
  const a = (0, javascript_1.capture)();
193
118
  const b = (0, javascript_1.capture)();
194
119
  return (0, javascript_1.rewrite)(() => ({
195
- before: (0, javascript_1.pattern) `${(0, javascript_1.raw)(fnName)}(${a}, ${b})`,
196
- after: (0, javascript_1.template) `${a}.since(${b}, {largestUnit: "${(0, javascript_1.raw)(largestUnit)}"}).${(0, javascript_1.raw)(field)}`
120
+ before: (0, javascript_1.pattern) `${(0, javascript_1.raw)(fnName)}(${a}, ${b})`.configure(DATE_FNS_CONFIG),
121
+ after: (0, javascript_1.template) `Temporal.PlainDateTime.from(${a}).since(Temporal.PlainDateTime.from(${b}), {largestUnit: "${(0, javascript_1.raw)(largestUnit)}"}).${(0, javascript_1.raw)(field)}`.configure(TEMPORAL_CONFIG)
197
122
  }));
198
123
  }
199
- singleArgRule(fnName, prefix, suffix) {
124
+ singleArgRule(fnName, buildAfter) {
200
125
  const date = (0, javascript_1.capture)();
201
126
  return (0, javascript_1.rewrite)(() => ({
202
- before: (0, javascript_1.pattern) `${(0, javascript_1.raw)(fnName)}(${date})`,
203
- after: (0, javascript_1.template) `${(0, javascript_1.raw)(prefix)}${date}${(0, javascript_1.raw)(suffix)}`
127
+ before: (0, javascript_1.pattern) `${(0, javascript_1.raw)(fnName)}(${date})`.configure(DATE_FNS_CONFIG),
128
+ after: buildAfter(date).configure(TEMPORAL_CONFIG)
204
129
  }));
205
130
  }
206
- endOfMonthRule(fnName = 'endOfMonth') {
131
+ endOfMonthRule() {
207
132
  const date = (0, javascript_1.capture)();
208
133
  return (0, javascript_1.rewrite)(() => ({
209
- before: (0, javascript_1.pattern) `${(0, javascript_1.raw)(fnName)}(${date})`,
210
- after: (0, javascript_1.template) `((d) => d.with({day: d.daysInMonth}).toPlainDateTime({hour: 23, minute: 59, second: 59, millisecond: 999}))(Temporal.PlainDate.from(${date}))`
134
+ before: (0, javascript_1.pattern) `endOfMonth(${date})`.configure(DATE_FNS_CONFIG),
135
+ after: (0, javascript_1.template) `((d) => d.with({day: d.daysInMonth}).toPlainDateTime({hour: 23, minute: 59, second: 59, millisecond: 999}))(Temporal.PlainDate.from(${date}))`.configure(TEMPORAL_CONFIG)
211
136
  }));
212
137
  }
213
138
  }
@@ -1 +1 @@
1
- {"version":3,"file":"date-fns-to-temporal.js","sourceRoot":"","sources":["../src/date-fns-to-temporal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"date-fns-to-temporal.js","sourceRoot":"","sources":["../src/date-fns-to-temporal.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"moment-to-temporal.d.ts","sourceRoot":"","sources":["../src/moment-to-temporal.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAgC3E,qBAAa,gBAAiB,SAAQ,MAAM;IACxC,IAAI,SAAkE;IACtE,WAAW,SAAuC;IAClD,WAAW,SAAmF;IAExF,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CAG9D"}
1
+ {"version":3,"file":"moment-to-temporal.d.ts","sourceRoot":"","sources":["../src/moment-to-temporal.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAqG3E,qBAAa,gBAAiB,SAAQ,MAAM;IACxC,IAAI,SAAkE;IACtE,WAAW,SAAuC;IAClD,WAAW,SAAmF;IAExF,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;CAG9D"}
@@ -27,7 +27,45 @@ const STARTOF_MAP = {
27
27
  'day': '.toPlainDate().toPlainDateTime()',
28
28
  'month': '.with({day: 1}).toPlainDate().toPlainDateTime()',
29
29
  'year': '.with({month: 1, day: 1}).toPlainDate().toPlainDateTime()',
30
+ 'hour': '.with({minute: 0, second: 0, millisecond: 0, microsecond: 0, nanosecond: 0})',
31
+ 'minute': '.with({second: 0, millisecond: 0, microsecond: 0, nanosecond: 0})',
32
+ 'second': '.with({millisecond: 0, microsecond: 0, nanosecond: 0})',
30
33
  };
34
+ const TEMPORAL_CONFIG = {
35
+ context: ['import { Temporal } from "@js-temporal/polyfill";'],
36
+ dependencies: { '@js-temporal/polyfill': '^0.5.1' }
37
+ };
38
+ const MOMENT_CONFIG = {
39
+ context: ['import moment from "moment";'],
40
+ dependencies: { 'moment': '^2.30.0' },
41
+ lenientTypeMatching: false
42
+ };
43
+ function typeNameMatches(type, ...simpleNames) {
44
+ var _a, _b;
45
+ const fqn = (_b = (_a = type === null || type === void 0 ? void 0 : type.fullyQualifiedName) !== null && _a !== void 0 ? _a : type === null || type === void 0 ? void 0 : type.classFqn) !== null && _b !== void 0 ? _b : type === null || type === void 0 ? void 0 : type.className;
46
+ if (typeof fqn !== 'string')
47
+ return false;
48
+ return simpleNames.some(name => fqn === name || fqn.endsWith('.' + name));
49
+ }
50
+ function isTemporalReturnType(node, ...simpleNames) {
51
+ var _a;
52
+ return typeNameMatches((_a = node === null || node === void 0 ? void 0 : node.methodType) === null || _a === void 0 ? void 0 : _a.returnType, ...simpleNames);
53
+ }
54
+ function isMomentOrTemporalReceiver(node) {
55
+ var _a, _b, _c, _d;
56
+ if (!node)
57
+ return false;
58
+ if (isTemporalReturnType(node, 'Instant', 'PlainDateTime'))
59
+ return true;
60
+ if (typeNameMatches(node === null || node === void 0 ? void 0 : node.type, 'Moment'))
61
+ return true;
62
+ if ((_b = (_a = node === null || node === void 0 ? void 0 : node.kind) === null || _a === void 0 ? void 0 : _a.includes) === null || _b === void 0 ? void 0 : _b.call(_a, 'MethodInvocation')) {
63
+ const select = (_d = (_c = node.select) === null || _c === void 0 ? void 0 : _c.element) !== null && _d !== void 0 ? _d : node.select;
64
+ if (select && select !== node)
65
+ return isMomentOrTemporalReceiver(select);
66
+ }
67
+ return false;
68
+ }
31
69
  class MomentToTemporal extends rewrite_1.Recipe {
32
70
  constructor() {
33
71
  super(...arguments);
@@ -43,54 +81,26 @@ class MomentToTemporal extends rewrite_1.Recipe {
43
81
  }
44
82
  exports.MomentToTemporal = MomentToTemporal;
45
83
  class MomentToTemporalVisitor extends javascript_1.JavaScriptVisitor {
84
+ constructor() {
85
+ super(...arguments);
86
+ this.rules = this.buildRules();
87
+ }
46
88
  visitJsCompilationUnit(cu, ctx) {
47
89
  const _super = Object.create(null, {
48
90
  visitJsCompilationUnit: { get: () => super.visitJsCompilationUnit }
49
91
  });
50
92
  return __awaiter(this, void 0, void 0, function* () {
51
- var _a;
52
- this.momentImportName = undefined;
53
- this.rules = undefined;
54
- for (const stmt of cu.statements) {
55
- const s = (_a = stmt.element) !== null && _a !== void 0 ? _a : stmt;
56
- if (s.kind === javascript_1.JS.Kind.Import) {
57
- this.detectMomentImport(s);
58
- }
59
- }
60
- if (!this.momentImportName) {
61
- return cu;
62
- }
63
- this.rules = this.buildRules();
64
93
  const result = yield _super.visitJsCompilationUnit.call(this, cu, ctx);
65
- (0, javascript_1.maybeRemoveImport)(this, 'moment', 'default');
94
+ (0, javascript_1.maybeRemoveImport)(this, 'moment');
66
95
  return result;
67
96
  });
68
97
  }
69
- detectMomentImport(imp) {
70
- const moduleSpecifier = imp.moduleSpecifier;
71
- if (!moduleSpecifier)
72
- return;
73
- const literal = moduleSpecifier.element;
74
- if (literal.kind !== java_1.J.Kind.Literal)
75
- return;
76
- if (literal.value !== 'moment')
77
- return;
78
- const importClause = imp.importClause;
79
- if (!(importClause === null || importClause === void 0 ? void 0 : importClause.name))
80
- return;
81
- const nameElem = importClause.name.element;
82
- if ((0, java_1.isIdentifier)(nameElem)) {
83
- this.momentImportName = nameElem.simpleName;
84
- }
85
- }
86
98
  visitFunctionCall(functionCall, ctx) {
87
99
  const _super = Object.create(null, {
88
100
  visitFunctionCall: { get: () => super.visitFunctionCall }
89
101
  });
90
102
  return __awaiter(this, void 0, void 0, function* () {
91
103
  functionCall = (yield _super.visitFunctionCall.call(this, functionCall, ctx));
92
- if (!this.momentImportName || !this.rules)
93
- return functionCall;
94
104
  return (yield this.rules.tryOn(this.cursor, functionCall)) || functionCall;
95
105
  });
96
106
  }
@@ -100,53 +110,71 @@ class MomentToTemporalVisitor extends javascript_1.JavaScriptVisitor {
100
110
  });
101
111
  return __awaiter(this, void 0, void 0, function* () {
102
112
  method = (yield _super.visitMethodInvocation.call(this, method, ctx));
103
- if (!this.momentImportName || !this.rules)
104
- return method;
105
113
  return (yield this.rules.tryOn(this.cursor, method)) || method;
106
114
  });
107
115
  }
108
116
  buildRules() {
109
- return this.createNoArgRule()
110
- .orElse(this.createOneArgRule())
111
- .orElse(this.utcNoArgRule())
112
- .orElse(this.utcOneArgRule())
117
+ return (0, javascript_1.rewrite)(() => ({
118
+ before: (0, javascript_1.pattern) `moment()`.configure(MOMENT_CONFIG),
119
+ after: (0, javascript_1.template) `Temporal.Now.plainDateTimeISO()`.configure(TEMPORAL_CONFIG)
120
+ })).orElse((0, javascript_1.rewrite)(() => {
121
+ const arg = (0, javascript_1.capture)();
122
+ return {
123
+ before: (0, javascript_1.pattern) `moment(${arg})`.configure(MOMENT_CONFIG),
124
+ after: (0, javascript_1.template) `Temporal.PlainDateTime.from(${arg})`.configure(TEMPORAL_CONFIG)
125
+ };
126
+ })).orElse((0, javascript_1.rewrite)(() => ({
127
+ before: (0, javascript_1.pattern) `moment.utc()`.configure(MOMENT_CONFIG),
128
+ after: (0, javascript_1.template) `Temporal.Now.instant()`.configure(TEMPORAL_CONFIG)
129
+ }))).orElse((0, javascript_1.rewrite)(() => {
130
+ const arg = (0, javascript_1.capture)();
131
+ return {
132
+ before: (0, javascript_1.pattern) `moment.utc(${arg})`.configure(MOMENT_CONFIG),
133
+ after: (0, javascript_1.template) `Temporal.Instant.from(${arg})`.configure(TEMPORAL_CONFIG)
134
+ };
135
+ }))
113
136
  .orElse(this.addSubtractRule('add'))
114
137
  .orElse(this.addSubtractRule('subtract'))
138
+ .orElse(this.instantComparisonRule('isBefore', '< 0'))
115
139
  .orElse(this.comparisonRule('isBefore', '< 0'))
140
+ .orElse(this.instantComparisonRule('isAfter', '> 0'))
116
141
  .orElse(this.comparisonRule('isAfter', '> 0'))
142
+ .orElse(this.instantComparisonRule('isSame', '=== 0'))
117
143
  .orElse(this.comparisonRule('isSame', '=== 0'))
118
- .orElse(this.cloneRule())
119
- .orElse(this.startOfRule());
120
- }
121
- createNoArgRule() {
122
- return (0, javascript_1.rewrite)(() => ({
123
- before: (0, javascript_1.pattern) `${(0, javascript_1.raw)(this.momentImportName)}()`,
124
- after: (0, javascript_1.template) `Temporal.Now.plainDateTimeISO()`
125
- }));
126
- }
127
- createOneArgRule() {
128
- const arg = (0, javascript_1.capture)();
129
- return (0, javascript_1.rewrite)(() => ({
130
- before: (0, javascript_1.pattern) `${(0, javascript_1.raw)(this.momentImportName)}(${arg})`,
131
- after: (0, javascript_1.template) `Temporal.PlainDateTime.from(${arg})`
132
- }));
133
- }
134
- utcNoArgRule() {
135
- return (0, javascript_1.rewrite)(() => ({
136
- before: (0, javascript_1.pattern) `${(0, javascript_1.raw)(this.momentImportName)}.utc()`,
137
- after: (0, javascript_1.template) `Temporal.Now.instant()`
144
+ .orElse((0, javascript_1.rewrite)(() => {
145
+ const obj = (0, javascript_1.capture)({ constraint: (n) => isMomentOrTemporalReceiver(n) });
146
+ return {
147
+ before: (0, javascript_1.pattern) `${obj}.clone()`,
148
+ after: (0, javascript_1.template) `${obj}`
149
+ };
150
+ }))
151
+ .orElse((0, javascript_1.rewrite)(() => {
152
+ const obj = (0, javascript_1.capture)({ constraint: (n) => isMomentOrTemporalReceiver(n) });
153
+ const unit = (0, javascript_1.capture)({
154
+ constraint: (n) => (0, java_1.isLiteral)(n) && typeof n.value === 'string' && STARTOF_MAP[n.value] !== undefined
155
+ });
156
+ return {
157
+ before: (0, javascript_1.pattern) `${obj}.startOf(${unit})`,
158
+ after: (match) => {
159
+ const unitStr = match.get(unit).value;
160
+ return (0, javascript_1.template) `${obj}${(0, javascript_1.raw)(STARTOF_MAP[unitStr])}`.configure(TEMPORAL_CONFIG);
161
+ }
162
+ };
138
163
  }));
139
164
  }
140
- utcOneArgRule() {
141
- const arg = (0, javascript_1.capture)();
165
+ instantComparisonRule(methodName, operator) {
166
+ const a = (0, javascript_1.capture)({
167
+ constraint: (n) => isTemporalReturnType(n, 'Instant')
168
+ });
169
+ const b = (0, javascript_1.capture)();
142
170
  return (0, javascript_1.rewrite)(() => ({
143
- before: (0, javascript_1.pattern) `${(0, javascript_1.raw)(this.momentImportName)}.utc(${arg})`,
144
- after: (0, javascript_1.template) `Temporal.Instant.from(${arg})`
171
+ before: (0, javascript_1.pattern) `${a}.${(0, javascript_1.raw)(methodName)}(${b})`,
172
+ after: (0, javascript_1.template) `Temporal.Instant.compare(${a}, ${b}) ${(0, javascript_1.raw)(operator)}`.configure(TEMPORAL_CONFIG)
145
173
  }));
146
174
  }
147
175
  addSubtractRule(methodName) {
148
176
  return (0, javascript_1.rewrite)(() => {
149
- const obj = (0, javascript_1.capture)();
177
+ const obj = (0, javascript_1.capture)({ constraint: (n) => isMomentOrTemporalReceiver(n) });
150
178
  const amount = (0, javascript_1.capture)();
151
179
  const unit = (0, javascript_1.capture)({
152
180
  constraint: (n) => (0, java_1.isLiteral)(n) && typeof n.value === 'string' && UNIT_MAP[n.value] !== undefined
@@ -155,40 +183,18 @@ class MomentToTemporalVisitor extends javascript_1.JavaScriptVisitor {
155
183
  before: (0, javascript_1.pattern) `${obj}.${(0, javascript_1.raw)(methodName)}(${amount}, ${unit})`,
156
184
  after: (match) => {
157
185
  const unitStr = match.get(unit).value;
158
- return (0, javascript_1.template) `${obj}.${(0, javascript_1.raw)(methodName)}({${(0, javascript_1.raw)(UNIT_MAP[unitStr])}: ${amount}})`;
186
+ return (0, javascript_1.template) `${obj}.${(0, javascript_1.raw)(methodName)}({${(0, javascript_1.raw)(UNIT_MAP[unitStr])}: ${amount}})`.configure(TEMPORAL_CONFIG);
159
187
  }
160
188
  };
161
189
  });
162
190
  }
163
191
  comparisonRule(methodName, operator) {
164
- const a = (0, javascript_1.capture)();
192
+ const a = (0, javascript_1.capture)({ constraint: (n) => isMomentOrTemporalReceiver(n) });
165
193
  const b = (0, javascript_1.capture)();
166
194
  return (0, javascript_1.rewrite)(() => ({
167
195
  before: (0, javascript_1.pattern) `${a}.${(0, javascript_1.raw)(methodName)}(${b})`,
168
- after: (0, javascript_1.template) `Temporal.PlainDateTime.compare(${a}, ${b}) ${(0, javascript_1.raw)(operator)}`
169
- }));
170
- }
171
- cloneRule() {
172
- const obj = (0, javascript_1.capture)();
173
- return (0, javascript_1.rewrite)(() => ({
174
- before: (0, javascript_1.pattern) `${obj}.clone()`,
175
- after: (0, javascript_1.template) `${obj}`
196
+ after: (0, javascript_1.template) `Temporal.PlainDateTime.compare(${a}, ${b}) ${(0, javascript_1.raw)(operator)}`.configure(TEMPORAL_CONFIG)
176
197
  }));
177
198
  }
178
- startOfRule() {
179
- return (0, javascript_1.rewrite)(() => {
180
- const obj = (0, javascript_1.capture)();
181
- const unit = (0, javascript_1.capture)({
182
- constraint: (n) => (0, java_1.isLiteral)(n) && typeof n.value === 'string' && STARTOF_MAP[n.value] !== undefined
183
- });
184
- return {
185
- before: (0, javascript_1.pattern) `${obj}.startOf(${unit})`,
186
- after: (match) => {
187
- const unitStr = match.get(unit).value;
188
- return (0, javascript_1.template) `${obj}${(0, javascript_1.raw)(STARTOF_MAP[unitStr])}`;
189
- }
190
- };
191
- });
192
- }
193
199
  }
194
200
  //# sourceMappingURL=moment-to-temporal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"moment-to-temporal.js","sourceRoot":"","sources":["../src/moment-to-temporal.ts"],"names":[],"mappings":";;;;;;;;;;;;AAgBA,kDAA2E;AAC3E,gEAUyC;AACzC,oDAAqE;AAErE,MAAM,QAAQ,GAA2B;IACrC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO;IAC/C,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ;IACpD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO;IAC/C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO;IAC/C,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS;IACzD,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS;IACzD,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc;CACtF,CAAC;AAGF,MAAM,WAAW,GAA2B;IACxC,KAAK,EAAE,kCAAkC;IACzC,OAAO,EAAE,iDAAiD;IAC1D,MAAM,EAAE,2DAA2D;CACtE,CAAC;AAEF,MAAa,gBAAiB,SAAQ,gBAAM;IAA5C;;QACI,SAAI,GAAG,8DAA8D,CAAC;QACtE,gBAAW,GAAG,mCAAmC,CAAC;QAClD,gBAAW,GAAG,+EAA+E,CAAC;IAKlG,CAAC;IAHS,MAAM;;YACR,OAAO,IAAI,uBAAuB,EAAE,CAAC;QACzC,CAAC;KAAA;CACJ;AARD,4CAQC;AAED,MAAM,uBAAwB,SAAQ,8BAAmC;IAI5C,sBAAsB,CAAC,EAAsB,EAAE,GAAqB;;;;;;YACzF,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;YAClC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YAEvB,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;gBAC/B,MAAM,CAAC,GAAG,MAAA,IAAI,CAAC,OAAO,mCAAI,IAAI,CAAC;gBAC/B,IAAI,CAAC,CAAC,IAAI,KAAK,eAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC5B,IAAI,CAAC,kBAAkB,CAAC,CAAc,CAAC,CAAC;gBAC5C,CAAC;YACL,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACzB,OAAO,EAAE,CAAC;YACd,CAAC;YAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAE/B,MAAM,MAAM,GAAG,MAAM,OAAM,sBAAsB,YAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAE3D,IAAA,8BAAiB,EAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAE7C,OAAO,MAAM,CAAC;QAClB,CAAC;KAAA;IAEO,kBAAkB,CAAC,GAAc;QACrC,MAAM,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,eAAe;YAAE,OAAO;QAE7B,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC;QACxC,IAAI,OAAO,CAAC,IAAI,KAAK,QAAC,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC5C,IAAK,OAAqB,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO;QAEtD,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,CAAA;YAAE,OAAO;QAEhC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QAC3C,IAAI,IAAA,mBAAY,EAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,UAAU,CAAC;QAChD,CAAC;IACL,CAAC;IAEwB,iBAAiB,CAAC,YAA6B,EAAE,GAAqB;;;;;YAC3F,YAAY,IAAG,MAAM,OAAM,iBAAiB,YAAC,YAAY,EAAE,GAAG,CAAoB,CAAA,CAAC;YACnF,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,OAAO,YAAY,CAAC;YAC/D,OAAO,CAAA,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,KAAI,YAAY,CAAC;QAC7E,CAAC;KAAA;IAEwB,qBAAqB,CAAC,MAA0B,EAAE,GAAqB;;;;;YAC5F,MAAM,IAAG,MAAM,OAAM,qBAAqB,YAAC,MAAM,EAAE,GAAG,CAAuB,CAAA,CAAC;YAC9E,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,OAAO,MAAM,CAAC;YACzD,OAAO,CAAA,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,KAAI,MAAM,CAAC;QACjE,CAAC;KAAA;IAEO,UAAU;QACd,OAAO,IAAI,CAAC,eAAe,EAAE;aACxB,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;aAC/B,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;aAC3B,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;aAC5B,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;aACnC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;aACxC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;aAC9C,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;aAC7C,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;aAC9C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;aACxB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACpC,CAAC;IAGO,eAAe;QACnB,OAAO,IAAA,oBAAO,EAAC,GAAG,EAAE,CAAC,CAAC;YAClB,MAAM,EAAE,IAAA,oBAAO,EAAA,GAAG,IAAA,gBAAG,EAAC,IAAI,CAAC,gBAAiB,CAAC,IAAI;YACjD,KAAK,EAAE,IAAA,qBAAQ,EAAA,iCAAiC;SACnD,CAAC,CAAC,CAAC;IACR,CAAC;IAGO,gBAAgB;QACpB,MAAM,GAAG,GAAG,IAAA,oBAAO,GAAE,CAAC;QACtB,OAAO,IAAA,oBAAO,EAAC,GAAG,EAAE,CAAC,CAAC;YAClB,MAAM,EAAE,IAAA,oBAAO,EAAA,GAAG,IAAA,gBAAG,EAAC,IAAI,CAAC,gBAAiB,CAAC,IAAI,GAAG,GAAG;YACvD,KAAK,EAAE,IAAA,qBAAQ,EAAA,+BAA+B,GAAG,GAAG;SACvD,CAAC,CAAC,CAAC;IACR,CAAC;IAGO,YAAY;QAChB,OAAO,IAAA,oBAAO,EAAC,GAAG,EAAE,CAAC,CAAC;YAClB,MAAM,EAAE,IAAA,oBAAO,EAAA,GAAG,IAAA,gBAAG,EAAC,IAAI,CAAC,gBAAiB,CAAC,QAAQ;YACrD,KAAK,EAAE,IAAA,qBAAQ,EAAA,wBAAwB;SAC1C,CAAC,CAAC,CAAC;IACR,CAAC;IAGO,aAAa;QACjB,MAAM,GAAG,GAAG,IAAA,oBAAO,GAAE,CAAC;QACtB,OAAO,IAAA,oBAAO,EAAC,GAAG,EAAE,CAAC,CAAC;YAClB,MAAM,EAAE,IAAA,oBAAO,EAAA,GAAG,IAAA,gBAAG,EAAC,IAAI,CAAC,gBAAiB,CAAC,QAAQ,GAAG,GAAG;YAC3D,KAAK,EAAE,IAAA,qBAAQ,EAAA,yBAAyB,GAAG,GAAG;SACjD,CAAC,CAAC,CAAC;IACR,CAAC;IAGO,eAAe,CAAC,UAA8B;QAClD,OAAO,IAAA,oBAAO,EAAC,GAAG,EAAE;YAChB,MAAM,GAAG,GAAG,IAAA,oBAAO,GAAE,CAAC;YACtB,MAAM,MAAM,GAAG,IAAA,oBAAO,GAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAA,oBAAO,EAAC;gBACjB,UAAU,EAAE,CAAC,CAAM,EAAE,EAAE,CAAC,IAAA,gBAAS,EAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,SAAS;aACzG,CAAC,CAAC;YACH,OAAO;gBACH,MAAM,EAAE,IAAA,oBAAO,EAAA,GAAG,GAAG,IAAI,IAAA,gBAAG,EAAC,UAAU,CAAC,IAAI,MAAM,KAAK,IAAI,GAAG;gBAC9D,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACb,MAAM,OAAO,GAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAe,CAAC,KAAe,CAAC;oBAC/D,OAAO,IAAA,qBAAQ,EAAA,GAAG,GAAG,IAAI,IAAA,gBAAG,EAAC,UAAU,CAAC,KAAK,IAAA,gBAAG,EAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC;gBACvF,CAAC;aACJ,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAGO,cAAc,CAAC,UAAkB,EAAE,QAAgB;QACvD,MAAM,CAAC,GAAG,IAAA,oBAAO,GAAE,CAAC;QACpB,MAAM,CAAC,GAAG,IAAA,oBAAO,GAAE,CAAC;QACpB,OAAO,IAAA,oBAAO,EAAC,GAAG,EAAE,CAAC,CAAC;YAClB,MAAM,EAAE,IAAA,oBAAO,EAAA,GAAG,CAAC,IAAI,IAAA,gBAAG,EAAC,UAAU,CAAC,IAAI,CAAC,GAAG;YAC9C,KAAK,EAAE,IAAA,qBAAQ,EAAA,kCAAkC,CAAC,KAAK,CAAC,KAAK,IAAA,gBAAG,EAAC,QAAQ,CAAC,EAAE;SAC/E,CAAC,CAAC,CAAC;IACR,CAAC;IAGO,SAAS;QACb,MAAM,GAAG,GAAG,IAAA,oBAAO,GAAE,CAAC;QACtB,OAAO,IAAA,oBAAO,EAAC,GAAG,EAAE,CAAC,CAAC;YAClB,MAAM,EAAE,IAAA,oBAAO,EAAA,GAAG,GAAG,UAAU;YAC/B,KAAK,EAAE,IAAA,qBAAQ,EAAA,GAAG,GAAG,EAAE;SAC1B,CAAC,CAAC,CAAC;IACR,CAAC;IAGO,WAAW;QACf,OAAO,IAAA,oBAAO,EAAC,GAAG,EAAE;YAChB,MAAM,GAAG,GAAG,IAAA,oBAAO,GAAE,CAAC;YACtB,MAAM,IAAI,GAAG,IAAA,oBAAO,EAAC;gBACjB,UAAU,EAAE,CAAC,CAAM,EAAE,EAAE,CAAC,IAAA,gBAAS,EAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,SAAS;aAC5G,CAAC,CAAC;YACH,OAAO;gBACH,MAAM,EAAE,IAAA,oBAAO,EAAA,GAAG,GAAG,YAAY,IAAI,GAAG;gBACxC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACb,MAAM,OAAO,GAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAe,CAAC,KAAe,CAAC;oBAC/D,OAAO,IAAA,qBAAQ,EAAA,GAAG,GAAG,GAAG,IAAA,gBAAG,EAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACxD,CAAC;aACJ,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
1
+ {"version":3,"file":"moment-to-temporal.js","sourceRoot":"","sources":["../src/moment-to-temporal.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openrewrite/recipes-date-libraries",
3
- "version": "0.0.0",
3
+ "version": "0.1.0-20260617-085322",
4
4
  "license": "Moderne Source Available License",
5
5
  "description": "OpenRewrite recipes for migrating JavaScript/TypeScript date libraries to the native Temporal API.",
6
6
  "homepage": "https://github.com/moderneinc/recipes-javascript",
@@ -26,16 +26,40 @@ import {
26
26
  RewriteRule,
27
27
  template
28
28
  } from "@openrewrite/rewrite/javascript";
29
- import {J, isIdentifier} from "@openrewrite/rewrite/java";
30
-
31
- const DATE_FNS_FUNCTIONS = new Set([
32
- 'addDays', 'addMonths', 'addYears',
33
- 'subDays', 'subMonths', 'subYears',
34
- 'isAfter', 'isBefore', 'isEqual',
35
- 'differenceInDays', 'differenceInHours', 'differenceInMinutes',
36
- 'startOfDay', 'startOfMonth', 'startOfYear',
37
- 'endOfDay', 'endOfMonth', 'endOfYear',
38
- ]);
29
+ import {J} from "@openrewrite/rewrite/java";
30
+
31
+ // Attribution context for matching date-fns calls by symbol identity rather than by name. With
32
+ // this applied (and lenient matching off), a pattern like `addDays(${d}, ${n})` matches only
33
+ // calls that resolve to date-fns' `addDays` — including aliased imports
34
+ // (`import { addDays as plusDays }`) and ignoring unrelated local/imported functions that merely
35
+ // share the name. This requires the source to be type-attributed (date-fns installed). The
36
+ // date-fns types are used purely for attribution; the import is removed from the output.
37
+ // The context must import every date-fns function any pattern references, so each pattern's
38
+ // canonical name resolves to the date-fns symbol under strict (non-lenient) matching.
39
+ const DATE_FNS_CONFIG = {
40
+ context: [
41
+ `import {
42
+ addDays, addMonths, addYears,
43
+ subDays, subMonths, subYears,
44
+ isAfter, isBefore, isEqual,
45
+ differenceInDays, differenceInHours, differenceInMinutes,
46
+ startOfDay, startOfMonth, startOfYear,
47
+ endOfDay, endOfMonth, endOfYear
48
+ } from "date-fns";`
49
+ ],
50
+ dependencies: {'date-fns': '^2.30.0'},
51
+ lenientTypeMatching: false
52
+ };
53
+
54
+ // Attribution context for the Temporal code these rules emit. Applied to every `after` template so
55
+ // the OUTPUT stays type-attributed (the generated `Temporal.*` nodes resolve to real types rather
56
+ // than `Unknown`) — which is what lets a downstream recipe match the result by type. The polyfill
57
+ // types are used purely for attribution; no import is added to the output, which assumes a global
58
+ // `Temporal`. Convention: any template that emits Temporal code carries this.
59
+ const TEMPORAL_CONFIG = {
60
+ context: ['import { Temporal } from "@js-temporal/polyfill";'],
61
+ dependencies: {'@js-temporal/polyfill': '^0.5.1'}
62
+ };
39
63
 
40
64
  export class DateFnsToTemporal extends Recipe {
41
65
  name = "org.openrewrite.javascript.migrate.date-fns.date-fns-to-temporal";
@@ -48,144 +72,52 @@ export class DateFnsToTemporal extends Recipe {
48
72
  }
49
73
 
50
74
  class DateFnsToTemporalVisitor extends JavaScriptVisitor<ExecutionContext> {
51
- private importedDateFnsFunctions = new Set<string>();
52
- private aliasToOriginal = new Map<string, string>();
75
+ private readonly rules: RewriteRule = this.buildRules();
53
76
 
54
77
  protected override async visitJsCompilationUnit(cu: JS.CompilationUnit, ctx: ExecutionContext): Promise<J | undefined> {
55
- this.importedDateFnsFunctions = new Set();
56
- this.aliasToOriginal = new Map();
57
-
58
- for (const stmt of cu.statements) {
59
- const s = stmt.element ?? stmt;
60
- if (s.kind === JS.Kind.Import) {
61
- this.collectDateFnsImports(s as JS.Import);
62
- }
63
- }
64
-
65
- if (this.importedDateFnsFunctions.size === 0) {
66
- return cu;
67
- }
68
-
69
78
  const result = await super.visitJsCompilationUnit(cu, ctx);
70
-
71
- for (const fn of this.importedDateFnsFunctions) {
72
- const originalName = this.aliasToOriginal.get(fn) ?? fn;
73
- maybeRemoveImport(this, 'date-fns', originalName);
74
- }
75
-
79
+ // After transforming the calls, the date-fns imports are unused; drop the whole set.
80
+ maybeRemoveImport(this, 'date-fns');
76
81
  return result;
77
82
  }
78
83
 
79
- private collectDateFnsImports(imp: JS.Import): void {
80
- const moduleSpecifier = imp.moduleSpecifier;
81
- if (!moduleSpecifier) return;
82
-
83
- const literal = moduleSpecifier.element;
84
- if (literal.kind !== J.Kind.Literal) return;
85
- if ((literal as J.Literal).value !== 'date-fns') return;
86
-
87
- const importClause = imp.importClause;
88
- if (!importClause?.namedBindings) return;
89
- if (importClause.namedBindings.kind !== JS.Kind.NamedImports) return;
90
-
91
- const namedImports = importClause.namedBindings as JS.NamedImports;
92
- for (const elem of namedImports.elements.elements) {
93
- const specifier = elem.element;
94
- const specifierNode = specifier.specifier;
95
-
96
- // Simple import: import { addDays } from 'date-fns'
97
- if (isIdentifier(specifierNode) && DATE_FNS_FUNCTIONS.has(specifierNode.simpleName)) {
98
- this.importedDateFnsFunctions.add(specifierNode.simpleName);
99
- continue;
100
- }
101
-
102
- // Aliased import: import { addDays as plusDays } from 'date-fns'
103
- if (specifierNode.kind === JS.Kind.Alias) {
104
- const alias = specifierNode as JS.Alias;
105
- const imported = alias.propertyName.element;
106
- const local = alias.alias;
107
- if (isIdentifier(imported) && isIdentifier(local) && DATE_FNS_FUNCTIONS.has(imported.simpleName)) {
108
- this.importedDateFnsFunctions.add(local.simpleName);
109
- this.aliasToOriginal.set(local.simpleName, imported.simpleName);
110
- }
111
- }
112
- }
113
- }
114
-
115
84
  protected override async visitMethodInvocation(method: J.MethodInvocation, ctx: ExecutionContext): Promise<J | undefined> {
116
85
  method = await super.visitMethodInvocation(method, ctx) as J.MethodInvocation;
117
- if (this.importedDateFnsFunctions.size === 0) return method;
118
-
119
- const name = (method.name as J.Identifier)?.simpleName;
120
- if (!name || !this.importedDateFnsFunctions.has(name)) return method;
121
-
122
- const originalName = this.aliasToOriginal.get(name) ?? name;
123
- const rule = this.getRuleForFunction(name, originalName);
124
- if (!rule) return method;
125
-
126
- return await rule.tryOn(this.cursor, method) || method;
86
+ return await this.rules.tryOn(this.cursor, method) || method;
127
87
  }
128
88
 
129
89
  protected override async visitFunctionCall(functionCall: JS.FunctionCall, ctx: ExecutionContext): Promise<J | undefined> {
130
90
  functionCall = await super.visitFunctionCall(functionCall, ctx) as JS.FunctionCall;
131
- if (this.importedDateFnsFunctions.size === 0) return functionCall;
132
-
133
- const fn = functionCall.function?.element;
134
- if (!fn || !isIdentifier(fn)) return functionCall;
135
-
136
- const name = fn.simpleName;
137
- if (!this.importedDateFnsFunctions.has(name)) return functionCall;
138
-
139
- const originalName = this.aliasToOriginal.get(name) ?? name;
140
- const rule = this.getRuleForFunction(name, originalName);
141
- if (!rule) return functionCall;
142
-
143
- return await rule.tryOn(this.cursor, functionCall) || functionCall;
91
+ return await this.rules.tryOn(this.cursor, functionCall) || functionCall;
144
92
  }
145
93
 
146
- private _ruleCache = new Map<string, RewriteRule>();
147
-
148
- private getRuleForFunction(localName: string, originalName: string): RewriteRule | undefined {
149
- if (this._ruleCache.has(localName)) return this._ruleCache.get(localName)!;
150
- const rule = this.buildRule(localName, originalName);
151
- if (rule) this._ruleCache.set(localName, rule);
152
- return rule;
153
- }
154
-
155
- private buildRule(localName: string, originalName: string): RewriteRule | undefined {
156
- switch (originalName) {
157
- case 'addDays': return this.addSubRule(localName, 'days', 'add');
158
- case 'addMonths': return this.addSubRule(localName, 'months', 'add');
159
- case 'addYears': return this.addSubRule(localName, 'years', 'add');
160
- case 'subDays': return this.addSubRule(localName, 'days', 'subtract');
161
- case 'subMonths': return this.addSubRule(localName, 'months', 'subtract');
162
- case 'subYears': return this.addSubRule(localName, 'years', 'subtract');
163
-
164
- case 'isAfter': return this.compareRule(localName, '> 0');
165
- case 'isBefore': return this.compareRule(localName, '< 0');
166
- case 'isEqual': return this.compareRule(localName, '=== 0');
167
-
168
- case 'differenceInDays': return this.differenceRule(localName, 'day', 'days');
169
- case 'differenceInHours': return this.differenceRule(localName, 'hour', 'hours');
170
- case 'differenceInMinutes': return this.differenceRule(localName, 'minute', 'minutes');
171
-
172
- case 'startOfDay': return this.singleArgRule(localName, 'Temporal.PlainDate.from(', ').toPlainDateTime()');
173
- case 'startOfMonth': return this.singleArgRule(localName, 'Temporal.PlainDate.from(', ').with({day: 1}).toPlainDateTime()');
174
- case 'startOfYear': return this.singleArgRule(localName, 'Temporal.PlainDate.from(', ').with({month: 1, day: 1}).toPlainDateTime()');
175
- case 'endOfDay': return this.singleArgRule(localName, 'Temporal.PlainDate.from(', ').toPlainDateTime({hour: 23, minute: 59, second: 59, millisecond: 999})');
176
- case 'endOfMonth': return this.endOfMonthRule(localName);
177
- case 'endOfYear': return this.singleArgRule(localName, 'Temporal.PlainDate.from(', ').with({month: 12, day: 31}).toPlainDateTime({hour: 23, minute: 59, second: 59, millisecond: 999})');
178
-
179
- default: return undefined;
180
- }
94
+ private buildRules(): RewriteRule {
95
+ return this.addSubRule('addDays', 'days', 'add')
96
+ .orElse(this.addSubRule('addMonths', 'months', 'add'))
97
+ .orElse(this.addSubRule('addYears', 'years', 'add'))
98
+ .orElse(this.addSubRule('subDays', 'days', 'subtract'))
99
+ .orElse(this.addSubRule('subMonths', 'months', 'subtract'))
100
+ .orElse(this.addSubRule('subYears', 'years', 'subtract'))
101
+ .orElse(this.compareRule('isAfter', '> 0'))
102
+ .orElse(this.compareRule('isBefore', '< 0'))
103
+ .orElse(this.compareRule('isEqual', '=== 0'))
104
+ .orElse(this.differenceRule('differenceInDays', 'day', 'days'))
105
+ .orElse(this.differenceRule('differenceInHours', 'hour', 'hours'))
106
+ .orElse(this.differenceRule('differenceInMinutes', 'minute', 'minutes'))
107
+ .orElse(this.singleArgRule('startOfDay', d => template`Temporal.PlainDate.from(${d}).toPlainDateTime()`))
108
+ .orElse(this.singleArgRule('startOfMonth', d => template`Temporal.PlainDate.from(${d}).with({day: 1}).toPlainDateTime()`))
109
+ .orElse(this.singleArgRule('startOfYear', d => template`Temporal.PlainDate.from(${d}).with({month: 1, day: 1}).toPlainDateTime()`))
110
+ .orElse(this.singleArgRule('endOfDay', d => template`Temporal.PlainDate.from(${d}).toPlainDateTime({hour: 23, minute: 59, second: 59, millisecond: 999})`))
111
+ .orElse(this.endOfMonthRule())
112
+ .orElse(this.singleArgRule('endOfYear', d => template`Temporal.PlainDate.from(${d}).with({month: 12, day: 31}).toPlainDateTime({hour: 23, minute: 59, second: 59, millisecond: 999})`));
181
113
  }
182
114
 
183
115
  private addSubRule(fnName: string, unit: string, method: 'add' | 'subtract'): RewriteRule {
184
116
  const date = capture();
185
117
  const amount = capture();
186
118
  return rewrite(() => ({
187
- before: pattern`${raw(fnName)}(${date}, ${amount})`,
188
- after: template`Temporal.PlainDate.from(${date}).${raw(method)}({${raw(unit)}: ${amount}})`
119
+ before: pattern`${raw(fnName)}(${date}, ${amount})`.configure(DATE_FNS_CONFIG),
120
+ after: template`Temporal.PlainDate.from(${date}).${raw(method)}({${raw(unit)}: ${amount}})`.configure(TEMPORAL_CONFIG)
189
121
  }));
190
122
  }
191
123
 
@@ -193,33 +125,39 @@ class DateFnsToTemporalVisitor extends JavaScriptVisitor<ExecutionContext> {
193
125
  const a = capture();
194
126
  const b = capture();
195
127
  return rewrite(() => ({
196
- before: pattern`${raw(fnName)}(${a}, ${b})`,
197
- after: template`Temporal.PlainDateTime.compare(${a}, ${b}) ${raw(operator)}`
128
+ before: pattern`${raw(fnName)}(${a}, ${b})`.configure(DATE_FNS_CONFIG),
129
+ after: template`Temporal.PlainDateTime.compare(${a}, ${b}) ${raw(operator)}`.configure(TEMPORAL_CONFIG)
198
130
  }));
199
131
  }
200
132
 
201
133
  private differenceRule(fnName: string, largestUnit: string, field: string): RewriteRule {
202
134
  const a = capture();
203
135
  const b = capture();
136
+ // Wrap both operands in `Temporal.PlainDateTime.from(...)` like the arithmetic rules:
137
+ // `since` is an instance method, so a bare string/value operand (the common date-fns
138
+ // input) would otherwise throw `x.since is not a function`.
204
139
  return rewrite(() => ({
205
- before: pattern`${raw(fnName)}(${a}, ${b})`,
206
- after: template`${a}.since(${b}, {largestUnit: "${raw(largestUnit)}"}).${raw(field)}`
140
+ before: pattern`${raw(fnName)}(${a}, ${b})`.configure(DATE_FNS_CONFIG),
141
+ after: template`Temporal.PlainDateTime.from(${a}).since(Temporal.PlainDateTime.from(${b}), {largestUnit: "${raw(largestUnit)}"}).${raw(field)}`.configure(TEMPORAL_CONFIG)
207
142
  }));
208
143
  }
209
144
 
210
- private singleArgRule(fnName: string, prefix: string, suffix: string): RewriteRule {
145
+ // Standard `fn(date)` -> Temporal rule. The caller supplies the `after` as a real template
146
+ // (`d => template\`...\``) rather than raw prefix/suffix code fragments, so each transform is
147
+ // a single balanced, readable, configurable template.
148
+ private singleArgRule(fnName: string, buildAfter: (date: ReturnType<typeof capture>) => ReturnType<typeof template>): RewriteRule {
211
149
  const date = capture();
212
150
  return rewrite(() => ({
213
- before: pattern`${raw(fnName)}(${date})`,
214
- after: template`${raw(prefix)}${date}${raw(suffix)}`
151
+ before: pattern`${raw(fnName)}(${date})`.configure(DATE_FNS_CONFIG),
152
+ after: buildAfter(date).configure(TEMPORAL_CONFIG)
215
153
  }));
216
154
  }
217
155
 
218
- private endOfMonthRule(fnName: string = 'endOfMonth'): RewriteRule {
156
+ private endOfMonthRule(): RewriteRule {
219
157
  const date = capture();
220
158
  return rewrite(() => ({
221
- before: pattern`${raw(fnName)}(${date})`,
222
- after: template`((d) => d.with({day: d.daysInMonth}).toPlainDateTime({hour: 23, minute: 59, second: 59, millisecond: 999}))(Temporal.PlainDate.from(${date}))`
159
+ before: pattern`endOfMonth(${date})`.configure(DATE_FNS_CONFIG),
160
+ after: template`((d) => d.with({day: d.daysInMonth}).toPlainDateTime({hour: 23, minute: 59, second: 59, millisecond: 999}))(Temporal.PlainDate.from(${date}))`.configure(TEMPORAL_CONFIG)
223
161
  }));
224
162
  }
225
163
  }
@@ -26,7 +26,7 @@ import {
26
26
  RewriteRule,
27
27
  template
28
28
  } from "@openrewrite/rewrite/javascript";
29
- import {J, isIdentifier, isLiteral} from "@openrewrite/rewrite/java";
29
+ import {J, isLiteral} from "@openrewrite/rewrite/java";
30
30
 
31
31
  const UNIT_MAP: Record<string, string> = {
32
32
  'years': 'years', 'year': 'years', 'y': 'years',
@@ -39,13 +39,82 @@ const UNIT_MAP: Record<string, string> = {
39
39
  'milliseconds': 'milliseconds', 'millisecond': 'milliseconds', 'ms': 'milliseconds',
40
40
  };
41
41
 
42
- // Moment's startOf() zeroes time components; round-trip through PlainDate to achieve this
42
+ // Moment's startOf() zeroes the smaller time components. day/month/year round-trip through
43
+ // PlainDate to drop the whole time-of-day; hour/minute/second keep the date and zero only the
44
+ // sub-unit fields. ('week' and 'quarter' need ISO-week / quarter math and are intentionally
45
+ // left unmapped, so those calls are passed through unchanged rather than mistranslated.)
43
46
  const STARTOF_MAP: Record<string, string> = {
44
47
  'day': '.toPlainDate().toPlainDateTime()',
45
48
  'month': '.with({day: 1}).toPlainDate().toPlainDateTime()',
46
49
  'year': '.with({month: 1, day: 1}).toPlainDate().toPlainDateTime()',
50
+ 'hour': '.with({minute: 0, second: 0, millisecond: 0, microsecond: 0, nanosecond: 0})',
51
+ 'minute': '.with({second: 0, millisecond: 0, microsecond: 0, nanosecond: 0})',
52
+ 'second': '.with({millisecond: 0, microsecond: 0, nanosecond: 0})',
47
53
  };
48
54
 
55
+ // Attribution context for the Temporal nodes this recipe generates. Applying this to a
56
+ // creation template (e.g. `Temporal.Instant.from(x)`) gives the generated MethodInvocation a
57
+ // resolvable `methodType` whose `returnType` is the Temporal class — which is how downstream
58
+ // rules (comparison dispatch, clone stripping) recognise their receiver's type within the same
59
+ // pass. The polyfill types are used purely for attribution; no import is added to the output.
60
+ const TEMPORAL_CONFIG = {
61
+ context: ['import { Temporal } from "@js-temporal/polyfill";'],
62
+ dependencies: {'@js-temporal/polyfill': '^0.5.1'}
63
+ };
64
+
65
+ // Attribution context for matching the moment creation calls by symbol identity rather than by
66
+ // name. With this applied (and lenient matching off), `moment(...)` / `moment.utc(...)` patterns
67
+ // match only calls that resolve to moment's default export — including aliased default imports
68
+ // (`import m from 'moment'`) and ignoring unrelated local/imported functions that share the name.
69
+ // This requires the source to be type-attributed (moment installed). The import is removed from
70
+ // the output.
71
+ const MOMENT_CONFIG = {
72
+ context: ['import moment from "moment";'],
73
+ dependencies: {'moment': '^2.30.0'},
74
+ lenientTypeMatching: false
75
+ };
76
+
77
+ // True if `type`'s fully-qualified name matches one of the given class simple names. FQNs are
78
+ // package-qualified (e.g. `@js-temporal/polyfill.Instant`, `moment.Moment`), so we match on the
79
+ // simple-name suffix rather than an exact string.
80
+ function typeNameMatches(type: any, ...simpleNames: string[]): boolean {
81
+ const fqn: unknown = type?.fullyQualifiedName ?? type?.classFqn ?? type?.className;
82
+ if (typeof fqn !== 'string') return false;
83
+ return simpleNames.some(name => fqn === name || fqn.endsWith('.' + name));
84
+ }
85
+
86
+ // True if the node is a Temporal expression of one of the given classes. The attribution lives
87
+ // on the receiver's `methodType.returnType` (a transformed `Temporal.X.from(...)` call), since
88
+ // such nodes carry no `.type`.
89
+ function isTemporalReturnType(node: any, ...simpleNames: string[]): boolean {
90
+ return typeNameMatches(node?.methodType?.returnType, ...simpleNames);
91
+ }
92
+
93
+ // True when `node` is a date value this recipe owns and may transform a method call on. Shapes:
94
+ // - inline `moment(x).<m>()` — the receiver is already transformed to `Temporal.PlainDateTime`
95
+ // / `Temporal.Instant`, carrying the Temporal type on `methodType.returnType`;
96
+ // - variable `const m = moment(x); m.<m>()` — the receiver is an identifier still typed as
97
+ // moment's `Moment` on `.type` (requires the source to be type-attributed, i.e. moment
98
+ // installed);
99
+ // - chained `moment().add(...).startOf(...)` — the immediate receiver is an intermediate call
100
+ // (e.g. `.add(...)`) this recipe just produced. Such nodes attribute as Unknown, but their
101
+ // `.select` chain bottoms out in a moment/Temporal value, so we walk down the receiver chain.
102
+ // Used to gate the receiver-matching rules (comparison fallback, add/subtract, startOf, clone) so
103
+ // an unrelated `someObj.add(...)` / `config.clone()` (Unknown receiver, non-date root) is left
104
+ // untouched.
105
+ function isMomentOrTemporalReceiver(node: any): boolean {
106
+ if (!node) return false;
107
+ if (isTemporalReturnType(node, 'Instant', 'PlainDateTime')) return true;
108
+ if (typeNameMatches(node?.type, 'Moment')) return true;
109
+ // Chained transform: descend into the receiver (`.select`, unwrapping RightPadded) of a
110
+ // method invocation whose own type didn't match, looking for a date-typed root.
111
+ if (node?.kind?.includes?.('MethodInvocation')) {
112
+ const select = node.select?.element ?? node.select;
113
+ if (select && select !== node) return isMomentOrTemporalReceiver(select);
114
+ }
115
+ return false;
116
+ }
117
+
49
118
  export class MomentToTemporal extends Recipe {
50
119
  name = "org.openrewrite.javascript.migrate.moment.moment-to-temporal";
51
120
  displayName = "Migrate Moment.js to Temporal API";
@@ -57,114 +126,103 @@ export class MomentToTemporal extends Recipe {
57
126
  }
58
127
 
59
128
  class MomentToTemporalVisitor extends JavaScriptVisitor<ExecutionContext> {
60
- private momentImportName: string | undefined;
61
- private rules: RewriteRule | undefined;
129
+ private readonly rules: RewriteRule = this.buildRules();
62
130
 
63
131
  protected override async visitJsCompilationUnit(cu: JS.CompilationUnit, ctx: ExecutionContext): Promise<J | undefined> {
64
- this.momentImportName = undefined;
65
- this.rules = undefined;
66
-
67
- for (const stmt of cu.statements) {
68
- const s = stmt.element ?? stmt;
69
- if (s.kind === JS.Kind.Import) {
70
- this.detectMomentImport(s as JS.Import);
71
- }
72
- }
73
-
74
- if (!this.momentImportName) {
75
- return cu;
76
- }
77
-
78
- this.rules = this.buildRules();
79
-
80
132
  const result = await super.visitJsCompilationUnit(cu, ctx);
81
-
82
- maybeRemoveImport(this, 'moment', 'default');
83
-
133
+ // After transforming the creation calls, the moment import is unused; drop it.
134
+ maybeRemoveImport(this, 'moment');
84
135
  return result;
85
136
  }
86
137
 
87
- private detectMomentImport(imp: JS.Import): void {
88
- const moduleSpecifier = imp.moduleSpecifier;
89
- if (!moduleSpecifier) return;
90
-
91
- const literal = moduleSpecifier.element;
92
- if (literal.kind !== J.Kind.Literal) return;
93
- if ((literal as J.Literal).value !== 'moment') return;
94
-
95
- const importClause = imp.importClause;
96
- if (!importClause?.name) return;
97
-
98
- const nameElem = importClause.name.element;
99
- if (isIdentifier(nameElem)) {
100
- this.momentImportName = nameElem.simpleName;
101
- }
102
- }
103
-
104
138
  protected override async visitFunctionCall(functionCall: JS.FunctionCall, ctx: ExecutionContext): Promise<J | undefined> {
105
139
  functionCall = await super.visitFunctionCall(functionCall, ctx) as JS.FunctionCall;
106
- if (!this.momentImportName || !this.rules) return functionCall;
107
140
  return await this.rules.tryOn(this.cursor, functionCall) || functionCall;
108
141
  }
109
142
 
110
143
  protected override async visitMethodInvocation(method: J.MethodInvocation, ctx: ExecutionContext): Promise<J | undefined> {
111
144
  method = await super.visitMethodInvocation(method, ctx) as J.MethodInvocation;
112
- if (!this.momentImportName || !this.rules) return method;
113
145
  return await this.rules.tryOn(this.cursor, method) || method;
114
146
  }
115
147
 
116
148
  private buildRules(): RewriteRule {
117
- return this.createNoArgRule()
118
- .orElse(this.createOneArgRule())
119
- .orElse(this.utcNoArgRule())
120
- .orElse(this.utcOneArgRule())
149
+ return rewrite(() => ({
150
+ // moment() -> Temporal.Now.plainDateTimeISO()
151
+ before: pattern`moment()`.configure(MOMENT_CONFIG),
152
+ after: template`Temporal.Now.plainDateTimeISO()`.configure(TEMPORAL_CONFIG)
153
+ })).orElse(rewrite(() => {
154
+ // moment(x) -> Temporal.PlainDateTime.from(x)
155
+ const arg = capture();
156
+ return {
157
+ before: pattern`moment(${arg})`.configure(MOMENT_CONFIG),
158
+ after: template`Temporal.PlainDateTime.from(${arg})`.configure(TEMPORAL_CONFIG)
159
+ };
160
+ })).orElse(rewrite(() => ({
161
+ // moment.utc() -> Temporal.Now.instant()
162
+ before: pattern`moment.utc()`.configure(MOMENT_CONFIG),
163
+ after: template`Temporal.Now.instant()`.configure(TEMPORAL_CONFIG)
164
+ }))).orElse(rewrite(() => {
165
+ // moment.utc(x) -> Temporal.Instant.from(x)
166
+ const arg = capture();
167
+ return {
168
+ before: pattern`moment.utc(${arg})`.configure(MOMENT_CONFIG),
169
+ after: template`Temporal.Instant.from(${arg})`.configure(TEMPORAL_CONFIG)
170
+ };
171
+ }))
121
172
  .orElse(this.addSubtractRule('add'))
122
173
  .orElse(this.addSubtractRule('subtract'))
174
+ // For each comparison, try the Instant-typed rule first; fall back to PlainDateTime.
175
+ .orElse(this.instantComparisonRule('isBefore', '< 0'))
123
176
  .orElse(this.comparisonRule('isBefore', '< 0'))
177
+ .orElse(this.instantComparisonRule('isAfter', '> 0'))
124
178
  .orElse(this.comparisonRule('isAfter', '> 0'))
179
+ .orElse(this.instantComparisonRule('isSame', '=== 0'))
125
180
  .orElse(this.comparisonRule('isSame', '=== 0'))
126
- .orElse(this.cloneRule())
127
- .orElse(this.startOfRule());
181
+ .orElse(rewrite(() => {
182
+ // .clone() — Temporal (and Moment) values this recipe owns are immutable / safe to
183
+ // alias, so the clone is redundant: return the receiver. Gated on the receiver being
184
+ // a date value this recipe owns so arbitrary `config.clone()` is left untouched.
185
+ // Conservative: a receiver whose type can't be resolved (e.g. the result of a
186
+ // chained `.add(...)`, which attributes as Unknown) is left as-is.
187
+ const obj = capture({constraint: (n: any) => isMomentOrTemporalReceiver(n)});
188
+ return {
189
+ before: pattern`${obj}.clone()`,
190
+ after: template`${obj}`
191
+ };
192
+ }))
193
+ .orElse(rewrite(() => {
194
+ // .startOf(unit) — needs dynamic after for STARTOF_MAP lookup.
195
+ const obj = capture({constraint: (n: any) => isMomentOrTemporalReceiver(n)});
196
+ const unit = capture({
197
+ constraint: (n: any) => isLiteral(n) && typeof n.value === 'string' && STARTOF_MAP[n.value] !== undefined
198
+ });
199
+ return {
200
+ before: pattern`${obj}.startOf(${unit})`,
201
+ after: (match) => {
202
+ const unitStr = (match.get(unit) as J.Literal).value as string;
203
+ return template`${obj}${raw(STARTOF_MAP[unitStr])}`.configure(TEMPORAL_CONFIG);
204
+ }
205
+ };
206
+ }));
128
207
  }
129
208
 
130
- // moment() -> Temporal.Now.plainDateTimeISO()
131
- private createNoArgRule(): RewriteRule {
132
- return rewrite(() => ({
133
- before: pattern`${raw(this.momentImportName!)}()`,
134
- after: template`Temporal.Now.plainDateTimeISO()`
135
- }));
136
- }
137
-
138
- // moment(x) -> Temporal.PlainDateTime.from(x)
139
- private createOneArgRule(): RewriteRule {
140
- const arg = capture();
141
- return rewrite(() => ({
142
- before: pattern`${raw(this.momentImportName!)}(${arg})`,
143
- after: template`Temporal.PlainDateTime.from(${arg})`
144
- }));
145
- }
146
-
147
- // moment.utc() -> Temporal.Now.instant()
148
- private utcNoArgRule(): RewriteRule {
149
- return rewrite(() => ({
150
- before: pattern`${raw(this.momentImportName!)}.utc()`,
151
- after: template`Temporal.Now.instant()`
152
- }));
153
- }
154
-
155
- // moment.utc(x) -> Temporal.Instant.from(x)
156
- private utcOneArgRule(): RewriteRule {
157
- const arg = capture();
209
+ // .isBefore/.isAfter/.isSame on an Instant receiver -> Temporal.Instant.compare(...).
210
+ // Matched only when the receiver resolves to a Temporal.Instant (from moment.utc(...)).
211
+ private instantComparisonRule(methodName: string, operator: string): RewriteRule {
212
+ const a = capture({
213
+ constraint: (n: any) => isTemporalReturnType(n, 'Instant')
214
+ });
215
+ const b = capture();
158
216
  return rewrite(() => ({
159
- before: pattern`${raw(this.momentImportName!)}.utc(${arg})`,
160
- after: template`Temporal.Instant.from(${arg})`
217
+ before: pattern`${a}.${raw(methodName)}(${b})`,
218
+ after: template`Temporal.Instant.compare(${a}, ${b}) ${raw(operator)}`.configure(TEMPORAL_CONFIG)
161
219
  }));
162
220
  }
163
221
 
164
222
  // .add(amount, unit) / .subtract(amount, unit)
165
223
  private addSubtractRule(methodName: 'add' | 'subtract'): RewriteRule {
166
224
  return rewrite(() => {
167
- const obj = capture();
225
+ const obj = capture({constraint: (n: any) => isMomentOrTemporalReceiver(n)});
168
226
  const amount = capture();
169
227
  const unit = capture({
170
228
  constraint: (n: any) => isLiteral(n) && typeof n.value === 'string' && UNIT_MAP[n.value] !== undefined
@@ -173,45 +231,21 @@ class MomentToTemporalVisitor extends JavaScriptVisitor<ExecutionContext> {
173
231
  before: pattern`${obj}.${raw(methodName)}(${amount}, ${unit})`,
174
232
  after: (match) => {
175
233
  const unitStr = (match.get(unit) as J.Literal).value as string;
176
- return template`${obj}.${raw(methodName)}({${raw(UNIT_MAP[unitStr])}: ${amount}})`;
234
+ return template`${obj}.${raw(methodName)}({${raw(UNIT_MAP[unitStr])}: ${amount}})`.configure(TEMPORAL_CONFIG);
177
235
  }
178
236
  };
179
237
  });
180
238
  }
181
239
 
182
- // .isBefore(other) / .isAfter(other) / .isSame(other)
240
+ // .isBefore(other) / .isAfter(other) / .isSame(other) — PlainDateTime fallback.
241
+ // Reached only after the Instant-typed rule declines (non-Instant receiver). Constrained to a
242
+ // moment/Temporal receiver so an unrelated `someObj.isBefore(x)` is left untouched.
183
243
  private comparisonRule(methodName: string, operator: string): RewriteRule {
184
- const a = capture();
244
+ const a = capture({constraint: (n: any) => isMomentOrTemporalReceiver(n)});
185
245
  const b = capture();
186
246
  return rewrite(() => ({
187
247
  before: pattern`${a}.${raw(methodName)}(${b})`,
188
- after: template`Temporal.PlainDateTime.compare(${a}, ${b}) ${raw(operator)}`
189
- }));
190
- }
191
-
192
- // .clone() — Temporal is immutable, just return the receiver
193
- private cloneRule(): RewriteRule {
194
- const obj = capture();
195
- return rewrite(() => ({
196
- before: pattern`${obj}.clone()`,
197
- after: template`${obj}`
248
+ after: template`Temporal.PlainDateTime.compare(${a}, ${b}) ${raw(operator)}`.configure(TEMPORAL_CONFIG)
198
249
  }));
199
250
  }
200
-
201
- // .startOf(unit) — needs dynamic after for STARTOF_MAP lookup
202
- private startOfRule(): RewriteRule {
203
- return rewrite(() => {
204
- const obj = capture();
205
- const unit = capture({
206
- constraint: (n: any) => isLiteral(n) && typeof n.value === 'string' && STARTOF_MAP[n.value] !== undefined
207
- });
208
- return {
209
- before: pattern`${obj}.startOf(${unit})`,
210
- after: (match) => {
211
- const unitStr = (match.get(unit) as J.Literal).value as string;
212
- return template`${obj}${raw(STARTOF_MAP[unitStr])}`;
213
- }
214
- };
215
- });
216
- }
217
251
  }