@nextcloud/files 3.10.0 → 3.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/chunks/{dav-DxfiR0wZ.mjs → dav-Co9y-hkg.mjs} +15 -9
  2. package/dist/chunks/dav-Co9y-hkg.mjs.map +1 -0
  3. package/dist/chunks/{dav-BBwoJ8WE.cjs → dav-CtqjqS4O.cjs} +15 -9
  4. package/dist/chunks/dav-CtqjqS4O.cjs.map +1 -0
  5. package/dist/dav/dav.d.ts +56 -0
  6. package/dist/dav/davPermissions.d.ts +6 -0
  7. package/dist/dav/davProperties.d.ts +57 -0
  8. package/dist/dav/index.d.ts +13 -0
  9. package/dist/dav.cjs +1 -1
  10. package/dist/dav.mjs +1 -1
  11. package/dist/fileAction.d.ts +84 -0
  12. package/dist/fileListAction.d.ts +44 -0
  13. package/dist/fileListFilters.d.ts +101 -0
  14. package/dist/fileListHeaders.d.ts +27 -0
  15. package/dist/files/file.d.ts +14 -0
  16. package/dist/files/fileType.d.ts +8 -0
  17. package/dist/files/folder.d.ts +18 -0
  18. package/dist/files/node.d.ts +178 -0
  19. package/dist/files/nodeData.d.ts +54 -0
  20. package/dist/index.cjs +2 -2
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.ts +119 -1099
  23. package/dist/index.mjs +3 -3
  24. package/dist/index.mjs.map +1 -1
  25. package/dist/navigation/column.d.ts +28 -0
  26. package/dist/navigation/index.d.ts +7 -0
  27. package/dist/navigation/navigation.d.ts +74 -0
  28. package/dist/navigation/view.d.ts +92 -0
  29. package/dist/newFileMenu.d.ts +66 -0
  30. package/dist/permissions.d.ts +16 -0
  31. package/dist/utils/fileSize.d.ts +25 -0
  32. package/dist/utils/fileSorting.d.ts +35 -0
  33. package/dist/utils/filename-validation.d.ts +51 -0
  34. package/dist/utils/filename.d.ts +24 -0
  35. package/dist/utils/logger.d.ts +2 -0
  36. package/dist/utils/sorting.d.ts +12 -0
  37. package/package.json +8 -8
  38. package/dist/chunks/dav-BBwoJ8WE.cjs.map +0 -1
  39. package/dist/chunks/dav-DxfiR0wZ.mjs.map +0 -1
  40. package/dist/dav.d.ts +0 -370
@@ -22,7 +22,7 @@ var FileType = /* @__PURE__ */ ((FileType2) => {
22
22
  FileType2["File"] = "file";
23
23
  return FileType2;
24
24
  })(FileType || {});
25
- const isDavRessource = function(source, davService) {
25
+ const isDavResource = function(source, davService) {
26
26
  return source.match(davService) !== null;
27
27
  };
28
28
  const validateData = (data, davService) => {
@@ -73,7 +73,7 @@ const validateData = (data, davService) => {
73
73
  if (data.root && !data.source.includes(data.root)) {
74
74
  throw new Error("Root must be part of the source");
75
75
  }
76
- if (data.root && isDavRessource(data.source, davService)) {
76
+ if (data.root && isDavResource(data.source, davService)) {
77
77
  const service = data.source.match(davService)[0];
78
78
  if (!data.source.includes(join(service, data.root))) {
79
79
  throw new Error("The root must be relative to the service. e.g /files/emma");
@@ -187,7 +187,7 @@ class Node {
187
187
  get dirname() {
188
188
  if (this.root) {
189
189
  let source = this.source;
190
- if (this.isDavRessource) {
190
+ if (this.isDavResource) {
191
191
  source = source.split(this._knownDavService).pop();
192
192
  }
193
193
  const firstMatch = source.indexOf(this.root);
@@ -247,7 +247,7 @@ class Node {
247
247
  * Get the file permissions
248
248
  */
249
249
  get permissions() {
250
- if (this.owner === null && !this.isDavRessource) {
250
+ if (this.owner === null && !this.isDavResource) {
251
251
  return Permission.READ;
252
252
  }
253
253
  return this._data.permissions !== void 0 ? this._data.permissions : Permission.NONE;
@@ -264,16 +264,22 @@ class Node {
264
264
  * There is no setter as the owner is not meant to be changed
265
265
  */
266
266
  get owner() {
267
- if (!this.isDavRessource) {
267
+ if (!this.isDavResource) {
268
268
  return null;
269
269
  }
270
270
  return this._data.owner;
271
271
  }
272
272
  /**
273
- * Is this a dav-related ressource ?
273
+ * Is this a dav-related resource ?
274
+ */
275
+ get isDavResource() {
276
+ return isDavResource(this.source, this._knownDavService);
277
+ }
278
+ /**
279
+ * @deprecated use `isDavResource` instead - will be removed in next major version.
274
280
  */
275
281
  get isDavRessource() {
276
- return isDavRessource(this.source, this._knownDavService);
282
+ return this.isDavResource;
277
283
  }
278
284
  /**
279
285
  * Get the dav root of this object
@@ -283,7 +289,7 @@ class Node {
283
289
  if (this._data.root) {
284
290
  return this._data.root.replace(/^(.+)\/$/, "$1");
285
291
  }
286
- if (this.isDavRessource) {
292
+ if (this.isDavResource) {
287
293
  const root = dirname(this.source);
288
294
  return root.split(this._knownDavService).pop() || null;
289
295
  }
@@ -295,7 +301,7 @@ class Node {
295
301
  get path() {
296
302
  if (this.root) {
297
303
  let source = this.source;
298
- if (this.isDavRessource) {
304
+ if (this.isDavResource) {
299
305
  source = source.split(this._knownDavService).pop();
300
306
  }
301
307
  const firstMatch = source.indexOf(this.root);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dav-Co9y-hkg.mjs","sources":["../../lib/utils/logger.ts","../../lib/permissions.ts","../../lib/files/fileType.ts","../../lib/files/nodeData.ts","../../lib/files/node.ts","../../lib/files/file.ts","../../lib/files/folder.ts","../../lib/dav/davPermissions.ts","../../lib/dav/davProperties.ts","../../lib/dav/dav.ts"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('@nextcloud/files')\n\t.detectUser()\n\t.build()\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/**\n * Node permissions\n */\nexport enum Permission {\n\tNONE = 0,\n\tCREATE = 4,\n\tREAD = 1,\n\tUPDATE = 2,\n\tDELETE = 8,\n\tSHARE = 16,\n\tALL = 31,\n}\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nexport enum FileType {\n\tFolder = 'folder',\n\tFile = 'file',\n}\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { join } from 'path'\nimport { Permission } from '../permissions'\nimport { NodeStatus } from './node'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface Attribute { [key: string]: any }\n\nexport interface NodeData {\n\t/** Unique ID */\n\tid?: number\n\n\t/**\n\t * URL to the resource.\n\t * e.g. https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg\n\t * or https://domain.com/Photos/picture.jpg\n\t */\n\tsource: string\n\n\t/** Last modified time */\n\tmtime?: Date\n\n\t/** Creation time */\n\tcrtime?: Date\n\n\t/** The mime type Optional for folders only */\n\tmime?: string\n\n\t/** The node size type */\n\tsize?: number\n\n\t/** The node permissions */\n\tpermissions?: Permission\n\n\t/** The owner UID of this node */\n\towner: string|null\n\n\t/** Optional the displayname of this node */\n\tdisplayname?: string\n\n\t/** The node attributes */\n\tattributes?: Attribute\n\n\t/**\n\t * The absolute root of the home relative to the service.\n\t * It is highly recommended to provide that information.\n\t * e.g. /files/emma\n\t */\n\troot?: string\n\n\t/** The node status */\n\tstatus?: NodeStatus\n}\n\n/**\n * Check if a node source is from a specific DAV service\n *\n * @param source The source to check\n * @param davService Pattern to check if source is DAV resource\n */\nexport const isDavResource = function(source: string, davService: RegExp): boolean {\n\treturn source.match(davService) !== null\n}\n\n/**\n * Validate Node construct data\n *\n * @param data The node data\n * @param davService Pattern to check if source is DAV ressource\n */\nexport const validateData = (data: NodeData, davService: RegExp) => {\n\tif (data.id && typeof data.id !== 'number') {\n\t\tthrow new Error('Invalid id type of value')\n\t}\n\n\tif (!data.source) {\n\t\tthrow new Error('Missing mandatory source')\n\t}\n\n\ttry {\n\t\t// eslint-disable-next-line no-new\n\t\tnew URL(data.source)\n\t} catch (e) {\n\t\tthrow new Error('Invalid source format, source must be a valid URL')\n\t}\n\n\tif (!data.source.startsWith('http')) {\n\t\tthrow new Error('Invalid source format, only http(s) is supported')\n\t}\n\n\tif (data.displayname && typeof data.displayname !== 'string') {\n\t\tthrow new Error('Invalid displayname type')\n\t}\n\n\tif (data.mtime && !(data.mtime instanceof Date)) {\n\t\tthrow new Error('Invalid mtime type')\n\t}\n\n\tif (data.crtime && !(data.crtime instanceof Date)) {\n\t\tthrow new Error('Invalid crtime type')\n\t}\n\n\tif (!data.mime || typeof data.mime !== 'string'\n\t\t|| !data.mime.match(/^[-\\w.]+\\/[-+\\w.]+$/gi)) {\n\t\tthrow new Error('Missing or invalid mandatory mime')\n\t}\n\n\t// Allow size to be 0\n\tif ('size' in data && typeof data.size !== 'number' && data.size !== undefined) {\n\t\tthrow new Error('Invalid size type')\n\t}\n\n\t// Allow permissions to be 0\n\tif ('permissions' in data\n\t\t&& data.permissions !== undefined\n\t\t&& !(typeof data.permissions === 'number'\n\t\t\t&& data.permissions >= Permission.NONE\n\t\t\t&& data.permissions <= Permission.ALL\n\t\t)) {\n\t\tthrow new Error('Invalid permissions')\n\t}\n\n\tif (data.owner\n\t\t&& data.owner !== null\n\t\t&& typeof data.owner !== 'string') {\n\t\tthrow new Error('Invalid owner type')\n\t}\n\n\tif (data.attributes && typeof data.attributes !== 'object') {\n\t\tthrow new Error('Invalid attributes type')\n\t}\n\n\tif (data.root && typeof data.root !== 'string') {\n\t\tthrow new Error('Invalid root type')\n\t}\n\n\tif (data.root && !data.root.startsWith('/')) {\n\t\tthrow new Error('Root must start with a leading slash')\n\t}\n\n\tif (data.root && !data.source.includes(data.root)) {\n\t\tthrow new Error('Root must be part of the source')\n\t}\n\n\tif (data.root && isDavResource(data.source, davService)) {\n\t\tconst service = data.source.match(davService)![0]\n\t\tif (!data.source.includes(join(service, data.root))) {\n\t\t\tthrow new Error('The root must be relative to the service. e.g /files/emma')\n\t\t}\n\t}\n\n\tif (data.status && !Object.values(NodeStatus).includes(data.status)) {\n\t\tthrow new Error('Status must be a valid NodeStatus')\n\t}\n}\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { basename, extname, dirname } from 'path'\nimport { encodePath } from '@nextcloud/paths'\n\nimport { Permission } from '../permissions'\nimport { FileType } from './fileType'\nimport { Attribute, isDavResource, NodeData, validateData } from './nodeData'\nimport logger from '../utils/logger'\n\nexport enum NodeStatus {\n\t/** This is a new node and it doesn't exists on the filesystem yet */\n\tNEW = 'new',\n\t/** This node has failed and is unavailable */\n\tFAILED = 'failed',\n\t/** This node is currently loading or have an operation in progress */\n\tLOADING = 'loading',\n\t/** This node is locked and cannot be modified */\n\tLOCKED = 'locked',\n}\n\nexport abstract class Node {\n\n\tprivate _data: NodeData\n\tprivate _attributes: Attribute\n\tprivate _knownDavService = /(remote|public)\\.php\\/(web)?dav/i\n\n\tprivate readonlyAttributes = Object.entries(Object.getOwnPropertyDescriptors(Node.prototype))\n\t\t.filter(e => typeof e[1].get === 'function' && e[0] !== '__proto__')\n\t\t.map(e => e[0])\n\n\tprivate handler = {\n\t\tset: (target: Attribute, prop: string, value: unknown): boolean => {\n\t\t\tif (this.readonlyAttributes.includes(prop)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\t// Apply original changes\n\t\t\treturn Reflect.set(target, prop, value)\n\t\t},\n\t\tdeleteProperty: (target: Attribute, prop: string): boolean => {\n\t\t\tif (this.readonlyAttributes.includes(prop)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\t// Apply original changes\n\t\t\treturn Reflect.deleteProperty(target, prop)\n\t\t},\n\t\t// TODO: This is deprecated and only needed for files v3\n\t\tget: (target: Attribute, prop: string, receiver) => {\n\t\t\tif (this.readonlyAttributes.includes(prop)) {\n\t\t\t\tlogger.warn(`Accessing \"Node.attributes.${prop}\" is deprecated, access it directly on the Node instance.`)\n\t\t\t\treturn Reflect.get(this, prop)\n\t\t\t}\n\t\t\treturn Reflect.get(target, prop, receiver)\n\t\t},\n\t} as ProxyHandler<Attribute>\n\n\tconstructor(data: NodeData, davService?: RegExp) {\n\t\t// Validate data\n\t\tvalidateData(data, davService || this._knownDavService)\n\n\t\tthis._data = {\n\t\t\t// TODO: Remove with next major release, this is just for compatibility\n\t\t\tdisplayname: data.attributes?.displayname,\n\t\t\t...data,\n\t\t\tattributes: {},\n\t\t}\n\n\t\t// Proxy the attributes to update the mtime on change\n\t\tthis._attributes = new Proxy(this._data.attributes!, this.handler)\n\n\t\t// Update attributes, this sanitizes the attributes to only contain valid attributes\n\t\tthis.update(data.attributes ?? {})\n\n\t\tif (davService) {\n\t\t\tthis._knownDavService = davService\n\t\t}\n\t}\n\n\t/**\n\t * Get the source url to this object\n\t * There is no setter as the source is not meant to be changed manually.\n\t * You can use the rename or move method to change the source.\n\t */\n\tget source(): string {\n\t\t// strip any ending slash\n\t\treturn this._data.source.replace(/\\/$/i, '')\n\t}\n\n\t/**\n\t * Get the encoded source url to this object for requests purposes\n\t */\n\tget encodedSource(): string {\n\t\tconst { origin } = new URL(this.source)\n\t\treturn origin + encodePath(this.source.slice(origin.length))\n\t}\n\n\t/**\n\t * Get this object name\n\t * There is no setter as the source is not meant to be changed manually.\n\t * You can use the rename or move method to change the source.\n\t */\n\tget basename(): string {\n\t\treturn basename(this.source)\n\t}\n\n\t/**\n\t * The nodes displayname\n\t * By default the display name and the `basename` are identical,\n\t * but it is possible to have a different name. This happens\n\t * on the files app for example for shared folders.\n\t */\n\tget displayname(): string {\n\t\treturn this._data.displayname || this.basename\n\t}\n\n\t/**\n\t * Set the displayname\n\t */\n\tset displayname(displayname: string) {\n\t\tthis._data.displayname = displayname\n\t}\n\n\t/**\n\t * Get this object's extension\n\t * There is no setter as the source is not meant to be changed manually.\n\t * You can use the rename or move method to change the source.\n\t */\n\tget extension(): string|null {\n\t\treturn extname(this.source)\n\t}\n\n\t/**\n\t * Get the directory path leading to this object\n\t * Will use the relative path to root if available\n\t *\n\t * There is no setter as the source is not meant to be changed manually.\n\t * You can use the rename or move method to change the source.\n\t */\n\tget dirname(): string {\n\t\tif (this.root) {\n\t\t\tlet source = this.source\n\t\t\tif (this.isDavResource) {\n\t\t\t\t// ensure we only work on the real path in case root is not distinct\n\t\t\t\tsource = source.split(this._knownDavService).pop()!\n\t\t\t}\n\t\t\t// Using replace would remove all part matching root\n\t\t\tconst firstMatch = source.indexOf(this.root)\n\t\t\t// Ensure we do not remove the leading slash\n\t\t\tconst root = this.root.replace(/\\/$/, '')\n\t\t\treturn dirname(source.slice(firstMatch + root.length) || '/')\n\t\t}\n\n\t\t// This should always be a valid URL\n\t\t// as this is tested in the constructor\n\t\tconst url = new URL(this.source)\n\t\treturn dirname(url.pathname)\n\t}\n\n\t/**\n\t * Is it a file or a folder ?\n\t */\n\tabstract get type(): FileType\n\n\t/**\n\t * Get the file mime\n\t * There is no setter as the mime is not meant to be changed\n\t */\n\tget mime(): string|undefined {\n\t\treturn this._data.mime\n\t}\n\n\t/**\n\t * Get the file modification time\n\t */\n\tget mtime(): Date|undefined {\n\t\treturn this._data.mtime\n\t}\n\n\t/**\n\t * Set the file modification time\n\t */\n\tset mtime(mtime: Date|undefined) {\n\t\tthis._data.mtime = mtime\n\t}\n\n\t/**\n\t * Get the file creation time\n\t * There is no setter as the creation time is not meant to be changed\n\t */\n\tget crtime(): Date|undefined {\n\t\treturn this._data.crtime\n\t}\n\n\t/**\n\t * Get the file size\n\t */\n\tget size(): number|undefined {\n\t\treturn this._data.size\n\t}\n\n\t/**\n\t * Set the file size\n\t */\n\tset size(size: number|undefined) {\n\t\tthis.updateMtime()\n\t\tthis._data.size = size\n\t}\n\n\t/**\n\t * Get the file attribute\n\t * This contains all additional attributes not provided by the Node class\n\t */\n\tget attributes(): Attribute {\n\t\treturn this._attributes\n\t}\n\n\t/**\n\t * Get the file permissions\n\t */\n\tget permissions(): Permission {\n\t\t// If this is not a dav resource, we can only read it\n\t\tif (this.owner === null && !this.isDavResource) {\n\t\t\treturn Permission.READ\n\t\t}\n\n\t\t// If the permissions are not defined, we have none\n\t\treturn this._data.permissions !== undefined\n\t\t\t? this._data.permissions\n\t\t\t: Permission.NONE\n\t}\n\n\t/**\n\t * Set the file permissions\n\t */\n\tset permissions(permissions: Permission) {\n\t\tthis.updateMtime()\n\t\tthis._data.permissions = permissions\n\t}\n\n\t/**\n\t * Get the file owner\n\t * There is no setter as the owner is not meant to be changed\n\t */\n\tget owner(): string|null {\n\t\t// Remote resources have no owner\n\t\tif (!this.isDavResource) {\n\t\t\treturn null\n\t\t}\n\t\treturn this._data.owner\n\t}\n\n\t/**\n\t * Is this a dav-related resource ?\n\t */\n\tget isDavResource(): boolean {\n\t\treturn isDavResource(this.source, this._knownDavService)\n\t}\n\n\t/**\n\t * @deprecated use `isDavResource` instead - will be removed in next major version.\n\t */\n\tget isDavRessource(): boolean {\n\t\treturn this.isDavResource\n\t}\n\n\t/**\n\t * Get the dav root of this object\n\t * There is no setter as the root is not meant to be changed\n\t */\n\tget root(): string|null {\n\t\t// If provided (recommended), use the root and strip away the ending slash\n\t\tif (this._data.root) {\n\t\t\treturn this._data.root.replace(/^(.+)\\/$/, '$1')\n\t\t}\n\n\t\t// Use the source to get the root from the dav service\n\t\tif (this.isDavResource) {\n\t\t\tconst root = dirname(this.source)\n\t\t\treturn root.split(this._knownDavService).pop() || null\n\t\t}\n\n\t\treturn null\n\t}\n\n\t/**\n\t * Get the absolute path of this object relative to the root\n\t */\n\tget path(): string {\n\t\tif (this.root) {\n\t\t\tlet source = this.source\n\t\t\tif (this.isDavResource) {\n\t\t\t\t// ensure we only work on the real path in case root is not distinct\n\t\t\t\tsource = source.split(this._knownDavService).pop()!\n\t\t\t}\n\t\t\t// Using replace would remove all part matching root\n\t\t\tconst firstMatch = source.indexOf(this.root)\n\t\t\t// Ensure we do not remove the leading slash\n\t\t\tconst root = this.root.replace(/\\/$/, '')\n\t\t\treturn source.slice(firstMatch + root.length) || '/'\n\t\t}\n\t\treturn (this.dirname + '/' + this.basename).replace(/\\/\\//g, '/')\n\t}\n\n\t/**\n\t * Get the node id if defined.\n\t * There is no setter as the fileid is not meant to be changed\n\t */\n\tget fileid(): number|undefined {\n\t\treturn this._data?.id\n\t}\n\n\t/**\n\t * Get the node status.\n\t */\n\tget status(): NodeStatus|undefined {\n\t\treturn this._data?.status\n\t}\n\n\t/**\n\t * Set the node status.\n\t */\n\tset status(status: NodeStatus|undefined) {\n\t\tthis._data.status = status\n\t}\n\n\t/**\n\t * Get the node data\n\t */\n\tget data(): NodeData {\n\t\treturn structuredClone(this._data)\n\t}\n\n\t/**\n\t * Move the node to a new destination\n\t *\n\t * @param {string} destination the new source.\n\t * e.g. https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg\n\t */\n\tmove(destination: string) {\n\t\tvalidateData({ ...this._data, source: destination }, this._knownDavService)\n\t\tconst oldBasename = this.basename\n\n\t\tthis._data.source = destination\n\t\t// Check if the displayname and the (old) basename were the same\n\t\t// meaning no special displayname was set but just a fallback to the basename by Nextcloud's WebDAV server\n\t\tif (this.displayname === oldBasename\n\t\t\t&& this.basename !== oldBasename) {\n\t\t\t// We have to assume that the displayname was not set but just a copy of the basename\n\t\t\t// this can not be guaranteed, so to be sure users should better refetch the node\n\t\t\tthis.displayname = this.basename\n\t\t}\n\t\tthis.updateMtime()\n\t}\n\n\t/**\n\t * Rename the node\n\t * This aliases the move method for easier usage\n\t *\n\t * @param basename The new name of the node\n\t */\n\trename(basename: string) {\n\t\tif (basename.includes('/')) {\n\t\t\tthrow new Error('Invalid basename')\n\t\t}\n\t\tthis.move(dirname(this.source) + '/' + basename)\n\t}\n\n\t/**\n\t * Update the mtime if exists\n\t */\n\tupdateMtime() {\n\t\tif (this._data.mtime) {\n\t\t\tthis._data.mtime = new Date()\n\t\t}\n\t}\n\n\t/**\n\t * Update the attributes of the node\n\t * Warning, updating attributes will NOT automatically update the mtime.\n\t *\n\t * @param attributes The new attributes to update on the Node attributes\n\t */\n\tupdate(attributes: Attribute) {\n\t\tfor (const [name, value] of Object.entries(attributes)) {\n\t\t\ttry {\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tdelete this.attributes[name]\n\t\t\t\t} else {\n\t\t\t\t\tthis.attributes[name] = value\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Ignore readonly attributes\n\t\t\t\tif (e instanceof TypeError) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\t// Throw all other exceptions\n\t\t\t\tthrow e\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns a clone of the node\n\t */\n\tabstract clone(): Node\n\n}\n\n/**\n * Interface of the node class\n */\nexport type INode = Pick<Node, keyof Node>\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { FileType } from './fileType'\nimport { Node } from './node'\n\nexport class File extends Node {\n\n\tget type(): FileType.File {\n\t\treturn FileType.File\n\t}\n\n\t/**\n\t * Returns a clone of the file\n\t */\n\tclone(): File {\n\t\treturn new File(this.data)\n\t}\n\n}\n\n/**\n * Interface of the File class\n */\nexport type IFile = Pick<File, keyof File>\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport type { NodeData } from './nodeData'\nimport { FileType } from './fileType'\nimport { Node } from './node'\n\nexport class Folder extends Node {\n\n\tconstructor(data: NodeData) {\n\t\t// enforcing mimes\n\t\tsuper({\n\t\t\t...data,\n\t\t\tmime: 'httpd/unix-directory',\n\t\t})\n\t}\n\n\tget type(): FileType.Folder {\n\t\treturn FileType.Folder\n\t}\n\n\tget extension(): null {\n\t\treturn null\n\t}\n\n\tget mime(): 'httpd/unix-directory' {\n\t\treturn 'httpd/unix-directory'\n\t}\n\n\t/**\n\t * Returns a clone of the folder\n\t */\n\tclone(): Folder {\n\t\treturn new Folder(this.data)\n\t}\n\n}\n\n/**\n * Interface of the folder class\n */\nexport type IFolder = Pick<Folder, keyof Folder>\n","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { Permission } from '../permissions'\n\n/**\n * Parse the WebDAV permission string to a permission enum\n *\n * @param permString The DAV permission string\n */\nexport const parsePermissions = function(permString = ''): number {\n\tlet permissions = Permission.NONE\n\n\tif (!permString) { return permissions }\n\n\tif (permString.includes('C') || permString.includes('K')) { permissions |= Permission.CREATE }\n\n\tif (permString.includes('G')) { permissions |= Permission.READ }\n\n\tif (permString.includes('W') || permString.includes('N') || permString.includes('V')) { permissions |= Permission.UPDATE }\n\n\tif (permString.includes('D')) { permissions |= Permission.DELETE }\n\n\tif (permString.includes('R')) { permissions |= Permission.SHARE }\n\n\treturn permissions\n}\n","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { getCurrentUser } from '@nextcloud/auth'\nimport logger from '../utils/logger'\n\nexport type DavProperty = { [key: string]: string }\n\nexport const defaultDavProperties = [\n\t'd:getcontentlength',\n\t'd:getcontenttype',\n\t'd:getetag',\n\t'd:getlastmodified',\n\t'd:creationdate',\n\t'd:displayname',\n\t'd:quota-available-bytes',\n\t'd:resourcetype',\n\t'nc:has-preview',\n\t'nc:is-encrypted',\n\t'nc:mount-type',\n\t'oc:comments-unread',\n\t'oc:favorite',\n\t'oc:fileid',\n\t'oc:owner-display-name',\n\t'oc:owner-id',\n\t'oc:permissions',\n\t'oc:size',\n]\n\nexport const defaultDavNamespaces = {\n\td: 'DAV:',\n\tnc: 'http://nextcloud.org/ns',\n\toc: 'http://owncloud.org/ns',\n\tocs: 'http://open-collaboration-services.org/ns',\n}\n\n/**\n * Register custom DAV properties\n *\n * Can be used if your app introduces custom DAV properties, so e.g. the files app can make use of it.\n *\n * @param prop The property\n * @param namespace The namespace of the property\n */\nexport const registerDavProperty = function(prop: string, namespace: DavProperty = { nc: 'http://nextcloud.org/ns' }): boolean {\n\tif (typeof window._nc_dav_properties === 'undefined') {\n\t\twindow._nc_dav_properties = [...defaultDavProperties]\n\t\twindow._nc_dav_namespaces = { ...defaultDavNamespaces }\n\t}\n\n\tconst namespaces = { ...window._nc_dav_namespaces, ...namespace }\n\n\t// Check duplicates\n\tif (window._nc_dav_properties.find((search) => search === prop)) {\n\t\tlogger.warn(`${prop} already registered`, { prop })\n\t\treturn false\n\t}\n\n\tif (prop.startsWith('<') || prop.split(':').length !== 2) {\n\t\tlogger.error(`${prop} is not valid. See example: 'oc:fileid'`, { prop })\n\t\treturn false\n\t}\n\n\tconst ns = prop.split(':')[0]\n\tif (!namespaces[ns]) {\n\t\tlogger.error(`${prop} namespace unknown`, { prop, namespaces })\n\t\treturn false\n\t}\n\n\twindow._nc_dav_properties.push(prop)\n\twindow._nc_dav_namespaces = namespaces\n\treturn true\n}\n\n/**\n * Get the registered dav properties\n */\nexport const getDavProperties = function(): string {\n\tif (typeof window._nc_dav_properties === 'undefined') {\n\t\twindow._nc_dav_properties = [...defaultDavProperties]\n\t}\n\n\treturn window._nc_dav_properties.map((prop) => `<${prop} />`).join(' ')\n}\n\n/**\n * Get the registered dav namespaces\n */\nexport const getDavNameSpaces = function(): string {\n\tif (typeof window._nc_dav_namespaces === 'undefined') {\n\t\twindow._nc_dav_namespaces = { ...defaultDavNamespaces }\n\t}\n\n\treturn Object.keys(window._nc_dav_namespaces)\n\t\t.map((ns) => `xmlns:${ns}=\"${window._nc_dav_namespaces?.[ns]}\"`)\n\t\t.join(' ')\n}\n\n/**\n * Get the default PROPFIND request body\n */\nexport const getDefaultPropfind = function(): string {\n\treturn `<?xml version=\"1.0\"?>\n\t\t<d:propfind ${getDavNameSpaces()}>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t</d:propfind>`\n}\n\n/**\n * Get the REPORT body to filter for favorite nodes\n */\nexport const getFavoritesReport = function(): string {\n\treturn `<?xml version=\"1.0\"?>\n\t\t<oc:filter-files ${getDavNameSpaces()}>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t\t<oc:filter-rules>\n\t\t\t\t<oc:favorite>1</oc:favorite>\n\t\t\t</oc:filter-rules>\n\t\t</oc:filter-files>`\n}\n\n/**\n * Get the SEARCH body to search for recently modified files\n *\n * @param lastModified Oldest timestamp to include (Unix timestamp)\n * @example\n * ```ts\n * // SEARCH for recent files need a different DAV endpoint\n * const client = davGetClient(generateRemoteUrl('dav'))\n * // Timestamp of last week\n * const lastWeek = Math.round(Date.now() / 1000) - (60 * 60 * 24 * 7)\n * const contentsResponse = await client.getDirectoryContents(path, {\n * details: true,\n * data: davGetRecentSearch(lastWeek),\n * headers: {\n * method: 'SEARCH',\n * 'Content-Type': 'application/xml; charset=utf-8',\n * },\n * deep: true,\n * }) as ResponseDataDetailed<FileStat[]>\n * ```\n */\nexport const getRecentSearch = function(lastModified: number): string {\n\treturn `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<d:searchrequest ${getDavNameSpaces()}\n\txmlns:ns=\"https://github.com/icewind1991/SearchDAV/ns\">\n\t<d:basicsearch>\n\t\t<d:select>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t</d:select>\n\t\t<d:from>\n\t\t\t<d:scope>\n\t\t\t\t<d:href>/files/${getCurrentUser()?.uid}/</d:href>\n\t\t\t\t<d:depth>infinity</d:depth>\n\t\t\t</d:scope>\n\t\t</d:from>\n\t\t<d:where>\n\t\t\t<d:and>\n\t\t\t\t<d:or>\n\t\t\t\t\t<d:not>\n\t\t\t\t\t\t<d:eq>\n\t\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t\t<d:getcontenttype/>\n\t\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t\t\t<d:literal>httpd/unix-directory</d:literal>\n\t\t\t\t\t\t</d:eq>\n\t\t\t\t\t</d:not>\n\t\t\t\t\t<d:eq>\n\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t<oc:size/>\n\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t\t<d:literal>0</d:literal>\n\t\t\t\t\t</d:eq>\n\t\t\t\t</d:or>\n\t\t\t\t<d:gt>\n\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t<d:getlastmodified/>\n\t\t\t\t\t</d:prop>\n\t\t\t\t\t<d:literal>${lastModified}</d:literal>\n\t\t\t\t</d:gt>\n\t\t\t</d:and>\n\t\t</d:where>\n\t\t<d:orderby>\n\t\t\t<d:order>\n\t\t\t\t<d:prop>\n\t\t\t\t\t<d:getlastmodified/>\n\t\t\t\t</d:prop>\n\t\t\t\t<d:descending/>\n\t\t\t</d:order>\n\t\t</d:orderby>\n\t\t<d:limit>\n\t\t\t<d:nresults>100</d:nresults>\n\t\t\t<ns:firstresult>0</ns:firstresult>\n\t\t</d:limit>\n\t</d:basicsearch>\n</d:searchrequest>`\n}\n","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport type { DAVResultResponseProps, FileStat, ResponseDataDetailed, WebDAVClient } from 'webdav'\nimport type { Node } from '../files/node'\n\nimport { File } from '../files/file'\nimport { Folder } from '../files/folder'\nimport { NodeStatus } from '../files/node'\nimport { NodeData } from '../files/nodeData'\nimport { parsePermissions } from './davPermissions'\nimport { getFavoritesReport } from './davProperties'\n\nimport { getCurrentUser, getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth'\nimport { generateRemoteUrl } from '@nextcloud/router'\nimport { CancelablePromise } from 'cancelable-promise'\nimport { createClient, getPatcher } from 'webdav'\nimport { getSharingToken, isPublicShare } from '@nextcloud/sharing/public'\n\n/**\n * Nextcloud DAV result response\n */\ninterface ResponseProps extends DAVResultResponseProps {\n\tcreationdate: string\n\tpermissions: string\n\tmime: string\n\tfileid: number\n\tsize: number\n\t'owner-id': string | number\n}\n\n/**\n * Get the DAV root path for the current user or public share\n */\nexport function getRootPath(): string {\n\tif (isPublicShare()) {\n\t\treturn `/files/${getSharingToken()}`\n\t}\n\treturn `/files/${getCurrentUser()?.uid}`\n}\n\n/**\n * The DAV root path for the current user\n * This is a cached version of `getRemoteURL`\n */\nexport const defaultRootPath = getRootPath()\n\n/**\n * Get the DAV remote URL used as base URL for the WebDAV client\n * It also handles public shares\n */\nexport function getRemoteURL(): string {\n\tconst url = generateRemoteUrl('dav')\n\tif (isPublicShare()) {\n\t\treturn url.replace('remote.php', 'public.php')\n\t}\n\treturn url\n}\n\n/**\n * The DAV remote URL used as base URL for the WebDAV client\n * This is a cached version of `getRemoteURL`\n */\nexport const defaultRemoteURL = getRemoteURL()\n\n/**\n * Get a WebDAV client configured to include the Nextcloud request token\n *\n * @param remoteURL The DAV server remote URL\n * @param headers Optional additional headers to set for every request\n */\nexport const getClient = function(remoteURL = defaultRemoteURL, headers: Record<string, string> = {}) {\n\tconst client = createClient(remoteURL, { headers })\n\n\t/**\n\t * Set headers for DAV requests\n\t * @param token CSRF token\n\t */\n\tfunction setHeaders(token: string | null) {\n\t\tclient.setHeaders({\n\t\t\t...headers,\n\t\t\t// Add this so the server knows it is an request from the browser\n\t\t\t'X-Requested-With': 'XMLHttpRequest',\n\t\t\t// Inject user auth\n\t\t\trequesttoken: token ?? '',\n\t\t})\n\t}\n\n\t// refresh headers when request token changes\n\tonRequestTokenUpdate(setHeaders)\n\tsetHeaders(getRequestToken())\n\n\t/**\n\t * Allow to override the METHOD to support dav REPORT\n\t *\n\t * @see https://github.com/perry-mitchell/webdav-client/blob/8d9694613c978ce7404e26a401c39a41f125f87f/source/request.ts\n\t */\n\tconst patcher = getPatcher()\n\t// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n\t// @ts-ignore\n\t// https://github.com/perry-mitchell/hot-patcher/issues/6\n\tpatcher.patch('fetch', (url: string, options: RequestInit): Promise<Response> => {\n\t\tconst headers = options.headers as Record<string, string>\n\t\tif (headers?.method) {\n\t\t\toptions.method = headers.method\n\t\t\tdelete headers.method\n\t\t}\n\t\treturn fetch(url, options)\n\t})\n\n\treturn client\n}\n\n/**\n * Use WebDAV to query for favorite Nodes\n *\n * @param davClient The WebDAV client to use for performing the request\n * @param path Base path for the favorites, if unset all favorites are queried\n * @param davRoot The root path for the DAV user (defaults to `defaultRootPath`)\n * @example\n * ```js\n * import { getClient, defaultRootPath, getFavoriteNodes } from '@nextcloud/files'\n *\n * const client = getClient()\n * // query favorites for the root\n * const favorites = await getFavoriteNodes(client)\n * // which is the same as writing:\n * const favorites = await getFavoriteNodes(client, '/', defaultRootPath)\n * ```\n */\nexport const getFavoriteNodes = (davClient: WebDAVClient, path = '/', davRoot = defaultRootPath): CancelablePromise<Node[]> => {\n\tconst controller = new AbortController()\n\treturn new CancelablePromise(async (resolve, reject, onCancel) => {\n\t\tonCancel(() => controller.abort())\n\t\ttry {\n\t\t\tconst contentsResponse = await davClient.getDirectoryContents(`${davRoot}${path}`, {\n\t\t\t\tsignal: controller.signal,\n\t\t\t\tdetails: true,\n\t\t\t\tdata: getFavoritesReport(),\n\t\t\t\theaders: {\n\t\t\t\t\t// see getClient for patched webdav client\n\t\t\t\t\tmethod: 'REPORT',\n\t\t\t\t},\n\t\t\t\tincludeSelf: true,\n\t\t\t}) as ResponseDataDetailed<FileStat[]>\n\n\t\t\tconst nodes = contentsResponse.data\n\t\t\t\t.filter(node => node.filename !== path) // exclude current dir\n\t\t\t\t.map((result) => resultToNode(result, davRoot))\n\t\t\tresolve(nodes)\n\t\t} catch (error) {\n\t\t\treject(error)\n\t\t}\n\t})\n}\n\n/**\n * Covert DAV result `FileStat` to `Node`\n *\n * @param node The DAV result\n * @param filesRoot The DAV files root path\n * @param remoteURL The DAV server remote URL (same as on `getClient`)\n */\nexport const resultToNode = function(node: FileStat, filesRoot = defaultRootPath, remoteURL = defaultRemoteURL): Node {\n\tlet userId = getCurrentUser()?.uid\n\tif (isPublicShare()) {\n\t\tuserId = userId ?? 'anonymous'\n\t} else if (!userId) {\n\t\tthrow new Error('No user id found')\n\t}\n\n\tconst props = node.props as ResponseProps\n\tconst permissions = parsePermissions(props?.permissions)\n\tconst owner = String(props?.['owner-id'] || userId)\n\tconst id = props.fileid || 0\n\n\tconst mtime = new Date(Date.parse(node.lastmod))\n\tconst crtime = new Date(Date.parse(props.creationdate))\n\n\tconst nodeData: NodeData = {\n\t\tid,\n\t\tsource: `${remoteURL}${node.filename}`,\n\t\tmtime: !isNaN(mtime.getTime()) && mtime.getTime() !== 0 ? mtime : undefined,\n\t\tcrtime: !isNaN(crtime.getTime()) && crtime.getTime() !== 0 ? crtime : undefined,\n\t\tmime: node.mime || 'application/octet-stream',\n\t\t// Manually cast to work around for https://github.com/perry-mitchell/webdav-client/pull/380\n\t\tdisplayname: props.displayname !== undefined ? String(props.displayname) : undefined,\n\t\tsize: props?.size || Number.parseInt(props.getcontentlength || '0'),\n\t\t// The fileid is set to -1 for failed requests\n\t\tstatus: id < 0 ? NodeStatus.FAILED : undefined,\n\t\tpermissions,\n\t\towner,\n\t\troot: filesRoot,\n\t\tattributes: {\n\t\t\t...node,\n\t\t\t...props,\n\t\t\thasPreview: props?.['has-preview'],\n\t\t},\n\t}\n\n\tdelete nodeData.attributes?.props\n\n\treturn node.type === 'file' ? new File(nodeData) : new Folder(nodeData)\n}\n"],"names":["Permission","FileType","NodeStatus","basename","headers"],"mappings":"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"}
@@ -23,7 +23,7 @@ var FileType = /* @__PURE__ */ ((FileType2) => {
23
23
  FileType2["File"] = "file";
24
24
  return FileType2;
25
25
  })(FileType || {});
26
- const isDavRessource = function(source, davService) {
26
+ const isDavResource = function(source, davService) {
27
27
  return source.match(davService) !== null;
28
28
  };
29
29
  const validateData = (data, davService) => {
@@ -74,7 +74,7 @@ const validateData = (data, davService) => {
74
74
  if (data.root && !data.source.includes(data.root)) {
75
75
  throw new Error("Root must be part of the source");
76
76
  }
77
- if (data.root && isDavRessource(data.source, davService)) {
77
+ if (data.root && isDavResource(data.source, davService)) {
78
78
  const service = data.source.match(davService)[0];
79
79
  if (!data.source.includes(path.join(service, data.root))) {
80
80
  throw new Error("The root must be relative to the service. e.g /files/emma");
@@ -188,7 +188,7 @@ class Node {
188
188
  get dirname() {
189
189
  if (this.root) {
190
190
  let source = this.source;
191
- if (this.isDavRessource) {
191
+ if (this.isDavResource) {
192
192
  source = source.split(this._knownDavService).pop();
193
193
  }
194
194
  const firstMatch = source.indexOf(this.root);
@@ -248,7 +248,7 @@ class Node {
248
248
  * Get the file permissions
249
249
  */
250
250
  get permissions() {
251
- if (this.owner === null && !this.isDavRessource) {
251
+ if (this.owner === null && !this.isDavResource) {
252
252
  return Permission.READ;
253
253
  }
254
254
  return this._data.permissions !== void 0 ? this._data.permissions : Permission.NONE;
@@ -265,16 +265,22 @@ class Node {
265
265
  * There is no setter as the owner is not meant to be changed
266
266
  */
267
267
  get owner() {
268
- if (!this.isDavRessource) {
268
+ if (!this.isDavResource) {
269
269
  return null;
270
270
  }
271
271
  return this._data.owner;
272
272
  }
273
273
  /**
274
- * Is this a dav-related ressource ?
274
+ * Is this a dav-related resource ?
275
+ */
276
+ get isDavResource() {
277
+ return isDavResource(this.source, this._knownDavService);
278
+ }
279
+ /**
280
+ * @deprecated use `isDavResource` instead - will be removed in next major version.
275
281
  */
276
282
  get isDavRessource() {
277
- return isDavRessource(this.source, this._knownDavService);
283
+ return this.isDavResource;
278
284
  }
279
285
  /**
280
286
  * Get the dav root of this object
@@ -284,7 +290,7 @@ class Node {
284
290
  if (this._data.root) {
285
291
  return this._data.root.replace(/^(.+)\/$/, "$1");
286
292
  }
287
- if (this.isDavRessource) {
293
+ if (this.isDavResource) {
288
294
  const root = path.dirname(this.source);
289
295
  return root.split(this._knownDavService).pop() || null;
290
296
  }
@@ -296,7 +302,7 @@ class Node {
296
302
  get path() {
297
303
  if (this.root) {
298
304
  let source = this.source;
299
- if (this.isDavRessource) {
305
+ if (this.isDavResource) {
300
306
  source = source.split(this._knownDavService).pop();
301
307
  }
302
308
  const firstMatch = source.indexOf(this.root);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dav-CtqjqS4O.cjs","sources":["../../lib/utils/logger.ts","../../lib/permissions.ts","../../lib/files/fileType.ts","../../lib/files/nodeData.ts","../../lib/files/node.ts","../../lib/files/file.ts","../../lib/files/folder.ts","../../lib/dav/davPermissions.ts","../../lib/dav/davProperties.ts","../../lib/dav/dav.ts"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('@nextcloud/files')\n\t.detectUser()\n\t.build()\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/**\n * Node permissions\n */\nexport enum Permission {\n\tNONE = 0,\n\tCREATE = 4,\n\tREAD = 1,\n\tUPDATE = 2,\n\tDELETE = 8,\n\tSHARE = 16,\n\tALL = 31,\n}\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nexport enum FileType {\n\tFolder = 'folder',\n\tFile = 'file',\n}\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { join } from 'path'\nimport { Permission } from '../permissions'\nimport { NodeStatus } from './node'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface Attribute { [key: string]: any }\n\nexport interface NodeData {\n\t/** Unique ID */\n\tid?: number\n\n\t/**\n\t * URL to the resource.\n\t * e.g. https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg\n\t * or https://domain.com/Photos/picture.jpg\n\t */\n\tsource: string\n\n\t/** Last modified time */\n\tmtime?: Date\n\n\t/** Creation time */\n\tcrtime?: Date\n\n\t/** The mime type Optional for folders only */\n\tmime?: string\n\n\t/** The node size type */\n\tsize?: number\n\n\t/** The node permissions */\n\tpermissions?: Permission\n\n\t/** The owner UID of this node */\n\towner: string|null\n\n\t/** Optional the displayname of this node */\n\tdisplayname?: string\n\n\t/** The node attributes */\n\tattributes?: Attribute\n\n\t/**\n\t * The absolute root of the home relative to the service.\n\t * It is highly recommended to provide that information.\n\t * e.g. /files/emma\n\t */\n\troot?: string\n\n\t/** The node status */\n\tstatus?: NodeStatus\n}\n\n/**\n * Check if a node source is from a specific DAV service\n *\n * @param source The source to check\n * @param davService Pattern to check if source is DAV resource\n */\nexport const isDavResource = function(source: string, davService: RegExp): boolean {\n\treturn source.match(davService) !== null\n}\n\n/**\n * Validate Node construct data\n *\n * @param data The node data\n * @param davService Pattern to check if source is DAV ressource\n */\nexport const validateData = (data: NodeData, davService: RegExp) => {\n\tif (data.id && typeof data.id !== 'number') {\n\t\tthrow new Error('Invalid id type of value')\n\t}\n\n\tif (!data.source) {\n\t\tthrow new Error('Missing mandatory source')\n\t}\n\n\ttry {\n\t\t// eslint-disable-next-line no-new\n\t\tnew URL(data.source)\n\t} catch (e) {\n\t\tthrow new Error('Invalid source format, source must be a valid URL')\n\t}\n\n\tif (!data.source.startsWith('http')) {\n\t\tthrow new Error('Invalid source format, only http(s) is supported')\n\t}\n\n\tif (data.displayname && typeof data.displayname !== 'string') {\n\t\tthrow new Error('Invalid displayname type')\n\t}\n\n\tif (data.mtime && !(data.mtime instanceof Date)) {\n\t\tthrow new Error('Invalid mtime type')\n\t}\n\n\tif (data.crtime && !(data.crtime instanceof Date)) {\n\t\tthrow new Error('Invalid crtime type')\n\t}\n\n\tif (!data.mime || typeof data.mime !== 'string'\n\t\t|| !data.mime.match(/^[-\\w.]+\\/[-+\\w.]+$/gi)) {\n\t\tthrow new Error('Missing or invalid mandatory mime')\n\t}\n\n\t// Allow size to be 0\n\tif ('size' in data && typeof data.size !== 'number' && data.size !== undefined) {\n\t\tthrow new Error('Invalid size type')\n\t}\n\n\t// Allow permissions to be 0\n\tif ('permissions' in data\n\t\t&& data.permissions !== undefined\n\t\t&& !(typeof data.permissions === 'number'\n\t\t\t&& data.permissions >= Permission.NONE\n\t\t\t&& data.permissions <= Permission.ALL\n\t\t)) {\n\t\tthrow new Error('Invalid permissions')\n\t}\n\n\tif (data.owner\n\t\t&& data.owner !== null\n\t\t&& typeof data.owner !== 'string') {\n\t\tthrow new Error('Invalid owner type')\n\t}\n\n\tif (data.attributes && typeof data.attributes !== 'object') {\n\t\tthrow new Error('Invalid attributes type')\n\t}\n\n\tif (data.root && typeof data.root !== 'string') {\n\t\tthrow new Error('Invalid root type')\n\t}\n\n\tif (data.root && !data.root.startsWith('/')) {\n\t\tthrow new Error('Root must start with a leading slash')\n\t}\n\n\tif (data.root && !data.source.includes(data.root)) {\n\t\tthrow new Error('Root must be part of the source')\n\t}\n\n\tif (data.root && isDavResource(data.source, davService)) {\n\t\tconst service = data.source.match(davService)![0]\n\t\tif (!data.source.includes(join(service, data.root))) {\n\t\t\tthrow new Error('The root must be relative to the service. e.g /files/emma')\n\t\t}\n\t}\n\n\tif (data.status && !Object.values(NodeStatus).includes(data.status)) {\n\t\tthrow new Error('Status must be a valid NodeStatus')\n\t}\n}\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { basename, extname, dirname } from 'path'\nimport { encodePath } from '@nextcloud/paths'\n\nimport { Permission } from '../permissions'\nimport { FileType } from './fileType'\nimport { Attribute, isDavResource, NodeData, validateData } from './nodeData'\nimport logger from '../utils/logger'\n\nexport enum NodeStatus {\n\t/** This is a new node and it doesn't exists on the filesystem yet */\n\tNEW = 'new',\n\t/** This node has failed and is unavailable */\n\tFAILED = 'failed',\n\t/** This node is currently loading or have an operation in progress */\n\tLOADING = 'loading',\n\t/** This node is locked and cannot be modified */\n\tLOCKED = 'locked',\n}\n\nexport abstract class Node {\n\n\tprivate _data: NodeData\n\tprivate _attributes: Attribute\n\tprivate _knownDavService = /(remote|public)\\.php\\/(web)?dav/i\n\n\tprivate readonlyAttributes = Object.entries(Object.getOwnPropertyDescriptors(Node.prototype))\n\t\t.filter(e => typeof e[1].get === 'function' && e[0] !== '__proto__')\n\t\t.map(e => e[0])\n\n\tprivate handler = {\n\t\tset: (target: Attribute, prop: string, value: unknown): boolean => {\n\t\t\tif (this.readonlyAttributes.includes(prop)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\t// Apply original changes\n\t\t\treturn Reflect.set(target, prop, value)\n\t\t},\n\t\tdeleteProperty: (target: Attribute, prop: string): boolean => {\n\t\t\tif (this.readonlyAttributes.includes(prop)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\t// Apply original changes\n\t\t\treturn Reflect.deleteProperty(target, prop)\n\t\t},\n\t\t// TODO: This is deprecated and only needed for files v3\n\t\tget: (target: Attribute, prop: string, receiver) => {\n\t\t\tif (this.readonlyAttributes.includes(prop)) {\n\t\t\t\tlogger.warn(`Accessing \"Node.attributes.${prop}\" is deprecated, access it directly on the Node instance.`)\n\t\t\t\treturn Reflect.get(this, prop)\n\t\t\t}\n\t\t\treturn Reflect.get(target, prop, receiver)\n\t\t},\n\t} as ProxyHandler<Attribute>\n\n\tconstructor(data: NodeData, davService?: RegExp) {\n\t\t// Validate data\n\t\tvalidateData(data, davService || this._knownDavService)\n\n\t\tthis._data = {\n\t\t\t// TODO: Remove with next major release, this is just for compatibility\n\t\t\tdisplayname: data.attributes?.displayname,\n\t\t\t...data,\n\t\t\tattributes: {},\n\t\t}\n\n\t\t// Proxy the attributes to update the mtime on change\n\t\tthis._attributes = new Proxy(this._data.attributes!, this.handler)\n\n\t\t// Update attributes, this sanitizes the attributes to only contain valid attributes\n\t\tthis.update(data.attributes ?? {})\n\n\t\tif (davService) {\n\t\t\tthis._knownDavService = davService\n\t\t}\n\t}\n\n\t/**\n\t * Get the source url to this object\n\t * There is no setter as the source is not meant to be changed manually.\n\t * You can use the rename or move method to change the source.\n\t */\n\tget source(): string {\n\t\t// strip any ending slash\n\t\treturn this._data.source.replace(/\\/$/i, '')\n\t}\n\n\t/**\n\t * Get the encoded source url to this object for requests purposes\n\t */\n\tget encodedSource(): string {\n\t\tconst { origin } = new URL(this.source)\n\t\treturn origin + encodePath(this.source.slice(origin.length))\n\t}\n\n\t/**\n\t * Get this object name\n\t * There is no setter as the source is not meant to be changed manually.\n\t * You can use the rename or move method to change the source.\n\t */\n\tget basename(): string {\n\t\treturn basename(this.source)\n\t}\n\n\t/**\n\t * The nodes displayname\n\t * By default the display name and the `basename` are identical,\n\t * but it is possible to have a different name. This happens\n\t * on the files app for example for shared folders.\n\t */\n\tget displayname(): string {\n\t\treturn this._data.displayname || this.basename\n\t}\n\n\t/**\n\t * Set the displayname\n\t */\n\tset displayname(displayname: string) {\n\t\tthis._data.displayname = displayname\n\t}\n\n\t/**\n\t * Get this object's extension\n\t * There is no setter as the source is not meant to be changed manually.\n\t * You can use the rename or move method to change the source.\n\t */\n\tget extension(): string|null {\n\t\treturn extname(this.source)\n\t}\n\n\t/**\n\t * Get the directory path leading to this object\n\t * Will use the relative path to root if available\n\t *\n\t * There is no setter as the source is not meant to be changed manually.\n\t * You can use the rename or move method to change the source.\n\t */\n\tget dirname(): string {\n\t\tif (this.root) {\n\t\t\tlet source = this.source\n\t\t\tif (this.isDavResource) {\n\t\t\t\t// ensure we only work on the real path in case root is not distinct\n\t\t\t\tsource = source.split(this._knownDavService).pop()!\n\t\t\t}\n\t\t\t// Using replace would remove all part matching root\n\t\t\tconst firstMatch = source.indexOf(this.root)\n\t\t\t// Ensure we do not remove the leading slash\n\t\t\tconst root = this.root.replace(/\\/$/, '')\n\t\t\treturn dirname(source.slice(firstMatch + root.length) || '/')\n\t\t}\n\n\t\t// This should always be a valid URL\n\t\t// as this is tested in the constructor\n\t\tconst url = new URL(this.source)\n\t\treturn dirname(url.pathname)\n\t}\n\n\t/**\n\t * Is it a file or a folder ?\n\t */\n\tabstract get type(): FileType\n\n\t/**\n\t * Get the file mime\n\t * There is no setter as the mime is not meant to be changed\n\t */\n\tget mime(): string|undefined {\n\t\treturn this._data.mime\n\t}\n\n\t/**\n\t * Get the file modification time\n\t */\n\tget mtime(): Date|undefined {\n\t\treturn this._data.mtime\n\t}\n\n\t/**\n\t * Set the file modification time\n\t */\n\tset mtime(mtime: Date|undefined) {\n\t\tthis._data.mtime = mtime\n\t}\n\n\t/**\n\t * Get the file creation time\n\t * There is no setter as the creation time is not meant to be changed\n\t */\n\tget crtime(): Date|undefined {\n\t\treturn this._data.crtime\n\t}\n\n\t/**\n\t * Get the file size\n\t */\n\tget size(): number|undefined {\n\t\treturn this._data.size\n\t}\n\n\t/**\n\t * Set the file size\n\t */\n\tset size(size: number|undefined) {\n\t\tthis.updateMtime()\n\t\tthis._data.size = size\n\t}\n\n\t/**\n\t * Get the file attribute\n\t * This contains all additional attributes not provided by the Node class\n\t */\n\tget attributes(): Attribute {\n\t\treturn this._attributes\n\t}\n\n\t/**\n\t * Get the file permissions\n\t */\n\tget permissions(): Permission {\n\t\t// If this is not a dav resource, we can only read it\n\t\tif (this.owner === null && !this.isDavResource) {\n\t\t\treturn Permission.READ\n\t\t}\n\n\t\t// If the permissions are not defined, we have none\n\t\treturn this._data.permissions !== undefined\n\t\t\t? this._data.permissions\n\t\t\t: Permission.NONE\n\t}\n\n\t/**\n\t * Set the file permissions\n\t */\n\tset permissions(permissions: Permission) {\n\t\tthis.updateMtime()\n\t\tthis._data.permissions = permissions\n\t}\n\n\t/**\n\t * Get the file owner\n\t * There is no setter as the owner is not meant to be changed\n\t */\n\tget owner(): string|null {\n\t\t// Remote resources have no owner\n\t\tif (!this.isDavResource) {\n\t\t\treturn null\n\t\t}\n\t\treturn this._data.owner\n\t}\n\n\t/**\n\t * Is this a dav-related resource ?\n\t */\n\tget isDavResource(): boolean {\n\t\treturn isDavResource(this.source, this._knownDavService)\n\t}\n\n\t/**\n\t * @deprecated use `isDavResource` instead - will be removed in next major version.\n\t */\n\tget isDavRessource(): boolean {\n\t\treturn this.isDavResource\n\t}\n\n\t/**\n\t * Get the dav root of this object\n\t * There is no setter as the root is not meant to be changed\n\t */\n\tget root(): string|null {\n\t\t// If provided (recommended), use the root and strip away the ending slash\n\t\tif (this._data.root) {\n\t\t\treturn this._data.root.replace(/^(.+)\\/$/, '$1')\n\t\t}\n\n\t\t// Use the source to get the root from the dav service\n\t\tif (this.isDavResource) {\n\t\t\tconst root = dirname(this.source)\n\t\t\treturn root.split(this._knownDavService).pop() || null\n\t\t}\n\n\t\treturn null\n\t}\n\n\t/**\n\t * Get the absolute path of this object relative to the root\n\t */\n\tget path(): string {\n\t\tif (this.root) {\n\t\t\tlet source = this.source\n\t\t\tif (this.isDavResource) {\n\t\t\t\t// ensure we only work on the real path in case root is not distinct\n\t\t\t\tsource = source.split(this._knownDavService).pop()!\n\t\t\t}\n\t\t\t// Using replace would remove all part matching root\n\t\t\tconst firstMatch = source.indexOf(this.root)\n\t\t\t// Ensure we do not remove the leading slash\n\t\t\tconst root = this.root.replace(/\\/$/, '')\n\t\t\treturn source.slice(firstMatch + root.length) || '/'\n\t\t}\n\t\treturn (this.dirname + '/' + this.basename).replace(/\\/\\//g, '/')\n\t}\n\n\t/**\n\t * Get the node id if defined.\n\t * There is no setter as the fileid is not meant to be changed\n\t */\n\tget fileid(): number|undefined {\n\t\treturn this._data?.id\n\t}\n\n\t/**\n\t * Get the node status.\n\t */\n\tget status(): NodeStatus|undefined {\n\t\treturn this._data?.status\n\t}\n\n\t/**\n\t * Set the node status.\n\t */\n\tset status(status: NodeStatus|undefined) {\n\t\tthis._data.status = status\n\t}\n\n\t/**\n\t * Get the node data\n\t */\n\tget data(): NodeData {\n\t\treturn structuredClone(this._data)\n\t}\n\n\t/**\n\t * Move the node to a new destination\n\t *\n\t * @param {string} destination the new source.\n\t * e.g. https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg\n\t */\n\tmove(destination: string) {\n\t\tvalidateData({ ...this._data, source: destination }, this._knownDavService)\n\t\tconst oldBasename = this.basename\n\n\t\tthis._data.source = destination\n\t\t// Check if the displayname and the (old) basename were the same\n\t\t// meaning no special displayname was set but just a fallback to the basename by Nextcloud's WebDAV server\n\t\tif (this.displayname === oldBasename\n\t\t\t&& this.basename !== oldBasename) {\n\t\t\t// We have to assume that the displayname was not set but just a copy of the basename\n\t\t\t// this can not be guaranteed, so to be sure users should better refetch the node\n\t\t\tthis.displayname = this.basename\n\t\t}\n\t\tthis.updateMtime()\n\t}\n\n\t/**\n\t * Rename the node\n\t * This aliases the move method for easier usage\n\t *\n\t * @param basename The new name of the node\n\t */\n\trename(basename: string) {\n\t\tif (basename.includes('/')) {\n\t\t\tthrow new Error('Invalid basename')\n\t\t}\n\t\tthis.move(dirname(this.source) + '/' + basename)\n\t}\n\n\t/**\n\t * Update the mtime if exists\n\t */\n\tupdateMtime() {\n\t\tif (this._data.mtime) {\n\t\t\tthis._data.mtime = new Date()\n\t\t}\n\t}\n\n\t/**\n\t * Update the attributes of the node\n\t * Warning, updating attributes will NOT automatically update the mtime.\n\t *\n\t * @param attributes The new attributes to update on the Node attributes\n\t */\n\tupdate(attributes: Attribute) {\n\t\tfor (const [name, value] of Object.entries(attributes)) {\n\t\t\ttry {\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tdelete this.attributes[name]\n\t\t\t\t} else {\n\t\t\t\t\tthis.attributes[name] = value\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Ignore readonly attributes\n\t\t\t\tif (e instanceof TypeError) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\t// Throw all other exceptions\n\t\t\t\tthrow e\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns a clone of the node\n\t */\n\tabstract clone(): Node\n\n}\n\n/**\n * Interface of the node class\n */\nexport type INode = Pick<Node, keyof Node>\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { FileType } from './fileType'\nimport { Node } from './node'\n\nexport class File extends Node {\n\n\tget type(): FileType.File {\n\t\treturn FileType.File\n\t}\n\n\t/**\n\t * Returns a clone of the file\n\t */\n\tclone(): File {\n\t\treturn new File(this.data)\n\t}\n\n}\n\n/**\n * Interface of the File class\n */\nexport type IFile = Pick<File, keyof File>\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport type { NodeData } from './nodeData'\nimport { FileType } from './fileType'\nimport { Node } from './node'\n\nexport class Folder extends Node {\n\n\tconstructor(data: NodeData) {\n\t\t// enforcing mimes\n\t\tsuper({\n\t\t\t...data,\n\t\t\tmime: 'httpd/unix-directory',\n\t\t})\n\t}\n\n\tget type(): FileType.Folder {\n\t\treturn FileType.Folder\n\t}\n\n\tget extension(): null {\n\t\treturn null\n\t}\n\n\tget mime(): 'httpd/unix-directory' {\n\t\treturn 'httpd/unix-directory'\n\t}\n\n\t/**\n\t * Returns a clone of the folder\n\t */\n\tclone(): Folder {\n\t\treturn new Folder(this.data)\n\t}\n\n}\n\n/**\n * Interface of the folder class\n */\nexport type IFolder = Pick<Folder, keyof Folder>\n","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { Permission } from '../permissions'\n\n/**\n * Parse the WebDAV permission string to a permission enum\n *\n * @param permString The DAV permission string\n */\nexport const parsePermissions = function(permString = ''): number {\n\tlet permissions = Permission.NONE\n\n\tif (!permString) { return permissions }\n\n\tif (permString.includes('C') || permString.includes('K')) { permissions |= Permission.CREATE }\n\n\tif (permString.includes('G')) { permissions |= Permission.READ }\n\n\tif (permString.includes('W') || permString.includes('N') || permString.includes('V')) { permissions |= Permission.UPDATE }\n\n\tif (permString.includes('D')) { permissions |= Permission.DELETE }\n\n\tif (permString.includes('R')) { permissions |= Permission.SHARE }\n\n\treturn permissions\n}\n","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { getCurrentUser } from '@nextcloud/auth'\nimport logger from '../utils/logger'\n\nexport type DavProperty = { [key: string]: string }\n\nexport const defaultDavProperties = [\n\t'd:getcontentlength',\n\t'd:getcontenttype',\n\t'd:getetag',\n\t'd:getlastmodified',\n\t'd:creationdate',\n\t'd:displayname',\n\t'd:quota-available-bytes',\n\t'd:resourcetype',\n\t'nc:has-preview',\n\t'nc:is-encrypted',\n\t'nc:mount-type',\n\t'oc:comments-unread',\n\t'oc:favorite',\n\t'oc:fileid',\n\t'oc:owner-display-name',\n\t'oc:owner-id',\n\t'oc:permissions',\n\t'oc:size',\n]\n\nexport const defaultDavNamespaces = {\n\td: 'DAV:',\n\tnc: 'http://nextcloud.org/ns',\n\toc: 'http://owncloud.org/ns',\n\tocs: 'http://open-collaboration-services.org/ns',\n}\n\n/**\n * Register custom DAV properties\n *\n * Can be used if your app introduces custom DAV properties, so e.g. the files app can make use of it.\n *\n * @param prop The property\n * @param namespace The namespace of the property\n */\nexport const registerDavProperty = function(prop: string, namespace: DavProperty = { nc: 'http://nextcloud.org/ns' }): boolean {\n\tif (typeof window._nc_dav_properties === 'undefined') {\n\t\twindow._nc_dav_properties = [...defaultDavProperties]\n\t\twindow._nc_dav_namespaces = { ...defaultDavNamespaces }\n\t}\n\n\tconst namespaces = { ...window._nc_dav_namespaces, ...namespace }\n\n\t// Check duplicates\n\tif (window._nc_dav_properties.find((search) => search === prop)) {\n\t\tlogger.warn(`${prop} already registered`, { prop })\n\t\treturn false\n\t}\n\n\tif (prop.startsWith('<') || prop.split(':').length !== 2) {\n\t\tlogger.error(`${prop} is not valid. See example: 'oc:fileid'`, { prop })\n\t\treturn false\n\t}\n\n\tconst ns = prop.split(':')[0]\n\tif (!namespaces[ns]) {\n\t\tlogger.error(`${prop} namespace unknown`, { prop, namespaces })\n\t\treturn false\n\t}\n\n\twindow._nc_dav_properties.push(prop)\n\twindow._nc_dav_namespaces = namespaces\n\treturn true\n}\n\n/**\n * Get the registered dav properties\n */\nexport const getDavProperties = function(): string {\n\tif (typeof window._nc_dav_properties === 'undefined') {\n\t\twindow._nc_dav_properties = [...defaultDavProperties]\n\t}\n\n\treturn window._nc_dav_properties.map((prop) => `<${prop} />`).join(' ')\n}\n\n/**\n * Get the registered dav namespaces\n */\nexport const getDavNameSpaces = function(): string {\n\tif (typeof window._nc_dav_namespaces === 'undefined') {\n\t\twindow._nc_dav_namespaces = { ...defaultDavNamespaces }\n\t}\n\n\treturn Object.keys(window._nc_dav_namespaces)\n\t\t.map((ns) => `xmlns:${ns}=\"${window._nc_dav_namespaces?.[ns]}\"`)\n\t\t.join(' ')\n}\n\n/**\n * Get the default PROPFIND request body\n */\nexport const getDefaultPropfind = function(): string {\n\treturn `<?xml version=\"1.0\"?>\n\t\t<d:propfind ${getDavNameSpaces()}>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t</d:propfind>`\n}\n\n/**\n * Get the REPORT body to filter for favorite nodes\n */\nexport const getFavoritesReport = function(): string {\n\treturn `<?xml version=\"1.0\"?>\n\t\t<oc:filter-files ${getDavNameSpaces()}>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t\t<oc:filter-rules>\n\t\t\t\t<oc:favorite>1</oc:favorite>\n\t\t\t</oc:filter-rules>\n\t\t</oc:filter-files>`\n}\n\n/**\n * Get the SEARCH body to search for recently modified files\n *\n * @param lastModified Oldest timestamp to include (Unix timestamp)\n * @example\n * ```ts\n * // SEARCH for recent files need a different DAV endpoint\n * const client = davGetClient(generateRemoteUrl('dav'))\n * // Timestamp of last week\n * const lastWeek = Math.round(Date.now() / 1000) - (60 * 60 * 24 * 7)\n * const contentsResponse = await client.getDirectoryContents(path, {\n * details: true,\n * data: davGetRecentSearch(lastWeek),\n * headers: {\n * method: 'SEARCH',\n * 'Content-Type': 'application/xml; charset=utf-8',\n * },\n * deep: true,\n * }) as ResponseDataDetailed<FileStat[]>\n * ```\n */\nexport const getRecentSearch = function(lastModified: number): string {\n\treturn `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<d:searchrequest ${getDavNameSpaces()}\n\txmlns:ns=\"https://github.com/icewind1991/SearchDAV/ns\">\n\t<d:basicsearch>\n\t\t<d:select>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t</d:select>\n\t\t<d:from>\n\t\t\t<d:scope>\n\t\t\t\t<d:href>/files/${getCurrentUser()?.uid}/</d:href>\n\t\t\t\t<d:depth>infinity</d:depth>\n\t\t\t</d:scope>\n\t\t</d:from>\n\t\t<d:where>\n\t\t\t<d:and>\n\t\t\t\t<d:or>\n\t\t\t\t\t<d:not>\n\t\t\t\t\t\t<d:eq>\n\t\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t\t<d:getcontenttype/>\n\t\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t\t\t<d:literal>httpd/unix-directory</d:literal>\n\t\t\t\t\t\t</d:eq>\n\t\t\t\t\t</d:not>\n\t\t\t\t\t<d:eq>\n\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t<oc:size/>\n\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t\t<d:literal>0</d:literal>\n\t\t\t\t\t</d:eq>\n\t\t\t\t</d:or>\n\t\t\t\t<d:gt>\n\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t<d:getlastmodified/>\n\t\t\t\t\t</d:prop>\n\t\t\t\t\t<d:literal>${lastModified}</d:literal>\n\t\t\t\t</d:gt>\n\t\t\t</d:and>\n\t\t</d:where>\n\t\t<d:orderby>\n\t\t\t<d:order>\n\t\t\t\t<d:prop>\n\t\t\t\t\t<d:getlastmodified/>\n\t\t\t\t</d:prop>\n\t\t\t\t<d:descending/>\n\t\t\t</d:order>\n\t\t</d:orderby>\n\t\t<d:limit>\n\t\t\t<d:nresults>100</d:nresults>\n\t\t\t<ns:firstresult>0</ns:firstresult>\n\t\t</d:limit>\n\t</d:basicsearch>\n</d:searchrequest>`\n}\n","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport type { DAVResultResponseProps, FileStat, ResponseDataDetailed, WebDAVClient } from 'webdav'\nimport type { Node } from '../files/node'\n\nimport { File } from '../files/file'\nimport { Folder } from '../files/folder'\nimport { NodeStatus } from '../files/node'\nimport { NodeData } from '../files/nodeData'\nimport { parsePermissions } from './davPermissions'\nimport { getFavoritesReport } from './davProperties'\n\nimport { getCurrentUser, getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth'\nimport { generateRemoteUrl } from '@nextcloud/router'\nimport { CancelablePromise } from 'cancelable-promise'\nimport { createClient, getPatcher } from 'webdav'\nimport { getSharingToken, isPublicShare } from '@nextcloud/sharing/public'\n\n/**\n * Nextcloud DAV result response\n */\ninterface ResponseProps extends DAVResultResponseProps {\n\tcreationdate: string\n\tpermissions: string\n\tmime: string\n\tfileid: number\n\tsize: number\n\t'owner-id': string | number\n}\n\n/**\n * Get the DAV root path for the current user or public share\n */\nexport function getRootPath(): string {\n\tif (isPublicShare()) {\n\t\treturn `/files/${getSharingToken()}`\n\t}\n\treturn `/files/${getCurrentUser()?.uid}`\n}\n\n/**\n * The DAV root path for the current user\n * This is a cached version of `getRemoteURL`\n */\nexport const defaultRootPath = getRootPath()\n\n/**\n * Get the DAV remote URL used as base URL for the WebDAV client\n * It also handles public shares\n */\nexport function getRemoteURL(): string {\n\tconst url = generateRemoteUrl('dav')\n\tif (isPublicShare()) {\n\t\treturn url.replace('remote.php', 'public.php')\n\t}\n\treturn url\n}\n\n/**\n * The DAV remote URL used as base URL for the WebDAV client\n * This is a cached version of `getRemoteURL`\n */\nexport const defaultRemoteURL = getRemoteURL()\n\n/**\n * Get a WebDAV client configured to include the Nextcloud request token\n *\n * @param remoteURL The DAV server remote URL\n * @param headers Optional additional headers to set for every request\n */\nexport const getClient = function(remoteURL = defaultRemoteURL, headers: Record<string, string> = {}) {\n\tconst client = createClient(remoteURL, { headers })\n\n\t/**\n\t * Set headers for DAV requests\n\t * @param token CSRF token\n\t */\n\tfunction setHeaders(token: string | null) {\n\t\tclient.setHeaders({\n\t\t\t...headers,\n\t\t\t// Add this so the server knows it is an request from the browser\n\t\t\t'X-Requested-With': 'XMLHttpRequest',\n\t\t\t// Inject user auth\n\t\t\trequesttoken: token ?? '',\n\t\t})\n\t}\n\n\t// refresh headers when request token changes\n\tonRequestTokenUpdate(setHeaders)\n\tsetHeaders(getRequestToken())\n\n\t/**\n\t * Allow to override the METHOD to support dav REPORT\n\t *\n\t * @see https://github.com/perry-mitchell/webdav-client/blob/8d9694613c978ce7404e26a401c39a41f125f87f/source/request.ts\n\t */\n\tconst patcher = getPatcher()\n\t// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n\t// @ts-ignore\n\t// https://github.com/perry-mitchell/hot-patcher/issues/6\n\tpatcher.patch('fetch', (url: string, options: RequestInit): Promise<Response> => {\n\t\tconst headers = options.headers as Record<string, string>\n\t\tif (headers?.method) {\n\t\t\toptions.method = headers.method\n\t\t\tdelete headers.method\n\t\t}\n\t\treturn fetch(url, options)\n\t})\n\n\treturn client\n}\n\n/**\n * Use WebDAV to query for favorite Nodes\n *\n * @param davClient The WebDAV client to use for performing the request\n * @param path Base path for the favorites, if unset all favorites are queried\n * @param davRoot The root path for the DAV user (defaults to `defaultRootPath`)\n * @example\n * ```js\n * import { getClient, defaultRootPath, getFavoriteNodes } from '@nextcloud/files'\n *\n * const client = getClient()\n * // query favorites for the root\n * const favorites = await getFavoriteNodes(client)\n * // which is the same as writing:\n * const favorites = await getFavoriteNodes(client, '/', defaultRootPath)\n * ```\n */\nexport const getFavoriteNodes = (davClient: WebDAVClient, path = '/', davRoot = defaultRootPath): CancelablePromise<Node[]> => {\n\tconst controller = new AbortController()\n\treturn new CancelablePromise(async (resolve, reject, onCancel) => {\n\t\tonCancel(() => controller.abort())\n\t\ttry {\n\t\t\tconst contentsResponse = await davClient.getDirectoryContents(`${davRoot}${path}`, {\n\t\t\t\tsignal: controller.signal,\n\t\t\t\tdetails: true,\n\t\t\t\tdata: getFavoritesReport(),\n\t\t\t\theaders: {\n\t\t\t\t\t// see getClient for patched webdav client\n\t\t\t\t\tmethod: 'REPORT',\n\t\t\t\t},\n\t\t\t\tincludeSelf: true,\n\t\t\t}) as ResponseDataDetailed<FileStat[]>\n\n\t\t\tconst nodes = contentsResponse.data\n\t\t\t\t.filter(node => node.filename !== path) // exclude current dir\n\t\t\t\t.map((result) => resultToNode(result, davRoot))\n\t\t\tresolve(nodes)\n\t\t} catch (error) {\n\t\t\treject(error)\n\t\t}\n\t})\n}\n\n/**\n * Covert DAV result `FileStat` to `Node`\n *\n * @param node The DAV result\n * @param filesRoot The DAV files root path\n * @param remoteURL The DAV server remote URL (same as on `getClient`)\n */\nexport const resultToNode = function(node: FileStat, filesRoot = defaultRootPath, remoteURL = defaultRemoteURL): Node {\n\tlet userId = getCurrentUser()?.uid\n\tif (isPublicShare()) {\n\t\tuserId = userId ?? 'anonymous'\n\t} else if (!userId) {\n\t\tthrow new Error('No user id found')\n\t}\n\n\tconst props = node.props as ResponseProps\n\tconst permissions = parsePermissions(props?.permissions)\n\tconst owner = String(props?.['owner-id'] || userId)\n\tconst id = props.fileid || 0\n\n\tconst mtime = new Date(Date.parse(node.lastmod))\n\tconst crtime = new Date(Date.parse(props.creationdate))\n\n\tconst nodeData: NodeData = {\n\t\tid,\n\t\tsource: `${remoteURL}${node.filename}`,\n\t\tmtime: !isNaN(mtime.getTime()) && mtime.getTime() !== 0 ? mtime : undefined,\n\t\tcrtime: !isNaN(crtime.getTime()) && crtime.getTime() !== 0 ? crtime : undefined,\n\t\tmime: node.mime || 'application/octet-stream',\n\t\t// Manually cast to work around for https://github.com/perry-mitchell/webdav-client/pull/380\n\t\tdisplayname: props.displayname !== undefined ? String(props.displayname) : undefined,\n\t\tsize: props?.size || Number.parseInt(props.getcontentlength || '0'),\n\t\t// The fileid is set to -1 for failed requests\n\t\tstatus: id < 0 ? NodeStatus.FAILED : undefined,\n\t\tpermissions,\n\t\towner,\n\t\troot: filesRoot,\n\t\tattributes: {\n\t\t\t...node,\n\t\t\t...props,\n\t\t\thasPreview: props?.['has-preview'],\n\t\t},\n\t}\n\n\tdelete nodeData.attributes?.props\n\n\treturn node.type === 'file' ? new File(nodeData) : new Folder(nodeData)\n}\n"],"names":["getLoggerBuilder","Permission","FileType","join","NodeStatus","encodePath","basename","extname","dirname","getCurrentUser","isPublicShare","getSharingToken","generateRemoteUrl","createClient","onRequestTokenUpdate","getRequestToken","getPatcher","headers","path","CancelablePromise"],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { FileStat, WebDAVClient } from 'webdav';
2
+ import { Node } from '../files/node';
3
+ import { CancelablePromise } from 'cancelable-promise';
4
+
5
+ /**
6
+ * Get the DAV root path for the current user or public share
7
+ */
8
+ export declare function getRootPath(): string;
9
+ /**
10
+ * The DAV root path for the current user
11
+ * This is a cached version of `getRemoteURL`
12
+ */
13
+ export declare const defaultRootPath: string;
14
+ /**
15
+ * Get the DAV remote URL used as base URL for the WebDAV client
16
+ * It also handles public shares
17
+ */
18
+ export declare function getRemoteURL(): string;
19
+ /**
20
+ * The DAV remote URL used as base URL for the WebDAV client
21
+ * This is a cached version of `getRemoteURL`
22
+ */
23
+ export declare const defaultRemoteURL: string;
24
+ /**
25
+ * Get a WebDAV client configured to include the Nextcloud request token
26
+ *
27
+ * @param remoteURL The DAV server remote URL
28
+ * @param headers Optional additional headers to set for every request
29
+ */
30
+ export declare const getClient: (remoteURL?: string, headers?: Record<string, string>) => WebDAVClient;
31
+ /**
32
+ * Use WebDAV to query for favorite Nodes
33
+ *
34
+ * @param davClient The WebDAV client to use for performing the request
35
+ * @param path Base path for the favorites, if unset all favorites are queried
36
+ * @param davRoot The root path for the DAV user (defaults to `defaultRootPath`)
37
+ * @example
38
+ * ```js
39
+ * import { getClient, defaultRootPath, getFavoriteNodes } from '@nextcloud/files'
40
+ *
41
+ * const client = getClient()
42
+ * // query favorites for the root
43
+ * const favorites = await getFavoriteNodes(client)
44
+ * // which is the same as writing:
45
+ * const favorites = await getFavoriteNodes(client, '/', defaultRootPath)
46
+ * ```
47
+ */
48
+ export declare const getFavoriteNodes: (davClient: WebDAVClient, path?: string, davRoot?: string) => CancelablePromise<Node[]>;
49
+ /**
50
+ * Covert DAV result `FileStat` to `Node`
51
+ *
52
+ * @param node The DAV result
53
+ * @param filesRoot The DAV files root path
54
+ * @param remoteURL The DAV server remote URL (same as on `getClient`)
55
+ */
56
+ export declare const resultToNode: (node: FileStat, filesRoot?: string, remoteURL?: string) => Node;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Parse the WebDAV permission string to a permission enum
3
+ *
4
+ * @param permString The DAV permission string
5
+ */
6
+ export declare const parsePermissions: (permString?: string) => number;
@@ -0,0 +1,57 @@
1
+ export type DavProperty = {
2
+ [key: string]: string;
3
+ };
4
+ export declare const defaultDavProperties: string[];
5
+ export declare const defaultDavNamespaces: {
6
+ d: string;
7
+ nc: string;
8
+ oc: string;
9
+ ocs: string;
10
+ };
11
+ /**
12
+ * Register custom DAV properties
13
+ *
14
+ * Can be used if your app introduces custom DAV properties, so e.g. the files app can make use of it.
15
+ *
16
+ * @param prop The property
17
+ * @param namespace The namespace of the property
18
+ */
19
+ export declare const registerDavProperty: (prop: string, namespace?: DavProperty) => boolean;
20
+ /**
21
+ * Get the registered dav properties
22
+ */
23
+ export declare const getDavProperties: () => string;
24
+ /**
25
+ * Get the registered dav namespaces
26
+ */
27
+ export declare const getDavNameSpaces: () => string;
28
+ /**
29
+ * Get the default PROPFIND request body
30
+ */
31
+ export declare const getDefaultPropfind: () => string;
32
+ /**
33
+ * Get the REPORT body to filter for favorite nodes
34
+ */
35
+ export declare const getFavoritesReport: () => string;
36
+ /**
37
+ * Get the SEARCH body to search for recently modified files
38
+ *
39
+ * @param lastModified Oldest timestamp to include (Unix timestamp)
40
+ * @example
41
+ * ```ts
42
+ * // SEARCH for recent files need a different DAV endpoint
43
+ * const client = davGetClient(generateRemoteUrl('dav'))
44
+ * // Timestamp of last week
45
+ * const lastWeek = Math.round(Date.now() / 1000) - (60 * 60 * 24 * 7)
46
+ * const contentsResponse = await client.getDirectoryContents(path, {
47
+ * details: true,
48
+ * data: davGetRecentSearch(lastWeek),
49
+ * headers: {
50
+ * method: 'SEARCH',
51
+ * 'Content-Type': 'application/xml; charset=utf-8',
52
+ * },
53
+ * deep: true,
54
+ * }) as ResponseDataDetailed<FileStat[]>
55
+ * ```
56
+ */
57
+ export declare const getRecentSearch: (lastModified: number) => string;
@@ -0,0 +1,13 @@
1
+ /*!
2
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
3
+ * SPDX-License-Identifier: AGPL-3.0-or-later
4
+ */
5
+ /**
6
+ * This module provides utils to work with the Nextcloud WebDAV interface.
7
+ *
8
+ * The DAV functions are based on the [`webdav`](https://www.npmjs.com/package/webdav) package.
9
+ * @packageDocumentation
10
+ */
11
+ export * from './dav';
12
+ export * from './davPermissions';
13
+ export * from './davProperties';
package/dist/dav.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const dav = require("./chunks/dav-BBwoJ8WE.cjs");
3
+ const dav = require("./chunks/dav-CtqjqS4O.cjs");
4
4
  exports.defaultDavNamespaces = dav.defaultDavNamespaces;
5
5
  exports.defaultDavProperties = dav.defaultDavProperties;
6
6
  exports.defaultRemoteURL = dav.defaultRemoteURL;
package/dist/dav.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { h, f, b, d, c, k, j, l, e, m, n, a, g, p, i, r } from "./chunks/dav-DxfiR0wZ.mjs";
1
+ import { h, f, b, d, c, k, j, l, e, m, n, a, g, p, i, r } from "./chunks/dav-Co9y-hkg.mjs";
2
2
  export {
3
3
  h as defaultDavNamespaces,
4
4
  f as defaultDavProperties,
@@ -0,0 +1,84 @@
1
+ import { Node } from './files/node';
2
+ import { View } from './navigation/view';
3
+
4
+ export declare enum DefaultType {
5
+ DEFAULT = "default",
6
+ HIDDEN = "hidden"
7
+ }
8
+ export interface FileActionData {
9
+ /** Unique ID */
10
+ id: string;
11
+ /** Translatable string displayed in the menu */
12
+ displayName: (files: Node[], view: View) => string;
13
+ /** Translatable title for of the action */
14
+ title?: (files: Node[], view: View) => string;
15
+ /** Svg as inline string. <svg><path fill="..." /></svg> */
16
+ iconSvgInline: (files: Node[], view: View) => string;
17
+ /** Condition wether this action is shown or not */
18
+ enabled?: (files: Node[], view: View) => boolean;
19
+ /**
20
+ * Function executed on single file action
21
+ * @return true if the action was executed successfully,
22
+ * false otherwise and null if the action is silent/undefined.
23
+ * @throws Error if the action failed
24
+ */
25
+ exec: (file: Node, view: View, dir: string) => Promise<boolean | null>;
26
+ /**
27
+ * Function executed on multiple files action
28
+ * @return true if the action was executed successfully,
29
+ * false otherwise and null if the action is silent/undefined.
30
+ * @throws Error if the action failed
31
+ */
32
+ execBatch?: (files: Node[], view: View, dir: string) => Promise<(boolean | null)[]>;
33
+ /** This action order in the list */
34
+ order?: number;
35
+ /**
36
+ * Set to true if this action is a destructive action, like "delete".
37
+ * This will change the appearance in the action menu more prominent (e.g. red colored)
38
+ */
39
+ destructive?: boolean;
40
+ /**
41
+ * This action's parent id in the list.
42
+ * If none found, will be displayed as a top-level action.
43
+ */
44
+ parent?: string;
45
+ /**
46
+ * Make this action the default.
47
+ * If multiple actions are default, the first one
48
+ * will be used. The other ones will be put as first
49
+ * entries in the actions menu iff DefaultType.Hidden is not used.
50
+ * A DefaultType.Hidden action will never be shown
51
+ * in the actions menu even if another action takes
52
+ * its place as default.
53
+ */
54
+ default?: DefaultType;
55
+ /**
56
+ * If true, the renderInline function will be called
57
+ */
58
+ inline?: (file: Node, view: View) => boolean;
59
+ /**
60
+ * If defined, the returned html element will be
61
+ * appended before the actions menu.
62
+ */
63
+ renderInline?: (file: Node, view: View) => Promise<HTMLElement | null>;
64
+ }
65
+ export declare class FileAction {
66
+ private _action;
67
+ constructor(action: FileActionData);
68
+ get id(): string;
69
+ get displayName(): (files: Node[], view: View) => string;
70
+ get title(): ((files: Node[], view: View) => string) | undefined;
71
+ get iconSvgInline(): (files: Node[], view: View) => string;
72
+ get enabled(): ((files: Node[], view: View) => boolean) | undefined;
73
+ get exec(): (file: Node, view: View, dir: string) => Promise<boolean | null>;
74
+ get execBatch(): ((files: Node[], view: View, dir: string) => Promise<(boolean | null)[]>) | undefined;
75
+ get order(): number | undefined;
76
+ get parent(): string | undefined;
77
+ get default(): DefaultType | undefined;
78
+ get destructive(): boolean | undefined;
79
+ get inline(): ((file: Node, view: View) => boolean) | undefined;
80
+ get renderInline(): ((file: Node, view: View) => Promise<HTMLElement | null>) | undefined;
81
+ private validateAction;
82
+ }
83
+ export declare const registerFileAction: (action: FileAction) => void;
84
+ export declare const getFileActions: () => FileAction[];