Skip to content

Commit 04963fa

Browse files
authored
Merge pull request #217 from github/version-4
Warn on use of deprecated elements, functions and properties
2 parents f35461a + 74a0ae4 commit 04963fa

12 files changed

+80
-66
lines changed

src/datetimeformat-ponyfill.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ export class DateTimeFormat implements Intl.DateTimeFormat {
33
#options: Intl.ResolvedDateTimeFormatOptions
44

55
constructor(locale: string, options: Intl.DateTimeFormatOptions) {
6+
// eslint-disable-next-line no-console
7+
console.warn(
8+
`time-elements v5.0.0 will no longer ship with DateTimeFormat ponyfill. It must be polyfilled for continued support in older browsers`
9+
)
610
this.#options = {
711
locale: 'en',
812
calendar: 'gregory',

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ import TimeAgoElement from './time-ago-element-define.js'
44
import TimeUntilElement from './time-until-element-define.js'
55

66
export {LocalTimeElement, RelativeTimeElement, TimeAgoElement, TimeUntilElement}
7+
export default RelativeTimeElement
8+
export * from './relative-time-element-define.js'

src/local-time-element-define.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import LocalTimeElement from './local-time-element.js'
33
const root = (typeof globalThis !== 'undefined' ? globalThis : window) as typeof window
44
try {
55
customElements.define('local-time', LocalTimeElement)
6-
root.LocalTimeElement = LocalTimeElement
6+
root.LocalTimeElement = LocalTimeElement as unknown as never
77
} catch (e: unknown) {
88
if (
99
!(root.DOMException && e instanceof DOMException && e.name === 'NotSupportedError') &&
@@ -13,20 +13,9 @@ try {
1313
}
1414
}
1515

16-
type JSXBaseElement = JSX.IntrinsicElements extends {span: unknown}
17-
? JSX.IntrinsicElements['span']
18-
: Record<string, unknown>
1916
declare global {
2017
interface Window {
21-
LocalTimeElement: typeof LocalTimeElement
22-
}
23-
interface HTMLElementTagNameMap {
24-
'local-time': LocalTimeElement
25-
}
26-
namespace JSX {
27-
interface IntrinsicElements {
28-
['local-time']: JSXBaseElement & Partial<Omit<LocalTimeElement, keyof HTMLElement>>
29-
}
18+
LocalTimeElement: never
3019
}
3120
}
3221

src/local-time-element.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
11
import RelativeTimeElement from './relative-time-element.js'
22

33
export default class LocalTimeElement extends RelativeTimeElement {
4+
constructor() {
5+
super()
6+
// eslint-disable-next-line no-console
7+
console.warn('local-time element is deprecated and will be removed in v5.0.0')
8+
}
9+
410
get prefix() {
511
return ''
612
}
713

814
get format() {
915
if (super.format.includes('%')) return super.format
10-
if (!this.day && !this.month && !this.year && !this.timeZoneName && !this.hour && !this.minute) return ''
16+
if (!this.day && !this.month && !this.year && !this.timeZoneName && !this.hour && !this.minute) {
17+
return '' as unknown as 'auto'
18+
}
1119
return 'auto'
1220
}
1321

src/relative-time-element.ts

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const DateTimeFormat = supportsIntlDatetime ? Intl.DateTimeFormat : DateTimeForm
1212
const supportsIntlRelativeTime = typeof Intl !== 'undefined' && 'RelativeTimeFormat' in Intl
1313
const RelativeTimeFormat = supportsIntlRelativeTime ? Intl.RelativeTimeFormat : RelativeTimeFormatPonyfill
1414

15-
export type Format = 'auto' | 'micro' | 'elapsed' | string
15+
export type Format = 'auto' | 'micro' | 'elapsed'
1616
export type Tense = 'auto' | 'past' | 'future'
1717

1818
export class RelativeTimeUpdatedEvent extends Event {
@@ -113,7 +113,7 @@ export default class RelativeTimeElement extends HTMLElement implements Intl.Dat
113113
// value takes precedence over this custom format.
114114
//
115115
// Returns a formatted time String.
116-
getFormattedTitle(): string | undefined {
116+
#getFormattedTitle(): string | undefined {
117117
const date = this.date
118118
if (!date) return
119119

@@ -127,7 +127,13 @@ export default class RelativeTimeElement extends HTMLElement implements Intl.Dat
127127
}).format(date)
128128
}
129129

130-
getFormattedDate(now = new Date()): string | undefined {
130+
private getFormattedTitle(): string | undefined {
131+
// eslint-disable-next-line no-console
132+
console.warn(`Calling getFormattedTitle is deprecated and will be removed in v5.0.0`)
133+
return this.#getFormattedTitle()
134+
}
135+
136+
#getFormattedDate(now = new Date()): string | undefined {
131137
const date = this.date
132138
if (!date) return
133139
const format = this.format
@@ -168,6 +174,12 @@ export default class RelativeTimeElement extends HTMLElement implements Intl.Dat
168174
return `${this.prefix} ${formatter.format(date)}`.trim()
169175
}
170176

177+
private getFormattedDate(now = new Date()): string | undefined {
178+
// eslint-disable-next-line no-console
179+
console.warn(`Calling getFormattedTitle is deprecated and will be removed in v5.0.0`)
180+
return this.#getFormattedDate(now)
181+
}
182+
171183
get second() {
172184
const second = this.getAttribute('second')
173185
if (second === 'numeric' || second === '2-digit') return second
@@ -301,11 +313,23 @@ export default class RelativeTimeElement extends HTMLElement implements Intl.Dat
301313
const format = this.getAttribute('format')
302314
if (format === 'micro') return 'micro'
303315
if (format === 'elapsed') return 'elapsed'
304-
if (format && format.includes('%')) return format
316+
if (format && format.includes('%')) {
317+
// eslint-disable-next-line no-console
318+
console.warn(
319+
`srftime formatting is deprecated and will be removed in v5.0.0. stftime formats will default to 'auto'`
320+
)
321+
return format as unknown as Format
322+
}
305323
return 'auto'
306324
}
307325

308326
set format(value: Format) {
327+
if (value && value.includes('%')) {
328+
// eslint-disable-next-line no-console
329+
console.warn(
330+
`srftime formatting is deprecated and will be removed in v5.0.0. stftime formats will default to 'auto'`
331+
)
332+
}
309333
this.setAttribute('format', value)
310334
}
311335

@@ -338,7 +362,7 @@ export default class RelativeTimeElement extends HTMLElement implements Intl.Dat
338362
attributeChangedCallback(attrName: string, oldValue: unknown, newValue: unknown): void {
339363
if (oldValue === newValue) return
340364
if (attrName === 'title') {
341-
this.#customTitle = newValue !== null && this.getFormattedTitle() !== newValue
365+
this.#customTitle = newValue !== null && this.#getFormattedTitle() !== newValue
342366
}
343367
if (!this.#updating && !(attrName === 'title' && this.#customTitle)) {
344368
this.#updating = (async () => {
@@ -355,11 +379,11 @@ export default class RelativeTimeElement extends HTMLElement implements Intl.Dat
355379
let newText: string = oldText
356380
const now = new Date()
357381
if (!this.#customTitle) {
358-
newTitle = this.getFormattedTitle() || ''
382+
newTitle = this.#getFormattedTitle() || ''
359383
if (newTitle) this.setAttribute('title', newTitle)
360384
}
361385

362-
newText = this.getFormattedDate(now) || ''
386+
newText = this.#getFormattedDate(now) || ''
363387
if (newText) {
364388
this.#renderRoot.textContent = newText
365389
} else if (this.shadowRoot === this.#renderRoot && this.textContent) {

src/relative-time-ponyfill.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
export class RelativeTimeFormat implements Intl.RelativeTimeFormat {
2+
constructor() {
3+
// eslint-disable-next-line no-console
4+
console.warn(
5+
`time-elements v5.0.0 will no longer ship with DateTimeFormat ponyfill. It must be polyfilled for continued support in older browsers`
6+
)
7+
}
8+
29
formatToParts() {
310
return []
411
}

src/time-ago-element-define.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import TimeAgoElement from './time-ago-element.js'
33
const root = (typeof globalThis !== 'undefined' ? globalThis : window) as typeof window
44
try {
55
customElements.define('time-ago', TimeAgoElement)
6-
root.TimeAgoElement = TimeAgoElement
6+
root.TimeAgoElement = TimeAgoElement as unknown as never
77
} catch (e: unknown) {
88
if (
99
!(root.DOMException && e instanceof DOMException && e.name === 'NotSupportedError') &&
@@ -13,20 +13,9 @@ try {
1313
}
1414
}
1515

16-
type JSXBaseElement = JSX.IntrinsicElements extends {span: unknown}
17-
? JSX.IntrinsicElements['span']
18-
: Record<string, unknown>
1916
declare global {
2017
interface Window {
21-
TimeAgoElement: typeof TimeAgoElement
22-
}
23-
interface HTMLElementTagNameMap {
24-
'time-ago': TimeAgoElement
25-
}
26-
namespace JSX {
27-
interface IntrinsicElements {
28-
['time-ago']: JSXBaseElement & Partial<Omit<TimeAgoElement, keyof HTMLElement>>
29-
}
18+
TimeAgoElement: never
3019
}
3120
}
3221

src/time-ago-element.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@ import type {Tense} from './relative-time-element.js'
22
import RelativeTimeElement from './relative-time-element.js'
33

44
export default class TimeAgoElement extends RelativeTimeElement {
5+
constructor() {
6+
super()
7+
// eslint-disable-next-line no-console
8+
console.warn('time-ago element is deprecated and will be removed in v5.0.0')
9+
}
10+
511
get tense(): Tense {
612
return 'past'
713
}

src/time-until-element-define.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import TimeUntilElement from './time-until-element.js'
33
const root = (typeof globalThis !== 'undefined' ? globalThis : window) as typeof window
44
try {
55
customElements.define('time-until', TimeUntilElement)
6-
root.TimeUntilElement = TimeUntilElement
6+
root.TimeUntilElement = TimeUntilElement as unknown as never
77
} catch (e: unknown) {
88
if (
99
!(root.DOMException && e instanceof DOMException && e.name === 'NotSupportedError') &&
@@ -13,20 +13,9 @@ try {
1313
}
1414
}
1515

16-
type JSXBaseElement = JSX.IntrinsicElements extends {span: unknown}
17-
? JSX.IntrinsicElements['span']
18-
: Record<string, unknown>
1916
declare global {
2017
interface Window {
21-
TimeUntilElement: typeof TimeUntilElement
22-
}
23-
interface HTMLElementTagNameMap {
24-
'time-until': TimeUntilElement
25-
}
26-
namespace JSX {
27-
interface IntrinsicElements {
28-
['time-until']: JSXBaseElement & Partial<Omit<TimeUntilElement, keyof HTMLElement>>
29-
}
18+
TimeUntilElement: never
3019
}
3120
}
3221

src/time-until-element.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@ import type {Tense} from './relative-time-element.js'
22
import RelativeTimeElement from './relative-time-element.js'
33

44
export default class TimeUntilElement extends RelativeTimeElement {
5+
constructor() {
6+
super()
7+
// eslint-disable-next-line no-console
8+
console.warn('time-ago element is deprecated and will be removed in v5.0.0')
9+
}
10+
511
get tense(): Tense {
612
return 'future'
713
}

0 commit comments

Comments
 (0)