react-native-matrix-sdk
Advanced tools
Comparing version
256
CHANGELOG.md
# Changelog | ||
## 1.0.0-alpha70 | ||
- Fixed types | ||
## 1.0.0-alpha69 | ||
- Fixed types | ||
## 1.0.0-alpha68 | ||
- Removed age property from events | ||
- Added `getRoom(roomId)` functionality | ||
## 1.0.0-alpha67 | ||
- Fixed iOS crash issues | ||
## 1.0.0-alpha66 | ||
- Added `setCredentials` method which can be used to just pass the credentials instead of logging in | ||
- (Not public yet) added on android `loginWithToken` | ||
## 1.0.0-alpha65 | ||
- Updated native SDKs | ||
## 1.0.0-alpha64 | ||
* Fixed `uploadContent` on android to return the upload id in response, instead of string "uploadId" | ||
## 1.0.0-alpha63 | ||
* Added `uploadContent` and `contentGetDownloadableUrl` to the SDK | ||
## 1.0.0-alpha60 | ||
* Upgraded android matrix SDK to 0.19.35 | ||
* Upgraded iOS matrix SDK 0.16.5 | ||
## 1.0.0-alpha59 | ||
* Fixed that login / startSession won't be called when already init | ||
* Fixed some crash causes on iOS | ||
## 1.0.0-alpha58 | ||
* Changed android package name to a unique one | ||
## 1.0.0-alpha57 | ||
* Changed `loadMessagesInRoom` to `backPaginate` to be in accordance with how the native SDKs work, thus supportign offline fetching of messages | ||
* Added `canBackPaginate` | ||
## 1.0.0-alpha55 | ||
* Added `updateRoomName` | ||
## 1.0.0-alpha55 | ||
* Added name parameter to `createRoom` method | ||
## 1.0.0-alpha54 | ||
* Fixed crash on iOS when requesting left rooms and user have none | ||
## 1.0.0-alpha53 | ||
* Fixed issue on iOS where `markRoomAsRead` promise would not resolve | ||
## 1.0.0-alpha50 | ||
* Fixed issue in iOS where `isDirect` field could be wrong | ||
## 1.0.0-alpha49 | ||
* Fixed typescript array usage | ||
## 1.0.0-alpha48 | ||
* Added `members` attribute to room | ||
## 1.0.0-alpha47 | ||
* Fixed android left rooms having no room summary | ||
## 1.0.0-alpha46 | ||
* Added `getLeftRooms` | ||
## 1.0.0-alpha44 | ||
* Changed signature for room creation to: `createRoom(userIds: Array<string>, isDirect: boolean, isTrustedPrivateChat: boolean): Promise<MXRoomAttributes>;` | ||
<br />Trusted chats are: | ||
```text | ||
isTrustedPrivateChat: join_rules is set to invite. history_visibility is set to shared. All invitees are given the same power level as the room creator.``` | ||
## 1.0.0-alpha43 | ||
* Fixed issue where changeUserPermission to admin was only promoting user to moderator. | ||
## 1.0.0-alpha42 | ||
* Fixed issue on iOS where room was not set to `isDirect` although `true` was passed as argument. | ||
## 1.0.0-alpha41 | ||
* Fixed issue in android where creating a room with `isDirect` didn't work correctly | ||
* Fixed that message content can be `any`. | ||
## 1.0.0-alpha40 | ||
* Fixed issue in iOS with `createRoom` | ||
## 1.0.0-alpha39 | ||
* Added leaveRoom | ||
* Added removeUserFromRoom | ||
* Added changeUserPermission | ||
* Added addUserToRoom | ||
* Changed createRoom signature to support multiple participants: `createRoom(userIds: Array<string>, isDirect: boolean): Promise<MXRoomAttributes>;` | ||
## 1.0.0-alpha37 | ||
* (Android) Fixed matrix olm dependency by manually including it, thus fixing build issues, related to this issue: | ||
https://github.com/jitpack/jitpack.io/issues/3908#issuecomment-526767673 | ||
## 1.0.0-alpha35 | ||
* Added `sendEventToRoom(roomId: string, eventType: string, data: any)` API | ||
## 1.0.0-alpha34 | ||
* Removed event types, and set string for field event.event_type to support custom events | ||
## 1.0.0-alpha33 | ||
* Added `setAdditionalEventTypes(types: string[]): void` for adding a list of custom events that a client needs to support (iOS only, android doesn't need this) | ||
## 1.0.0-alpha31 | ||
* Added typing: `sendTyping(roomId: string, isTyping: boolean, timeout: number): Promise<void>` | ||
## 1.0.0-alpha30 | ||
* Added `ts` (server timestamp) to events (don't use `age`, use `ts`) | ||
## 1.0.0-alpha29 | ||
* Added `setUserDisplayName(displayName: string)` to SDK | ||
## 1.0.0-alpha28 | ||
* Fixed issue on iOS related to device token encoding with base64 | ||
## 1.0.0-alpha26 | ||
* Added event types | ||
## 1.0.0-alpha25 | ||
* Fixed issue in android where age was 0 | ||
## 1.0.0-alpha24 | ||
* Fixed issue in iOS where `getLastEventsForAllRooms` caused a crash | ||
* Added `sendReadReceipt(roomId: string, eventId: string)` in android | ||
* Added `markRoomAsRead(roomId)` | ||
## 1.0.0-alpha22 | ||
* base64 encoding device token when doing iOS push notification registration | ||
* add `appId` parameter to `registerPushNotification` | ||
## 1.0.0-alpha21 | ||
* Changing name of application when doing `registerPushNotifications` to | ||
yourpackagename.(android|ios) | ||
## 1.0.0-alpha20 | ||
* Fixed implementation issues with `registerPushNotifications` API | ||
## 1.0.0-alpha19 | ||
* Added `registerPushNotifications` API (android and iOS) | ||
```typescript | ||
/** | ||
* Adds a new pusher (service) to the user at the matrix homeserver. The matrix homeserver will | ||
* use this pusher service to broadcast (push) notifications to the user's device (using FCM, APNS). | ||
* @param appDisplayName | ||
* @param pushServiceUrl | ||
* @param token (FCM ID, or APNS device token) | ||
*/ | ||
registerPushNotifications(appDisplayName: string, pushServiceUrl: string, token: string): Promise<void>; | ||
``` | ||
## 1.0.0-alpha18 | ||
* Corrected `MXRoomAttributes` name from `notificationcount` -> `notification_count`, thus fixing that `undefined is returned` | ||
## 1.0.0-alpha17 | ||
* Android and iOS use now a file store instead of a memory store, which is a performance optimization | ||
## 1.0.0-alpha16 | ||
* Changed how `loadMessagesInRoom` works. Instead of needing to register a listener, it now returns the events of the room | ||
as a promise array `Promise<MXMessageEvents[]>` (docs updated accordingly) | ||
## 1.0.0-alpha14 | ||
* Fixed issue where android SDK was crashing when started listening without having started a session. | ||
## 1.0.0-alpha13 | ||
* Fixed issue where credentials returned by `login` were a string instead of an object. | ||
## 1.0.0-alpha12 | ||
* Added getLastEventsForAllRooms API for android | ||
## 1.0.0-alpha11 | ||
* Added listen (and unlisten) API to listen to the overall global events of a user | ||
## 1.0.0-alpha10 | ||
* Added unlistenToRoom and loadMessagesInRoom API for android | ||
* Fixed state issues on android side. | ||
## 1.0.0-alpha9 | ||
* Added following methods for android: | ||
* createRoom(userId: string): Promise<MXRoomAttributes>; | ||
* getJoinedRooms(): Promise<[MXRoomAttributes]>; | ||
* listenToRoom(roomId: string): Promise<void>; -> will send events to RN | ||
* sendMessageToRoom(roomId: string, messageType: string, data: any): Promise<SuccessResponse>; | ||
## 1.0.0-alpha8 | ||
* Added following methods for iOS - android will follow tomorrow. (Not all methods have been intensively tested yet!): | ||
* createRoom(userId: string): Promise<MXRoomAttributes>; | ||
* joinRoom(roomId: string): Promise<MXRoomAttributes>; | ||
* getInvitedRooms(): Promise<MXRoomAttributes>; | ||
* getPublicRooms(url: string): Promise<PublicRooms>; | ||
* getUnreadEventTypes(): Promise<[string]>; | ||
* getLastEventsForAllRooms(): Promise<[MXMessageEvent]>; | ||
* getJoinedRooms(): Promise<[MXRoomAttributes]>; | ||
* listenToRoom(roomId: string): Promise<void>; -> will send events to RN | ||
* unlistenToRoom(roomId: string): Promise<void>; | ||
* loadMessagesInRoom(roomId: string, perPage: number, initialLoad: boolean): Promise<void>; | ||
* searchMessagesInRoom(roomId: string, searchTerm: string, nextBatch: string, beforeLimit: string, afterLimit: string); | ||
* getMessages(roomId: string, from: string, direction: string, limit: string): Promise<MessagesFromRoom>; | ||
* sendMessageToRoom(roomId: string, messageType: string, data: any): Promise<SuccessResponse>; | ||
* sendReadReceipt(roomId: string, eventId: string): Promise<SuccessResponse>; | ||
## 1.0.0-alpha7 | ||
@@ -4,0 +260,0 @@ |
17
index.js
import { NativeModules } from 'react-native'; | ||
import {Credentials} from "react-native-matrix-sdk"; | ||
const { RN_MatrixSdk } = NativeModules; | ||
const { RN_MatrixSdk: MatrixSDK } = NativeModules; | ||
export default class MatrixSDK { | ||
static configure(host) { | ||
RN_MatrixSdk.configure(host); | ||
} | ||
static async login(username, password) { | ||
return RN_MatrixSdk.login(username, password); | ||
} | ||
static startSession() { | ||
return RN_MatrixSdk.startSession(); | ||
} | ||
} | ||
export default MatrixSDK; |
{ | ||
"name": "react-native-matrix-sdk", | ||
"title": "React Native Matrix Sdk", | ||
"version": "1.0.0-alpha7", | ||
"version": "1.0.0-alpha70", | ||
"description": "React Native SDK for Matrix.org", | ||
@@ -13,4 +13,4 @@ "main": "index.js", | ||
"type": "git", | ||
"url": "git+https://github.com/hannojg/react-native-matrix-sdk.git", | ||
"baseUrl": "https://github.com/hannojg/react-native-matrix-sdk" | ||
"url": "git+https://github.com/cuvent/react-native-matrix-sdk.git", | ||
"baseUrl": "https://github.com/cuvent/react-native-matrix-sdk" | ||
}, | ||
@@ -32,5 +32,7 @@ "keywords": [ | ||
"devDependencies": { | ||
"@types/react-native": "^0.61.23", | ||
"react": "^16.9.0", | ||
"react-native": "^0.61.5" | ||
} | ||
}, | ||
"dependencies": {} | ||
} |
@@ -5,8 +5,11 @@  | ||
This is a **native** react-native library for [matrix.org](https://matrix.org). | ||
**Attention:** This is still under development and not ready for being used, yet. | ||
Any contribution is welcomed (especially if you have iOS/Swift/Obj-C skills). | ||
The most recent versions are the `*-alpha*` versions, don't use any other! | ||
## Getting started | ||
`$ npm install react-native-matrix-sdk --save` | ||
`$ npm install react-native-matrix-sdk@1.0.0-alpha50 --save` | ||
@@ -74,6 +77,6 @@ ### Mostly automatic installation | ||
pod 'libbase58', :modular_headers => true | ||
pod 'SwiftMatrixSDK' | ||
pod 'MatrixSDK/SwiftSupport', :git => 'https://github.com/hannojg/matrix-ios-sdk.git', :branch => 'develop' | ||
``` | ||
Before you can run `pod install` you need to setup a Swift/Objective-C briding header, as this library uses | ||
Before you can run `pod install` you need to setup a Swift/Objective-C bridging header, as this library uses | ||
Swift code this is needed for RN to work. | ||
@@ -108,2 +111,6 @@ | ||
## Usage | ||
For up to date API capabilities check the types file: https://github.com/hannojg/react-native-matrix-sdk/blob/master/types/index.d.ts | ||
Various use cases: (**Attention: the following section isn't updated**) | ||
```javascript | ||
@@ -119,5 +126,12 @@ import MatrixSdk from 'react-native-matrix-sdk'; | ||
// Session will be true or false. | ||
// Session will return MXSessionAttributes | ||
const session = await MatrixSdk.startSession(); | ||
console.log(`Session created: ${session}`); | ||
// Create room, invite person & send message | ||
const roomCreation = await MatrixSDK.createRoom('@alice:your-matrix-homeserver.org'); | ||
const roomId = roomCreation.room_id; | ||
const successMessage = await MatrixSDK.sendMessageToRoom(roomId, 'text', { | ||
body: 'Hello Alice 🚀', | ||
msgtype: 'm.text', | ||
}); | ||
} catch (e) { | ||
@@ -127,1 +141,56 @@ console.error(e); | ||
``` | ||
### Listen to global new events | ||
You can listen to any matrix event here you can imagine. Things like typing, new room invitations | ||
users leaving rooms etc. | ||
After the example you will find a list of all supported events: | ||
```javascript | ||
// Add listener for events | ||
const matrixGlobalEventEmitter = new NativeEventEmitter(MatrixSDK); | ||
// This will notify us about any member changes of all rooms of a user | ||
// this includes things like new invitations | ||
matrixGlobalEventEmitter.addListener('m.room.member', event => { | ||
// do something with the event | ||
}); | ||
// We also need to start to listen to the events | ||
await MatrixSDK.listen(); | ||
// When we are done listening we should unlisten | ||
MatrixSDK.unlisten(); | ||
``` | ||
### Listening to new events in a room | ||
For listening to events in a specific chat room, add a event listener to that room. | ||
Don't forget to `unlisten` when your component dismounts! | ||
```javascript | ||
// Add listener for events | ||
const matrixRoomTestEmitter = new NativeEventEmitter(MatrixSDK); | ||
// Only listen to future events, thus using 'matrix.room.forwards' | ||
// If you want to listen to past events use 'matrix.room.backwards' | ||
matrixRoomTestEmitter.addListener('matrix.room.forwards', event => { | ||
if (event.event_type === 'm.room.message') { | ||
console.log(event.content.body); | ||
} | ||
}); | ||
await MatrixSDK.listenToRoom(roomId); | ||
console.log('Subscription to room has been made, Captain!'); | ||
``` | ||
### Getting (past) messages/events of a room | ||
```javascript | ||
const events = await MatrixSDK.loadMessagesInRoom(roomId, 50, true); | ||
// Load further 50 messages | ||
const furtherEvents = await MatrixSDK.loadMessagesInRoom(roomId, 50, false); | ||
``` | ||
## Software license | ||
The use of this library is governed by a [Creative Commons license](https://creativecommons.org/licenses/by-nc-sa/2.0/). You can use, modify, copy, and distribute this edition as long as it’s *for non-commercial use*, you provide attribution, and share under a similar license. https://github.com/hannojg/react-native-matrix-sdk/blob/master/LICENSE.md | ||
<br />You can't use this library in a commercial product. |
@@ -0,24 +1,256 @@ | ||
declare interface MXCredentials { | ||
user_id: string; | ||
home_server: string; | ||
access_token: string; | ||
refresh_token: string | undefined; | ||
device_id: string; | ||
} | ||
declare interface MXSessionAttributes { | ||
user_id: string; | ||
display_name: string; | ||
avatar: string; | ||
last_active: number; | ||
status: string; | ||
} | ||
declare interface MXRoomMember { | ||
membership: 'join' | 'invite' | 'leave' | 'ban' | 'kick'; | ||
userId: string; | ||
name: string; | ||
avatarUrl: string; | ||
} | ||
declare interface MXMessageEvent { | ||
event_type: string; | ||
event_id: string; | ||
room_id: string; | ||
sender_id: string; | ||
/** | ||
* The timestamp in ms since Epoch generated by the origin homeserver when it receives the event | ||
* from the client. | ||
*/ | ||
ts: number; | ||
content: any; | ||
} | ||
declare interface MXRoomAttributes { | ||
room_id: string; | ||
name: string; | ||
notification_count: number; | ||
highlight_count: number; | ||
is_direct: boolean; | ||
last_message: MXMessageEvent; | ||
isLeft: boolean; | ||
members: MXRoomMember[]; | ||
} | ||
declare interface PublicRoom { | ||
id: string; | ||
aliases: string; | ||
name: string; | ||
guestCanJoin: boolean; | ||
numJoinedMembers: number; | ||
} | ||
declare interface MessagesFromRoom { | ||
start: string; | ||
end: string; | ||
results: [string]; | ||
} | ||
declare interface SuccessResponse { | ||
success: string; | ||
} | ||
/** | ||
* The key is the upload it, the value is the mxc uri. | ||
*/ | ||
declare interface SuccessUploadResponse { | ||
[key: string]: string | ||
} | ||
declare module 'react-native-matrix-sdk' { | ||
import {EventSubscriptionVendor} from "react-native"; | ||
export interface MXCredentials { | ||
user_id: string; | ||
home_server: string; | ||
access_token: string; | ||
refresh_token: string | undefined; | ||
device_id: string; | ||
} | ||
export interface MatrixSDKStatic extends EventSubscriptionVendor { | ||
/** | ||
* Call this to add additional custom event types that your client | ||
* needs to support. This is for iOS only, android will emit the custom events | ||
* with out the need for calling this. | ||
* @param types | ||
*/ | ||
setAdditionalEventTypes(types: string[]): void; | ||
export interface MXSessionAttributes { | ||
user_id: string; | ||
display_name: string; | ||
avatar: string; | ||
last_active: number; | ||
status: string; | ||
} | ||
configure(host: string): void; | ||
export interface MatrixSDKStatic { | ||
configure(host: string): void; | ||
// TODO: actually credentials are returned as string, and not as Credentials Type | ||
/** | ||
* When you already obtained the credentials using {@see login}, instead of logging in on e.g. every app start, | ||
* you can pass the credentials here. This will save you one login request. | ||
*/ | ||
setCredentials(accessToken: string, deviceId: string, userId: string, homeServer: string, refreshToken?: string): void; | ||
/** | ||
* Logging the user in by username and password. | ||
* @param username | ||
* @param password | ||
*/ | ||
login(username: string, password: string): Promise<MXCredentials>; | ||
startSession(): Promise<MXSessionAttributes>; | ||
/** | ||
* Creates a new room with userIds | ||
* @param userIds doesn't need to include the user's own ID | ||
* @param isDirect shall be used when a room with only two participants is a 1-1 conversation | ||
* @param isTrustedPrivateChat join_rules is set to invite. history_visibility is set to shared. All invitees are given the same power level as the room creator. | ||
* @param name an optional name for the room | ||
*/ | ||
createRoom(userIds: Array<string>, isDirect: boolean, isTrustedPrivateChat: boolean, name: string): Promise<MXRoomAttributes>; | ||
/** | ||
* Updates the name of a room | ||
* @param roomId | ||
* @param newName | ||
*/ | ||
updateRoomName(roomId: string, newName: string); | ||
joinRoom(roomId: string): Promise<MXRoomAttributes>; | ||
/** | ||
* roomId to leave | ||
* @param roomId | ||
*/ | ||
leaveRoom(roomId: string): Promise<void>; | ||
/** | ||
* Remove a certain user from a room | ||
* @param roomId | ||
* @param userId | ||
*/ | ||
removeUserFromRoom(roomId: string, userId: string): Promise<void>; | ||
/** | ||
* Set a user of a room to admin (kick, ban, invite) | ||
* @param roomId | ||
* @param userId | ||
* @param setAdmin | ||
*/ | ||
changeUserPermission(roomId: string, userId: string, setAdmin: boolean): Promise<void>; | ||
/** | ||
* Invited a new user to a room | ||
* @param roomId | ||
* @param userId | ||
*/ | ||
inviteUserToRoom(roomId: string, userId: string): Promise<void>; | ||
/** | ||
* Gets a single room (left rooms included). | ||
* Will reject if room does not exist. | ||
*/ | ||
getRoom(roomId: string): Promise<MXRoomAttributes>; | ||
getInvitedRooms(): Promise<MXRoomAttributes[]>; | ||
getPublicRooms(url: string): Promise<PublicRoom[]>; | ||
getUnreadEventTypes(): Promise<string[]>; | ||
getLastEventsForAllRooms(): Promise<MXMessageEvent[]>; | ||
getJoinedRooms(): Promise<MXRoomAttributes[]>; | ||
getLeftRooms(): Promise<MXRoomAttributes[]>; | ||
listenToRoom(roomId: string): Promise<void>; | ||
unlistenToRoom(roomId: string): Promise<void>; | ||
listenToRoom(roomId: string): Promise<void>; | ||
listen(): Promise<SuccessResponse>; | ||
unlisten(): void; | ||
/** | ||
* This requests messages in direction backwards (past). You need to have a backwards listener in order | ||
* to receive the messages. | ||
* @param roomId | ||
* @param perPage number of entries to return max | ||
* @param initHistory Reset the back state so that future history requests start over from live. | ||
* Must be called when opening a room if interested in history. | ||
*/ | ||
backPaginate(roomId: string, perPage: number, initHistory: boolean): Promise<MXMessageEvent[]>; | ||
/** | ||
* Requests room history from server. | ||
* @param roomId | ||
* @param perPage | ||
* @param initialLoad set to true on first request (initial request, newest messages), any additional calls with false to get further room history | ||
*/ | ||
loadMessagesInRoom(roomId: string, perPage: number, initialLoad: boolean): Promise<MXMessageEvent[]>; | ||
/** | ||
* Returns true when back pagination is (still) possible. | ||
* @param roomId | ||
*/ | ||
canBackPaginate(roomId: string): Promise<boolean>; | ||
searchMessagesInRoom(roomId: string, searchTerm: string, nextBatch: string, beforeLimit: string, afterLimit: string); | ||
getMessages(roomId: string, from: string, direction: string, limit: number): Promise<MessagesFromRoom>; | ||
/** | ||
* Sends an m.room.message event to a room | ||
* @param roomId | ||
* @param messageType the message type (text, image, video, etc - see specifications) | ||
* @param data | ||
*/ | ||
sendMessageToRoom(roomId: string, messageType: string, data: any): Promise<SuccessResponse>; | ||
/** | ||
* Sends an event to a room | ||
* @param roomId | ||
* @param eventType | ||
* @param data | ||
*/ | ||
sendEventToRoom(roomId: string, eventType: string, data: any): Promise<SuccessResponse>; | ||
sendReadReceipt(roomId: string, eventId: string): Promise<SuccessResponse>; | ||
/** | ||
* Marks the whole room as read. | ||
* @param roomId | ||
*/ | ||
markRoomAsRead(roomId: string): Promise<void>; | ||
/** | ||
* Adds a new pusher (service) to the user at the matrix homeserver. The matrix homeserver will | ||
* use this pusher service to broadcast (push) notifications to the user's device (using FCM, APNS). | ||
* @param appDisplayName | ||
* @param appId | ||
* @param pushServiceUrl | ||
* @param token (FCM ID, or APNS device token) | ||
*/ | ||
registerPushNotifications(appDisplayName: string, appId: string, pushServiceUrl: string, token: string): Promise<void>; | ||
/** | ||
* Updates the user's display name | ||
* @param displayName new display name | ||
*/ | ||
setUserDisplayName(displayName: string): Promise<void>; | ||
/** | ||
* Returns for a matrix content uri (mxc://...) the downloadable | ||
* server url of the content. Currently doesn't support encryption. | ||
* @param matrixContentUrl The matrix content url to resolve | ||
*/ | ||
contentGetDownloadableUrl(matrixContentUrl: String): Promise<string> | ||
/** | ||
* Uploads content to the matrix content repository of the connected homeserver. | ||
* @return {@see #SuccessUploadResponse} | ||
* @param fileUri the absolute file path to the file to be uploaded | ||
* @param fileName the file name of the file | ||
* @param mimeType like "audio/aac", "image/jpeg" | ||
* @param uploadId an upload id for reference. | ||
*/ | ||
uploadContent(fileUri: string, fileName: string, mimeType: string, uploadId: string): Promise<SuccessUploadResponse> | ||
/** | ||
* Sends m.typing event into the specified room that the user is typing. | ||
* @param roomId | ||
* @param isTyping whether the user is typing or not | ||
* @param timeout in ms | ||
*/ | ||
sendTyping(roomId: string, isTyping: boolean, timeout: number): Promise<void>; | ||
} | ||
@@ -25,0 +257,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Copyleft License
License(Experimental) Copyleft license information was found.
Found 1 instance in 1 package
Mixed license
License(Experimental) Package contains multiple licenses.
Found 1 instance in 1 package
Non-permissive License
License(Experimental) A license not known to be considered permissive was found.
Found 1 instance in 1 package
757525
526.24%34
30.77%1525
473.31%192
56.1%3
50%3
Infinity%70
-30%1
Infinity%