Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@
bashInteractive
gitMinimal

nodejs_20
corepack_20
nodejs_22
corepack_22

# Playwright for the end-to-end tests
playwright-driver.browsers
Expand Down
4 changes: 2 additions & 2 deletions packages/docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
"prettier": "3.6.2",
"prism-themes": "1.9.0",
"prismjs": "1.30.0",
"puppeteer": "22.13.1",
"playwright": "1.40.0",
"qwik-image": "0.0.16",
"react": "18.3.1",
"react-dom": "18.3.1",
Expand Down Expand Up @@ -75,7 +75,7 @@
"build.preview": "NODE_OPTIONS=--max-old-space-size=8192 vite build --ssr src/entry.preview.tsx",
"build.repl-sw": "vite --config vite.config-repl-sw.mts build",
"build.server": "NODE_OPTIONS=--max-old-space-size=8192 vite build -c adapters/cloudflare-pages/vite.config.mts",
"build.showcase": "pnpm node scripts/showcase.js",
"build.showcase": "node scripts/showcase.ts",
"codesandbox.sync": "node codesandbox.sync.ts",
"contributors": "node contributors.ts",
"deploy": "wrangler pages publish ./dist",
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed packages/docs/public/showcases/abdhashem_com.webp
Binary file not shown.
Binary file removed packages/docs/public/showcases/amirhbeigi_ir.webp
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed packages/docs/public/showcases/birdflop_com_.webp
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed packages/docs/public/showcases/blueagle_top_.webp
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file removed packages/docs/public/showcases/getpolaris_ai_.webp
Binary file not shown.
Binary file added packages/docs/public/showcases/goshi_dev_.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed packages/docs/public/showcases/goshi_dev_.webp
Binary file not shown.
Binary file not shown.
Binary file removed packages/docs/public/showcases/index_app_beta.webp
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file removed packages/docs/public/showcases/jbnado_dev_.webp
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed packages/docs/public/showcases/juneikerc_com.webp
Diff not rendered.
Binary file removed packages/docs/public/showcases/leonerd_blog.webp
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Binary file removed packages/docs/public/showcases/numeia_com.webp
Diff not rendered.
Diff not rendered.
Binary file removed packages/docs/public/showcases/pay4me_app.webp
Diff not rendered.
Diff not rendered.
Binary file removed packages/docs/public/showcases/pulsestax_com_.webp
Diff not rendered.
Binary file added packages/docs/public/showcases/qit_tools_.jpeg
Binary file removed packages/docs/public/showcases/qit_tools_.webp
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Binary file added packages/docs/public/showcases/qwik_dev.jpeg
Diff not rendered.
Diff not rendered.
Binary file removed packages/docs/public/showcases/reflect_app_.webp
Diff not rendered.
Binary file removed packages/docs/public/showcases/sakenowa_com.webp
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Binary file removed packages/docs/public/showcases/seyph_com_.webp
Diff not rendered.
Diff not rendered.
Binary file removed packages/docs/public/showcases/tatbiqit_com_.webp
Diff not rendered.
Diff not rendered.
Diff not rendered.
Binary file removed packages/docs/public/showcases/upester_com.webp
Diff not rendered.
Binary file removed packages/docs/public/showcases/usaibis_com_.webp
Diff not rendered.
Binary file removed packages/docs/public/showcases/valibot_dev_.webp
Diff not rendered.
Binary file removed packages/docs/public/showcases/wiza_co.webp
Diff not rendered.
Binary file added packages/docs/public/showcases/wope_com_.jpeg
Binary file removed packages/docs/public/showcases/wope_com_.webp
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
60 changes: 0 additions & 60 deletions packages/docs/scripts/pages.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,4 @@
[
{
"href": "https://seyph.com/",
"size": "large",
"tags": "software development, landing pages, agency, site"
},
{
"href": "https://hypecode.tech/",
"size": "large",
"tags": "software development, landing pages, agency, site"
},
{
"href": "https://www.learn-qwik.com/",
"size": "large",
Expand Down Expand Up @@ -39,30 +29,14 @@
"href": "https://frostytools.com",
"tags": "saas"
},
{
"href": "https://www.dimension.dev",
"tags": "saas"
},
{
"href": "https://index.app/beta",
"tags": "saas"
},
{
"href": "https://wope.com/",
"tags": "saas"
},
{
"href": "https://www.builder.io/",
"tags": "saas"
},
{
"href": "https://reflect.app/",
"tags": "saas"
},
{
"href": "https://jose-aguilar.vercel.app/",
"tags": "portfolio"
},
{
"href": "https://www.hexa.center/",
"tags": "saas"
Expand All @@ -81,10 +55,6 @@
"href": "https://bot-whatsapp.netlify.app/",
"tags": "site"
},
{
"href": "https://usaibis.com/",
"tags": "saas"
},
{
"href": "https://pricing.oasisdigital.com/",
"tags": "saas"
Expand All @@ -103,15 +73,6 @@
"href": "https://goshi.dev/",
"tags": "portfolio"
},
{
"href": "https://www.expobeds.com/",
"size": "large",
"tags": "company"
},
{
"href": "https://jbnado.dev/",
"tags": "portfolio"
},
{
"href": "https://sanyamjainqwik.vercel.app/",
"tags": "portfolio"
Expand All @@ -129,11 +90,6 @@
"href": "https://abdhashem.com",
"tags": "portfolio"
},
{
"href": "https://necatikcl.dev/",
"tags": "personal",
"size": "large"
},
{
"href": "https://itbusinesshub.com/",
"tags": "blog"
Expand All @@ -142,14 +98,6 @@
"href": "https://travelcalc.pages.dev",
"tags": "app"
},
{
"href": "https://pay4me.app",
"tags": "saas"
},
{
"href": "https://qwik-osm-poc.netlify.app/",
"tags": "site"
},
{
"href": "https://leonerd.blog",
"tags": "portfolio"
Expand All @@ -163,10 +111,6 @@
"tags": "site",
"repo": "https://github.com/appwrite/builtwith"
},
{
"href": "https://getpolaris.ai/",
"tags": "saas"
},
{
"href": "https://juneikerc.com",
"tags": "portfolio,site,blog,services"
Expand All @@ -183,10 +127,6 @@
"href": "https://finallyweb.com/",
"tags": "stock market education"
},
{
"href": "https://numeia.com",
"tags": "saas, marketing, ai"
},
{
"href": "https://qit.tools/",
"tags": "online,tools,converters"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,49 +1,72 @@
/* eslint-disable no-console */

const fs = require('fs');
const puppeteer = require('puppeteer');
const pages = require('./pages.json');

import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
import { chromium, type Page } from 'playwright';
import { fetch } from 'undici';
import pages from './pages.json' with { type: 'json' };

type InputPageData = {
href: string;
tags: string[];
size: 'small' | 'large';
repo?: string;
};
type PageData = InputPageData & {
title?: string;
imgSrc?: string;
perf?: {
score?: number;
inpMs?: number;
clsScore?: number;
ttfbMs?: number;
fcpDisplay?: string;
fcpScore?: number;
lcpDisplay?: string;
lcpScore?: number;
ttiDisplay?: string;
ttiScore?: number;
ttiTime?: number;
};
version?: string;
ts: number;
};
const OUTPUT_JSON = 'src/routes/(ecosystem)/showcase/generated-pages.json';
async function captureMultipleScreenshots() {
if (!fs.existsSync('public/showcases')) {
fs.mkdirSync('public/showcases');
if (!existsSync('public/showcases')) {
mkdirSync('public/showcases');
}

let browser = null;
const output = [];
try {
// launch headless Chromium browser
browser = await puppeteer.launch({
browser = await chromium.launch({
headless: true,
incognito: true,
});
const incognito = await browser.createBrowserContext();
let existingJson = [];
const context = await browser.newContext();
let existingJson: PageData[] = [];
try {
const data = fs.readFileSync(OUTPUT_JSON, 'utf8');
existingJson = JSON.parse(data);
const data = readFileSync(OUTPUT_JSON, 'utf8');
existingJson = JSON.parse(data) as PageData[];
} catch {
// ignore
}

for (const pageData of pages) {
let page;
let page: Page;
try {
page = await incognito.newPage();
page.setUserAgent(
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
);
page = await context.newPage();
// page.setUserAgent(
// 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
// );

// set viewport width and height
await page.setViewport({
await page.setViewportSize({
width: 1440,
height: 980,
});

const href = pageData.href;
const existing = existingJson.find((item) => item.href === href);
if (existing) {
if (existing && existing.ts - Date.now() < 1000 * 60 * 60 * 24 * 7) {
console.log('Skipping page', href);

output.push({
Expand All @@ -58,12 +81,13 @@ async function captureMultipleScreenshots() {
await page.goto(href);

const title = await page.title();
const html = await page.$('html');
const html = page.locator('html');
const hasContainer = await html.evaluate((node) => node.hasAttribute('q:container'));
if (!hasContainer) {
console.warn('❌ Not Qwik Site', href);
continue;
}
const version = await html.getAttribute('q:version');
const filename = href
.replace('https://', '')
.replace('/', '_')
Expand All @@ -72,12 +96,12 @@ async function captureMultipleScreenshots() {
.toLowerCase();

await wait(5000);
const path = `public/showcases/${filename}.webp`;
const path = `public/showcases/${filename}.jpeg`;
const [pagespeedOutput, _] = await Promise.all([
getPagespeedData(href),
page.screenshot({
path: path,
type: 'webp',
type: 'jpeg',
quality: 50,
}),
]);
Expand Down Expand Up @@ -119,33 +143,34 @@ async function captureMultipleScreenshots() {
ttiTime,
};
output.push({
...pageData,
ts: Date.now(),
title,
imgSrc: `/showcases/${filename}.webp`,
imgSrc: `/showcases/${filename}.jpeg`,
perf,
...pageData,
version,
});
console.log(`✅ ${title} - (${href})`);
} catch (err) {
console.error(err);
} finally {
if (page) {
if (page!) {
await page.close();
}
}
}
} catch (err) {
console.log(`❌ Error: ${err.message}`);
console.log(`❌ Error: ${(err as Error)?.message || err}`);
} finally {
if (browser) {
await browser.close();
}
console.log(`\n🎉 ${pages.length} screenshots captured.`);
}
fs.writeFileSync(OUTPUT_JSON, JSON.stringify(output, undefined, 2) + '\n');
writeFileSync(OUTPUT_JSON, JSON.stringify(output, undefined, 2) + '\n');
}

async function getPagespeedData(url) {
const { fetch } = await import('undici');
async function getPagespeedData(url: string) {
const requestURL = `https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=${encodeURIComponent(
url
)}&key=AIzaSyApBC9gblaCzWrtEBgHnZkd_B37OF49BfM&category=PERFORMANCE&strategy=MOBILE`;
Expand All @@ -157,11 +182,15 @@ async function getPagespeedData(url) {
if (!res.ok) {
throw new Error(await res.text());
}
return res.json();
return res.json() as Promise<{
lighthouseResult: any;
loadingExperience: any;
pagespeedResult: any;
}>;
});
}
captureMultipleScreenshots();

function wait(ms) {
function wait(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
Loading