Home / File/ date.js — svelte Source File

date.js — svelte Source File

Architecture documentation for date.js, a javascript file in the svelte codebase. 10 imports, 1 dependents.

File javascript SharedInternal BitFlags 10 imports 1 dependents 1 classes

Entity Profile

Dependency Diagram

graph LR
  7c09b4ab_171c_0277_b8c0_61940f33ff53["date.js"]
  a90e5ee7_62bf_5257_b6d7_6579a13ff90b["index.js"]
  7c09b4ab_171c_0277_b8c0_61940f33ff53 --> a90e5ee7_62bf_5257_b6d7_6579a13ff90b
  e5c35d51_28d8_9054_923d_b7f82a3c8dc2["sources.js"]
  7c09b4ab_171c_0277_b8c0_61940f33ff53 --> e5c35d51_28d8_9054_923d_b7f82a3c8dc2
  63ee8247_ada4_9f1d_e139_0c1167cd5b1c["set"]
  7c09b4ab_171c_0277_b8c0_61940f33ff53 --> 63ee8247_ada4_9f1d_e139_0c1167cd5b1c
  39208392_58c1_7201_b748_aa74d97cadb9["state"]
  7c09b4ab_171c_0277_b8c0_61940f33ff53 --> 39208392_58c1_7201_b748_aa74d97cadb9
  2696eb67_452f_4c32_3e13_ee172192b366["tracing.js"]
  7c09b4ab_171c_0277_b8c0_61940f33ff53 --> 2696eb67_452f_4c32_3e13_ee172192b366
  4dfcf957_8573_ff55_bd31_4181227109e3["tag"]
  7c09b4ab_171c_0277_b8c0_61940f33ff53 --> 4dfcf957_8573_ff55_bd31_4181227109e3
  bde4209f_8ffc_1594_4024_b1835a44bcf6["runtime.js"]
  7c09b4ab_171c_0277_b8c0_61940f33ff53 --> bde4209f_8ffc_1594_4024_b1835a44bcf6
  a08b6cc5_af73_1be4_d02f_3113cf8a8305["get"]
  7c09b4ab_171c_0277_b8c0_61940f33ff53 --> a08b6cc5_af73_1be4_d02f_3113cf8a8305
  311ef9f4_9b68_c178_c1db_3b8696f7d964["set_active_reaction"]
  7c09b4ab_171c_0277_b8c0_61940f33ff53 --> 311ef9f4_9b68_c178_c1db_3b8696f7d964
  c9866d91_a204_fa55_a9e3_6bcc6aaaec1e["esm-env"]
  7c09b4ab_171c_0277_b8c0_61940f33ff53 --> c9866d91_a204_fa55_a9e3_6bcc6aaaec1e
  3654304d_e89d_c28d_2667_5d1a3440f6d3["date.test.ts"]
  3654304d_e89d_c28d_2667_5d1a3440f6d3 --> 7c09b4ab_171c_0277_b8c0_61940f33ff53
  style 7c09b4ab_171c_0277_b8c0_61940f33ff53 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

/** @import { Source } from '#client' */
import { derived } from '../internal/client/index.js';
import { set, state } from '../internal/client/reactivity/sources.js';
import { tag } from '../internal/client/dev/tracing.js';
import { active_reaction, get, set_active_reaction } from '../internal/client/runtime.js';
import { DEV } from 'esm-env';

var inited = false;

/**
 * A reactive version of the built-in [`Date`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) object.
 * Reading the date (whether with methods like `date.getTime()` or `date.toString()`, or via things like [`Intl.DateTimeFormat`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat))
 * in an [effect](https://svelte.dev/docs/svelte/$effect) or [derived](https://svelte.dev/docs/svelte/$derived)
 * will cause it to be re-evaluated when the value of the date changes.
 *
 * ```svelte
 * <script>
 * 	import { SvelteDate } from 'svelte/reactivity';
 *
 * 	const date = new SvelteDate();
 *
 * 	const formatter = new Intl.DateTimeFormat(undefined, {
 * 	  hour: 'numeric',
 * 	  minute: 'numeric',
 * 	  second: 'numeric'
 * 	});
 *
 * 	$effect(() => {
 * 		const interval = setInterval(() => {
 * 			date.setTime(Date.now());
 * 		}, 1000);
 *
 * 		return () => {
 * 			clearInterval(interval);
 * 		};
 * 	});
 * </script>
 *
 * <p>The time is {formatter.format(date)}</p>
 * ```
 */
export class SvelteDate extends Date {
	#time = state(super.getTime());

	/** @type {Map<keyof Date, Source<unknown>>} */
	#deriveds = new Map();

	#reaction = active_reaction;

	/** @param {any[]} params */
	constructor(...params) {
		// @ts-ignore
		super(...params);

		if (DEV) {
			tag(this.#time, 'SvelteDate.#time');
		}

		if (!inited) this.#init();
	}

	#init() {
		inited = true;

		var proto = SvelteDate.prototype;
		var date_proto = Date.prototype;

		var methods = /** @type {Array<keyof Date & string>} */ (
			Object.getOwnPropertyNames(date_proto)
		);

		for (const method of methods) {
			if (method.startsWith('get') || method.startsWith('to') || method === 'valueOf') {
				// @ts-ignore
				proto[method] = function (...args) {
					// don't memoize if there are arguments
					// @ts-ignore
					if (args.length > 0) {
						get(this.#time);
						// @ts-ignore
						return date_proto[method].apply(this, args);
					}

					var d = this.#deriveds.get(method);

					if (d === undefined) {
						// lazily create the derived, but as though it were being
						// created at the same time as the class instance
						const reaction = active_reaction;
						set_active_reaction(this.#reaction);

						d = derived(() => {
							get(this.#time);
							// @ts-ignore
							return date_proto[method].apply(this, args);
						});

						this.#deriveds.set(method, d);

						set_active_reaction(reaction);
					}

					return get(d);
				};
			}

			if (method.startsWith('set')) {
				// @ts-ignore
				proto[method] = function (...args) {
					// @ts-ignore
					var result = date_proto[method].apply(this, args);
					set(this.#time, date_proto.getTime.call(this));
					return result;
				};
			}
		}
	}
}

Subdomains

Classes

Frequently Asked Questions

What does date.js do?
date.js is a source file in the svelte codebase, written in javascript. It belongs to the SharedInternal domain, BitFlags subdomain.
What does date.js depend on?
date.js imports 10 module(s): esm-env, get, index.js, runtime.js, set, set_active_reaction, sources.js, state, and 2 more.
What files import date.js?
date.js is imported by 1 file(s): date.test.ts.
Where is date.js in the architecture?
date.js is located at packages/svelte/src/reactivity/date.js (domain: SharedInternal, subdomain: BitFlags, directory: packages/svelte/src/reactivity).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free