react-native-levelplayads 0.1.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 (70) hide show
  1. package/LICENSE +20 -0
  2. package/NitroLevelPlayAds.podspec +28 -0
  3. package/README.md +52 -0
  4. package/android/CMakeLists.txt +20 -0
  5. package/android/build.gradle +130 -0
  6. package/android/consumer-rules.pro +3 -0
  7. package/android/fix-prefab.gradle +46 -0
  8. package/android/gradle.properties +5 -0
  9. package/android/src/main/AndroidManifest.xml +1 -0
  10. package/android/src/main/cpp/cpp-adapter.cpp +7 -0
  11. package/android/src/main/java/com/margelo/nitro/levelplayads/HybridLevelPlayAds.kt +287 -0
  12. package/android/src/main/java/com/margelo/nitro/levelplayads/LevelPlayAndroidUtils.kt +30 -0
  13. package/android/src/main/java/com/margelo/nitro/levelplayads/NitroLevelPlayAdsPackage.java +27 -0
  14. package/ios/HybridLevelPlayAds.swift +274 -0
  15. package/ios/LevelPlayAdsSupport.swift +74 -0
  16. package/lib/module/index.js +31 -0
  17. package/lib/module/index.js.map +1 -0
  18. package/lib/module/index.test.js +78 -0
  19. package/lib/module/index.test.js.map +1 -0
  20. package/lib/module/package.json +1 -0
  21. package/lib/module/specs/LevelPlayAds.nitro.js +4 -0
  22. package/lib/module/specs/LevelPlayAds.nitro.js.map +1 -0
  23. package/lib/typescript/package.json +1 -0
  24. package/lib/typescript/src/index.d.ts +16 -0
  25. package/lib/typescript/src/index.d.ts.map +1 -0
  26. package/lib/typescript/src/index.test.d.ts +2 -0
  27. package/lib/typescript/src/index.test.d.ts.map +1 -0
  28. package/lib/typescript/src/specs/LevelPlayAds.nitro.d.ts +18 -0
  29. package/lib/typescript/src/specs/LevelPlayAds.nitro.d.ts.map +1 -0
  30. package/nitro.json +18 -0
  31. package/nitrogen/generated/android/NitroLevelPlayAds+autolinking.cmake +81 -0
  32. package/nitrogen/generated/android/NitroLevelPlayAds+autolinking.gradle +27 -0
  33. package/nitrogen/generated/android/NitroLevelPlayAdsOnLoad.cpp +44 -0
  34. package/nitrogen/generated/android/NitroLevelPlayAdsOnLoad.hpp +25 -0
  35. package/nitrogen/generated/android/c++/JHybridLevelPlayAdsSpec.cpp +112 -0
  36. package/nitrogen/generated/android/c++/JHybridLevelPlayAdsSpec.hpp +69 -0
  37. package/nitrogen/generated/android/c++/JLevelPlayAdShowResult.hpp +54 -0
  38. package/nitrogen/generated/android/c++/JLevelPlayAdShowState.hpp +59 -0
  39. package/nitrogen/generated/android/c++/JLevelPlayAdType.hpp +59 -0
  40. package/nitrogen/generated/android/kotlin/com/margelo/nitro/levelplayads/HybridLevelPlayAdsSpec.kt +72 -0
  41. package/nitrogen/generated/android/kotlin/com/margelo/nitro/levelplayads/LevelPlayAdShowResult.kt +29 -0
  42. package/nitrogen/generated/android/kotlin/com/margelo/nitro/levelplayads/LevelPlayAdShowState.kt +21 -0
  43. package/nitrogen/generated/android/kotlin/com/margelo/nitro/levelplayads/LevelPlayAdType.kt +21 -0
  44. package/nitrogen/generated/android/kotlin/com/margelo/nitro/levelplayads/NitroLevelPlayAdsOnLoad.kt +35 -0
  45. package/nitrogen/generated/ios/NitroLevelPlayAds+autolinking.rb +60 -0
  46. package/nitrogen/generated/ios/NitroLevelPlayAds-Swift-Cxx-Bridge.cpp +56 -0
  47. package/nitrogen/generated/ios/NitroLevelPlayAds-Swift-Cxx-Bridge.hpp +168 -0
  48. package/nitrogen/generated/ios/NitroLevelPlayAds-Swift-Cxx-Umbrella.hpp +54 -0
  49. package/nitrogen/generated/ios/NitroLevelPlayAdsAutolinking.mm +33 -0
  50. package/nitrogen/generated/ios/NitroLevelPlayAdsAutolinking.swift +25 -0
  51. package/nitrogen/generated/ios/c++/HybridLevelPlayAdsSpecSwift.cpp +11 -0
  52. package/nitrogen/generated/ios/c++/HybridLevelPlayAdsSpecSwift.hpp +116 -0
  53. package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
  54. package/nitrogen/generated/ios/swift/Func_void_LevelPlayAdShowResult.swift +47 -0
  55. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
  56. package/nitrogen/generated/ios/swift/HybridLevelPlayAdsSpec.swift +54 -0
  57. package/nitrogen/generated/ios/swift/HybridLevelPlayAdsSpec_cxx.swift +201 -0
  58. package/nitrogen/generated/ios/swift/LevelPlayAdShowResult.swift +35 -0
  59. package/nitrogen/generated/ios/swift/LevelPlayAdShowState.swift +40 -0
  60. package/nitrogen/generated/ios/swift/LevelPlayAdType.swift +40 -0
  61. package/nitrogen/generated/shared/c++/HybridLevelPlayAdsSpec.cpp +26 -0
  62. package/nitrogen/generated/shared/c++/HybridLevelPlayAdsSpec.hpp +73 -0
  63. package/nitrogen/generated/shared/c++/LevelPlayAdShowResult.hpp +68 -0
  64. package/nitrogen/generated/shared/c++/LevelPlayAdShowState.hpp +76 -0
  65. package/nitrogen/generated/shared/c++/LevelPlayAdType.hpp +76 -0
  66. package/package.json +170 -0
  67. package/react-native.config.js +8 -0
  68. package/src/index.test.ts +119 -0
  69. package/src/index.ts +71 -0
  70. package/src/specs/LevelPlayAds.nitro.ts +26 -0
package/package.json ADDED
@@ -0,0 +1,170 @@
1
+ {
2
+ "name": "react-native-levelplayads",
3
+ "version": "0.1.0",
4
+ "description": "Nitro Modules bridge for the LevelPlay (ironSource) mediation SDK",
5
+ "main": "./lib/module/index.js",
6
+ "types": "./lib/typescript/src/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "react-native-levelplayads-source": "./src/index.ts",
10
+ "types": "./lib/typescript/src/index.d.ts",
11
+ "default": "./lib/module/index.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
15
+ "files": [
16
+ "src",
17
+ "lib",
18
+ "android",
19
+ "ios",
20
+ "cpp",
21
+ "nitrogen",
22
+ "nitro.json",
23
+ "*.podspec",
24
+ "react-native.config.js",
25
+ "!ios/build",
26
+ "!android/build",
27
+ "!android/gradle",
28
+ "!android/gradlew",
29
+ "!android/gradlew.bat",
30
+ "!android/local.properties",
31
+ "!**/__tests__",
32
+ "!**/__fixtures__",
33
+ "!**/__mocks__",
34
+ "!**/.*"
35
+ ],
36
+ "scripts": {
37
+ "example": "yarn workspace react-native-levelplayads-example",
38
+ "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
39
+ "prepare": "bob build",
40
+ "nitrogen": "nitrogen",
41
+ "typecheck": "tsc",
42
+ "lint": "eslint \"**/*.{js,ts,tsx}\"",
43
+ "test": "jest",
44
+ "release": "release-it --only-version"
45
+ },
46
+ "keywords": [
47
+ "react-native",
48
+ "ios",
49
+ "android"
50
+ ],
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "git+https://github.com/exzos28/react-native-levelplayads.git"
54
+ },
55
+ "author": "exzos <oleksandr.kurinnyi.work@gmail.com> (https://github.com/exzos28)",
56
+ "license": "MIT",
57
+ "bugs": {
58
+ "url": "https://github.com/exzos28/react-native-levelplayads/issues"
59
+ },
60
+ "homepage": "https://github.com/exzos28/react-native-levelplayads#readme",
61
+ "publishConfig": {
62
+ "registry": "https://registry.npmjs.org/"
63
+ },
64
+ "devDependencies": {
65
+ "@commitlint/config-conventional": "^21.0.2",
66
+ "@eslint/compat": "^2.1.0",
67
+ "@eslint/eslintrc": "^3.3.5",
68
+ "@eslint/js": "^10.0.1",
69
+ "@jest/globals": "^29.7.0",
70
+ "@react-native/babel-preset": "0.85.0",
71
+ "@react-native/eslint-config": "0.85.0",
72
+ "@react-native/jest-preset": "0.85.0",
73
+ "@release-it/conventional-changelog": "^11.0.1",
74
+ "@types/jest": "29.5.14",
75
+ "@types/react": "^19.2.0",
76
+ "commitlint": "^21.0.2",
77
+ "del-cli": "^7.0.0",
78
+ "eslint": "^9.39.4",
79
+ "eslint-config-prettier": "^10.1.8",
80
+ "eslint-plugin-ft-flow": "^3.0.11",
81
+ "eslint-plugin-prettier": "^5.5.6",
82
+ "jest": "^29.7.0",
83
+ "lefthook": "^2.1.9",
84
+ "nitrogen": "0.29.6",
85
+ "prettier": "^3.8.3",
86
+ "react": "19.2.3",
87
+ "react-native": "0.85.0",
88
+ "react-native-builder-bob": "^0.43.0",
89
+ "react-native-nitro-modules": "^0.29.6",
90
+ "release-it": "^20.2.0",
91
+ "turbo": "^2.9.16",
92
+ "typescript": "^6.0.3"
93
+ },
94
+ "peerDependencies": {
95
+ "react": "*",
96
+ "react-native": "*",
97
+ "react-native-nitro-modules": "^0.29.6"
98
+ },
99
+ "workspaces": [
100
+ "example"
101
+ ],
102
+ "packageManager": "yarn@4.11.0",
103
+ "react-native-builder-bob": {
104
+ "source": "src",
105
+ "output": "lib",
106
+ "targets": [
107
+ [
108
+ "custom",
109
+ {
110
+ "script": "nitrogen",
111
+ "clean": "nitrogen/"
112
+ }
113
+ ],
114
+ [
115
+ "module",
116
+ {
117
+ "esm": true
118
+ }
119
+ ],
120
+ [
121
+ "typescript",
122
+ {
123
+ "project": "tsconfig.build.json"
124
+ }
125
+ ]
126
+ ]
127
+ },
128
+ "prettier": {
129
+ "quoteProps": "consistent",
130
+ "singleQuote": true,
131
+ "tabWidth": 2,
132
+ "trailingComma": "es5",
133
+ "useTabs": false
134
+ },
135
+ "commitlint": {
136
+ "extends": [
137
+ "@commitlint/config-conventional"
138
+ ]
139
+ },
140
+ "release-it": {
141
+ "git": {
142
+ "commitMessage": "chore: release ${version}",
143
+ "tagName": "v${version}"
144
+ },
145
+ "npm": {
146
+ "publish": true
147
+ },
148
+ "github": {
149
+ "release": true
150
+ },
151
+ "plugins": {
152
+ "@release-it/conventional-changelog": {
153
+ "preset": {
154
+ "name": "angular"
155
+ }
156
+ }
157
+ }
158
+ },
159
+ "create-react-native-library": {
160
+ "type": "nitro-module",
161
+ "languages": "kotlin-swift",
162
+ "tools": [
163
+ "eslint",
164
+ "jest",
165
+ "lefthook",
166
+ "release-it"
167
+ ],
168
+ "version": "0.63.0"
169
+ }
170
+ }
@@ -0,0 +1,8 @@
1
+ module.exports = {
2
+ dependency: {
3
+ platforms: {
4
+ ios: {},
5
+ android: {},
6
+ },
7
+ },
8
+ };
@@ -0,0 +1,119 @@
1
+ // NitroModules.createHybridObject() is called twice: once by index.ts eagerly
2
+ // at import time, once again below to obtain a reference for assertions. Both
3
+ // calls must return the same object, hence the memoized instance.
4
+ jest.mock('react-native-nitro-modules', () => {
5
+ let instance:
6
+ | {
7
+ initialize: jest.Mock;
8
+ load: jest.Mock;
9
+ show: jest.Mock;
10
+ setGDPRConsent: jest.Mock;
11
+ setCCPAConsent: jest.Mock;
12
+ setCOPPA: jest.Mock;
13
+ }
14
+ | undefined;
15
+
16
+ return {
17
+ NitroModules: {
18
+ createHybridObject: () => {
19
+ instance ??= {
20
+ initialize: jest.fn(async () => undefined),
21
+ load: jest.fn(async () => undefined),
22
+ show: jest.fn(async () => ({ state: 'completed' })),
23
+ setGDPRConsent: jest.fn(),
24
+ setCCPAConsent: jest.fn(),
25
+ setCOPPA: jest.fn(),
26
+ };
27
+ return instance;
28
+ },
29
+ },
30
+ };
31
+ });
32
+
33
+ import { NitroModules } from 'react-native-nitro-modules';
34
+
35
+ import { LevelPlayAds } from './index';
36
+
37
+ const mockNativeLevelPlayAds = NitroModules.createHybridObject(
38
+ 'LevelPlayAds'
39
+ ) as unknown as {
40
+ initialize: jest.Mock;
41
+ load: jest.Mock;
42
+ show: jest.Mock;
43
+ setGDPRConsent: jest.Mock;
44
+ setCCPAConsent: jest.Mock;
45
+ setCOPPA: jest.Mock;
46
+ };
47
+
48
+ beforeEach(() => {
49
+ jest.clearAllMocks();
50
+ });
51
+
52
+ describe('LevelPlayAds().initialize', () => {
53
+ it('throws for an empty app key', () => {
54
+ expect(() => LevelPlayAds().initialize('')).toThrow(
55
+ /expected a non-empty string value/
56
+ );
57
+ });
58
+
59
+ it('defaults testMode to false', () => {
60
+ LevelPlayAds().initialize('app-key-1');
61
+ expect(mockNativeLevelPlayAds.initialize).toHaveBeenCalledWith(
62
+ 'app-key-1',
63
+ false
64
+ );
65
+ });
66
+
67
+ it('forwards testMode when provided', () => {
68
+ LevelPlayAds().initialize('app-key-1', { testMode: true });
69
+ expect(mockNativeLevelPlayAds.initialize).toHaveBeenCalledWith(
70
+ 'app-key-1',
71
+ true
72
+ );
73
+ });
74
+ });
75
+
76
+ describe('LevelPlayAds().load', () => {
77
+ it('throws for an empty ad unit id', () => {
78
+ expect(() => LevelPlayAds().load('interstitial', '')).toThrow(
79
+ /expected a non-empty string value/
80
+ );
81
+ });
82
+
83
+ it('delegates to the native module', async () => {
84
+ await LevelPlayAds().load('interstitial', 'ad-unit-1');
85
+ expect(mockNativeLevelPlayAds.load).toHaveBeenCalledWith(
86
+ 'interstitial',
87
+ 'ad-unit-1'
88
+ );
89
+ });
90
+ });
91
+
92
+ describe('LevelPlayAds().show', () => {
93
+ it('throws for an empty ad unit id', () => {
94
+ expect(() => LevelPlayAds().show('rewarded', '')).toThrow(
95
+ /expected a non-empty string value/
96
+ );
97
+ });
98
+
99
+ it('resolves with the native show result', async () => {
100
+ const result = await LevelPlayAds().show('rewarded', 'ad-unit-1');
101
+ expect(mockNativeLevelPlayAds.show).toHaveBeenCalledWith(
102
+ 'rewarded',
103
+ 'ad-unit-1'
104
+ );
105
+ expect(result).toEqual({ state: 'completed' });
106
+ });
107
+ });
108
+
109
+ describe('LevelPlayAds() consent setters', () => {
110
+ it('forwards GDPR/CCPA/COPPA flags to the native module', () => {
111
+ LevelPlayAds().setGDPRConsent(true);
112
+ LevelPlayAds().setCCPAConsent(false);
113
+ LevelPlayAds().setCOPPA(true);
114
+
115
+ expect(mockNativeLevelPlayAds.setGDPRConsent).toHaveBeenCalledWith(true);
116
+ expect(mockNativeLevelPlayAds.setCCPAConsent).toHaveBeenCalledWith(false);
117
+ expect(mockNativeLevelPlayAds.setCOPPA).toHaveBeenCalledWith(true);
118
+ });
119
+ });
package/src/index.ts ADDED
@@ -0,0 +1,71 @@
1
+ import { NitroModules } from 'react-native-nitro-modules';
2
+
3
+ import type {
4
+ LevelPlayAdShowResult,
5
+ LevelPlayAdType,
6
+ LevelPlayAds as NativeLevelPlayAds,
7
+ } from './specs/LevelPlayAds.nitro';
8
+
9
+ export interface LevelPlayAdsInitializeOptions {
10
+ testMode?: boolean;
11
+ }
12
+
13
+ export interface LevelPlayAdsModuleInterface {
14
+ initialize(
15
+ appKey: string,
16
+ options?: LevelPlayAdsInitializeOptions
17
+ ): Promise<void>;
18
+ load(adType: LevelPlayAdType, adUnitId: string): Promise<void>;
19
+ show(
20
+ adType: LevelPlayAdType,
21
+ adUnitId: string
22
+ ): Promise<LevelPlayAdShowResult>;
23
+ setGDPRConsent(optIn: boolean): void;
24
+ setCCPAConsent(optIn: boolean): void;
25
+ setCOPPA(isCoppa: boolean): void;
26
+ }
27
+
28
+ const nativeLevelPlayAds =
29
+ NitroModules.createHybridObject<NativeLevelPlayAds>('LevelPlayAds');
30
+
31
+ function requireAdUnitId(methodName: string, adUnitId: string): void {
32
+ if (typeof adUnitId !== 'string' || adUnitId.length === 0) {
33
+ throw new Error(
34
+ `LevelPlayAds.${methodName}(*) 'adUnitId' expected a non-empty string value.`
35
+ );
36
+ }
37
+ }
38
+
39
+ const levelPlayAdsInstance: LevelPlayAdsModuleInterface = {
40
+ initialize(appKey, options) {
41
+ if (typeof appKey !== 'string' || appKey.length === 0) {
42
+ throw new Error(
43
+ "LevelPlayAds.initialize(*) 'appKey' expected a non-empty string value."
44
+ );
45
+ }
46
+ return nativeLevelPlayAds.initialize(appKey, options?.testMode ?? false);
47
+ },
48
+ load(adType, adUnitId) {
49
+ requireAdUnitId('load', adUnitId);
50
+ return nativeLevelPlayAds.load(adType, adUnitId);
51
+ },
52
+ show(adType, adUnitId) {
53
+ requireAdUnitId('show', adUnitId);
54
+ return nativeLevelPlayAds.show(adType, adUnitId);
55
+ },
56
+ setGDPRConsent: (optIn) => nativeLevelPlayAds.setGDPRConsent(optIn),
57
+ setCCPAConsent: (optIn) => nativeLevelPlayAds.setCCPAConsent(optIn),
58
+ setCOPPA: (isCoppa) => nativeLevelPlayAds.setCOPPA(isCoppa),
59
+ };
60
+
61
+ export const LevelPlayAds = (): LevelPlayAdsModuleInterface =>
62
+ levelPlayAdsInstance;
63
+
64
+ export default LevelPlayAds;
65
+
66
+ export type {
67
+ LevelPlayAdShowResult,
68
+ LevelPlayAdShowState,
69
+ LevelPlayAdType,
70
+ LevelPlayAds as LevelPlayAdsSpec,
71
+ } from './specs/LevelPlayAds.nitro';
@@ -0,0 +1,26 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+
3
+ export type LevelPlayAdShowState = 'completed' | 'skipped';
4
+
5
+ export interface LevelPlayAdShowResult {
6
+ state: LevelPlayAdShowState;
7
+ }
8
+
9
+ export type LevelPlayAdType = 'interstitial' | 'rewarded';
10
+
11
+ export interface LevelPlayAds extends HybridObject<{
12
+ ios: 'swift';
13
+ android: 'kotlin';
14
+ }> {
15
+ initialize(appKey: string, testMode: boolean): Promise<void>;
16
+
17
+ load(adType: LevelPlayAdType, adUnitId: string): Promise<void>;
18
+ show(
19
+ adType: LevelPlayAdType,
20
+ adUnitId: string
21
+ ): Promise<LevelPlayAdShowResult>;
22
+
23
+ setGDPRConsent(optIn: boolean): void;
24
+ setCCPAConsent(optIn: boolean): void;
25
+ setCOPPA(isCoppa: boolean): void;
26
+ }