diff --git a/.changeset/fluffy-doors-sell.md b/.changeset/fluffy-doors-sell.md new file mode 100644 index 00000000..31050828 --- /dev/null +++ b/.changeset/fluffy-doors-sell.md @@ -0,0 +1,5 @@ +--- +"counterfact": patch +--- + +a lot of refactoring of the code that loads modules diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 873062d7..1ccfa4ff 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -4,6 +4,15 @@ const rules = { "@microsoft/sdl/no-html-method": "off", "@typescript-eslint/lines-around-comment": "off", "@typescript-eslint/naming-convention": "off", + + "id-length": [ + "error", + { + exceptions: ["$"], + min: 2, + }, + ], + "import/default": "off", "import/namespace": "off", @@ -31,6 +40,7 @@ const rules = { ], "node/file-extension-in-import": "off", + "node/no-callback-literal": "off", "node/no-missing-import": "off", diff --git a/.mise.toml b/.mise.toml new file mode 100644 index 00000000..126f6807 --- /dev/null +++ b/.mise.toml @@ -0,0 +1,2 @@ +[tools] +node = "20" diff --git a/.rtx.toml b/.rtx.toml deleted file mode 100644 index 7d030b2b..00000000 --- a/.rtx.toml +++ /dev/null @@ -1,2 +0,0 @@ -[tools] -node = "18" diff --git a/package.json b/package.json index c535d1da..0427ef7e 100644 --- a/package.json +++ b/package.json @@ -99,6 +99,7 @@ "node-fetch": "3.3.2", "open": "10.1.0", "patch-package": "8.0.0", + "precinct": "^12.1.1", "prettier": "3.2.5", "typescript": "5.4.5" } diff --git a/src/server/context-registry.ts b/src/server/context-registry.ts index 41ee68be..3313bbbd 100644 --- a/src/server/context-registry.ts +++ b/src/server/context-registry.ts @@ -15,6 +15,8 @@ export class ContextRegistry { private readonly cache = new Map(); + private readonly seen = new Set(); + public constructor() { this.add("/", {}); } @@ -28,11 +30,18 @@ export class ContextRegistry { return this.entries.get(path) ?? this.find(parentPath(path)); } + // eslint-disable-next-line max-statements public update(path: string, updatedContext?: Context): void { if (updatedContext === undefined) { return; } + if (!this.seen.has(path)) { + this.seen.add(path); + this.add(path, updatedContext); + return; + } + const context = this.find(path); for (const property in updatedContext) { diff --git a/src/server/module-dependency-graph.ts b/src/server/module-dependency-graph.ts new file mode 100644 index 00000000..85419bbd --- /dev/null +++ b/src/server/module-dependency-graph.ts @@ -0,0 +1,59 @@ +import { dirname, resolve } from "node:path"; + +import precinct from "precinct"; + +export class ModuleDependencyGraph { + private readonly dependents = new Map>(); + + private loadDependencies(path: string) { + try { + return precinct.paperwork(path); + } catch { + return []; + } + } + + private clearDependents(path: string) { + this.dependents.forEach((group) => { + group.delete(path); + }); + } + + public load(path: string) { + this.clearDependents(path); + for (const dependency of this.loadDependencies(path)) { + if (!dependency.startsWith(".")) { + return; + } + + const key = resolve(dirname(path), dependency); + if (!this.dependents.has(key)) { + this.dependents.set(key, new Set()); + } + this.dependents.get(key)?.add(path); + } + } + + // eslint-disable-next-line max-statements, sonarjs/cognitive-complexity + public dependentsOf(path: string) { + const marked = new Set(); + const dependents = new Set(); + const queue = [path]; + + while (queue.length > 0) { + const file = queue.shift(); + if (file !== undefined && !marked.has(file)) { + marked.add(file); + const fileDependents = this.dependents.get(file); + if (fileDependents) { + for (const dependent of fileDependents) { + dependents.add(dependent); + queue.push(dependent); + } + } + } + } + + return dependents; + } +} diff --git a/src/server/module-loader.ts b/src/server/module-loader.ts index 880cc7e6..b51f1812 100644 --- a/src/server/module-loader.ts +++ b/src/server/module-loader.ts @@ -1,7 +1,7 @@ import { once } from "node:events"; -import { type Dirent, existsSync } from "node:fs"; +import { existsSync } from "node:fs"; import fs from "node:fs/promises"; -import nodePath from "node:path"; +import nodePath, { basename, dirname } from "node:path"; import { type FSWatcher, watch } from "chokidar"; import createDebug from "debug"; @@ -26,18 +26,6 @@ function isContextModule( return "Context" in module && typeof module.Context === "function"; } -function reportLoadError(error: unknown, fileUrl: string) { - if ( - String(error) === - "SyntaxError: Identifier 'Context' has already been declared" - ) { - // Not sure why Node throws this error. It doesn't seem to matter. - return; - } - - process.stdout.write(`\nError loading ${fileUrl}:\n~~${String(error)}~~\n`); -} - export class ModuleLoader extends EventTarget { private readonly basePath: string; @@ -95,32 +83,7 @@ export class ModuleLoader extends EventTarget { this.dispatchEvent(new Event("remove")); } - debug("importing module: %s", pathName); - this.uncachedImport(pathName) - // eslint-disable-next-line promise/prefer-await-to-then - .then((endpoint) => { - this.dispatchEvent(new Event(eventName)); - - if (pathName.includes("_.context")) { - this.contextRegistry.update( - parts.dir, - - // @ts-expect-error TS says Context has no constructable signatures but that's not true? - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/consistent-type-assertions - new (endpoint as ContextModule).Context(), - ); - return "context"; - } - - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - this.registry.add(url, endpoint as Module); - - return "path"; - }) - // eslint-disable-next-line promise/prefer-await-to-then - .catch((error: unknown) => { - reportLoadError(error, pathName); - }); + void this.loadEndpoint(pathName); }, ); await once(this.watcher, "ready"); @@ -167,27 +130,41 @@ export class ModuleLoader extends EventTarget { const fullPath = nodePath .join(this.basePath, directory, file.name) .replaceAll("\\", "/"); - await this.loadEndpoint(fullPath, directory, file); + + await this.loadEndpoint(fullPath); }); await Promise.all(imports); } - private async loadEndpoint( - fullPath: string, - directory: string, - file: Dirent, - ) { + // eslint-disable-next-line max-statements + private async loadEndpoint(pathName: string) { + debug("importing module: %s", pathName); + + const directory = dirname(pathName.slice(this.basePath.length)).replaceAll( + "\\", + "/", + ); + + const url = `/${nodePath.join( + directory, + nodePath.parse(basename(pathName)).name, + )}` + .replaceAll("\\", "/") + .replaceAll(/\/+/gu, "/"); + try { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - const endpoint: ContextModule | Module = (await this.uncachedImport( - fullPath, - )) as ContextModule | Module; + const endpoint = (await this.uncachedImport(pathName)) as + | ContextModule + | Module; + + this.dispatchEvent(new Event("add")); - if (file.name.includes("_.context")) { + if (basename(pathName).startsWith("_.context")) { if (isContextModule(endpoint)) { - this.contextRegistry.add( - `/${directory.replaceAll("\\", "/")}`, + this.contextRegistry.update( + directory, // @ts-expect-error TS says Context has no constructable signatures but that's not true? // eslint-disable-next-line @typescript-eslint/no-unsafe-argument @@ -195,13 +172,6 @@ export class ModuleLoader extends EventTarget { ); } } else { - const url = `/${nodePath.join( - directory, - nodePath.parse(file.name).name, - )}` - .replaceAll("\\", "/") - .replaceAll(/\/+/gu, "/"); - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions this.registry.add(url, endpoint as Module); } @@ -214,7 +184,7 @@ export class ModuleLoader extends EventTarget { return; } - process.stdout.write(`\nError loading ${fullPath}:\n${String(error)}\n`); + process.stdout.write(`\nError loading ${pathName}:\n${String(error)}\n`); } } } diff --git a/src/server/precinct.d.ts b/src/server/precinct.d.ts new file mode 100644 index 00000000..bbbf10d3 --- /dev/null +++ b/src/server/precinct.d.ts @@ -0,0 +1,3 @@ +declare module 'precinct' { + export function paperwork(path: string): string[]; +} diff --git a/test/server/code-generator.test.ts b/test/server/code-generator.test.ts index 7ca85dbb..b1db66df 100644 --- a/test/server/code-generator.test.ts +++ b/test/server/code-generator.test.ts @@ -1,6 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ -/* eslint-disable @typescript-eslint/no-unsafe-call */ import { usingTemporaryFiles } from "using-temporary-files"; import { CodeGenerator } from "../../src/server/code-generator.js"; diff --git a/test/server/context-registry.test.ts b/test/server/context-registry.test.ts index b1f0d828..738c1da4 100644 --- a/test/server/context-registry.test.ts +++ b/test/server/context-registry.test.ts @@ -10,7 +10,7 @@ describe("a context registry", () => { const registry = new ContextRegistry(); - registry.add("/hello", helloContext); + registry.update("/hello", helloContext); expect(registry.find("/hello")).toBe(helloContext); }); @@ -60,7 +60,7 @@ describe("a context registry", () => { const registry = new ContextRegistry(); - registry.add("/", originalContext); + registry.update("/", originalContext); originalContext.increment(); expect(registry.find("/").count).toBe(1); @@ -87,7 +87,6 @@ it("updates context properties if they changed in the code", () => { [key: string]: unknown; } - class UpdatedContext implements Context { public prop1 = "original"; @@ -104,7 +103,7 @@ it("updates context properties if they changed in the code", () => { const registry = new ContextRegistry(); - registry.add("/", new OriginalContext()); + registry.update("/", new OriginalContext()); const context = registry.find("/"); diff --git a/test/server/deterimine-module-kind.test.ts b/test/server/deterimine-module-kind.test.ts index b198d2dc..e69b2128 100644 --- a/test/server/deterimine-module-kind.test.ts +++ b/test/server/deterimine-module-kind.test.ts @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ -/* eslint-disable @typescript-eslint/no-unsafe-call */ // To do: add types to usingTemporaryFiles package import { usingTemporaryFiles } from "using-temporary-files"; diff --git a/test/server/module-dependency-graph.test.ts b/test/server/module-dependency-graph.test.ts new file mode 100644 index 00000000..f2377ab1 --- /dev/null +++ b/test/server/module-dependency-graph.test.ts @@ -0,0 +1,130 @@ +import { usingTemporaryFiles } from "using-temporary-files"; + +import { ModuleDependencyGraph } from "../../src/server/module-dependency-graph.js"; + +describe("module dependency graph", () => { + it("identifies a file that has no dependents", () => { + const graph = new ModuleDependencyGraph(); + expect(graph.dependentsOf("file.js")).toEqual(new Set()); + }); + + it("identifies immediate dependencies", async () => { + const graph = new ModuleDependencyGraph(); + + await usingTemporaryFiles(async ($) => { + await $.add("file.js", 'import other from "./other.js";'); + graph.load($.path("file.js")); + + expect(graph.dependentsOf($.path("./other.js"))).toEqual( + new Set([$.path("file.js")]), + ); + }); + }); + + it("identifies immediate dependencies", async () => { + const graph = new ModuleDependencyGraph(); + + await usingTemporaryFiles(async ($) => { + await $.add("file.js", 'import other from "./other.js";'); + graph.load($.path("file.js")); + + expect(graph.dependentsOf($.path("./other.js"))).toEqual( + new Set([$.path("file.js")]), + ); + }); + }); + + it("ignores dependencies that are not relative", async () => { + const graph = new ModuleDependencyGraph(); + + await usingTemporaryFiles(async ($) => { + await $.add( + "file.js", + 'import fs from "node:fs"; import express from "express";', + ); + graph.load($.path("file.js")); + + expect(graph.dependentsOf($.path("node:fs"))).toEqual(new Set()); + }); + }); + + it("finds indirect dependencies", async () => { + const graph = new ModuleDependencyGraph(); + + await usingTemporaryFiles(async ($) => { + await $.add( + "file.js", + 'import intermediate from "./intermediate.js"; import other from "./other.js";', + ); + await $.add("intermediate.js", 'import leaf from "./leaf.js";'); + await $.add("other.js", 'import leaf from "./leaf.js";'); + + graph.load($.path("file.js")); + graph.load($.path("intermediate.js")); + graph.load($.path("other.js")); + + expect(graph.dependentsOf($.path("./leaf.js"))).toEqual( + new Set([ + $.path("file.js"), + $.path("intermediate.js"), + $.path("other.js"), + ]), + ); + }); + }); + it("handles circular dependencies", async () => { + const graph = new ModuleDependencyGraph(); + + await usingTemporaryFiles(async ($) => { + await $.add("a.js", 'import b from "./b.js";'); + await $.add("b.js", 'import c from "./c.js";'); + await $.add("c.js", 'import a from "./a.js";'); + + graph.load($.path("a.js")); + graph.load($.path("b.js")); + graph.load($.path("c.js")); + + expect(graph.dependentsOf($.path("./a.js"))).toEqual( + new Set([$.path("a.js"), $.path("b.js"), $.path("c.js")]), + ); + }); + }); + it("ignores a file it can't process due to syntax errors", async () => { + const graph = new ModuleDependencyGraph(); + + await usingTemporaryFiles(async ($) => { + await $.add("error.js", "syntax error"); + graph.load($.path("error.js")); + + expect(graph.dependentsOf($.path("error.js"))).toEqual(new Set([])); + }); + }); + + it("ignores a file it can't find", async () => { + const graph = new ModuleDependencyGraph(); + + await usingTemporaryFiles(async ($) => { + await $.add("found.js", "/* */"); + graph.load($.path("missing.js")); + + expect(graph.dependentsOf($.path("missing.js"))).toEqual(new Set([])); + }); + }); + it("updates dependencies when a file is reloaded", async () => { + const graph = new ModuleDependencyGraph(); + + await usingTemporaryFiles(async ($) => { + await $.add("file.js", 'import "./old.js";'); + graph.load($.path("file.js")); + + await $.add("file.js", 'import "./new.js";'); + graph.load($.path("file.js")); + + expect(graph.dependentsOf($.path("./new.js"))).toEqual( + new Set([$.path("file.js")]), + ); + + expect(graph.dependentsOf($.path("./old.js"))).toEqual(new Set()); + }); + }); +}); diff --git a/test/server/module-loader.test.ts b/test/server/module-loader.test.ts index de0c56e3..d7ad893c 100644 --- a/test/server/module-loader.test.ts +++ b/test/server/module-loader.test.ts @@ -1,34 +1,37 @@ import { once } from "node:events"; +import { usingTemporaryFiles } from "using-temporary-files"; + import { ContextRegistry } from "../../src/server/context-registry.js"; import { ModuleLoader } from "../../src/server/module-loader.js"; import { Registry } from "../../src/server/registry.js"; -import { withTemporaryFiles } from "../lib/with-temporary-files.js"; describe("a module loader", () => { it("finds a file and adds it to the registry", async () => { - const files: { [fileName: string]: string } = { - "a/b/c.js": ` - export function GET() { - return { - body: "GET from a/b/c" - }; - } - `, - - "hello.js": ` + await usingTemporaryFiles(async ($) => { + await $.add( + "a/b/c.js", + `export function GET() { + return { + body: "GET from a/b/c" + }; + }`, + ); + + await $.add( + "hello.js", + ` export function GET() { return { body: "hello" }; - } - `, - "package.json": '{ "type": "module" }', - }; + }`, + ); + + await $.add("package.json", '{ "type": "module" }'); - await withTemporaryFiles(files, async (basePath: string) => { const registry: Registry = new Registry(); - const loader: ModuleLoader = new ModuleLoader(basePath, registry); + const loader: ModuleLoader = new ModuleLoader($.path(""), registry); await loader.load(); @@ -38,95 +41,55 @@ describe("a module loader", () => { expect(registry.exists("GET", "/a/b/c")).toBe(true); }); }); + it("updates the registry when a file is deleted", async () => { + await usingTemporaryFiles(async ($) => { + await $.add( + "delete-me.js", + 'export function GET() { return { body: "Goodbye" }; }', + ); + await $.add("package.json", '{ "type": "module" }'); - it("updates the registry when a file is added", async () => { - await withTemporaryFiles( - { "package.json": '{ "type": "module" }' }, - async ( - basePath: string, - { add }: { add: (path: string, content: string) => void }, - ) => { - const registry: Registry = new Registry(); - const loader: ModuleLoader = new ModuleLoader(basePath, registry); + const registry: Registry = new Registry(); + const loader: ModuleLoader = new ModuleLoader($.path("."), registry); - await loader.load(); - await loader.watch(); + await loader.load(); + await loader.watch(); - expect(registry.exists("GET", "/late/addition")).toBe(false); + expect(registry.exists("GET", "/delete-me")).toBe(true); - add( - "late/addition.js", - 'export function GET() { return { body: "I\'m here now!" }; }', - ); - await once(loader, "add"); + await $.remove("delete-me.js"); + await once(loader, "remove"); - expect(registry.exists("GET", "/late/addition")).toBe(true); + expect(registry.exists("GET", "/delete-me")).toBe(false); - await loader.stopWatching(); - }, - ); + await loader.stopWatching(); + }); }); - it("updates the registry when a file is deleted", async () => { - await withTemporaryFiles( - { - "delete-me.js": 'export function GET() { return { body: "Goodbye" }; }', - - "package.json": '{ "type": "module" }', - }, - async ( - basePath: string, - { remove }: { remove: (path: string) => void }, - ) => { - const registry: Registry = new Registry(); - const loader: ModuleLoader = new ModuleLoader(basePath, registry); - - await loader.load(); - await loader.watch(); + it("ignores files with the wrong file extension", async () => { + await usingTemporaryFiles(async ($) => { + const registry: Registry = new Registry(); + const loader: ModuleLoader = new ModuleLoader($.path("."), registry); - expect(registry.exists("GET", "/delete-me")).toBe(true); + await $.add( + "module.js", + 'export function GET() { return { body: "hello" }; }', + ); + await $.add("package.json", '{"type": "module"}'); + await $.add("README.md", "readme"); - remove("delete-me.js"); - await once(loader, "remove"); + await loader.load(); + await loader.watch(); - expect(registry.exists("GET", "/delete-me")).toBe(false); + await $.add("other.txt", "should not be loaded"); - await loader.stopWatching(); - }, - ); - }); + expect(registry.exists("GET", "/module")).toBe(true); + expect(registry.exists("GET", "/READMEx")).toBe(false); + expect(registry.exists("GET", "/other")).toBe(false); + expect(registry.exists("GET", "/types")).toBe(false); - it("ignores files with the wrong file extension", async () => { - const contents = 'export function GET() { return { body: "hello" }; }'; - - const files: { [key: string]: string } = { - "module.js": contents, - "package.json": '{"type": "module"}', - "README.md": contents, - }; - - await withTemporaryFiles( - files, - async ( - basePath: string, - { add }: { add: (path: string, content: string) => void }, - ) => { - const registry: Registry = new Registry(); - const loader: ModuleLoader = new ModuleLoader(basePath, registry); - - await loader.load(); - await loader.watch(); - - add("other.txt", "should not be loaded"); - - expect(registry.exists("GET", "/module")).toBe(true); - expect(registry.exists("GET", "/READMEx")).toBe(false); - expect(registry.exists("GET", "/other")).toBe(false); - expect(registry.exists("GET", "/types")).toBe(false); - - await loader.stopWatching(); - }, - ); + await loader.stopWatching(); + }); }); // This should work but I can't figure out how to break the @@ -134,56 +97,52 @@ describe("a module loader", () => { // experimental module API). it.skip("updates the registry when a file is changed", async () => { - await withTemporaryFiles( - { - "change.js": - 'export function GET(): { body } { return { body: "before change" }; }', - - "package.json": '{ "type": "module" }', - }, - async ( - basePath: string, - { add }: { add: (path: string, content: string) => void }, - ) => { - const registry: Registry = new Registry(); - const loader: ModuleLoader = new ModuleLoader(basePath, registry); - - await loader.watch(); - add( - "change.js", - 'export function GET() { return { body: "after change" }; }', - ); - await once(loader, "change"); - - const response = registry.endpoint( - "GET", - "/change", - // @ts-expect-error - not going to create a whole context object for a test - )({ headers: {}, matchedPath: "", path: {}, query: {} }); - - // @ts-expect-error - TypeScript doesn't know that the response will have a body property - expect(response.body).toBe("after change"); - expect(registry.exists("GET", "/late/addition")).toBe(true); - - await loader.stopWatching(); - }, - ); + await usingTemporaryFiles(async ($) => { + const registry: Registry = new Registry(); + const loader: ModuleLoader = new ModuleLoader($.path("."), registry); + + await $.add( + "change.js", + 'export function GET(): { body } { return { body: "before change" }; }', + ); + await $.add("package.json", '{ "type": "module" }'); + + await loader.watch(); + await $.add( + "change.js", + 'export function GET() { return { body: "after change" }; }', + ); + await once(loader, "change"); + + const response = registry.endpoint( + "GET", + "/change", + // @ts-expect-error - not going to create a whole context object for a test + )({ headers: {}, matchedPath: "", path: {}, query: {} }); + + // @ts-expect-error - TypeScript doesn't know that the response will have a body property + expect(response.body).toBe("after change"); + expect(registry.exists("GET", "/late/addition")).toBe(true); + + await loader.stopWatching(); + }); }); it("finds a context and adds it to the context registry", async () => { - const files: { [key: string]: string } = { - "_.context.js": 'export class Context { name = "main"};', - "hello/_.context.js": 'export class Context { name = "hello"};', - "package.json": '{ "type": "module" }', - }; + await usingTemporaryFiles(async ($) => { + await $.add("_.context.js", 'export class Context { name = "main"};'); + await $.add( + "hello/_.context.js", + 'export class Context { name = "hello"};', + ); + await $.add("package.json", '{ "type": "module" }'); - await withTemporaryFiles(files, async (basePath: string) => { const registry: Registry = new Registry(); const contextRegistry: ContextRegistry = new ContextRegistry(); const loader: ModuleLoader = new ModuleLoader( - basePath, + $.path("."), registry, contextRegistry, ); @@ -196,20 +155,22 @@ describe("a module loader", () => { }); }); - it("provides the parent context if the locale _.context.ts doesn't export a default", async () => { - const files: { [key: string]: string } = { - "_.context.js": "export class Context { value = 0 }", - "hello/_.context.js": "export class Context { value = 100 }", - "package.json": '{ "type": "module" }', - }; + it("provides the parent context if the local _.context.ts doesn't export a default", async () => { + await usingTemporaryFiles(async ($) => { + await $.add("_.context.js", "export class Context { value = 0 }"); + await $.add( + "hello/_.context.js", + "export class Context { value = 100 }", + ); + await $.add("package.json", '{ "type": "module" }'); - await withTemporaryFiles(files, async (basePath: string) => { const registry: Registry = new Registry(); const contextRegistry: ContextRegistry = new ContextRegistry(); const loader: ModuleLoader = new ModuleLoader( - basePath, + $.path("."), + registry, contextRegistry, ); @@ -228,4 +189,35 @@ describe("a module loader", () => { expect(contextRegistry.find("/hello/world").value).toBe(101); }); }); + + // can't test because I can't get Jest to refresh modules + it.skip("updates the registry when a dependency is updated", async () => { + await usingTemporaryFiles(async ($) => { + await $.add("package.json", '{ "type": "module" }'); + + await $.add("x.js", 'export const x = "original";'); + + await $.add( + "main.js", + 'import { x } from "./x.js"; export function GET() { return x; }', + ); + + const registry: Registry = new Registry(); + const loader: ModuleLoader = new ModuleLoader($.path("."), registry); + + await loader.load(); + await loader.watch(); + + // @ts-expect-error - not going to create a whole request object for a test + const response = await registry.endpoint("GET", "/main")({}); + + await $.add("x.js", 'export const x = "changed";'); + + await once(loader, "add"); + + expect(response).toEqual("changed"); + + await loader.stopWatching(); + }); + }); }); diff --git a/yarn.lock b/yarn.lock index b76171ed..e5bde150 100644 --- a/yarn.lock +++ b/yarn.lock @@ -391,6 +391,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== +"@babel/parser@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" + integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== + "@babel/plugin-proposal-decorators@^7.18.6": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.15.tgz#dc774eae73ab8c28a644d490b45aa47a85bb0bf5" @@ -875,6 +880,14 @@ resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz#798622546b63847e82389e473fd67f2707d82247" integrity sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g== +"@dependents/detective-less@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@dependents/detective-less/-/detective-less-5.0.0.tgz#e06bd05352a9e90ad337c740ea98783709e0630c" + integrity sha512-D/9dozteKcutI5OdxJd8rU+fL6XgaaRg60sPPJWkT33OCiRfkCu5wO5B/yXTaaL2e6EB0lcCBGe5E0XscZCvvQ== + dependencies: + gonzales-pe "^4.3.0" + node-source-walk "^7.0.0" + "@ember-data/rfc395-data@^0.0.4": version "0.0.4" resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" @@ -1241,7 +1254,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== @@ -2981,6 +2994,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.7.3.tgz#0402b5628a63f24f2dc9d4a678e9a92cc50ea3e9" integrity sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw== +"@typescript-eslint/types@7.7.1": + version "7.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.7.1.tgz#f903a651fb004c75add08e4e9e207f169d4b98d7" + integrity sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w== + "@typescript-eslint/typescript-estree@2.34.0": version "2.34.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" @@ -3047,6 +3065,20 @@ semver "^7.5.4" ts-api-utils "^1.0.1" +"@typescript-eslint/typescript-estree@^7.6.0": + version "7.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.1.tgz#5cafde48fe390fe1c1b329b2ce0ba8a73c1e87b2" + integrity sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ== + dependencies: + "@typescript-eslint/types" "7.7.1" + "@typescript-eslint/visitor-keys" "7.7.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.45.0", "@typescript-eslint/utils@^5.58.0", "@typescript-eslint/utils@^5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" @@ -3132,11 +3164,66 @@ "@typescript-eslint/types" "6.7.3" eslint-visitor-keys "^3.4.1" +"@typescript-eslint/visitor-keys@7.7.1": + version "7.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.1.tgz#da2294796220bb0f3b4add5ecbb1b9c3f4f65798" + integrity sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw== + dependencies: + "@typescript-eslint/types" "7.7.1" + eslint-visitor-keys "^3.4.3" + "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@vue/compiler-core@3.4.25": + version "3.4.25" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.25.tgz#691f59ee5014f6f2a2488fd4465f892e1e82f729" + integrity sha512-Y2pLLopaElgWnMNolgG8w3C5nNUVev80L7hdQ5iIKPtMJvhVpG0zhnBG/g3UajJmZdvW0fktyZTotEHD1Srhbg== + dependencies: + "@babel/parser" "^7.24.4" + "@vue/shared" "3.4.25" + entities "^4.5.0" + estree-walker "^2.0.2" + source-map-js "^1.2.0" + +"@vue/compiler-dom@3.4.25": + version "3.4.25" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.25.tgz#b367e0c84e11d9e9f70beabdd6f6b2277fde375f" + integrity sha512-Ugz5DusW57+HjllAugLci19NsDK+VyjGvmbB2TXaTcSlQxwL++2PETHx/+Qv6qFwNLzSt7HKepPe4DcTE3pBWg== + dependencies: + "@vue/compiler-core" "3.4.25" + "@vue/shared" "3.4.25" + +"@vue/compiler-sfc@^3.4.21": + version "3.4.25" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.25.tgz#ceab148f81571c8b251e8a8b75a9972addf1db8b" + integrity sha512-m7rryuqzIoQpOBZ18wKyq05IwL6qEpZxFZfRxlNYuIPDqywrXQxgUwLXIvoU72gs6cRdY6wHD0WVZIFE4OEaAQ== + dependencies: + "@babel/parser" "^7.24.4" + "@vue/compiler-core" "3.4.25" + "@vue/compiler-dom" "3.4.25" + "@vue/compiler-ssr" "3.4.25" + "@vue/shared" "3.4.25" + estree-walker "^2.0.2" + magic-string "^0.30.10" + postcss "^8.4.38" + source-map-js "^1.2.0" + +"@vue/compiler-ssr@3.4.25": + version "3.4.25" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.25.tgz#7fdd540bfdf2d4a3d6cb107b7ba4c77228d36331" + integrity sha512-H2ohvM/Pf6LelGxDBnfbbXFPyM4NE3hrw0e/EpwuSiYu8c819wx+SVGdJ65p/sFrYDd6OnSDxN1MB2mN07hRSQ== + dependencies: + "@vue/compiler-dom" "3.4.25" + "@vue/shared" "3.4.25" + +"@vue/shared@3.4.25": + version "3.4.25" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.25.tgz#243ba8543e7401751e0ca319f75a80f153edd273" + integrity sha512-k0yappJ77g2+KNrIaF0FFnzwLvUBLUYr8VOwz+/6vLsmItFp51AcxLL7Ey3iPd7BIRyWPOcqUjMnm7OkahXllA== + "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -3413,6 +3500,11 @@ assert@^2.0.0: object-is "^1.0.1" util "^0.12.0" +ast-module-types@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-6.0.0.tgz#ea6132bb44a115717299dfdac934d2d13e8ecd93" + integrity sha512-LFRg7178Fw5R4FAEwZxVqiRI8IxSM+Ay2UBrHoCerXNme+kMMMfz7T3xDGV/c2fer87hcrtgJGsnSOfUrPK6ng== + ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" @@ -4026,7 +4118,7 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: +color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== @@ -4043,7 +4135,7 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@12.0.0, commander@~12.0.0: +commander@12.0.0, commander@^12.0.0, commander@~12.0.0: version "12.0.0" resolved "https://registry.yarnpkg.com/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592" integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA== @@ -4441,6 +4533,81 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +detective-amd@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/detective-amd/-/detective-amd-6.0.0.tgz#29207f8309f3d2d130e3356d67f7fcd90e0c2cbf" + integrity sha512-NTqfYfwNsW7AQltKSEaWR66hGkTeD52Kz3eRQ+nfkA9ZFZt3iifRCWh+yZ/m6t3H42JFwVFTrml/D64R2PAIOA== + dependencies: + ast-module-types "^6.0.0" + escodegen "^2.1.0" + get-amd-module-type "^6.0.0" + node-source-walk "^7.0.0" + +detective-cjs@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/detective-cjs/-/detective-cjs-6.0.0.tgz#65975719993fb4165a86e341a86784d7fcb4e3c8" + integrity sha512-R55jTS6Kkmy6ukdrbzY4x+I7KkXiuDPpFzUViFV/tm2PBGtTCjkh9ZmTuJc1SaziMHJOe636dtiZLEuzBL9drg== + dependencies: + ast-module-types "^6.0.0" + node-source-walk "^7.0.0" + +detective-es6@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detective-es6/-/detective-es6-5.0.0.tgz#0dc90a946a0120d93b28901395ec99c4642990bd" + integrity sha512-NGTnzjvgeMW1khUSEXCzPDoraLenWbUjCFjwxReH+Ir+P6LGjYtaBbAvITWn2H0VSC+eM7/9LFOTAkrta6hNYg== + dependencies: + node-source-walk "^7.0.0" + +detective-postcss@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/detective-postcss/-/detective-postcss-7.0.0.tgz#e9cff50836d67339a0bf4378f22dba4ed5809c01" + integrity sha512-pSXA6dyqmBPBuERpoOKKTUUjQCZwZPLRbd1VdsTbt6W+m/+6ROl4BbE87yQBUtLoK7yX8pvXHdKyM/xNIW9F7A== + dependencies: + is-url "^1.2.4" + postcss-values-parser "^6.0.2" + +detective-sass@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/detective-sass/-/detective-sass-6.0.0.tgz#0585093840afe069ac2bdb55f662a1928c8f6d81" + integrity sha512-h5GCfFMkPm4ZUUfGHVPKNHKT8jV7cSmgK+s4dgQH4/dIUNh9/huR1fjEQrblOQNDalSU7k7g+tiW9LJ+nVEUhg== + dependencies: + gonzales-pe "^4.3.0" + node-source-walk "^7.0.0" + +detective-scss@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detective-scss/-/detective-scss-5.0.0.tgz#3603e967bfc541c28b5cc9ceccd21c36725d6d86" + integrity sha512-Y64HyMqntdsCh1qAH7ci95dk0nnpA29g319w/5d/oYcHolcGUVJbIhOirOFjfN1KnMAXAFm5FIkZ4l2EKFGgxg== + dependencies: + gonzales-pe "^4.3.0" + node-source-walk "^7.0.0" + +detective-stylus@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detective-stylus/-/detective-stylus-5.0.0.tgz#11c0464350d0b1484d6a7e281547280500c8353f" + integrity sha512-KMHOsPY6aq3196WteVhkY5FF+6Nnc/r7q741E+Gq+Ax9mhE2iwj8Hlw8pl+749hPDRDBHZ2WlgOjP+twIG61vQ== + +detective-typescript@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/detective-typescript/-/detective-typescript-13.0.0.tgz#41b391e77721b2872d70c96cc4d98261f9032353" + integrity sha512-tcMYfiFWoUejSbvSblw90NDt76/4mNftYCX0SMnVRYzSXv8Fvo06hi4JOPdNvVNxRtCAKg3MJ3cBJh+ygEMH+A== + dependencies: + "@typescript-eslint/typescript-estree" "^7.6.0" + ast-module-types "^6.0.0" + node-source-walk "^7.0.0" + +detective-vue2@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detective-vue2/-/detective-vue2-2.0.1.tgz#edf8c6a4677d0fa47d9afb46760ed2e88c2c9db8" + integrity sha512-EGHcIFCEPGO7MExgRZA8LqHQsKakjzrd96V358PV3WGFl+ibzNlYP/Msav43jBiCC5TpjWcy1FFUekrzXQM1Fg== + dependencies: + "@vue/compiler-sfc" "^3.4.21" + detective-es6 "^5.0.0" + detective-sass "^6.0.0" + detective-scss "^5.0.0" + detective-stylus "^5.0.0" + detective-typescript "^13.0.0" + dezalgo@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" @@ -4591,6 +4758,11 @@ enquirer@^2.3.0: ansi-colors "^4.1.1" strip-ansi "^6.0.1" +entities@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -4723,6 +4895,17 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + eslint-ast-utils@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz#3d58ba557801cfb1c941d68131ee9f8c34bd1586" @@ -5529,7 +5712,7 @@ espree@^9.3.1, espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" -esprima@^4.0.0, esprima@~4.0.0: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -5566,6 +5749,11 @@ estree-to-babel@^6.0.0: "@babel/traverse" "^7.1.6" "@babel/types" "^7.2.0" +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -6019,6 +6207,14 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-amd-module-type@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-amd-module-type/-/get-amd-module-type-6.0.0.tgz#702ddcbe6cb8a41ab8f69ce5ea520bf3b0ede69a" + integrity sha512-hFM7oivtlgJ3d6XWD6G47l8Wyh/C6vFw5G24Kk1Tbq85yh5gcM8Fne5/lFhiuxB+RT6+SI7I1ThB9lG4FBh3jw== + dependencies: + ast-module-types "^6.0.0" + node-source-walk "^7.0.0" + get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -6187,6 +6383,13 @@ globjoin@^0.1.4: resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== +gonzales-pe@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" + integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== + dependencies: + minimist "^1.2.5" + gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -6860,6 +7063,16 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-url-superb@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-4.0.0.tgz#b54d1d2499bb16792748ac967aa3ecb41a33a8c2" + integrity sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA== + +is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + is-weakmap@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" @@ -7964,6 +8177,13 @@ lz-string@^1.5.0: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== +magic-string@^0.30.10: + version "0.30.10" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" + integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" @@ -8389,6 +8609,13 @@ minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatc dependencies: brace-expansion "^1.1.7" +minimatch@^9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0, minimist-options@^4.0.2: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -8418,6 +8645,14 @@ mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +module-definition@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/module-definition/-/module-definition-6.0.0.tgz#724b4c57543f53f814d2892499857777c3859630" + integrity sha512-sEGP5nKEXU7fGSZUML/coJbrO+yQtxcppDAYWRE9ovWsTbFoUHB2qDUx564WUzDaBHXsD46JBbIK5WVTwCyu3w== + dependencies: + ast-module-types "^6.0.0" + node-source-walk "^7.0.0" + montag@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/montag/-/montag-1.2.1.tgz#2a7a56a623ab0427434aa3e69d9c3d35afa23460" @@ -8475,6 +8710,11 @@ nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -8555,6 +8795,13 @@ node-releases@^2.0.14: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-source-walk@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-7.0.0.tgz#cd849f539939994868a0b2ba4e9758322b2fcee6" + integrity sha512-1uiY543L+N7Og4yswvlm5NCKgPKDEXd9AUR9Jh3gen6oOeBsesr6LqhXom1er3eRzSUcVRWXzhv8tSNrIfGHKw== + dependencies: + "@babel/parser" "^7.24.4" + nodemon@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.0.tgz#ff7394f2450eb6a5e96fe4180acd5176b29799c9" @@ -9129,6 +9376,15 @@ postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +postcss-values-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-6.0.2.tgz#636edc5b86c953896f1bb0d7a7a6615df00fb76f" + integrity sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw== + dependencies: + color-name "^1.1.4" + is-url-superb "^4.0.0" + quote-unquote "^1.0.0" + "postcss@^7.0.27 || ^8.0.0", postcss@^8.4.27, postcss@^8.4.6: version "8.4.29" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" @@ -9138,6 +9394,36 @@ postcss-value-parser@^4.2.0: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.38: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + +precinct@^12.1.1: + version "12.1.1" + resolved "https://registry.yarnpkg.com/precinct/-/precinct-12.1.1.tgz#458e217c6ab51f964a03c2a7352a40ab009c4611" + integrity sha512-Vmmtp0QdtM0Z5NzkRG09AgUgBwOpG0KW9KvG1vkltx+e2zrGCWbM5661f6lf8YjKbJhM39TICA6Wc36ZzX1PqQ== + dependencies: + "@dependents/detective-less" "^5.0.0" + commander "^12.0.0" + detective-amd "^6.0.0" + detective-cjs "^6.0.0" + detective-es6 "^5.0.0" + detective-postcss "^7.0.0" + detective-sass "^6.0.0" + detective-scss "^5.0.0" + detective-stylus "^5.0.0" + detective-typescript "^13.0.0" + detective-vue2 "^2.0.0" + module-definition "^6.0.0" + node-source-walk "^7.0.0" + postcss "^8.4.38" + typescript "^5.4.5" + preferred-pm@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.1.2.tgz#aedb70550734a574dffcbf2ce82642bd1753bdd6" @@ -9438,6 +9724,11 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +quote-unquote@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/quote-unquote/-/quote-unquote-1.0.0.tgz#67a9a77148effeaf81a4d428404a710baaac8a0b" + integrity sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg== + ramda@0.25.0: version "0.25.0" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.25.0.tgz#8fdf68231cffa90bc2f9460390a0cb74a29b29a9" @@ -10168,7 +10459,7 @@ semver@^7.0.0, semver@^7.3.2, semver@^7.3.4, semver@^7.3.6, semver@^7.3.7, semve dependencies: lru-cache "^6.0.0" -semver@~7.6.0: +semver@^7.6.0, semver@~7.6.0: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -10304,6 +10595,11 @@ source-map-js@^1.0.1, source-map-js@^1.0.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + source-map-resolve@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" @@ -10430,7 +10726,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -10447,15 +10743,6 @@ string-width@^2.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -10525,7 +10812,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -10546,13 +10833,6 @@ strip-ansi@^5.1.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -10893,6 +11173,11 @@ ts-api-utils@^1.0.1: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.2.tgz#7c094f753b6705ee4faee25c3c684ade52d66d99" integrity sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ== +ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + ts-dedent@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" @@ -11086,7 +11371,7 @@ typed-rest-client@~1.8.11: tunnel "0.0.6" underscore "^1.12.1" -typescript@5.4.5: +typescript@5.4.5, typescript@^5.4.5: version "5.4.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== @@ -11555,7 +11840,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -11573,15 +11858,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"