@contentpass/react-native-contentpass 0.3.18 → 0.4.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.
Files changed (96) hide show
  1. package/README.md +109 -79
  2. package/docs/CONTRIBUTING.md +7 -7
  3. package/lib/commonjs/Contentpass.js +38 -25
  4. package/lib/commonjs/Contentpass.js.map +1 -1
  5. package/lib/commonjs/Contentpass.test.js +455 -0
  6. package/lib/commonjs/Contentpass.test.js.map +1 -0
  7. package/lib/commonjs/OidcAuthStateStorage.test.js +59 -0
  8. package/lib/commonjs/OidcAuthStateStorage.test.js.map +1 -0
  9. package/lib/commonjs/contentpassTokenUtils/fetchContentpassToken.test.js +45 -0
  10. package/lib/commonjs/contentpassTokenUtils/fetchContentpassToken.test.js.map +1 -0
  11. package/lib/commonjs/contentpassTokenUtils/parseContentpassToken.test.js +31 -0
  12. package/lib/commonjs/contentpassTokenUtils/parseContentpassToken.test.js.map +1 -0
  13. package/lib/commonjs/contentpassTokenUtils/validateSubscription.test.js +73 -0
  14. package/lib/commonjs/contentpassTokenUtils/validateSubscription.test.js.map +1 -0
  15. package/lib/commonjs/countImpressionUtils/sendPageViewEvent.test.js +35 -0
  16. package/lib/commonjs/countImpressionUtils/sendPageViewEvent.test.js.map +1 -0
  17. package/lib/commonjs/countImpressionUtils/sendStats.js +1 -1
  18. package/lib/commonjs/countImpressionUtils/sendStats.js.map +1 -1
  19. package/lib/commonjs/countImpressionUtils/sendStats.test.js +39 -0
  20. package/lib/commonjs/countImpressionUtils/sendStats.test.js.map +1 -0
  21. package/lib/commonjs/index.js +2 -0
  22. package/lib/commonjs/index.js.map +1 -1
  23. package/lib/commonjs/logger.test.js +42 -0
  24. package/lib/commonjs/logger.test.js.map +1 -0
  25. package/lib/commonjs/package.json +1 -0
  26. package/lib/commonjs/sdkContext/ContentpassSdkProvder.test.js +33 -0
  27. package/lib/commonjs/sdkContext/ContentpassSdkProvder.test.js.map +1 -0
  28. package/lib/commonjs/sdkContext/useContentpassSdk.test.js +37 -0
  29. package/lib/commonjs/sdkContext/useContentpassSdk.test.js.map +1 -0
  30. package/lib/commonjs/sdkContext/useContentpassState.js +26 -0
  31. package/lib/commonjs/sdkContext/useContentpassState.js.map +1 -0
  32. package/lib/commonjs/sentryIntegration.test.js +131 -0
  33. package/lib/commonjs/sentryIntegration.test.js.map +1 -0
  34. package/lib/commonjs/types/CmpAdapter.js +2 -0
  35. package/lib/commonjs/types/CmpAdapter.js.map +1 -0
  36. package/lib/module/Contentpass.js +38 -25
  37. package/lib/module/Contentpass.js.map +1 -1
  38. package/lib/module/Contentpass.test.js +448 -0
  39. package/lib/module/Contentpass.test.js.map +1 -0
  40. package/lib/module/OidcAuthStateStorage.test.js +56 -0
  41. package/lib/module/OidcAuthStateStorage.test.js.map +1 -0
  42. package/lib/module/contentpassTokenUtils/fetchContentpassToken.test.js +44 -0
  43. package/lib/module/contentpassTokenUtils/fetchContentpassToken.test.js.map +1 -0
  44. package/lib/module/contentpassTokenUtils/parseContentpassToken.test.js +30 -0
  45. package/lib/module/contentpassTokenUtils/parseContentpassToken.test.js.map +1 -0
  46. package/lib/module/contentpassTokenUtils/validateSubscription.test.js +70 -0
  47. package/lib/module/contentpassTokenUtils/validateSubscription.test.js.map +1 -0
  48. package/lib/module/countImpressionUtils/sendPageViewEvent.test.js +34 -0
  49. package/lib/module/countImpressionUtils/sendPageViewEvent.test.js.map +1 -0
  50. package/lib/module/countImpressionUtils/sendStats.js +1 -1
  51. package/lib/module/countImpressionUtils/sendStats.js.map +1 -1
  52. package/lib/module/countImpressionUtils/sendStats.test.js +38 -0
  53. package/lib/module/countImpressionUtils/sendStats.test.js.map +1 -0
  54. package/lib/module/index.js +6 -3
  55. package/lib/module/index.js.map +1 -1
  56. package/lib/module/logger.test.js +40 -0
  57. package/lib/module/logger.test.js.map +1 -0
  58. package/lib/module/package.json +1 -0
  59. package/lib/module/sdkContext/ContentpassSdkProvder.test.js +32 -0
  60. package/lib/module/sdkContext/ContentpassSdkProvder.test.js.map +1 -0
  61. package/lib/module/sdkContext/useContentpassSdk.test.js +36 -0
  62. package/lib/module/sdkContext/useContentpassSdk.test.js.map +1 -0
  63. package/lib/module/sdkContext/useContentpassState.js +21 -0
  64. package/lib/module/sdkContext/useContentpassState.js.map +1 -0
  65. package/lib/module/sentryIntegration.test.js +128 -0
  66. package/lib/module/sentryIntegration.test.js.map +1 -0
  67. package/lib/module/types/CmpAdapter.js +2 -0
  68. package/lib/module/types/CmpAdapter.js.map +1 -0
  69. package/lib/typescript/commonjs/src/Contentpass.d.ts +8 -5
  70. package/lib/typescript/commonjs/src/Contentpass.d.ts.map +1 -1
  71. package/lib/typescript/commonjs/src/countImpressionUtils/sendStats.d.ts +1 -0
  72. package/lib/typescript/commonjs/src/countImpressionUtils/sendStats.d.ts.map +1 -1
  73. package/lib/typescript/commonjs/src/index.d.ts +11 -6
  74. package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
  75. package/lib/typescript/commonjs/src/logger.d.ts.map +1 -1
  76. package/lib/typescript/commonjs/src/sdkContext/ContentpassSdkProvider.d.ts.map +1 -1
  77. package/lib/typescript/commonjs/src/sdkContext/useContentpassState.d.ts +4 -0
  78. package/lib/typescript/commonjs/src/sdkContext/useContentpassState.d.ts.map +1 -0
  79. package/lib/typescript/commonjs/src/sentryIntegration.d.ts.map +1 -1
  80. package/lib/typescript/commonjs/src/types/CmpAdapter.d.ts +14 -0
  81. package/lib/typescript/commonjs/src/types/CmpAdapter.d.ts.map +1 -0
  82. package/lib/typescript/module/src/Contentpass.d.ts +8 -5
  83. package/lib/typescript/module/src/Contentpass.d.ts.map +1 -1
  84. package/lib/typescript/module/src/countImpressionUtils/sendStats.d.ts +1 -0
  85. package/lib/typescript/module/src/countImpressionUtils/sendStats.d.ts.map +1 -1
  86. package/lib/typescript/module/src/index.d.ts +11 -6
  87. package/lib/typescript/module/src/index.d.ts.map +1 -1
  88. package/lib/typescript/module/src/logger.d.ts.map +1 -1
  89. package/lib/typescript/module/src/sdkContext/ContentpassSdkProvider.d.ts.map +1 -1
  90. package/lib/typescript/module/src/sdkContext/useContentpassState.d.ts +4 -0
  91. package/lib/typescript/module/src/sdkContext/useContentpassState.d.ts.map +1 -0
  92. package/lib/typescript/module/src/sentryIntegration.d.ts.map +1 -1
  93. package/lib/typescript/module/src/types/CmpAdapter.d.ts +14 -0
  94. package/lib/typescript/module/src/types/CmpAdapter.d.ts.map +1 -0
  95. package/package.json +24 -59
  96. package/LICENSE +0 -20
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ import EncryptedStorage from 'react-native-encrypted-storage';
4
+ import OidcAuthStateStorage from "./OidcAuthStateStorage.js";
5
+ import * as SentryIntegrationModule from "./sentryIntegration.js";
6
+ describe('OidcAuthStateStorage', () => {
7
+ const CLIENT_ID = 'test-client-id';
8
+ const EXPECTED_STORAGE_KEY = `de.contentpass.${CLIENT_ID}-OIDCAuthState`;
9
+ let storage;
10
+ let reportErrorSpy;
11
+ const mockAuthState = {
12
+ accessToken: 'test-access-token',
13
+ accessTokenExpirationDate: '2023-12-31T23:59:59Z',
14
+ idToken: 'test-id-token',
15
+ refreshToken: 'test-refresh-token',
16
+ tokenType: 'Bearer'
17
+ };
18
+ beforeEach(() => {
19
+ storage = new OidcAuthStateStorage(CLIENT_ID);
20
+ reportErrorSpy = jest.spyOn(SentryIntegrationModule, 'reportError').mockReturnValue(undefined);
21
+ });
22
+ afterEach(() => {
23
+ jest.resetAllMocks();
24
+ jest.restoreAllMocks();
25
+ });
26
+ it('should store OIDC auth state', async () => {
27
+ await storage.storeOidcAuthState(mockAuthState);
28
+ expect(EncryptedStorage.setItem).toHaveBeenCalledWith(EXPECTED_STORAGE_KEY, '{"accessToken":"test-access-token","accessTokenExpirationDate":"2023-12-31T23:59:59Z","idToken":"test-id-token","refreshToken":"test-refresh-token","tokenType":"Bearer"}');
29
+ });
30
+ it('should get OIDC auth state', async () => {
31
+ EncryptedStorage.getItem.mockResolvedValue('{"accessToken":"test-access-token","accessTokenExpirationDate":"2023-12-31T23:59:59Z","idToken":"test-id-token","refreshToken":"test-refresh-token","tokenType":"Bearer"}');
32
+ const result = await storage.getOidcAuthState();
33
+ expect(EncryptedStorage.getItem).toHaveBeenCalledWith(EXPECTED_STORAGE_KEY);
34
+ expect(result).toEqual(mockAuthState);
35
+ });
36
+ it('should return undefined if no OIDC auth state is found', async () => {
37
+ EncryptedStorage.getItem.mockResolvedValue(null);
38
+ const result = await storage.getOidcAuthState();
39
+ expect(EncryptedStorage.getItem).toHaveBeenCalledWith(EXPECTED_STORAGE_KEY);
40
+ expect(result).toBeUndefined();
41
+ });
42
+ it('should clear OIDC auth state', async () => {
43
+ await storage.clearOidcAuthState();
44
+ expect(EncryptedStorage.removeItem).toHaveBeenCalledWith(EXPECTED_STORAGE_KEY);
45
+ });
46
+ it('should report error if clearing OIDC auth state fails', async () => {
47
+ const error = new Error('test-error');
48
+ EncryptedStorage.removeItem.mockRejectedValue(error);
49
+ await storage.clearOidcAuthState();
50
+ expect(EncryptedStorage.removeItem).toHaveBeenCalledWith(EXPECTED_STORAGE_KEY);
51
+ expect(reportErrorSpy).toHaveBeenCalledWith(error, {
52
+ msg: 'Failed to clear OIDC auth state. Most probably we tried to remove item which does not exist'
53
+ });
54
+ });
55
+ });
56
+ //# sourceMappingURL=OidcAuthStateStorage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["EncryptedStorage","OidcAuthStateStorage","SentryIntegrationModule","describe","CLIENT_ID","EXPECTED_STORAGE_KEY","storage","reportErrorSpy","mockAuthState","accessToken","accessTokenExpirationDate","idToken","refreshToken","tokenType","beforeEach","jest","spyOn","mockReturnValue","undefined","afterEach","resetAllMocks","restoreAllMocks","it","storeOidcAuthState","expect","setItem","toHaveBeenCalledWith","getItem","mockResolvedValue","result","getOidcAuthState","toEqual","toBeUndefined","clearOidcAuthState","removeItem","error","Error","mockRejectedValue","msg"],"sourceRoot":"../../src","sources":["OidcAuthStateStorage.test.ts"],"mappings":";;AAAA,OAAOA,gBAAgB,MAAM,gCAAgC;AAC7D,OAAOC,oBAAoB,MAEpB,2BAAwB;AAC/B,OAAO,KAAKC,uBAAuB,MAAM,wBAAqB;AAE9DC,QAAQ,CAAC,sBAAsB,EAAE,MAAM;EACrC,MAAMC,SAAS,GAAG,gBAAgB;EAClC,MAAMC,oBAAoB,GAAG,kBAAkBD,SAAS,gBAAgB;EAExE,IAAIE,OAA6B;EACjC,IAAIC,cAAgC;EACpC,MAAMC,aAA4B,GAAG;IACnCC,WAAW,EAAE,mBAAmB;IAChCC,yBAAyB,EAAE,sBAAsB;IACjDC,OAAO,EAAE,eAAe;IACxBC,YAAY,EAAE,oBAAoB;IAClCC,SAAS,EAAE;EACb,CAAC;EAEDC,UAAU,CAAC,MAAM;IACfR,OAAO,GAAG,IAAIL,oBAAoB,CAACG,SAAS,CAAC;IAC7CG,cAAc,GAAGQ,IAAI,CAClBC,KAAK,CAACd,uBAAuB,EAAE,aAAa,CAAC,CAC7Ce,eAAe,CAACC,SAAS,CAAC;EAC/B,CAAC,CAAC;EAEFC,SAAS,CAAC,MAAM;IACdJ,IAAI,CAACK,aAAa,CAAC,CAAC;IACpBL,IAAI,CAACM,eAAe,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFC,EAAE,CAAC,8BAA8B,EAAE,YAAY;IAC7C,MAAMhB,OAAO,CAACiB,kBAAkB,CAACf,aAAa,CAAC;IAE/CgB,MAAM,CAACxB,gBAAgB,CAACyB,OAAO,CAAC,CAACC,oBAAoB,CACnDrB,oBAAoB,EACpB,2KACF,CAAC;EACH,CAAC,CAAC;EAEFiB,EAAE,CAAC,4BAA4B,EAAE,YAAY;IAC1CtB,gBAAgB,CAAC2B,OAAO,CAAeC,iBAAiB,CACvD,2KACF,CAAC;IACD,MAAMC,MAAM,GAAG,MAAMvB,OAAO,CAACwB,gBAAgB,CAAC,CAAC;IAE/CN,MAAM,CAACxB,gBAAgB,CAAC2B,OAAO,CAAC,CAACD,oBAAoB,CAACrB,oBAAoB,CAAC;IAC3EmB,MAAM,CAACK,MAAM,CAAC,CAACE,OAAO,CAACvB,aAAa,CAAC;EACvC,CAAC,CAAC;EAEFc,EAAE,CAAC,wDAAwD,EAAE,YAAY;IACtEtB,gBAAgB,CAAC2B,OAAO,CAAeC,iBAAiB,CAAC,IAAI,CAAC;IAC/D,MAAMC,MAAM,GAAG,MAAMvB,OAAO,CAACwB,gBAAgB,CAAC,CAAC;IAE/CN,MAAM,CAACxB,gBAAgB,CAAC2B,OAAO,CAAC,CAACD,oBAAoB,CAACrB,oBAAoB,CAAC;IAC3EmB,MAAM,CAACK,MAAM,CAAC,CAACG,aAAa,CAAC,CAAC;EAChC,CAAC,CAAC;EAEFV,EAAE,CAAC,8BAA8B,EAAE,YAAY;IAC7C,MAAMhB,OAAO,CAAC2B,kBAAkB,CAAC,CAAC;IAElCT,MAAM,CAACxB,gBAAgB,CAACkC,UAAU,CAAC,CAACR,oBAAoB,CACtDrB,oBACF,CAAC;EACH,CAAC,CAAC;EAEFiB,EAAE,CAAC,uDAAuD,EAAE,YAAY;IACtE,MAAMa,KAAK,GAAG,IAAIC,KAAK,CAAC,YAAY,CAAC;IACpCpC,gBAAgB,CAACkC,UAAU,CAAeG,iBAAiB,CAACF,KAAK,CAAC;IAEnE,MAAM7B,OAAO,CAAC2B,kBAAkB,CAAC,CAAC;IAElCT,MAAM,CAACxB,gBAAgB,CAACkC,UAAU,CAAC,CAACR,oBAAoB,CACtDrB,oBACF,CAAC;IACDmB,MAAM,CAACjB,cAAc,CAAC,CAACmB,oBAAoB,CAACS,KAAK,EAAE;MACjDG,GAAG,EAAE;IACP,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ import fetchContentpassToken from "./fetchContentpassToken.js";
4
+ describe('fetchContentpassToken', () => {
5
+ afterEach(() => {
6
+ jest.resetAllMocks();
7
+ jest.restoreAllMocks();
8
+ });
9
+ it('should return the contentpass token', async () => {
10
+ jest.spyOn(global, 'fetch').mockResolvedValue({
11
+ ok: true,
12
+ json: jest.fn().mockResolvedValue({
13
+ contentpass_token: 'example_contentpass_token'
14
+ })
15
+ });
16
+ const result = await fetchContentpassToken({
17
+ idToken: '123456',
18
+ propertyId: '987654321',
19
+ issuer: 'https://issuer.com'
20
+ });
21
+ expect(result).toBe('example_contentpass_token');
22
+ expect(global.fetch).toHaveBeenCalledWith('https://issuer.com/auth/oidc/token', {
23
+ body: 'grant_type=contentpass_token&subject_token=123456&client_id=987654321',
24
+ method: 'POST',
25
+ headers: {
26
+ 'Content-Type': 'application/x-www-form-urlencoded'
27
+ }
28
+ });
29
+ });
30
+ it('should throw an error if the fetch fails', async () => {
31
+ jest.spyOn(global, 'fetch').mockResolvedValue({
32
+ ok: false,
33
+ statusText: 'Not Found'
34
+ });
35
+ await expect(async () => {
36
+ await fetchContentpassToken({
37
+ idToken: '123456',
38
+ propertyId: '987654321',
39
+ issuer: 'https://issuer.com'
40
+ });
41
+ }).rejects.toThrow('Failed to fetch Contentpass token, status: Not Found');
42
+ });
43
+ });
44
+ //# sourceMappingURL=fetchContentpassToken.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["fetchContentpassToken","describe","afterEach","jest","resetAllMocks","restoreAllMocks","it","spyOn","global","mockResolvedValue","ok","json","fn","contentpass_token","result","idToken","propertyId","issuer","expect","toBe","fetch","toHaveBeenCalledWith","body","method","headers","statusText","rejects","toThrow"],"sourceRoot":"../../../src","sources":["contentpassTokenUtils/fetchContentpassToken.test.ts"],"mappings":";;AAAA,OAAOA,qBAAqB,MAAM,4BAAyB;AAE3DC,QAAQ,CAAC,uBAAuB,EAAE,MAAM;EACtCC,SAAS,CAAC,MAAM;IACdC,IAAI,CAACC,aAAa,CAAC,CAAC;IACpBD,IAAI,CAACE,eAAe,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFC,EAAE,CAAC,qCAAqC,EAAE,YAAY;IACpDH,IAAI,CAACI,KAAK,CAACC,MAAM,EAAE,OAAO,CAAC,CAACC,iBAAiB,CAAC;MAC5CC,EAAE,EAAE,IAAI;MACRC,IAAI,EAAER,IAAI,CACPS,EAAE,CAAC,CAAC,CACJH,iBAAiB,CAAC;QAAEI,iBAAiB,EAAE;MAA4B,CAAC;IACzE,CAAQ,CAAC;IAET,MAAMC,MAAM,GAAG,MAAMd,qBAAqB,CAAC;MACzCe,OAAO,EAAE,QAAQ;MACjBC,UAAU,EAAE,WAAW;MACvBC,MAAM,EAAE;IACV,CAAC,CAAC;IAEFC,MAAM,CAACJ,MAAM,CAAC,CAACK,IAAI,CAAC,2BAA2B,CAAC;IAChDD,MAAM,CAACV,MAAM,CAACY,KAAK,CAAC,CAACC,oBAAoB,CACvC,oCAAoC,EACpC;MACEC,IAAI,EAAE,uEAAuE;MAC7EC,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE;QACP,cAAc,EAAE;MAClB;IACF,CACF,CAAC;EACH,CAAC,CAAC;EAEFlB,EAAE,CAAC,0CAA0C,EAAE,YAAY;IACzDH,IAAI,CAACI,KAAK,CAACC,MAAM,EAAE,OAAO,CAAC,CAACC,iBAAiB,CAAC;MAC5CC,EAAE,EAAE,KAAK;MACTe,UAAU,EAAE;IACd,CAAQ,CAAC;IAET,MAAMP,MAAM,CAAC,YAAY;MACvB,MAAMlB,qBAAqB,CAAC;QAC1Be,OAAO,EAAE,QAAQ;QACjBC,UAAU,EAAE,WAAW;QACvBC,MAAM,EAAE;MACV,CAAC,CAAC;IACJ,CAAC,CAAC,CAACS,OAAO,CAACC,OAAO,CAAC,sDAAsD,CAAC;EAC5E,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ import parseContentpassToken from "./parseContentpassToken.js";
4
+ describe('parseContentpassToken', () => {
5
+ it('should parse the contentpass token', () => {
6
+ const exampleToken = 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjY5NzUwYTZjLTNmYjctNDUyNi05NWY4LTVhZmYxMmIyZjFjOSJ9.eyJhdXRoIjp0cnVlLCJ0eXBlIjoiY3AiLCJwbGFucyI6WyIwYWNhZTkxNy1iZTk5LTQ4ZWEtYjhmMS0yMGZhNjhhNDdkM2EiLCI0NDIxNjI4Yy05NjA2LTRjMDEtOGU1ZC1jMmE5YmNhNjhhYjQiLCI3ZThkZTBjYy0zZTk3LTQ5YTItODgxZC05ZmZiNWI4NDE1MTUiLCJhNDcyMWRiNS02N2RmLTQxNDUtYmJiZi1jYmQwOWY3ZTAzOTciLCJjNGQzYjBmNS05ODlhLTRmN2ItOGFjNy0zZDhmZmE5NTcxN2YiLCI2NGRkOTkwNS05NmUxLTRmYjItOTgwZC01MDdmMTYzNzVmZTkiXSwiYXVkIjoiY2MzZmM0YWQiLCJpYXQiOjE3MzMxMzU2ODEsImV4cCI6MTczMzMxMjA4MX0.CMtH7HRLf2HVgw3_cZRN0en8tml_SQKM73iLGJAp72-vJuRJaq85xBp6Jgy9WD3L7x4itRlBAYZxX8tLxZGogU0WP4_dMGFQ2QlcwKshwJygwRM1YqvxGWX2Az_KxEMc2QGHvpE1qe2MAr_xOU7VFfc0-vWxFc3hRzpAM5j7YHctj2t1v6h9-M7V2Hkcn37569QmtgU8gJkUxXsgUTufbb1ikjjjAvnjvTluHJo51_utbimpUbCk3EFxXVCVEI_pAqiZQXNninUQ6dbSujLb3L2UlEdQzLeUiBdYroeFzSyruLrR841ledLQ5ZP2OqzF5oUMuAGVOOhmgGdwGMCDRQ';
7
+ const result = parseContentpassToken(exampleToken);
8
+ expect(result).toEqual({
9
+ body: {
10
+ aud: 'cc3fc4ad',
11
+ auth: true,
12
+ exp: 1733312081,
13
+ iat: 1733135681,
14
+ plans: ['0acae917-be99-48ea-b8f1-20fa68a47d3a', '4421628c-9606-4c01-8e5d-c2a9bca68ab4', '7e8de0cc-3e97-49a2-881d-9ffb5b841515', 'a4721db5-67df-4145-bbbf-cbd09f7e0397', 'c4d3b0f5-989a-4f7b-8ac7-3d8ffa95717f', '64dd9905-96e1-4fb2-980d-507f16375fe9'],
15
+ type: 'cp'
16
+ },
17
+ header: {
18
+ alg: 'RS256',
19
+ kid: '69750a6c-3fb7-4526-95f8-5aff12b2f1c9'
20
+ }
21
+ });
22
+ });
23
+ it('should throw an error if the token is invalid', () => {
24
+ const invalidToken = 'eyJhdXRoIjp0cnVlLCJ0eXBlIjoiY3AiLCJwbGFucyI6WyIwYWNhZTkxNy1iZTk5LTQ4ZWEtYjhmMS0yMGZhNjhhNDdkM2EiLCI0NDIxNjI4Yy05NjA2LTRjMDEtOGU1ZC1jMmE5YmNhNjhhYjQiLCI3ZThkZTBjYy0zZTk3LTQ5YTItODgxZC05ZmZiNWI4NDE1MTUiLCJhNDcyMWRiNS02N2RmLTQxNDUtYmJiZi1jYmQwOWY3ZTAzOTciLCJjNGQzYjBmNS05ODlhLTRmN2ItOGFjNy0zZDhmZmE5NTcxN2YiLCI2NGRkOTkwNS05NmUxLTRmYjItOTgwZC01MDdmMTYzNzVmZTkiXSwiYXVkIjoiY2MzZmM0YWQiLCJpYXQiOjE3MzMxMzU2ODEsImV4cCI6MTczMzMxMjA4MX0.CMtH7HRLf2HVgw3_cZRN0en8tml_SQKM73iLGJAp72-vJuRJaq85xBp6Jgy9WD3L7x4itRlBAYZxX8tLxZGogU0WP4_dMGFQ2QlcwKshwJygwRM1YqvxGWX2Az_KxEMc2QGHvpE1qe2MAr_xOU7VFfc0-vWxFc3hRzpAM5j7YHctj2t1v6h9-M7V2Hkcn37569QmtgU8gJkUxXsgUTufbb1ikjjjAvnjvTluHJo51_utbimpUbCk3EFxXVCVEI_pAqiZQXNninUQ6dbSujLb3L2UlEdQzLeUiBdYroeFzSyruLrR841ledLQ5ZP2OqzF5oUMuAGVOOhmgGdwGMCDRQ';
25
+ expect(() => {
26
+ parseContentpassToken(invalidToken);
27
+ }).toThrow('Invalid token, token should have at least 3 parts');
28
+ });
29
+ });
30
+ //# sourceMappingURL=parseContentpassToken.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["parseContentpassToken","describe","it","exampleToken","result","expect","toEqual","body","aud","auth","exp","iat","plans","type","header","alg","kid","invalidToken","toThrow"],"sourceRoot":"../../../src","sources":["contentpassTokenUtils/parseContentpassToken.test.ts"],"mappings":";;AAAA,OAAOA,qBAAqB,MAAM,4BAAyB;AAE3DC,QAAQ,CAAC,uBAAuB,EAAE,MAAM;EACtCC,EAAE,CAAC,oCAAoC,EAAE,MAAM;IAC7C,MAAMC,YAAY,GAChB,q1BAAq1B;IAEv1B,MAAMC,MAAM,GAAGJ,qBAAqB,CAACG,YAAY,CAAC;IAElDE,MAAM,CAACD,MAAM,CAAC,CAACE,OAAO,CAAC;MACrBC,IAAI,EAAE;QACJC,GAAG,EAAE,UAAU;QACfC,IAAI,EAAE,IAAI;QACVC,GAAG,EAAE,UAAU;QACfC,GAAG,EAAE,UAAU;QACfC,KAAK,EAAE,CACL,sCAAsC,EACtC,sCAAsC,EACtC,sCAAsC,EACtC,sCAAsC,EACtC,sCAAsC,EACtC,sCAAsC,CACvC;QACDC,IAAI,EAAE;MACR,CAAC;MACDC,MAAM,EAAE;QACNC,GAAG,EAAE,OAAO;QACZC,GAAG,EAAE;MACP;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFd,EAAE,CAAC,+CAA+C,EAAE,MAAM;IACxD,MAAMe,YAAY,GAChB,owBAAowB;IAEtwBZ,MAAM,CAAC,MAAM;MACXL,qBAAqB,CAACiB,YAAY,CAAC;IACrC,CAAC,CAAC,CAACC,OAAO,CAAC,mDAAmD,CAAC;EACjE,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ import * as ParseContentpassTokenModule from "./parseContentpassToken.js";
4
+ import * as SentryIntegrationModule from "../sentryIntegration.js";
5
+ import validateSubscription from "./validateSubscription.js";
6
+ const EXAMPLE_CONTENTPASS_TOKEN = {
7
+ body: {
8
+ aud: 'cc3fc4ad',
9
+ auth: true,
10
+ exp: 1733312081,
11
+ iat: 1733135681,
12
+ type: 'cp',
13
+ plans: ['planId1']
14
+ },
15
+ header: {
16
+ alg: 'RS256',
17
+ kid: 'kid'
18
+ }
19
+ };
20
+ describe('validateSubscription', () => {
21
+ let parseContentpassTokenSpy;
22
+ let reportErrorSpy;
23
+ beforeEach(() => {
24
+ parseContentpassTokenSpy = jest.spyOn(ParseContentpassTokenModule, 'default').mockReturnValue(EXAMPLE_CONTENTPASS_TOKEN);
25
+ reportErrorSpy = jest.spyOn(SentryIntegrationModule, 'reportError').mockReturnValue(undefined);
26
+ });
27
+ afterEach(() => {
28
+ jest.resetAllMocks();
29
+ jest.restoreAllMocks();
30
+ });
31
+ it('should return true if the token is valid', () => {
32
+ parseContentpassTokenSpy.mockReturnValue(EXAMPLE_CONTENTPASS_TOKEN);
33
+ const result = validateSubscription('example_contentpass_token');
34
+ expect(result).toBe(true);
35
+ });
36
+ it('should return false and report error if the token is invalid', () => {
37
+ const error = new Error('Invalid token');
38
+ parseContentpassTokenSpy.mockImplementation(() => {
39
+ throw error;
40
+ });
41
+ const result = validateSubscription('example_contentpass_token');
42
+ expect(result).toBe(false);
43
+ expect(reportErrorSpy).toHaveBeenCalledWith(error, {
44
+ msg: 'Failed to validate subscription'
45
+ });
46
+ });
47
+ it('should return false if the user is not authenticated', () => {
48
+ parseContentpassTokenSpy.mockReturnValue({
49
+ ...EXAMPLE_CONTENTPASS_TOKEN,
50
+ body: {
51
+ ...EXAMPLE_CONTENTPASS_TOKEN.body,
52
+ auth: false
53
+ }
54
+ });
55
+ const result = validateSubscription('example_contentpass_token');
56
+ expect(result).toBe(false);
57
+ });
58
+ it('should return false if the user has no plans', () => {
59
+ parseContentpassTokenSpy.mockReturnValue({
60
+ ...EXAMPLE_CONTENTPASS_TOKEN,
61
+ body: {
62
+ ...EXAMPLE_CONTENTPASS_TOKEN.body,
63
+ plans: []
64
+ }
65
+ });
66
+ const result = validateSubscription('example_contentpass_token');
67
+ expect(result).toBe(false);
68
+ });
69
+ });
70
+ //# sourceMappingURL=validateSubscription.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ParseContentpassTokenModule","SentryIntegrationModule","validateSubscription","EXAMPLE_CONTENTPASS_TOKEN","body","aud","auth","exp","iat","type","plans","header","alg","kid","describe","parseContentpassTokenSpy","reportErrorSpy","beforeEach","jest","spyOn","mockReturnValue","undefined","afterEach","resetAllMocks","restoreAllMocks","it","result","expect","toBe","error","Error","mockImplementation","toHaveBeenCalledWith","msg"],"sourceRoot":"../../../src","sources":["contentpassTokenUtils/validateSubscription.test.ts"],"mappings":";;AAAA,OAA8B,KAAKA,2BAA2B,MAAM,4BAAyB;AAC7F,OAAO,KAAKC,uBAAuB,MAAM,yBAAsB;AAC/D,OAAOC,oBAAoB,MAAM,2BAAwB;AAEzD,MAAMC,yBAAmE,GAAG;EAC1EC,IAAI,EAAE;IACJC,GAAG,EAAE,UAAU;IACfC,IAAI,EAAE,IAAI;IACVC,GAAG,EAAE,UAAU;IACfC,GAAG,EAAE,UAAU;IACfC,IAAI,EAAE,IAAI;IACVC,KAAK,EAAE,CAAC,SAAS;EACnB,CAAC;EACDC,MAAM,EAAE;IACNC,GAAG,EAAE,OAAO;IACZC,GAAG,EAAE;EACP;AACF,CAAC;AAEDC,QAAQ,CAAC,sBAAsB,EAAE,MAAM;EACrC,IAAIC,wBAA0C;EAC9C,IAAIC,cAAgC;EAEpCC,UAAU,CAAC,MAAM;IACfF,wBAAwB,GAAGG,IAAI,CAC5BC,KAAK,CAACnB,2BAA2B,EAAE,SAAS,CAAC,CAC7CoB,eAAe,CAACjB,yBAAyB,CAAC;IAE7Ca,cAAc,GAAGE,IAAI,CAClBC,KAAK,CAAClB,uBAAuB,EAAE,aAAa,CAAC,CAC7CmB,eAAe,CAACC,SAAS,CAAC;EAC/B,CAAC,CAAC;EAEFC,SAAS,CAAC,MAAM;IACdJ,IAAI,CAACK,aAAa,CAAC,CAAC;IACpBL,IAAI,CAACM,eAAe,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFC,EAAE,CAAC,0CAA0C,EAAE,MAAM;IACnDV,wBAAwB,CAACK,eAAe,CAACjB,yBAAyB,CAAC;IACnE,MAAMuB,MAAM,GAAGxB,oBAAoB,CAAC,2BAA2B,CAAC;IAEhEyB,MAAM,CAACD,MAAM,CAAC,CAACE,IAAI,CAAC,IAAI,CAAC;EAC3B,CAAC,CAAC;EAEFH,EAAE,CAAC,8DAA8D,EAAE,MAAM;IACvE,MAAMI,KAAK,GAAG,IAAIC,KAAK,CAAC,eAAe,CAAC;IACxCf,wBAAwB,CAACgB,kBAAkB,CAAC,MAAM;MAChD,MAAMF,KAAK;IACb,CAAC,CAAC;IACF,MAAMH,MAAM,GAAGxB,oBAAoB,CAAC,2BAA2B,CAAC;IAEhEyB,MAAM,CAACD,MAAM,CAAC,CAACE,IAAI,CAAC,KAAK,CAAC;IAC1BD,MAAM,CAACX,cAAc,CAAC,CAACgB,oBAAoB,CAACH,KAAK,EAAE;MACjDI,GAAG,EAAE;IACP,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFR,EAAE,CAAC,sDAAsD,EAAE,MAAM;IAC/DV,wBAAwB,CAACK,eAAe,CAAC;MACvC,GAAGjB,yBAAyB;MAC5BC,IAAI,EAAE;QACJ,GAAGD,yBAAyB,CAACC,IAAI;QACjCE,IAAI,EAAE;MACR;IACF,CAAC,CAAC;IACF,MAAMoB,MAAM,GAAGxB,oBAAoB,CAAC,2BAA2B,CAAC;IAEhEyB,MAAM,CAACD,MAAM,CAAC,CAACE,IAAI,CAAC,KAAK,CAAC;EAC5B,CAAC,CAAC;EAEFH,EAAE,CAAC,8CAA8C,EAAE,MAAM;IACvDV,wBAAwB,CAACK,eAAe,CAAC;MACvC,GAAGjB,yBAAyB;MAC5BC,IAAI,EAAE;QACJ,GAAGD,yBAAyB,CAACC,IAAI;QACjCM,KAAK,EAAE;MACT;IACF,CAAC,CAAC;IACF,MAAMgB,MAAM,GAAGxB,oBAAoB,CAAC,2BAA2B,CAAC;IAEhEyB,MAAM,CAACD,MAAM,CAAC,CAACE,IAAI,CAAC,KAAK,CAAC;EAC5B,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ import sendPageViewEvent from "./sendPageViewEvent.js";
4
+ describe('sendPageViewEvent', () => {
5
+ const apiUrl = 'https://api.example.com';
6
+ const payload = {
7
+ propertyId: 'property123',
8
+ impressionId: 'impression456',
9
+ accessToken: 'token789'
10
+ };
11
+ afterEach(() => {
12
+ jest.resetAllMocks();
13
+ jest.restoreAllMocks();
14
+ });
15
+ it('should send a page view event successfully', async () => {
16
+ jest.spyOn(global, 'fetch').mockResolvedValue({
17
+ ok: true
18
+ });
19
+ const response = await sendPageViewEvent(apiUrl, payload);
20
+ expect(response.ok).toBe(true);
21
+ expect(global.fetch).toHaveBeenCalledWith(`${apiUrl}/pass/hit?pid=${payload.propertyId}&iid=${payload.impressionId}&t=pageview`, {
22
+ headers: {
23
+ Authorization: `Bearer ${payload.accessToken}`
24
+ }
25
+ });
26
+ });
27
+ it('should throw an error if the fetch fails', async () => {
28
+ jest.spyOn(global, 'fetch').mockResolvedValue({
29
+ ok: false
30
+ });
31
+ await expect(sendPageViewEvent(apiUrl, payload)).rejects.toThrow('Failed send page view event');
32
+ });
33
+ });
34
+ //# sourceMappingURL=sendPageViewEvent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["sendPageViewEvent","describe","apiUrl","payload","propertyId","impressionId","accessToken","afterEach","jest","resetAllMocks","restoreAllMocks","it","spyOn","global","mockResolvedValue","ok","response","expect","toBe","fetch","toHaveBeenCalledWith","headers","Authorization","rejects","toThrow"],"sourceRoot":"../../../src","sources":["countImpressionUtils/sendPageViewEvent.test.ts"],"mappings":";;AAAA,OAAOA,iBAAiB,MAAM,wBAAqB;AAEnDC,QAAQ,CAAC,mBAAmB,EAAE,MAAM;EAClC,MAAMC,MAAM,GAAG,yBAAyB;EACxC,MAAMC,OAAO,GAAG;IACdC,UAAU,EAAE,aAAa;IACzBC,YAAY,EAAE,eAAe;IAC7BC,WAAW,EAAE;EACf,CAAC;EAEDC,SAAS,CAAC,MAAM;IACdC,IAAI,CAACC,aAAa,CAAC,CAAC;IACpBD,IAAI,CAACE,eAAe,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFC,EAAE,CAAC,4CAA4C,EAAE,YAAY;IAC3DH,IAAI,CAACI,KAAK,CAACC,MAAM,EAAE,OAAO,CAAC,CAACC,iBAAiB,CAAC;MAC5CC,EAAE,EAAE;IACN,CAAQ,CAAC;IAET,MAAMC,QAAQ,GAAG,MAAMhB,iBAAiB,CAACE,MAAM,EAAEC,OAAO,CAAC;IAEzDc,MAAM,CAACD,QAAQ,CAACD,EAAE,CAAC,CAACG,IAAI,CAAC,IAAI,CAAC;IAC9BD,MAAM,CAACJ,MAAM,CAACM,KAAK,CAAC,CAACC,oBAAoB,CACvC,GAAGlB,MAAM,iBAAiBC,OAAO,CAACC,UAAU,QAAQD,OAAO,CAACE,YAAY,aAAa,EACrF;MACEgB,OAAO,EAAE;QACPC,aAAa,EAAE,UAAUnB,OAAO,CAACG,WAAW;MAC9C;IACF,CACF,CAAC;EACH,CAAC,CAAC;EAEFK,EAAE,CAAC,0CAA0C,EAAE,YAAY;IACzDH,IAAI,CAACI,KAAK,CAACC,MAAM,EAAE,OAAO,CAAC,CAACC,iBAAiB,CAAC;MAC5CC,EAAE,EAAE;IACN,CAAQ,CAAC;IAET,MAAME,MAAM,CAACjB,iBAAiB,CAACE,MAAM,EAAEC,OAAO,CAAC,CAAC,CAACoB,OAAO,CAACC,OAAO,CAC9D,6BACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  export default async function sendStats(apiUrl, payload) {
4
- const response = await fetch(`${apiUrl}/stats`, {
4
+ const response = await fetch(`${apiUrl}/signal`, {
5
5
  method: 'POST',
6
6
  headers: {
7
7
  'Content-Type': 'application/json; charset=UTF-8'
@@ -1 +1 @@
1
- {"version":3,"names":["sendStats","apiUrl","payload","response","fetch","method","headers","body","JSON","stringify","ok","Error","statusText"],"sourceRoot":"../../../src","sources":["countImpressionUtils/sendStats.ts"],"mappings":";;AAQA,eAAe,eAAeA,SAASA,CAACC,MAAc,EAAEC,OAAqB,EAAE;EAC7E,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAAC,GAAGH,MAAM,QAAQ,EAAE;IAC9CI,MAAM,EAAE,MAAM;IACdC,OAAO,EAAE;MACP,cAAc,EAAE;IAClB,CAAC;IACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAACP,OAAO;EAC9B,CAAC,CAAC;EAEF,IAAI,CAACC,QAAQ,CAACO,EAAE,EAAE;IAChB,MAAM,IAAIC,KAAK,CAAC,iCAAiCR,QAAQ,CAACS,UAAU,EAAE,CAAC;EACzE;EAEA,OAAOT,QAAQ;AACjB","ignoreList":[]}
1
+ {"version":3,"names":["sendStats","apiUrl","payload","response","fetch","method","headers","body","JSON","stringify","ok","Error","statusText"],"sourceRoot":"../../../src","sources":["countImpressionUtils/sendStats.ts"],"mappings":";;AASA,eAAe,eAAeA,SAASA,CAACC,MAAc,EAAEC,OAAqB,EAAE;EAC7E,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAAC,GAAGH,MAAM,SAAS,EAAE;IAC/CI,MAAM,EAAE,MAAM;IACdC,OAAO,EAAE;MACP,cAAc,EAAE;IAClB,CAAC;IACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAACP,OAAO;EAC9B,CAAC,CAAC;EAEF,IAAI,CAACC,QAAQ,CAACO,EAAE,EAAE;IAChB,MAAM,IAAIC,KAAK,CAAC,iCAAiCR,QAAQ,CAACS,UAAU,EAAE,CAAC;EACzE;EAEA,OAAOT,QAAQ;AACjB","ignoreList":[]}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ import sendStats from "./sendStats.js";
4
+ describe('sendStats', () => {
5
+ const apiUrl = 'https://api.example.com';
6
+ const payload = {
7
+ ea: 'eventAction',
8
+ ec: 'eventCategory',
9
+ cpabid: 'cpabid123',
10
+ cppid: 'cppid456',
11
+ cpsr: 1
12
+ };
13
+ afterEach(() => {
14
+ jest.resetAllMocks();
15
+ jest.restoreAllMocks();
16
+ });
17
+ it('should send stats successfully', async () => {
18
+ jest.spyOn(global, 'fetch').mockResolvedValue({
19
+ ok: true
20
+ });
21
+ const response = await sendStats(apiUrl, payload);
22
+ expect(response.ok).toBe(true);
23
+ expect(global.fetch).toHaveBeenCalledWith(`${apiUrl}/signal`, {
24
+ method: 'POST',
25
+ headers: {
26
+ 'Content-Type': 'application/json; charset=UTF-8'
27
+ },
28
+ body: JSON.stringify(payload)
29
+ });
30
+ });
31
+ it('should throw an error if the fetch fails', async () => {
32
+ jest.spyOn(global, 'fetch').mockResolvedValue({
33
+ ok: false
34
+ });
35
+ await expect(sendStats(apiUrl, payload)).rejects.toThrow('Failed to send stats');
36
+ });
37
+ });
38
+ //# sourceMappingURL=sendStats.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["sendStats","describe","apiUrl","payload","ea","ec","cpabid","cppid","cpsr","afterEach","jest","resetAllMocks","restoreAllMocks","it","spyOn","global","mockResolvedValue","ok","response","expect","toBe","fetch","toHaveBeenCalledWith","method","headers","body","JSON","stringify","rejects","toThrow"],"sourceRoot":"../../../src","sources":["countImpressionUtils/sendStats.test.ts"],"mappings":";;AAAA,OAAOA,SAAS,MAAM,gBAAa;AAEnCC,QAAQ,CAAC,WAAW,EAAE,MAAM;EAC1B,MAAMC,MAAM,GAAG,yBAAyB;EACxC,MAAMC,OAAO,GAAG;IACdC,EAAE,EAAE,aAAa;IACjBC,EAAE,EAAE,eAAe;IACnBC,MAAM,EAAE,WAAW;IACnBC,KAAK,EAAE,UAAU;IACjBC,IAAI,EAAE;EACR,CAAC;EAEDC,SAAS,CAAC,MAAM;IACdC,IAAI,CAACC,aAAa,CAAC,CAAC;IACpBD,IAAI,CAACE,eAAe,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFC,EAAE,CAAC,gCAAgC,EAAE,YAAY;IAC/CH,IAAI,CAACI,KAAK,CAACC,MAAM,EAAE,OAAO,CAAC,CAACC,iBAAiB,CAAC;MAC5CC,EAAE,EAAE;IACN,CAAQ,CAAC;IAET,MAAMC,QAAQ,GAAG,MAAMlB,SAAS,CAACE,MAAM,EAAEC,OAAO,CAAC;IAEjDgB,MAAM,CAACD,QAAQ,CAACD,EAAE,CAAC,CAACG,IAAI,CAAC,IAAI,CAAC;IAC9BD,MAAM,CAACJ,MAAM,CAACM,KAAK,CAAC,CAACC,oBAAoB,CAAC,GAAGpB,MAAM,SAAS,EAAE;MAC5DqB,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE;QACP,cAAc,EAAE;MAClB,CAAC;MACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAACxB,OAAO;IAC9B,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFU,EAAE,CAAC,0CAA0C,EAAE,YAAY;IACzDH,IAAI,CAACI,KAAK,CAACC,MAAM,EAAE,OAAO,CAAC,CAACC,iBAAiB,CAAC;MAC5CC,EAAE,EAAE;IACN,CAAQ,CAAC;IAET,MAAME,MAAM,CAACnB,SAAS,CAACE,MAAM,EAAEC,OAAO,CAAC,CAAC,CAACyB,OAAO,CAACC,OAAO,CACtD,sBACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
 
3
- export { ContentpassStateType } from "./types/ContentpassState.js";
4
- export { ContentpassSdkProvider } from "./sdkContext/ContentpassSdkProvider.js";
5
- export { default as useContentpassSdk } from "./sdkContext/useContentpassSdk.js";
3
+ import { ContentpassStateType } from "./types/ContentpassState.js";
4
+ const FOOBAR = 123;
5
+ export { FOOBAR };
6
+ import { ContentpassSdkProvider } from "./sdkContext/ContentpassSdkProvider.js";
7
+ import { default as useContentpassSdk } from "./sdkContext/useContentpassSdk.js";
8
+ export { ContentpassStateType, ContentpassSdkProvider, useContentpassSdk };
6
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ContentpassStateType","ContentpassSdkProvider","default","useContentpassSdk"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAQA,SAASA,oBAAoB,QAAQ,6BAA0B;AAS/D,SAASC,sBAAsB,QAAQ,wCAAqC;AAE5E,SAASC,OAAO,IAAIC,iBAAiB,QAAQ,mCAAgC","ignoreList":[]}
1
+ {"version":3,"names":["ContentpassStateType","FOOBAR","ContentpassSdkProvider","default","useContentpassSdk"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAQA,SAASA,oBAAoB,QAAQ,6BAA0B;AAK/D,MAAMC,MAAM,GAAG,GAAG;AAElB,SAASA,MAAM;AAOf,SAASC,sBAAsB,QAAQ,wCAAqC;AAE5E,SAASC,OAAO,IAAIC,iBAAiB,QAAQ,mCAAgC;AAE7E,SAASJ,oBAAoB,EAAEE,sBAAsB,EAAEE,iBAAiB","ignoreList":[]}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+
3
+ import log, { enableLogger } from "./logger.js";
4
+ import { logger } from 'react-native-logs';
5
+ jest.mock('react-native-logs', () => {
6
+ return {
7
+ consoleTransport: jest.fn(),
8
+ logger: {
9
+ createLogger: jest.fn().mockReturnValue({
10
+ setSeverity: jest.fn(),
11
+ enable: jest.fn(),
12
+ debug: jest.fn()
13
+ })
14
+ }
15
+ };
16
+ });
17
+ describe('Logger', () => {
18
+ afterEach(() => {
19
+ jest.resetAllMocks();
20
+ jest.restoreAllMocks();
21
+ });
22
+ it('should create a disabled logger', () => {
23
+ expect(logger.createLogger).toHaveBeenCalledWith({
24
+ enabled: false,
25
+ transport: expect.any(Function),
26
+ transportOptions: expect.any(Object)
27
+ });
28
+ });
29
+ it('should enable the logger with the correct severity', () => {
30
+ const severity = 'info';
31
+ const setSeveritySpy = jest.spyOn(log, 'setSeverity');
32
+ const enableSpy = jest.spyOn(log, 'enable');
33
+ const debugSpy = jest.spyOn(log, 'debug');
34
+ enableLogger(severity);
35
+ expect(setSeveritySpy).toHaveBeenCalledWith(severity);
36
+ expect(enableSpy).toHaveBeenCalled();
37
+ expect(debugSpy).toHaveBeenCalledWith('Logger enabled with severity', severity);
38
+ });
39
+ });
40
+ //# sourceMappingURL=logger.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["log","enableLogger","logger","jest","mock","consoleTransport","fn","createLogger","mockReturnValue","setSeverity","enable","debug","describe","afterEach","resetAllMocks","restoreAllMocks","it","expect","toHaveBeenCalledWith","enabled","transport","any","Function","transportOptions","Object","severity","setSeveritySpy","spyOn","enableSpy","debugSpy","toHaveBeenCalled"],"sourceRoot":"../../src","sources":["logger.test.ts"],"mappings":";;AAAA,OAAOA,GAAG,IAAIC,YAAY,QAAQ,aAAU;AAE5C,SAASC,MAAM,QAAQ,mBAAmB;AAE1CC,IAAI,CAACC,IAAI,CAAC,mBAAmB,EAAE,MAAM;EACnC,OAAO;IACLC,gBAAgB,EAAEF,IAAI,CAACG,EAAE,CAAC,CAAC;IAC3BJ,MAAM,EAAE;MACNK,YAAY,EAAEJ,IAAI,CAACG,EAAE,CAAC,CAAC,CAACE,eAAe,CAAC;QACtCC,WAAW,EAAEN,IAAI,CAACG,EAAE,CAAC,CAAC;QACtBI,MAAM,EAAEP,IAAI,CAACG,EAAE,CAAC,CAAC;QACjBK,KAAK,EAAER,IAAI,CAACG,EAAE,CAAC;MACjB,CAAC;IACH;EACF,CAAC;AACH,CAAC,CAAC;AAEFM,QAAQ,CAAC,QAAQ,EAAE,MAAM;EACvBC,SAAS,CAAC,MAAM;IACdV,IAAI,CAACW,aAAa,CAAC,CAAC;IACpBX,IAAI,CAACY,eAAe,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFC,EAAE,CAAC,iCAAiC,EAAE,MAAM;IAC1CC,MAAM,CAACf,MAAM,CAACK,YAAY,CAAC,CAACW,oBAAoB,CAAC;MAC/CC,OAAO,EAAE,KAAK;MACdC,SAAS,EAAEH,MAAM,CAACI,GAAG,CAACC,QAAQ,CAAC;MAC/BC,gBAAgB,EAAEN,MAAM,CAACI,GAAG,CAACG,MAAM;IACrC,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFR,EAAE,CAAC,oDAAoD,EAAE,MAAM;IAC7D,MAAMS,QAAkB,GAAG,MAAM;IACjC,MAAMC,cAAc,GAAGvB,IAAI,CAACwB,KAAK,CAAC3B,GAAG,EAAE,aAAa,CAAC;IACrD,MAAM4B,SAAS,GAAGzB,IAAI,CAACwB,KAAK,CAAC3B,GAAG,EAAE,QAAQ,CAAC;IAC3C,MAAM6B,QAAQ,GAAG1B,IAAI,CAACwB,KAAK,CAAC3B,GAAG,EAAE,OAAO,CAAC;IAEzCC,YAAY,CAACwB,QAAQ,CAAC;IAEtBR,MAAM,CAACS,cAAc,CAAC,CAACR,oBAAoB,CAACO,QAAQ,CAAC;IACrDR,MAAM,CAACW,SAAS,CAAC,CAACE,gBAAgB,CAAC,CAAC;IACpCb,MAAM,CAACY,QAAQ,CAAC,CAACX,oBAAoB,CACnC,8BAA8B,EAC9BO,QACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ import { ContentpassSdkProvider } from "./ContentpassSdkProvider.js";
4
+ import { Text } from 'react-native';
5
+ import { render, screen } from '@testing-library/react-native';
6
+ import Contentpass from "../Contentpass.js";
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ jest.mock('../Contentpass');
9
+ describe('ContentpassSdkProvider', () => {
10
+ const mockConfig = {
11
+ issuer: 'https://my.contentpass.me',
12
+ propertyId: 'my-property-id',
13
+ planId: 'my-plan-id',
14
+ redirectUrl: 'de.contentpass.test://oauth',
15
+ apiUrl: 'https://cp.propert.com'
16
+ };
17
+ afterEach(() => {
18
+ jest.resetAllMocks();
19
+ });
20
+ it('initializes Contentpass SDK with the given configuration', () => {
21
+ render(/*#__PURE__*/_jsx(ContentpassSdkProvider, {
22
+ contentpassConfig: mockConfig,
23
+ children: /*#__PURE__*/_jsx(Text, {
24
+ testID: "child",
25
+ children: "Test Child"
26
+ })
27
+ }));
28
+ expect(Contentpass).toHaveBeenCalledWith(mockConfig);
29
+ expect(screen.getByTestId('child')).toHaveTextContent('Test Child');
30
+ });
31
+ });
32
+ //# sourceMappingURL=ContentpassSdkProvder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ContentpassSdkProvider","Text","render","screen","Contentpass","jsx","_jsx","jest","mock","describe","mockConfig","issuer","propertyId","planId","redirectUrl","apiUrl","afterEach","resetAllMocks","it","contentpassConfig","children","testID","expect","toHaveBeenCalledWith","getByTestId","toHaveTextContent"],"sourceRoot":"../../../src","sources":["sdkContext/ContentpassSdkProvder.test.tsx"],"mappings":";;AAAA,SAASA,sBAAsB,QAAQ,6BAA0B;AAEjE,SAASC,IAAI,QAAQ,cAAc;AACnC,SAASC,MAAM,EAAEC,MAAM,QAAQ,+BAA+B;AAC9D,OAAOC,WAAW,MAAM,mBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEzCC,IAAI,CAACC,IAAI,CAAC,gBAAgB,CAAC;AAE3BC,QAAQ,CAAC,wBAAwB,EAAE,MAAM;EACvC,MAAMC,UAA6B,GAAG;IACpCC,MAAM,EAAE,2BAA2B;IACnCC,UAAU,EAAE,gBAAgB;IAC5BC,MAAM,EAAE,YAAY;IACpBC,WAAW,EAAE,6BAA6B;IAC1CC,MAAM,EAAE;EACV,CAAC;EAEDC,SAAS,CAAC,MAAM;IACdT,IAAI,CAACU,aAAa,CAAC,CAAC;EACtB,CAAC,CAAC;EAEFC,EAAE,CAAC,0DAA0D,EAAE,MAAM;IACnEhB,MAAM,cACJI,IAAA,CAACN,sBAAsB;MAACmB,iBAAiB,EAAET,UAAW;MAAAU,QAAA,eACpDd,IAAA,CAACL,IAAI;QAACoB,MAAM,EAAC,OAAO;QAAAD,QAAA,EAAC;MAAU,CAAM;IAAC,CAChB,CAC1B,CAAC;IAEDE,MAAM,CAAClB,WAAW,CAAC,CAACmB,oBAAoB,CAACb,UAAU,CAAC;IACpDY,MAAM,CAACnB,MAAM,CAACqB,WAAW,CAAC,OAAO,CAAC,CAAC,CAACC,iBAAiB,CAAC,YAAY,CAAC;EACrE,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ import React from 'react';
4
+ import { renderHook } from '@testing-library/react-native';
5
+ import useContentpassSdk from "./useContentpassSdk.js";
6
+ import { contentpassSdkContext } from "./ContentpassSdkProvider.js";
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ describe('useContentpassSdk', () => {
9
+ afterEach(() => {
10
+ jest.resetAllMocks();
11
+ jest.restoreAllMocks();
12
+ });
13
+ it('should return the contentpassSdk from the context', () => {
14
+ const contentpassSdk = 'contentpassSdk';
15
+ const wrapper = ({
16
+ children
17
+ }) => /*#__PURE__*/_jsx(contentpassSdkContext.Provider, {
18
+ value: contentpassSdk,
19
+ children: children
20
+ });
21
+ const {
22
+ result
23
+ } = renderHook(() => useContentpassSdk(), {
24
+ wrapper
25
+ });
26
+ expect(result.current).toBe(contentpassSdk);
27
+ });
28
+ it('should throw an error if used outside of a ContentpassSdkProvider', async () => {
29
+ // mock console.error to prevent error output in test
30
+ jest.spyOn(console, 'error').mockImplementation(() => {});
31
+ expect(() => {
32
+ renderHook(() => useContentpassSdk());
33
+ }).toThrow('useContentpassSdk must be used within a ContentpassSdkProvider');
34
+ });
35
+ });
36
+ //# sourceMappingURL=useContentpassSdk.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","renderHook","useContentpassSdk","contentpassSdkContext","jsx","_jsx","describe","afterEach","jest","resetAllMocks","restoreAllMocks","it","contentpassSdk","wrapper","children","Provider","value","result","expect","current","toBe","spyOn","console","mockImplementation","toThrow"],"sourceRoot":"../../../src","sources":["sdkContext/useContentpassSdk.test.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,UAAU,QAAQ,+BAA+B;AAC1D,OAAOC,iBAAiB,MAAM,wBAAqB;AACnD,SAASC,qBAAqB,QAAQ,6BAA0B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAGjEC,QAAQ,CAAC,mBAAmB,EAAE,MAAM;EAClCC,SAAS,CAAC,MAAM;IACdC,IAAI,CAACC,aAAa,CAAC,CAAC;IACpBD,IAAI,CAACE,eAAe,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFC,EAAE,CAAC,mDAAmD,EAAE,MAAM;IAC5D,MAAMC,cAAc,GAAG,gBAAgB;IACvC,MAAMC,OAAO,GAAGA,CAAC;MAAEC;IAAwC,CAAC,kBAC1DT,IAAA,CAACF,qBAAqB,CAACY,QAAQ;MAC7BC,KAAK,EAAEJ,cAAqC;MAAAE,QAAA,EAE3CA;IAAQ,CACqB,CACjC;IAED,MAAM;MAAEG;IAAO,CAAC,GAAGhB,UAAU,CAAC,MAAMC,iBAAiB,CAAC,CAAC,EAAE;MAAEW;IAAQ,CAAC,CAAC;IAErEK,MAAM,CAACD,MAAM,CAACE,OAAO,CAAC,CAACC,IAAI,CAACR,cAAc,CAAC;EAC7C,CAAC,CAAC;EAEFD,EAAE,CAAC,mEAAmE,EAAE,YAAY;IAClF;IACAH,IAAI,CAACa,KAAK,CAACC,OAAO,EAAE,OAAO,CAAC,CAACC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzDL,MAAM,CAAC,MAAM;MACXjB,UAAU,CAAC,MAAMC,iBAAiB,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAACsB,OAAO,CACR,gEACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ import { useEffect, useState } from 'react';
4
+ import useContentpassSdk from "./useContentpassSdk.js";
5
+ import { ContentpassStateType } from "../types/ContentpassState.js";
6
+ const useContentpassState = () => {
7
+ const sdk = useContentpassSdk();
8
+ const [state, setState] = useState({
9
+ state: ContentpassStateType.INITIALISING
10
+ });
11
+ useEffect(() => {
12
+ const observer = nextState => setState(nextState);
13
+ sdk.registerObserver(observer);
14
+ return () => {
15
+ sdk.unregisterObserver(observer);
16
+ };
17
+ }, [sdk]);
18
+ return state;
19
+ };
20
+ export default useContentpassState;
21
+ //# sourceMappingURL=useContentpassState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useState","useContentpassSdk","ContentpassStateType","useContentpassState","sdk","state","setState","INITIALISING","observer","nextState","registerObserver","unregisterObserver"],"sourceRoot":"../../../src","sources":["sdkContext/useContentpassState.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC3C,OAAOC,iBAAiB,MAAM,wBAAqB;AACnD,SAEEC,oBAAoB,QACf,8BAA2B;AAElC,MAAMC,mBAAmB,GAAGA,CAAA,KAAM;EAChC,MAAMC,GAAG,GAAGH,iBAAiB,CAAC,CAAC;EAC/B,MAAM,CAACI,KAAK,EAAEC,QAAQ,CAAC,GAAGN,QAAQ,CAAmB;IACnDK,KAAK,EAAEH,oBAAoB,CAACK;EAC9B,CAAC,CAAC;EAEFR,SAAS,CAAC,MAAM;IACd,MAAMS,QAAQ,GAAIC,SAA2B,IAAKH,QAAQ,CAACG,SAAS,CAAC;IACrEL,GAAG,CAACM,gBAAgB,CAACF,QAAQ,CAAC;IAE9B,OAAO,MAAM;MACXJ,GAAG,CAACO,kBAAkB,CAACH,QAAQ,CAAC;IAClC,CAAC;EACH,CAAC,EAAE,CAACJ,GAAG,CAAC,CAAC;EAET,OAAOC,KAAK;AACd,CAAC;AAED,eAAeF,mBAAmB","ignoreList":[]}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+
3
+ import { defaultStackParser, makeFetchTransport } from '@sentry/react';
4
+ import * as SentryReactNativeModule from '@sentry/react-native';
5
+ import { __internal_reset_sentry_scope, initSentry, reportError } from "./sentryIntegration.js";
6
+ import logger from "./logger.js";
7
+ jest.mock('react-native', () => {
8
+ return {
9
+ Platform: {
10
+ OS: 'android',
11
+ Version: '10.1.2'
12
+ }
13
+ };
14
+ });
15
+ describe('sentryIntegration', () => {
16
+ let addBreadcrumbMock;
17
+ let captureExceptionMock;
18
+ let setTagsMock;
19
+ let ReactNativeClientSpy;
20
+ let ScopeSpy;
21
+ beforeEach(() => {
22
+ addBreadcrumbMock = jest.fn();
23
+ captureExceptionMock = jest.fn();
24
+ setTagsMock = jest.fn();
25
+ ScopeSpy = jest.spyOn(SentryReactNativeModule, 'Scope').mockReturnValue({
26
+ setClient: jest.fn(),
27
+ init: jest.fn(),
28
+ addBreadcrumb: addBreadcrumbMock,
29
+ captureException: captureExceptionMock,
30
+ setTags: setTagsMock
31
+ });
32
+ ReactNativeClientSpy = jest.spyOn(SentryReactNativeModule, 'ReactNativeClient').mockImplementation(() => ({
33
+ init: jest.fn()
34
+ }));
35
+ jest.spyOn(logger, 'error').mockImplementation(() => {});
36
+ jest.spyOn(logger, 'warn').mockImplementation(() => {});
37
+ });
38
+ afterEach(() => {
39
+ jest.restoreAllMocks();
40
+ jest.resetAllMocks();
41
+ __internal_reset_sentry_scope();
42
+ });
43
+ it('should not initialise sentry scope if already initialised', () => {
44
+ initSentry({
45
+ propertyId: 'test-id'
46
+ });
47
+ initSentry({
48
+ propertyId: 'test-id'
49
+ });
50
+ expect(logger.warn).toHaveBeenCalledWith('Sentry already initialized');
51
+ expect(ReactNativeClientSpy).toHaveBeenCalledTimes(1);
52
+ expect(ScopeSpy).toHaveBeenCalledTimes(1);
53
+ });
54
+ it('should initialise sentry scope with correct options', () => {
55
+ initSentry({
56
+ propertyId: 'test-id'
57
+ });
58
+ expect(ReactNativeClientSpy).toHaveBeenCalledWith({
59
+ attachStacktrace: true,
60
+ autoInitializeNativeSdk: false,
61
+ dsn: 'https://74ab84b55b30a3800255a25eac4d089c@sentry.tools.contentpass.dev/8',
62
+ enableAppStartTracking: false,
63
+ enableAutoPerformanceTracing: false,
64
+ enableCaptureFailedRequests: false,
65
+ enableNative: false,
66
+ enableNativeCrashHandling: false,
67
+ enableNativeFramesTracking: false,
68
+ enableNativeNagger: false,
69
+ enableNdk: false,
70
+ enableStallTracking: true,
71
+ enableUserInteractionTracing: false,
72
+ enableWatchdogTerminationTracking: false,
73
+ environment: 'development',
74
+ maxQueueSize: 30,
75
+ parentSpanIsAlwaysRootSpan: true,
76
+ patchGlobalPromise: true,
77
+ sendClientReports: true,
78
+ integrations: undefined,
79
+ stackParser: defaultStackParser,
80
+ transport: makeFetchTransport
81
+ });
82
+ expect(setTagsMock).toHaveBeenCalledWith({
83
+ OS: 'android',
84
+ platformVersion: '10.1.2',
85
+ propertyId: 'test-id'
86
+ });
87
+ });
88
+ describe('reportError', () => {
89
+ it('should add breadcrumb with message if provided', () => {
90
+ initSentry({
91
+ propertyId: 'test-id'
92
+ });
93
+ const err = new Error('test');
94
+ const msg = 'test message';
95
+ reportError(err, {
96
+ msg
97
+ });
98
+ expect(addBreadcrumbMock).toHaveBeenCalledWith({
99
+ category: 'Error',
100
+ message: msg,
101
+ level: 'log'
102
+ });
103
+ expect(captureExceptionMock).toHaveBeenCalledWith(err);
104
+ });
105
+ it('should not add breadcrumb if message is not provided', () => {
106
+ initSentry({
107
+ propertyId: 'test-id'
108
+ });
109
+ const err = new Error('test');
110
+ reportError(err);
111
+ expect(addBreadcrumbMock).not.toHaveBeenCalled();
112
+ expect(captureExceptionMock).toHaveBeenCalledWith(err);
113
+ });
114
+ it('should not throw error when reportError is called before initSentry', () => {
115
+ const err = new Error('test');
116
+ const msg = 'test message';
117
+ reportError(err, {
118
+ msg
119
+ });
120
+ expect(logger.error).toHaveBeenCalledWith({
121
+ err
122
+ }, msg);
123
+ expect(addBreadcrumbMock).not.toHaveBeenCalled();
124
+ expect(captureExceptionMock).not.toHaveBeenCalledWith(err);
125
+ });
126
+ });
127
+ });
128
+ //# sourceMappingURL=sentryIntegration.test.js.map