@networkpro/web 1.22.2 → 1.24.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 (49) hide show
  1. package/.github/workflows/build-and-publish.yml +3 -3
  2. package/.github/workflows/lighthouse.yml +1 -1
  3. package/.github/workflows/meta-check.yml +1 -1
  4. package/.github/workflows/publish-test.yml +3 -3
  5. package/.github/workflows/secret-scan.yml +105 -0
  6. package/.github/workflows/templates/publish.template.yml +3 -3
  7. package/.node-version +1 -1
  8. package/.nvmrc +1 -1
  9. package/CHANGELOG.md +96 -1
  10. package/LICENSE.md +1 -1
  11. package/README.md +5 -5
  12. package/budget.json +1 -1
  13. package/package.json +11 -10
  14. package/src/app.html +4 -4
  15. package/src/lib/README.md +12 -9
  16. package/src/lib/components/Badges.svelte +2 -2
  17. package/src/lib/components/LegalNav.svelte +1 -1
  18. package/src/lib/components/MetaTags.svelte +42 -16
  19. package/src/lib/components/layout/Footer.svelte +7 -7
  20. package/src/lib/components/layout/HeaderDefault.svelte +1 -1
  21. package/src/lib/components/layout/HeaderHome.svelte +1 -1
  22. package/src/lib/index.js +2 -2
  23. package/src/lib/meta.js +24 -24
  24. package/src/lib/pages/AboutContent.svelte +9 -9
  25. package/src/lib/pages/HomeContent.svelte +1 -1
  26. package/src/lib/pages/LicenseContent.svelte +6 -7
  27. package/src/lib/pages/ServicesContent.svelte +1 -2
  28. package/src/lib/pages/TermsUseContent.svelte +1 -1
  29. package/src/lib/types/README.md +2 -2
  30. package/src/routes/+layout.js +2 -3
  31. package/src/routes/+layout.svelte +11 -3
  32. package/src/routes/+page.svelte +7 -26
  33. package/src/routes/about/+page.svelte +10 -21
  34. package/src/routes/{license → foss}/+page.server.js +2 -2
  35. package/src/routes/{foss-spotlight → foss}/+page.svelte +11 -22
  36. package/src/routes/{foss-spotlight → legal}/+page.server.js +2 -2
  37. package/src/routes/{license → legal}/+page.svelte +11 -22
  38. package/src/routes/pgp/+page.svelte +10 -21
  39. package/src/routes/privacy/+page.svelte +10 -21
  40. package/src/routes/privacy-dashboard/+page.svelte +10 -27
  41. package/src/routes/services/+page.svelte +3 -16
  42. package/src/routes/terms-conditions/+page.svelte +10 -21
  43. package/src/routes/terms-of-use/+page.svelte +10 -21
  44. package/static/sitemap.xml +13 -13
  45. package/tests/e2e/mobile.spec.js +36 -17
  46. package/tests/e2e/shared/helpers.js +39 -1
  47. package/tests/meta/meta.test.js +1 -1
  48. package/tests/unit/server/meta.test.js +1 -1
  49. 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 Badges from '$lib/components/Badges.svelte';
11
- import FullWidthSection from '$lib/components/FullWidthSection.svelte';
12
- import PrivacyContent from '$lib/pages/PrivacyContent.svelte';
13
- import LegalNav from '$lib/components/LegalNav.svelte';
14
- import SocialMedia from '$lib/components/SocialMedia.svelte';
15
- import MetaTags from '$lib/components/MetaTags.svelte';
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 { PrivacyContent } 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/privacy" />
29
-
30
19
  <section id="privacy">
31
20
  <FullWidthSection containerClass="readable">
32
21
  <!-- BEGIN PRIVACY POLICY -->
@@ -35,7 +24,7 @@ This file is part of Network Pro.
35
24
  </section>
36
25
  <!-- END PRIVACY POLICY -->
37
26
 
38
- <div class={spaceStyle}></div>
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={spaceStyle}></div>
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={spaceStyle}></div>
45
+ <div class="spacer"></div>
57
46
 
58
47
  <!-- BEGIN BADGES -->
59
48
  <section id="badges">
@@ -7,32 +7,15 @@ This file is part of Network Pro.
7
7
  ========================================================================== -->
8
8
 
9
9
  <script>
10
- import Badges from '$lib/components/Badges.svelte';
11
- import FullWidthSection from '$lib/components/FullWidthSection.svelte';
12
- import PrivacyDashboard from '$lib/pages/PrivacyDashboard.svelte';
13
- import LegalNav from '$lib/components/LegalNav.svelte';
14
- import SocialMedia from '$lib/components/SocialMedia.svelte';
15
- import MetaTags from '$lib/components/MetaTags.svelte';
16
-
17
- /**
18
- * @type {string}
19
- * Style class for the horizontal rule element.
20
- */
21
- const hrStyle = 'hr-styled';
22
-
23
- /**
24
- * @type {string}
25
- * Style class for the div element.
26
- */
27
- const spaceStyle = 'spacer';
28
-
29
- export let data;
10
+ import {
11
+ Badges,
12
+ FullWidthSection,
13
+ LegalNav,
14
+ SocialMedia,
15
+ } from '$lib/components';
16
+ import { PrivacyDashboard } from '$lib/pages';
30
17
  </script>
31
18
 
32
- <MetaTags title={data.meta.title} description={data.meta.description} />
33
-
34
- <link rel="canonical" href="https://netwk.pro/privacy-dashboard" />
35
-
36
19
  <section id="privacy">
37
20
  <FullWidthSection containerClass="readable">
38
21
  <!-- BEGIN PRIVACY DASHBOARD -->
@@ -41,7 +24,7 @@ This file is part of Network Pro.
41
24
  </section>
42
25
  <!-- END PRIVACY DASHBOARD -->
43
26
 
44
- <div class={spaceStyle}></div>
27
+ <div class="spacer"></div>
45
28
 
46
29
  <!-- BEGIN SOCIAL MEDIA -->
47
30
  <section id="social-media">
@@ -51,7 +34,7 @@ This file is part of Network Pro.
51
34
 
52
35
  <hr />
53
36
 
54
- <div class={spaceStyle}></div>
37
+ <div class="spacer"></div>
55
38
 
56
39
  <!-- BEGIN LEGAL -->
57
40
  <section id="legal-nav">
@@ -59,7 +42,7 @@ This file is part of Network Pro.
59
42
  </section>
60
43
  <!-- END LEGAL -->
61
44
 
62
- <div class={spaceStyle}></div>
45
+ <div class="spacer"></div>
63
46
 
64
47
  <!-- BEGIN BADGES -->
65
48
  <section id="badges">
@@ -12,23 +12,10 @@ This file is part of Network Pro.
12
12
  FullWidthSection,
13
13
  LegalNav,
14
14
  SocialMedia,
15
- MetaTags,
16
15
  } from '$lib/components';
17
16
  import { ServicesContent } from '$lib/pages';
18
-
19
- /**
20
- * @type {string}
21
- * Style class for the div element.
22
- */
23
- const spaceStyle = 'spacer';
24
-
25
- export let data;
26
17
  </script>
27
18
 
28
- <MetaTags title={data.meta.title} description={data.meta.description} />
29
-
30
- <link rel="canonical" href="https://netwk.pro/services" />
31
-
32
19
  <section id="services">
33
20
  <FullWidthSection>
34
21
  <!-- BEGIN PRIVACY POLICY -->
@@ -37,7 +24,7 @@ This file is part of Network Pro.
37
24
  </section>
38
25
  <!-- END PRIVACY POLICY -->
39
26
 
40
- <div class={spaceStyle}></div>
27
+ <div class="spacer"></div>
41
28
 
42
29
  <!-- BEGIN SOCIAL MEDIA -->
43
30
  <section id="social-media">
@@ -47,7 +34,7 @@ This file is part of Network Pro.
47
34
 
48
35
  <hr />
49
36
 
50
- <div class={spaceStyle}></div>
37
+ <div class="spacer"></div>
51
38
 
52
39
  <!-- BEGIN LEGAL -->
53
40
  <section id="legal-nav">
@@ -55,7 +42,7 @@ This file is part of Network Pro.
55
42
  </section>
56
43
  <!-- END LEGAL -->
57
44
 
58
- <div class={spaceStyle}></div>
45
+ <div class="spacer"></div>
59
46
 
60
47
  <!-- BEGIN BADGES -->
61
48
  <section id="badges">
@@ -7,26 +7,15 @@ This file is part of Network Pro.
7
7
  ========================================================================== -->
8
8
 
9
9
  <script>
10
- import Badges from '$lib/components/Badges.svelte';
11
- import FullWidthSection from '$lib/components/FullWidthSection.svelte';
12
- import TermsConditionsContent from '$lib/pages/TermsConditionsContent.svelte';
13
- import LegalNav from '$lib/components/LegalNav.svelte';
14
- import SocialMedia from '$lib/components/SocialMedia.svelte';
15
- import MetaTags from '$lib/components/MetaTags.svelte';
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 { TermsConditionsContent } 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-conditions" />
29
-
30
19
  <section id="terms-conditions">
31
20
  <FullWidthSection containerClass="readable">
32
21
  <!-- BEGIN TERMS AND CONDITIONS -->
@@ -35,7 +24,7 @@ This file is part of Network Pro.
35
24
  </section>
36
25
  <!-- END TERMS AND CONDITIONS -->
37
26
 
38
- <div class={spaceStyle}></div>
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={spaceStyle}></div>
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={spaceStyle}></div>
45
+ <div class="spacer"></div>
57
46
 
58
47
  <!-- BEGIN BADGES -->
59
48
  <section id="badges">
@@ -7,26 +7,15 @@ This file is part of Network Pro.
7
7
  ========================================================================== -->
8
8
 
9
9
  <script>
10
- import Badges from '$lib/components/Badges.svelte';
11
- import FullWidthSection from '$lib/components/FullWidthSection.svelte';
12
- import TermsUseContent from '$lib/pages/TermsUseContent.svelte';
13
- import LegalNav from '$lib/components/LegalNav.svelte';
14
- import SocialMedia from '$lib/components/SocialMedia.svelte';
15
- import MetaTags from '$lib/components/MetaTags.svelte';
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={spaceStyle}></div>
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={spaceStyle}></div>
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={spaceStyle}></div>
45
+ <div class="spacer"></div>
57
46
 
58
47
  <!-- BEGIN BADGES -->
59
48
  <section id="badges">
@@ -1,5 +1,5 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <!-- Sitemap last updated 2025-10-20 -->
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-20</lastmod>
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-20</lastmod>
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-spotlight</loc>
32
+ <loc>https://netwk.pro/foss</loc>
33
33
 
34
- <lastmod>2025-07-20</lastmod>
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-20</lastmod>
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-06-30</lastmod>
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-17</lastmod>
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/license</loc>
80
+ <loc>https://netwk.pro/legal</loc>
81
81
 
82
- <lastmod>2025-10-09</lastmod>
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-05-27</lastmod>
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-06-10</lastmod>
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-20</lastmod>
118
+ <lastmod>2025-10-30</lastmod>
119
119
 
120
120
  <changefreq>monthly</changefreq>
121
121
 
@@ -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 { getFooter, getVisibleNav, setMobileView } from './shared/helpers.js';
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
- test.setTimeout(90_000); // increase timeout for all desktop tests
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: 60000 });
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: 60000 });
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
- // combine click + wait in a Promise.all to ensure navigation completes
69
- await Promise.all([
70
- page.waitForLoadState('load'),
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
- await expect(page).toHaveURL(/\/about/);
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-05-29
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
+ }
@@ -21,7 +21,7 @@ const routes = [
21
21
  {
22
22
  path: '/',
23
23
  title: /Security, Networking, Privacy/,
24
- description: /Network Pro/,
24
+ description: /Locking Down Networks/,
25
25
  },
26
26
  // add more paths as needed:
27
27
  // { path: '/about', title: /About/, description: /Network Pro/ }
@@ -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(/Network Pro/);
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": "/legal",
17
- "destination": "/license",
16
+ "source": "/license",
17
+ "destination": "/legal",
18
18
  "permanent": true
19
19
  },
20
20
  {
21
- "source": "/legal/:path*",
22
- "destination": "/license/:path*",
21
+ "source": "/license/:path*",
22
+ "destination": "/legal/:path*",
23
23
  "permanent": true
24
24
  },
25
25
  {
26
- "source": "/foss",
27
- "destination": "/foss-spotlight",
26
+ "source": "/foss-spotlight",
27
+ "destination": "/foss",
28
28
  "permanent": true
29
29
  },
30
30
  {
31
- "source": "/foss/:path*",
32
- "destination": "/foss-spotlight/:path*",
31
+ "source": "/foss-spotlight/:path*",
32
+ "destination": "/foss/:path*",
33
33
  "permanent": true
34
34
  }
35
35
  ],