@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.
- package/.github/workflows/create_tag_on_version_change.yaml +45 -0
- package/.github/workflows/publish_npm_package.yaml +26 -0
- package/.vscode/settings.json +5 -0
- package/CHANGELOG.md +151 -30
- package/README.md +1 -35
- package/extensions/storage/adapters/index.ts +18 -0
- package/extensions/storage/adapters/localAdapter.ts +60 -0
- package/extensions/storage/adapters/storageAdapter.ts +13 -0
- package/extensions/storage/collections/fileSystem.ts +58 -0
- package/extensions/storage/collections/index.ts +12 -0
- package/extensions/storage/config/extensionConfigSchema.ts +15 -0
- package/extensions/storage/index.ts +26 -0
- package/extensions/storage/init.ts +6 -0
- package/extensions/storage/meta.ts +5 -0
- package/extensions/storage/migrations.ts +3 -0
- package/extensions/storage/openapi.ts +84 -0
- package/extensions/storage/studio/tests/fileManager.spec.ts +23 -0
- package/extensions/storage/studio/tests/package.json +1 -0
- package/extensions/storage/studio/tests/playwright.config.cjs +27 -0
- package/extensions/storage/studioExtension.json +1 -0
- package/extensions/storage/tests/configs/simple.ts +95 -0
- package/extensions/storage/tests/directories.test.ts +156 -0
- package/extensions/storage/tests/extraFormData.test.ts +47 -0
- package/extensions/storage/tests/files/rose.jpeg +0 -0
- package/extensions/storage/tests/files.test.ts +292 -0
- package/extensions/storage/tests/forceUpload.test.ts +72 -0
- package/extensions/storage/tests/massRemove.test.ts +189 -0
- package/extensions/storage/tests/meta.test.ts +26 -0
- package/extensions/storage/tests/recursiveDeleteMany.test.ts +208 -0
- package/extensions/storage/tests/recursiveDeleteOne.test.ts +206 -0
- package/extensions/storage/tests/storage/127 +0 -0
- package/extensions/storage/types.ts +11 -0
- package/extensions/storage/utils.ts +87 -0
- package/extensions/storage/workflows/controllers.ts +103 -0
- package/extensions/storage/workflows/index.ts +10 -0
- package/extensions/storage/workflows/services.ts +182 -0
- package/lobb.ts +54 -0
- package/package.json +32 -9
- package/scripts/postpublish.sh +12 -0
- package/scripts/prepublish.sh +17 -0
- package/studio/app.html +12 -0
- package/studio/routes/+layout.svelte +7 -0
- package/studio/routes/+layout.ts +1 -0
- package/studio/routes/[...path]/+page.svelte +6 -0
- package/svelte.config.js +23 -7
- package/todo.md +36 -0
- package/tsconfig.app.json +3 -3
- package/tsconfig.json +11 -5
- package/vite.config.ts +4 -8
- package/components.json +0 -16
- package/index.html +0 -13
- package/src/app.css +0 -124
- package/src/main.ts +0 -14
- /package/{src → extensions/storage/studio}/extension.types.ts +0 -0
- /package/{src → extensions/storage/studio}/index.ts +0 -0
- /package/{src → extensions/storage/studio}/lib/components/childrenFileExplorer.svelte +0 -0
- /package/{src → extensions/storage/studio}/lib/components/explorerNotSupported.svelte +0 -0
- /package/{src → extensions/storage/studio}/lib/components/fileExplorer.svelte +0 -0
- /package/{src → extensions/storage/studio}/lib/components/fileIcon.svelte +0 -0
- /package/{src → extensions/storage/studio}/lib/components/fileManagerBreadCrumbs.svelte +0 -0
- /package/{src → extensions/storage/studio}/lib/components/foreignKeyComponent.svelte +0 -0
- /package/{src → extensions/storage/studio}/lib/components/pages/fileExplorerPage.svelte +0 -0
- /package/{src → extensions/storage/studio}/lib/index.ts +0 -0
- /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
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
-
-
|
|
71
|
+
- publishing the storage extension - (033ab43) - Malik Najjar
|
|
23
72
|
#### Miscellaneous Chores
|
|
24
|
-
-
|
|
25
|
-
- fixing the
|
|
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
|
|
83
|
+
## storage-ext@0.6.7 - 2026-02-23
|
|
30
84
|
#### Bug Fixes
|
|
31
|
-
-
|
|
85
|
+
- the core broke because of the override events - (f650f4c) - Malik Najjar
|
|
32
86
|
#### Miscellaneous Chores
|
|
33
|
-
-
|
|
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
|
|
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.
|
|
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
|
|
141
|
+
## storage-ext@0.5.3 - 2026-02-17
|
|
47
142
|
#### Bug Fixes
|
|
48
|
-
- fixing the
|
|
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.
|
|
151
|
+
- (**version**) 0.10.2 - (2c92a7d) - Cocogitto Bot
|
|
51
152
|
|
|
52
153
|
- - -
|
|
53
154
|
|
|
54
|
-
## storage-ext
|
|
155
|
+
## storage-ext@0.5.1 - 2026-02-17
|
|
55
156
|
#### Bug Fixes
|
|
56
|
-
- fixing the
|
|
157
|
+
- fixing the storage publish issue - (b75d8d1) - Malik Najjar
|
|
57
158
|
|
|
58
159
|
- - -
|
|
59
160
|
|
|
60
|
-
## storage-ext
|
|
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
|
-
-
|
|
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
|
|
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
|
-
-
|
|
69
|
-
|
|
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.
|
|
79
|
-
- (**version**) 0.4.
|
|
80
|
-
- (**version**) 0.4.
|
|
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
|
-
#
|
|
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,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
|
+
};
|