@elderbyte/ngx-starter 18.1.0-beta2 → 18.2.0-beta
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.
- package/esm2022/lib/common/utils/input-utils.mjs +6 -0
- package/esm2022/lib/components/data-view/table/activation/elder-table-activation.directive.mjs +14 -7
- package/esm2022/lib/components/files/blob-viewer/elder-blob-viewer.component.mjs +17 -23
- package/esm2022/lib/components/files/elder-file-select.directive.mjs +83 -85
- package/esm2022/lib/components/files/listing/file-entry.mjs +15 -30
- package/esm2022/lib/components/files/listing/file-listing-rx.mjs +70 -30
- package/esm2022/lib/components/forms/directives/validation/validators/elder-multiple-of.validator.mjs +17 -13
- package/fesm2022/elderbyte-ngx-starter.mjs +154 -425
- package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
- package/lib/common/utils/input-utils.d.ts +18 -0
- package/lib/components/data-view/table/activation/elder-table-activation.directive.d.ts +4 -1
- package/lib/components/files/blob-viewer/elder-blob-viewer.component.d.ts +3 -3
- package/lib/components/files/elder-file-select.directive.d.ts +23 -16
- package/lib/components/files/listing/file-entry.d.ts +1 -10
- package/lib/components/files/listing/file-listing-rx.d.ts +6 -3
- package/lib/components/forms/directives/validation/validators/elder-multiple-of.validator.d.ts +2 -4
- package/package.json +1 -1
- package/esm2022/lib/components/files/elder-file-select-input.mjs +0 -119
- package/esm2022/lib/components/files/file-system-api.mjs +0 -96
- package/esm2022/lib/components/files/listing/file-listing-system-handle.mjs +0 -35
- package/esm2022/lib/components/files/listing/file-listing-webkit.mjs +0 -77
- package/lib/components/files/elder-file-select-input.d.ts +0 -59
- package/lib/components/files/file-system-api.d.ts +0 -86
- package/lib/components/files/listing/file-listing-system-handle.d.ts +0 -21
- package/lib/components/files/listing/file-listing-webkit.d.ts +0 -26
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* To support empty input attributes and fall back to a default value.
|
|
3
|
+
* This is centralized in case Angular ever decides to change empty attributes
|
|
4
|
+
* to another value than an empty string (undefined, null etc.)
|
|
5
|
+
*
|
|
6
|
+
* e.g.
|
|
7
|
+
* <some-component directiveA> </some-component>
|
|
8
|
+
*
|
|
9
|
+
* .@Input("directiveA")
|
|
10
|
+
* public set valueA(input: SomeType | InputUtils): SomeType {
|
|
11
|
+
* return input instanceOf InputUtils ? SomeType.Empty() : input;
|
|
12
|
+
* }
|
|
13
|
+
*
|
|
14
|
+
*/
|
|
15
|
+
export type NoInputArgs = '';
|
|
16
|
+
export declare class InputUtils {
|
|
17
|
+
static isNoInputArgs(input: any): input is NoInputArgs;
|
|
18
|
+
}
|
|
@@ -6,6 +6,7 @@ import { ElderTableActivationOptions } from './elder-table-activation-options';
|
|
|
6
6
|
import { ItemActivationOptions } from './item-activation-options';
|
|
7
7
|
import { ItemActivationEvent } from './item-activation-event';
|
|
8
8
|
import { ElderActivationContext } from './elder-activation-context';
|
|
9
|
+
import { NoInputArgs } from '../../../../common/utils/input-utils';
|
|
9
10
|
import * as i0 from "@angular/core";
|
|
10
11
|
export declare class ElderTableActivationDirective<T> implements ElderActivationContext<T>, AfterViewInit, OnDestroy {
|
|
11
12
|
private readonly elderTable;
|
|
@@ -20,7 +21,7 @@ export declare class ElderTableActivationDirective<T> implements ElderActivation
|
|
|
20
21
|
private _data;
|
|
21
22
|
readonly activeItem$: BehaviorSubject<T>;
|
|
22
23
|
readonly rows$: BehaviorSubject<ElderTableRowDirective<T>[]>;
|
|
23
|
-
|
|
24
|
+
private _activationOptions;
|
|
24
25
|
/***************************************************************************
|
|
25
26
|
* *
|
|
26
27
|
* Constructor *
|
|
@@ -45,6 +46,8 @@ export declare class ElderTableActivationDirective<T> implements ElderActivation
|
|
|
45
46
|
* Properties *
|
|
46
47
|
* *
|
|
47
48
|
**************************************************************************/
|
|
49
|
+
set activationOptions(options: ElderTableActivationOptions | NoInputArgs);
|
|
50
|
+
get activationOptions(): ElderTableActivationOptions;
|
|
48
51
|
get activeItemEventChange(): Observable<ItemActivationEvent<T>>;
|
|
49
52
|
get activeItemChange(): Observable<T>;
|
|
50
53
|
get activeItem(): T;
|
|
@@ -4,6 +4,7 @@ import { BlobUrl } from '../blob-url';
|
|
|
4
4
|
import { BehaviorSubject } from 'rxjs';
|
|
5
5
|
import { HttpClientPristine } from '../../../common/http/http-client-pristine';
|
|
6
6
|
import { ElderToastService } from '../../toasts/elder-toast.service';
|
|
7
|
+
import { BooleanInput } from '@angular/cdk/coercion';
|
|
7
8
|
import * as i0 from "@angular/core";
|
|
8
9
|
declare class BlobContext {
|
|
9
10
|
readonly safeUrl: SafeUrl;
|
|
@@ -43,7 +44,6 @@ export declare class ElderBlobViewerComponent implements OnInit, OnDestroy {
|
|
|
43
44
|
private readonly _url$;
|
|
44
45
|
private readonly _mimeType$;
|
|
45
46
|
private readonly destroy$;
|
|
46
|
-
private _displayUnknownAsText;
|
|
47
47
|
/***************************************************************************
|
|
48
48
|
* *
|
|
49
49
|
* Constructor *
|
|
@@ -66,7 +66,7 @@ export declare class ElderBlobViewerComponent implements OnInit, OnDestroy {
|
|
|
66
66
|
* Attempt to display unknown blobs as text. (i.e. mime-type is octet-stream)
|
|
67
67
|
* @param unknownAsText
|
|
68
68
|
*/
|
|
69
|
-
|
|
69
|
+
displayUnknownAsText: import("@angular/core").InputSignalWithTransform<boolean, BooleanInput>;
|
|
70
70
|
/**
|
|
71
71
|
* Set a in memory blob to display.
|
|
72
72
|
* @param blob
|
|
@@ -102,6 +102,6 @@ export declare class ElderBlobViewerComponent implements OnInit, OnDestroy {
|
|
|
102
102
|
private canDisplayAsText;
|
|
103
103
|
private downloadAsText;
|
|
104
104
|
static ɵfac: i0.ɵɵFactoryDeclaration<ElderBlobViewerComponent, never>;
|
|
105
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ElderBlobViewerComponent, "elder-blob-viewer", never, { "displayUnknownAsText": { "alias": "displayUnknownAsText"; "required": false; }; "blob": { "alias": "blob"; "required": false; }; "blobUrl": { "alias": "blobUrl"; "required": false; }; "url": { "alias": "url"; "required": false; }; "mimeType": { "alias": "mimeType"; "required": false; }; }, {}, never, never, true, never>;
|
|
105
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ElderBlobViewerComponent, "elder-blob-viewer", never, { "displayUnknownAsText": { "alias": "displayUnknownAsText"; "required": false; "isSignal": true; }; "blob": { "alias": "blob"; "required": false; }; "blobUrl": { "alias": "blobUrl"; "required": false; }; "url": { "alias": "url"; "required": false; }; "mimeType": { "alias": "mimeType"; "required": false; }; }, {}, never, never, true, never>;
|
|
106
106
|
}
|
|
107
107
|
export {};
|
|
@@ -1,31 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ElementRef, EventEmitter, OnDestroy, OnInit, Renderer2 } from '@angular/core';
|
|
2
2
|
import { BooleanInput } from '@angular/cdk/coercion';
|
|
3
3
|
import { FileEntry } from './listing/file-entry';
|
|
4
|
-
import { FileSystemDirectoryPickerOptions, FileSystemFilePickerOptions } from './file-system-api';
|
|
5
|
-
import { Observable } from 'rxjs';
|
|
6
4
|
import * as i0 from "@angular/core";
|
|
7
5
|
export declare class ElderFileSelectDirective implements OnInit, OnDestroy {
|
|
8
|
-
private renderer;
|
|
9
6
|
private el;
|
|
10
|
-
private
|
|
7
|
+
private renderer;
|
|
11
8
|
/***************************************************************************
|
|
12
9
|
* *
|
|
13
10
|
* Fields *
|
|
14
11
|
* *
|
|
15
12
|
**************************************************************************/
|
|
16
13
|
private readonly logger;
|
|
14
|
+
private _fileInput;
|
|
15
|
+
private _unlisten;
|
|
17
16
|
readonly elderFileSelectChange: EventEmitter<FileEntry[]>;
|
|
18
17
|
readonly elderSingleFileSelectChange: EventEmitter<File>;
|
|
19
|
-
private
|
|
20
|
-
private
|
|
21
|
-
private
|
|
22
|
-
private _useDirectoryPicker;
|
|
18
|
+
private _multiple;
|
|
19
|
+
private _directory;
|
|
20
|
+
private _accept;
|
|
23
21
|
/***************************************************************************
|
|
24
22
|
* *
|
|
25
23
|
* Constructor *
|
|
26
24
|
* *
|
|
27
25
|
**************************************************************************/
|
|
28
|
-
constructor(
|
|
26
|
+
constructor(el: ElementRef, renderer: Renderer2);
|
|
29
27
|
/***************************************************************************
|
|
30
28
|
* *
|
|
31
29
|
* Life Cycle *
|
|
@@ -39,9 +37,6 @@ export declare class ElderFileSelectDirective implements OnInit, OnDestroy {
|
|
|
39
37
|
* *
|
|
40
38
|
**************************************************************************/
|
|
41
39
|
set elderFileSelect(value: string);
|
|
42
|
-
private buildTypeOption;
|
|
43
|
-
private isFileExtension;
|
|
44
|
-
private isMimeType;
|
|
45
40
|
set elderFileSelectMultiple(value: BooleanInput);
|
|
46
41
|
/**
|
|
47
42
|
* Allow the user to select a directory. All files that are recursively contained are selected.
|
|
@@ -55,14 +50,26 @@ export declare class ElderFileSelectDirective implements OnInit, OnDestroy {
|
|
|
55
50
|
* *
|
|
56
51
|
**************************************************************************/
|
|
57
52
|
onClick(event: any): void;
|
|
53
|
+
openFileSelectDialog(): void;
|
|
58
54
|
/***************************************************************************
|
|
59
55
|
* *
|
|
60
56
|
* Private methods *
|
|
61
57
|
* *
|
|
62
58
|
**************************************************************************/
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
59
|
+
/**
|
|
60
|
+
* <input type="file"
|
|
61
|
+
* hidden #fileInput
|
|
62
|
+
* [multiple]="multiple"
|
|
63
|
+
* [accept]="accept"
|
|
64
|
+
* (change)="fileInputChanged()"
|
|
65
|
+
* />
|
|
66
|
+
*/
|
|
67
|
+
private createFileSelect;
|
|
68
|
+
private removeFileSelect;
|
|
69
|
+
private fileInputChanged;
|
|
70
|
+
private clearFileList;
|
|
71
|
+
private emitFileList;
|
|
72
|
+
private toFileEntries;
|
|
66
73
|
static ɵfac: i0.ɵɵFactoryDeclaration<ElderFileSelectDirective, never>;
|
|
67
74
|
static ɵdir: i0.ɵɵDirectiveDeclaration<ElderFileSelectDirective, "[elderFileSelect]", never, { "elderFileSelect": { "alias": "elderFileSelect"; "required": false; }; "elderFileSelectMultiple": { "alias": "elderFileSelectMultiple"; "required": false; }; "elderFileSelectDirectory": { "alias": "elderFileSelectDirectory"; "required": false; }; }, { "elderFileSelectChange": "elderFileSelectChange"; "elderSingleFileSelectChange": "elderSingleFileSelectChange"; }, never, never, true, never>;
|
|
68
75
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
1
|
/**
|
|
3
2
|
* Represents a file and the relative path where the user has selected it.
|
|
4
3
|
* This is useful if the user has selected a folder and files
|
|
@@ -11,7 +10,6 @@ export declare class FileEntry {
|
|
|
11
10
|
* to this file. Only relevant if the user has selected a folder.
|
|
12
11
|
*/
|
|
13
12
|
readonly relativeParent: string | null;
|
|
14
|
-
readonly fileHandle?: FileSystemFileHandle;
|
|
15
13
|
/**
|
|
16
14
|
* Creates a file Entry without an explicit relative parent.
|
|
17
15
|
*
|
|
@@ -20,16 +18,10 @@ export declare class FileEntry {
|
|
|
20
18
|
* which is also supported by this method.
|
|
21
19
|
*/
|
|
22
20
|
static ofFile(file: File): FileEntry;
|
|
23
|
-
/**
|
|
24
|
-
* Creates an Observable of a File Entry by resolving its FileSystemFileHandle.
|
|
25
|
-
* @param fileHandle
|
|
26
|
-
* @param rootDirectory is needed to build a relative parent
|
|
27
|
-
*/
|
|
28
|
-
static ofFileHandle(fileHandle: FileSystemFileHandle, rootDirectory?: FileSystemDirectoryHandle): Observable<FileEntry>;
|
|
29
21
|
/**
|
|
30
22
|
* Creates a file Entry with a relative parent path
|
|
31
23
|
*/
|
|
32
|
-
static relativeFile(file: File, relativeParent: string | null
|
|
24
|
+
static relativeFile(file: File, relativeParent: string | null): FileEntry;
|
|
33
25
|
static toFileMap(entries: FileEntry[]): Map<File, FileEntry>;
|
|
34
26
|
static toFileArray(entries: FileEntry[]): File[];
|
|
35
27
|
/***************************************************************************
|
|
@@ -56,5 +48,4 @@ export declare class FileEntry {
|
|
|
56
48
|
* Returns a string which specifies the file's path relative to the directory selected by the user.
|
|
57
49
|
*/
|
|
58
50
|
private static buildRelativePath;
|
|
59
|
-
private static buildRelativeParent;
|
|
60
51
|
}
|
|
@@ -9,12 +9,15 @@ export declare class FileListingRx {
|
|
|
9
9
|
* *
|
|
10
10
|
**************************************************************************/
|
|
11
11
|
toFileList(transferItemList: DataTransferItemList): Observable<FileEntry[]>;
|
|
12
|
+
listFilesRecursive(entry: FileSystemEntry): Observable<FileEntry[]>;
|
|
12
13
|
/***************************************************************************
|
|
13
14
|
* *
|
|
14
15
|
* Private methods *
|
|
15
16
|
* *
|
|
16
17
|
**************************************************************************/
|
|
17
|
-
private
|
|
18
|
-
private
|
|
19
|
-
private
|
|
18
|
+
private listFilesRecursiveAsync;
|
|
19
|
+
private observableFile;
|
|
20
|
+
private trimStaringSlash;
|
|
21
|
+
private readEntries;
|
|
22
|
+
private consumeReaderToCompletion;
|
|
20
23
|
}
|
package/lib/components/forms/directives/validation/validators/elder-multiple-of.validator.d.ts
CHANGED
|
@@ -21,9 +21,7 @@ export declare class ElderMultipleOfValidator implements Validator {
|
|
|
21
21
|
* Fields *
|
|
22
22
|
* *
|
|
23
23
|
**************************************************************************/
|
|
24
|
-
|
|
25
|
-
set elderMultipleOf(value: number | number[] | null);
|
|
26
|
-
get factor(): number | number[] | null;
|
|
24
|
+
factor: import("@angular/core").InputSignalWithTransform<number | number[], number | "" | number[]>;
|
|
27
25
|
/***************************************************************************
|
|
28
26
|
* *
|
|
29
27
|
* Public API *
|
|
@@ -31,5 +29,5 @@ export declare class ElderMultipleOfValidator implements Validator {
|
|
|
31
29
|
**************************************************************************/
|
|
32
30
|
validate(control: AbstractControl): ValidationErrors | null;
|
|
33
31
|
static ɵfac: i0.ɵɵFactoryDeclaration<ElderMultipleOfValidator, never>;
|
|
34
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<ElderMultipleOfValidator, "[elderMultipleOf][formControlName],[elderMultipleOf][formControl],[elderMultipleOf][ngModel]", never, { "
|
|
32
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<ElderMultipleOfValidator, "[elderMultipleOf][formControlName],[elderMultipleOf][formControl],[elderMultipleOf][ngModel]", never, { "factor": { "alias": "elderMultipleOf"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
35
33
|
}
|
package/package.json
CHANGED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { FileEntry } from './listing/file-entry';
|
|
2
|
-
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
3
|
-
import { LoggerFactory } from '@elderbyte/ts-logger';
|
|
4
|
-
import { Subject } from 'rxjs';
|
|
5
|
-
export class ElderFileSelectInput {
|
|
6
|
-
/***************************************************************************
|
|
7
|
-
* *
|
|
8
|
-
* Constructor *
|
|
9
|
-
* *
|
|
10
|
-
**************************************************************************/
|
|
11
|
-
constructor(renderer, el) {
|
|
12
|
-
this.renderer = renderer;
|
|
13
|
-
this.el = el;
|
|
14
|
-
/***************************************************************************
|
|
15
|
-
* *
|
|
16
|
-
* Fields *
|
|
17
|
-
* *
|
|
18
|
-
**************************************************************************/
|
|
19
|
-
this.logger = LoggerFactory.getLogger(this.constructor.name);
|
|
20
|
-
this._filesSelected = new Subject;
|
|
21
|
-
}
|
|
22
|
-
/***************************************************************************
|
|
23
|
-
* *
|
|
24
|
-
* Properties *
|
|
25
|
-
* *
|
|
26
|
-
**************************************************************************/
|
|
27
|
-
get filesSelected() {
|
|
28
|
-
return this._filesSelected;
|
|
29
|
-
}
|
|
30
|
-
set elderFileSelect(value) {
|
|
31
|
-
this._accept = value;
|
|
32
|
-
if (this._fileInput) {
|
|
33
|
-
this.renderer.setProperty(this._fileInput, 'accept', value);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
set elderFileSelectMultiple(value) {
|
|
37
|
-
this._multiple = coerceBooleanProperty(value);
|
|
38
|
-
if (this._fileInput) {
|
|
39
|
-
this.renderer.setProperty(this._fileInput, 'multiple', value);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
set elderFileSelectDirectory(value) {
|
|
43
|
-
this._directory = coerceBooleanProperty(value);
|
|
44
|
-
if (this._fileInput) {
|
|
45
|
-
this.renderer.setAttribute(this._fileInput, 'webkitdirectory', 'true');
|
|
46
|
-
this.renderer.setAttribute(this._fileInput, 'directory', 'true');
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
/***************************************************************************
|
|
50
|
-
* *
|
|
51
|
-
* Public API *
|
|
52
|
-
* *
|
|
53
|
-
**************************************************************************/
|
|
54
|
-
/**
|
|
55
|
-
* <input type="file"
|
|
56
|
-
* hidden #fileInput
|
|
57
|
-
* [multiple]="multiple"
|
|
58
|
-
* [accept]="accept"
|
|
59
|
-
* (change)="fileInputChanged()"
|
|
60
|
-
* />
|
|
61
|
-
*/
|
|
62
|
-
createFileSelect() {
|
|
63
|
-
this._fileInput = this.renderer.createElement('input');
|
|
64
|
-
this.renderer.setAttribute(this._fileInput, 'hidden', 'true');
|
|
65
|
-
this.renderer.setAttribute(this._fileInput, 'type', 'file');
|
|
66
|
-
this.renderer.appendChild(this.el.nativeElement, this._fileInput);
|
|
67
|
-
if (this._accept) {
|
|
68
|
-
this.renderer.setProperty(this._fileInput, 'accept', this._accept);
|
|
69
|
-
}
|
|
70
|
-
if (this._multiple) {
|
|
71
|
-
this.renderer.setProperty(this._fileInput, 'multiple', this._multiple);
|
|
72
|
-
}
|
|
73
|
-
if (this._directory) {
|
|
74
|
-
this.renderer.setAttribute(this._fileInput, 'webkitdirectory', 'true');
|
|
75
|
-
this.renderer.setAttribute(this._fileInput, 'directory', 'true');
|
|
76
|
-
}
|
|
77
|
-
this._unlisten = this.renderer.listen(this._fileInput, 'change', event => {
|
|
78
|
-
this.fileInputChanged(this._fileInput.files);
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
removeFileSelect() {
|
|
82
|
-
if (this._unlisten) {
|
|
83
|
-
this._unlisten();
|
|
84
|
-
this._unlisten = null;
|
|
85
|
-
}
|
|
86
|
-
if (this._fileInput) {
|
|
87
|
-
this.renderer.removeChild(this.el.nativeElement, this._fileInput);
|
|
88
|
-
this._fileInput = null;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
openFileSelectDialog() {
|
|
92
|
-
this._fileInput.click();
|
|
93
|
-
}
|
|
94
|
-
/***************************************************************************
|
|
95
|
-
* *
|
|
96
|
-
* Private methods *
|
|
97
|
-
* *
|
|
98
|
-
**************************************************************************/
|
|
99
|
-
fileInputChanged(fileList) {
|
|
100
|
-
const files = this.toFileEntries(fileList);
|
|
101
|
-
this.logger.debug('fileInputChanged, files:', files);
|
|
102
|
-
this.clearFileList();
|
|
103
|
-
this._filesSelected.next(files);
|
|
104
|
-
}
|
|
105
|
-
clearFileList() {
|
|
106
|
-
// not nice but works
|
|
107
|
-
this._fileInput.value = null;
|
|
108
|
-
}
|
|
109
|
-
toFileEntries(fileList) {
|
|
110
|
-
const files = [];
|
|
111
|
-
for (const key in fileList) {
|
|
112
|
-
if (!isNaN(parseInt(key, 0))) {
|
|
113
|
-
files.push(FileEntry.ofFile(fileList[key]));
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
return files;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItZmlsZS1zZWxlY3QtaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL2ZpbGVzL2VsZGVyLWZpbGUtc2VsZWN0LWlucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUUvQyxPQUFPLEVBQWUscUJBQXFCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFhLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUd6QyxNQUFNLE9BQU8sb0JBQW9CO0lBcUIvQjs7OztnRkFJNEU7SUFFNUUsWUFDVSxRQUFtQixFQUNuQixFQUFjO1FBRGQsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBMUJ4Qjs7OztvRkFJNEU7UUFFM0QsV0FBTSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVN4RCxtQkFBYyxHQUFHLElBQUksT0FBb0IsQ0FBQztJQWEzRCxDQUFDO0lBRUQ7Ozs7Z0ZBSTRFO0lBRTVFLElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQVcsZUFBZSxDQUFDLEtBQWE7UUFDdEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7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Q0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVNLG9CQUFvQjtRQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFHRDs7OztnRkFJNEU7SUFHcEUsZ0JBQWdCLENBQUMsUUFBa0I7UUFDekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVPLGFBQWE7UUFDbkIscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRU8sYUFBYSxDQUFDLFFBQWtCO1FBQ3RDLE1BQU0sS0FBSyxHQUFnQixFQUFFLENBQUM7UUFDOUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUlGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtGaWxlRW50cnl9IGZyb20gJy4vbGlzdGluZy9maWxlLWVudHJ5JztcbmltcG9ydCB7RWxlbWVudFJlZiwgUmVuZGVyZXIyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Qm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge0xvZ2dlckZhY3Rvcnl9IGZyb20gJ0BlbGRlcmJ5dGUvdHMtbG9nZ2VyJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5cblxuZXhwb3J0IGNsYXNzIEVsZGVyRmlsZVNlbGVjdElucHV0IHtcblxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBGaWVsZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIodGhpcy5jb25zdHJ1Y3Rvci5uYW1lKTtcblxuICBwcml2YXRlIF9maWxlSW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQ7XG4gIHByaXZhdGUgX3VubGlzdGVuOiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgX211bHRpcGxlOiBib29sZWFuO1xuICBwcml2YXRlIF9kaXJlY3Rvcnk6IGJvb2xlYW47XG4gIHByaXZhdGUgX2FjY2VwdDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZpbGVzU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxGaWxlRW50cnlbXT47XG5cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogQ29uc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZlxuICApIHtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHB1YmxpYyBnZXQgZmlsZXNTZWxlY3RlZCgpOiBPYnNlcnZhYmxlPEZpbGVFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVzU2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGVsZGVyRmlsZVNlbGVjdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYWNjZXB0ID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuX2ZpbGVJbnB1dCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9maWxlSW5wdXQsICdhY2NlcHQnLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldCBlbGRlckZpbGVTZWxlY3RNdWx0aXBsZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fbXVsdGlwbGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIGlmICh0aGlzLl9maWxlSW5wdXQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZmlsZUlucHV0LCAnbXVsdGlwbGUnLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldCBlbGRlckZpbGVTZWxlY3REaXJlY3RvcnkodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2RpcmVjdG9yeSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgaWYgKHRoaXMuX2ZpbGVJbnB1dCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5fZmlsZUlucHV0LCAnd2Via2l0ZGlyZWN0b3J5JywgJ3RydWUnKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuX2ZpbGVJbnB1dCwgJ2RpcmVjdG9yeScsICd0cnVlJyk7XG4gICAgfVxuICB9XG5cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHVibGljIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogPGlucHV0IHR5cGU9XCJmaWxlXCJcbiAgICogICAgIGhpZGRlbiAjZmlsZUlucHV0XG4gICAqICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGVcIlxuICAgKiAgICAgW2FjY2VwdF09XCJhY2NlcHRcIlxuICAgKiAgICAgKGNoYW5nZSk9XCJmaWxlSW5wdXRDaGFuZ2VkKClcIlxuICAgKiAvPlxuICAgKi9cbiAgcHVibGljIGNyZWF0ZUZpbGVTZWxlY3QoKTogdm9pZCB7XG5cbiAgICB0aGlzLl9maWxlSW5wdXQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5fZmlsZUlucHV0LCAnaGlkZGVuJywgJ3RydWUnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLl9maWxlSW5wdXQsICd0eXBlJywgJ2ZpbGUnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5fZmlsZUlucHV0KTtcblxuICAgIGlmICh0aGlzLl9hY2NlcHQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZmlsZUlucHV0LCAnYWNjZXB0JywgdGhpcy5fYWNjZXB0KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX211bHRpcGxlKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2ZpbGVJbnB1dCwgJ211bHRpcGxlJywgdGhpcy5fbXVsdGlwbGUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGlyZWN0b3J5KSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLl9maWxlSW5wdXQsICd3ZWJraXRkaXJlY3RvcnknLCAndHJ1ZScpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5fZmlsZUlucHV0LCAnZGlyZWN0b3J5JywgJ3RydWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLl91bmxpc3RlbiA9IHRoaXMucmVuZGVyZXIubGlzdGVuKFxuICAgICAgdGhpcy5fZmlsZUlucHV0LFxuICAgICAgJ2NoYW5nZScsXG4gICAgICBldmVudCA9PiB7XG4gICAgICAgIHRoaXMuZmlsZUlucHV0Q2hhbmdlZCh0aGlzLl9maWxlSW5wdXQuZmlsZXMpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRmlsZVNlbGVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdW5saXN0ZW4pIHtcbiAgICAgIHRoaXMuX3VubGlzdGVuKCk7XG4gICAgICB0aGlzLl91bmxpc3RlbiA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLl9maWxlSW5wdXQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLl9maWxlSW5wdXQpO1xuICAgICAgdGhpcy5fZmlsZUlucHV0ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3BlbkZpbGVTZWxlY3REaWFsb2coKTogdm9pZCB7XG4gICAgdGhpcy5fZmlsZUlucHV0LmNsaWNrKCk7XG4gIH1cblxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcml2YXRlIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cbiAgcHJpdmF0ZSBmaWxlSW5wdXRDaGFuZ2VkKGZpbGVMaXN0OiBGaWxlTGlzdCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbGVzID0gdGhpcy50b0ZpbGVFbnRyaWVzKGZpbGVMaXN0KTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZmlsZUlucHV0Q2hhbmdlZCwgZmlsZXM6JywgZmlsZXMpO1xuICAgIHRoaXMuY2xlYXJGaWxlTGlzdCgpO1xuICAgIHRoaXMuX2ZpbGVzU2VsZWN0ZWQubmV4dChmaWxlcyk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyRmlsZUxpc3QoKSB7XG4gICAgLy8gbm90IG5pY2UgYnV0IHdvcmtzXG4gICAgdGhpcy5fZmlsZUlucHV0LnZhbHVlID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgdG9GaWxlRW50cmllcyhmaWxlTGlzdDogRmlsZUxpc3QpOiBGaWxlRW50cnlbXSB7XG4gICAgY29uc3QgZmlsZXM6IEZpbGVFbnRyeVtdID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZmlsZUxpc3QpIHtcbiAgICAgIGlmICghaXNOYU4ocGFyc2VJbnQoa2V5LCAwKSkpIHtcbiAgICAgICAgZmlsZXMucHVzaChGaWxlRW50cnkub2ZGaWxlKGZpbGVMaXN0W2tleV0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbGVzO1xuICB9XG5cblxuXG59XG4iXX0=
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { from, of, throwError } from 'rxjs';
|
|
2
|
-
import { map } from 'rxjs/operators';
|
|
3
|
-
/***************************************************************************
|
|
4
|
-
* *
|
|
5
|
-
* FileSystem API *
|
|
6
|
-
* *
|
|
7
|
-
**************************************************************************/
|
|
8
|
-
/**
|
|
9
|
-
* Holds experimental features of the browser `File System API`. No typescript lint checks
|
|
10
|
-
* are performed here!
|
|
11
|
-
*/
|
|
12
|
-
export class FileSystemApi {
|
|
13
|
-
/***************************************************************************
|
|
14
|
-
* *
|
|
15
|
-
* DataTransferItem *
|
|
16
|
-
* *
|
|
17
|
-
**************************************************************************/
|
|
18
|
-
static isGetAsFileSystemHandleSupported(transferItem) {
|
|
19
|
-
// @ts-ignore
|
|
20
|
-
return transferItem.getAsFileSystemHandle !== undefined;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Returns an FileSystemHandle Observable of the given DataTransferItem. The FileSystemHandle can only be accessed in the `dragstart`
|
|
24
|
-
* or `drop` event. Otherwise, it will return null!
|
|
25
|
-
*/
|
|
26
|
-
static getAsFileSystemHandle(transferItem) {
|
|
27
|
-
// @ts-ignore
|
|
28
|
-
return from(transferItem.getAsFileSystemHandle());
|
|
29
|
-
}
|
|
30
|
-
/***************************************************************************
|
|
31
|
-
* *
|
|
32
|
-
* File Picker *
|
|
33
|
-
* *
|
|
34
|
-
**************************************************************************/
|
|
35
|
-
static isFileSystemSupported() {
|
|
36
|
-
return 'showOpenFilePicker' in window;
|
|
37
|
-
}
|
|
38
|
-
static openFilePicker(pickerOpts) {
|
|
39
|
-
try {
|
|
40
|
-
// @ts-ignore
|
|
41
|
-
return from(window.showOpenFilePicker(pickerOpts));
|
|
42
|
-
}
|
|
43
|
-
catch (e) {
|
|
44
|
-
return throwError(() => new Error(e));
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/***************************************************************************
|
|
48
|
-
* *
|
|
49
|
-
* Directory Picker *
|
|
50
|
-
* *
|
|
51
|
-
**************************************************************************/
|
|
52
|
-
static isDirectoryPickerSupported() {
|
|
53
|
-
return 'showDirectoryPicker' in window;
|
|
54
|
-
}
|
|
55
|
-
static openDirectoryPicker(pickerOpts) {
|
|
56
|
-
try {
|
|
57
|
-
// @ts-ignore
|
|
58
|
-
return from(window.showDirectoryPicker(pickerOpts));
|
|
59
|
-
}
|
|
60
|
-
catch (e) {
|
|
61
|
-
return throwError(() => new Error(e));
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
/***************************************************************************
|
|
65
|
-
* *
|
|
66
|
-
* FileSystemDirectoryHandle *
|
|
67
|
-
* *
|
|
68
|
-
**************************************************************************/
|
|
69
|
-
static getHandlesFromDirectory(dirHandle) {
|
|
70
|
-
return from(FileSystemApi.getHandlesFromDirectoryAsync(dirHandle));
|
|
71
|
-
}
|
|
72
|
-
static buildRelativeParent(fileOrDirHandle, rootDirectory) {
|
|
73
|
-
if (rootDirectory == null) {
|
|
74
|
-
return of(undefined);
|
|
75
|
-
}
|
|
76
|
-
const relativeParents$ = from(rootDirectory.resolve(fileOrDirHandle));
|
|
77
|
-
return relativeParents$.pipe(map(parents => {
|
|
78
|
-
// path/to/folder/file.jpg
|
|
79
|
-
const path = parents;
|
|
80
|
-
// root/path/to/folder/file.jpg
|
|
81
|
-
path.unshift(rootDirectory.name);
|
|
82
|
-
// root/path/to/folder
|
|
83
|
-
path.pop();
|
|
84
|
-
return path.join('/');
|
|
85
|
-
}));
|
|
86
|
-
}
|
|
87
|
-
static async getHandlesFromDirectoryAsync(dirHandle) {
|
|
88
|
-
const handles = [];
|
|
89
|
-
// @ts-ignore
|
|
90
|
-
for await (const handle of dirHandle.values()) {
|
|
91
|
-
handles.push(handle);
|
|
92
|
-
}
|
|
93
|
-
return handles;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1zeXN0ZW0tYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWxkZXJieXRlL25neC1zdGFydGVyL3NyYy9saWIvY29tcG9uZW50cy9maWxlcy9maWxlLXN5c3RlbS1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLElBQUksRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3RELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQWlEbkM7Ozs7NEVBSTRFO0FBRTVFOzs7R0FHRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBRXhCOzs7O2dGQUk0RTtJQUVyRSxNQUFNLENBQUMsZ0NBQWdDLENBQUMsWUFBOEI7UUFDM0UsYUFBYTtRQUNiLE9BQU8sWUFBWSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLHFCQUFxQixDQUFDLFlBQThCO1FBQ2hFLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7OztnRkFJNEU7SUFFckUsTUFBTSxDQUFDLHFCQUFxQjtRQUNqQyxPQUFPLG9CQUFvQixJQUFJLE1BQU0sQ0FBQztJQUN4QyxDQUFDO0lBRU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUF1QztRQUNsRSxJQUFJLENBQUM7WUFDSCxhQUFhO1lBQ2IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Z0ZBSTRFO0lBRXJFLE1BQU0sQ0FBQywwQkFBMEI7UUFDdEMsT0FBTyxxQkFBcUIsSUFBSSxNQUFNLENBQUM7SUFDekMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxVQUE0QztRQUM1RSxJQUFJLENBQUM7WUFDSCxhQUFhO1lBQ2IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Z0ZBSTRFO0lBRXJFLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxTQUFvQztRQUN4RSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU0sTUFBTSxDQUFDLG1CQUFtQixDQUMvQixlQUFpQyxFQUNqQyxhQUF5QztRQUd6QyxJQUFJLGFBQWEsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN4QixPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUMxQixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDWiwwQkFBMEI7WUFDMUIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDO1lBRXJCLCtCQUErQjtZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVqQyxzQkFBc0I7WUFDdEIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBRU8sTUFBTSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxTQUFvQztRQUNwRixNQUFNLE9BQU8sR0FBdUIsRUFBRSxDQUFDO1FBQ3ZDLGFBQWE7UUFDYixJQUFJLEtBQUssRUFBRSxNQUFNLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUM5QyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Zyb20sIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yfSBmcm9tICdyeGpzJztcbmltcG9ydCB7bWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAqIEZpbGUgUGlja2VyIE9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlU3lzdGVtRmlsZVBpY2tlck9wdGlvbnMge1xuICAvKipcbiAgICpcbiAgICogYGBgXG4gICAqICAgdHlwZXM6IFtcbiAgICogICAgIHtcbiAgICogICAgICAgZGVzY3JpcHRpb246IFwiSW1hZ2VzXCIsXG4gICAqICAgICAgIGFjY2VwdDoge1xuICAgKiAgICAgICAgIFwiaW1hZ2UvKlwiOiBbXCIucG5nXCIsIFwiLmdpZlwiLCBcIi5qcGVnXCIsIFwiLmpwZ1wiXSxcbiAgICogICAgICAgfSxcbiAgICogICAgIH0sXG4gICAqICAgXSxcbiAgICogICBleGNsdWRlQWNjZXB0QWxsT3B0aW9uOiB0cnVlLFxuICAgKiAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICogYGBgXG4gICAqL1xuICBleGNsdWRlQWNjZXB0QWxsT3B0aW9ucz86IGJvb2xlYW4sXG4gIGlkPzogc3RyaW5nLFxuICBtdWx0aXBsZT86IGJvb2xlYW4sXG4gIHN0YXJ0SW4/OiBGaWxlU3lzdGVtSGFuZGxlIHwgJ2Rlc2t0b3AnIHwgJ2RvY3VtZW50cycgfCAnZG93bmxvYWRzJyB8ICdtdXNpYycgfCAncGljdHVyZXMnIHwgJ3ZpZGVvcycsXG4gIHR5cGVzPzogRmlsZVN5c3RlbUZpbGVQaWNrZXJUeXBlT3B0aW9uc1tdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVN5c3RlbUZpbGVQaWNrZXJUeXBlT3B0aW9ucyB7XG4gIGFjY2VwdDogUmVjb3JkPHN0cmluZyxzdHJpbmdbXT4sXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAqIERpcmVjdG9yeSBQaWNrZXIgT3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlU3lzdGVtRGlyZWN0b3J5UGlja2VyT3B0aW9ucyB7XG4gIGlkPzogc3RyaW5nLFxuICBtb2RlPzogc3RyaW5nLFxuICBzdGFydEluPzogRmlsZVN5c3RlbUhhbmRsZSB8ICdkZXNrdG9wJyB8ICdkb2N1bWVudHMnIHwgJ2Rvd25sb2FkcycgfCAnbXVzaWMnIHwgJ3BpY3R1cmVzJyB8ICd2aWRlb3MnXG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogRmlsZVN5c3RlbSBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIEhvbGRzIGV4cGVyaW1lbnRhbCBmZWF0dXJlcyBvZiB0aGUgYnJvd3NlciBgRmlsZSBTeXN0ZW0gQVBJYC4gTm8gdHlwZXNjcmlwdCBsaW50IGNoZWNrc1xuICogYXJlIHBlcmZvcm1lZCBoZXJlIVxuICovXG5leHBvcnQgY2xhc3MgRmlsZVN5c3RlbUFwaSB7XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIERhdGFUcmFuc2Zlckl0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIHN0YXRpYyBpc0dldEFzRmlsZVN5c3RlbUhhbmRsZVN1cHBvcnRlZCh0cmFuc2Zlckl0ZW06IERhdGFUcmFuc2Zlckl0ZW0pOiBib29sZWFuIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIHRyYW5zZmVySXRlbS5nZXRBc0ZpbGVTeXN0ZW1IYW5kbGUgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIEZpbGVTeXN0ZW1IYW5kbGUgT2JzZXJ2YWJsZSBvZiB0aGUgZ2l2ZW4gRGF0YVRyYW5zZmVySXRlbS4gVGhlIEZpbGVTeXN0ZW1IYW5kbGUgY2FuIG9ubHkgYmUgYWNjZXNzZWQgaW4gdGhlIGBkcmFnc3RhcnRgXG4gICAqIG9yIGBkcm9wYCBldmVudC4gT3RoZXJ3aXNlLCBpdCB3aWxsIHJldHVybiBudWxsIVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRBc0ZpbGVTeXN0ZW1IYW5kbGUodHJhbnNmZXJJdGVtOiBEYXRhVHJhbnNmZXJJdGVtKTogT2JzZXJ2YWJsZTxGaWxlU3lzdGVtSGFuZGxlIHwgbnVsbD4ge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gZnJvbSh0cmFuc2Zlckl0ZW0uZ2V0QXNGaWxlU3lzdGVtSGFuZGxlKCkpO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEZpbGUgUGlja2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIHN0YXRpYyBpc0ZpbGVTeXN0ZW1TdXBwb3J0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICdzaG93T3BlbkZpbGVQaWNrZXInIGluIHdpbmRvdztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgb3BlbkZpbGVQaWNrZXIocGlja2VyT3B0czogRmlsZVN5c3RlbUZpbGVQaWNrZXJPcHRpb25zKTogT2JzZXJ2YWJsZTxGaWxlU3lzdGVtRmlsZUhhbmRsZVtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiBmcm9tKHdpbmRvdy5zaG93T3BlbkZpbGVQaWNrZXIocGlja2VyT3B0cykpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIERpcmVjdG9yeSBQaWNrZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIHN0YXRpYyBpc0RpcmVjdG9yeVBpY2tlclN1cHBvcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gJ3Nob3dEaXJlY3RvcnlQaWNrZXInIGluIHdpbmRvdztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgb3BlbkRpcmVjdG9yeVBpY2tlcihwaWNrZXJPcHRzOiBGaWxlU3lzdGVtRGlyZWN0b3J5UGlja2VyT3B0aW9ucyk6IE9ic2VydmFibGU8RmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4gZnJvbSh3aW5kb3cuc2hvd0RpcmVjdG9yeVBpY2tlcihwaWNrZXJPcHRzKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGUpKTtcbiAgICB9XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwdWJsaWMgc3RhdGljIGdldEhhbmRsZXNGcm9tRGlyZWN0b3J5KGRpckhhbmRsZTogRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZSk6IE9ic2VydmFibGU8RmlsZVN5c3RlbUhhbmRsZVtdPiB7XG4gICAgcmV0dXJuIGZyb20oRmlsZVN5c3RlbUFwaS5nZXRIYW5kbGVzRnJvbURpcmVjdG9yeUFzeW5jKGRpckhhbmRsZSkpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBidWlsZFJlbGF0aXZlUGFyZW50KFxuICAgIGZpbGVPckRpckhhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSxcbiAgICByb290RGlyZWN0b3J5PzogRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZVxuICApOiBPYnNlcnZhYmxlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXG4gICAgaWYgKHJvb3REaXJlY3RvcnkgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhcmVudHMkID0gZnJvbShyb290RGlyZWN0b3J5LnJlc29sdmUoZmlsZU9yRGlySGFuZGxlKSk7XG4gICAgcmV0dXJuIHJlbGF0aXZlUGFyZW50cyQucGlwZShcbiAgICAgIG1hcChwYXJlbnRzID0+IHtcbiAgICAgICAgLy8gcGF0aC90by9mb2xkZXIvZmlsZS5qcGdcbiAgICAgICAgY29uc3QgcGF0aCA9IHBhcmVudHM7XG5cbiAgICAgICAgLy8gcm9vdC9wYXRoL3RvL2ZvbGRlci9maWxlLmpwZ1xuICAgICAgICBwYXRoLnVuc2hpZnQocm9vdERpcmVjdG9yeS5uYW1lKTtcblxuICAgICAgICAvLyByb290L3BhdGgvdG8vZm9sZGVyXG4gICAgICAgIHBhdGgucG9wKCk7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4oJy8nKTtcbiAgICAgIH1cbiAgICApKVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2V0SGFuZGxlc0Zyb21EaXJlY3RvcnlBc3luYyhkaXJIYW5kbGU6IEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUpOiBQcm9taXNlPEZpbGVTeXN0ZW1IYW5kbGVbXT4ge1xuICAgIGNvbnN0IGhhbmRsZXM6IEZpbGVTeXN0ZW1IYW5kbGVbXSA9IFtdO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGhhbmRsZSBvZiBkaXJIYW5kbGUudmFsdWVzKCkpIHtcbiAgICAgIGhhbmRsZXMucHVzaChoYW5kbGUpO1xuICAgIH1cbiAgICByZXR1cm4gaGFuZGxlcztcbiAgfVxufVxuIl19
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { switchMap, toArray, zip } from 'rxjs';
|
|
2
|
-
import { FileEntry } from './file-entry';
|
|
3
|
-
import { FileSystemApi } from '../file-system-api';
|
|
4
|
-
import { map } from 'rxjs/operators';
|
|
5
|
-
export class FileListingSystemHandle {
|
|
6
|
-
/***************************************************************************
|
|
7
|
-
* *
|
|
8
|
-
* Public methods *
|
|
9
|
-
* *
|
|
10
|
-
**************************************************************************/
|
|
11
|
-
/**
|
|
12
|
-
* Creates a File Entry Array Observable by resolving its FileSystemHandle.
|
|
13
|
-
* @returns An `Observable<FileEntry[]>` with the FileSystemFileHandle included
|
|
14
|
-
*/
|
|
15
|
-
static listFiles(handle, rootDirectory) {
|
|
16
|
-
switch (handle.kind) {
|
|
17
|
-
case 'file':
|
|
18
|
-
return FileEntry.ofFileHandle(handle, rootDirectory).pipe(toArray());
|
|
19
|
-
case 'directory':
|
|
20
|
-
return FileListingSystemHandle.listFilesRecursive(handle, rootDirectory);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
/***************************************************************************
|
|
24
|
-
* *
|
|
25
|
-
* Private methods *
|
|
26
|
-
* *
|
|
27
|
-
**************************************************************************/
|
|
28
|
-
static listFilesRecursive(dirHandle, rootDirectory) {
|
|
29
|
-
return FileSystemApi.getHandlesFromDirectory(dirHandle).pipe(map(handles => FileListingSystemHandle.listFilesOfEach(handles, rootDirectory ? rootDirectory : dirHandle)), switchMap(fileEntriesArray$ => zip(fileEntriesArray$)), map(fileEntriesArray => fileEntriesArray.flat()));
|
|
30
|
-
}
|
|
31
|
-
static listFilesOfEach(handles, rootDirectory) {
|
|
32
|
-
return handles.map(fileOrDirHandle => FileListingSystemHandle.listFiles(fileOrDirHandle, rootDirectory));
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1saXN0aW5nLXN5c3RlbS1oYW5kbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL2ZpbGVzL2xpc3RpbmcvZmlsZS1saXN0aW5nLXN5c3RlbS1oYW5kbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFhLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3pELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuQyxNQUFNLE9BQU8sdUJBQXVCO0lBRWxDOzs7O2dGQUk0RTtJQUU1RTs7O09BR0c7SUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQXdCLEVBQUUsYUFBeUM7UUFDekYsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEIsS0FBSyxNQUFNO2dCQUNULE9BQU8sU0FBUyxDQUFDLFlBQVksQ0FBQyxNQUE4QixFQUFFLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQy9GLEtBQUssV0FBVztnQkFDZCxPQUFPLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLE1BQW1DLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDMUcsQ0FBQztJQUNILENBQUM7SUFFRDs7OztnRkFJNEU7SUFHcEUsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFNBQW9DLEVBQUUsYUFBeUM7UUFDL0csT0FBTyxhQUFhLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUMxRCxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUMzRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQ3RELEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FDakQsQ0FBQztJQUNKLENBQUM7SUFFTyxNQUFNLENBQUMsZUFBZSxDQUM1QixPQUEyQixFQUMzQixhQUF5QztRQUV6QyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUE7SUFDMUcsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtPYnNlcnZhYmxlLCBzd2l0Y2hNYXAsIHRvQXJyYXksIHppcH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0ZpbGVFbnRyeX0gZnJvbSAnLi9maWxlLWVudHJ5JztcbmltcG9ydCB7RmlsZVN5c3RlbUFwaX0gZnJvbSAnLi4vZmlsZS1zeXN0ZW0tYXBpJztcbmltcG9ydCB7bWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBjbGFzcyBGaWxlTGlzdGluZ1N5c3RlbUhhbmRsZSB7XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFB1YmxpYyBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBGaWxlIEVudHJ5IEFycmF5IE9ic2VydmFibGUgYnkgcmVzb2x2aW5nIGl0cyBGaWxlU3lzdGVtSGFuZGxlLlxuICAgKiBAcmV0dXJucyBBbiBgT2JzZXJ2YWJsZTxGaWxlRW50cnlbXT5gIHdpdGggdGhlIEZpbGVTeXN0ZW1GaWxlSGFuZGxlIGluY2x1ZGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxpc3RGaWxlcyhoYW5kbGU6IEZpbGVTeXN0ZW1IYW5kbGUsIHJvb3REaXJlY3Rvcnk/OiBGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlKTogT2JzZXJ2YWJsZTxGaWxlRW50cnlbXT4ge1xuICAgIHN3aXRjaCAoaGFuZGxlLmtpbmQpIHtcbiAgICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICByZXR1cm4gRmlsZUVudHJ5Lm9mRmlsZUhhbmRsZShoYW5kbGUgYXMgRmlsZVN5c3RlbUZpbGVIYW5kbGUsIHJvb3REaXJlY3RvcnkpLnBpcGUodG9BcnJheSgpKTtcbiAgICAgIGNhc2UgJ2RpcmVjdG9yeSc6XG4gICAgICAgIHJldHVybiBGaWxlTGlzdGluZ1N5c3RlbUhhbmRsZS5saXN0RmlsZXNSZWN1cnNpdmUoaGFuZGxlIGFzIEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUsIHJvb3REaXJlY3RvcnkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcml2YXRlIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cbiAgcHJpdmF0ZSBzdGF0aWMgbGlzdEZpbGVzUmVjdXJzaXZlKGRpckhhbmRsZTogRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZSwgcm9vdERpcmVjdG9yeT86IEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUpOiBPYnNlcnZhYmxlPEZpbGVFbnRyeVtdPiB7XG4gICAgcmV0dXJuIEZpbGVTeXN0ZW1BcGkuZ2V0SGFuZGxlc0Zyb21EaXJlY3RvcnkoZGlySGFuZGxlKS5waXBlKFxuICAgICAgbWFwKGhhbmRsZXMgPT4gRmlsZUxpc3RpbmdTeXN0ZW1IYW5kbGUubGlzdEZpbGVzT2ZFYWNoKGhhbmRsZXMsIHJvb3REaXJlY3RvcnkgPyByb290RGlyZWN0b3J5IDogZGlySGFuZGxlKSksXG4gICAgICBzd2l0Y2hNYXAoZmlsZUVudHJpZXNBcnJheSQgPT4gemlwKGZpbGVFbnRyaWVzQXJyYXkkKSksXG4gICAgICBtYXAoZmlsZUVudHJpZXNBcnJheSA9PiBmaWxlRW50cmllc0FycmF5LmZsYXQoKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbGlzdEZpbGVzT2ZFYWNoKFxuICAgIGhhbmRsZXM6IEZpbGVTeXN0ZW1IYW5kbGVbXSxcbiAgICByb290RGlyZWN0b3J5PzogRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZVxuICApOiBPYnNlcnZhYmxlPEZpbGVFbnRyeVtdPltdIHtcbiAgICByZXR1cm4gaGFuZGxlcy5tYXAoZmlsZU9yRGlySGFuZGxlID0+IEZpbGVMaXN0aW5nU3lzdGVtSGFuZGxlLmxpc3RGaWxlcyhmaWxlT3JEaXJIYW5kbGUsIHJvb3REaXJlY3RvcnkpKVxuICB9XG59XG4iXX0=
|