@networkpro/web 1.22.2 → 1.23.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.
- package/.node-version +1 -1
- package/.nvmrc +1 -1
- package/CHANGELOG.md +54 -1
- package/LICENSE.md +1 -1
- package/README.md +5 -5
- package/budget.json +1 -1
- package/package.json +7 -6
- package/src/app.html +4 -4
- package/src/lib/README.md +12 -9
- package/src/lib/components/Badges.svelte +2 -2
- package/src/lib/components/LegalNav.svelte +1 -1
- package/src/lib/components/MetaTags.svelte +42 -16
- package/src/lib/components/layout/Footer.svelte +7 -7
- package/src/lib/components/layout/HeaderDefault.svelte +1 -1
- package/src/lib/components/layout/HeaderHome.svelte +1 -1
- package/src/lib/index.js +2 -2
- package/src/lib/meta.js +24 -24
- package/src/lib/pages/AboutContent.svelte +9 -9
- package/src/lib/pages/HomeContent.svelte +1 -1
- package/src/lib/pages/LicenseContent.svelte +6 -7
- package/src/lib/pages/ServicesContent.svelte +1 -2
- package/src/lib/pages/TermsUseContent.svelte +1 -1
- package/src/lib/types/README.md +2 -2
- package/src/routes/+layout.js +2 -3
- package/src/routes/+layout.svelte +11 -3
- package/src/routes/+page.svelte +7 -26
- package/src/routes/about/+page.svelte +10 -21
- package/src/routes/{license → foss}/+page.server.js +2 -2
- package/src/routes/{foss-spotlight → foss}/+page.svelte +11 -22
- package/src/routes/{foss-spotlight → legal}/+page.server.js +2 -2
- package/src/routes/{license → legal}/+page.svelte +11 -22
- package/src/routes/pgp/+page.svelte +10 -21
- package/src/routes/privacy/+page.svelte +10 -21
- package/src/routes/privacy-dashboard/+page.svelte +10 -27
- package/src/routes/services/+page.svelte +3 -16
- package/src/routes/terms-conditions/+page.svelte +10 -21
- package/src/routes/terms-of-use/+page.svelte +10 -21
- package/static/sitemap.xml +13 -13
- package/tests/e2e/mobile.spec.js +36 -17
- package/tests/e2e/shared/helpers.js +39 -1
- package/tests/meta/meta.test.js +1 -1
- package/tests/unit/server/meta.test.js +1 -1
- package/vercel.json +8 -8
|
@@ -7,26 +7,15 @@ This file is part of Network Pro.
|
|
|
7
7
|
========================================================================== -->
|
|
8
8
|
|
|
9
9
|
<script>
|
|
10
|
-
import
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* @type {string}
|
|
19
|
-
* Style class for the div element.
|
|
20
|
-
*/
|
|
21
|
-
const spaceStyle = 'spacer';
|
|
22
|
-
|
|
23
|
-
export let data;
|
|
10
|
+
import {
|
|
11
|
+
Badges,
|
|
12
|
+
FullWidthSection,
|
|
13
|
+
LegalNav,
|
|
14
|
+
SocialMedia,
|
|
15
|
+
} from '$lib/components';
|
|
16
|
+
import { TermsUseContent } from '$lib/pages';
|
|
24
17
|
</script>
|
|
25
18
|
|
|
26
|
-
<MetaTags title={data.meta.title} description={data.meta.description} />
|
|
27
|
-
|
|
28
|
-
<link rel="canonical" href="https://netwk.pro/terms-of-use" />
|
|
29
|
-
|
|
30
19
|
<section id="terms-of-use">
|
|
31
20
|
<FullWidthSection containerClass="readable">
|
|
32
21
|
<!-- BEGIN TERMS OF USE -->
|
|
@@ -35,7 +24,7 @@ This file is part of Network Pro.
|
|
|
35
24
|
</section>
|
|
36
25
|
<!-- END TERMS OF USE -->
|
|
37
26
|
|
|
38
|
-
<div class=
|
|
27
|
+
<div class="spacer"></div>
|
|
39
28
|
|
|
40
29
|
<!-- BEGIN SOCIAL MEDIA -->
|
|
41
30
|
<section id="social-media">
|
|
@@ -45,7 +34,7 @@ This file is part of Network Pro.
|
|
|
45
34
|
|
|
46
35
|
<hr />
|
|
47
36
|
|
|
48
|
-
<div class=
|
|
37
|
+
<div class="spacer"></div>
|
|
49
38
|
|
|
50
39
|
<!-- BEGIN LEGAL -->
|
|
51
40
|
<section id="legal-nav">
|
|
@@ -53,7 +42,7 @@ This file is part of Network Pro.
|
|
|
53
42
|
</section>
|
|
54
43
|
<!-- END LEGAL -->
|
|
55
44
|
|
|
56
|
-
<div class=
|
|
45
|
+
<div class="spacer"></div>
|
|
57
46
|
|
|
58
47
|
<!-- BEGIN BADGES -->
|
|
59
48
|
<section id="badges">
|
package/static/sitemap.xml
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<!-- Sitemap last updated 2025-10-
|
|
2
|
+
<!-- Sitemap last updated 2025-10-30 -->
|
|
3
3
|
|
|
4
4
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
5
5
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
<loc>https://netwk.pro</loc>
|
|
9
9
|
|
|
10
|
-
<lastmod>2025-10-
|
|
10
|
+
<lastmod>2025-10-30</lastmod>
|
|
11
11
|
|
|
12
12
|
<changefreq>weekly</changefreq>
|
|
13
13
|
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
<loc>https://netwk.pro/services</loc>
|
|
21
21
|
|
|
22
|
-
<lastmod>2025-10-
|
|
22
|
+
<lastmod>2025-10-30</lastmod>
|
|
23
23
|
|
|
24
24
|
<changefreq>monthly</changefreq>
|
|
25
25
|
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
|
|
30
30
|
<url>
|
|
31
31
|
|
|
32
|
-
<loc>https://netwk.pro/foss
|
|
32
|
+
<loc>https://netwk.pro/foss</loc>
|
|
33
33
|
|
|
34
|
-
<lastmod>2025-
|
|
34
|
+
<lastmod>2025-10-30</lastmod>
|
|
35
35
|
|
|
36
36
|
<changefreq>monthly</changefreq>
|
|
37
37
|
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
|
|
44
44
|
<loc>https://netwk.pro/about</loc>
|
|
45
45
|
|
|
46
|
-
<lastmod>2025-10-
|
|
46
|
+
<lastmod>2025-10-30</lastmod>
|
|
47
47
|
|
|
48
48
|
<changefreq>monthly</changefreq>
|
|
49
49
|
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
|
|
56
56
|
<loc>https://netwk.pro/privacy-dashboard</loc>
|
|
57
57
|
|
|
58
|
-
<lastmod>2025-
|
|
58
|
+
<lastmod>2025-10-30</lastmod>
|
|
59
59
|
|
|
60
60
|
<changefreq>monthly</changefreq>
|
|
61
61
|
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
|
|
68
68
|
<loc>https://netwk.pro/privacy</loc>
|
|
69
69
|
|
|
70
|
-
<lastmod>2025-10-
|
|
70
|
+
<lastmod>2025-10-30</lastmod>
|
|
71
71
|
|
|
72
72
|
<changefreq>monthly</changefreq>
|
|
73
73
|
|
|
@@ -77,9 +77,9 @@
|
|
|
77
77
|
|
|
78
78
|
<url>
|
|
79
79
|
|
|
80
|
-
<loc>https://netwk.pro/
|
|
80
|
+
<loc>https://netwk.pro/legal</loc>
|
|
81
81
|
|
|
82
|
-
<lastmod>2025-10-
|
|
82
|
+
<lastmod>2025-10-30</lastmod>
|
|
83
83
|
|
|
84
84
|
<changefreq>monthly</changefreq>
|
|
85
85
|
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
|
|
92
92
|
<loc>https://netwk.pro/terms-of-use</loc>
|
|
93
93
|
|
|
94
|
-
<lastmod>2025-
|
|
94
|
+
<lastmod>2025-10-30</lastmod>
|
|
95
95
|
|
|
96
96
|
<changefreq>monthly</changefreq>
|
|
97
97
|
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
|
|
104
104
|
<loc>https://netwk.pro/terms-conditions</loc>
|
|
105
105
|
|
|
106
|
-
<lastmod>2025-
|
|
106
|
+
<lastmod>2025-10-30</lastmod>
|
|
107
107
|
|
|
108
108
|
<changefreq>monthly</changefreq>
|
|
109
109
|
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
|
|
116
116
|
<loc>https://netwk.pro/pgp</loc>
|
|
117
117
|
|
|
118
|
-
<lastmod>2025-10-
|
|
118
|
+
<lastmod>2025-10-30</lastmod>
|
|
119
119
|
|
|
120
120
|
<changefreq>monthly</changefreq>
|
|
121
121
|
|
package/tests/e2e/mobile.spec.js
CHANGED
|
@@ -15,12 +15,24 @@ This file is part of Network Pro.
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { expect, test } from '@playwright/test';
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
clickAndWaitForNavigation,
|
|
20
|
+
getFooter,
|
|
21
|
+
getVisibleNav,
|
|
22
|
+
setMobileView,
|
|
23
|
+
} from './shared/helpers.js';
|
|
24
|
+
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// 📱 Mobile viewport smoke tests
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
19
28
|
|
|
20
|
-
// Mobile viewport smoke tests for the root route
|
|
21
29
|
test.describe('Mobile Tests', () => {
|
|
22
|
-
|
|
30
|
+
// Increase timeout for all mobile tests
|
|
31
|
+
test.setTimeout(90_000);
|
|
23
32
|
|
|
33
|
+
// -------------------------------------------------------------------------
|
|
34
|
+
// 🧱 Test 1: Main description text
|
|
35
|
+
// -------------------------------------------------------------------------
|
|
24
36
|
test('should display the main description text on mobile', async ({
|
|
25
37
|
page,
|
|
26
38
|
browserName,
|
|
@@ -29,7 +41,7 @@ test.describe('Mobile Tests', () => {
|
|
|
29
41
|
|
|
30
42
|
await setMobileView(page);
|
|
31
43
|
await page.goto('/');
|
|
32
|
-
await page.waitForLoadState('domcontentloaded', { timeout:
|
|
44
|
+
await page.waitForLoadState('domcontentloaded', { timeout: 60_000 });
|
|
33
45
|
|
|
34
46
|
const description = page.locator(
|
|
35
47
|
'div.index-title1:has-text("Locking Down Networks")',
|
|
@@ -37,6 +49,9 @@ test.describe('Mobile Tests', () => {
|
|
|
37
49
|
await expect(description).toBeVisible();
|
|
38
50
|
});
|
|
39
51
|
|
|
52
|
+
// -------------------------------------------------------------------------
|
|
53
|
+
// 🧱 Test 2: Main content
|
|
54
|
+
// -------------------------------------------------------------------------
|
|
40
55
|
test('should display main content correctly on mobile', async ({
|
|
41
56
|
page,
|
|
42
57
|
browserName,
|
|
@@ -45,12 +60,15 @@ test.describe('Mobile Tests', () => {
|
|
|
45
60
|
|
|
46
61
|
await setMobileView(page);
|
|
47
62
|
await page.goto('/');
|
|
48
|
-
await page.waitForLoadState('domcontentloaded', { timeout:
|
|
63
|
+
await page.waitForLoadState('domcontentloaded', { timeout: 60_000 });
|
|
49
64
|
|
|
50
65
|
const mainHeading = page.locator('h1, h2');
|
|
51
66
|
await expect(mainHeading).toBeVisible();
|
|
52
67
|
});
|
|
53
68
|
|
|
69
|
+
// -------------------------------------------------------------------------
|
|
70
|
+
// 🧱 Test 3: "About" link navigation
|
|
71
|
+
// -------------------------------------------------------------------------
|
|
54
72
|
test("should ensure the 'about' link is clickable on mobile", async ({
|
|
55
73
|
page,
|
|
56
74
|
browserName,
|
|
@@ -58,23 +76,24 @@ test.describe('Mobile Tests', () => {
|
|
|
58
76
|
if (browserName === 'webkit') test.skip();
|
|
59
77
|
|
|
60
78
|
await setMobileView(page);
|
|
61
|
-
await page.goto('/');
|
|
62
|
-
await page.waitForLoadState('domcontentloaded', { timeout: 60000 });
|
|
79
|
+
await page.goto('/', { waitUntil: 'networkidle' });
|
|
63
80
|
|
|
64
81
|
const nav = await getVisibleNav(page);
|
|
65
|
-
const aboutLink = nav.getByRole('link', { name: 'about' });
|
|
66
|
-
await expect(aboutLink).toBeVisible();
|
|
67
82
|
|
|
68
|
-
//
|
|
69
|
-
await
|
|
70
|
-
|
|
71
|
-
page.waitForURL('**/about', { timeout: 60000 }),
|
|
72
|
-
aboutLink.click(),
|
|
73
|
-
]);
|
|
83
|
+
// Ensure the link exists before interacting
|
|
84
|
+
await page.waitForSelector('a[href="/about"]', { timeout: 10_000 });
|
|
85
|
+
const aboutLink = nav.getByRole('link', { name: 'about' });
|
|
74
86
|
|
|
75
|
-
|
|
87
|
+
// Use the safe navigation helper
|
|
88
|
+
await clickAndWaitForNavigation(page, aboutLink, {
|
|
89
|
+
urlPattern: /\/about/,
|
|
90
|
+
timeout: 60_000,
|
|
91
|
+
});
|
|
76
92
|
});
|
|
77
93
|
|
|
94
|
+
// -------------------------------------------------------------------------
|
|
95
|
+
// 🧱 Test 4: Footer presence on /about
|
|
96
|
+
// -------------------------------------------------------------------------
|
|
78
97
|
test('should display the footer on /about (mobile)', async ({
|
|
79
98
|
page,
|
|
80
99
|
browserName,
|
|
@@ -89,4 +108,4 @@ test.describe('Mobile Tests', () => {
|
|
|
89
108
|
});
|
|
90
109
|
});
|
|
91
110
|
|
|
92
|
-
// cspell:ignore domcontentloaded
|
|
111
|
+
// cspell:ignore domcontentloaded networkidle
|
|
@@ -11,9 +11,11 @@ This file is part of Network Pro.
|
|
|
11
11
|
* @description Stores commonly used functions for importing into E2E tests.
|
|
12
12
|
* @module tests/e2e/shared
|
|
13
13
|
* @author Scott Lopez
|
|
14
|
-
* @updated 2025-
|
|
14
|
+
* @updated 2025-10-29
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { expect } from '@playwright/test';
|
|
18
|
+
|
|
17
19
|
/**
|
|
18
20
|
* @param {import('@playwright/test').Page} page - The Playwright page object.
|
|
19
21
|
* @returns {Promise<void>}
|
|
@@ -55,3 +57,39 @@ export async function getVisibleNav(page) {
|
|
|
55
57
|
export function getFooter(page) {
|
|
56
58
|
return page.locator('footer');
|
|
57
59
|
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @function clickAndWaitForNavigation
|
|
63
|
+
* @description Clicks a link or button and waits for navigation or URL change.
|
|
64
|
+
* Works for both SPA (client-side) and full-page navigations.
|
|
65
|
+
*
|
|
66
|
+
* @param {import('@playwright/test').Page} page
|
|
67
|
+
* @param {import('@playwright/test').Locator} locator
|
|
68
|
+
* @param {object} [options]
|
|
69
|
+
* @param {string|RegExp} [options.urlPattern] - URL or regex to match
|
|
70
|
+
* @param {number} [options.timeout=60000] - Max wait time
|
|
71
|
+
*/
|
|
72
|
+
export async function clickAndWaitForNavigation(page, locator, options = {}) {
|
|
73
|
+
const { urlPattern = /\/.*/, timeout = 60000 } = options;
|
|
74
|
+
|
|
75
|
+
// Ensure the element is ready for interaction
|
|
76
|
+
await locator.scrollIntoViewIfNeeded();
|
|
77
|
+
await locator.waitFor({ state: 'visible', timeout: 10000 });
|
|
78
|
+
await locator.click({ trial: true });
|
|
79
|
+
|
|
80
|
+
// Capture current URL to detect SPA navigation
|
|
81
|
+
const currentUrl = page.url();
|
|
82
|
+
|
|
83
|
+
// Handle both SPA transitions and full page reloads
|
|
84
|
+
await Promise.all([
|
|
85
|
+
page.waitForURL(urlPattern, { timeout }).catch(() => {}),
|
|
86
|
+
page.waitForLoadState('load', { timeout }).catch(() => {}),
|
|
87
|
+
locator.click(),
|
|
88
|
+
]);
|
|
89
|
+
|
|
90
|
+
// Confirm the URL changed successfully
|
|
91
|
+
await expect(page).toHaveURL(urlPattern, { timeout });
|
|
92
|
+
|
|
93
|
+
// Optional: log navigation success (helps in CI)
|
|
94
|
+
console.log(`✅ Navigation from ${currentUrl} → ${page.url()}`);
|
|
95
|
+
}
|
package/tests/meta/meta.test.js
CHANGED
|
@@ -25,6 +25,6 @@ describe('Meta info', () => {
|
|
|
25
25
|
const { meta } = load({ url: mockUrl });
|
|
26
26
|
|
|
27
27
|
expect(meta.title).toMatch(/Security, Networking, Privacy/);
|
|
28
|
-
expect(meta.description).toMatch(/
|
|
28
|
+
expect(meta.description).toMatch(/Locking Down Networks/);
|
|
29
29
|
});
|
|
30
30
|
});
|
package/vercel.json
CHANGED
|
@@ -13,23 +13,23 @@
|
|
|
13
13
|
"permanent": true
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
|
-
"source": "/
|
|
17
|
-
"destination": "/
|
|
16
|
+
"source": "/license",
|
|
17
|
+
"destination": "/legal",
|
|
18
18
|
"permanent": true
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
|
-
"source": "/
|
|
22
|
-
"destination": "/
|
|
21
|
+
"source": "/license/:path*",
|
|
22
|
+
"destination": "/legal/:path*",
|
|
23
23
|
"permanent": true
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
|
-
"source": "/foss",
|
|
27
|
-
"destination": "/foss
|
|
26
|
+
"source": "/foss-spotlight",
|
|
27
|
+
"destination": "/foss",
|
|
28
28
|
"permanent": true
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
|
-
"source": "/foss/:path*",
|
|
32
|
-
"destination": "/foss
|
|
31
|
+
"source": "/foss-spotlight/:path*",
|
|
32
|
+
"destination": "/foss/:path*",
|
|
33
33
|
"permanent": true
|
|
34
34
|
}
|
|
35
35
|
],
|