diff --git a/BondageClub/CHANGELOG.md b/BondageClub/CHANGELOG.md index 15131a0e5d..11004a0bc2 100644 --- a/BondageClub/CHANGELOG.md +++ b/BondageClub/CHANGELOG.md @@ -11,9 +11,32 @@ This changelog follows the format outlined in [keepachangelog.com](https://keepa **Note to contributors:** To avoid merge conflicts, please don't update this file yourself in your PRs - one of the developers will update the changelog with your change before your PR is merged. -* Changelog last updated: 2025-01-20 -* Last recorded PR: [#5372](https://gitgud.io/BondageProjects/Bondage-College/-/merge_requests/5372) -* Last recorded commit hash: `20d260bde2f23349a54449d8ced9f52a071bf73a` +* Changelog last updated: 2025-01-25 +* Last recorded PR: [#5367](https://gitgud.io/BondageProjects/Bondage-College/-/merge_requests/5367) +* Last recorded commit hash: `2c88cee819d32702e64d4a2be121f88cc6707b32` + +## [Generated] +* git4nick - New Item Throne ([#5373](https://gitgud.io/BondageProjects/Bondage-College/-/merge_requests/5373)) +* Rama - ENH: Ensure that the asset's `ParentGroup` can be specified on a pose-by-pose basis ([#5370](https://gitgud.io/BondageProjects/Bondage-College/-/merge_requests/5370)) +* Estsanatlehi - Merge ChatCreate into ChatAdmin ([#5282](https://gitgud.io/BondageProjects/Bondage-College/-/merge_requests/5282)) +* Rama - HOTFIX: Add more async-related safety measures for dialog subscreen reloads ([#5374](https://gitgud.io/BondageProjects/Bondage-College/-/merge_requests/5374)) +* Estsanatlehi - Monthly post-merge CI cleanup ([#5367](https://gitgud.io/BondageProjects/Bondage-College/-/merge_requests/5367)) + +## [Unmatched commits] +* git4nick - New Item Throne (PR not found) +* Ben987 - R112 + Credits + Patrons (PR not found) +* Estsanatlehi - Merge the ChatCreate screen into ChatAdmin (PR not found) +* l3ra - fix: background text using old ChatCreate variable (PR not found) +* l3ra - fix: missing Whitelist properties (PR not found) +* l3ra - style: ensure consistent ordering of admin/whitelist/ban (PR not found) +* Estsanatlehi - fix: create rooms in the correct space (PR not found) +* l3ra - fix: replace outdated strings (and translations) (PR not found) +* Rama - ENH: Allow `ElementPositionFixed` to take both elements as well as element IDs (PR not found) +* Rama - MAINT: Add more `DialogMenu.Reload` async-related precautions (PR not found) +* Estsanatlehi - Monthly post-merge CI cleanup (PR not found) +* Estsanatlehi - Update uses of removed ChatCreate variables in Pandora (PR not found) +* Ben987 - FIX - Remove ChatCreate from Index (PR not found) + ## [R112] diff --git a/BondageClub/Tools/Node/.eslintrc.cjs b/BondageClub/Tools/Node/.eslintrc.cjs new file mode 100644 index 0000000000..bf2ab67efc --- /dev/null +++ b/BondageClub/Tools/Node/.eslintrc.cjs @@ -0,0 +1,12 @@ +// eslint-disable-next-line strict +"use strict"; +/** @type {import("eslint").ESLint.ConfigData} */ +module.exports = { + env: { + node: true, + }, + parserOptions: { + sourceType: "module", + ecmaVersion: 2022, + }, +}; diff --git a/BondageClub/Tools/Node/.eslintrc.js b/BondageClub/Tools/Node/.eslintrc.js deleted file mode 100644 index 80b72d9107..0000000000 --- a/BondageClub/Tools/Node/.eslintrc.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; -module.exports = { - env: { - node: true, - }, - parserOptions: { - ecmaVersion: 2022, - }, -}; diff --git a/BondageClub/Tools/Node/AssetCheck.js b/BondageClub/Tools/Node/AssetCheck.js index 5dd0221a33..cfa44f0c4e 100644 --- a/BondageClub/Tools/Node/AssetCheck.js +++ b/BondageClub/Tools/Node/AssetCheck.js @@ -1,10 +1,7 @@ -"use strict"; +import vm from "vm"; +import fs from "fs"; -const vm = require("vm"); -const fs = require("fs"); - -const { NEEDED_FILES, BASE_PATH, error, loadCSV, fromEntries, enumerate, keys, entries } = require("./Common.js"); -const common = require("./Common.js"); +import { NEEDED_FILES, BASE_PATH, error, loadCSV, fromEntries, enumerate, keys, entries, errorState } from "./Common.js"; /** * Checks for {@link AssetDefinition.DynamicGroupName} @@ -1396,20 +1393,20 @@ function sanitizeVMOutput(input) { const dialogArray = loadCSV("Assets/Female3DCG/AssetStrings.csv", 2); // No further checks if initial data load failed - if (common.localError) { + if (errorState.local) { return; } // Check all groups for (const Group of AssetFemale3DCG) { - common.localError = false; + errorState.local = false; // Check all assets in groups for (const Asset of Group.Asset) { if (typeof Asset === "string") { continue; } - common.localError = false; + errorState.local = false; // Check any extended item config if (Asset.Extended) { @@ -1446,7 +1443,7 @@ function sanitizeVMOutput(input) { } } - if (common.globalError) { + if (errorState.global) { console.log("WARNING: Type errors detected, skipping other checks"); return; } diff --git a/BondageClub/Tools/Node/Common.js b/BondageClub/Tools/Node/Common.js index 1d0a6b085f..461059e487 100644 --- a/BondageClub/Tools/Node/Common.js +++ b/BondageClub/Tools/Node/Common.js @@ -1,11 +1,9 @@ -/** Common utility scripts for the test suit. */ +/** Common utility scripts for the test suite. */ -"use strict"; - -const fs = require("fs"); +import fs from "fs"; /** Files needed to check the Female3DCG assets. */ -const NEEDED_FILES = [ +export const NEEDED_FILES = [ "Scripts/Common.js", "Scripts/Dialog.js", "Scripts/Pose.js", @@ -98,36 +96,38 @@ const NEEDED_FILES = [ ]; /** The base path for any BC asset/script lookup. */ -const BASE_PATH = "../../"; +export const BASE_PATH = "../../"; -let localError = false; -let globalError = false; +export const errorState = { + local: false, + global: false, +}; /** * Logs the error to console and sets erroneous exit code * @param {string} text The error */ -function error(text) { +export function error(text) { console.log("ERROR:", text); process.exitCode = 1; - localError = true; - globalError = true; + errorState.local = true; + errorState.global = true; } /** @see {@link Object.entries} */ -const entries = /** @type {<KT extends string, VT>(record: Partial<Record<KT, VT>>) => [key: KT, value: VT][]} */(Object.entries); +export const entries = /** @type {<KT extends string, VT>(record: Partial<Record<KT, VT>>) => [key: KT, value: VT][]} */(Object.entries); /** @see {@link Object.keys} */ -const keys = /** @type {<KT extends string>(record: Partial<Record<KT, unknown>>) => KT[]} */(Object.keys); +export const keys = /** @type {<KT extends string>(record: Partial<Record<KT, unknown>>) => KT[]} */(Object.keys); /** @see {@link Object.fromEntries} */ -const fromEntries = /** @type {<KT extends string, VT>(list: Iterable<readonly [key: KT, value: VT]>) => Record<KT, VT>} */(Object.fromEntries); +export const fromEntries = /** @type {<KT extends string, VT>(list: Iterable<readonly [key: KT, value: VT]>) => Record<KT, VT>} */(Object.fromEntries); /** * Return whether the passed object is a record/interface. * @type {(obj: unknown) => obj is Record<string, unknown>} */ -function isObject(obj) { +export function isObject(obj) { return obj !== null && typeof obj === "object" && !Array.isArray(obj); } @@ -136,7 +136,7 @@ function isObject(obj) { * @param {string} str - Content of the CSV * @returns {string[][]} Array representing each line of the parsed content, each line itself is split by commands and stored within an array. */ -function parseCSV(str) { +export function parseCSV(str) { /** @type {string[][]} */ let arr = []; let quote = false; // true means we're inside a quoted field @@ -192,7 +192,7 @@ function parseCSV(str) { * @param {string} path Path to file, relative to BondageClub directory * @param {number} expectedWidth Expected number of columns */ -function loadCSV(path, expectedWidth) { +export function loadCSV(path, expectedWidth) { const data = parseCSV(fs.readFileSync(BASE_PATH + path, { encoding: "utf-8" })); for (let line = 0; line < data.length; line++) { if (data[line].length !== expectedWidth) { @@ -210,7 +210,7 @@ function loadCSV(path, expectedWidth) { * @param {readonly T2[]} lst2 * @returns {[T1, T2][]} */ -function zip(lst1, lst2) { +export function zip(lst1, lst2) { const length = Math.min(lst1.length, lst2.length); /** @type {[T1, T2][]} */ const ret = []; @@ -227,7 +227,7 @@ function zip(lst1, lst2) { * @param {Readonly<T>} template A record containing *all* allowed keys and their default values * @returns {T} */ -function validateArgv(argv, template) { +export function validateArgv(argv, template) { const { _, ...kwargs } = argv; /** @type {string[]} */ @@ -260,27 +260,10 @@ function validateArgv(argv, template) { * @param {number} step * @returns {Generator<[index: number, value: T], void>} */ -function *enumerate(iterable, start=0, step=1) { +export function *enumerate(iterable, start=0, step=1) { let i = start; for (const j of iterable) { yield [i, j]; i += step; } } - -module.exports = { - NEEDED_FILES, - BASE_PATH, - localError, - globalError, - error, - entries, - keys, - fromEntries, - isObject, - loadCSV, - parseCSV, - zip, - validateArgv, - enumerate, -}; diff --git a/BondageClub/Tools/Node/FileCase.js b/BondageClub/Tools/Node/FileCase.js index 225c50d2e5..d9264449d3 100644 --- a/BondageClub/Tools/Node/FileCase.js +++ b/BondageClub/Tools/Node/FileCase.js @@ -1,7 +1,5 @@ -"use strict"; - -const fs = require("fs"); -const { BASE_PATH, error } = require("./Common"); +import fs from "fs"; +import { BASE_PATH, error } from "./Common.js"; /** * @param {string} root diff --git a/BondageClub/Tools/Node/GenerateChangelog.js b/BondageClub/Tools/Node/GenerateChangelog.js index 7a911c8ad9..074e493ea2 100644 --- a/BondageClub/Tools/Node/GenerateChangelog.js +++ b/BondageClub/Tools/Node/GenerateChangelog.js @@ -1,17 +1,14 @@ -// @ts-check -"use strict"; -const fs = require("fs"); -const path = require("path"); -const util = require("util"); -const cheerio = require("cheerio"); -const { marked } = require("marked"); -const simpleGit = require("simple-git"); -const nfetch = require("node-fetch"); +import fs from "fs"; +import path from "path"; +import util from "util"; +import * as cheerio from "cheerio"; +import { marked } from "marked"; +import { simpleGit } from "simple-git"; const readFileAsync = util.promisify(fs.readFile); const writeFileAsync = util.promisify(fs.writeFile); -const bcRoot = path.resolve(__dirname, "../.."); +const bcRoot = path.resolve(import.meta.dirname, "../.."); const htmlPath = path.join(bcRoot, "changelog.html"); const markdownPath = path.join(bcRoot, "CHANGELOG.md"); @@ -133,7 +130,7 @@ async function generateChangelogHtml() { const startIndex = sourceMarkdown.search(/^## \[R[0-9a-zA-Z]+]/m); const trimmedMarkdown = sourceMarkdown.substring(startIndex); - const renderedMarkdown = marked.parse(trimmedMarkdown); + const renderedMarkdown = await marked.parse(trimmedMarkdown); const $ = cheerio.load(sourceHtml); $("body").empty() @@ -143,7 +140,13 @@ async function generateChangelogHtml() { .append(generateContributorNote()) .append(renderedMarkdown); - await writeFileAsync(htmlPath, $.root().html()); + const contents = $.root().html(); + if (!contents) { + console.error(`no contents?`); + return; + } + + await writeFileAsync(htmlPath, contents); } function generateContributorNote() { @@ -175,8 +178,8 @@ async function fetchMergeRequests(page) { for (let i = 0; i < MAX_ATTEMPTS; i++) { console.log(`Fetching page ${page} of merge requests` + (i > 0 ? `(attempt ${i + 1})` : '')); try { - const response = await nfetch(`https://gitgud.io/api/v4/projects/${GIT_GUD_PROJECT_ID}/merge_requests?page=${page}`); - return await response.json(); + const response = await fetch(`https://gitgud.io/api/v4/projects/${GIT_GUD_PROJECT_ID}/merge_requests?page=${page}`); + return /** @type {any} */ (await response.json()); } catch (error) { console.warn(`Fetch of merge request page ${page} failed. Retrying...`); await new Promise((resolve) => setTimeout(resolve, 1000)); @@ -187,8 +190,7 @@ async function fetchMergeRequests(page) { } async function getCommits() { - /** @type {simpleGit.SimpleGit} */ - // @ts-expect-error + /** @type {import("simple-git").SimpleGit} */ const git = simpleGit(bcRoot); const remoteName = await git.revparse(['--abbrev-ref', "--symbolic-full-name", "@{u}"]); diff --git a/BondageClub/Tools/Node/PoseMapping.js b/BondageClub/Tools/Node/PoseMapping.js index b4c844147f..cfc8736109 100644 --- a/BondageClub/Tools/Node/PoseMapping.js +++ b/BondageClub/Tools/Node/PoseMapping.js @@ -1,12 +1,10 @@ -"use strict"; +import vm from "vm"; +import fs from "fs"; +import process from "process"; +import minimist from "minimist"; +import util from 'util'; -const vm = require("vm"); -const fs = require("fs"); -const process = require("process"); -const minimist = require("minimist"); -const util = require('util'); - -const { +import { NEEDED_FILES, BASE_PATH, loadCSV, @@ -15,7 +13,7 @@ const { keys, isObject, validateArgv, -} = require("./Common.js"); +} from "./Common.js"; /** @type {<T>(obj: T) => T} */ function noop(obj) { diff --git a/BondageClub/Tools/Node/SortCSV.js b/BondageClub/Tools/Node/SortCSV.js index 1c957c5852..3fdd0d8c97 100644 --- a/BondageClub/Tools/Node/SortCSV.js +++ b/BondageClub/Tools/Node/SortCSV.js @@ -1,11 +1,9 @@ -"use strict"; +import fs from "fs"; +import minimist from "minimist"; +import path from "path"; +import { createArrayCsvWriter } from 'csv-writer'; -const fs = require("fs"); -const minimist = require("minimist"); -const path = require("path"); -const { createArrayCsvWriter } = require('csv-writer'); - -const { parseCSV, zip, validateArgv, BASE_PATH } = require("./Common.js"); +import { parseCSV, zip, validateArgv, BASE_PATH } from "./Common.js"; const HELP = `\ Sort the entries of the passed csv file. @@ -64,10 +62,19 @@ function sortAllCSV(root, recursive=true) { (function () { const kwargsTemplate = { file: "", f: "", help: false, h: false, all: false }; - const kwargs = validateArgv(minimist( + const args = minimist( process.argv.slice(2), { string: ["file"], alias: { "h": "help", "f": "file" } }, - ), kwargsTemplate); + ); + /** @type {typeof kwargsTemplate} */ + let kwargs; + try { + kwargs = validateArgv(args, kwargsTemplate); + } catch (e) { + console.error(/** @type {Error} */(e).message); + console.log(HELP); + process.exit(-1); + } if (kwargs.help) { console.log(HELP); diff --git a/BondageClub/Tools/Node/gulpfile.js b/BondageClub/Tools/Node/gulpfile.js index 44cd6a458f..4f8860b053 100644 --- a/BondageClub/Tools/Node/gulpfile.js +++ b/BondageClub/Tools/Node/gulpfile.js @@ -1,32 +1,30 @@ -"use strict"; +import path from "path"; +import log from "fancy-log"; +import c from "ansi-colors"; +import gulp from "gulp"; +import gulpCount from "gulp-count"; +import gulpIf from "gulp-if"; +import gulpSize from "gulp-size"; +import filter from "gulp-filter"; +import imagemin from "gulp-imagemin"; +import jpegtran from "imagemin-jpegtran"; +import cache from "gulp-cache"; +import through from "through2"; +import { rimraf } from "rimraf"; +import { table } from "table"; +import prettyBytes from "pretty-bytes"; +import StreamCounter from "stream-counter"; -const path = require("path"); -const log = require("fancy-log"); -const c = require("ansi-colors"); -const gulp = require("gulp"); -const gulpCount = require("gulp-count"); -const gulpIf = require("gulp-if"); -const gulpSize = require("gulp-size"); -const filter = require("gulp-filter"); -const imagemin = require("gulp-imagemin"); -const jpegtran = require("imagemin-jpegtran"); -const cache = require("gulp-cache"); -const through = require("through2"); -const rimraf = require("rimraf"); -const { table } = require("table"); -const prettyBytes = require("pretty-bytes"); -const StreamCounter = require("stream-counter"); - -const BASE_DIR = path.resolve(__dirname, "..", ".."); -const CACHE_DIR = path.resolve(__dirname, ".imagemin-cache"); +const BASE_DIR = path.resolve(import.meta.dirname, "..", ".."); +const CACHE_DIR = path.resolve(import.meta.dirname, ".imagemin-cache"); const BATCH_SIZE = 500; const SIZE_CONFIG = { showTotal: false }; -exports.assetMinify = gulp.series(logIntro, analyzeBefore, generateBatches, minifyBatches, analyzeAfter, report); +export const assetMinify = gulp.series(logIntro, analyzeBefore, generateBatches, minifyBatches, analyzeAfter, report); -exports.clean = function (cb) { +export function clean(cb) { rimraf(CACHE_DIR, cb); -}; +} let files = []; let batches = []; @@ -154,19 +152,19 @@ function colorizeSizePercentage(before, after) { } function generateBatches(cb) { - log(`Splitting ${c.magenta(files.length)} files into batches of size ${c.magenta(BATCH_SIZE)}...`); + log(`Splitting ${c.magenta(`${files.length}`)} files into batches of size ${c.magenta(`${BATCH_SIZE}`)}...`); batches = []; for (let i = 0; i < files.length; i += BATCH_SIZE) { batches.push(files.slice(i, i + BATCH_SIZE)); } - log(`${c.magenta(batches.length)} batches generated.`); + log(`${c.magenta(`${batches.length}`)} batches generated.`); cb(); } function minifyBatches(cb) { const tasks = batches.map((batch, i) => { function minifyTask() { - log(`Minifying batch ${c.magenta(i + 1)} of ${c.magenta(batches.length)}`); + log(`Minifying batch ${c.magenta(`${i + 1}`)} of ${c.magenta(`${batches.length}`)}`); return minifyBatch(batch); } @@ -176,8 +174,7 @@ function minifyBatches(cb) { return gulp.series(...tasks, (seriesDone) => { seriesDone(); - cb(); - })(); + })(cb); } function minifyBatch(batch) { @@ -190,6 +187,8 @@ function minifyBatch(batch) { { name: "imagemin", fileCache: new cache.Cache({ + // @ts-expect-error There's something wrong with the typings here⦠+ // This is actually cache-swap's interface, which has this option. tmpDir: CACHE_DIR, cacheDirName: "imagemin-cache", }), @@ -197,7 +196,9 @@ function minifyBatch(batch) { )) .pipe(sizesAfter) .pipe(filter((file) => { + // @ts-expect-error Smuggling size through const sizeBefore = sizesBefore.sizes.get(file.path); + // @ts-expect-error Smuggling size through const sizeAfter = sizesAfter.sizes.get(file.path); if (sizeAfter > sizeBefore) { log(`Omitting file "${c.magenta(file.path)}": size after minification is greater than original size.`); @@ -259,7 +260,9 @@ function fileSizes() { return through.obj( async function (file, enc, cb) { + // @ts-expect-error Smuggling size through if (!this.sizes) { + // @ts-expect-error Smuggling size through this.sizes = sizes; } diff --git a/BondageClub/Tools/Node/jsconfig.json b/BondageClub/Tools/Node/jsconfig.json index 0f3984efdc..49ae171ef2 100644 --- a/BondageClub/Tools/Node/jsconfig.json +++ b/BondageClub/Tools/Node/jsconfig.json @@ -1,8 +1,9 @@ { "compilerOptions": { - "module": "commonjs", + "module": "NodeNext", "target": "ES2022", "lib": ["es2022"], + "moduleResolution": "nodenext", "checkJs": true, "strict": true, "noImplicitAny": false @@ -10,7 +11,7 @@ "include": [ "../../Assets/Female3DCG/Female3DCG_Types.d.ts", "../../Scripts/Typedef.d.ts", - "." + ".", ], "exclude": [ "Scripts/MessagesPatch.d.ts" diff --git a/BondageClub/Tools/Node/package.json b/BondageClub/Tools/Node/package.json new file mode 100644 index 0000000000..bedb411a91 --- /dev/null +++ b/BondageClub/Tools/Node/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/BondageClub/package-lock.json b/BondageClub/package-lock.json index 1318d7ef50..4ca7e35ae0 100644 --- a/BondageClub/package-lock.json +++ b/BondageClub/package-lock.json @@ -15,15 +15,26 @@ "socket.io-client": "^4.6.1" }, "devDependencies": { - "@types/css-font-loading-module": "^0.0.9", + "@types/core-js": "^2.5.8", + "@types/css-font-loading-module": "^0.0.14", + "@types/fancy-log": "^2.0.2", + "@types/gulp": "^4.0.17", + "@types/gulp-cache": "^0.4.9", + "@types/gulp-filter": "^3.0.39", + "@types/gulp-imagemin": "^8.0.6", + "@types/gulp-size": "^4.0.3", + "@types/imagemin-jpegtran": "^5.0.4", + "@types/lodash.template": "^4.5.3", + "@types/minimist": "^1.2.5", "@types/node": "^20.8.7", + "@types/stream-counter": "^1.0.3", "ansi-colors": "^4.1.1", "cheerio": "^1.0.0-rc.3", "eslint": "^8.51.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-compat": "^4.1.2", "eslint-plugin-sort-keys-custom": "^2.0.0", - "fancy-log": "^1.3.3", + "fancy-log": "^2.0.0", "gulp": "^4.0.2", "gulp-cache": "^1.1.3", "gulp-count": "^1.0.0", @@ -32,20 +43,19 @@ "gulp-imagemin": "^7.1.0", "gulp-size": "^4.0.1", "imagemin-jpegtran": "^7.0.0", - "marked": "^4.0.10", + "marked": "^15.0.6", "minimist": "^1.2.6", - "node-fetch": "^2.6.7", "npm-run-all": "^4.1.5", "prettier": "^3.0.3", "prettier-eslint": "^16.1.1", "prettier-eslint-cli": "^8.0.1", "pretty-bytes": "^5.6.0", - "rimraf": "^3.0.2", + "rimraf": "^6.0.1", "simple-git": "^3.5.0", "stream-counter": "^1.0.0", "table": "^6.7.3", "through2": "^4.0.2", - "typescript": "^5.2.2" + "typescript": "^5.7.3" }, "engines": { "node": ">= 20" @@ -848,10 +858,16 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" }, + "node_modules/@types/core-js": { + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/@types/core-js/-/core-js-2.5.8.tgz", + "integrity": "sha512-VgnAj6tIAhJhZdJ8/IpxdatM8G4OD3VWGlp6xIxUGENZlpbob9Ty4VVdC1FIEp0aK6DBscDDjyzy5FB60TuNqg==", + "dev": true + }, "node_modules/@types/css-font-loading-module": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.9.tgz", - "integrity": "sha512-HU/J7J/3Bw7QJBOHWcY+77KreCqx/z//cYwJK6w40o9F5tCrrjrPY2f+YRJbjSYCKzjojmn6jafK6bn9Qht0iA==", + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.14.tgz", + "integrity": "sha512-+EwJ/RW2vPqbYn0JXRHy593huPCtgmLF/kg57iLK9KUn6neTqGGOTZ0CbssP8Uou/gqT/5XmWKQ8A7ve7xNV6A==", "dev": true }, "node_modules/@types/earcut": { @@ -859,6 +875,18 @@ "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.4.tgz", "integrity": "sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==" }, + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "dev": true + }, + "node_modules/@types/fancy-log": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/fancy-log/-/fancy-log-2.0.2.tgz", + "integrity": "sha512-SXVJvqWjsl90VwBfp7w4iQ0iO+vxAjQImglcpwbV9GkqNoUD5/p9Wsgetl40F1WL7pzWFN/eZPTF1g5FZXJsIw==", + "dev": true + }, "node_modules/@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -869,12 +897,383 @@ "@types/node": "*" } }, + "node_modules/@types/glob-stream": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-8.0.2.tgz", + "integrity": "sha512-kyuRfGE+yiSJWzSO3t74rXxdZNdYfLcllO0IUha4eX1fl40pm9L02Q/TEc3mykTLjoWz4STBNwYnUWdFu3I0DA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/picomatch": "*", + "@types/streamx": "*" + } + }, + "node_modules/@types/gulp": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@types/gulp/-/gulp-4.0.17.tgz", + "integrity": "sha512-+pKQynu2C/HS16kgmDlAicjtFYP8kaa86eE9P0Ae7GB5W29we/E2TIdbOWtEZD5XkpY+jr8fyqfwO6SWZecLpQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/undertaker": ">=1.2.6", + "@types/vinyl-fs": "*", + "chokidar": "^3.3.1" + } + }, + "node_modules/@types/gulp-cache": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@types/gulp-cache/-/gulp-cache-0.4.9.tgz", + "integrity": "sha512-mCYT2b82N1c5tDLmjT98Z/hVF1cbqTYddgrXqHi/XeZJAjMTla3ab4ZbA+JSW6ARf1YL4YHYykNl/kSt/+q2BA==", + "dev": true, + "dependencies": { + "@types/gulp-util": "*", + "@types/node": "*", + "@types/vinyl": "*" + } + }, + "node_modules/@types/gulp-filter": { + "version": "3.0.39", + "resolved": "https://registry.npmjs.org/@types/gulp-filter/-/gulp-filter-3.0.39.tgz", + "integrity": "sha512-CmjD9Y90+uFl0sHODOcAwSif2DXkCCkneItIifgbRgzSPTQ0wePzxPkLQPT377Hur+2SvAl4u3jyLitbNRiSkg==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*", + "@types/vinyl": "*" + } + }, + "node_modules/@types/gulp-imagemin": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@types/gulp-imagemin/-/gulp-imagemin-8.0.6.tgz", + "integrity": "sha512-beIai/1wAnhOvfkIQq+QVPAjrP0+WkewygxgonMmSZ7Al8ZiNQU1D7AMmHYpj+3e0HFAWK0cUaIX+La3A1vqnA==", + "dev": true, + "dependencies": { + "@types/imagemin": "*", + "@types/imagemin-gifsicle": "*", + "@types/imagemin-mozjpeg": "*", + "@types/imagemin-optipng": "*", + "@types/imagemin-svgo": "*", + "@types/node": "*" + } + }, + "node_modules/@types/gulp-size": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/gulp-size/-/gulp-size-4.0.3.tgz", + "integrity": "sha512-NYvl6QRn4NoYry+EYF6aD1I5Vi2V9ir9LH23H2+oxe4NZ9OZAeHRUl76xIBpYI3VJajLFWTMJoD2N8OLFLZ+/g==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/gulp-util": { + "version": "3.0.41", + "resolved": "https://registry.npmjs.org/@types/gulp-util/-/gulp-util-3.0.41.tgz", + "integrity": "sha512-BK0kJZ8euQNlISsmD6mBr/1RZkB0mljdtBsz2usv+QHPV10alH2AJw5p05S9LU6S+VdTjbFmGU0OxpH++2W9/Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/through2": "*", + "@types/vinyl": "*", + "chalk": "^2.2.0" + } + }, + "node_modules/@types/gulp-util/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@types/gulp-util/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@types/gulp-util/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@types/gulp-util/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@types/gulp-util/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@types/gulp-util/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@types/gulp-util/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@types/gulp/node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/gulp/node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@types/gulp/node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/gulp/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@types/gulp/node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/gulp/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@types/gulp/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/gulp/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/gulp/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@types/gulp/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@types/gulp/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@types/imagemin": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/imagemin/-/imagemin-9.0.1.tgz", + "integrity": "sha512-xMWpvrUhtYxl6EeW+UhVH3rwUKhCRx21XddcoWByjDAasXZT5pQaCn0YVnXoTijX5hlTrGqV4TGQL/Htpp00+w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/imagemin-gifsicle": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/imagemin-gifsicle/-/imagemin-gifsicle-7.0.4.tgz", + "integrity": "sha512-ZghMBd/Jgqg5utTJNPmvf6DkuHzMhscJ8vgf/7MUGCpO+G+cLrhYltL+5d+h3A1B4W73S2SrmJZ1jS5LACpX+A==", + "dev": true, + "dependencies": { + "@types/imagemin": "*" + } + }, + "node_modules/@types/imagemin-jpegtran": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/imagemin-jpegtran/-/imagemin-jpegtran-5.0.4.tgz", + "integrity": "sha512-PSMxOeJa8q94Y+qx8Yriw+qj1+vH5xWpvar63o6SGO0Xi5RlKuwHHfJmN2GRUngPrlhe394jOUmpVq8jQlVmFA==", + "dev": true, + "dependencies": { + "@types/imagemin": "*" + } + }, + "node_modules/@types/imagemin-mozjpeg": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@types/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.4.tgz", + "integrity": "sha512-ZCAxV8SYJB8ehwHpnbRpHjg5Wc4HcyuAMiDhXbkgC7gujDoOTyHO3dhDkUtZ1oK1DLBRZapqG9etdLVhUml7yQ==", + "dev": true, + "dependencies": { + "@types/imagemin": "*" + } + }, + "node_modules/@types/imagemin-optipng": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@types/imagemin-optipng/-/imagemin-optipng-5.2.4.tgz", + "integrity": "sha512-mvKnDMC8eCYZetAQudjs1DbgpR84WhsTx1wgvdiXnpuUEti3oJ+MaMYBRWPY0JlQ4+y4TXKOfa7+LOuT8daegQ==", + "dev": true, + "dependencies": { + "@types/imagemin": "*" + } + }, + "node_modules/@types/imagemin-svgo": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/@types/imagemin-svgo/-/imagemin-svgo-10.0.5.tgz", + "integrity": "sha512-9U2Rf7vWBHeqJvzmWNP3vYAKqR0208QqQ9Mkrq9OLIL5AeoF/dRVRou6iUYCufBSim57BpBpCJhZLrTgfS3k1g==", + "dev": true, + "dependencies": { + "@types/imagemin": "*", + "@types/svgo": "2" + } + }, + "node_modules/@types/lodash": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.14.tgz", + "integrity": "sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==", + "dev": true + }, + "node_modules/@types/lodash.template": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/@types/lodash.template/-/lodash.template-4.5.3.tgz", + "integrity": "sha512-Mo0UYKLu1oXgkV9TVoXZLlXXjyIXlW7ZQRxi/4gQJmzJr63dmicE8gG0OkPjYTKBrBic852q0JzqrtNUWLBIyA==", + "dev": true, + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, "node_modules/@types/node": { "version": "20.17.16", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.16.tgz", @@ -889,6 +1288,12 @@ "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" }, + "node_modules/@types/picomatch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-3.0.2.tgz", + "integrity": "sha512-n0i8TD3UDB7paoMMxA3Y65vUncFJXjcUf7lQY7YyKGl6031FNjfsLs6pdLFCy2GNFxItPJG8GvvpbZc2skH7WA==", + "dev": true + }, "node_modules/@types/q": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", @@ -896,6 +1301,80 @@ "dev": true, "optional": true }, + "node_modules/@types/stream-counter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/stream-counter/-/stream-counter-1.0.3.tgz", + "integrity": "sha512-m4N6AVVJUtyeFC3aCYZ7lYoADxzVViILOIsDVDh1Ap6BWTHifJobGJH+RDzcW9wEgvx3OdVdBaPGqgLr/HuunQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/streamx": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/@types/streamx/-/streamx-2.9.5.tgz", + "integrity": "sha512-IHYsa6jYrck8VEdSwpY141FTTf6D7boPeMq9jy4qazNrFMA4VbRz/sw5LSsfR7jwdDcx0QKWkUexZvsWBC2eIQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/svgo": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-2.6.4.tgz", + "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/through2": { + "version": "2.0.41", + "resolved": "https://registry.npmjs.org/@types/through2/-/through2-2.0.41.tgz", + "integrity": "sha512-ryQ0tidWkb1O1JuYvWKyMLYEtOWDqF5mHerJzKz/gQpoAaJq2l/dsMPBF0B5BNVT34rbARYJ5/tsZwLfUi2kwQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/undertaker": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/undertaker/-/undertaker-1.2.11.tgz", + "integrity": "sha512-j1Z0V2ByRHr8ZK7eOeGq0LGkkdthNFW0uAZGY22iRkNQNL9/vAV0yFPr1QN3FM/peY5bxs9P+1f0PYJTQVa5iA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/undertaker-registry": "*", + "async-done": "~1.3.2" + } + }, + "node_modules/@types/undertaker-registry": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/undertaker-registry/-/undertaker-registry-1.0.4.tgz", + "integrity": "sha512-tW77pHh2TU4uebWXWeEM5laiw8BuJ7pyJYDh6xenOs75nhny2kVgwYbegJ4BoLMYsIrXaBpKYaPdYO3/udG+hg==", + "dev": true + }, + "node_modules/@types/vinyl": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", + "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==", + "dev": true, + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "node_modules/@types/vinyl-fs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-3.0.5.tgz", + "integrity": "sha512-ckYz9giHgV6U10RFuf9WsDQ3X86EFougapxHmmoxLK7e6ICQqO8CE+4V/3lBN148V5N1pb4nQMmMjyScleVsig==", + "dev": true, + "dependencies": { + "@types/glob-stream": "*", + "@types/node": "*", + "@types/vinyl": "*" + } + }, "node_modules/@typescript-eslint/parser": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", @@ -4570,18 +5049,15 @@ } }, "node_modules/fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-2.0.0.tgz", + "integrity": "sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==", "dev": true, "dependencies": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" + "color-support": "^1.1.3" }, "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" } }, "node_modules/fast-deep-equal": { @@ -4927,6 +5403,22 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/flatted": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", @@ -5658,6 +6150,21 @@ "node": ">=0.10.0" } }, + "node_modules/gulp-cli/node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/gulp-count": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gulp-count/-/gulp-count-1.0.0.tgz", @@ -5787,6 +6294,21 @@ "node": ">=8" } }, + "node_modules/gulp-imagemin/node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/gulp-match": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.1.0.tgz", @@ -5826,6 +6348,21 @@ } } }, + "node_modules/gulp-size/node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/gulplog": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", @@ -7573,15 +8110,15 @@ } }, "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "version": "15.0.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.6.tgz", + "integrity": "sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg==", "dev": true, "bin": { "marked": "bin/marked.js" }, "engines": { - "node": ">= 12" + "node": ">= 18" } }, "node_modules/matchdep": { @@ -8051,26 +8588,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -10956,16 +11473,106 @@ } }, "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" }, "bin": { - "rimraf": "bin.js" + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", + "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/jackspeak": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -12722,12 +13329,6 @@ "xtend": "~4.0.1" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, "node_modules/trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -13354,12 +13955,6 @@ "eslint": ">=6.0.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -13381,16 +13976,6 @@ "node": ">=18" } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/BondageClub/package.json b/BondageClub/package.json index 48a817567c..f38e159551 100644 --- a/BondageClub/package.json +++ b/BondageClub/package.json @@ -39,15 +39,26 @@ "since 2020 and > 0.5% and not dead" ], "devDependencies": { - "@types/css-font-loading-module": "^0.0.9", + "@types/core-js": "^2.5.8", + "@types/css-font-loading-module": "^0.0.14", + "@types/fancy-log": "^2.0.2", + "@types/gulp": "^4.0.17", + "@types/gulp-cache": "^0.4.9", + "@types/gulp-filter": "^3.0.39", + "@types/gulp-imagemin": "^8.0.6", + "@types/gulp-size": "^4.0.3", + "@types/imagemin-jpegtran": "^5.0.4", + "@types/lodash.template": "^4.5.3", + "@types/minimist": "^1.2.5", "@types/node": "^20.8.7", + "@types/stream-counter": "^1.0.3", "ansi-colors": "^4.1.1", "cheerio": "^1.0.0-rc.3", "eslint": "^8.51.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-compat": "^4.1.2", "eslint-plugin-sort-keys-custom": "^2.0.0", - "fancy-log": "^1.3.3", + "fancy-log": "^2.0.0", "gulp": "^4.0.2", "gulp-cache": "^1.1.3", "gulp-count": "^1.0.0", @@ -56,20 +67,19 @@ "gulp-imagemin": "^7.1.0", "gulp-size": "^4.0.1", "imagemin-jpegtran": "^7.0.0", - "marked": "^4.0.10", + "marked": "^15.0.6", "minimist": "^1.2.6", - "node-fetch": "^2.6.7", "npm-run-all": "^4.1.5", "prettier": "^3.0.3", "prettier-eslint": "^16.1.1", "prettier-eslint-cli": "^8.0.1", "pretty-bytes": "^5.6.0", - "rimraf": "^3.0.2", + "rimraf": "^6.0.1", "simple-git": "^3.5.0", "stream-counter": "^1.0.0", "table": "^6.7.3", "through2": "^4.0.2", - "typescript": "^5.2.2" + "typescript": "^5.7.3" }, "dependencies": { "csv-writer": "^1.6.0",