{"version":3,"file":"index.cjs","sources":["../src/timezone.js","../src/timezoneManager.js","../src/utils.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport ICAL from 'ical.js'\n\n/**\n * @class Timezone\n */\nexport default class Timezone {\n\n\t/**\n\t * Constructor\n\t *\n\t * @param {string | ICAL.Timezone | ICAL.Component} timezoneId Id of the timezone\n\t * @param {string?} ics The iCalendar timezone definition\n\t */\n\tconstructor(timezoneId, ics) {\n\n\t\t/**\n\t\t * Id of the timezone, used before initialising\n\t\t *\n\t\t * @type {string}\n\t\t * @private\n\t\t */\n\t\tthis._timezoneId = null\n\n\t\t/**\n\t\t * ICS representation of the timezone, used before initialising\n\t\t *\n\t\t * @type {string}\n\t\t * @private\n\t\t */\n\t\tthis._ics = null\n\n\t\t/**\n\t\t * @type {ICAL.Timezone|null}\n\t\t */\n\t\tthis._innerValue = null\n\n\t\t/**\n\t\t *\n\t\t * @type {boolean}\n\t\t * @private\n\t\t */\n\t\tthis._initialized = false\n\n\t\t// If the first parameter is already\n\t\t// an instance of ICAL.Timezone,\n\t\t// skip lazy loading\n\t\tif (timezoneId instanceof ICAL.Timezone) {\n\t\t\tthis._innerValue = timezoneId\n\t\t\tthis._initialized = true\n\t\t} else if (timezoneId instanceof ICAL.Component) {\n\t\t\tthis._innerValue = new ICAL.Timezone(timezoneId)\n\t\t\tthis._initialized = true\n\t\t} else {\n\t\t\tthis._timezoneId = timezoneId\n\t\t\tthis._ics = ics\n\t\t}\n\t}\n\n\t/**\n\t * Gets the timezone id\n\t *\n\t * @return {string}\n\t */\n\tget timezoneId() {\n\t\tif (this._initialized) {\n\t\t\treturn this._innerValue.tzid\n\t\t}\n\n\t\treturn this._timezoneId\n\t}\n\n\t/**\n\t * Gets the UTC Offset for a given date in this timezone\n\t *\n\t * @param {number} year Year of the date\n\t * @param {number} month Month of the date (1-based)\n\t * @param {number} day Day of the date\n\t * @param {number} hour Hour of the date\n\t * @param {number} minute Minute of the date\n\t * @param {number} second Second of the date\n\t * @return {number}\n\t */\n\toffsetForArray(year, month, day, hour, minute, second) {\n\t\tthis._initialize()\n\n\t\tconst time = new ICAL.Time({\n\t\t\tyear,\n\t\t\tmonth,\n\t\t\tday,\n\t\t\thour,\n\t\t\tminute,\n\t\t\tsecond,\n\t\t\tisDate: false,\n\t\t})\n\t\treturn this._innerValue.utcOffset(time)\n\t}\n\n\t/**\n\t * Converts a timestamp to an array of year, month, day, hour, minute, second.\n\t *\n\t * @param {number} ms Timestamp in milliseconds\n\t * @return {number[]}\n\t */\n\ttimestampToArray(ms) {\n\t\tthis._initialize()\n\n\t\t// just create a dummy object because fromUnixTime is not exposed on ICAL.Time\n\t\tconst time = ICAL.Time.fromData({\n\t\t\tyear: 1970,\n\t\t\tmonth: 1,\n\t\t\tday: 1,\n\t\t\thour: 0,\n\t\t\tminute: 0,\n\t\t\tsecond: 0,\n\t\t})\n\t\ttime.fromUnixTime(Math.floor(ms / 1000))\n\n\t\tconst local = time.convertToZone(this._innerValue)\n\t\treturn [\n\t\t\tlocal.year,\n\t\t\tlocal.month, // THIS is 1-based !\n\t\t\tlocal.day,\n\t\t\tlocal.hour,\n\t\t\tlocal.minute,\n\t\t\tlocal.second,\n\t\t]\n\t}\n\n\t/**\n\t * Returns\n\t *\n\t * @return {ICAL.Timezone}\n\t */\n\ttoICALTimezone() {\n\t\tthis._initialize()\n\t\treturn this._innerValue\n\t}\n\n\t/**\n\t * Returns the corresponding ICAL.\n\t *\n\t * @return {ICAL.Component}\n\t */\n\ttoICALJs() {\n\t\tthis._initialize()\n\t\treturn this._innerValue.component\n\t}\n\n\t/**\n\t * Initialises the inner ICAL.Timezone component\n\t *\n\t * @private\n\t */\n\t_initialize() {\n\t\tif (!this._initialized) {\n\t\t\tconst jCal = ICAL.parse(this._ics)\n\t\t\tconst icalComp = new ICAL.Component(jCal)\n\t\t\tthis._innerValue = new ICAL.Timezone(icalComp)\n\t\t\tthis._initialized = true\n\t\t}\n\t}\n\n}\n\nTimezone.utc = new Timezone(ICAL.Timezone.utcTimezone)\nTimezone.floating = new Timezone(ICAL.Timezone.localTimezone)\n","/**\n * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport ICAL from 'ical.js'\nimport Timezone from './timezone.js'\nimport tzData from '../resources/timezones/zones.json'\n\n/**\n * @class TimezoneManager\n */\nclass TimezoneManager {\n\n\t/**\n\t * Constructor\n\t */\n\tconstructor() {\n\t\t/**\n\t\t * Map of aliases\n\t\t * Alias name => timezoneId\n\t\t *\n\t\t * @type {Map}\n\t\t */\n\t\tthis._aliases = new Map()\n\n\t\t/**\n\t\t * List of aliases that were registered while their targets were missing\n\t\t * [[aliasName, timezoneId], ...]\n\t\t *\n\t\t * @type {string[][]}\n\t\t */\n\t\tthis._pendingAliases = []\n\n\t\t/**\n\t\t * Map of Timezones\n\t\t * timezoneId => Timezone\n\t\t *\n\t\t * @type {Map}\n\t\t * @private\n\t\t */\n\t\tthis._timezones = new Map()\n\t}\n\n\t/**\n\t * Gets a timezone for the given id\n\t *\n\t * @param {string} timezoneId The id of the timezone\n\t * @return {Timezone|null}\n\t */\n\tgetTimezoneForId(timezoneId) {\n\t\treturn this._getTimezoneForIdRec(timezoneId, 0)\n\t}\n\n\t_getTimezoneForIdRec(timezoneId, level) {\n\t\tif (this._timezones.has(timezoneId)) {\n\t\t\treturn this._timezones.get(timezoneId)\n\t\t}\n\n\t\tif (level >= 20) {\n\t\t\t// too much recursion\n\t\t\tconsole.error('TimezoneManager.getTimezoneForIdRec() exceeds recursion limits')\n\t\t\treturn null\n\t\t}\n\n\t\tif (this._aliases.has(timezoneId)) {\n\t\t\tconst resolvedTimezoneId = this._aliases.get(timezoneId)\n\t\t\t// can be a recursive alias:\n\t\t\treturn this._getTimezoneForIdRec(resolvedTimezoneId, level + 1)\n\t\t}\n\n\t\treturn null\n\t}\n\n\t/**\n\t * Checks if there is a timezone for the given id stored in this manager\n\t *\n\t * @param {string} timezoneId The id of the timezone\n\t * @return {boolean}\n\t */\n\thasTimezoneForId(timezoneId) {\n\t\treturn this._timezones.has(timezoneId) || this._aliases.has(timezoneId)\n\t}\n\n\t/**\n\t * Checks if the given timezone id is an alias\n\t *\n\t * @param {string} timezoneId The id of the timezone\n\t * @return {boolean}\n\t */\n\tisAlias(timezoneId) {\n\t\treturn !this._timezones.has(timezoneId) && this._aliases.has(timezoneId)\n\t}\n\n\t/**\n\t * Lists all timezones\n\t *\n\t * @param {boolean=} includeAliases Whether or not to include aliases\n\t * @return {string[]}\n\t */\n\tlistAllTimezones(includeAliases = false) {\n\t\tconst timezones = Array.from(this._timezones.keys())\n\n\t\tif (includeAliases) {\n\t\t\treturn timezones.concat(Array.from(this._aliases.keys()))\n\t\t}\n\n\t\treturn timezones\n\t}\n\n\t/**\n\t * Registers a timezone\n\t *\n\t * @param {Timezone} timezone The timezone-object to register\n\t */\n\tregisterTimezone(timezone) {\n\t\tthis._timezones.set(timezone.timezoneId, timezone)\n\t\tICAL.TimezoneService.register(timezone.timezoneId, timezone.toICALTimezone())\n\n\t\t// Try to resolve pending aliases and remove them from the list\n\t\tthis._pendingAliases = this._pendingAliases.filter(([aliasName, timezoneId]) => {\n\t\t\tif (timezoneId !== timezone.timezoneId) {\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tICAL.TimezoneService.register(aliasName, timezone.toICALTimezone())\n\t\t\treturn false\n\t\t})\n\t}\n\n\tregisterDefaultTimezones() {\n\t\tconsole.debug(`@nextcloud/calendar-js app is using version ${tzData.version} of the timezone database`)\n\n\t\tfor (const tzid in tzData.zones) {\n\t\t\tif (Object.prototype.hasOwnProperty.call(tzData.zones, [tzid])) {\n\t\t\t\tconst ics = [\n\t\t\t\t\t'BEGIN:VTIMEZONE',\n\t\t\t\t\t'TZID:' + tzid,\n\t\t\t\t\t...tzData.zones[tzid].ics,\n\t\t\t\t\t'END:VTIMEZONE',\n\t\t\t\t].join('\\r\\n')\n\t\t\t\tthis.registerTimezoneFromICS(tzid, ics)\n\t\t\t}\n\t\t}\n\n\t\tfor (const tzid in tzData.aliases) {\n\t\t\tif (Object.prototype.hasOwnProperty.call(tzData.aliases, [tzid])) {\n\t\t\t\tthis.registerAlias(tzid, tzData.aliases[tzid].aliasTo)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Registers a timezone based on ics data\n\t *\n\t * @param {string} timezoneId The id of the timezone\n\t * @param {string} ics The iCalendar timezone definition\n\t */\n\tregisterTimezoneFromICS(timezoneId, ics) {\n\t\tconst timezone = new Timezone(timezoneId, ics)\n\t\tthis.registerTimezone(timezone)\n\t}\n\n\t/**\n\t * Registers a new timezone-alias\n\t *\n\t * @param {string} aliasName The timezone-id of the alias\n\t * @param {string} timezoneId The timezone-id to resolve the alias to\n\t */\n\tregisterAlias(aliasName, timezoneId) {\n\t\tthis._aliases.set(aliasName, timezoneId)\n\n\t\tconst resolvedTimezone = this.getTimezoneForId(timezoneId)\n\t\tif (!resolvedTimezone) {\n\t\t\tthis._pendingAliases.push([aliasName, timezoneId])\n\t\t\treturn\n\t\t}\n\t\tICAL.TimezoneService.register(aliasName, resolvedTimezone.toICALTimezone())\n\t}\n\n\t/**\n\t * Unregisters a timezone\n\t *\n\t * @param {string} timezoneId Unregisters a timezone by Id\n\t */\n\tunregisterTimezones(timezoneId) {\n\t\tthis._timezones.delete(timezoneId)\n\t\tICAL.TimezoneService.remove(timezoneId)\n\t}\n\n\t/**\n\t * Unregisters a timezone-alias\n\t *\n\t * @param {string} aliasName The alias to unregister\n\t */\n\tunregisterAlias(aliasName) {\n\t\tthis._aliases.delete(aliasName)\n\t\tthis._pendingAliases = this._pendingAliases\n\t\t\t.filter(([pendingAliasName]) => pendingAliasName !== aliasName)\n\t\tICAL.TimezoneService.remove(aliasName)\n\t}\n\n\t/**\n\t * Clear all timezones\n\t */\n\tclearAllTimezones() {\n\t\tthis._aliases = new Map()\n\t\tthis._pendingAliases = []\n\t\tthis._timezones = new Map()\n\n\t\tICAL.TimezoneService.reset()\n\n\t\ttimezoneManager.registerTimezone(Timezone.utc)\n\t\ttimezoneManager.registerTimezone(Timezone.floating)\n\t\ttimezoneManager.registerAlias('GMT', Timezone.utc.timezoneId)\n\t\ttimezoneManager.registerAlias('Z', Timezone.utc.timezoneId)\n\t}\n\n}\n\nconst timezoneManager = new TimezoneManager()\ntimezoneManager.clearAllTimezones()\n\n/**\n * Gets the default instance of the timezone manager\n *\n * @return {TimezoneManager}\n */\nexport function getTimezoneManager() {\n\treturn timezoneManager\n}\n\n/**\n *\n * @param {string} tzName Name of the timezone to check\n * @return {boolean}\n */\nexport function isOlsonTimezone(tzName) {\n\tconst hasSlash = tzName.indexOf('/') !== -1\n\tconst hasSpace = tzName.indexOf(' ') !== -1\n\tconst startsWithETC = tzName.startsWith('Etc')\n\tconst startsWithUS = tzName.startsWith('US/')\n\n\treturn hasSlash && !hasSpace && !startsWithETC && !startsWithUS\n}\n","/**\n * SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/**\n *\n * @param {string[]} timezoneList List of Olsen timezones\n * @param {Array} additionalTimezones List of additional timezones\n * @param {string} globalTimezoneName The localized name of the \"Global\" timezones\n * @return {[]}\n */\nexport function getSortedTimezoneList(timezoneList = [], additionalTimezones = [], globalTimezoneName = 'Global') {\n\tconst sortedByContinent = {}\n\tconst sortedList = []\n\n\tfor (const timezoneId of timezoneList) {\n\t\tconst components = timezoneId.split('/')\n\t\tlet [continent, name] = [components.shift(), components.join('/')]\n\t\tif (!name) {\n\t\t\tname = continent\n\t\t\tcontinent = globalTimezoneName\n\t\t}\n\n\t\tsortedByContinent[continent] = sortedByContinent[continent] || {\n\t\t\tcontinent,\n\t\t\tregions: [],\n\t\t}\n\n\t\tsortedByContinent[continent].regions.push({\n\t\t\tlabel: getReadableTimezoneName(name),\n\t\t\tcities: [],\n\t\t\ttimezoneId,\n\t\t})\n\t}\n\n\tfor (const additionalTimezone of additionalTimezones) {\n\t\tconst { continent, label, timezoneId } = additionalTimezone\n\n\t\tsortedByContinent[continent] = sortedByContinent[continent] || {\n\t\t\tcontinent,\n\t\t\tregions: [],\n\t\t}\n\n\t\tsortedByContinent[continent].regions.push({\n\t\t\tlabel,\n\t\t\tcities: [],\n\t\t\ttimezoneId,\n\t\t})\n\t}\n\n\tfor (const continent in sortedByContinent) {\n\t\tif (!Object.prototype.hasOwnProperty.call(sortedByContinent, continent)) {\n\t\t\tcontinue\n\t\t}\n\n\t\tsortedByContinent[continent].regions.sort((a, b) => {\n\t\t\tif (a.label < b.label) {\n\t\t\t\treturn -1\n\t\t\t}\n\n\t\t\treturn 1\n\t\t})\n\t\tsortedList.push(sortedByContinent[continent])\n\t}\n\n\t// Sort continents by name\n\tsortedList.sort((a, b) => {\n\t\tif (a.continent < b.continent) {\n\t\t\treturn -1\n\t\t}\n\n\t\treturn 1\n\t})\n\n\treturn sortedList\n}\n\n/**\n * Get human-readable name for timezoneId\n *\n * @param {string} timezoneId TimezoneId to turn human-readable\n * @return {string}\n */\nexport function getReadableTimezoneName(timezoneId) {\n\treturn timezoneId\n\t\t.split('_')\n\t\t.join(' ')\n\t\t.replace('St ', 'St. ')\n\t\t.split('/')\n\t\t.join(' - ')\n}\n"],"names":["ICAL"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}