@codaijs/keel 0.2.3 → 0.2.4
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/dist/__tests__/sail-installer.test.js +25 -25
- package/dist/sail-installer.js +174 -174
- package/dist/scaffold.js +68 -68
- package/package.json +58 -58
- package/sails/_template/addon.json +20 -20
- package/sails/_template/install.ts +402 -402
- package/sails/admin-dashboard/README.md +117 -117
- package/sails/admin-dashboard/addon.json +28 -28
- package/sails/admin-dashboard/files/backend/middleware/admin.ts +34 -34
- package/sails/admin-dashboard/files/backend/routes/admin.ts +243 -243
- package/sails/admin-dashboard/files/frontend/components/admin/StatsCard.tsx +40 -40
- package/sails/admin-dashboard/files/frontend/components/admin/UsersTable.tsx +240 -240
- package/sails/admin-dashboard/files/frontend/hooks/useAdmin.ts +149 -149
- package/sails/admin-dashboard/files/frontend/pages/admin/Dashboard.tsx +173 -173
- package/sails/admin-dashboard/files/frontend/pages/admin/UserDetail.tsx +203 -203
- package/sails/admin-dashboard/install.ts +305 -305
- package/sails/analytics/README.md +178 -178
- package/sails/analytics/addon.json +27 -27
- package/sails/analytics/files/frontend/components/AnalyticsProvider.tsx +58 -58
- package/sails/analytics/files/frontend/hooks/useAnalytics.ts +64 -64
- package/sails/analytics/files/frontend/lib/analytics.ts +103 -103
- package/sails/analytics/install.ts +297 -297
- package/sails/file-uploads/addon.json +30 -30
- package/sails/file-uploads/files/backend/routes/files.ts +198 -198
- package/sails/file-uploads/files/backend/schema/files.ts +36 -36
- package/sails/file-uploads/files/backend/services/file-storage.ts +128 -128
- package/sails/file-uploads/files/frontend/components/FileList.tsx +248 -248
- package/sails/file-uploads/files/frontend/components/FileUploadButton.tsx +147 -147
- package/sails/file-uploads/files/frontend/hooks/useFileUpload.ts +106 -106
- package/sails/file-uploads/files/frontend/hooks/useFiles.ts +118 -118
- package/sails/file-uploads/files/frontend/pages/Files.tsx +37 -37
- package/sails/file-uploads/install.ts +466 -466
- package/sails/gdpr/README.md +174 -174
- package/sails/gdpr/addon.json +27 -27
- package/sails/gdpr/files/backend/routes/gdpr.ts +140 -140
- package/sails/gdpr/files/backend/services/gdpr.ts +293 -293
- package/sails/gdpr/files/frontend/components/auth/ConsentCheckboxes.tsx +97 -97
- package/sails/gdpr/files/frontend/components/gdpr/AccountDeletionRequest.tsx +192 -192
- package/sails/gdpr/files/frontend/components/gdpr/DataExportButton.tsx +75 -75
- package/sails/gdpr/files/frontend/pages/PrivacyPolicy.tsx +186 -186
- package/sails/gdpr/install.ts +756 -756
- package/sails/google-oauth/README.md +121 -121
- package/sails/google-oauth/addon.json +22 -22
- package/sails/google-oauth/files/GoogleButton.tsx +50 -50
- package/sails/google-oauth/install.ts +252 -252
- package/sails/i18n/README.md +193 -193
- package/sails/i18n/addon.json +30 -30
- package/sails/i18n/files/frontend/components/LanguageSwitcher.tsx +108 -108
- package/sails/i18n/files/frontend/hooks/useLanguage.ts +31 -31
- package/sails/i18n/files/frontend/lib/i18n.ts +32 -32
- package/sails/i18n/files/frontend/locales/de/common.json +44 -44
- package/sails/i18n/files/frontend/locales/en/common.json +44 -44
- package/sails/i18n/install.ts +407 -407
- package/sails/push-notifications/README.md +163 -163
- package/sails/push-notifications/addon.json +31 -31
- package/sails/push-notifications/files/backend/routes/notifications.ts +153 -153
- package/sails/push-notifications/files/backend/schema/notifications.ts +31 -31
- package/sails/push-notifications/files/backend/services/notifications.ts +117 -117
- package/sails/push-notifications/files/frontend/components/PushNotificationInit.tsx +12 -12
- package/sails/push-notifications/files/frontend/hooks/usePushNotifications.ts +154 -154
- package/sails/push-notifications/install.ts +384 -384
- package/sails/r2-storage/addon.json +29 -29
- package/sails/r2-storage/files/backend/services/storage.ts +71 -71
- package/sails/r2-storage/files/frontend/components/ProfilePictureUpload.tsx +167 -167
- package/sails/r2-storage/install.ts +412 -412
- package/sails/rate-limiting/addon.json +20 -20
- package/sails/rate-limiting/files/backend/middleware/rate-limit-store.ts +104 -104
- package/sails/rate-limiting/files/backend/middleware/rate-limit.ts +137 -137
- package/sails/rate-limiting/install.ts +300 -300
- package/sails/registry.json +107 -107
- package/sails/stripe/README.md +214 -214
- package/sails/stripe/addon.json +24 -24
- package/sails/stripe/files/backend/routes/stripe.ts +154 -154
- package/sails/stripe/files/backend/schema/stripe.ts +74 -74
- package/sails/stripe/files/backend/services/stripe.ts +224 -224
- package/sails/stripe/files/frontend/components/SubscriptionStatus.tsx +135 -135
- package/sails/stripe/files/frontend/hooks/useSubscription.ts +86 -86
- package/sails/stripe/files/frontend/pages/Checkout.tsx +116 -116
- package/sails/stripe/files/frontend/pages/Pricing.tsx +226 -226
- package/sails/stripe/install.ts +378 -378
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import { useTranslation } from "react-i18next";
|
|
2
|
-
import { useCallback } from "react";
|
|
3
|
-
|
|
4
|
-
export interface Language {
|
|
5
|
-
code: string;
|
|
6
|
-
label: string;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
const availableLanguages: Language[] = [
|
|
10
|
-
{ code: "en", label: "English" },
|
|
11
|
-
{ code: "de", label: "Deutsch" },
|
|
12
|
-
];
|
|
13
|
-
|
|
14
|
-
export function useLanguage() {
|
|
15
|
-
const { i18n } = useTranslation();
|
|
16
|
-
|
|
17
|
-
const currentLanguage = i18n.language?.split("-")[0] ?? "en";
|
|
18
|
-
|
|
19
|
-
const changeLanguage = useCallback(
|
|
20
|
-
async (code: string) => {
|
|
21
|
-
await i18n.changeLanguage(code);
|
|
22
|
-
},
|
|
23
|
-
[i18n],
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
return {
|
|
27
|
-
currentLanguage,
|
|
28
|
-
changeLanguage,
|
|
29
|
-
availableLanguages,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
1
|
+
import { useTranslation } from "react-i18next";
|
|
2
|
+
import { useCallback } from "react";
|
|
3
|
+
|
|
4
|
+
export interface Language {
|
|
5
|
+
code: string;
|
|
6
|
+
label: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const availableLanguages: Language[] = [
|
|
10
|
+
{ code: "en", label: "English" },
|
|
11
|
+
{ code: "de", label: "Deutsch" },
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
export function useLanguage() {
|
|
15
|
+
const { i18n } = useTranslation();
|
|
16
|
+
|
|
17
|
+
const currentLanguage = i18n.language?.split("-")[0] ?? "en";
|
|
18
|
+
|
|
19
|
+
const changeLanguage = useCallback(
|
|
20
|
+
async (code: string) => {
|
|
21
|
+
await i18n.changeLanguage(code);
|
|
22
|
+
},
|
|
23
|
+
[i18n],
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
currentLanguage,
|
|
28
|
+
changeLanguage,
|
|
29
|
+
availableLanguages,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import i18n from "i18next";
|
|
2
|
-
import { initReactI18next } from "react-i18next";
|
|
3
|
-
import LanguageDetector from "i18next-browser-languagedetector";
|
|
4
|
-
|
|
5
|
-
// Import locale files
|
|
6
|
-
import enCommon from "@/locales/en/common.json";
|
|
7
|
-
import deCommon from "@/locales/de/common.json";
|
|
8
|
-
|
|
9
|
-
const resources = {
|
|
10
|
-
en: { common: enCommon },
|
|
11
|
-
de: { common: deCommon },
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
i18n
|
|
15
|
-
.use(LanguageDetector)
|
|
16
|
-
.use(initReactI18next)
|
|
17
|
-
.init({
|
|
18
|
-
resources,
|
|
19
|
-
defaultNS: "common",
|
|
20
|
-
ns: ["common"],
|
|
21
|
-
fallbackLng: "en",
|
|
22
|
-
interpolation: {
|
|
23
|
-
escapeValue: false, // React already escapes
|
|
24
|
-
},
|
|
25
|
-
detection: {
|
|
26
|
-
order: ["localStorage", "navigator", "htmlTag"],
|
|
27
|
-
caches: ["localStorage"],
|
|
28
|
-
lookupLocalStorage: "i18nextLng",
|
|
29
|
-
},
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
export default i18n;
|
|
1
|
+
import i18n from "i18next";
|
|
2
|
+
import { initReactI18next } from "react-i18next";
|
|
3
|
+
import LanguageDetector from "i18next-browser-languagedetector";
|
|
4
|
+
|
|
5
|
+
// Import locale files
|
|
6
|
+
import enCommon from "@/locales/en/common.json";
|
|
7
|
+
import deCommon from "@/locales/de/common.json";
|
|
8
|
+
|
|
9
|
+
const resources = {
|
|
10
|
+
en: { common: enCommon },
|
|
11
|
+
de: { common: deCommon },
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
i18n
|
|
15
|
+
.use(LanguageDetector)
|
|
16
|
+
.use(initReactI18next)
|
|
17
|
+
.init({
|
|
18
|
+
resources,
|
|
19
|
+
defaultNS: "common",
|
|
20
|
+
ns: ["common"],
|
|
21
|
+
fallbackLng: "en",
|
|
22
|
+
interpolation: {
|
|
23
|
+
escapeValue: false, // React already escapes
|
|
24
|
+
},
|
|
25
|
+
detection: {
|
|
26
|
+
order: ["localStorage", "navigator", "htmlTag"],
|
|
27
|
+
caches: ["localStorage"],
|
|
28
|
+
lookupLocalStorage: "i18nextLng",
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export default i18n;
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
{
|
|
2
|
-
"nav": {
|
|
3
|
-
"home": "Startseite",
|
|
4
|
-
"profile": "Profil",
|
|
5
|
-
"settings": "Einstellungen",
|
|
6
|
-
"login": "Anmelden",
|
|
7
|
-
"signup": "Registrieren",
|
|
8
|
-
"logout": "Abmelden"
|
|
9
|
-
},
|
|
10
|
-
"auth": {
|
|
11
|
-
"loginTitle": "Willkommen zurueck",
|
|
12
|
-
"signupTitle": "Konto erstellen",
|
|
13
|
-
"email": "E-Mail",
|
|
14
|
-
"password": "Passwort",
|
|
15
|
-
"confirmPassword": "Passwort bestaetigen",
|
|
16
|
-
"name": "Name",
|
|
17
|
-
"forgotPassword": "Passwort vergessen?",
|
|
18
|
-
"noAccount": "Noch kein Konto?",
|
|
19
|
-
"hasAccount": "Bereits ein Konto?",
|
|
20
|
-
"resetPassword": "Passwort zuruecksetzen",
|
|
21
|
-
"loginButton": "Anmelden",
|
|
22
|
-
"signupButton": "Registrieren",
|
|
23
|
-
"resetButton": "Link senden"
|
|
24
|
-
},
|
|
25
|
-
"profile": {
|
|
26
|
-
"title": "Profil",
|
|
27
|
-
"editProfile": "Profil bearbeiten",
|
|
28
|
-
"name": "Name",
|
|
29
|
-
"email": "E-Mail",
|
|
30
|
-
"memberSince": "Mitglied seit"
|
|
31
|
-
},
|
|
32
|
-
"common": {
|
|
33
|
-
"save": "Speichern",
|
|
34
|
-
"cancel": "Abbrechen",
|
|
35
|
-
"delete": "Loeschen",
|
|
36
|
-
"loading": "Laden...",
|
|
37
|
-
"error": "Etwas ist schiefgelaufen",
|
|
38
|
-
"success": "Erfolgreich",
|
|
39
|
-
"confirm": "Bestaetigen",
|
|
40
|
-
"back": "Zurueck",
|
|
41
|
-
"search": "Suche",
|
|
42
|
-
"noResults": "Keine Ergebnisse gefunden"
|
|
43
|
-
}
|
|
44
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"nav": {
|
|
3
|
+
"home": "Startseite",
|
|
4
|
+
"profile": "Profil",
|
|
5
|
+
"settings": "Einstellungen",
|
|
6
|
+
"login": "Anmelden",
|
|
7
|
+
"signup": "Registrieren",
|
|
8
|
+
"logout": "Abmelden"
|
|
9
|
+
},
|
|
10
|
+
"auth": {
|
|
11
|
+
"loginTitle": "Willkommen zurueck",
|
|
12
|
+
"signupTitle": "Konto erstellen",
|
|
13
|
+
"email": "E-Mail",
|
|
14
|
+
"password": "Passwort",
|
|
15
|
+
"confirmPassword": "Passwort bestaetigen",
|
|
16
|
+
"name": "Name",
|
|
17
|
+
"forgotPassword": "Passwort vergessen?",
|
|
18
|
+
"noAccount": "Noch kein Konto?",
|
|
19
|
+
"hasAccount": "Bereits ein Konto?",
|
|
20
|
+
"resetPassword": "Passwort zuruecksetzen",
|
|
21
|
+
"loginButton": "Anmelden",
|
|
22
|
+
"signupButton": "Registrieren",
|
|
23
|
+
"resetButton": "Link senden"
|
|
24
|
+
},
|
|
25
|
+
"profile": {
|
|
26
|
+
"title": "Profil",
|
|
27
|
+
"editProfile": "Profil bearbeiten",
|
|
28
|
+
"name": "Name",
|
|
29
|
+
"email": "E-Mail",
|
|
30
|
+
"memberSince": "Mitglied seit"
|
|
31
|
+
},
|
|
32
|
+
"common": {
|
|
33
|
+
"save": "Speichern",
|
|
34
|
+
"cancel": "Abbrechen",
|
|
35
|
+
"delete": "Loeschen",
|
|
36
|
+
"loading": "Laden...",
|
|
37
|
+
"error": "Etwas ist schiefgelaufen",
|
|
38
|
+
"success": "Erfolgreich",
|
|
39
|
+
"confirm": "Bestaetigen",
|
|
40
|
+
"back": "Zurueck",
|
|
41
|
+
"search": "Suche",
|
|
42
|
+
"noResults": "Keine Ergebnisse gefunden"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
{
|
|
2
|
-
"nav": {
|
|
3
|
-
"home": "Home",
|
|
4
|
-
"profile": "Profile",
|
|
5
|
-
"settings": "Settings",
|
|
6
|
-
"login": "Log in",
|
|
7
|
-
"signup": "Sign up",
|
|
8
|
-
"logout": "Log out"
|
|
9
|
-
},
|
|
10
|
-
"auth": {
|
|
11
|
-
"loginTitle": "Welcome back",
|
|
12
|
-
"signupTitle": "Create your account",
|
|
13
|
-
"email": "Email",
|
|
14
|
-
"password": "Password",
|
|
15
|
-
"confirmPassword": "Confirm password",
|
|
16
|
-
"name": "Name",
|
|
17
|
-
"forgotPassword": "Forgot password?",
|
|
18
|
-
"noAccount": "Don't have an account?",
|
|
19
|
-
"hasAccount": "Already have an account?",
|
|
20
|
-
"resetPassword": "Reset password",
|
|
21
|
-
"loginButton": "Log in",
|
|
22
|
-
"signupButton": "Sign up",
|
|
23
|
-
"resetButton": "Send reset link"
|
|
24
|
-
},
|
|
25
|
-
"profile": {
|
|
26
|
-
"title": "Profile",
|
|
27
|
-
"editProfile": "Edit profile",
|
|
28
|
-
"name": "Name",
|
|
29
|
-
"email": "Email",
|
|
30
|
-
"memberSince": "Member since"
|
|
31
|
-
},
|
|
32
|
-
"common": {
|
|
33
|
-
"save": "Save",
|
|
34
|
-
"cancel": "Cancel",
|
|
35
|
-
"delete": "Delete",
|
|
36
|
-
"loading": "Loading...",
|
|
37
|
-
"error": "Something went wrong",
|
|
38
|
-
"success": "Success",
|
|
39
|
-
"confirm": "Confirm",
|
|
40
|
-
"back": "Back",
|
|
41
|
-
"search": "Search",
|
|
42
|
-
"noResults": "No results found"
|
|
43
|
-
}
|
|
44
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"nav": {
|
|
3
|
+
"home": "Home",
|
|
4
|
+
"profile": "Profile",
|
|
5
|
+
"settings": "Settings",
|
|
6
|
+
"login": "Log in",
|
|
7
|
+
"signup": "Sign up",
|
|
8
|
+
"logout": "Log out"
|
|
9
|
+
},
|
|
10
|
+
"auth": {
|
|
11
|
+
"loginTitle": "Welcome back",
|
|
12
|
+
"signupTitle": "Create your account",
|
|
13
|
+
"email": "Email",
|
|
14
|
+
"password": "Password",
|
|
15
|
+
"confirmPassword": "Confirm password",
|
|
16
|
+
"name": "Name",
|
|
17
|
+
"forgotPassword": "Forgot password?",
|
|
18
|
+
"noAccount": "Don't have an account?",
|
|
19
|
+
"hasAccount": "Already have an account?",
|
|
20
|
+
"resetPassword": "Reset password",
|
|
21
|
+
"loginButton": "Log in",
|
|
22
|
+
"signupButton": "Sign up",
|
|
23
|
+
"resetButton": "Send reset link"
|
|
24
|
+
},
|
|
25
|
+
"profile": {
|
|
26
|
+
"title": "Profile",
|
|
27
|
+
"editProfile": "Edit profile",
|
|
28
|
+
"name": "Name",
|
|
29
|
+
"email": "Email",
|
|
30
|
+
"memberSince": "Member since"
|
|
31
|
+
},
|
|
32
|
+
"common": {
|
|
33
|
+
"save": "Save",
|
|
34
|
+
"cancel": "Cancel",
|
|
35
|
+
"delete": "Delete",
|
|
36
|
+
"loading": "Loading...",
|
|
37
|
+
"error": "Something went wrong",
|
|
38
|
+
"success": "Success",
|
|
39
|
+
"confirm": "Confirm",
|
|
40
|
+
"back": "Back",
|
|
41
|
+
"search": "Search",
|
|
42
|
+
"noResults": "No results found"
|
|
43
|
+
}
|
|
44
|
+
}
|