diff --git a/package.json b/package.json index ee343fbe..d7a3328b 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "scripts": { "dev": "bunx --bun astro dev", "build": "bunx --bun astro build", - "build:lib": "bun scripts/index.js", - "package": "bun scripts/npm-package.js", + "build:lib": "bun scripts/index.ts", + "package": "bun scripts/npm-package.ts", "test:unit": "bun test tests/*.ts", "test:e2e": "playwright test", "format": "bunx --bun prettier --write .", diff --git a/scripts/build-languages.js b/scripts/build-languages.ts similarity index 85% rename from scripts/build-languages.js rename to scripts/build-languages.ts index d2b7eb41..f8182a0d 100644 --- a/scripts/build-languages.js +++ b/scripts/build-languages.ts @@ -1,9 +1,9 @@ -// @ts-check import hljs from "highlight.js"; -import { createMarkdown } from "./utils/create-markdown.js"; -import { mkdir } from "./utils/fs.js"; -import { toCamelCase } from "./utils/to-pascal-case.js"; -import { writeTo } from "./utils/write-to.js"; +import { createMarkdown } from "./utils/create-markdown"; +import { mkdir } from "./utils/fs"; +import { toCamelCase } from "./utils/to-pascal-case"; +import { writeTo } from "./utils/write-to"; +import type { ModuleNames } from "./build-styles"; export async function buildLanguages() { console.time("build languages"); @@ -20,8 +20,7 @@ export async function buildLanguages() { register: LanguageFn; }\n\n`; - /** @type {import("./build-styles").ModuleNames} */ - let lang = []; + let lang: ModuleNames = []; languages.forEach(async (name) => { let moduleName = name; diff --git a/scripts/build-styles.js b/scripts/build-styles.ts similarity index 87% rename from scripts/build-styles.js rename to scripts/build-styles.ts index 75dc8c1a..c3fec1ff 100644 --- a/scripts/build-styles.js +++ b/scripts/build-styles.ts @@ -1,27 +1,20 @@ -// @ts-check -import path from "path"; +import path from "node:path"; import { totalist } from "totalist"; -import { createMarkdown } from "./utils/create-markdown.js"; -import { copyFile, mkdir, readFile } from "./utils/fs.js"; -import { minifyCss } from "./utils/minify-css.js"; -import { toCamelCase } from "./utils/to-pascal-case.js"; -import { writeTo } from "./utils/write-to.js"; +import { createMarkdown } from "./utils/create-markdown"; +import { copyFile, mkdir, readFile } from "./utils/fs"; +import { minifyCss } from "./utils/minify-css"; +import { toCamelCase } from "./utils/to-pascal-case"; +import { writeTo } from "./utils/write-to"; -/** - * @typedef {Array<{ name: string; moduleName: string; }>} ModuleNames - */ +export type ModuleNames = Array<{ name: string; moduleName: string }>; export async function buildStyles() { console.time("build styles"); mkdir("src/styles"); let scoped_styles = ""; - - /** @type {string[]} */ - let names = []; - - /** @type {ModuleNames} */ - let styles = []; + let names: string[] = []; + let styles: ModuleNames = []; await totalist("node_modules/highlight.js/styles", async (file, absPath) => { /** diff --git a/scripts/index.js b/scripts/index.js deleted file mode 100644 index 13167b85..00000000 --- a/scripts/index.js +++ /dev/null @@ -1,11 +0,0 @@ -// @ts-check -import { buildLanguages } from "./build-languages.js"; -import { buildStyles } from "./build-styles.js"; -import { mkdir } from "./utils/fs.js"; - -(async () => { - mkdir("www/data"); - - await buildLanguages(); - await buildStyles(); -})(); diff --git a/scripts/index.ts b/scripts/index.ts new file mode 100644 index 00000000..ed1118e7 --- /dev/null +++ b/scripts/index.ts @@ -0,0 +1,10 @@ +import { buildLanguages } from "./build-languages"; +import { buildStyles } from "./build-styles"; +import { mkdir } from "./utils/fs"; + +(async () => { + mkdir("www/data"); + + await buildLanguages(); + await buildStyles(); +})(); diff --git a/scripts/npm-package.js b/scripts/npm-package.ts similarity index 87% rename from scripts/npm-package.js rename to scripts/npm-package.ts index 98c78dbe..8d2b187b 100644 --- a/scripts/npm-package.js +++ b/scripts/npm-package.ts @@ -1,15 +1,14 @@ -// @ts-check import fs from "node:fs"; -import { copyFile, mkdir, writeFile } from "./utils/fs.js"; +import { mkdir, writeFile } from "./utils/fs"; async function npmPackage() { console.time("package"); mkdir("./package"); - await copyFile("./package.json", "./package/package.json"); - await copyFile("./README.md", "./package/README.md"); - await copyFile("./LICENSE", "./package/LICENSE"); + await Bun.write("./package/package.json", Bun.file("./package.json")); + await Bun.write("./package/README.md", Bun.file("./README.md")); + await Bun.write("./package/LICENSE", Bun.file("./LICENSE")); // Copy source folder to package mkdir("./package/src"); diff --git a/scripts/utils/create-markdown.js b/scripts/utils/create-markdown.ts similarity index 58% rename from scripts/utils/create-markdown.js rename to scripts/utils/create-markdown.ts index de2680c9..6a7dbef7 100644 --- a/scripts/utils/create-markdown.js +++ b/scripts/utils/create-markdown.ts @@ -1,15 +1,11 @@ -// @ts-check import fs from "node:fs"; const pkg = JSON.parse( fs.readFileSync(new URL("../../package.json", import.meta.url), "utf8"), ); -/** - * Creates header metadata for supported languages/styles - * @type {(type: "Languages" | "Styles", len: number) => string} - */ -export const createMarkdown = (type, len) => +/** Creates header metadata for supported languages/styles */ +export const createMarkdown = (type: "Languages" | "Styles", len: number) => ` # Supported ${type} diff --git a/scripts/utils/fs.js b/scripts/utils/fs.ts similarity index 73% rename from scripts/utils/fs.js rename to scripts/utils/fs.ts index a6e05518..34c2eaaa 100644 --- a/scripts/utils/fs.js +++ b/scripts/utils/fs.ts @@ -1,9 +1,7 @@ -// @ts-check import fs from "node:fs"; import fsp from "node:fs/promises"; -/** @type {(dir: string, noRemove?: boolean) => void} */ -export const mkdir = (dir) => { +export const mkdir = (dir: string) => { if (fs.existsSync(dir)) { fs.rmSync(dir, { recursive: true }); } diff --git a/scripts/utils/index.js b/scripts/utils/index.js deleted file mode 100644 index ed838df1..00000000 --- a/scripts/utils/index.js +++ /dev/null @@ -1,4 +0,0 @@ -// @ts-check -export { createMarkdown } from "./create-markdown.js"; -export { toCamelCase } from "./to-pascal-case.js"; -export { writeTo } from "./write-to.js"; diff --git a/scripts/utils/index.ts b/scripts/utils/index.ts new file mode 100644 index 00000000..983826c3 --- /dev/null +++ b/scripts/utils/index.ts @@ -0,0 +1,3 @@ +export { createMarkdown } from "./create-markdown"; +export { toCamelCase } from "./to-pascal-case"; +export { writeTo } from "./write-to"; diff --git a/scripts/utils/minify-css.js b/scripts/utils/minify-css.js deleted file mode 100644 index a5ae689b..00000000 --- a/scripts/utils/minify-css.js +++ /dev/null @@ -1,13 +0,0 @@ -// @ts-check -import cssnano from "cssnano"; -import litePreset from "cssnano-preset-lite"; -import postcss from "postcss"; - -/** @type {(css: string, discardComments?: import('cssnano-preset-lite').Options['discardComments']) => string} */ -export const minifyCss = (css, discardComments = false) => { - const preset = litePreset({ - discardComments, - }); - - return postcss([cssnano({ preset })]).process(css).css; -}; diff --git a/scripts/utils/minify-css.ts b/scripts/utils/minify-css.ts new file mode 100644 index 00000000..4b771c06 --- /dev/null +++ b/scripts/utils/minify-css.ts @@ -0,0 +1,12 @@ +import cssnano from "cssnano"; +import litePreset, { type LiteOptions } from "cssnano-preset-lite"; +import postcss from "postcss"; + +export const minifyCss = ( + css: string, + discardComments?: LiteOptions["discardComments"], +) => { + return postcss([ + cssnano({ preset: litePreset({ discardComments }) }), + ]).process(css).css; +}; diff --git a/scripts/utils/to-pascal-case.js b/scripts/utils/to-pascal-case.ts similarity index 79% rename from scripts/utils/to-pascal-case.js rename to scripts/utils/to-pascal-case.ts index 7eee753d..aded20d6 100644 --- a/scripts/utils/to-pascal-case.js +++ b/scripts/utils/to-pascal-case.ts @@ -1,11 +1,9 @@ -// @ts-check /** - * @type {(str: string) => string} * Converts a dash/period separated string into pascal case * @example * "one-two-three" --> "oneTwoThree" */ -export const toCamelCase = (str) => +export const toCamelCase = (str: string) => str .split(new RegExp(/-|\./g)) .map((fragment, index) => { diff --git a/scripts/utils/write-to.js b/scripts/utils/write-to.js deleted file mode 100644 index 39802a36..00000000 --- a/scripts/utils/write-to.js +++ /dev/null @@ -1,24 +0,0 @@ -// @ts-check -import path from "path"; -import prettier from "prettier"; -import { writeFile } from "./fs.js"; - -const { format } = prettier; - -/** @type {Record} */ -const PARSER = { - ".md": "markdown", - ".js": "babel", - ".ts": "typescript", - ".json": "json", - ".css": "css", -}; - -/** @type {(file: string, source: object | string) => Promise} */ -export async function writeTo(file, source) { - const value = - typeof source === "string" ? source : JSON.stringify(source, null, 2); - const parser = PARSER[path.parse(file).ext]; - - await writeFile(file, await format(value, { parser })); -} diff --git a/scripts/utils/write-to.ts b/scripts/utils/write-to.ts new file mode 100644 index 00000000..808304f9 --- /dev/null +++ b/scripts/utils/write-to.ts @@ -0,0 +1,21 @@ +import path from "node:path"; +import prettier, { type BuiltInParserName } from "prettier"; +import { writeFile } from "./fs"; + +const PARSER: Record = { + ".md": "markdown", + ".js": "babel", + ".ts": "typescript", + ".json": "json", + ".css": "css", +}; + +export async function writeTo(file: string, source: string | object) { + const value = + typeof source === "string" ? source : JSON.stringify(source, null, 2); + const parser = PARSER[path.parse(file).ext]; + + if (!parser) throw new Error(`No parser found for ${file}`); + + await writeFile(file, await prettier.format(value, { parser })); +} diff --git a/tsconfig.json b/tsconfig.json index d2eae215..2ca0e5f8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,5 +13,5 @@ "svelte-highlight/*": ["./src/*"] } }, - "include": ["src/**/*", "www/**/*", "tests/**/*"] + "include": ["src/**/*", "www/**/*", "tests/**/*", "scripts/**/*"], }