@llmnative/react 0.1.1 → 1.0.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/README.md +387 -364
- package/bin/cli.js +117 -98
- package/dist/index.css +1 -1
- package/dist/index.js +21 -823
- package/dist/index.mjs +14246 -9296
- package/dist/style.css +1 -0
- package/dist/types/src/App.d.ts +72 -14
- package/dist/types/src/Config.d.ts +28 -5
- package/dist/types/src/Global.d.ts +2 -2
- package/dist/types/src/I18n.d.ts +185 -0
- package/dist/types/src/Theme.d.ts +153 -81
- package/dist/types/src/auth.d.ts +13 -1
- package/dist/types/src/components/Component.d.ts +13 -27
- package/dist/types/src/components/ErrorBoundary.d.ts +30 -0
- package/dist/types/src/components/blocks/Brand.d.ts +4 -4
- package/dist/types/src/components/blocks/Breadcrumbs.d.ts +50 -4
- package/dist/types/src/components/blocks/Carousel.d.ts +5 -5
- package/dist/types/src/components/blocks/Dropdown.d.ts +26 -20
- package/dist/types/src/components/blocks/ListCard.d.ts +31 -0
- package/dist/types/src/components/blocks/Menu.d.ts +13 -16
- package/dist/types/src/components/blocks/Notifications.d.ts +8 -3
- package/dist/types/src/components/blocks/ProviderSwitcher.d.ts +63 -0
- package/dist/types/src/components/blocks/Search.d.ts +2 -2
- package/dist/types/src/components/blocks/SideNav.d.ts +45 -0
- package/dist/types/src/components/blocks/ThemeSwitcher.d.ts +24 -0
- package/dist/types/src/components/blocks/Toolbar.d.ts +19 -0
- package/dist/types/src/components/index.d.ts +27 -6
- package/dist/types/src/components/types.d.ts +10 -3
- package/dist/types/src/components/ui/Alert.d.ts +16 -4
- package/dist/types/src/components/ui/Badge.d.ts +6 -5
- package/dist/types/src/components/ui/Buttons.d.ts +13 -12
- package/dist/types/src/components/ui/Card.d.ts +8 -7
- package/dist/types/src/components/ui/Code.d.ts +1 -1
- package/dist/types/src/components/ui/Gallery.d.ts +13 -14
- package/dist/types/src/components/ui/GridSystem.d.ts +1 -1
- package/dist/types/src/components/ui/Icon.d.ts +3 -1
- package/dist/types/src/components/ui/Image.d.ts +1 -1
- package/dist/types/src/components/ui/ImageAvatar.d.ts +1 -1
- package/dist/types/src/components/ui/Loader.d.ts +1 -1
- package/dist/types/src/components/ui/LocaleSwitcher.d.ts +14 -0
- package/dist/types/src/components/ui/Modal.d.ts +42 -15
- package/dist/types/src/components/ui/Pagination.d.ts +14 -3
- package/dist/types/src/components/ui/Percentage.d.ts +5 -5
- package/dist/types/src/components/ui/Repeat.d.ts +15 -6
- package/dist/types/src/components/ui/Tab.d.ts +29 -2
- package/dist/types/src/components/ui/TabDynamic.d.ts +4 -3
- package/dist/types/src/components/ui/Table.d.ts +15 -14
- package/dist/types/src/components/ui/fields/CodeEditor.d.ts +43 -0
- package/dist/types/src/components/ui/fields/ContextMenu.d.ts +38 -0
- package/dist/types/src/components/ui/fields/Crop.d.ts +4 -2
- package/dist/types/src/components/ui/fields/ImageField.d.ts +31 -0
- package/dist/types/src/components/ui/fields/Input.d.ts +43 -14
- package/dist/types/src/components/ui/fields/Prompt.d.ts +2 -31
- package/dist/types/src/components/ui/fields/RichText.d.ts +86 -0
- package/dist/types/src/components/ui/fields/Select.d.ts +13 -10
- package/dist/types/src/components/ui/fields/Upload.d.ts +37 -2
- package/dist/types/src/components/ui/fields/UploadCSV.d.ts +2 -0
- package/dist/types/src/components/ui/useRecordSelection.d.ts +1 -2
- package/dist/types/src/components/widgets/Form.d.ts +80 -43
- package/dist/types/src/components/widgets/ImageEditor.d.ts +4 -5
- package/dist/types/src/components/widgets/MarkdownReader.d.ts +4 -4
- package/dist/types/src/components/widgets/Prompt.d.ts +71 -23
- package/dist/types/src/components/widgets/TabDynamic.d.ts +4 -3
- package/dist/types/src/components/widgets/form-controller.d.ts +42 -0
- package/dist/types/src/components/widgets/grid-core/GridCore.d.ts +1 -1
- package/dist/types/src/components/widgets/grid-core/GridDB.d.ts +1 -1
- package/dist/types/src/components/widgets/grid-core/GridGalleryView.d.ts +1 -1
- package/dist/types/src/components/widgets/grid-core/GridTableView.d.ts +1 -1
- package/dist/types/src/components/widgets/grid-core/types.d.ts +77 -27
- package/dist/types/src/components/widgets/grid-core/useGridActions.d.ts +4 -8
- package/dist/types/src/components/widgets/grid-core/useGridColumns.d.ts +2 -2
- package/dist/types/src/components/widgets/grid-core/useGridDBRecords.d.ts +1 -2
- package/dist/types/src/components/widgets/grid-core/useGridPreparedRecords.d.ts +2 -2
- package/dist/types/src/components/widgets/grid-core/useGridSelection.d.ts +4 -5
- package/dist/types/src/components/widgets/grid-core/utils.d.ts +11 -3
- package/dist/types/src/conf/Prompt.d.ts +1 -1
- package/dist/types/src/conf/i18n/ar.d.ts +2 -0
- package/dist/types/src/conf/i18n/de.d.ts +2 -0
- package/dist/types/src/conf/i18n/en.d.ts +2 -0
- package/dist/types/src/conf/i18n/index.d.ts +6 -0
- package/dist/types/src/conf/i18n/it.d.ts +2 -0
- package/dist/types/src/conf/i18n/ru.d.ts +2 -0
- package/dist/types/src/conf/i18n/zh.d.ts +2 -0
- package/dist/types/src/constant.d.ts +1 -1
- package/dist/types/src/index.d.ts +38 -13
- package/dist/types/src/libs/converter.d.ts +4 -4
- package/dist/types/src/libs/editorHeight.d.ts +12 -0
- package/dist/types/src/libs/fetch.d.ts +4 -4
- package/dist/types/src/libs/imageBuilder.d.ts +63 -14
- package/dist/types/src/libs/imageVariants.d.ts +35 -0
- package/dist/types/src/libs/index.d.ts +1 -4
- package/dist/types/src/libs/promptUtils.d.ts +24 -0
- package/dist/types/src/libs/sanitizer.d.ts +2 -2
- package/dist/types/src/libs/utils.d.ts +9 -10
- package/dist/types/src/pages/index.d.ts +0 -2
- package/dist/types/src/providers/ProviderConfiguration.d.ts +6 -0
- package/dist/types/src/providers/ProviderRegistryContext.d.ts +51 -0
- package/dist/types/src/providers/ProviderSession.d.ts +68 -0
- package/dist/types/src/providers/ai/AIProvider.d.ts +57 -0
- package/dist/types/src/providers/ai/AIProviderContext.d.ts +13 -0
- package/dist/types/src/providers/ai/anthropic.d.ts +2 -0
- package/dist/types/src/providers/ai/deepseek.d.ts +1 -0
- package/dist/types/src/providers/ai/gemini.d.ts +2 -0
- package/dist/types/src/providers/ai/glm.d.ts +1 -0
- package/dist/types/src/providers/ai/index.d.ts +9 -134
- package/dist/types/src/providers/ai/mistral.d.ts +1 -0
- package/dist/types/src/providers/ai/openai.d.ts +1 -0
- package/dist/types/src/providers/ai/openaiCompatible.d.ts +17 -0
- package/dist/types/src/providers/ai/opencode.d.ts +2 -0
- package/dist/types/src/providers/ai/openrouter.d.ts +1 -0
- package/dist/types/src/providers/ai/shared.d.ts +46 -0
- package/dist/types/src/providers/api/ApiProvider.d.ts +43 -0
- package/dist/types/src/providers/api/direct.d.ts +14 -0
- package/dist/types/src/providers/api/firebase.d.ts +14 -0
- package/dist/types/src/providers/api/mock.d.ts +7 -0
- package/dist/types/src/providers/api/supabase.d.ts +14 -0
- package/dist/types/src/providers/auth/AuthProvider.d.ts +2 -2
- package/dist/types/src/providers/auth/firebase/FirebaseAuthProvider.d.ts +26 -0
- package/dist/types/src/providers/auth/google/GoogleAuth.d.ts +2 -2
- package/dist/types/src/providers/auth/supabase/SupabaseAuthProvider.d.ts +48 -0
- package/dist/types/src/providers/credentials/CredentialsProvider.d.ts +3 -0
- package/dist/types/src/providers/credentials/CredentialsProviderContext.d.ts +12 -0
- package/dist/types/src/providers/credentials/google/GoogleServiceAccountProvider.d.ts +8 -0
- package/dist/types/src/providers/data/DataProvider.d.ts +27 -1
- package/dist/types/src/providers/data/firebase.d.ts +5 -4
- package/dist/types/src/providers/data/firestore.d.ts +38 -0
- package/dist/types/src/providers/data/mock.d.ts +8 -1
- package/dist/types/src/providers/data/supabase.d.ts +36 -10
- package/dist/types/src/providers/firebase-init.d.ts +15 -4
- package/dist/types/src/providers/icon/PhosphorIconProvider.d.ts +1 -1
- package/dist/types/src/providers/manifest.d.ts +20 -14
- package/dist/types/src/providers/proxy/index.d.ts +7 -0
- package/dist/types/src/providers/proxy/vite.d.ts +3 -0
- package/dist/types/src/providers/scrape/index.d.ts +2 -1
- package/dist/types/src/providers/seo/google/keyword.d.ts +6 -1
- package/dist/types/src/providers/storage/StorageProvider.d.ts +155 -4
- package/dist/types/src/providers/storage/dropbox.d.ts +3 -3
- package/dist/types/src/providers/storage/firebase.d.ts +38 -7
- package/dist/types/src/providers/storage/supabase.d.ts +47 -7
- package/dist/types/src/providers/supabase-init.d.ts +35 -0
- package/dist/types/src/types/FormFields.d.ts +4 -2
- package/dist/types/src/types/FormSchema.d.ts +29 -0
- package/dist/types/themes/tokyo-night-light.d.ts +3 -0
- package/dist/types/themes/tokyo-night.d.ts +3 -0
- package/dist/types/themes/vscode-dark-plus.d.ts +3 -0
- package/dist/types/themes/vscode-light-plus.d.ts +3 -0
- package/dist/vite.js +1 -0
- package/dist/vite.mjs +54 -0
- package/package.json +40 -9
- package/scripts/cli/proxy-templates/cloudflare.ts +34 -0
- package/scripts/cli/proxy-templates/express.ts +77 -0
- package/scripts/cli/proxy-templates/nextjs-app.ts +42 -0
- package/scripts/cli/proxy-templates/nextjs-pages.ts +41 -0
- package/scripts/cli/proxy-templates/scaffold.json +33 -0
- package/scripts/cli/setup-devtools.js +155 -85
- package/scripts/cli/setup-project.js +618 -484
- package/themes/cyber.ts +469 -405
- package/themes/default.ts +469 -405
- package/themes/flat.ts +469 -405
- package/themes/tokyo-night-light.ts +38 -0
- package/themes/tokyo-night.ts +38 -0
- package/themes/vscode-dark-plus.ts +29 -0
- package/themes/vscode-light-plus.ts +29 -0
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/types/src/components/FormEnhancer.d.ts +0 -26
- package/dist/types/src/components/Template.d.ts +0 -18
- package/dist/types/src/components/ui/fields/AssistantAI.d.ts +0 -23
- package/dist/types/src/components/ui/fields/Command.d.ts +0 -15
- package/dist/types/src/components/ui/fields/ImageUrl.d.ts +0 -7
- package/dist/types/src/libs/cache.d.ts +0 -9
- package/dist/types/src/libs/database.d.ts +0 -3
- package/dist/types/src/libs/log.d.ts +0 -2
- package/dist/types/src/libs/seo.d.ts +0 -8
- package/dist/types/src/libs/storage.d.ts +0 -2
- package/dist/types/src/pages/Blog.d.ts +0 -3
- package/dist/types/src/pages/BlogPost.d.ts +0 -16
- package/dist/types/src/pages/Helper.d.ts +0 -8
- package/dist/types/src/providers/auth/google/apis/auth.d.ts +0 -4
- package/dist/types/src/types/Block.d.ts +0 -4
- package/dist/types/src/types/Section.d.ts +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const GLM_PROVIDER_DEFINITION: import("./shared").AIProviderDefinition;
|
|
@@ -1,134 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
url: string;
|
|
11
|
-
model: string;
|
|
12
|
-
models: string[];
|
|
13
|
-
framework?: string;
|
|
14
|
-
frameworks?: string[];
|
|
15
|
-
temperature: number;
|
|
16
|
-
parseHeaders: () => Record<string, string>;
|
|
17
|
-
parseBody: (prompt: string, role: string, options: AIOptions) => Record<string, any>;
|
|
18
|
-
parseResponse: (response: any) => any;
|
|
19
|
-
}
|
|
20
|
-
interface AIOptions {
|
|
21
|
-
language?: string;
|
|
22
|
-
voice?: string;
|
|
23
|
-
style?: string;
|
|
24
|
-
role?: string;
|
|
25
|
-
model?: string;
|
|
26
|
-
temperature?: number;
|
|
27
|
-
}
|
|
28
|
-
export interface AIFetchConfig extends AIOptions {
|
|
29
|
-
provider?: keyof typeof PROVIDERS;
|
|
30
|
-
}
|
|
31
|
-
export declare const getAIProviderConfigurationState: (provider?: keyof typeof PROVIDERS) => ProviderConfigurationState;
|
|
32
|
-
declare const PROVIDERS: {
|
|
33
|
-
openai: {
|
|
34
|
-
name: string;
|
|
35
|
-
url: string;
|
|
36
|
-
model: string;
|
|
37
|
-
models: string[];
|
|
38
|
-
framework: string;
|
|
39
|
-
frameworks: string[];
|
|
40
|
-
temperature: number;
|
|
41
|
-
parseHeaders: () => {
|
|
42
|
-
'Content-Type': string;
|
|
43
|
-
Authorization: string;
|
|
44
|
-
};
|
|
45
|
-
parseBody: (prompt: string, role: string, options: AIOptions) => {
|
|
46
|
-
model: string;
|
|
47
|
-
messages: {
|
|
48
|
-
role: string;
|
|
49
|
-
content: string;
|
|
50
|
-
}[];
|
|
51
|
-
temperature: number;
|
|
52
|
-
};
|
|
53
|
-
parseResponse: (response: any) => any;
|
|
54
|
-
};
|
|
55
|
-
gemini: {
|
|
56
|
-
name: string;
|
|
57
|
-
url: string;
|
|
58
|
-
model: string;
|
|
59
|
-
models: string[];
|
|
60
|
-
temperature: number;
|
|
61
|
-
parseHeaders: () => {
|
|
62
|
-
'Content-Type': string;
|
|
63
|
-
Authorization: string;
|
|
64
|
-
};
|
|
65
|
-
parseBody: (prompt: string, role: string, options: AIOptions) => {
|
|
66
|
-
model: string;
|
|
67
|
-
instances: {
|
|
68
|
-
content: string;
|
|
69
|
-
}[];
|
|
70
|
-
temperature: number;
|
|
71
|
-
};
|
|
72
|
-
parseResponse: (response: any) => any;
|
|
73
|
-
};
|
|
74
|
-
anthropic: {
|
|
75
|
-
name: string;
|
|
76
|
-
url: string;
|
|
77
|
-
model: string;
|
|
78
|
-
models: string[];
|
|
79
|
-
temperature: number;
|
|
80
|
-
parseHeaders: () => {
|
|
81
|
-
'Content-Type': string;
|
|
82
|
-
Authorization: string;
|
|
83
|
-
};
|
|
84
|
-
parseBody: (prompt: string, role: string, options: AIOptions) => {
|
|
85
|
-
model: string;
|
|
86
|
-
messages: {
|
|
87
|
-
role: string;
|
|
88
|
-
content: string;
|
|
89
|
-
}[];
|
|
90
|
-
temperature: number;
|
|
91
|
-
};
|
|
92
|
-
parseResponse: (response: any) => any;
|
|
93
|
-
};
|
|
94
|
-
mistral: {
|
|
95
|
-
name: string;
|
|
96
|
-
url: string;
|
|
97
|
-
model: string;
|
|
98
|
-
models: string[];
|
|
99
|
-
temperature: number;
|
|
100
|
-
parseHeaders: () => {
|
|
101
|
-
'Content-Type': string;
|
|
102
|
-
Authorization: string;
|
|
103
|
-
};
|
|
104
|
-
parseBody: (prompt: string, role: string, options: AIOptions) => {
|
|
105
|
-
model: string;
|
|
106
|
-
messages: {
|
|
107
|
-
role: string;
|
|
108
|
-
content: string;
|
|
109
|
-
}[];
|
|
110
|
-
temperature: number;
|
|
111
|
-
};
|
|
112
|
-
parseResponse: (response: any) => any;
|
|
113
|
-
};
|
|
114
|
-
};
|
|
115
|
-
export declare class AI extends Prompt {
|
|
116
|
-
config: AIProvider;
|
|
117
|
-
options: AIOptions;
|
|
118
|
-
data?: PromptVariables;
|
|
119
|
-
static fetch(prompt: string, config: AIFetchConfig, data?: PromptVariables): Promise<any>;
|
|
120
|
-
static getModels(provider?: keyof typeof PROVIDERS): string[];
|
|
121
|
-
constructor(provider?: keyof typeof PROVIDERS);
|
|
122
|
-
setOptions(options: AIOptions): this;
|
|
123
|
-
setData(data?: PromptVariables): this;
|
|
124
|
-
static defaults(): {
|
|
125
|
-
model: string;
|
|
126
|
-
role: string;
|
|
127
|
-
language: string;
|
|
128
|
-
country: string;
|
|
129
|
-
voice: string;
|
|
130
|
-
style: string;
|
|
131
|
-
};
|
|
132
|
-
fetchAPI(prompt: string): Promise<any>;
|
|
133
|
-
}
|
|
134
|
-
export {};
|
|
1
|
+
import type { AIConfig } from '../../Config';
|
|
2
|
+
import type { AIProviderAdapter } from './AIProvider';
|
|
3
|
+
import { type AIProviderDefinition } from './shared';
|
|
4
|
+
export type { AIProviderAdapter, AIKeyValidationResult, AIModelDescriptor, AIProviderCapabilities, AIRequestOptions, AIAttachment } from './AIProvider';
|
|
5
|
+
export { formatAIModelRef, parseAIModelRef } from './AIProvider';
|
|
6
|
+
export type { AIModelCatalog } from './shared';
|
|
7
|
+
export { getAIModelCatalog } from './shared';
|
|
8
|
+
export declare const AI_PROVIDER_DEFINITIONS: AIProviderDefinition[];
|
|
9
|
+
export declare const createAIProviderRegistry: (aiConfig?: AIConfig) => Record<string, AIProviderAdapter>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const MISTRAL_PROVIDER_DEFINITION: import("./shared").AIProviderDefinition;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const OPENAI_PROVIDER_DEFINITION: import("./shared").AIProviderDefinition;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AIProviderDefinition, BuiltInAIProviderId } from './shared';
|
|
2
|
+
type OpenAICompatibleDefinitionOptions = {
|
|
3
|
+
id: BuiltInAIProviderId;
|
|
4
|
+
label: string;
|
|
5
|
+
configKey: string;
|
|
6
|
+
requiredConfigKeys?: string[];
|
|
7
|
+
defaultModel: string;
|
|
8
|
+
fallbackModels: string[];
|
|
9
|
+
baseUrl: string;
|
|
10
|
+
modelsUrl?: string;
|
|
11
|
+
chatCompletionsUrl?: string;
|
|
12
|
+
dashboardUrl?: string;
|
|
13
|
+
/** Override the default validateApiKey when the models endpoint is public or uses a non-standard error format. */
|
|
14
|
+
validateApiKey?: AIProviderDefinition['validateApiKey'];
|
|
15
|
+
};
|
|
16
|
+
export declare const createOpenAICompatibleProviderDefinition: ({ id, label, configKey, requiredConfigKeys, defaultModel, fallbackModels, baseUrl, modelsUrl, chatCompletionsUrl, dashboardUrl, validateApiKey: validateApiKeyOverride, }: OpenAICompatibleDefinitionOptions) => AIProviderDefinition;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const OPENROUTER_PROVIDER_DEFINITION: import("./shared").AIProviderDefinition;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type ProviderConfigurationState } from '../ProviderConfiguration';
|
|
2
|
+
import type { AICompleteRequest, AIKeyValidationResult, AIModelDescriptor, AIProviderAdapter, AIProviderCapabilities, AIRequestOptions } from './AIProvider';
|
|
3
|
+
export type BuiltInAIProviderId = 'openai' | 'openrouter' | 'opencode' | 'openai-compatible' | 'deepseek' | 'gemini' | 'anthropic' | 'mistral' | 'glm';
|
|
4
|
+
export type AIProviderDefinition = {
|
|
5
|
+
id: BuiltInAIProviderId;
|
|
6
|
+
label: string;
|
|
7
|
+
configKey?: string;
|
|
8
|
+
requiredConfigKeys?: string[];
|
|
9
|
+
defaultModel: string;
|
|
10
|
+
fallbackModels: string[];
|
|
11
|
+
/** URL to the provider's API key management page (shown in UI on validation error). */
|
|
12
|
+
dashboardUrl?: string;
|
|
13
|
+
capabilities?: Omit<AIProviderCapabilities, 'models'>;
|
|
14
|
+
discoverModels: (apiKey: string) => Promise<string[]>;
|
|
15
|
+
complete: (apiKey: string, request: Required<Pick<AICompleteRequest, 'prompt' | 'model'>> & AIRequestOptions) => Promise<string | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Per-provider auth check. When omitted, the default implementation in
|
|
18
|
+
* RuntimeAIProvider calls discoverModels() live (no cache) and treats any
|
|
19
|
+
* thrown error as invalid. Providers whose error format is non-standard or
|
|
20
|
+
* whose models endpoint is public MUST provide their own implementation.
|
|
21
|
+
*/
|
|
22
|
+
validateApiKey?: (apiKey: string) => Promise<Omit<AIKeyValidationResult, 'dashboardUrl'>>;
|
|
23
|
+
};
|
|
24
|
+
export type AIModelCatalog = {
|
|
25
|
+
models: AIModelDescriptor[];
|
|
26
|
+
modelsByProvider: Record<string, AIModelDescriptor[]>;
|
|
27
|
+
capabilitiesByProvider: Record<string, AIProviderCapabilities>;
|
|
28
|
+
};
|
|
29
|
+
export declare const extractProviderError: (err: unknown) => string;
|
|
30
|
+
export declare const createBrowserTransportError: (label: string) => Error;
|
|
31
|
+
export declare const parseTextResponse: (value: unknown) => string | null;
|
|
32
|
+
export declare const getAIModelCatalog: (registry: Record<string, AIProviderAdapter>, forceRefresh?: boolean) => Promise<AIModelCatalog>;
|
|
33
|
+
export declare class RuntimeAIProvider implements AIProviderAdapter {
|
|
34
|
+
id: BuiltInAIProviderId;
|
|
35
|
+
label: string;
|
|
36
|
+
defaultModel: string;
|
|
37
|
+
dashboardUrl?: string;
|
|
38
|
+
private readonly definition;
|
|
39
|
+
private readonly apiKey;
|
|
40
|
+
constructor(definition: AIProviderDefinition, apiKey: string);
|
|
41
|
+
isConfigured(): boolean;
|
|
42
|
+
getConfigurationState(): ProviderConfigurationState;
|
|
43
|
+
getCapabilities(forceRefresh?: boolean): Promise<AIProviderCapabilities>;
|
|
44
|
+
complete(request: AICompleteRequest): Promise<string | null>;
|
|
45
|
+
validateApiKey(): Promise<AIKeyValidationResult>;
|
|
46
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ProviderConfigurable } from '../ProviderConfiguration';
|
|
2
|
+
/**
|
|
3
|
+
* "api" — a real provider category (docs/24-tenant-platform.md, Service Gateway), same
|
|
4
|
+
* registry/lifecycle as data/storage/etc. Registers a third-party REST integration (Brevo,
|
|
5
|
+
* a payments API, a non-streaming AI provider, ...) once — base URL, fixed header/query/body
|
|
6
|
+
* fields (where a secret usually lives) — and exposes one generic call:
|
|
7
|
+
*
|
|
8
|
+
* setProvider('api', 'payments', new DirectApiProviderAdapter({
|
|
9
|
+
* baseUrl: 'https://payments.acme.com/api',
|
|
10
|
+
* header: { Authorization: 'Bearer <secret>' },
|
|
11
|
+
* }));
|
|
12
|
+
*
|
|
13
|
+
* useApiProvider('payments').fetch({ path: '/charges', method: 'post', body: { amount: 1000 } });
|
|
14
|
+
*
|
|
15
|
+
* Registered/fixed fields always win over a matching key the caller passes — same
|
|
16
|
+
* authoritative-merge rule as the tenant-session handshake.
|
|
17
|
+
*
|
|
18
|
+
* Other category adapters (an EmailProviderAdapter for Brevo, an AIProviderAdapter for a
|
|
19
|
+
* REST-only model) call an ApiProviderAdapter internally instead of fetch()/proxyFetch()
|
|
20
|
+
* directly — a vendor adapter is just a few lines of normal code, no framework-provided bridge.
|
|
21
|
+
*
|
|
22
|
+
* Adapters (same interface, different execution context — mirrors DataProviderAdapter's
|
|
23
|
+
* Firebase/Supabase/Mock split), one file each like data/storage:
|
|
24
|
+
* - direct.ts — DirectApiProviderAdapter, client-resident, via proxyFetch (CORS-safe). The
|
|
25
|
+
* secret IS visible to the browser here — a dev/personal key, or a no-backend deploy, never
|
|
26
|
+
* a real shared tenant secret.
|
|
27
|
+
* - firebase.ts — FirebaseApiProviderAdapter, routes through a Firebase Callable Function;
|
|
28
|
+
* the secret lives server-side, resolved there from the real tenant/user registration.
|
|
29
|
+
* - supabase.ts — SupabaseApiProviderAdapter, same idea via a Supabase Edge Function.
|
|
30
|
+
* - mock.ts — MockApiProviderAdapter, resolves via a local function, no network. Dev/tests.
|
|
31
|
+
*/
|
|
32
|
+
export type ApiProviderRequest = {
|
|
33
|
+
path: string;
|
|
34
|
+
/** Default: 'POST'. */
|
|
35
|
+
method?: string;
|
|
36
|
+
query?: Record<string, string>;
|
|
37
|
+
body?: unknown;
|
|
38
|
+
};
|
|
39
|
+
export interface ApiProviderAdapter extends ProviderConfigurable {
|
|
40
|
+
fetch(request: ApiProviderRequest): Promise<unknown>;
|
|
41
|
+
}
|
|
42
|
+
/** Convenience wrapper over useProvider('api', name) — same registry, just the ergonomic one-arg form. */
|
|
43
|
+
export declare const useApiProvider: (name: string) => ApiProviderAdapter;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ApiProviderAdapter, ApiProviderRequest } from './ApiProvider';
|
|
2
|
+
export type DirectApiProviderConfig = {
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
/** Fixed fields merged into every call — this is where a secret normally lives. Always wins over a matching key in the request. */
|
|
5
|
+
header?: Record<string, string>;
|
|
6
|
+
query?: Record<string, string>;
|
|
7
|
+
body?: Record<string, unknown>;
|
|
8
|
+
};
|
|
9
|
+
/** Client-resident: calls the target directly via proxyFetch (CORS-safe). Secret visible to the browser — dev/personal key or no-backend deploy only. */
|
|
10
|
+
export declare class DirectApiProviderAdapter implements ApiProviderAdapter {
|
|
11
|
+
private config;
|
|
12
|
+
constructor(config: DirectApiProviderConfig);
|
|
13
|
+
fetch(request: ApiProviderRequest): Promise<unknown>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ApiProviderAdapter, ApiProviderRequest } from './ApiProvider';
|
|
2
|
+
export type FirebaseApiProviderConfig = {
|
|
3
|
+
/** Name of the Callable Function that receives { provider, request } and does the real, secret-bearing call server-side. */
|
|
4
|
+
functionName: string;
|
|
5
|
+
/** The registered provider's own name — sent alongside the request so the function knows which registration to resolve. */
|
|
6
|
+
providerName: string;
|
|
7
|
+
region?: string;
|
|
8
|
+
};
|
|
9
|
+
/** Routes through a Firebase Callable Function — the secret lives server-side, resolved there from the real tenant/user registration. */
|
|
10
|
+
export declare class FirebaseApiProviderAdapter implements ApiProviderAdapter {
|
|
11
|
+
private config;
|
|
12
|
+
constructor(config: FirebaseApiProviderConfig);
|
|
13
|
+
fetch(request: ApiProviderRequest): Promise<unknown>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ApiProviderAdapter, ApiProviderRequest } from './ApiProvider';
|
|
2
|
+
/** Resolves via a local function, no network. Dev/tests. */
|
|
3
|
+
export declare class MockApiProviderAdapter implements ApiProviderAdapter {
|
|
4
|
+
private resolver;
|
|
5
|
+
constructor(resolver: (request: ApiProviderRequest) => unknown | Promise<unknown>);
|
|
6
|
+
fetch(request: ApiProviderRequest): Promise<unknown>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ApiProviderAdapter, ApiProviderRequest } from './ApiProvider';
|
|
2
|
+
export type SupabaseApiProviderConfig = {
|
|
3
|
+
url: string;
|
|
4
|
+
anonKey: string;
|
|
5
|
+
/** Name of the Edge Function that receives { provider, request } and does the real, secret-bearing call server-side. */
|
|
6
|
+
functionName: string;
|
|
7
|
+
providerName: string;
|
|
8
|
+
};
|
|
9
|
+
/** Routes through a Supabase Edge Function — the secret lives server-side, resolved there from the real tenant/user registration. */
|
|
10
|
+
export declare class SupabaseApiProviderAdapter implements ApiProviderAdapter {
|
|
11
|
+
private config;
|
|
12
|
+
constructor(config: SupabaseApiProviderConfig);
|
|
13
|
+
fetch(request: ApiProviderRequest): Promise<unknown>;
|
|
14
|
+
}
|
|
@@ -4,13 +4,13 @@ export interface UserProfile {
|
|
|
4
4
|
email?: string;
|
|
5
5
|
displayName?: string;
|
|
6
6
|
photoURL?: string;
|
|
7
|
-
[key: string]:
|
|
7
|
+
[key: string]: unknown;
|
|
8
8
|
}
|
|
9
9
|
export type AuthIntent = 'signIn' | 'connect' | 'signOut' | 'disconnect' | 'reauthorize';
|
|
10
10
|
export interface AuthSignInOptions {
|
|
11
11
|
scopes?: string[];
|
|
12
12
|
intent?: AuthIntent;
|
|
13
|
-
[key: string]:
|
|
13
|
+
[key: string]: unknown;
|
|
14
14
|
}
|
|
15
15
|
export interface AuthProviderAdapter extends ProviderConfigurable {
|
|
16
16
|
getUser(): UserProfile | null;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AuthProviderAdapter, AuthSignInOptions, UserProfile } from '../AuthProvider';
|
|
2
|
+
import type { ProviderConfigurationState } from '../../ProviderConfiguration';
|
|
3
|
+
/**
|
|
4
|
+
* Firebase-specific sign-in options.
|
|
5
|
+
*
|
|
6
|
+
* method: 'password' (default) | 'anonymous' | 'oauth'
|
|
7
|
+
* email + password: required when method = 'password'
|
|
8
|
+
* provider: required when method = 'oauth' - e.g. 'github', 'apple', 'microsoft'
|
|
9
|
+
* Note: for Google OAuth use GoogleAuthProvider, not FirebaseAuthProvider.
|
|
10
|
+
*/
|
|
11
|
+
export interface FirebaseSignInOptions extends AuthSignInOptions {
|
|
12
|
+
method?: 'password' | 'anonymous' | 'oauth';
|
|
13
|
+
email?: string;
|
|
14
|
+
password?: string;
|
|
15
|
+
provider?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class FirebaseAuthProvider implements AuthProviderAdapter {
|
|
18
|
+
getConfigurationState(): ProviderConfigurationState;
|
|
19
|
+
isConfigured(): boolean;
|
|
20
|
+
getUser(): UserProfile | null;
|
|
21
|
+
isAuthenticated(): boolean;
|
|
22
|
+
signIn(options?: FirebaseSignInOptions): Promise<UserProfile | null>;
|
|
23
|
+
signOut(): Promise<void>;
|
|
24
|
+
onAuthChange(callback: (user: UserProfile | null) => void): () => void;
|
|
25
|
+
getAccessToken(): Promise<string>;
|
|
26
|
+
}
|
|
@@ -4,9 +4,9 @@ declare global {
|
|
|
4
4
|
google: {
|
|
5
5
|
accounts: {
|
|
6
6
|
id: {
|
|
7
|
-
initialize: (options:
|
|
7
|
+
initialize: (options: Record<string, unknown>) => void;
|
|
8
8
|
prompt: (callback?: () => void) => void;
|
|
9
|
-
renderButton: (element: HTMLElement, options:
|
|
9
|
+
renderButton: (element: HTMLElement, options: Record<string, unknown>) => void;
|
|
10
10
|
disableAutoSelect: () => void;
|
|
11
11
|
revoke: (hint: string, callback?: () => void) => void;
|
|
12
12
|
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { AuthProviderAdapter, AuthSignInOptions, UserProfile } from '../AuthProvider';
|
|
2
|
+
import type { ProviderConfigurationState } from '../../ProviderConfiguration';
|
|
3
|
+
export interface SupabaseAuthConfig {
|
|
4
|
+
url: string;
|
|
5
|
+
anonKey: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Supabase-specific sign-in options.
|
|
9
|
+
* Passed as part of `AuthSignInOptions` (open `[key: string]: any` index signature).
|
|
10
|
+
*
|
|
11
|
+
* method: 'password' (default) | 'magic_link' | 'oauth' | 'anonymous'
|
|
12
|
+
* email: required for 'password' and 'magic_link'
|
|
13
|
+
* password: required for 'password'
|
|
14
|
+
* provider: required for 'oauth' - e.g. 'github', 'google', 'apple', 'twitter'
|
|
15
|
+
* redirectTo: optional - overrides the redirect URL after OAuth / magic link
|
|
16
|
+
*/
|
|
17
|
+
export interface SupabaseSignInOptions extends AuthSignInOptions {
|
|
18
|
+
method?: 'password' | 'magic_link' | 'oauth' | 'anonymous';
|
|
19
|
+
email?: string;
|
|
20
|
+
password?: string;
|
|
21
|
+
provider?: string;
|
|
22
|
+
redirectTo?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare class SupabaseAuthProvider implements AuthProviderAdapter {
|
|
25
|
+
private config;
|
|
26
|
+
private get client();
|
|
27
|
+
constructor(config: SupabaseAuthConfig);
|
|
28
|
+
getConfigurationState(): ProviderConfigurationState;
|
|
29
|
+
isConfigured(): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Returns the currently cached session user (synchronous, no network call).
|
|
32
|
+
* Returns null if no active session.
|
|
33
|
+
*/
|
|
34
|
+
getUser(): UserProfile | null;
|
|
35
|
+
isAuthenticated(): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Authenticate with Supabase.
|
|
38
|
+
*
|
|
39
|
+
* options.method = 'password' (default): email + password sign-in
|
|
40
|
+
* options.method = 'magic_link': OTP email - returns null (email sent, no user yet)
|
|
41
|
+
* options.method = 'oauth': redirect flow - returns null (user arrives after redirect)
|
|
42
|
+
* options.method = 'anonymous': anonymous session
|
|
43
|
+
*/
|
|
44
|
+
signIn(options?: SupabaseSignInOptions): Promise<UserProfile | null>;
|
|
45
|
+
signOut(): Promise<void>;
|
|
46
|
+
onAuthChange(callback: (user: UserProfile | null) => void): () => void;
|
|
47
|
+
getAccessToken(): Promise<string>;
|
|
48
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { CredentialsAdapter } from './CredentialsProvider';
|
|
3
|
+
type CredentialsProviderContextValue = {
|
|
4
|
+
registry: Record<string, CredentialsAdapter>;
|
|
5
|
+
defaultKey: string;
|
|
6
|
+
};
|
|
7
|
+
declare const CredentialsProviderContext: React.Context<CredentialsProviderContextValue | null>;
|
|
8
|
+
export declare const CredentialsProvider: ({ registry, defaultKey, children, }: CredentialsProviderContextValue & {
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
}) => React.JSX.Element;
|
|
11
|
+
export declare const useCredentialsProvider: (name?: string) => CredentialsAdapter;
|
|
12
|
+
export default CredentialsProviderContext;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CredentialsAdapter } from '../CredentialsProvider';
|
|
2
|
+
import type { GoogleServiceAccount } from '../../../Config';
|
|
3
|
+
export declare class GoogleServiceAccountProvider implements CredentialsAdapter {
|
|
4
|
+
private config;
|
|
5
|
+
private cache;
|
|
6
|
+
constructor(config: GoogleServiceAccount);
|
|
7
|
+
getToken(scope?: string): Promise<string>;
|
|
8
|
+
}
|
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
import type { ProviderConfigurable } from '../ProviderConfiguration';
|
|
2
|
-
|
|
2
|
+
/** Canonical primary-key field name used by all data providers and the Form widget. */
|
|
3
|
+
export declare const RECORD_KEY: "_key";
|
|
4
|
+
/** A single field value in a record - scalar, nested object, or array of scalars. */
|
|
5
|
+
export type FieldValue = string | number | boolean | null | undefined | Record<string, unknown> | unknown[];
|
|
6
|
+
type FieldMap = Record<string, FieldValue>;
|
|
3
7
|
type RecordObject = Record<string, FieldMap>;
|
|
8
|
+
/**
|
|
9
|
+
* A data record as used by Form, Grid, and all data providers.
|
|
10
|
+
* `_key` is the primary key injected by the provider (matches `RECORD_KEY`).
|
|
11
|
+
* `_index` is the 0-based position in the parent collection (read-only, injected by providers).
|
|
12
|
+
*/
|
|
4
13
|
export type RecordProps = FieldMap & {
|
|
5
14
|
_key?: string;
|
|
6
15
|
_index?: number;
|
|
7
16
|
};
|
|
17
|
+
/** Ordered list of records returned by a provider `subscribe` or `read` call. */
|
|
8
18
|
export type RecordArray = Array<RecordProps>;
|
|
9
19
|
type ScalarValue = string | number | boolean | null;
|
|
10
20
|
type RangeValue = string | number | boolean;
|
|
@@ -45,14 +55,30 @@ export interface SetChunksOptions {
|
|
|
45
55
|
purge?: boolean;
|
|
46
56
|
onProgress?: (done: number, total: number, message: string) => void;
|
|
47
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Port contract for all data back-ends (Firebase RTDB, Firestore, Supabase, Mock, …).
|
|
60
|
+
* Implement this interface to register a custom provider via `<App providers={...}>`.
|
|
61
|
+
*/
|
|
48
62
|
export interface DataProviderAdapter extends ProviderConfigurable {
|
|
63
|
+
/** Read a single record or collection at `path`. Returns `null` when not found. */
|
|
49
64
|
read(path: string, options?: ReadOptions): Promise<any>;
|
|
65
|
+
/** Write (overwrite) the node at `path` with `data`. */
|
|
50
66
|
set(path: string, data: object, exception?: boolean): Promise<void>;
|
|
67
|
+
/** Merge `data` into the existing node at `path` (partial update). */
|
|
51
68
|
update(path: string, data: object, exception?: boolean): Promise<void>;
|
|
69
|
+
/** Delete the node at `path`. */
|
|
52
70
|
remove(path: string, exception?: boolean): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Subscribe to real-time updates at `path`.
|
|
73
|
+
* `setRecords` is called immediately with the current data, then on every change.
|
|
74
|
+
* Returns a cleanup function that cancels the subscription.
|
|
75
|
+
*/
|
|
53
76
|
subscribe(path: string | undefined, setRecords: (records: RecordArray) => void, options?: DatabaseOptions): () => void;
|
|
77
|
+
/** Return the number of records in the collection at `path`. */
|
|
54
78
|
count?(path: string): Promise<number>;
|
|
79
|
+
/** Return only the direct child keys of `path` without fetching full records. */
|
|
55
80
|
readShallow?(path: string, exception?: boolean): Promise<string[]>;
|
|
81
|
+
/** Write `data` to `path` in batches (useful for large imports). */
|
|
56
82
|
setChunks?(path: string, data: object, options?: SetChunksOptions): Promise<void>;
|
|
57
83
|
}
|
|
58
84
|
export {};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import 'firebase/compat/database';
|
|
2
1
|
import { DataProviderAdapter, DatabaseOptions, ReadOptions, SetChunksOptions, RecordProps } from "./DataProvider";
|
|
3
2
|
import type { ProviderConfigurationState } from "../ProviderConfiguration";
|
|
4
3
|
export declare const SYSTEM_FIELDS: {
|
|
@@ -6,13 +5,15 @@ export declare const SYSTEM_FIELDS: {
|
|
|
6
5
|
value: string;
|
|
7
6
|
};
|
|
8
7
|
export declare class FirebaseDataProvider implements DataProviderAdapter {
|
|
8
|
+
private static listenerRegistered;
|
|
9
|
+
constructor();
|
|
9
10
|
getConfigurationState(): ProviderConfigurationState;
|
|
10
11
|
isConfigured(): boolean;
|
|
11
12
|
readShallow: (path: string, exception?: boolean) => Promise<string[]>;
|
|
12
13
|
read: (path: string, { where, order, toArray, exception }?: ReadOptions) => Promise<any>;
|
|
13
|
-
update: (path: string, data:
|
|
14
|
-
set: (path: string, data:
|
|
15
|
-
setChunks: (path: string, data:
|
|
14
|
+
update: (path: string, data: object, exception?: boolean) => Promise<void>;
|
|
15
|
+
set: (path: string, data: object, exception?: boolean) => Promise<void>;
|
|
16
|
+
setChunks: (path: string, data: object, { chunkSize, purge, onProgress }?: SetChunksOptions) => Promise<void>;
|
|
16
17
|
remove: (path: string, exception?: boolean) => Promise<void>;
|
|
17
18
|
count: (path: string) => Promise<number>;
|
|
18
19
|
subscribe: <T extends RecordProps = RecordProps>(path: string | undefined, setRecords: (records: T[]) => void, { where, order, fieldMap, onLoad }?: DatabaseOptions) => (() => void);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { DataProviderAdapter, DatabaseOptions, ReadOptions, SetChunksOptions, RecordProps } from './DataProvider';
|
|
2
|
+
import type { ProviderConfigurationState } from '../ProviderConfiguration';
|
|
3
|
+
export declare class FirestoreDataProvider implements DataProviderAdapter {
|
|
4
|
+
private static listenerRegistered;
|
|
5
|
+
constructor();
|
|
6
|
+
getConfigurationState(): ProviderConfigurationState;
|
|
7
|
+
isConfigured(): boolean;
|
|
8
|
+
read: (path: string, { where, order, toArray, exception }?: ReadOptions) => Promise<any>;
|
|
9
|
+
set: (path: string, data: object, exception?: boolean) => Promise<void>;
|
|
10
|
+
update: (path: string, data: object, exception?: boolean) => Promise<void>;
|
|
11
|
+
remove: (path: string, exception?: boolean) => Promise<void>;
|
|
12
|
+
count: (path: string) => Promise<number>;
|
|
13
|
+
/**
|
|
14
|
+
* Real-time listener via Firestore onSnapshot.
|
|
15
|
+
*
|
|
16
|
+
* - Collection path (/users): subscribes to all matching documents.
|
|
17
|
+
* - Document path (/users/uid): subscribes to a single document.
|
|
18
|
+
*
|
|
19
|
+
* Returns an unsubscribe function - always call it on component unmount.
|
|
20
|
+
*
|
|
21
|
+
* Firestore inequality filters on a field require the first orderBy() to be
|
|
22
|
+
* on that same field. Pass `order` accordingly to avoid SDK errors.
|
|
23
|
+
*/
|
|
24
|
+
subscribe: <T extends RecordProps = RecordProps>(path: string | undefined, setRecords: (records: T[]) => void, { where, order, fieldMap, onLoad }?: DatabaseOptions) => (() => void);
|
|
25
|
+
/**
|
|
26
|
+
* Returns the list of document IDs in a collection without loading document
|
|
27
|
+
* data - the Firestore equivalent of RTDB's ?shallow=true REST endpoint.
|
|
28
|
+
* On a document path, returns the document's field names.
|
|
29
|
+
*/
|
|
30
|
+
readShallow: (path: string, exception?: boolean) => Promise<string[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Bulk-writes `data` to a collection using Firestore writeBatch.
|
|
33
|
+
* Each batch holds at most min(chunkSize, 500) documents (Firestore limit).
|
|
34
|
+
* If `purge` is true, all existing documents in the collection are deleted
|
|
35
|
+
* first (also in batches of 500).
|
|
36
|
+
*/
|
|
37
|
+
setChunks: (path: string, data: object, { chunkSize, purge, onProgress }?: SetChunksOptions) => Promise<void>;
|
|
38
|
+
}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { DataProviderAdapter, DatabaseOptions, ReadOptions, RecordArray } from './DataProvider';
|
|
2
2
|
type CollectionStore = Record<string, Record<string, any>>;
|
|
3
|
+
export type MockDataProviderOptions = {
|
|
4
|
+
persist?: boolean;
|
|
5
|
+
storageKey?: string;
|
|
6
|
+
};
|
|
3
7
|
export declare class MockDataProvider implements DataProviderAdapter {
|
|
4
8
|
private store;
|
|
5
9
|
private listeners;
|
|
6
|
-
|
|
10
|
+
private persistKey;
|
|
11
|
+
constructor(initialData?: CollectionStore, options?: MockDataProviderOptions);
|
|
12
|
+
private loadStore;
|
|
13
|
+
private saveStore;
|
|
7
14
|
isConfigured(): boolean;
|
|
8
15
|
getConfigurationState(): {
|
|
9
16
|
configured: boolean;
|