@nlabs/metropolisjs 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/copilot-instructions.md +167 -0
- package/AGENTS.md +13 -0
- package/CHANGELOG.md +112 -0
- package/GRAPHQL_VALIDATION_RESULTS.md +158 -0
- package/PERMISSION_GRAPHQL_INTEGRATION.md +293 -0
- package/PERMISSION_IMPLEMENTATION_SUMMARY.md +243 -0
- package/README.md +1343 -0
- package/SIGNIN_GRAPHQL_VALIDATION.md +125 -0
- package/VAULT_GRAPHQL_API_FINDINGS.md +312 -0
- package/docs/ACTIONS.md +63 -0
- package/docs/COLLECTIONS.md +1038 -0
- package/docs/CONNECTIONS.md +1367 -0
- package/docs/CRUD_INTEGRATION.md +702 -0
- package/examples/connections-usage.tsx +909 -0
- package/examples/content-actions-usage.ts +144 -0
- package/examples/crud-usage.tsx +847 -0
- package/examples/extensibility-usage.tsx +889 -0
- package/examples/factory-pattern-usage.ts +283 -0
- package/examples/i18n-import-examples.ts +86 -0
- package/examples/i18n-namespace-usage.ts +118 -0
- package/examples/i18next-singleton-demo.ts +187 -0
- package/examples/permission-system-usage.tsx +415 -0
- package/examples/project-details.tsx +397 -0
- package/examples/shared-i18n-usage.tsx +203 -0
- package/examples/signup-error-handling.ts +100 -0
- package/examples/translation-types.ts +86 -0
- package/examples/translation-usage.tsx +336 -0
- package/factoryPatternGuide.md +244 -0
- package/index.js +1 -0
- package/jest.config.mjs +28 -0
- package/lex.config.mjs +26 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts +22 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts.map +1 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServer.js +197 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts +3 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts.map +1 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.js +52 -0
- package/lib/actions/appActions/appActions.d.ts +29 -0
- package/lib/actions/appActions/appActions.d.ts.map +1 -0
- package/lib/actions/appActions/appActions.js +159 -0
- package/lib/actions/connectionActions/connectionActions.d.ts +19 -0
- package/lib/actions/connectionActions/connectionActions.d.ts.map +1 -0
- package/lib/actions/connectionActions/connectionActions.js +131 -0
- package/lib/actions/contentActions/contentActions.d.ts +34 -0
- package/lib/actions/contentActions/contentActions.d.ts.map +1 -0
- package/lib/actions/contentActions/contentActions.js +314 -0
- package/lib/actions/conversationActions/conversationActions.d.ts +30 -0
- package/lib/actions/conversationActions/conversationActions.d.ts.map +1 -0
- package/lib/actions/conversationActions/conversationActions.js +225 -0
- package/lib/actions/eventActions/eventActions.d.ts +65 -0
- package/lib/actions/eventActions/eventActions.d.ts.map +1 -0
- package/lib/actions/eventActions/eventActions.js +436 -0
- package/lib/actions/groupActions/groupActions.d.ts +30 -0
- package/lib/actions/groupActions/groupActions.d.ts.map +1 -0
- package/lib/actions/groupActions/groupActions.js +229 -0
- package/lib/actions/imageActions/imageActions.d.ts +62 -0
- package/lib/actions/imageActions/imageActions.d.ts.map +1 -0
- package/lib/actions/imageActions/imageActions.js +593 -0
- package/lib/actions/index.d.ts +21 -0
- package/lib/actions/index.d.ts.map +1 -0
- package/lib/actions/index.js +22 -0
- package/lib/actions/locationActions/locationActions.d.ts +60 -0
- package/lib/actions/locationActions/locationActions.d.ts.map +1 -0
- package/lib/actions/locationActions/locationActions.js +388 -0
- package/lib/actions/messageActions/messageActions.d.ts +38 -0
- package/lib/actions/messageActions/messageActions.d.ts.map +1 -0
- package/lib/actions/messageActions/messageActions.js +235 -0
- package/lib/actions/permissionActions/permissionActions.d.ts +34 -0
- package/lib/actions/permissionActions/permissionActions.d.ts.map +1 -0
- package/lib/actions/permissionActions/permissionActions.js +330 -0
- package/lib/actions/personaActions/personaActions.d.ts +65 -0
- package/lib/actions/personaActions/personaActions.d.ts.map +1 -0
- package/lib/actions/personaActions/personaActions.js +572 -0
- package/lib/actions/postActions/postActions.d.ts +36 -0
- package/lib/actions/postActions/postActions.d.ts.map +1 -0
- package/lib/actions/postActions/postActions.js +447 -0
- package/lib/actions/reactionActions/reactionActions.d.ts +38 -0
- package/lib/actions/reactionActions/reactionActions.d.ts.map +1 -0
- package/lib/actions/reactionActions/reactionActions.js +413 -0
- package/lib/actions/sseActions/sseActions.d.ts +38 -0
- package/lib/actions/sseActions/sseActions.d.ts.map +1 -0
- package/lib/actions/sseActions/sseActions.js +148 -0
- package/lib/actions/subscriptionActions/subscriptionActions.d.ts +24 -0
- package/lib/actions/subscriptionActions/subscriptionActions.d.ts.map +1 -0
- package/lib/actions/subscriptionActions/subscriptionActions.js +329 -0
- package/lib/actions/tagActions/tagActions.d.ts +37 -0
- package/lib/actions/tagActions/tagActions.d.ts.map +1 -0
- package/lib/actions/tagActions/tagActions.js +347 -0
- package/lib/actions/translationActions/translationActions.d.ts +38 -0
- package/lib/actions/translationActions/translationActions.d.ts.map +1 -0
- package/lib/actions/translationActions/translationActions.js +189 -0
- package/lib/actions/userActions/userActions.d.ts +78 -0
- package/lib/actions/userActions/userActions.d.ts.map +1 -0
- package/lib/actions/userActions/userActions.js +844 -0
- package/lib/actions/videoActions/videoActions.d.ts +41 -0
- package/lib/actions/videoActions/videoActions.d.ts.map +1 -0
- package/lib/actions/videoActions/videoActions.js +532 -0
- package/lib/actions/websocketActions/websocketActions.d.ts +30 -0
- package/lib/actions/websocketActions/websocketActions.d.ts.map +1 -0
- package/lib/actions/websocketActions/websocketActions.js +377 -0
- package/lib/adapters/appAdapter/appAdapter.d.ts +8 -0
- package/lib/adapters/appAdapter/appAdapter.d.ts.map +1 -0
- package/lib/adapters/appAdapter/appAdapter.js +90 -0
- package/lib/adapters/arangoAdapter/arangoAdapter.d.ts +21 -0
- package/lib/adapters/arangoAdapter/arangoAdapter.d.ts.map +1 -0
- package/lib/adapters/arangoAdapter/arangoAdapter.js +75 -0
- package/lib/adapters/contentAdapter/contentAdapter.d.ts +32 -0
- package/lib/adapters/contentAdapter/contentAdapter.d.ts.map +1 -0
- package/lib/adapters/contentAdapter/contentAdapter.js +107 -0
- package/lib/adapters/conversationAdapter/conversationAdapter.d.ts +24 -0
- package/lib/adapters/conversationAdapter/conversationAdapter.d.ts.map +1 -0
- package/lib/adapters/conversationAdapter/conversationAdapter.js +75 -0
- package/lib/adapters/eventAdapter/eventAdapter.d.ts +46 -0
- package/lib/adapters/eventAdapter/eventAdapter.d.ts.map +1 -0
- package/lib/adapters/eventAdapter/eventAdapter.js +162 -0
- package/lib/adapters/fileAdapter/fileAdapter.d.ts +30 -0
- package/lib/adapters/fileAdapter/fileAdapter.d.ts.map +1 -0
- package/lib/adapters/fileAdapter/fileAdapter.js +118 -0
- package/lib/adapters/groupAdapter/groupAdapter.d.ts +28 -0
- package/lib/adapters/groupAdapter/groupAdapter.d.ts.map +1 -0
- package/lib/adapters/groupAdapter/groupAdapter.js +66 -0
- package/lib/adapters/imageAdapter/imageAdapter.d.ts +38 -0
- package/lib/adapters/imageAdapter/imageAdapter.d.ts.map +1 -0
- package/lib/adapters/imageAdapter/imageAdapter.js +134 -0
- package/lib/adapters/index.d.ts +34 -0
- package/lib/adapters/index.d.ts.map +1 -0
- package/lib/adapters/index.js +19 -0
- package/lib/adapters/locationAdapter/locationAdapter.d.ts +28 -0
- package/lib/adapters/locationAdapter/locationAdapter.d.ts.map +1 -0
- package/lib/adapters/locationAdapter/locationAdapter.js +95 -0
- package/lib/adapters/messageAdapter/messageAdapter.d.ts +31 -0
- package/lib/adapters/messageAdapter/messageAdapter.d.ts.map +1 -0
- package/lib/adapters/messageAdapter/messageAdapter.js +82 -0
- package/lib/adapters/permissionAdapter/permissionAdapter.d.ts +41 -0
- package/lib/adapters/permissionAdapter/permissionAdapter.d.ts.map +1 -0
- package/lib/adapters/permissionAdapter/permissionAdapter.js +120 -0
- package/lib/adapters/personaAdapter/personaAdapter.d.ts +44 -0
- package/lib/adapters/personaAdapter/personaAdapter.d.ts.map +1 -0
- package/lib/adapters/personaAdapter/personaAdapter.js +161 -0
- package/lib/adapters/postAdapter/postAdapter.d.ts +33 -0
- package/lib/adapters/postAdapter/postAdapter.d.ts.map +1 -0
- package/lib/adapters/postAdapter/postAdapter.js +115 -0
- package/lib/adapters/reactionAdapter/reactionAdapter.d.ts +23 -0
- package/lib/adapters/reactionAdapter/reactionAdapter.d.ts.map +1 -0
- package/lib/adapters/reactionAdapter/reactionAdapter.js +81 -0
- package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts +17 -0
- package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts.map +1 -0
- package/lib/adapters/reaktorAdapter/reaktorAdapter.js +58 -0
- package/lib/adapters/sessionAdapter/sessionAdapter.d.ts +24 -0
- package/lib/adapters/sessionAdapter/sessionAdapter.d.ts.map +1 -0
- package/lib/adapters/sessionAdapter/sessionAdapter.js +80 -0
- package/lib/adapters/tagAdapter/tagAdapter.d.ts +21 -0
- package/lib/adapters/tagAdapter/tagAdapter.d.ts.map +1 -0
- package/lib/adapters/tagAdapter/tagAdapter.js +98 -0
- package/lib/adapters/translationAdapter/translationAdapter.d.ts +21 -0
- package/lib/adapters/translationAdapter/translationAdapter.d.ts.map +1 -0
- package/lib/adapters/translationAdapter/translationAdapter.js +55 -0
- package/lib/adapters/userAdapter/userAdapter.d.ts +67 -0
- package/lib/adapters/userAdapter/userAdapter.d.ts.map +1 -0
- package/lib/adapters/userAdapter/userAdapter.js +302 -0
- package/lib/adapters/videoAdapter/videoAdapter.d.ts +8 -0
- package/lib/adapters/videoAdapter/videoAdapter.d.ts.map +1 -0
- package/lib/adapters/videoAdapter/videoAdapter.js +194 -0
- package/lib/config/index.d.ts +44 -0
- package/lib/config/index.d.ts.map +1 -0
- package/lib/config/index.js +97 -0
- package/lib/constants/Collections.d.ts +44 -0
- package/lib/constants/Collections.d.ts.map +1 -0
- package/lib/constants/Collections.js +40 -0
- package/lib/constants/MetropolisConstants.d.ts +15 -0
- package/lib/constants/MetropolisConstants.d.ts.map +1 -0
- package/lib/constants/MetropolisConstants.js +15 -0
- package/lib/graphql/message.d.ts +3 -0
- package/lib/graphql/message.d.ts.map +1 -0
- package/lib/graphql/message.js +20 -0
- package/lib/graphql/notification.d.ts +3 -0
- package/lib/graphql/notification.d.ts.map +1 -0
- package/lib/graphql/notification.js +20 -0
- package/lib/graphql/session.d.ts +2 -0
- package/lib/graphql/session.d.ts.map +1 -0
- package/lib/graphql/session.js +17 -0
- package/lib/index.d.ts +52 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +248 -0
- package/lib/stores/appStore.d.ts +23 -0
- package/lib/stores/appStore.d.ts.map +1 -0
- package/lib/stores/appStore.js +23 -0
- package/lib/stores/contentStore.d.ts +36 -0
- package/lib/stores/contentStore.d.ts.map +1 -0
- package/lib/stores/contentStore.js +139 -0
- package/lib/stores/conversationStore.d.ts +38 -0
- package/lib/stores/conversationStore.d.ts.map +1 -0
- package/lib/stores/conversationStore.js +117 -0
- package/lib/stores/eventStore.d.ts +37 -0
- package/lib/stores/eventStore.d.ts.map +1 -0
- package/lib/stores/eventStore.js +47 -0
- package/lib/stores/groupStore.d.ts +37 -0
- package/lib/stores/groupStore.d.ts.map +1 -0
- package/lib/stores/groupStore.js +68 -0
- package/lib/stores/imageStore.d.ts +40 -0
- package/lib/stores/imageStore.d.ts.map +1 -0
- package/lib/stores/imageStore.js +53 -0
- package/lib/stores/index.d.ts +24 -0
- package/lib/stores/index.d.ts.map +1 -0
- package/lib/stores/index.js +24 -0
- package/lib/stores/locationStore.d.ts +34 -0
- package/lib/stores/locationStore.d.ts.map +1 -0
- package/lib/stores/locationStore.js +42 -0
- package/lib/stores/messageStore.d.ts +51 -0
- package/lib/stores/messageStore.d.ts.map +1 -0
- package/lib/stores/messageStore.js +137 -0
- package/lib/stores/notificationStore.d.ts +33 -0
- package/lib/stores/notificationStore.d.ts.map +1 -0
- package/lib/stores/notificationStore.js +55 -0
- package/lib/stores/permissionStore.d.ts +37 -0
- package/lib/stores/permissionStore.d.ts.map +1 -0
- package/lib/stores/permissionStore.js +117 -0
- package/lib/stores/personaStore.d.ts +26 -0
- package/lib/stores/personaStore.d.ts.map +1 -0
- package/lib/stores/personaStore.js +118 -0
- package/lib/stores/postStore.d.ts +34 -0
- package/lib/stores/postStore.d.ts.map +1 -0
- package/lib/stores/postStore.js +53 -0
- package/lib/stores/reactionStore.d.ts +25 -0
- package/lib/stores/reactionStore.d.ts.map +1 -0
- package/lib/stores/reactionStore.js +28 -0
- package/lib/stores/subscriptionStore.d.ts +41 -0
- package/lib/stores/subscriptionStore.d.ts.map +1 -0
- package/lib/stores/subscriptionStore.js +85 -0
- package/lib/stores/tagStore.d.ts +34 -0
- package/lib/stores/tagStore.d.ts.map +1 -0
- package/lib/stores/tagStore.js +87 -0
- package/lib/stores/translationStore.d.ts +42 -0
- package/lib/stores/translationStore.d.ts.map +1 -0
- package/lib/stores/translationStore.js +122 -0
- package/lib/stores/userStore.d.ts +74 -0
- package/lib/stores/userStore.d.ts.map +1 -0
- package/lib/stores/userStore.js +319 -0
- package/lib/stores/videoStore.d.ts +39 -0
- package/lib/stores/videoStore.d.ts.map +1 -0
- package/lib/stores/videoStore.js +132 -0
- package/lib/stores/websocketStore.d.ts +24 -0
- package/lib/stores/websocketStore.d.ts.map +1 -0
- package/lib/stores/websocketStore.js +51 -0
- package/lib/types/apps.types.d.ts +17 -0
- package/lib/types/apps.types.d.ts.map +1 -0
- package/lib/types/apps.types.js +6 -0
- package/lib/types/common.types.d.ts +31 -0
- package/lib/types/common.types.d.ts.map +1 -0
- package/lib/types/common.types.js +6 -0
- package/lib/types/conversations.types.d.ts +17 -0
- package/lib/types/conversations.types.d.ts.map +1 -0
- package/lib/types/conversations.types.js +6 -0
- package/lib/types/edges.types.d.ts +38 -0
- package/lib/types/edges.types.d.ts.map +1 -0
- package/lib/types/edges.types.js +6 -0
- package/lib/types/groups.types.d.ts +19 -0
- package/lib/types/groups.types.d.ts.map +1 -0
- package/lib/types/groups.types.js +6 -0
- package/lib/types/index.d.ts +12 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +12 -0
- package/lib/types/subscriptions.types.d.ts +32 -0
- package/lib/types/subscriptions.types.d.ts.map +1 -0
- package/lib/types/subscriptions.types.js +6 -0
- package/lib/types/videos.types.d.ts +61 -0
- package/lib/types/videos.types.d.ts.map +1 -0
- package/lib/types/videos.types.js +6 -0
- package/lib/utils/MetropolisProvider.d.ts +58 -0
- package/lib/utils/MetropolisProvider.d.ts.map +1 -0
- package/lib/utils/MetropolisProvider.js +31 -0
- package/lib/utils/actionFactory.d.ts +24 -0
- package/lib/utils/actionFactory.d.ts.map +1 -0
- package/lib/utils/actionFactory.js +95 -0
- package/lib/utils/api.d.ts +44 -0
- package/lib/utils/api.d.ts.map +1 -0
- package/lib/utils/api.js +253 -0
- package/lib/utils/app.d.ts +7 -0
- package/lib/utils/app.d.ts.map +1 -0
- package/lib/utils/app.js +15 -0
- package/lib/utils/baseActionFactory.d.ts +16 -0
- package/lib/utils/baseActionFactory.d.ts.map +1 -0
- package/lib/utils/baseActionFactory.js +72 -0
- package/lib/utils/configUtils.d.ts +11 -0
- package/lib/utils/configUtils.d.ts.map +1 -0
- package/lib/utils/configUtils.js +20 -0
- package/lib/utils/dateUtils.d.ts +3 -0
- package/lib/utils/dateUtils.d.ts.map +1 -0
- package/lib/utils/dateUtils.js +11 -0
- package/lib/utils/file.d.ts +3 -0
- package/lib/utils/file.d.ts.map +1 -0
- package/lib/utils/file.js +156 -0
- package/lib/utils/i18n.d.ts +7 -0
- package/lib/utils/i18n.d.ts.map +1 -0
- package/lib/utils/i18n.js +96 -0
- package/lib/utils/index.d.ts +20 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +26 -0
- package/lib/utils/location.d.ts +10 -0
- package/lib/utils/location.d.ts.map +1 -0
- package/lib/utils/location.js +82 -0
- package/lib/utils/permissionUtils.d.ts +22 -0
- package/lib/utils/permissionUtils.d.ts.map +1 -0
- package/lib/utils/permissionUtils.js +72 -0
- package/lib/utils/requestCache.d.ts +8 -0
- package/lib/utils/requestCache.d.ts.map +1 -0
- package/lib/utils/requestCache.js +53 -0
- package/lib/utils/session.d.ts +14 -0
- package/lib/utils/session.d.ts.map +1 -0
- package/lib/utils/session.js +107 -0
- package/lib/utils/useConversationTyping.d.ts +26 -0
- package/lib/utils/useConversationTyping.d.ts.map +1 -0
- package/lib/utils/useConversationTyping.js +117 -0
- package/lib/utils/useMetropolis.d.ts +67 -0
- package/lib/utils/useMetropolis.d.ts.map +1 -0
- package/lib/utils/useMetropolis.js +311 -0
- package/lib/utils/useTranslations.d.ts +16 -0
- package/lib/utils/useTranslations.d.ts.map +1 -0
- package/lib/utils/useTranslations.js +105 -0
- package/lib/utils/validatorFactory.d.ts +49 -0
- package/lib/utils/validatorFactory.d.ts.map +1 -0
- package/lib/utils/validatorFactory.js +95 -0
- package/package.json +75 -28
- package/temp_signin.ts +73 -0
- package/tsconfig.lint.json +25 -0
- package/tsconfig.test.json +14 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { useFlux } from '@nlabs/arkhamjs-utils-react';
|
|
2
|
+
import { useContext, useMemo } from 'react';
|
|
3
|
+
import { createActions, createAllActions } from '../utils/actionFactory.js';
|
|
4
|
+
import { MetropolisContext } from './MetropolisProvider.js';
|
|
5
|
+
/**
|
|
6
|
+
* Builds action options from adapters in a type-safe way.
|
|
7
|
+
*/ const buildActionOptions = (adapters)=>{
|
|
8
|
+
if (!adapters) {
|
|
9
|
+
return {};
|
|
10
|
+
}
|
|
11
|
+
const options = {};
|
|
12
|
+
if (adapters.Content) {
|
|
13
|
+
options.content = {
|
|
14
|
+
contentAdapter: adapters.Content
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (adapters.Event) {
|
|
18
|
+
options.event = {
|
|
19
|
+
eventAdapter: adapters.Event
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (adapters.Image) {
|
|
23
|
+
options.image = {
|
|
24
|
+
imageAdapter: adapters.Image
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (adapters.Location) {
|
|
28
|
+
options.location = {
|
|
29
|
+
locationAdapter: adapters.Location
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if (adapters.Message) {
|
|
33
|
+
options.message = {
|
|
34
|
+
messageAdapter: adapters.Message
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (adapters.Permission) {
|
|
38
|
+
options.permission = {
|
|
39
|
+
permissionAdapter: adapters.Permission
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (adapters.Post) {
|
|
43
|
+
options.post = {
|
|
44
|
+
postAdapter: adapters.Post
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if (adapters.Persona) {
|
|
48
|
+
options.persona = {
|
|
49
|
+
personaAdapter: adapters.Persona
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (adapters.Reaction) {
|
|
53
|
+
options.reaction = {
|
|
54
|
+
reactionAdapter: adapters.Reaction
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (adapters.Tag) {
|
|
58
|
+
options.tag = {
|
|
59
|
+
tagAdapter: adapters.Tag
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (adapters.Translation) {
|
|
63
|
+
options.translation = {
|
|
64
|
+
translationAdapter: adapters.Translation
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (adapters.User) {
|
|
68
|
+
options.user = {
|
|
69
|
+
userAdapter: adapters.User
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
if (adapters.Video) {
|
|
73
|
+
options.video = {
|
|
74
|
+
videoAdapter: adapters.Video
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return options;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Maps action type keys to their action names for return object.
|
|
81
|
+
*/ const mapActionsToReturnKeys = (actions)=>{
|
|
82
|
+
const mapped = {};
|
|
83
|
+
if (actions.content) {
|
|
84
|
+
mapped.contentActions = actions.content;
|
|
85
|
+
}
|
|
86
|
+
if (actions.event) {
|
|
87
|
+
mapped.eventActions = actions.event;
|
|
88
|
+
}
|
|
89
|
+
if (actions.group) {
|
|
90
|
+
mapped.groupActions = actions.group;
|
|
91
|
+
}
|
|
92
|
+
if (actions.image) {
|
|
93
|
+
mapped.imageActions = actions.image;
|
|
94
|
+
}
|
|
95
|
+
if (actions.location) {
|
|
96
|
+
mapped.locationActions = actions.location;
|
|
97
|
+
}
|
|
98
|
+
if (actions.message) {
|
|
99
|
+
mapped.messageActions = actions.message;
|
|
100
|
+
}
|
|
101
|
+
if (actions.permission) {
|
|
102
|
+
mapped.permissionActions = actions.permission;
|
|
103
|
+
}
|
|
104
|
+
if (actions.post) {
|
|
105
|
+
mapped.postActions = actions.post;
|
|
106
|
+
}
|
|
107
|
+
if (actions.persona) {
|
|
108
|
+
mapped.personaActions = actions.persona;
|
|
109
|
+
}
|
|
110
|
+
if (actions.reaction) {
|
|
111
|
+
mapped.reactionActions = actions.reaction;
|
|
112
|
+
}
|
|
113
|
+
if (actions.subscription) {
|
|
114
|
+
mapped.subscriptionActions = actions.subscription;
|
|
115
|
+
}
|
|
116
|
+
if (actions.tag) {
|
|
117
|
+
mapped.tagActions = actions.tag;
|
|
118
|
+
}
|
|
119
|
+
if (actions.translation) {
|
|
120
|
+
mapped.translationActions = actions.translation;
|
|
121
|
+
}
|
|
122
|
+
if (actions.user) {
|
|
123
|
+
mapped.userActions = actions.user;
|
|
124
|
+
}
|
|
125
|
+
if (actions.video) {
|
|
126
|
+
mapped.videoActions = actions.video;
|
|
127
|
+
}
|
|
128
|
+
if (actions.websocket) {
|
|
129
|
+
mapped.websocketActions = actions.websocket;
|
|
130
|
+
}
|
|
131
|
+
return mapped;
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* Main hook to access Metropolis actions.
|
|
135
|
+
*
|
|
136
|
+
* @param actionTypes - Optional array of action types to create. If not provided, creates all actions.
|
|
137
|
+
* @returns Object containing the requested actions
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```tsx
|
|
141
|
+
* // Get all actions (default behavior)
|
|
142
|
+
* const {userActions, postActions} = useMetropolis();
|
|
143
|
+
*
|
|
144
|
+
* // Get only specific actions (more performant)
|
|
145
|
+
* const {userActions} = useMetropolis(['user']);
|
|
146
|
+
* const {userActions, postActions} = useMetropolis(['user', 'post']);
|
|
147
|
+
* ```
|
|
148
|
+
*/ export const useMetropolis = (actionTypes)=>{
|
|
149
|
+
const context = useContext(MetropolisContext);
|
|
150
|
+
// Use flux from context if available, otherwise fall back to useFlux() for backward compatibility
|
|
151
|
+
const contextFlux = context?.flux;
|
|
152
|
+
const hookFlux = useFlux();
|
|
153
|
+
const flux = contextFlux || hookFlux;
|
|
154
|
+
const { adapters } = context;
|
|
155
|
+
const actionOptions = useMemo(()=>buildActionOptions(adapters), [
|
|
156
|
+
adapters
|
|
157
|
+
]);
|
|
158
|
+
return useMemo(()=>{
|
|
159
|
+
let actions;
|
|
160
|
+
if (actionTypes && actionTypes.length > 0) {
|
|
161
|
+
// Create only requested actions
|
|
162
|
+
actions = createActions(actionTypes, flux, actionOptions);
|
|
163
|
+
} else {
|
|
164
|
+
// Create all actions (default behavior for backward compatibility)
|
|
165
|
+
const allActions = createAllActions(flux, actionOptions);
|
|
166
|
+
actions = allActions;
|
|
167
|
+
}
|
|
168
|
+
// Map to return keys (contentActions, userActions, etc.)
|
|
169
|
+
return mapActionsToReturnKeys(actions);
|
|
170
|
+
}, [
|
|
171
|
+
flux,
|
|
172
|
+
actionOptions,
|
|
173
|
+
actionTypes?.join(',')
|
|
174
|
+
]);
|
|
175
|
+
};
|
|
176
|
+
/**
|
|
177
|
+
* Hook to access the Metropolis configuration from context.
|
|
178
|
+
*
|
|
179
|
+
* @returns The resolved environment-specific configuration
|
|
180
|
+
* @throws Error if used outside of Metropolis component
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* ```tsx
|
|
184
|
+
* const config = useMetropolisConfig();
|
|
185
|
+
* const apiUrl = config.app?.api?.url;
|
|
186
|
+
* ```
|
|
187
|
+
*/ export const useMetropolisConfig = ()=>{
|
|
188
|
+
const context = useContext(MetropolisContext);
|
|
189
|
+
if (!context?.config) {
|
|
190
|
+
throw new Error('useMetropolisConfig must be used within a Metropolis component. ' + 'Make sure your component is wrapped with <Metropolis> provider.');
|
|
191
|
+
}
|
|
192
|
+
return context.config;
|
|
193
|
+
};
|
|
194
|
+
/**
|
|
195
|
+
* Hook to access the Flux framework instance from context.
|
|
196
|
+
*
|
|
197
|
+
* @returns The Flux framework instance
|
|
198
|
+
* @throws Error if used outside of Metropolis component and no Flux available
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* ```tsx
|
|
202
|
+
* const flux = useMetropolisFlux();
|
|
203
|
+
* const state = flux.getState('user.session');
|
|
204
|
+
* ```
|
|
205
|
+
*/ export const useMetropolisFlux = ()=>{
|
|
206
|
+
const context = useContext(MetropolisContext);
|
|
207
|
+
const hookFlux = useFlux();
|
|
208
|
+
// Use flux from context if available, otherwise fall back to useFlux() for backward compatibility
|
|
209
|
+
return context?.flux || hookFlux;
|
|
210
|
+
};
|
|
211
|
+
/**
|
|
212
|
+
* Specialized hooks for individual action types.
|
|
213
|
+
* These hooks only create the specific action type, improving performance.
|
|
214
|
+
*/ export const useContentActions = ()=>{
|
|
215
|
+
const { contentActions } = useMetropolis([
|
|
216
|
+
'content'
|
|
217
|
+
]);
|
|
218
|
+
return contentActions;
|
|
219
|
+
};
|
|
220
|
+
export const useEventActions = ()=>{
|
|
221
|
+
const { eventActions } = useMetropolis([
|
|
222
|
+
'event'
|
|
223
|
+
]);
|
|
224
|
+
return eventActions;
|
|
225
|
+
};
|
|
226
|
+
export const useGroupActions = ()=>{
|
|
227
|
+
const { groupActions } = useMetropolis([
|
|
228
|
+
'group'
|
|
229
|
+
]);
|
|
230
|
+
return groupActions;
|
|
231
|
+
};
|
|
232
|
+
export const useImageActions = ()=>{
|
|
233
|
+
const { imageActions } = useMetropolis([
|
|
234
|
+
'image'
|
|
235
|
+
]);
|
|
236
|
+
return imageActions;
|
|
237
|
+
};
|
|
238
|
+
export const useLocationActions = ()=>{
|
|
239
|
+
const { locationActions } = useMetropolis([
|
|
240
|
+
'location'
|
|
241
|
+
]);
|
|
242
|
+
return locationActions;
|
|
243
|
+
};
|
|
244
|
+
export const useMessageActions = ()=>{
|
|
245
|
+
const { messageActions } = useMetropolis([
|
|
246
|
+
'message'
|
|
247
|
+
]);
|
|
248
|
+
return messageActions;
|
|
249
|
+
};
|
|
250
|
+
export const useSubscriptionActions = ()=>{
|
|
251
|
+
const { subscriptionActions } = useMetropolis([
|
|
252
|
+
'subscription'
|
|
253
|
+
]);
|
|
254
|
+
return subscriptionActions;
|
|
255
|
+
};
|
|
256
|
+
export const usePermissionActions = ()=>{
|
|
257
|
+
const { permissionActions } = useMetropolis([
|
|
258
|
+
'permission'
|
|
259
|
+
]);
|
|
260
|
+
return permissionActions;
|
|
261
|
+
};
|
|
262
|
+
export const usePostActions = ()=>{
|
|
263
|
+
const { postActions } = useMetropolis([
|
|
264
|
+
'post'
|
|
265
|
+
]);
|
|
266
|
+
return postActions;
|
|
267
|
+
};
|
|
268
|
+
export const usePersonaActions = ()=>{
|
|
269
|
+
const { personaActions } = useMetropolis([
|
|
270
|
+
'persona'
|
|
271
|
+
]);
|
|
272
|
+
return personaActions;
|
|
273
|
+
};
|
|
274
|
+
export const useReactionActions = ()=>{
|
|
275
|
+
const { reactionActions } = useMetropolis([
|
|
276
|
+
'reaction'
|
|
277
|
+
]);
|
|
278
|
+
return reactionActions;
|
|
279
|
+
};
|
|
280
|
+
export const useTagActions = ()=>{
|
|
281
|
+
const { tagActions } = useMetropolis([
|
|
282
|
+
'tag'
|
|
283
|
+
]);
|
|
284
|
+
return tagActions;
|
|
285
|
+
};
|
|
286
|
+
export const useVideoActions = ()=>{
|
|
287
|
+
const { videoActions } = useMetropolis([
|
|
288
|
+
'video'
|
|
289
|
+
]);
|
|
290
|
+
return videoActions;
|
|
291
|
+
};
|
|
292
|
+
export const useTranslationActions = ()=>{
|
|
293
|
+
const { translationActions } = useMetropolis([
|
|
294
|
+
'translation'
|
|
295
|
+
]);
|
|
296
|
+
return translationActions;
|
|
297
|
+
};
|
|
298
|
+
export const useUserActions = ()=>{
|
|
299
|
+
const { userActions } = useMetropolis([
|
|
300
|
+
'user'
|
|
301
|
+
]);
|
|
302
|
+
return userActions;
|
|
303
|
+
};
|
|
304
|
+
export const useWebsocketActions = ()=>{
|
|
305
|
+
const { websocketActions } = useMetropolis([
|
|
306
|
+
'websocket'
|
|
307
|
+
]);
|
|
308
|
+
return websocketActions;
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvdXRpbHMvdXNlTWV0cm9wb2xpcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3VzZUZsdXh9IGZyb20gJ0BubGFicy9hcmtoYW1qcy11dGlscy1yZWFjdCc7XG5pbXBvcnQge3VzZUNvbnRleHQsIHVzZU1lbW99IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHR5cGUge0ZsdXhGcmFtZXdvcmt9IGZyb20gJ0BubGFicy9hcmtoYW1qcyc7XG5pbXBvcnQgdHlwZSB7TWV0cm9wb2xpc0Vudmlyb25tZW50Q29uZmlndXJhdGlvbn0gZnJvbSAnLi4vY29uZmlnL2luZGV4LmpzJztcbmltcG9ydCB7Y3JlYXRlQWN0aW9ucywgY3JlYXRlQWxsQWN0aW9uc30gZnJvbSAnLi4vdXRpbHMvYWN0aW9uRmFjdG9yeS5qcyc7XG5pbXBvcnQgdHlwZSB7TWV0cm9wb2xpc0FkYXB0ZXJzfSBmcm9tICcuL01ldHJvcG9saXNQcm92aWRlci5qcyc7XG5pbXBvcnQge01ldHJvcG9saXNDb250ZXh0fSBmcm9tICcuL01ldHJvcG9saXNQcm92aWRlci5qcyc7XG5pbXBvcnQgdHlwZSB7QWN0aW9uT3B0aW9ucywgQWN0aW9uVHlwZX0gZnJvbSAnLi4vdXRpbHMvYWN0aW9uRmFjdG9yeS5qcyc7XG5cbi8qKlxuICogQnVpbGRzIGFjdGlvbiBvcHRpb25zIGZyb20gYWRhcHRlcnMgaW4gYSB0eXBlLXNhZmUgd2F5LlxuICovXG5jb25zdCBidWlsZEFjdGlvbk9wdGlvbnMgPSAoXG4gIGFkYXB0ZXJzPzogTWV0cm9wb2xpc0FkYXB0ZXJzXG4pOiBQYXJ0aWFsPFJlY29yZDxBY3Rpb25UeXBlLCBBY3Rpb25PcHRpb25zPj4gPT4ge1xuICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3Qgb3B0aW9uczogUGFydGlhbDxSZWNvcmQ8QWN0aW9uVHlwZSwgQWN0aW9uT3B0aW9ucz4+ID0ge307XG5cbiAgaWYgKGFkYXB0ZXJzLkNvbnRlbnQpIHtcbiAgICBvcHRpb25zLmNvbnRlbnQgPSB7Y29udGVudEFkYXB0ZXI6IGFkYXB0ZXJzLkNvbnRlbnR9O1xuICB9XG4gIGlmIChhZGFwdGVycy5FdmVudCkge1xuICAgIG9wdGlvbnMuZXZlbnQgPSB7ZXZlbnRBZGFwdGVyOiBhZGFwdGVycy5FdmVudH07XG4gIH1cbiAgaWYgKGFkYXB0ZXJzLkltYWdlKSB7XG4gICAgb3B0aW9ucy5pbWFnZSA9IHtpbWFnZUFkYXB0ZXI6IGFkYXB0ZXJzLkltYWdlfTtcbiAgfVxuICBpZiAoYWRhcHRlcnMuTG9jYXRpb24pIHtcbiAgICBvcHRpb25zLmxvY2F0aW9uID0ge2xvY2F0aW9uQWRhcHRlcjogYWRhcHRlcnMuTG9jYXRpb259O1xuICB9XG4gIGlmIChhZGFwdGVycy5NZXNzYWdlKSB7XG4gICAgb3B0aW9ucy5tZXNzYWdlID0ge21lc3NhZ2VBZGFwdGVyOiBhZGFwdGVycy5NZXNzYWdlfTtcbiAgfVxuICBpZiAoYWRhcHRlcnMuUGVybWlzc2lvbikge1xuICAgIG9wdGlvbnMucGVybWlzc2lvbiA9IHtwZXJtaXNzaW9uQWRhcHRlcjogYWRhcHRlcnMuUGVybWlzc2lvbn07XG4gIH1cbiAgaWYgKGFkYXB0ZXJzLlBvc3QpIHtcbiAgICBvcHRpb25zLnBvc3QgPSB7cG9zdEFkYXB0ZXI6IGFkYXB0ZXJzLlBvc3R9O1xuICB9XG4gIGlmIChhZGFwdGVycy5QZXJzb25hKSB7XG4gICAgb3B0aW9ucy5wZXJzb25hID0ge3BlcnNvbmFBZGFwdGVyOiBhZGFwdGVycy5QZXJzb25hfTtcbiAgfVxuICBpZiAoYWRhcHRlcnMuUmVhY3Rpb24pIHtcbiAgICBvcHRpb25zLnJlYWN0aW9uID0ge3JlYWN0aW9uQWRhcHRlcjogYWRhcHRlcnMuUmVhY3Rpb259O1xuICB9XG4gIGlmIChhZGFwdGVycy5UYWcpIHtcbiAgICBvcHRpb25zLnRhZyA9IHt0YWdBZGFwdGVyOiBhZGFwdGVycy5UYWd9O1xuICB9XG4gIGlmIChhZGFwdGVycy5UcmFuc2xhdGlvbikge1xuICAgIG9wdGlvbnMudHJhbnNsYXRpb24gPSB7dHJhbnNsYXRpb25BZGFwdGVyOiBhZGFwdGVycy5UcmFuc2xhdGlvbn07XG4gIH1cbiAgaWYgKGFkYXB0ZXJzLlVzZXIpIHtcbiAgICBvcHRpb25zLnVzZXIgPSB7dXNlckFkYXB0ZXI6IGFkYXB0ZXJzLlVzZXJ9O1xuICB9XG4gIGlmIChhZGFwdGVycy5WaWRlbykge1xuICAgIG9wdGlvbnMudmlkZW8gPSB7dmlkZW9BZGFwdGVyOiBhZGFwdGVycy5WaWRlb307XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn07XG5cbi8qKlxuICogTWFwcyBhY3Rpb24gdHlwZSBrZXlzIHRvIHRoZWlyIGFjdGlvbiBuYW1lcyBmb3IgcmV0dXJuIG9iamVjdC5cbiAqL1xuY29uc3QgbWFwQWN0aW9uc1RvUmV0dXJuS2V5cyA9IChhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiA9PiB7XG4gIGNvbnN0IG1hcHBlZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGlmIChhY3Rpb25zLmNvbnRlbnQpIHtcbiAgICBtYXBwZWQuY29udGVudEFjdGlvbnMgPSBhY3Rpb25zLmNvbnRlbnQ7XG4gIH1cbiAgaWYgKGFjdGlvbnMuZXZlbnQpIHtcbiAgICBtYXBwZWQuZXZlbnRBY3Rpb25zID0gYWN0aW9ucy5ldmVudDtcbiAgfVxuICBpZiAoYWN0aW9ucy5ncm91cCkge1xuICAgIG1hcHBlZC5ncm91cEFjdGlvbnMgPSBhY3Rpb25zLmdyb3VwO1xuICB9XG4gIGlmIChhY3Rpb25zLmltYWdlKSB7XG4gICAgbWFwcGVkLmltYWdlQWN0aW9ucyA9IGFjdGlvbnMuaW1hZ2U7XG4gIH1cbiAgaWYgKGFjdGlvbnMubG9jYXRpb24pIHtcbiAgICBtYXBwZWQubG9jYXRpb25BY3Rpb25zID0gYWN0aW9ucy5sb2NhdGlvbjtcbiAgfVxuICBpZiAoYWN0aW9ucy5tZXNzYWdlKSB7XG4gICAgbWFwcGVkLm1lc3NhZ2VBY3Rpb25zID0gYWN0aW9ucy5tZXNzYWdlO1xuICB9XG4gIGlmIChhY3Rpb25zLnBlcm1pc3Npb24pIHtcbiAgICBtYXBwZWQucGVybWlzc2lvbkFjdGlvbnMgPSBhY3Rpb25zLnBlcm1pc3Npb247XG4gIH1cbiAgaWYgKGFjdGlvbnMucG9zdCkge1xuICAgIG1hcHBlZC5wb3N0QWN0aW9ucyA9IGFjdGlvbnMucG9zdDtcbiAgfVxuICBpZiAoYWN0aW9ucy5wZXJzb25hKSB7XG4gICAgbWFwcGVkLnBlcnNvbmFBY3Rpb25zID0gYWN0aW9ucy5wZXJzb25hO1xuICB9XG4gIGlmIChhY3Rpb25zLnJlYWN0aW9uKSB7XG4gICAgbWFwcGVkLnJlYWN0aW9uQWN0aW9ucyA9IGFjdGlvbnMucmVhY3Rpb247XG4gIH1cbiAgaWYgKGFjdGlvbnMuc3Vic2NyaXB0aW9uKSB7XG4gICAgbWFwcGVkLnN1YnNjcmlwdGlvbkFjdGlvbnMgPSBhY3Rpb25zLnN1YnNjcmlwdGlvbjtcbiAgfVxuICBpZiAoYWN0aW9ucy50YWcpIHtcbiAgICBtYXBwZWQudGFnQWN0aW9ucyA9IGFjdGlvbnMudGFnO1xuICB9XG4gIGlmIChhY3Rpb25zLnRyYW5zbGF0aW9uKSB7XG4gICAgbWFwcGVkLnRyYW5zbGF0aW9uQWN0aW9ucyA9IGFjdGlvbnMudHJhbnNsYXRpb247XG4gIH1cbiAgaWYgKGFjdGlvbnMudXNlcikge1xuICAgIG1hcHBlZC51c2VyQWN0aW9ucyA9IGFjdGlvbnMudXNlcjtcbiAgfVxuICBpZiAoYWN0aW9ucy52aWRlbykge1xuICAgIG1hcHBlZC52aWRlb0FjdGlvbnMgPSBhY3Rpb25zLnZpZGVvO1xuICB9XG4gIGlmIChhY3Rpb25zLndlYnNvY2tldCkge1xuICAgIG1hcHBlZC53ZWJzb2NrZXRBY3Rpb25zID0gYWN0aW9ucy53ZWJzb2NrZXQ7XG4gIH1cblxuICByZXR1cm4gbWFwcGVkO1xufTtcblxuLyoqXG4gKiBNYWluIGhvb2sgdG8gYWNjZXNzIE1ldHJvcG9saXMgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gYWN0aW9uVHlwZXMgLSBPcHRpb25hbCBhcnJheSBvZiBhY3Rpb24gdHlwZXMgdG8gY3JlYXRlLiBJZiBub3QgcHJvdmlkZWQsIGNyZWF0ZXMgYWxsIGFjdGlvbnMuXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIGFjdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiAvLyBHZXQgYWxsIGFjdGlvbnMgKGRlZmF1bHQgYmVoYXZpb3IpXG4gKiBjb25zdCB7dXNlckFjdGlvbnMsIHBvc3RBY3Rpb25zfSA9IHVzZU1ldHJvcG9saXMoKTtcbiAqXG4gKiAvLyBHZXQgb25seSBzcGVjaWZpYyBhY3Rpb25zIChtb3JlIHBlcmZvcm1hbnQpXG4gKiBjb25zdCB7dXNlckFjdGlvbnN9ID0gdXNlTWV0cm9wb2xpcyhbJ3VzZXInXSk7XG4gKiBjb25zdCB7dXNlckFjdGlvbnMsIHBvc3RBY3Rpb25zfSA9IHVzZU1ldHJvcG9saXMoWyd1c2VyJywgJ3Bvc3QnXSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZU1ldHJvcG9saXMgPSA8VCBleHRlbmRzIEFjdGlvblR5cGVbXSA9IEFjdGlvblR5cGVbXT4oXG4gIGFjdGlvblR5cGVzPzogVFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KE1ldHJvcG9saXNDb250ZXh0KTtcbiAgLy8gVXNlIGZsdXggZnJvbSBjb250ZXh0IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byB1c2VGbHV4KCkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgY29uc3QgY29udGV4dEZsdXggPSBjb250ZXh0Py5mbHV4O1xuICBjb25zdCBob29rRmx1eCA9IHVzZUZsdXgoKTtcbiAgY29uc3QgZmx1eCA9IGNvbnRleHRGbHV4IHx8IGhvb2tGbHV4O1xuXG4gIGNvbnN0IHthZGFwdGVyc30gPSBjb250ZXh0O1xuICBjb25zdCBhY3Rpb25PcHRpb25zID0gdXNlTWVtbygoKSA9PiBidWlsZEFjdGlvbk9wdGlvbnMoYWRhcHRlcnMpLCBbYWRhcHRlcnNdKTtcblxuICByZXR1cm4gdXNlTWVtbygoKSA9PiB7XG4gICAgbGV0IGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICBpZiAoYWN0aW9uVHlwZXMgJiYgYWN0aW9uVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ3JlYXRlIG9ubHkgcmVxdWVzdGVkIGFjdGlvbnNcbiAgICAgIGFjdGlvbnMgPSBjcmVhdGVBY3Rpb25zKGFjdGlvblR5cGVzLCBmbHV4LCBhY3Rpb25PcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIGFsbCBhY3Rpb25zIChkZWZhdWx0IGJlaGF2aW9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgICAgY29uc3QgYWxsQWN0aW9ucyA9IGNyZWF0ZUFsbEFjdGlvbnMoZmx1eCwgYWN0aW9uT3B0aW9ucyk7XG4gICAgICBhY3Rpb25zID0gYWxsQWN0aW9ucztcbiAgICB9XG5cbiAgICAvLyBNYXAgdG8gcmV0dXJuIGtleXMgKGNvbnRlbnRBY3Rpb25zLCB1c2VyQWN0aW9ucywgZXRjLilcbiAgICByZXR1cm4gbWFwQWN0aW9uc1RvUmV0dXJuS2V5cyhhY3Rpb25zKTtcbiAgfSwgW2ZsdXgsIGFjdGlvbk9wdGlvbnMsIGFjdGlvblR5cGVzPy5qb2luKCcsJyldKTtcbn07XG5cbi8qKlxuICogSG9vayB0byBhY2Nlc3MgdGhlIE1ldHJvcG9saXMgY29uZmlndXJhdGlvbiBmcm9tIGNvbnRleHQuXG4gKlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIGVudmlyb25tZW50LXNwZWNpZmljIGNvbmZpZ3VyYXRpb25cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdXNlZCBvdXRzaWRlIG9mIE1ldHJvcG9saXMgY29tcG9uZW50XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgY29uZmlnID0gdXNlTWV0cm9wb2xpc0NvbmZpZygpO1xuICogY29uc3QgYXBpVXJsID0gY29uZmlnLmFwcD8uYXBpPy51cmw7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZU1ldHJvcG9saXNDb25maWcgPSAoKTogTWV0cm9wb2xpc0Vudmlyb25tZW50Q29uZmlndXJhdGlvbiA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KE1ldHJvcG9saXNDb250ZXh0KTtcblxuICBpZiAoIWNvbnRleHQ/LmNvbmZpZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICd1c2VNZXRyb3BvbGlzQ29uZmlnIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBNZXRyb3BvbGlzIGNvbXBvbmVudC4gJyArXG4gICAgICAnTWFrZSBzdXJlIHlvdXIgY29tcG9uZW50IGlzIHdyYXBwZWQgd2l0aCA8TWV0cm9wb2xpcz4gcHJvdmlkZXIuJ1xuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29udGV4dC5jb25maWc7XG59O1xuXG4vKipcbiAqIEhvb2sgdG8gYWNjZXNzIHRoZSBGbHV4IGZyYW1ld29yayBpbnN0YW5jZSBmcm9tIGNvbnRleHQuXG4gKlxuICogQHJldHVybnMgVGhlIEZsdXggZnJhbWV3b3JrIGluc3RhbmNlXG4gKiBAdGhyb3dzIEVycm9yIGlmIHVzZWQgb3V0c2lkZSBvZiBNZXRyb3BvbGlzIGNvbXBvbmVudCBhbmQgbm8gRmx1eCBhdmFpbGFibGVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCBmbHV4ID0gdXNlTWV0cm9wb2xpc0ZsdXgoKTtcbiAqIGNvbnN0IHN0YXRlID0gZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZU1ldHJvcG9saXNGbHV4ID0gKCk6IEZsdXhGcmFtZXdvcmsgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChNZXRyb3BvbGlzQ29udGV4dCk7XG4gIGNvbnN0IGhvb2tGbHV4ID0gdXNlRmx1eCgpO1xuXG4gIC8vIFVzZSBmbHV4IGZyb20gY29udGV4dCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdXNlRmx1eCgpIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIHJldHVybiBjb250ZXh0Py5mbHV4IHx8IGhvb2tGbHV4O1xufTtcblxuLyoqXG4gKiBTcGVjaWFsaXplZCBob29rcyBmb3IgaW5kaXZpZHVhbCBhY3Rpb24gdHlwZXMuXG4gKiBUaGVzZSBob29rcyBvbmx5IGNyZWF0ZSB0aGUgc3BlY2lmaWMgYWN0aW9uIHR5cGUsIGltcHJvdmluZyBwZXJmb3JtYW5jZS5cbiAqL1xuXG5leHBvcnQgY29uc3QgdXNlQ29udGVudEFjdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHtjb250ZW50QWN0aW9uc30gPSB1c2VNZXRyb3BvbGlzKFsnY29udGVudCddKTtcbiAgcmV0dXJuIGNvbnRlbnRBY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZUV2ZW50QWN0aW9ucyA9ICgpID0+IHtcbiAgY29uc3Qge2V2ZW50QWN0aW9uc30gPSB1c2VNZXRyb3BvbGlzKFsnZXZlbnQnXSk7XG4gIHJldHVybiBldmVudEFjdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlR3JvdXBBY3Rpb25zID0gKCkgPT4ge1xuICBjb25zdCB7Z3JvdXBBY3Rpb25zfSA9IHVzZU1ldHJvcG9saXMoWydncm91cCddKTtcbiAgcmV0dXJuIGdyb3VwQWN0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VJbWFnZUFjdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHtpbWFnZUFjdGlvbnN9ID0gdXNlTWV0cm9wb2xpcyhbJ2ltYWdlJ10pO1xuICByZXR1cm4gaW1hZ2VBY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZUxvY2F0aW9uQWN0aW9ucyA9ICgpID0+IHtcbiAgY29uc3Qge2xvY2F0aW9uQWN0aW9uc30gPSB1c2VNZXRyb3BvbGlzKFsnbG9jYXRpb24nXSk7XG4gIHJldHVybiBsb2NhdGlvbkFjdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlTWVzc2FnZUFjdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHttZXNzYWdlQWN0aW9uc30gPSB1c2VNZXRyb3BvbGlzKFsnbWVzc2FnZSddKTtcbiAgcmV0dXJuIG1lc3NhZ2VBY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVN1YnNjcmlwdGlvbkFjdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHtzdWJzY3JpcHRpb25BY3Rpb25zfSA9IHVzZU1ldHJvcG9saXMoWydzdWJzY3JpcHRpb24nXSk7XG4gIHJldHVybiBzdWJzY3JpcHRpb25BY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVBlcm1pc3Npb25BY3Rpb25zID0gKCkgPT4ge1xuICBjb25zdCB7cGVybWlzc2lvbkFjdGlvbnN9ID0gdXNlTWV0cm9wb2xpcyhbJ3Blcm1pc3Npb24nXSk7XG4gIHJldHVybiBwZXJtaXNzaW9uQWN0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VQb3N0QWN0aW9ucyA9ICgpID0+IHtcbiAgY29uc3Qge3Bvc3RBY3Rpb25zfSA9IHVzZU1ldHJvcG9saXMoWydwb3N0J10pO1xuICByZXR1cm4gcG9zdEFjdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlUGVyc29uYUFjdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHtwZXJzb25hQWN0aW9uc30gPSB1c2VNZXRyb3BvbGlzKFsncGVyc29uYSddKTtcbiAgcmV0dXJuIHBlcnNvbmFBY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVJlYWN0aW9uQWN0aW9ucyA9ICgpID0+IHtcbiAgY29uc3Qge3JlYWN0aW9uQWN0aW9uc30gPSB1c2VNZXRyb3BvbGlzKFsncmVhY3Rpb24nXSk7XG4gIHJldHVybiByZWFjdGlvbkFjdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlVGFnQWN0aW9ucyA9ICgpID0+IHtcbiAgY29uc3Qge3RhZ0FjdGlvbnN9ID0gdXNlTWV0cm9wb2xpcyhbJ3RhZyddKTtcbiAgcmV0dXJuIHRhZ0FjdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlVmlkZW9BY3Rpb25zID0gKCkgPT4ge1xuICBjb25zdCB7dmlkZW9BY3Rpb25zfSA9IHVzZU1ldHJvcG9saXMoWyd2aWRlbyddKTtcbiAgcmV0dXJuIHZpZGVvQWN0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VUcmFuc2xhdGlvbkFjdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHt0cmFuc2xhdGlvbkFjdGlvbnN9ID0gdXNlTWV0cm9wb2xpcyhbJ3RyYW5zbGF0aW9uJ10pO1xuICByZXR1cm4gdHJhbnNsYXRpb25BY3Rpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVVzZXJBY3Rpb25zID0gKCkgPT4ge1xuICBjb25zdCB7dXNlckFjdGlvbnN9ID0gdXNlTWV0cm9wb2xpcyhbJ3VzZXInXSk7XG4gIHJldHVybiB1c2VyQWN0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VXZWJzb2NrZXRBY3Rpb25zID0gKCkgPT4ge1xuICBjb25zdCB7d2Vic29ja2V0QWN0aW9uc30gPSB1c2VNZXRyb3BvbGlzKFsnd2Vic29ja2V0J10pO1xuICByZXR1cm4gd2Vic29ja2V0QWN0aW9ucztcbn07XG4iXSwibmFtZXMiOlsidXNlRmx1eCIsInVzZUNvbnRleHQiLCJ1c2VNZW1vIiwiY3JlYXRlQWN0aW9ucyIsImNyZWF0ZUFsbEFjdGlvbnMiLCJNZXRyb3BvbGlzQ29udGV4dCIsImJ1aWxkQWN0aW9uT3B0aW9ucyIsImFkYXB0ZXJzIiwib3B0aW9ucyIsIkNvbnRlbnQiLCJjb250ZW50IiwiY29udGVudEFkYXB0ZXIiLCJFdmVudCIsImV2ZW50IiwiZXZlbnRBZGFwdGVyIiwiSW1hZ2UiLCJpbWFnZSIsImltYWdlQWRhcHRlciIsIkxvY2F0aW9uIiwibG9jYXRpb24iLCJsb2NhdGlvbkFkYXB0ZXIiLCJNZXNzYWdlIiwibWVzc2FnZSIsIm1lc3NhZ2VBZGFwdGVyIiwiUGVybWlzc2lvbiIsInBlcm1pc3Npb24iLCJwZXJtaXNzaW9uQWRhcHRlciIsIlBvc3QiLCJwb3N0IiwicG9zdEFkYXB0ZXIiLCJQZXJzb25hIiwicGVyc29uYSIsInBlcnNvbmFBZGFwdGVyIiwiUmVhY3Rpb24iLCJyZWFjdGlvbiIsInJlYWN0aW9uQWRhcHRlciIsIlRhZyIsInRhZyIsInRhZ0FkYXB0ZXIiLCJUcmFuc2xhdGlvbiIsInRyYW5zbGF0aW9uIiwidHJhbnNsYXRpb25BZGFwdGVyIiwiVXNlciIsInVzZXIiLCJ1c2VyQWRhcHRlciIsIlZpZGVvIiwidmlkZW8iLCJ2aWRlb0FkYXB0ZXIiLCJtYXBBY3Rpb25zVG9SZXR1cm5LZXlzIiwiYWN0aW9ucyIsIm1hcHBlZCIsImNvbnRlbnRBY3Rpb25zIiwiZXZlbnRBY3Rpb25zIiwiZ3JvdXAiLCJncm91cEFjdGlvbnMiLCJpbWFnZUFjdGlvbnMiLCJsb2NhdGlvbkFjdGlvbnMiLCJtZXNzYWdlQWN0aW9ucyIsInBlcm1pc3Npb25BY3Rpb25zIiwicG9zdEFjdGlvbnMiLCJwZXJzb25hQWN0aW9ucyIsInJlYWN0aW9uQWN0aW9ucyIsInN1YnNjcmlwdGlvbiIsInN1YnNjcmlwdGlvbkFjdGlvbnMiLCJ0YWdBY3Rpb25zIiwidHJhbnNsYXRpb25BY3Rpb25zIiwidXNlckFjdGlvbnMiLCJ2aWRlb0FjdGlvbnMiLCJ3ZWJzb2NrZXQiLCJ3ZWJzb2NrZXRBY3Rpb25zIiwidXNlTWV0cm9wb2xpcyIsImFjdGlvblR5cGVzIiwiY29udGV4dCIsImNvbnRleHRGbHV4IiwiZmx1eCIsImhvb2tGbHV4IiwiYWN0aW9uT3B0aW9ucyIsImxlbmd0aCIsImFsbEFjdGlvbnMiLCJqb2luIiwidXNlTWV0cm9wb2xpc0NvbmZpZyIsImNvbmZpZyIsIkVycm9yIiwidXNlTWV0cm9wb2xpc0ZsdXgiLCJ1c2VDb250ZW50QWN0aW9ucyIsInVzZUV2ZW50QWN0aW9ucyIsInVzZUdyb3VwQWN0aW9ucyIsInVzZUltYWdlQWN0aW9ucyIsInVzZUxvY2F0aW9uQWN0aW9ucyIsInVzZU1lc3NhZ2VBY3Rpb25zIiwidXNlU3Vic2NyaXB0aW9uQWN0aW9ucyIsInVzZVBlcm1pc3Npb25BY3Rpb25zIiwidXNlUG9zdEFjdGlvbnMiLCJ1c2VQZXJzb25hQWN0aW9ucyIsInVzZVJlYWN0aW9uQWN0aW9ucyIsInVzZVRhZ0FjdGlvbnMiLCJ1c2VWaWRlb0FjdGlvbnMiLCJ1c2VUcmFuc2xhdGlvbkFjdGlvbnMiLCJ1c2VVc2VyQWN0aW9ucyIsInVzZVdlYnNvY2tldEFjdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLE9BQU8sUUFBTyw4QkFBOEI7QUFDcEQsU0FBUUMsVUFBVSxFQUFFQyxPQUFPLFFBQU8sUUFBUTtBQUkxQyxTQUFRQyxhQUFhLEVBQUVDLGdCQUFnQixRQUFPLDRCQUE0QjtBQUUxRSxTQUFRQyxpQkFBaUIsUUFBTywwQkFBMEI7QUFHMUQ7O0NBRUMsR0FDRCxNQUFNQyxxQkFBcUIsQ0FDekJDO0lBRUEsSUFBSSxDQUFDQSxVQUFVO1FBQ2IsT0FBTyxDQUFDO0lBQ1Y7SUFFQSxNQUFNQyxVQUFzRCxDQUFDO0lBRTdELElBQUlELFNBQVNFLE9BQU8sRUFBRTtRQUNwQkQsUUFBUUUsT0FBTyxHQUFHO1lBQUNDLGdCQUFnQkosU0FBU0UsT0FBTztRQUFBO0lBQ3JEO0lBQ0EsSUFBSUYsU0FBU0ssS0FBSyxFQUFFO1FBQ2xCSixRQUFRSyxLQUFLLEdBQUc7WUFBQ0MsY0FBY1AsU0FBU0ssS0FBSztRQUFBO0lBQy9DO0lBQ0EsSUFBSUwsU0FBU1EsS0FBSyxFQUFFO1FBQ2xCUCxRQUFRUSxLQUFLLEdBQUc7WUFBQ0MsY0FBY1YsU0FBU1EsS0FBSztRQUFBO0lBQy9DO0lBQ0EsSUFBSVIsU0FBU1csUUFBUSxFQUFFO1FBQ3JCVixRQUFRVyxRQUFRLEdBQUc7WUFBQ0MsaUJBQWlCYixTQUFTVyxRQUFRO1FBQUE7SUFDeEQ7SUFDQSxJQUFJWCxTQUFTYyxPQUFPLEVBQUU7UUFDcEJiLFFBQVFjLE9BQU8sR0FBRztZQUFDQyxnQkFBZ0JoQixTQUFTYyxPQUFPO1FBQUE7SUFDckQ7SUFDQSxJQUFJZCxTQUFTaUIs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
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface UseTranslationsOptions {
|
|
2
|
+
readonly locale?: string;
|
|
3
|
+
readonly namespace?: string;
|
|
4
|
+
readonly autoProcess?: boolean;
|
|
5
|
+
readonly processInterval?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface UseTranslationsReturn {
|
|
8
|
+
readonly t: (key: string, fallback?: string) => string;
|
|
9
|
+
readonly hasTranslation: (key: string) => boolean;
|
|
10
|
+
readonly queueTranslation: (key: string) => void;
|
|
11
|
+
readonly processPending: () => Promise<void>;
|
|
12
|
+
readonly isLoading: boolean;
|
|
13
|
+
readonly error: Error | null;
|
|
14
|
+
}
|
|
15
|
+
export declare const useTranslations: (options?: UseTranslationsOptions) => UseTranslationsReturn;
|
|
16
|
+
//# sourceMappingURL=useTranslations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTranslations.d.ts","sourceRoot":"","sources":["../../src/utils/useTranslations.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvD,QAAQ,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAClD,QAAQ,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CAC9B;AAED,eAAO,MAAM,eAAe,GAAI,UAAS,sBAA2B,KAAG,qBA+FtE,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/ import { useCallback, useEffect, useMemo, useRef } from 'react';
|
|
5
|
+
import { useMetropolis } from './useMetropolis.js';
|
|
6
|
+
export const useTranslations = (options = {})=>{
|
|
7
|
+
const { locale = 'en', namespace, autoProcess = true, processInterval = 1000 } = options;
|
|
8
|
+
const { translationActions } = useMetropolis();
|
|
9
|
+
const processTimeoutRef = useRef(null);
|
|
10
|
+
const lastProcessRef = useRef(0);
|
|
11
|
+
const t = useCallback((key, fallback)=>{
|
|
12
|
+
if (!translationActions) {
|
|
13
|
+
return fallback || key;
|
|
14
|
+
}
|
|
15
|
+
const translation = translationActions.getTranslation(key, locale, namespace);
|
|
16
|
+
if (translation) {
|
|
17
|
+
return translation;
|
|
18
|
+
}
|
|
19
|
+
if (autoProcess && !translationActions.hasTranslation(key, locale, namespace)) {
|
|
20
|
+
translationActions.queueTranslationKey(key, locale, namespace);
|
|
21
|
+
}
|
|
22
|
+
return fallback || key;
|
|
23
|
+
}, [
|
|
24
|
+
translationActions,
|
|
25
|
+
locale,
|
|
26
|
+
namespace,
|
|
27
|
+
autoProcess
|
|
28
|
+
]);
|
|
29
|
+
const hasTranslation = useCallback((key)=>{
|
|
30
|
+
if (!translationActions) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return translationActions.hasTranslation(key, locale, namespace);
|
|
34
|
+
}, [
|
|
35
|
+
translationActions,
|
|
36
|
+
locale,
|
|
37
|
+
namespace
|
|
38
|
+
]);
|
|
39
|
+
const queueTranslation = useCallback((key)=>{
|
|
40
|
+
if (!translationActions) return;
|
|
41
|
+
translationActions.queueTranslationKey(key, locale, namespace);
|
|
42
|
+
}, [
|
|
43
|
+
translationActions,
|
|
44
|
+
locale,
|
|
45
|
+
namespace
|
|
46
|
+
]);
|
|
47
|
+
const processPending = useCallback(async ()=>{
|
|
48
|
+
if (!translationActions) return;
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
if (now - lastProcessRef.current < processInterval) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
lastProcessRef.current = now;
|
|
54
|
+
await translationActions.processPendingTranslations(locale, namespace);
|
|
55
|
+
}, [
|
|
56
|
+
translationActions,
|
|
57
|
+
locale,
|
|
58
|
+
namespace,
|
|
59
|
+
processInterval
|
|
60
|
+
]);
|
|
61
|
+
useEffect(()=>{
|
|
62
|
+
if (!autoProcess || !translationActions) return;
|
|
63
|
+
const processQueued = ()=>{
|
|
64
|
+
processPending();
|
|
65
|
+
};
|
|
66
|
+
if (processTimeoutRef.current) {
|
|
67
|
+
clearTimeout(processTimeoutRef.current);
|
|
68
|
+
}
|
|
69
|
+
processTimeoutRef.current = setTimeout(processQueued, processInterval);
|
|
70
|
+
return ()=>{
|
|
71
|
+
if (processTimeoutRef.current) {
|
|
72
|
+
clearTimeout(processTimeoutRef.current);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}, [
|
|
76
|
+
autoProcess,
|
|
77
|
+
translationActions,
|
|
78
|
+
processPending,
|
|
79
|
+
processInterval
|
|
80
|
+
]);
|
|
81
|
+
const isLoading = useMemo(()=>{
|
|
82
|
+
if (!translationActions) return false;
|
|
83
|
+
const state = translationActions.flux?.getState('translations');
|
|
84
|
+
return state?.isQueueing || false;
|
|
85
|
+
}, [
|
|
86
|
+
translationActions
|
|
87
|
+
]);
|
|
88
|
+
const error = useMemo(()=>{
|
|
89
|
+
if (!translationActions) return null;
|
|
90
|
+
const state = translationActions.flux?.getState('translations');
|
|
91
|
+
return state?.error || null;
|
|
92
|
+
}, [
|
|
93
|
+
translationActions
|
|
94
|
+
]);
|
|
95
|
+
return {
|
|
96
|
+
t,
|
|
97
|
+
hasTranslation,
|
|
98
|
+
queueTranslation,
|
|
99
|
+
processPending,
|
|
100
|
+
isLoading,
|
|
101
|
+
error
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvdXRpbHMvdXNlVHJhbnNsYXRpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI1LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHVzZU1ldHJvcG9saXMgfSBmcm9tICcuL3VzZU1ldHJvcG9saXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZVRyYW5zbGF0aW9uc09wdGlvbnMge1xuICByZWFkb25seSBsb2NhbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWVzcGFjZT86IHN0cmluZztcbiAgcmVhZG9ubHkgYXV0b1Byb2Nlc3M/OiBib29sZWFuO1xuICByZWFkb25seSBwcm9jZXNzSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlVHJhbnNsYXRpb25zUmV0dXJuIHtcbiAgcmVhZG9ubHkgdDogKGtleTogc3RyaW5nLCBmYWxsYmFjaz86IHN0cmluZykgPT4gc3RyaW5nO1xuICByZWFkb25seSBoYXNUcmFuc2xhdGlvbjogKGtleTogc3RyaW5nKSA9PiBib29sZWFuO1xuICByZWFkb25seSBxdWV1ZVRyYW5zbGF0aW9uOiAoa2V5OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHByb2Nlc3NQZW5kaW5nOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZWFkb25seSBpc0xvYWRpbmc6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGVycm9yOiBFcnJvciB8IG51bGw7XG59XG5cbmV4cG9ydCBjb25zdCB1c2VUcmFuc2xhdGlvbnMgPSAob3B0aW9uczogVXNlVHJhbnNsYXRpb25zT3B0aW9ucyA9IHt9KTogVXNlVHJhbnNsYXRpb25zUmV0dXJuID0+IHtcbiAgY29uc3Qge1xuICAgIGxvY2FsZSA9ICdlbicsXG4gICAgbmFtZXNwYWNlLFxuICAgIGF1dG9Qcm9jZXNzID0gdHJ1ZSxcbiAgICBwcm9jZXNzSW50ZXJ2YWwgPSAxMDAwXG4gIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHt0cmFuc2xhdGlvbkFjdGlvbnN9ID0gdXNlTWV0cm9wb2xpcygpO1xuICBjb25zdCBwcm9jZXNzVGltZW91dFJlZiA9IHVzZVJlZjxOb2RlSlMuVGltZW91dCB8IG51bGw+KG51bGwpO1xuICBjb25zdCBsYXN0UHJvY2Vzc1JlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuXG4gIGNvbnN0IHQgPSB1c2VDYWxsYmFjaygoa2V5OiBzdHJpbmcsIGZhbGxiYWNrPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBpZiAoIXRyYW5zbGF0aW9uQWN0aW9ucykge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrIHx8IGtleTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uQWN0aW9ucy5nZXRUcmFuc2xhdGlvbihrZXksIGxvY2FsZSwgbmFtZXNwYWNlKTtcblxuICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uO1xuICAgIH1cblxuICAgIGlmIChhdXRvUHJvY2VzcyAmJiAhdHJhbnNsYXRpb25BY3Rpb25zLmhhc1RyYW5zbGF0aW9uKGtleSwgbG9jYWxlLCBuYW1lc3BhY2UpKSB7XG4gICAgICB0cmFuc2xhdGlvbkFjdGlvbnMucXVldWVUcmFuc2xhdGlvbktleShrZXksIGxvY2FsZSwgbmFtZXNwYWNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsbGJhY2sgfHwga2V5O1xuICB9LCBbdHJhbnNsYXRpb25BY3Rpb25zLCBsb2NhbGUsIG5hbWVzcGFjZSwgYXV0b1Byb2Nlc3NdKTtcblxuICBjb25zdCBoYXNUcmFuc2xhdGlvbiA9IHVzZUNhbGxiYWNrKChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICghdHJhbnNsYXRpb25BY3Rpb25zKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uQWN0aW9ucy5oYXNUcmFuc2xhdGlvbihrZXksIGxvY2FsZSwgbmFtZXNwYWNlKTtcbiAgfSwgW3RyYW5zbGF0aW9uQWN0aW9ucywgbG9jYWxlLCBuYW1lc3BhY2VdKTtcblxuICBjb25zdCBxdWV1ZVRyYW5zbGF0aW9uID0gdXNlQ2FsbGJhY2soKGtleTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKCF0cmFuc2xhdGlvbkFjdGlvbnMpIHJldHVybjtcbiAgICB0cmFuc2xhdGlvbkFjdGlvbnMucXVldWVUcmFuc2xhdGlvbktleShrZXksIGxvY2FsZSwgbmFtZXNwYWNlKTtcbiAgfSwgW3RyYW5zbGF0aW9uQWN0aW9ucywgbG9jYWxlLCBuYW1lc3BhY2VdKTtcblxuICBjb25zdCBwcm9jZXNzUGVuZGluZyA9IHVzZUNhbGxiYWNrKGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIXRyYW5zbGF0aW9uQWN0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gbGFzdFByb2Nlc3NSZWYuY3VycmVudCA8IHByb2Nlc3NJbnRlcnZhbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxhc3RQcm9jZXNzUmVmLmN1cnJlbnQgPSBub3c7XG4gICAgYXdhaXQgdHJhbnNsYXRpb25BY3Rpb25zLnByb2Nlc3NQZW5kaW5nVHJhbnNsYXRpb25zKGxvY2FsZSwgbmFtZXNwYWNlKTtcbiAgfSwgW3RyYW5zbGF0aW9uQWN0aW9ucywgbG9jYWxlLCBuYW1lc3BhY2UsIHByb2Nlc3NJbnRlcnZhbF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFhdXRvUHJvY2VzcyB8fCAhdHJhbnNsYXRpb25BY3Rpb25zKSByZXR1cm47XG5cbiAgICBjb25zdCBwcm9jZXNzUXVldWVkID0gKCkgPT4ge1xuICAgICAgcHJvY2Vzc1BlbmRpbmcoKTtcbiAgICB9O1xuXG4gICAgaWYgKHByb2Nlc3NUaW1lb3V0UmVmLmN1cnJlbnQpIHtcbiAgICAgIGNsZWFyVGltZW91dChwcm9jZXNzVGltZW91dFJlZi5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBwcm9jZXNzVGltZW91dFJlZi5jdXJyZW50ID0gc2V0VGltZW91dChwcm9jZXNzUXVldWVkLCBwcm9jZXNzSW50ZXJ2YWwpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChwcm9jZXNzVGltZW91dFJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChwcm9jZXNzVGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbYXV0b1Byb2Nlc3MsIHRyYW5zbGF0aW9uQWN0aW9ucywgcHJvY2Vzc1BlbmRpbmcsIHByb2Nlc3NJbnRlcnZhbF0pO1xuXG4gIGNvbnN0IGlzTG9hZGluZyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghdHJhbnNsYXRpb25BY3Rpb25zKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgc3RhdGUgPSAodHJhbnNsYXRpb25BY3Rpb25zIGFzIGFueSkuZmx1eD8uZ2V0U3RhdGUoJ3RyYW5zbGF0aW9ucycpO1xuICAgIHJldHVybiBzdGF0ZT8uaXNRdWV1ZWluZyB8fCBmYWxzZTtcbiAgfSwgW3RyYW5zbGF0aW9uQWN0aW9uc10pO1xuXG4gIGNvbnN0IGVycm9yID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCF0cmFuc2xhdGlvbkFjdGlvbnMpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHN0YXRlID0gKHRyYW5zbGF0aW9uQWN0aW9ucyBhcyBhbnkpLmZsdXg/LmdldFN0YXRlKCd0cmFuc2xhdGlvbnMnKTtcbiAgICByZXR1cm4gc3RhdGU/LmVycm9yIHx8IG51bGw7XG4gIH0sIFt0cmFuc2xhdGlvbkFjdGlvbnNdKTtcblxuICByZXR1cm4ge1xuICAgIHQsXG4gICAgaGFzVHJhbnNsYXRpb24sXG4gICAgcXVldWVUcmFuc2xhdGlvbixcbiAgICBwcm9jZXNzUGVuZGluZyxcbiAgICBpc0xvYWRpbmcsXG4gICAgZXJyb3JcbiAgfTtcbn07Il0sIm5hbWVzIjpbInVzZUNhbGxiYWNrIiwidXNlRWZmZWN0IiwidXNlTWVtbyIsInVzZVJlZiIsInVzZU1ldHJvcG9saXMiLCJ1c2VUcmFuc2xhdGlvbnMiLCJvcHRpb25zIiwibG9jYWxlIiwibmFtZXNwYWNlIiwiYXV0b1Byb2Nlc3MiLCJwcm9jZXNzSW50ZXJ2YWwiLCJ0cmFuc2xhdGlvbkFjdGlvbnMiLCJwcm9jZXNzVGltZW91dFJlZiIsImxhc3RQcm9jZXNzUmVmIiwidCIsImtleSIsImZhbGxiYWNrIiwidHJhbnNsYXRpb24iLCJnZXRUcmFuc2xhdGlvbiIsImhhc1RyYW5zbGF0aW9uIiwicXVldWVUcmFuc2xhdGlvbktleSIsInF1ZXVlVHJhbnNsYXRpb24iLCJwcm9jZXNzUGVuZGluZyIsIm5vdyIsIkRhdGUiLCJjdXJyZW50IiwicHJvY2Vzc1BlbmRpbmdUcmFuc2xhdGlvbnMiLCJwcm9jZXNzUXVldWVkIiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsImlzTG9hZGluZyIsInN0YXRlIiwiZmx1eCIsImdldFN0YXRlIiwiaXNRdWV1ZWluZyIsImVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFTQSxXQUFXLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLFFBQVEsUUFBUTtBQUVoRSxTQUFTQyxhQUFhLFFBQVEscUJBQXFCO0FBa0JuRCxPQUFPLE1BQU1DLGtCQUFrQixDQUFDQyxVQUFrQyxDQUFDLENBQUM7SUFDbEUsTUFBTSxFQUNKQyxTQUFTLElBQUksRUFDYkMsU0FBUyxFQUNUQyxjQUFjLElBQUks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
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/
|
|
5
|
+
export interface BaseAdapterOptions {
|
|
6
|
+
strict?: boolean;
|
|
7
|
+
allowPartial?: boolean;
|
|
8
|
+
environment?: 'development' | 'production' | 'test';
|
|
9
|
+
customValidation?: (input: unknown) => unknown;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Creates a validator factory that merges custom adapters with default behavior.
|
|
13
|
+
* This eliminates code duplication across all action files.
|
|
14
|
+
*
|
|
15
|
+
* @param defaultValidator - The default validation function
|
|
16
|
+
* @param customAdapter - Optional custom adapter function
|
|
17
|
+
* @param options - Adapter options
|
|
18
|
+
* @returns A validator function that applies default + custom validation
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* const validateUser = createValidatorFactory(
|
|
22
|
+
* defaultUserValidator,
|
|
23
|
+
* customUserAdapter,
|
|
24
|
+
* userAdapterOptions
|
|
25
|
+
* );
|
|
26
|
+
*/
|
|
27
|
+
export declare const createValidatorFactory: <T extends BaseAdapterOptions>(defaultValidator: (input: unknown, options?: T) => any, customAdapter?: (input: unknown, options?: T) => any, options?: T) => (input: unknown, validatorOptions?: T) => any;
|
|
28
|
+
/**
|
|
29
|
+
* Creates a validator manager that handles adapter updates and recreation.
|
|
30
|
+
* This centralizes the update logic that's duplicated across action files.
|
|
31
|
+
*
|
|
32
|
+
* @param defaultValidator - The default validation function
|
|
33
|
+
* @param initialOptions - Initial adapter options
|
|
34
|
+
* @returns An object with validator and update functions
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* const { validator, updateAdapter, updateOptions } = createValidatorManager(
|
|
38
|
+
* defaultUserValidator,
|
|
39
|
+
* userAdapterOptions
|
|
40
|
+
* );
|
|
41
|
+
*/
|
|
42
|
+
export declare const createValidatorManager: <T extends BaseAdapterOptions>(defaultValidator: (input: unknown, options?: T) => any, initialOptions?: T) => {
|
|
43
|
+
getCustomAdapter: () => (input: unknown, options?: T) => any;
|
|
44
|
+
getOptions: () => T;
|
|
45
|
+
updateAdapter: (adapter: (input: unknown, options?: T) => any) => void;
|
|
46
|
+
updateOptions: (options: T) => void;
|
|
47
|
+
validator: (input: unknown, validatorOptions?: T) => any;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=validatorFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validatorFactory.d.ts","sourceRoot":"","sources":["../../src/utils/validatorFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;IACpD,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAChD;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,kBAAkB,EACjE,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,GAAG,EACtD,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,GAAG,EACpD,UAAU,CAAC,MACP,OAAO,OAAO,EAAE,mBAAmB,CAAC,QAczC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,kBAAkB,EACjE,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,GAAG,EAEtD,iBAAgB,CAAW;oCAMC,OAAO,YAAY,CAAC,KAAK,GAAG;;6BAExB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,GAAG,KAAG,IAAI;6BAI3C,CAAC,KAAG,IAAI;uBAMd,OAAO,qBAAqB,CAAC;CAuBxD,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/ /**
|
|
5
|
+
* Creates a validator factory that merges custom adapters with default behavior.
|
|
6
|
+
* This eliminates code duplication across all action files.
|
|
7
|
+
*
|
|
8
|
+
* @param defaultValidator - The default validation function
|
|
9
|
+
* @param customAdapter - Optional custom adapter function
|
|
10
|
+
* @param options - Adapter options
|
|
11
|
+
* @returns A validator function that applies default + custom validation
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* const validateUser = createValidatorFactory(
|
|
15
|
+
* defaultUserValidator,
|
|
16
|
+
* customUserAdapter,
|
|
17
|
+
* userAdapterOptions
|
|
18
|
+
* );
|
|
19
|
+
*/ export const createValidatorFactory = (defaultValidator, customAdapter, options)=>(input, validatorOptions)=>{
|
|
20
|
+
const mergedOptions = {
|
|
21
|
+
...options,
|
|
22
|
+
...validatorOptions
|
|
23
|
+
};
|
|
24
|
+
let validated = defaultValidator(input, mergedOptions);
|
|
25
|
+
if (customAdapter) {
|
|
26
|
+
validated = customAdapter(validated, mergedOptions);
|
|
27
|
+
}
|
|
28
|
+
if (mergedOptions?.customValidation) {
|
|
29
|
+
validated = mergedOptions.customValidation(validated);
|
|
30
|
+
}
|
|
31
|
+
return validated;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Creates a validator manager that handles adapter updates and recreation.
|
|
35
|
+
* This centralizes the update logic that's duplicated across action files.
|
|
36
|
+
*
|
|
37
|
+
* @param defaultValidator - The default validation function
|
|
38
|
+
* @param initialOptions - Initial adapter options
|
|
39
|
+
* @returns An object with validator and update functions
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* const { validator, updateAdapter, updateOptions } = createValidatorManager(
|
|
43
|
+
* defaultUserValidator,
|
|
44
|
+
* userAdapterOptions
|
|
45
|
+
* );
|
|
46
|
+
*/ export const createValidatorManager = (defaultValidator, // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
47
|
+
initialOptions = {})=>{
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
49
|
+
const defaultOptions = {};
|
|
50
|
+
let adapterOptions = {
|
|
51
|
+
...defaultOptions,
|
|
52
|
+
...initialOptions
|
|
53
|
+
};
|
|
54
|
+
let customAdapter;
|
|
55
|
+
const updateAdapter = (adapter)=>{
|
|
56
|
+
customAdapter = adapter;
|
|
57
|
+
};
|
|
58
|
+
const updateOptions = (options)=>{
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
60
|
+
adapterOptions = {
|
|
61
|
+
...adapterOptions,
|
|
62
|
+
...options
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
// Create validator function that always uses current customAdapter and adapterOptions
|
|
66
|
+
const validator = (input, validatorOptions)=>{
|
|
67
|
+
const mergedOptions = {
|
|
68
|
+
...adapterOptions,
|
|
69
|
+
...validatorOptions
|
|
70
|
+
};
|
|
71
|
+
let validated = defaultValidator(input, mergedOptions);
|
|
72
|
+
if (customAdapter) {
|
|
73
|
+
validated = customAdapter(validated, mergedOptions);
|
|
74
|
+
}
|
|
75
|
+
if (mergedOptions?.customValidation) {
|
|
76
|
+
validated = mergedOptions.customValidation(validated);
|
|
77
|
+
}
|
|
78
|
+
return validated;
|
|
79
|
+
};
|
|
80
|
+
return {
|
|
81
|
+
getCustomAdapter: ()=>customAdapter,
|
|
82
|
+
getOptions: ()=>{
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
84
|
+
const options = {
|
|
85
|
+
...adapterOptions
|
|
86
|
+
};
|
|
87
|
+
return options;
|
|
88
|
+
},
|
|
89
|
+
updateAdapter,
|
|
90
|
+
updateOptions,
|
|
91
|
+
validator
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvdXRpbHMvdmFsaWRhdG9yRmFjdG9yeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VBZGFwdGVyT3B0aW9ucyB7XG4gIHN0cmljdD86IGJvb2xlYW47XG4gIGFsbG93UGFydGlhbD86IGJvb2xlYW47XG4gIGVudmlyb25tZW50PzogJ2RldmVsb3BtZW50JyB8ICdwcm9kdWN0aW9uJyB8ICd0ZXN0JztcbiAgY3VzdG9tVmFsaWRhdGlvbj86IChpbnB1dDogdW5rbm93bikgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdmFsaWRhdG9yIGZhY3RvcnkgdGhhdCBtZXJnZXMgY3VzdG9tIGFkYXB0ZXJzIHdpdGggZGVmYXVsdCBiZWhhdmlvci5cbiAqIFRoaXMgZWxpbWluYXRlcyBjb2RlIGR1cGxpY2F0aW9uIGFjcm9zcyBhbGwgYWN0aW9uIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBkZWZhdWx0VmFsaWRhdG9yIC0gVGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBmdW5jdGlvblxuICogQHBhcmFtIGN1c3RvbUFkYXB0ZXIgLSBPcHRpb25hbCBjdXN0b20gYWRhcHRlciBmdW5jdGlvblxuICogQHBhcmFtIG9wdGlvbnMgLSBBZGFwdGVyIG9wdGlvbnNcbiAqIEByZXR1cm5zIEEgdmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgYXBwbGllcyBkZWZhdWx0ICsgY3VzdG9tIHZhbGlkYXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgdmFsaWRhdGVVc2VyID0gY3JlYXRlVmFsaWRhdG9yRmFjdG9yeShcbiAqICAgZGVmYXVsdFVzZXJWYWxpZGF0b3IsXG4gKiAgIGN1c3RvbVVzZXJBZGFwdGVyLFxuICogICB1c2VyQWRhcHRlck9wdGlvbnNcbiAqICk7XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVWYWxpZGF0b3JGYWN0b3J5ID0gPFQgZXh0ZW5kcyBCYXNlQWRhcHRlck9wdGlvbnM+KFxuICBkZWZhdWx0VmFsaWRhdG9yOiAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBUKSA9PiBhbnksXG4gIGN1c3RvbUFkYXB0ZXI/OiAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBUKSA9PiBhbnksXG4gIG9wdGlvbnM/OiBUXG4pID0+IChpbnB1dDogdW5rbm93biwgdmFsaWRhdG9yT3B0aW9ucz86IFQpID0+IHtcbiAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHsuLi5vcHRpb25zLCAuLi52YWxpZGF0b3JPcHRpb25zfTtcblxuICBsZXQgdmFsaWRhdGVkID0gZGVmYXVsdFZhbGlkYXRvcihpbnB1dCwgbWVyZ2VkT3B0aW9ucyBhcyBUKTtcblxuICBpZihjdXN0b21BZGFwdGVyKSB7XG4gICAgdmFsaWRhdGVkID0gY3VzdG9tQWRhcHRlcih2YWxpZGF0ZWQsIG1lcmdlZE9wdGlvbnMgYXMgVCk7XG4gIH1cblxuICBpZihtZXJnZWRPcHRpb25zPy5jdXN0b21WYWxpZGF0aW9uKSB7XG4gICAgdmFsaWRhdGVkID0gbWVyZ2VkT3B0aW9ucy5jdXN0b21WYWxpZGF0aW9uKHZhbGlkYXRlZCk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgdmFsaWRhdG9yIG1hbmFnZXIgdGhhdCBoYW5kbGVzIGFkYXB0ZXIgdXBkYXRlcyBhbmQgcmVjcmVhdGlvbi5cbiAqIFRoaXMgY2VudHJhbGl6ZXMgdGhlIHVwZGF0ZSBsb2dpYyB0aGF0J3MgZHVwbGljYXRlZCBhY3Jvc3MgYWN0aW9uIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBkZWZhdWx0VmFsaWRhdG9yIC0gVGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBmdW5jdGlvblxuICogQHBhcmFtIGluaXRpYWxPcHRpb25zIC0gSW5pdGlhbCBhZGFwdGVyIG9wdGlvbnNcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHZhbGlkYXRvciBhbmQgdXBkYXRlIGZ1bmN0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB7IHZhbGlkYXRvciwgdXBkYXRlQWRhcHRlciwgdXBkYXRlT3B0aW9ucyB9ID0gY3JlYXRlVmFsaWRhdG9yTWFuYWdlcihcbiAqICAgZGVmYXVsdFVzZXJWYWxpZGF0b3IsXG4gKiAgIHVzZXJBZGFwdGVyT3B0aW9uc1xuICogKTtcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVZhbGlkYXRvck1hbmFnZXIgPSA8VCBleHRlbmRzIEJhc2VBZGFwdGVyT3B0aW9ucz4oXG4gIGRlZmF1bHRWYWxpZGF0b3I6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFQpID0+IGFueSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtYXNzZXJ0aW9uc1xuICBpbml0aWFsT3B0aW9uczogVCA9IHt9IGFzIFRcbikgPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2NvbnNpc3RlbnQtdHlwZS1hc3NlcnRpb25zXG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zOiBUID0ge30gYXMgVDtcblxuICBsZXQgYWRhcHRlck9wdGlvbnM6IFQgPSB7Li4uZGVmYXVsdE9wdGlvbnMsIC4uLmluaXRpYWxPcHRpb25zfTtcbiAgbGV0IGN1c3RvbUFkYXB0ZXI6ICgoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBUKSA9PiBhbnkpIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHVwZGF0ZUFkYXB0ZXIgPSAoYWRhcHRlcjogKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogVCkgPT4gYW55KTogdm9pZCA9PiB7XG4gICAgY3VzdG9tQWRhcHRlciA9IGFkYXB0ZXI7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlT3B0aW9ucyA9IChvcHRpb25zOiBUKTogdm9pZCA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtYXNzZXJ0aW9uc1xuICAgIGFkYXB0ZXJPcHRpb25zID0gey4uLmFkYXB0ZXJPcHRpb25zLCAuLi5vcHRpb25zfSBhcyBUO1xuICB9O1xuXG4gIC8vIENyZWF0ZSB2YWxpZGF0b3IgZnVuY3Rpb24gdGhhdCBhbHdheXMgdXNlcyBjdXJyZW50IGN1c3RvbUFkYXB0ZXIgYW5kIGFkYXB0ZXJPcHRpb25zXG4gIGNvbnN0IHZhbGlkYXRvciA9IChpbnB1dDogdW5rbm93biwgdmFsaWRhdG9yT3B0aW9ucz86IFQpID0+IHtcbiAgICBjb25zdCBtZXJnZWRPcHRpb25zID0gey4uLmFkYXB0ZXJPcHRpb25zLCAuLi52YWxpZGF0b3JPcHRpb25zfTtcbiAgICBsZXQgdmFsaWRhdGVkID0gZGVmYXVsdFZhbGlkYXRvcihpbnB1dCwgbWVyZ2VkT3B0aW9ucyBhcyBUKTtcbiAgICBpZihjdXN0b21BZGFwdGVyKSB7XG4gICAgICB2YWxpZGF0ZWQgPSBjdXN0b21BZGFwdGVyKHZhbGlkYXRlZCwgbWVyZ2VkT3B0aW9ucyBhcyBUKTtcbiAgICB9XG4gICAgaWYobWVyZ2VkT3B0aW9ucz8uY3VzdG9tVmFsaWRhdGlvbikge1xuICAgICAgdmFsaWRhdGVkID0gbWVyZ2VkT3B0aW9ucy5jdXN0b21WYWxpZGF0aW9uKHZhbGlkYXRlZCk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0ZWQ7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBnZXRDdXN0b21BZGFwdGVyOiAoKSA9PiBjdXN0b21BZGFwdGVyLFxuICAgIGdldE9wdGlvbnM6ICgpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvY29uc2lzdGVudC10eXBlLWFzc2VydGlvbnNcbiAgICAgIGNvbnN0IG9wdGlvbnM6IFQgPSB7Li4uYWRhcHRlck9wdGlvbnN9IGFzIFQ7XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9LFxuICAgIHVwZGF0ZUFkYXB0ZXIsXG4gICAgdXBkYXRlT3B0aW9ucyxcbiAgICB2YWxpZGF0b3JcbiAgfTtcbn07Il0sIm5hbWVzIjpbImNyZWF0ZVZhbGlkYXRvckZhY3RvcnkiLCJkZWZhdWx0VmFsaWRhdG9yIiwiY3VzdG9tQWRhcHRlciIsIm9wdGlvbnMiLCJpbnB1dCIsInZhbGlkYXRvck9wdGlvbnMiLCJtZXJnZWRPcHRpb25zIiwidmFsaWRhdGVkIiwiY3VzdG9tVmFsaWRhdGlvbiIsImNyZWF0ZVZhbGlkYXRvck1hbmFnZXIiLCJpbml0aWFsT3B0aW9ucyIsImRlZmF1bHRPcHRpb25zIiwiYWRhcHRlck9wdGlvbnMiLCJ1cGRhdGVBZGFwdGVyIiwiYWRhcHRlciIsInVwZGF0ZU9wdGlvbnMiLCJ2YWxpZGF0b3IiLCJnZXRDdXN0b21BZGFwdGVyIiwiZ2V0T3B0aW9ucyJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBU0Q7Ozs7Ozs7Ozs7Ozs7OztDQWVDLEdBQ0QsT0FBTyxNQUFNQSx5QkFBeUIsQ0FDcENDLGtCQUNBQyxlQUNBQyxVQUNHLENBQUNDLE9BQWdCQztRQUNwQixNQUFNQyxnQkFBZ0I7WUFBQyxHQUFHSCxPQUFPO1lBQUUsR0FBR0UsZ0JBQWdCO1FBQUE7UUFFdEQsSUFBSUUsWUFBWU4saUJBQWlCRyxPQUFPRTtRQUV4QyxJQUFHSixlQUFlO1lBQ2hCSyxZQUFZTCxjQUFjSyxXQUFXRDtRQUN2QztRQUVBLElBQUdBLGVBQWVFLGtCQUFrQjtZQUNsQ0QsWUFBWUQsY0FBY0UsZ0JBQWdCLENBQUNEO1FBQzdDO1FBRUEsT0FBT0E7SUFDVCxFQUFFO0FBRUY7Ozs7Ozs7Ozs7Ozs7Q0FhQyxHQUNELE9BQU8sTUFBTUUseUJBQXlCLENBQ3BDUixrQkFDQSx5RUFBeUU7QUFDekVTLGlCQUFvQixDQUFDLENBQU07SUFFM0IseUVBQXlFO0lBQ3pFLE1BQU1DLGlCQUFvQixDQUFDO0lBRTNCLElBQUlDLGlCQUFvQjtRQUFDLEdBQUdELGNBQWM7UUFBRSxHQUFHRCxjQUFjO0lBQUE7SUFDN0QsSUFBSVI7SUFFSixNQUFNVyxnQkFBZ0IsQ0FBQ0M7UUFDckJaLGdCQUFnQlk7SUFDbEI7SUFFQSxNQUFNQyxnQkFBZ0IsQ0FBQ1o7UUFDckIseUVBQXlFO1FBQ3pFUyxpQkFBaUI7WUFBQyxHQUFHQSxjQUFjO1lBQUUsR0FBR1QsT0FBTztRQUFBO0lBQ2pEO0lBRUEsc0ZBQXNGO0lBQ3RGLE1BQU1hLFlBQVksQ0FBQ1osT0FBZ0JDO1FBQ2pDLE1BQU1DLGdCQUFnQjtZQUFDLEdBQUdNLGNBQWM7WUFBRSxHQUFHUCxnQkFBZ0I7UUFBQTtRQUM3RCxJQUFJRSxZQUFZTixpQkFBaUJHLE9BQU9FO1FBQ3hDLElBQUdKLGVBQWU7WUFDaEJLLFlBQVlMLGNBQWNLLFdBQVdEO1FBQ3ZDO1FBQ0EsSUFBR0EsZUFBZUUsa0JBQWtCO1lBQ2xDRCxZQUFZRCxjQUFjRSxnQkFBZ0IsQ0FBQ0Q7UUFDN0M7UUFDQSxPQUFPQTtJQUNUO0lBRUEsT0FBTztRQUNMVSxrQkFBa0IsSUFBTWY7UUFDeEJnQixZQUFZO1lBQ1YseUVBQXlFO1lBQ3pFLE1BQU1mLFVBQWE7Z0JBQUMsR0FBR1MsY0FBYztZQUFBO1lBQ3JDLE9BQU9UO1FBQ1Q7UUFDQVU7UUFDQUU7UUFDQUM7SUFDRjtBQUNGLEVBQUUifQ==
|