import { Deserializable } from '../client/util/SerializationHelper'; import { serializable, custom } from 'serializr'; import { ObjectField } from './ObjectField'; import { ToScriptString, ToString, Copy } from './FieldSymbols'; import { scriptingGlobal } from '../client/util/ScriptingGlobals'; import { Utils } from '../Utils'; function url() { return custom( function (value: URL) { return value?.origin === window.location.origin ? value.pathname : value?.href; }, function (jsonValue: string) { return new URL(jsonValue, window.location.origin); } ); } export abstract class URLField extends ObjectField { @serializable(url()) readonly url: URL; constructor(url: string); constructor(url: URL); constructor(url: URL | string) { super(); if (typeof url === 'string') { url = url.startsWith('http') ? new URL(url) : new URL(url, window.location.origin); } this.url = url; } [ToScriptString]() { if (Utils.prepend(this.url?.pathname) === this.url?.href) { return `new ${this.constructor.name}("${this.url.pathname}")`; } return `new ${this.constructor.name}("${this.url?.href}")`; } [ToString]() { if (Utils.prepend(this.url?.pathname) === this.url?.href) { return this.url.pathname; } return this.url?.href; } [Copy](): this { return new (this.constructor as any)(this.url); } } export const nullAudio = 'https://actions.google.com/sounds/v1/alarms/beep_short.ogg'; @scriptingGlobal @Deserializable('audio') export class AudioField extends URLField {} @scriptingGlobal @Deserializable('image') export class ImageField extends URLField {} @scriptingGlobal @Deserializable('video') export class VideoField extends URLField {} @scriptingGlobal @Deserializable('pdf') export class PdfField extends URLField {} @scriptingGlobal @Deserializable('web') export class WebField extends URLField {} @scriptingGlobal @Deserializable('csv') export class CsvField extends URLField {} @scriptingGlobal @Deserializable('youtube') export class YoutubeField extends URLField {}