@@ -7,7 +7,7 @@ import { encodePath } from '@nextcloud/paths'
77
88import { Permission } from '../permissions'
99import { FileType } from './fileType'
10- import { Attribute , isDavResource , NodeData , validateData } from './nodeData'
10+ import { Attribute , fixDates , fixRegExp , isDavResource , NodeData , validateData } from './nodeData'
1111import logger from '../utils/logger'
1212
1313export enum NodeStatus {
@@ -21,11 +21,14 @@ export enum NodeStatus {
2121 LOCKED = 'locked' ,
2222}
2323
24+ type NodeConstructorData = [ NodeData , RegExp ?]
25+
2426export abstract class Node {
2527
26- private _data : NodeData
2728 private _attributes : Attribute
28- private _knownDavService = / ( r e m o t e | p u b l i c ) \. p h p \/ ( w e b ) ? d a v / i
29+
30+ protected _data : NodeData
31+ protected _knownDavService = / ( r e m o t e | p u b l i c ) \. p h p \/ ( w e b ) ? d a v / i
2932
3033 private readonlyAttributes = Object . entries ( Object . getOwnPropertyDescriptors ( Node . prototype ) )
3134 . filter ( e => typeof e [ 1 ] . get === 'function' && e [ 0 ] !== '__proto__' )
@@ -58,13 +61,17 @@ export abstract class Node {
5861 } ,
5962 } as ProxyHandler < Attribute >
6063
61- constructor ( data : NodeData , davService ?: RegExp ) {
64+ protected constructor ( ... [ data , davService ] : NodeConstructorData ) {
6265 if ( ! data . mime ) {
6366 data . mime = 'application/octet-stream'
6467 }
6568
69+ // Fix primitive types if needed
70+ fixDates ( data )
71+ davService = fixRegExp ( davService || this . _knownDavService )
72+
6673 // Validate data
67- validateData ( data , davService || this . _knownDavService )
74+ validateData ( data , davService )
6875
6976 this . _data = {
7077 // TODO: Remove with next major release, this is just for compatibility
@@ -346,13 +353,6 @@ export abstract class Node {
346353 this . _data . status = status
347354 }
348355
349- /**
350- * Get the node data
351- */
352- get data ( ) : NodeData {
353- return structuredClone ( this . _data )
354- }
355-
356356 /**
357357 * Move the node to a new destination
358358 *
@@ -424,7 +424,17 @@ export abstract class Node {
424424 /**
425425 * Returns a clone of the node
426426 */
427- abstract clone ( ) : Node
427+ clone ( ) : this {
428+ // @ts -expect-error -- this class is abstract and cannot be instantiated directly but all its children can
429+ return new this . constructor ( structuredClone ( this . _data ) , this . _knownDavService )
430+ }
431+
432+ /**
433+ * JSON representation of the node
434+ */
435+ toJSON ( ) : string {
436+ return JSON . stringify ( [ structuredClone ( this . _data ) , this . _knownDavService . toString ( ) ] )
437+ }
428438
429439}
430440
0 commit comments