@playpilot/tpi 7.0.0 → 7.0.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playpilot/tpi",
3
- "version": "7.0.0",
3
+ "version": "7.0.1",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "dev": "vite dev",
package/src/main.ts CHANGED
@@ -86,12 +86,13 @@ window.PlayPilotLinkInjections = {
86
86
 
87
87
  const script = document.createElement('script')
88
88
 
89
+ script.id = 'playpilot-mount'
89
90
  script.src = `https://cdn.jsdelivr.net/npm/@playpilot/tpi@${__SCRIPT_VERSION__}/dist/${shouldLoadEditorial ? 'editorial.' : ''}mount.js`
90
91
  // script.src = './dist/mount.js' // Use me during development of this script
91
92
 
92
93
  script.onload = () => window.PlayPilotMount?.mount()
93
94
 
94
- if (process.env.NODE_ENV !== 'test') document.body.insertAdjacentElement('beforeend', script)
95
+ document.body.appendChild(script)
95
96
  },
96
97
  }
97
98
 
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { SplitTest } from '$lib/enums/SplitTest'
3
+ import { getPageTextAndElements } from '$lib/injectionElements'
3
4
  import { getFullUrlPath } from '$lib/url'
4
5
  import { onDestroy } from 'svelte'
5
6
 
@@ -160,6 +161,11 @@
160
161
 
161
162
  <hr />
162
163
 
164
+ <button onclick={() => console.log(getPageTextAndElements(window.PlayPilotLinkInjections.config))}>Output elements in console</button>
165
+ <button onclick={() => console.log(getPageTextAndElements(window.PlayPilotLinkInjections.config).pageText)}>Output text in console</button>
166
+
167
+ <hr />
168
+
163
169
  <button onclick={onrerender}>Re-inject</button>
164
170
 
165
171
  {#if isUsingBetaScript}
@@ -5,6 +5,7 @@ import { fetchConfig } from '$lib/api/config'
5
5
  import { waitFor } from '@testing-library/svelte'
6
6
  import { isUrlExcludedViaConfig } from '$lib/url'
7
7
  import { pollLinkInjections } from '$lib/api/externalPages'
8
+ import { getAuthToken, isEditorialModeEnabled } from '$lib/api/auth'
8
9
 
9
10
  vi.mock('$lib/consent', () => ({
10
11
  setConsent: vi.fn(),
@@ -23,8 +24,15 @@ vi.mock('$lib/url', () => ({
23
24
  isUrlExcludedViaConfig: vi.fn(),
24
25
  }))
25
26
 
27
+ vi.mock('$lib/api/auth', () => ({
28
+ getAuthToken: vi.fn(),
29
+ isEditorialModeEnabled: vi.fn(),
30
+ }))
31
+
26
32
  describe('main.ts', () => {
27
33
  beforeEach(async () => {
34
+ document.body.innerHTML = ''
35
+
28
36
  fakeFetch()
29
37
 
30
38
  vi.resetModules()
@@ -37,65 +45,99 @@ describe('main.ts', () => {
37
45
  vi.resetModules()
38
46
  })
39
47
 
40
- it('Should not call setConsent when only a token is passed', () => {
41
- window.PlayPilotLinkInjections.initialize({ token: 'a' })
48
+ describe('initialize', () => {
49
+ it('Should not call setConsent when only a token is passed', () => {
50
+ window.PlayPilotLinkInjections.initialize({ token: 'a' })
42
51
 
43
- expect(setConsent).not.toHaveBeenCalled()
52
+ expect(setConsent).not.toHaveBeenCalled()
44
53
 
45
- expect(window.PlayPilotLinkInjections.consents).toEqual({
46
- ads: false,
47
- pixels: false,
48
- tracking: false,
49
- split_tests: false,
50
- affiliate: false,
54
+ expect(window.PlayPilotLinkInjections.consents).toEqual({
55
+ ads: false,
56
+ pixels: false,
57
+ tracking: false,
58
+ split_tests: false,
59
+ affiliate: false,
60
+ })
51
61
  })
52
- })
53
62
 
54
- it('Should call setConsent when require_consent is false', () => {
55
- window.PlayPilotLinkInjections.initialize({ token: 'a', require_consent: false })
63
+ it('Should call setConsent when require_consent is false', () => {
64
+ window.PlayPilotLinkInjections.initialize({ token: 'a', require_consent: false })
56
65
 
57
- expect(setConsent).toHaveBeenCalledWith({
58
- ads: true,
59
- pixels: true,
60
- tracking: true,
61
- split_tests: true,
62
- affiliate: true,
66
+ expect(setConsent).toHaveBeenCalledWith({
67
+ ads: true,
68
+ pixels: true,
69
+ tracking: true,
70
+ split_tests: true,
71
+ affiliate: true,
72
+ })
63
73
  })
64
- })
65
74
 
66
- it('Should call config object and set the result to the window object', async () => {
67
- vi.mocked(fetchConfig).mockResolvedValue({ html_selector: 'some_value' })
75
+ it('Should call config object and set the result to the window object', async () => {
76
+ vi.mocked(fetchConfig).mockResolvedValue({ html_selector: 'some_value' })
68
77
 
69
- window.PlayPilotLinkInjections.initialize({ token: 'a' })
78
+ window.PlayPilotLinkInjections.initialize({ token: 'a' })
70
79
 
71
- expect(fetchConfig).toHaveBeenCalled()
80
+ expect(fetchConfig).toHaveBeenCalled()
72
81
 
73
- await waitFor(() => {
74
- expect(window.PlayPilotLinkInjections.config).toEqual({ html_selector: 'some_value' })
82
+ await waitFor(() => {
83
+ expect(window.PlayPilotLinkInjections.config).toEqual({ html_selector: 'some_value' })
84
+ })
75
85
  })
76
- })
77
86
 
78
- it('Should not call pollLinkInjections if config object excludes page', async () => {
79
- vi.mocked(isUrlExcludedViaConfig).mockReturnValue(true)
87
+ it('Should not call pollLinkInjections if config object excludes page', async () => {
88
+ vi.mocked(isUrlExcludedViaConfig).mockReturnValue(true)
89
+
90
+ window.PlayPilotLinkInjections.initialize({ token: 'a' })
91
+
92
+ expect(fetchConfig).toHaveBeenCalled()
93
+
94
+ await new Promise(res => setTimeout(res))
95
+
96
+ expect(pollLinkInjections).not.toHaveBeenCalled()
97
+ })
98
+
99
+ it('Should call pollLinkInjections if config object does not page', async () => {
100
+ vi.mocked(isUrlExcludedViaConfig).mockReturnValue(false)
80
101
 
81
- window.PlayPilotLinkInjections.initialize({ token: 'a' })
102
+ window.PlayPilotLinkInjections.initialize({ token: 'a' })
82
103
 
83
- expect(fetchConfig).toHaveBeenCalled()
104
+ expect(fetchConfig).toHaveBeenCalled()
84
105
 
85
- await new Promise(res => setTimeout(res))
106
+ await new Promise(res => setTimeout(res))
86
107
 
87
- expect(pollLinkInjections).not.toHaveBeenCalled()
108
+ expect(pollLinkInjections).toHaveBeenCalled()
109
+ })
88
110
  })
89
111
 
90
- it('Should call pollLinkInjections if config object does not page', async () => {
91
- vi.mocked(isUrlExcludedViaConfig).mockReturnValue(false)
112
+ describe('mount', () => {
113
+ it('Should insert script tag', () => {
114
+ window.PlayPilotLinkInjections.mount()
115
+
116
+ expect(document.querySelector('script#playpilot-mount')).toBeTruthy()
117
+ })
118
+
119
+ it('Should insert script tag with editorial mode if editiorial mode is enabled', () => {
120
+ vi.mocked(isEditorialModeEnabled).mockReturnValueOnce(true)
92
121
 
93
- window.PlayPilotLinkInjections.initialize({ token: 'a' })
122
+ window.PlayPilotLinkInjections.mount()
123
+ expect(/** @type {HTMLScriptElement} */(document.querySelector('script#playpilot-mount')).src).toContain('editorial.mount.js')
124
+ })
94
125
 
95
- expect(fetchConfig).toHaveBeenCalled()
126
+ it('Should insert script tag with editorial mode if editiorial mode is disabled but auth token is present', () => {
127
+ vi.mocked(isEditorialModeEnabled).mockReturnValueOnce(false)
128
+ vi.mocked(getAuthToken).mockReturnValueOnce('abc')
96
129
 
97
- await new Promise(res => setTimeout(res))
130
+ window.PlayPilotLinkInjections.mount()
131
+ expect(/** @type {HTMLScriptElement} */(document.querySelector('script#playpilot-mount')).src).toContain('editorial.mount.js')
132
+ })
98
133
 
99
- expect(pollLinkInjections).toHaveBeenCalled()
134
+ it('Should insert script tag without editorial mode if editiorial mode is disabled but auth token is present', () => {
135
+ vi.mocked(isEditorialModeEnabled).mockReturnValueOnce(false)
136
+ vi.mocked(getAuthToken).mockReturnValueOnce('')
137
+
138
+ window.PlayPilotLinkInjections.mount()
139
+ expect(/** @type {HTMLScriptElement} */(document.querySelector('script#playpilot-mount')).src).not.toContain('editorial.mount.js')
140
+ expect(/** @type {HTMLScriptElement} */(document.querySelector('script#playpilot-mount')).src).toContain('mount.js')
141
+ })
100
142
  })
101
143
  })
@@ -0,0 +1,63 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest'
2
+ import { fakeFetch } from './helpers'
3
+ import { clearLinkInjections } from '$lib/injection'
4
+ import { mount } from 'svelte'
5
+
6
+ vi.mock('$lib/injection', () => ({
7
+ clearLinkInjections: vi.fn(),
8
+ }))
9
+
10
+ vi.mock('svelte', () => ({
11
+ mount: vi.fn(),
12
+ }))
13
+
14
+ describe('mount.ts', () => {
15
+ beforeEach(async () => {
16
+ // @ts-ignore
17
+ window.PlayPilotLinkInjections = {}
18
+ document.body.innerHTML = ''
19
+
20
+ fakeFetch()
21
+
22
+ vi.resetModules()
23
+ vi.resetAllMocks()
24
+
25
+ await import('../mount')
26
+ })
27
+
28
+ describe('mount', () => {
29
+ it('Should mount app', () => {
30
+ window.PlayPilotMount.mount()
31
+
32
+ expect(mount).toHaveBeenCalledWith(expect.any(Function), { target: expect.any(HTMLElement) })
33
+ })
34
+
35
+ it('Should assign app to window PlayPilotLinkInjections object', () => {
36
+ vi.mocked(mount).mockReturnValueOnce({ some_key: 'Some value' })
37
+
38
+ window.PlayPilotMount.mount()
39
+
40
+ expect(window.PlayPilotLinkInjections.app).toEqual({ some_key: 'Some value' })
41
+ })
42
+ })
43
+
44
+ describe('destroy', () => {
45
+ it('Should call clearLinkInjections and remove link injections element', () => {
46
+ document.body.innerHTML = '<div id="playpilot-link-injection"></div>'
47
+
48
+ window.PlayPilotMount.destroy()
49
+
50
+ expect(document.body.innerHTML).toBe('')
51
+ expect(clearLinkInjections).toHaveBeenCalled()
52
+ })
53
+
54
+ it('Should clear app on window PlayPilotLinkInjections object', () => {
55
+ // @ts-ignore
56
+ window.PlayPilotLinkInjections = { app: {} }
57
+
58
+ window.PlayPilotMount.destroy()
59
+
60
+ expect(window.PlayPilotLinkInjections.app).toBe(null)
61
+ })
62
+ })
63
+ })