From 238b07b7dda23c867f7d534725e7ae51a962871a Mon Sep 17 00:00:00 2001 From: Felix Rieseberg Date: Mon, 4 Jan 2021 09:54:20 -0800 Subject: [PATCH] build: Add a check-links tool --- package.json | 5 ++-- src/cache.ts | 28 ++++++++++---------- src/constants.ts | 2 +- src/main/ipc.ts | 6 ++--- src/main/main.ts | 2 +- src/renderer/card-settings.tsx | 2 +- src/renderer/emulator.tsx | 2 +- src/renderer/utils/get-state-path.ts | 9 +++---- tools/check-links.js | 38 ++++++++++++++++++++++++++++ 9 files changed, 65 insertions(+), 29 deletions(-) create mode 100644 tools/check-links.js diff --git a/package.json b/package.json index 96b1a8c..2e4b56d 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,10 @@ "package": "electron-forge package", "make": "electron-forge make", "publish": "electron-forge publish", - "lint": "prettier --write src/**/*.{ts,tsx}", + "lint": "prettier --write src/**/*.{ts,tsx} && npm run check-links", "less": "node ./tools/lessc.js", - "tsc": "tsc -p tsconfig.json --noEmit" + "tsc": "tsc -p tsconfig.json --noEmit", + "check-links": "node tools/check-links.js" }, "keywords": [], "author": "Felix Rieseberg, felix@felixrieseberg.com", diff --git a/src/cache.ts b/src/cache.ts index 3be22c7..7c4f9f9 100644 --- a/src/cache.ts +++ b/src/cache.ts @@ -16,19 +16,17 @@ export async function clearStorageData() { return; } - await session.defaultSession.clearStorageData( - { - storages: [ - "appcache", - "cookies", - "filesystem", - "indexdb", - "localstorage", - "shadercache", - "websql", - "serviceworkers", - ], - quotas: ["temporary", "persistent", "syncable"], - } - ); + await session.defaultSession.clearStorageData({ + storages: [ + "appcache", + "cookies", + "filesystem", + "indexdb", + "localstorage", + "shadercache", + "websql", + "serviceworkers", + ], + quotas: ["temporary", "persistent", "syncable"], + }); } diff --git a/src/constants.ts b/src/constants.ts index 23a7396..55ea5f2 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -3,7 +3,7 @@ import * as path from "path"; export const CONSTANTS = { IMAGE_PATH: path.join(__dirname, "../../images/windows95.img"), IMAGE_DEFAULT_SIZE: 1073741824, // 1GB - DEFAULT_STATE_PATH: path.join(__dirname, "../../images/default-state.bin") + DEFAULT_STATE_PATH: path.join(__dirname, "../../images/default-state.bin"), }; export const IPC_COMMANDS = { diff --git a/src/main/ipc.ts b/src/main/ipc.ts index bad084f..cd947c1 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -1,11 +1,11 @@ -import { ipcMain, app } from 'electron'; +import { ipcMain, app } from "electron"; import * as path from "path"; -import { IPC_COMMANDS } from '../constants'; +import { IPC_COMMANDS } from "../constants"; export function setupIpcListeners() { ipcMain.handle(IPC_COMMANDS.GET_STATE_PATH, () => { - return path.join(app.getPath("userData"), "state-v2.bin") + return path.join(app.getPath("userData"), "state-v2.bin"); }); ipcMain.handle(IPC_COMMANDS.APP_QUIT, () => { diff --git a/src/main/main.ts b/src/main/main.ts index 9076cb0..7960590 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -6,7 +6,7 @@ import { shouldQuit } from "./squirrel"; import { setupUpdates } from "./update"; import { getOrCreateWindow } from "./windows"; import { setupMenu } from "./menu"; -import { setupIpcListeners } from './ipc'; +import { setupIpcListeners } from "./ipc"; /** * Handle the app's "ready" event. This is essentially diff --git a/src/renderer/card-settings.tsx b/src/renderer/card-settings.tsx index 068ad0f..3a14db0 100644 --- a/src/renderer/card-settings.tsx +++ b/src/renderer/card-settings.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import * as fs from "fs-extra"; -import { getStatePath } from './utils/get-state-path'; +import { getStatePath } from "./utils/get-state-path"; interface CardSettingsProps { bootFromScratch: () => void; diff --git a/src/renderer/emulator.tsx b/src/renderer/emulator.tsx index f7e7fb3..3850f8a 100644 --- a/src/renderer/emulator.tsx +++ b/src/renderer/emulator.tsx @@ -10,7 +10,7 @@ import { StartMenu } from "./start-menu"; import { CardSettings } from "./card-settings"; import { EmulatorInfo } from "./emulator-info"; import { CardDrive } from "./card-drive"; -import { getStatePath } from './utils/get-state-path'; +import { getStatePath } from "./utils/get-state-path"; export interface EmulatorState { currentUiCard: string; diff --git a/src/renderer/utils/get-state-path.ts b/src/renderer/utils/get-state-path.ts index 305febb..6fbb0c6 100644 --- a/src/renderer/utils/get-state-path.ts +++ b/src/renderer/utils/get-state-path.ts @@ -1,7 +1,7 @@ -import { ipcRenderer } from 'electron'; -import { IPC_COMMANDS } from '../../constants'; +import { ipcRenderer } from "electron"; +import { IPC_COMMANDS } from "../../constants"; -let _statePath = ''; +let _statePath = ""; export async function getStatePath(): Promise { if (_statePath) { @@ -9,6 +9,5 @@ export async function getStatePath(): Promise { } const statePath = await ipcRenderer.invoke(IPC_COMMANDS.GET_STATE_PATH); - return _statePath = statePath; + return (_statePath = statePath); } - diff --git a/tools/check-links.js b/tools/check-links.js new file mode 100644 index 0000000..40cd8cb --- /dev/null +++ b/tools/check-links.js @@ -0,0 +1,38 @@ +const fs = require('fs/promises') +const path = require('path') +const fetch = require('node-fetch') + +const LINK_RGX = /(http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?/g; + +async function main() { + const readmePath = path.join(__dirname, '../README.md') + const readme = await fs.readFile(readmePath, 'utf-8') + const links = readme.match(LINK_RGX) + let failed = false + + for (const link of links) { + try { + const response = await fetch(link, { method: 'HEAD' }) + + if (!response.ok) { + // If we're inside GitHub's release asset server, we just ran into AWS not allowing + // HEAD requests, which is different from a 404. + if (!response.url.startsWith('https://github-production-release-asset')) { + throw new Error (`HTTP Error Response: ${response.status} ${response.statusText}`) + } + } + + console.log(`✅ ${link}`); + } catch (error) { + failed = true + + console.log(`❌ ${link}\n${error}`) + } + } + + if (failed) { + process.exit(-1); + } +} + +main()