{"version":3,"file":"index-D4N9XJuu.chunk.mjs","sources":["../node_modules/@nextcloud/files/dist/chunks/folder-29HuacU_.mjs","../node_modules/@nextcloud/files/dist/index.mjs"],"sourcesContent":["import { getLoggerBuilder } from \"@nextcloud/logger\";\nimport { join, encodePath, basename, extname, dirname } from \"@nextcloud/paths\";\nwindow._nc_files_scope ??= {};\nwindow._nc_files_scope.v4_0 ??= {};\nconst scopedGlobals = window._nc_files_scope.v4_0;\nconst logger = getLoggerBuilder().setApp(\"@nextcloud/files\").detectUser().build();\nconst FileType = Object.freeze({\n  Folder: \"folder\",\n  File: \"file\"\n});\nconst Permission = Object.freeze({\n  /**\n   * No permissions granted\n   */\n  NONE: 0,\n  /**\n   * Can read the file content\n   */\n  READ: 1,\n  /**\n   * Can modify the file itself (move, rename, etc)\n   */\n  UPDATE: 2,\n  /**\n   * Can create new files/folders inside a folder\n   */\n  CREATE: 4,\n  /**\n   * Can change the file content\n   */\n  WRITE: 4,\n  /**\n   * Can delete the node\n   */\n  DELETE: 8,\n  /**\n   * Can share the node\n   */\n  SHARE: 16,\n  /**\n   * All permissions are granted\n   */\n  ALL: 31\n});\nconst NodeStatus = Object.freeze({\n  /** This is a new node and it doesn't exists on the filesystem yet */\n  NEW: \"new\",\n  /** This node has failed and is unavailable  */\n  FAILED: \"failed\",\n  /** This node is currently loading or have an operation in progress */\n  LOADING: \"loading\",\n  /** This node is locked and cannot be modified */\n  LOCKED: \"locked\"\n});\nfunction isDavResource(source, davService) {\n  return source.match(davService) !== null;\n}\nfunction validateData(data, davService) {\n  if (data.id && typeof data.id !== \"number\" && typeof data.id !== \"string\") {\n    throw new Error(\"Invalid id type of value\");\n  }\n  if (!data.source) {\n    throw new Error(\"Missing mandatory source\");\n  }\n  try {\n    new URL(data.source);\n  } catch {\n    throw new Error(\"Invalid source format, source must be a valid URL\");\n  }\n  if (!data.source.startsWith(\"http\")) {\n    throw new Error(\"Invalid source format, only http(s) is supported\");\n  }\n  if (!data.root) {\n    throw new Error(\"Missing mandatory root\");\n  }\n  if (typeof data.root !== \"string\") {\n    throw new Error(\"Invalid root type\");\n  }\n  if (!data.root.startsWith(\"/\")) {\n    throw new Error(\"Root must start with a leading slash\");\n  }\n  if (!data.source.includes(data.root)) {\n    throw new Error(\"Root must be part of the source\");\n  }\n  if (isDavResource(data.source, davService)) {\n    const service = data.source.match(davService)[0];\n    if (!data.source.includes(join(service, data.root))) {\n      throw new Error(\"The root must be relative to the service. e.g /files/emma\");\n    }\n  }\n  if (data.displayname && typeof data.displayname !== \"string\") {\n    throw new Error(\"Invalid displayname type\");\n  }\n  if (data.mtime && !(data.mtime instanceof Date)) {\n    throw new Error(\"Invalid mtime type\");\n  }\n  if (data.crtime && !(data.crtime instanceof Date)) {\n    throw new Error(\"Invalid crtime type\");\n  }\n  if (!data.mime || typeof data.mime !== \"string\" || !data.mime.match(/^[-\\w.]+\\/[-+\\w.]+$/gi)) {\n    throw new Error(\"Missing or invalid mandatory mime\");\n  }\n  if (\"size\" in data && typeof data.size !== \"number\" && data.size !== void 0) {\n    throw new Error(\"Invalid size type\");\n  }\n  if (\"permissions\" in data && data.permissions !== void 0 && !(typeof data.permissions === \"number\" && data.permissions >= Permission.NONE && data.permissions <= Permission.ALL)) {\n    throw new Error(\"Invalid permissions\");\n  }\n  if (data.owner && data.owner !== null && typeof data.owner !== \"string\") {\n    throw new Error(\"Invalid owner type\");\n  }\n  if (data.attributes && typeof data.attributes !== \"object\") {\n    throw new Error(\"Invalid attributes type\");\n  }\n  if (data.status && !Object.values(NodeStatus).includes(data.status)) {\n    throw new Error(\"Status must be a valid NodeStatus\");\n  }\n}\nfunction fixDates(data) {\n  if (data.mtime && typeof data.mtime === \"string\") {\n    if (!isNaN(Date.parse(data.mtime)) && JSON.stringify(new Date(data.mtime)) === JSON.stringify(data.mtime)) {\n      data.mtime = new Date(data.mtime);\n    }\n  }\n  if (data.crtime && typeof data.crtime === \"string\") {\n    if (!isNaN(Date.parse(data.crtime)) && JSON.stringify(new Date(data.crtime)) === JSON.stringify(data.crtime)) {\n      data.crtime = new Date(data.crtime);\n    }\n  }\n}\nfunction fixRegExp(pattern) {\n  if (pattern instanceof RegExp) {\n    return pattern;\n  }\n  const matches = pattern.match(/(\\/?)(.+)\\1([a-z]*)/i);\n  if (!matches) {\n    throw new Error(\"Invalid regular expression format.\");\n  }\n  const validFlags = Array.from(new Set(matches[3])).filter((flag) => \"gimsuy\".includes(flag)).join(\"\");\n  return new RegExp(matches[2], validFlags);\n}\nclass Node {\n  _attributes;\n  _data;\n  _knownDavService = /(remote|public)\\.php\\/(web)?dav/i;\n  readonlyAttributes = Object.entries(Object.getOwnPropertyDescriptors(Node.prototype)).filter((e) => typeof e[1].get === \"function\" && e[0] !== \"__proto__\").map((e) => e[0]);\n  handler = {\n    set: (target, prop, value) => {\n      if (this.readonlyAttributes.includes(prop)) {\n        return false;\n      }\n      return Reflect.set(target, prop, value);\n    },\n    deleteProperty: (target, prop) => {\n      if (this.readonlyAttributes.includes(prop)) {\n        return false;\n      }\n      return Reflect.deleteProperty(target, prop);\n    }\n  };\n  constructor(...[data, davService]) {\n    if (!data.mime) {\n      data.mime = \"application/octet-stream\";\n    }\n    fixDates(data);\n    davService = fixRegExp(davService || this._knownDavService);\n    validateData(data, davService);\n    this._data = {\n      ...data,\n      attributes: {}\n    };\n    this._attributes = new Proxy(this._data.attributes, this.handler);\n    this.update(data.attributes ?? {});\n    if (davService) {\n      this._knownDavService = davService;\n    }\n  }\n  /**\n   * Get the source url to this object\n   * There is no setter as the source is not meant to be changed manually.\n   * You can use the rename or move method to change the source.\n   */\n  get source() {\n    return this._data.source.replace(/\\/$/i, \"\");\n  }\n  /**\n   * Get the encoded source url to this object for requests purposes\n   */\n  get encodedSource() {\n    const { origin } = new URL(this.source);\n    return origin + encodePath(this.source.slice(origin.length));\n  }\n  /**\n   * Get this object name\n   * There is no setter as the source is not meant to be changed manually.\n   * You can use the rename or move method to change the source.\n   */\n  get basename() {\n    return basename(this.source);\n  }\n  /**\n   * The nodes displayname\n   * By default the display name and the `basename` are identical,\n   * but it is possible to have a different name. This happens\n   * on the files app for example for shared folders.\n   */\n  get displayname() {\n    return this._data.displayname || this.basename;\n  }\n  /**\n   * Set the displayname\n   */\n  set displayname(displayname) {\n    validateData({ ...this._data, displayname }, this._knownDavService);\n    this._data.displayname = displayname;\n  }\n  /**\n   * Get this object's extension\n   * There is no setter as the source is not meant to be changed manually.\n   * You can use the rename or move method to change the source.\n   */\n  get extension() {\n    return extname(this.source);\n  }\n  /**\n   * Get the directory path leading to this object\n   * Will use the relative path to root if available\n   *\n   * There is no setter as the source is not meant to be changed manually.\n   * You can use the rename or move method to change the source.\n   */\n  get dirname() {\n    return dirname(this.path);\n  }\n  /**\n   * Get the file mime\n   */\n  get mime() {\n    return this._data.mime || \"application/octet-stream\";\n  }\n  /**\n   * Set the file mime\n   * Removing the mime type will set it to `application/octet-stream`\n   */\n  set mime(mime) {\n    mime ??= \"application/octet-stream\";\n    validateData({ ...this._data, mime }, this._knownDavService);\n    this._data.mime = mime;\n  }\n  /**\n   * Get the file modification time\n   */\n  get mtime() {\n    return this._data.mtime;\n  }\n  /**\n   * Set the file modification time\n   */\n  set mtime(mtime) {\n    validateData({ ...this._data, mtime }, this._knownDavService);\n    this._data.mtime = mtime;\n  }\n  /**\n   * Get the file creation time\n   * There is no setter as the creation time is not meant to be changed\n   */\n  get crtime() {\n    return this._data.crtime;\n  }\n  /**\n   * Get the file size\n   */\n  get size() {\n    return this._data.size;\n  }\n  /**\n   * Set the file size\n   */\n  set size(size) {\n    validateData({ ...this._data, size }, this._knownDavService);\n    this.updateMtime();\n    this._data.size = size;\n  }\n  /**\n   * Get the file attribute\n   * This contains all additional attributes not provided by the Node class\n   */\n  get attributes() {\n    return this._attributes;\n  }\n  /**\n   * Get the file permissions\n   */\n  get permissions() {\n    if (this.owner === null && !this.isDavResource) {\n      return Permission.READ;\n    }\n    return this._data.permissions !== void 0 ? this._data.permissions : Permission.NONE;\n  }\n  /**\n   * Set the file permissions\n   */\n  set permissions(permissions) {\n    validateData({ ...this._data, permissions }, this._knownDavService);\n    this.updateMtime();\n    this._data.permissions = permissions;\n  }\n  /**\n   * Get the file owner\n   * There is no setter as the owner is not meant to be changed\n   */\n  get owner() {\n    if (!this.isDavResource) {\n      return null;\n    }\n    return this._data.owner;\n  }\n  /**\n   * Is this a dav-related resource ?\n   */\n  get isDavResource() {\n    return isDavResource(this.source, this._knownDavService);\n  }\n  /**\n   * Get the dav root of this object\n   * There is no setter as the root is not meant to be changed\n   */\n  get root() {\n    return this._data.root.replace(/^(.+)\\/$/, \"$1\");\n  }\n  /**\n   * Get the absolute path of this object relative to the root\n   */\n  get path() {\n    const idx = this.source.indexOf(\"://\");\n    const protocol = this.source.slice(0, idx);\n    const remainder = this.source.slice(idx + 3);\n    const slashIndex = remainder.indexOf(\"/\");\n    const host = remainder.slice(0, slashIndex);\n    const rawPath = remainder.slice(slashIndex);\n    const safeUrl = `${protocol}://${host}${encodePath(rawPath)}`;\n    const url = new URL(safeUrl);\n    let source = decodeURIComponent(url.pathname);\n    if (this.isDavResource) {\n      source = source.split(this._knownDavService).pop();\n    }\n    const firstMatch = source.indexOf(this.root);\n    const root = this.root.replace(/\\/$/, \"\");\n    return source.slice(firstMatch + root.length) || \"/\";\n  }\n  /**\n   * Get the nodes file id if defined.\n   * There is no setter as the fileid is not meant to be changed.\n   *\n   * @deprecated Nextcloud is migrating to snowflake ids which are strings. Use the `id` attribute instead.\n   */\n  get fileid() {\n    return typeof this._data?.id === \"number\" ? this._data.id : void 0;\n  }\n  /**\n   * Get the nodes id - if defined.\n   *\n   * Note: As Nextcloud is migrating to snowflake ids the id has to be a string,\n   * due to limitations of the JavaScript number type (snowflake ids are 64bit JavaScript numbers can only accurately represent integers up to 53 bit).\n   */\n  get id() {\n    if (typeof this._data?.id === \"undefined\" || typeof this._data.id === \"number\" && this._data.id < 0) {\n      return void 0;\n    }\n    return String(this._data.id);\n  }\n  /**\n   * Get the node status.\n   */\n  get status() {\n    return this._data?.status;\n  }\n  /**\n   * Set the node status.\n   */\n  set status(status) {\n    validateData({ ...this._data, status }, this._knownDavService);\n    this._data.status = status;\n  }\n  /**\n   * Move the node to a new destination\n   *\n   * @param destination the new source.\n   * e.g. https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg\n   */\n  move(destination) {\n    validateData({ ...this._data, source: destination }, this._knownDavService);\n    const oldBasename = this.basename;\n    this._data.source = destination;\n    if (this.displayname === oldBasename && this.basename !== oldBasename) {\n      this.displayname = this.basename;\n    }\n  }\n  /**\n   * Rename the node\n   * This aliases the move method for easier usage\n   *\n   * @param basename The new name of the node\n   */\n  rename(basename2) {\n    if (basename2.includes(\"/\")) {\n      throw new Error(\"Invalid basename\");\n    }\n    this.move(dirname(this.source) + \"/\" + basename2);\n  }\n  /**\n   * Update the mtime if exists\n   */\n  updateMtime() {\n    if (this._data.mtime) {\n      this._data.mtime = /* @__PURE__ */ new Date();\n    }\n  }\n  /**\n   * Update the attributes of the node\n   * Warning, updating attributes will NOT automatically update the mtime.\n   *\n   * @param attributes The new attributes to update on the Node attributes\n   */\n  update(attributes) {\n    for (const [name, value] of Object.entries(attributes)) {\n      try {\n        if (value === void 0) {\n          delete this.attributes[name];\n        } else {\n          this.attributes[name] = value;\n        }\n      } catch (e) {\n        if (e instanceof TypeError) {\n          continue;\n        }\n        throw e;\n      }\n    }\n  }\n  /**\n   * Returns a clone of the node\n   */\n  clone() {\n    return new this.constructor(structuredClone(this._data), this._knownDavService);\n  }\n  /**\n   * JSON representation of the node\n   */\n  toJSON() {\n    return JSON.stringify([structuredClone(this._data), this._knownDavService.toString()]);\n  }\n}\nclass File extends Node {\n  constructor(...[data, davService]) {\n    super(data, davService);\n  }\n  get type() {\n    return FileType.File;\n  }\n}\nclass Folder extends Node {\n  constructor(...[data, davService]) {\n    super({\n      ...data,\n      mime: \"httpd/unix-directory\"\n    }, davService);\n  }\n  get type() {\n    return FileType.Folder;\n  }\n  get extension() {\n    return null;\n  }\n  get mime() {\n    return \"httpd/unix-directory\";\n  }\n}\nexport {\n  FileType as F,\n  Node as N,\n  Permission as P,\n  File as a,\n  Folder as b,\n  NodeStatus as c,\n  logger as l,\n  scopedGlobals as s\n};\n//# sourceMappingURL=folder-29HuacU_.mjs.map\n","import { s as scopedGlobals, l as logger, F as FileType } from \"./chunks/folder-29HuacU_.mjs\";\nimport { a, b, N, c, P } from \"./chunks/folder-29HuacU_.mjs\";\nimport { TypedEventTarget } from \"typescript-event-target\";\nimport isSvg from \"is-svg\";\nimport { getCapabilities } from \"@nextcloud/capabilities\";\nimport { extname, basename } from \"@nextcloud/paths\";\nimport { getCanonicalLocale, getLanguage } from \"@nextcloud/l10n\";\nclass FilesRegistry extends TypedEventTarget {\n}\nfunction getRegistry() {\n  scopedGlobals.registry ??= new FilesRegistry();\n  return scopedGlobals.registry;\n}\nfunction getFilesRegistry() {\n  return getRegistry();\n}\nconst DefaultType = Object.freeze({\n  DEFAULT: \"default\",\n  HIDDEN: \"hidden\"\n});\nfunction registerFileAction(action) {\n  validateAction$1(action);\n  scopedGlobals.fileActions ??= /* @__PURE__ */ new Map();\n  if (scopedGlobals.fileActions.has(action.id)) {\n    logger.error(`FileAction ${action.id} already registered`, { action });\n    return;\n  }\n  scopedGlobals.fileActions.set(action.id, action);\n  getRegistry().dispatchTypedEvent(\"register:action\", new CustomEvent(\"register:action\", { detail: action }));\n}\nfunction getFileActions() {\n  if (scopedGlobals.fileActions) {\n    return [...scopedGlobals.fileActions.values()];\n  }\n  return [];\n}\nfunction validateAction$1(action) {\n  if (!action.id || typeof action.id !== \"string\") {\n    throw new Error(\"Invalid id\");\n  }\n  if (!action.displayName || typeof action.displayName !== \"function\") {\n    throw new Error(\"Invalid displayName function\");\n  }\n  if (\"title\" in action && typeof action.title !== \"function\") {\n    throw new Error(\"Invalid title function\");\n  }\n  if (!action.iconSvgInline || typeof action.iconSvgInline !== \"function\") {\n    throw new Error(\"Invalid iconSvgInline function\");\n  }\n  if (!action.exec || typeof action.exec !== \"function\") {\n    throw new Error(\"Invalid exec function\");\n  }\n  if (\"enabled\" in action && typeof action.enabled !== \"function\") {\n    throw new Error(\"Invalid enabled function\");\n  }\n  if (\"execBatch\" in action && typeof action.execBatch !== \"function\") {\n    throw new Error(\"Invalid execBatch function\");\n  }\n  if (\"order\" in action && typeof action.order !== \"number\") {\n    throw new Error(\"Invalid order\");\n  }\n  if (action.destructive !== void 0 && typeof action.destructive !== \"boolean\") {\n    throw new Error(\"Invalid destructive flag\");\n  }\n  if (\"parent\" in action && typeof action.parent !== \"string\") {\n    throw new Error(\"Invalid parent\");\n  }\n  if (action.default && !Object.values(DefaultType).includes(action.default)) {\n    throw new Error(\"Invalid default\");\n  }\n  if (\"inline\" in action && typeof action.inline !== \"function\") {\n    throw new Error(\"Invalid inline function\");\n  }\n  if (\"renderInline\" in action && typeof action.renderInline !== \"function\") {\n    throw new Error(\"Invalid renderInline function\");\n  }\n  if (\"hotkey\" in action && action.hotkey !== void 0) {\n    if (typeof action.hotkey !== \"object\") {\n      throw new Error(\"Invalid hotkey configuration\");\n    }\n    if (typeof action.hotkey.key !== \"string\" || !action.hotkey.key) {\n      throw new Error(\"Missing or invalid hotkey key\");\n    }\n    if (typeof action.hotkey.description !== \"string\" || !action.hotkey.description) {\n      throw new Error(\"Missing or invalid hotkey description\");\n    }\n  }\n}\nfunction registerFileListAction(action) {\n  validateAction(action);\n  scopedGlobals.fileListActions ??= /* @__PURE__ */ new Map();\n  if (scopedGlobals.fileListActions.has(action.id)) {\n    logger.error(`FileListAction with id \"${action.id}\" is already registered`, { action });\n    return;\n  }\n  scopedGlobals.fileListActions.set(action.id, action);\n  getRegistry().dispatchTypedEvent(\"register:listAction\", new CustomEvent(\"register:listAction\", { detail: action }));\n}\nfunction getFileListActions() {\n  if (scopedGlobals.fileListActions) {\n    return [...scopedGlobals.fileListActions.values()];\n  }\n  return [];\n}\nfunction validateAction(action) {\n  if (!action.id || typeof action.id !== \"string\") {\n    throw new Error(\"Invalid id\");\n  }\n  if (!action.displayName || typeof action.displayName !== \"function\") {\n    throw new Error(\"Invalid displayName function\");\n  }\n  if (\"iconSvgInline\" in action && typeof action.iconSvgInline !== \"function\") {\n    throw new Error(\"Invalid iconSvgInline function\");\n  }\n  if (\"order\" in action && typeof action.order !== \"number\") {\n    throw new Error(\"Invalid order\");\n  }\n  if (\"enabled\" in action && typeof action.enabled !== \"function\") {\n    throw new Error(\"Invalid enabled function\");\n  }\n  if (!action.exec || typeof action.exec !== \"function\") {\n    throw new Error(\"Invalid exec function\");\n  }\n}\n/*!\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nfunction registerFileListFilter(filter) {\n  scopedGlobals.fileListFilters ??= /* @__PURE__ */ new Map();\n  if (scopedGlobals.fileListFilters.has(filter.id)) {\n    throw new Error(`File list filter \"${filter.id}\" already registered`);\n  }\n  scopedGlobals.fileListFilters.set(filter.id, filter);\n  getRegistry().dispatchTypedEvent(\"register:listFilter\", new CustomEvent(\"register:listFilter\", { detail: filter }));\n}\nfunction unregisterFileListFilter(filterId) {\n  if (scopedGlobals.fileListFilters && scopedGlobals.fileListFilters.has(filterId)) {\n    scopedGlobals.fileListFilters.delete(filterId);\n    getRegistry().dispatchTypedEvent(\"unregister:listFilter\", new CustomEvent(\"unregister:listFilter\", { detail: filterId }));\n  }\n}\nfunction getFileListFilters() {\n  if (scopedGlobals.fileListFilters) {\n    return [...scopedGlobals.fileListFilters.values()];\n  }\n  return [];\n}\n/*!\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nclass FileListFilter extends TypedEventTarget {\n  id;\n  order;\n  constructor(id, order = 100) {\n    super();\n    this.id = id;\n    this.order = order;\n  }\n  filter(nodes) {\n    throw new Error(\"Not implemented\");\n  }\n  updateChips(chips) {\n    this.dispatchTypedEvent(\"update:chips\", new CustomEvent(\"update:chips\", { detail: chips }));\n  }\n  filterUpdated() {\n    this.dispatchTypedEvent(\"update:filter\", new CustomEvent(\"update:filter\"));\n  }\n}\nfunction registerFileListHeader(header) {\n  validateHeader(header);\n  scopedGlobals.fileListHeaders ??= /* @__PURE__ */ new Map();\n  if (scopedGlobals.fileListHeaders.has(header.id)) {\n    logger.error(`Header ${header.id} already registered`, { header });\n    return;\n  }\n  scopedGlobals.fileListHeaders.set(header.id, header);\n  getRegistry().dispatchTypedEvent(\"register:listHeader\", new CustomEvent(\"register:listHeader\", { detail: header }));\n}\nfunction getFileListHeaders() {\n  if (!scopedGlobals.fileListHeaders) {\n    return [];\n  }\n  return [...scopedGlobals.fileListHeaders.values()];\n}\nfunction validateHeader(header) {\n  if (!header.id || !header.render || !header.updated) {\n    throw new Error(\"Invalid header: id, render and updated are required\");\n  }\n  if (typeof header.id !== \"string\") {\n    throw new Error(\"Invalid id property\");\n  }\n  if (header.enabled !== void 0 && typeof header.enabled !== \"function\") {\n    throw new Error(\"Invalid enabled property\");\n  }\n  if (header.render && typeof header.render !== \"function\") {\n    throw new Error(\"Invalid render property\");\n  }\n  if (header.updated && typeof header.updated !== \"function\") {\n    throw new Error(\"Invalid updated property\");\n  }\n}\nfunction checkOptionalProperty(obj, property, type) {\n  if (typeof obj[property] !== \"undefined\") {\n    if (type === \"array\") {\n      if (!Array.isArray(obj[property])) {\n        throw new Error(`View ${property} must be an array`);\n      }\n    } else if (typeof obj[property] !== type) {\n      throw new Error(`View ${property} must be a ${type}`);\n    } else if (type === \"object\" && (obj[property] === null || Array.isArray(obj[property]))) {\n      throw new Error(`View ${property} must be an object`);\n    }\n  }\n}\nclass Column {\n  _column;\n  constructor(column) {\n    validateColumn(column);\n    this._column = column;\n  }\n  get id() {\n    return this._column.id;\n  }\n  get title() {\n    return this._column.title;\n  }\n  get render() {\n    return this._column.render;\n  }\n  get sort() {\n    return this._column.sort;\n  }\n  get summary() {\n    return this._column.summary;\n  }\n}\nfunction validateColumn(column) {\n  if (typeof column !== \"object\" || column === null) {\n    throw new Error(\"View column must be an object\");\n  }\n  if (!column.id || typeof column.id !== \"string\") {\n    throw new Error(\"A column id is required\");\n  }\n  if (!column.title || typeof column.title !== \"string\") {\n    throw new Error(\"A column title is required\");\n  }\n  if (!column.render || typeof column.render !== \"function\") {\n    throw new Error(\"A render function is required\");\n  }\n  checkOptionalProperty(column, \"sort\", \"function\");\n  checkOptionalProperty(column, \"summary\", \"function\");\n}\nclass View {\n  _view;\n  constructor(view) {\n    validateView(view);\n    this._view = view;\n  }\n  get id() {\n    return this._view.id;\n  }\n  get name() {\n    return this._view.name;\n  }\n  get caption() {\n    return this._view.caption;\n  }\n  get emptyTitle() {\n    return this._view.emptyTitle;\n  }\n  get emptyCaption() {\n    return this._view.emptyCaption;\n  }\n  get getContents() {\n    return this._view.getContents;\n  }\n  get hidden() {\n    return this._view.hidden;\n  }\n  get icon() {\n    return this._view.icon;\n  }\n  set icon(icon) {\n    this._view.icon = icon;\n  }\n  get order() {\n    return this._view.order;\n  }\n  set order(order) {\n    this._view.order = order;\n  }\n  get params() {\n    return this._view.params;\n  }\n  set params(params) {\n    this._view.params = params;\n  }\n  get columns() {\n    return this._view.columns;\n  }\n  get emptyView() {\n    return this._view.emptyView;\n  }\n  get parent() {\n    return this._view.parent;\n  }\n  get sticky() {\n    return this._view.sticky;\n  }\n  get expanded() {\n    return this._view.expanded;\n  }\n  set expanded(expanded) {\n    this._view.expanded = expanded;\n  }\n  get defaultSortKey() {\n    return this._view.defaultSortKey;\n  }\n  get loadChildViews() {\n    return this._view.loadChildViews;\n  }\n}\nfunction validateView(view) {\n  if (!view.icon || typeof view.icon !== \"string\" || !isSvg(view.icon)) {\n    throw new Error(\"View icon is required and must be a valid svg string\");\n  }\n  if (!view.id || typeof view.id !== \"string\") {\n    throw new Error(\"View id is required and must be a string\");\n  }\n  if (!view.getContents || typeof view.getContents !== \"function\") {\n    throw new Error(\"View getContents is required and must be a function\");\n  }\n  if (!view.name || typeof view.name !== \"string\") {\n    throw new Error(\"View name is required and must be a string\");\n  }\n  checkOptionalProperty(view, \"caption\", \"string\");\n  checkOptionalProperty(view, \"columns\", \"array\");\n  checkOptionalProperty(view, \"defaultSortKey\", \"string\");\n  checkOptionalProperty(view, \"emptyCaption\", \"string\");\n  checkOptionalProperty(view, \"emptyTitle\", \"string\");\n  checkOptionalProperty(view, \"emptyView\", \"function\");\n  checkOptionalProperty(view, \"expanded\", \"boolean\");\n  checkOptionalProperty(view, \"hidden\", \"boolean\");\n  checkOptionalProperty(view, \"loadChildViews\", \"function\");\n  checkOptionalProperty(view, \"order\", \"number\");\n  checkOptionalProperty(view, \"params\", \"object\");\n  checkOptionalProperty(view, \"parent\", \"string\");\n  checkOptionalProperty(view, \"sticky\", \"boolean\");\n  if (view.columns) {\n    view.columns.forEach(validateColumn);\n    const columnIds = view.columns.reduce((set, column) => set.add(column.id), /* @__PURE__ */ new Set());\n    if (columnIds.size !== view.columns.length) {\n      throw new Error(\"View columns must have unique ids\");\n    }\n  }\n}\nclass Navigation extends TypedEventTarget {\n  _views = [];\n  _currentView = null;\n  /**\n   * Register a new view on the navigation\n   *\n   * @param views The views to register\n   * @throws {Error} if a view with the same id is already registered\n   * @throws {Error} if the registered view is invalid\n   */\n  register(...views) {\n    for (const view of views) {\n      if (this._views.find((search) => search.id === view.id)) {\n        throw new Error(`IView id ${view.id} is already registered`);\n      }\n      validateView(view);\n    }\n    this._views.push(...views);\n    this.dispatchTypedEvent(\"update\", new CustomEvent(\"update\"));\n  }\n  /**\n   * Remove a registered view\n   *\n   * @param id The id of the view to remove\n   */\n  remove(id) {\n    const index = this._views.findIndex((view) => view.id === id);\n    if (index !== -1) {\n      this._views.splice(index, 1);\n      this.dispatchTypedEvent(\"update\", new CustomEvent(\"update\"));\n    }\n  }\n  /**\n   * Set the currently active view\n   *\n   * @param id - The id of the view to set as active\n   * @throws {Error} If no view with the given id was registered\n   * @fires UpdateActiveViewEvent\n   */\n  setActive(id) {\n    if (id === null) {\n      this._currentView = null;\n    } else {\n      const view = this._views.find(({ id: viewId }) => viewId === id);\n      if (!view) {\n        throw new Error(`No view with ${id} registered`);\n      }\n      this._currentView = view;\n    }\n    const event = new CustomEvent(\"updateActive\", { detail: this._currentView });\n    this.dispatchTypedEvent(\"updateActive\", event);\n  }\n  /**\n   * The currently active files view\n   */\n  get active() {\n    return this._currentView;\n  }\n  /**\n   * All registered views\n   */\n  get views() {\n    return this._views;\n  }\n}\nfunction getNavigation() {\n  scopedGlobals.navigation ??= new Navigation();\n  return scopedGlobals.navigation;\n}\nconst NewMenuEntryCategory = Object.freeze({\n  /**\n   * For actions where the user is intended to upload from their device\n   */\n  UploadFromDevice: 0,\n  /**\n   * For actions that create new nodes on the server without uploading\n   */\n  CreateNew: 1,\n  /**\n   * For everything not matching the other categories\n   */\n  Other: 2\n});\nclass NewMenu {\n  _entries = [];\n  registerEntry(entry) {\n    this.validateEntry(entry);\n    entry.category = entry.category ?? NewMenuEntryCategory.CreateNew;\n    this._entries.push(entry);\n  }\n  unregisterEntry(entry) {\n    const entryIndex = typeof entry === \"string\" ? this.getEntryIndex(entry) : this.getEntryIndex(entry.id);\n    if (entryIndex === -1) {\n      logger.warn(\"Entry not found, nothing removed\", { entry, entries: this.getEntries() });\n      return;\n    }\n    this._entries.splice(entryIndex, 1);\n  }\n  /**\n   * Get the list of registered entries\n   *\n   * @param context - The creation context. Usually the current folder\n   */\n  getEntries(context) {\n    if (context) {\n      return this._entries.filter((entry) => typeof entry.enabled === \"function\" ? entry.enabled(context) : true);\n    }\n    return this._entries;\n  }\n  getEntryIndex(id) {\n    return this._entries.findIndex((entry) => entry.id === id);\n  }\n  validateEntry(entry) {\n    if (!entry.id || !entry.displayName || !entry.iconSvgInline || !entry.handler) {\n      throw new Error(\"Invalid entry\");\n    }\n    if (typeof entry.id !== \"string\" || typeof entry.displayName !== \"string\") {\n      throw new Error(\"Invalid id or displayName property\");\n    }\n    if (entry.iconSvgInline && typeof entry.iconSvgInline !== \"string\") {\n      throw new Error(\"Invalid icon provided\");\n    }\n    if (entry.enabled !== void 0 && typeof entry.enabled !== \"function\") {\n      throw new Error(\"Invalid enabled property\");\n    }\n    if (typeof entry.handler !== \"function\") {\n      throw new Error(\"Invalid handler property\");\n    }\n    if (\"order\" in entry && typeof entry.order !== \"number\") {\n      throw new Error(\"Invalid order property\");\n    }\n    if (this.getEntryIndex(entry.id) !== -1) {\n      throw new Error(\"Duplicate entry\");\n    }\n  }\n}\nfunction getNewFileMenu() {\n  scopedGlobals.newFileMenu ??= new NewMenu();\n  return scopedGlobals.newFileMenu;\n}\nfunction addNewFileMenuEntry(entry) {\n  const newFileMenu = getNewFileMenu();\n  return newFileMenu.registerEntry(entry);\n}\nfunction removeNewFileMenuEntry(entry) {\n  const newFileMenu = getNewFileMenu();\n  return newFileMenu.unregisterEntry(entry);\n}\nfunction getNewFileMenuEntries(context) {\n  const newFileMenu = getNewFileMenu();\n  return newFileMenu.getEntries(context).sort((a2, b2) => {\n    if (a2.order !== void 0 && b2.order !== void 0 && a2.order !== b2.order) {\n      return a2.order - b2.order;\n    }\n    return a2.displayName.localeCompare(b2.displayName, void 0, { numeric: true, sensitivity: \"base\" });\n  });\n}\nfunction registerSidebarAction(action) {\n  validateSidebarAction(action);\n  scopedGlobals.filesSidebarActions ??= /* @__PURE__ */ new Map();\n  if (scopedGlobals.filesSidebarActions.has(action.id)) {\n    logger.warn(`Sidebar action with id \"${action.id}\" already registered. Skipping.`);\n    return;\n  }\n  scopedGlobals.filesSidebarActions.set(action.id, action);\n  logger.debug(`New sidebar action with id \"${action.id}\" registered.`);\n}\nfunction getSidebarActions() {\n  if (scopedGlobals.filesSidebarActions) {\n    return [...scopedGlobals.filesSidebarActions.values()];\n  }\n  return [];\n}\nfunction validateSidebarAction(action) {\n  if (typeof action !== \"object\") {\n    throw new Error(\"Sidebar action is not an object\");\n  }\n  if (!action.id || typeof action.id !== \"string\" || action.id !== CSS.escape(action.id)) {\n    throw new Error(\"Sidebar actions need to have an id conforming to the HTML id attribute specifications\");\n  }\n  if (!action.displayName || typeof action.displayName !== \"function\") {\n    throw new Error(\"Sidebar actions need to have a displayName function\");\n  }\n  if (!action.iconSvgInline || typeof action.iconSvgInline !== \"function\") {\n    throw new Error(\"Sidebar actions need to have a iconSvgInline function\");\n  }\n  if (!action.enabled || typeof action.enabled !== \"function\") {\n    throw new Error(\"Sidebar actions need to have an enabled function\");\n  }\n  if (!action.onClick || typeof action.onClick !== \"function\") {\n    throw new Error(\"Sidebar actions need to have an onClick function\");\n  }\n}\nfunction registerSidebarTab(tab) {\n  validateSidebarTab(tab);\n  scopedGlobals.filesSidebarTabs ??= /* @__PURE__ */ new Map();\n  if (scopedGlobals.filesSidebarTabs.has(tab.id)) {\n    logger.warn(`Sidebar tab with id \"${tab.id}\" already registered. Skipping.`);\n    return;\n  }\n  scopedGlobals.filesSidebarTabs.set(tab.id, tab);\n  logger.debug(`New sidebar tab with id \"${tab.id}\" registered.`);\n}\nfunction getSidebarTabs() {\n  if (scopedGlobals.filesSidebarTabs) {\n    return [...scopedGlobals.filesSidebarTabs.values()];\n  }\n  return [];\n}\nfunction validateSidebarTab(tab) {\n  if (typeof tab !== \"object\") {\n    throw new Error(\"Sidebar tab is not an object\");\n  }\n  if (!tab.id || typeof tab.id !== \"string\" || tab.id !== CSS.escape(tab.id)) {\n    throw new Error(\"Sidebar tabs need to have an id conforming to the HTML id attribute specifications\");\n  }\n  if (!tab.tagName || typeof tab.tagName !== \"string\") {\n    throw new Error(\"Sidebar tabs need to have the tagName name set\");\n  }\n  if (!tab.tagName.match(/^[a-z][a-z0-9-_]+$/)) {\n    throw new Error('Sidebar tab \"tagName\" is invalid');\n  }\n  if (!tab.displayName || typeof tab.displayName !== \"string\") {\n    throw new Error(\"Sidebar tabs need to have a name set\");\n  }\n  if (typeof tab.iconSvgInline !== \"string\" || !isSvg(tab.iconSvgInline)) {\n    throw new Error(\"Sidebar tabs need to have an valid SVG icon\");\n  }\n  if (typeof tab.order !== \"number\") {\n    throw new Error(\"Sidebar tabs need to have a numeric order set\");\n  }\n  if (tab.enabled && typeof tab.enabled !== \"function\") {\n    throw new Error('Sidebar tab \"enabled\" is not a function');\n  }\n  if (tab.onInit && typeof tab.onInit !== \"function\") {\n    throw new Error('Sidebar tab \"onInit\" is not a function');\n  }\n}\nclass SidebarProxy {\n  get #impl() {\n    return window.OCA?.Files?._sidebar?.();\n  }\n  get available() {\n    return !!this.#impl;\n  }\n  get isOpen() {\n    return this.#impl?.isOpen ?? false;\n  }\n  get activeTab() {\n    return this.#impl?.activeTab;\n  }\n  get node() {\n    return this.#impl?.node;\n  }\n  open(node, tab) {\n    this.#impl?.open(node, tab);\n  }\n  close() {\n    this.#impl?.close();\n  }\n  setActiveTab(tabId) {\n    this.#impl?.setActiveTab(tabId);\n  }\n  registerTab(tab) {\n    registerSidebarTab(tab);\n  }\n  getTabs(context) {\n    return this.#impl?.getTabs(context) ?? [];\n  }\n  getActions(context) {\n    return this.#impl?.getActions(context) ?? [];\n  }\n  registerAction(action) {\n    registerSidebarAction(action);\n  }\n}\nfunction getSidebar() {\n  return new SidebarProxy();\n}\nconst InvalidFilenameErrorReason = Object.freeze({\n  ReservedName: \"reserved name\",\n  Character: \"character\",\n  Extension: \"extension\"\n});\nclass InvalidFilenameError extends Error {\n  constructor(options) {\n    super(`Invalid ${options.reason} '${options.segment}' in filename '${options.filename}'`, { cause: options });\n  }\n  /**\n   * The filename that was validated\n   */\n  get filename() {\n    return this.cause.filename;\n  }\n  /**\n   * Reason why the validation failed\n   */\n  get reason() {\n    return this.cause.reason;\n  }\n  /**\n   * Part of the filename that caused this error\n   */\n  get segment() {\n    return this.cause.segment;\n  }\n}\nfunction validateFilename(filename) {\n  const capabilities = getCapabilities().files;\n  const forbiddenCharacters = capabilities.forbidden_filename_characters ?? [\"/\", \"\\\\\"];\n  for (const character of forbiddenCharacters) {\n    if (filename.includes(character)) {\n      throw new InvalidFilenameError({ segment: character, reason: InvalidFilenameErrorReason.Character, filename });\n    }\n  }\n  filename = filename.toLocaleLowerCase();\n  const forbiddenFilenames = capabilities.forbidden_filenames ?? [\".htaccess\"];\n  if (forbiddenFilenames.includes(filename)) {\n    throw new InvalidFilenameError({ filename, segment: filename, reason: InvalidFilenameErrorReason.ReservedName });\n  }\n  const endOfBasename = filename.indexOf(\".\", 1);\n  const basename2 = filename.substring(0, endOfBasename === -1 ? void 0 : endOfBasename);\n  const forbiddenFilenameBasenames = capabilities.forbidden_filename_basenames ?? [];\n  if (forbiddenFilenameBasenames.includes(basename2)) {\n    throw new InvalidFilenameError({ filename, segment: basename2, reason: InvalidFilenameErrorReason.ReservedName });\n  }\n  const forbiddenFilenameExtensions = capabilities.forbidden_filename_extensions ?? [];\n  for (const extension of forbiddenFilenameExtensions) {\n    if (filename.length > extension.length && filename.endsWith(extension)) {\n      throw new InvalidFilenameError({ segment: extension, reason: InvalidFilenameErrorReason.Extension, filename });\n    }\n  }\n}\nfunction isFilenameValid(filename) {\n  try {\n    validateFilename(filename);\n    return true;\n  } catch (error) {\n    if (error instanceof InvalidFilenameError) {\n      return false;\n    }\n    throw error;\n  }\n}\nfunction getUniqueName(name, otherNames, options) {\n  const opts = {\n    suffix: (n) => `(${n})`,\n    ignoreFileExtension: false,\n    ...options\n  };\n  let newName = name;\n  let i = 1;\n  while (otherNames.includes(newName)) {\n    const ext = opts.ignoreFileExtension ? \"\" : extname(name);\n    const base = basename(name, ext);\n    newName = `${base} ${opts.suffix(i++)}${ext}`;\n  }\n  return newName;\n}\nconst humanList = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\nconst humanListBinary = [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\"];\nfunction formatFileSize(size, skipSmallSizes = false, binaryPrefixes = false, base1000 = false) {\n  binaryPrefixes = binaryPrefixes && !base1000;\n  if (typeof size === \"string\") {\n    size = Number(size);\n  }\n  let order = size > 0 ? Math.floor(Math.log(size) / Math.log(base1000 ? 1e3 : 1024)) : 0;\n  order = Math.min((binaryPrefixes ? humanListBinary.length : humanList.length) - 1, order);\n  const readableFormat = binaryPrefixes ? humanListBinary[order] : humanList[order];\n  let relativeSize = (size / Math.pow(base1000 ? 1e3 : 1024, order)).toFixed(1);\n  if (skipSmallSizes === true && order === 0) {\n    return (relativeSize !== \"0.0\" ? \"< 1 \" : \"0 \") + (binaryPrefixes ? humanListBinary[1] : humanList[1]);\n  }\n  if (order < 2) {\n    relativeSize = parseFloat(relativeSize).toFixed(0);\n  } else {\n    relativeSize = parseFloat(relativeSize).toLocaleString(getCanonicalLocale());\n  }\n  return relativeSize + \" \" + readableFormat;\n}\nfunction parseFileSize(value, forceBinary = false) {\n  try {\n    value = `${value}`.toLocaleLowerCase().replaceAll(/\\s+/g, \"\").replaceAll(\",\", \".\");\n  } catch {\n    return null;\n  }\n  const match = value.match(/^([0-9]*(\\.[0-9]*)?)([kmgtp]?)(i?)b?$/);\n  if (match === null || match[1] === \".\" || match[1] === \"\") {\n    return null;\n  }\n  const bytesArray = {\n    \"\": 0,\n    k: 1,\n    m: 2,\n    g: 3,\n    t: 4,\n    p: 5,\n    e: 6\n  };\n  const decimalString = `${match[1]}`;\n  const base = match[4] === \"i\" || forceBinary ? 1024 : 1e3;\n  return Math.round(Number.parseFloat(decimalString) * base ** bytesArray[match[3]]);\n}\nfunction stringify(value) {\n  if (value instanceof Date) {\n    return value.toISOString();\n  }\n  return String(value);\n}\nfunction orderBy(collection, identifiers, orders) {\n  identifiers = identifiers ?? [(value) => value];\n  orders = orders ?? [];\n  const sorting = identifiers.map((_, index) => (orders[index] ?? \"asc\") === \"asc\" ? 1 : -1);\n  const collator = Intl.Collator(\n    [getLanguage(), getCanonicalLocale()],\n    {\n      // handle 10 as ten and not as one-zero\n      numeric: true,\n      usage: \"sort\"\n    }\n  );\n  return [...collection].sort((a2, b2) => {\n    for (const [index, identifier] of identifiers.entries()) {\n      const value = collator.compare(stringify(identifier(a2)), stringify(identifier(b2)));\n      if (value !== 0) {\n        return value * sorting[index];\n      }\n    }\n    return 0;\n  });\n}\nconst FilesSortingMode = Object.freeze({\n  Name: \"basename\",\n  Modified: \"mtime\",\n  Size: \"size\"\n});\nfunction sortNodes(nodes, options = {}) {\n  const sortingOptions = {\n    // Default to sort by name\n    sortingMode: FilesSortingMode.Name,\n    // Default to sort ascending\n    sortingOrder: \"asc\",\n    ...options\n  };\n  function basename2(node) {\n    const name = node.displayname || node.attributes?.displayname || node.basename || \"\";\n    if (node.type === FileType.Folder) {\n      return name;\n    }\n    return name.lastIndexOf(\".\") > 0 ? name.slice(0, name.lastIndexOf(\".\")) : name;\n  }\n  const identifiers = [\n    // 1: Sort favorites first if enabled\n    ...sortingOptions.sortFavoritesFirst ? [(v) => v.attributes?.favorite !== 1] : [],\n    // 2: Sort folders first if sorting by name\n    ...sortingOptions.sortFoldersFirst ? [(v) => v.type !== \"folder\"] : [],\n    // 3: Use sorting mode if NOT basename (to be able to use display name too)\n    ...sortingOptions.sortingMode !== FilesSortingMode.Name ? [(v) => v[sortingOptions.sortingMode] ?? v.attributes[sortingOptions.sortingMode]] : [],\n    // 4: Use display name if available, fallback to name\n    (v) => basename2(v),\n    // 5: Finally, use basename if all previous sorting methods failed\n    (v) => v.basename\n  ];\n  const orders = [\n    // (for 1): always sort favorites before normal files\n    ...sortingOptions.sortFavoritesFirst ? [\"asc\"] : [],\n    // (for 2): always sort folders before files\n    ...sortingOptions.sortFoldersFirst ? [\"asc\"] : [],\n    // (for 3): Reverse if sorting by mtime as mtime higher means edited more recent -> lower\n    ...sortingOptions.sortingMode === FilesSortingMode.Modified ? [sortingOptions.sortingOrder === \"asc\" ? \"desc\" : \"asc\"] : [],\n    // (also for 3 so make sure not to conflict with 2 and 3)\n    ...sortingOptions.sortingMode !== FilesSortingMode.Modified && sortingOptions.sortingMode !== FilesSortingMode.Name ? [sortingOptions.sortingOrder] : [],\n    // for 4: use configured sorting direction\n    sortingOptions.sortingOrder,\n    // for 5: use configured sorting direction\n    sortingOptions.sortingOrder\n  ];\n  return orderBy(nodes, identifiers, orders);\n}\nexport {\n  Column,\n  DefaultType,\n  a as File,\n  FileListFilter,\n  FileType,\n  FilesSortingMode,\n  b as Folder,\n  InvalidFilenameError,\n  InvalidFilenameErrorReason,\n  Navigation,\n  NewMenuEntryCategory,\n  N as Node,\n  c as NodeStatus,\n  P as Permission,\n  View,\n  addNewFileMenuEntry,\n  formatFileSize,\n  getFileActions,\n  getFileListActions,\n  getFileListFilters,\n  getFileListHeaders,\n  getFilesRegistry,\n  getNavigation,\n  getNewFileMenu,\n  getNewFileMenuEntries,\n  getSidebar,\n  getSidebarActions,\n  getSidebarTabs,\n  getUniqueName,\n  isFilenameValid,\n  orderBy,\n  parseFileSize,\n  registerFileAction,\n  registerFileListAction,\n  registerFileListFilter,\n  registerFileListHeader,\n  registerSidebarAction,\n  registerSidebarTab,\n  removeNewFileMenuEntry,\n  sortNodes,\n  unregisterFileListFilter,\n  validateColumn,\n  validateFilename,\n  validateView\n};\n//# sourceMappingURL=index.mjs.map\n"],"names":["scopedGlobals","getLoggerBuilder","FileType","Permission","NodeStatus","isDavResource","source","davService","validateData","data","service","join","fixDates","fixRegExp","pattern","matches","validFlags","flag","Node","e","target","prop","value","origin","encodePath","basename","displayname","extname","dirname","mime","mtime","size","permissions","idx","protocol","remainder","slashIndex","host","rawPath","safeUrl","url","firstMatch","root","status","destination","oldBasename","basename2","attributes","name","File","Folder","InvalidFilenameErrorReason","InvalidFilenameError","options","validateFilename","filename","capabilities","getCapabilities","forbiddenCharacters","character","endOfBasename","forbiddenFilenameExtensions","extension","humanList","humanListBinary","formatFileSize","skipSmallSizes","binaryPrefixes","base1000","order","readableFormat","relativeSize","getCanonicalLocale","stringify","orderBy","collection","identifiers","orders","sorting","_","index","collator","getLanguage","a2","b2","identifier","FilesSortingMode","sortNodes","nodes","sortingOptions","node","v"],"mappings":"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","x_google_ignoreList":[0,1]}