Просмотр исходного кода

feat: better iife build w/ global var & header

Sven 1 год назад
Родитель
Сommit
72ee0e79bc
5 измененных файлов с 87 добавлено и 50 удалено
  1. 1 1
      .github/CONTRIBUTING.md
  2. 21 41
      package-lock.json
  3. 7 3
      package.json
  4. 52 0
      tools/post-build-global.mts
  5. 6 5
      tsconfig.json

+ 1 - 1
.github/CONTRIBUTING.md

@@ -15,7 +15,7 @@ Thanks to Matt Pocock for his video on how to set up a modern TypeScript library
 | :-- | :-- |
 | `npm run lint` | Run TSC and ESLint to lint the code |
 | `npm run build` | Build the project with tsup, outputting minified CJS and ESM bundles to `dist/` |
-| `npm run build-iife` | Build the project with tsup, outputting a minified IIFE bundle to `dist/` (for publishing to greasyfork) |
+| `npm run build-global` | Build the project with tsup, outputting a minified bundle that exports as a global, including a userscript header to `dist/` (for publishing to greasyfork) |
 | `npm run dev` | Watch for changes and build the project without minification and with sourcemaps |
 
 <br>

+ 21 - 41
package-lock.json

@@ -1,19 +1,21 @@
 {
   "name": "@sv443-network/userutils",
-  "version": "0.1.4",
+  "version": "0.5.3",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "@sv443-network/userutils",
-      "version": "0.1.4",
+      "version": "0.5.3",
       "license": "MIT",
       "devDependencies": {
         "@changesets/cli": "^2.26.2",
         "@types/greasemonkey": "^4.0.4",
+        "@types/node": "^20.5.9",
         "@typescript-eslint/eslint-plugin": "^6.2.1",
         "@typescript-eslint/parser": "^6.2.1",
         "eslint": "^8.46.0",
+        "ts-node": "^10.9.1",
         "tslib": "^2.6.1",
         "tsup": "^7.2.0",
         "typescript": "^5.1.6"
@@ -718,8 +720,6 @@
       "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
       "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
       "dev": true,
-      "optional": true,
-      "peer": true,
       "dependencies": {
         "@jridgewell/trace-mapping": "0.3.9"
       },
@@ -732,8 +732,6 @@
       "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
       "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
       "dev": true,
-      "optional": true,
-      "peer": true,
       "dependencies": {
         "@jridgewell/resolve-uri": "^3.0.3",
         "@jridgewell/sourcemap-codec": "^1.4.10"
@@ -1246,6 +1244,12 @@
         "fs-extra": "^8.1.0"
       }
     },
+    "node_modules/@manypkg/find-root/node_modules/@types/node": {
+      "version": "12.20.55",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
+      "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==",
+      "dev": true
+    },
     "node_modules/@manypkg/find-root/node_modules/find-up": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
@@ -1385,33 +1389,25 @@
       "version": "1.0.9",
       "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
       "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
-      "dev": true,
-      "optional": true,
-      "peer": true
+      "dev": true
     },
     "node_modules/@tsconfig/node12": {
       "version": "1.0.11",
       "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
       "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
-      "dev": true,
-      "optional": true,
-      "peer": true
+      "dev": true
     },
     "node_modules/@tsconfig/node14": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
       "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
-      "dev": true,
-      "optional": true,
-      "peer": true
+      "dev": true
     },
     "node_modules/@tsconfig/node16": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
       "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
-      "dev": true,
-      "optional": true,
-      "peer": true
+      "dev": true
     },
     "node_modules/@types/greasemonkey": {
       "version": "4.0.4",
@@ -1441,9 +1437,9 @@
       "dev": true
     },
     "node_modules/@types/node": {
-      "version": "12.20.55",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
-      "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==",
+      "version": "20.5.9",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz",
+      "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==",
       "dev": true
     },
     "node_modules/@types/normalize-package-data": {
@@ -1674,8 +1670,6 @@
       "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
       "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
       "dev": true,
-      "optional": true,
-      "peer": true,
       "engines": {
         "node": ">=0.4.0"
       }
@@ -1752,9 +1746,7 @@
       "version": "4.1.3",
       "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
       "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
-      "dev": true,
-      "optional": true,
-      "peer": true
+      "dev": true
     },
     "node_modules/argparse": {
       "version": "2.0.1",
@@ -2109,9 +2101,7 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
       "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
-      "dev": true,
-      "optional": true,
-      "peer": true
+      "dev": true
     },
     "node_modules/cross-spawn": {
       "version": "7.0.3",
@@ -2259,8 +2249,6 @@
       "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
       "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
       "dev": true,
-      "optional": true,
-      "peer": true,
       "engines": {
         "node": ">=0.3.1"
       }
@@ -3745,9 +3733,7 @@
       "version": "1.3.6",
       "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
       "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
-      "dev": true,
-      "optional": true,
-      "peer": true
+      "dev": true
     },
     "node_modules/map-obj": {
       "version": "4.3.0",
@@ -5336,8 +5322,6 @@
       "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
       "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
       "dev": true,
-      "optional": true,
-      "peer": true,
       "dependencies": {
         "@cspotcode/source-map-support": "^0.8.0",
         "@tsconfig/node10": "^1.0.7",
@@ -5596,9 +5580,7 @@
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
       "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
-      "dev": true,
-      "optional": true,
-      "peer": true
+      "dev": true
     },
     "node_modules/validate-npm-package-license": {
       "version": "3.0.4",
@@ -5797,8 +5779,6 @@
       "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
       "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
       "dev": true,
-      "optional": true,
-      "peer": true,
       "engines": {
         "node": ">=6"
       }

+ 7 - 3
package.json

@@ -9,10 +9,12 @@
     "lint": "tsc --noEmit && eslint .",
     "build-types": "tsc --emitDeclarationOnly --declaration --outDir dist",
     "build-common": "tsup lib/index.ts --format cjs,esm --clean --treeshake",
-    "build-iife": "tsup lib/index.ts --format cjs,esm,iife --clean --treeshake --minify",
+    "build-global": "tsup lib/index.ts --format cjs,esm,iife --clean --treeshake --onSuccess \"npm run post-build-global\"",
     "build": "npm run build-common -- --minify && npm run build-types",
+    "post-build-global": "npm run node-ts -- ./tools/post-build-global.mts",
     "dev": "npm run build-common -- --sourcemap --watch --onSuccess \"npm run build-types\"",
-    "publish-package": "npm run build && changeset publish"
+    "publish-package": "npm run build && changeset publish",
+    "node-ts": "node --no-warnings=ExperimentalWarning --enable-source-maps --loader ts-node/esm"
   },
   "repository": {
     "type": "git",
@@ -30,13 +32,15 @@
   "bugs": {
     "url": "https://github.com/Sv443-Network/UserUtils/issues"
   },
-  "homepage": "https://github.com/Sv443-Network/UserUtils#readme",
+  "homepage": "https://github.com/Sv443-Network/UserUtils",
   "devDependencies": {
     "@changesets/cli": "^2.26.2",
     "@types/greasemonkey": "^4.0.4",
+    "@types/node": "^20.5.9",
     "@typescript-eslint/eslint-plugin": "^6.2.1",
     "@typescript-eslint/parser": "^6.2.1",
     "eslint": "^8.46.0",
+    "ts-node": "^10.9.1",
     "tslib": "^2.6.1",
     "tsup": "^7.2.0",
     "typescript": "^5.1.6"

+ 52 - 0
tools/post-build-global.mts

@@ -0,0 +1,52 @@
+import { access, constants as fsconstants, readFile, writeFile } from "fs/promises";
+import { resolve } from "path";
+import packageJson from "../package.json" assert { type: "json" };
+
+const { exit } = process;
+
+const iifeScriptPath = resolve("dist/index.global.js");
+
+async function run() {
+  if(!await exists(iifeScriptPath)) {
+    console.error(`No global script found at path '${iifeScriptPath}'`);
+    setImmediate(() => exit(1));
+    return;
+  }
+
+  const libHeader = `\
+// ==UserScript==
+// @name         UserUtils
+// @description  ${packageJson.description}
+// @namespace    ${packageJson.homepage}
+// @version      ${packageJson.version}
+// @license      ${packageJson.license}
+// @author       ${packageJson.author.name}
+// @copyright    ${packageJson.author.name} (${packageJson.author.url})
+// @supportURL   ${packageJson.bugs.url}
+// @homepageURL  ${packageJson.homepage}#readme
+// ==/UserScript==
+`;
+
+  const initialScript = await readFile(iifeScriptPath, "utf8");
+  let finalScript = `\
+${libHeader}
+var UserUtils = ${initialScript}`;
+  finalScript = finalScript.replace(/^\s*'use strict';\s*\r?\n{1,2}/gm, "");
+
+  await writeFile(iifeScriptPath, finalScript, "utf8");
+  console.log(`Global script at path '${iifeScriptPath}' has been updated`);
+
+  setImmediate(() => exit(0));
+}
+
+async function exists(path: string) {
+  try {
+    await access(path, fsconstants.R_OK | fsconstants.W_OK);
+    return true;
+  }
+  catch(err) {
+    return false;
+  }
+}
+
+run();

+ 6 - 5
tsconfig.json

@@ -5,17 +5,18 @@
     "target": "ES2016",
     "outDir": "dist/out",
     "lib": ["ES2020", "DOM", "DOM.Iterable"],
-    "allowSyntheticDefaultImports": true,
     "baseUrl": ".",
+    "rootDir": ".",
+    "allowSyntheticDefaultImports": true,
     "forceConsistentCasingInFileNames": true,
     "isolatedModules": true,
-    "rootDir": ".",
+    "noImplicitThis": false,
+    "noUncheckedIndexedAccess": true,
+    "resolveJsonModule": true,
     "skipLibCheck": true,
     "sourceMap": true,
     "strict": true,
-    "useDefineForClassFields": true,
-    "noImplicitThis": false,
-    "noUncheckedIndexedAccess": true
+    "useDefineForClassFields": true
   },
   "exclude": ["**/*.js", "dist/**"]
 }