Automated local development proxy using Caddy. Handles HTTPS (.test domains) and HMR automatically.
brew install caddythis is the "(Default) Soft" theme I'm using as a base https://marketplace.visualstudio.com/items?itemName=janicweber.soft-grey-theme
and this is the one for dark mode https://marketplace.visualstudio.com/items?itemName=zhuangtongfa.Material-theme
open /Applications/Cursor.app/Contents/Resources/app/out/vs/platform/accessibilitySignal/browser/mediaThis guide is for macOS only.
| (async function collectSpotifyPlaylist() { | |
| const TRACK_SELECTOR = '._iQpvk1c9OgRAc8KRTlH'; | |
| // Find the correct scroll container | |
| let scrollContainers = document.querySelectorAll('[data-overlayscrollbars-viewport]'); | |
| let scrollContainer = scrollContainers.length > 1 ? scrollContainers[1] : scrollContainers[0]; | |
| if (!scrollContainer) { | |
| console.error("Could not find the scrollable playlist container."); | |
| return; |
| export const storage = { | |
| async get(key) { | |
| return new Promise((resolve, reject) => { | |
| chrome.storage.local.get(key, (result) => { | |
| if (chrome.runtime.lastError) { | |
| return reject(chrome.runtime.lastError) | |
| } | |
| resolve(result[key]) | |
| }) | |
| }) |
| // Not sure whether it's genius or stupid, but it definitely works. | |
| // The goal is to reduce chaining critical requests. | |
| // By default in most cases Astro do this: html -> small chunk -> big chunk(s), which is kinda like Require.js, where you need to download file, to know what file you want to download. | |
| // Code below takes this small chunk and inlines it into html, so we have at least one client-side request to make less: html -> big chunk(s). | |
| // Additionally we can add "modulepreload" to start fetching those files faster (not sure where in this particular case it makes any sense, but was easy to add, so I did it). | |
| // For sure this code isn't optimal, I just quickly hacked it just to have PoC, but I belive it won't hurt server-side performance that much. | |
| // If you know some better way to do it, that doesn't require digging through HTML and replacing strings, please let me know. | |
| import fs from "node:fs" | |
| import path from "node:path" |
| import axios from "axios" | |
| import TTLCache from "@isaacs/ttlcache" | |
| const domainsCache = new TTLCache({ | |
| ttl: 1000 * 60 * 60 * 24, | |
| }) as TTLCache<string, Set<string>> | |
| interface ListConfig { | |
| url: string | |
| type: "text" | "json" |
| // How to use this script? | |
| // 1. Set LinkedIn language to engligh (I just didn't test it on others) | |
| // 2. Go to https://www.linkedin.com/mynetwork/invite-connect/connections/ | |
| // 3. Paste this script to the console and watch :) | |
| [...document.querySelectorAll('.mn-connection-card')] | |
| // Comment out line below, if you want to remove not only people joined your network in the last year | |
| .filter(el => el.querySelector('.time-badge').innerText.search(/year/igm) === -1) | |
| .filter(el => el.querySelector('.mn-connection-card__occupation').innerText.search(/recruit|rekru|hr|talent|headhunter|people|resource|hiring|build|job|researcher/gmi) !== -1) | |
| .forEach((el, index) => { |
| import path from 'node:path' | |
| import fs from 'node:fs/promises' | |
| import { globby } from 'globby' | |
| const files = await globby('./dist/**/index.html') | |
| await Promise.all( | |
| files.map(async htmlPath => { | |
| const pageStyles = [] | |
| const stylesPaths = [] |