kempo 4.2.4 → 4.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +60 -0
- package/README.md +427 -0
- package/app-drizzle.config.js +14 -0
- package/app-public/.config.json +25 -0
- package/app-public/account/index.page.html +110 -0
- package/app-public/account/split2.template.html +36 -0
- package/app-public/default.template.html +24 -0
- package/app-public/forgot-password/index.page.html +79 -0
- package/app-public/index.page.html +16 -0
- package/app-public/init.js +2 -0
- package/app-public/kempo-global.global-disabled.html +0 -0
- package/app-public/kempo-global.global.html +6 -0
- package/app-public/login/index.page.html +51 -0
- package/app-public/manifest.json +87 -0
- package/app-public/media/hexagon.svg +22 -0
- package/app-public/media/icon-maskable.png +0 -0
- package/app-public/media/icon.svg +1 -0
- package/app-public/media/icon128.png +0 -0
- package/app-public/media/icon144.png +0 -0
- package/app-public/media/icon152.png +0 -0
- package/app-public/media/icon16-48.svg +19 -0
- package/app-public/media/icon16.png +0 -0
- package/app-public/media/icon192.png +0 -0
- package/app-public/media/icon256.png +0 -0
- package/app-public/media/icon32.png +0 -0
- package/app-public/media/icon384.png +0 -0
- package/app-public/media/icon48.png +0 -0
- package/app-public/media/icon512.png +0 -0
- package/app-public/media/icon64.png +0 -0
- package/app-public/media/icon72.png +0 -0
- package/app-public/media/icon96.png +0 -0
- package/app-public/media/kempo-fist.svg +21 -0
- package/app-public/media/nsx.jpg +0 -0
- package/app-public/nav.fragment.html +41 -0
- package/app-public/new-page.page.html +17 -0
- package/app-public/register/index.page.html +60 -0
- package/app-public/reset-password/[token]/index.html +123 -0
- package/app-public/reset-password/[token]/index.page.html +75 -0
- package/app-public/styles.css +1 -0
- package/app-public/test.page.html +20 -0
- package/app-public/verify-email/[token]/index.html +107 -0
- package/app-public/verify-email/[token]/index.page.html +59 -0
- package/app-public/verify-email/index.page.html +21 -0
- package/app-server/db/schema.js +19 -0
- package/bin/cli.js +468 -0
- package/dist/admin/accounts/groups/[name]/index.page.html +286 -0
- package/dist/admin/accounts/groups/index.page.html +171 -0
- package/dist/admin/accounts/permissions/index.page.html +193 -0
- package/dist/admin/accounts/users/[id]/index.page.html +314 -0
- package/dist/admin/accounts/users/index.page.html +160 -0
- package/dist/admin/components/AddGroupControl.js +6 -0
- package/dist/admin/components/AddGroupControl.js.map +1 -0
- package/dist/admin/components/ClearExpiredSessionsControl.js +6 -0
- package/dist/admin/components/ClearExpiredSessionsControl.js.map +1 -0
- package/dist/admin/components/FragmentEditor.js +101 -0
- package/dist/admin/components/FragmentEditor.js.map +1 -0
- package/dist/admin/components/GlobalContentEditor.js +85 -0
- package/dist/admin/components/GlobalContentEditor.js.map +1 -0
- package/dist/admin/components/GroupDeleteSelected.js +6 -0
- package/dist/admin/components/GroupDeleteSelected.js.map +1 -0
- package/dist/admin/components/GroupRemoveRecord.js +6 -0
- package/dist/admin/components/GroupRemoveRecord.js.map +1 -0
- package/dist/admin/components/Monaco.js +2 -0
- package/dist/admin/components/Monaco.js.map +1 -0
- package/dist/admin/components/PageEditor.js +138 -0
- package/dist/admin/components/PageEditor.js.map +1 -0
- package/dist/admin/components/TableRowDelete.js +4 -0
- package/dist/admin/components/TableRowDelete.js.map +1 -0
- package/dist/admin/components/TableRowLink.js +8 -0
- package/dist/admin/components/TableRowLink.js.map +1 -0
- package/dist/admin/components/TemplateEditor.js +125 -0
- package/dist/admin/components/TemplateEditor.js.map +1 -0
- package/dist/admin/components/ValueEditor.js +40 -0
- package/dist/admin/components/ValueEditor.js.map +1 -0
- package/dist/admin/components/tableControls/AddMember.js +6 -0
- package/dist/admin/components/tableControls/AddMember.js.map +1 -0
- package/dist/admin/components/tableControls/AddPermission.js +6 -0
- package/dist/admin/components/tableControls/AddPermission.js.map +1 -0
- package/dist/admin/components/tableControls/InstallExtension.js +6 -0
- package/dist/admin/components/tableControls/InstallExtension.js.map +1 -0
- package/dist/admin/components/tableControls/UninstallExtension.js +6 -0
- package/dist/admin/components/tableControls/UninstallExtension.js.map +1 -0
- package/dist/admin/content/fragments/edit/index.page.html +4 -0
- package/dist/admin/content/fragments/index.page.html +169 -0
- package/dist/admin/content/globals/edit/index.page.html +4 -0
- package/dist/admin/content/globals/index.page.html +152 -0
- package/dist/admin/content/pages/edit/index.page.html +4 -0
- package/dist/admin/content/pages/index.page.html +218 -0
- package/dist/admin/content/templates/edit/index.page.html +4 -0
- package/dist/admin/content/templates/index.page.html +193 -0
- package/dist/admin/default.template.html +9 -0
- package/dist/admin/extensions/index.page.html +32 -0
- package/dist/admin/icons/article.svg +1 -0
- package/dist/admin/icons/browse.svg +1 -0
- package/dist/admin/icons/cards_stack.svg +1 -0
- package/dist/admin/icons/content.svg +1 -0
- package/dist/admin/icons/docs.svg +1 -0
- package/dist/admin/icons/drive_file_move.svg +1 -0
- package/dist/admin/icons/extension.svg +1 -0
- package/dist/admin/icons/globe.svg +1 -0
- package/dist/admin/icons/group.svg +1 -0
- package/dist/admin/icons/lock.svg +1 -0
- package/dist/admin/icons/lock_add.svg +1 -0
- package/dist/admin/icons/manage-accounts.svg +1 -0
- package/dist/admin/icons/person.svg +1 -0
- package/dist/admin/icons/person_add.svg +1 -0
- package/dist/admin/icons/preview.svg +1 -0
- package/dist/admin/icons/save.svg +1 -0
- package/dist/admin/icons/segment.svg +1 -0
- package/dist/admin/icons/timer_off.svg +1 -0
- package/dist/admin/icons/web.svg +1 -0
- package/dist/admin/index.page.html +4 -0
- package/dist/admin/init.js +2 -0
- package/dist/admin/init.js.map +1 -0
- package/dist/admin/known-extensions.json +1 -0
- package/dist/admin/nav.fragment.html +20 -0
- package/dist/admin/settings/[owner]/[name]/index.page.html +260 -0
- package/dist/admin/settings/index.page.html +203 -0
- package/dist/kempo/api/admin-globals/DELETE.js +2 -0
- package/dist/kempo/api/admin-globals/DELETE.js.map +1 -0
- package/dist/kempo/api/admin-globals/GET.js +2 -0
- package/dist/kempo/api/admin-globals/GET.js.map +1 -0
- package/dist/kempo/api/admin-globals/POST.js +2 -0
- package/dist/kempo/api/admin-globals/POST.js.map +1 -0
- package/dist/kempo/api/admin-globals/[id]/GET.js +2 -0
- package/dist/kempo/api/admin-globals/[id]/GET.js.map +1 -0
- package/dist/kempo/api/admin-globals/[id]/PUT.js +2 -0
- package/dist/kempo/api/admin-globals/[id]/PUT.js.map +1 -0
- package/dist/kempo/api/admin-globals/[id]/disable/PUT.js +2 -0
- package/dist/kempo/api/admin-globals/[id]/disable/PUT.js.map +1 -0
- package/dist/kempo/api/admin-globals/[id]/enable/PUT.js +2 -0
- package/dist/kempo/api/admin-globals/[id]/enable/PUT.js.map +1 -0
- package/dist/kempo/api/auth/change-password/POST.js +2 -0
- package/dist/kempo/api/auth/change-password/POST.js.map +1 -0
- package/dist/kempo/api/auth/login/email/POST.js +2 -0
- package/dist/kempo/api/auth/login/email/POST.js.map +1 -0
- package/dist/kempo/api/auth/logout/POST.js +2 -0
- package/dist/kempo/api/auth/logout/POST.js.map +1 -0
- package/dist/kempo/api/auth/register/email/POST.js +2 -0
- package/dist/kempo/api/auth/register/email/POST.js.map +1 -0
- package/dist/kempo/api/auth/reset-password/POST.js +2 -0
- package/dist/kempo/api/auth/reset-password/POST.js.map +1 -0
- package/dist/kempo/api/auth/session/GET.js +2 -0
- package/dist/kempo/api/auth/session/GET.js.map +1 -0
- package/dist/kempo/api/auth/verify-email/POST.js +2 -0
- package/dist/kempo/api/auth/verify-email/POST.js.map +1 -0
- package/dist/kempo/api/extensions/DELETE.js +2 -0
- package/dist/kempo/api/extensions/DELETE.js.map +1 -0
- package/dist/kempo/api/extensions/GET.js +2 -0
- package/dist/kempo/api/extensions/GET.js.map +1 -0
- package/dist/kempo/api/extensions/POST.js +2 -0
- package/dist/kempo/api/extensions/POST.js.map +1 -0
- package/dist/kempo/api/extensions/[name]/disable/POST.js +2 -0
- package/dist/kempo/api/extensions/[name]/disable/POST.js.map +1 -0
- package/dist/kempo/api/extensions/[name]/enable/POST.js +2 -0
- package/dist/kempo/api/extensions/[name]/enable/POST.js.map +1 -0
- package/dist/kempo/api/extensions/[name]/update/POST.js +2 -0
- package/dist/kempo/api/extensions/[name]/update/POST.js.map +1 -0
- package/dist/kempo/api/extensions/[name]/update-check/GET.js +2 -0
- package/dist/kempo/api/extensions/[name]/update-check/GET.js.map +1 -0
- package/dist/kempo/api/extensions/available/GET.js +2 -0
- package/dist/kempo/api/extensions/available/GET.js.map +1 -0
- package/dist/kempo/api/extensions/known/GET.js +2 -0
- package/dist/kempo/api/extensions/known/GET.js.map +1 -0
- package/dist/kempo/api/forgot-password/POST.js +2 -0
- package/dist/kempo/api/forgot-password/POST.js.map +1 -0
- package/dist/kempo/api/fragments/DELETE.js +2 -0
- package/dist/kempo/api/fragments/DELETE.js.map +1 -0
- package/dist/kempo/api/fragments/GET.js +2 -0
- package/dist/kempo/api/fragments/GET.js.map +1 -0
- package/dist/kempo/api/fragments/POST.js +2 -0
- package/dist/kempo/api/fragments/POST.js.map +1 -0
- package/dist/kempo/api/fragments/disable/PUT.js +2 -0
- package/dist/kempo/api/fragments/disable/PUT.js.map +1 -0
- package/dist/kempo/api/fragments/enable/PUT.js +2 -0
- package/dist/kempo/api/fragments/enable/PUT.js.map +1 -0
- package/dist/kempo/api/fragments/file/GET.js +2 -0
- package/dist/kempo/api/fragments/file/GET.js.map +1 -0
- package/dist/kempo/api/fragments/file/PATCH.js +2 -0
- package/dist/kempo/api/fragments/file/PATCH.js.map +1 -0
- package/dist/kempo/api/fragments/file/PUT.js +2 -0
- package/dist/kempo/api/fragments/file/PUT.js.map +1 -0
- package/dist/kempo/api/globals/DELETE.js +2 -0
- package/dist/kempo/api/globals/DELETE.js.map +1 -0
- package/dist/kempo/api/globals/GET.js +2 -0
- package/dist/kempo/api/globals/GET.js.map +1 -0
- package/dist/kempo/api/globals/POST.js +2 -0
- package/dist/kempo/api/globals/POST.js.map +1 -0
- package/dist/kempo/api/globals/disable/PUT.js +2 -0
- package/dist/kempo/api/globals/disable/PUT.js.map +1 -0
- package/dist/kempo/api/globals/enable/PUT.js +2 -0
- package/dist/kempo/api/globals/enable/PUT.js.map +1 -0
- package/dist/kempo/api/globals/entry/GET.js +2 -0
- package/dist/kempo/api/globals/entry/GET.js.map +1 -0
- package/dist/kempo/api/globals/entry/PUT.js +2 -0
- package/dist/kempo/api/globals/entry/PUT.js.map +1 -0
- package/dist/kempo/api/groups/DELETE.js +2 -0
- package/dist/kempo/api/groups/DELETE.js.map +1 -0
- package/dist/kempo/api/groups/GET.js +2 -0
- package/dist/kempo/api/groups/GET.js.map +1 -0
- package/dist/kempo/api/groups/PATCH.js +2 -0
- package/dist/kempo/api/groups/PATCH.js.map +1 -0
- package/dist/kempo/api/groups/POST.js +2 -0
- package/dist/kempo/api/groups/POST.js.map +1 -0
- package/dist/kempo/api/groups/[name]/GET.js +2 -0
- package/dist/kempo/api/groups/[name]/GET.js.map +1 -0
- package/dist/kempo/api/groups/[name]/members/DELETE.js +2 -0
- package/dist/kempo/api/groups/[name]/members/DELETE.js.map +1 -0
- package/dist/kempo/api/groups/[name]/members/GET.js +2 -0
- package/dist/kempo/api/groups/[name]/members/GET.js.map +1 -0
- package/dist/kempo/api/groups/[name]/members/POST.js +2 -0
- package/dist/kempo/api/groups/[name]/members/POST.js.map +1 -0
- package/dist/kempo/api/groups/[name]/permissions/DELETE.js +2 -0
- package/dist/kempo/api/groups/[name]/permissions/DELETE.js.map +1 -0
- package/dist/kempo/api/groups/[name]/permissions/GET.js +2 -0
- package/dist/kempo/api/groups/[name]/permissions/GET.js.map +1 -0
- package/dist/kempo/api/groups/[name]/permissions/POST.js +2 -0
- package/dist/kempo/api/groups/[name]/permissions/POST.js.map +1 -0
- package/dist/kempo/api/pages/DELETE.js +2 -0
- package/dist/kempo/api/pages/DELETE.js.map +1 -0
- package/dist/kempo/api/pages/GET.js +2 -0
- package/dist/kempo/api/pages/GET.js.map +1 -0
- package/dist/kempo/api/pages/POST.js +2 -0
- package/dist/kempo/api/pages/POST.js.map +1 -0
- package/dist/kempo/api/pages/directories/GET.js +2 -0
- package/dist/kempo/api/pages/directories/GET.js.map +1 -0
- package/dist/kempo/api/pages/disable/PUT.js +2 -0
- package/dist/kempo/api/pages/disable/PUT.js.map +1 -0
- package/dist/kempo/api/pages/enable/PUT.js +2 -0
- package/dist/kempo/api/pages/enable/PUT.js.map +1 -0
- package/dist/kempo/api/pages/file/GET.js +2 -0
- package/dist/kempo/api/pages/file/GET.js.map +1 -0
- package/dist/kempo/api/pages/file/PATCH.js +2 -0
- package/dist/kempo/api/pages/file/PATCH.js.map +1 -0
- package/dist/kempo/api/pages/file/PUT.js +2 -0
- package/dist/kempo/api/pages/file/PUT.js.map +1 -0
- package/dist/kempo/api/pages/templates/GET.js +2 -0
- package/dist/kempo/api/pages/templates/GET.js.map +1 -0
- package/dist/kempo/api/permissions/DELETE.js +2 -0
- package/dist/kempo/api/permissions/DELETE.js.map +1 -0
- package/dist/kempo/api/permissions/GET.js +2 -0
- package/dist/kempo/api/permissions/GET.js.map +1 -0
- package/dist/kempo/api/permissions/PATCH.js +2 -0
- package/dist/kempo/api/permissions/PATCH.js.map +1 -0
- package/dist/kempo/api/permissions/POST.js +2 -0
- package/dist/kempo/api/permissions/POST.js.map +1 -0
- package/dist/kempo/api/settings/[owner]/GET.js +2 -0
- package/dist/kempo/api/settings/[owner]/GET.js.map +1 -0
- package/dist/kempo/api/settings/[owner]/[name]/DELETE.js +2 -0
- package/dist/kempo/api/settings/[owner]/[name]/DELETE.js.map +1 -0
- package/dist/kempo/api/settings/[owner]/[name]/GET.js +2 -0
- package/dist/kempo/api/settings/[owner]/[name]/GET.js.map +1 -0
- package/dist/kempo/api/settings/[owner]/[name]/POST.js +2 -0
- package/dist/kempo/api/settings/[owner]/[name]/POST.js.map +1 -0
- package/dist/kempo/api/settings/public/GET.js +2 -0
- package/dist/kempo/api/settings/public/GET.js.map +1 -0
- package/dist/kempo/api/templates/DELETE.js +2 -0
- package/dist/kempo/api/templates/DELETE.js.map +1 -0
- package/dist/kempo/api/templates/GET.js +2 -0
- package/dist/kempo/api/templates/GET.js.map +1 -0
- package/dist/kempo/api/templates/POST.js +2 -0
- package/dist/kempo/api/templates/POST.js.map +1 -0
- package/dist/kempo/api/templates/disable/PUT.js +2 -0
- package/dist/kempo/api/templates/disable/PUT.js.map +1 -0
- package/dist/kempo/api/templates/enable/PUT.js +2 -0
- package/dist/kempo/api/templates/enable/PUT.js.map +1 -0
- package/dist/kempo/api/templates/file/GET.js +2 -0
- package/dist/kempo/api/templates/file/GET.js.map +1 -0
- package/dist/kempo/api/templates/file/PATCH.js +2 -0
- package/dist/kempo/api/templates/file/PATCH.js.map +1 -0
- package/dist/kempo/api/templates/file/PUT.js +2 -0
- package/dist/kempo/api/templates/file/PUT.js.map +1 -0
- package/dist/kempo/api/user/DELETE.js +2 -0
- package/dist/kempo/api/user/DELETE.js.map +1 -0
- package/dist/kempo/api/user/GET.js +2 -0
- package/dist/kempo/api/user/GET.js.map +1 -0
- package/dist/kempo/api/user/PATCH.js +2 -0
- package/dist/kempo/api/user/PATCH.js.map +1 -0
- package/dist/kempo/api/user/[userid]/GET.js +2 -0
- package/dist/kempo/api/user/[userid]/GET.js.map +1 -0
- package/dist/kempo/api/user/[userid]/groups/DELETE.js +2 -0
- package/dist/kempo/api/user/[userid]/groups/DELETE.js.map +1 -0
- package/dist/kempo/api/user/[userid]/groups/GET.js +2 -0
- package/dist/kempo/api/user/[userid]/groups/GET.js.map +1 -0
- package/dist/kempo/api/user/[userid]/groups/POST.js +2 -0
- package/dist/kempo/api/user/[userid]/groups/POST.js.map +1 -0
- package/dist/kempo/api/user/[userid]/permissions/GET.js +2 -0
- package/dist/kempo/api/user/[userid]/permissions/GET.js.map +1 -0
- package/dist/kempo/api/user/[userid]/permissions/all/GET.js +2 -0
- package/dist/kempo/api/user/[userid]/permissions/all/GET.js.map +1 -0
- package/dist/kempo/api/user/[userid]/permissions/list/GET.js +2 -0
- package/dist/kempo/api/user/[userid]/permissions/list/GET.js.map +1 -0
- package/dist/kempo/api/user/[userid]/permissions/some/GET.js +2 -0
- package/dist/kempo/api/user/[userid]/permissions/some/GET.js.map +1 -0
- package/dist/kempo/api/user/[userid]/sessions/DELETE.js +2 -0
- package/dist/kempo/api/user/[userid]/sessions/DELETE.js.map +1 -0
- package/dist/kempo/api/user/[userid]/sessions/GET.js +2 -0
- package/dist/kempo/api/user/[userid]/sessions/GET.js.map +1 -0
- package/dist/kempo/api/user/[userid]/sessions/expired/DELETE.js +2 -0
- package/dist/kempo/api/user/[userid]/sessions/expired/DELETE.js.map +1 -0
- package/dist/kempo/api/user/create/POST.js +2 -0
- package/dist/kempo/api/user/create/POST.js.map +1 -0
- package/dist/kempo/api/user/search/GET.js +2 -0
- package/dist/kempo/api/user/search/GET.js.map +1 -0
- package/dist/kempo/components/LogoutBtn.js +2 -0
- package/dist/kempo/components/LogoutBtn.js.map +1 -0
- package/dist/kempo/components/Menu.js +17 -0
- package/dist/kempo/components/Menu.js.map +1 -0
- package/dist/kempo/components/Permission.js +2 -0
- package/dist/kempo/components/Permission.js.map +1 -0
- package/dist/kempo/components/Role.js +2 -0
- package/dist/kempo/components/Role.js.map +1 -0
- package/dist/kempo/components/UserCreatedAt.js +2 -0
- package/dist/kempo/components/UserCreatedAt.js.map +1 -0
- package/dist/kempo/components/UserEmail.js +2 -0
- package/dist/kempo/components/UserEmail.js.map +1 -0
- package/dist/kempo/components/UserEmailVerified.js +2 -0
- package/dist/kempo/components/UserEmailVerified.js.map +1 -0
- package/dist/kempo/components/UserName.js +2 -0
- package/dist/kempo/components/UserName.js.map +1 -0
- package/dist/kempo/fetch.js +2 -0
- package/dist/kempo/fetch.js.map +1 -0
- package/dist/kempo/icons/format_indent_decrease.svg +1 -0
- package/dist/kempo/icons/format_indent_increase.svg +1 -0
- package/dist/kempo/icons/format_quote.svg +1 -0
- package/dist/kempo/icons/redo.svg +1 -0
- package/dist/kempo/icons/restart_alt.svg +1 -0
- package/dist/kempo/icons/subscript.svg +1 -0
- package/dist/kempo/icons/superscript.svg +1 -0
- package/dist/kempo/icons/undo.svg +1 -0
- package/dist/kempo/sdk.js +2 -0
- package/dist/kempo/sdk.js.map +1 -0
- package/middleware/extension-scope-router.js +255 -0
- package/middleware/kempo-auth.js +26 -0
- package/package.json +46 -19
- package/scripts/init-db.js +211 -0
- package/server/db/index.js +24 -0
- package/server/db/schema.js +173 -0
- package/server/sdk.js +192 -0
- package/server/utils/admin-global-content/createAdminGlobalContent.js +43 -0
- package/server/utils/admin-global-content/deleteAdminGlobalContent.js +34 -0
- package/server/utils/admin-global-content/deleteAdminGlobalContentByOwner.js +26 -0
- package/server/utils/admin-global-content/disableAdminGlobalContent.js +33 -0
- package/server/utils/admin-global-content/enableAdminGlobalContent.js +33 -0
- package/server/utils/admin-global-content/getAdminGlobalContent.js +28 -0
- package/server/utils/admin-global-content/helpers.js +47 -0
- package/server/utils/admin-global-content/listAdminGlobalContent.js +20 -0
- package/server/utils/admin-global-content/updateAdminGlobalContent.js +41 -0
- package/server/utils/auth/changePassword.js +27 -0
- package/server/utils/auth/getSession.js +35 -0
- package/server/utils/auth/loginEmail.js +66 -0
- package/server/utils/auth/logout.js +16 -0
- package/server/utils/auth/registerEmail.js +105 -0
- package/server/utils/auth/requestPasswordReset.js +62 -0
- package/server/utils/auth/resetPassword.js +58 -0
- package/server/utils/auth/sendVerificationEmail.js +57 -0
- package/server/utils/auth/verifyEmail.js +46 -0
- package/server/utils/email/sendEmail.js +42 -0
- package/server/utils/email/sendEmailFromTemplate.js +45 -0
- package/server/utils/extensions/checkExtensionUpdate.js +56 -0
- package/server/utils/extensions/createTablesFromSchema.js +57 -0
- package/server/utils/extensions/disableExtension.js +26 -0
- package/server/utils/extensions/enableExtension.js +26 -0
- package/server/utils/extensions/getExtension.js +34 -0
- package/server/utils/extensions/installExtension.js +134 -0
- package/server/utils/extensions/listExtensions.js +36 -0
- package/server/utils/extensions/scopeCache.js +18 -0
- package/server/utils/extensions/uninstallExtension.js +88 -0
- package/server/utils/extensions/updateExtension.js +159 -0
- package/server/utils/fragments/createFragment.js +57 -0
- package/server/utils/fragments/deleteFragment.js +35 -0
- package/server/utils/fragments/disableFragment.js +37 -0
- package/server/utils/fragments/enableFragment.js +30 -0
- package/server/utils/fragments/getFragment.js +36 -0
- package/server/utils/fragments/listFragments.js +32 -0
- package/server/utils/fragments/moveFragment.js +54 -0
- package/server/utils/fragments/updateFragment.js +58 -0
- package/server/utils/fs/parseFrontmatter.js +13 -0
- package/server/utils/fs/scanDir.js +26 -0
- package/server/utils/global-content/createGlobalContent.js +58 -0
- package/server/utils/global-content/deleteGlobalContent.js +52 -0
- package/server/utils/global-content/disableGlobalContent.js +57 -0
- package/server/utils/global-content/enableGlobalContent.js +53 -0
- package/server/utils/global-content/getGlobalContent.js +28 -0
- package/server/utils/global-content/helpers.js +33 -0
- package/server/utils/global-content/listGlobalContent.js +24 -0
- package/server/utils/global-content/updateGlobalContent.js +56 -0
- package/server/utils/groups/addUserToGroup.js +46 -0
- package/server/utils/groups/createGroup.js +32 -0
- package/server/utils/groups/deleteGroup.js +29 -0
- package/server/utils/groups/getGroup.js +25 -0
- package/server/utils/groups/getGroupMembers.js +33 -0
- package/server/utils/groups/listGroups.js +21 -0
- package/server/utils/groups/removeUserFromGroup.js +31 -0
- package/server/utils/groups/updateGroup.js +54 -0
- package/server/utils/hooks/createHook.js +29 -0
- package/server/utils/hooks/deleteHook.js +19 -0
- package/server/utils/hooks/getHook.js +19 -0
- package/server/utils/hooks/listHooks.js +30 -0
- package/server/utils/hooks/triggerHook.js +61 -0
- package/server/utils/hooks/updateHook.js +27 -0
- package/server/utils/pages/createPage.js +60 -0
- package/server/utils/pages/deletePage.js +35 -0
- package/server/utils/pages/disablePage.js +37 -0
- package/server/utils/pages/enablePage.js +30 -0
- package/server/utils/pages/getPage.js +53 -0
- package/server/utils/pages/listDirectories.js +18 -0
- package/server/utils/pages/listPages.js +40 -0
- package/server/utils/pages/listTemplates.js +52 -0
- package/server/utils/pages/movePage.js +54 -0
- package/server/utils/pages/updatePage.js +74 -0
- package/server/utils/permissions/addPermissionToGroup.js +43 -0
- package/server/utils/permissions/createPermission.js +43 -0
- package/server/utils/permissions/currentUserHasAllPermissions.js +24 -0
- package/server/utils/permissions/currentUserHasPermission.js +24 -0
- package/server/utils/permissions/currentUserHasSomePermissions.js +24 -0
- package/server/utils/permissions/deletePermission.js +29 -0
- package/server/utils/permissions/getAllPermissions.js +21 -0
- package/server/utils/permissions/getPermissionsForGroups.js +26 -0
- package/server/utils/permissions/getUserGroups.js +31 -0
- package/server/utils/permissions/getUserPermission.js +30 -0
- package/server/utils/permissions/getUserPermissions.js +16 -0
- package/server/utils/permissions/removePermissionFromGroup.js +31 -0
- package/server/utils/permissions/updatePermission.js +33 -0
- package/server/utils/permissions/userHasAllPermissions.js +31 -0
- package/server/utils/permissions/userHasPermission.js +13 -0
- package/server/utils/permissions/userHasSomePermissions.js +31 -0
- package/server/utils/sessions/createSession.js +36 -0
- package/server/utils/sessions/deleteExpiredUserSessions.js +22 -0
- package/server/utils/sessions/deleteSession.js +16 -0
- package/server/utils/sessions/deleteUserSessions.js +16 -0
- package/server/utils/sessions/getSessionById.js +21 -0
- package/server/utils/sessions/getSessionByToken.js +21 -0
- package/server/utils/sessions/getSessions.js +19 -0
- package/server/utils/sessions/getUserSessions.js +30 -0
- package/server/utils/settings/deleteSetting.js +24 -0
- package/server/utils/settings/getPublicSettings.js +22 -0
- package/server/utils/settings/getSetting.js +25 -0
- package/server/utils/settings/getSettingWithMetadata.js +33 -0
- package/server/utils/settings/getSettingsByOwner.js +23 -0
- package/server/utils/settings/helpers.js +29 -0
- package/server/utils/settings/listSettings.js +25 -0
- package/server/utils/settings/setSetting.js +49 -0
- package/server/utils/templates/createTemplate.js +71 -0
- package/server/utils/templates/deleteTemplate.js +35 -0
- package/server/utils/templates/disableTemplate.js +37 -0
- package/server/utils/templates/enableTemplate.js +30 -0
- package/server/utils/templates/getTemplate.js +30 -0
- package/server/utils/templates/moveTemplate.js +54 -0
- package/server/utils/templates/updateTemplate.js +46 -0
- package/server/utils/users/createUser.js +60 -0
- package/server/utils/users/deleteUser.js +19 -0
- package/server/utils/users/findUsersByEmail.js +35 -0
- package/server/utils/users/findUsersByName.js +35 -0
- package/server/utils/users/getUserByEmail.js +26 -0
- package/server/utils/users/getUserById.js +27 -0
- package/server/utils/users/getUsers.js +26 -0
- package/server/utils/users/searchUsers.js +53 -0
- package/server/utils/users/updateUser.js +38 -0
- package/.gitattributes +0 -2
- package/LICENSE +0 -21
- package/dist/components/Accordion.js +0 -1
- package/dist/components/Card.js +0 -1
- package/dist/components/Collapsible.js +0 -1
- package/dist/components/Component.js +0 -1
- package/dist/components/ContentSlider.js +0 -1
- package/dist/components/Dialog.js +0 -1
- package/dist/components/DirectoryViewer.js +0 -1
- package/dist/components/FocusCapture.js +0 -1
- package/dist/components/Icon.js +0 -1
- package/dist/components/Import.js +0 -1
- package/dist/components/LazyComponent.js +0 -1
- package/dist/components/PersistantCollapsible.js +0 -1
- package/dist/components/PhotoViewer.js +0 -1
- package/dist/components/ReactiveComponent.js +0 -1
- package/dist/components/ReactiveLazyComponent.js +0 -1
- package/dist/components/Resize.js +0 -1
- package/dist/components/Search.js +0 -1
- package/dist/components/ShowMore.js +0 -1
- package/dist/components/SideMenu.js +0 -1
- package/dist/components/Sortable.js +0 -1
- package/dist/components/Split.js +0 -1
- package/dist/components/Stacks.js +0 -1
- package/dist/components/Table.js +0 -1
- package/dist/components/Tabs.js +0 -1
- package/dist/components/Tags.js +0 -1
- package/dist/components/ThemeSwitcher.js +0 -1
- package/dist/components/Timestamp.js +0 -1
- package/dist/components/Toast.js +0 -1
- package/dist/components/Toggle.js +0 -1
- package/dist/components/tableControls/DeleteRecord.js +0 -1
- package/dist/components/tableControls/DeleteSelected.js +0 -1
- package/dist/components/tableControls/Edit.js +0 -1
- package/dist/components/tableControls/ExportCSV.js +0 -1
- package/dist/components/tableControls/ExportJson.js +0 -1
- package/dist/components/tableControls/FieldSortHide.js +0 -1
- package/dist/components/tableControls/Filters.js +0 -1
- package/dist/components/tableControls/FirstPage.js +0 -1
- package/dist/components/tableControls/HiddenCount.js +0 -1
- package/dist/components/tableControls/Hide.js +0 -1
- package/dist/components/tableControls/LastPage.js +0 -1
- package/dist/components/tableControls/NextPage.js +0 -1
- package/dist/components/tableControls/PageSelect.js +0 -1
- package/dist/components/tableControls/PageSize.js +0 -1
- package/dist/components/tableControls/PrevPage.js +0 -1
- package/dist/components/tableControls/Search.js +0 -1
- package/dist/components/tableControls/SelectCount.js +0 -1
- package/dist/components/tableControls/ShowAll.js +0 -1
- package/dist/components/tableControls/ShowHideFields.js +0 -1
- package/dist/components/tableControls/TableControl.js +0 -1
- package/dist/kempo-hljs.css +0 -1
- package/dist/kempo-styles.css +0 -1
- package/dist/kempo-vars.css +0 -1
- package/dist/utils/Server.js +0 -1
- package/dist/utils/cli.js +0 -1
- package/dist/utils/cookie.js +0 -1
- package/dist/utils/debounce.js +0 -1
- package/dist/utils/drag.js +0 -1
- package/dist/utils/element.js +0 -1
- package/dist/utils/files.js +0 -1
- package/dist/utils/formatTimestamp.js +0 -1
- package/dist/utils/fs-utils.js +0 -1
- package/dist/utils/fuzzyMatch.js +0 -1
- package/dist/utils/getPreferredTheme.js +0 -1
- package/dist/utils/loadCss.js +0 -1
- package/dist/utils/loadScript.js +0 -1
- package/dist/utils/minify.js +0 -1
- package/dist/utils/object.js +0 -1
- package/dist/utils/raf.js +0 -1
- package/dist/utils/string.js +0 -1
- package/dist/utils/toFunction.js +0 -1
- package/dist/utils/type.js +0 -1
- package/dist/utils/waitFrames.js +0 -1
- package/dist/utils/watchDirectoryHandle.js +0 -1
- package/dist/utils/watchWindowSize.js +0 -1
- package/docs/components/_template.html +0 -77
- package/docs/components/accordion.html +0 -124
- package/docs/components/card.html +0 -93
- package/docs/components/component.html +0 -92
- package/docs/components/content-slider.html +0 -195
- package/docs/components/dialog.html +0 -247
- package/docs/components/directory-viewer.html +0 -92
- package/docs/components/focus-capture.html +0 -70
- package/docs/components/icon.html +0 -160
- package/docs/components/import.html +0 -79
- package/docs/components/lazy-component.html +0 -86
- package/docs/components/reactive-component.html +0 -71
- package/docs/components/reactive-lazy-component.html +0 -71
- package/docs/components/resize.html +0 -154
- package/docs/components/search.html +0 -104
- package/docs/components/show-more.html +0 -125
- package/docs/components/side-menu.html +0 -148
- package/docs/components/sortable.html +0 -98
- package/docs/components/split.html +0 -128
- package/docs/components/table.html +0 -314
- package/docs/components/tableControls.html +0 -79
- package/docs/components/tableCustomFields.html +0 -115
- package/docs/components/tableFetchRecords.html +0 -116
- package/docs/components/tableFieldSortHide.html +0 -77
- package/docs/components/tablePagination.html +0 -102
- package/docs/components/tableRecordEditing.html +0 -146
- package/docs/components/tableRecordFiltering.html +0 -77
- package/docs/components/tableRecordHiding.html +0 -82
- package/docs/components/tableRecordSearching.html +0 -77
- package/docs/components/tableRecordSelection.html +0 -77
- package/docs/components/tableRowControls.html +0 -80
- package/docs/components/tableSorting.html +0 -75
- package/docs/components/tabs.html +0 -165
- package/docs/components/tags.html +0 -96
- package/docs/components/theme-switcher.html +0 -76
- package/docs/components/timestamp.html +0 -88
- package/docs/components/toast.html +0 -330
- package/docs/components/toggle.html +0 -157
- package/docs/icons/add.svg +0 -1
- package/docs/icons/arrow-back.svg +0 -1
- package/docs/icons/arrow-down-double.svg +0 -1
- package/docs/icons/arrow-down.svg +0 -1
- package/docs/icons/arrow-forward.svg +0 -1
- package/docs/icons/arrow-up-double.svg +0 -1
- package/docs/icons/arrow-up.svg +0 -1
- package/docs/icons/cards.svg +0 -1
- package/docs/icons/check.svg +0 -1
- package/docs/icons/chevron-left.svg +0 -1
- package/docs/icons/chevron-right.svg +0 -1
- package/docs/icons/close.svg +0 -2
- package/docs/icons/compare.svg +0 -1
- package/docs/icons/delete.svg +0 -1
- package/docs/icons/drag-handle.svg +0 -1
- package/docs/icons/drawing2.svg +0 -124
- package/docs/icons/edit.svg +0 -1
- package/docs/icons/error.svg +0 -1
- package/docs/icons/export-file.svg +0 -1
- package/docs/icons/file-text.svg +0 -1
- package/docs/icons/file.svg +0 -1
- package/docs/icons/filter-off.svg +0 -1
- package/docs/icons/filter.svg +0 -1
- package/docs/icons/first.svg +0 -1
- package/docs/icons/folder-clear.svg +0 -1
- package/docs/icons/folder-create.svg +0 -1
- package/docs/icons/folder-open.svg +0 -1
- package/docs/icons/folder.svg +0 -1
- package/docs/icons/hide.svg +0 -1
- package/docs/icons/image.svg +0 -1
- package/docs/icons/label-add.svg +0 -1
- package/docs/icons/label.svg +0 -1
- package/docs/icons/last.svg +0 -1
- package/docs/icons/menu.svg +0 -1
- package/docs/icons/mode-auto.svg +0 -1
- package/docs/icons/mode-dark.svg +0 -1
- package/docs/icons/mode-light.svg +0 -1
- package/docs/icons/open-in-browser.svg +0 -1
- package/docs/icons/pause.svg +0 -1
- package/docs/icons/play.svg +0 -1
- package/docs/icons/refresh.svg +0 -1
- package/docs/icons/remove.svg +0 -1
- package/docs/icons/save.svg +0 -1
- package/docs/icons/search.svg +0 -1
- package/docs/icons/settings.svg +0 -1
- package/docs/icons/storage.svg +0 -1
- package/docs/icons/table-visibility.svg +0 -1
- package/docs/icons/tag.svg +0 -1
- package/docs/icons/tools.svg +0 -1
- package/docs/icons/trash-x.svg +0 -1
- package/docs/icons/warning.svg +0 -1
- package/docs/index.html +0 -21
- package/docs/js/nav.inc.js +0 -4
- package/docs/kempo/components/Accordion.js +0 -1
- package/docs/kempo/components/Card.js +0 -1
- package/docs/kempo/components/Collapsible.js +0 -1
- package/docs/kempo/components/Component.js +0 -1
- package/docs/kempo/components/ContentSlider.js +0 -1
- package/docs/kempo/components/Dialog.js +0 -1
- package/docs/kempo/components/DirectoryViewer.js +0 -1
- package/docs/kempo/components/FocusCapture.js +0 -1
- package/docs/kempo/components/Icon.js +0 -1
- package/docs/kempo/components/Import.js +0 -1
- package/docs/kempo/components/LazyComponent.js +0 -1
- package/docs/kempo/components/PersistantCollapsible.js +0 -1
- package/docs/kempo/components/PhotoViewer.js +0 -1
- package/docs/kempo/components/ReactiveComponent.js +0 -1
- package/docs/kempo/components/ReactiveLazyComponent.js +0 -1
- package/docs/kempo/components/Resize.js +0 -1
- package/docs/kempo/components/Search.js +0 -1
- package/docs/kempo/components/ShowMore.js +0 -1
- package/docs/kempo/components/SideMenu.js +0 -1
- package/docs/kempo/components/Sortable.js +0 -1
- package/docs/kempo/components/Split.js +0 -1
- package/docs/kempo/components/Stacks.js +0 -1
- package/docs/kempo/components/Table.js +0 -1
- package/docs/kempo/components/Tabs.js +0 -1
- package/docs/kempo/components/Tags.js +0 -1
- package/docs/kempo/components/ThemeSwitcher.js +0 -1
- package/docs/kempo/components/Timestamp.js +0 -1
- package/docs/kempo/components/Toast.js +0 -1
- package/docs/kempo/components/Toggle.js +0 -1
- package/docs/kempo/components/tableControls/DeleteRecord.js +0 -1
- package/docs/kempo/components/tableControls/DeleteSelected.js +0 -1
- package/docs/kempo/components/tableControls/Edit.js +0 -1
- package/docs/kempo/components/tableControls/ExportCSV.js +0 -1
- package/docs/kempo/components/tableControls/ExportJson.js +0 -1
- package/docs/kempo/components/tableControls/FieldSortHide.js +0 -1
- package/docs/kempo/components/tableControls/Filters.js +0 -1
- package/docs/kempo/components/tableControls/FirstPage.js +0 -1
- package/docs/kempo/components/tableControls/HiddenCount.js +0 -1
- package/docs/kempo/components/tableControls/Hide.js +0 -1
- package/docs/kempo/components/tableControls/LastPage.js +0 -1
- package/docs/kempo/components/tableControls/NextPage.js +0 -1
- package/docs/kempo/components/tableControls/PageSelect.js +0 -1
- package/docs/kempo/components/tableControls/PageSize.js +0 -1
- package/docs/kempo/components/tableControls/PrevPage.js +0 -1
- package/docs/kempo/components/tableControls/Search.js +0 -1
- package/docs/kempo/components/tableControls/SelectCount.js +0 -1
- package/docs/kempo/components/tableControls/ShowAll.js +0 -1
- package/docs/kempo/components/tableControls/ShowHideFields.js +0 -1
- package/docs/kempo/components/tableControls/TableControl.js +0 -1
- package/docs/kempo/index.js +0 -1
- package/docs/kempo/kempo-hljs.css +0 -1
- package/docs/kempo/kempo-styles.css +0 -1
- package/docs/kempo/kempo-vars.css +0 -1
- package/docs/kempo/utils/Server.js +0 -1
- package/docs/kempo/utils/cli.js +0 -1
- package/docs/kempo/utils/cookie.js +0 -1
- package/docs/kempo/utils/debounce.js +0 -1
- package/docs/kempo/utils/drag.js +0 -1
- package/docs/kempo/utils/element.js +0 -1
- package/docs/kempo/utils/files.js +0 -1
- package/docs/kempo/utils/formatTimestamp.js +0 -1
- package/docs/kempo/utils/fs-utils.js +0 -1
- package/docs/kempo/utils/fuzzyMatch.js +0 -1
- package/docs/kempo/utils/getPreferredTheme.js +0 -1
- package/docs/kempo/utils/loadCss.js +0 -1
- package/docs/kempo/utils/loadScript.js +0 -1
- package/docs/kempo/utils/minify.js +0 -1
- package/docs/kempo/utils/object.js +0 -1
- package/docs/kempo/utils/raf.js +0 -1
- package/docs/kempo/utils/string.js +0 -1
- package/docs/kempo/utils/toFunction.js +0 -1
- package/docs/kempo/utils/type.js +0 -1
- package/docs/kempo/utils/waitFrames.js +0 -1
- package/docs/kempo/utils/watchDirectoryHandle.js +0 -1
- package/docs/kempo/utils/watchWindowSize.js +0 -1
- package/docs/nav.inc.html +0 -74
- package/docs/search.json +0 -400
- package/docs/styles/_template.html +0 -26
- package/docs/styles/borders-spacing.html +0 -197
- package/docs/styles/buttons.html +0 -117
- package/docs/styles/colors.html +0 -69
- package/docs/styles/displays-layouts.html +0 -162
- package/docs/styles/embed-1.html +0 -40
- package/docs/styles/inputs.html +0 -93
- package/docs/styles/tables.html +0 -147
- package/docs/styles/typography.html +0 -120
- package/docs/utils/Server.html +0 -119
- package/docs/utils/_template.html +0 -77
- package/docs/utils/cli.html +0 -86
- package/docs/utils/cookie.html +0 -89
- package/docs/utils/debounce.html +0 -63
- package/docs/utils/drag.html +0 -87
- package/docs/utils/element.html +0 -126
- package/docs/utils/format-timestamp.html +0 -66
- package/docs/utils/fuzzy-match.html +0 -60
- package/icons/add.svg +0 -1
- package/icons/arrow-back.svg +0 -1
- package/icons/arrow-down-double.svg +0 -1
- package/icons/arrow-down.svg +0 -1
- package/icons/arrow-forward.svg +0 -1
- package/icons/arrow-up-double.svg +0 -1
- package/icons/arrow-up.svg +0 -1
- package/icons/cards.svg +0 -1
- package/icons/check.svg +0 -1
- package/icons/chevron-left.svg +0 -1
- package/icons/chevron-right.svg +0 -1
- package/icons/close.svg +0 -2
- package/icons/compare.svg +0 -1
- package/icons/delete.svg +0 -1
- package/icons/drag-handle.svg +0 -1
- package/icons/drawing2.svg +0 -124
- package/icons/edit.svg +0 -1
- package/icons/error.svg +0 -1
- package/icons/export-file.svg +0 -1
- package/icons/file-text.svg +0 -1
- package/icons/file.svg +0 -1
- package/icons/filter-off.svg +0 -1
- package/icons/filter.svg +0 -1
- package/icons/first.svg +0 -1
- package/icons/folder-clear.svg +0 -1
- package/icons/folder-create.svg +0 -1
- package/icons/folder-open.svg +0 -1
- package/icons/folder.svg +0 -1
- package/icons/hide.svg +0 -1
- package/icons/image.svg +0 -1
- package/icons/label-add.svg +0 -1
- package/icons/label.svg +0 -1
- package/icons/last.svg +0 -1
- package/icons/menu.svg +0 -1
- package/icons/mode-auto.svg +0 -1
- package/icons/mode-dark.svg +0 -1
- package/icons/mode-light.svg +0 -1
- package/icons/open-in-browser.svg +0 -1
- package/icons/pause.svg +0 -1
- package/icons/play.svg +0 -1
- package/icons/refresh.svg +0 -1
- package/icons/remove.svg +0 -1
- package/icons/save.svg +0 -1
- package/icons/search.svg +0 -1
- package/icons/settings.svg +0 -1
- package/icons/show.svg +0 -1
- package/icons/storage.svg +0 -1
- package/icons/table-visibility.svg +0 -1
- package/icons/tag.svg +0 -1
- package/icons/tools.svg +0 -1
- package/icons/trash-x.svg +0 -1
- package/icons/warning.svg +0 -1
- package/scripts/build.js +0 -154
- package/scripts/docs.js +0 -47
- package/src/components/Accordion.js +0 -182
- package/src/components/Card.js +0 -62
- package/src/components/Collapsible.js +0 -104
- package/src/components/Component.js +0 -110
- package/src/components/ContentSlider.js +0 -192
- package/src/components/Dialog.js +0 -338
- package/src/components/DirectoryViewer.js +0 -363
- package/src/components/FocusCapture.js +0 -31
- package/src/components/Icon.js +0 -119
- package/src/components/Import.js +0 -48
- package/src/components/LazyComponent.js +0 -65
- package/src/components/PersistantCollapsible.js +0 -44
- package/src/components/PhotoViewer.js +0 -358
- package/src/components/ReactiveComponent.js +0 -11
- package/src/components/ReactiveLazyComponent.js +0 -11
- package/src/components/Resize.js +0 -168
- package/src/components/Search.js +0 -140
- package/src/components/ShowMore.js +0 -102
- package/src/components/SideMenu.js +0 -150
- package/src/components/Sortable.js +0 -169
- package/src/components/Split.js +0 -164
- package/src/components/Table.js +0 -935
- package/src/components/Tabs.js +0 -349
- package/src/components/Tags.js +0 -224
- package/src/components/ThemeSwitcher.js +0 -100
- package/src/components/Timestamp.js +0 -28
- package/src/components/Toast.js +0 -424
- package/src/components/Toggle.js +0 -137
- package/src/components/tableControls/DeleteRecord.js +0 -43
- package/src/components/tableControls/DeleteSelected.js +0 -70
- package/src/components/tableControls/Edit.js +0 -84
- package/src/components/tableControls/ExportCSV.js +0 -91
- package/src/components/tableControls/ExportJson.js +0 -62
- package/src/components/tableControls/FieldSortHide.js +0 -77
- package/src/components/tableControls/Filters.js +0 -129
- package/src/components/tableControls/FirstPage.js +0 -69
- package/src/components/tableControls/HiddenCount.js +0 -37
- package/src/components/tableControls/Hide.js +0 -40
- package/src/components/tableControls/LastPage.js +0 -67
- package/src/components/tableControls/NextPage.js +0 -69
- package/src/components/tableControls/PageSelect.js +0 -89
- package/src/components/tableControls/PageSize.js +0 -70
- package/src/components/tableControls/PrevPage.js +0 -69
- package/src/components/tableControls/Search.js +0 -49
- package/src/components/tableControls/SelectCount.js +0 -42
- package/src/components/tableControls/ShowAll.js +0 -37
- package/src/components/tableControls/TableControl.js +0 -51
- package/src/kempo-hljs.css +0 -146
- package/src/kempo-styles.css +0 -952
- package/src/kempo-vars.css +0 -159
- package/src/utils/Server.js +0 -189
- package/src/utils/cli.js +0 -119
- package/src/utils/cookie.js +0 -20
- package/src/utils/debounce.js +0 -9
- package/src/utils/drag.js +0 -74
- package/src/utils/element.js +0 -81
- package/src/utils/formatTimestamp.js +0 -27
- package/src/utils/fs-utils.js +0 -41
- package/src/utils/fuzzyMatch.js +0 -60
- package/src/utils/getPreferredTheme.js +0 -1
- package/src/utils/loadCss.js +0 -10
- package/src/utils/loadScript.js +0 -10
- package/src/utils/object.js +0 -198
- package/src/utils/raf.js +0 -10
- package/src/utils/string.js +0 -66
- package/src/utils/toFunction.js +0 -24
- package/src/utils/type.js +0 -13
- package/src/utils/waitFrames.js +0 -17
- package/src/utils/watchDirectoryHandle.js +0 -18
- package/src/utils/watchWindowSize.js +0 -15
- package/test/components/SuiteList.js +0 -26
- package/test/components/Test.js +0 -357
- package/test/index.html +0 -49
- package/test/index.js +0 -36
- package/test/suite.html +0 -45
- package/test/suites.inc.html +0 -4
- package/test/tests/components/Component.test.js +0 -138
- package/test/tests/utils/cli.test.js +0 -113
- package/test/tests/utils/cookie.test.js +0 -87
- package/test/tests/utils/debounce.test.js +0 -71
- /package/{docs/icons/show.svg → dist/admin/icons/visibility.svg} +0 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Dustin Poissant
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Third-Party Licenses
|
|
26
|
+
|
|
27
|
+
This project includes third-party software. The following sections detail the licenses for these components:
|
|
28
|
+
|
|
29
|
+
### Lit
|
|
30
|
+
|
|
31
|
+
This project includes Lit, which is licensed under the BSD-3-Clause License:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
Copyright 2017 Google LLC. All rights reserved.
|
|
35
|
+
|
|
36
|
+
Redistribution and use in source and binary forms, with or without
|
|
37
|
+
modification, are permitted provided that the following conditions are met:
|
|
38
|
+
|
|
39
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
40
|
+
list of conditions and the following disclaimer.
|
|
41
|
+
|
|
42
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
43
|
+
this list of conditions and the following disclaimer in the documentation
|
|
44
|
+
and/or other materials provided with the distribution.
|
|
45
|
+
|
|
46
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
47
|
+
contributors may be used to endorse or promote products derived from
|
|
48
|
+
this software without specific prior written permission.
|
|
49
|
+
|
|
50
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
51
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
52
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
53
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
54
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
55
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
56
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
57
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
58
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
59
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
60
|
+
```
|
package/README.md
ADDED
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
# Kempo
|
|
2
|
+
|
|
3
|
+
A fullstack CMS framework for creating websites with user authentication, group-based permissions, and an admin panel. Built on [kempo-server](https://github.com/dustinpoissant/kempo-server), [kempo-css](https://github.com/dustinpoissant/kempo-css), and [kempo-ui](https://github.com/dustinpoissant/kempo-ui).
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx kempo init
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
This initializes the current directory with everything scaffolded:
|
|
12
|
+
|
|
13
|
+
| File / Directory | Purpose |
|
|
14
|
+
|---|---|
|
|
15
|
+
| `package.json` | Pre-configured with start script |
|
|
16
|
+
| `.env` | Environment variables template |
|
|
17
|
+
| `.gitignore` | Ignores `node_modules` and `.env` |
|
|
18
|
+
| `docker-compose.yml` | PostgreSQL database via Docker |
|
|
19
|
+
| `public/` | Your website's pages, assets, and route handlers |
|
|
20
|
+
| `public/.config.json` | Server routing and middleware config |
|
|
21
|
+
| `server/db/schema.js` | Your app's database table definitions |
|
|
22
|
+
| `drizzle.config.js` | Drizzle ORM config (points to both your schema and kempo's) |
|
|
23
|
+
|
|
24
|
+
These files are yours to modify. Kempo will not overwrite them on future installs.
|
|
25
|
+
|
|
26
|
+
### Setup the Database
|
|
27
|
+
|
|
28
|
+
Update the credentials in `.env` and `docker-compose.yml` if needed, then:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
docker compose up -d
|
|
32
|
+
npx drizzle-kit push
|
|
33
|
+
node node_modules/kempo/scripts/init-db.js
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Start the Server
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm start
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Your site is running at `http://localhost:3000`.
|
|
43
|
+
|
|
44
|
+
### Create an Admin User
|
|
45
|
+
|
|
46
|
+
Register a user through the UI at `/register`, then promote them:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
node node_modules/kempo/scripts/make-admin.js
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
This prompts for the user's email and adds them to the `system:Administrators` group. To remove admin access:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
node node_modules/kempo/scripts/remove-admin.js
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Scaffolded Pages
|
|
59
|
+
|
|
60
|
+
Kempo scaffolds these pages into your `public/` directory. All are fully functional and customizable.
|
|
61
|
+
|
|
62
|
+
| Route | Page |
|
|
63
|
+
|---|---|
|
|
64
|
+
| `/` | Home page |
|
|
65
|
+
| `/login` | Login form |
|
|
66
|
+
| `/register` | Registration form |
|
|
67
|
+
| `/forgot-password` | Password recovery |
|
|
68
|
+
| `/reset-password/[token]` | Password reset (from email link) |
|
|
69
|
+
| `/verify-email` | Email verification notice |
|
|
70
|
+
| `/verify-email/[token]` | Email verification (from email link) |
|
|
71
|
+
| `/account` | User account page (requires login) |
|
|
72
|
+
| `/admin` | Admin dashboard (requires `system:admin:access` permission) |
|
|
73
|
+
| `/admin/accounts/users` | User management |
|
|
74
|
+
| `/admin/accounts/users/create` | Create user |
|
|
75
|
+
| `/admin/accounts/users/[id]` | Edit user |
|
|
76
|
+
| `/admin/accounts/groups` | Group management |
|
|
77
|
+
| `/admin/accounts/permissions` | Permission management |
|
|
78
|
+
| `/admin/settings` | Settings management |
|
|
79
|
+
|
|
80
|
+
## Project Structure
|
|
81
|
+
|
|
82
|
+
After setup, your project looks like this:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
my-site/
|
|
86
|
+
├── .env
|
|
87
|
+
├── drizzle.config.js # Drizzle config (your schema + kempo's)
|
|
88
|
+
├── package.json
|
|
89
|
+
├── public/ # Your website
|
|
90
|
+
│ ├── .config.json # Server routing & middleware config
|
|
91
|
+
│ ├── index.html # Home page
|
|
92
|
+
│ ├── styles.css # Your custom styles
|
|
93
|
+
│ ├── login/
|
|
94
|
+
│ ├── register/
|
|
95
|
+
│ ├── account/
|
|
96
|
+
│ ├── admin/
|
|
97
|
+
│ └── ...
|
|
98
|
+
├── server/
|
|
99
|
+
│ └── db/
|
|
100
|
+
│ └── schema.js # Your app's database tables
|
|
101
|
+
└── node_modules/
|
|
102
|
+
└── kempo/
|
|
103
|
+
├── dist/kempo/ # SDK, API endpoints, components
|
|
104
|
+
├── server/
|
|
105
|
+
│ ├── db/schema.js # Framework tables (user, session, group, etc.)
|
|
106
|
+
│ └── utils/ # Backend utilities
|
|
107
|
+
├── middleware/ # Auth middleware
|
|
108
|
+
└── templates/ # Nav and email templates
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Custom Database Tables
|
|
112
|
+
|
|
113
|
+
Define your app's tables in `server/db/schema.js`. You can reference kempo's tables for foreign keys:
|
|
114
|
+
|
|
115
|
+
```javascript
|
|
116
|
+
import { pgTable, text, timestamp } from 'drizzle-orm/pg-core';
|
|
117
|
+
import { user } from 'kempo/server/db/schema.js';
|
|
118
|
+
|
|
119
|
+
export const post = pgTable('post', {
|
|
120
|
+
id: text('id').primaryKey(),
|
|
121
|
+
authorId: text('authorId').references(() => user.id),
|
|
122
|
+
title: text('title').notNull(),
|
|
123
|
+
content: text('content'),
|
|
124
|
+
createdAt: timestamp('createdAt').notNull(),
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Then push to the database:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
npx drizzle-kit push
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Your `drizzle.config.js` already points to both schema files, so both framework and app tables are managed together.
|
|
135
|
+
|
|
136
|
+
### Querying the Database
|
|
137
|
+
|
|
138
|
+
Import the shared database instance from kempo:
|
|
139
|
+
|
|
140
|
+
```javascript
|
|
141
|
+
import db from 'kempo/server/db/index.js';
|
|
142
|
+
import { post } from '../../db/schema.js';
|
|
143
|
+
|
|
144
|
+
export default async ({ authorId, title, content }) => {
|
|
145
|
+
const result = await db.insert(post).values({
|
|
146
|
+
id: crypto.randomUUID(),
|
|
147
|
+
authorId,
|
|
148
|
+
title,
|
|
149
|
+
content,
|
|
150
|
+
createdAt: new Date(),
|
|
151
|
+
}).returning();
|
|
152
|
+
|
|
153
|
+
return [null, result[0]];
|
|
154
|
+
};
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Framework Database Tables
|
|
158
|
+
|
|
159
|
+
Kempo provides these tables out of the box:
|
|
160
|
+
|
|
161
|
+
| Table | Purpose |
|
|
162
|
+
|---|---|
|
|
163
|
+
| `user` | User accounts (id, name, email, passwordHash, emailVerified, timestamps) |
|
|
164
|
+
| `session` | Login sessions (token, userId, expiresAt, ipAddress, userAgent) |
|
|
165
|
+
| `verificationToken` | Email verification and password reset tokens |
|
|
166
|
+
| `group` | Permission groups (e.g. `system:Users`, `system:Administrators`) |
|
|
167
|
+
| `userGroup` | User-to-group membership |
|
|
168
|
+
| `permission` | Named permissions (e.g. `system:admin:access`) |
|
|
169
|
+
| `groupPermission` | Group-to-permission assignments |
|
|
170
|
+
| `setting` | Key-value settings with type, visibility, and ownership |
|
|
171
|
+
|
|
172
|
+
## Frontend SDK
|
|
173
|
+
|
|
174
|
+
Kempo provides a client-side SDK at `/kempo/sdk.js` for calling API endpoints.
|
|
175
|
+
|
|
176
|
+
```html
|
|
177
|
+
<script type="module">
|
|
178
|
+
import { login, getSession, logout } from '/kempo/sdk.js';
|
|
179
|
+
|
|
180
|
+
const [error, result] = await login({ email: 'user@example.com', password: 'secret' });
|
|
181
|
+
if(error){
|
|
182
|
+
console.error(error.msg);
|
|
183
|
+
}
|
|
184
|
+
</script>
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
All SDK methods return an `[error, data]` tuple. On failure, `error` is `{ code, msg }`. On success, `error` is `null`.
|
|
188
|
+
|
|
189
|
+
### Auth
|
|
190
|
+
|
|
191
|
+
| Method | Parameters |
|
|
192
|
+
|---|---|
|
|
193
|
+
| `register` | `{ email, password, name }` |
|
|
194
|
+
| `login` | `{ email, password }` |
|
|
195
|
+
| `logout` | (none) |
|
|
196
|
+
| `getSession` | (none) |
|
|
197
|
+
| `forgotPassword` | `{ email }` |
|
|
198
|
+
| `resetPassword` | `{ token, password, logoutAll? }` |
|
|
199
|
+
| `changePassword` | `{ currentPassword, newPassword, logoutAll? }` |
|
|
200
|
+
| `verifyEmail` | `{ token }` |
|
|
201
|
+
|
|
202
|
+
### Permissions
|
|
203
|
+
|
|
204
|
+
| Method | Parameters |
|
|
205
|
+
|---|---|
|
|
206
|
+
| `currentUserHasPermission` | `{ permission }` |
|
|
207
|
+
| `currentUserHasAllPermissions` | `{ permissions }` |
|
|
208
|
+
| `currentUserHasSomePermissions` | `{ permissions }` |
|
|
209
|
+
| `getAllCurrentUserPermissions` | (none) |
|
|
210
|
+
| `userHasPermission` | `{ userid, permission }` |
|
|
211
|
+
| `userHasAllPermissions` | `{ userid, permissions }` |
|
|
212
|
+
| `userHasSomePermissions` | `{ userid, permissions }` |
|
|
213
|
+
| `getAllUserPermissions` | `{ userid }` |
|
|
214
|
+
|
|
215
|
+
### Users
|
|
216
|
+
|
|
217
|
+
| Method | Parameters |
|
|
218
|
+
|---|---|
|
|
219
|
+
| `getUsers` | `{ limit?, offset? }` |
|
|
220
|
+
| `getUser` | `userid` |
|
|
221
|
+
| `createUser` | `{ name, email, password, emailVerified? }` |
|
|
222
|
+
| `updateUser` | `{ id, name?, email?, emailVerified?, createdAt? }` |
|
|
223
|
+
| `deleteUsers` | `ids` (array) |
|
|
224
|
+
|
|
225
|
+
### Sessions
|
|
226
|
+
|
|
227
|
+
| Method | Parameters |
|
|
228
|
+
|---|---|
|
|
229
|
+
| `getUserSessions` | `userid` |
|
|
230
|
+
| `deleteUserSession` | `userid, sessionToken` |
|
|
231
|
+
| `deleteExpiredUserSessions` | `userid` |
|
|
232
|
+
|
|
233
|
+
### Groups
|
|
234
|
+
|
|
235
|
+
| Method | Parameters |
|
|
236
|
+
|---|---|
|
|
237
|
+
| `listGroups` | (none) |
|
|
238
|
+
| `getUserGroups` | `userid` |
|
|
239
|
+
| `addUserToGroup` | `userid, groupName` |
|
|
240
|
+
| `removeUserFromGroup` | `userid, groupName` |
|
|
241
|
+
|
|
242
|
+
## Frontend Components
|
|
243
|
+
|
|
244
|
+
Kempo provides web components you can use in your pages:
|
|
245
|
+
|
|
246
|
+
```html
|
|
247
|
+
<script type="module" src="/kempo/components/Permission.js"></script>
|
|
248
|
+
<kempo-permission has="system:admin:access">
|
|
249
|
+
<a href="/admin">Admin Panel</a>
|
|
250
|
+
</kempo-permission>
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
| Component | Tag | Purpose |
|
|
254
|
+
|---|---|---|
|
|
255
|
+
| `Permission.js` | `<kempo-permission>` | Conditionally render content based on permissions |
|
|
256
|
+
| `LogoutBtn.js` | `<kempo-logout-btn>` | Logout button |
|
|
257
|
+
| `UserName.js` | `<kempo-user-name>` | Display current user's name |
|
|
258
|
+
| `UserEmail.js` | `<kempo-user-email>` | Display current user's email |
|
|
259
|
+
| `UserEmailVerified.js` | `<kempo-user-email-verified>` | Display email verification status |
|
|
260
|
+
| `UserCreatedAt.js` | `<kempo-user-created-at>` | Display account creation date |
|
|
261
|
+
|
|
262
|
+
## Adding Routes
|
|
263
|
+
|
|
264
|
+
Create files in `public/` following the kempo-server routing convention. File names map to HTTP methods:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
public/
|
|
268
|
+
api/
|
|
269
|
+
posts/
|
|
270
|
+
GET.js → GET /api/posts
|
|
271
|
+
POST.js → POST /api/posts
|
|
272
|
+
[id]/
|
|
273
|
+
GET.js → GET /api/posts/:id
|
|
274
|
+
PATCH.js → PATCH /api/posts/:id
|
|
275
|
+
DELETE.js → DELETE /api/posts/:id
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
Route handlers receive `(request, response)`:
|
|
279
|
+
|
|
280
|
+
```javascript
|
|
281
|
+
import db from 'kempo/server/db/index.js';
|
|
282
|
+
import { post } from '../../../server/db/schema.js';
|
|
283
|
+
import { eq } from 'drizzle-orm';
|
|
284
|
+
|
|
285
|
+
export default async (request, response) => {
|
|
286
|
+
const posts = await db.select().from(post);
|
|
287
|
+
response.json({ posts });
|
|
288
|
+
};
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
`request.body` is pre-parsed based on `Content-Type`. Query params are at `request.query`. Cookies are at `request.cookies`. Path params from `[param]` folders are at `request.params`.
|
|
292
|
+
|
|
293
|
+
## Auth Middleware
|
|
294
|
+
|
|
295
|
+
The auth middleware protects `/account` and `/admin` routes by default:
|
|
296
|
+
|
|
297
|
+
- `/account/*` — Requires a valid session. Redirects to `/login` if not authenticated.
|
|
298
|
+
- `/admin/*` — Requires the `system:admin:access` permission. Redirects to `/account` if unauthorized.
|
|
299
|
+
|
|
300
|
+
These are configured in `public/.config.json` and can be customized.
|
|
301
|
+
|
|
302
|
+
## Default Permissions
|
|
303
|
+
|
|
304
|
+
The `init-db.js` script seeds these permissions:
|
|
305
|
+
|
|
306
|
+
| Permission | Description |
|
|
307
|
+
|---|---|
|
|
308
|
+
| `system:admin:access` | Access admin panel |
|
|
309
|
+
| `system:content:create` | Create new content |
|
|
310
|
+
| `system:content:update` | Edit content |
|
|
311
|
+
| `system:content:delete` | Delete content |
|
|
312
|
+
| `system:user:create` | Create new users |
|
|
313
|
+
| `system:user:read` | View users |
|
|
314
|
+
| `system:user:update` | Edit users |
|
|
315
|
+
| `system:user:delete` | Delete users |
|
|
316
|
+
| `system:group:create` | Create new groups |
|
|
317
|
+
| `system:group:read` | View groups |
|
|
318
|
+
| `system:group:update` | Edit groups and manage membership |
|
|
319
|
+
| `system:group:delete` | Delete groups |
|
|
320
|
+
| `system:permissions:read` | View permissions for all users |
|
|
321
|
+
| `system:permissions:manage` | Add or remove permissions |
|
|
322
|
+
| `system:settings:read` | View private settings |
|
|
323
|
+
| `system:settings:update` | Update settings |
|
|
324
|
+
| `system:custom-settings:manage` | Create and delete custom settings |
|
|
325
|
+
|
|
326
|
+
Two default groups are created:
|
|
327
|
+
|
|
328
|
+
- **system:Users** — Assigned to all users, no permissions by default.
|
|
329
|
+
- **system:Administrators** — Full system access (all permissions above).
|
|
330
|
+
|
|
331
|
+
## Default Settings
|
|
332
|
+
|
|
333
|
+
| Setting | Default | Type | Public | Description |
|
|
334
|
+
|---|---|---|---|---|
|
|
335
|
+
| `site_name` | `Kempo Site` | string | yes | The name of the website |
|
|
336
|
+
| `session_duration_days` | `7` | number | no | Session duration in days |
|
|
337
|
+
| `allow_registration` | `true` | boolean | yes | Allow new users to register |
|
|
338
|
+
| `require_email_verification` | `false` | boolean | no | Require email verification before account access |
|
|
339
|
+
| `verification_url` | `http://localhost:3000/verify-email/{{token}}` | string | no | Email verification URL template |
|
|
340
|
+
| `password_reset_url` | `http://localhost:3000/reset-password/{{token}}` | string | no | Password reset URL template |
|
|
341
|
+
|
|
342
|
+
Settings can be managed through the admin panel at `/admin/settings` or the SDK.
|
|
343
|
+
|
|
344
|
+
## Email
|
|
345
|
+
|
|
346
|
+
Kempo uses [Resend](https://resend.com/) for sending emails. Set `RESEND_API_KEY` and `EMAIL_FROM` in your `.env` file.
|
|
347
|
+
|
|
348
|
+
Built-in email templates (in `templates/emails/`):
|
|
349
|
+
- `verify-email.html` — Email verification link
|
|
350
|
+
- `reset-password.html` — Password reset link
|
|
351
|
+
|
|
352
|
+
## Styling
|
|
353
|
+
|
|
354
|
+
Kempo uses [kempo-css](https://github.com/dustinpoissant/kempo-css) for styling and [kempo-ui](https://github.com/dustinpoissant/kempo-ui) for UI components. Both are served automatically via custom routes configured in `public/.config.json`.
|
|
355
|
+
|
|
356
|
+
```html
|
|
357
|
+
<link rel="stylesheet" href="/kempo-css/kempo.min.css">
|
|
358
|
+
<script type="module" src="/kempo-ui/components/Import.js"></script>
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
Refer to the [kempo-css docs](https://github.com/dustinpoissant/kempo-css) and [kempo-ui docs](https://github.com/dustinpoissant/kempo-ui) for available utility classes and components.
|
|
362
|
+
|
|
363
|
+
## Development
|
|
364
|
+
|
|
365
|
+
### Running the Dev Server
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
npm run dev
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
This serves `app-public/` at `http://localhost:9876` for testing the consumer-facing boilerplate. The dev server watches for changes and auto-reloads.
|
|
372
|
+
|
|
373
|
+
### Building for Distribution
|
|
374
|
+
|
|
375
|
+
When preparing the framework for npm release, minify and optimize the source code:
|
|
376
|
+
|
|
377
|
+
```bash
|
|
378
|
+
npm run build
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
This processes all files in `src/` and outputs to `dist/`:
|
|
382
|
+
- JavaScript files are minified with terser, mangled, and source maps are generated
|
|
383
|
+
- HTML files are minified while preserving CMS front matter comments (important for page templating)
|
|
384
|
+
- JSON files are minified
|
|
385
|
+
- SVG icons and other assets are copied as-is
|
|
386
|
+
|
|
387
|
+
The build achieves ~15% size reduction and runs in ~0.6s.
|
|
388
|
+
|
|
389
|
+
**Output Structure:**
|
|
390
|
+
```
|
|
391
|
+
dist/
|
|
392
|
+
├── admin/ # Minified admin portal
|
|
393
|
+
├── kempo/ # Minified framework SDK, API routes, components
|
|
394
|
+
└── ...
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
See [spec/concepts/build.md](spec/concepts/build.md) for detailed build documentation.
|
|
398
|
+
|
|
399
|
+
### Project Structure
|
|
400
|
+
|
|
401
|
+
**Framework source:**
|
|
402
|
+
```
|
|
403
|
+
kempo/
|
|
404
|
+
├── src/
|
|
405
|
+
│ ├── admin/ # Admin portal source (minified to dist/admin/)
|
|
406
|
+
│ └── kempo/ # Framework SDK & API source (minified to dist/kempo/)
|
|
407
|
+
├── server/ # Backend utilities (not minified)
|
|
408
|
+
├── middleware/ # Auth middleware
|
|
409
|
+
├── app-public/ # Consumer boilerplate (not minified)
|
|
410
|
+
├── app-templates/ # Email and page templates (not minified)
|
|
411
|
+
├── app-server/ # Server scaffolding (not minified)
|
|
412
|
+
└── dist/ # Built & minified output (generated by `npm run build`)
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
**Consumer project (created by `npx kempo init`):**
|
|
416
|
+
```
|
|
417
|
+
my-site/
|
|
418
|
+
├── public/ # Copied from kempo's app-public/
|
|
419
|
+
├── server/db/schema.js # Copied from kempo's app-server/
|
|
420
|
+
├── templates/ # Copied from kempo's app-templates/
|
|
421
|
+
└── ...
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
## License
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
MIT
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defineConfig } from 'drizzle-kit';
|
|
2
|
+
import 'dotenv/config';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
schema: [
|
|
6
|
+
'./server/db/schema.js',
|
|
7
|
+
'./node_modules/kempo/server/db/schema.js',
|
|
8
|
+
],
|
|
9
|
+
out: './server/db/migrations',
|
|
10
|
+
dialect: 'postgresql',
|
|
11
|
+
dbCredentials: {
|
|
12
|
+
url: process.env.DATABASE_URL,
|
|
13
|
+
},
|
|
14
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"customRoutes": {
|
|
3
|
+
"/kempo-css/**": "../node_modules/kempo-css/dist/**",
|
|
4
|
+
"/kempo-ui/icons/**": "../node_modules/kempo-ui/icons/**",
|
|
5
|
+
"/kempo-ui/**": "../node_modules/kempo-ui/dist/**",
|
|
6
|
+
"/monaco-editor/**": "../node_modules/monaco-editor/min/**",
|
|
7
|
+
"/kempo/**": "../dist/kempo/**",
|
|
8
|
+
"/admin": "../dist/admin/",
|
|
9
|
+
"/admin/**": "../dist/admin/**"
|
|
10
|
+
},
|
|
11
|
+
"middleware": {
|
|
12
|
+
"custom": [
|
|
13
|
+
"../middleware/kempo-auth.js",
|
|
14
|
+
"../middleware/extension-scope-router.js"
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
"templating": {
|
|
18
|
+
"ssr": true,
|
|
19
|
+
"ssrPriority": true,
|
|
20
|
+
"preRender": false
|
|
21
|
+
},
|
|
22
|
+
"disallowedRegex": [
|
|
23
|
+
"-disabled\\.html$"
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
owner: system
|
|
3
|
+
title: My Account
|
|
4
|
+
description: User account settings and profile management
|
|
5
|
+
-->
|
|
6
|
+
<page title="My Account">
|
|
7
|
+
<content location="head">
|
|
8
|
+
<style>
|
|
9
|
+
input.error {
|
|
10
|
+
--c_input_border: var(--c_danger, red);
|
|
11
|
+
--focus_shadow: 0 0 2px 2px var(--c_danger, red);
|
|
12
|
+
}
|
|
13
|
+
</style>
|
|
14
|
+
</content>
|
|
15
|
+
<content>
|
|
16
|
+
<main class="p">
|
|
17
|
+
<div style="max-width: 600px; margin: 0 auto;">
|
|
18
|
+
<h2>My Account</h2>
|
|
19
|
+
<div class="mb">
|
|
20
|
+
<strong>Name:</strong> <k-user-name></k-user-name>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="mb">
|
|
23
|
+
<strong>Email:</strong> <k-user-email></k-user-email>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="mb">
|
|
26
|
+
<strong>Email Verified:</strong> <k-user-email-verified></k-user-email-verified>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="mb">
|
|
29
|
+
<strong>Member Since:</strong> <k-user-created-at></k-user-created-at>
|
|
30
|
+
</div>
|
|
31
|
+
<div class="mt-lg">
|
|
32
|
+
<k-permission has="system:admin:access">
|
|
33
|
+
<a href="{{pathToRoot}}admin" class="btn primary">Admin Panel</a>
|
|
34
|
+
</k-permission>
|
|
35
|
+
<button id="changePasswordBtn" class="btn">Change Password</button>
|
|
36
|
+
<k-logout-btn redirect="{{pathToRoot}}login" button-class="btn danger">Logout</k-logout-btn>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
</main>
|
|
40
|
+
<k-dialog id="changePasswordDialog">
|
|
41
|
+
<h5 slot="title" class="pyh px m0">Change Password</h5>
|
|
42
|
+
<form id="changePasswordForm" class="p">
|
|
43
|
+
<div class="mb">
|
|
44
|
+
<label for="currentPassword" class="d-b mb-sm">Current Password</label>
|
|
45
|
+
<input type="password" id="currentPassword" required class="w-full p-sm br">
|
|
46
|
+
</div>
|
|
47
|
+
<div class="mb">
|
|
48
|
+
<label for="newPassword" class="d-b mb-sm">New Password</label>
|
|
49
|
+
<input type="password" id="newPassword" required minlength="8" class="w-full p-sm br">
|
|
50
|
+
</div>
|
|
51
|
+
<div class="mb">
|
|
52
|
+
<label for="confirmPassword" class="d-b mb-sm">Confirm New Password</label>
|
|
53
|
+
<input type="password" id="confirmPassword" required minlength="8" class="w-full p-sm br">
|
|
54
|
+
</div>
|
|
55
|
+
<k-toggle id="logout-all">Logout all other devices</k-toggle>
|
|
56
|
+
<div class="ta-right">
|
|
57
|
+
<button type="submit" class="primary">Change Password</button>
|
|
58
|
+
</div>
|
|
59
|
+
</form>
|
|
60
|
+
</k-dialog>
|
|
61
|
+
</content>
|
|
62
|
+
<content location="scripts">
|
|
63
|
+
<script src="{{pathToRoot}}kempo-ui/components/Dialog.js" type="module"></script>
|
|
64
|
+
<script src="{{pathToRoot}}kempo/components/Permission.js" type="module"></script>
|
|
65
|
+
<script src="{{pathToRoot}}kempo/components/UserName.js" type="module"></script>
|
|
66
|
+
<script src="{{pathToRoot}}kempo/components/UserEmail.js" type="module"></script>
|
|
67
|
+
<script src="{{pathToRoot}}kempo/components/UserEmailVerified.js" type="module"></script>
|
|
68
|
+
<script src="{{pathToRoot}}kempo/components/UserCreatedAt.js" type="module"></script>
|
|
69
|
+
<script src="{{pathToRoot}}kempo/components/LogoutBtn.js" type="module"></script>
|
|
70
|
+
<script src="{{pathToRoot}}kempo-ui/components/Toggle.js" type="module"></script>
|
|
71
|
+
<script type="module">
|
|
72
|
+
import { changePassword } from '{{pathToRoot}}kempo/sdk.js';
|
|
73
|
+
import Toast from '{{pathToRoot}}kempo-ui/components/Toast.js';
|
|
74
|
+
|
|
75
|
+
(()=>{
|
|
76
|
+
const $dialog = document.getElementById('changePasswordDialog');
|
|
77
|
+
const $confirmPassword = document.getElementById('confirmPassword');
|
|
78
|
+
document.getElementById('changePasswordBtn').addEventListener('click', () => {
|
|
79
|
+
$dialog.open();
|
|
80
|
+
});
|
|
81
|
+
document.getElementById('changePasswordForm').addEventListener('submit', async (event) => {
|
|
82
|
+
event.preventDefault();
|
|
83
|
+
const currentPassword = document.getElementById('currentPassword').value;
|
|
84
|
+
const newPassword = document.getElementById('newPassword').value;
|
|
85
|
+
const confirmPassword = $confirmPassword.value;
|
|
86
|
+
if(newPassword !== confirmPassword){
|
|
87
|
+
$confirmPassword.classList.add('error');
|
|
88
|
+
$confirmPassword.setCustomValidity("Your new password and confirmation password do not match");
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
$dialog.close();
|
|
92
|
+
const [error] = await changePassword({
|
|
93
|
+
currentPassword,
|
|
94
|
+
newPassword,
|
|
95
|
+
logoutAll: document.getElementById('logout-all').value
|
|
96
|
+
});
|
|
97
|
+
if(error){
|
|
98
|
+
Toast.error(error.msg);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
Toast.success('Password Updated');
|
|
102
|
+
});
|
|
103
|
+
$confirmPassword.addEventListener('input', ()=>{
|
|
104
|
+
$confirmPassword.classList.remove('error');
|
|
105
|
+
$confirmPassword.setCustomValidity('');
|
|
106
|
+
});
|
|
107
|
+
})();
|
|
108
|
+
</script>
|
|
109
|
+
</content>
|
|
110
|
+
</page>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
owner: custom
|
|
3
|
+
author: Copilot Admin
|
|
4
|
+
created: 2026-04-16T20:40:58.376Z
|
|
5
|
+
updated: 2026-04-19T20:43:06.103Z
|
|
6
|
+
-->
|
|
7
|
+
<!DOCTYPE html>
|
|
8
|
+
<html lang="en">
|
|
9
|
+
|
|
10
|
+
<head>
|
|
11
|
+
<meta charset="UTF-8">
|
|
12
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
13
|
+
<link rel="icon" type="image/png" sizes="48x48" href="{{pathToRoot}}media/icon48.png">
|
|
14
|
+
<link rel="manifest" href="{{pathToRoot}}manifest.json">
|
|
15
|
+
<title>{{title}}</title>
|
|
16
|
+
<link rel="stylesheet" href="{{pathToRoot}}kempo-css/kempo.min.css">
|
|
17
|
+
<link rel="stylesheet" href="{{pathToRoot}}styles.css">
|
|
18
|
+
<script src="{{pathToRoot}}init.js"></script>
|
|
19
|
+
<location name="head" />
|
|
20
|
+
</head>
|
|
21
|
+
|
|
22
|
+
<body>
|
|
23
|
+
<fragment name="nav" />
|
|
24
|
+
<div class="row">
|
|
25
|
+
<div class="col d-span-4 t-span-4 m-span-12 px">
|
|
26
|
+
<location name="left" label="Left Sidebar" />
|
|
27
|
+
</div>
|
|
28
|
+
<div class="col d-span-8 t-span-8 m-span-12">
|
|
29
|
+
<main>
|
|
30
|
+
<location />
|
|
31
|
+
</main>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
<location name="scripts" />
|
|
35
|
+
</body>
|
|
36
|
+
</html>
|