@sudobility/subscription_lib 0.0.19 → 0.0.21
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 +96 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useEntitlements.d.ts +7 -0
- package/dist/hooks/useEntitlements.d.ts.map +1 -0
- package/dist/hooks/useEntitlements.js +8 -0
- package/dist/hooks/useEntitlements.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# @sudobility/subscription_lib
|
|
2
|
+
|
|
3
|
+
Cross-platform subscription management library that abstracts RevenueCat SDK differences between web and React Native behind a unified adapter interface.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
bun add @sudobility/subscription_lib
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Peer Dependencies
|
|
12
|
+
|
|
13
|
+
- `react` ^18.0.0 || ^19.0.0
|
|
14
|
+
- `@sudobility/types` ^1.9.53
|
|
15
|
+
- `@revenuecat/purchases-js` ^1.0.0 (web only, optional)
|
|
16
|
+
- `react-native-purchases` >= 7.0.0 (React Native only, optional)
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import {
|
|
22
|
+
initializeSubscription,
|
|
23
|
+
configureRevenueCatAdapter,
|
|
24
|
+
createRevenueCatAdapter,
|
|
25
|
+
useSubscriptions,
|
|
26
|
+
useUserSubscription,
|
|
27
|
+
useSubscribable,
|
|
28
|
+
} from '@sudobility/subscription_lib';
|
|
29
|
+
|
|
30
|
+
// App startup
|
|
31
|
+
configureRevenueCatAdapter(REVENUECAT_API_KEY);
|
|
32
|
+
initializeSubscription({
|
|
33
|
+
adapter: createRevenueCatAdapter(),
|
|
34
|
+
freeTier: { packageId: 'free', displayName: 'Free' },
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// React hooks
|
|
38
|
+
const { offer, isLoading } = useSubscriptions('default');
|
|
39
|
+
const { subscription } = useUserSubscription();
|
|
40
|
+
const { subscribablePackageIds } = useSubscribable('default');
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## API
|
|
44
|
+
|
|
45
|
+
### Core Singleton
|
|
46
|
+
|
|
47
|
+
| Function | Description |
|
|
48
|
+
|----------|-------------|
|
|
49
|
+
| `initializeSubscription(config)` | Initialize with adapter + free tier config |
|
|
50
|
+
| `setSubscriptionUserId(id, email?)` | Set current user, triggers reload |
|
|
51
|
+
| `refreshSubscription()` | Reload offerings + customer info |
|
|
52
|
+
| `getSubscriptionInstance()` | Get the SubscriptionService singleton |
|
|
53
|
+
|
|
54
|
+
### Hooks
|
|
55
|
+
|
|
56
|
+
| Hook | Description |
|
|
57
|
+
|------|-------------|
|
|
58
|
+
| `useSubscriptions(offerId)` | Fetch offer/product catalog (cached) |
|
|
59
|
+
| `useUserSubscription()` | Current user subscription status |
|
|
60
|
+
| `useSubscriptionPeriods(offerId)` | Available billing periods, sorted |
|
|
61
|
+
| `useSubscriptionForPeriod(offerId, period)` | Packages for a period, sorted by price |
|
|
62
|
+
| `useSubscribable(offerId)` | Upgrade-eligible package IDs |
|
|
63
|
+
|
|
64
|
+
### Built-in Adapters
|
|
65
|
+
|
|
66
|
+
- **Web**: `configureRevenueCatAdapter`, `createRevenueCatAdapter`, `setRevenueCatUser`, `clearRevenueCatUser`
|
|
67
|
+
- **React Native**: `configureRevenueCatRNAdapter`, `createRevenueCatRNAdapter`, `setRevenueCatRNUser`, `clearRevenueCatRNUser`
|
|
68
|
+
|
|
69
|
+
### Utilities
|
|
70
|
+
|
|
71
|
+
`parseISO8601Period`, `getPeriodRank`, `comparePeriods`, `calculatePackageLevels`, `findUpgradeablePackages`
|
|
72
|
+
|
|
73
|
+
### Key Types
|
|
74
|
+
|
|
75
|
+
`SubscriptionAdapter`, `SubscriptionOffer`, `SubscriptionPackage`, `CurrentSubscription`, `FreeTierConfig`, `SubscriptionPeriod`
|
|
76
|
+
|
|
77
|
+
## Development
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
bun run build # Compile TS to dist/
|
|
81
|
+
bun run dev # Watch mode (tsc --watch)
|
|
82
|
+
bun test # Run tests (vitest run)
|
|
83
|
+
bun run typecheck # TypeScript check
|
|
84
|
+
bun run lint # ESLint
|
|
85
|
+
bun run format # Prettier
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Pre-commit:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
bun run typecheck && bun run lint && bun test && bun run build
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## License
|
|
95
|
+
|
|
96
|
+
BUSL-1.1
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -3,4 +3,5 @@ export { useUserSubscription, type UseUserSubscriptionResult, type UseUserSubscr
|
|
|
3
3
|
export { useSubscriptionPeriods, type UseSubscriptionPeriodsResult, } from './useSubscriptionPeriods';
|
|
4
4
|
export { useSubscriptionForPeriod, type UseSubscriptionForPeriodResult, } from './useSubscriptionForPeriod';
|
|
5
5
|
export { useSubscribable, type UseSubscribableResult, type UseSubscribableOptions, } from './useSubscribable';
|
|
6
|
+
export { useEntitlements, type UseEntitlementsResult } from './useEntitlements';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,mBAAmB,EACnB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,GAChC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,sBAAsB,EACtB,KAAK,4BAA4B,GAClC,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,wBAAwB,EACxB,KAAK,8BAA8B,GACpC,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,mBAAmB,EACnB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,GAChC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,sBAAsB,EACtB,KAAK,4BAA4B,GAClC,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,wBAAwB,EACxB,KAAK,8BAA8B,GACpC,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/hooks/index.js
CHANGED
|
@@ -3,4 +3,5 @@ export { useUserSubscription, } from './useUserSubscription';
|
|
|
3
3
|
export { useSubscriptionPeriods, } from './useSubscriptionPeriods';
|
|
4
4
|
export { useSubscriptionForPeriod, } from './useSubscriptionForPeriod';
|
|
5
5
|
export { useSubscribable, } from './useSubscribable';
|
|
6
|
+
export { useEntitlements } from './useEntitlements';
|
|
6
7
|
//# sourceMappingURL=index.js.map
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,mBAAmB,GAGpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,sBAAsB,GAEvB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,eAAe,GAGhB,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,mBAAmB,GAGpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,sBAAsB,GAEvB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,eAAe,GAGhB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,eAAe,EAA8B,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { UseUserSubscriptionOptions } from './useUserSubscription';
|
|
2
|
+
export interface UseEntitlementsResult {
|
|
3
|
+
entitlements: string[];
|
|
4
|
+
isLoading: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function useEntitlements(options?: UseUserSubscriptionOptions): UseEntitlementsResult;
|
|
7
|
+
//# sourceMappingURL=useEntitlements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEntitlements.d.ts","sourceRoot":"","sources":["../../src/hooks/useEntitlements.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAKxE,MAAM,WAAW,qBAAqB;IAEpC,YAAY,EAAE,MAAM,EAAE,CAAC;IAEvB,SAAS,EAAE,OAAO,CAAC;CACpB;AAkBD,wBAAgB,eAAe,CAC7B,OAAO,CAAC,EAAE,0BAA0B,GACnC,qBAAqB,CASvB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { useUserSubscription } from './useUserSubscription';
|
|
3
|
+
export function useEntitlements(options) {
|
|
4
|
+
const { subscription, isLoading } = useUserSubscription(options);
|
|
5
|
+
const entitlements = useMemo(() => subscription?.entitlements ?? [], [subscription?.entitlements]);
|
|
6
|
+
return { entitlements, isLoading };
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=useEntitlements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEntitlements.js","sourceRoot":"","sources":["../../src/hooks/useEntitlements.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AA6B5D,MAAM,UAAU,eAAe,CAC7B,OAAoC;IAEpC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,YAAY,EAAE,YAAY,IAAI,EAAE,EACtC,CAAC,YAAY,EAAE,YAAY,CAAC,CAC7B,CAAC;IAEF,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;AACrC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { initializeSubscription, getSubscriptionInstance, isSubscriptionInitialized, resetSubscription, refreshSubscription, setSubscriptionUserId, getSubscriptionUserId, onSubscriptionUserIdChange, onSubscriptionRefresh, SubscriptionService, type SubscriptionConfig, type SubscriptionServiceConfig, } from './core';
|
|
2
|
-
export { useSubscriptions, useUserSubscription, useSubscriptionPeriods, useSubscriptionForPeriod, useSubscribable, type UseSubscriptionsResult, type UseSubscriptionsOptions, type UseUserSubscriptionResult, type UseUserSubscriptionOptions, type UseSubscriptionPeriodsResult, type UseSubscriptionForPeriodResult, type UseSubscribableResult, type UseSubscribableOptions, } from './hooks';
|
|
2
|
+
export { useSubscriptions, useUserSubscription, useSubscriptionPeriods, useSubscriptionForPeriod, useSubscribable, useEntitlements, type UseSubscriptionsResult, type UseSubscriptionsOptions, type UseUserSubscriptionResult, type UseUserSubscriptionOptions, type UseSubscriptionPeriodsResult, type UseSubscriptionForPeriodResult, type UseSubscribableResult, type UseSubscribableOptions, type UseEntitlementsResult, } from './hooks';
|
|
3
3
|
export type { SubscriptionAdapter, AdapterOfferings, AdapterOffering, AdapterPackage, AdapterProduct, AdapterSubscriptionOption, AdapterPricingPhase, AdapterCustomerInfo, AdapterEntitlementInfo, AdapterPurchaseParams, AdapterPurchaseResult, SubscriptionProduct, SubscriptionPackage, SubscriptionOffer, CurrentSubscription, FreeTierConfig, PackageWithLevel, } from './types';
|
|
4
4
|
export { parseISO8601Period, getPeriodRank, comparePeriods, isPeriodGreaterOrEqual, calculatePackageLevels, addLevelsToPackages, getPackageLevel, findUpgradeablePackages, } from './utils';
|
|
5
5
|
export { configureRevenueCatAdapter, createRevenueCatAdapter, setRevenueCatUser, clearRevenueCatUser, hasRevenueCatUser, } from './adapters';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,8BAA8B,EACnC,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,8BAA8B,EACnC,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,SAAS,CAAC;AAGjB,YAAY,EAEV,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,cAAc,EACd,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EAErB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,eAAe,EACf,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAIjB,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,4BAA4B,EAC5B,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { initializeSubscription, getSubscriptionInstance, isSubscriptionInitialized, resetSubscription, refreshSubscription, setSubscriptionUserId, getSubscriptionUserId, onSubscriptionUserIdChange, onSubscriptionRefresh, SubscriptionService, } from './core';
|
|
2
|
-
export { useSubscriptions, useUserSubscription, useSubscriptionPeriods, useSubscriptionForPeriod, useSubscribable, } from './hooks';
|
|
2
|
+
export { useSubscriptions, useUserSubscription, useSubscriptionPeriods, useSubscriptionForPeriod, useSubscribable, useEntitlements, } from './hooks';
|
|
3
3
|
export { parseISO8601Period, getPeriodRank, comparePeriods, isPeriodGreaterOrEqual, calculatePackageLevels, addLevelsToPackages, getPackageLevel, findUpgradeablePackages, } from './utils';
|
|
4
4
|
export { configureRevenueCatAdapter, createRevenueCatAdapter, setRevenueCatUser, clearRevenueCatUser, hasRevenueCatUser, } from './adapters';
|
|
5
5
|
export { configureRevenueCatRNAdapter, createRevenueCatRNAdapter, setRevenueCatRNUser, clearRevenueCatRNUser, hasRevenueCatRNUser, } from './adapters';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,GAGpB,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,GAGpB,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,eAAe,GAUhB,MAAM,SAAS,CAAC;AA0BjB,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,eAAe,EACf,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAIjB,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,4BAA4B,EAC5B,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sudobility/subscription_lib",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.21",
|
|
4
4
|
"description": "Cross-platform subscription management with RevenueCat adapter pattern",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"prepublishOnly": "bun run verify"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"@sudobility/types": "^1.9.
|
|
33
|
+
"@sudobility/types": "^1.9.57",
|
|
34
34
|
"react": "^18.0.0 || ^19.0.0",
|
|
35
35
|
"@revenuecat/purchases-js": "^1.0.0",
|
|
36
36
|
"react-native-purchases": ">=7.0.0"
|