@ops-ai/astro-feature-flags-toggly 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.
Files changed (48) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +462 -0
  3. package/dist/chunk-354E3C57.js +173 -0
  4. package/dist/chunk-354E3C57.js.map +1 -0
  5. package/dist/chunk-4UKIT2NP.js +44 -0
  6. package/dist/chunk-4UKIT2NP.js.map +1 -0
  7. package/dist/chunk-FK633ULF.js +200 -0
  8. package/dist/chunk-FK633ULF.js.map +1 -0
  9. package/dist/chunk-XCJSQJHR.js +74 -0
  10. package/dist/chunk-XCJSQJHR.js.map +1 -0
  11. package/dist/chunk-XQGKGTBK.js +161 -0
  12. package/dist/chunk-XQGKGTBK.js.map +1 -0
  13. package/dist/client/setup.d.ts +3 -0
  14. package/dist/client/setup.js +21 -0
  15. package/dist/client/setup.js.map +1 -0
  16. package/dist/client/store.d.ts +59 -0
  17. package/dist/client/store.js +25 -0
  18. package/dist/client/store.js.map +1 -0
  19. package/dist/components/Feature.astro +79 -0
  20. package/dist/components/FeatureClient.astro +144 -0
  21. package/dist/frameworks/react/Feature.d.ts +86 -0
  22. package/dist/frameworks/react/Feature.js +14 -0
  23. package/dist/frameworks/react/Feature.js.map +1 -0
  24. package/dist/frameworks/react/index.d.ts +3 -0
  25. package/dist/frameworks/react/index.js +12 -0
  26. package/dist/frameworks/react/index.js.map +1 -0
  27. package/dist/frameworks/svelte/Feature.svelte +75 -0
  28. package/dist/frameworks/svelte/stores.d.ts +54 -0
  29. package/dist/frameworks/svelte/stores.js +34 -0
  30. package/dist/frameworks/svelte/stores.js.map +1 -0
  31. package/dist/frameworks/vue/Feature.vue +93 -0
  32. package/dist/frameworks/vue/composables.d.ts +56 -0
  33. package/dist/frameworks/vue/composables.js +39 -0
  34. package/dist/frameworks/vue/composables.js.map +1 -0
  35. package/dist/index-S3g0i0FH.d.ts +102 -0
  36. package/dist/index.d.ts +7 -0
  37. package/dist/index.js +47 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/integration/index.d.ts +24 -0
  40. package/dist/integration/index.js +10 -0
  41. package/dist/integration/index.js.map +1 -0
  42. package/dist/server/toggly-server.d.ts +53 -0
  43. package/dist/server/toggly-server.js +9 -0
  44. package/dist/server/toggly-server.js.map +1 -0
  45. package/dist/server/utils.d.ts +43 -0
  46. package/dist/server/utils.js +13 -0
  47. package/dist/server/utils.js.map +1 -0
  48. package/package.json +105 -0
@@ -0,0 +1,39 @@
1
+ import {
2
+ $flags,
3
+ $isReady
4
+ } from "../../chunk-FK633ULF.js";
5
+
6
+ // src/frameworks/vue/composables.ts
7
+ import { computed } from "vue";
8
+ import { useStore } from "@nanostores/vue";
9
+ function useFeatureFlag(flagKey, defaultValue = false) {
10
+ const flags = useStore($flags);
11
+ const isReady = useStore($isReady);
12
+ const enabled = computed(() => flags.value[flagKey] ?? defaultValue);
13
+ return { enabled, isReady };
14
+ }
15
+ function useFeatureGate(flagKeys, requirement = "all", negate = false) {
16
+ const flags = useStore($flags);
17
+ const isReady = useStore($isReady);
18
+ const enabled = computed(() => {
19
+ if (flagKeys.length === 0) {
20
+ return !negate;
21
+ }
22
+ let isEnabled;
23
+ if (requirement === "any") {
24
+ isEnabled = flagKeys.some((key) => flags.value[key] === true);
25
+ } else {
26
+ isEnabled = flagKeys.every((key) => flags.value[key] === true);
27
+ }
28
+ if (negate) {
29
+ isEnabled = !isEnabled;
30
+ }
31
+ return isEnabled;
32
+ });
33
+ return { enabled, isReady };
34
+ }
35
+ export {
36
+ useFeatureFlag,
37
+ useFeatureGate
38
+ };
39
+ //# sourceMappingURL=composables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/frameworks/vue/composables.ts"],"sourcesContent":["/**\n * Vue Composables for Toggly\n */\n\nimport { computed, type Ref } from 'vue';\nimport { useStore } from '@nanostores/vue';\nimport { $flags, $isReady } from '../../client/store.js';\n\n/**\n * Hook to check if a feature flag is enabled\n * \n * @param flagKey - Feature flag key to check\n * @param defaultValue - Default value if flag not found (default: false)\n * @returns Object with enabled state and ready state\n * \n * @example\n * ```vue\n * <script setup>\n * const { enabled, isReady } = useFeatureFlag('new-dashboard');\n * </script>\n * \n * <template>\n * <Loading v-if=\"!isReady\" />\n * <NewDashboard v-else-if=\"enabled\" />\n * <OldDashboard v-else />\n * </template>\n * ```\n */\nexport function useFeatureFlag(\n flagKey: string,\n defaultValue: boolean = false\n): {\n enabled: Readonly<Ref<boolean>>;\n isReady: Readonly<Ref<boolean>>;\n} {\n const flags = useStore($flags);\n const isReady = useStore($isReady);\n\n const enabled = computed(() => flags.value[flagKey] ?? defaultValue);\n\n return { enabled, isReady };\n}\n\n/**\n * Hook to check if multiple feature flags are enabled\n * \n * @param flagKeys - Array of feature flag keys to check\n * @param requirement - 'all' or 'any' (default: 'all')\n * @param negate - If true, negates the result (default: false)\n * @returns Object with enabled state and ready state\n * \n * @example\n * ```vue\n * <script setup>\n * const { enabled } = useFeatureGate(['feature1', 'feature2'], 'any');\n * </script>\n * \n * <template>\n * <NewFeatures v-if=\"enabled\" />\n * <OldFeatures v-else />\n * </template>\n * ```\n */\nexport function useFeatureGate(\n flagKeys: string[],\n requirement: 'all' | 'any' = 'all',\n negate: boolean = false\n): {\n enabled: Readonly<Ref<boolean>>;\n isReady: Readonly<Ref<boolean>>;\n} {\n const flags = useStore($flags);\n const isReady = useStore($isReady);\n\n const enabled = computed(() => {\n if (flagKeys.length === 0) {\n return !negate;\n }\n\n let isEnabled: boolean;\n\n if (requirement === 'any') {\n isEnabled = flagKeys.some((key) => flags.value[key] === true);\n } else {\n isEnabled = flagKeys.every((key) => flags.value[key] === true);\n }\n\n if (negate) {\n isEnabled = !isEnabled;\n }\n\n return isEnabled;\n });\n\n return { enabled, isReady };\n}\n\n\n"],"mappings":";;;;;;AAIA,SAAS,gBAA0B;AACnC,SAAS,gBAAgB;AAuBlB,SAAS,eACd,SACA,eAAwB,OAIxB;AACA,QAAM,QAAQ,SAAS,MAAM;AAC7B,QAAM,UAAU,SAAS,QAAQ;AAEjC,QAAM,UAAU,SAAS,MAAM,MAAM,MAAM,OAAO,KAAK,YAAY;AAEnE,SAAO,EAAE,SAAS,QAAQ;AAC5B;AAsBO,SAAS,eACd,UACA,cAA6B,OAC7B,SAAkB,OAIlB;AACA,QAAM,QAAQ,SAAS,MAAM;AAC7B,QAAM,UAAU,SAAS,QAAQ;AAEjC,QAAM,UAAU,SAAS,MAAM;AAC7B,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,CAAC;AAAA,IACV;AAEA,QAAI;AAEJ,QAAI,gBAAgB,OAAO;AACzB,kBAAY,SAAS,KAAK,CAAC,QAAQ,MAAM,MAAM,GAAG,MAAM,IAAI;AAAA,IAC9D,OAAO;AACL,kBAAY,SAAS,MAAM,CAAC,QAAQ,MAAM,MAAM,GAAG,MAAM,IAAI;AAAA,IAC/D;AAEA,QAAI,QAAQ;AACV,kBAAY,CAAC;AAAA,IACf;AAEA,WAAO;AAAA,EACT,CAAC;AAED,SAAO,EAAE,SAAS,QAAQ;AAC5B;","names":[]}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Toggly Astro SDK - Type Definitions
3
+ */
4
+ /**
5
+ * Configuration options for Toggly integration
6
+ */
7
+ interface TogglyConfig {
8
+ /** Base URI for the Toggly API (default: 'https://client.toggly.io') */
9
+ baseURI?: string;
10
+ /** Application key from Toggly */
11
+ appKey?: string;
12
+ /** Environment name (e.g., 'Production', 'Staging') (default: 'Production') */
13
+ environment?: string;
14
+ /** Default flag values to use when API is unavailable */
15
+ flagDefaults?: Record<string, boolean>;
16
+ /** Feature flags refresh interval in milliseconds (default: 180000 = 3 minutes) */
17
+ featureFlagsRefreshInterval?: number;
18
+ /** Enable debug logging (default: false) */
19
+ isDebug?: boolean;
20
+ /** Connection timeout in milliseconds (default: 5000) */
21
+ connectTimeout?: number;
22
+ /** User identity for targeting (optional) */
23
+ identity?: string;
24
+ }
25
+ /**
26
+ * Map of feature flag keys to their boolean values
27
+ */
28
+ type Flags = Record<string, boolean>;
29
+ /**
30
+ * Toggly client instance interface
31
+ */
32
+ interface TogglyClient {
33
+ /**
34
+ * Get all feature flags as a map of key-value pairs
35
+ * @returns Promise resolving to a map of flag keys to boolean values
36
+ */
37
+ getFlags(): Promise<Flags>;
38
+ /**
39
+ * Get a single feature flag value
40
+ * @param key - The feature flag key
41
+ * @param defaultValue - Optional default value if flag is not found (default: false)
42
+ * @returns Promise resolving to the flag's boolean value
43
+ */
44
+ getFlag(key: string, defaultValue?: boolean): Promise<boolean>;
45
+ /**
46
+ * Evaluate a feature gate with multiple flags
47
+ * @param keys - Array of feature flag keys to evaluate
48
+ * @param requirement - 'all' requires all flags to be true, 'any' requires at least one
49
+ * @param negate - If true, negates the result
50
+ * @returns Promise resolving to boolean evaluation result
51
+ */
52
+ evaluateGate(keys: string[], requirement?: 'all' | 'any', negate?: boolean): Promise<boolean>;
53
+ /**
54
+ * Manually refresh the feature flags cache by fetching from the API
55
+ * @returns Promise that resolves when flags have been refreshed
56
+ */
57
+ refreshFlags(): Promise<void>;
58
+ }
59
+ /**
60
+ * Page feature mapping for frontmatter extraction
61
+ */
62
+ interface PageFeatureMapping {
63
+ [routePath: string]: string;
64
+ }
65
+ /**
66
+ * Props for Feature component
67
+ */
68
+ interface FeatureProps {
69
+ /** Single feature flag key to check */
70
+ flag?: string;
71
+ /** Multiple feature flag keys to check */
72
+ flags?: string[];
73
+ /** Requirement for multiple flags: 'all' or 'any' (default: 'all') */
74
+ requirement?: 'all' | 'any';
75
+ /** If true, negates the result (default: false) */
76
+ negate?: boolean;
77
+ }
78
+ /**
79
+ * Props for FeatureClient component
80
+ */
81
+ interface FeatureClientProps {
82
+ /** Feature flag key to check */
83
+ flag: string;
84
+ /** Hydration strategy: 'load', 'idle', or 'visible' */
85
+ client?: 'load' | 'idle' | 'visible';
86
+ }
87
+ /**
88
+ * Augment Astro global types
89
+ */
90
+ declare global {
91
+ namespace App {
92
+ interface Locals {
93
+ toggly: TogglyClient;
94
+ }
95
+ }
96
+ interface Window {
97
+ __TOGGLY_CONFIG__?: TogglyConfig;
98
+ __TOGGLY_PAGE_FEATURES__?: PageFeatureMapping;
99
+ }
100
+ }
101
+
102
+ export type { Flags as F, PageFeatureMapping as P, TogglyConfig as T, TogglyClient as a, FeatureProps as b, FeatureClientProps as c };
@@ -0,0 +1,7 @@
1
+ export { TogglyIntegrationOptions, createTogglyMiddleware, default as togglyIntegration } from './integration/index.js';
2
+ export { TogglyServer, createTogglyServerClient } from './server/toggly-server.js';
3
+ export { allFeaturesEnabled, anyFeatureEnabled, getTogglyFromAstroGlobal, withFeatureFlag } from './server/utils.js';
4
+ export { $error, $flag, $flags, $gate, $isReady, clearIdentity, initTogglyClient, refreshFlags, setIdentity, stopRefreshInterval } from './client/store.js';
5
+ export { c as FeatureClientProps, b as FeatureProps, F as Flags, P as PageFeatureMapping, a as TogglyClient, T as TogglyConfig } from './index-S3g0i0FH.js';
6
+ import 'astro';
7
+ import 'nanostores';
package/dist/index.js ADDED
@@ -0,0 +1,47 @@
1
+ import {
2
+ createTogglyMiddleware,
3
+ togglyIntegration
4
+ } from "./chunk-354E3C57.js";
5
+ import {
6
+ TogglyServer,
7
+ createTogglyServerClient
8
+ } from "./chunk-XQGKGTBK.js";
9
+ import {
10
+ allFeaturesEnabled,
11
+ anyFeatureEnabled,
12
+ getTogglyFromAstroGlobal,
13
+ withFeatureFlag
14
+ } from "./chunk-4UKIT2NP.js";
15
+ import {
16
+ $error,
17
+ $flag,
18
+ $flags,
19
+ $gate,
20
+ $isReady,
21
+ clearIdentity,
22
+ initTogglyClient,
23
+ refreshFlags,
24
+ setIdentity,
25
+ stopRefreshInterval
26
+ } from "./chunk-FK633ULF.js";
27
+ export {
28
+ $error,
29
+ $flag,
30
+ $flags,
31
+ $gate,
32
+ $isReady,
33
+ TogglyServer,
34
+ allFeaturesEnabled,
35
+ anyFeatureEnabled,
36
+ clearIdentity,
37
+ createTogglyMiddleware,
38
+ createTogglyServerClient,
39
+ getTogglyFromAstroGlobal,
40
+ initTogglyClient,
41
+ refreshFlags,
42
+ setIdentity,
43
+ stopRefreshInterval,
44
+ togglyIntegration,
45
+ withFeatureFlag
46
+ };
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,24 @@
1
+ import { AstroIntegration } from 'astro';
2
+ import { T as TogglyConfig } from '../index-S3g0i0FH.js';
3
+
4
+ /**
5
+ * Toggly Astro Integration
6
+ *
7
+ * Provides build-time configuration, frontmatter extraction, and runtime injection
8
+ */
9
+
10
+ interface TogglyIntegrationOptions extends TogglyConfig {
11
+ }
12
+ /**
13
+ * Toggly Astro Integration
14
+ */
15
+ declare function togglyIntegration(options?: TogglyIntegrationOptions): AstroIntegration;
16
+ /**
17
+ * Astro middleware to inject Toggly into locals
18
+ * This should be added to src/middleware.ts in the user's project
19
+ */
20
+ declare function createTogglyMiddleware(config: TogglyConfig): ({ locals }: {
21
+ locals: Record<string, any>;
22
+ }, next: () => Promise<Response>) => Promise<Response>;
23
+
24
+ export { type TogglyIntegrationOptions, createTogglyMiddleware, togglyIntegration as default };
@@ -0,0 +1,10 @@
1
+ import {
2
+ createTogglyMiddleware,
3
+ togglyIntegration
4
+ } from "../chunk-354E3C57.js";
5
+ import "../chunk-XQGKGTBK.js";
6
+ export {
7
+ createTogglyMiddleware,
8
+ togglyIntegration as default
9
+ };
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,53 @@
1
+ import { T as TogglyConfig, a as TogglyClient, F as Flags } from '../index-S3g0i0FH.js';
2
+
3
+ /**
4
+ * Toggly Server-Side Client for Astro SSR/SSG
5
+ *
6
+ * This module provides server-side feature flag evaluation for Astro applications.
7
+ * It caches flags for SSG builds and fetches fresh flags for SSR requests.
8
+ * This is a complete, embedded Toggly client implementation.
9
+ */
10
+
11
+ /**
12
+ * Server-side Toggly client implementation
13
+ */
14
+ declare class TogglyServer implements TogglyClient {
15
+ private config;
16
+ private cache;
17
+ private fetchPromise;
18
+ constructor(config: TogglyConfig);
19
+ /**
20
+ * Get API URL for fetching flags
21
+ */
22
+ private getApiUrl;
23
+ /**
24
+ * Check if cache is valid
25
+ */
26
+ private isCacheValid;
27
+ /**
28
+ * Fetch flags from Toggly API
29
+ */
30
+ private fetchFlags;
31
+ /**
32
+ * Refresh flags cache
33
+ */
34
+ refreshFlags(): Promise<void>;
35
+ /**
36
+ * Get all feature flags
37
+ */
38
+ getFlags(): Promise<Flags>;
39
+ /**
40
+ * Get a single feature flag value
41
+ */
42
+ getFlag(key: string, defaultValue?: boolean): Promise<boolean>;
43
+ /**
44
+ * Evaluate a feature gate with multiple flags
45
+ */
46
+ evaluateGate(keys: string[], requirement?: 'all' | 'any', negate?: boolean): Promise<boolean>;
47
+ }
48
+ /**
49
+ * Create a new Toggly server-side client instance
50
+ */
51
+ declare function createTogglyServerClient(config: TogglyConfig): TogglyServer;
52
+
53
+ export { TogglyServer, createTogglyServerClient };
@@ -0,0 +1,9 @@
1
+ import {
2
+ TogglyServer,
3
+ createTogglyServerClient
4
+ } from "../chunk-XQGKGTBK.js";
5
+ export {
6
+ TogglyServer,
7
+ createTogglyServerClient
8
+ };
9
+ //# sourceMappingURL=toggly-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,43 @@
1
+ import { AstroGlobal } from 'astro';
2
+ import { a as TogglyClient } from '../index-S3g0i0FH.js';
3
+
4
+ /**
5
+ * Toggly Server Utilities for Astro
6
+ *
7
+ * Helper functions for server-side feature flag evaluation
8
+ */
9
+
10
+ /**
11
+ * Get Toggly client from Astro global
12
+ *
13
+ * @param Astro - Astro global object
14
+ * @returns TogglyClient instance
15
+ * @throws Error if Toggly client is not initialized
16
+ */
17
+ declare function getTogglyFromAstroGlobal(Astro: AstroGlobal): TogglyClient;
18
+ /**
19
+ * Higher-order function for page-level feature gating
20
+ *
21
+ * @param featureKey - Feature flag key to check
22
+ * @param Astro - Astro global object
23
+ * @returns Boolean indicating if feature is enabled
24
+ */
25
+ declare function withFeatureFlag(featureKey: string, Astro: AstroGlobal): Promise<boolean>;
26
+ /**
27
+ * Check if any of the provided feature flags are enabled
28
+ *
29
+ * @param featureKeys - Array of feature flag keys to check
30
+ * @param Astro - Astro global object
31
+ * @returns Boolean indicating if any feature is enabled
32
+ */
33
+ declare function anyFeatureEnabled(featureKeys: string[], Astro: AstroGlobal): Promise<boolean>;
34
+ /**
35
+ * Check if all of the provided feature flags are enabled
36
+ *
37
+ * @param featureKeys - Array of feature flag keys to check
38
+ * @param Astro - Astro global object
39
+ * @returns Boolean indicating if all features are enabled
40
+ */
41
+ declare function allFeaturesEnabled(featureKeys: string[], Astro: AstroGlobal): Promise<boolean>;
42
+
43
+ export { allFeaturesEnabled, anyFeatureEnabled, getTogglyFromAstroGlobal, withFeatureFlag };
@@ -0,0 +1,13 @@
1
+ import {
2
+ allFeaturesEnabled,
3
+ anyFeatureEnabled,
4
+ getTogglyFromAstroGlobal,
5
+ withFeatureFlag
6
+ } from "../chunk-4UKIT2NP.js";
7
+ export {
8
+ allFeaturesEnabled,
9
+ anyFeatureEnabled,
10
+ getTogglyFromAstroGlobal,
11
+ withFeatureFlag
12
+ };
13
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json ADDED
@@ -0,0 +1,105 @@
1
+ {
2
+ "name": "@ops-ai/astro-feature-flags-toggly",
3
+ "version": "1.0.0",
4
+ "description": "Toggly feature flags SDK for Astro with SSR, SSG, and framework support",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./integration": {
15
+ "types": "./dist/integration/index.d.ts",
16
+ "import": "./dist/integration/index.js"
17
+ },
18
+ "./components/Feature.astro": "./dist/components/Feature.astro",
19
+ "./components/FeatureClient.astro": "./dist/components/FeatureClient.astro",
20
+ "./react": {
21
+ "types": "./dist/frameworks/react/index.d.ts",
22
+ "import": "./dist/frameworks/react/index.js"
23
+ },
24
+ "./vue": {
25
+ "types": "./dist/frameworks/vue/index.d.ts",
26
+ "import": "./dist/frameworks/vue/index.js"
27
+ },
28
+ "./vue/Feature.vue": "./dist/frameworks/vue/Feature.vue",
29
+ "./svelte": {
30
+ "types": "./dist/frameworks/svelte/index.d.ts",
31
+ "import": "./dist/frameworks/svelte/index.js"
32
+ },
33
+ "./svelte/Feature.svelte": "./dist/frameworks/svelte/Feature.svelte"
34
+ },
35
+ "files": [
36
+ "dist"
37
+ ],
38
+ "scripts": {
39
+ "build": "tsup && npm run copy-components",
40
+ "copy-components": "mkdir -p dist/components dist/frameworks/vue dist/frameworks/svelte && cp src/components/*.astro dist/components/ && cp src/frameworks/vue/*.vue dist/frameworks/vue/ && cp src/frameworks/svelte/*.svelte dist/frameworks/svelte/",
41
+ "dev": "tsup --watch",
42
+ "typecheck": "tsc --noEmit",
43
+ "clean": "rm -rf dist"
44
+ },
45
+ "keywords": [
46
+ "astro",
47
+ "feature-flags",
48
+ "toggly",
49
+ "feature-toggle",
50
+ "ssr",
51
+ "ssg"
52
+ ],
53
+ "author": "Ops.AI <hello@ops.ai>",
54
+ "license": "MIT",
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "https://github.com/ops-ai/Toggly.FeatureManagement"
58
+ },
59
+ "dependencies": {
60
+ "glob": "^10.3.10"
61
+ },
62
+ "devDependencies": {
63
+ "@astrojs/check": "^0.9.0",
64
+ "@nanostores/react": "^1.0.0",
65
+ "@nanostores/vue": "^1.0.1",
66
+ "@types/node": "^20.11.0",
67
+ "@types/react": "^19.2.7",
68
+ "astro": "^5.16.0",
69
+ "react": "^19.2.3",
70
+ "svelte": "^5.46.1",
71
+ "tsup": "^8.0.0",
72
+ "typescript": "^5.3.3",
73
+ "vue": "^3.5.26"
74
+ },
75
+ "peerDependencies": {
76
+ "@nanostores/react": "^1.0.0",
77
+ "@nanostores/svelte": "^0.10.0",
78
+ "@nanostores/vue": "^1.0.0",
79
+ "astro": "^5.0.0",
80
+ "nanostores": "^1.0.0",
81
+ "react": ">=18.0.0",
82
+ "svelte": ">=4.0.0",
83
+ "vue": ">=3.0.0"
84
+ },
85
+ "peerDependenciesMeta": {
86
+ "@nanostores/react": {
87
+ "optional": true
88
+ },
89
+ "@nanostores/svelte": {
90
+ "optional": true
91
+ },
92
+ "@nanostores/vue": {
93
+ "optional": true
94
+ },
95
+ "react": {
96
+ "optional": true
97
+ },
98
+ "svelte": {
99
+ "optional": true
100
+ },
101
+ "vue": {
102
+ "optional": true
103
+ }
104
+ }
105
+ }