@luzzle/core 0.0.58 → 0.0.59

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luzzle/core",
3
- "version": "0.0.58",
3
+ "version": "0.0.59",
4
4
  "author": "eleith",
5
5
  "scripts": {
6
6
  "lint": "eslint src",
@@ -52,7 +52,6 @@
52
52
  "remark": "15.0.1",
53
53
  "remark-frontmatter": "5.0.0",
54
54
  "unist-util-visit": "5.0.0",
55
- "webdav": "5.10.0",
56
55
  "yaml": "2.7.0"
57
56
  },
58
57
  "type": "module"
@@ -1,23 +0,0 @@
1
- import { Readable } from 'stream';
2
- import type { StorageStat, StorageType } from './types.js';
3
- import { WebDAVClientOptions, GetDirectoryContentsOptionsWithoutDetails } from 'webdav';
4
- import { ReadStream, WriteStream } from 'fs';
5
- import LuzzleStorage from './abstract.js';
6
- declare class StorageWebDAV extends LuzzleStorage {
7
- private _webdavClient;
8
- type: StorageType;
9
- root: string;
10
- constructor(url: string, root: string, options: WebDAVClientOptions);
11
- private buildPath;
12
- parseArgPath(argPath: string): string;
13
- readFile(path: string, format?: 'text' | 'binary'): Promise<string>;
14
- writeFile(path: string, contents: string | Buffer | Readable): Promise<void>;
15
- getFilesIn(dir: string, options?: GetDirectoryContentsOptionsWithoutDetails): Promise<string[]>;
16
- exists(path: string): Promise<boolean>;
17
- delete(path: string): Promise<void>;
18
- stat(path: string): Promise<StorageStat>;
19
- createReadStream(path: string): ReadStream;
20
- createWriteStream(path: string): WriteStream;
21
- makeDirectory(path: string): Promise<void>;
22
- }
23
- export default StorageWebDAV;
@@ -1,72 +0,0 @@
1
- import { createClient, } from 'webdav';
2
- import path from 'path';
3
- import LuzzleStorage from './abstract.js';
4
- class StorageWebDAV extends LuzzleStorage {
5
- _webdavClient;
6
- type = 'webdav';
7
- root;
8
- constructor(url, root, options) {
9
- super();
10
- this.root = root;
11
- this._webdavClient = createClient(url, options);
12
- }
13
- buildPath(_path) {
14
- const fullPath = path.join(this.root, _path);
15
- const relativePath = path.relative(this.root, fullPath);
16
- if (relativePath.startsWith('..') || path.isAbsolute(relativePath)) {
17
- throw new Error(`Path traversal attempt detected: ${_path}`);
18
- }
19
- return fullPath;
20
- }
21
- parseArgPath(argPath) {
22
- return argPath;
23
- }
24
- async readFile(path, format = 'binary') {
25
- const fullPath = this.buildPath(path);
26
- return this._webdavClient.getFileContents(fullPath, { format });
27
- }
28
- async writeFile(path, contents) {
29
- const fullPath = this.buildPath(path);
30
- await this._webdavClient.putFileContents(fullPath, contents);
31
- }
32
- async getFilesIn(dir, options) {
33
- const fullPath = this.buildPath(dir);
34
- const client = this._webdavClient;
35
- const getDirectoryContents = options
36
- ? client.getDirectoryContents(fullPath, options)
37
- : client.getDirectoryContents(fullPath);
38
- return getDirectoryContents.then((contents) => contents.map((content) => `${path.relative(fullPath, content.filename)}${content.type === 'file' ? '' : '/'}`));
39
- }
40
- async exists(path) {
41
- const fullPath = this.buildPath(path);
42
- return this._webdavClient.exists(fullPath);
43
- }
44
- async delete(path) {
45
- const fullPath = this.buildPath(path);
46
- await this._webdavClient.deleteFile(fullPath);
47
- }
48
- async stat(path) {
49
- const fullPath = this.buildPath(path);
50
- const stats = (await this._webdavClient.stat(fullPath));
51
- const storageStat = {
52
- size: stats.size,
53
- last_modified: new Date(stats.lastmod),
54
- type: stats.type,
55
- };
56
- return storageStat;
57
- }
58
- createReadStream(path) {
59
- const fullPath = this.buildPath(path);
60
- return this._webdavClient.createReadStream(fullPath);
61
- }
62
- createWriteStream(path) {
63
- const fullPath = this.buildPath(path);
64
- return this._webdavClient.createWriteStream(fullPath);
65
- }
66
- async makeDirectory(path) {
67
- const fullPath = this.buildPath(path);
68
- await this._webdavClient.createDirectory(fullPath, { recursive: true });
69
- }
70
- }
71
- export default StorageWebDAV;
72
- //# sourceMappingURL=webdav.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"webdav.js","sourceRoot":"","sources":["../../../src/storage/webdav.ts"],"names":[],"mappings":"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"}
@@ -1,203 +0,0 @@
1
- import { describe, expect, test, vi, afterEach } from 'vitest';
2
- import { createClient } from 'webdav';
3
- import StorageWebDAV from './webdav.js';
4
- import { PassThrough } from 'stream';
5
- vi.mock('stream');
6
- vi.mock('webdav');
7
- const spies = {};
8
- const mocks = {
9
- createClient: vi.mocked(createClient),
10
- };
11
- const mockDavClient = {
12
- getFileContents: vi.fn(),
13
- putFileContents: vi.fn(),
14
- getDirectoryContents: vi.fn(),
15
- exists: vi.fn(),
16
- deleteFile: vi.fn(),
17
- stat: vi.fn(),
18
- copyFile: vi.fn(),
19
- moveFile: vi.fn(),
20
- createDirectory: vi.fn(),
21
- unlock: vi.fn(),
22
- search: vi.fn(),
23
- createReadStream: vi.fn(),
24
- createWriteStream: vi.fn(),
25
- customRequest: vi.fn(),
26
- partialUpdateFileContents: vi.fn(),
27
- getDAVCompliance: vi.fn(),
28
- getFileDownloadLink: vi.fn(),
29
- getFileUploadLink: vi.fn(),
30
- getHeaders: vi.fn(),
31
- getQuota: vi.fn(),
32
- setHeaders: vi.fn(),
33
- lock: vi.fn(),
34
- registerAttributeParser: vi.fn(),
35
- registerTagParser: vi.fn(),
36
- };
37
- describe('lib/storage/webdav.ts', () => {
38
- afterEach(() => {
39
- Object.values(mocks).forEach((mock) => {
40
- mock.mockReset();
41
- });
42
- Object.keys(spies).forEach((key) => {
43
- spies[key].mockRestore();
44
- delete spies[key];
45
- });
46
- });
47
- test('constructor', async () => {
48
- const root = 'rooot';
49
- const client = mockDavClient;
50
- const options = {};
51
- const url = 'url';
52
- mocks.createClient.mockReturnValueOnce(client);
53
- const storage = new StorageWebDAV('url', root, options);
54
- expect(storage.root).toEqual(root);
55
- expect(mocks.createClient).toHaveBeenCalledWith(url, options);
56
- });
57
- test('parseArgPath', async () => {
58
- const root = '/root/dir';
59
- const argPath = './path';
60
- const storage = new StorageWebDAV('url', root, {});
61
- const parsedPath = storage.parseArgPath(argPath);
62
- expect(parsedPath).toEqual(argPath);
63
- });
64
- test('readFile', async () => {
65
- const filePath = './path';
66
- const client = mockDavClient;
67
- const fileContents = 'file contents';
68
- mocks.createClient.mockReturnValueOnce(client);
69
- spies.getFileContents = vi.spyOn(client, 'getFileContents').mockResolvedValueOnce(fileContents);
70
- const storage = new StorageWebDAV('url', 'root', {});
71
- const contents = await storage.readFile(filePath);
72
- expect(contents).toEqual(fileContents);
73
- expect(spies.getFileContents).toHaveBeenCalledWith(expect.any(String), { format: 'binary' });
74
- });
75
- test('writeFile', async () => {
76
- const filePath = './path';
77
- const client = mockDavClient;
78
- const fileContents = 'file contents';
79
- mocks.createClient.mockReturnValueOnce(client);
80
- spies.putFileContents = vi.spyOn(client, 'putFileContents').mockResolvedValueOnce(true);
81
- const storage = new StorageWebDAV('url', 'root', {});
82
- await storage.writeFile(filePath, fileContents);
83
- expect(spies.putFileContents).toHaveBeenCalledWith(expect.any(String), fileContents);
84
- });
85
- test('writeFile', async () => {
86
- const filePath = './path';
87
- const client = mockDavClient;
88
- const fileContents = 'file contents';
89
- mocks.createClient.mockReturnValueOnce(client);
90
- spies.putFileContents = vi.spyOn(client, 'putFileContents').mockResolvedValueOnce(true);
91
- const storage = new StorageWebDAV('url', 'root', {});
92
- await storage.writeFile(filePath, fileContents);
93
- expect(spies.putFileContents).toHaveBeenCalledWith(expect.any(String), fileContents);
94
- });
95
- test('getFilesIn recursive', async () => {
96
- const filePath = './path';
97
- const client = mockDavClient;
98
- const directoryContents = [
99
- { filename: './home/path/file', type: 'file' },
100
- { filename: './home/path/dir', type: 'directory' },
101
- ];
102
- mocks.createClient.mockReturnValueOnce(client);
103
- spies.getDirectoryContents = vi
104
- .spyOn(client, 'getDirectoryContents')
105
- .mockResolvedValueOnce(directoryContents);
106
- const storage = new StorageWebDAV('url', 'home', {});
107
- const contents = await storage.getFilesIn(filePath, { deep: true });
108
- expect(spies.getDirectoryContents).toHaveBeenCalledWith('home/path', { deep: true });
109
- expect(contents).toEqual(['file', 'dir/']);
110
- });
111
- test('getFilesIn', async () => {
112
- const filePath = './path';
113
- const client = mockDavClient;
114
- const directoryContents = [
115
- { filename: './home/path/file', type: 'file' },
116
- { filename: './home/path/dir', type: 'directory' },
117
- ];
118
- mocks.createClient.mockReturnValueOnce(client);
119
- spies.getDirectoryContents = vi
120
- .spyOn(client, 'getDirectoryContents')
121
- .mockResolvedValueOnce(directoryContents);
122
- const storage = new StorageWebDAV('url', 'home', {});
123
- const contents = await storage.getFilesIn(filePath);
124
- expect(spies.getDirectoryContents).toHaveBeenCalledWith('home/path');
125
- expect(contents).toEqual(['file', 'dir/']);
126
- });
127
- test('exists', async () => {
128
- const filePath = './path';
129
- const client = mockDavClient;
130
- mocks.createClient.mockReturnValueOnce(client);
131
- spies.exists = vi.spyOn(client, 'exists').mockResolvedValueOnce(true);
132
- const storage = new StorageWebDAV('url', 'root', {});
133
- const test = await storage.exists(filePath);
134
- expect(test).toEqual(true);
135
- });
136
- test('delete', async () => {
137
- const filePath = './path';
138
- const client = mockDavClient;
139
- mocks.createClient.mockReturnValueOnce(client);
140
- spies.delete = vi.spyOn(client, 'deleteFile').mockResolvedValueOnce();
141
- const storage = new StorageWebDAV('url', 'root', {});
142
- await storage.delete(filePath);
143
- expect(spies.delete).toHaveBeenCalled();
144
- });
145
- test('stat', async () => {
146
- const filePath = './path';
147
- const client = mockDavClient;
148
- const storageStat = {
149
- size: 12,
150
- lastmod: new Date().getTime().toString(),
151
- type: 'file',
152
- etag: '',
153
- basename: filePath,
154
- filename: filePath,
155
- };
156
- mocks.createClient.mockReturnValueOnce(client);
157
- spies.stat = vi.spyOn(client, 'stat').mockResolvedValueOnce(storageStat);
158
- const storage = new StorageWebDAV('url', 'root', {});
159
- const stat = await storage.stat(filePath);
160
- expect(stat).toEqual({
161
- size: storageStat.size,
162
- last_modified: new Date(storageStat.lastmod),
163
- type: storageStat.type,
164
- });
165
- });
166
- test('createReadStream', async () => {
167
- const filePath = './path';
168
- const client = mockDavClient;
169
- const readStream = new PassThrough();
170
- mocks.createClient.mockReturnValueOnce(client);
171
- spies.createReadStream = vi.spyOn(client, 'createReadStream').mockReturnValueOnce(readStream);
172
- const storage = new StorageWebDAV('url', 'root', {});
173
- const stream = storage.createReadStream(filePath);
174
- expect(stream).toEqual(readStream);
175
- });
176
- test('createWriteStream', async () => {
177
- const filePath = './path';
178
- const client = mockDavClient;
179
- const writeStream = new PassThrough();
180
- mocks.createClient.mockReturnValueOnce(client);
181
- spies.createReadStream = vi.spyOn(client, 'createWriteStream').mockReturnValueOnce(writeStream);
182
- const storage = new StorageWebDAV('url', 'root', {});
183
- const stream = storage.createWriteStream(filePath);
184
- expect(stream).toEqual(writeStream);
185
- });
186
- test('makeDirectory', async () => {
187
- const filePath = './path';
188
- const client = mockDavClient;
189
- mocks.createClient.mockReturnValueOnce(client);
190
- spies.createDirectory = vi.spyOn(client, 'createDirectory').mockResolvedValueOnce();
191
- const storage = new StorageWebDAV('url', 'root', {});
192
- await storage.makeDirectory(filePath);
193
- expect(spies.createDirectory).toHaveBeenCalled();
194
- });
195
- test('prevents traversal', async () => {
196
- const root = '/root/dir';
197
- const client = mockDavClient;
198
- mocks.createClient.mockReturnValueOnce(client);
199
- const storage = new StorageWebDAV('url', root, {});
200
- await expect(() => storage.readFile('../outside')).rejects.toThrow('Path traversal attempt detected');
201
- });
202
- });
203
- //# sourceMappingURL=webdav.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"webdav.test.js","sourceRoot":"","sources":["../../../src/storage/webdav.test.ts"],"names":[],"mappings":"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"}