refactored date.js to use the generic make_reactive utility

pull/11504/head
godzylinux 2 years ago committed by FoHoOV
parent 7ac79e6b6c
commit 0ccda208fe

@ -1,102 +1,23 @@
import { source, set } from '../internal/client/reactivity/sources.js'; import { make_reactive } from './utils.js';
import { get } from '../internal/client/runtime.js';
export const ReactiveDate = make_reactive(Date, {
/** @type {Array<keyof Date>} */ write_properties: [
const read = [ 'setDate',
'getDate', 'setFullYear',
'getDay', 'setHours',
'getFullYear', 'setMilliseconds',
'getHours', 'setMinutes',
'getMilliseconds', 'setMonth',
'getMinutes', 'setSeconds',
'getMonth', 'setTime',
'getSeconds', 'setUTCDate',
'getTime', 'setUTCFullYear',
'getTimezoneOffset', 'setUTCHours',
'getUTCDate', 'setUTCMilliseconds',
'getUTCDay', 'setUTCMinutes',
'getUTCFullYear', 'setUTCMonth',
'getUTCHours', 'setUTCSeconds',
'getUTCMilliseconds', // @ts-expect-error this is deprecated
'getUTCMinutes', 'setYear'
'getUTCMonth', ]
'getUTCSeconds', });
// @ts-expect-error this is deprecated
'getYear',
'toDateString',
'toISOString',
'toJSON',
'toLocaleDateString',
'toLocaleString',
'toLocaleTimeString',
'toString',
'toTimeString',
'toUTCString'
];
/** @type {Array<keyof Date>} */
const write = [
'setDate',
'setFullYear',
'setHours',
'setMilliseconds',
'setMinutes',
'setMonth',
'setSeconds',
'setTime',
'setUTCDate',
'setUTCFullYear',
'setUTCHours',
'setUTCMilliseconds',
'setUTCMinutes',
'setUTCMonth',
'setUTCSeconds',
// @ts-expect-error this is deprecated
'setYear'
];
var inited = false;
export class ReactiveDate extends Date {
#raw_time = source(super.getTime());
// We init as part of the first instance so that we can treeshake this class
#init() {
if (!inited) {
inited = true;
const proto = ReactiveDate.prototype;
const date_proto = Date.prototype;
for (const method of read) {
// @ts-ignore
proto[method] = function (...args) {
get(this.#raw_time);
// @ts-ignore
return date_proto[method].apply(this, args);
};
}
for (const method of write) {
// @ts-ignore
proto[method] = function (...args) {
// @ts-ignore
const v = date_proto[method].apply(this, args);
const time = date_proto.getTime.call(this);
if (time !== this.#raw_time.v) {
set(this.#raw_time, time);
}
return v;
};
}
}
}
/**
* @param {any[]} values
*/
constructor(...values) {
// @ts-ignore
super(...values);
this.#init();
}
}

Loading…
Cancel
Save