@x47base/pocketbase-addon 0.1.0
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/.dockerignore +9 -0
- package/Dockerfile +26 -0
- package/FEATURES.md +32 -0
- package/LICENSE.md +17 -0
- package/MIGRATION.md +49 -0
- package/NOTICE.md +5 -0
- package/README.md +26 -0
- package/adapter.go +31 -0
- package/admin/register.go +60 -0
- package/admin/register_test.go +37 -0
- package/backups/backup_encryption_test.go +82 -0
- package/backups/encryption.go +138 -0
- package/backups/integration_test.go +51 -0
- package/backups/register.go +120 -0
- package/backups/restore.go +119 -0
- package/backups/s3_test.go +52 -0
- package/backups/swap.go +53 -0
- package/backups/swap_test.go +75 -0
- package/backups/upload.go +52 -0
- package/bin/pocketbase-extension.mjs +25 -0
- package/cmd/edge/main.go +123 -0
- package/cmd/import-fork/main.go +37 -0
- package/cmd/loadtest/main.go +61 -0
- package/cmd/loadtest/sandbox.go +73 -0
- package/cmd/loadtest/sandbox_test.go +20 -0
- package/cmd/pocketbase/main.go +78 -0
- package/deploy/README.md +148 -0
- package/deploy/app/hooks/README.md +2 -0
- package/deploy/app/migrations/1789000000_notes.js +16 -0
- package/deploy/app/public/README.md +2 -0
- package/deploy/compose.secrets.yaml +8 -0
- package/deploy/compose.yaml +68 -0
- package/deploy/edge.json +13 -0
- package/edge/gateway.go +295 -0
- package/edge/gateway_test.go +296 -0
- package/edge/openapi.json +1 -0
- package/edge/policy.go +150 -0
- package/features/collection_singleton.go +13 -0
- package/features/collection_singleton_test.go +46 -0
- package/features/dimensions_test.go +65 -0
- package/features/duplicate.go +178 -0
- package/features/duplicate_test.go +128 -0
- package/features/field_color.go +46 -0
- package/features/field_date_only.go +39 -0
- package/features/field_json_schema.go +92 -0
- package/features/field_scalar_extensions_test.go +66 -0
- package/features/files.go +36 -0
- package/features/filter_has_any_test.go +81 -0
- package/features/generate_test.go +72 -0
- package/features/has_any_visibility_test.go +62 -0
- package/features/json.go +50 -0
- package/features/membership.go +64 -0
- package/features/register.go +45 -0
- package/features/schema_test.go +58 -0
- package/features/ui/main.js +133 -0
- package/features/ui/settings.js +31 -0
- package/go.mod +54 -0
- package/go.sum +159 -0
- package/internal/archive/create.go +91 -0
- package/internal/archive/create_test.go +125 -0
- package/internal/archive/extract.go +99 -0
- package/internal/archive/extract_test.go +88 -0
- package/jsvm/binds.go +1273 -0
- package/jsvm/binds_app_reset_test.go +314 -0
- package/jsvm/binds_test.go +1870 -0
- package/jsvm/form_data.go +149 -0
- package/jsvm/form_data_test.go +225 -0
- package/jsvm/internal/types/generated/embed.go +6 -0
- package/jsvm/internal/types/generated/types.d.ts +24820 -0
- package/jsvm/internal/types/types.go +1408 -0
- package/jsvm/jsvm.go +587 -0
- package/jsvm/mapper.go +67 -0
- package/jsvm/mapper_test.go +42 -0
- package/jsvm/pool.go +73 -0
- package/jsvm/program_source_test.go +24 -0
- package/loadtest/loadtest.go +202 -0
- package/loadtest/loadtest_test.go +84 -0
- package/localization/README.md +23 -0
- package/localization/catalogue.json +483 -0
- package/localization/localization.go +94 -0
- package/localization/localization_test.go +21 -0
- package/mail/register.go +80 -0
- package/mail/register_test.go +49 -0
- package/mail/resolve.go +91 -0
- package/migration/import.go +96 -0
- package/migration/import_test.go +58 -0
- package/otp/otp.go +56 -0
- package/otp/otp_test.go +56 -0
- package/package.json +51 -0
- package/scripts/check-edge.py +42 -0
- package/scripts/check.sh +11 -0
- package/scripts/sync-jsvm-types.sh +10 -0
- package/security/README.md +94 -0
- package/security/assurance_test.go +149 -0
- package/security/compatibility_test.go +128 -0
- package/security/config.go +78 -0
- package/security/dashboard_test.go +103 -0
- package/security/management.go +169 -0
- package/security/openapi.json +508 -0
- package/security/review.go +34 -0
- package/security/security.go +503 -0
- package/security/security_test.go +146 -0
- package/security/state.go +116 -0
- package/security/ui/dashboard.css +4 -0
- package/security/ui/dashboard.js +83 -0
- package/security/ui/main.js +15 -0
- package/security/ui/model.js +32 -0
- package/security/ui/model.test.mjs +25 -0
- package/security/ui/registration.test.mjs +10 -0
- package/settings/env_test.go +41 -0
- package/settings/openapi.json +193 -0
- package/settings/settings.go +155 -0
- package/settings/settings_test.go +31 -0
- package/watcher/watcher.go +192 -0
- package/watcher/watcher_test.go +200 -0
- package/web/static.go +99 -0
- package/web/static_test.go +48 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
package jsvm
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"net/http/httptest"
|
|
5
|
+
"testing"
|
|
6
|
+
|
|
7
|
+
"github.com/dop251/goja"
|
|
8
|
+
"github.com/pocketbase/pocketbase/apis"
|
|
9
|
+
"github.com/pocketbase/pocketbase/core"
|
|
10
|
+
"github.com/pocketbase/pocketbase/tests"
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
func TestHooksAppReset(t *testing.T) {
|
|
14
|
+
t.Parallel()
|
|
15
|
+
|
|
16
|
+
testApp, _ := tests.NewTestApp()
|
|
17
|
+
defer testApp.Cleanup()
|
|
18
|
+
|
|
19
|
+
createVM := func() *goja.Runtime {
|
|
20
|
+
vm := goja.New()
|
|
21
|
+
vm.SetFieldNameMapper(FieldMapper{})
|
|
22
|
+
vm.Set("$app", testApp)
|
|
23
|
+
return vm
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
loader := createVM()
|
|
27
|
+
|
|
28
|
+
pool := newPool(1, createVM)
|
|
29
|
+
|
|
30
|
+
hooksBinds(testApp, loader, pool)
|
|
31
|
+
|
|
32
|
+
// register any hook
|
|
33
|
+
_, err := loader.RunScript("stub", `
|
|
34
|
+
onRecordCreate((e) => {
|
|
35
|
+
e.next()
|
|
36
|
+
|
|
37
|
+
$app = 123; // overwrite
|
|
38
|
+
})
|
|
39
|
+
`)
|
|
40
|
+
if err != nil {
|
|
41
|
+
t.Fatal(err)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// insert a dummy record to trigger the JS hook
|
|
45
|
+
{
|
|
46
|
+
collection, err := testApp.FindCollectionByNameOrId("demo2")
|
|
47
|
+
if err != nil {
|
|
48
|
+
t.Fatal(err)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
record := core.NewRecord(collection)
|
|
52
|
+
record.Set("title", "test")
|
|
53
|
+
if err := testApp.Save(record); err != nil {
|
|
54
|
+
t.Fatal(err)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// check the executor state
|
|
59
|
+
pool.run(func(vm *goja.Runtime) error {
|
|
60
|
+
val, err := vm.RunScript("verify", `$app`)
|
|
61
|
+
if err != nil {
|
|
62
|
+
t.Fatal(err)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if valApp := val.Export(); valApp != testApp {
|
|
66
|
+
t.Fatalf("Expected $app to reset to its original value, got %v", valApp)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return nil
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
func TestRouterHandlerAppReset(t *testing.T) {
|
|
74
|
+
t.Parallel()
|
|
75
|
+
|
|
76
|
+
testApp, _ := tests.NewTestApp()
|
|
77
|
+
defer testApp.Cleanup()
|
|
78
|
+
|
|
79
|
+
createVM := func() *goja.Runtime {
|
|
80
|
+
vm := goja.New()
|
|
81
|
+
vm.SetFieldNameMapper(FieldMapper{})
|
|
82
|
+
vm.Set("$app", testApp)
|
|
83
|
+
return vm
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
loader := createVM()
|
|
87
|
+
|
|
88
|
+
pool := newPool(1, createVM)
|
|
89
|
+
|
|
90
|
+
routerBinds(testApp, loader, pool)
|
|
91
|
+
|
|
92
|
+
// register route handler hook
|
|
93
|
+
_, err := loader.RunScript("stub", `
|
|
94
|
+
routerAdd("GET", "/test", (e) => {
|
|
95
|
+
$app = 123; // overwrite
|
|
96
|
+
|
|
97
|
+
return e.string(200, "test")
|
|
98
|
+
})
|
|
99
|
+
`)
|
|
100
|
+
if err != nil {
|
|
101
|
+
t.Fatal(err)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// create mock web server
|
|
105
|
+
{
|
|
106
|
+
baseRouter, err := apis.NewRouter(testApp)
|
|
107
|
+
if err != nil {
|
|
108
|
+
t.Fatal(err)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// manually trigger the serve event to ensure that custom app routes and middlewares are registered
|
|
112
|
+
serveEvent := new(core.ServeEvent)
|
|
113
|
+
serveEvent.App = testApp
|
|
114
|
+
serveEvent.Router = baseRouter
|
|
115
|
+
_ = testApp.OnServe().Trigger(serveEvent, func(e *core.ServeEvent) error {
|
|
116
|
+
req := httptest.NewRequest("GET", "/test", nil)
|
|
117
|
+
|
|
118
|
+
recorder := httptest.NewRecorder()
|
|
119
|
+
|
|
120
|
+
mux, err := e.Router.BuildMux()
|
|
121
|
+
if err != nil {
|
|
122
|
+
t.Fatalf("Failed to build router mux: %v", err)
|
|
123
|
+
}
|
|
124
|
+
mux.ServeHTTP(recorder, req)
|
|
125
|
+
|
|
126
|
+
if recorder.Code != 200 {
|
|
127
|
+
t.Fatalf("Expected status code %d, got %d", 200, recorder.Code)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
body := recorder.Body.String()
|
|
131
|
+
if body != "test" {
|
|
132
|
+
t.Fatalf("Expected body %q, got %q", "test", body)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return nil
|
|
136
|
+
})
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
pool.run(func(vm *goja.Runtime) error {
|
|
140
|
+
val, err := vm.RunScript("verify", `$app`)
|
|
141
|
+
if err != nil {
|
|
142
|
+
t.Fatal(err)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if valApp := val.Export(); valApp != testApp {
|
|
146
|
+
t.Fatalf("Expected $app to reset to its original value, got %v", valApp)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return nil
|
|
150
|
+
})
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
func TestRouterMiddlewareFuncAppReset(t *testing.T) {
|
|
154
|
+
t.Parallel()
|
|
155
|
+
|
|
156
|
+
testApp, _ := tests.NewTestApp()
|
|
157
|
+
defer testApp.Cleanup()
|
|
158
|
+
|
|
159
|
+
createVM := func() *goja.Runtime {
|
|
160
|
+
vm := goja.New()
|
|
161
|
+
vm.SetFieldNameMapper(FieldMapper{})
|
|
162
|
+
vm.Set("$app", testApp)
|
|
163
|
+
return vm
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
loader := createVM()
|
|
167
|
+
|
|
168
|
+
pool := newPool(1, createVM)
|
|
169
|
+
|
|
170
|
+
routerBinds(testApp, loader, pool)
|
|
171
|
+
|
|
172
|
+
// register route middleware func
|
|
173
|
+
_, err := loader.RunScript("stub", `
|
|
174
|
+
routerUse((e) => {
|
|
175
|
+
e.string(200, "test")
|
|
176
|
+
|
|
177
|
+
$app = 123; // overwrite
|
|
178
|
+
})
|
|
179
|
+
`)
|
|
180
|
+
if err != nil {
|
|
181
|
+
t.Fatal(err)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// create mock web server
|
|
185
|
+
{
|
|
186
|
+
baseRouter, err := apis.NewRouter(testApp)
|
|
187
|
+
if err != nil {
|
|
188
|
+
t.Fatal(err)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// manually trigger the serve event to ensure that custom app routes and middlewares are registered
|
|
192
|
+
serveEvent := new(core.ServeEvent)
|
|
193
|
+
serveEvent.App = testApp
|
|
194
|
+
serveEvent.Router = baseRouter
|
|
195
|
+
_ = testApp.OnServe().Trigger(serveEvent, func(e *core.ServeEvent) error {
|
|
196
|
+
// it doesn't matter as long as the middleware is called
|
|
197
|
+
req := httptest.NewRequest("GET", "/anything", nil)
|
|
198
|
+
|
|
199
|
+
recorder := httptest.NewRecorder()
|
|
200
|
+
|
|
201
|
+
mux, err := e.Router.BuildMux()
|
|
202
|
+
if err != nil {
|
|
203
|
+
t.Fatalf("Failed to build router mux: %v", err)
|
|
204
|
+
}
|
|
205
|
+
mux.ServeHTTP(recorder, req)
|
|
206
|
+
|
|
207
|
+
if recorder.Code != 200 {
|
|
208
|
+
t.Fatalf("Expected status code %d, got %d", 200, recorder.Code)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
body := recorder.Body.String()
|
|
212
|
+
if body != "test" {
|
|
213
|
+
t.Fatalf("Expected body %q, got %q", "test", body)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return nil
|
|
217
|
+
})
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
pool.run(func(vm *goja.Runtime) error {
|
|
221
|
+
val, err := vm.RunScript("verify", `$app`)
|
|
222
|
+
if err != nil {
|
|
223
|
+
t.Fatal(err)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if valApp := val.Export(); valApp != testApp {
|
|
227
|
+
t.Fatalf("Expected $app to reset to its original value, got %v", valApp)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return nil
|
|
231
|
+
})
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
func TestRouterMiddlewareClassAppReset(t *testing.T) {
|
|
235
|
+
t.Parallel()
|
|
236
|
+
|
|
237
|
+
testApp, _ := tests.NewTestApp()
|
|
238
|
+
defer testApp.Cleanup()
|
|
239
|
+
|
|
240
|
+
createVM := func() *goja.Runtime {
|
|
241
|
+
vm := goja.New()
|
|
242
|
+
vm.SetFieldNameMapper(FieldMapper{})
|
|
243
|
+
vm.Set("$app", testApp)
|
|
244
|
+
BindCore(vm)
|
|
245
|
+
return vm
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
loader := createVM()
|
|
249
|
+
|
|
250
|
+
pool := newPool(1, createVM)
|
|
251
|
+
|
|
252
|
+
routerBinds(testApp, loader, pool)
|
|
253
|
+
|
|
254
|
+
// register route middleware class
|
|
255
|
+
_, err := loader.RunScript("stub", `
|
|
256
|
+
routerUse(new Middleware((e) => {
|
|
257
|
+
e.string(200, "test")
|
|
258
|
+
|
|
259
|
+
$app = 123; // overwrite
|
|
260
|
+
}))
|
|
261
|
+
`)
|
|
262
|
+
if err != nil {
|
|
263
|
+
t.Fatal(err)
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// create mock web server
|
|
267
|
+
{
|
|
268
|
+
baseRouter, err := apis.NewRouter(testApp)
|
|
269
|
+
if err != nil {
|
|
270
|
+
t.Fatal(err)
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// manually trigger the serve event to ensure that custom app routes and middlewares are registered
|
|
274
|
+
serveEvent := new(core.ServeEvent)
|
|
275
|
+
serveEvent.App = testApp
|
|
276
|
+
serveEvent.Router = baseRouter
|
|
277
|
+
_ = testApp.OnServe().Trigger(serveEvent, func(e *core.ServeEvent) error {
|
|
278
|
+
// it doesn't matter as long as the middleware is called
|
|
279
|
+
req := httptest.NewRequest("GET", "/anything", nil)
|
|
280
|
+
|
|
281
|
+
recorder := httptest.NewRecorder()
|
|
282
|
+
|
|
283
|
+
mux, err := e.Router.BuildMux()
|
|
284
|
+
if err != nil {
|
|
285
|
+
t.Fatalf("Failed to build router mux: %v", err)
|
|
286
|
+
}
|
|
287
|
+
mux.ServeHTTP(recorder, req)
|
|
288
|
+
|
|
289
|
+
if recorder.Code != 200 {
|
|
290
|
+
t.Fatalf("Expected status code %d, got %d", 200, recorder.Code)
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
body := recorder.Body.String()
|
|
294
|
+
if body != "test" {
|
|
295
|
+
t.Fatalf("Expected body %q, got %q", "test", body)
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
return nil
|
|
299
|
+
})
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
pool.run(func(vm *goja.Runtime) error {
|
|
303
|
+
val, err := vm.RunScript("verify", `$app`)
|
|
304
|
+
if err != nil {
|
|
305
|
+
t.Fatal(err)
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if valApp := val.Export(); valApp != testApp {
|
|
309
|
+
t.Fatalf("Expected $app to reset to its original value, got %v", valApp)
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
return nil
|
|
313
|
+
})
|
|
314
|
+
}
|