Update GitHub repository URLs across components and tests

- Replaced all occurrences of the previous repository URL (`your-org/fast-next-template`) with the updated repository URL (`cardosofelipe/pragma-stack.git`) in both frontend components and test files.
- Adjusted related test assertions and documentation links accordingly.
This commit is contained in:
2026-01-01 13:15:08 +01:00
parent a3e557d022
commit de8e18e97d
10 changed files with 102 additions and 89 deletions

View File

@@ -7,42 +7,42 @@
* - Please do NOT modify this file. * - Please do NOT modify this file.
*/ */
const PACKAGE_VERSION = '2.12.3'; const PACKAGE_VERSION = '2.12.3'
const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82'; const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82'
const IS_MOCKED_RESPONSE = Symbol('isMockedResponse'); const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
const activeClientIds = new Set(); const activeClientIds = new Set()
addEventListener('install', function () { addEventListener('install', function () {
self.skipWaiting(); self.skipWaiting()
}); })
addEventListener('activate', function (event) { addEventListener('activate', function (event) {
event.waitUntil(self.clients.claim()); event.waitUntil(self.clients.claim())
}); })
addEventListener('message', async function (event) { addEventListener('message', async function (event) {
const clientId = Reflect.get(event.source || {}, 'id'); const clientId = Reflect.get(event.source || {}, 'id')
if (!clientId || !self.clients) { if (!clientId || !self.clients) {
return; return
} }
const client = await self.clients.get(clientId); const client = await self.clients.get(clientId)
if (!client) { if (!client) {
return; return
} }
const allClients = await self.clients.matchAll({ const allClients = await self.clients.matchAll({
type: 'window', type: 'window',
}); })
switch (event.data) { switch (event.data) {
case 'KEEPALIVE_REQUEST': { case 'KEEPALIVE_REQUEST': {
sendToClient(client, { sendToClient(client, {
type: 'KEEPALIVE_RESPONSE', type: 'KEEPALIVE_RESPONSE',
}); })
break; break
} }
case 'INTEGRITY_CHECK_REQUEST': { case 'INTEGRITY_CHECK_REQUEST': {
@@ -52,12 +52,12 @@ addEventListener('message', async function (event) {
packageVersion: PACKAGE_VERSION, packageVersion: PACKAGE_VERSION,
checksum: INTEGRITY_CHECKSUM, checksum: INTEGRITY_CHECKSUM,
}, },
}); })
break; break
} }
case 'MOCK_ACTIVATE': { case 'MOCK_ACTIVATE': {
activeClientIds.add(clientId); activeClientIds.add(clientId)
sendToClient(client, { sendToClient(client, {
type: 'MOCKING_ENABLED', type: 'MOCKING_ENABLED',
@@ -67,51 +67,54 @@ addEventListener('message', async function (event) {
frameType: client.frameType, frameType: client.frameType,
}, },
}, },
}); })
break; break
} }
case 'CLIENT_CLOSED': { case 'CLIENT_CLOSED': {
activeClientIds.delete(clientId); activeClientIds.delete(clientId)
const remainingClients = allClients.filter((client) => { const remainingClients = allClients.filter((client) => {
return client.id !== clientId; return client.id !== clientId
}); })
// Unregister itself when there are no more clients // Unregister itself when there are no more clients
if (remainingClients.length === 0) { if (remainingClients.length === 0) {
self.registration.unregister(); self.registration.unregister()
} }
break; break
} }
} }
}); })
addEventListener('fetch', function (event) { addEventListener('fetch', function (event) {
const requestInterceptedAt = Date.now(); const requestInterceptedAt = Date.now()
// Bypass navigation requests. // Bypass navigation requests.
if (event.request.mode === 'navigate') { if (event.request.mode === 'navigate') {
return; return
} }
// Opening the DevTools triggers the "only-if-cached" request // Opening the DevTools triggers the "only-if-cached" request
// that cannot be handled by the worker. Bypass such requests. // that cannot be handled by the worker. Bypass such requests.
if (event.request.cache === 'only-if-cached' && event.request.mode !== 'same-origin') { if (
return; event.request.cache === 'only-if-cached' &&
event.request.mode !== 'same-origin'
) {
return
} }
// Bypass all requests when there are no active clients. // Bypass all requests when there are no active clients.
// Prevents the self-unregistered worked from handling requests // Prevents the self-unregistered worked from handling requests
// after it's been terminated (still remains active until the next reload). // after it's been terminated (still remains active until the next reload).
if (activeClientIds.size === 0) { if (activeClientIds.size === 0) {
return; return
} }
const requestId = crypto.randomUUID(); const requestId = crypto.randomUUID()
event.respondWith(handleRequest(event, requestId, requestInterceptedAt)); event.respondWith(handleRequest(event, requestId, requestInterceptedAt))
}); })
/** /**
* @param {FetchEvent} event * @param {FetchEvent} event
@@ -119,18 +122,23 @@ addEventListener('fetch', function (event) {
* @param {number} requestInterceptedAt * @param {number} requestInterceptedAt
*/ */
async function handleRequest(event, requestId, requestInterceptedAt) { async function handleRequest(event, requestId, requestInterceptedAt) {
const client = await resolveMainClient(event); const client = await resolveMainClient(event)
const requestCloneForEvents = event.request.clone(); const requestCloneForEvents = event.request.clone()
const response = await getResponse(event, client, requestId, requestInterceptedAt); const response = await getResponse(
event,
client,
requestId,
requestInterceptedAt,
)
// Send back the response clone for the "response:*" life-cycle events. // Send back the response clone for the "response:*" life-cycle events.
// Ensure MSW is active and ready to handle the message, otherwise // Ensure MSW is active and ready to handle the message, otherwise
// this message will pend indefinitely. // this message will pend indefinitely.
if (client && activeClientIds.has(client.id)) { if (client && activeClientIds.has(client.id)) {
const serializedRequest = await serializeRequest(requestCloneForEvents); const serializedRequest = await serializeRequest(requestCloneForEvents)
// Clone the response so both the client and the library could consume it. // Clone the response so both the client and the library could consume it.
const responseClone = response.clone(); const responseClone = response.clone()
sendToClient( sendToClient(
client, client,
@@ -151,11 +159,11 @@ async function handleRequest(event, requestId, requestInterceptedAt) {
}, },
}, },
}, },
responseClone.body ? [serializedRequest.body, responseClone.body] : [] responseClone.body ? [serializedRequest.body, responseClone.body] : [],
); )
} }
return response; return response
} }
/** /**
@@ -167,30 +175,30 @@ async function handleRequest(event, requestId, requestInterceptedAt) {
* @returns {Promise<Client | undefined>} * @returns {Promise<Client | undefined>}
*/ */
async function resolveMainClient(event) { async function resolveMainClient(event) {
const client = await self.clients.get(event.clientId); const client = await self.clients.get(event.clientId)
if (activeClientIds.has(event.clientId)) { if (activeClientIds.has(event.clientId)) {
return client; return client
} }
if (client?.frameType === 'top-level') { if (client?.frameType === 'top-level') {
return client; return client
} }
const allClients = await self.clients.matchAll({ const allClients = await self.clients.matchAll({
type: 'window', type: 'window',
}); })
return allClients return allClients
.filter((client) => { .filter((client) => {
// Get only those clients that are currently visible. // Get only those clients that are currently visible.
return client.visibilityState === 'visible'; return client.visibilityState === 'visible'
}) })
.find((client) => { .find((client) => {
// Find the client ID that's recorded in the // Find the client ID that's recorded in the
// set of clients that have registered the worker. // set of clients that have registered the worker.
return activeClientIds.has(client.id); return activeClientIds.has(client.id)
}); })
} }
/** /**
@@ -203,34 +211,36 @@ async function resolveMainClient(event) {
async function getResponse(event, client, requestId, requestInterceptedAt) { async function getResponse(event, client, requestId, requestInterceptedAt) {
// Clone the request because it might've been already used // Clone the request because it might've been already used
// (i.e. its body has been read and sent to the client). // (i.e. its body has been read and sent to the client).
const requestClone = event.request.clone(); const requestClone = event.request.clone()
function passthrough() { function passthrough() {
// Cast the request headers to a new Headers instance // Cast the request headers to a new Headers instance
// so the headers can be manipulated with. // so the headers can be manipulated with.
const headers = new Headers(requestClone.headers); const headers = new Headers(requestClone.headers)
// Remove the "accept" header value that marked this request as passthrough. // Remove the "accept" header value that marked this request as passthrough.
// This prevents request alteration and also keeps it compliant with the // This prevents request alteration and also keeps it compliant with the
// user-defined CORS policies. // user-defined CORS policies.
const acceptHeader = headers.get('accept'); const acceptHeader = headers.get('accept')
if (acceptHeader) { if (acceptHeader) {
const values = acceptHeader.split(',').map((value) => value.trim()); const values = acceptHeader.split(',').map((value) => value.trim())
const filteredValues = values.filter((value) => value !== 'msw/passthrough'); const filteredValues = values.filter(
(value) => value !== 'msw/passthrough',
)
if (filteredValues.length > 0) { if (filteredValues.length > 0) {
headers.set('accept', filteredValues.join(', ')); headers.set('accept', filteredValues.join(', '))
} else { } else {
headers.delete('accept'); headers.delete('accept')
} }
} }
return fetch(requestClone, { headers }); return fetch(requestClone, { headers })
} }
// Bypass mocking when the client is not active. // Bypass mocking when the client is not active.
if (!client) { if (!client) {
return passthrough(); return passthrough()
} }
// Bypass initial page load requests (i.e. static assets). // Bypass initial page load requests (i.e. static assets).
@@ -238,11 +248,11 @@ async function getResponse(event, client, requestId, requestInterceptedAt) {
// means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet
// and is not ready to handle requests. // and is not ready to handle requests.
if (!activeClientIds.has(client.id)) { if (!activeClientIds.has(client.id)) {
return passthrough(); return passthrough()
} }
// Notify the client that a request has been intercepted. // Notify the client that a request has been intercepted.
const serializedRequest = await serializeRequest(event.request); const serializedRequest = await serializeRequest(event.request)
const clientMessage = await sendToClient( const clientMessage = await sendToClient(
client, client,
{ {
@@ -253,20 +263,20 @@ async function getResponse(event, client, requestId, requestInterceptedAt) {
...serializedRequest, ...serializedRequest,
}, },
}, },
[serializedRequest.body] [serializedRequest.body],
); )
switch (clientMessage.type) { switch (clientMessage.type) {
case 'MOCK_RESPONSE': { case 'MOCK_RESPONSE': {
return respondWithMock(clientMessage.data); return respondWithMock(clientMessage.data)
} }
case 'PASSTHROUGH': { case 'PASSTHROUGH': {
return passthrough(); return passthrough()
} }
} }
return passthrough(); return passthrough()
} }
/** /**
@@ -277,18 +287,21 @@ async function getResponse(event, client, requestId, requestInterceptedAt) {
*/ */
function sendToClient(client, message, transferrables = []) { function sendToClient(client, message, transferrables = []) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const channel = new MessageChannel(); const channel = new MessageChannel()
channel.port1.onmessage = (event) => { channel.port1.onmessage = (event) => {
if (event.data && event.data.error) { if (event.data && event.data.error) {
return reject(event.data.error); return reject(event.data.error)
} }
resolve(event.data); resolve(event.data)
}; }
client.postMessage(message, [channel.port2, ...transferrables.filter(Boolean)]); client.postMessage(message, [
}); channel.port2,
...transferrables.filter(Boolean),
])
})
} }
/** /**
@@ -301,17 +314,17 @@ function respondWithMock(response) {
// instance will have status code set to 0. Since it's not possible to create // instance will have status code set to 0. Since it's not possible to create
// a Response instance with status code 0, handle that use-case separately. // a Response instance with status code 0, handle that use-case separately.
if (response.status === 0) { if (response.status === 0) {
return Response.error(); return Response.error()
} }
const mockedResponse = new Response(response.body, response); const mockedResponse = new Response(response.body, response)
Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, {
value: true, value: true,
enumerable: true, enumerable: true,
}); })
return mockedResponse; return mockedResponse
} }
/** /**
@@ -332,5 +345,5 @@ async function serializeRequest(request) {
referrerPolicy: request.referrerPolicy, referrerPolicy: request.referrerPolicy,
body: await request.arrayBuffer(), body: await request.arrayBuffer(),
keepalive: request.keepalive, keepalive: request.keepalive,
}; }
} }

View File

@@ -14,7 +14,7 @@ import { Link } from '@/lib/i18n/routing';
const commands = [ const commands = [
{ text: '# Clone the repository', delay: 0 }, { text: '# Clone the repository', delay: 0 },
{ text: '$ git clone https://github.com/your-org/fast-next-template.git', delay: 800 }, { text: '$ git clone https://github.com/cardosofelipe/pragma-stack.git.git', delay: 800 },
{ text: '$ cd fast-next-template', delay: 1600 }, { text: '$ cd fast-next-template', delay: 1600 },
{ text: '', delay: 2200 }, { text: '', delay: 2200 },
{ text: '# Start with Docker (one command)', delay: 2400 }, { text: '# Start with Docker (one command)', delay: 2400 },

View File

@@ -49,7 +49,7 @@ export function CTASection({ onOpenDemoModal }: CTASectionProps) {
<div className="flex flex-col sm:flex-row items-center justify-center gap-4 pt-4"> <div className="flex flex-col sm:flex-row items-center justify-center gap-4 pt-4">
<Button asChild size="lg" className="gap-2 text-base group"> <Button asChild size="lg" className="gap-2 text-base group">
<a <a
href="https://github.com/your-org/fast-next-template" href="https://github.com/cardosofelipe/pragma-stack.git"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
@@ -75,7 +75,7 @@ export function CTASection({ onOpenDemoModal }: CTASectionProps) {
</Button> </Button>
<Button asChild size="lg" variant="ghost" className="gap-2 text-base group"> <Button asChild size="lg" variant="ghost" className="gap-2 text-base group">
<a <a
href="https://github.com/your-org/fast-next-template#documentation" href="https://github.com/cardosofelipe/pragma-stack.git#documentation"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
> >

View File

@@ -44,7 +44,7 @@ const features = [
'12+ documentation guides covering architecture, design system, testing patterns, deployment, and AI code generation guidelines. Interactive API docs with Swagger and ReDoc', '12+ documentation guides covering architecture, design system, testing patterns, deployment, and AI code generation guidelines. Interactive API docs with Swagger and ReDoc',
highlight: 'Developer-first docs', highlight: 'Developer-first docs',
ctaText: 'Browse Docs', ctaText: 'Browse Docs',
ctaHref: 'https://github.com/your-org/fast-next-template#documentation', ctaHref: 'https://github.com/cardosofelipe/pragma-stack.git#documentation',
}, },
{ {
icon: Server, icon: Server,
@@ -53,7 +53,7 @@ const features = [
'Docker deployment configs, database migrations with Alembic helpers, connection pooling, health checks, monitoring setup, and production security headers', 'Docker deployment configs, database migrations with Alembic helpers, connection pooling, health checks, monitoring setup, and production security headers',
highlight: 'Deploy with confidence', highlight: 'Deploy with confidence',
ctaText: 'Deployment Guide', ctaText: 'Deployment Guide',
ctaHref: 'https://github.com/your-org/fast-next-template#deployment', ctaHref: 'https://github.com/cardosofelipe/pragma-stack.git#deployment',
}, },
{ {
icon: Code, icon: Code,

View File

@@ -72,7 +72,7 @@ export function Header({ onOpenDemoModal }: HeaderProps) {
{/* GitHub Link with Star */} {/* GitHub Link with Star */}
<a <a
href="https://github.com/your-org/fast-next-template" href="https://github.com/cardosofelipe/pragma-stack.git"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
className="flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors" className="flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors"
@@ -135,7 +135,7 @@ export function Header({ onOpenDemoModal }: HeaderProps) {
{/* GitHub Link */} {/* GitHub Link */}
<a <a
href="https://github.com/your-org/fast-next-template" href="https://github.com/cardosofelipe/pragma-stack.git"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
onClick={() => setMobileMenuOpen(false)} onClick={() => setMobileMenuOpen(false)}

View File

@@ -93,7 +93,7 @@ export function HeroSection({ onOpenDemoModal }: HeroSectionProps) {
</Button> </Button>
<Button asChild size="lg" variant="outline" className="gap-2 text-base group"> <Button asChild size="lg" variant="outline" className="gap-2 text-base group">
<a <a
href="https://github.com/your-org/fast-next-template" href="https://github.com/cardosofelipe/pragma-stack.git"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
> >

View File

@@ -13,7 +13,7 @@ import { vscDarkPlus } from 'react-syntax-highlighter/dist/esm/styles/prism';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
const codeString = `# Clone and start with Docker const codeString = `# Clone and start with Docker
git clone https://github.com/your-org/fast-next-template.git git clone https://github.com/cardosofelipe/pragma-stack.git.git
cd fast-next-template cd fast-next-template
docker-compose up docker-compose up

View File

@@ -71,7 +71,7 @@ describe('CTASection', () => {
); );
const githubLink = screen.getByRole('link', { name: /get started on github/i }); const githubLink = screen.getByRole('link', { name: /get started on github/i });
expect(githubLink).toHaveAttribute('href', 'https://github.com/your-org/fast-next-template'); expect(githubLink).toHaveAttribute('href', 'https://github.com/cardosofelipe/pragma-stack.git');
expect(githubLink).toHaveAttribute('target', '_blank'); expect(githubLink).toHaveAttribute('target', '_blank');
expect(githubLink).toHaveAttribute('rel', 'noopener noreferrer'); expect(githubLink).toHaveAttribute('rel', 'noopener noreferrer');
}); });
@@ -101,7 +101,7 @@ describe('CTASection', () => {
const docsLink = screen.getByRole('link', { name: /read documentation/i }); const docsLink = screen.getByRole('link', { name: /read documentation/i });
expect(docsLink).toHaveAttribute( expect(docsLink).toHaveAttribute(
'href', 'href',
'https://github.com/your-org/fast-next-template#documentation' 'https://github.com/cardosofelipe/pragma-stack.git#documentation'
); );
expect(docsLink).toHaveAttribute('target', '_blank'); expect(docsLink).toHaveAttribute('target', '_blank');
expect(docsLink).toHaveAttribute('rel', 'noopener noreferrer'); expect(docsLink).toHaveAttribute('rel', 'noopener noreferrer');

View File

@@ -102,7 +102,7 @@ describe('Header', () => {
expect(desktopGithubLink).toHaveAttribute( expect(desktopGithubLink).toHaveAttribute(
'href', 'href',
'https://github.com/your-org/fast-next-template' 'https://github.com/cardosofelipe/pragma-stack.git'
); );
expect(desktopGithubLink).toHaveAttribute('target', '_blank'); expect(desktopGithubLink).toHaveAttribute('target', '_blank');
expect(desktopGithubLink).toHaveAttribute('rel', 'noopener noreferrer'); expect(desktopGithubLink).toHaveAttribute('rel', 'noopener noreferrer');

View File

@@ -100,7 +100,7 @@ describe('HeroSection', () => {
); );
const githubLink = screen.getByRole('link', { name: /view on github/i }); const githubLink = screen.getByRole('link', { name: /view on github/i });
expect(githubLink).toHaveAttribute('href', 'https://github.com/your-org/fast-next-template'); expect(githubLink).toHaveAttribute('href', 'https://github.com/cardosofelipe/pragma-stack.git');
expect(githubLink).toHaveAttribute('target', '_blank'); expect(githubLink).toHaveAttribute('target', '_blank');
expect(githubLink).toHaveAttribute('rel', 'noopener noreferrer'); expect(githubLink).toHaveAttribute('rel', 'noopener noreferrer');
}); });