kempo 4.2.19 → 4.2.20

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 (115) hide show
  1. package/app-public/CATCH.page.html +15 -0
  2. package/app-public/kempo-global.global.html +0 -6
  3. package/dist/admin/accounts/groups/[name]/index.page.html +112 -2
  4. package/dist/admin/accounts/groups/index.page.html +87 -2
  5. package/dist/admin/accounts/permissions/index.page.html +84 -2
  6. package/dist/admin/accounts/users/[id]/index.page.html +117 -3
  7. package/dist/admin/accounts/users/index.page.html +116 -2
  8. package/dist/admin/components/tableControls/InstallExtension.js +2 -2
  9. package/dist/admin/components/tableControls/InstallExtension.js.map +1 -1
  10. package/dist/admin/components/tableControls/UninstallExtension.js +2 -2
  11. package/dist/admin/components/tableControls/UninstallExtension.js.map +1 -1
  12. package/dist/admin/content/fragments/edit/index.page.html +8 -1
  13. package/dist/admin/content/fragments/index.page.html +87 -2
  14. package/dist/admin/content/globals/edit/index.page.html +8 -1
  15. package/dist/admin/content/globals/index.page.html +102 -7
  16. package/dist/admin/content/pages/edit/index.page.html +8 -1
  17. package/dist/admin/content/pages/index.page.html +224 -27
  18. package/dist/admin/content/templates/edit/index.page.html +8 -1
  19. package/dist/admin/content/templates/index.page.html +116 -2
  20. package/dist/admin/default.template.html +20 -1
  21. package/dist/admin/extensions/index.page.html +59 -2
  22. package/dist/admin/icons/extension_add.svg +1 -0
  23. package/dist/admin/icons/extension_remove.svg +1 -0
  24. package/dist/admin/index.page.html +5 -1
  25. package/dist/admin/nav.fragment.html +84 -2
  26. package/dist/admin/settings/[owner]/[name]/index.page.html +110 -4
  27. package/dist/admin/settings/index.page.html +87 -2
  28. package/dist/kempo/api/fragments/DELETE.js +1 -1
  29. package/dist/kempo/api/fragments/DELETE.js.map +1 -1
  30. package/dist/kempo/api/fragments/GET.js +1 -1
  31. package/dist/kempo/api/fragments/GET.js.map +1 -1
  32. package/dist/kempo/api/fragments/POST.js +1 -1
  33. package/dist/kempo/api/fragments/POST.js.map +1 -1
  34. package/dist/kempo/api/fragments/disable/PUT.js +1 -1
  35. package/dist/kempo/api/fragments/disable/PUT.js.map +1 -1
  36. package/dist/kempo/api/fragments/enable/PUT.js +1 -1
  37. package/dist/kempo/api/fragments/enable/PUT.js.map +1 -1
  38. package/dist/kempo/api/fragments/file/GET.js +1 -1
  39. package/dist/kempo/api/fragments/file/GET.js.map +1 -1
  40. package/dist/kempo/api/fragments/file/PATCH.js +1 -1
  41. package/dist/kempo/api/fragments/file/PATCH.js.map +1 -1
  42. package/dist/kempo/api/fragments/file/PUT.js +1 -1
  43. package/dist/kempo/api/fragments/file/PUT.js.map +1 -1
  44. package/dist/kempo/api/fragments/lock/PUT.js +1 -1
  45. package/dist/kempo/api/fragments/lock/PUT.js.map +1 -1
  46. package/dist/kempo/api/globals/DELETE.js +1 -1
  47. package/dist/kempo/api/globals/DELETE.js.map +1 -1
  48. package/dist/kempo/api/globals/GET.js +1 -1
  49. package/dist/kempo/api/globals/GET.js.map +1 -1
  50. package/dist/kempo/api/globals/POST.js +1 -1
  51. package/dist/kempo/api/globals/POST.js.map +1 -1
  52. package/dist/kempo/api/globals/disable/PUT.js +1 -1
  53. package/dist/kempo/api/globals/disable/PUT.js.map +1 -1
  54. package/dist/kempo/api/globals/enable/PUT.js +1 -1
  55. package/dist/kempo/api/globals/enable/PUT.js.map +1 -1
  56. package/dist/kempo/api/globals/entry/GET.js +1 -1
  57. package/dist/kempo/api/globals/entry/GET.js.map +1 -1
  58. package/dist/kempo/api/globals/entry/PUT.js +1 -1
  59. package/dist/kempo/api/globals/entry/PUT.js.map +1 -1
  60. package/dist/kempo/api/globals/lock/PUT.js +1 -1
  61. package/dist/kempo/api/globals/lock/PUT.js.map +1 -1
  62. package/dist/kempo/api/pages/DELETE.js +1 -1
  63. package/dist/kempo/api/pages/DELETE.js.map +1 -1
  64. package/dist/kempo/api/pages/GET.js +1 -1
  65. package/dist/kempo/api/pages/GET.js.map +1 -1
  66. package/dist/kempo/api/pages/POST.js +1 -1
  67. package/dist/kempo/api/pages/POST.js.map +1 -1
  68. package/dist/kempo/api/pages/directories/GET.js +1 -1
  69. package/dist/kempo/api/pages/directories/GET.js.map +1 -1
  70. package/dist/kempo/api/pages/disable/PUT.js +1 -1
  71. package/dist/kempo/api/pages/disable/PUT.js.map +1 -1
  72. package/dist/kempo/api/pages/enable/PUT.js +1 -1
  73. package/dist/kempo/api/pages/enable/PUT.js.map +1 -1
  74. package/dist/kempo/api/pages/file/GET.js +1 -1
  75. package/dist/kempo/api/pages/file/GET.js.map +1 -1
  76. package/dist/kempo/api/pages/file/PATCH.js +1 -1
  77. package/dist/kempo/api/pages/file/PATCH.js.map +1 -1
  78. package/dist/kempo/api/pages/file/PUT.js +1 -1
  79. package/dist/kempo/api/pages/file/PUT.js.map +1 -1
  80. package/dist/kempo/api/pages/lock/PUT.js +1 -1
  81. package/dist/kempo/api/pages/lock/PUT.js.map +1 -1
  82. package/dist/kempo/api/pages/rescan/POST.js +2 -0
  83. package/dist/kempo/api/pages/rescan/POST.js.map +1 -0
  84. package/dist/kempo/api/pages/search/GET.js +1 -1
  85. package/dist/kempo/api/pages/search/GET.js.map +1 -1
  86. package/dist/kempo/api/pages/templates/GET.js +1 -1
  87. package/dist/kempo/api/pages/templates/GET.js.map +1 -1
  88. package/dist/kempo/api/templates/DELETE.js +1 -1
  89. package/dist/kempo/api/templates/DELETE.js.map +1 -1
  90. package/dist/kempo/api/templates/GET.js +1 -1
  91. package/dist/kempo/api/templates/GET.js.map +1 -1
  92. package/dist/kempo/api/templates/POST.js +1 -1
  93. package/dist/kempo/api/templates/POST.js.map +1 -1
  94. package/dist/kempo/api/templates/disable/PUT.js +1 -1
  95. package/dist/kempo/api/templates/disable/PUT.js.map +1 -1
  96. package/dist/kempo/api/templates/enable/PUT.js +1 -1
  97. package/dist/kempo/api/templates/enable/PUT.js.map +1 -1
  98. package/dist/kempo/api/templates/file/GET.js +1 -1
  99. package/dist/kempo/api/templates/file/GET.js.map +1 -1
  100. package/dist/kempo/api/templates/file/PATCH.js +1 -1
  101. package/dist/kempo/api/templates/file/PATCH.js.map +1 -1
  102. package/dist/kempo/api/templates/file/PUT.js +1 -1
  103. package/dist/kempo/api/templates/file/PUT.js.map +1 -1
  104. package/dist/kempo/api/templates/lock/PUT.js +1 -1
  105. package/dist/kempo/api/templates/lock/PUT.js.map +1 -1
  106. package/dist/kempo/sdk.js +1 -1
  107. package/dist/kempo/sdk.js.map +1 -1
  108. package/middleware/kempo.js +50 -1
  109. package/package.json +3 -3
  110. package/server/utils/fragments/listFragments.js +10 -1
  111. package/server/utils/hooks/triggerHook.js +7 -12
  112. package/server/utils/pages/listPages.js +57 -7
  113. package/app-public/kempo-global.global-disabled.html +0 -0
  114. package/app-public/new-page.page.html +0 -17
  115. package/app-public/test.page.html +0 -21
@@ -1,7 +1,87 @@
1
1
  <!--
2
2
  locked: true
3
3
  -->
4
- <fragment><k-aside main="push" state="expanded" style="--aside_padding: 0;" persistent-id="admin-nav"><k-aside-toggle><h3 class="m0">Kempo Admin</h3></k-aside-toggle><k-aside-item icon="preview" href="/" no-expand>Site</k-aside-item><k-aside-item icon="cards" href="/admin" no-expand>Dashboard</k-aside-item><k-aside-menu icon="manage-accounts" label="Accounts"><k-aside-item icon="person" href="/admin/accounts/users" no-expand>Users</k-aside-item><k-aside-item icon="group" href="/admin/accounts/groups" no-expand>Groups</k-aside-item><k-aside-item icon="lock" href="/admin/accounts/permissions" no-expand>Permissions</k-aside-item></k-aside-menu><k-aside-menu icon="cards_stack" label="Content"><k-aside-item icon="browse" href="/admin/content/templates">Templates</k-aside-item><k-aside-item icon="docs" href="/admin/content/pages">Pages</k-aside-item><k-aside-item icon="content" href="/admin/content/fragments">Fragments</k-aside-item><k-aside-item icon="globe" href="/admin/content/globals">Global Content</k-aside-item></k-aside-menu><k-aside-item icon="settings" href="/admin/settings" no-expand>Settings</k-aside-item><k-aside-item icon="extension" href="/admin/extensions" no-expand>Extensions</k-aside-item><hr><location name="admin-nav-extensions"></location><k-aside-spacer></k-aside-spacer><k-theme-switcher labels style="--padding:var(--spacer_h);margin:var(--spacer_h) auto"></k-theme-switcher></k-aside><script type="module">import '/kempo-ui/components/ThemeSwitcher.js';
4
+ <fragment>
5
+ <k-aside
6
+ main="push"
7
+ state="expanded"
8
+ style="--aside_padding: 0;"
9
+ persistent-id="admin-nav"
10
+ >
11
+ <k-aside-toggle>
12
+ <h3 class="m0">Kempo Admin</h3>
13
+ </k-aside-toggle>
14
+ <k-aside-item
15
+ icon="preview"
16
+ href="/"
17
+ no-expand
18
+ >Site</k-aside-item>
19
+ <k-aside-item
20
+ icon="cards"
21
+ href="/admin"
22
+ no-expand
23
+ >Dashboard</k-aside-item>
24
+ <k-aside-menu
25
+ icon="manage-accounts"
26
+ label="Accounts"
27
+ >
28
+ <k-aside-item
29
+ icon="person"
30
+ href="/admin/accounts/users"
31
+ no-expand
32
+ >Users</k-aside-item>
33
+ <k-aside-item
34
+ icon="group"
35
+ href="/admin/accounts/groups"
36
+ no-expand
37
+ >Groups</k-aside-item>
38
+ <k-aside-item
39
+ icon="lock"
40
+ href="/admin/accounts/permissions"
41
+ no-expand
42
+ >Permissions</k-aside-item>
43
+ </k-aside-menu>
44
+ <k-aside-menu
45
+ icon="cards_stack"
46
+ label="Content"
47
+ >
48
+ <k-aside-item
49
+ icon="browse"
50
+ href="/admin/content/templates"
51
+ >Templates</k-aside-item>
52
+ <k-aside-item
53
+ icon="docs"
54
+ href="/admin/content/pages"
55
+ >Pages</k-aside-item>
56
+ <k-aside-item
57
+ icon="content"
58
+ href="/admin/content/fragments"
59
+ >Fragments</k-aside-item>
60
+ <k-aside-item
61
+ icon="globe"
62
+ href="/admin/content/globals"
63
+ >Global Content</k-aside-item>
64
+ </k-aside-menu>
65
+ <k-aside-item
66
+ icon="settings"
67
+ href="/admin/settings"
68
+ no-expand
69
+ >Settings</k-aside-item>
70
+ <k-aside-item
71
+ icon="extension"
72
+ href="/admin/extensions"
73
+ no-expand
74
+ >Extensions</k-aside-item>
75
+ <hr>
76
+ <location name="admin-nav-extensions"></location>
77
+ <k-aside-spacer></k-aside-spacer>
78
+ <k-theme-switcher
79
+ labels
80
+ style="--padding:var(--spacer_h);margin:var(--spacer_h) auto"
81
+ ></k-theme-switcher>
82
+ </k-aside>
83
+ <script type="module">
84
+ import '/kempo-ui/components/ThemeSwitcher.js';
5
85
  const items = document.querySelectorAll('k-aside-item');
6
86
  const currentPath = window.location.pathname;
7
87
 
@@ -17,4 +97,6 @@
17
97
  const menu = item.closest('k-aside-menu');
18
98
  if (menu) menu.setAttribute('open', '');
19
99
  }
20
- });</script></fragment>
100
+ });
101
+ </script>
102
+ </fragment>
@@ -1,7 +1,70 @@
1
1
  <!--
2
2
  locked: true
3
3
  -->
4
- <page title="Setting - Admin"><content><script type="module" src="/kempo-ui/components/Icon.js"></script><script type="module" src="/kempo-ui/components/Toggle.js"></script><script type="module" src="/admin/components/Monaco.js"></script><script type="module" src="/kempo/components/Permission.js"></script><div class="mb"><a href="/admin/settings/" class="no-link"><button class="mbh"><k-icon name="arrow" direction="left"></k-icon>Settings</button></a><div class="d-f mb0" style="align-items: center; justify-content: space-between;"><div><h1 class="mb0" id="pageTitle">Setting</h1><p class="tc-muted mb0" id="settingDescription"></p></div><div class="d-f" style="gap: var(--spacer);"><button id="saveBtn" class="primary" disabled="disabled">Save</button> <button id="deleteBtn" class="danger" style="display: none;">Delete</button></div></div></div><div id="loading">Loading setting...</div><div id="notFound" style="display: none;"><p>Setting not found.</p><a href="/admin/settings/">Back to Settings</a></div><div id="content" style="display: none;"><div class="card"><h2>Value</h2><div id="editorContainer" class="mb"></div></div><div class="card"><h2>Metadata</h2><div class="mb"><label class="d-b mbh">Type</label> <select id="typeSelect" class="full"><option value="string">String</option><option value="number">Number</option><option value="boolean">Boolean</option><option value="json">JSON</option></select></div><div class="mb d-f" style="align-items: center; gap: var(--spacer_h);"><k-toggle id="publicToggle"></k-toggle><label>Public (accessible without authentication)</label></div><div class="mb"><label class="d-b mbh">Description</label> <textarea id="descriptionInput" class="full" rows="3"></textarea></div><div class="mb d-f" style="gap: var(--spacer);"><div><span class="tc-muted">Created:</span> <span id="createdAt"></span></div><div><span class="tc-muted">Updated:</span> <span id="updatedAt"></span></div></div></div></div><script type="module">import { getSetting, setSetting, deleteSetting, getAllCurrentUserPermissions } from '/kempo/sdk.js';
4
+ <page title="Setting - Admin">
5
+ <content>
6
+ <script type="module" src="/kempo-ui/components/Icon.js"></script>
7
+ <script type="module" src="/kempo-ui/components/Toggle.js"></script>
8
+ <script type="module" src="/admin/components/Monaco.js"></script>
9
+ <script type="module" src="/kempo/components/Permission.js"></script>
10
+
11
+ <div class="mb">
12
+ <a href="/admin/settings/" class="no-link">
13
+ <button class="mbh"><k-icon name="arrow" direction="left"></k-icon> Settings</button>
14
+ </a>
15
+ <div class="d-f mb0" style="align-items: center; justify-content: space-between;">
16
+ <div>
17
+ <h1 class="mb0" id="pageTitle">Setting</h1>
18
+ <p class="tc-muted mb0" id="settingDescription"></p>
19
+ </div>
20
+ <div class="d-f" style="gap: var(--spacer);">
21
+ <button id="saveBtn" class="primary" disabled>Save</button>
22
+ <button id="deleteBtn" class="danger" style="display: none;">Delete</button>
23
+ </div>
24
+ </div>
25
+ </div>
26
+
27
+ <div id="loading">Loading setting...</div>
28
+ <div id="notFound" style="display: none;">
29
+ <p>Setting not found.</p>
30
+ <a href="/admin/settings/">Back to Settings</a>
31
+ </div>
32
+ <div id="content" style="display: none;">
33
+
34
+ <div class="card">
35
+ <h2>Value</h2>
36
+ <div id="editorContainer" class="mb"></div>
37
+ </div>
38
+
39
+ <div class="card">
40
+ <h2>Metadata</h2>
41
+ <div class="mb">
42
+ <label class="d-b mbh">Type</label>
43
+ <select id="typeSelect" class="full">
44
+ <option value="string">String</option>
45
+ <option value="number">Number</option>
46
+ <option value="boolean">Boolean</option>
47
+ <option value="json">JSON</option>
48
+ </select>
49
+ </div>
50
+ <div class="mb d-f" style="align-items: center; gap: var(--spacer_h);">
51
+ <k-toggle id="publicToggle"></k-toggle>
52
+ <label>Public (accessible without authentication)</label>
53
+ </div>
54
+ <div class="mb">
55
+ <label class="d-b mbh">Description</label>
56
+ <textarea id="descriptionInput" class="full" rows="3"></textarea>
57
+ </div>
58
+ <div class="mb d-f" style="gap: var(--spacer);">
59
+ <div><span class="tc-muted">Created:</span> <span id="createdAt"></span></div>
60
+ <div><span class="tc-muted">Updated:</span> <span id="updatedAt"></span></div>
61
+ </div>
62
+ </div>
63
+
64
+ </div>
65
+
66
+ <script type="module">
67
+ import { getSetting, setSetting, deleteSetting, getAllCurrentUserPermissions } from '/kempo/sdk.js';
5
68
  import Toast from '/kempo-ui/components/Toast.js';
6
69
  import Dialog from '/kempo-ui/components/Dialog.js';
7
70
 
@@ -174,7 +237,9 @@
174
237
  }
175
238
  break;
176
239
  }
240
+ currentType = newType;
177
241
  await renderEditor(newType, converted);
242
+ setTimeout(checkDirty, 0);
178
243
  });
179
244
 
180
245
  /*
@@ -182,7 +247,7 @@
182
247
  */
183
248
 
184
249
  if(canEditValue){
185
- $saveBtn.disabled = false;
250
+ $saveBtn.disabled = true;
186
251
  } else {
187
252
  $typeSelect.disabled = true;
188
253
  $descriptionInput.readOnly = true;
@@ -198,6 +263,36 @@
198
263
  $deleteBtn.style.display = '';
199
264
  }
200
265
 
266
+ /*
267
+ Change detection
268
+ */
269
+
270
+ const checkDirty = () => {
271
+ if(!canEditValue){
272
+ $saveBtn.disabled = true;
273
+ return;
274
+ }
275
+
276
+ let currentValue;
277
+ try { currentValue = getValueFromEditor(); }
278
+ catch(e){ currentValue = undefined; }
279
+
280
+ const dirty = currentValue !== settingData.value
281
+ || $typeSelect.value !== settingData.type
282
+ || $publicToggle.value !== settingData.isPublic
283
+ || $descriptionInput.value.trim() !== (settingData.description || '');
284
+
285
+ $saveBtn.disabled = !dirty;
286
+ };
287
+
288
+ $typeSelect.addEventListener('change', () => {
289
+ setTimeout(checkDirty, 0);
290
+ });
291
+ $publicToggle.addEventListener('change', checkDirty);
292
+ $descriptionInput.addEventListener('input', checkDirty);
293
+ $editorContainer.addEventListener('input', checkDirty, true);
294
+ $editorContainer.addEventListener('change', checkDirty, true);
295
+
201
296
  /*
202
297
  Save
203
298
  */
@@ -219,14 +314,21 @@
219
314
  isPublic: $publicToggle.value,
220
315
  description: $descriptionInput.value.trim()
221
316
  });
222
- $saveBtn.disabled = !canEditValue;
223
317
 
224
318
  if(saveError){
225
319
  Toast.error(saveError.msg || 'Failed to save setting');
320
+ checkDirty();
226
321
  return;
227
322
  }
323
+
324
+ settingData.value = value;
325
+ settingData.type = $typeSelect.value;
326
+ settingData.isPublic = $publicToggle.value;
327
+ settingData.description = $descriptionInput.value.trim();
328
+
228
329
  Toast.success('Setting saved');
229
330
  document.getElementById('updatedAt').textContent = new Date().toLocaleString();
331
+ checkDirty();
230
332
  };
231
333
 
232
334
  $saveBtn.addEventListener('click', save);
@@ -257,4 +359,8 @@
257
359
  }
258
360
  );
259
361
  });
260
- }</script></content></page>
362
+ }
363
+ </script>
364
+
365
+ </content>
366
+ </page>
@@ -1,7 +1,88 @@
1
1
  <!--
2
2
  locked: true
3
3
  -->
4
- <page title="Settings - Admin"><content><script type="module" src="/kempo-ui/components/Table.js"></script><script type="module" src="/kempo-ui/components/tableControls/FirstPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/PrevPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/NextPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/LastPage.js"></script><script type="module" src="/kempo-ui/components/tableControls/PageSelect.js"></script><script type="module" src="/kempo-ui/components/tableControls/PageSize.js"></script><script type="module" src="/kempo-ui/components/tableControls/Edit.js"></script><script type="module" src="/kempo-ui/components/tableControls/DeleteRecord.js"></script><script type="module" src="/kempo-ui/components/tableControls/DeleteSelected.js"></script><script type="module" src="/admin/components/TableRowLink.js"></script><script type="module" src="/kempo/components/Permission.js"></script><div class="d-f mb" style="align-items: center; gap: var(--spacer);"><h1 class="flex mb0">Settings</h1><k-permission has="system:custom-settings:manage"><button id="createSettingBtn" class="primary">Create Setting</button></k-permission></div><h2>Custom Settings</h2><k-table id="customTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No custom settings have been created yet."><admin-table-row-link slot="before" url-pattern="{_link}" field-name="_link"></admin-table-row-link><div slot="top" class="d-f full" style="align-items: center;"><div><k-permission has="system:custom-settings:manage"><k-tc-delete-selected></k-tc-delete-selected></k-permission></div></div><div class="d-f full" style="align-items: center;"><div><k-tc-first-page></k-tc-first-page><k-tc-prev-page></k-tc-prev-page><k-tc-next-page></k-tc-next-page><k-tc-last-page></k-tc-last-page></div><div class="flex"></div><div><k-tc-page-select></k-tc-page-select></div><div class="flex"></div><div><k-tc-page-size></k-tc-page-size></div></div></k-table><h2>Extension Settings</h2><k-table id="extensionTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No extension settings installed."><admin-table-row-link slot="before" url-pattern="{_link}" field-name="_link"></admin-table-row-link><div class="d-f full" style="align-items: center;"><div><k-tc-first-page></k-tc-first-page><k-tc-prev-page></k-tc-prev-page><k-tc-next-page></k-tc-next-page><k-tc-last-page></k-tc-last-page></div><div class="flex"></div><div><k-tc-page-select></k-tc-page-select></div><div class="flex"></div><div><k-tc-page-size></k-tc-page-size></div></div></k-table><h2>System Settings</h2><k-table id="systemTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No system settings found."><admin-table-row-link slot="before" url-pattern="{_link}" field-name="_link"></admin-table-row-link><div class="d-f full" style="align-items: center;"><div><k-tc-first-page></k-tc-first-page><k-tc-prev-page></k-tc-prev-page><k-tc-next-page></k-tc-next-page><k-tc-last-page></k-tc-last-page></div><div class="flex"></div><div><k-tc-page-select></k-tc-page-select></div><div class="flex"></div><div><k-tc-page-size></k-tc-page-size></div></div></k-table><script type="module">import { listSettings, setSetting, deleteSetting, getAllCurrentUserPermissions } from '/kempo/sdk.js';
4
+ <page title="Settings - Admin">
5
+ <content>
6
+ <script type="module" src="/kempo-ui/components/Table.js"></script>
7
+ <script type="module" src="/kempo-ui/components/tableControls/FirstPage.js"></script>
8
+ <script type="module" src="/kempo-ui/components/tableControls/PrevPage.js"></script>
9
+ <script type="module" src="/kempo-ui/components/tableControls/NextPage.js"></script>
10
+ <script type="module" src="/kempo-ui/components/tableControls/LastPage.js"></script>
11
+ <script type="module" src="/kempo-ui/components/tableControls/PageSelect.js"></script>
12
+ <script type="module" src="/kempo-ui/components/tableControls/PageSize.js"></script>
13
+ <script type="module" src="/kempo-ui/components/tableControls/Edit.js"></script>
14
+ <script type="module" src="/kempo-ui/components/tableControls/DeleteRecord.js"></script>
15
+ <script type="module" src="/kempo-ui/components/tableControls/DeleteSelected.js"></script>
16
+ <script type="module" src="/admin/components/TableRowLink.js"></script>
17
+ <script type="module" src="/kempo/components/Permission.js"></script>
18
+
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>
25
+
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
+ <k-tc-delete-selected></k-tc-delete-selected>
33
+ </k-permission>
34
+ </div>
35
+ </div>
36
+ <div class="d-f full" style="align-items: center;">
37
+ <div>
38
+ <k-tc-first-page></k-tc-first-page>
39
+ <k-tc-prev-page></k-tc-prev-page>
40
+ <k-tc-next-page></k-tc-next-page>
41
+ <k-tc-last-page></k-tc-last-page>
42
+ </div>
43
+ <div class="flex"></div>
44
+ <div><k-tc-page-select></k-tc-page-select></div>
45
+ <div class="flex"></div>
46
+ <div><k-tc-page-size></k-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
+ <k-tc-first-page></k-tc-first-page>
56
+ <k-tc-prev-page></k-tc-prev-page>
57
+ <k-tc-next-page></k-tc-next-page>
58
+ <k-tc-last-page></k-tc-last-page>
59
+ </div>
60
+ <div class="flex"></div>
61
+ <div><k-tc-page-select></k-tc-page-select></div>
62
+ <div class="flex"></div>
63
+ <div><k-tc-page-size></k-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
+ <k-tc-first-page></k-tc-first-page>
73
+ <k-tc-prev-page></k-tc-prev-page>
74
+ <k-tc-next-page></k-tc-next-page>
75
+ <k-tc-last-page></k-tc-last-page>
76
+ </div>
77
+ <div class="flex"></div>
78
+ <div><k-tc-page-select></k-tc-page-select></div>
79
+ <div class="flex"></div>
80
+ <div><k-tc-page-size></k-tc-page-size></div>
81
+ </div>
82
+ </k-table>
83
+
84
+ <script type="module">
85
+ import { listSettings, setSetting, deleteSetting, getAllCurrentUserPermissions } from '/kempo/sdk.js';
5
86
  import { html } from '/kempo-ui/lit-all.min.js';
6
87
  import Toast from '/kempo-ui/components/Toast.js';
7
88
  import Dialog from '/kempo-ui/components/Dialog.js';
@@ -200,4 +281,8 @@
200
281
  cancelText: 'Cancel'
201
282
  });
202
283
  });
203
- }</script></content></page>
284
+ }
285
+ </script>
286
+
287
+ </content>
288
+ </page>
@@ -1,2 +1,2 @@
1
- import{resolve as r}from"path";import e from"../../../../server/utils/permissions/currentUserHasPermission.js";import s from"../../../../server/utils/fragments/getFragmentMetadata.js";import t from"../../../../server/utils/fragments/deleteFragment.js";const o=r(import.meta.dirname,"../../../../app-public");export default async(r,i)=>{const n=r.cookies.session_token,[a,f]=await e(n,"system:fragments:delete");if(a)return i.status(a.code).json({error:a.msg});if(!f)return i.status(403).json({error:"Insufficient permissions"});const{files:m}=r.body||{};if(!m?.length)return i.status(400).json({error:"No files specified"});for(const r of m){const[e,t]=await s({rootDir:o,file:r});if(!e&&t.locked)return i.status(403).json({error:`Cannot delete locked fragment: ${r}`})}const[u,c]=await t({rootDir:o,files:m});if(u)return i.status(u.code).json({error:u.msg});i.json(c)};
1
+ import{resolve as e,join as r}from"path";import s from"../../../../server/utils/permissions/currentUserHasPermission.js";import t from"../../../../server/utils/fragments/getFragmentMetadata.js";import o from"../../../../server/utils/fragments/deleteFragment.js";const i=import.meta.dirname.includes("node_modules")?r(process.cwd(),"public"):e(import.meta.dirname,"../../../../app-public");export default async(e,r)=>{const n=e.cookies.session_token,[a,m]=await s(n,"system:fragments:delete");if(a)return r.status(a.code).json({error:a.msg});if(!m)return r.status(403).json({error:"Insufficient permissions"});const{files:f}=e.body||{};if(!f?.length)return r.status(400).json({error:"No files specified"});for(const e of f){const[s,o]=await t({rootDir:i,file:e});if(!s&&o.locked)return r.status(403).json({error:`Cannot delete locked fragment: ${e}`})}const[c,u]=await o({rootDir:i,files:f});if(c)return r.status(c.code).json({error:c.msg});r.json(u)};
2
2
  //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\DELETE.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src\\kempo\\api\\fragments\\DELETE.js","names":["resolve","currentUserHasPermission","getFragmentMetadata","deleteFragment","rootDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","files","body","length","file","metaError","metadata","locked","result"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getFragmentMetadata from '../../../../server/utils/fragments/getFragmentMetadata.js';\r\nimport deleteFragment from '../../../../server/utils/fragments/deleteFragment.js';\r\n\r\nconst rootDir = resolve(import.meta.dirname, '../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:delete');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { files } = request.body || {};\r\n\r\n\tif(!files?.length){\r\n\t\treturn response.status(400).json({ error: 'No files specified' });\r\n\t}\r\n\r\n\tfor(const file of files){\r\n\t\tconst [metaError, metadata] = await getFragmentMetadata({ rootDir, file });\r\n\t\tif(!metaError && metadata.locked){\r\n\t\t\treturn response.status(403).json({ error: `Cannot delete locked fragment: ${file}` });\r\n\t\t}\r\n\t}\r\n\r\n\tconst [error, result] = await deleteFragment({ rootDir, files });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(result);\r\n};\r\n"],"mappings":"kBAASA,MAAe,cACjBC,MAA8B,0EAC9BC,MAAyB,mEACzBC,MAAoB,uDAE3B,MAAMC,EAAUJ,cAAoBK,QAAS,yCAE9BC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBZ,EAAyBQ,EAAO,2BAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,MAAEA,GAAUZ,EAAQa,MAAQ,CAAC,EAEnC,IAAID,GAAOE,OACV,OAAOb,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,uBAG3C,IAAI,MAAMK,KAAQH,EAAM,CACvB,MAAOI,EAAWC,SAAkBtB,EAAoB,CAAEE,UAASkB,SACnE,IAAIC,GAAaC,EAASC,OACzB,OAAOjB,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,kCAAkCK,KAE9E,CAEA,MAAOL,EAAOS,SAAgBvB,EAAe,CAAEC,UAASe,UAExD,GAAGF,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKU","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\fragments\\DELETE.js","names":["resolve","join","currentUserHasPermission","getFragmentMetadata","deleteFragment","rootDir","dirname","includes","process","cwd","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","files","body","length","file","metaError","metadata","locked","result"],"sources":["0"],"sourcesContent":["import { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getFragmentMetadata from '../../../../server/utils/fragments/getFragmentMetadata.js';\r\nimport deleteFragment from '../../../../server/utils/fragments/deleteFragment.js';\r\n\r\nconst rootDir = import.meta.dirname.includes('node_modules') ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:delete');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { files } = request.body || {};\r\n\r\n\tif(!files?.length){\r\n\t\treturn response.status(400).json({ error: 'No files specified' });\r\n\t}\r\n\r\n\tfor(const file of files){\r\n\t\tconst [metaError, metadata] = await getFragmentMetadata({ rootDir, file });\r\n\t\tif(!metaError && metadata.locked){\r\n\t\t\treturn response.status(403).json({ error: `Cannot delete locked fragment: ${file}` });\r\n\t\t}\r\n\t}\r\n\r\n\tconst [error, result] = await deleteFragment({ rootDir, files });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(result);\r\n};\r\n"],"mappings":"kBAASA,UAASC,MAAY,cACvBC,MAA8B,0EAC9BC,MAAyB,mEACzBC,MAAoB,uDAE3B,MAAMC,cAAsBC,QAAQC,SAAS,gBAAkBN,EAAKO,QAAQC,MAAO,UAAYT,cAAoBM,QAAS,yCAE7GI,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBf,EAAyBW,EAAO,2BAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,MAAEA,GAAUZ,EAAQa,MAAQ,CAAC,EAEnC,IAAID,GAAOE,OACV,OAAOb,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,uBAG3C,IAAI,MAAMK,KAAQH,EAAM,CACvB,MAAOI,EAAWC,SAAkBzB,EAAoB,CAAEE,UAASqB,SACnE,IAAIC,GAAaC,EAASC,OACzB,OAAOjB,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,kCAAkCK,KAE9E,CAEA,MAAOL,EAAOS,SAAgB1B,EAAe,CAAEC,UAASkB,UAExD,GAAGF,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKU","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{resolve as s}from"path";import r from"../../../../server/utils/permissions/currentUserHasPermission.js";import t from"../../../../server/utils/fragments/listFragments.js";const e=s(import.meta.dirname,"../../../../app-public");export default async(s,o)=>{const i=s.cookies.session_token,[n,a]=await r(i,"system:fragments:read");if(n)return o.status(n.code).json({error:n.msg});if(!a)return o.status(403).json({error:"Insufficient permissions"});const[m,u]=await t({rootDir:e});if(m)return o.status(m.code).json({error:m.msg});o.json(u)};
1
+ import{resolve as s,join as r}from"path";import e from"../../../../server/utils/permissions/currentUserHasPermission.js";import t from"../../../../server/utils/fragments/listFragments.js";const o=import.meta.dirname.includes("node_modules")?r(process.cwd(),"public"):s(import.meta.dirname,"../../../../app-public");export default async(s,r)=>{const i=s.cookies.session_token,[n,m]=await e(i,"system:fragments:read");if(n)return r.status(n.code).json({error:n.msg});if(!m)return r.status(403).json({error:"Insufficient permissions"});const[a,u]=await t({rootDir:o});if(a)return r.status(a.code).json({error:a.msg});r.json(u)};
2
2
  //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\GET.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src\\kempo\\api\\fragments\\GET.js","names":["resolve","currentUserHasPermission","listFragments","rootDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport listFragments from '../../../../server/utils/fragments/listFragments.js';\r\n\r\nconst rootDir = resolve(import.meta.dirname, '../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:read');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst [error, data] = await listFragments({ rootDir });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(data);\r\n};\r\n"],"mappings":"kBAASA,MAAe,cACjBC,MAA8B,0EAC9BC,MAAmB,sDAE1B,MAAMC,EAAUH,cAAoBI,QAAS,yCAE9BC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,EAAyBO,EAAO,yBAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAOA,EAAOE,SAAchB,EAAc,CAAEC,YAE5C,GAAGa,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKG","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\fragments\\GET.js","names":["resolve","join","currentUserHasPermission","listFragments","rootDir","dirname","includes","process","cwd","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","data"],"sources":["0"],"sourcesContent":["import { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport listFragments from '../../../../server/utils/fragments/listFragments.js';\r\n\r\nconst rootDir = import.meta.dirname.includes('node_modules') ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:read');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst [error, data] = await listFragments({ rootDir });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(data);\r\n};\r\n"],"mappings":"kBAASA,UAASC,MAAY,cACvBC,MAA8B,0EAC9BC,MAAmB,sDAE1B,MAAMC,cAAsBC,QAAQC,SAAS,gBAAkBL,EAAKM,QAAQC,MAAO,UAAYR,cAAoBK,QAAS,yCAE7GI,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBd,EAAyBU,EAAO,yBAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAOA,EAAOE,SAAcnB,EAAc,CAAEC,YAE5C,GAAGgB,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKG","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{resolve as r}from"path";import s from"../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../server/utils/auth/getSession.js";import t from"../../../../server/utils/fragments/createFragment.js";const o=r(import.meta.dirname,"../../../../app-public");export default async(r,i)=>{const n=r.cookies.session_token,[a,m]=await s(n,"system:fragments:create");if(a)return i.status(a.code).json({error:a.msg});if(!m)return i.status(403).json({error:"Insufficient permissions"});const{directory:u,name:c}=r.body;if(!c)return i.status(400).json({error:"Fragment name is required"});const[,f]=await e({token:n}),p=f?.user?.name||"",[d,j]=await t({rootDir:o,directory:u,name:c,author:p});if(d)return i.status(d.code).json({error:d.msg});i.status(201).json(j)};
1
+ import{resolve as r,join as s}from"path";import e from"../../../../server/utils/permissions/currentUserHasPermission.js";import t from"../../../../server/utils/auth/getSession.js";import o from"../../../../server/utils/fragments/createFragment.js";const i=import.meta.dirname.includes("node_modules")?s(process.cwd(),"public"):r(import.meta.dirname,"../../../../app-public");export default async(r,s)=>{const n=r.cookies.session_token,[a,m]=await e(n,"system:fragments:create");if(a)return s.status(a.code).json({error:a.msg});if(!m)return s.status(403).json({error:"Insufficient permissions"});const{directory:u,name:c}=r.body;if(!c)return s.status(400).json({error:"Fragment name is required"});const[,p]=await t({token:n}),d=p?.user?.name||"",[f,j]=await o({rootDir:i,directory:u,name:c,author:d});if(f)return s.status(f.code).json({error:f.msg});s.status(201).json(j)};
2
2
  //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\POST.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src\\kempo\\api\\fragments\\POST.js","names":["resolve","currentUserHasPermission","getSession","createFragment","rootDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","directory","name","body","sessionData","author","user","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getSession from '../../../../server/utils/auth/getSession.js';\r\nimport createFragment from '../../../../server/utils/fragments/createFragment.js';\r\n\r\nconst rootDir = resolve(import.meta.dirname, '../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:create');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { directory, name } = request.body;\r\n\r\n\tif(!name){\r\n\t\treturn response.status(400).json({ error: 'Fragment name is required' });\r\n\t}\r\n\r\n\tconst [, sessionData] = await getSession({ token });\r\n\tconst author = sessionData?.user?.name || '';\r\n\r\n\tconst [error, data] = await createFragment({ rootDir, directory, name, author });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.status(201).json(data);\r\n};\r\n"],"mappings":"kBAASA,MAAe,cACjBC,MAA8B,0EAC9BC,MAAgB,qDAChBC,MAAoB,uDAE3B,MAAMC,EAAUJ,cAAoBK,QAAS,yCAE9BC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBZ,EAAyBQ,EAAO,2BAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,UAAEA,EAASC,KAAEA,GAASb,EAAQc,KAEpC,IAAID,EACH,OAAOZ,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,8BAG3C,MAAO,CAAEK,SAAqBpB,EAAW,CAAEO,UACrCc,EAASD,GAAaE,MAAMJ,MAAQ,IAEnCH,EAAOQ,SAActB,EAAe,CAAEC,UAASe,YAAWC,OAAMG,WAEvE,GAAGN,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASM,OAAO,KAAKE,KAAKS","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\fragments\\POST.js","names":["resolve","join","currentUserHasPermission","getSession","createFragment","rootDir","dirname","includes","process","cwd","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","directory","name","body","sessionData","author","user","data"],"sources":["0"],"sourcesContent":["import { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getSession from '../../../../server/utils/auth/getSession.js';\r\nimport createFragment from '../../../../server/utils/fragments/createFragment.js';\r\n\r\nconst rootDir = import.meta.dirname.includes('node_modules') ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:create');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { directory, name } = request.body;\r\n\r\n\tif(!name){\r\n\t\treturn response.status(400).json({ error: 'Fragment name is required' });\r\n\t}\r\n\r\n\tconst [, sessionData] = await getSession({ token });\r\n\tconst author = sessionData?.user?.name || '';\r\n\r\n\tconst [error, data] = await createFragment({ rootDir, directory, name, author });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.status(201).json(data);\r\n};\r\n"],"mappings":"kBAASA,UAASC,MAAY,cACvBC,MAA8B,0EAC9BC,MAAgB,qDAChBC,MAAoB,uDAE3B,MAAMC,cAAsBC,QAAQC,SAAS,gBAAkBN,EAAKO,QAAQC,MAAO,UAAYT,cAAoBM,QAAS,yCAE7GI,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBf,EAAyBW,EAAO,2BAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,UAAEA,EAASC,KAAEA,GAASb,EAAQc,KAEpC,IAAID,EACH,OAAOZ,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,8BAG3C,MAAO,CAAEK,SAAqBvB,EAAW,CAAEU,UACrCc,EAASD,GAAaE,MAAMJ,MAAQ,IAEnCH,EAAOQ,SAAczB,EAAe,CAAEC,UAASkB,YAAWC,OAAMG,WAEvE,GAAGN,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASM,OAAO,KAAKE,KAAKS","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{resolve as r}from"path";import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import t from"../../../../../server/utils/fragments/getFragmentMetadata.js";import e from"../../../../../server/utils/fragments/disableFragment.js";const o=r(import.meta.dirname,"../../../../../app-public");export default async(r,i)=>{const a=r.cookies.session_token,[n,m]=await s(a,"system:pages:update");if(n)return i.status(n.code).json({error:n.msg});if(!m)return i.status(403).json({error:"Insufficient permissions"});const{file:u}=r.body||{};if(!u)return i.status(400).json({error:"File path is required"});const[f,p]=await t({rootDir:o,file:u});if(!f&&p.locked)return i.status(403).json({error:"Cannot disable a locked fragment"});const[c,l]=await e({rootDir:o,file:u});if(c)return i.status(c.code).json({error:c.msg});i.json(l)};
1
+ import{resolve as r,join as s}from"path";import e from"../../../../../server/utils/permissions/currentUserHasPermission.js";import t from"../../../../../server/utils/fragments/getFragmentMetadata.js";import o from"../../../../../server/utils/fragments/disableFragment.js";const i=import.meta.dirname.includes("node_modules")?s(process.cwd(),"public"):r(import.meta.dirname,"../../../../../app-public");export default async(r,s)=>{const n=r.cookies.session_token,[a,m]=await e(n,"system:pages:update");if(a)return s.status(a.code).json({error:a.msg});if(!m)return s.status(403).json({error:"Insufficient permissions"});const{file:u}=r.body||{};if(!u)return s.status(400).json({error:"File path is required"});const[c,f]=await t({rootDir:i,file:u});if(!c&&f.locked)return s.status(403).json({error:"Cannot disable a locked fragment"});const[p,d]=await o({rootDir:i,file:u});if(p)return s.status(p.code).json({error:p.msg});s.json(d)};
2
2
  //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\disable\PUT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src\\kempo\\api\\fragments\\disable\\PUT.js","names":["resolve","currentUserHasPermission","getFragmentMetadata","disableFragment","rootDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","body","metaError","metadata","locked","result"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getFragmentMetadata from '../../../../../server/utils/fragments/getFragmentMetadata.js';\r\nimport disableFragment from '../../../../../server/utils/fragments/disableFragment.js';\r\n\r\nconst rootDir = resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:pages:update');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file } = request.body || {};\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tconst [metaError, metadata] = await getFragmentMetadata({ rootDir, file });\r\n\tif(!metaError && metadata.locked){\r\n\t\treturn response.status(403).json({ error: 'Cannot disable a locked fragment' });\r\n\t}\r\n\r\n\tconst [error, result] = await disableFragment({ rootDir, file });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(result);\r\n};\r\n"],"mappings":"kBAASA,MAAe,cACjBC,MAA8B,6EAC9BC,MAAyB,sEACzBC,MAAqB,2DAE5B,MAAMC,EAAUJ,cAAoBK,QAAS,4CAE9BC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBZ,EAAyBQ,EAAO,uBAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,GAASZ,EAAQa,MAAQ,CAAC,EAElC,IAAID,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,MAAOI,EAAWC,SAAkBpB,EAAoB,CAAEE,UAASe,SACnE,IAAIE,GAAaC,EAASC,OACzB,OAAOf,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,qCAG3C,MAAOA,EAAOO,SAAgBrB,EAAgB,CAAEC,UAASe,SAEzD,GAAGF,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKQ","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\fragments\\disable\\PUT.js","names":["resolve","join","currentUserHasPermission","getFragmentMetadata","disableFragment","rootDir","dirname","includes","process","cwd","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","body","metaError","metadata","locked","result"],"sources":["0"],"sourcesContent":["import { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getFragmentMetadata from '../../../../../server/utils/fragments/getFragmentMetadata.js';\r\nimport disableFragment from '../../../../../server/utils/fragments/disableFragment.js';\r\n\r\nconst rootDir = import.meta.dirname.includes('node_modules') ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:pages:update');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file } = request.body || {};\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tconst [metaError, metadata] = await getFragmentMetadata({ rootDir, file });\r\n\tif(!metaError && metadata.locked){\r\n\t\treturn response.status(403).json({ error: 'Cannot disable a locked fragment' });\r\n\t}\r\n\r\n\tconst [error, result] = await disableFragment({ rootDir, file });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(result);\r\n};\r\n"],"mappings":"kBAASA,UAASC,MAAY,cACvBC,MAA8B,6EAC9BC,MAAyB,sEACzBC,MAAqB,2DAE5B,MAAMC,cAAsBC,QAAQC,SAAS,gBAAkBN,EAAKO,QAAQC,MAAO,UAAYT,cAAoBM,QAAS,4CAE7GI,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBf,EAAyBW,EAAO,uBAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,GAASZ,EAAQa,MAAQ,CAAC,EAElC,IAAID,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,MAAOI,EAAWC,SAAkBvB,EAAoB,CAAEE,UAASkB,SACnE,IAAIE,GAAaC,EAASC,OACzB,OAAOf,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,qCAG3C,MAAOA,EAAOO,SAAgBxB,EAAgB,CAAEC,UAASkB,SAEzD,GAAGF,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKQ","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{resolve as s}from"path";import r from"../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../server/utils/fragments/enableFragment.js";const t=s(import.meta.dirname,"../../../../../app-public");export default async(s,o)=>{const i=s.cookies.session_token,[n,a]=await r(i,"system:pages:update");if(n)return o.status(n.code).json({error:n.msg});if(!a)return o.status(403).json({error:"Insufficient permissions"});const{file:m}=s.body||{};if(!m)return o.status(400).json({error:"File path is required"});const[u,p]=await e({rootDir:t,file:m});if(u)return o.status(u.code).json({error:u.msg});o.json(p)};
1
+ import{resolve as s,join as r}from"path";import e from"../../../../../server/utils/permissions/currentUserHasPermission.js";import t from"../../../../../server/utils/fragments/enableFragment.js";const o=import.meta.dirname.includes("node_modules")?r(process.cwd(),"public"):s(import.meta.dirname,"../../../../../app-public");export default async(s,r)=>{const i=s.cookies.session_token,[n,a]=await e(i,"system:pages:update");if(n)return r.status(n.code).json({error:n.msg});if(!a)return r.status(403).json({error:"Insufficient permissions"});const{file:m}=s.body||{};if(!m)return r.status(400).json({error:"File path is required"});const[u,p]=await t({rootDir:o,file:m});if(u)return r.status(u.code).json({error:u.msg});r.json(p)};
2
2
  //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\enable\PUT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src\\kempo\\api\\fragments\\enable\\PUT.js","names":["resolve","currentUserHasPermission","enableFragment","rootDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","body","result"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport enableFragment from '../../../../../server/utils/fragments/enableFragment.js';\r\n\r\nconst rootDir = resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:pages:update');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file } = request.body || {};\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tconst [error, result] = await enableFragment({ rootDir, file });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(result);\r\n};\r\n"],"mappings":"kBAASA,MAAe,cACjBC,MAA8B,6EAC9BC,MAAoB,0DAE3B,MAAMC,EAAUH,cAAoBI,QAAS,4CAE9BC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,EAAyBO,EAAO,uBAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,GAASZ,EAAQa,MAAQ,CAAC,EAElC,IAAID,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,MAAOA,EAAOI,SAAgBlB,EAAe,CAAEC,UAASe,SAExD,GAAGF,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKK","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\fragments\\enable\\PUT.js","names":["resolve","join","currentUserHasPermission","enableFragment","rootDir","dirname","includes","process","cwd","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","body","result"],"sources":["0"],"sourcesContent":["import { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport enableFragment from '../../../../../server/utils/fragments/enableFragment.js';\r\n\r\nconst rootDir = import.meta.dirname.includes('node_modules') ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:pages:update');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file } = request.body || {};\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tconst [error, result] = await enableFragment({ rootDir, file });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(result);\r\n};\r\n"],"mappings":"kBAASA,UAASC,MAAY,cACvBC,MAA8B,6EAC9BC,MAAoB,0DAE3B,MAAMC,cAAsBC,QAAQC,SAAS,gBAAkBL,EAAKM,QAAQC,MAAO,UAAYR,cAAoBK,QAAS,4CAE7GI,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBd,EAAyBU,EAAO,uBAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,GAASZ,EAAQa,MAAQ,CAAC,EAElC,IAAID,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,MAAOA,EAAOI,SAAgBrB,EAAe,CAAEC,UAASkB,SAExD,GAAGF,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKK","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{resolve as r}from"path";import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../server/utils/fragments/getFragment.js";const t=r(import.meta.dirname,"../../../../../app-public");export default async(r,o)=>{const i=r.cookies.session_token,[n,a]=await s(i,"system:fragments:read");if(n)return o.status(n.code).json({error:n.msg});if(!a)return o.status(403).json({error:"Insufficient permissions"});const{file:m}=r.query;if(!m)return o.status(400).json({error:"File path is required"});const[u,f]=await e({rootDir:t,file:m});if(u)return o.status(u.code).json({error:u.msg});o.json(f)};
1
+ import{resolve as r,join as s}from"path";import e from"../../../../../server/utils/permissions/currentUserHasPermission.js";import t from"../../../../../server/utils/fragments/getFragment.js";const o=import.meta.dirname.includes("node_modules")?s(process.cwd(),"public"):r(import.meta.dirname,"../../../../../app-public");export default async(r,s)=>{const i=r.cookies.session_token,[n,a]=await e(i,"system:fragments:read");if(n)return s.status(n.code).json({error:n.msg});if(!a)return s.status(403).json({error:"Insufficient permissions"});const{file:m}=r.query;if(!m)return s.status(400).json({error:"File path is required"});const[u,c]=await t({rootDir:o,file:m});if(u)return s.status(u.code).json({error:u.msg});s.json(c)};
2
2
  //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\file\GET.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src\\kempo\\api\\fragments\\file\\GET.js","names":["resolve","currentUserHasPermission","getFragment","rootDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","query","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getFragment from '../../../../../server/utils/fragments/getFragment.js';\r\n\r\nconst rootDir = resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:read');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file } = request.query;\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tconst [error, data] = await getFragment({ rootDir, file });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(data);\r\n};\r\n"],"mappings":"kBAASA,MAAe,cACjBC,MAA8B,6EAC9BC,MAAiB,uDAExB,MAAMC,EAAUH,cAAoBI,QAAS,4CAE9BC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,EAAyBO,EAAO,yBAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,GAASZ,EAAQa,MAEzB,IAAID,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,MAAOA,EAAOI,SAAclB,EAAY,CAAEC,UAASe,SAEnD,GAAGF,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKK","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\fragments\\file\\GET.js","names":["resolve","join","currentUserHasPermission","getFragment","rootDir","dirname","includes","process","cwd","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","query","data"],"sources":["0"],"sourcesContent":["import { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getFragment from '../../../../../server/utils/fragments/getFragment.js';\r\n\r\nconst rootDir = import.meta.dirname.includes('node_modules') ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:read');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file } = request.query;\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tconst [error, data] = await getFragment({ rootDir, file });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(data);\r\n};\r\n"],"mappings":"kBAASA,UAASC,MAAY,cACvBC,MAA8B,6EAC9BC,MAAiB,uDAExB,MAAMC,cAAsBC,QAAQC,SAAS,gBAAkBL,EAAKM,QAAQC,MAAO,UAAYR,cAAoBK,QAAS,4CAE7GI,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBd,EAAyBU,EAAO,yBAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,GAASZ,EAAQa,MAEzB,IAAID,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,MAAOA,EAAOI,SAAcrB,EAAY,CAAEC,UAASkB,SAEnD,GAAGF,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKK","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{resolve as r}from"path";import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../server/utils/fragments/moveFragment.js";const t=r(import.meta.dirname,"../../../../../app-public");export default async(r,i)=>{const o=r.cookies.session_token,[n,a]=await s(o,"system:pages:update");if(n)return i.status(n.code).json({error:n.msg});if(!a)return i.status(403).json({error:"Insufficient permissions"});const{file:u,newFile:m}=r.body;if(!u)return i.status(400).json({error:"File path is required"});if(!m)return i.status(400).json({error:"New file path is required"});const[f,p]=await e({rootDir:t,file:u,newFile:m});if(f)return i.status(f.code).json({error:f.msg});i.json(p)};
1
+ import{resolve as r,join as e}from"path";import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import t from"../../../../../server/utils/fragments/moveFragment.js";const i=import.meta.dirname.includes("node_modules")?e(process.cwd(),"public"):r(import.meta.dirname,"../../../../../app-public");export default async(r,e)=>{const o=r.cookies.session_token,[n,a]=await s(o,"system:pages:update");if(n)return e.status(n.code).json({error:n.msg});if(!a)return e.status(403).json({error:"Insufficient permissions"});const{file:m,newFile:u}=r.body;if(!m)return e.status(400).json({error:"File path is required"});if(!u)return e.status(400).json({error:"New file path is required"});const[p,c]=await t({rootDir:i,file:m,newFile:u});if(p)return e.status(p.code).json({error:p.msg});e.json(c)};
2
2
  //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\file\PATCH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src\\kempo\\api\\fragments\\file\\PATCH.js","names":["resolve","currentUserHasPermission","moveFragment","rootDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","newFile","body","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport moveFragment from '../../../../../server/utils/fragments/moveFragment.js';\r\n\r\nconst rootDir = resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:pages:update');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file, newFile } = request.body;\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tif(!newFile){\r\n\t\treturn response.status(400).json({ error: 'New file path is required' });\r\n\t}\r\n\r\n\tconst [error, data] = await moveFragment({ rootDir, file, newFile });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(data);\r\n};\r\n"],"mappings":"kBAASA,MAAe,cACjBC,MAA8B,6EAC9BC,MAAkB,wDAEzB,MAAMC,EAAUH,cAAoBI,QAAS,4CAE9BC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,EAAyBO,EAAO,uBAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,EAAIC,QAAEA,GAAYb,EAAQc,KAElC,IAAIF,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,IAAIG,EACH,OAAOZ,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,8BAG3C,MAAOA,EAAOK,SAAcnB,EAAa,CAAEC,UAASe,OAAMC,YAE1D,GAAGH,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKM","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\fragments\\file\\PATCH.js","names":["resolve","join","currentUserHasPermission","moveFragment","rootDir","dirname","includes","process","cwd","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","newFile","body","data"],"sources":["0"],"sourcesContent":["import { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport moveFragment from '../../../../../server/utils/fragments/moveFragment.js';\r\n\r\nconst rootDir = import.meta.dirname.includes('node_modules') ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:pages:update');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file, newFile } = request.body;\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tif(!newFile){\r\n\t\treturn response.status(400).json({ error: 'New file path is required' });\r\n\t}\r\n\r\n\tconst [error, data] = await moveFragment({ rootDir, file, newFile });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(data);\r\n};\r\n"],"mappings":"kBAASA,UAASC,MAAY,cACvBC,MAA8B,6EAC9BC,MAAkB,wDAEzB,MAAMC,cAAsBC,QAAQC,SAAS,gBAAkBL,EAAKM,QAAQC,MAAO,UAAYR,cAAoBK,QAAS,4CAE7GI,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBd,EAAyBU,EAAO,uBAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,EAAIC,QAAEA,GAAYb,EAAQc,KAElC,IAAIF,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,IAAIG,EACH,OAAOZ,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,8BAG3C,MAAOA,EAAOK,SAActB,EAAa,CAAEC,UAASkB,OAAMC,YAE1D,GAAGH,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKM","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{resolve as r}from"path";import t from"../../../../../server/utils/permissions/currentUserHasPermission.js";import s from"../../../../../server/utils/fragments/getFragmentMetadata.js";import e from"../../../../../server/utils/fragments/updateFragment.js";const o=r(import.meta.dirname,"../../../../../app-public");export default async(r,i)=>{const a=r.cookies.session_token,[n,m]=await t(a,"system:fragments:update");if(n)return i.status(n.code).json({error:n.msg});if(!m)return i.status(403).json({error:"Insufficient permissions"});const{file:u,name:f,author:p,markup:c}=r.body;if(!u)return i.status(400).json({error:"File path is required"});const[d,l]=await s({rootDir:o,file:u});if(!d&&l.locked)return i.status(403).json({error:"This fragment is locked and cannot be edited"});const[g,j]=await e({rootDir:o,file:u,name:f,author:p,markup:c});if(g)return i.status(g.code).json({error:g.msg});i.json(j)};
1
+ import{resolve as r,join as e}from"path";import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import t from"../../../../../server/utils/fragments/getFragmentMetadata.js";import o from"../../../../../server/utils/fragments/updateFragment.js";const i=import.meta.dirname.includes("node_modules")?e(process.cwd(),"public"):r(import.meta.dirname,"../../../../../app-public");export default async(r,e)=>{const a=r.cookies.session_token,[n,m]=await s(a,"system:fragments:update");if(n)return e.status(n.code).json({error:n.msg});if(!m)return e.status(403).json({error:"Insufficient permissions"});const{file:u,name:p,author:c,markup:d}=r.body;if(!u)return e.status(400).json({error:"File path is required"});const[f,l]=await t({rootDir:i,file:u});if(!f&&l.locked)return e.status(403).json({error:"This fragment is locked and cannot be edited"});const[g,j]=await o({rootDir:i,file:u,name:p,author:c,markup:d});if(g)return e.status(g.code).json({error:g.msg});e.json(j)};
2
2
  //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\file\PUT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src\\kempo\\api\\fragments\\file\\PUT.js","names":["resolve","currentUserHasPermission","getFragmentMetadata","updateFragment","rootDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","name","author","markup","body","metaError","metadata","locked","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getFragmentMetadata from '../../../../../server/utils/fragments/getFragmentMetadata.js';\r\nimport updateFragment from '../../../../../server/utils/fragments/updateFragment.js';\r\n\r\nconst rootDir = resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:update');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file, name, author, markup } = request.body;\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tconst [metaError, metadata] = await getFragmentMetadata({ rootDir, file });\r\n\tif(!metaError && metadata.locked){\r\n\t\treturn response.status(403).json({ error: 'This fragment is locked and cannot be edited' });\r\n\t}\r\n\r\n\tconst [error, data] = await updateFragment({ rootDir, file, name, author, markup });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(data);\r\n};\r\n"],"mappings":"kBAASA,MAAe,cACjBC,MAA8B,6EAC9BC,MAAyB,sEACzBC,MAAoB,0DAE3B,MAAMC,EAAUJ,cAAoBK,QAAS,4CAE9BC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBZ,EAAyBQ,EAAO,2BAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,EAAIC,KAAEA,EAAIC,OAAEA,EAAMC,OAAEA,GAAWf,EAAQgB,KAE/C,IAAIJ,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,MAAOO,EAAWC,SAAkBvB,EAAoB,CAAEE,UAASe,SACnE,IAAIK,GAAaC,EAASC,OACzB,OAAOlB,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,iDAG3C,MAAOA,EAAOU,SAAcxB,EAAe,CAAEC,UAASe,OAAMC,OAAMC,SAAQC,WAE1E,GAAGL,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKW","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\fragments\\file\\PUT.js","names":["resolve","join","currentUserHasPermission","getFragmentMetadata","updateFragment","rootDir","dirname","includes","process","cwd","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","name","author","markup","body","metaError","metadata","locked","data"],"sources":["0"],"sourcesContent":["import { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getFragmentMetadata from '../../../../../server/utils/fragments/getFragmentMetadata.js';\r\nimport updateFragment from '../../../../../server/utils/fragments/updateFragment.js';\r\n\r\nconst rootDir = import.meta.dirname.includes('node_modules') ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:update');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file, name, author, markup } = request.body;\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tconst [metaError, metadata] = await getFragmentMetadata({ rootDir, file });\r\n\tif(!metaError && metadata.locked){\r\n\t\treturn response.status(403).json({ error: 'This fragment is locked and cannot be edited' });\r\n\t}\r\n\r\n\tconst [error, data] = await updateFragment({ rootDir, file, name, author, markup });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(data);\r\n};\r\n"],"mappings":"kBAASA,UAASC,MAAY,cACvBC,MAA8B,6EAC9BC,MAAyB,sEACzBC,MAAoB,0DAE3B,MAAMC,cAAsBC,QAAQC,SAAS,gBAAkBN,EAAKO,QAAQC,MAAO,UAAYT,cAAoBM,QAAS,4CAE7GI,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBf,EAAyBW,EAAO,2BAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,EAAIC,KAAEA,EAAIC,OAAEA,EAAMC,OAAEA,GAAWf,EAAQgB,KAE/C,IAAIJ,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,MAAOO,EAAWC,SAAkB1B,EAAoB,CAAEE,UAASkB,SACnE,IAAIK,GAAaC,EAASC,OACzB,OAAOlB,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,iDAG3C,MAAOA,EAAOU,SAAc3B,EAAe,CAAEC,UAASkB,OAAMC,OAAMC,SAAQC,WAE1E,GAAGL,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKW","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{resolve as r}from"path";import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../server/utils/fragments/setFragmentLocked.js";const o=r(import.meta.dirname,"../../../../../app-public");export default async(r,t)=>{const i=r.cookies.session_token,[n,a]=await s(i,"system:fragments:update");if(n)return t.status(n.code).json({error:n.msg});if(!a)return t.status(403).json({error:"Insufficient permissions"});const{file:m,locked:u}=r.body;if(!m)return t.status(400).json({error:"File path is required"});if("boolean"!=typeof u)return t.status(400).json({error:"locked must be a boolean"});const[f,c]=await e({rootDir:o,file:m,locked:u});if(f)return t.status(f.code).json({error:f.msg});t.json(c)};
1
+ import{resolve as s,join as e}from"path";import r from"../../../../../server/utils/permissions/currentUserHasPermission.js";import o from"../../../../../server/utils/fragments/setFragmentLocked.js";const t=import.meta.dirname.includes("node_modules")?e(process.cwd(),"public"):s(import.meta.dirname,"../../../../../app-public");export default async(s,e)=>{const i=s.cookies.session_token,[n,a]=await r(i,"system:fragments:update");if(n)return e.status(n.code).json({error:n.msg});if(!a)return e.status(403).json({error:"Insufficient permissions"});const{file:m,locked:u}=s.body;if(!m)return e.status(400).json({error:"File path is required"});if("boolean"!=typeof u)return e.status(400).json({error:"locked must be a boolean"});const[c,p]=await o({rootDir:t,file:m,locked:u});if(c)return e.status(c.code).json({error:c.msg});e.json(p)};
2
2
  //# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\lock\PUT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src\\kempo\\api\\fragments\\lock\\PUT.js","names":["resolve","currentUserHasPermission","setFragmentLocked","rootDir","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","locked","body","data"],"sources":["0"],"sourcesContent":["import { resolve } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport setFragmentLocked from '../../../../../server/utils/fragments/setFragmentLocked.js';\r\n\r\nconst rootDir = resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:update');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file, locked } = request.body;\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tif(typeof locked !== 'boolean'){\r\n\t\treturn response.status(400).json({ error: 'locked must be a boolean' });\r\n\t}\r\n\r\n\tconst [error, data] = await setFragmentLocked({ rootDir, file, locked });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(data);\r\n};\r\n"],"mappings":"kBAASA,MAAe,cACjBC,MAA8B,6EAC9BC,MAAuB,6DAE9B,MAAMC,EAAUH,cAAoBI,QAAS,4CAE9BC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBX,EAAyBO,EAAO,2BAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,EAAIC,OAAEA,GAAWb,EAAQc,KAEjC,IAAIF,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,GAAqB,kBAAXG,EACT,OAAOZ,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAOA,EAAOK,SAAcnB,EAAkB,CAAEC,UAASe,OAAMC,WAE/D,GAAGH,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKM","ignoreList":[]}
1
+ {"version":3,"file":"src\\kempo\\api\\fragments\\lock\\PUT.js","names":["resolve","join","currentUserHasPermission","setFragmentLocked","rootDir","dirname","includes","process","cwd","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","locked","body","data"],"sources":["0"],"sourcesContent":["import { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport setFragmentLocked from '../../../../../server/utils/fragments/setFragmentLocked.js';\r\n\r\nconst rootDir = import.meta.dirname.includes('node_modules') ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:update');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file, locked } = request.body;\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tif(typeof locked !== 'boolean'){\r\n\t\treturn response.status(400).json({ error: 'locked must be a boolean' });\r\n\t}\r\n\r\n\tconst [error, data] = await setFragmentLocked({ rootDir, file, locked });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(data);\r\n};\r\n"],"mappings":"kBAASA,UAASC,MAAY,cACvBC,MAA8B,6EAC9BC,MAAuB,6DAE9B,MAAMC,cAAsBC,QAAQC,SAAS,gBAAkBL,EAAKM,QAAQC,MAAO,UAAYR,cAAoBK,QAAS,4CAE7GI,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBd,EAAyBU,EAAO,2BAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,EAAIC,OAAEA,GAAWb,EAAQc,KAEjC,IAAIF,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,GAAqB,kBAAXG,EACT,OAAOZ,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAOA,EAAOK,SAActB,EAAkB,CAAEC,UAASkB,OAAMC,WAE/D,GAAGH,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKM","ignoreList":[]}