@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.
Files changed (117) hide show
  1. package/.dockerignore +9 -0
  2. package/Dockerfile +26 -0
  3. package/FEATURES.md +32 -0
  4. package/LICENSE.md +17 -0
  5. package/MIGRATION.md +49 -0
  6. package/NOTICE.md +5 -0
  7. package/README.md +26 -0
  8. package/adapter.go +31 -0
  9. package/admin/register.go +60 -0
  10. package/admin/register_test.go +37 -0
  11. package/backups/backup_encryption_test.go +82 -0
  12. package/backups/encryption.go +138 -0
  13. package/backups/integration_test.go +51 -0
  14. package/backups/register.go +120 -0
  15. package/backups/restore.go +119 -0
  16. package/backups/s3_test.go +52 -0
  17. package/backups/swap.go +53 -0
  18. package/backups/swap_test.go +75 -0
  19. package/backups/upload.go +52 -0
  20. package/bin/pocketbase-extension.mjs +25 -0
  21. package/cmd/edge/main.go +123 -0
  22. package/cmd/import-fork/main.go +37 -0
  23. package/cmd/loadtest/main.go +61 -0
  24. package/cmd/loadtest/sandbox.go +73 -0
  25. package/cmd/loadtest/sandbox_test.go +20 -0
  26. package/cmd/pocketbase/main.go +78 -0
  27. package/deploy/README.md +148 -0
  28. package/deploy/app/hooks/README.md +2 -0
  29. package/deploy/app/migrations/1789000000_notes.js +16 -0
  30. package/deploy/app/public/README.md +2 -0
  31. package/deploy/compose.secrets.yaml +8 -0
  32. package/deploy/compose.yaml +68 -0
  33. package/deploy/edge.json +13 -0
  34. package/edge/gateway.go +295 -0
  35. package/edge/gateway_test.go +296 -0
  36. package/edge/openapi.json +1 -0
  37. package/edge/policy.go +150 -0
  38. package/features/collection_singleton.go +13 -0
  39. package/features/collection_singleton_test.go +46 -0
  40. package/features/dimensions_test.go +65 -0
  41. package/features/duplicate.go +178 -0
  42. package/features/duplicate_test.go +128 -0
  43. package/features/field_color.go +46 -0
  44. package/features/field_date_only.go +39 -0
  45. package/features/field_json_schema.go +92 -0
  46. package/features/field_scalar_extensions_test.go +66 -0
  47. package/features/files.go +36 -0
  48. package/features/filter_has_any_test.go +81 -0
  49. package/features/generate_test.go +72 -0
  50. package/features/has_any_visibility_test.go +62 -0
  51. package/features/json.go +50 -0
  52. package/features/membership.go +64 -0
  53. package/features/register.go +45 -0
  54. package/features/schema_test.go +58 -0
  55. package/features/ui/main.js +133 -0
  56. package/features/ui/settings.js +31 -0
  57. package/go.mod +54 -0
  58. package/go.sum +159 -0
  59. package/internal/archive/create.go +91 -0
  60. package/internal/archive/create_test.go +125 -0
  61. package/internal/archive/extract.go +99 -0
  62. package/internal/archive/extract_test.go +88 -0
  63. package/jsvm/binds.go +1273 -0
  64. package/jsvm/binds_app_reset_test.go +314 -0
  65. package/jsvm/binds_test.go +1870 -0
  66. package/jsvm/form_data.go +149 -0
  67. package/jsvm/form_data_test.go +225 -0
  68. package/jsvm/internal/types/generated/embed.go +6 -0
  69. package/jsvm/internal/types/generated/types.d.ts +24820 -0
  70. package/jsvm/internal/types/types.go +1408 -0
  71. package/jsvm/jsvm.go +587 -0
  72. package/jsvm/mapper.go +67 -0
  73. package/jsvm/mapper_test.go +42 -0
  74. package/jsvm/pool.go +73 -0
  75. package/jsvm/program_source_test.go +24 -0
  76. package/loadtest/loadtest.go +202 -0
  77. package/loadtest/loadtest_test.go +84 -0
  78. package/localization/README.md +23 -0
  79. package/localization/catalogue.json +483 -0
  80. package/localization/localization.go +94 -0
  81. package/localization/localization_test.go +21 -0
  82. package/mail/register.go +80 -0
  83. package/mail/register_test.go +49 -0
  84. package/mail/resolve.go +91 -0
  85. package/migration/import.go +96 -0
  86. package/migration/import_test.go +58 -0
  87. package/otp/otp.go +56 -0
  88. package/otp/otp_test.go +56 -0
  89. package/package.json +51 -0
  90. package/scripts/check-edge.py +42 -0
  91. package/scripts/check.sh +11 -0
  92. package/scripts/sync-jsvm-types.sh +10 -0
  93. package/security/README.md +94 -0
  94. package/security/assurance_test.go +149 -0
  95. package/security/compatibility_test.go +128 -0
  96. package/security/config.go +78 -0
  97. package/security/dashboard_test.go +103 -0
  98. package/security/management.go +169 -0
  99. package/security/openapi.json +508 -0
  100. package/security/review.go +34 -0
  101. package/security/security.go +503 -0
  102. package/security/security_test.go +146 -0
  103. package/security/state.go +116 -0
  104. package/security/ui/dashboard.css +4 -0
  105. package/security/ui/dashboard.js +83 -0
  106. package/security/ui/main.js +15 -0
  107. package/security/ui/model.js +32 -0
  108. package/security/ui/model.test.mjs +25 -0
  109. package/security/ui/registration.test.mjs +10 -0
  110. package/settings/env_test.go +41 -0
  111. package/settings/openapi.json +193 -0
  112. package/settings/settings.go +155 -0
  113. package/settings/settings_test.go +31 -0
  114. package/watcher/watcher.go +192 -0
  115. package/watcher/watcher_test.go +200 -0
  116. package/web/static.go +99 -0
  117. 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
+ }