@lobb-js/lobb-ext-storage 0.5.9 → 0.8.2

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 (64) hide show
  1. package/.github/workflows/create_tag_on_version_change.yaml +45 -0
  2. package/.github/workflows/publish_npm_package.yaml +26 -0
  3. package/.vscode/settings.json +5 -0
  4. package/CHANGELOG.md +151 -30
  5. package/README.md +1 -35
  6. package/extensions/storage/adapters/index.ts +18 -0
  7. package/extensions/storage/adapters/localAdapter.ts +60 -0
  8. package/extensions/storage/adapters/storageAdapter.ts +13 -0
  9. package/extensions/storage/collections/fileSystem.ts +58 -0
  10. package/extensions/storage/collections/index.ts +12 -0
  11. package/extensions/storage/config/extensionConfigSchema.ts +15 -0
  12. package/extensions/storage/index.ts +26 -0
  13. package/extensions/storage/init.ts +6 -0
  14. package/extensions/storage/meta.ts +5 -0
  15. package/extensions/storage/migrations.ts +3 -0
  16. package/extensions/storage/openapi.ts +84 -0
  17. package/extensions/storage/studio/tests/fileManager.spec.ts +23 -0
  18. package/extensions/storage/studio/tests/package.json +1 -0
  19. package/extensions/storage/studio/tests/playwright.config.cjs +27 -0
  20. package/extensions/storage/studioExtension.json +1 -0
  21. package/extensions/storage/tests/configs/simple.ts +95 -0
  22. package/extensions/storage/tests/directories.test.ts +156 -0
  23. package/extensions/storage/tests/extraFormData.test.ts +47 -0
  24. package/extensions/storage/tests/files/rose.jpeg +0 -0
  25. package/extensions/storage/tests/files.test.ts +292 -0
  26. package/extensions/storage/tests/forceUpload.test.ts +72 -0
  27. package/extensions/storage/tests/massRemove.test.ts +189 -0
  28. package/extensions/storage/tests/meta.test.ts +26 -0
  29. package/extensions/storage/tests/recursiveDeleteMany.test.ts +208 -0
  30. package/extensions/storage/tests/recursiveDeleteOne.test.ts +206 -0
  31. package/extensions/storage/tests/storage/127 +0 -0
  32. package/extensions/storage/types.ts +11 -0
  33. package/extensions/storage/utils.ts +87 -0
  34. package/extensions/storage/workflows/controllers.ts +103 -0
  35. package/extensions/storage/workflows/index.ts +10 -0
  36. package/extensions/storage/workflows/services.ts +182 -0
  37. package/lobb.ts +54 -0
  38. package/package.json +32 -9
  39. package/scripts/postpublish.sh +12 -0
  40. package/scripts/prepublish.sh +17 -0
  41. package/studio/app.html +12 -0
  42. package/studio/routes/+layout.svelte +7 -0
  43. package/studio/routes/+layout.ts +1 -0
  44. package/studio/routes/[...path]/+page.svelte +6 -0
  45. package/svelte.config.js +23 -7
  46. package/todo.md +36 -0
  47. package/tsconfig.app.json +3 -3
  48. package/tsconfig.json +11 -5
  49. package/vite.config.ts +4 -8
  50. package/components.json +0 -16
  51. package/index.html +0 -13
  52. package/src/app.css +0 -124
  53. package/src/main.ts +0 -14
  54. /package/{src → extensions/storage/studio}/extension.types.ts +0 -0
  55. /package/{src → extensions/storage/studio}/index.ts +0 -0
  56. /package/{src → extensions/storage/studio}/lib/components/childrenFileExplorer.svelte +0 -0
  57. /package/{src → extensions/storage/studio}/lib/components/explorerNotSupported.svelte +0 -0
  58. /package/{src → extensions/storage/studio}/lib/components/fileExplorer.svelte +0 -0
  59. /package/{src → extensions/storage/studio}/lib/components/fileIcon.svelte +0 -0
  60. /package/{src → extensions/storage/studio}/lib/components/fileManagerBreadCrumbs.svelte +0 -0
  61. /package/{src → extensions/storage/studio}/lib/components/foreignKeyComponent.svelte +0 -0
  62. /package/{src → extensions/storage/studio}/lib/components/pages/fileExplorerPage.svelte +0 -0
  63. /package/{src → extensions/storage/studio}/lib/index.ts +0 -0
  64. /package/{src → extensions/storage/studio}/lib/utils.ts +0 -0
@@ -0,0 +1,45 @@
1
+ name: Create Tag on Version Change
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ jobs:
9
+ check-version-and-tag:
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: write
13
+ outputs:
14
+ current_version: ${{ steps.current_version.outputs.current_version }}
15
+ previous_version: ${{ steps.previous_version.outputs.previous_version }}
16
+ steps:
17
+ - name: Checkout repository
18
+ uses: actions/checkout@v4
19
+ with:
20
+ fetch-depth: 0
21
+
22
+ - name: Get previous version
23
+ id: previous_version
24
+ run: |
25
+ PREV_VERSION=$(git show HEAD^:package.json | jq -r .version || echo "none")
26
+ echo "previous_version=$PREV_VERSION" >> "$GITHUB_OUTPUT"
27
+
28
+ - name: Get current version
29
+ id: current_version
30
+ run: |
31
+ CURR_VERSION=$(jq -r .version package.json)
32
+ echo "current_version=$CURR_VERSION" >> "$GITHUB_OUTPUT"
33
+
34
+ - name: Create tag
35
+ if: steps.previous_version.outputs.previous_version != steps.current_version.outputs.current_version
36
+ uses: rickstaa/action-create-tag@v1
37
+ with:
38
+ tag: "${{ steps.current_version.outputs.current_version }}"
39
+
40
+ publish-to-npm:
41
+ name: Publish to npm
42
+ needs: check-version-and-tag
43
+ if: needs.check-version-and-tag.outputs.previous_version != needs.check-version-and-tag.outputs.current_version
44
+ uses: maliknajjar/lobb_storage_ext/.github/workflows/publish_npm_package.yaml@main
45
+ secrets: inherit
@@ -0,0 +1,26 @@
1
+ name: publish package to npm
2
+
3
+ on:
4
+ workflow_call:
5
+
6
+ jobs:
7
+ publish:
8
+ runs-on: ubuntu-latest
9
+ permissions:
10
+ contents: read
11
+ id-token: write
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - name: Setup Node.js
15
+ uses: actions/setup-node@v4
16
+ with:
17
+ node-version: '24'
18
+ registry-url: 'https://registry.npmjs.org'
19
+ - name: Setup Bun
20
+ uses: oven-sh/setup-bun@v2
21
+ - name: Install jq
22
+ run: sudo apt-get update && sudo apt-get install -y jq
23
+ - name: Install dependencies
24
+ run: bun install
25
+ - name: Publish to npm
26
+ run: npm publish --access public
@@ -0,0 +1,5 @@
1
+ {
2
+ "deno.disablePaths": [
3
+ "studio"
4
+ ]
5
+ }
package/CHANGELOG.md CHANGED
@@ -2,84 +2,205 @@
2
2
  All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines.
3
3
 
4
4
  - - -
5
- ## storage-ext-studio@0.5.9 - 2026-03-13
5
+ ## storage-ext@0.8.2 - 2026-03-28
6
6
  #### Bug Fixes
7
+ - triggering the core package publish - (f0a8b54) - malik ben
8
+
9
+ - - -
10
+
11
+ ## storage-ext@0.8.1 - 2026-03-28
12
+ #### Bug Fixes
13
+ - adding readme to all packages - (3a9264a) - malik ben
14
+ #### Miscellaneous Chores
15
+ - add publishConfig and fix ext packages for npm publishing - (49747e9) - malik ben
16
+
17
+ - - -
18
+
19
+ ## storage-ext@0.8.0 - 2026-03-28
20
+ #### Features
21
+ - (**reports-ext,storage-ext**) convert studio from Svelte SPA to SvelteKit - (3cd7f63) - malik ben
22
+ - (**storage-ext**) migrate packages/storage-ext from Deno to Bun - (a4e6bc6) - malik ben
23
+ - replace hasDashboardExtension with virtual:lobb-studio-extensions module - (437cb2e) - malik ben
24
+ #### Bug Fixes
25
+ - add /studio subpath exports to ext packages, update studio pages to use them - (c0b9a82) - malik ben
26
+ - untrack .svelte-kit from mindhar, fix process leak and $lib imports, update ai sdk versions - (017f784) - malik ben
7
27
  - chaning $lib to relative path - (c6d9e8f) - malik ben
28
+ #### Miscellaneous Chores
29
+ - (**storage-ext**) move extension logic and tests to extensions/storage, flatten studio, add Playwright tests - (a27a46d) - malik ben
30
+ - (**version**) 0.25.2 - (a62acb9) - Cocogitto Bot
31
+ - (**version**) 0.25.1 - (afe7e69) - Cocogitto Bot
32
+ - (**version**) 0.25.0 - (77a383c) - Cocogitto Bot
33
+ - (**version**) 0.24.0 - (a8cb605) - Cocogitto Bot
34
+ - (**version**) 0.23.0 - (60f357e) - Cocogitto Bot
35
+ - add dev:studio/build:studio scripts, fix Dockerfiles, remove --build flag - (1595975) - malik ben
36
+ - migrate CI/CD from Deno/JSR to Bun/npm - (b4cc3bc) - malik ben
37
+ - add prepublish/postpublish scripts to extension packages for standalone compatibility - (4d6108f) - malik ben
38
+ - centralize studio app.css in @lobb-js/studio package, remove local copies - (05192dc) - malik ben
39
+ - rename @lobb/ scope to @lobb-js/ across all packages and apps - (cce4ce0) - malik ben
40
+ - add start/build scripts and gitignore build dir across all projects - (58f539d) - malik ben
41
+ - update CLAUDE.md to enforce no-commit-without-explicit-instruction rule - (6d63a42) - malik ben
42
+ - remove all deno.json and deno.lock files from the monorepo - (84ca5d4) - malik ben
43
+ - replace workspace:* with exact versions in all package.json files - (74fbdb7) - malik ben
44
+ - rename __studio to studio and remove unused studio dirs - (77fb932) - malik ben
45
+ - rename studio directory to __studio for faker-ext, llm-ext, mail-ext, reports-ext, storage-ext - (47e754a) - malik ben
8
46
 
9
47
  - - -
10
48
 
11
- ## storage-ext-studio@0.5.8 - 2026-03-03
49
+ ## storage-ext@0.7.1 - 2026-03-03
12
50
  #### Bug Fixes
51
+ - (**storage-ext**) use ctx.lobb instead of Lobb.instance, add extra form data test - (27101f7) - malik ben
13
52
  - (**storage-ext**) fix tests to work from project root and fix foreignKeyObject persistence on file upload - (4b5bdd8) - malik ben
14
53
  #### Miscellaneous Chores
15
- - (**version**) 0.22.0 - (6510e32) - Cocogitto Bot
16
- - (**version**) 0.21.0 - (c973aa9) - Cocogitto Bot
54
+ - (**version**) 0.20.0 - (06cc303) - Cocogitto Bot
17
55
 
18
56
  - - -
19
57
 
20
- ## storage-ext-studio@0.5.7 - 2026-03-01
58
+ ## storage-ext@0.7.0 - 2026-03-01
59
+ #### Features
60
+ - (**mindhar**) add storage extension integration - (bca6368) - malik ben
61
+ #### Miscellaneous Chores
62
+ - (**version**) 0.18.0 - (efc553f) - Cocogitto Bot
63
+ - (**version**) 0.17.0 - (4174f0c) - Cocogitto Bot
64
+ - (**version**) 0.16.0 - (9508655) - Cocogitto Bot
65
+ - (**version**) 0.14.11 - (ad92b61) - Cocogitto Bot
66
+
67
+ - - -
68
+
69
+ ## storage-ext@0.6.8 - 2026-02-25
21
70
  #### Bug Fixes
22
- - (**studio**) prevent @lobb-js/studio version shadowing in extensions - (cd674b9) - malik ben
71
+ - publishing the storage extension - (033ab43) - Malik Najjar
23
72
  #### Miscellaneous Chores
24
- - (**version**) 0.15.0 - (0c2c345) - Cocogitto Bot
25
- - fixing the /studio base issue - (de6686f) - Malik Najjar
73
+ - filling some logic in the chat compoenent and adding the force feature - (5cd0dc8) - Malik Najjar
74
+ - fixing the deleteOne and deleteMany tests - (0e42622) - Malik Najjar
75
+ - making the directories test pass - (4229229) - Malik Najjar
76
+ - making the files tests pass - (f312a3a) - Malik Najjar
77
+ - passing more tests - (93ee276) - Malik Najjar
78
+ - adding a todo for the storage extension - (cb68710) - malik ben
79
+ - implementing the store using the new nice way - (106b320) - Malik Najjar
26
80
 
27
81
  - - -
28
82
 
29
- ## storage-ext-studio@0.5.6 - 2026-02-22
83
+ ## storage-ext@0.6.7 - 2026-02-23
30
84
  #### Bug Fixes
31
- - adding a studio prefix for the studio app - (6607b5a) - malik ben
85
+ - the core broke because of the override events - (f650f4c) - Malik Najjar
32
86
  #### Miscellaneous Chores
33
- - (**version**) 0.14.2 - (6ecdc1d) - Cocogitto Bot
87
+ - adding the ability to specify input and output types for the collectionServices methods - (72045f1) - Malik Najjar
88
+ - adding neccessary override events and workflows for the storage extension - (f09698f) - Malik Najjar
34
89
 
35
90
  - - -
36
91
 
37
- ## storage-ext-studio@0.5.5 - 2026-02-21
92
+ ## storage-ext@0.6.6 - 2026-02-23
93
+ #### Bug Fixes
94
+ - lobb crashing on missing event fix - (e0a9a75) - Malik Najjar
95
+
96
+ - - -
97
+
98
+ ## storage-ext@0.6.5 - 2026-02-23
99
+ #### Bug Fixes
100
+ - lobb crashed because of this non existing event - (0aa47c9) - Malik Najjar
101
+
102
+ - - -
103
+
104
+ ## storage-ext@0.6.4 - 2026-02-22
105
+ #### Bug Fixes
106
+ - coggito publishing packages order fix - (573c75e) - malik ben
107
+
108
+ - - -
109
+
110
+ ## storage-ext@0.6.3 - 2026-02-22
111
+ #### Bug Fixes
112
+ - adjusted the names of the events - (6543d8c) - malik ben
113
+
114
+ - - -
115
+
116
+ ## storage-ext@0.6.2 - 2026-02-22
117
+ #### Bug Fixes
118
+ - made the collectionService become an property in the main lobb object - (146e4cb) - malik ben
119
+
120
+ - - -
121
+
122
+ ## storage-ext@0.6.1 - 2026-02-21
38
123
  #### Bug Fixes
39
124
  - using default export instead of named export for extensions - (37dd485) - malik ben
40
125
  #### Miscellaneous Chores
41
- - (**version**) 0.14.0 - (7d2eb87) - Cocogitto Bot
126
+ - (**version**) 0.13.2 - (39b0145) - Cocogitto Bot
127
+ - (**version**) 0.12.3 - (cd06fc0) - Cocogitto Bot
128
+ - (**version**) 0.12.2 - (35b2ff3) - Cocogitto Bot
42
129
  - (**version**) 0.12.1 - (c548105) - Cocogitto Bot
130
+ - (**version**) 0.11.1 - (659ebd3) - Cocogitto Bot
131
+ - adding a comment - (c5c603b) - Malik Najjar
132
+
133
+ - - -
134
+
135
+ ## storage-ext@0.6.0 - 2026-02-17
136
+ #### Features
137
+ - implement event overrides for collection creation and update workflows - (8a05d74) - Malik Najjar
43
138
 
44
139
  - - -
45
140
 
46
- ## storage-ext-studio@0.5.4 - 2026-02-17
141
+ ## storage-ext@0.5.3 - 2026-02-17
47
142
  #### Bug Fixes
48
- - fixing the standalone issue - (1a70a51) - Malik Najjar
143
+ - fixing the publishing issue - (f4d1641) - Malik Najjar
144
+
145
+ - - -
146
+
147
+ ## storage-ext@0.5.2 - 2026-02-17
148
+ #### Bug Fixes
149
+ - publishing the storage studio - (d7dd43e) - Malik Najjar
49
150
  #### Miscellaneous Chores
50
- - (**version**) 0.10.9 - (19ac765) - Cocogitto Bot
151
+ - (**version**) 0.10.2 - (2c92a7d) - Cocogitto Bot
51
152
 
52
153
  - - -
53
154
 
54
- ## storage-ext-studio@0.1.29 - 2026-02-17
155
+ ## storage-ext@0.5.1 - 2026-02-17
55
156
  #### Bug Fixes
56
- - fixing the publishing issue - (f4d1641) - Malik Najjar
157
+ - fixing the storage publish issue - (b75d8d1) - Malik Najjar
57
158
 
58
159
  - - -
59
160
 
60
- ## storage-ext-studio@0.0.1 - 2026-02-17
161
+ ## storage-ext@0.5.0 - 2026-02-17
162
+ #### Features
163
+ - implement storage workflows and controllers for file management - (b9efd0f) - Malik Najjar
164
+ #### Bug Fixes
165
+ - update the auth extension - (5318dda) - Malik Najjar
61
166
  #### Miscellaneous Chores
62
- - (**version**) 0.10.4 - (d0d0474) - Cocogitto Bot
167
+ - added important todo to the storage extension - (43d0bec) - Malik Najjar
168
+ - seperating types from the services file - (8c7bdce) - Malik Najjar
169
+
170
+ - - -
171
+
172
+ ## storage-ext@0.4.0 - 2026-02-16
173
+ #### Features
174
+ - adding the ability to upload files in the ui - (1d7b346) - Malik Najjar
175
+ - update event name in storage workflow and enhance Instagram webhook file handling - (a0cb186) - Malik Najjar
176
+
177
+ - - -
178
+
179
+ ## storage-ext@0.3.0 - 2026-02-16
180
+ #### Features
181
+ - enhance storage services with URL file creation and path validation - (1a33fa6) - Malik Najjar
63
182
 
64
183
  - - -
65
184
 
66
- ## storage-ext-studio@0.0.1 - 2026-02-17
185
+ ## storage-ext@0.2.0 - 2026-02-16
186
+ #### Features
187
+ - implement storage adapter and services, refactor workflows - (abd9ee5) - Malik Najjar
188
+
189
+ - - -
190
+
191
+ ## storage-ext@0.1.29 - 2026-02-15
67
192
  #### Bug Fixes
68
- - publishing the storage studio - (d7dd43e) - Malik Najjar
69
- #### Refactoring
70
- - restructure storage-ext studio components and remove unused files - (a3e375a) - Malik Najjar
193
+ - fix deno publish issue - (e8dcc4f) - malik ben
194
+ - issue fix - (63d66d3) - malik ben
71
195
  #### Miscellaneous Chores
72
- - (**version**) 0.10.2 - (2c92a7d) - Cocogitto Bot
73
196
  - (**version**) 0.5.5 - (d4dedeb) - Cocogitto Bot
74
197
  - (**version**) 0.5.4 - (1ca3970) - Cocogitto Bot
75
198
  - (**version**) 0.5.3 - (dcdb9cb) - Cocogitto Bot
76
199
  - (**version**) 0.5.2 - (aa66e29) - Cocogitto Bot
77
200
  - (**version**) 0.5.1 - (41b7c35) - Cocogitto Bot
78
- - (**version**) 0.4.2 - (4395d99) - Cocogitto Bot
79
- - (**version**) 0.4.1 - (5e9f152) - Cocogitto Bot
80
- - (**version**) 0.4.0 - (aafd2d6) - Cocogitto Bot
81
- #### Style
82
- - Update background color from bg-soft to bg-muted/30 across various components - (ad2240a) - Malik Najjar
201
+ - (**version**) 0.5.0 - (af63147) - Cocogitto Bot
202
+ - (**version**) 0.4.4 - (eaed3b4) - Cocogitto Bot
203
+ - (**version**) 0.4.3 - (ea9ec49) - Cocogitto Bot
83
204
 
84
205
  - - -
85
206
 
package/README.md CHANGED
@@ -1,35 +1 @@
1
- # Storage Extension - Studio
2
-
3
- This directory contains the frontend/dashboard interface for the storage extension.
4
-
5
- ## Structure
6
-
7
- ```
8
- studio/
9
- ├── src/
10
- │ ├── index.ts # Extension entry point
11
- │ ├── main.ts # Vite app entry
12
- │ ├── components/ # UI components
13
- │ │ ├── fileExplorer.svelte
14
- │ │ ├── childrenFileExplorer.svelte
15
- │ │ ├── fileIcon.svelte
16
- │ │ ├── fileManagerBreadCrumbs.svelte
17
- │ │ └── explorerNotSupported.svelte
18
- │ ├── pages/ # UI pages
19
- │ │ └── fileExplorerPage.svelte
20
- │ └── foreignKeyComponent.svelte
21
- ├── public/ # Static assets
22
- ├── index.html # HTML entry point
23
- ├── vite.config.ts # Vite configuration
24
- ├── tailwind.config.ts # Tailwind CSS configuration
25
- └── tsconfig.json # TypeScript configuration
26
- ```
27
-
28
- ## Features
29
-
30
- The studio interface includes:
31
- - File explorer with directory navigation
32
- - File upload and management
33
- - Visual file icons
34
- - Breadcrumb navigation
35
- - Foreign key component integration
1
+ # @lobb-js/lobb-ext-storage
@@ -0,0 +1,18 @@
1
+ import type { StorageAdapter } from "./storageAdapter.ts";
2
+ import type { ExtensionConfig } from "../config/extensionConfigSchema.ts";
3
+ import { LobbError } from "@lobb-js/core";
4
+ import { LocalStorageAdapter } from "./localAdapter.ts";
5
+
6
+ export { StorageAdapter } from "./storageAdapter.ts";
7
+
8
+ export function initStorageAdapter(config: ExtensionConfig): StorageAdapter {
9
+ if (config.adapter === "local") {
10
+ return new LocalStorageAdapter(config);
11
+ } else {
12
+ throw new LobbError({
13
+ code: "INTERNAL_SERVER_ERROR",
14
+ message:
15
+ `The (${config.adapter}) storage adapter is not implemented`,
16
+ });
17
+ }
18
+ }
@@ -0,0 +1,60 @@
1
+ import { LobbError } from "@lobb-js/core";
2
+ import { join } from "node:path";
3
+ import { writeFileSync, readFile, unlink } from "node:fs";
4
+ import { promisify } from "node:util";
5
+ import { StorageAdapter } from "./storageAdapter.ts";
6
+
7
+ const readFileAsync = promisify(readFile);
8
+ const unlinkAsync = promisify(unlink);
9
+
10
+ export class LocalStorageAdapter extends StorageAdapter {
11
+ public async createFile(id: string, file: File): Promise<void> {
12
+ const fullPath = join(
13
+ this.config.storagePath,
14
+ String(id),
15
+ );
16
+
17
+ writeFileSync(fullPath, Buffer.from(await file.arrayBuffer()));
18
+ }
19
+
20
+ public async readFile(id: string): Promise<Uint8Array> {
21
+ const fullPath = join(
22
+ this.config.storagePath,
23
+ String(id),
24
+ );
25
+
26
+ try {
27
+ return new Uint8Array(await readFileAsync(fullPath));
28
+ } catch (error: any) {
29
+ if (error.code === "ENOENT") {
30
+ throw new LobbError({
31
+ code: "NOT_FOUND",
32
+ message: `The file doesn't exist in the file system`,
33
+ });
34
+ }
35
+
36
+ throw error;
37
+ }
38
+ }
39
+
40
+ public async removeFile(id: string): Promise<void> {
41
+ const fullPath = join(
42
+ this.config.storagePath,
43
+ String(id),
44
+ );
45
+
46
+ try {
47
+ await unlinkAsync(fullPath);
48
+ } catch (error: any) {
49
+ if (error.code === "ENOENT") {
50
+ // TODO: when you implement the logging part dont forget to
51
+ // add a log here with the neccessarry information
52
+ console.warn(
53
+ `STORAGE EXTENSION: couldnt delete this file ${fullPath} because it doesnt exist`,
54
+ );
55
+ } else {
56
+ throw error;
57
+ }
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,13 @@
1
+ import type { ExtensionConfig } from "../config/extensionConfigSchema.ts";
2
+
3
+ export abstract class StorageAdapter {
4
+ protected config: ExtensionConfig;
5
+
6
+ constructor(config: ExtensionConfig) {
7
+ this.config = config;
8
+ }
9
+
10
+ public abstract createFile(id: string, file: File): Promise<void>;
11
+ public abstract readFile(id: string): Promise<Uint8Array>;
12
+ public abstract removeFile(id: string): Promise<void>;
13
+ }
@@ -0,0 +1,58 @@
1
+ import type { CollectionConfig } from "@lobb-js/core";
2
+ import type { ExtensionConfig } from "../config/extensionConfigSchema.ts";
3
+
4
+ export function getFileSystemCollection(config: ExtensionConfig): CollectionConfig {
5
+ return {
6
+ "indexes": {},
7
+ "fields": {
8
+ "id": {
9
+ "type": "integer",
10
+ },
11
+ "name": {
12
+ "type": "string",
13
+ "length": 255,
14
+ "validators": {
15
+ "required": true,
16
+ },
17
+ },
18
+ "path": {
19
+ "type": "string",
20
+ "length": 255,
21
+ "pre_processors": {
22
+ "default": "/",
23
+ },
24
+ },
25
+ "type": {
26
+ "type": "string",
27
+ "length": 255,
28
+ "pre_processors": {
29
+ "default": "directory",
30
+ },
31
+ "validators": {
32
+ "enum": [
33
+ "file",
34
+ "directory",
35
+ ],
36
+ },
37
+ },
38
+ "icon": {
39
+ "type": "string",
40
+ "length": 255,
41
+ },
42
+ "is_pinned_sidebar": {
43
+ "type": "bool",
44
+ "pre_processors": {
45
+ "default": "false",
46
+ },
47
+ },
48
+ "file_mime_type": {
49
+ "type": "string",
50
+ "length": 255,
51
+ },
52
+ "file_size": {
53
+ "type": "long",
54
+ },
55
+ ...config.extend_fs?.fields,
56
+ },
57
+ };
58
+ }
@@ -0,0 +1,12 @@
1
+ import type { CollectionConfig } from "@lobb-js/core";
2
+ import type { ExtensionConfig } from "../config/extensionConfigSchema.ts";
3
+ import { getFileSystemCollection } from "./fileSystem.ts";
4
+
5
+ export function collections(extensionConfig: ExtensionConfig): Record<string, CollectionConfig> {
6
+ const collectionsSchemas: Record<string, CollectionConfig> = {};
7
+
8
+ // create the user collection
9
+ collectionsSchemas["storage_fs"] = getFileSystemCollection(extensionConfig);
10
+
11
+ return collectionsSchemas;
12
+ }
@@ -0,0 +1,15 @@
1
+ import type { CollectionFieldsWithoutId } from "@lobb-js/core";
2
+
3
+ type BaseSchema = {};
4
+
5
+ interface ExtendFs {
6
+ fields: CollectionFieldsWithoutId;
7
+ }
8
+
9
+ type LocalAdapter = BaseSchema & {
10
+ adapter: "local";
11
+ storagePath: string;
12
+ extend_fs?: ExtendFs;
13
+ };
14
+
15
+ export type ExtensionConfig = LocalAdapter;
@@ -0,0 +1,26 @@
1
+ import type { Extension } from "@lobb-js/core";
2
+ import type { ExtensionConfig } from "./config/extensionConfigSchema.ts";
3
+ export type { StorageFsCreateOne, StorageFsFindOne } from "./types.ts";
4
+
5
+ import packageJson from "../../package.json" with { type: "json" };
6
+ import studioExtension from "./studioExtension.json" with { type: "json" };
7
+ import { collections } from "./collections/index.ts";
8
+ import { init } from "./init.ts";
9
+ import { meta } from "./meta.ts";
10
+ import { migrations } from "./migrations.ts";
11
+ import { openapi } from "./openapi.ts";
12
+ import { getWorkflows } from "./workflows/index.ts";
13
+
14
+ export default function storage(extensionConfig: ExtensionConfig): Extension {
15
+ return {
16
+ version: packageJson.version,
17
+ name: "storage",
18
+ init: () => init(extensionConfig),
19
+ collections: (_lobb: any) => collections(extensionConfig),
20
+ migrations: migrations,
21
+ meta: meta,
22
+ workflows: getWorkflows(extensionConfig),
23
+ openapi: openapi,
24
+ dashboard: studioExtension,
25
+ };
26
+ }
@@ -0,0 +1,6 @@
1
+ import { mkdir } from "node:fs/promises";
2
+ import type { ExtensionConfig } from "./config/extensionConfigSchema.ts";
3
+
4
+ export async function init(storageConfig: ExtensionConfig) {
5
+ await mkdir(storageConfig.storagePath, { recursive: true });
6
+ }
@@ -0,0 +1,5 @@
1
+ export async function meta() {
2
+ return {
3
+ storageCollectionName: "storage_fs",
4
+ };
5
+ }
@@ -0,0 +1,3 @@
1
+ import type { MigrationProps, Migrations } from "@lobb-js/core";
2
+
3
+ export const migrations: Migrations = {};
@@ -0,0 +1,84 @@
1
+ import type { OpenAPIV3_1 } from "openapi-types";
2
+
3
+ export const paths: OpenAPIV3_1.Document["paths"] = {
4
+ "/api/collections/storage_fs/{id}": {
5
+ "get": {
6
+ "summary": "Get a record Or a file",
7
+ "description": "Get a record Or a file from the file system",
8
+ "parameters": [
9
+ {
10
+ "name": "id",
11
+ "in": "path",
12
+ "required": true,
13
+ "description": "The record ID of record in the file system.",
14
+ "schema": {
15
+ "type": "integer",
16
+ "example": 10,
17
+ },
18
+ },
19
+ {
20
+ "name": "action",
21
+ "in": "query",
22
+ "description": "used to respond with the file itself.",
23
+ "schema": {
24
+ "type": "string",
25
+ "examples": [
26
+ "view",
27
+ "download",
28
+ ],
29
+ },
30
+ },
31
+ ],
32
+ "responses": {
33
+ "200": {
34
+ "description": "Successful operation",
35
+ "content": {
36
+ "application/octet-stream": {
37
+ "schema": {
38
+ "type": "string",
39
+ "format": "binary",
40
+ },
41
+ },
42
+ },
43
+ },
44
+ },
45
+ },
46
+ },
47
+ "/api/collections/storage_fs": {
48
+ "post": {
49
+ "summary": "Create a record Or upload a file",
50
+ "description": "Add new record or upload a file to the file system",
51
+ "requestBody": {
52
+ "required": true,
53
+ "content": {
54
+ "multipart/form-data": {
55
+ "schema": {
56
+ "type": "object",
57
+ "required": ["file"],
58
+ "properties": {
59
+ "file": {
60
+ "type": "string",
61
+ "format": "binary",
62
+ "description": "The file to be uploaded",
63
+ },
64
+ "data": {
65
+ "type": "string",
66
+ "description": "data of the record",
67
+ },
68
+ },
69
+ },
70
+ },
71
+ },
72
+ },
73
+ "responses": {
74
+ "201": {
75
+ "description": "Successful operation",
76
+ },
77
+ },
78
+ },
79
+ },
80
+ };
81
+
82
+ export const openapi = {
83
+ paths: paths,
84
+ };