@ankhorage/orchestrator-module-expo-localization 0.4.0 → 0.5.1
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/CHANGELOG.md +12 -0
- package/README.md +17 -0
- package/dist/admin/operations.d.ts +10 -0
- package/dist/admin/operations.d.ts.map +1 -0
- package/dist/admin/operations.js +10 -0
- package/dist/admin/operations.js.map +1 -0
- package/dist/admin/runtime.d.ts +0 -9
- package/dist/admin/runtime.d.ts.map +1 -1
- package/dist/admin/runtime.js +1 -9
- package/dist/admin/runtime.js.map +1 -1
- package/dist/admin-view/DictionaryEditorCard.d.ts +9 -0
- package/dist/admin-view/DictionaryEditorCard.d.ts.map +1 -0
- package/dist/admin-view/DictionaryEditorCard.js +26 -0
- package/dist/admin-view/DictionaryEditorCard.js.map +1 -0
- package/dist/admin-view/ExpoLocalizationAdminView.d.ts +3 -0
- package/dist/admin-view/ExpoLocalizationAdminView.d.ts.map +1 -0
- package/dist/admin-view/ExpoLocalizationAdminView.js +18 -0
- package/dist/admin-view/ExpoLocalizationAdminView.js.map +1 -0
- package/dist/admin-view/LocaleManagementCard.d.ts +9 -0
- package/dist/admin-view/LocaleManagementCard.d.ts.map +1 -0
- package/dist/admin-view/LocaleManagementCard.js +14 -0
- package/dist/admin-view/LocaleManagementCard.js.map +1 -0
- package/dist/admin-view/MissingTranslationsCard.d.ts +5 -0
- package/dist/admin-view/MissingTranslationsCard.d.ts.map +1 -0
- package/dist/admin-view/MissingTranslationsCard.js +6 -0
- package/dist/admin-view/MissingTranslationsCard.js.map +1 -0
- package/dist/admin-view/TranslatableFieldRow.d.ts +10 -0
- package/dist/admin-view/TranslatableFieldRow.d.ts.map +1 -0
- package/dist/admin-view/TranslatableFieldRow.js +18 -0
- package/dist/admin-view/TranslatableFieldRow.js.map +1 -0
- package/dist/admin-view/TranslatableFieldsCard.d.ts +11 -0
- package/dist/admin-view/TranslatableFieldsCard.d.ts.map +1 -0
- package/dist/admin-view/TranslatableFieldsCard.js +19 -0
- package/dist/admin-view/TranslatableFieldsCard.js.map +1 -0
- package/dist/admin-view/index.d.ts +8 -0
- package/dist/admin-view/index.d.ts.map +1 -0
- package/dist/admin-view/index.js +8 -0
- package/dist/admin-view/index.js.map +1 -0
- package/dist/admin-view/readSnapshot.d.ts +3 -0
- package/dist/admin-view/readSnapshot.d.ts.map +1 -0
- package/dist/admin-view/readSnapshot.js +71 -0
- package/dist/admin-view/readSnapshot.js.map +1 -0
- package/dist/admin-view/types.d.ts +6 -0
- package/dist/admin-view/types.d.ts.map +1 -0
- package/dist/admin-view/types.js +2 -0
- package/dist/admin-view/types.js.map +1 -0
- package/dist/admin-view/useLocalizationAdmin.d.ts +12 -0
- package/dist/admin-view/useLocalizationAdmin.d.ts.map +1 -0
- package/dist/admin-view/useLocalizationAdmin.js +48 -0
- package/dist/admin-view/useLocalizationAdmin.js.map +1 -0
- package/dist/host.d.ts +2 -1
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +2 -1
- package/dist/host.js.map +1 -1
- package/package.json +21 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @ankhorage/orchestrator-module-expo-localization
|
|
2
2
|
|
|
3
|
+
## 0.5.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 0ea3011: Keep the optional Localization admin view browser-safe by separating shared operation identifiers from the server-side admin runtime dependency graph.
|
|
8
|
+
|
|
9
|
+
## 0.5.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- ba14722: Add the optional package-owned React/ZORA Localization administration view for locale management, canonical dictionary editing, metadata-driven field linking, and missing-translation authoring through the opaque module admin runtime contract.
|
|
14
|
+
|
|
3
15
|
## 0.4.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -63,6 +63,23 @@ from module-owned domain APIs. The link operation validates eligibility from inj
|
|
|
63
63
|
metadata and uses the generic manifest mutation callback; new keys are seeded in the configured
|
|
64
64
|
default-locale dictionary without overwriting an existing translation.
|
|
65
65
|
|
|
66
|
+
## Optional admin view
|
|
67
|
+
|
|
68
|
+
React/ZORA authoring hosts can render the package-owned administration surface from the optional
|
|
69
|
+
`./admin-view` subpath. The view receives only an opaque executor and an optional project-change
|
|
70
|
+
callback; Localization operation IDs and result semantics remain inside this package.
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import {
|
|
74
|
+
ExpoLocalizationAdminView,
|
|
75
|
+
expoLocalizationAdminViewContribution,
|
|
76
|
+
} from '@ankhorage/orchestrator-module-expo-localization/admin-view';
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
The view covers locale/default-locale management, canonical dictionary create/update/delete,
|
|
80
|
+
metadata-driven translatable-field search/filtering and linking, and missing-translation state. React
|
|
81
|
+
and ZORA are optional peer dependencies and are not dependencies of the root or `./host` entrypoints.
|
|
82
|
+
|
|
66
83
|
## Why this exists
|
|
67
84
|
|
|
68
85
|
Standardizes localization setup across apps.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const EXPO_LOCALIZATION_ADMIN_OPERATIONS: {
|
|
2
|
+
readonly load: "load";
|
|
3
|
+
readonly addLocale: "config.add-locale";
|
|
4
|
+
readonly removeLocale: "config.remove-locale";
|
|
5
|
+
readonly setDefaultLocale: "config.set-default-locale";
|
|
6
|
+
readonly setTranslation: "dictionary.set-translation";
|
|
7
|
+
readonly deleteTranslation: "dictionary.delete-translation";
|
|
8
|
+
readonly linkTranslationKey: "link-translation-key";
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/admin/operations.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kCAAkC;;;;;;;;CAQrC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const EXPO_LOCALIZATION_ADMIN_OPERATIONS = {
|
|
2
|
+
load: 'load',
|
|
3
|
+
addLocale: 'config.add-locale',
|
|
4
|
+
removeLocale: 'config.remove-locale',
|
|
5
|
+
setDefaultLocale: 'config.set-default-locale',
|
|
6
|
+
setTranslation: 'dictionary.set-translation',
|
|
7
|
+
deleteTranslation: 'dictionary.delete-translation',
|
|
8
|
+
linkTranslationKey: 'link-translation-key',
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/admin/operations.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,mBAAmB;IAC9B,YAAY,EAAE,sBAAsB;IACpC,gBAAgB,EAAE,2BAA2B;IAC7C,cAAc,EAAE,4BAA4B;IAC5C,iBAAiB,EAAE,+BAA+B;IAClD,kBAAkB,EAAE,sBAAsB;CAClC,CAAC"}
|
package/dist/admin/runtime.d.ts
CHANGED
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
import type { ExpoLocalizationAdminHostContext, ExpoLocalizationAdminInvocation } from './types';
|
|
2
|
-
export declare const EXPO_LOCALIZATION_ADMIN_OPERATIONS: {
|
|
3
|
-
readonly load: "load";
|
|
4
|
-
readonly addLocale: "config.add-locale";
|
|
5
|
-
readonly removeLocale: "config.remove-locale";
|
|
6
|
-
readonly setDefaultLocale: "config.set-default-locale";
|
|
7
|
-
readonly setTranslation: "dictionary.set-translation";
|
|
8
|
-
readonly deleteTranslation: "dictionary.delete-translation";
|
|
9
|
-
readonly linkTranslationKey: "link-translation-key";
|
|
10
|
-
};
|
|
11
2
|
export declare const expoLocalizationAdminRuntime: {
|
|
12
3
|
readonly kind: "module-admin-runtime";
|
|
13
4
|
readonly execute: typeof executeExpoLocalizationAdminOperation;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/admin/runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/admin/runtime.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,gCAAgC,EAChC,+BAA+B,EAGhC,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,4BAA4B;;;CAG/B,CAAC;AAEX,iBAAe,qCAAqC,CAClD,OAAO,EAAE,gCAAgC,EACzC,UAAU,EAAE,+BAA+B,GAC1C,OAAO,CAAC,OAAO,CAAC,CAkClB;AAyFD,YAAY,EACV,qCAAqC,EACrC,gCAAgC,EAChC,+BAA+B,EAC/B,gCAAgC,EAChC,6BAA6B,EAC7B,oCAAoC,EACpC,qCAAqC,GACtC,MAAM,SAAS,CAAC"}
|
package/dist/admin/runtime.js
CHANGED
|
@@ -2,15 +2,7 @@ import { expoLocalizationConfigAdminOperations } from './configOperations';
|
|
|
2
2
|
import { expoLocalizationDictionaryAdminOperations } from './dictionaryOperations';
|
|
3
3
|
import { linkExpoLocalizationTranslationKey } from './linkTranslationKey';
|
|
4
4
|
import { loadExpoLocalizationAdmin } from './load';
|
|
5
|
-
|
|
6
|
-
load: 'load',
|
|
7
|
-
addLocale: 'config.add-locale',
|
|
8
|
-
removeLocale: 'config.remove-locale',
|
|
9
|
-
setDefaultLocale: 'config.set-default-locale',
|
|
10
|
-
setTranslation: 'dictionary.set-translation',
|
|
11
|
-
deleteTranslation: 'dictionary.delete-translation',
|
|
12
|
-
linkTranslationKey: 'link-translation-key',
|
|
13
|
-
};
|
|
5
|
+
import { EXPO_LOCALIZATION_ADMIN_OPERATIONS } from './operations';
|
|
14
6
|
export const expoLocalizationAdminRuntime = {
|
|
15
7
|
kind: 'module-admin-runtime',
|
|
16
8
|
execute: executeExpoLocalizationAdminOperation,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/admin/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qCAAqC,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,yCAAyC,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,kCAAkC,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/admin/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ExpoLocalizationAdminSnapshot } from '../admin/types';
|
|
2
|
+
interface DictionaryEditorCardProps {
|
|
3
|
+
readonly snapshot: ExpoLocalizationAdminSnapshot;
|
|
4
|
+
readonly busy: boolean;
|
|
5
|
+
readonly run: (operation: string, input?: unknown) => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare function DictionaryEditorCard({ snapshot, busy, run }: DictionaryEditorCardProps): import("react").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=DictionaryEditorCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DictionaryEditorCard.d.ts","sourceRoot":"","sources":["../../src/admin-view/DictionaryEditorCard.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAEpE,UAAU,yBAAyB;IACjC,QAAQ,CAAC,QAAQ,EAAE,6BAA6B,CAAC;IACjD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AAED,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,yBAAyB,+BAgEtF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, Card, Input, Select, Stack } from '@ankhorage/zora';
|
|
3
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
4
|
+
import { EXPO_LOCALIZATION_ADMIN_OPERATIONS } from '../admin/operations';
|
|
5
|
+
export function DictionaryEditorCard({ snapshot, busy, run }) {
|
|
6
|
+
const [locale, setLocale] = useState(snapshot.config.defaultLocale);
|
|
7
|
+
const [key, setKey] = useState('');
|
|
8
|
+
const [value, setValue] = useState('');
|
|
9
|
+
const localeOptions = useMemo(() => snapshot.config.locales.map((item) => ({ value: item, label: item })), [snapshot.config.locales]);
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
if (!snapshot.config.locales.includes(locale))
|
|
12
|
+
setLocale(snapshot.config.defaultLocale);
|
|
13
|
+
}, [locale, snapshot.config.defaultLocale, snapshot.config.locales]);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
setValue(snapshot.dictionaries[locale]?.[key] ?? '');
|
|
16
|
+
}, [key, locale, snapshot.dictionaries]);
|
|
17
|
+
return (_jsx(Card, { title: "Dictionary entry", description: "Edit the canonical locale JSON resources directly.", children: _jsxs(Stack, { gap: 8, children: [_jsx(Select, { value: locale, options: localeOptions, onValueChange: setLocale, disabled: busy }), _jsx(Input, { accessibilityLabel: "Translation key", value: key, autoCapitalize: "none", onChangeText: setKey }), _jsx(Input, { accessibilityLabel: "Translation value", value: value, multiline: true, onChangeText: setValue }), _jsxs(Stack, { direction: "row", gap: 8, children: [_jsx(Button, { loading: busy, disabled: !key.trim(), onPress: () => void run(EXPO_LOCALIZATION_ADMIN_OPERATIONS.setTranslation, {
|
|
18
|
+
locale,
|
|
19
|
+
key: key.trim(),
|
|
20
|
+
value,
|
|
21
|
+
}), children: "Save translation" }), _jsx(Button, { variant: "outline", color: "danger", disabled: busy || !key.trim(), onPress: () => void run(EXPO_LOCALIZATION_ADMIN_OPERATIONS.deleteTranslation, {
|
|
22
|
+
locale,
|
|
23
|
+
key: key.trim(),
|
|
24
|
+
}), children: "Delete" })] })] }) }));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=DictionaryEditorCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DictionaryEditorCard.js","sourceRoot":"","sources":["../../src/admin-view/DictionaryEditorCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpoLocalizationAdminView.d.ts","sourceRoot":"","sources":["../../src/admin-view/ExpoLocalizationAdminView.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,SAAS,CAAC;AAG9D,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,8BAA8B,+BA2B9E"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Stack, Text } from '@ankhorage/zora';
|
|
3
|
+
import { DictionaryEditorCard } from './DictionaryEditorCard';
|
|
4
|
+
import { LocaleManagementCard } from './LocaleManagementCard';
|
|
5
|
+
import { MissingTranslationsCard } from './MissingTranslationsCard';
|
|
6
|
+
import { TranslatableFieldsCard } from './TranslatableFieldsCard';
|
|
7
|
+
import { useLocalizationAdmin } from './useLocalizationAdmin';
|
|
8
|
+
export function ExpoLocalizationAdminView(props) {
|
|
9
|
+
const admin = useLocalizationAdmin(props);
|
|
10
|
+
if (admin.loading && !admin.snapshot) {
|
|
11
|
+
return _jsx(Text, { children: "Loading localization administration\u2026" });
|
|
12
|
+
}
|
|
13
|
+
if (!admin.snapshot) {
|
|
14
|
+
return (_jsx(Text, { color: "danger", children: admin.message ?? 'Localization administration is unavailable.' }));
|
|
15
|
+
}
|
|
16
|
+
return (_jsxs(Stack, { gap: 12, children: [admin.message ? _jsx(Text, { color: "danger", children: admin.message }) : null, _jsx(LocaleManagementCard, { snapshot: admin.snapshot, busy: admin.busy, run: admin.run }), _jsx(DictionaryEditorCard, { snapshot: admin.snapshot, busy: admin.busy, run: admin.run }), _jsx(TranslatableFieldsCard, { snapshot: admin.snapshot, options: admin.options, busy: admin.busy, reload: admin.reload, run: admin.run }), _jsx(MissingTranslationsCard, { snapshot: admin.snapshot })] }));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=ExpoLocalizationAdminView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpoLocalizationAdminView.js","sourceRoot":"","sources":["../../src/admin-view/ExpoLocalizationAdminView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,UAAU,yBAAyB,CAAC,KAAqC;IAC7E,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,OAAO,KAAC,IAAI,4DAA4C,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,CACL,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,YAAE,KAAK,CAAC,OAAO,IAAI,6CAA6C,GAAQ,CAC7F,CAAC;IACJ,CAAC;IAED,OAAO,CACL,MAAC,KAAK,IAAC,GAAG,EAAE,EAAE,aACX,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,YAAE,KAAK,CAAC,OAAO,GAAQ,CAAC,CAAC,CAAC,IAAI,EACnE,KAAC,oBAAoB,IAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,GAAI,EACpF,KAAC,oBAAoB,IAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,GAAI,EACpF,KAAC,sBAAsB,IACrB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,GAAG,EAAE,KAAK,CAAC,GAAG,GACd,EACF,KAAC,uBAAuB,IAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAI,IAC/C,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ExpoLocalizationAdminSnapshot } from '../admin/types';
|
|
2
|
+
interface LocaleManagementCardProps {
|
|
3
|
+
readonly snapshot: ExpoLocalizationAdminSnapshot;
|
|
4
|
+
readonly busy: boolean;
|
|
5
|
+
readonly run: (operation: string, input?: unknown) => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare function LocaleManagementCard({ snapshot, busy, run }: LocaleManagementCardProps): import("react").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=LocaleManagementCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocaleManagementCard.d.ts","sourceRoot":"","sources":["../../src/admin-view/LocaleManagementCard.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAEpE,UAAU,yBAAyB;IACjC,QAAQ,CAAC,QAAQ,EAAE,6BAA6B,CAAC;IACjD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AAED,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,yBAAyB,+BAyDtF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, Card, Input, Stack, Text } from '@ankhorage/zora';
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { EXPO_LOCALIZATION_ADMIN_OPERATIONS } from '../admin/operations';
|
|
5
|
+
export function LocaleManagementCard({ snapshot, busy, run }) {
|
|
6
|
+
const [newLocale, setNewLocale] = useState('');
|
|
7
|
+
const { config } = snapshot;
|
|
8
|
+
return (_jsx(Card, { title: "Locales", description: "Configure supported locales and the default locale.", children: _jsxs(Stack, { gap: 8, children: [config.locales.map((locale) => (_jsxs(Stack, { direction: "row", gap: 8, align: "center", justify: "space-between", children: [_jsx(Text, { children: locale === config.defaultLocale ? `${locale} (default)` : locale }), _jsxs(Stack, { direction: "row", gap: 8, children: [locale !== config.defaultLocale ? (_jsx(Button, { variant: "outline", disabled: busy, onPress: () => void run(EXPO_LOCALIZATION_ADMIN_OPERATIONS.setDefaultLocale, { locale }), children: "Make default" })) : null, _jsx(Button, { variant: "outline", color: "danger", disabled: busy || config.locales.length === 1, onPress: () => void run(EXPO_LOCALIZATION_ADMIN_OPERATIONS.removeLocale, { locale }), children: "Remove" })] })] }, locale))), _jsxs(Stack, { direction: "row", gap: 8, align: "center", children: [_jsx(Input, { accessibilityLabel: "New locale", value: newLocale, autoCapitalize: "none", onChangeText: setNewLocale }), _jsx(Button, { loading: busy, disabled: !newLocale.trim(), onPress: () => {
|
|
9
|
+
const locale = newLocale.trim();
|
|
10
|
+
setNewLocale('');
|
|
11
|
+
void run(EXPO_LOCALIZATION_ADMIN_OPERATIONS.addLocale, { locale });
|
|
12
|
+
}, children: "Add locale" })] })] }) }));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=LocaleManagementCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocaleManagementCard.js","sourceRoot":"","sources":["../../src/admin-view/LocaleManagementCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,kCAAkC,EAAE,MAAM,qBAAqB,CAAC;AASzE,MAAM,UAAU,oBAAoB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAA6B;IACrF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAE5B,OAAO,CACL,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,WAAW,EAAC,qDAAqD,YACrF,MAAC,KAAK,IAAC,GAAG,EAAE,CAAC,aACV,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC9B,MAAC,KAAK,IAAc,SAAS,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAC,QAAQ,EAAC,OAAO,EAAC,eAAe,aAChF,KAAC,IAAI,cAAE,MAAM,KAAK,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC,CAAC,MAAM,GAAQ,EAC/E,MAAC,KAAK,IAAC,SAAS,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC,aAC1B,MAAM,KAAK,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CACjC,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,QAAQ,EAAE,IAAI,EACd,OAAO,EAAE,GAAG,EAAE,CACZ,KAAK,GAAG,CAAC,kCAAkC,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,CAAC,6BAIpE,CACV,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,KAAK,EAAC,QAAQ,EACd,QAAQ,EAAE,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAC7C,OAAO,EAAE,GAAG,EAAE,CACZ,KAAK,GAAG,CAAC,kCAAkC,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,uBAIhE,IACH,KAxBE,MAAM,CAyBV,CACT,CAAC,EACF,MAAC,KAAK,IAAC,SAAS,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAC,QAAQ,aAC3C,KAAC,KAAK,IACJ,kBAAkB,EAAC,YAAY,EAC/B,KAAK,EAAE,SAAS,EAChB,cAAc,EAAC,MAAM,EACrB,YAAY,EAAE,YAAY,GAC1B,EACF,KAAC,MAAM,IACL,OAAO,EAAE,IAAI,EACb,QAAQ,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAC3B,OAAO,EAAE,GAAG,EAAE;gCACZ,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;gCAChC,YAAY,CAAC,EAAE,CAAC,CAAC;gCACjB,KAAK,GAAG,CAAC,kCAAkC,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;4BACrE,CAAC,2BAGM,IACH,IACF,GACH,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ExpoLocalizationAdminSnapshot } from '../admin/types';
|
|
2
|
+
export declare function MissingTranslationsCard({ snapshot, }: {
|
|
3
|
+
readonly snapshot: ExpoLocalizationAdminSnapshot;
|
|
4
|
+
}): import("react").JSX.Element;
|
|
5
|
+
//# sourceMappingURL=MissingTranslationsCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MissingTranslationsCard.d.ts","sourceRoot":"","sources":["../../src/admin-view/MissingTranslationsCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAEpE,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,QAAQ,EAAE,6BAA6B,CAAC;CAClD,+BAqBA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Card, Stack, Text } from '@ankhorage/zora';
|
|
3
|
+
export function MissingTranslationsCard({ snapshot, }) {
|
|
4
|
+
return (_jsx(Card, { title: "Missing translations", description: "Keys that are incomplete across configured locales.", children: _jsx(Stack, { gap: 6, children: snapshot.missingTranslations.length === 0 ? (_jsx(Text, { color: "neutral", emphasis: "muted", children: "No missing translations." })) : (snapshot.missingTranslations.map((item) => (_jsxs(Text, { children: [item.key, ": ", item.missingLocales.join(', ')] }, item.key)))) }) }));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=MissingTranslationsCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MissingTranslationsCard.js","sourceRoot":"","sources":["../../src/admin-view/MissingTranslationsCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAIpD,MAAM,UAAU,uBAAuB,CAAC,EACtC,QAAQ,GAGT;IACC,OAAO,CACL,KAAC,IAAI,IACH,KAAK,EAAC,sBAAsB,EAC5B,WAAW,EAAC,qDAAqD,YAEjE,KAAC,KAAK,IAAC,GAAG,EAAE,CAAC,YACV,QAAQ,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC3C,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,yCAE/B,CACR,CAAC,CAAC,CAAC,CACF,QAAQ,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACzC,MAAC,IAAI,eACF,IAAI,CAAC,GAAG,QAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KADlC,IAAI,CAAC,GAAG,CAEZ,CACR,CAAC,CACH,GACK,GACH,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ExpoLocalizationTranslatableField } from '../authoring';
|
|
2
|
+
interface TranslatableFieldRowProps {
|
|
3
|
+
readonly field: ExpoLocalizationTranslatableField;
|
|
4
|
+
readonly missingLocales: readonly string[];
|
|
5
|
+
readonly busy: boolean;
|
|
6
|
+
readonly run: (operation: string, input?: unknown) => Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare function TranslatableFieldRow({ field, missingLocales, busy, run, }: TranslatableFieldRowProps): import("react").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=TranslatableFieldRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TranslatableFieldRow.d.ts","sourceRoot":"","sources":["../../src/admin-view/TranslatableFieldRow.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,cAAc,CAAC;AAGtE,UAAU,yBAAyB;IACjC,QAAQ,CAAC,KAAK,EAAE,iCAAiC,CAAC;IAClD,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AAED,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,cAAc,EACd,IAAI,EACJ,GAAG,GACJ,EAAE,yBAAyB,+BA4C3B"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, Input, Stack, Text } from '@ankhorage/zora';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { EXPO_LOCALIZATION_ADMIN_OPERATIONS } from '../admin/operations';
|
|
5
|
+
import { createExpoLocalizationKeyFromText } from '../authoring';
|
|
6
|
+
export function TranslatableFieldRow({ field, missingLocales, busy, run, }) {
|
|
7
|
+
const [key, setKey] = useState(field.currentKey || createExpoLocalizationKeyFromText(field.defaultText));
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
setKey(field.currentKey || createExpoLocalizationKeyFromText(field.defaultText));
|
|
10
|
+
}, [field.currentKey, field.defaultText]);
|
|
11
|
+
return (_jsxs(Stack, { gap: 6, children: [_jsx(Text, { weight: "semiBold", children: field.path }), _jsx(Text, { color: "neutral", emphasis: "muted", variant: "caption", children: field.defaultText || 'No default text' }), missingLocales.length > 0 ? (_jsxs(Text, { color: "danger", variant: "caption", children: ["Missing: ", missingLocales.join(', ')] })) : null, _jsxs(Stack, { direction: "row", gap: 8, align: "center", children: [_jsx(Input, { accessibilityLabel: `Translation key for ${field.path}`, value: key, autoCapitalize: "none", onChangeText: setKey }), _jsx(Button, { variant: field.currentKey ? 'outline' : 'solid', disabled: busy || !key.trim(), onPress: () => void run(EXPO_LOCALIZATION_ADMIN_OPERATIONS.linkTranslationKey, {
|
|
12
|
+
screenId: field.screenId,
|
|
13
|
+
nodeId: field.nodeId,
|
|
14
|
+
keyProp: field.keyProp,
|
|
15
|
+
key: key.trim(),
|
|
16
|
+
}), children: field.currentKey ? 'Relink' : 'Link' })] })] }));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=TranslatableFieldRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TranslatableFieldRow.js","sourceRoot":"","sources":["../../src/admin-view/TranslatableFieldRow.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,kCAAkC,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,iCAAiC,EAAE,MAAM,cAAc,CAAC;AASjE,MAAM,UAAU,oBAAoB,CAAC,EACnC,KAAK,EACL,cAAc,EACd,IAAI,EACJ,GAAG,GACuB;IAC1B,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAC5B,KAAK,CAAC,UAAU,IAAI,iCAAiC,CAAC,KAAK,CAAC,WAAW,CAAC,CACzE,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,iCAAiC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IACnF,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAE1C,OAAO,CACL,MAAC,KAAK,IAAC,GAAG,EAAE,CAAC,aACX,KAAC,IAAI,IAAC,MAAM,EAAC,UAAU,YAAE,KAAK,CAAC,IAAI,GAAQ,EAC3C,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,YACrD,KAAK,CAAC,WAAW,IAAI,iBAAiB,GAClC,EACN,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC3B,MAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,OAAO,EAAC,SAAS,0BAC1B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAC9B,CACR,CAAC,CAAC,CAAC,IAAI,EACR,MAAC,KAAK,IAAC,SAAS,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAC,QAAQ,aAC3C,KAAC,KAAK,IACJ,kBAAkB,EAAE,uBAAuB,KAAK,CAAC,IAAI,EAAE,EACvD,KAAK,EAAE,GAAG,EACV,cAAc,EAAC,MAAM,EACrB,YAAY,EAAE,MAAM,GACpB,EACF,KAAC,MAAM,IACL,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAC/C,QAAQ,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAC7B,OAAO,EAAE,GAAG,EAAE,CACZ,KAAK,GAAG,CAAC,kCAAkC,CAAC,kBAAkB,EAAE;4BAC9D,QAAQ,EAAE,KAAK,CAAC,QAAQ;4BACxB,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;yBAChB,CAAC,YAGH,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,GAC9B,IACH,IACF,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ExpoLocalizationAdminLoadOptions, ExpoLocalizationAdminSnapshot } from '../admin/types';
|
|
2
|
+
interface TranslatableFieldsCardProps {
|
|
3
|
+
readonly snapshot: ExpoLocalizationAdminSnapshot;
|
|
4
|
+
readonly options: ExpoLocalizationAdminLoadOptions;
|
|
5
|
+
readonly busy: boolean;
|
|
6
|
+
readonly reload: (options: ExpoLocalizationAdminLoadOptions) => Promise<void>;
|
|
7
|
+
readonly run: (operation: string, input?: unknown) => Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export declare function TranslatableFieldsCard(props: TranslatableFieldsCardProps): import("react").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=TranslatableFieldsCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TranslatableFieldsCard.d.ts","sourceRoot":"","sources":["../../src/admin-view/TranslatableFieldsCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,gCAAgC,EAChC,6BAA6B,EAC9B,MAAM,gBAAgB,CAAC;AAYxB,UAAU,2BAA2B;IACnC,QAAQ,CAAC,QAAQ,EAAE,6BAA6B,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,gCAAgC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,gCAAgC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,+BAiDxE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, Card, Input, Select, Stack, Text } from '@ankhorage/zora';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { TranslatableFieldRow } from './TranslatableFieldRow';
|
|
5
|
+
const FILTER_OPTIONS = [
|
|
6
|
+
{ value: 'all', label: 'All fields' },
|
|
7
|
+
{ value: 'unlinked', label: 'Unlinked' },
|
|
8
|
+
{ value: 'missing-translations', label: 'Missing translations' },
|
|
9
|
+
{ value: 'incomplete', label: 'Incomplete' },
|
|
10
|
+
];
|
|
11
|
+
export function TranslatableFieldsCard(props) {
|
|
12
|
+
const [searchQuery, setSearchQuery] = useState(props.options.searchQuery ?? '');
|
|
13
|
+
const [filter, setFilter] = useState(props.options.filter ?? 'all');
|
|
14
|
+
useEffect(() => setSearchQuery(props.options.searchQuery ?? ''), [props.options.searchQuery]);
|
|
15
|
+
useEffect(() => setFilter(props.options.filter ?? 'all'), [props.options.filter]);
|
|
16
|
+
return (_jsx(Card, { title: "Translatable fields", description: "Discover and link fields from component metadata.", children: _jsxs(Stack, { gap: 10, children: [_jsxs(Stack, { direction: "row", gap: 8, align: "center", children: [_jsx(Input, { accessibilityLabel: "Search translatable fields", value: searchQuery, onChangeText: setSearchQuery }), _jsx(Select, { value: filter, options: FILTER_OPTIONS, onValueChange: setFilter }), _jsx(Button, { variant: "outline", disabled: props.busy, onPress: () => void props.reload({ searchQuery, filter }), children: "Apply" })] }), props.snapshot.visibleFields.length === 0 ? (_jsx(Text, { color: "neutral", emphasis: "muted", children: "No matching translatable fields." })) : (props.snapshot.visibleFields.map((field) => (_jsx(TranslatableFieldRow, { field: field, missingLocales: props.snapshot.missingTranslations.find((item) => item.key === field.currentKey)
|
|
17
|
+
?.missingLocales ?? [], busy: props.busy, run: props.run }, `${field.screenId}:${field.nodeId}:${field.keyProp}`))))] }) }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=TranslatableFieldsCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TranslatableFieldsCard.js","sourceRoot":"","sources":["../../src/admin-view/TranslatableFieldsCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ExpoLocalizationAdminView } from './ExpoLocalizationAdminView';
|
|
2
|
+
export { ExpoLocalizationAdminView } from './ExpoLocalizationAdminView';
|
|
3
|
+
export type { ExpoLocalizationAdminExecutor, ExpoLocalizationAdminViewProps } from './types';
|
|
4
|
+
export declare const expoLocalizationAdminViewContribution: {
|
|
5
|
+
readonly id: "expo-localization";
|
|
6
|
+
readonly View: typeof ExpoLocalizationAdminView;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin-view/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,YAAY,EAAE,6BAA6B,EAAE,8BAA8B,EAAE,MAAM,SAAS,CAAC;AAE7F,eAAO,MAAM,qCAAqC;;;CAGxC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { EXPO_LOCALIZATION_MODULE_ID } from '../module';
|
|
2
|
+
import { ExpoLocalizationAdminView } from './ExpoLocalizationAdminView';
|
|
3
|
+
export { ExpoLocalizationAdminView } from './ExpoLocalizationAdminView';
|
|
4
|
+
export const expoLocalizationAdminViewContribution = {
|
|
5
|
+
id: EXPO_LOCALIZATION_MODULE_ID,
|
|
6
|
+
View: ExpoLocalizationAdminView,
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin-view/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAGxE,MAAM,CAAC,MAAM,qCAAqC,GAAG;IACnD,EAAE,EAAE,2BAA2B;IAC/B,IAAI,EAAE,yBAAyB;CACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readSnapshot.d.ts","sourceRoot":"","sources":["../../src/admin-view/readSnapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAQpE,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,6BAA6B,CAS/F"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { parseExpoLocalizationModuleConfig } from '../config';
|
|
2
|
+
export function readExpoLocalizationAdminSnapshot(value) {
|
|
3
|
+
const record = requireRecord(value, 'Localization admin snapshot');
|
|
4
|
+
return {
|
|
5
|
+
config: parseExpoLocalizationModuleConfig(record.config),
|
|
6
|
+
dictionaries: readDictionaries(record.dictionaries),
|
|
7
|
+
fields: readFields(record.fields),
|
|
8
|
+
visibleFields: readFields(record.visibleFields),
|
|
9
|
+
missingTranslations: readMissingTranslations(record.missingTranslations),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function readDictionaries(value) {
|
|
13
|
+
const record = requireRecord(value, 'Localization dictionaries');
|
|
14
|
+
const result = {};
|
|
15
|
+
for (const [locale, dictionary] of Object.entries(record)) {
|
|
16
|
+
result[locale] = readDictionary(dictionary, locale);
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
function readDictionary(value, locale) {
|
|
21
|
+
const record = requireRecord(value, `Dictionary '${locale}'`);
|
|
22
|
+
const result = {};
|
|
23
|
+
for (const [key, translation] of Object.entries(record)) {
|
|
24
|
+
if (typeof translation !== 'string')
|
|
25
|
+
throw new Error(`Dictionary '${locale}' is invalid.`);
|
|
26
|
+
result[key] = translation;
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
function readFields(value) {
|
|
31
|
+
if (!Array.isArray(value) || !value.every(isTranslatableField)) {
|
|
32
|
+
throw new Error('Localization translatable fields are invalid.');
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
function isTranslatableField(value) {
|
|
37
|
+
if (!isRecord(value))
|
|
38
|
+
return false;
|
|
39
|
+
return [
|
|
40
|
+
'screenId',
|
|
41
|
+
'nodeId',
|
|
42
|
+
'componentName',
|
|
43
|
+
'keyProp',
|
|
44
|
+
'defaultTextProp',
|
|
45
|
+
'currentKey',
|
|
46
|
+
'defaultText',
|
|
47
|
+
'path',
|
|
48
|
+
].every((key) => typeof value[key] === 'string');
|
|
49
|
+
}
|
|
50
|
+
function readMissingTranslations(value) {
|
|
51
|
+
if (!Array.isArray(value) || !value.every(isMissingTranslation)) {
|
|
52
|
+
throw new Error('Localization missing-translation state is invalid.');
|
|
53
|
+
}
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
function isMissingTranslation(value) {
|
|
57
|
+
return (isRecord(value) &&
|
|
58
|
+
typeof value.key === 'string' &&
|
|
59
|
+
typeof value.fieldCount === 'number' &&
|
|
60
|
+
Array.isArray(value.missingLocales) &&
|
|
61
|
+
value.missingLocales.every((locale) => typeof locale === 'string'));
|
|
62
|
+
}
|
|
63
|
+
function requireRecord(value, label) {
|
|
64
|
+
if (!isRecord(value))
|
|
65
|
+
throw new Error(`${label} is invalid.`);
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
function isRecord(value) {
|
|
69
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=readSnapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readSnapshot.js","sourceRoot":"","sources":["../../src/admin-view/readSnapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type ExpoLocalizationAdminExecutor = (operation: string, input?: unknown) => Promise<unknown>;
|
|
2
|
+
export interface ExpoLocalizationAdminViewProps {
|
|
3
|
+
readonly execute: ExpoLocalizationAdminExecutor;
|
|
4
|
+
readonly onProjectChange?: () => Promise<void> | void;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/admin-view/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,6BAA6B,GAAG,CAC1C,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,OAAO,KACZ,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,OAAO,EAAE,6BAA6B,CAAC;IAChD,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACvD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/admin-view/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ExpoLocalizationAdminLoadOptions, ExpoLocalizationAdminSnapshot } from '../admin/types';
|
|
2
|
+
import type { ExpoLocalizationAdminViewProps } from './types';
|
|
3
|
+
export declare function useLocalizationAdmin({ execute, onProjectChange }: ExpoLocalizationAdminViewProps): {
|
|
4
|
+
snapshot: ExpoLocalizationAdminSnapshot | null;
|
|
5
|
+
options: ExpoLocalizationAdminLoadOptions;
|
|
6
|
+
loading: boolean;
|
|
7
|
+
busy: boolean;
|
|
8
|
+
message: string | null;
|
|
9
|
+
reload: (nextOptions?: ExpoLocalizationAdminLoadOptions) => Promise<void>;
|
|
10
|
+
run: (operation: string, input?: unknown) => Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=useLocalizationAdmin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLocalizationAdmin.d.ts","sourceRoot":"","sources":["../../src/admin-view/useLocalizationAdmin.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,gCAAgC,EAChC,6BAA6B,EAC9B,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,SAAS,CAAC;AAE9D,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,8BAA8B;;;;;;2BAQzE,gCAAgC;qBAiBlC,MAAM,UAAU,OAAO;EAqB5C"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import { EXPO_LOCALIZATION_ADMIN_OPERATIONS } from '../admin/operations';
|
|
3
|
+
import { readExpoLocalizationAdminSnapshot } from './readSnapshot';
|
|
4
|
+
export function useLocalizationAdmin({ execute, onProjectChange }) {
|
|
5
|
+
const [snapshot, setSnapshot] = useState(null);
|
|
6
|
+
const [options, setOptions] = useState({});
|
|
7
|
+
const [loading, setLoading] = useState(true);
|
|
8
|
+
const [busy, setBusy] = useState(false);
|
|
9
|
+
const [message, setMessage] = useState(null);
|
|
10
|
+
const reload = useCallback(async (nextOptions = options) => {
|
|
11
|
+
setLoading(true);
|
|
12
|
+
try {
|
|
13
|
+
const result = await execute(EXPO_LOCALIZATION_ADMIN_OPERATIONS.load, nextOptions);
|
|
14
|
+
setSnapshot(readExpoLocalizationAdminSnapshot(result));
|
|
15
|
+
setOptions(nextOptions);
|
|
16
|
+
setMessage(null);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
setMessage(toMessage(error));
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
setLoading(false);
|
|
23
|
+
}
|
|
24
|
+
}, [execute, options]);
|
|
25
|
+
const run = useCallback(async (operation, input) => {
|
|
26
|
+
setBusy(true);
|
|
27
|
+
setMessage(null);
|
|
28
|
+
try {
|
|
29
|
+
await execute(operation, input);
|
|
30
|
+
await onProjectChange?.();
|
|
31
|
+
await reload();
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
setMessage(toMessage(error));
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
setBusy(false);
|
|
38
|
+
}
|
|
39
|
+
}, [execute, onProjectChange, reload]);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
void reload({});
|
|
42
|
+
}, [execute]);
|
|
43
|
+
return { snapshot, options, loading, busy, message, reload, run };
|
|
44
|
+
}
|
|
45
|
+
function toMessage(error) {
|
|
46
|
+
return error instanceof Error ? error.message : String(error);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=useLocalizationAdmin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLocalizationAdmin.js","sourceRoot":"","sources":["../../src/admin-view/useLocalizationAdmin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,kCAAkC,EAAE,MAAM,qBAAqB,CAAC;AAKzE,OAAO,EAAE,iCAAiC,EAAE,MAAM,gBAAgB,CAAC;AAGnE,MAAM,UAAU,oBAAoB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAkC;IAC/F,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAuC,IAAI,CAAC,CAAC;IACrF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAmC,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAG,WAAW,CACxB,KAAK,EAAE,cAAgD,OAAO,EAAE,EAAE;QAChE,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,kCAAkC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACnF,WAAW,CAAC,iCAAiC,CAAC,MAAM,CAAC,CAAC,CAAC;YACvD,UAAU,CAAC,WAAW,CAAC,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/B,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EACD,CAAC,OAAO,EAAE,OAAO,CAAC,CACnB,CAAC;IAEF,MAAM,GAAG,GAAG,WAAW,CACrB,KAAK,EAAE,SAAiB,EAAE,KAAe,EAAE,EAAE;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAChC,MAAM,eAAe,EAAE,EAAE,CAAC;YAC1B,MAAM,MAAM,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/B,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,EACD,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,CAAC,CACnC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
|
package/dist/host.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { parseExpoLocalizationModuleConfig } from './config';
|
|
2
|
-
export { EXPO_LOCALIZATION_ADMIN_OPERATIONS
|
|
2
|
+
export { EXPO_LOCALIZATION_ADMIN_OPERATIONS } from './admin/operations';
|
|
3
|
+
export { type ExpoLocalizationAdminAuthoringContext, type ExpoLocalizationAdminHostContext, type ExpoLocalizationAdminInvocation, type ExpoLocalizationAdminLoadOptions, expoLocalizationAdminRuntime, type ExpoLocalizationAdminSnapshot, type ExpoLocalizationLinkTranslationInput, type ExpoLocalizationManifestFieldMutation, } from './admin/runtime';
|
|
3
4
|
/** Optional package-owned data consumed by generic authoring hosts. */
|
|
4
5
|
export declare const expoLocalizationHostContribution: {
|
|
5
6
|
readonly id: "expo-localization";
|
package/dist/host.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iCAAiC,EAAE,MAAM,UAAU,CAAC;AAG7D,OAAO,
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iCAAiC,EAAE,MAAM,UAAU,CAAC;AAG7D,OAAO,EAAE,kCAAkC,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EACL,KAAK,qCAAqC,EAC1C,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,KAAK,gCAAgC,EACrC,4BAA4B,EAC5B,KAAK,6BAA6B,EAClC,KAAK,oCAAoC,EACzC,KAAK,qCAAqC,GAC3C,MAAM,iBAAiB,CAAC;AAEzB,uEAAuE;AACvE,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsBnC,CAAC"}
|
package/dist/host.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { expoLocalizationAdminRuntime } from './admin/runtime';
|
|
2
2
|
import { parseExpoLocalizationModuleConfig } from './config';
|
|
3
3
|
import { EXPO_LOCALIZATION_MODULE_ID, expoLocalizationModule } from './module';
|
|
4
|
-
export { EXPO_LOCALIZATION_ADMIN_OPERATIONS
|
|
4
|
+
export { EXPO_LOCALIZATION_ADMIN_OPERATIONS } from './admin/operations';
|
|
5
|
+
export { expoLocalizationAdminRuntime, } from './admin/runtime';
|
|
5
6
|
/** Optional package-owned data consumed by generic authoring hosts. */
|
|
6
7
|
export const expoLocalizationHostContribution = {
|
|
7
8
|
id: EXPO_LOCALIZATION_MODULE_ID,
|
package/dist/host.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,iCAAiC,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAE/E,OAAO,
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,iCAAiC,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAE/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAKL,4BAA4B,GAI7B,MAAM,iBAAiB,CAAC;AAEzB,uEAAuE;AACvE,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,EAAE,EAAE,2BAA2B;IAC/B,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,kEAAkE;IAC/E,UAAU,EAAE,sBAAsB;IAClC,eAAe,EAAE,iCAAiC;IAClD,MAAM,EAAE;QACN,OAAO,EAAE,CAAC,sEAAsE,CAAC;QACjF,KAAK,EAAE,EAAE;QACT,aAAa,EAAE,CAAC,8BAA8B,CAAC;QAC/C,WAAW,EAAE,CAAC,+BAA+B,CAAC;KAC/C;IACD,KAAK,EAAE;QACL,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,qDAAqD;QAClE,MAAM,EAAE;YACN,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;YAClF,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC7E;KACF;IACD,YAAY,EAAE,4BAA4B;CAClC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"license": "MIT",
|
|
3
3
|
"name": "@ankhorage/orchestrator-module-expo-localization",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.5.1",
|
|
5
5
|
"description": "Expo localization module for @ankhorage/orchestrator.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.js",
|
|
@@ -38,6 +38,10 @@
|
|
|
38
38
|
"./host": {
|
|
39
39
|
"types": "./dist/host.d.ts",
|
|
40
40
|
"default": "./dist/host.js"
|
|
41
|
+
},
|
|
42
|
+
"./admin-view": {
|
|
43
|
+
"types": "./dist/admin-view/index.d.ts",
|
|
44
|
+
"default": "./dist/admin-view/index.js"
|
|
41
45
|
}
|
|
42
46
|
},
|
|
43
47
|
"scripts": {
|
|
@@ -54,11 +58,27 @@
|
|
|
54
58
|
"dependencies": {
|
|
55
59
|
"@ankhorage/orchestrator": "^0.3.1"
|
|
56
60
|
},
|
|
61
|
+
"peerDependencies": {
|
|
62
|
+
"@ankhorage/zora": "^2.9.3",
|
|
63
|
+
"react": ">=18.2.0"
|
|
64
|
+
},
|
|
65
|
+
"peerDependenciesMeta": {
|
|
66
|
+
"@ankhorage/zora": {
|
|
67
|
+
"optional": true
|
|
68
|
+
},
|
|
69
|
+
"react": {
|
|
70
|
+
"optional": true
|
|
71
|
+
}
|
|
72
|
+
},
|
|
57
73
|
"devDependencies": {
|
|
58
74
|
"@ankhorage/devtools": "^1.0.6",
|
|
75
|
+
"@ankhorage/zora": "^2.9.3",
|
|
59
76
|
"@changesets/cli": "^2.31.0",
|
|
60
77
|
"@types/bun": "^1.3.13",
|
|
61
78
|
"@types/node": "^25.6.0",
|
|
79
|
+
"@types/react": "^19.2.14",
|
|
80
|
+
"react": "19.1.0",
|
|
81
|
+
"react-native": "0.81.5",
|
|
62
82
|
"typescript": "^5.9.3"
|
|
63
83
|
},
|
|
64
84
|
"packageManager": "bun@1.3.13",
|