@luzzle/core 0.0.57 → 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/README.md CHANGED
@@ -7,7 +7,7 @@ The foundational implementation of the Luzzle specification. It solves the inher
7
7
  * **Consistency**: Enforces structure across thousands of records using JSON schemas.
8
8
  * **Organization**: Standardizes where files and attachments (`.assets/`) live within an archive.
9
9
  * **Scale**: Maps thousands of text files into a high-performance SQLite index, enabling complex queries and fast searching without slow filesystem traversal.
10
- * **Portability**: Provides a unified Storage abstraction (Local, WebDAV) so your data remains accessible anywhere.
10
+ * **Portability**: Provides a unified Storage abstraction so your data remains accessible anywhere.
11
11
 
12
12
  ## How it works 🚂
13
13
 
@@ -0,0 +1,13 @@
1
+ import { DatabaseIntrospector, Dialect, DialectAdapter, Driver, Kysely, QueryCompiler } from 'kysely';
2
+ import type { DatabaseSync } from 'node:sqlite';
3
+ export interface NodeSqliteDialectConfig {
4
+ database: DatabaseSync;
5
+ }
6
+ export declare class NodeSqliteDialect implements Dialect {
7
+ #private;
8
+ constructor(config: NodeSqliteDialectConfig);
9
+ createAdapter(): DialectAdapter;
10
+ createDriver(): Driver;
11
+ createIntrospector(db: Kysely<any>): DatabaseIntrospector;
12
+ createQueryCompiler(): QueryCompiler;
13
+ }
@@ -0,0 +1,73 @@
1
+ import { CompiledQuery, SqliteAdapter, SqliteIntrospector, SqliteQueryCompiler, } from 'kysely';
2
+ class NodeSqliteConnection {
3
+ #db;
4
+ constructor(db) {
5
+ this.#db = db;
6
+ }
7
+ async executeQuery(compiledQuery) {
8
+ const stmt = this.#db.prepare(compiledQuery.sql);
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ const params = compiledQuery.parameters;
11
+ const isRead = /^\s*(?:select|pragma|explain)\b/i.test(compiledQuery.sql) ||
12
+ /\breturning\b/i.test(compiledQuery.sql);
13
+ if (isRead) {
14
+ const rows = stmt.all(...params);
15
+ return { rows };
16
+ }
17
+ else {
18
+ const result = stmt.run(...params);
19
+ return {
20
+ numAffectedRows: BigInt(result.changes),
21
+ insertId: BigInt(result.lastInsertRowid),
22
+ rows: [],
23
+ };
24
+ }
25
+ }
26
+ // eslint-disable-next-line require-yield
27
+ async *streamQuery() {
28
+ throw new Error('NodeSqliteDialect does not support streaming');
29
+ }
30
+ }
31
+ class NodeSqliteDriver {
32
+ #config;
33
+ constructor(config) {
34
+ this.#config = config;
35
+ }
36
+ async init() { }
37
+ async acquireConnection() {
38
+ return new NodeSqliteConnection(this.#config.database);
39
+ }
40
+ async beginTransaction(connection) {
41
+ await connection.executeQuery(CompiledQuery.raw('begin'));
42
+ }
43
+ async commitTransaction(connection) {
44
+ await connection.executeQuery(CompiledQuery.raw('commit'));
45
+ }
46
+ async rollbackTransaction(connection) {
47
+ await connection.executeQuery(CompiledQuery.raw('rollback'));
48
+ }
49
+ async releaseConnection() { }
50
+ async destroy() {
51
+ this.#config.database.close();
52
+ }
53
+ }
54
+ export class NodeSqliteDialect {
55
+ #config;
56
+ constructor(config) {
57
+ this.#config = config;
58
+ }
59
+ createAdapter() {
60
+ return new SqliteAdapter();
61
+ }
62
+ createDriver() {
63
+ return new NodeSqliteDriver(this.#config);
64
+ }
65
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
66
+ createIntrospector(db) {
67
+ return new SqliteIntrospector(db);
68
+ }
69
+ createQueryCompiler() {
70
+ return new SqliteQueryCompiler();
71
+ }
72
+ }
73
+ //# sourceMappingURL=NodeSqliteDialect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeSqliteDialect.js","sourceRoot":"","sources":["../../../src/database/NodeSqliteDialect.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EASb,aAAa,EACb,kBAAkB,EAClB,mBAAmB,GACnB,MAAM,QAAQ,CAAA;AAOf,MAAM,oBAAoB;IAChB,GAAG,CAAc;IAE1B,YAAY,EAAgB;QAC3B,IAAI,CAAC,GAAG,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,YAAY,CAAI,aAA4B;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;QAChD,8DAA8D;QAC9D,MAAM,MAAM,GAAG,aAAa,CAAC,UAAmB,CAAA;QAEhD,MAAM,MAAM,GACX,kCAAkC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YAC1D,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;QAEzC,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAQ,CAAA;YACvC,OAAO,EAAE,IAAI,EAAE,CAAA;QAChB,CAAC;aAAM,CAAC;YACP,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;YAClC,OAAO;gBACN,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;gBACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;gBACxC,IAAI,EAAE,EAAE;aACR,CAAA;QACF,CAAC;IACF,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,CAAC,WAAW;QACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IAChE,CAAC;CACD;AAED,MAAM,gBAAgB;IACZ,OAAO,CAAyB;IAEzC,YAAY,MAA+B;QAC1C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,IAAI,KAAmB,CAAC;IAE9B,KAAK,CAAC,iBAAiB;QACtB,OAAO,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACvD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,UAA8B;QACpD,MAAM,UAAU,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1D,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,UAA8B;QACrD,MAAM,UAAU,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,UAA8B;QACvD,MAAM,UAAU,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,iBAAiB,KAAmB,CAAC;IAE3C,KAAK,CAAC,OAAO;QACZ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IAC9B,CAAC;CACD;AAED,MAAM,OAAO,iBAAiB;IACpB,OAAO,CAAyB;IAEzC,YAAY,MAA+B;QAC1C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,aAAa;QACZ,OAAO,IAAI,aAAa,EAAE,CAAA;IAC3B,CAAC;IAED,YAAY;QACX,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC1C,CAAC;IAED,8DAA8D;IAC9D,kBAAkB,CAAC,EAAe;QACjC,OAAO,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC;IAED,mBAAmB;QAClB,OAAO,IAAI,mBAAmB,EAAE,CAAA;IACjC,CAAC;CACD"}
@@ -0,0 +1,104 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { NodeSqliteDialect } from './NodeSqliteDialect.js';
3
+ import { CompiledQuery, SqliteAdapter, SqliteIntrospector, SqliteQueryCompiler } from 'kysely';
4
+ describe('NodeSqliteDialect', () => {
5
+ let mockDb;
6
+ let mockStatement;
7
+ beforeEach(() => {
8
+ mockStatement = {
9
+ all: vi.fn(),
10
+ run: vi.fn().mockReturnValue({ changes: 0, lastInsertRowid: 0 }),
11
+ };
12
+ mockDb = {
13
+ prepare: vi.fn().mockReturnValue(mockStatement),
14
+ close: vi.fn(),
15
+ };
16
+ });
17
+ describe('NodeSqliteDialect', () => {
18
+ it('should create adapter, introspector, compiler and driver', () => {
19
+ const dialect = new NodeSqliteDialect({ database: mockDb });
20
+ expect(dialect.createAdapter()).toBeInstanceOf(SqliteAdapter);
21
+ expect(dialect.createQueryCompiler()).toBeInstanceOf(SqliteQueryCompiler);
22
+ expect(dialect.createIntrospector({})).toBeInstanceOf(SqliteIntrospector);
23
+ const driver = dialect.createDriver();
24
+ expect(driver).toBeDefined();
25
+ });
26
+ });
27
+ describe('NodeSqliteDriver', () => {
28
+ it('should initialize and manage connections and transactions', async () => {
29
+ const dialect = new NodeSqliteDialect({ database: mockDb });
30
+ const driver = dialect.createDriver();
31
+ await driver.init();
32
+ const connection = await driver.acquireConnection();
33
+ expect(connection).toBeDefined();
34
+ await driver.beginTransaction(connection, {});
35
+ expect(mockDb.prepare).toHaveBeenCalledWith('begin');
36
+ expect(mockStatement.run).toHaveBeenCalled();
37
+ await driver.commitTransaction(connection);
38
+ expect(mockDb.prepare).toHaveBeenCalledWith('commit');
39
+ await driver.rollbackTransaction(connection);
40
+ expect(mockDb.prepare).toHaveBeenCalledWith('rollback');
41
+ await driver.releaseConnection(connection);
42
+ await driver.destroy();
43
+ expect(mockDb.close).toHaveBeenCalled();
44
+ });
45
+ });
46
+ describe('NodeSqliteConnection', () => {
47
+ it('should execute read queries using stmt.all()', async () => {
48
+ const dialect = new NodeSqliteDialect({ database: mockDb });
49
+ const driver = dialect.createDriver();
50
+ const connection = await driver.acquireConnection();
51
+ mockStatement.all.mockReturnValue([{ id: 1 }]);
52
+ const query = CompiledQuery.raw('SELECT * FROM users WHERE id = ?', [1]);
53
+ const result = await connection.executeQuery(query);
54
+ expect(mockDb.prepare).toHaveBeenCalledWith('SELECT * FROM users WHERE id = ?');
55
+ expect(mockStatement.all).toHaveBeenCalledWith(1);
56
+ expect(result).toEqual({ rows: [{ id: 1 }] });
57
+ });
58
+ it('should execute pragma queries using stmt.all()', async () => {
59
+ const dialect = new NodeSqliteDialect({ database: mockDb });
60
+ const driver = dialect.createDriver();
61
+ const connection = await driver.acquireConnection();
62
+ mockStatement.all.mockReturnValue([{ table: 'users' }]);
63
+ const query = CompiledQuery.raw('PRAGMA table_info(users)');
64
+ const result = await connection.executeQuery(query);
65
+ expect(mockDb.prepare).toHaveBeenCalledWith('PRAGMA table_info(users)');
66
+ expect(mockStatement.all).toHaveBeenCalledWith();
67
+ expect(result).toEqual({ rows: [{ table: 'users' }] });
68
+ });
69
+ it('should execute returning queries using stmt.all()', async () => {
70
+ const dialect = new NodeSqliteDialect({ database: mockDb });
71
+ const driver = dialect.createDriver();
72
+ const connection = await driver.acquireConnection();
73
+ mockStatement.all.mockReturnValue([{ id: 2 }]);
74
+ const query = CompiledQuery.raw('INSERT INTO users (name) VALUES (?) RETURNING id', ['test']);
75
+ const result = await connection.executeQuery(query);
76
+ expect(mockDb.prepare).toHaveBeenCalledWith('INSERT INTO users (name) VALUES (?) RETURNING id');
77
+ expect(mockStatement.all).toHaveBeenCalledWith('test');
78
+ expect(result).toEqual({ rows: [{ id: 2 }] });
79
+ });
80
+ it('should execute write queries using stmt.run()', async () => {
81
+ const dialect = new NodeSqliteDialect({ database: mockDb });
82
+ const driver = dialect.createDriver();
83
+ const connection = await driver.acquireConnection();
84
+ mockStatement.run.mockReturnValue({ changes: 1, lastInsertRowid: 42 });
85
+ const query = CompiledQuery.raw('UPDATE users SET name = ? WHERE id = ?', ['test', 1]);
86
+ const result = await connection.executeQuery(query);
87
+ expect(mockDb.prepare).toHaveBeenCalledWith('UPDATE users SET name = ? WHERE id = ?');
88
+ expect(mockStatement.run).toHaveBeenCalledWith('test', 1);
89
+ expect(result).toEqual({
90
+ numAffectedRows: 1n,
91
+ insertId: 42n,
92
+ rows: [],
93
+ });
94
+ });
95
+ it('should throw on streamQuery', async () => {
96
+ const dialect = new NodeSqliteDialect({ database: mockDb });
97
+ const driver = dialect.createDriver();
98
+ const connection = await driver.acquireConnection();
99
+ const stream = connection.streamQuery(CompiledQuery.raw('SELECT 1'));
100
+ await expect(stream.next()).rejects.toThrow('NodeSqliteDialect does not support streaming');
101
+ });
102
+ });
103
+ });
104
+ //# sourceMappingURL=NodeSqliteDialect.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeSqliteDialect.test.js","sourceRoot":"","sources":["../../../src/database/NodeSqliteDialect.test.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
- import { Kysely, SqliteDialect } from 'kysely';
2
- import SqliteDatabase from 'better-sqlite3';
1
+ import { Kysely } from 'kysely';
2
+ import { NodeSqliteDialect } from './NodeSqliteDialect.js';
3
+ import { DatabaseSync } from 'node:sqlite';
3
4
  function getDatabaseClient(pathToDb, debug = false) {
4
5
  return new Kysely({
5
6
  log: debug ? ['query', 'error'] : [],
6
- dialect: new SqliteDialect({
7
- database: new SqliteDatabase(pathToDb),
7
+ dialect: new NodeSqliteDialect({
8
+ database: new DatabaseSync(pathToDb),
8
9
  }),
9
10
  });
10
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/database/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,cAAc,MAAM,gBAAgB,CAAA;AAG3C,SAAS,iBAAiB,CAAC,QAAgB,EAAE,KAAK,GAAG,KAAK;IACzD,OAAO,IAAI,MAAM,CAAe;QAC/B,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;QACpC,OAAO,EAAE,IAAI,aAAa,CAAC;YAC1B,QAAQ,EAAE,IAAI,cAAc,CAAC,QAAQ,CAAC;SACtC,CAAC;KACF,CAAC,CAAA;AACH,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/database/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1C,SAAS,iBAAiB,CAAC,QAAgB,EAAE,KAAK,GAAG,KAAK;IACzD,OAAO,IAAI,MAAM,CAAe;QAC/B,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;QACpC,OAAO,EAAE,IAAI,iBAAiB,CAAC;YAC9B,QAAQ,EAAE,IAAI,YAAY,CAAC,QAAQ,CAAC;SACpC,CAAC;KACF,CAAC,CAAA;AACH,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
@@ -1,13 +1,15 @@
1
1
  import { describe, expect, test, vi, afterEach } from 'vitest';
2
- import SqliteDatabase from 'better-sqlite3';
3
- import { Kysely, SqliteDialect } from 'kysely';
2
+ import { DatabaseSync } from 'node:sqlite';
3
+ import { Kysely } from 'kysely';
4
+ import { NodeSqliteDialect } from './NodeSqliteDialect.js';
4
5
  import { getDatabaseClient } from './client.js';
5
- vi.mock('better-sqlite3');
6
+ vi.mock('node:sqlite');
6
7
  vi.mock('kysely');
8
+ vi.mock('./NodeSqliteDialect.js');
7
9
  const mocks = {
8
- SqliteDatabase: vi.mocked(SqliteDatabase),
10
+ DatabaseSync: vi.mocked(DatabaseSync),
9
11
  Kysely: vi.mocked(Kysely),
10
- SqliteDialect: vi.mocked(SqliteDialect),
12
+ NodeSqliteDialect: vi.mocked(NodeSqliteDialect),
11
13
  };
12
14
  describe('database', () => {
13
15
  afterEach(() => {
@@ -16,15 +18,15 @@ describe('database', () => {
16
18
  test('getDatabaseClient', async () => {
17
19
  const path = 'path/to/db.sqlite';
18
20
  getDatabaseClient(path);
19
- expect(mocks.SqliteDatabase).toHaveBeenCalledWith(path);
20
- expect(mocks.SqliteDialect).toHaveBeenCalledOnce();
21
+ expect(mocks.DatabaseSync).toHaveBeenCalledWith(path);
22
+ expect(mocks.NodeSqliteDialect).toHaveBeenCalledOnce();
21
23
  expect(mocks.Kysely).toHaveBeenCalledOnce();
22
24
  });
23
25
  test('getDatabaseClient debug', async () => {
24
26
  const path = 'path/to/db.sqlite';
25
27
  getDatabaseClient(path, true);
26
- expect(mocks.SqliteDatabase).toHaveBeenCalledWith(path);
27
- expect(mocks.SqliteDialect).toHaveBeenCalledOnce();
28
+ expect(mocks.DatabaseSync).toHaveBeenCalledWith(path);
29
+ expect(mocks.NodeSqliteDialect).toHaveBeenCalledOnce();
28
30
  expect(mocks.Kysely).toHaveBeenCalledWith({
29
31
  log: ['query', 'error'],
30
32
  dialect: expect.anything(),
@@ -1 +1 @@
1
- {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../../src/database/client.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAC9D,OAAO,cAAc,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;AACzB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAEjB,MAAM,KAAK,GAAG;IACb,cAAc,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC;IACzC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;IACzB,aAAa,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC;CACvC,CAAA;AAED,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACzB,SAAS,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,IAAI,GAAG,mBAAmB,CAAA;QAEhC,iBAAiB,CAAC,IAAI,CAAC,CAAA;QAEvB,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;QACvD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,oBAAoB,EAAE,CAAA;QAClD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,IAAI,GAAG,mBAAmB,CAAA;QAEhC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAE7B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;QACvD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,oBAAoB,EAAE,CAAA;QAClD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC;YACzC,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;YACvB,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../../src/database/client.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;AACtB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AACjB,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;AAEjC,MAAM,KAAK,GAAG;IACb,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;IACrC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;IACzB,iBAAiB,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC;CAC/C,CAAA;AAED,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACzB,SAAS,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,IAAI,GAAG,mBAAmB,CAAA;QAEhC,iBAAiB,CAAC,IAAI,CAAC,CAAA;QAEvB,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;QACrD,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,EAAE,CAAA;QACtD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,IAAI,GAAG,mBAAmB,CAAA;QAEhC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAE7B,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;QACrD,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,EAAE,CAAA;QACtD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC;YACzC,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;YACvB,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -1,5 +1,4 @@
1
- import type LuzzleStorage from './abstract.js';
1
+ import LuzzleStorage from './abstract.js';
2
2
  import StorageFileSystem from './fs.js';
3
- import StorageWebDAV from './webdav.js';
4
- import type { StorageStat, StorageType } from './types.js';
5
- export { LuzzleStorage, StorageFileSystem, StorageWebDAV, type StorageStat, type StorageType };
3
+ import { type StorageStat, type StorageType } from './types.js';
4
+ export { LuzzleStorage, StorageFileSystem, type StorageStat, type StorageType };
@@ -1,4 +1,4 @@
1
+ import LuzzleStorage from './abstract.js';
1
2
  import StorageFileSystem from './fs.js';
2
- import StorageWebDAV from './webdav.js';
3
- export { StorageFileSystem, StorageWebDAV };
3
+ export { LuzzleStorage, StorageFileSystem };
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":"AACA,OAAO,iBAAiB,MAAM,SAAS,CAAA;AACvC,OAAO,aAAa,MAAM,aAAa,CAAA;AAGvC,OAAO,EAAiB,iBAAiB,EAAE,aAAa,EAAsC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,eAAe,CAAA;AACzC,OAAO,iBAAiB,MAAM,SAAS,CAAA;AAGvC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAsC,CAAA"}
@@ -1,4 +1,4 @@
1
- export type StorageType = 'fs' | 'webdav';
1
+ export type StorageType = 'fs';
2
2
  export type StorageStat = {
3
3
  type: 'file' | 'directory';
4
4
  size: number;