kempo 4.7.0 → 4.8.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 (82) hide show
  1. package/README.md +3 -1
  2. package/bin/cli.js +15 -33
  3. package/dist/admin/components/EmailTemplates.js +25 -0
  4. package/dist/admin/components/EmailTemplates.js.map +1 -0
  5. package/dist/admin/components/Emails.js +49 -0
  6. package/dist/admin/components/Emails.js.map +1 -0
  7. package/dist/admin/components/settings/AdminSettings.js +7 -0
  8. package/dist/admin/components/settings/AdminSettings.js.map +1 -0
  9. package/dist/admin/components/settings/BooleanSetting.js +2 -0
  10. package/dist/admin/components/settings/BooleanSetting.js.map +1 -0
  11. package/dist/admin/components/settings/JsonSetting.js +2 -0
  12. package/dist/admin/components/settings/JsonSetting.js.map +1 -0
  13. package/dist/admin/components/settings/NumberSetting.js +2 -0
  14. package/dist/admin/components/settings/NumberSetting.js.map +1 -0
  15. package/dist/admin/components/settings/SecretSetting.js +2 -0
  16. package/dist/admin/components/settings/SecretSetting.js.map +1 -0
  17. package/dist/admin/components/settings/Setting.js +2 -0
  18. package/dist/admin/components/settings/Setting.js.map +1 -0
  19. package/dist/admin/components/settings/SettingEditor.js +2 -0
  20. package/dist/admin/components/settings/SettingEditor.js.map +1 -0
  21. package/dist/admin/components/settings/SettingsPanel.js +24 -0
  22. package/dist/admin/components/settings/SettingsPanel.js.map +1 -0
  23. package/dist/admin/components/settings/StringSetting.js +2 -0
  24. package/dist/admin/components/settings/StringSetting.js.map +1 -0
  25. package/dist/admin/components/settings/humanize.js +2 -0
  26. package/dist/admin/components/settings/humanize.js.map +1 -0
  27. package/dist/admin/emails/index.page.html +14 -0
  28. package/dist/admin/icons/mail.svg +1 -0
  29. package/dist/admin/nav.fragment.html +6 -0
  30. package/dist/admin/settings/[owner]/[name]/index.page.html +1 -1
  31. package/dist/admin/settings/index.page.html +6 -289
  32. package/dist/kempo/api/email-templates/GET.js +2 -0
  33. package/dist/kempo/api/email-templates/GET.js.map +1 -0
  34. package/dist/kempo/api/email-templates/file/DELETE.js +2 -0
  35. package/dist/kempo/api/email-templates/file/DELETE.js.map +1 -0
  36. package/dist/kempo/api/email-templates/file/GET.js +2 -0
  37. package/dist/kempo/api/email-templates/file/GET.js.map +1 -0
  38. package/dist/kempo/api/email-templates/file/PUT.js +2 -0
  39. package/dist/kempo/api/email-templates/file/PUT.js.map +1 -0
  40. package/dist/kempo/api/email-templates/preview/GET.js +2 -0
  41. package/dist/kempo/api/email-templates/preview/GET.js.map +1 -0
  42. package/dist/kempo/api/emails/GET.js +2 -0
  43. package/dist/kempo/api/emails/GET.js.map +1 -0
  44. package/dist/kempo/api/emails/[id]/GET.js +2 -0
  45. package/dist/kempo/api/emails/[id]/GET.js.map +1 -0
  46. package/dist/kempo/api/emails/[id]/retry/POST.js +2 -0
  47. package/dist/kempo/api/emails/[id]/retry/POST.js.map +1 -0
  48. package/dist/kempo/api/emails/test/POST.js +2 -0
  49. package/dist/kempo/api/emails/test/POST.js.map +1 -0
  50. package/dist/kempo/api/settings/[owner]/[name]/POST.js +1 -1
  51. package/dist/kempo/api/settings/[owner]/[name]/POST.js.map +1 -1
  52. package/dist/kempo/sdk.js +1 -1
  53. package/dist/kempo/sdk.js.map +1 -1
  54. package/middleware/kempo.js +21 -0
  55. package/package.json +2 -3
  56. package/server/db/schema.js +32 -0
  57. package/server/sdk.js +5 -0
  58. package/server/utils/email/defaultSender.js +2 -0
  59. package/server/utils/email/dispatchEmail.js +56 -0
  60. package/server/utils/email/emailSettings.js +21 -0
  61. package/server/utils/email/emailTemplatePaths.js +36 -0
  62. package/server/utils/email/getEmail.js +14 -0
  63. package/server/utils/email/getSenderEmail.js +11 -0
  64. package/server/utils/email/getSenderFrom.js +18 -0
  65. package/server/utils/email/isValidSender.js +4 -0
  66. package/server/utils/email/listEmailTemplates.js +23 -0
  67. package/server/utils/email/listEmails.js +35 -0
  68. package/server/utils/email/maintainEmails.js +46 -0
  69. package/server/utils/email/pruneEmails.js +29 -0
  70. package/server/utils/email/readEmailTemplate.js +28 -0
  71. package/server/utils/email/resetEmailTemplate.js +15 -0
  72. package/server/utils/email/retryEmail.js +21 -0
  73. package/server/utils/email/saveEmailTemplate.js +38 -0
  74. package/server/utils/email/sendEmail.js +22 -32
  75. package/server/utils/email/sendEmailFromTemplate.js +2 -2
  76. package/server/utils/hooks/triggerHook.js +17 -4
  77. package/server/utils/settings/listSettings.js +10 -5
  78. package/server/utils/settings/setSetting.js +4 -0
  79. package/server/utils/settings/settingRules.js +21 -0
  80. package/server/utils/settings/systemSettings.js +40 -0
  81. package/server/utils/setup/seedDatabase.js +5 -60
  82. package/server/utils/setup/systemPermissions.js +75 -0
@@ -3,297 +3,14 @@
3
3
  -->
4
4
  <page title="Settings - Admin">
5
5
  <content>
6
- <script type="module" src="/kempo-ui/components/Table.js"></script>
7
- <script type="module" src="/kempo-ui/components/controls/TcFirstPage.js"></script>
8
- <script type="module" src="/kempo-ui/components/controls/TcPrevPage.js"></script>
9
- <script type="module" src="/kempo-ui/components/controls/TcNextPage.js"></script>
10
- <script type="module" src="/kempo-ui/components/controls/TcLastPage.js"></script>
11
- <script type="module" src="/kempo-ui/components/controls/TcPageSelect.js"></script>
12
- <script type="module" src="/kempo-ui/components/controls/TcPageSize.js"></script>
13
- <script type="module" src="/kempo-ui/components/controls/TcEdit.js"></script>
14
- <script type="module" src="/kempo-ui/components/controls/TcDeleteRecord.js"></script>
15
- <script type="module" src="/kempo-ui/components/controls/TcDeleteSelected.js"></script>
16
- <script type="module" src="/admin/components/TableRowLink.js"></script>
17
- <script type="module" src="/kempo/components/Permission.js"></script>
6
+ <script type="module" src="/admin/components/settings/AdminSettings.js"></script>
18
7
 
19
- <div class="d-f mb" style="align-items: center; gap: var(--spacer);">
20
- <h1 class="flex mb0">Settings</h1>
21
- <k-permission has="system:custom-settings:manage">
22
- <button id="createSettingBtn" class="primary">Create Setting</button>
23
- </k-permission>
24
- </div>
8
+ <h1>Settings</h1>
25
9
 
26
- <h2>Custom Settings</h2>
27
- <k-table id="customTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No custom settings have been created yet.">
28
- <admin-table-row-link slot="before" url-pattern="{_link}" field-name="_link"></admin-table-row-link>
29
- <div slot="top" class="d-f full" style="align-items: center;">
30
- <div>
31
- <k-permission has="system:custom-settings:manage">
32
- <kc-tc-delete-selected></kc-tc-delete-selected>
33
- </k-permission>
34
- </div>
35
- </div>
36
- <div class="d-f full" style="align-items: center;">
37
- <div>
38
- <kc-tc-first-page></kc-tc-first-page>
39
- <kc-tc-prev-page></kc-tc-prev-page>
40
- <kc-tc-next-page></kc-tc-next-page>
41
- <kc-tc-last-page></kc-tc-last-page>
42
- </div>
43
- <div class="flex"></div>
44
- <div><kc-tc-page-select></kc-tc-page-select></div>
45
- <div class="flex"></div>
46
- <div><kc-tc-page-size></kc-tc-page-size></div>
47
- </div>
48
- </k-table>
49
-
50
- <h2>Extension Settings</h2>
51
- <k-table id="extensionTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No extension settings installed.">
52
- <admin-table-row-link slot="before" url-pattern="{_link}" field-name="_link"></admin-table-row-link>
53
- <div class="d-f full" style="align-items: center;">
54
- <div>
55
- <kc-tc-first-page></kc-tc-first-page>
56
- <kc-tc-prev-page></kc-tc-prev-page>
57
- <kc-tc-next-page></kc-tc-next-page>
58
- <kc-tc-last-page></kc-tc-last-page>
59
- </div>
60
- <div class="flex"></div>
61
- <div><kc-tc-page-select></kc-tc-page-select></div>
62
- <div class="flex"></div>
63
- <div><kc-tc-page-size></kc-tc-page-size></div>
64
- </div>
65
- </k-table>
66
-
67
- <h2>System Settings</h2>
68
- <k-table id="systemTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No system settings found.">
69
- <admin-table-row-link slot="before" url-pattern="{_link}" field-name="_link"></admin-table-row-link>
70
- <div class="d-f full" style="align-items: center;">
71
- <div>
72
- <kc-tc-first-page></kc-tc-first-page>
73
- <kc-tc-prev-page></kc-tc-prev-page>
74
- <kc-tc-next-page></kc-tc-next-page>
75
- <kc-tc-last-page></kc-tc-last-page>
76
- </div>
77
- <div class="flex"></div>
78
- <div><kc-tc-page-select></kc-tc-page-select></div>
79
- <div class="flex"></div>
80
- <div><kc-tc-page-size></kc-tc-page-size></div>
81
- </div>
82
- </k-table>
83
-
84
- <script type="module">
85
- import { listSettings, setSetting, deleteSetting, getAllCurrentUserPermissions } from '/kempo/sdk.js';
86
- import { html } from '/kempo-ui/lit-all.min.js';
87
- import Toast from '/kempo-ui/components/Toast.js';
88
- import Dialog from '/kempo-ui/components/Dialog.js';
89
-
90
- await window.customElements.whenDefined('k-table');
91
-
92
- const [, permData] = await getAllCurrentUserPermissions();
93
- const myPerms = new Set(permData?.permissions ?? []);
94
- const canManageSystem = myPerms.has('system:settings:update');
95
- const canManageCustom = myPerms.has('system:custom-settings:manage');
96
-
97
- const buildFields = (editable, showOwner = false) => [
98
- ...(showOwner ? [{ name: 'owner', label: 'Owner', size: 120, editable: false, calculator: r => r.name.split(':')[0] }] : []),
99
- { name: 'name', label: 'Name', size: 220, editable: false, calculator: r => r.name.split(':').slice(1).join(':') },
100
- { name: 'value', label: 'Value', size: 280, editable, formatter: v => {
101
- if(v === null || v === undefined) return '';
102
- const s = String(v);
103
- return s.length > 120 ? s.slice(0, 117) + '...' : s;
104
- }},
105
- { name: 'type', label: 'Type', size: 90, editable },
106
- { name: 'isPublic', label: 'Public', size: 80, editable, formatter: v => String(v) },
107
- { name: 'description', label: 'Description', size: 320, editable },
108
- { name: 'updatedAt', label: 'Updated', size: 190, editable: false, formatter: v => new Date(v).toLocaleString() }
109
- ];
110
-
111
- const coerceValue = (value, type) => {
112
- if(type === 'number') return Number(value);
113
- if(type === 'boolean') return String(value).toLowerCase() === 'true';
114
- if(type === 'json') return JSON.parse(String(value));
115
- return String(value);
116
- };
117
-
118
- const setupTable = ($table, owner, canEdit, loadFn) => {
119
- if(canEdit){
120
- $table.setAttribute('request-edit', '');
121
- const edit = document.createElement('kc-tc-edit');
122
- edit.setAttribute('slot', 'after');
123
- $table.appendChild(edit);
124
- }
125
-
126
- if(owner === 'custom' && canEdit){
127
- $table.setAttribute('request-delete', '');
128
- $table.setAttribute('enable-selection', '');
129
- const del = document.createElement('kc-tc-delete-record');
130
- del.setAttribute('slot', 'after');
131
- $table.appendChild(del);
132
- }
133
-
134
- $table.addEventListener('requestSave', async ({ detail: { record, newData, approve, reject } }) => {
135
- const type = newData.type ?? record.type;
136
- let value = newData.value !== undefined ? newData.value : record.value;
137
-
138
- try {
139
- value = coerceValue(value, type);
140
- } catch(e){
141
- reject();
142
- Toast.error(`Invalid ${type} value`);
143
- return;
144
- }
145
-
146
- const isPublic = newData.isPublic !== undefined
147
- ? String(newData.isPublic).toLowerCase() === 'true'
148
- : record.isPublic;
149
- const [recordOwner, ...nameParts] = record.name.split(':');
150
- const name = nameParts.join(':');
151
- const [error] = await setSetting(recordOwner, name, {
152
- value,
153
- type,
154
- isPublic,
155
- description: newData.description ?? record.description
156
- });
157
-
158
- if(error){ reject(); Toast.error(error.msg || 'Failed to update setting'); return; }
159
- approve();
160
- Toast.success('Setting updated');
161
- });
162
-
163
- if(owner === 'custom' && canEdit){
164
- $table.addEventListener('requestDelete', ({ detail: { records, approve, reject } }) => {
165
- const displayName = r => r.name.split(':').slice(1).join(':');
166
- const count = records.length;
167
- const msg = count === 1
168
- ? `<div class="p"><p>Delete "${displayName(records[0])}"? This action cannot be undone.</p></div>`
169
- : `<div class="p"><p>Delete ${count} settings? This action cannot be undone.</p></div>`;
170
- Dialog.confirm(msg, async (confirmed) => {
171
- if(!confirmed){ reject(); return; }
172
- let failed = 0;
173
- for(const record of records){
174
- const [recOwner, ...nameParts] = record.name.split(':');
175
- const [error] = await deleteSetting(recOwner, nameParts.join(':'));
176
- if(error) failed++;
177
- }
178
- if(failed){
179
- reject();
180
- Toast.error(`Failed to delete ${failed} setting${failed !== 1 ? 's' : ''}`);
181
- return;
182
- }
183
- approve();
184
- Toast.success(count === 1 ? 'Setting deleted' : `${count} settings deleted`);
185
- loadFn();
186
- });
187
- });
188
- }
189
- };
190
-
191
- const addLinks = settings => {
192
- settings.forEach(s => {
193
- const [o, ...parts] = s.name.split(':');
194
- s._link = `/admin/settings/${encodeURIComponent(o)}/${encodeURIComponent(parts.join(':'))}/`;
195
- });
196
- };
197
-
198
- const loadTable = async ($table, owner, canEdit) => {
199
- const [error, data] = await listSettings({ owner });
200
- if(error){ Toast.error(error.msg || 'Failed to load settings'); return; }
201
- addLinks(data.settings);
202
- $table.setData({ records: data.settings, fields: buildFields(canEdit, owner === 'extension') });
203
- $table.setupFetchRecords(data.total, async (start, count) => {
204
- const [err, d] = await listSettings({ owner, limit: count, offset: start });
205
- if(err) return [];
206
- addLinks(d.settings);
207
- return d.settings;
208
- });
209
- };
210
-
211
- const $customTable = document.getElementById('customTable');
212
- const $extensionTable = document.getElementById('extensionTable');
213
- const $systemTable = document.getElementById('systemTable');
214
-
215
- setupTable($customTable, 'custom', canManageCustom, () => loadTable($customTable, 'custom', canManageCustom));
216
- setupTable($extensionTable, 'extension', false, () => loadTable($extensionTable, 'extension', false));
217
- setupTable($systemTable, 'system', canManageSystem, () => loadTable($systemTable, 'system', canManageSystem));
218
-
219
- await Promise.all([
220
- loadTable($customTable, 'custom', canManageCustom),
221
- loadTable($extensionTable, 'extension', false),
222
- loadTable($systemTable, 'system', canManageSystem)
223
- ]);
224
-
225
- if(canManageCustom){
226
- document.getElementById('createSettingBtn').addEventListener('click', () => {
227
- const $dialog = Dialog.create(html`
228
- <div class="p">
229
- <div class="mb">
230
- <label class="d-b mb-sm">Name</label>
231
- <input type="text" id="dlg-name" class="full" placeholder="e.g. my-setting" required>
232
- </div>
233
- <div class="mb">
234
- <label class="d-b mb-sm">Value</label>
235
- <input type="text" id="dlg-value" class="full">
236
- </div>
237
- <div class="mb">
238
- <label class="d-b mb-sm">Type</label>
239
- <select id="dlg-type" class="full">
240
- <option value="string">String</option>
241
- <option value="number">Number</option>
242
- <option value="boolean">Boolean</option>
243
- <option value="json">JSON</option>
244
- <option value="secret">Secret</option>
245
- </select>
246
- </div>
247
- <div class="mb d-f" style="align-items: center; gap: var(--spacer-sm);" id="dlg-isPublic-row">
248
- <input type="checkbox" id="dlg-isPublic">
249
- <label for="dlg-isPublic">Public (accessible without authentication)</label>
250
- </div>
251
- <div>
252
- <label class="d-b mb-sm">Description</label>
253
- <input type="text" id="dlg-description" class="full">
254
- </div>
255
- </div>
256
- `, {
257
- title: 'Create Setting',
258
- confirmText: 'Create',
259
- confirmAction: async () => {
260
- const name = $dialog.querySelector('#dlg-name').value.trim();
261
- if(!name){ Toast.error('Name is required'); return; }
262
- if(name.includes(':')){ Toast.error('Name cannot contain ":"'); return; }
263
-
264
- const rawValue = $dialog.querySelector('#dlg-value').value;
265
- const type = $dialog.querySelector('#dlg-type').value;
266
- const isPublic = $dialog.querySelector('#dlg-isPublic').checked;
267
- const description = $dialog.querySelector('#dlg-description').value.trim();
268
-
269
- let value;
270
- try {
271
- value = coerceValue(rawValue, type);
272
- } catch(e){
273
- Toast.error(`Invalid ${type} value`);
274
- return;
275
- }
276
-
277
- const [error] = await setSetting('custom', name, { value, type, isPublic, description });
278
- if(error){ Toast.error(error.msg || 'Failed to create setting'); return; }
279
- Toast.success('Setting created');
280
- loadTable($customTable, 'custom', canManageCustom);
281
- },
282
- cancelText: 'Cancel'
283
- });
284
-
285
- const $dlgValue = $dialog.querySelector('#dlg-value');
286
- const $dlgIsPublic = $dialog.querySelector('#dlg-isPublic');
287
- const $dlgIsPublicRow = $dialog.querySelector('#dlg-isPublic-row');
288
- $dialog.querySelector('#dlg-type').addEventListener('change', e => {
289
- const isSecret = e.target.value === 'secret';
290
- $dlgValue.type = isSecret ? 'password' : 'text';
291
- $dlgIsPublicRow.style.display = isSecret ? 'none' : '';
292
- if(isSecret) $dlgIsPublic.checked = false;
293
- });
294
- });
295
- }
296
- </script>
10
+ <k-admin-settings>
11
+ <location name="admin-settings-tabs" />
12
+ </k-admin-settings>
13
+ <location name="admin-settings-scripts" />
297
14
 
298
15
  </content>
299
16
  </page>
@@ -0,0 +1,2 @@
1
+ import s from"../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../server/utils/email/listEmailTemplates.js";export default async(r,t)=>{const[o,i]=await s(r.cookies.session_token,"system:pages:read");if(o)return t.status(o.code).json({error:o.msg});if(!i)return t.status(403).json({error:"Insufficient permissions"});const[n,a]=await e({owner:r.query.owner||null});if(n)return t.status(n.code).json({error:n.msg});t.json({templates:a})};
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\email-templates\GET.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\kempo\\api\\email-templates\\GET.js","names":["currentUserHasPermission","listEmailTemplates","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","templates","owner","query"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\nimport listEmailTemplates from '../../../../server/utils/email/listEmailTemplates.js';\n\n/* The email templates of the extension named in `?owner=`, or kempo's own and the site's when there is none. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:pages:read');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst [error, templates] = await listEmailTemplates({ owner: request.query.owner || null });\n\tif(error) return response.status(error.code).json({ error: error.msg });\n\n\tresponse.json({ templates });\n};\n"],"mappings":"OAAOA,MAA8B,0EAC9BC,MAAwB,sEAGhBC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,qBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAOA,EAAOE,SAAmBb,EAAmB,CAAEc,MAAOZ,EAAQa,MAAMD,OAAS,OACpF,GAAGH,EAAO,OAAOR,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAEjET,EAASO,KAAK,CAAEG","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../server/utils/email/resetEmailTemplate.js";export default async(r,t)=>{const[o,i]=await s(r.cookies.session_token,"system:pages:update");if(o)return t.status(o.code).json({error:o.msg});if(!i)return t.status(403).json({error:"Insufficient permissions"});const[n,a]=await e({template:r.body?.template});if(n)return t.status(n.code).json({error:n.msg});t.json(a)};
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\email-templates\file\DELETE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\kempo\\api\\email-templates\\file\\DELETE.js","names":["currentUserHasPermission","resetEmailTemplate","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","reset","template","body"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport resetEmailTemplate from '../../../../../server/utils/email/resetEmailTemplate.js';\n\n/* Goes back to the packaged version of an email template, by removing the site's own. Body: `{ template }`. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:pages:update');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst [error, reset] = await resetEmailTemplate({ template: request.body?.template });\n\tif(error) return response.status(error.code).json({ error: error.msg });\n\n\tresponse.json(reset);\n};\n"],"mappings":"OAAOA,MAA8B,6EAC9BC,MAAwB,yEAGhBC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,uBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAOA,EAAOE,SAAeb,EAAmB,CAAEc,SAAUZ,EAAQa,MAAMD,WAC1E,GAAGH,EAAO,OAAOR,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAEjET,EAASO,KAAKG","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../server/utils/email/readEmailTemplate.js";export default async(r,t)=>{const[o,i]=await s(r.cookies.session_token,"system:pages:read");if(o)return t.status(o.code).json({error:o.msg});if(!i)return t.status(403).json({error:"Insufficient permissions"});const[a,n]=await e({template:r.query.template});if(a)return t.status(a.code).json({error:a.msg});t.json(n)};
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\email-templates\file\GET.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\kempo\\api\\email-templates\\file\\GET.js","names":["currentUserHasPermission","readEmailTemplate","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","template","query"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport readEmailTemplate from '../../../../../server/utils/email/readEmailTemplate.js';\n\n/* One email template: what the site sends now, and the packaged version it can go back to. `?template=owner/name`. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:pages:read');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst [error, template] = await readEmailTemplate({ template: request.query.template });\n\tif(error) return response.status(error.code).json({ error: error.msg });\n\n\tresponse.json(template);\n};\n"],"mappings":"OAAOA,MAA8B,6EAC9BC,MAAuB,wEAGfC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,qBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAOA,EAAOE,SAAkBb,EAAkB,CAAEa,SAAUX,EAAQY,MAAMD,WAC5E,GAAGF,EAAO,OAAOR,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAEjET,EAASO,KAAKG","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../server/utils/email/saveEmailTemplate.js";export default async(r,t)=>{const[o,i]=await s(r.cookies.session_token,"system:pages:update");if(o)return t.status(o.code).json({error:o.msg});if(!i)return t.status(403).json({error:"Insufficient permissions"});const[a,n]=await e({template:r.body?.template,source:r.body?.source});if(a)return t.status(a.code).json({error:a.msg});t.json(n)};
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\email-templates\file\PUT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\kempo\\api\\email-templates\\file\\PUT.js","names":["currentUserHasPermission","saveEmailTemplate","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","saved","template","body","source"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport saveEmailTemplate from '../../../../../server/utils/email/saveEmailTemplate.js';\n\n/* Saves the site's version of an email template. Body: `{ template, source }`. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:pages:update');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst [error, saved] = await saveEmailTemplate({ template: request.body?.template, source: request.body?.source });\n\tif(error) return response.status(error.code).json({ error: error.msg });\n\n\tresponse.json(saved);\n};\n"],"mappings":"OAAOA,MAA8B,6EAC9BC,MAAuB,wEAGfC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,uBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAOA,EAAOE,SAAeb,EAAkB,CAAEc,SAAUZ,EAAQa,MAAMD,SAAUE,OAAQd,EAAQa,MAAMC,SACzG,GAAGL,EAAO,OAAOR,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAEjET,EAASO,KAAKG","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../server/utils/email/renderEmailTemplate.js";export default async(r,t)=>{const[o,i]=await s(r.cookies.session_token,"system:pages:read");if(o)return t.status(o.code).json({error:o.msg});if(!i)return t.status(403).json({error:"Insufficient permissions"});const[a,n]=await e({template:r.query.template,data:{}});if(a)return t.status(a.code).json({error:a.msg});t.type("html").send(n)};
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\email-templates\preview\GET.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\kempo\\api\\email-templates\\preview\\GET.js","names":["currentUserHasPermission","renderEmailTemplate","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","page","template","query","data","type","send"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport renderEmailTemplate from '../../../../../server/utils/email/renderEmailTemplate.js';\n\n/*\n An email template drawn with no data, to open in a tab: what the site would send, with the parts that need data left blank. An\n extension that can do better (real or sample data) serves its own preview and gives it to <k-email-templates> as `preview-url`.\n*/\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:pages:read');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst [error, page] = await renderEmailTemplate({ template: request.query.template, data: {} });\n\tif(error) return response.status(error.code).json({ error: error.msg });\n\n\tresponse.type('html').send(page);\n};\n"],"mappings":"OAAOA,MAA8B,6EAC9BC,MAAyB,0EAMjBC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,qBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAOA,EAAOE,SAAcb,EAAoB,CAAEc,SAAUZ,EAAQa,MAAMD,SAAUE,KAAM,CAAC,IAC3F,GAAGL,EAAO,OAAOR,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAEjET,EAASc,KAAK,QAAQC,KAAKL","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import s from"../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../server/utils/email/listEmails.js";export default async(r,t)=>{const[i,o]=await s(r.cookies.session_token,"system:emails:read");if(i)return t.status(i.code).json({error:i.msg});if(!o)return t.status(403).json({error:"Insufficient permissions"});const{status:a,type:n,search:m,limit:u,offset:f}=r.query,[c,l]=await e({status:a,type:n,search:m,limit:u,offset:f});if(c)return t.status(c.code).json({error:c.msg});t.json(l)};
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\emails\GET.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\kempo\\api\\emails\\GET.js","names":["currentUserHasPermission","listEmails","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","type","search","limit","offset","query","data"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\nimport listEmails from '../../../../server/utils/email/listEmails.js';\n\n/* The log of emails, newest first, without their bodies. `?status=`, `?type=`, `?search=`, `?limit=`, `?offset=`. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:emails:read');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst { status, type, search, limit, offset } = request.query;\n\tconst [error, data] = await listEmails({ status, type, search, limit, offset });\n\tif(error) return response.status(error.code).json({ error: error.msg });\n\n\tresponse.json(data);\n};\n"],"mappings":"OAAOA,MAA8B,0EAC9BC,MAAgB,8DAGRC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,sBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAMH,OAAEA,EAAMK,KAAEA,EAAIC,OAAEA,EAAMC,MAAEA,EAAKC,OAAEA,GAAWd,EAAQe,OACjDN,EAAOO,SAAclB,EAAW,CAAEQ,SAAQK,OAAMC,SAAQC,QAAOC,WACtE,GAAGL,EAAO,OAAOR,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAEjET,EAASO,KAAKQ","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import r from"../../../../../server/utils/email/getEmail.js";export default async(e,t)=>{const[i,o]=await s(e.cookies.session_token,"system:emails:read");if(i)return t.status(i.code).json({error:i.msg});if(!o)return t.status(403).json({error:"Insufficient permissions"});const[n,a]=await r(e.params.id);if(n)return t.status(n.code).json({error:n.msg});t.json(a)};
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\emails\[id]\GET.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\kempo\\api\\emails\\[id]\\GET.js","names":["currentUserHasPermission","getEmail","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","found","params","id"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport getEmail from '../../../../../server/utils/email/getEmail.js';\n\n/* One email with its whole body. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:emails:read');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst [error, found] = await getEmail(request.params.id);\n\tif(error) return response.status(error.code).json({ error: error.msg });\n\n\tresponse.json(found);\n};\n"],"mappings":"OAAOA,MAA8B,6EAC9BC,MAAc,+DAGNC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,sBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAOA,EAAOE,SAAeb,EAASE,EAAQY,OAAOC,IACrD,GAAGJ,EAAO,OAAOR,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAEjET,EAASO,KAAKG","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import s from"../../../../../../server/utils/permissions/currentUserHasPermission.js";import r from"../../../../../../server/utils/email/retryEmail.js";export default async(e,o)=>{const[t,i]=await s(e.cookies.session_token,"system:emails:manage");if(t)return o.status(t.code).json({error:t.msg});if(!i)return o.status(403).json({error:"Insufficient permissions"});const[n,a]=await r(e.params.id);if(n)return 502===n.code||503===n.code?o.json({sent:!1,error:n.msg}):o.status(n.code).json({error:n.msg});o.json({sent:!0,...a})};
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\emails\[id]\retry\POST.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\kempo\\api\\emails\\[id]\\retry\\POST.js","names":["currentUserHasPermission","retryEmail","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","result","params","id","sent"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport retryEmail from '../../../../../../server/utils/email/retryEmail.js';\n\n/* Tries an email that is waiting or failed again. Answers with how that try went. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:emails:manage');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst [error, result] = await retryEmail(request.params.id);\n\tif(error) return error.code === 502 || error.code === 503 ? response.json({ sent: false, error: error.msg }) : response.status(error.code).json({ error: error.msg });\n\n\tresponse.json({ sent: true, ...result });\n};\n"],"mappings":"OAAOA,MAA8B,gFAC9BC,MAAgB,oEAGRC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,wBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAOA,EAAOE,SAAgBb,EAAWE,EAAQY,OAAOC,IACxD,GAAGJ,EAAO,OAAsB,MAAfA,EAAMF,MAA+B,MAAfE,EAAMF,KAAeN,EAASO,KAAK,CAAEM,MAAM,EAAOL,MAAOA,EAAMC,MAAST,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAE/JT,EAASO,KAAK,CAAEM,MAAM,KAASH","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../server/utils/email/sendEmail.js";import t from"../../../../../server/utils/email/isValidSender.js";export default async(r,i)=>{const[o,n]=await s(r.cookies.session_token,"system:emails:manage");if(o)return i.status(o.code).json({error:o.msg});if(!n)return i.status(403).json({error:"Insufficient permissions"});const a=String(r.body?.to??"").trim();if(!t(a)||a.includes("<"))return i.status(400).json({error:"Enter an email address to send the test to"});const[m,l]=await e({to:a,subject:"A test email from Kempo",html:"<p>This is a test email. If you can read it, sending email works.</p>",template:"test"});if(m)return i.json({sent:!1,error:m.msg,emailId:m.emailId});i.json({sent:!0,...l})};
2
+ //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\emails\test\POST.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src\\kempo\\api\\emails\\test\\POST.js","names":["currentUserHasPermission","sendEmail","isValidSender","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","to","String","body","trim","includes","result","subject","html","template","sent","emailId"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport sendEmail from '../../../../../server/utils/email/sendEmail.js';\nimport isValidSender from '../../../../../server/utils/email/isValidSender.js';\n\n/* Sends a short test email to an address, through whichever email extension is installed. Body: `{ to }`. Answers with how it went. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:emails:manage');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst to = String(request.body?.to ?? '').trim();\n\tif(!isValidSender(to) || to.includes('<')) return response.status(400).json({ error: 'Enter an email address to send the test to' });\n\n\tconst [error, result] = await sendEmail({\n\t\tto,\n\t\tsubject: 'A test email from Kempo',\n\t\thtml: '<p>This is a test email. If you can read it, sending email works.</p>',\n\t\ttemplate: 'test',\n\t});\n\tif(error) return response.json({ sent: false, error: error.msg, emailId: error.emailId });\n\n\tresponse.json({ sent: true, ...result });\n};\n"],"mappings":"OAAOA,MAA8B,6EAC9BC,MAAe,wDACfC,MAAmB,oEAGXC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBP,EAAyBI,EAAQI,QAAQC,cAAe,wBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAME,EAAKC,OAAOZ,EAAQa,MAAMF,IAAM,IAAIG,OAC1C,IAAIhB,EAAca,IAAOA,EAAGI,SAAS,KAAM,OAAOd,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,+CAErF,MAAOA,EAAOO,SAAgBnB,EAAU,CACvCc,KACAM,QAAS,0BACTC,KAAM,wEACNC,SAAU,SAEX,GAAGV,EAAO,OAAOR,EAASO,KAAK,CAAEY,MAAM,EAAOX,MAAOA,EAAMC,IAAKW,QAASZ,EAAMY,UAE/EpB,EAASO,KAAK,CAAEY,MAAM,KAASJ","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import s from"../../../../../../server/utils/auth/getSession.js";import t from"../../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../../server/utils/settings/setSetting.js";import r from"../../../../../../server/utils/settings/getSettingWithMetadata.js";export default async(o,n)=>{const i=o.cookies.session_token,[a,u]=await s({token:i});if(a||!u)return n.status(401).json({error:"Unauthorized"});const{owner:m,name:c}=o.params;if("system"===m){const[s,e]=await t(i,"system:settings:update");if(s||!e)return n.status(403).json({error:"Forbidden: Cannot modify system settings"})}else if("custom"===m){const[s,e]=await t(i,"system:custom-settings:manage");if(s||!e)return n.status(403).json({error:"Forbidden: Cannot manage custom settings"})}else{const[s,e]=await t(i,"system:extension:configure");if(s||!e)return n.status(403).json({error:"Forbidden: Cannot modify extension settings"})}const{value:d,type:f,isPublic:g,description:j}=o.body;if(void 0===d)return n.status(400).json({error:"Value is required"});if("custom"!==m){const[s,t]=await r(m,c);if(s)return n.status(s.code).json({error:s.msg});const[o,i]=await e(m,c,d,t.type,t.isPublic,t.description);return o?n.status(o.code).json({error:o.msg}):n.json(i)}const[p,l]=await e(m,c,d,f,g,j);if(p)return n.status(p.code).json({error:p.msg});n.json(l)};
1
+ import s from"../../../../../../server/utils/auth/getSession.js";import t from"../../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../../server/utils/settings/setSetting.js";import r from"../../../../../../server/utils/settings/getSettingWithMetadata.js";export default async(o,n)=>{const i=o.cookies.session_token,[a,u]=await s({token:i});if(a||!u)return n.status(401).json({error:"Unauthorized"});const{owner:m,name:c}=o.params;if("system"===m){const[s,e]=await t(i,"system:settings:update");if(s||!e)return n.status(403).json({error:"Forbidden: Cannot modify system settings"})}else if("custom"===m){const[s,e]=await t(i,"system:custom-settings:manage");if(s||!e)return n.status(403).json({error:"Forbidden: Cannot manage custom settings"})}else{const[s,e]=await t(i,"system:extensions:manage");if(s||!e)return n.status(403).json({error:"Forbidden: Cannot modify extension settings"})}const{value:d,type:f,isPublic:g,description:j}=o.body;if(void 0===d)return n.status(400).json({error:"Value is required"});if("custom"!==m){const[s,t]=await r(m,c);if(s)return n.status(s.code).json({error:s.msg});const[o,i]=await e(m,c,d,t.type,t.isPublic,t.description);return o?n.status(o.code).json({error:o.msg}):n.json(i)}const[p,l]=await e(m,c,d,f,g,j);if(p)return n.status(p.code).json({error:p.msg});n.json(l)};
2
2
  //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\settings\[owner]\[name]\POST.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src\\kempo\\api\\settings\\[owner]\\[name]\\POST.js","names":["getSession","currentUserHasPermission","setSetting","getSettingWithMetadata","async","request","response","sessionToken","cookies","session_token","sessionError","session","token","status","json","error","owner","name","params","permError","hasPermission","value","type","isPublic","description","body","undefined","existingError","existing","code","msg","result"],"sources":["0"],"sourcesContent":["import getSession from '../../../../../../server/utils/auth/getSession.js';\r\nimport currentUserHasPermission from '../../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport setSetting from '../../../../../../server/utils/settings/setSetting.js';\r\nimport getSettingWithMetadata from '../../../../../../server/utils/settings/getSettingWithMetadata.js';\r\n\r\nexport default async (request, response) => {\r\n const sessionToken = request.cookies.session_token;\r\n const [sessionError, session] = await getSession({ token: sessionToken });\r\n if(sessionError || !session){\r\n return response.status(401).json({ error: 'Unauthorized' });\r\n }\r\n\r\n const { owner, name } = request.params;\r\n\r\n if(owner === 'system'){\r\n const [permError, hasPermission] = await currentUserHasPermission(sessionToken, 'system:settings:update');\r\n if(permError || !hasPermission){\r\n return response.status(403).json({ error: 'Forbidden: Cannot modify system settings' });\r\n }\r\n } else if(owner === 'custom'){\r\n const [permError, hasPermission] = await currentUserHasPermission(sessionToken, 'system:custom-settings:manage');\r\n if(permError || !hasPermission){\r\n return response.status(403).json({ error: 'Forbidden: Cannot manage custom settings' });\r\n }\r\n } else {\r\n const [permError, hasPermission] = await currentUserHasPermission(sessionToken, 'system:extension:configure');\r\n if(permError || !hasPermission){\r\n return response.status(403).json({ error: 'Forbidden: Cannot modify extension settings' });\r\n }\r\n }\r\n\r\n const { value, type, isPublic, description } = request.body;\r\n\r\n if(value === undefined){\r\n return response.status(400).json({ error: 'Value is required' });\r\n }\r\n\r\n /*\r\n System and extension settings: only value can change, metadata is preserved\r\n */\r\n\r\n if(owner !== 'custom'){\r\n const [existingError, existing] = await getSettingWithMetadata(owner, name);\r\n if(existingError){\r\n return response.status(existingError.code).json({ error: existingError.msg });\r\n }\r\n const [error, result] = await setSetting(owner, name, value, existing.type, existing.isPublic, existing.description);\r\n if(error){\r\n return response.status(error.code).json({ error: error.msg });\r\n }\r\n return response.json(result);\r\n }\r\n\r\n const [error, result] = await setSetting(owner, name, value, type, isPublic, description);\r\n\r\n if(error){\r\n return response.status(error.code).json({ error: error.msg });\r\n }\r\n\r\n response.json(result);\r\n};\r\n"],"mappings":"OAAOA,MAAgB,2DAChBC,MAA8B,gFAC9BC,MAAgB,+DAChBC,MAA4B,mFAEpBC,MAAOC,EAASC,KAC7B,MAAMC,EAAeF,EAAQG,QAAQC,eAC9BC,EAAcC,SAAiBX,EAAW,CAAEY,MAAOL,IAC1D,GAAGG,IAAiBC,EAClB,OAAOL,EAASO,OAAO,KAAKC,KAAK,CAAEC,MAAO,iBAG5C,MAAMC,MAAEA,EAAKC,KAAEA,GAASZ,EAAQa,OAEhC,GAAa,WAAVF,EAAmB,CACpB,MAAOG,EAAWC,SAAuBnB,EAAyBM,EAAc,0BAChF,GAAGY,IAAcC,EACf,OAAOd,EAASO,OAAO,KAAKC,KAAK,CAAEC,MAAO,4CAE9C,MAAO,GAAa,WAAVC,EAAmB,CAC3B,MAAOG,EAAWC,SAAuBnB,EAAyBM,EAAc,iCAChF,GAAGY,IAAcC,EACf,OAAOd,EAASO,OAAO,KAAKC,KAAK,CAAEC,MAAO,4CAE9C,KAAO,CACL,MAAOI,EAAWC,SAAuBnB,EAAyBM,EAAc,8BAChF,GAAGY,IAAcC,EACf,OAAOd,EAASO,OAAO,KAAKC,KAAK,CAAEC,MAAO,+CAE9C,CAEA,MAAMM,MAAEA,EAAKC,KAAEA,EAAIC,SAAEA,EAAQC,YAAEA,GAAgBnB,EAAQoB,KAEvD,QAAaC,IAAVL,EACD,OAAOf,EAASO,OAAO,KAAKC,KAAK,CAAEC,MAAO,sBAO5C,GAAa,WAAVC,EAAmB,CACpB,MAAOW,EAAeC,SAAkBzB,EAAuBa,EAAOC,GACtE,GAAGU,EACD,OAAOrB,EAASO,OAAOc,EAAcE,MAAMf,KAAK,CAAEC,MAAOY,EAAcG,MAEzE,MAAOf,EAAOgB,SAAgB7B,EAAWc,EAAOC,EAAMI,EAAOO,EAASN,KAAMM,EAASL,SAAUK,EAASJ,aACxG,OAAGT,EACMT,EAASO,OAAOE,EAAMc,MAAMf,KAAK,CAAEC,MAAOA,EAAMe,MAElDxB,EAASQ,KAAKiB,EACvB,CAEA,MAAOhB,EAAOgB,SAAgB7B,EAAWc,EAAOC,EAAMI,EAAOC,EAAMC,EAAUC,GAE7E,GAAGT,EACD,OAAOT,EAASO,OAAOE,EAAMc,MAAMf,KAAK,CAAEC,MAAOA,EAAMe,MAGzDxB,EAASQ,KAAKiB","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\settings\\[owner]\\[name]\\POST.js","names":["getSession","currentUserHasPermission","setSetting","getSettingWithMetadata","async","request","response","sessionToken","cookies","session_token","sessionError","session","token","status","json","error","owner","name","params","permError","hasPermission","value","type","isPublic","description","body","undefined","existingError","existing","code","msg","result"],"sources":["0"],"sourcesContent":["import getSession from '../../../../../../server/utils/auth/getSession.js';\nimport currentUserHasPermission from '../../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport setSetting from '../../../../../../server/utils/settings/setSetting.js';\nimport getSettingWithMetadata from '../../../../../../server/utils/settings/getSettingWithMetadata.js';\n\nexport default async (request, response) => {\n const sessionToken = request.cookies.session_token;\n const [sessionError, session] = await getSession({ token: sessionToken });\n if(sessionError || !session){\n return response.status(401).json({ error: 'Unauthorized' });\n }\n\n const { owner, name } = request.params;\n\n if(owner === 'system'){\n const [permError, hasPermission] = await currentUserHasPermission(sessionToken, 'system:settings:update');\n if(permError || !hasPermission){\n return response.status(403).json({ error: 'Forbidden: Cannot modify system settings' });\n }\n } else if(owner === 'custom'){\n const [permError, hasPermission] = await currentUserHasPermission(sessionToken, 'system:custom-settings:manage');\n if(permError || !hasPermission){\n return response.status(403).json({ error: 'Forbidden: Cannot manage custom settings' });\n }\n } else {\n const [permError, hasPermission] = await currentUserHasPermission(sessionToken, 'system:extensions:manage');\n if(permError || !hasPermission){\n return response.status(403).json({ error: 'Forbidden: Cannot modify extension settings' });\n }\n }\n\n const { value, type, isPublic, description } = request.body;\n\n if(value === undefined){\n return response.status(400).json({ error: 'Value is required' });\n }\n\n /*\n System and extension settings: only value can change, metadata is preserved\n */\n\n if(owner !== 'custom'){\n const [existingError, existing] = await getSettingWithMetadata(owner, name);\n if(existingError){\n return response.status(existingError.code).json({ error: existingError.msg });\n }\n const [error, result] = await setSetting(owner, name, value, existing.type, existing.isPublic, existing.description);\n if(error){\n return response.status(error.code).json({ error: error.msg });\n }\n return response.json(result);\n }\n\n const [error, result] = await setSetting(owner, name, value, type, isPublic, description);\n\n if(error){\n return response.status(error.code).json({ error: error.msg });\n }\n\n response.json(result);\n};\n"],"mappings":"OAAOA,MAAgB,2DAChBC,MAA8B,gFAC9BC,MAAgB,+DAChBC,MAA4B,mFAEpBC,MAAOC,EAASC,KAC7B,MAAMC,EAAeF,EAAQG,QAAQC,eAC9BC,EAAcC,SAAiBX,EAAW,CAAEY,MAAOL,IAC1D,GAAGG,IAAiBC,EAClB,OAAOL,EAASO,OAAO,KAAKC,KAAK,CAAEC,MAAO,iBAG5C,MAAMC,MAAEA,EAAKC,KAAEA,GAASZ,EAAQa,OAEhC,GAAa,WAAVF,EAAmB,CACpB,MAAOG,EAAWC,SAAuBnB,EAAyBM,EAAc,0BAChF,GAAGY,IAAcC,EACf,OAAOd,EAASO,OAAO,KAAKC,KAAK,CAAEC,MAAO,4CAE9C,MAAO,GAAa,WAAVC,EAAmB,CAC3B,MAAOG,EAAWC,SAAuBnB,EAAyBM,EAAc,iCAChF,GAAGY,IAAcC,EACf,OAAOd,EAASO,OAAO,KAAKC,KAAK,CAAEC,MAAO,4CAE9C,KAAO,CACL,MAAOI,EAAWC,SAAuBnB,EAAyBM,EAAc,4BAChF,GAAGY,IAAcC,EACf,OAAOd,EAASO,OAAO,KAAKC,KAAK,CAAEC,MAAO,+CAE9C,CAEA,MAAMM,MAAEA,EAAKC,KAAEA,EAAIC,SAAEA,EAAQC,YAAEA,GAAgBnB,EAAQoB,KAEvD,QAAaC,IAAVL,EACD,OAAOf,EAASO,OAAO,KAAKC,KAAK,CAAEC,MAAO,sBAO5C,GAAa,WAAVC,EAAmB,CACpB,MAAOW,EAAeC,SAAkBzB,EAAuBa,EAAOC,GACtE,GAAGU,EACD,OAAOrB,EAASO,OAAOc,EAAcE,MAAMf,KAAK,CAAEC,MAAOY,EAAcG,MAEzE,MAAOf,EAAOgB,SAAgB7B,EAAWc,EAAOC,EAAMI,EAAOO,EAASN,KAAMM,EAASL,SAAUK,EAASJ,aACxG,OAAGT,EACMT,EAASO,OAAOE,EAAMc,MAAMf,KAAK,CAAEC,MAAOA,EAAMe,MAElDxB,EAASQ,KAAKiB,EACvB,CAEA,MAAOhB,EAAOgB,SAAgB7B,EAAWc,EAAOC,EAAMI,EAAOC,EAAMC,EAAUC,GAE7E,GAAGT,EACD,OAAOT,EAASO,OAAOE,EAAMc,MAAMf,KAAK,CAAEC,MAAOA,EAAMe,MAGzDxB,EAASQ,KAAKiB","ignoreList":[]}
package/dist/kempo/sdk.js CHANGED
@@ -1,2 +1,2 @@
1
- import{get as e,post as s,put as n,patch as o,del as t}from"./fetch.js";const a="/kempo/api";export const register=async({email:e,password:n,name:o})=>s(`${a}/auth/register/email`,{email:e,password:n,name:o});export const login=async({email:e,password:n})=>s(`${a}/auth/login/email`,{email:e,password:n});export const logout=async()=>s(`${a}/auth/logout`,{});export const getSession=async()=>e(`${a}/auth/session`);export const forgotPassword=async({email:e})=>s(`${a}/forgot-password`,{email:e});export const resetPassword=async({token:e,password:n,logoutAll:o=!1})=>s(`${a}/auth/reset-password`,{token:e,newPassword:n,logoutAll:o});export const changePassword=async({currentPassword:e,newPassword:n,logoutAll:o})=>s(`${a}/auth/change-password`,{currentPassword:e,newPassword:n,logoutAll:o});export const verifyEmail=async({token:e})=>s(`${a}/auth/verify-email`,{token:e});export const currentUserHasPermission=async({permission:s})=>e(`${a}/user/current/permissions`,{permission:s});export const currentUserHasAllPermissions=async({permissions:s})=>e(`${a}/user/current/permissions/all`,{permissions:s});export const currentUserHasSomePermissions=async({permissions:s})=>e(`${a}/user/current/permissions/some`,{permissions:s});export const getAllCurrentUserPermissions=async()=>e(`${a}/user/current/permissions/list`);export const userHasPermission=async({userid:s,permission:n})=>e(`${a}/user/${s}/permissions`,{permission:n});export const userHasAllPermissions=async({userid:s,permissions:n})=>e(`${a}/user/${s}/permissions/all`,{permissions:n});export const userHasSomePermissions=async({userid:s,permissions:n})=>e(`${a}/user/${s}/permissions/some`,{permissions:n});export const getAllUserPermissions=async({userid:s})=>e(`${a}/user/${s}/permissions/list`);export const getUsers=async({limit:s,offset:n}={})=>e(`${a}/user`,{limit:s,offset:n});export const searchUsers=async({q:s,limit:n,offset:o,inGroup:t,notInGroup:i}={})=>e(`${a}/user/search`,{q:s,limit:n,offset:o,inGroup:t,notInGroup:i});export const createUser=async({name:e,email:n,password:o,emailVerified:t})=>s(`${a}/user/create`,{name:e,email:n,password:o,emailVerified:t});export const deleteUsers=async e=>t(`${a}/user`,{ids:e});export const updateUser=async({id:e,name:s,email:n,emailVerified:t,createdAt:i})=>o(`${a}/user`,{id:e,name:s,email:n,emailVerified:t,createdAt:i});export const getUser=async s=>e(`${a}/user/${s}`);export const getUserSessions=async(s,{limit:n,offset:o}={})=>e(`${a}/user/${s}/sessions`,{limit:n,offset:o});export const deleteUserSession=async(e,s)=>t(`${a}/user/${e}/sessions`,{sessionToken:s});export const deleteExpiredUserSessions=async e=>t(`${a}/user/${e}/sessions/expired`);export const getUserGroups=async(s,{limit:n,offset:o}={})=>e(`${a}/user/${s}/groups`,{limit:n,offset:o});export const addUserToGroup=async(e,n)=>s(`${a}/user/${e}/groups`,{groupName:n});export const removeUserFromGroup=async(e,s)=>t(`${a}/user/${e}/groups`,{groupName:s});export const listGroups=async({limit:s,offset:n,owner:o}={})=>e(`${a}/groups`,{limit:s,offset:n,owner:o});export const createGroup=async({name:e,description:n})=>s(`${a}/groups`,{name:e,description:n});export const updateGroup=async({name:e,newName:s,description:n})=>o(`${a}/groups`,{name:e,newName:s,description:n});export const deleteGroups=async e=>t(`${a}/groups`,{names:e});export const getGroup=async s=>e(`${a}/groups/${encodeURIComponent(s)}`);export const getGroupMembers=async(s,{limit:n,offset:o}={})=>e(`${a}/groups/${encodeURIComponent(s)}/members`,{limit:n,offset:o});export const addMemberToGroup=async(e,n)=>s(`${a}/groups/${encodeURIComponent(e)}/members`,{userId:n});export const removeMemberFromGroup=async(e,s)=>t(`${a}/groups/${encodeURIComponent(e)}/members`,{userId:s});export const getGroupPermissions=async s=>e(`${a}/groups/${encodeURIComponent(s)}/permissions`);export const addPermissionToGroup=async(e,n)=>s(`${a}/groups/${encodeURIComponent(e)}/permissions`,{permissionName:n});export const removePermissionFromGroup=async(e,s)=>t(`${a}/groups/${encodeURIComponent(e)}/permissions`,{permissionName:s});export const listPermissions=async({limit:s,offset:n,owner:o}={})=>e(`${a}/permissions`,{limit:s,offset:n,owner:o});export const createPermissions=async e=>s(`${a}/permissions`,{permissions:e});export const updatePermission=async({name:e,description:s})=>o(`${a}/permissions`,{name:e,description:s});export const deletePermissions=async e=>t(`${a}/permissions`,{names:e});export const getSetting=async(s,n)=>e(`${a}/settings/${encodeURIComponent(s)}/${encodeURIComponent(n)}`);export const listSettings=async({owner:s,limit:n,offset:o}={})=>e(`${a}/settings/${encodeURIComponent(s)}`,{limit:n,offset:o});export const setSetting=async(e,n,o)=>s(`${a}/settings/${encodeURIComponent(e)}/${encodeURIComponent(n)}`,o);export const deleteSetting=async(e,s)=>t(`${a}/settings/${encodeURIComponent(e)}/${encodeURIComponent(s)}`);export const listPages=async({owner:s,showHidden:n,offset:o,limit:t}={})=>e(`${a}/pages`,{owner:s,showHidden:n,offset:o,limit:t});export const rescanPages=async()=>s(`${a}/pages/rescan`,{});export const listTemplates=async()=>e(`${a}/templates`);export const listDirectories=async()=>e(`${a}/pages/directories`);export const getPage=async s=>e(`${a}/pages/file`,{file:s});export const createPage=async({directory:e,name:n,template:o})=>s(`${a}/pages`,{directory:e,name:n,template:o});export const updatePage=async({file:e,name:s,title:o,description:t,author:i,template:r,contents:c,extraMetadata:l})=>n(`${a}/pages/file`,{file:e,name:s,title:o,description:t,author:i,template:r,contents:c,extraMetadata:l});export const deletePages=async e=>t(`${a}/pages`,{files:e});export const disablePage=async e=>n(`${a}/pages/disable`,{file:e});export const enablePage=async e=>n(`${a}/pages/enable`,{file:e});export const movePage=async({file:e,newFile:s})=>o(`${a}/pages/file`,{file:e,newFile:s});export const searchPagesByMetadata=async s=>e(`${a}/pages/search`,{query:JSON.stringify(s)});export const setPageLocked=async({file:e,locked:s})=>n(`${a}/pages/lock`,{file:e,locked:s});export const getTemplate=async s=>e(`${a}/templates/file`,{file:s});export const createTemplate=async({directory:e,name:n,copyFrom:o})=>s(`${a}/templates`,{directory:e,name:n,copyFrom:o});export const updateTemplate=async({file:e,name:s,author:o,markup:t})=>n(`${a}/templates/file`,{file:e,name:s,author:o,markup:t});export const deleteTemplates=async e=>t(`${a}/templates`,{files:e});export const disableTemplate=async e=>n(`${a}/templates/disable`,{file:e});export const enableTemplate=async e=>n(`${a}/templates/enable`,{file:e});export const moveTemplate=async({file:e,newFile:s})=>o(`${a}/templates/file`,{file:e,newFile:s});export const setTemplateLocked=async({file:e,locked:s})=>n(`${a}/templates/lock`,{file:e,locked:s});export const listFragments=async()=>e(`${a}/fragments`);export const getFragment=async s=>e(`${a}/fragments/file`,{file:s});export const createFragment=async({directory:e,name:n})=>s(`${a}/fragments`,{directory:e,name:n});export const updateFragment=async({file:e,author:s,markup:o})=>n(`${a}/fragments/file`,{file:e,author:s,markup:o});export const deleteFragments=async e=>t(`${a}/fragments`,{files:e});export const moveFragment=async({file:e,newFile:s})=>o(`${a}/fragments/file`,{file:e,newFile:s});export const disableFragment=async e=>n(`${a}/fragments/disable`,{file:e});export const enableFragment=async e=>n(`${a}/fragments/enable`,{file:e});export const setFragmentLocked=async({file:e,locked:s})=>n(`${a}/fragments/lock`,{file:e,locked:s});export const listGlobalContent=async()=>e(`${a}/globals`);export const getGlobalContent=async s=>e(`${a}/globals/entry`,{id:s});export const createGlobalContent=async({name:e,location:n,priority:o})=>s(`${a}/globals`,{name:e,location:n,priority:o});export const updateGlobalContent=async({id:e,name:s,location:o,priority:t,markup:i})=>n(`${a}/globals/entry`,{id:e,name:s,location:o,priority:t,markup:i});export const deleteGlobalContent=async e=>t(`${a}/globals`,{ids:e});export const disableGlobalContent=async e=>n(`${a}/globals/disable`,{id:e});export const enableGlobalContent=async e=>n(`${a}/globals/enable`,{id:e});export const setGlobalContentLocked=async({id:e,locked:s})=>n(`${a}/globals/lock`,{id:e,locked:s});export const listMenus=async()=>e(`${a}/menus`);export const saveMenu=async({id:e,name:n})=>s(`${a}/menus`,{id:e,name:n});export const deleteMenu=async e=>t(`${a}/menus`,{id:e});export const assignMenuLocation=async({location:e,menuId:s})=>n(`${a}/menus/location`,{location:e,menuId:s});export const saveMenuItem=async({id:e,menuId:n,location:o,navItem:t,label:i,href:r,icon:c,newTab:l})=>s(`${a}/menus/items`,{id:e,menuId:n,location:o,navItem:t,label:i,href:r,icon:c,newTab:l});export const deleteMenuItems=async e=>t(`${a}/menus/items`,{ids:e});export const setMenuItemEnabled=async({id:e,enabled:s})=>n(`${a}/menus/items/enabled`,{id:e,enabled:s});export const reorderMenuItems=async({menuId:e,ids:s})=>n(`${a}/menus/items/order`,{menuId:e,ids:s});export const adoptMenuItem=async({id:e,menuId:s,menuName:o})=>n(`${a}/menus/adopt`,{id:e,menuId:s,menuName:o});export const listExtensions=async({limit:s,offset:n}={})=>e(`${a}/extensions`,{limit:s,offset:n});export const listAvailableExtensions=async()=>e(`${a}/extensions/available`);export const listKnownExtensions=async({search:s,sort:n,limit:o,offset:t}={})=>e(`${a}/extensions/known`,{search:s,sort:n,limit:o,offset:t});export const getKnownExtension=async s=>e(`${a}/extensions/known`,{name:s});export const rateExtension=async(e,s)=>n(`${a}/extensions/rating`,{name:e,rating:s});export const getDashboardWidgets=async()=>e(`${a}/dashboard/widgets`);export const getNotifications=async({unreadOnly:s=!1,limit:n,offset:o}={})=>e(`${a}/notifications`,{unreadOnly:s,limit:n,offset:o});export const getUnreadNotificationCount=async()=>e(`${a}/notifications/count`);export const markNotificationRead=async e=>s(`${a}/notifications/${encodeURIComponent(e)}/read`,{});export const markNotificationHandled=async e=>s(`${a}/notifications/${encodeURIComponent(e)}/handled`,{});export const markAllNotificationsRead=async()=>s(`${a}/notifications/read-all`,{});export const dismissNotification=async e=>t(`${a}/notifications/${encodeURIComponent(e)}`);export const listRealtimeConnections=async()=>e(`${a}/realtime/connections`);export const installExtension=async(e,{withDependencies:n=!1}={})=>s(`${a}/extensions`,{name:e,withDependencies:n});export const uninstallExtension=async(e,s=!1,{cascade:n=!1}={})=>t(`${a}/extensions`,{name:e,purgeData:s,cascade:n});export const enableExtension=async(e,{cascade:n=!1}={})=>s(`${a}/extensions/${encodeURIComponent(e)}/enable`,{cascade:n});export const getExtensionRequirements=async s=>e(`${a}/extensions/${encodeURIComponent(s)}/requirements`);export const disableExtension=async(e,{cascade:n=!1}={})=>s(`${a}/extensions/${encodeURIComponent(e)}/disable`,{cascade:n});export const getExtensionDependents=async(s,{includeDisabled:n=!1}={})=>e(`${a}/extensions/${encodeURIComponent(s)}/dependents`,{includeDisabled:n?"true":void 0});export const listAdminGlobalContent=async()=>e(`${a}/admin-globals`);export const getAdminGlobalContent=async s=>e(`${a}/admin-globals/${encodeURIComponent(s)}`);export const createAdminGlobalContent=async({name:e,location:n,priority:o,owner:t,markup:i})=>s(`${a}/admin-globals`,{name:e,location:n,priority:o,owner:t,markup:i});export const updateAdminGlobalContent=async(e,{name:s,location:o,priority:t,markup:i})=>n(`${a}/admin-globals/${encodeURIComponent(e)}`,{name:s,location:o,priority:t,markup:i});export const deleteAdminGlobalContent=async e=>t(`${a}/admin-globals`,{ids:e});export const enableAdminGlobalContent=async e=>n(`${a}/admin-globals/${encodeURIComponent(e)}/enable`,{});export const disableAdminGlobalContent=async e=>n(`${a}/admin-globals/${encodeURIComponent(e)}/disable`,{});
1
+ import{get as e,post as s,put as n,patch as t,del as o}from"./fetch.js";const a="/kempo/api";export const register=async({email:e,password:n,name:t})=>s(`${a}/auth/register/email`,{email:e,password:n,name:t});export const login=async({email:e,password:n})=>s(`${a}/auth/login/email`,{email:e,password:n});export const logout=async()=>s(`${a}/auth/logout`,{});export const getSession=async()=>e(`${a}/auth/session`);export const forgotPassword=async({email:e})=>s(`${a}/forgot-password`,{email:e});export const resetPassword=async({token:e,password:n,logoutAll:t=!1})=>s(`${a}/auth/reset-password`,{token:e,newPassword:n,logoutAll:t});export const changePassword=async({currentPassword:e,newPassword:n,logoutAll:t})=>s(`${a}/auth/change-password`,{currentPassword:e,newPassword:n,logoutAll:t});export const verifyEmail=async({token:e})=>s(`${a}/auth/verify-email`,{token:e});export const currentUserHasPermission=async({permission:s})=>e(`${a}/user/current/permissions`,{permission:s});export const currentUserHasAllPermissions=async({permissions:s})=>e(`${a}/user/current/permissions/all`,{permissions:s});export const currentUserHasSomePermissions=async({permissions:s})=>e(`${a}/user/current/permissions/some`,{permissions:s});export const getAllCurrentUserPermissions=async()=>e(`${a}/user/current/permissions/list`);export const userHasPermission=async({userid:s,permission:n})=>e(`${a}/user/${s}/permissions`,{permission:n});export const userHasAllPermissions=async({userid:s,permissions:n})=>e(`${a}/user/${s}/permissions/all`,{permissions:n});export const userHasSomePermissions=async({userid:s,permissions:n})=>e(`${a}/user/${s}/permissions/some`,{permissions:n});export const getAllUserPermissions=async({userid:s})=>e(`${a}/user/${s}/permissions/list`);export const getUsers=async({limit:s,offset:n}={})=>e(`${a}/user`,{limit:s,offset:n});export const searchUsers=async({q:s,limit:n,offset:t,inGroup:o,notInGroup:i}={})=>e(`${a}/user/search`,{q:s,limit:n,offset:t,inGroup:o,notInGroup:i});export const createUser=async({name:e,email:n,password:t,emailVerified:o})=>s(`${a}/user/create`,{name:e,email:n,password:t,emailVerified:o});export const deleteUsers=async e=>o(`${a}/user`,{ids:e});export const updateUser=async({id:e,name:s,email:n,emailVerified:o,createdAt:i})=>t(`${a}/user`,{id:e,name:s,email:n,emailVerified:o,createdAt:i});export const getUser=async s=>e(`${a}/user/${s}`);export const getUserSessions=async(s,{limit:n,offset:t}={})=>e(`${a}/user/${s}/sessions`,{limit:n,offset:t});export const deleteUserSession=async(e,s)=>o(`${a}/user/${e}/sessions`,{sessionToken:s});export const deleteExpiredUserSessions=async e=>o(`${a}/user/${e}/sessions/expired`);export const getUserGroups=async(s,{limit:n,offset:t}={})=>e(`${a}/user/${s}/groups`,{limit:n,offset:t});export const addUserToGroup=async(e,n)=>s(`${a}/user/${e}/groups`,{groupName:n});export const removeUserFromGroup=async(e,s)=>o(`${a}/user/${e}/groups`,{groupName:s});export const listGroups=async({limit:s,offset:n,owner:t}={})=>e(`${a}/groups`,{limit:s,offset:n,owner:t});export const createGroup=async({name:e,description:n})=>s(`${a}/groups`,{name:e,description:n});export const updateGroup=async({name:e,newName:s,description:n})=>t(`${a}/groups`,{name:e,newName:s,description:n});export const deleteGroups=async e=>o(`${a}/groups`,{names:e});export const getGroup=async s=>e(`${a}/groups/${encodeURIComponent(s)}`);export const getGroupMembers=async(s,{limit:n,offset:t}={})=>e(`${a}/groups/${encodeURIComponent(s)}/members`,{limit:n,offset:t});export const addMemberToGroup=async(e,n)=>s(`${a}/groups/${encodeURIComponent(e)}/members`,{userId:n});export const removeMemberFromGroup=async(e,s)=>o(`${a}/groups/${encodeURIComponent(e)}/members`,{userId:s});export const getGroupPermissions=async s=>e(`${a}/groups/${encodeURIComponent(s)}/permissions`);export const addPermissionToGroup=async(e,n)=>s(`${a}/groups/${encodeURIComponent(e)}/permissions`,{permissionName:n});export const removePermissionFromGroup=async(e,s)=>o(`${a}/groups/${encodeURIComponent(e)}/permissions`,{permissionName:s});export const listPermissions=async({limit:s,offset:n,owner:t}={})=>e(`${a}/permissions`,{limit:s,offset:n,owner:t});export const createPermissions=async e=>s(`${a}/permissions`,{permissions:e});export const updatePermission=async({name:e,description:s})=>t(`${a}/permissions`,{name:e,description:s});export const deletePermissions=async e=>o(`${a}/permissions`,{names:e});export const getSetting=async(s,n)=>e(`${a}/settings/${encodeURIComponent(s)}/${encodeURIComponent(n)}`);export const listSettings=async({owner:s,limit:n,offset:t}={})=>e(`${a}/settings/${encodeURIComponent(s)}`,{limit:n,offset:t});export const setSetting=async(e,n,t)=>s(`${a}/settings/${encodeURIComponent(e)}/${encodeURIComponent(n)}`,t);export const deleteSetting=async(e,s)=>o(`${a}/settings/${encodeURIComponent(e)}/${encodeURIComponent(s)}`);export const listEmails=async({status:s,type:n,search:t,limit:o,offset:i}={})=>e(`${a}/emails`,{status:s,type:n,search:t,limit:o,offset:i});export const getEmail=async s=>e(`${a}/emails/${encodeURIComponent(s)}`);export const retryEmail=async e=>s(`${a}/emails/${encodeURIComponent(e)}/retry`,{});export const sendTestEmail=async e=>s(`${a}/emails/test`,{to:e});export const listPages=async({owner:s,showHidden:n,offset:t,limit:o}={})=>e(`${a}/pages`,{owner:s,showHidden:n,offset:t,limit:o});export const rescanPages=async()=>s(`${a}/pages/rescan`,{});export const listTemplates=async()=>e(`${a}/templates`);export const listDirectories=async()=>e(`${a}/pages/directories`);export const getPage=async s=>e(`${a}/pages/file`,{file:s});export const createPage=async({directory:e,name:n,template:t})=>s(`${a}/pages`,{directory:e,name:n,template:t});export const updatePage=async({file:e,name:s,title:t,description:o,author:i,template:r,contents:c,extraMetadata:l})=>n(`${a}/pages/file`,{file:e,name:s,title:t,description:o,author:i,template:r,contents:c,extraMetadata:l});export const deletePages=async e=>o(`${a}/pages`,{files:e});export const disablePage=async e=>n(`${a}/pages/disable`,{file:e});export const enablePage=async e=>n(`${a}/pages/enable`,{file:e});export const movePage=async({file:e,newFile:s})=>t(`${a}/pages/file`,{file:e,newFile:s});export const searchPagesByMetadata=async s=>e(`${a}/pages/search`,{query:JSON.stringify(s)});export const setPageLocked=async({file:e,locked:s})=>n(`${a}/pages/lock`,{file:e,locked:s});export const getTemplate=async s=>e(`${a}/templates/file`,{file:s});export const createTemplate=async({directory:e,name:n,copyFrom:t})=>s(`${a}/templates`,{directory:e,name:n,copyFrom:t});export const updateTemplate=async({file:e,name:s,author:t,markup:o})=>n(`${a}/templates/file`,{file:e,name:s,author:t,markup:o});export const deleteTemplates=async e=>o(`${a}/templates`,{files:e});export const listEmailTemplates=async s=>e(`${a}/email-templates`,s?{owner:s}:{});export const getEmailTemplate=async s=>e(`${a}/email-templates/file`,{template:s});export const saveEmailTemplate=async({template:e,source:s})=>n(`${a}/email-templates/file`,{template:e,source:s});export const resetEmailTemplate=async e=>o(`${a}/email-templates/file`,{template:e});export const disableTemplate=async e=>n(`${a}/templates/disable`,{file:e});export const enableTemplate=async e=>n(`${a}/templates/enable`,{file:e});export const moveTemplate=async({file:e,newFile:s})=>t(`${a}/templates/file`,{file:e,newFile:s});export const setTemplateLocked=async({file:e,locked:s})=>n(`${a}/templates/lock`,{file:e,locked:s});export const listFragments=async()=>e(`${a}/fragments`);export const getFragment=async s=>e(`${a}/fragments/file`,{file:s});export const createFragment=async({directory:e,name:n})=>s(`${a}/fragments`,{directory:e,name:n});export const updateFragment=async({file:e,author:s,markup:t})=>n(`${a}/fragments/file`,{file:e,author:s,markup:t});export const deleteFragments=async e=>o(`${a}/fragments`,{files:e});export const moveFragment=async({file:e,newFile:s})=>t(`${a}/fragments/file`,{file:e,newFile:s});export const disableFragment=async e=>n(`${a}/fragments/disable`,{file:e});export const enableFragment=async e=>n(`${a}/fragments/enable`,{file:e});export const setFragmentLocked=async({file:e,locked:s})=>n(`${a}/fragments/lock`,{file:e,locked:s});export const listGlobalContent=async()=>e(`${a}/globals`);export const getGlobalContent=async s=>e(`${a}/globals/entry`,{id:s});export const createGlobalContent=async({name:e,location:n,priority:t})=>s(`${a}/globals`,{name:e,location:n,priority:t});export const updateGlobalContent=async({id:e,name:s,location:t,priority:o,markup:i})=>n(`${a}/globals/entry`,{id:e,name:s,location:t,priority:o,markup:i});export const deleteGlobalContent=async e=>o(`${a}/globals`,{ids:e});export const disableGlobalContent=async e=>n(`${a}/globals/disable`,{id:e});export const enableGlobalContent=async e=>n(`${a}/globals/enable`,{id:e});export const setGlobalContentLocked=async({id:e,locked:s})=>n(`${a}/globals/lock`,{id:e,locked:s});export const listMenus=async()=>e(`${a}/menus`);export const saveMenu=async({id:e,name:n})=>s(`${a}/menus`,{id:e,name:n});export const deleteMenu=async e=>o(`${a}/menus`,{id:e});export const assignMenuLocation=async({location:e,menuId:s})=>n(`${a}/menus/location`,{location:e,menuId:s});export const saveMenuItem=async({id:e,menuId:n,location:t,navItem:o,label:i,href:r,icon:c,newTab:l})=>s(`${a}/menus/items`,{id:e,menuId:n,location:t,navItem:o,label:i,href:r,icon:c,newTab:l});export const deleteMenuItems=async e=>o(`${a}/menus/items`,{ids:e});export const setMenuItemEnabled=async({id:e,enabled:s})=>n(`${a}/menus/items/enabled`,{id:e,enabled:s});export const reorderMenuItems=async({menuId:e,ids:s})=>n(`${a}/menus/items/order`,{menuId:e,ids:s});export const adoptMenuItem=async({id:e,menuId:s,menuName:t})=>n(`${a}/menus/adopt`,{id:e,menuId:s,menuName:t});export const listExtensions=async({limit:s,offset:n}={})=>e(`${a}/extensions`,{limit:s,offset:n});export const listAvailableExtensions=async()=>e(`${a}/extensions/available`);export const listKnownExtensions=async({search:s,sort:n,limit:t,offset:o}={})=>e(`${a}/extensions/known`,{search:s,sort:n,limit:t,offset:o});export const getKnownExtension=async s=>e(`${a}/extensions/known`,{name:s});export const rateExtension=async(e,s)=>n(`${a}/extensions/rating`,{name:e,rating:s});export const getDashboardWidgets=async()=>e(`${a}/dashboard/widgets`);export const getNotifications=async({unreadOnly:s=!1,limit:n,offset:t}={})=>e(`${a}/notifications`,{unreadOnly:s,limit:n,offset:t});export const getUnreadNotificationCount=async()=>e(`${a}/notifications/count`);export const markNotificationRead=async e=>s(`${a}/notifications/${encodeURIComponent(e)}/read`,{});export const markNotificationHandled=async e=>s(`${a}/notifications/${encodeURIComponent(e)}/handled`,{});export const markAllNotificationsRead=async()=>s(`${a}/notifications/read-all`,{});export const dismissNotification=async e=>o(`${a}/notifications/${encodeURIComponent(e)}`);export const listRealtimeConnections=async()=>e(`${a}/realtime/connections`);export const installExtension=async(e,{withDependencies:n=!1}={})=>s(`${a}/extensions`,{name:e,withDependencies:n});export const uninstallExtension=async(e,s=!1,{cascade:n=!1}={})=>o(`${a}/extensions`,{name:e,purgeData:s,cascade:n});export const enableExtension=async(e,{cascade:n=!1}={})=>s(`${a}/extensions/${encodeURIComponent(e)}/enable`,{cascade:n});export const getExtensionRequirements=async s=>e(`${a}/extensions/${encodeURIComponent(s)}/requirements`);export const disableExtension=async(e,{cascade:n=!1}={})=>s(`${a}/extensions/${encodeURIComponent(e)}/disable`,{cascade:n});export const getExtensionDependents=async(s,{includeDisabled:n=!1}={})=>e(`${a}/extensions/${encodeURIComponent(s)}/dependents`,{includeDisabled:n?"true":void 0});export const listAdminGlobalContent=async()=>e(`${a}/admin-globals`);export const getAdminGlobalContent=async s=>e(`${a}/admin-globals/${encodeURIComponent(s)}`);export const createAdminGlobalContent=async({name:e,location:n,priority:t,owner:o,markup:i})=>s(`${a}/admin-globals`,{name:e,location:n,priority:t,owner:o,markup:i});export const updateAdminGlobalContent=async(e,{name:s,location:t,priority:o,markup:i})=>n(`${a}/admin-globals/${encodeURIComponent(e)}`,{name:s,location:t,priority:o,markup:i});export const deleteAdminGlobalContent=async e=>o(`${a}/admin-globals`,{ids:e});export const enableAdminGlobalContent=async e=>n(`${a}/admin-globals/${encodeURIComponent(e)}/enable`,{});export const disableAdminGlobalContent=async e=>n(`${a}/admin-globals/${encodeURIComponent(e)}/disable`,{});
2
2
  //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\sdk.js.map